@kitten-science/kitten-scientists 2.0.0-beta.11-dev.20250517 → 2.0.0-beta.11-nightly.20250519
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/lib/KittenScientists.d.ts +1 -0
- package/lib/KittenScientists.d.ts.map +1 -1
- package/lib/KittenScientists.js +0 -1
- package/lib/KittenScientists.js.map +1 -1
- package/lib/entrypoint-loader.d.ts +5 -0
- package/lib/entrypoint-loader.d.ts.map +1 -0
- package/lib/entrypoint-loader.js +17 -0
- package/lib/entrypoint-loader.js.map +1 -0
- package/lib/entrypoint-userscript.d.ts +1 -1
- package/lib/entrypoint-userscript.d.ts.map +1 -1
- package/lib/entrypoint-userscript.js +8 -2
- package/lib/entrypoint-userscript.js.map +1 -1
- package/output/kitten-scientists-0.0.0-ci.min.user.js +16 -0
- package/output/kitten-scientists-0.0.0-ci.user.js +84 -0
- package/output/kitten-scientists-loader-0.0.0-ci.min.user.js +16 -0
- package/output/kitten-scientists-loader-0.0.0-ci.user.js +109 -0
- package/output/kitten-scientists.inject.js +27 -22
- package/output/kitten-scientists.min.inject.js +23 -0
- package/package.json +9 -18
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
(function(U,R){typeof exports=="object"&&typeof module<"u"?R(exports,require("dojo")):typeof define=="function"&&define.amd?define(["exports","dojo"],R):(U=typeof globalThis<"u"?globalThis:U||self,R(U["kitten-scientists"]=U["kitten-scientists"]||{}))})(this,function(U){"use strict";var Xo=Object.defineProperty;var Ls=U=>{throw TypeError(U)};var Yo=(U,R,m)=>R in U?Xo(U,R,{enumerable:!0,configurable:!0,writable:!0,value:m}):U[R]=m;var u=(U,R,m)=>Yo(U,typeof R!="symbol"?R+"":R,m),Os=(U,R,m)=>R.has(U)||Ls("Cannot "+m);var I=(U,R,m)=>(Os(U,R,"read from private field"),m?m.call(U):R.get(U)),L=(U,R,m)=>R.has(U)?Ls("Cannot add the same private member more than once"):R instanceof WeakSet?R.add(U):R.set(U,m),O=(U,R,m,ve)=>(Os(U,R,"write to private field"),ve?ve.call(U,m):R.set(U,m),m);var Ue,De,Ne,qe,ze,Fe,He,We,Ge,Ze,Ke,Ve,je,Je,Xe,Ye,Qe,et,tt,it,st,nt,at,rt,ot,lt,ct,ht,ut,dt;const R=c=>e=>{c.error(e)};function m(c){return c==null}function ve(c,s){return!m(c)&&c instanceof s}class Us extends Error{constructor(s="unexpected nil value"){super(s)}}function p(c,s){if(m(c))throw new Us(s);return c}function ft(c,s){const e=new Array;for(const t of c)m(t)?m(s)||e.push(s):e.push(t);return e}class fe extends Error{constructor(e,t,i){super(t);u(this,"status");u(this,"code");this.code=e,this.name="AbstractError",this.status=i,typeof Error.captureStackTrace<"u"&&Error.captureStackTrace(this,fe)}static isAbstractError(e,t=!0){if(e instanceof fe)return!0;if(t){const i=e;if(Object(e)===e&&"code"in i&&typeof i.code=="string"&&e.code.match(/^ERR_OS_/))return!0}return!1}}class bt extends fe{constructor(s,e=400){super("ERR_OS_INVALID_OPERATION",s,e),this.name="InvalidOperationError",typeof Error.captureStackTrace<"u"&&Error.captureStackTrace(this,bt)}}var qt,Pi;function Ii(){return Pi||(Pi=1,qt=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...s)=>console.error("SEMVER",...s):()=>{}),qt}var zt,$i;function Li(){if($i)return zt;$i=1;const c="2.0.0",s=256,e=Number.MAX_SAFE_INTEGER||9007199254740991,t=16,i=s-6;return zt={MAX_LENGTH:s,MAX_SAFE_COMPONENT_LENGTH:t,MAX_SAFE_BUILD_LENGTH:i,MAX_SAFE_INTEGER:e,RELEASE_TYPES:["major","premajor","minor","preminor","patch","prepatch","prerelease"],SEMVER_SPEC_VERSION:c,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2},zt}var pt={exports:{}},Oi;function Ds(){return Oi||(Oi=1,function(c,s){const{MAX_SAFE_COMPONENT_LENGTH:e,MAX_SAFE_BUILD_LENGTH:t,MAX_LENGTH:i}=Li(),n=Ii();s=c.exports={};const a=s.re=[],r=s.safeRe=[],o=s.src=[],l=s.safeSrc=[],h=s.t={};let d=0;const g="[a-zA-Z0-9-]",f=[["\\s",1],["\\d",i],[g,t]],w=k=>{for(const[y,P]of f)k=k.split(`${y}*`).join(`${y}{0,${P}}`).split(`${y}+`).join(`${y}{1,${P}}`);return k},b=(k,y,P)=>{const j=w(y),Q=d++;n(k,Q,y),h[k]=Q,o[Q]=y,l[Q]=j,a[Q]=new RegExp(y,P?"g":void 0),r[Q]=new RegExp(j,P?"g":void 0)};b("NUMERICIDENTIFIER","0|[1-9]\\d*"),b("NUMERICIDENTIFIERLOOSE","\\d+"),b("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${g}*`),b("MAINVERSION",`(${o[h.NUMERICIDENTIFIER]})\\.(${o[h.NUMERICIDENTIFIER]})\\.(${o[h.NUMERICIDENTIFIER]})`),b("MAINVERSIONLOOSE",`(${o[h.NUMERICIDENTIFIERLOOSE]})\\.(${o[h.NUMERICIDENTIFIERLOOSE]})\\.(${o[h.NUMERICIDENTIFIERLOOSE]})`),b("PRERELEASEIDENTIFIER",`(?:${o[h.NONNUMERICIDENTIFIER]}|${o[h.NUMERICIDENTIFIER]})`),b("PRERELEASEIDENTIFIERLOOSE",`(?:${o[h.NONNUMERICIDENTIFIER]}|${o[h.NUMERICIDENTIFIERLOOSE]})`),b("PRERELEASE",`(?:-(${o[h.PRERELEASEIDENTIFIER]}(?:\\.${o[h.PRERELEASEIDENTIFIER]})*))`),b("PRERELEASELOOSE",`(?:-?(${o[h.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${o[h.PRERELEASEIDENTIFIERLOOSE]})*))`),b("BUILDIDENTIFIER",`${g}+`),b("BUILD",`(?:\\+(${o[h.BUILDIDENTIFIER]}(?:\\.${o[h.BUILDIDENTIFIER]})*))`),b("FULLPLAIN",`v?${o[h.MAINVERSION]}${o[h.PRERELEASE]}?${o[h.BUILD]}?`),b("FULL",`^${o[h.FULLPLAIN]}$`),b("LOOSEPLAIN",`[v=\\s]*${o[h.MAINVERSIONLOOSE]}${o[h.PRERELEASELOOSE]}?${o[h.BUILD]}?`),b("LOOSE",`^${o[h.LOOSEPLAIN]}$`),b("GTLT","((?:<|>)?=?)"),b("XRANGEIDENTIFIERLOOSE",`${o[h.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),b("XRANGEIDENTIFIER",`${o[h.NUMERICIDENTIFIER]}|x|X|\\*`),b("XRANGEPLAIN",`[v=\\s]*(${o[h.XRANGEIDENTIFIER]})(?:\\.(${o[h.XRANGEIDENTIFIER]})(?:\\.(${o[h.XRANGEIDENTIFIER]})(?:${o[h.PRERELEASE]})?${o[h.BUILD]}?)?)?`),b("XRANGEPLAINLOOSE",`[v=\\s]*(${o[h.XRANGEIDENTIFIERLOOSE]})(?:\\.(${o[h.XRANGEIDENTIFIERLOOSE]})(?:\\.(${o[h.XRANGEIDENTIFIERLOOSE]})(?:${o[h.PRERELEASELOOSE]})?${o[h.BUILD]}?)?)?`),b("XRANGE",`^${o[h.GTLT]}\\s*${o[h.XRANGEPLAIN]}$`),b("XRANGELOOSE",`^${o[h.GTLT]}\\s*${o[h.XRANGEPLAINLOOSE]}$`),b("COERCEPLAIN",`(^|[^\\d])(\\d{1,${e}})(?:\\.(\\d{1,${e}}))?(?:\\.(\\d{1,${e}}))?`),b("COERCE",`${o[h.COERCEPLAIN]}(?:$|[^\\d])`),b("COERCEFULL",o[h.COERCEPLAIN]+`(?:${o[h.PRERELEASE]})?(?:${o[h.BUILD]})?(?:$|[^\\d])`),b("COERCERTL",o[h.COERCE],!0),b("COERCERTLFULL",o[h.COERCEFULL],!0),b("LONETILDE","(?:~>?)"),b("TILDETRIM",`(\\s*)${o[h.LONETILDE]}\\s+`,!0),s.tildeTrimReplace="$1~",b("TILDE",`^${o[h.LONETILDE]}${o[h.XRANGEPLAIN]}$`),b("TILDELOOSE",`^${o[h.LONETILDE]}${o[h.XRANGEPLAINLOOSE]}$`),b("LONECARET","(?:\\^)"),b("CARETTRIM",`(\\s*)${o[h.LONECARET]}\\s+`,!0),s.caretTrimReplace="$1^",b("CARET",`^${o[h.LONECARET]}${o[h.XRANGEPLAIN]}$`),b("CARETLOOSE",`^${o[h.LONECARET]}${o[h.XRANGEPLAINLOOSE]}$`),b("COMPARATORLOOSE",`^${o[h.GTLT]}\\s*(${o[h.LOOSEPLAIN]})$|^$`),b("COMPARATOR",`^${o[h.GTLT]}\\s*(${o[h.FULLPLAIN]})$|^$`),b("COMPARATORTRIM",`(\\s*)${o[h.GTLT]}\\s*(${o[h.LOOSEPLAIN]}|${o[h.XRANGEPLAIN]})`,!0),s.comparatorTrimReplace="$1$2$3",b("HYPHENRANGE",`^\\s*(${o[h.XRANGEPLAIN]})\\s+-\\s+(${o[h.XRANGEPLAIN]})\\s*$`),b("HYPHENRANGELOOSE",`^\\s*(${o[h.XRANGEPLAINLOOSE]})\\s+-\\s+(${o[h.XRANGEPLAINLOOSE]})\\s*$`),b("STAR","(<|>)?=?\\s*\\*"),b("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),b("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}(pt,pt.exports)),pt.exports}var Ft,Ui;function Ns(){if(Ui)return Ft;Ui=1;const c=Object.freeze({loose:!0}),s=Object.freeze({});return Ft=t=>t?typeof t!="object"?c:t:s,Ft}var Ht,Di;function qs(){if(Di)return Ht;Di=1;const c=/^[0-9]+$/,s=(t,i)=>{const n=c.test(t),a=c.test(i);return n&&a&&(t=+t,i=+i),t===i?0:n&&!a?-1:a&&!n?1:t<i?-1:1};return Ht={compareIdentifiers:s,rcompareIdentifiers:(t,i)=>s(i,t)},Ht}var Wt,Ni;function zs(){if(Ni)return Wt;Ni=1;const c=Ii(),{MAX_LENGTH:s,MAX_SAFE_INTEGER:e}=Li(),{safeRe:t,t:i}=Ds(),n=Ns(),{compareIdentifiers:a}=qs();class r{constructor(l,h){if(h=n(h),l instanceof r){if(l.loose===!!h.loose&&l.includePrerelease===!!h.includePrerelease)return l;l=l.version}else if(typeof l!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof l}".`);if(l.length>s)throw new TypeError(`version is longer than ${s} characters`);c("SemVer",l,h),this.options=h,this.loose=!!h.loose,this.includePrerelease=!!h.includePrerelease;const d=l.trim().match(h.loose?t[i.LOOSE]:t[i.FULL]);if(!d)throw new TypeError(`Invalid Version: ${l}`);if(this.raw=l,this.major=+d[1],this.minor=+d[2],this.patch=+d[3],this.major>e||this.major<0)throw new TypeError("Invalid major version");if(this.minor>e||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>e||this.patch<0)throw new TypeError("Invalid patch version");d[4]?this.prerelease=d[4].split(".").map(g=>{if(/^[0-9]+$/.test(g)){const f=+g;if(f>=0&&f<e)return f}return g}):this.prerelease=[],this.build=d[5]?d[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(l){if(c("SemVer.compare",this.version,this.options,l),!(l instanceof r)){if(typeof l=="string"&&l===this.version)return 0;l=new r(l,this.options)}return l.version===this.version?0:this.compareMain(l)||this.comparePre(l)}compareMain(l){return l instanceof r||(l=new r(l,this.options)),a(this.major,l.major)||a(this.minor,l.minor)||a(this.patch,l.patch)}comparePre(l){if(l instanceof r||(l=new r(l,this.options)),this.prerelease.length&&!l.prerelease.length)return-1;if(!this.prerelease.length&&l.prerelease.length)return 1;if(!this.prerelease.length&&!l.prerelease.length)return 0;let h=0;do{const d=this.prerelease[h],g=l.prerelease[h];if(c("prerelease compare",h,d,g),d===void 0&&g===void 0)return 0;if(g===void 0)return 1;if(d===void 0)return-1;if(d===g)continue;return a(d,g)}while(++h)}compareBuild(l){l instanceof r||(l=new r(l,this.options));let h=0;do{const d=this.build[h],g=l.build[h];if(c("build compare",h,d,g),d===void 0&&g===void 0)return 0;if(g===void 0)return 1;if(d===void 0)return-1;if(d===g)continue;return a(d,g)}while(++h)}inc(l,h,d){if(l.startsWith("pre")){if(!h&&d===!1)throw new Error("invalid increment argument: identifier is empty");if(h){const g=`-${h}`.match(this.options.loose?t[i.PRERELEASELOOSE]:t[i.PRERELEASE]);if(!g||g[1]!==h)throw new Error(`invalid identifier: ${h}`)}}switch(l){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",h,d);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",h,d);break;case"prepatch":this.prerelease.length=0,this.inc("patch",h,d),this.inc("pre",h,d);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",h,d),this.inc("pre",h,d);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{const g=Number(d)?1:0;if(this.prerelease.length===0)this.prerelease=[g];else{let f=this.prerelease.length;for(;--f>=0;)typeof this.prerelease[f]=="number"&&(this.prerelease[f]++,f=-2);if(f===-1){if(h===this.prerelease.join(".")&&d===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(g)}}if(h){let f=[h,g];d===!1&&(f=[h]),a(this.prerelease[0],h)===0?isNaN(this.prerelease[1])&&(this.prerelease=f):this.prerelease=f}break}default:throw new Error(`invalid increment argument: ${l}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}}return Wt=r,Wt}var Gt,qi;function Fs(){if(qi)return Gt;qi=1;const c=zs();return Gt=(e,t,i)=>new c(e,i).compare(new c(t,i)),Gt}var Zt,zi;function Hs(){if(zi)return Zt;zi=1;const c=Fs();return Zt=(e,t,i)=>c(e,t,i)>0,Zt}Hs();class Be extends fe{constructor(s,e=500){super("ERR_OS_INTERNAL",s,e),this.name="InternalError",typeof Error.captureStackTrace<"u"&&Error.captureStackTrace(this,Be)}static fromError(s){const e=new Be(s.message);return Object.assign(e,s,new Be(s.message)),e.stack=s.stack,e}}class Kt extends fe{constructor(s,e=500){super("ERR_OS_UNKNOWN",s,e),this.name="UnknownError",typeof Error.captureStackTrace<"u"&&Error.captureStackTrace(this,Kt)}}const Ws=c=>c instanceof Error||Object.prototype.toString.call(c)==="[object Error]",Gs=c=>fe.isAbstractError(c)?c:Ws(c)?Be.fromError(c):new Kt(String(c)),ye=c=>{const s=performance.now();return[c(),performance.now()-s]},vt=async c=>{const s=performance.now();return[await c(),performance.now()-s]},ne=(c,s)=>c.filter(e=>!s.includes(e)),v=(...c)=>["👩🔬",...c.filter(s=>s!=="").flatMap(s=>{if(ve(s,Error)){const e=s;return[e.name,e.message,e.stack]}return s})];function z(c){return Object.entries(c)}function F(c,s,e){if(m(s))return console.warn(...v("No source data was provided.")),c;for(const[t,i]of z(c))t in s||console.info(...v(`Entry '${t}' is missing in source. Using default value.`)),e(i,s[t]);for(const[t]of z(s))t in c||console.warn(...v(`Entry '${t}' was found in source, but it is not expected by the subject schema. This entry will be ignored.`));return c}class yt{constructor(s){u(this,"_elem");this._elem=structuredClone(s)}unwrap(){return structuredClone(this._elem)}replace(s){this._elem=structuredClone(s)}toJSON(){return this.unwrap()}}function X(c){return c.charAt(0).toUpperCase()+c.slice(1)}function Zs(c){return Math.round(c*100)/100}function Y(c){return c===-1?Number.POSITIVE_INFINITY:c}class wt{constructor(s,e){u(this,"_host");u(this,"_workshopManager");this._host=s,this._workshopManager=e}bulk(s,e,t,i){const n=[];let a=0;for(const[h,d]of z(s)){const g=re.evaluateSubSectionTrigger(t,d.trigger),f=p(e[h]);if(!d.enabled||g<0||"tHidden"in f&&f.tHidden===!0||"rHidden"in f&&f.rHidden===!0||f.unlocked===!1||!m(d.max)&&-1<d.max&&d.max<=f.val||h==="cryochambers"&&(p(this._host.game.time.getVSU("usedCryochambers")).val>0||this._host.game.bld.getBuildingExt("chronosphere").meta.val<=f.val)||h==="ressourceRetrieval"&&f.val>=100)continue;const w=p(this._isStagedBuild(f)?f.stages[f.stage].prices:f.prices),b=this.getPriceRatio(f,i);if(!this.singleBuildPossible(f,w,b,i))continue;if(w.map(P=>this._workshopManager.getResource(P.name)).filter(P=>0<P.maxValue).filter(P=>P.value/P.maxValue<g).length===0){if(this._isStagedBuild(f)&&typeof d.stage<"u"&&d.stage!==f.stage)continue;const P=[],Q=1-this._host.game.getLimitedDR(this._host.game.getEffect(`${h}CostReduction`),1);for(const le of w){const ee=1-this._host.game.getLimitedDR(this._host.game.getEffect(`${le.name}CostReduction`),1);P.push({name:le.name,val:le.val*Q*ee})}n.push({count:0,id:h,label:d.label,limit:d.max||0,name:d.baseBuilding??d.building,priceRatio:b,prices:P,source:i,spot:a,val:f.val,variant:d.variant}),a++}}if(n.length===0)return[];const r={};for(const h of this._host.game.resPool.resources)r[h.name]=this._workshopManager.getValueAvailable(h.name);let o=0;const l=new Array;for(;o<1e5;){const h=ne(n,l);let d=0;const g=[];let f={...r};for(const w of l)f=this._precalculateBuilds({...w,limit:w.val+w.count},e,f).remainingResources;for(const w of h){const b=w.count+1,k=this._precalculateBuilds({...w,limit:Math.min(Y(w.limit),w.val+b)},e,f);if(k.count<b){g.push(w);continue}w.count=b,f=k.remainingResources,d++}if(l.push(...g),o++,d===0)break}return console.debug(...v(`Took '${o}' iterations to evaluate bulk build request.`)),l}_precalculateBuilds(s,e,t={}){let i=0;const n=Object.assign({},t),a=p(e[s.id]),r=s.prices,o=s.priceRatio,l=s.source;let h=!1;if(r.length===0)return{count:0,remainingResources:n};for(;!h;){for(let d=0;d<r.length;d++){let g=!1,f=!1,w=Number.POSITIVE_INFINITY,b=Number.POSITIVE_INFINITY;if(l==="Space"&&r[d].name==="oil"){g=!0;const k=this._host.game.getEffect("oilReductionRatio");w=r[d].val*(1-this._host.game.getLimitedDR(k,.75))}else if(s.id==="cryochambers"&&r[d].name==="karma"){f=!0;const k=this._host.game.prestige.getBurnedParagonRatio();b=r[d].val*(1-this._host.game.getLimitedDR(.01*k,1))}if(g?h=n.oil<w*1.05**(i+a.val):f?h=n.karma<b*o**(i+a.val):h=n[r[d].name]<r[d].val*o**(i+a.val),h||"noStackable"in a&&a.noStackable&&i+a.val>=1||s.id==="ressourceRetrieval"&&i+a.val>=100||s.id==="cryochambers"&&this._host.game.bld.getBuildingExt("chronosphere").meta.val<=i+a.val){for(let k=0;k<d;k++)if(l==="Space"&&r[k].name==="oil"){const y=this._host.game.getEffect("oilReductionRatio"),P=r[k].val*(1-this._host.game.getLimitedDR(y,.75));n.oil+=P*1.05**(i+a.val)}else if(s.id==="cryochambers"&&r[k].name==="karma"){const y=this._host.game.prestige.getBurnedParagonRatio(),P=r[k].val*(1-this._host.game.getLimitedDR(.01*y,1));n.karma+=P*o**(i+a.val)}else{const y=r[k].val*o**(i+a.val);n[r[k].name]+=r[k].name==="void"?Math.ceil(y):y}return s.limit&&s.limit!==-1&&(i=Math.max(0,Math.min(i,s.limit-s.val))),{count:i,remainingResources:n}}if(g)n.oil-=w*1.05**(i+a.val);else if(f)n.karma-=b*o**(i+a.val);else{const k=r[d].val*o**(i+a.val);n[r[d].name]-=r[d].name==="void"?Math.ceil(k):k}}++i}return{count:i,remainingResources:n}}construct(s,e,t){if(!("name"in s)||!("controller"in s.options)||!("getMetadata"in s.options.controller))return 0;const i=s.metadata;let n=0,a=t;const r=i;if(!m(r.limitBuild)&&r.limitBuild-r.val<a&&(a=r.limitBuild-r.val),s.enabled&&e.hasResources(s)||this._host.game.devMode){for(;e.hasResources(s)&&a>0;)s.prices=e.getPrices(s),e.payPrice(s),e.incrementValue(s),n++,a--;r.breakIronWill&&(this._host.game.ironWill=!1),m(i)||("unlocks"in i&&!m(i.unlocks)&&this._host.game.unlock(i.unlocks),"upgrades"in i&&!m(i.upgrades)&&this._host.game.upgrade(i.upgrades))}return n}_isStagedBuild(s){return"stage"in s&&"stages"in s&&!m(s.stage)&&!m(s.stages)}getPriceRatio(s,e){const t=this._isStagedBuild(s)?s.priceRatio||s.stages[s.stage].priceRatio:s.priceRatio??0;let i=0;return e&&e==="Bonfire"&&(i=this._host.game.getEffect(`${s.name}PriceRatio`)+this._host.game.getEffect("priceRatio")+this._host.game.getEffect("mapPriceReduction"),i=this._host.game.getLimitedDR(i,t-1)),t+i}singleBuildPossible(s,e,t,i){const a=1-this._host.game.getLimitedDR(this._host.game.getEffect(`${s.name}CostReduction`),1);for(const r of e){const l=1-this._host.game.getLimitedDR(this._host.game.getEffect(`${r.name}CostReduction`),1),h=r.val*a*l;if(i&&i==="Space"&&r.name==="oil"){const d=this._host.game.getLimitedDR(this._host.game.getEffect("oilReductionRatio"),.75),g=h*(1-d);if(this._workshopManager.getValueAvailable("oil")<g*1.05**s.val)return!1}else if(s.name==="cryochambers"&&r.name==="karma"){const d=this._host.game.getLimitedDR(.01*this._host.game.prestige.getBurnedParagonRatio(),1),g=h*(1-d);if(this._workshopManager.getValueAvailable("karma")<g*t**s.val)return!1}else if(this._workshopManager.getValueAvailable(r.name)<h*t**s.val)return!1}return!0}}const Fi=["academy","accelerator","aiCore","amphitheatre","aqueduct","barn","biolab","brewery","calciner","chapel","chronosphere","factory","field","harbor","hut","library","logHouse","lumberMill","magneto","mansion","mine","mint","observatory","oilWell","pasture","quarry","reactor","smelter","steamworks","temple","tradepost","unicornPasture","warehouse","workshop","zebraForge","zebraOutpost","zebraWorkshop","ziggurat"],Vt=["broadcasttower","dataCenter","hydroplant","solarfarm","spaceport"],Ks=["autumn","spring","summer","winter"],we=["charon","umbra","yarn","helios","cath","redmoon","dune","piscine","terminus","kairo"],Hi=["alloy","beam","bloodstone","blueprint","compedium","concrate","eludium","gear","kerosene","manuscript","megalith","parchment","plate","scaffold","ship","slab","steel","tanker","tMythril","thorium","wood"],Wi=[...Hi,"alicorn","antimatter","blackcoin","burnedParagon","catnip","coal","culture","elderBox","faith","furs","gflops","gold","hashrates","iron","ivory","karma","kittens","manpower","minerals","necrocorn","oil","paragon","relic","science","sorrow","spice","starchart","tears","temporalFlux","timeCrystal","titanium","unicorns","unobtainium","uranium","void","wrappingPaper","zebras"],Gi=["any","engineer","farmer","geologist","hunter","miner","priest","scholar","woodcutter"],Vs=["chemist","engineer","manager","metallurgist","merchant","none","scientist","wise"];var W=(c=>(c.Cryptotheology="c",c.OrderOfTheSun="s",c.Ziggurat="z",c.UnicornPasture="zp",c))(W||{});const Zi=["apocripha","basilica","goldenSpire","scholasticism","solarRevolution","solarchant","stainedGlass","sunAltar","templars","transcendence"],Ki=["blackCore","blackLibrary","blackNexus","blackObelisk","blackRadiance","blazar","darkNova","holyGenocide","mausoleum","singularity"],Vi=["blackPyramid","ivoryCitadel","ivoryTower","marker","skyPalace","sunspire","unicornGraveyard","unicornNecropolis","unicornTomb","unicornUtopia"],ji=["dragons","griffins","nagas","leviathans","lizards","sharks","spiders","zebras"],js=["authocracy","bigStickPolicy","carnivale","cityOnAHill","clearCutting","communism","conservation","cryochamberExtraction","culturalExchange","diplomacy","dragonRelationsAstrologers","dragonRelationsDynamicists","dragonRelationsPhysicists","environmentalism","epicurianism","expansionism","extravagance","fascism","frugality","fullIndustrialization","griffinRelationsMachinists","griffinRelationsMetallurgists","griffinRelationsScouts","isolationism","knowledgeSharing","liberalism","liberty","lizardRelationsDiplomats","lizardRelationsEcologists","lizardRelationsPriests","militarizeSpace","monarchy","mysticism","nagaRelationsArchitects","nagaRelationsCultists","nagaRelationsMasons","necrocracy","openWoodlands","outerSpaceTreaty","radicalXenophobia","rationality","rationing","republic","scientificCommunism","sharkRelationsBotanists","sharkRelationsMerchants","sharkRelationsScribes","siphoning","socialism","spiderRelationsChemists","spiderRelationsGeologists","spiderRelationsPaleontologists","stoicism","stripMining","sustainability","technocracy","terraformingInsight","theocracy","tradition","transkittenism","zebraRelationsAppeasement","zebraRelationsBellicosity"],Ji=["brewery"],Js=["acoustics","advExogeology","agriculture","ai","animal","antimatter","archeology","archery","architecture","artificialGravity","astronomy","biochemistry","biology","blackchain","calendar","chemistry","chronophysics","civil","combustion","construction","cryptotheology","currency","dimensionalPhysics","drama","ecology","electricity","electronics","engineering","exogeology","exogeophysics","genetics","hydroponics","industrialization","machinery","math","mechanization","metal","metalurgy","metaphysics","mining","nanotechnology","navigation","nuclearFission","oilProcessing","orbitalEngineering","paradoxalKnowledge","particlePhysics","philosophy","physics","quantumCryptography","robotics","rocketry","sattelites","steel","superconductors","tachyonTheory","terraformation","theology","thorium","voidSpace","writing"],Xs=["centaurusSystemMission","charonMission","duneMission","furthestRingMission","heliosMission","kairoMission","moonMission","orbitalLaunch","piscineMission","rorschachMission","terminusMission","umbraMission","yarnMission"],Xi=["containmentChamber","cryostation","entangler","heatsink","hrHarvester","hydrofracturer","hydroponics","moltenCore","moonBase","moonOutpost","orbitalArray","planetCracker","researchVessel","sattelite","spaceBeacon","spaceElevator","spaceStation","spiceRefinery","sunforge","sunlifter","tectonic","terraformingStation"],Yi=["blastFurnace","ressourceRetrieval","temporalAccelerator","temporalBattery","temporalImpedance","temporalPress","timeBoiler"],Qi=["cryochambers","usedCryochambers","voidHoover","voidRift","chronocontrol","voidResonator"],es=["advancedAutomation","advancedRefinement","aiBases","aiEngineers","alloyArmor","alloyAxe","alloyBarns","alloySaw","alloyWarehouses","amBases","amDrive","amFission","amReactors","amReactorsMK2","assistance","astrolabe","astrophysicists","augumentation","automatedPlants","barges","biofuel","bolas","cadSystems","caravanserai","carbonSequestration","cargoShips","celestialMechanics","chronoEngineers","chronoforge","coalFurnace","coldFusion","combustionEngine","compositeBow","concreteBarns","concreteHuts","concreteWarehouses","crossbow","cryocomputing","darkEnergy","deepMining","distorsion","electrolyticSmelting","eludiumCracker","eludiumHuts","eludiumReflectors","energyRifts","enrichedThorium","enrichedUranium","factoryAutomation","factoryLogistics","factoryOptimization","factoryProcessing","factoryRobotics","fluidizedReactors","fluxCondensator","fuelInjectors","geodesy","gmo","goldOre","hubbleTelescope","huntingArmor","hydroPlantTurbines","internet","invisibleBlackHand","ironAxes","ironHoes","ironwood","lhc","logistics","longRangeSpaceships","machineLearning","mineralAxes","mineralHoes","miningDrill","mWReactor","nanosuits","neuralNetworks","nuclearPlants","nuclearSmelters","offsetPress","oilDistillation","oilRefinery","orbitalGeodesy","oxidation","photolithography","photovoltaic","pneumaticPress","printingPress","pumpjack","pyrolysis","qdot","railgun","reactorVessel","refrigeration","register","reinforcedBarns","reinforcedSaw","reinforcedWarehouses","relicStation","rotaryKiln","satelliteRadio","satnav","seti","silos","solarSatellites","spaceEngineers","spaceManufacturing","spiceNavigation","starlink","stasisChambers","steelArmor","steelAxe","steelPlants","steelSaw","stoneBarns","storageBunkers","strenghtenBuild","tachyonAccelerators","thinFilm","thoriumEngine","thoriumReactors","titaniumAxe","titaniumBarns","titaniumMirrors","titaniumSaw","titaniumWarehouses","turnSmoothly","unicornSelection","unobtainiumAxe","unobtainiumDrill","unobtainiumHuts","unobtainiumReflectors","unobtainiumSaw","uplink","voidAspiration","voidEnergy","voidReactors"];var ce=(c=>(c.Chronoforge="chrono",c.VoidSpace="void",c))(ce||{});const kt=["ivoryCitadel","ivoryTower","skyPalace","sunspire","unicornPasture","unicornTomb","unicornUtopia"],Ys=["sacrificeUnicorns","sacrificeAlicorns","refineTears","refineTimeCrystals","transcend","adore","autoPraise"];class _{constructor(s=!1){u(this,"enabled");this.enabled=s}load(s){m(s)||(this.enabled=s.enabled??this.enabled)}serialize(){return this}}class ts extends _{constructor(e=!1,t=!1){super(e);u(this,"limited");this.limited=t}load(e){m(e)||(super.load(e),this.limited=e.limited??this.limited)}}class V extends _{constructor(e=!1,t=-1){super(e);u(this,"trigger");this.trigger=t}load(e){m(e)||(super.load(e),this.trigger=e.trigger??this.trigger)}}class ae extends _{constructor(e=!1,t=1){super(e);u(this,"trigger");this.trigger=t}load(e){m(e)||(super.load(e),this.trigger=e.trigger??this.trigger)}}class is extends _{constructor(e=!1,t=0){super(e);u(this,"max");this.max=t}load(e){m(e)||(super.load(e),this.max=e.max??this.max)}}class Qs extends ts{constructor(e=!1,t=!1,i=0){super(e,t);u(this,"max");this.max=i}load(e){m(e)||(super.load(e),this.max=e.max??this.max)}}class en extends Qs{constructor(e=!1,t=!1,i=0,n=-1){super(e,t,i);u(this,"trigger");this.trigger=n}load(e){m(e)||(super.load(e),this.trigger=e.trigger??this.trigger)}}class tn extends ts{constructor(e=!1,t=!1,i=-1){super(e,t);u(this,"trigger");this.trigger=i}load(e){m(e)||(super.load(e),this.trigger=e.trigger??this.trigger)}}class _t extends V{constructor(e=!1,t=-1,i=0){super(e,t);u(this,"max");this.max=i}load(e){m(e)||(super.load(e),this.max=e.max??this.max)}}class sn extends ae{constructor(e=!1,t=1,i=0){super(e,t);u(this,"max");this.max=i}load(e){m(e)||(super.load(e),this.max=e.max??this.max)}}class jt{constructor(s,e=new Array){L(this,Ue);u(this,"selected");if(m(e.find(t=>t.value===s)))throw new Error("Provided selected value is not in provided options.");this.selected=s,O(this,Ue,e)}get options(){return I(this,Ue)}load(s){m(s)||(this.selected=s.selected??this.selected)}}Ue=new WeakMap;class nn extends ae{constructor(e=!1,t=950,i=1e3,n=1){super(e,n);u(this,"buy");u(this,"sell");this.buy=t,this.sell=i}load(e){m(e)||(super.load(e),this.buy=e.buy??this.buy,this.sell=e.sell??this.sell)}}class an extends _{constructor(e,t=!1){super(t);L(this,De);O(this,De,e)}get upgrade(){return I(this,De)}}De=new WeakMap;class rn extends _{constructor(e=!1){super(e);u(this,"buildings");this.buildings=this.initBuildings()}initBuildings(){const e={};for(const t of Vt)e[t]=new an(t);return e}load(e){m(e)||(super.load(e),F(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}))}}class Jt extends _t{constructor(e,t=!1,i=-1,n=0,a){super(t,i,n);L(this,Ne);L(this,qe);L(this,ze,0);O(this,qe,e),a&&(O(this,ze,1),O(this,Ne,a))}get baseBuilding(){return I(this,Ne)}get building(){return I(this,qe)}get stage(){return I(this,ze)}}Ne=new WeakMap,qe=new WeakMap,ze=new WeakMap;class Xt extends V{constructor(e=!1,t=-1,i=new _,n=new _,a=new _,r=new _,o=new rn){super(e,t);u(this,"buildings");u(this,"gatherCatnip");u(this,"turnOnMagnetos");u(this,"turnOnSteamworks");u(this,"turnOnReactors");u(this,"upgradeBuildings");this.buildings=this.initBuildings(),this.gatherCatnip=i,this.turnOnSteamworks=n,this.turnOnMagnetos=a,this.turnOnReactors=r,this.upgradeBuildings=o}initBuildings(){const e={broadcasttower:"amphitheatre",dataCenter:"library",hydroplant:"aqueduct",solarfarm:"pasture",spaceport:"warehouse"},t={};for(const i of Fi)i!=="unicornPasture"&&(t[i]=new Jt(i));for(const i of Vt)t[i]=new Jt(i,!1,-1,0,e[i]);return t}load(e){var t,i,n,a;m(e)||(super.load(e),F(this.buildings,e.buildings,(r,o)=>{r.enabled=(o==null?void 0:o.enabled)??r.enabled,r.max=(o==null?void 0:o.max)??r.max,r.trigger=(o==null?void 0:o.trigger)??r.trigger}),this.gatherCatnip.enabled=((t=e.gatherCatnip)==null?void 0:t.enabled)??this.gatherCatnip.enabled,this.turnOnSteamworks.enabled=((i=e.turnOnSteamworks)==null?void 0:i.enabled)??this.turnOnSteamworks.enabled,this.turnOnMagnetos.enabled=((n=e.turnOnMagnetos)==null?void 0:n.enabled)??this.turnOnMagnetos.enabled,this.turnOnReactors.enabled=((a=e.turnOnReactors)==null?void 0:a.enabled)??this.turnOnReactors.enabled,this.upgradeBuildings.load(e.upgradeBuildings))}}class ge{constructor(s,e){u(this,"_host");u(this,"tab");this._host=s;const t=this._host.game.tabs.find(i=>i.tabId===e);if(m(t))throw new Error(`Unable to find tab ${e}`);this.tab=t,this.render()}render(){return this._host.game.ui.activeTabId!==this.tab.tabId&&this.tab.render(),this}}class on{constructor(s,e,t=new Xt){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_bulkManager");u(this,"_workshopManager");this._host=s,this.settings=t,this.manager=new ge(this._host,"Bonfire"),this._workshopManager=e,this._bulkManager=new wt(this._host,this._workshopManager)}tick(s){this.settings.enabled&&(this.manager.render(),this.autoBuild(s),this.autoMisc(s))}autoBuild(s,e=this.settings.buildings){const t=this._bulkManager,i={};for(const r of Object.values(e))i[r.building]=this.getBuild(r.baseBuilding??r.building).meta;const n=this.settings.trigger,a=t.bulk(e,i,n,"Bonfire");for(const r of a.filter(o=>0<o.count))this.build(r.name||r.id,r.stage,r.count),s.requestGameUiRefresh=!0}autoUpgrade(s){var l,h,d,g,f,w,b;const e=this._host.game.bld.getBuildingExt("pasture").meta.stage===0?this._host.game.bld.getBuildingExt("pasture").meta.val:0,t=this._host.game.bld.getBuildingExt("aqueduct").meta.stage===0?this._host.game.bld.getBuildingExt("aqueduct").meta.val:0,i=this._host.game.bld.getBuildingExt("pasture").meta;if(this.settings.upgradeBuildings.buildings.solarfarm.enabled&&i.unlocked&&i.stage===0&&p(i.stages)[1].stageUnlocked&&this._workshopManager.getPotentialCatnip(!0,0,t)>0){const k=p(i.stages)[1].prices;if(this._bulkManager.singleBuildPossible(i,k,1)){const y=this.getBuildButton("pasture",0);m(y==null?void 0:y.model)||(y.controller.sellInternal(y.model,0,!1),i.on=0,i.val=0,i.stage=1,this._host.engine.iactivity("upgrade.building.pasture",[],"ks-upgrade"),(l=this._host.game.ui)==null||l.render(),this.build("pasture",1,1),s.requestGameUiRefresh=!0)}}const n=this._host.game.bld.getBuildingExt("aqueduct").meta;if(this.settings.upgradeBuildings.buildings.hydroplant.enabled&&n.unlocked&&n.stage===0&&p(n.stages)[1].stageUnlocked&&this._workshopManager.getPotentialCatnip(!0,e,0)>0){const k=p(n.stages)[1].prices;if(this._bulkManager.singleBuildPossible(n,k,1)){const y=this.getBuildButton("aqueduct",0);m(y==null?void 0:y.model)||(y.controller.sellInternal(y.model,0,!1),n.on=0,n.val=0,n.stage=1,(h=n.calculateEffects)==null||h.call(n,n,this._host.game),this._host.engine.iactivity("upgrade.building.aqueduct",[],"ks-upgrade"),(d=this._host.game.ui)==null||d.render(),this.build("aqueduct",1,1),s.requestGameUiRefresh=!0)}}const a=this._host.game.bld.getBuildingExt("library").meta;if(this.settings.upgradeBuildings.buildings.dataCenter.enabled&&a.unlocked&&a.stage===0&&p(a.stages)[1].stageUnlocked){let k=this._host.game.workshop.get("cryocomputing").researched?1:2;this._host.game.challenges.currentChallenge==="energy"&&(k*=2);let y=3;if(this._host.game.workshop.get("uplink").researched&&(y*=1+this._host.game.bld.getBuildingExt("biolab").meta.val*this._host.game.getEffect("uplinkDCRatio")),this._host.game.workshop.get("machineLearning").researched&&(y*=1+this._host.game.bld.getBuildingExt("aiCore").meta.on*this._host.game.getEffect("dataCenterAIRatio")),this._host.game.resPool.energyProd>=this._host.game.resPool.energyCons+k*a.val/y){const P=p(a.stages)[1].prices;if(this._bulkManager.singleBuildPossible(a,P,1)){const j=p(this.getBuildButton("library",0));if(m(j.model))return;j.controller.sellInternal(j.model,0,!1),a.on=0,a.val=0,a.stage=1,(g=a.calculateEffects)==null||g.call(a,a,this._host.game),this._host.engine.iactivity("upgrade.building.library",[],"ks-upgrade"),(f=this._host.game.ui)==null||f.render(),this.build("library",1,1),s.requestGameUiRefresh=!0;return}}}const r=this._host.game.bld.getBuildingExt("warehouse").meta;if(this.settings.upgradeBuildings.buildings.spaceport.enabled&&r.unlocked&&r.stage===0&&p(r.stages)[1].stageUnlocked){const k=p(r.stages)[1].prices;if(this._bulkManager.singleBuildPossible(r,k,1)){const y=this.getBuildButton("warehouse",0);if(!m(y==null?void 0:y.model)){y.controller.sellInternal(y.model,0,!1),r.on=0,r.val=0,r.stage=1,this._host.engine.iactivity("upgrade.building.warehouse",[],"ks-upgrade"),(w=this._host.game.ui)==null||w.render(),this.build("warehouse",1,1),s.requestGameUiRefresh=!0;return}}}const o=this._host.game.bld.getBuildingExt("amphitheatre").meta;if(this.settings.upgradeBuildings.buildings.broadcasttower.enabled&&o.unlocked&&o.stage===0&&p(o.stages)[1].stageUnlocked){const k=p(o.stages)[1].prices;if(this._bulkManager.singleBuildPossible(o,k,1)){const y=this.getBuildButton("amphitheatre",0);m(y==null?void 0:y.model)||(y.controller.sellInternal(y.model,0,!1),o.on=0,o.val=0,o.stage=1,this._host.engine.iactivity("upgrade.building.amphitheatre",[],"ks-upgrade"),(b=this._host.game.ui)==null||b.render(),this.build("amphitheatre",1,1),s.requestGameUiRefresh=!0)}}}autoMisc(s){if(this.settings.turnOnSteamworks.enabled){const e=this._host.game.bld.getBuildingExt("steamworks");if(e.meta.val&&e.meta.on===0){const t=p(this.getBuildButton("steamworks"));if(m(t.model))return;t.controller.onAll(t.model)}}if(this.settings.turnOnMagnetos.enabled){const e=this._host.game.bld.getBuildingExt("magneto");if(e.meta.val&&e.meta.on<e.meta.val){const t=p(this.getBuildButton("magneto"));if(m(t.model))return;t.controller.onAll(t.model)}}if(this.settings.turnOnReactors.enabled){const e=this._host.game.bld.getBuildingExt("reactor");if(e.meta.val&&e.meta.on<e.meta.val){const t=p(this.getBuildButton("reactor"));if(m(t.model))return;t.controller.onAll(t.model)}}this.settings.upgradeBuildings.enabled&&this.autoUpgrade(s),this.settings.gatherCatnip.enabled&&this.autoGather()}autoGather(){const s=new classes.game.ui.GatherCatnipButtonController(this._host.game);for(let e=0;e<Math.floor(this._host.engine.settings.interval/20);++e)s.buyItem(void 0,null)}build(s,e,t){let i=t;const n=i;let a;const r=game.getUnlockByName(s,"buildings"),o=new classes.BuildingMeta(r).getMeta();if("stages"in o){const l=new classes.ui.btn.StagingBldBtnController(this._host.game),h=l.fetchModel({building:s,controller:l,description:p(o.description),name:p(o.label),twoRow:!1});i=this._bulkManager.construct(h,l,i),a=o.label??""}else{const l=new classes.ui.btn.BuildingBtnModernController(this._host.game),h=l.fetchModel({building:s,controller:l,description:p(o.description),name:p(o.label),twoRow:!1});i=this._bulkManager.construct(h,l,i),a=o.label??""}i!==n&&(console.warn(...v(`${a} Amount ordered: ${n} Amount Constructed: ${i}`)),i===0)||(this._host.engine.storeForSummary(a,i,"build"),i===1?this._host.engine.iactivity("act.build",[a],"ks-build"):this._host.engine.iactivity("act.builds",[a,this._host.renderAbsolute(i)],"ks-build"))}_getBuildLabel(s,e){return s.stages&&!m(e)?s.stages[e].label:p(s.label)}getBuild(s){return this._host.game.bld.getBuildingExt(s)}getBuildButton(s,e=0){const t=game.bld.get(s),i=new classes.BuildingMeta(t).getMeta(),n=m(i.stages)?t:i.stages[e],a="stages"in n?new classes.ui.btn.StagingBldBtnController(this._host.game):new classes.ui.btn.BuildingBtnModernController(this._host.game),r=a.fetchModel({building:s,description:n.description,key:s,name:n.label});return{controller:a,model:r}}}class ln{constructor(s){u(this,"_host");u(this,"_lastday");u(this,"_lastyear");u(this,"_sections",new Map);this._host=s,this.resetActivity()}resetActivity(){this._sections=new Map,this._lastday=this._host.game.calendar.day,this._lastyear=this._host.game.calendar.year}storeActivity(s,e=1,t="other"){this._sections.has(t)||this._sections.set(t,new Map);const i=p(this._sections.get(t));i.has(s)||i.set(s,0),i.set(s,p(i.get(s))+e)}renderSummary(){const s=new Array;if(this._sections.has("other")&&p(this._sections.get("other")).forEach((t,i)=>s.push(this._host.engine.i18n(`summary.${i}`,[this._host.game.getDisplayValueExt(t)]))),this._sections.has("research")&&p(this._sections.get("research")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.tech",[X(i)]))}),this._sections.has("upgrade")&&p(this._sections.get("upgrade")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.upgrade",[X(i)]))}),this._sections.has("build")&&p(this._sections.get("build")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.building",[this._host.game.getDisplayValueExt(t),X(i)]))}),this._sections.has("refine")&&p(this._sections.get("refine")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.refine",[this._host.game.getDisplayValueExt(t),X(i)]))}),this._sections.has("faith")&&p(this._sections.get("faith")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.sun",[this._host.game.getDisplayValueExt(t),X(i)]))}),this._sections.has("craft")&&p(this._sections.get("craft")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.craft",[this._host.game.getDisplayValueExt(t),X(i)]))}),this._sections.has("trade")&&p(this._sections.get("trade")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.trade",[this._host.game.getDisplayValueExt(t),X(i)]))}),this._lastday&&this._lastyear){let e=this._host.game.calendar.year-this._lastyear,t=this._host.game.calendar.day-this._lastday;t<0&&(e-=1,t+=400);let i="";e>0&&(i+=`${e} `,i+=e===1?this._host.engine.i18n("summary.year"):this._host.engine.i18n("summary.years")),t>=0&&(e>0&&(i+=this._host.engine.i18n("summary.separator")),i+=`${Zs(t)} `,i+=t===1?this._host.engine.i18n("summary.day"):this._host.engine.i18n("summary.days")),s.push(this._host.engine.i18n("summary.head",[i]))}return s}}const cn={"act.accelerate":"Accelerate time!","act.adore":"Adore the galaxy! Accumulated {0} worship to {1} epiphany","act.blackcoin.buy":"Kittens sold your Relics and bought {0} Blackcoins","act.blackcoin.sell":"Kittens sold your Blackcoins and bought {0} Relics","act.build":"Kittens have built a new {0}","act.builds":"Kittens have built a new {0} {1} times","act.craft":"Kittens have crafted {0} {1}","act.distribute":"Distributed a kitten to {0}","act.elect":"Kittens have elected a new leader.","act.feed":"Kittens fed the Elders. The elders are pleased","act.fix.cry":"Kittens fixed {0} Cryochambers","act.hunt":"Sent kittens on {0} hunts","act.observe":"Kitten Scientists have observed a star","act.praise":"Praised the sun! Accumulated {0} faith to {1} worship","act.promote":"Kittens' leader has been promoted to rank {0}","act.refineTCs":"Refined {0} time crystals","act.refineTears":"Refined {0} tears into BLS","act.sacrificeAlicorns":"Sacrificed {0} alicorns","act.sacrificeUnicorns":"Sacrificed {0} unicorns","act.sun.discover":"Kittens have discovered {0}","act.sun.discovers":"Kittens have discovered {0} {1} times","act.time.activeHeatTransferEnd":"End active Heat Transfer","act.time.activeHeatTransferStart":"Start active Heat Transfer","act.time.getTemporalFlux":"Burn crystals to obtain time flux to maintain time acceleration","act.time.skip":"Kittens combust a time crystal, {0} years skipped!","act.trade":"Kittens have traded {0} times with {1}","act.transcend":"Spent {0} epiphany, Transcended to T-level: {1}","blackcoin.buy":"Buy Limit: {0}","blackcoin.buy.prompt":"Enter at which price you want to stop buying blackcoins.","blackcoin.buy.promptExplainer":"Blackcoin price always rises from 800 to 1100 (roughly), then it crashes. You usually want to buy until shortly before you sell.","blackcoin.buy.promptTitle":"Buy Limit for Blackcoins (Current: {0})","blackcoin.buy.title":"Buy Blackcoins until price reaches {0}","blackcoin.buy.trigger":"buying Blackcoins (in relics)","blackcoin.sell":"Sell Order: {0}","blackcoin.sell.prompt":"Enter at which price you want to sell all your blackcoins.","blackcoin.sell.promptExplainer":"Blackcoin price always rises from 800 to 1100 (roughly), then it crashes. You usually want to sell close to the highest possible price.","blackcoin.sell.promptTitle":"Sell Order for Blackcoins (Current: {0})","blackcoin.sell.title":"Sell Blackcoins when price reaches {0}","build.embassies":"Built {0} embassies for {1}","build.embassy":"Built {0} embassy for {1}",copy:"Copy","craft.limited":"Crafting {0}: limited to be proportional to cost ratio","craft.unlimited":"Crafting {0}: unlimited",delete:"Delete","dispose.necrocorn":"Kittens disposed of inefficient necrocorns","festival.extend":"Kittens extend the festival","festival.hold":"Kittens begin holding a festival","filter.accelerate":"Tempus Fugit","filter.adore":"Adoring","filter.allKG":"All KG log entries.","filter.build":"Building","filter.craft":"Crafting","filter.disable":"Disabled {0} log messages","filter.distribute":"Distribute","filter.enable":"Enabled {0} log messages","filter.explainer":"Disabled items are hidden from the log.","filter.faith":"Order of the Sun","filter.festival":"Festivals","filter.hunt":"Hunting","filter.misc":"Miscellaneous","filter.praise":"Praising","filter.promote":"Promote leader","filter.research":"Researching","filter.star":"Astronomical Events","filter.timeSkip":"Time Skip","filter.trade":"Trading","filter.transcend":"Transcend","filter.upgrade":"Upgrading","option.accelerate":"Tempus Fugit","option.autofeed":"Feed Leviathans","option.catnip":"Gather Catnip","option.crypto":"Trade Blackcoin","option.elect":"Elect leader","option.elect.job":"Job","option.elect.job.any":"Any","option.elect.trait":"Trait","option.embassies":"Build Embassies","option.faith.adore":"Adore the Galaxy","option.faith.autoPraise":"Praise the Sun","option.faith.best.unicorn":"Automate Build Order","option.faith.refineTears":"Refine Tears","option.faith.refineTimeCrystals":"Refine TCs","option.faith.sacrificeAlicorns":"Sacrifice Alicorns","option.faith.sacrificeUnicorns":"Sacrifice Unicorns","option.faith.transcend":"Transcend","option.festival":"Hold festivals","option.fix.cry":"Fix Cryochamber","option.hunt":"Hunt","option.magnetos":"Turn on Magnetos","option.observe":"Observe Astro Events","option.praise":"Praise the Sun","option.promote":"Promote leader","option.promotekittens":"Promote kittens","option.reactors":"Turn on Reactors","option.shipOverride":"Force Ships to 243","option.steamworks":"Turn on Steamworks","option.time.activeHeatTransfer":"Active Heat Transfer","option.time.reset":"Reset Timeline (Danger!)","option.time.skip":"Time Skip","option.time.skip.ignoreOverheat":"Ignore overheat",reset:"Reset","reset.after":"Nice to meet you, the cute Kitten Scientists will serve you","reset.cancel.activity":"Meoston, We Have a Problem","reset.cancel.message":"Timeline Reset canceled","reset.check":"Trigger for {0}: {1}, you have {2}","reset.checked":"All conditions are met, the timeline will restart in the next few seconds!","reset.countdown.0":"0 - Temporal rifts opened!","reset.countdown.1":"1 - Time engine start","reset.countdown.2":"2 - Boosting the chronoforge","reset.countdown.3":"3 - Opening temporal rifts","reset.countdown.4":"4 - Turning off satellite","reset.countdown.5":"5 - Melting blackcoins","reset.countdown.6":"6 - Starting time engines","reset.countdown.7":"7 - Disassembling railguns","reset.countdown.8":"8 - Releasing lizards","reset.countdown.9":"9 - Sacrificing unicorns","reset.countdown.10":"10 - Harvesting catnip","reset.last.message":"See you next poincaré recurrence","reset.tip":'You can cancel this reset by disabling "Enable Kitten Scientists" at the top of the settings.',"resources.consume":"Consume: {0}","resources.consume.prompt":"Enter how much of the resource you want automations to consume as a percentage between 0.0 and 100.0.","resources.consume.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","resources.consume.promptTitle":"Consumption Share for {0} (Current: {1})","resources.consume.set":"Consume rate for {0}","resources.consume.title":"Consuming {0} of {1}","resources.consume.titleZero":"Not consuming {0}","resources.stock.prompt":"Enter how much of the resource you always want to keep in stock.","resources.stock.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","resources.stock.promptTitle":"Stock value for {0} (Current: {1})","resources.stock.title":"Keeping {0} {1} in stock","resources.stock.titleInfinite":"Keeping all {0} in stock","resources.stock.titleZero":"Not keeping any {0} in stock","state.compress":"Compress copied Kittens Game saves","state.confirmDestruction":"Are you sure?","state.copied.game":"Save '{0}' copied to clipboard.","state.copied.gameCurrent":"Current save copied to clipboard.","state.copied.state":"State '{0}' copied to clipboard.","state.copied.stateCurrent":"Current state copied to clipboard.","state.copy.game":"Copy this save to the clipboard.","state.copy.gameCurrent":"Copy the entire Kittens Game save (includes KS settings) to the clipboard.","state.copy.state":"Copy these settings to the clipboard.","state.copy.stateCurrent":"Copy the current Kitten Scientists settings to the clipboard.","state.delete.game":"Delete this save.","state.delete.state":"Delete these settings.","state.deleted.game":"Save '{0}' deleted.","state.deleted.state":"State '{0}' deleted.","state.edit.game":"Change the name of this save.","state.edit.state":"Change the name of these settings.","state.exportAll":"Backup","state.exportAllTitle":"Stores all local states in a single file and downloads it.","state.import":"Import settings/saves","state.imported.game":"Save imported.","state.imported.state":"State imported.","state.importedState":"Imported state {0}","state.importTitle":`Paste a save or settings from your clipboard.
|
|
2
|
+
Contents will be automatically detected and handled accordingly.`,"state.loaded.game":"Save '{0}' loaded.","state.loaded.state":"State '{0}' loaded.","state.loadPrompt":"Paste your (un/compressed) save or settings here:","state.local":"Local storage management","state.localGames":"Kittens Game Saves","state.localStates":"Kitten Scientists Settings","state.new":"New","state.noConfirm":"Don't ask for confirmation","state.store":"Store","state.stored.game":"Save stored.","state.stored.state":"State stored.","state.storeFactory":"Create a new state from factory defaults.","state.storeGame":"Create a new save from the current game.","state.storeGame.prompt":"Provide a label for this save:","state.storeState":"Create a new state from current settings.","state.storeState.prompt":"Provide a label for this state:","state.title":"State Management","state.unlabeledGame":"unlabeled save","state.unlabeledState":"unlabeled state","state.update.game":"Save the current game into this slot.","state.update.state":"Save the current settings into this slot.","state.updated.game":"Save '{0}' updated.","state.updated.state":"State '{0}' updated.","status.auto.disable":"Disabled Auto {0}","status.auto.enable":"Enabled Auto {0}","status.ks.disable":"Disabling the Kitten Scientists!","status.ks.enable":"Enabling the Kitten Scientists!","status.ks.init":"Kitten Scientists initialized.","status.ks.upgrade":"Kitten Scientists {0} (ours is {1}) is available at {2}.","status.reset.check.disable":"Disabled check {0} before Reset Timeline","status.reset.check.enable":"Enabled check {0} before Reset Timeline","status.resource.disable":"Disabled {0} resource management","status.resource.enable":"Enabled {0} resource management","status.sub.disable":"Disabled {0}","status.sub.enable":"Enabled {0}","summary.accelerate":"Accelerated time {0} times","summary.adore":"Accumulated {0} epiphany by adoring the galaxy","summary.building":"Built {0} {1}","summary.craft":"Crafted {0} {1}","summary.day":"day","summary.days":"days","summary.distribute":"Helped {0} kittens find a job","summary.embassy":"Built {0} embassies","summary.feed":"Fed the elders {0} necrocorns","summary.festival":"Held {0} festivals","summary.fix.cry":"Fixed {0} cryochambers","summary.head":"Summary of the last {0}","summary.hunt":"Sent adorable kitten hunters on {0} hunts","summary.praise":"Accumulated {0} worship by praising the sun","summary.promote":"Promoted our leader {0} times","summary.refine":"Refined {0} {1}","summary.separator":" and ","summary.show":"Show activity","summary.stars":"Observed {0} stars","summary.sun":"Discovered {0} {1}","summary.tech":"Researched {0}","summary.time.activeHeatTransferStart":"Active Heat Transfer {0} times","summary.time.getTemporalFlux":"Burn crystal to gain time flux {0} times","summary.time.reset.content":"Gained {0} Karma.<br>Gained {1} Paragon","summary.time.reset.title":"Summary of the last {0} timelines","summary.time.skip":"Skipped {0} years","summary.trade":"Traded {0} times with {1}","summary.transcend":"Transcended {0} times","summary.upgrade":"Upgraded {0}","summary.year":"year","summary.years":"years","time.heatTransfer.cycle.disable":"Disabled active heat transfer in cycle {0}","time.heatTransfer.cycle.enable":"Enabled active heat transfer in cycle {0}","time.skip.cycle.disable":"Disabled time skip in cycle {0} and disallow skip over this cycle","time.skip.cycle.enable":"Enabled time skip in cycle {0} and allow skip over this cycle","time.skip.season.disable":"Disabled time skip in the {0}","time.skip.season.enable":"Enabled time skip in the {0}","trade.limited":"Trading with {0}: limited to only occur when profitable based off relative production time","trade.season.disable":"Disabled trading with {0} in the {1}","trade.season.enable":"Enabled trading with {0} in the {1}","trade.seasons":"seasons","trade.unlimited":"Trading with {0}: unlimited","ui.additional":"Additional options","ui.build":"Bonfire","ui.close":"close","ui.craft":"Workshop","ui.craft.resources":"Resources","ui.cycles":"cycles","ui.disable.all":"Disable all options in this list.","ui.distribute":"Village","ui.enable.all":"Enable all options in this list.","ui.engine":"Enable Kitten Scientists","ui.faith":"Religion","ui.filter":"Log Filters","ui.infinity":"∞","ui.internals":"Internals","ui.internals.interval":"Interval: {0}","ui.internals.interval.prompt":"Enter the new amount of milliseconds as an absolute value between 0 and Infinity.","ui.internals.interval.promptExplainer":"All notations that the game supports are accepted. If you set the limit to 0, Kitten Scientists will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.internals.interval.promptTitle":"Kitten Scientists Execution Interval (Current: {0})","ui.itemsHide":"Collapse section","ui.itemsShow":"Expand section","ui.ksColumn":"Display KS in fourth column in UI","ui.language":"Language","ui.limit":"Limited","ui.limited.off":"Unlimited","ui.limited.on":"Eco Mode","ui.max":"Max: {0}","ui.max.build.prompt":"Limit for {0} (Current: {1})","ui.max.build.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.build.title":"Build {0} {1}","ui.max.build.titleInfinite":"Never stop building {0}","ui.max.build.titleZero":"Don't build {0}","ui.max.craft.prompt":"Enter the new limit of how many {0} to craft as an absolute value between 0 and Infinity.","ui.max.craft.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.craft.promptTitle":"Limit for Crafting {0} (Current: {1})","ui.max.craft.title":"Craft {0} {1}","ui.max.craft.titleInfinite":"Never stop crafting {0}","ui.max.craft.titleZero":"Don't craft {0}","ui.max.distribute.prompt":"Enter the new amount of kittens to assign as {0} as an absolute value between 0 and Infinity.","ui.max.distribute.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.distribute.promptTitle":"Assign Max. Kittens as {0} (Current: {1})","ui.max.distribute.title":"Assign {0} kittens as {1}","ui.max.distribute.titleInfinite":"Assign as many kittens as possible as {0}","ui.max.distribute.titleZero":"Don't assign any kittens as {0}","ui.max.embassy.title":"Build {0} embassy for {1}","ui.max.embassy.titleInfinite":"Never stop building embassies for {0}","ui.max.embassy.titleZero":"Don't build embassies for {0}","ui.max.prompt.absolute":"Enter the new limit as an absolute value between 0 and Infinity.","ui.max.prompt.float":"Enter the new limit as an absolute value between 0.0 and Infinity.","ui.max.set":"Maximum for {0}","ui.max.timeSkip.prompt":"Enter the new amount of years as an absolute value between 0 and Infinity.","ui.max.timeSkip.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.timeSkip.promptTitle":"Max. Years to skip (Current: {0})","ui.max.timeSkip.title":"Skip {0} years at once","ui.max.timeSkip.titleInfinite":"Skip as many years as possible","ui.max.timeSkip.titleZero":"Don't skip time","ui.maximum":"Maximum","ui.min":"Min: {0}","ui.options":"Options","ui.reset":"Reset list options to default configuration.","ui.resources":"Resource Control","ui.space":"Space","ui.time":"Time","ui.timeCtrl":"Time Control","ui.trade":"Trade","ui.trigger":"Trigger: {0}","ui.trigger.accelerateTime.prompt":"Enter the new temporal flux storage level at which to enable Tempus Fugit as a percentage between 0.0 and 100.0.","ui.trigger.accelerateTime.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.accelerateTime.promptTitle":"Trigger to Accelerate Time (Current: {0})","ui.trigger.activeHeatTransfer.prompt":"Enter the new temporal heat storage level at which to enable heat transfer as a percentage between 0.0 and 100.0.","ui.trigger.activeHeatTransfer.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.activeHeatTransfer.promptTitle":"Trigger for Heat Transfer (Current: {0})","ui.trigger.build.blocked":`∞
|
|
3
|
+
🛈 The {0} section has no trigger set. This build will not be triggered!`,"ui.trigger.build.inherited":"inherited from section","ui.trigger.build.prompt":"Trigger for {0} (Current: {1})","ui.trigger.build.promptExplainer":"If you submit an empty value, or a negative value, the section trigger is used instead. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.trigger.crypto.prompt":"Enter the new relic storage level at which to trade blackcoin as an absolute value between 0.0 and Infinity.","ui.trigger.crypto.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.crypto.promptTitle":"Trigger to Trade Blackcoin (Current: {0})","ui.trigger.embassies.prompt":"Enter the new culture storage level at which to build embassies as a percentage between 0.0 and 100.0.","ui.trigger.embassies.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.embassies.promptTitle":"Trigger to Build Embassies (Current: {0})","ui.trigger.hunt.prompt":"Trigger for Hunting (Current: {0})","ui.trigger.hunt.promptExplainer":"If you submit a negative value, hunting will be disabled. If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.inactive":"inactive","ui.trigger.promoteKittens.prompt":"Enter the new gold storage level at which to promote kittens as a percentage between 0.0 and 100.0.","ui.trigger.promoteKittens.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.promoteKittens.promptTitle":"Trigger to Promote Kittens (Current: {0})","ui.trigger.prompt.absolute":"Enter the new trigger value as an absolute value between 0 and Infinity.","ui.trigger.prompt.float":"Enter the new trigger value as an absolute value between 0.0 and Infinity.","ui.trigger.prompt.percentage":"Enter the new trigger value as a percentage between 0.0 and 100.0.","ui.trigger.reset.promptExplainer":"If you submit a negative value, the item will be disabled. If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.section":"Section default trigger: {0}","ui.trigger.section.blocked":`∞
|
|
4
|
+
🛈 The {0} section has no trigger set. This automation will not be triggered!`,"ui.trigger.section.inactive":"∞ (nothing is triggered automatically)","ui.trigger.section.inherited":"inherited from section","ui.trigger.section.prompt":"Trigger for section {0} (Current: {1})","ui.trigger.section.promptExplainer":`If you submit an empty value, or a negative value, the section trigger will be set to infinity (∞). Individual automations in this section need to have their own trigger set to be activated.
|
|
5
|
+
If you submit an invalid value, it will be treated as if you hit Cancel.`,"ui.trigger.setinteger":"Enter a new trigger value for {0}. Should be in the range from 0 up to any number. -1 means infinity.","ui.trigger.setinteger.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.setpercentage":"Enter a new trigger value for {0}. Should be in the range from 0 to 100.","ui.trigger.setpercentage.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.timeSkip.prompt":"Enter the new amount of Time Crystals at which to skip time as an absolute value between 1 and Infinity.","ui.trigger.timeSkip.promptExplainer":"If you submit a negative value, time skipping will be disabled. If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.timeSkip.promptTitle":"Trigger for Time Skip (Current: {0})","ui.upgrade":"Science","ui.upgrade.buildings":"Upgrade buildings","ui.upgrade.missions":"Start missions","ui.upgrade.policies":"Research policies","ui.upgrade.races":"Explore new races","ui.upgrade.techs":"Research technologies","ui.upgrade.upgrades":"Research upgrades","ui.upgrades":"Upgrades",update:"Update","upgrade.building.amphitheatre":"Upgraded amphitheatres to broadcast towers!","upgrade.building.aqueduct":"Upgraded aqueducts to hydro plants!","upgrade.building.library":"Upgraded libraries to data centers!","upgrade.building.pasture":"Upgraded pastures to solar farms!","upgrade.building.warehouse":"Upgraded warehouses to spaceports!","upgrade.policy":"Kittens have passed {0}","upgrade.race":"Kittens met the {0}","upgrade.space":"Kittens conducted a {0}","upgrade.space.mission":"Kittens conducted a mission to {0}","upgrade.tech":"Kittens have bought the tech {0}","upgrade.upgrade":"Kittens have bought the upgrade {0}"},hn={"act.accelerate":"Zeit beschleunigen!","act.adore":"Verehre die Galaxie! Kumulierte {0} Anbetung zu {1} Offenbarung","act.blackcoin.buy":"Kätzchen haben deine Relikte verkauft und {0} Blackcoins gekauft","act.blackcoin.sell":"Kätzchen haben deine Blackcoins verkauft und {0} Relikte gekauft","act.build":"Kätzchen haben ein neues {0} gebaut","act.builds":"Kätzchen haben ein neues {0} {1} Mal gebaut","act.craft":"Kätzchen haben {0} {1} hergestellt","act.distribute":"Ein Kätzchen an {0} verteilt","act.elect":"Kätzchen haben einen neuen Anführer gewählt.","act.feed":"Kätzchen haben die Ältesten gefüttert. Die Ältesten sind zufrieden","act.fix.cry":"Kätzchen haben {0} Kryokammern repariert","act.hunt":"Kätzchen auf {0} Jagden entsendet","act.observe":"Kitten Scientists haben einen Stern beobachtet","act.praise":"Die Sonne gelobt! {0} Glaube zu {1} Anbetung kumuliert","act.promote":"Der Anführer der Kätzchen wurde zum Rang {0} befördert","act.refineTCs":"{0} Zeit-Kristalle verfeinert","act.refineTears":"{0} Tränen zu STF verfeinert","act.sacrificeAlicorns":"{0} Alihörner geopfert","act.sacrificeUnicorns":"{0} Einhörner geopfert","act.sun.discover":"Kätzchen haben {0} entdeckt","act.sun.discovers":"Kätzchen haben {0} {1} mal entdeckt","act.time.activeHeatTransferEnd":"Aktiver Wärmetransfer beendet","act.time.activeHeatTransferStart":"Starte aktiven Wärmetransfer","act.time.getTemporalFlux":"Verbrennt Kristalle, um Flux zur Erhaltung der Zeitbeschleunigung zu bekommen","act.time.skip":"Kätzchen verbrennen einen Zeit-Kristall, {0} Jahre übersprungen!","act.trade":"Kätzchen haben {0} mal mit {1} gehandelt","act.transcend":"{0} Offenbarung ausgegeben, auf T-Level {1} aufgestiegen","blackcoin.buy":"Kauf-Limit: {0}","blackcoin.buy.prompt":"Gib den Preis ein, ab welchem du keine Blackcoins mehr kaufen möchtest.","blackcoin.buy.promptExplainer":"Der Blackcoin-Preis steigt immer von 800 auf 1100 (ungefähr), dann stürzt er ab. Du möchtest normalerweise bis kurz vor dem Verkauf einkaufen.","blackcoin.buy.promptTitle":"Kauf-Limit für Blackcoins (Aktuell: {0})","blackcoin.buy.title":"Blackcoins kaufen bis der Preis {0} erreicht","blackcoin.buy.trigger":"kaufe Blackcoins (in Relikten)","blackcoin.sell":"Verkauf-Order: {0}","blackcoin.sell.prompt":"Gib den Preis ein, zu welchem du deine Blackcoins verkaufen möchtest.","blackcoin.sell.promptExplainer":"Der Blackcoin-Preis steigt immer von 800 auf 1100 (ungefähr), dann stürzt er ab. Du möchtest normalerweise nahe dem höchstmöglichen Preis verkaufen.","blackcoin.sell.promptTitle":"Verkauf-Order für Blackcoins (Aktuell: {0})","blackcoin.sell.title":"Blackcoins verkaufen, wenn der Preis {0} erreicht","build.embassies":"{0} Botschaften für {1} gebaut","build.embassy":"{0} Botschaft für {1} gebaut",copy:"Kopieren","craft.limited":"Herstellen von {0}: im Verhältnis zum Kostenverhältnis begrenzt","craft.unlimited":"Herstellung von {0}: unbegrenzt",delete:"Löschen","dispose.necrocorn":"Kätzchen haben ineffiziente Necrocorns entsorgt","festival.extend":"Kätzchen haben das Festival verlängert","festival.hold":"Kätzchen fangen an, ein Festival abzuhalten","filter.accelerate":"Tempus Fugit","filter.adore":"Bewundern","filter.allKG":"Alle KG Protokollnachrichten.","filter.build":"Bauen","filter.craft":"Herstellen","filter.disable":"{0} Protokollnachrichten deaktiviert","filter.distribute":"Verteilen","filter.enable":"{0} Protokollnachrichten aktiviert","filter.explainer":"Deaktivierte Nachrichtentypen erscheinen nicht im Protokoll.","filter.faith":"Orden der Sonne","filter.festival":"Festivals","filter.hunt":"Jagen","filter.misc":"Diverses","filter.praise":"Bewundern","filter.promote":"Anführer befördern","filter.research":"Erforschen","filter.star":"Astronomische Ereignisse","filter.timeSkip":"Zeitsprung","filter.trade":"Handeln","filter.transcend":"Transzendenz","filter.upgrade":"Verbesserungen","option.accelerate":"Tempus Fugit","option.autofeed":"Leviathane füttern","option.catnip":"Katzenminze sammeln","option.crypto":"Blackcoin handeln","option.elect":"Anführer benennen","option.elect.job":"Beruf","option.elect.job.any":"Beliebig","option.elect.trait":"Eigenschaft","option.embassies":"Botschaften bauen","option.faith.adore":"Bewundere die Galaxie","option.faith.autoPraise":"Lobe die Sonne","option.faith.best.unicorn":"Reihenfolge automatisch optimieren","option.faith.refineTears":"Tränen verfeinern","option.faith.refineTimeCrystals":"ZKs verfeinern","option.faith.sacrificeAlicorns":"Alihörner opfern","option.faith.sacrificeUnicorns":"Einhörner opfern","option.faith.transcend":"Transzendenz","option.festival":"Festivals veranstalten","option.fix.cry":"Kryokammern reparieren","option.hunt":"Jagen","option.magnetos":"Magnetos einschalten","option.observe":"Astro-Ereignisse beobachten","option.praise":"Lobe die Sonne","option.promote":"Anführer befördern","option.promotekittens":"Kätzchen befördern","option.reactors":"Reaktoren einschalten","option.shipOverride":"Erzwinge 243 Schiffe","option.steamworks":"Dampfmaschinen einschalten","option.time.activeHeatTransfer":"Aktiver Wärmetransfer","option.time.reset":"Zeitleiste zurücksetzen (Gefahr!)","option.time.skip":"Zeitsprung","option.time.skip.ignoreOverheat":"Überhitzen ignorieren",reset:"Zurücksetzen","reset.after":"Schön, dich kennenzulernen, die niedlichen Kitten Scientists werden dir dienen","reset.cancel.activity":"Miauston, wir haben ein Problem","reset.cancel.message":"Zeitleiste zurücksetzen abgebrochen","reset.check":"Auslöser für {0}: {1}, du hast {2}","reset.checked":"Alle Bedingungen sind erfüllt, die Zeitlinie wird in den nächsten Sekunden neu gestartet!","reset.countdown.0":"0 - Temporale Risse geöffnet!","reset.countdown.1":"1 - Start der Zeitmaschine","reset.countdown.2":"2 - Chronoschmiede wird beschleunigt","reset.countdown.3":"3 - Zeit-Risse werden geöffnet","reset.countdown.4":"4 - Satellit wird ausgeschaltet","reset.countdown.5":"5 - Schmelze Blackcoins","reset.countdown.6":"6 - Zeit-Motoren werden gestartet","reset.countdown.7":"7 - Strahlenkanonen werden demontiert","reset.countdown.8":"8 - Freisetzung von Echsen","reset.countdown.9":"9 - Opfere Einhörner","reset.countdown.10":"10 - Katzenminzeernte","reset.last.message":"Wir sehen uns bei der nächsten poincaréschen Wiederkehr","reset.tip":'Du kannst diesen Neustart abbrechen, indem du "Kitten Scientists aktivieren" oben in den Einstellungen deaktivierst.',"resources.consume":"Verbrauch: {0}","resources.consume.prompt":"Gib ein wie viel von der Ressource von Automatisierungen verbraucht werden darf. Der Wert sollte zwischen 0,0 und 100,0 liegen.","resources.consume.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","resources.consume.promptTitle":"Verbrauchsanteil für {0} (Aktuell: {1})","resources.consume.set":"Verbrauchs-Rate für {0}","resources.consume.title":"Verbraucht {0} von {1}","resources.consume.titleZero":"{0} werden nicht verbraucht","resources.stock.prompt":"Gib ein wie viel von der Ressource jederzeit im Lager bleiben soll.","resources.stock.promptExplainer":"Alle Notationen, die das Spiel unterstützt werden, akzeptiert. Wenn du gar nichts, oder einen negativen Wert eingibst, wird die Grenze auf unendlich gesetzt. Wenn du die Grenze auf 0 setzt, wird Zeit Überspringen deaktiviert. Wenn du einen ungültigen Wert eingibst, wird das genauso behandelt als ob du Abbrechen gedrückt hättest.","resources.stock.promptTitle":"Mindest-Lagerbestand von {0} (Aktuell: {1})","resources.stock.title":"{0} {1} werden auf Lager gehalten","resources.stock.titleInfinite":"Alle {0} werden auf Lager gehalten","resources.stock.titleZero":"{0} werden nicht auf Lager gehalten","state.compress":"Kopierte Kittens Game Spielstände komprimieren","state.confirmDestruction":"Bist du sicher?","state.copied.game":"Spielstand '{0}' in die Zwischenablage kopiert.","state.copied.gameCurrent":"Aktueller Spielstand in Zwischenablage kopiert.","state.copied.state":"Zustand '{0}' in Zwischenablage kopiert.","state.copied.stateCurrent":"Aktueller Zustand wurde in die Zwischenablage kopiert.","state.copy.game":"Diesen Spielstand in die Zwischenablage kopieren.","state.copy.gameCurrent":"Kopiere den gesamten Kittens Game Spielstand (inklusive KS-Einstellungen) in die Zwischenablage.","state.copy.state":"Diese Einstellungen in die Zwischenablage kopieren.","state.copy.stateCurrent":"Kopiere die aktuellen Kitten Scientists Einstellungen in die Zwischenablage.","state.delete.game":"Diesen Spielstand löschen.","state.delete.state":"Diese Einstellungen löschen.","state.deleted.game":"Spielstand '{0}' gelöscht.","state.deleted.state":"Zustand '{0}' gelöscht.","state.edit.game":"Ändere den Namen von diesem Spielstand.","state.edit.state":"Ändere den Namen von diesen Einstellungen.","state.exportAll":"Export","state.exportAllTitle":"Speichert alle lokalen Zustände in einer Datei und lädt sie herunter.","state.import":"Einstellungen/Spielstände importieren","state.imported.game":"Spielstand importiert.","state.imported.state":"Zustand importiert.","state.importedState":"Importierter Stand {0}","state.importTitle":`Füge ein Spielstand oder Einstellungen aus deiner Zwischenablage ein.
|
|
6
|
+
Inhalte werden automatisch erkannt und entsprechend behandelt.`,"state.loaded.game":"Spielstand '{0}' geladen.","state.loaded.state":"Zustand '{0}' geladen.","state.loadPrompt":"Füge deinen (un/komprimierten) Spielstand oder deine Einstellungen hier ein:","state.local":"Lokale Speicherverwaltung","state.localGames":"Kittens Game Spielstände","state.localStates":"Kitten Scientists Einstellungen","state.new":"Neu","state.noConfirm":"Nicht nach Bestätigung fragen","state.store":"Speichern","state.stored.game":"Spielstand gespeichert.","state.stored.state":"Zustand gespeichert.","state.storeFactory":"Neuen Zustand aus Werkseinstellungen erstellen.","state.storeGame":"Neuen Spielstand vom aktuellen Spiel erstellen.","state.storeGame.prompt":"Gib eine Beschreibung für diesen Spielstand ein:","state.storeState":"Erstelle einen neuen Zustand aus den aktuellen Einstellungen.","state.storeState.prompt":"Gib eine Beschreibung für diesen Zustand ein:","state.title":"Zustandsverwaltung","state.unlabeledGame":"unbeschriftetes Spiel","state.unlabeledState":"unbeschrifteter Zustand","state.update.game":"Speichere das aktuelle Spiel in diesem Slot.","state.update.state":"Speichere die aktuellen Einstellungen in diesem Slot.","state.updated.game":"Spielstand '{0}' aktualisiert.","state.updated.state":"Zustand '{0}' aktualisiert.","status.auto.disable":"Auto {0} deaktiviert","status.auto.enable":"Auto {0} aktiviert","status.ks.disable":"Deaktiviere die Kitten Scientists!","status.ks.enable":"Aktiviere die Kitten Scientists!","status.ks.init":"Kitten Scientists initialisiert.","status.ks.upgrade":"Kitten Scientists {0} (unsere ist {1}) ist unter {2} verfügbar.","status.reset.check.disable":"Überprüfung von {0} vor dem Zurücksetzen der Zeitlinie deaktiviert","status.reset.check.enable":"Überprüfung von {0} vor dem Zurücksetzen der Zeitlinie aktiviert","status.resource.disable":"{0} Ressourcenverwaltung deaktiviert","status.resource.enable":"{0} Ressourcenverwaltung aktiviert","status.sub.disable":"{0} deaktiviert","status.sub.enable":"{0} aktiviert","summary.accelerate":"Zeit {0} Mal beschleunigt","summary.adore":"{0} Offenbarung durch das Bewundern der Galaxie akkumuliert","summary.building":"{0} {1} gebaut","summary.craft":"{0} {1} hergestellt","summary.day":"Tag","summary.days":"Tage","summary.distribute":"{0} Kätzchen geholfen einen Beruf zu finden","summary.embassy":"{0} Botschaften gebaut","summary.feed":"{0} Necrocorns an die Ältesten verfüttert","summary.festival":"{0} Festivals veranstaltet","summary.fix.cry":"{0} Kryokammern repariert","summary.head":"Zusammenfassung der letzten {0}","summary.hunt":"Niedliche Jäger Kätzchen auf {0} Jagden versandt","summary.praise":"{0} Anbetung durch Loben der Sonne akkumuliert","summary.promote":"Unseren Anführer {0} mal befördert","summary.refine":"{0} {1} verfeinert","summary.separator":" und ","summary.show":"Aktivitäten anzeigen","summary.stars":"{0} Sterne beobachtet","summary.sun":"{0} {1} entdeckt","summary.tech":"{0} erforscht","summary.time.activeHeatTransferStart":"Aktive Wärmeübertragung {0} mal","summary.time.getTemporalFlux":"{0} Mal Kristalle verbrannt, um Zeit Flux zu generieren","summary.time.reset.content":"{0} Karma erhalten.<br>{1} Paragon erhalten","summary.time.reset.title":"Zusammenfassung der letzten {0} Zeitleisten","summary.time.skip":"{0} Jahre übersprungen","summary.trade":"{0} mal mit {1} gehandelt","summary.transcend":"{0} mal aufgestiegen","summary.upgrade":"{0} verbessert","summary.year":"Jahr","summary.years":"Jahre","time.heatTransfer.cycle.disable":"Aktiver Wärmetransfer im Zyklus {0} deaktiviert","time.heatTransfer.cycle.enable":"Aktiver Wärmetransfer im Zyklus {0} aktiviert","time.skip.cycle.disable":"Zeitsprung im Zyklus {0} und Überspringen über diesen Zyklus verboten","time.skip.cycle.enable":"Zeitsprung im Zyklus {0} und Überspringen über diesen Zyklus erlaubt","time.skip.season.disable":"Zeitsprung in {0} deaktiviert","time.skip.season.enable":"Zeitsprung in {0} aktiviert","trade.limited":"Handel mit {0}: limitiert auf nur, wenn profitabel auf Basis der relativen Produktionszeit","trade.season.disable":"Handel mit {0} in {1} deaktiviert","trade.season.enable":"Handel mit {0} in {1} aktiviert","trade.seasons":"Jahreszeiten","trade.unlimited":"Handel mit {0}: unbegrenzt","ui.additional":"Weitere Optionen","ui.build":"Lagerfeuer","ui.close":"schließen","ui.craft":"Werkstatt","ui.craft.resources":"Ressourcen","ui.cycles":"Zyklen","ui.disable.all":"Alle Optionen in dieser Liste deaktivieren.","ui.distribute":"Dorf","ui.enable.all":"Alle Optionen in dieser Liste aktivieren.","ui.engine":"Kitten Scientists aktivieren","ui.faith":"Religion","ui.filter":"Protokollfilter","ui.infinity":"∞","ui.internals":"Intern","ui.internals.interval":"Intervall: {0}","ui.internals.interval.prompt":"Gib die neue Anzahl an Millisekunden als absoluten Wert zwischen 0 und unendlich ein.","ui.internals.interval.promptExplainer":"Alle Notationen, die das Spiel unterstützt werden, akzeptiert. Wenn du die Grenze auf 0 setzt, werden die Kitten Scientists deaktiviert. Wenn du einen ungültigen Wert eingibst, wird das genauso behandelt als ob du Abbrechen gedrückt hättest.","ui.internals.interval.promptTitle":"Kitten Scientists Ausführungsintervall (Aktuell: {0})","ui.itemsHide":"Abschnitt einklappen","ui.itemsShow":"Abschnitt ausklappen","ui.ksColumn":"KS in vierter Spalte im UI anzeigen","ui.language":"Sprache","ui.limit":"Begrenzt","ui.limited.off":"Unbegrenzt","ui.limited.on":"Öko-Modus","ui.max":"Max: {0}","ui.max.build.prompt":"Grenze für {0} (Aktuell: {1})","ui.max.build.promptExplainer":"Alle Notationen, die das Spiel unterstützt werden, akzeptiert. Wenn du gar nichts, oder einen negativen Wert eingibst, wird die Grenze auf unendlich gesetzt. Wenn du die Grenze auf 0 setzt, wird Zeit Überspringen deaktiviert. Wenn du einen ungültigen Wert eingibst, wird das genauso behandelt als ob du Abbrechen gedrückt hättest.","ui.max.build.title":"Baue {0} {1}","ui.max.build.titleInfinite":"Nie aufhören {0} zu bauen","ui.max.build.titleZero":"{0} nicht bauen","ui.max.craft.prompt":"Gib die neue Grenze zum Herstellen von {0} als absoluten Wert zwischen 0 und unendlich ein.","ui.max.craft.promptExplainer":"Alle Notationen, die das Spiel unterstützt werden, akzeptiert. Wenn du gar nichts, oder einen negativen Wert eingibst, wird die Grenze auf unendlich gesetzt. Wenn du die Grenze auf 0 setzt, wird Zeit Überspringen deaktiviert. Wenn du einen ungültigen Wert eingibst, wird das genauso behandelt als ob du Abbrechen gedrückt hättest.","ui.max.craft.promptTitle":"Grenze für Herstellen von {0} (Aktuell: {1})","ui.max.craft.title":"{0} {1} herstellen","ui.max.craft.titleInfinite":"Nie aufhören {0} herzustellen","ui.max.craft.titleZero":"{0} nicht herstellen","ui.max.distribute.prompt":"Gib die neue Anzahl an Kätzchen im {0} Beruf als absoluten Wert zwischen 0 und unendlich ein.","ui.max.distribute.promptExplainer":"Alle Notationen, die das Spiel unterstützt werden, akzeptiert. Wenn du gar nichts, oder einen negativen Wert eingibst, wird die Grenze auf unendlich gesetzt. Wenn du die Grenze auf 0 setzt, wird Zeit Überspringen deaktiviert. Wenn du einen ungültigen Wert eingibst, wird das genauso behandelt als ob du Abbrechen gedrückt hättest.","ui.max.distribute.promptTitle":"Max. Kätzchen als {0} zuweisen (Aktuell: {1})","ui.max.distribute.title":"{0} Kätzchen als {1} zuweisen","ui.max.distribute.titleInfinite":"So viele Kätzchen wie möglich als {0} zuweisen","ui.max.distribute.titleZero":"Keine Kätzchen als {0} zuweisen","ui.max.embassy.title":"Baue {0} Botschaften für {1}","ui.max.embassy.titleInfinite":"Nie aufhören Botschaften für {0} zu bauen","ui.max.embassy.titleZero":"Keine Botschaften für {0} bauen","ui.max.prompt.absolute":"Gib die neue Grenze als absoluten Wert zwischen 0 und unendlich ein.","ui.max.prompt.float":"Gib die neue Grenze als absoluten Wert zwischen 0,0 und unendlich ein.","ui.max.set":"Maximum für {0}","ui.max.timeSkip.prompt":"Gib die neue Anzahl an Jahren als absoluten Wert zwischen 0 und unendlich ein.","ui.max.timeSkip.promptExplainer":"Alle Notationen, die das Spiel unterstützt werden, akzeptiert. Wenn du gar nichts, oder einen negativen Wert eingibst, wird die Grenze auf unendlich gesetzt. Wenn du die Grenze auf 0 setzt, wird Zeit Überspringen deaktiviert. Wenn du einen ungültigen Wert eingibst, wird das genauso behandelt als ob du Abbrechen gedrückt hättest.","ui.max.timeSkip.promptTitle":"Max. Jahre zum Überspringen (Aktuell: {0})","ui.max.timeSkip.title":"{0} Jahre auf einmal überspringen","ui.max.timeSkip.titleInfinite":"So viele Jahre wie möglich überspringen","ui.max.timeSkip.titleZero":"Keine Zeit überspringen","ui.maximum":"Maximum","ui.min":"Min. {0}","ui.options":"Optionen","ui.reset":"Optionen in der Liste auf Standardkonfiguration zurücksetzen.","ui.resources":"Ressourcensteuerung","ui.space":"Weltraum","ui.time":"Zeit","ui.timeCtrl":"Zeitsteuerung","ui.trade":"Handel","ui.trigger":"Auslöser: {0}","ui.trigger.accelerateTime.prompt":"Gib den neuen Lagerbestand von Temporalem Flux, bei welchem Tempus Fugit aktiviert werden soll, als Prozentzahl ein. Der Wert sollte zwischen 0,0 und 100,0 liegen.","ui.trigger.accelerateTime.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.accelerateTime.promptTitle":"Auslöser zur Zeit-Beschleunigung (Aktuell: {0})","ui.trigger.activeHeatTransfer.prompt":"Gib den neuen Stand von Chronohitze, bei welchem aktiver Wärmetransfer aktiviert werden sollen, als Prozentzahl ein. Der Wert sollte zwischen 0,0 und 100,0 liegen.","ui.trigger.activeHeatTransfer.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.activeHeatTransfer.promptTitle":"Auslöser für Wärmetransfer (Aktuell: {0})","ui.trigger.build.blocked":`∞
|
|
7
|
+
🛈 Der Abschnitt {0} hat keinen Auslöser gesetzt. Diese Option wird nie ausgelöst!`,"ui.trigger.build.inherited":"von Abschnitt übernommen","ui.trigger.build.prompt":"Auslöser für {0} (Aktuell: {1})","ui.trigger.build.promptExplainer":'Wenn du gar nichts, oder eine negative Zahl eingibst, wird der Auslöser des Abschnitts geerbt. Ungültige Eingaben werden so behandelt als ob du "Abbrechen" drückst.',"ui.trigger.crypto.prompt":"Gib den neuen Lagerbestand von Relikten, bei welchem Blackcoins gehandelt werden sollen, als absoluten Wert zwischen 0,0 und unendlich ein.","ui.trigger.crypto.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.crypto.promptTitle":"Auslöser um Blackcoin zu handeln (Aktuell: {0})","ui.trigger.embassies.prompt":"Gib den neuen Lagerbestand von Kultur, bei welchem Botschaften gebaut werden sollen, als Prozentzahl ein. Der Wert sollte zwischen 0,0 und 100,0 liegen.","ui.trigger.embassies.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.embassies.promptTitle":"Auslöser für den Bau von Botschaften (Aktuell: {0})","ui.trigger.hunt.prompt":"Auslöser für Jagd (Aktuell: {0})","ui.trigger.hunt.promptExplainer":"Wenn du einen negativen Wert eingibst, wird Jagen deaktiviert. Wenn du einen leeren Wert oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hast.","ui.trigger.inactive":"inaktiv","ui.trigger.promoteKittens.prompt":"Gib den neuen Lagerbestand von Gold, bei welchem Kätzchen befördert werden sollen, als Prozentzahl ein. Der Wert sollte zwischen 0,0 und 100,0 liegen.","ui.trigger.promoteKittens.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.promoteKittens.promptTitle":"Auslöser um Kätzchen zu befördern (Aktuell: {0})","ui.trigger.prompt.absolute":"Gib den neuen Auslöser als absoluten Wert zwischen 0 und unendlich ein.","ui.trigger.prompt.float":"Gib den neuen Auslöser als absoluten Wert zwischen 0,0 und unendlich ein.","ui.trigger.prompt.percentage":"Gib den neuen Auslöser als Prozentzahl zwischen 0,0 und 100,0 ein.","ui.trigger.reset.promptExplainer":"Wenn du einen negativen Wert eingibst, wird die Option deaktiviert. Wenn du einen leeren Wert oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hast.","ui.trigger.section":"Abschnitt Standard-Auslöser: {0}","ui.trigger.section.blocked":`∞
|
|
8
|
+
🛈 Der Abschnitt {0} hat keinen Auslöser gesetzt. Diese Option wird nie ausgelöst!`,"ui.trigger.section.inactive":"∞ (nichts wird automatisch ausgelöst)","ui.trigger.section.inherited":"von Abschnitt übernommen","ui.trigger.section.prompt":"Auslöser für Abschnitt {0} (Aktuell: {1})","ui.trigger.section.promptExplainer":`Wenn du einen leeren Wert oder einen negativen Wert eingibst, wird der Auslöser des Abschnitts auf Unendlichkeit gesetzt (∞), was alle Optionen deaktiviert, es sei denn, sie haben einen eigenen Auslöser gesetzt.
|
|
9
|
+
Wenn du einen ungültigen Wert eingibst, wird er so behandelt, als ob du "Abbrechen" drückst.`,"ui.trigger.setinteger":"Gib einen neuen Auslöser für {0} ein. Sollte im Bereich von 0 bis zu einer beliebigen Zahl liegen. -1 bedeutet unendlich.","ui.trigger.setinteger.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.setpercentage":"Geben Sie einen neuen Auslöser für {0} ein. Sollte im Bereich von 0 bis 100 liegen.","ui.trigger.setpercentage.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.timeSkip.prompt":"Gib die neue Menge an Zeitkristallen ein, bei welcher Zeit übersprungen werden soll. Der Wert sollte zwischen 1 und unendlich liegen.","ui.trigger.timeSkip.promptExplainer":"Wenn du einen negativen Wert eingibst, werden Zeit-Sprünge deaktiviert. Wenn du einen leeren Wert oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hast.","ui.trigger.timeSkip.promptTitle":"Auslöser für Zeitsprung (Aktuell: {0})","ui.upgrade":"Wissenschaft","ui.upgrade.buildings":"Gebäude verbessern","ui.upgrade.missions":"Missionen starten","ui.upgrade.policies":"Politik erforschen","ui.upgrade.races":"Neue Völker erforschen","ui.upgrade.techs":"Technologien erforschen","ui.upgrade.upgrades":"Verbesserungen erforschen","ui.upgrades":"Verbesserungen",update:"Aktualisieren","upgrade.building.amphitheatre":"Amphitheater zu Sendetürmen verbessert!","upgrade.building.aqueduct":"Aquädukte zu Wasserwerken verbessert!","upgrade.building.library":"Bibliotheken zu Rechenzentren verbessert!","upgrade.building.pasture":"Weiden zu Solarfarmen verbessert!","upgrade.building.warehouse":"Lagerhäuser zu Raumhäfen verbessert!","upgrade.policy":"Kätzchen haben {0} veranlasst","upgrade.race":"Kätzchen haben die {0} getroffen","upgrade.space":"Kätzchen haben {0} durchgeführt","upgrade.space.mission":"Kätzchen haben eine Mission zu {0} durchgeführt","upgrade.tech":"Kätzchen haben die Technologie {0} gekauft","upgrade.upgrade":"Kätzchen haben die Verbesserung {0} gekauft"},un={"act.accelerate":"האץ את הזמן!","act.adore":"העריץ את הגלקסיה! נאסף {0} פולחן ל-{1} תגלית","act.blackcoin.buy":"Kittens sold your Relics and bought {0} Blackcoins","act.blackcoin.sell":"Kittens sold your Blackcoins and bought {0} Relics","act.build":"חתלתולים בנו {0} חדש","act.builds":"חתלתולים בנו {0} חדש {1} פעמים","act.craft":"חתלתולים יצרו {0} {1}","act.distribute":"הופץ חתלתול ל-{0}","act.elect":"חתלתולים בחרו מנהיג חדש.","act.feed":"חתלתולים האכילו את העתיקים. העתיקים מרוצים","act.fix.cry":"חתלתולים תיקנו {0} תאי קריו","act.hunt":"נשלחו חתלתולים {0} פעמים לציד","act.observe":"מדעניתלתול צפו בכוכב","act.praise":"הריעו לשמש! נצבר {0} אמונה עבור {1} פולחן","act.promote":"מנהיג החתלתולים קודם לדרגה {0}","act.refineTCs":"זוקקו {0} בדולחי זמן","act.refineTears":"Refined {0} tears into BLS","act.sacrificeAlicorns":"הוקרבו {0} מכונפי קרן","act.sacrificeUnicorns":"Sacrificed {0} unicorns","act.sun.discover":"חתותולים גילו {0}","act.sun.discovers":"חתלתולים גילו {0} {1} פעמים","act.time.activeHeatTransferEnd":"End active Heat Transfer","act.time.activeHeatTransferStart":"Start active Heat Transfer","act.time.getTemporalFlux":"Burn crystals to obtain time flux to maintain time acceleration","act.time.skip":"חתלתולים שרפו בדולח זמן, ופסחו על {0} שנים!","act.trade":"חתלתולים סחרו {0} פעמים עם {1}","act.transcend":"נוצל {0} תגלית, התעלה לרמת התעלות: {1}","blackcoin.buy":"Buy Limit: {0}","blackcoin.buy.prompt":"Enter at which price you want to stop buying blackcoins.","blackcoin.buy.promptExplainer":"Blackcoin price always rises from 800 to 1100 (roughly), then it crashes. You usually want to buy until shortly before you sell.","blackcoin.buy.promptTitle":"Buy Limit for Blackcoins (Current: {0})","blackcoin.buy.title":"Buy Blackcoins until price reaches {0}","blackcoin.buy.trigger":"קונה מטבעותשחור (בשרידים)","blackcoin.sell":"Sell Order: {0}","blackcoin.sell.prompt":"Enter at which price you want to sell all your blackcoins.","blackcoin.sell.promptExplainer":"Blackcoin price always rises from 800 to 1100 (roughly), then it crashes. You usually want to sell close to the highest possible price.","blackcoin.sell.promptTitle":"Sell Order for Blackcoins (Current: {0})","blackcoin.sell.title":"Sell Blackcoins when price reaches {0}","build.embassies":"נבנו {0} שגרירויות של {1}","build.embassy":"נבנו {0} שגרירויות של {1}",copy:"Copy","craft.limited":"יוצר {0}: מוגבל לעלות היחסית","craft.unlimited":"יוצר {0}: ללא הגבלה",delete:"Delete","dispose.necrocorn":"חתלתולים נפטרו מאלמתי קרן לא יעילים","festival.extend":"חתלתולים האריכו את החגיגה","festival.hold":"חתלתולים החלו לערוך חגיגה","filter.accelerate":"הזמן עובר לו","filter.adore":"מעריץ","filter.allKG":"All KG log entries.","filter.build":"בנייה","filter.craft":"יצירה","filter.disable":"נכבו {0} רשומות","filter.distribute":"חלוקה","filter.enable":"Enabled {0} log messages","filter.explainer":"Disabled items are hidden from the log.","filter.faith":"מסדר השמש","filter.festival":"חגיגות","filter.hunt":"ציד","filter.misc":"שונות","filter.praise":"הילול","filter.promote":"העלאות דרגה","filter.research":"חקר","filter.star":"אירועים אסטרונומיים","filter.timeSkip":"קפיצת זמן","filter.trade":"סחר","filter.transcend":"עילוי","filter.upgrade":"שדרוג","option.accelerate":"הזמן עובר לו","option.autofeed":"האכל לוויתנים","option.catnip":"Gather Catnip","option.crypto":"סחור במטבעשחור","option.elect":"בחר מנהיג","option.elect.job":"Job","option.elect.job.any":"Any","option.elect.trait":"Trait","option.embassies":"בנה שגרירויות","option.faith.adore":"הערץ את הגלקסיה","option.faith.autoPraise":"הלל את השמש","option.faith.best.unicorn":"Automate Build Order","option.faith.refineTears":"זקק דמעות","option.faith.refineTimeCrystals":"זקק TCים","option.faith.sacrificeAlicorns":"הקרב מכונפי קרן","option.faith.sacrificeUnicorns":"Sacrifice Unicorns","option.faith.transcend":"עילוי","option.festival":"ארגן חגיגות","option.fix.cry":"תקן תאי קריו","option.hunt":"צוד","option.magnetos":"הפעל מגנטוים","option.observe":"צפה באירועים אסטרונומיים","option.praise":"הלל את השמש","option.promote":"העלאות דרגה","option.promotekittens":"העלה את דרגת החתלתולים","option.reactors":"Turn on Reactors","option.shipOverride":"הכרח ספינות ל-243","option.steamworks":"הפעל את מנוע הקיטור","option.time.activeHeatTransfer":"Active Heat Transfer","option.time.reset":"אתחל מחדש את ציר הזמן (סכנה!)","option.time.skip":"קפיצת זמן","option.time.skip.ignoreOverheat":"Ignore overheat",reset:"Reset","reset.after":"Nice to meet you, the cute Kitten Scientists will serve you","reset.cancel.activity":"מאוסטון, יש לנו בעיה","reset.cancel.message":"אתחול ציר הזמן בוטל","reset.check":"Trigger for {0}: {1}, you have {2}","reset.checked":"All conditions are met, the timeline will restart in the next few seconds!","reset.countdown.0":"0 - Temporal rifts opened!","reset.countdown.1":"1 - Time engine start","reset.countdown.2":"2 - Boosting the chronoforge","reset.countdown.3":"3 - Opening temporal rifts","reset.countdown.4":"4 - Turning off satellite","reset.countdown.5":"5 - Melting blackcoins","reset.countdown.6":"6 - Starting time engines","reset.countdown.7":"7 - Disassembling railguns","reset.countdown.8":"8 - Releasing lizards","reset.countdown.9":"9 - Sacrificing unicorns","reset.countdown.10":"10 - קוצר נפית חתולים","reset.last.message":"נתראה בהישנות פואנקרה הבאה","reset.tip":'You can cancel this reset by disabling "Enable Kitten Scientists" at the top of the settings.',"resources.consume":"צרוך: {0}","resources.consume.prompt":"Enter how much of the resource you want automations to consume as a percentage between 0.0 and 100.0.","resources.consume.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","resources.consume.promptTitle":"Consumption Share for {0} (Current: {1})","resources.consume.set":"קצב צריכה עבור {0}","resources.consume.title":"Consuming {0} of {1}","resources.consume.titleZero":"Not consuming {0}","resources.stock.prompt":"Enter how much of the resource you always want to keep in stock.","resources.stock.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","resources.stock.promptTitle":"Stock value for {0} (Current: {1})","resources.stock.title":"Keeping {0} {1} in stock","resources.stock.titleInfinite":"Keeping all {0} in stock","resources.stock.titleZero":"Not keeping any {0} in stock","state.compress":"Compress data","state.confirmDestruction":"האם אתה בטוח?","state.copied.game":"Save '{0}' copied to clipboard.","state.copied.gameCurrent":"Current save copied to clipboard.","state.copied.state":"State '{0}' copied to clipboard.","state.copied.stateCurrent":"Current state copied to clipboard.","state.copy.game":"Copy this save to the clipboard.","state.copy.gameCurrent":"Copy the entire Kittens Game save (includes KS settings) to the clipboard.","state.copy.state":"Copy these settings to the clipboard.","state.copy.stateCurrent":"Copy the current Kitten Scientists settings to the clipboard.","state.delete.game":"Delete this save.","state.delete.state":"Delete these settings.","state.deleted.game":"Save '{0}' deleted.","state.deleted.state":"State '{0}' deleted.","state.edit.game":"Change the name of this save.","state.edit.state":"Change the name of these settings.","state.exportAll":"Backup","state.exportAllTitle":"Stores all local states in a single file and downloads it.","state.import":"Import from clipboard","state.imported.game":"Save imported.","state.imported.state":"State imported.","state.importedState":"Imported state {0}","state.importTitle":`Paste a save or settings from your clipboard.
|
|
10
|
+
Contents will be automatically detected and handled accordingly.`,"state.loaded.game":"Save '{0}' loaded.","state.loaded.state":"State '{0}' loaded.","state.loadPrompt":"Paste your (un/compressed) save or settings here:","state.local":"Local states","state.localGames":"Kittens Game Saves","state.localStates":"Kitten Scientists Settings","state.new":"New","state.noConfirm":"Do NOT confirm destructive actions. (Danger!)","state.store":"Store","state.stored.game":"Save stored.","state.stored.state":"State stored.","state.storeFactory":"Create a new state from factory defaults.","state.storeGame":"Create a new save from the current game.","state.storeGame.prompt":"Provide a label for this save:","state.storeState":"Create a new state from current settings.","state.storeState.prompt":"Provide a label for this state:","state.title":"State Management","state.unlabeledGame":"unlabeled save","state.unlabeledState":"unlabeled state","state.update.game":"Save the current game into this slot.","state.update.state":"Save the current settings into this slot.","state.updated.game":"Save '{0}' updated.","state.updated.state":"State '{0}' updated.","status.auto.disable":"Disabled Auto {0}","status.auto.enable":"Enabled Auto {0}","status.ks.disable":"מבטל את המדעניתלתול!","status.ks.enable":"מאפשר את המדעניתלתול!","status.ks.init":"Kitten Scientists initialized.","status.ks.upgrade":"Kitten Scientists {0} (ours is {1}) is available at {2}.","status.reset.check.disable":"Disabled check {0} before Reset Timeline","status.reset.check.enable":"Enabled check {0} before Reset Timeline","status.resource.disable":"כבה ניהול משאבי {0}","status.resource.enable":"הפעל ניהול משאבי {0}","status.sub.disable":"{0} הושבת","status.sub.enable":"{0} אופשר","summary.accelerate":"הזמן הועץ {0} פעמים","summary.adore":"נצבר {0} תגלית על ידי הערצת הגלקסיה","summary.building":"נבנה {0} {1}","summary.craft":"נוצר {0} {1}","summary.day":"יום","summary.days":"ימים","summary.distribute":"עזרת ל-{0} חתלתולים למצוא עבודה","summary.embassy":"נבנו {0} שגרירויות","summary.feed":"האכלת את הוותיקים {0} אלמתי קרן","summary.festival":"אורגנו {0} חגיגות","summary.fix.cry":"תוקנו {0} תאי קריו","summary.head":"תקציר {0} האחרונים","summary.hunt":"צידיתלתול יצאו לצוד {0} פעמים","summary.praise":"נצבר {0} פולחן על ידי הילול השמש","summary.promote":"המנהיג קודם {0} פעמים","summary.refine":"זוקק {0} {1}","summary.separator":" ועוד ","summary.show":"הצג פעילות","summary.stars":"נצפו {0} כוכבים","summary.sun":"התגלו {0} {1}","summary.tech":"נחקרו {0}","summary.time.activeHeatTransferStart":"Active Heat Transfer {0} times","summary.time.getTemporalFlux":"Burn crystal to gain time flux {0} times","summary.time.reset.content":"נאסף {0} קרמה.<br>נאסף {1} מופת","summary.time.reset.title":"סיכום {0} צירי הזמן האחרונים","summary.time.skip":"{0} שנים נפסחו","summary.trade":"סחרת {0} פעמים עם {1}","summary.transcend":"התעלית {0} פעמים","summary.upgrade":"שודרג {0}","summary.year":"שנה","summary.years":"שנים","time.heatTransfer.cycle.disable":"Disabled active heat transfer in cycle {0}","time.heatTransfer.cycle.enable":"Enabled active heat transfer in cycle {0}","time.skip.cycle.disable":"Disabled time skip in cycle {0} and disallow skip over this cycle","time.skip.cycle.enable":"Enabled time skip in cycle {0} and allow skip over this cycle","time.skip.season.disable":"Disabled time skip in the {0}","time.skip.season.enable":"Enabled time skip in the {0}","trade.limited":"סחר עם {0}: מוגבל רק כאשר זה רווחי ביחס לזמן ייצור","trade.season.disable":"בוטל הסחר עם {0} עבור {1}","trade.season.enable":"אופשר הסחר עם {0} עבור {1}","trade.seasons":"עונות","trade.unlimited":"סחר עם {0}: ללא הגבלה","ui.additional":"Additional options","ui.build":"מדורה","ui.close":"סגור","ui.craft":"סדנא","ui.craft.resources":"משאבים","ui.cycles":"מחזורים","ui.disable.all":"Disable all options in this list.","ui.distribute":"כפר","ui.enable.all":"Enable all options in this list.","ui.engine":"Enable Kitten Scientists","ui.faith":"דת","ui.filter":"סנני רשומות","ui.infinity":"∞","ui.internals":"Internals","ui.internals.interval":"Interval: {0}","ui.internals.interval.prompt":"Enter the new amount of milliseconds as an absolute value between 0 and Infinity.","ui.internals.interval.promptExplainer":"All notations that the game supports are accepted. If you set the limit to 0, Kitten Scientists will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.internals.interval.promptTitle":"Kitten Scientists Execution Interval (Current: {0})","ui.itemsHide":"Collapse section","ui.itemsShow":"Expand section","ui.ksColumn":"Display in fourth column","ui.language":"Language","ui.limit":"מוגבל","ui.limited.off":"Unlimited","ui.limited.on":"Eco Mode","ui.max":"מירבי: {0}","ui.max.build.prompt":"Limit for {0} (Current: {1})","ui.max.build.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.build.title":"Build {0} {1}","ui.max.build.titleInfinite":"Never stop building {0}","ui.max.build.titleZero":"Don't build {0}","ui.max.craft.prompt":"Enter the new limit of how many {0} to craft as an absolute value between 0 and Infinity.","ui.max.craft.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.craft.promptTitle":"Limit for Crafting {0} (Current: {1})","ui.max.craft.title":"Craft {0} {1}","ui.max.craft.titleInfinite":"Never stop crafting {0}","ui.max.craft.titleZero":"Don't craft {0}","ui.max.distribute.prompt":"Enter the new amount of kittens to assign as {0} as an absolute value between 0 and Infinity.","ui.max.distribute.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.distribute.promptTitle":"Assign Max. Kittens as {0} (Current: {1})","ui.max.distribute.title":"Assign {0} kittens as {1}","ui.max.distribute.titleInfinite":"Assign as many kittens as possible as {0}","ui.max.distribute.titleZero":"Don't assign any kittens as {0}","ui.max.embassy.title":"Build {0} embassy for {1}","ui.max.embassy.titleInfinite":"Never stop building embassies for {0}","ui.max.embassy.titleZero":"Don't build embassies for {0}","ui.max.prompt.absolute":"Enter the new limit as an absolute value between 0 and Infinity.","ui.max.prompt.float":"Enter the new limit as an absolute value between 0.0 and Infinity.","ui.max.set":"מירבי עבור {0}","ui.max.timeSkip.prompt":"Enter the new amount of years as an absolute value between 0 and Infinity.","ui.max.timeSkip.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.timeSkip.promptTitle":"Max. Years to skip (Current: {0})","ui.max.timeSkip.title":"Skip {0} years at once","ui.max.timeSkip.titleInfinite":"Skip as many years as possible","ui.max.timeSkip.titleZero":"Don't skip time","ui.maximum":"מירבי","ui.min":"מינימלי: {0}","ui.options":"אפשרויות","ui.reset":"Reset list options to default configuration.","ui.resources":"בקרת משאבים","ui.space":"חלל","ui.time":"זמן","ui.timeCtrl":"שליטה בזמן","ui.trade":"סחר","ui.trigger":"מפעיל: {0}","ui.trigger.accelerateTime.prompt":"Enter the new temporal flux storage level at which to enable Tempus Fugit as a percentage between 0.0 and 100.0.","ui.trigger.accelerateTime.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.accelerateTime.promptTitle":"Trigger to Accelerate Time (Current: {0})","ui.trigger.activeHeatTransfer.prompt":"Enter the new temporal heat storage level at which to enable heat transfer as a percentage between 0.0 and 100.0.","ui.trigger.activeHeatTransfer.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.activeHeatTransfer.promptTitle":"Trigger for Heat Transfer (Current: {0})","ui.trigger.build.blocked":`∞
|
|
11
|
+
🛈 The {0} section has no trigger set. This build will not be triggered!`,"ui.trigger.build.inherited":"inherited from section","ui.trigger.build.prompt":"Trigger for {0} (Current: {1})","ui.trigger.build.promptExplainer":"If you submit an empty value, or a negative value, the section trigger is used instead. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.trigger.crypto.prompt":"Enter the new relic storage level at which to trade blackcoin as an absolute value between 0.0 and Infinity.","ui.trigger.crypto.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.crypto.promptTitle":"Trigger to Trade Blackcoin (Current: {0})","ui.trigger.embassies.prompt":"Enter the new culture storage level at which to build embassies as a percentage between 0.0 and 100.0.","ui.trigger.embassies.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.embassies.promptTitle":"Trigger to Build Embassies (Current: {0})","ui.trigger.hunt.prompt":"Trigger for Hunting (Current: {0})","ui.trigger.hunt.promptExplainer":"If you submit a negative value, hunting will be disabled. If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.inactive":"inactive","ui.trigger.promoteKittens.prompt":"Enter the new gold storage level at which to promote kittens as a percentage between 0.0 and 100.0.","ui.trigger.promoteKittens.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.promoteKittens.promptTitle":"Trigger to Promote Kittens (Current: {0})","ui.trigger.prompt.absolute":"Enter the new trigger value as an absolute value between 0 and Infinity.","ui.trigger.prompt.float":"Enter the new trigger value as an absolute value between 0.0 and Infinity.","ui.trigger.prompt.percentage":"Enter the new trigger value as a percentage between 0.0 and 100.0.","ui.trigger.reset.promptExplainer":"If you submit a negative value, the item will be disabled. If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.section":"Section default trigger: {0}","ui.trigger.section.blocked":`∞
|
|
12
|
+
🛈 The {0} section has no trigger set. This automation will not be triggered!`,"ui.trigger.section.inactive":"∞ (nothing is triggered automatically)","ui.trigger.section.inherited":"inherited from section","ui.trigger.section.prompt":"Trigger for section {0} (Current: {1})","ui.trigger.section.promptExplainer":`If you submit an empty value, or a negative value, the section trigger will be set to infinity (∞). Individual automations in this section need to have their own trigger set to be activated.
|
|
13
|
+
If you submit an invalid value, it will be treated as if you hit Cancel.`,"ui.trigger.setinteger":"Enter a new trigger value for {0}. Should be in the range from 0 up to any number. -1 means infinity.","ui.trigger.setinteger.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.setpercentage":"Enter a new trigger value for {0}. Should be in the range from 0 to 100.","ui.trigger.setpercentage.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.timeSkip.prompt":"Enter the new amount of Time Crystals at which to skip time as an absolute value between 1 and Infinity.","ui.trigger.timeSkip.promptExplainer":"If you submit a negative value, time skipping will be disabled. If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.timeSkip.promptTitle":"Trigger for Time Skip (Current: {0})","ui.upgrade":"מדע","ui.upgrade.buildings":"שדרג בניינים","ui.upgrade.missions":"התחל משימות","ui.upgrade.policies":"פוליסת מחקר","ui.upgrade.races":"גלה גזעים חדשים","ui.upgrade.techs":"חקור טכנולוגיות","ui.upgrade.upgrades":"חקור שדרוגים","ui.upgrades":"Upgrades",update:"Update","upgrade.building.amphitheatre":"אמפיטאטראות שודרגו למגדלי שידור!","upgrade.building.aqueduct":"אקוודוקטים שודרגו למפעלי מים!","upgrade.building.library":"ספריות שודרגו למרכזיות מידע!","upgrade.building.pasture":"אדמות חקלאיות שודרגו לשדות קולטני שמש!","upgrade.building.warehouse":"Upgraded warehouses to spaceports!","upgrade.policy":"חתלתולים העבירו {0}","upgrade.race":"חתלתולים פגשו את {0}","upgrade.space":"חתלתולים ביצעו {0}","upgrade.space.mission":"חתלתולים ביצעו משימה אל {0}","upgrade.tech":"חתלתולים קנו את הטכנולוגיה {0}","upgrade.upgrade":"חתלתולים קנו את השדרוג {0}"},dn={"act.accelerate":"固有时制御,二倍速!","act.adore":"赞美群星! 转化 {0} 虔诚为 {1} 顿悟","act.blackcoin.buy":"小猫出售遗物并买入 {0} 黑币","act.blackcoin.sell":"小猫出售黑币并买入了 {0} 遗物","act.build":"小猫建造了一个 {0}","act.builds":"小猫建造了 {1} 个新的 {0}","act.craft":"小猫制作了 {0} {1}","act.distribute":"分配一只猫猫成为 {0}","act.elect":"小猫选出了一位新领导人","act.feed":"小猫向上古神献上祭品。上古神很高兴","act.fix.cry":"小猫修复了 {0} 个冷冻仓","act.hunt":"派出 {0} 波小猫去打猎","act.observe":"小猫珂学家观测到一颗流星","act.praise":"赞美太阳! 转化 {0} 信仰为 {1} 虔诚","act.promote":"领袖被提拔到 {0} 级","act.refineTCs":"精炼 {0} 时间水晶","act.refineTears":"将 {0} 泪水提炼成黑色眼泪","act.sacrificeAlicorns":"献祭了 {0} 只天角兽","act.sacrificeUnicorns":"已献祭的独角兽数:{0}","act.sun.discover":"小猫在 {0} 方面获得顿悟","act.sun.discovers":"小猫在 {0} 方面获得 {1} 次顿悟","act.time.activeHeatTransferEnd":"主动散热完成","act.time.activeHeatTransferStart":"开始主动散热","act.time.getTemporalFlux":"烧水晶获取时间通量以维持时间加速","act.time.skip":"燃烧时间水晶, 跳过接下来的 {0} 年!","act.trade":"小猫与 {1} 交易 {0} 次","act.transcend":"消耗 {0} 顿悟,达到超越 {1}","blackcoin.buy":"买入单价:{0}","blackcoin.buy.prompt":"输入您想要停止购买黑币的价格。","blackcoin.buy.promptExplainer":"黑币价格总是从 800 上涨到 1100 (大致),然后暴跌。你通常应该一直买入直到卖出前不久。","blackcoin.buy.promptTitle":"黑币购买限额 (当前:{0})","blackcoin.buy.title":"购买黑币直至价格达到 {0}","blackcoin.buy.trigger":"购买黑币(遗迹)","blackcoin.sell":"卖出单价:{0}","blackcoin.sell.prompt":"输入您想要出售所有黑币的价格。","blackcoin.sell.promptExplainer":"黑币价格总是从 800 上涨到 1100 (大致),然后暴跌。你通常希望以接近最高价的价格出售。","blackcoin.sell.promptTitle":"黑币卖单 (当前:{0})","blackcoin.sell.title":"当价格达到 {0} 时出售黑币","build.embassies":"在 {1} 设立了 {0} 个大使馆","build.embassy":"在 {1} 设立了 {0} 个大使馆",copy:"复制","craft.limited":"制作 {0} 受库存消耗比率的限制","craft.unlimited":"制作 {0} 不受限制",delete:"删除","dispose.necrocorn":"小猫处理掉了影响效率的多余死灵兽","festival.extend":"小猫延长了节日","festival.hold":"小猫开始举办节日","filter.accelerate":"时间加速","filter.adore":"赞美群星","filter.allKG":"所有游戏日志","filter.build":"建筑","filter.craft":"工艺","filter.disable":"过滤 {0} 日志消息","filter.distribute":"猫口分配","filter.enable":"启用 {0} 日志消息","filter.explainer":"已禁用的项目不会显示在日志中。","filter.faith":"太阳秩序","filter.festival":"节日","filter.hunt":"狩猎","filter.misc":"杂项","filter.praise":"赞美太阳","filter.promote":"提拔领袖","filter.research":"研究","filter.star":"天文事件","filter.timeSkip":"时间跳转","filter.trade":"贸易","filter.transcend":"超越","filter.upgrade":"升级","option.accelerate":"时间加速","option.autofeed":"献祭上古神","option.catnip":"采集猫薄荷","option.crypto":"黑币交易","option.elect":"选择领导人","option.elect.job":"工作","option.elect.job.any":"任何","option.elect.trait":"特质","option.embassies":"建造大使馆","option.faith.adore":"赞美群星","option.faith.autoPraise":"赞美太阳","option.faith.best.unicorn":"优先最佳独角兽建筑","option.faith.refineTears":"提炼眼泪","option.faith.refineTimeCrystals":"精炼时间水晶","option.faith.sacrificeAlicorns":"献祭天角兽","option.faith.sacrificeUnicorns":"献祭独角兽","option.faith.transcend":"自动超越","option.festival":"举办节日","option.fix.cry":"修复冷冻仓","option.hunt":"狩猎","option.magnetos":"开启磁电机","option.observe":"观测天文事件","option.praise":"赞美太阳","option.promote":"提拔领袖","option.promotekittens":"提拔小猫","option.reactors":"开启反应堆","option.shipOverride":"强制243船","option.steamworks":"启动蒸汽工房","option.time.activeHeatTransfer":"主动散热","option.time.reset":"重启时间线 (危险!)","option.time.skip":"时间跳转","option.time.skip.ignoreOverheat":"忽略过热",reset:"重置","reset.after":"初次见面,可爱的猫猫科学家为您服务","reset.cancel.activity":"喵斯顿,我们有麻烦了","reset.cancel.message":"重启时间线计划取消","reset.check":"{0} 的触发值: {1}, 现在共有 {2}","reset.checked":"所有条件都已满足,时间线将在几秒后重启!","reset.countdown.0":" 0 - 时空裂缝已打开!","reset.countdown.1":" 1 - 时间引擎已启动!","reset.countdown.2":" 2 - 正在启动时间锻造","reset.countdown.3":" 3 - 正在打开时空裂隙","reset.countdown.4":" 4 - 正在关闭卫星","reset.countdown.5":" 5 - 正在融化黑币","reset.countdown.6":" 6 - 正在启动时间引擎","reset.countdown.7":" 7 - 正在拆解电磁炮","reset.countdown.8":" 8 - 正在放生蜥蜴","reset.countdown.9":" 9 - 正在献祭独角兽","reset.countdown.10":" 10 - 正在收获猫薄荷","reset.last.message":"我们下个庞加莱回归再见","reset.tip":"您可以通过在设置顶部禁用“启用小猫珂学家”选项来取消此重置。","resources.consume":"消耗率: {0}","resources.consume.prompt":"输入您希望自动化消耗的资源量,以 0.0 到 100.0 之间的百分比表示。","resources.consume.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","resources.consume.promptTitle":"{0} 的消耗份额 (当前:{1})","resources.consume.set":"设置 {0} 的消耗率","resources.consume.title":"消耗 {0} 的 {1}","resources.consume.titleZero":"不消耗 {0}","resources.stock.prompt":"输入您希望始终保留的资源库存量。","resources.stock.promptExplainer":"游戏支持的所有符号均可接受。如果您提交空值或负值,限制将设置为无穷大。如果您将限制设置为 0,此选项将自动禁用。如果您提交无效值,将被视为您点击了“取消”。","resources.stock.promptTitle":"{0} 的库存值 (当前:{1})","resources.stock.title":"保持 {0} {1} 库存","resources.stock.titleInfinite":"保持所有 {0} 库存","resources.stock.titleZero":"不保留任何 {0} 库存","state.compress":"压缩数据","state.confirmDestruction":"你确定吗?","state.copied.game":"保存“{0}”复制到剪贴板。","state.copied.gameCurrent":"当前保存已复制到剪贴板。","state.copied.state":"状态“{0}”已复制到剪贴板。","state.copied.stateCurrent":"当前状态已复制到剪贴板。","state.copy.game":"将此保存复制到剪贴板。","state.copy.gameCurrent":"将整个小猫游戏保存 (包括 KS 设置) 复制到剪贴板。","state.copy.state":"将这些设置复制到剪贴板。","state.copy.stateCurrent":"将当前的 Kitten Scientists 设置复制到剪贴板。","state.delete.game":"删除此保存。","state.delete.state":"删除这些设置。","state.deleted.game":"保存“{0}”已删除。","state.deleted.state":"状态“{0}”已删除。","state.edit.game":"更改此保存的名称。","state.edit.state":"更改这些设置的名称。","state.exportAll":"备份","state.exportAllTitle":"将所有本地状态存储在单个文件中并下载。","state.import":"从剪贴板导入","state.imported.game":"保存导入。","state.imported.state":"状态导入。","state.importedState":"Imported state {0}","state.importTitle":`从剪贴板粘贴保存或设置。
|
|
14
|
+
内容将被自动检测并进行相应处理。`,"state.loaded.game":"已加载保存“{0}”。","state.loaded.state":"已加载状态“{0}”。","state.loadPrompt":"在此处粘贴您的 (未压缩的) 保存或设置:","state.local":"本地状态","state.localGames":"小猫游戏保存","state.localStates":"小猫科学家设置","state.new":"新的","state.noConfirm":"不要求确认","state.store":"储存","state.stored.game":"保存储存。","state.stored.state":"状态储存。","state.storeFactory":"根据出厂默认设置创建新状态。","state.storeGame":"从当前游戏中创建一个新的保存。","state.storeGame.prompt":"为此次保存提供标签:","state.storeState":"根据当前设置创建一个新状态。","state.storeState.prompt":"为该状态提供标签:","state.title":"状态管理器","state.unlabeledGame":"未标记的保存","state.unlabeledState":"未标记状态","state.update.game":"将当前游戏保存到此位置。","state.update.state":"将当前设置保存到此槽中。","state.updated.game":"保存'{0}'已更新。","state.updated.state":"状态“{0}”已更新。","status.auto.disable":"禁用自动化 {0}","status.auto.enable":"启用自动化 {0}","status.ks.disable":"太敬业了,该歇了","status.ks.enable":"神说,要有猫猫珂学家!","status.ks.init":"小猫珂学家已初始化。","status.ks.upgrade":"小猫珂学家 (当前版本:{1}) {0} 可在这里获取:{2} 。","status.reset.check.disable":"在重启时间线前不检查 {0}","status.reset.check.enable":"在重启时间线前检查 {0}","status.resource.disable":"禁用 {0} 资源管理","status.resource.enable":"启用 {0} 资源管理","status.sub.disable":"禁用 {0}","status.sub.enable":"启用 {0}","summary.accelerate":"加速时间 {0} 次","summary.adore":"通过赞美群星积累了 {0} 顿悟","summary.building":"建造了 {0} 个 {1}","summary.craft":"制作了 {0} 个 {1}","summary.day":"天","summary.days":"天","summary.distribute":"帮助 {0} 只猫猫找到工作","summary.embassy":"设立了 {0} 个大使馆","summary.feed":"向上古神献祭 {0} 只死灵兽","summary.festival":"举办了 {0} 次节日","summary.fix.cry":"修复了 {0} 个冷冻仓","summary.head":"过去 {0} 的总结","summary.hunt":"派出了 {0} 批可爱的小猫猎人","summary.praise":"通过赞美太阳积累了 {0} 虔诚","summary.promote":"提拔领袖 {0} 次","summary.refine":"已精炼 {0} {1}","summary.separator":" ","summary.show":"总结","summary.stars":"观测了 {0} 颗流星","summary.sun":"在 {1} 方面顿悟 {0} 次","summary.tech":"掌握了 {0}","summary.time.activeHeatTransferStart":"主动散热 {0} 次","summary.time.getTemporalFlux":"烧水晶获取时间通量 {0} 次","summary.time.reset.content":"获得 {0} 业.<br>获得 {1} 领导力","summary.time.reset.title":"过去 {0} 个时间线的总结","summary.time.skip":"跳过 {0} 年","summary.trade":"与 {1} 贸易了 {0} 次","summary.transcend":"超越了 {0} 次","summary.upgrade":"发明了 {0}","summary.year":"年","summary.years":"年","time.heatTransfer.cycle.disable":"停止在 {0} 主动散热","time.heatTransfer.cycle.enable":"启用在 {0} 主动散热","time.skip.cycle.disable":"停止在 {0} 跳转时间并禁止跳过该周期","time.skip.cycle.enable":"启用在 {0} 跳转时间并允许跳过该周期","time.skip.season.disable":"停止在 {0} 跳转时间","time.skip.season.enable":"启用在 {0} 跳转时间","trade.limited":"与 {0} 的交易限制为比产量更优时才会触发","trade.season.disable":"停止在 {1} 与 {0} 的交易","trade.season.enable":"启用在 {1} 与 {0} 的交易","trade.seasons":"季节","trade.unlimited":"取消与 {0} 交易的限制","ui.additional":"附加选项","ui.build":"营火","ui.close":"关闭","ui.craft":"工艺","ui.craft.resources":"资源","ui.cycles":"周期","ui.disable.all":"全部禁用","ui.distribute":"猫力资源","ui.enable.all":"全部启用","ui.engine":"启用小猫珂学家","ui.faith":"宗教","ui.filter":"日志过滤","ui.infinity":"∞","ui.internals":"小喵设置","ui.internals.interval":"运行间隔(ms): {0}","ui.internals.interval.prompt":"输入新的毫秒数作为 0 到无穷大之间的绝对值。","ui.internals.interval.promptExplainer":"游戏支持的所有符号均可接受。如果您将限制设置为 0,Kitten Scientists 将自动禁用。如果您提交了无效值,则将被视为您点击了“取消”。","ui.internals.interval.promptTitle":"小猫科学家执行间隔 (当前:{0})","ui.itemsHide":"隐藏选项","ui.itemsShow":"显示选项","ui.ksColumn":"显示在第四栏","ui.language":"语言","ui.limit":"限制","ui.limited.off":"无限","ui.limited.on":"环保模式","ui.max":"最大值:{0}","ui.max.build.prompt":"{0} 的限制 (当前:{1})","ui.max.build.promptExplainer":"游戏支持的所有符号均可接受。如果您提交空值或负值,限制将设置为无穷大。如果您将限制设置为 0,此选项将自动禁用。如果您提交无效值,将被视为您点击了“取消”。","ui.max.build.title":"构建 {0} {1}","ui.max.build.titleInfinite":"永不停止建设{0}","ui.max.build.titleZero":"不要构建{0}","ui.max.craft.prompt":"输入要制作的 {0} 数量的新限制,以 0 到无穷大之间的绝对值表示。","ui.max.craft.promptExplainer":"游戏支持的所有符号均可接受。如果您提交空值或负值,限制将设置为无穷大。如果您将限制设置为 0,此选项将自动禁用。如果您提交无效值,将被视为您点击了“取消”。","ui.max.craft.promptTitle":"制作限制 {0} (当前:{1})","ui.max.craft.title":"制造 {0} {1}","ui.max.craft.titleInfinite":"永不停止创造{0}","ui.max.craft.titleZero":"不要制造 {0}","ui.max.distribute.prompt":"输入要分配的新小猫数量 {0},作为 0 到无穷大之间的绝对值。","ui.max.distribute.promptExplainer":"游戏支持的所有符号均可接受。如果您提交空值或负值,限制将设置为无穷大。如果您将限制设置为 0,此选项将自动禁用。如果您提交无效值,将被视为您点击了“取消”。","ui.max.distribute.promptTitle":"将最大小猫数量指定为 {0} (当前:{1})","ui.max.distribute.title":"将 {0} 只小猫指定为 {1}","ui.max.distribute.titleInfinite":"分配尽可能多的小猫作为{0}","ui.max.distribute.titleZero":"不将任何小猫指定为{0}","ui.max.embassy.title":"为{1}建造{0}大使馆","ui.max.embassy.titleInfinite":"永不停止为{0}修建大使馆","ui.max.embassy.titleZero":"不要为{0}建造大使馆","ui.max.prompt.absolute":"输入新的限制作为 0 到无穷大之间的绝对值。","ui.max.prompt.float":"输入新的限制作为 0.0 和无穷大之间的绝对值。","ui.max.set":"设置 {0} 的最大值","ui.max.timeSkip.prompt":"输入新的年数作为 0 至无穷大之间的绝对值。","ui.max.timeSkip.promptExplainer":"游戏支持的所有符号均可接受。如果您提交空值或负值,限制将设置为无穷大。如果您将限制设置为 0,此选项将自动禁用。如果您提交无效值,将被视为您点击了“取消”。","ui.max.timeSkip.promptTitle":"最多跳过年份 (当前:{0})","ui.max.timeSkip.title":"一次跳过 {0} 年","ui.max.timeSkip.titleInfinite":"跳过尽可能多的年份","ui.max.timeSkip.titleZero":"不要跳过时间","ui.maximum":"上限","ui.min":"最小值 {0}","ui.options":"选项","ui.reset":"恢复至默认","ui.resources":"资源控制","ui.space":"太空","ui.time":"时间","ui.timeCtrl":"时间操纵","ui.trade":"贸易","ui.trigger":"触发值:{0}","ui.trigger.accelerateTime.prompt":"输入启用 Tempus Fugit 的新时间通量存储级别,以 0.0 至 100.0 之间的百分比表示。","ui.trigger.accelerateTime.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.accelerateTime.promptTitle":"加速时间的触发值 (当前:{0})","ui.trigger.activeHeatTransfer.prompt":"输入新的启用热传递的时间热存储量,以 0.0 到 100.0 之间的百分比表示。","ui.trigger.activeHeatTransfer.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.activeHeatTransfer.promptTitle":"热传递触发值 (当前:{0})","ui.trigger.build.blocked":`∞
|
|
15
|
+
🛈 {0} 部分未设置触发值。此构建不会被触发!`,"ui.trigger.build.inherited":"继承自部分","ui.trigger.build.prompt":"{0} 的触发值 (当前:{1})","ui.trigger.build.promptExplainer":"如果您提交了空值或负值,则将使用部分触发值。如果您提交了无效值,则将被视为您点击了“取消”。","ui.trigger.crypto.prompt":"输入交易黑币的新文物存储级别,以 0.0 到 Infinity 之间的绝对值表示。","ui.trigger.crypto.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.crypto.promptTitle":"触发黑币交易 (当前:{0})","ui.trigger.embassies.prompt":"以 0.0 至 100.0 之间的百分比输入建造大使馆的新文化存储级别。","ui.trigger.embassies.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.embassies.promptTitle":"建立大使馆的触发值 (当前:{0})","ui.trigger.hunt.prompt":"狩猎触发值 (当前:{0})","ui.trigger.hunt.promptExplainer":"如果您提交了负值,则搜索将被禁用。如果您提交了空值或无效值,则将被视为您点击了“取消”。","ui.trigger.inactive":"不活跃","ui.trigger.promoteKittens.prompt":"输入新的可用于升级小猫的黄金库存量,以 0.0 到 100.0 之间的百分比表示。","ui.trigger.promoteKittens.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.promoteKittens.promptTitle":"小猫促销触发值 (当前:{0})","ui.trigger.prompt.absolute":"输入新的触发值作为 0 到无穷大之间的绝对值。","ui.trigger.prompt.float":"输入新的触发值作为 0.0 到无穷大之间的绝对值。","ui.trigger.prompt.percentage":"以 0.0 至 100.0 之间的百分比形式输入新的触发值。","ui.trigger.reset.promptExplainer":"如果您提交了负值,则该项目将被禁用。如果您提交了空值或无效值,则将被视为您点击了“取消”。","ui.trigger.section":"部分默认触发值:{0}","ui.trigger.section.blocked":`∞
|
|
16
|
+
🛈 The {0} section has no trigger set. This automation will not be triggered!`,"ui.trigger.section.inactive":"∞ (nothing is triggered automatically)","ui.trigger.section.inherited":"继承自部分","ui.trigger.section.prompt":"{0} 部分的触发值 (当前:{1})","ui.trigger.section.promptExplainer":`If you submit an empty value, or a negative value, the section trigger will be set to infinity (∞). Individual automations in this section need to have their own trigger set to be activated.
|
|
17
|
+
If you submit an invalid value, it will be treated as if you hit Cancel.`,"ui.trigger.setinteger":"输入 {0} 的新触发值。范围应在 0 到任意数字之间。-1表示无穷大。","ui.trigger.setinteger.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.setpercentage":"输入新的 {0} 触发值,取值范围为 0 到 100 的小数。","ui.trigger.setpercentage.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.timeSkip.prompt":"输入跳过时间所需的时间水晶的新数量,以 1 到无穷大之间的绝对值表示。","ui.trigger.timeSkip.promptExplainer":"如果您提交了负值,时间跳过将被禁用。如果您提交了空值或无效值,它将被视为您点击了“取消”。","ui.trigger.timeSkip.promptTitle":"时间跳跃触发值 (当前:{0})","ui.upgrade":"升级","ui.upgrade.buildings":"升级建筑","ui.upgrade.missions":"探索星球","ui.upgrade.policies":"政策","ui.upgrade.races":"探险队出发!","ui.upgrade.techs":"科技","ui.upgrade.upgrades":"升级","ui.upgrades":"升级",update:"更新","upgrade.building.amphitheatre":"剧场 升级为 广播塔!","upgrade.building.aqueduct":"水渠 升级为 水电站!","upgrade.building.library":"图书馆 升级为 数据中心!","upgrade.building.pasture":"牧场 升级为 太阳能发电站!","upgrade.building.warehouse":"已将仓库升级为太空港!","upgrade.policy":"小猫通过了 {0} 法案","upgrade.race":"小猫遇到了 {0}","upgrade.space":"小猫执行了 {0}","upgrade.space.mission":"小猫执行了 {0} 的任务","upgrade.tech":"小猫掌握了 {0}","upgrade.upgrade":"小猫发明了 {0}"};class Ct extends _t{constructor(e,t,i=!1){super(i);L(this,Fe);L(this,He);O(this,Fe,e),O(this,He,t)}get building(){return I(this,Fe)}get variant(){return I(this,He)}}Fe=new WeakMap,He=new WeakMap;class Yt extends V{constructor(e=!1,t=-1,i=new _,n=new ae(!1,-1),a=new ae(!1,-1),r=new ae(!1,-1),o=new ae(!1,-1),l=new V(!1,1),h=new V(!1,1),d=new _){super(e,t);u(this,"buildings");u(this,"bestUnicornBuilding");u(this,"bestUnicornBuildingCurrent");u(this,"sacrificeAlicorns");u(this,"sacrificeUnicorns");u(this,"refineTears");u(this,"refineTimeCrystals");u(this,"autoPraise");u(this,"adore");u(this,"transcend");this.buildings=this.initBuildings(),this.bestUnicornBuilding=i,this.sacrificeAlicorns=n,this.sacrificeUnicorns=a,this.refineTears=r,this.refineTimeCrystals=o,this.autoPraise=l,this.adore=h,this.transcend=d,this.bestUnicornBuildingCurrent=null}initBuildings(){const e={};for(const t of Zi)e[t]=new Ct(t,W.OrderOfTheSun);for(const t of Ki)e[t]=new Ct(t,W.Cryptotheology);for(const t of Vi)e[t]=new Ct(t,W.Ziggurat);return e.unicornPasture=new Ct("unicornPasture",W.UnicornPasture),e}load(e){m(e)||(super.load(e),F(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.max=(i==null?void 0:i.max)??t.max,t.trigger=(i==null?void 0:i.trigger)??t.trigger}),this.bestUnicornBuilding.load(e.bestUnicornBuilding),this.sacrificeAlicorns.load(e.sacrificeAlicorns),this.sacrificeUnicorns.load(e.sacrificeUnicorns),this.refineTears.load(e.refineTears),this.refineTimeCrystals.load(e.refineTimeCrystals),this.autoPraise.load(e.autoPraise),this.adore.load(e.adore),this.transcend.load(e.transcend),this.bestUnicornBuildingCurrent=e.bestUnicornBuildingCurrent??this.bestUnicornBuildingCurrent)}}class gn{constructor(s,e,t,i=new Yt){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_bulkManager");u(this,"_bonfireManager");u(this,"_workshopManager");this._host=s,this.settings=i,this.manager=new ge(this._host,"Religion"),this._workshopManager=t,this._bulkManager=new wt(this._host,this._workshopManager),this._bonfireManager=e}async tick(s){this.settings.enabled&&(this.manager.render(),this._autoBuild(s),this.settings.sacrificeUnicorns.enabled&&await this._autoSacrificeUnicorns(),this.settings.sacrificeAlicorns.enabled&&await this._autoSacrificeAlicorns(s),this.settings.refineTears.enabled&&this._autoTears(s),this.settings.refineTimeCrystals.enabled&&await this._autoTCs(s),this._autoTAP())}_autoBuild(s){if(this.settings.bestUnicornBuilding.enabled)this._buildBestUnicornBuilding(),this._buildNonUnicornBuildings(s);else{const e=Object.fromEntries(Object.entries(this.settings.buildings).filter(([,n])=>n.variant!==W.UnicornPasture)),t=Y(this.settings.buildings.unicornPasture.max),i=this._host.game.bld.getBuildingExt("unicornPasture").meta;this.settings.buildings.unicornPasture.enabled&&i.val<t&&this._bonfireManager.autoBuild(s,{unicornPasture:new Jt("unicornPasture",this.settings.buildings.unicornPasture.enabled,this.settings.buildings.unicornPasture.trigger,this.settings.buildings.unicornPasture.max)}),this._buildReligionBuildings(s,e)}}_buildBestUnicornBuilding(){var t,i;const s=this.getBestUnicornBuilding();if(this.settings.bestUnicornBuildingCurrent!==s&&(this.settings.bestUnicornBuildingCurrent=s,this._host.refreshEntireUserInterface()),this.settings.bestUnicornBuildingCurrent===null)return;const e=this.settings.trigger;if(this.settings.bestUnicornBuildingCurrent==="unicornPasture")this._bonfireManager.build(this.settings.bestUnicornBuildingCurrent,0,1);else{const n=this._getBuildButton(this.settings.bestUnicornBuildingCurrent,W.Ziggurat);if(m(n==null?void 0:n.model))return;let a=0;const r=p(n.model.prices).find(d=>d.name==="tears");m(r)||(a=r.val);const o=this._workshopManager.getValue("tears")-this._workshopManager.getStock("tears");if(!m(this._host.game.religionTab.sacrificeBtn)&&o<a){const d=Math.floor((this._workshopManager.getValue("unicorns")-this._workshopManager.getStock("unicorns"))/2500),g=Math.ceil((a-o)/this._host.game.bld.getBuildingExt("ziggurat").meta.on);if(g<d&&!m(this._host.game.religionTab.sacrificeBtn.model))(i=(t=this._host.game.religionTab.sacrificeBtn)==null?void 0:t.controller)==null||i._transform(this._host.game.religionTab.sacrificeBtn.model,g);else return}const l={[this.settings.bestUnicornBuildingCurrent]:this.settings.buildings[this.settings.bestUnicornBuildingCurrent]},h=this._bulkManager.bulk(l,this.getBuildMetaData(l),e,"Religion");0<h.length&&0<h[0].count&&this.build(this.settings.bestUnicornBuildingCurrent,W.Ziggurat,1)}}_buildNonUnicornBuildings(s){const e=[...kt],t=Object.fromEntries(Object.entries(this.settings.buildings).filter(([,i])=>!e.includes(i.building)));this._buildReligionBuildings(s,t)}_buildReligionBuildings(s,e){this.manager.render();const t=this.getBuildMetaData(e),i=this.settings.trigger,n=this._bulkManager.bulk(e,t,i,"Religion");for(const a of n)0<a.count&&(this.build(a.id,p(a.variant),a.count),s.requestGameUiRefresh=!0)}getBestUnicornBuilding(){var le,be;const s=this._bonfireManager.getBuildButton("unicornPasture");if(s===null)return null;const e=[...kt].filter(ee=>ee!=="unicornPasture"),t=this._host.game.getEffect("unicornsPerTickBase")*this._host.game.getTicksPerSecondUI(),i=this._host.game.getEffect("unicornsGlobalRatio")+1,n=this._host.game.getEffect("unicornsRatioReligion")+1,a=this._host.game.prestige.getParagonProductionRatio()+1,r=this._host.game.religion.getSolarRevolutionRatio()+1,o=this._host.game.calendar.cycle,l=this._host.game.calendar.cycles[o];let h=1;l.festivalEffects.unicorns!==void 0&&this._host.game.prestige.getPerk("numeromancy").researched&&this._host.game.calendar.festivalDays&&(h=l.festivalEffects.unicorns);const d=t*i*n*a*r*h,g=Math.max(this._host.game.bld.getBuildingExt("ziggurat").meta.on,1),f=500*(1+this._host.game.getEffect("unicornsRatioReligion")*.1);let w=1;this._host.game.prestige.getPerk("unicornmancy").researched&&(w*=1.1);const b=this._host.game.getEffect("riftChance")*w/(1e4*2)*f;let k=Number.POSITIVE_INFINITY,y=null;const j=p((le=this._host.game.bld.getBuildingExt("unicornPasture").meta.effects)==null?void 0:le.unicornsPerTickBase)*this._host.game.getTicksPerSecondUI()*i*n*a*r*h,Q=p((be=s.model)==null?void 0:be.prices)[0].val/j;Q<k&&(k=Q,y="unicornPasture");for(const ee of this.manager.tab.zgUpgradeButtons)if(e.includes(ee.id)&&ee.model.visible){let pe=0;for(const Se of p(ee.model.prices))Se.name==="unicorns"&&(pe+=Se.val),Se.name==="tears"&&(pe+=Se.val*2500/g);const mt=p(this._host.game.religion.getZU(ee.id));let Me=n,Is=this._host.game.getEffect("riftChance");for(const Se in mt.effects)Se==="unicornsRatioReligion"&&(Me+=p(mt.effects.unicornsRatioReligion)),Se==="riftChance"&&(Is+=p(mt.effects.riftChance));const Jo=500*((Me-1)*.1+1);let Bi=Is*w/(1e4*2)*Jo;Bi-=b;let Ai=t*i*Me*a*r*h;Ai-=d,Ai+=Bi;const $s=pe/Ai;$s<k&&(0<Bi||n<Me&&0<pe)&&(k=$s,y=ee.id)}return y}build(s,e,t){let i=t;const n=i;let a;if(e===W.Cryptotheology){const r=game.getUnlockByName(s,"transcendenceUpgrades"),o=new classes.ui.TranscendenceBtnController(this._host.game),l=o.fetchModel({controller:o,id:r.name});i=this._bulkManager.construct(l,o,i),a=r.label}else if(e===W.OrderOfTheSun){const r=game.getUnlockByName(s,"religion"),o=new com.nuclearunicorn.game.ui.ReligionBtnController(this._host.game),l=o.fetchModel({controller:o,id:r.name});i=this._bulkManager.construct(l,o,i),a=r.label}else if(e===W.Ziggurat){const r=game.getUnlockByName(s,"zigguratUpgrades"),o=new com.nuclearunicorn.game.ui.ZigguratBtnController(this._host.game),l=o.fetchModel({controller:o,id:r.name});i=this._bulkManager.construct(l,o,i),a=r.label}else throw new bt("unsupported");i!==n&&(console.warn(...v(`${a} Amount ordered: ${n} Amount Constructed: ${i}`)),i===0)||(e===W.OrderOfTheSun?(this._host.engine.storeForSummary(a,i,"faith"),i===1?this._host.engine.iactivity("act.sun.discover",[a],"ks-faith"):this._host.engine.iactivity("act.sun.discovers",[a,this._host.renderAbsolute(i)],"ks-faith")):(this._host.engine.storeForSummary(a,i,"build"),i===1?this._host.engine.iactivity("act.build",[a],"ks-build"):this._host.engine.iactivity("act.builds",[a,this._host.renderAbsolute(i)],"ks-build")))}getBuildMetaData(s){const e={};for(const t of Object.values(s)){const i=this.getBuild(t.building,t.variant);if(i===null)continue;e[t.building]=i;const n=p(e[t.building]);if(!this._getBuildButton(t.building,t.variant))n.rHidden=!0;else{const a=p(this._getBuildButton(t.building,t.variant)).model,r=t.variant===W.Cryptotheology?this._host.game.science.get("cryptotheology").researched:!0;n.rHidden=!(a!=null&&a.visible&&a.enabled&&r)}}return e}getBuild(s,e){switch(e){case W.Ziggurat:return this._host.game.religion.getZU(s)??null;case W.OrderOfTheSun:return this._host.game.religion.getRU(s)??null;case W.Cryptotheology:return this._host.game.religion.getTU(s)??null}throw new Error(`Unknown build: ${s} (${e})`)}_getBuildButton(s,e){let t;switch(e){case W.Ziggurat:t=this.manager.tab.zgUpgradeButtons;break;case W.OrderOfTheSun:t=this.manager.tab.rUpgradeButtons;break;case W.Cryptotheology:t=this.manager.tab.children[0].children[0].children;break;default:throw new Error(`Invalid variant '${e}'`)}if(t.length===0)return null;const i=t.find(n=>n.id===s)??null;return i===null&&console.debug(...v(`Couldn't find button for ${s}! This will likely create problems.`)),i}_transformBtnSacrificeHelper(s,e,t,i){const a=1/(s/e),o=new classes.ui.religion.TransformBtnController(game,t.controllerOpts)._newLink(i,a);return new Promise(l=>{o.handler(new Event("decoy"),l)})}async _autoSacrificeUnicorns(){const s=this._workshopManager.getResource("unicorns"),e=this._workshopManager.getValueAvailable("unicorns");if(!m(this._host.game.religionTab.sacrificeBtn)&&Y(this.settings.sacrificeUnicorns.trigger)<=e&&Y(this.settings.sacrificeUnicorns.trigger)<=s.value){const t=this._host.game.religionTab.sacrificeBtn.controller,i=this._host.game.religionTab.sacrificeBtn.model;if(m(i))return;await this._transformBtnSacrificeHelper(e,s.value,t,i);const n=this._workshopManager.getValueAvailable("unicorns"),a=e-n;this._host.engine.iactivity("act.sacrificeUnicorns",[this._host.game.getDisplayValueExt(a)],"ks-faith"),this._host.engine.storeForSummary(this._host.engine.i18n("$resources.unicorns.title"),a,"refine")}}async _autoSacrificeAlicorns(s){const e=this._workshopManager.getResource("alicorn"),t=this._workshopManager.getValueAvailable("alicorn");if(!m(this._host.game.religionTab.sacrificeAlicornsBtn)&&Y(this.settings.sacrificeAlicorns.trigger)<=t&&Y(this.settings.sacrificeAlicorns.trigger)<=e.value){this._host.game.religionTab.sacrificeAlicornsBtn.render();const i=this._host.game.religionTab.sacrificeAlicornsBtn.controller,n=this._host.game.religionTab.sacrificeAlicornsBtn.model;if(m(n)){s.requestGameUiRefresh=!0;return}await this._transformBtnSacrificeHelper(t,e.value,i,n);const a=this._workshopManager.getValueAvailable("alicorn"),r=t-a;this._host.engine.iactivity("act.sacrificeAlicorns",[this._host.game.getDisplayValueExt(r)],"ks-faith"),this._host.engine.storeForSummary(this._host.engine.i18n("$resources.alicorn.title"),r,"refine")}}_autoTears(s){const e=this._workshopManager.getResource("tears"),t=this._workshopManager.getValueAvailable("tears"),i=this._workshopManager.getResource("sorrow");if(!m(this._host.game.religionTab.refineBtn)&&Y(this.settings.refineTears.trigger)<=t&&Y(this.settings.refineTears.trigger)<=e.value&&i.value<i.maxValue){const n=t-this.settings.refineTears.trigger;if(n<1e4)return;const a=this._host.game.religionTab.refineBtn.controller,r=this._host.game.religionTab.refineBtn.model;if(m(r)){s.requestGameUiRefresh=!0;return}a.buyItem(r,new Event("decoy"),n);const o=this._workshopManager.getValueAvailable("tears"),l=t-o;this._host.engine.iactivity("act.refineTears",[this._host.game.getDisplayValueExt(l)],"ks-faith"),this._host.engine.storeForSummary(this._host.engine.i18n("$resources.tears.title"),l,"refine")}}async _autoTCs(s){const e=this._workshopManager.getResource("timeCrystal"),t=this._workshopManager.getValueAvailable("timeCrystal");if(!m(this._host.game.religionTab.refineTCBtn)&&Y(this.settings.refineTimeCrystals.trigger)<=t&&Y(this.settings.refineTimeCrystals.trigger)<=e.value){const i=this._host.game.religionTab.refineTCBtn.controller,n=this._host.game.religionTab.refineTCBtn.model;if(m(n)){s.requestGameUiRefresh=!0;return}await this._transformBtnSacrificeHelper(t,e.value,i,n);const a=this._workshopManager.getValueAvailable("timeCrystal"),r=t-a;this._host.engine.iactivity("act.refineTCs",[this._host.game.getDisplayValueExt(r)],"ks-faith"),this._host.engine.storeForSummary(this._host.engine.i18n("$resources.timeCrystal.title"),r,"refine")}}_autoTAP(){const s=this._workshopManager.getResource("faith"),e=s.value/s.maxValue;this.settings.transcend.enabled&&this.settings.autoPraise.trigger-.02<=e&&this._autoTranscend(),this.settings.autoPraise.trigger<=e&&(this.settings.adore.enabled&&p(this._host.game.religion.getRU("apocripha")).on&&this._autoAdore(this.settings.adore.trigger),this.settings.autoPraise.enabled&&this._autoPraise())}_autoAdore(s){const e=this._workshopManager.getResource("faith"),t=this._host.game.religion.faith,i=this._host.game.religion.faithRatio,a=p(this._host.game.religion.getRU("transcendence")).on?this._host.game.religion.transcendenceTier:0,r=10+this._host.game.getEffect("solarRevolutionLimit"),o=r*s,l=t/1e6*a*a*1.01,h=i+l,d=.01+e.value*(1+this._host.game.getUnlimitedDR(h,.1)*.1),g=this._host.game.getLimitedDR(this._host.game.getUnlimitedDR(d,1e3)/100,r);o<=g&&(this._host.game.religion._resetFaithInternal(1.01),this._host.engine.iactivity("act.adore",[this._host.game.getDisplayValueExt(t),this._host.game.getDisplayValueExt(l)],"ks-adore"),this._host.engine.storeForSummary("adore",l))}_autoTranscend(){var i,n;let s=this._host.game.religion.faithRatio;const e=p(this._host.game.religion.getRU("transcendence")).on;let t=e?this._host.game.religion.transcendenceTier:0;if(e){const a=((t+2)/(t+1))**2,r=this._host.game.religion._getTranscendTotalPrice(t+1)-this._host.game.religion._getTranscendTotalPrice(t),o=r,l=a;if((1-l+Math.sqrt(80*(l*l-1)*o+(l-1)*(l-1)))*l/(40*(l+1)*(l+1)*(l-1))+o+o/(l*l-1)<=s){this._host.game.religion.faithRatio-=r,this._host.game.religion.tcratio+=r,this._host.game.religion.transcendenceTier+=1;const d=p(this._host.game.challenges.getChallenge("atheism"));(i=d.calculateEffects)==null||i.call(d,d,this._host.game);const g=p(this._host.game.religion.getTU("blackObelisk"));(n=g.calculateEffects)==null||n.call(g,g,this._host.game),this._host.game.msg(this._host.engine.i18n("$religion.transcend.msg.success",[this._host.game.religion.transcendenceTier])),s=this._host.game.religion.faithRatio,t=this._host.game.religion.transcendenceTier,this._host.engine.iactivity("act.transcend",[this._host.game.getDisplayValueExt(r),t],"ks-transcend"),this._host.engine.storeForSummary("transcend",1)}}}_autoPraise(){const s=this._workshopManager.getResource("faith"),e=this._host.game.religion.getApocryphaBonus(),t=s.value*(1+e);this._host.engine.storeForSummary("praise",t),this._host.engine.iactivity("act.praise",[this._host.game.getDisplayValueExt(s.value),this._host.game.getDisplayValueExt(t)],"ks-praise"),this._host.game.religion.praise()}}class mn extends _{constructor(e,t=!1){super(t);L(this,We);O(this,We,e)}get policy(){return I(this,We)}}We=new WeakMap;class ss extends _{constructor(e=!1){super(e);u(this,"policies");this.policies=this.initPolicies()}initPolicies(){const e={};for(const t of js)e[t]=new mn(t);return e}static validateGame(e,t){const i=Object.keys(t.policies),n=e.science.policies.map(o=>o.name),a=ne(n,i),r=ne(i,n);for(const o of a)console.warn(...v(`The policy '${o}' is not tracked in Kitten Scientists!`));for(const o of r)console.warn(...v(`The policy '${o}' is not a policy in Kittens Game!`))}load(e){m(e)||(super.load(e),F(this.policies,e.policies,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}))}}class fn extends V{constructor(e,t=!1){super(t,-1);L(this,Ge);O(this,Ge,e)}get tech(){return I(this,Ge)}}Ge=new WeakMap;class ns extends V{constructor(e=!1){super(e,-1);u(this,"techs");this.techs=this.initTechs()}initTechs(){const e={};for(const t of Js)e[t]=new fn(t);return e}static validateGame(e,t){const i=Object.keys(t.techs),n=e.science.techs.map(o=>o.name),a=ne(n,i),r=ne(i,n);for(const o of a)Ji.includes(o)||console.warn(...v(`The technology '${o}' is not tracked in Kitten Scientists!`));for(const o of r){if(Ji.includes(o)){console.info(...v(`The technology '${o}' is a technology in Kittens Game, but it's no longer used.`));continue}console.warn(...v(`The technology '${o}' is not a technology in Kittens Game!`))}}load(e){m(e)||(super.load(e),F(this.techs,e.techs,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class Qt extends _{constructor(e=!1,t=new ss,i=new ns,n=new _){super(e);u(this,"policies");u(this,"techs");u(this,"observe");this.policies=t,this.techs=i,this.observe=n}static validateGame(e,t){ss.validateGame(e,t.policies),ns.validateGame(e,t.techs)}load(e){var t;m(e)||(super.load(e),this.policies.load(e.policies),this.techs.load(e.techs),this.observe.enabled=((t=e.observe)==null?void 0:t.enabled)??this.observe.enabled)}}class xe{constructor(s){u(this,"_host");this._host=s}upgrade(s,e){let t=!1;if(e==="policy"){const n=game.getUnlockByName(s.name,"policies"),a=new classes.ui.PolicyBtnController(this._host.game),r=a.fetchModel({controller:a,id:n.name});t=xe.skipConfirm(()=>a.buyItem(r)).itemBought}else if(e==="science"){const n=game.getUnlockByName(s.name,"tech"),a=new com.nuclearunicorn.game.ui.TechButtonController(this._host.game),r=a.fetchModel({controller:a,id:n.name});t=xe.skipConfirm(()=>a.buyItem(r)).itemBought}else{const n=game.getUnlockByName(s.name,"upgrades"),a=new com.nuclearunicorn.game.ui.UpgradeButtonController(this._host.game),r=a.fetchModel({controller:a,id:n.name});t=xe.skipConfirm(()=>a.buyItem(r)).itemBought}if(!t)return!1;const i=s.label;return e==="workshop"?(this._host.engine.storeForSummary(i,1,"upgrade"),this._host.engine.iactivity("upgrade.upgrade",[i],"ks-upgrade")):e==="policy"?this._host.engine.iactivity("upgrade.policy",[i]):e==="science"&&(this._host.engine.storeForSummary(i,1,"research"),this._host.engine.iactivity("upgrade.tech",[i],"ks-research")),!0}static async skipConfirmAsync(s){const e=game.ui.confirm;try{return game.ui.confirm=()=>!0,await s()}finally{game.ui.confirm=e}}static skipConfirm(s){const e=game.ui.confirm;try{return game.ui.confirm=()=>!0,s()}finally{game.ui.confirm=e}}}const bn=c=>new Promise(s=>setTimeout(s,c)),Te="en-US",pn=2*60*1e3,vn="localStorage"in globalThis&&!m(localStorage["ks.timeout"])?Number(localStorage["ks.timeout"]):void 0;class T{constructor(){u(this,"_gameStartSignal");u(this,"_gameStartSignalResolver");u(this,"_possibleEngineState")}static tryEngineStateFromSaveData(s,e){const t=e;if(!(s in t)){console.debug(...v(`Failed: \`${s}\` not found in save data.`));return}const i=t.ks;if(!("state"in i)){console.debug(...v(`Failed: \`${s}.state\` not found in save data.`));return}const n=i.state;if(!Array.isArray(n)){console.debug(...v(`Failed: \`${s}.state\` not \`Array\`.`));return}return n[0]}async waitForGame(s,e,t=vn??pn){if(T._isGameLoaded()){const n=p(T.window.game),a=p(T.window.$I),r=localStorage["com.nuclearunicorn.kittengame.language"];return new s(n,a,r,this._possibleEngineState)}const i=[bn(2e3)];if(m(this._gameStartSignal)&&typeof T.window.dojo<"u"){this._gameStartSignal=new Promise(a=>{this._gameStartSignalResolver=a});const n=T.window.dojo.subscribe("game/start",()=>{console.debug(...v(`'game/start' signal caught. Fast-tracking script load for '${e}'...`)),p(this._gameStartSignalResolver)(!0),T.window.dojo.unsubscribe(n)});if(e!==void 0){const a=T.window.dojo.subscribe("server/load",r=>{console.info(...v(`'server/load' signal caught. Looking for script state with key '${e}' in save data...`));const o=T.tryEngineStateFromSaveData(e,r);if(!o){console.info(...v(`The Kittens Game save data did not contain a script state for '${e}'.`));return}console.info(...v(`Found key '${e}'! Provided save data will be used as seed for next script instance.`)),this._possibleEngineState=o,T.window.dojo.unsubscribe(a)})}}if(m(this._gameStartSignal)||i.push(this._gameStartSignal),t<0)throw new Error("Unable to find game. Giving up. Maybe the game is not exported at `window.game`?");return console.debug(...v(`Waiting for game... (timeout: ${Math.round(t/1e3)}s)`)),await Promise.race(i),this.waitForGame(s,e,t-2e3)}static _isGameLoaded(){var s;return!m(T.window.game)&&(((s=T.window.document.getElementById("game"))==null?void 0:s.checkVisibility())??!1)&&!m(T.window.$I)}static get window(){try{return p(unsafeWindow)}catch{return window}}}class yn extends xe{constructor(e,t,i=new Qt){super(e);u(this,"manager");u(this,"settings");u(this,"_workshopManager");this.settings=i,this.manager=new ge(this._host,"Science"),this._workshopManager=t}async tick(e){this.settings.enabled&&(this.manager.render(),this.settings.techs.enabled&&this._host.game.tabs[2].visible&&await this.autoUnlock(),this.settings.policies.enabled&&this._host.game.tabs[2].visible&&await this.autoPolicy(),this.settings.observe.enabled&&this.observeStars())}async autoUnlock(){const e=this._host.game.science.techs,t=new Array;e:for(const i of Object.values(this.settings.techs.techs)){if(!i.enabled)continue;const n=e.find(r=>r.name===i.tech);if(m(n)){console.error(...v(`Tech '${i.tech}' not found in game!`));continue}if(n.researched||!n.unlocked)continue;let a=T.window.dojo.clone(n.prices);a=this._host.game.village.getEffectLeader("scientist",a);for(const r of a){const o=this._workshopManager.getValueAvailable(r.name),l=this._workshopManager.getResource(r.name),h=re.evaluateSubSectionTrigger(this.settings.techs.trigger,i.trigger);if(h<0||o<l.maxValue*h||o<r.val)continue e}t.push(n)}for(const i of t)await this.upgrade(i,"science")}async autoPolicy(){const e=this._host.game.science.policies,t=new Array;for(const i of Object.values(this.settings.policies.policies)){if(!i.enabled)continue;const n=e.find(a=>a.name===i.policy);if(m(n)){console.error(...v(`Policy '${i.policy}' not found in game!`));continue}!n.researched&&!n.blocked&&n.unlocked&&(n.requiredLeaderJob===void 0||this._host.game.village.leader!==null&&this._host.game.village.leader.job===n.requiredLeaderJob)&&t.push(n)}for(const i of t)await this.upgrade(i,"policy")}observeStars(){this._host.game.calendar.observeBtn!==null&&(this._host.game.calendar.observeHandler(),this._host.engine.iactivity("act.observe",[],"ks-star"),this._host.engine.storeForSummary("stars",1))}}class wn extends _{constructor(e,t=!1){super(t);L(this,Ze);O(this,Ze,e)}get mission(){return I(this,Ze)}}Ze=new WeakMap;class as extends _{constructor(e=!1){super(e);u(this,"missions");this.missions=this.initMissions()}initMissions(){const e={};for(const t of Xs)e[t]=new wn(t);return e}static validateGame(e,t){const i=Object.keys(t.missions),n=e.space.programs.map(o=>o.name),a=ne(n,i),r=ne(i,n);for(const o of a)console.warn(...v(`The space mission '${o}' is not tracked in Kitten Scientists!`));for(const o of r)console.warn(...v(`The space mission '${o}' is not a space mission in Kittens Game!`))}load(e){m(e)||(super.load(e),F(this.missions,e.missions,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}))}}class kn extends _t{constructor(e){super(!1,-1,0);L(this,Ke);O(this,Ke,e)}get building(){return I(this,Ke)}}Ke=new WeakMap;class St extends V{constructor(e=!1,t=-1,i=new as){super(e,t);u(this,"buildings");u(this,"unlockMissions");this.buildings=this.initBuildings(),this.unlockMissions=i}initBuildings(){const e={};for(const t of Xi)e[t]=new kn(t);return e}static validateGame(e,t){as.validateGame(e,t.unlockMissions)}load(e){m(e)||(super.load(e),F(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.max=(i==null?void 0:i.max)??t.max,t.trigger=(i==null?void 0:i.trigger)??t.trigger}),this.unlockMissions.load(e.unlockMissions))}}class _n{constructor(s,e,t=new St){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_bulkManager");u(this,"_workshopManager");this._host=s,this.settings=t,this.manager=new ge(this._host,"Space"),this._workshopManager=e,this._bulkManager=new wt(this._host,this._workshopManager)}tick(s){this.settings.enabled&&(this.manager.render(),this.autoBuild(s),this.settings.unlockMissions.enabled&&this.autoUnlock(s))}autoBuild(s,e=this.settings.buildings){const t=this._bulkManager,i=this.settings.trigger,n={};for(const r of Object.values(e))n[r.building]=this.getBuild(r.building);const a=t.bulk(e,n,i,"Space");for(const r of a)r.count<=0||this.build(r.id,r.count)!==0&&(s.requestGameUiRefresh=!0)}autoUnlock(s){var t,i;if(!this._host.game.tabs[6].visible)return;const e=this._host.game.space.meta[0].meta;e:for(let n=0;n<e.length;n++){if(0<e[n].val||!e[n].unlocked||!this.settings.unlockMissions.missions[e[n].name].enabled)continue;const a=(t=this.manager.tab.GCPanel)==null?void 0:t.children[n];if(m(a))return;const r=p((i=a.model)==null?void 0:i.prices);for(const o of r)if(this._workshopManager.getValueAvailable(o.name)<o.val)continue e;a.domNode.click(),s.requestGameUiRefresh=!0,n===7||n===12?this._host.engine.iactivity("upgrade.space.mission",[e[n].label],"ks-upgrade"):this._host.engine.iactivity("upgrade.space",[e[n].label],"ks-upgrade")}}build(s,e){let t=e;const i=t;let n;const a=game.getUnlockByName(s,"spaceBuilding"),r=new classes.ui.space.PlanetBuildingBtnController(this._host.game),o=r.fetchModel({controller:r,id:a.name});return t=this._bulkManager.construct(o,r,t),n=a.label,t!==i&&(console.warn(...v(`${n} Amount ordered: ${i} Amount Constructed: ${t}`)),t===0)?0:(this._host.engine.storeForSummary(n,t,"build"),t===1?this._host.engine.iactivity("act.build",[n],"ks-build"):this._host.engine.iactivity("act.builds",[n,this._host.renderAbsolute(t)],"ks-build"),t)}getBuild(s){return this._host.game.space.getBuilding(s)}_getBuildButton(s){const e=this.manager.tab.planetPanels;if(m(e))return null;let t=null;for(const i of e)if(t=i.children.find(n=>n.id===s)??null,!m(t))return t;if(t===null)throw new Error(`Couldn't find button for ${s}!`)}}var rs=(c=>(c.build="ks-activity type_ks-build",c.craft="ks-activity type_ks-craft",c.upgrade="ks-activity type_ks-upgrade",c.research="ks-activity type_ks-research",c.trade="ks-activity type_ks-trade",c.hunt="ks-activity type_ks-hunt",c.praise="ks-activity type_ks-praise",c.adore="ks-activity type_ks-adore",c.transcend="ks-activity type_ks-transcend",c.faith="ks-activity type_ks-faith",c.accelerate="ks-activity type_ks-accelerate",c.timeSkip="ks-activity type_ks-timeSkip",c.festival="ks-activity type_ks-festival",c.star="ks-activity type_ks-star",c.distribute="ks-activity type_ks-distribute",c.promote="ks-activity type_ks-promote",c.misc="ks-activity",c))(rs||{});const os=["accelerate","adore","build","craft","distribute","faith","festival","hunt","misc","praise","promote","research","star","timeSkip","trade","transcend","upgrade"];class Cn extends _{constructor(e){super(!0);L(this,Ve);O(this,Ve,e)}get variant(){return I(this,Ve)}}Ve=new WeakMap;class Sn extends _{constructor(e=!1,t=new _(!0)){super(e);u(this,"filters");u(this,"disableKGLog");this.filters=this.initFilters(),this.disableKGLog=t}initFilters(){const e={};for(const t of os)e[t]=new Cn(rs[t]);return e}load(e){var t;m(e)||(super.load(e),F(this.filters,e.filters,(i,n)=>{i.enabled=(n==null?void 0:n.enabled)??i.enabled}),this.disableKGLog.enabled=((t=e.disableKGLog)==null?void 0:t.enabled)??this.disableKGLog.enabled)}}class xn extends V{constructor(e,t=!1){super(t,-1);L(this,je);O(this,je,e)}get upgrade(){return I(this,je)}}je=new WeakMap;class ls extends V{constructor(e=!1){super(e,-1);u(this,"upgrades");this.upgrades=this.initUpgrades()}initUpgrades(){const e={};for(const t of es)e[t]=new xn(t);return e}static validateGame(e,t){const i=Object.keys(t.upgrades),n=e.workshop.upgrades.map(o=>o.name),a=ne(n,i),r=ne(i,n);for(const o of a)console.warn(...v(`The workshop upgrade '${o}' is not tracked in Kitten Scientists!`));for(const o of r)console.warn(...v(`The workshop upgrade '${o}' is not an upgrade in Kittens Game!`))}load(e){m(e)||(super.load(e),F(this.upgrades,e.upgrades,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class Tn extends en{constructor(e,t=!1,i=!0){super(t,i);L(this,Je);O(this,Je,e)}get resource(){return I(this,Je)}}Je=new WeakMap;class xt extends V{constructor(e=!1,t=-1,i=new ls,n=new _){super(e,t);u(this,"resources");u(this,"shipOverride");u(this,"unlockUpgrades");this.resources=this.initResources(),this.shipOverride=n,this.unlockUpgrades=i}initResources(){const e={};for(const t of Hi)e[t]=new Tn(t);return e}static validateGame(e,t){const i=Object.keys(t.resources),n=e.workshop.crafts.map(o=>o.name),a=ne(n,i),r=ne(i,n);for(const o of a)console.warn(...v(`The workshop craft '${o}' is not tracked in Kitten Scientists!`));for(const o of r)console.warn(...v(`The workshop craft '${o}' is not an upgrade in Kittens Game!`));ls.validateGame(e,t.unlockUpgrades)}load(e){var t;m(e)||(super.load(e),F(this.resources,e.resources,(i,n)=>{i.enabled=(n==null?void 0:n.enabled)??i.enabled,i.limited=(n==null?void 0:n.limited)??i.limited,i.max=(n==null?void 0:n.max)??i.max,i.trigger=(n==null?void 0:n.trigger)??i.trigger}),this.unlockUpgrades.load(e.unlockUpgrades),this.shipOverride.enabled=((t=e.shipOverride)==null?void 0:t.enabled)??this.shipOverride.enabled)}}class ei extends xe{constructor(e,t=new xt){super(e);u(this,"settings");u(this,"manager");this.settings=t,this.manager=new ge(this._host,"Workshop")}tick(e){return this.settings.enabled?(this.autoCraft(),this.refreshStock(),this.settings.unlockUpgrades.enabled?(this.manager.render(),this.autoUnlock()):Promise.resolve()):Promise.resolve()}async autoUnlock(){if(!this._host.game.workshopTab.visible)return;const e=this._host.game.workshop.upgrades,t=new Array;e:for(const i of Object.values(this.settings.unlockUpgrades.upgrades)){if(!i.enabled)continue;const n=e.find(r=>r.name===i.upgrade);if(m(n)){console.error(...v(`Upgrade '${i.upgrade}' not found in game!`));continue}if(n.researched||!n.unlocked)continue;let a=T.window.dojo.clone(n.prices);a=this._host.game.village.getEffectLeader("scientist",a);for(const r of a){const o=this.getValueAvailable(r.name),l=this.getResource(r.name),h=re.evaluateSubSectionTrigger(this.settings.unlockUpgrades.trigger,i.trigger);if(h<0||0<h&&o<l.maxValue*h||o<r.val)continue e}t.push(n)}for(const i of t)await this.upgrade(i,"workshop")}autoCraft(e=this.settings.resources){const t=new Map,i=this.settings.trigger;for(const a of Object.values(e)){const r=re.evaluateSubSectionTrigger(i,a.trigger);if(r<0||!a.enabled)continue;const o=a.max?this.getResource(a.resource):!1,l=Y(a.max);if(o&&l<o.value||!this.singleCraftPossible(a.resource))continue;const h=Object.keys(this.getMaterials(a.resource));h.map(f=>this.getResource(f)).filter(f=>0<f.maxValue).filter(f=>f.value/f.maxValue<r).length===0&&t.set(a,{countRequested:1,materials:h.map(f=>({consume:0,resource:f}))})}if(t.size<1)return;const n=new Map;for(const[a,r]of t)for(const o of r.materials)n.has(o.resource)||n.set(o.resource,new Array),p(n.get(o.resource)).push(a.resource);for(const[,a]of t)for(const r of a.materials){const o=this.getValueAvailable(r.resource);r.consume=o/p(n.get(r.resource)).length}for(const[a,r]of t){const o=this.getMaterials(a.resource);let l=Number.MAX_VALUE;for(const f of r.materials){const w=p(o[f.resource]),b=this.getResource(f.resource);if(!a.limited||a.resource==="ship"&&this.settings.shipOverride.enabled&&this.getResource("ship").value<243){l=Math.min(l,f.consume/w);continue}const k=this._host.game.getResCraftRatio(a.resource),y=this.getValueAvailable(f.resource)/p(n.get(f.resource)).length,P=this.getValueAvailable(a.resource),j=w,Q=1+k,le=y/j,be=P/Q,ee=Math.max(0,Math.floor(Math.log(be)/Math.LN10+1e-9));l=Math.min(l,Math.min(le-(0<b.maxValue&&b.maxValue<=b.value?0:be),10**(ee+1)),f.consume/w)}const h=this.getValueAvailable(a.resource),d=1+this._host.game.getResCraftRatio(a.resource),g=Number.MAX_VALUE/d-h/d;l=Math.min(l,g),r.countRequested=Math.max(0,a.max===-1?l:Math.min(l,(a.max-h)/d))}for(const[a,r]of t)r.countRequested<1||this.craft(a.resource,r.countRequested)}craft(e,t){let i=Math.floor(t);if(i<1||!this._canCraft(e,i))return;const n=this.getCraft(e),a=this._host.game.getResCraftRatio(n.name);this._host.game.craft(n.name,i);const r=p(this._host.game.resPool.get(e)).title;i=Number.parseFloat((i*(1+a)).toFixed(2)),this._host.engine.storeForSummary(r,i,"craft"),this._host.engine.iactivity("act.craft",[this._host.game.getDisplayValueExt(i),r],"ks-craft")}_canCraft(e,t){if(!this._host.game.workshopTab.visible&&e!=="wood")return!1;const i=this.getCraft(e),n=p(this.settings.resources[e]).enabled;let a=!1;if(i.unlocked&&n){a=!0;const r=this._host.game.workshop.getCraftPrice(i);for(const o of r)this.getValueAvailable(o.name)<o.val*t&&(a=!1)}return a}getCraft(e){const t=this._host.game.workshop.getCraft(e);if(!t)throw new Error(`Unable to find craft '${e}'`);return t}singleCraftPossible(e){if(!this._host.game.workshopTab.visible&&e!=="wood")return!1;const t=this.getMaterials(e);for(const[i,n]of z(t))if(this.getValueAvailable(i)<n)return!1;return!0}getMaterials(e){const t={},i=this.getCraft(e),n=this._host.game.workshop.getCraftPrice(i);for(const a of n)t[a.name]=a.val;return t}getTickVal(e,t,i=void 0){let n=this._host.game.getResourcePerTick(e.name,!0);if(e.craftable){let a=Number.MAX_VALUE;const r=this.getMaterials(e.name);for(const[o,l]of z(r)){const h=(1+this._host.game.getResCraftRatio(e.name))/l,d=this.getTickVal(this.getResource(o));d!=="ignore"&&(a=Math.min(d*h,a))}n+=a!==Number.MAX_VALUE?a:0}return n<=0&&(e.name==="spice"||e.name==="blueprint")?"ignore":(!i&&!m(t)&&(n+=t.getResValue(e.name)),n)}getAverageHunt(){const e={},t=this._host.game.getEffect("hunterRatio")+this._host.game.village.getEffectLeader("manager",0);return e.furs=40+32.5*t,e.ivory=50*Math.min(.225+.01*t,.5)+40*t*Math.min(.225+.01*t,.5),e.unicorns=.05,this.getValue("zebras")>=10&&(e.bloodstone=this.getValue("bloodstone")===0?.05:5e-4),this._host.game.ironWill&&this._host.game.workshop.get("goldOre").researched&&(e.gold=.625+.625*t),e}getResource(e){const t=this._host.game.resPool.get(e);if(m(t))throw new Error(`Unable to find resource ${e}`);return t}getValue(e){return this.getResource(e).value??0}getStock(e){const t=this._host.engine.settings.resources.resources[e];return t.enabled?t.stock:0}getConsume(e){const t=this._host.engine.settings.resources.resources[e];return t.enabled?t.consume:1}getValueAvailable(e){let t=this.getStock(e);if(e==="catnip"){const a=this._host.game.bld.getBuildingExt("pasture").meta,r=this._host.game.bld.getBuildingExt("aqueduct").meta,o=a.stage===0?a.val:0,l=r.stage===0?r.val:0,h=this.getPotentialCatnip(!0,o,l);h<0&&(t-=h*202*5)}let i=this.getValue(e);i=Math.max(i-t,0);const n=this.getConsume(e);return i*n}getPotentialCatnip(e,t,i){let n=this._host.game.getEffect("catnipPerTickBase");e?(n*=.1,n*=1+this._host.game.getLimitedDR(this._host.game.getEffect("coldHarshness"),1)):n*=this._host.game.calendar.getWeatherMod({name:"catnip"})+this._host.game.calendar.getCurSeason().modifiers.catnip,this._host.game.science.getPolicy("communism").researched&&(n=0);const a=this._host.game.village.getResProduction(),r=a.catnip?a.catnip*(1+this._host.game.getEffect("catnipJobRatio")):0;let o=n+r,l=this._host.game.space.getBuilding("hydroponics").val;this._host.game.prestige.meta[0].meta[21].researched&&(this._host.game.calendar.cycle===2&&(l*=2),this._host.game.calendar.cycle===7&&(l*=.5)),o*=1+.03*i+.025*l;const d=this._host.game.challenges.currentChallenge==="winterIsComing"?0:this._host.game.prestige.getParagonProductionRatio();o*=1+d,o*=1+this._host.game.religion.getSolarRevolutionRatio(),this._host.game.opts.disableCMBR||(o*=1+this._host.game.getCMBRBonus()),o=p(this._host.game.calendar.cycleEffectsFestival({catnip:o}).catnip);let g=this._host.game.village.getResConsumption().catnip;const f=this._host.game.bld.getBuildingExt("unicornPasture").meta.val;if(g*=1+this._host.game.getLimitedDR(t*-.005+f*-.0015,1),this._host.game.village.sim.kittens.length>0&&this._host.game.village.happiness>1){const w=this._host.game.village.happiness-1,b=this._host.game.getEffect("catnipDemandWorkerRatioGlobal");this._host.game.challenges.currentChallenge==="anarchy"?g*=1+w*(1+b):g*=1+w*(1+b)*(1-this._host.game.village.getFreeKittens()/this._host.game.village.sim.kittens.length)}return o+=g,o+=this._host.game.getResourcePerTickConvertion("catnip"),o}refreshStock(){for(const[e,t]of z(this._host.engine.settings.resources.resources)){const i=[...$(`#game .res-row.resource_${e} .res-cell.resAmount`),...$(`#game .res-row.resource_${e} .res-cell.resource-value`)];if(!t.enabled||t.stock===0){for(const a of i)a.classList.remove("ks-stock-above","ks-stock-below");continue}const n=this._host.game.resPool.get(e).value<t.stock;for(const a of i)a.classList.add(n?"ks-stock-below":"ks-stock-above"),a.classList.remove(n?"ks-stock-above":"ks-stock-below")}}}u(ei,"DEFAULT_CONSUME_RATE",1);class En extends _{constructor(e,t=!1,i=ei.DEFAULT_CONSUME_RATE,n=0){super(t);L(this,Xe);u(this,"consume");u(this,"stock",0);O(this,Xe,e),this.consume=i,this.stock=n}get resource(){return I(this,Xe)}}Xe=new WeakMap;class Rn extends _{constructor(e=!1){super(e);u(this,"resources");this.resources=this.initResources()}initResources(){const e={};for(const t of Wi)e[t]=new En(t);return e}load(e){m(e)||(super.load(e),F(this.resources,e.resources,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.consume=(i==null?void 0:i.consume)??t.consume,t.stock=(i==null?void 0:i.stock)??t.stock}))}}class Mn extends _{constructor(e=new _,t=new _(!0)){super(!0);u(this,"noConfirm");u(this,"compress");this.noConfirm=e,this.compress=t}load(e){m(e)||(super.load(e),this.noConfirm.load(e.noConfirm),this.compress.load(e.compress))}}class cs extends _{constructor(e=!1,t=new Sn,i=new Rn,n=new Mn,a=Te,r=new _){super(e);u(this,"interval",2e3);u(this,"locale");u(this,"ksColumn");u(this,"filters");u(this,"resources");u(this,"states");this.filters=t,this.resources=i,this.states=n,this.locale=new jt(a,[{label:"Deutsch",value:"de-DE"},{label:"English",value:"en-US"},{label:"עִברִית",value:"he-IL"},{label:"中文",value:"zh-CN"}]),this.ksColumn=r}load(e,t=!1){m(e)||(super.load(e),t||(this.interval=e.interval??this.interval,this.states.load(e.states),this.locale.load(e.locale),this.ksColumn.load(e.ksColumn)),this.filters.load(e.filters),this.resources.load(e.resources))}}class hs extends ae{constructor(e,t=!1,i=-1,n){super(t,i);L(this,Ye);L(this,Qe);L(this,et,0);O(this,Qe,e),n&&(O(this,et,1),O(this,Ye,n))}get baseBuilding(){return I(this,Ye)}get building(){return I(this,Qe)}get stage(){return I(this,et)}}Ye=new WeakMap,Qe=new WeakMap,et=new WeakMap;class Bn extends _{constructor(e=!1){super(e);u(this,"buildings");this.buildings=this.initBuildings()}initBuildings(){const e={broadcasttower:"amphitheatre",dataCenter:"library",hydroplant:"aqueduct",solarfarm:"pasture",spaceport:"warehouse"},t={};for(const i of Fi)i!=="unicornPasture"&&(t[i]=new hs(i));for(const i of Vt)t[i]=new hs(i,!1,-1,e[i]);return t}load(e){m(e)||(super.load(e),F(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class Tt extends ae{constructor(e,t,i=!1,n=-1){super(i,n);L(this,tt);L(this,it);O(this,tt,e),O(this,it,t)}get building(){return I(this,tt)}get variant(){return I(this,it)}}tt=new WeakMap,it=new WeakMap;class An extends _{constructor(e=!1){super(e);u(this,"buildings");this.buildings=this.initBuildings()}initBuildings(){const e={};for(const t of Zi)e[t]=new Tt(t,W.OrderOfTheSun);for(const t of Ki)e[t]=new Tt(t,W.Cryptotheology);for(const t of Vi)e[t]=new Tt(t,W.Ziggurat);return e.unicornPasture=new Tt("unicornPasture",W.UnicornPasture),e}load(e){m(e)||(super.load(e),F(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class Pn extends ae{constructor(e,t=!1,i=-1){super(t,i);L(this,st);O(this,st,e)}get resource(){return I(this,st)}}st=new WeakMap;class In extends _{constructor(e=!1){super(e);u(this,"resources");this.resources=this.initResources()}initResources(){const e={};for(const t of Wi)e[t]=new Pn(t);return e}load(e){m(e)||(super.load(e),F(this.resources,e.resources,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class $n extends ae{constructor(e,t=!1,i=-1){super(t,i);L(this,nt);O(this,nt,e)}get building(){return I(this,nt)}}nt=new WeakMap;class Ln extends _{constructor(e=!1){super(e);u(this,"buildings");this.buildings=this.initBuildings()}initBuildings(){const e={};for(const t of Xi)e[t]=new $n(t);return e}load(e){m(e)||(super.load(e),F(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class us extends ae{constructor(e,t,i=!1,n=-1){super(i,n);L(this,at);L(this,rt);O(this,at,e),O(this,rt,t)}get building(){return I(this,at)}get variant(){return I(this,rt)}}at=new WeakMap,rt=new WeakMap;class On extends _{constructor(e=!1){super(e);u(this,"buildings");this.buildings=this.initBuildings()}initBuildings(){const e={};for(const t of Yi)e[t]=new us(t,ce.Chronoforge);for(const t of Qi)t!=="usedCryochambers"&&(e[t]=new us(t,ce.VoidSpace));return e}load(e){m(e)||(super.load(e),F(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class Un extends _{constructor(e,t=!1){super(t);L(this,ot);O(this,ot,e)}get upgrade(){return I(this,ot)}}ot=new WeakMap;class Dn extends _{constructor(e=!1){super(e);u(this,"upgrades");this.upgrades=this.initUpgrades()}initUpgrades(){const e={};for(const t of es)e[t]=new Un(t);return e}load(e){m(e)||(super.load(e),F(this.upgrades,e.upgrades,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}))}}class Nn extends _{constructor(e=!1,t=new Bn,i=new An,n=new In,a=new Ln,r=new On,o=new Dn){super(e);u(this,"bonfire");u(this,"religion");u(this,"resources");u(this,"space");u(this,"time");u(this,"upgrades");this.bonfire=t,this.religion=i,this.resources=n,this.space=a,this.time=r,this.upgrades=o}load(e){m(e)||(super.load(e),this.bonfire.load(e.bonfire),this.religion.load(e.religion),this.resources.load(e.resources),this.space.load(e.space),this.time.load(e.time),this.upgrades.load(e.upgrades))}}class qn extends V{constructor(e=new _){super(!1,1);u(this,"cycles");u(this,"activeHeatTransferStatus");this.cycles=this.initCycles(),this.activeHeatTransferStatus=e}initCycles(){const e={};for(const t of we)e[t]=new _;return e}load(e){m(e)||(super.load(e),F(this.cycles,e.cycles,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}),this.activeHeatTransferStatus.load(e.activeHeatTransferStatus))}}class zn extends sn{constructor(e=new _,t=new qn){super(!1,5);u(this,"cycles");u(this,"seasons");u(this,"activeHeatTransfer");u(this,"ignoreOverheat");this.cycles=this.initCycles(),this.seasons=this.initSeason(),this.activeHeatTransfer=t,this.ignoreOverheat=e}initCycles(){const e={};for(const t of we)e[t]=new _;return e}initSeason(){const e={};for(const t of Ks)e[t]=new _;return e}load(e){m(e)||(super.load(e),F(this.cycles,e.cycles,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}),F(this.seasons,e.seasons,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}),this.ignoreOverheat.load(e.ignoreOverheat),this.activeHeatTransfer.load(e.activeHeatTransfer))}}class ds extends _{constructor(e=!1,t=new V(!1,1),i=new Nn,n=new zn){super(e);u(this,"accelerateTime");u(this,"timeSkip");u(this,"reset");this.accelerateTime=t,this.reset=i,this.timeSkip=n}load(e){m(e)||(super.load(e),this.accelerateTime.load(e.accelerateTime),this.reset.load(e.reset),this.timeSkip.load(e.timeSkip))}}class gs extends _t{constructor(e,t,i=!1){super(i,-1,0);L(this,lt);L(this,ct);O(this,lt,e),O(this,ct,t)}get building(){return I(this,lt)}get variant(){return I(this,ct)}}lt=new WeakMap,ct=new WeakMap;class ms extends V{constructor(e=!1,t=-1,i=new _){super(e,t);u(this,"buildings");u(this,"fixCryochambers");this.buildings=this.initBuildings(),this.fixCryochambers=i}initBuildings(){const e={};for(const t of Yi)e[t]=new gs(t,ce.Chronoforge);for(const t of Qi)t!=="usedCryochambers"&&(e[t]=new gs(t,ce.VoidSpace));return e}load(e){m(e)||(super.load(e),F(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.max=(i==null?void 0:i.max)??t.max,t.trigger=(i==null?void 0:i.trigger)??t.trigger}),this.fixCryochambers.load(e.fixCryochambers))}}class Fn extends is{constructor(e,t=!1){super(t);L(this,ht);O(this,ht,e)}get race(){return I(this,ht)}}ht=new WeakMap;class Hn extends V{constructor(e=!1){super(e);u(this,"races");this.races=this.initRaces()}initRaces(){const e={};for(const t of ji)t!=="leviathans"&&(e[t]=new Fn(t));return e}load(e){m(e)||(super.load(e),F(this.races,e.races,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.max=(i==null?void 0:i.max)??t.max}))}}class Wn extends tn{constructor(e,t,i,n,a,r,o,l=!1){super(t,i);L(this,ut);u(this,"seasons");L(this,dt);O(this,ut,e),this.seasons={autumn:new _(a),spring:new _(o),summer:new _(n),winter:new _(r)},O(this,dt,l)}get race(){return I(this,ut)}get require(){return I(this,dt)}}ut=new WeakMap,dt=new WeakMap;class fs extends V{constructor(e=!1,t=-1,i=new Hn,n=new _,a=new nn(!1,1090,1095,1e4),r=new _){super(e,t);u(this,"races");u(this,"feedLeviathans");u(this,"buildEmbassies");u(this,"tradeBlackcoin");u(this,"unlockRaces");this.races=this.initRaces(),this.buildEmbassies=i,this.feedLeviathans=n,this.tradeBlackcoin=a,this.unlockRaces=r}initRaces(){const e={dragons:"titanium",griffins:"wood",leviathans:"unobtainium",lizards:"minerals",sharks:"iron"},t={};for(const i of ji){const n=e[i]??!1;t[i]=new Wn(i,!1,!1,!1,!1,!1,!1,n)}return t}load(e){m(e)||(super.load(e),F(this.races,e.races,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.limited=(i==null?void 0:i.limited)??t.limited,t.trigger=(i==null?void 0:i.trigger)??t.trigger,t.seasons.autumn.enabled=(i==null?void 0:i.seasons.autumn.enabled)??t.seasons.autumn.enabled,t.seasons.spring.enabled=(i==null?void 0:i.seasons.spring.enabled)??t.seasons.spring.enabled,t.seasons.summer.enabled=(i==null?void 0:i.seasons.summer.enabled)??t.seasons.summer.enabled,t.seasons.winter.enabled=(i==null?void 0:i.seasons.winter.enabled)??t.seasons.winter.enabled}),this.buildEmbassies.load(e.buildEmbassies),this.feedLeviathans.load(e.feedLeviathans),this.tradeBlackcoin.load(e.tradeBlackcoin),this.unlockRaces.load(e.unlockRaces))}}class Gn extends _{constructor(e=!1,t=new jt("any",Gi.map(n=>({label:"",value:n}))),i=new jt("none",Vs.map(n=>({label:"",value:n})))){super(e);u(this,"job");u(this,"trait");this.job=t,this.trait=i}load(e){m(e)||(super.load(e),this.job.load(e.job),this.trait.load(e.trait))}}class bs extends _{constructor(e=!1,t=new _,i=new V(!1,.98),n=new V(!1,1),a=new _,r=new Gn){super(e);u(this,"jobs");u(this,"holdFestivals");u(this,"hunt");u(this,"promoteKittens");u(this,"promoteLeader");u(this,"electLeader");this.jobs=this.initJobs(),this.holdFestivals=t,this.hunt=i,this.promoteKittens=n,this.promoteLeader=a,this.electLeader=r}initJobs(){const e={};for(const t of Gi)e[t]=new is(!1,0);return e}load(e){var t,i,n;m(e)||(super.load(e),F(this.jobs,e.jobs,(a,r)=>{a.enabled=(r==null?void 0:r.enabled)??a.enabled,a.max=(r==null?void 0:r.max)??a.max}),this.holdFestivals.enabled=((t=e.holdFestivals)==null?void 0:t.enabled)??this.holdFestivals.enabled,this.hunt.load(e.hunt),this.promoteKittens.enabled=((i=e.promoteKittens)==null?void 0:i.enabled)??this.promoteKittens.enabled,this.promoteLeader.enabled=((n=e.promoteLeader)==null?void 0:n.enabled)??this.promoteLeader.enabled,this.electLeader.load(e.electLeader))}}class Zn{constructor(s,e,t,i,n,a=new ds){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_bonfireManager");u(this,"_religionManager");u(this,"_spaceManager");u(this,"_workshopManager");this._host=s,this.settings=a,this.manager=new ge(this._host,"Time"),this._bonfireManager=e,this._religionManager=t,this._spaceManager=i,this._workshopManager=n}async tick(s){this.settings.enabled&&(this.settings.accelerateTime.enabled&&this.accelerateTime(),this.settings.timeSkip.enabled&&this.timeSkip(),this.settings.reset.enabled&&await this.autoReset(this._host.engine))}async autoReset(s){if(this._host.game.challenges.currentChallenge)return;const e=[],t=[],i=r=>{if(t.length!==0)for(const o of r){if(m(o.model))continue;const l=o.model,h=l.metadata.name,d=t.indexOf(h);if(d!==-1&&(t.splice(d,1),this._host.game.resPool.hasRes(p(l.prices))))return!0}return!1};for(const[r,o]of z(this.settings.reset.bonfire.buildings)){if(!o.enabled)continue;if(o.trigger<0)return;let l;try{l=this._host.game.bld.getBuildingExt(r)}catch{l=null}if(!m(l))if(e.push({name:l.meta.label??p(l.meta.stages)[p(l.meta.stage)].label,trigger:o.trigger,val:l.meta.val}),0<o.trigger){if(l.meta.val<o.trigger)return}else t.push(r)}const n=this.settings.reset.religion.buildings.unicornPasture;if(n.enabled){if(n.trigger<0)return;const r=this._host.game.bld.getBuildingExt("unicornPasture");if(e.push({name:p(r.meta.label),trigger:n.trigger,val:r.meta.val}),0<n.trigger){if(r.meta.val<n.trigger)return}else t.push("unicornPasture")}if(i(this._bonfireManager.manager.tab.children)||t.length)return;for(const[r,o]of z(this.settings.reset.space.buildings)){if(!o.enabled)continue;if(o.trigger<0)return;const l=this._host.game.space.getBuilding(r);if(e.push({name:l.label,trigger:o.trigger,val:l.val}),0<o.trigger){if(l.val<o.trigger)return}else t.push(r)}if(t.length===0){const r=p(this._spaceManager.manager.tab.planetPanels);for(const o of r)for(const l of o.children){const h=p(l.model),d=h.metadata.name,g=t.indexOf(d);if(g!==-1&&(t.splice(g,1),this._host.game.resPool.hasRes(p(h.prices))))break}}if(t.length)return;for(const[r,o]of z(this.settings.reset.religion.buildings)){if(!o.enabled)continue;if(o.trigger<0)return;const l=p(this._religionManager.getBuild(r,o.variant));if(e.push({name:l.label,trigger:o.trigger,val:l.val}),0<o.trigger){if(l.val<o.trigger)return}else t.push(r)}if(i(this._religionManager.manager.tab.zgUpgradeButtons)||i(this._religionManager.manager.tab.rUpgradeButtons)||i(this._religionManager.manager.tab.ctPanel.children[0].children)||t.length)return;for(const[r,o]of z(this.settings.reset.time.buildings)){if(!o.enabled)continue;if(o.trigger<0)return;const l=p(this.getBuild(r,o.variant));if(e.push({name:l.label,trigger:o.trigger,val:l.val}),0<o.trigger){if(l.val<o.trigger)return}else t.push(r)}if(i(this.manager.tab.cfPanel.children[0].children)||i(this.manager.tab.vsPanel.children[0].children)||t.length)return;for(const[r,o]of z(this.settings.reset.resources.resources)){if(!o.enabled)continue;if(o.trigger<0)return;const l=p(this._host.game.resPool.get(r));if(e.push({name:this._host.engine.i18n(`$resources.${o.resource}.title`),trigger:o.trigger,val:l.value}),l.value<o.trigger)return}for(const[,r]of z(this.settings.reset.upgrades.upgrades))if(r.enabled){const o=p(this._host.game.workshop.upgrades.find(l=>l.name===r.upgrade));if(e.push({name:o.label,trigger:1,val:o.researched?1:0}),!o.researched)return}s.stop(!1);const a=async(r=1500)=>new Promise((o,l)=>{if(!this._host.engine.settings.enabled){l(new Error("canceled by player"));return}setTimeout(o,r)});try{for(const r of e)await a(500),this._host.engine.imessage("reset.check",[r.name,this._host.game.getDisplayValueExt(r.trigger),this._host.game.getDisplayValueExt(r.val)]);await a(0),this._host.engine.imessage("reset.checked"),await a(),this._host.engine.iactivity("reset.tip"),await a(),this._host.engine.imessage("reset.countdown.10"),await a(2e3),this._host.engine.imessage("reset.countdown.9"),await a(),this._host.engine.imessage("reset.countdown.8"),await a(),this._host.engine.imessage("reset.countdown.7"),await a(),this._host.engine.imessage("reset.countdown.6"),await a(),this._host.engine.imessage("reset.countdown.5"),await a(),this._host.engine.imessage("reset.countdown.4"),await a(),this._host.engine.imessage("reset.countdown.3"),await a(),this._host.engine.imessage("reset.countdown.2"),await a(),this._host.engine.imessage("reset.countdown.1"),await a(),this._host.engine.imessage("reset.countdown.0"),await a(),this._host.engine.iactivity("reset.last.message"),await a()}catch{this._host.engine.imessage("reset.cancel.message"),this._host.engine.iactivity("reset.cancel.activity");return}for(let r=0;r<this._host.game.challenges.challenges.length;r++)this._host.game.challenges.challenges[r].pending=!1;this._host.game.resetAutomatic()}accelerateTime(){if(this._workshopManager.getValueAvailable("temporalFlux")<=0){this._host.game.time.isAccelerated&&(this._host.game.time.isAccelerated=!1);return}if(this._host.game.time.isAccelerated)return;const e=this._host.game.resPool.get("temporalFlux");e.maxValue*this.settings.accelerateTime.trigger<=e.value&&(this._host.game.time.isAccelerated=!0,this._host.engine.iactivity("act.accelerate",[],"ks-accelerate"),this._host.engine.storeForSummary("accelerate",1))}timeSkip(){if(!this._host.game.workshop.get("chronoforge").researched||this._host.game.calendar.day<0)return;const s=this._host.game.getEffect("shatterCostIncreaseChallenge"),e=this._workshopManager.getValueAvailable("timeCrystal");if(e<this.settings.timeSkip.trigger||e<1+s)return;const t=this._host.game.getEffect("shatterVoidCost"),i=this._workshopManager.getValueAvailable("void");if(i<t)return;const n=this._host.game.calendar.season;if(!this.settings.timeSkip.seasons[this._host.game.calendar.seasons[n].name].enabled)return;const a=this._host.game.calendar.cycle;if(!this.settings.timeSkip.cycles[we[a]].enabled)return;const r=this._host.game.getEffect("heatMax"),o=this._host.game.time.heat;if(!this.settings.timeSkip.ignoreOverheat.enabled&&r<=o)return;const l=this._host.game.challenges.getChallenge("1000Years").researched?5:10;let h=Number.POSITIVE_INFINITY;if(!this.settings.timeSkip.ignoreOverheat.enabled&&this.settings.timeSkip.activeHeatTransfer.enabled){const y=this._host.game.getEffect("heatPerTick"),P=this._host.game.ticksPerSecond;if(this.settings.timeSkip.activeHeatTransfer.activeHeatTransferStatus.enabled){o<=r*this.settings.timeSkip.activeHeatTransfer.trigger&&(this.settings.timeSkip.activeHeatTransfer.activeHeatTransferStatus.enabled=!1,this._host.refreshEntireUserInterface(),this._host.engine.iactivity("act.time.activeHeatTransferEnd",[],"ks-timeSkip"));const j=this._host.game.getEffect("temporalFluxProduction"),Q=(this._host.game.calendar.daysPerSeason+10+this._host.game.getEffect("temporalParadoxDay"))*this._host.game.calendar.seasonsPerYear,le=this._host.game.calendar.ticksPerDay,be=(1+this._host.game.timeAccelerationRatio())/le,ee=Q/be,pe=this._host.game.resPool.get("temporalFlux"),mt=pe.maxValue>ee,Me=pe.value<ee;if(!n&&this._host.game.calendar.day<10&&j>l/y&&this.settings.accelerateTime.enabled&&mt&&Me)h=Math.ceil((ee+le*10-pe.value)/j),this._host.engine.iactivity("act.time.getTemporalFlux",[],"ks-timeSkip"),this._host.engine.storeForSummary("time.getTemporalFlux",1);else{if(this.settings.timeSkip.activeHeatTransfer.cycles[we[a]].enabled)return;h=this._host.game.calendar.yearsPerCycle-this._host.game.calendar.cycleYear}}else o>=r-y*P*10&&(this.settings.timeSkip.activeHeatTransfer.activeHeatTransferStatus.enabled=!0,this._host.refreshEntireUserInterface(),this._host.engine.iactivity("act.time.activeHeatTransferStart",[],"ks-timeSkip"),this._host.engine.storeForSummary("time.activeHeatTransferStart",1))}const d=Y(this.settings.timeSkip.max);let g=Math.floor(Math.min(this.settings.timeSkip.ignoreOverheat.enabled?Number.POSITIVE_INFINITY:(r-o)/l,d,h,e/(1+s),0<t?i/t:Number.POSITIVE_INFINITY)),f=0;const w=this._host.game.calendar.yearsPerCycle,b=w-this._host.game.calendar.cycleYear,k=this._host.game.calendar.cyclesPerEra;if(g<b)f=g;else{f+=b,g-=b;let y=1;for(;w<g&&this.settings.timeSkip.cycles[we[(a+y)%k]].enabled;)f+=w,g-=w,y+=1;this.settings.timeSkip.cycles[we[(a+y)%k]].enabled&&0<g&&(f+=g)}if(0<f){const y=this._host.game.timeTab.cfPanel.children[0].children[0];if(m(y.model))return;this._host.engine.iactivity("act.time.skip",[f],"ks-timeSkip"),y.controller.doShatterAmt(y.model,f),this._host.engine.storeForSummary("time.skip",f)}}getBuild(s,e){return e===ce.Chronoforge?this._host.game.time.getCFU(s):this._host.game.time.getVSU(s)}}class Kn{constructor(s,e,t=new ms){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_bulkManager");u(this,"_workshopManager");this._host=s,this.settings=t,this.manager=new ge(this._host,"Time"),this._bulkManager=new wt(this._host,e),this._workshopManager=e}tick(s){this.settings.enabled&&(this.manager.render(),this.autoBuild(s),this.settings.fixCryochambers.enabled&&this.fixCryochambers())}autoBuild(s,e=this.settings.buildings){const t=this._bulkManager,i=this.settings.trigger,n={};for(const r of Object.values(e)){const o=this.getBuild(r.building,r.variant);n[r.building]=p(o);const l=r.variant===ce.Chronoforge?this._getBuildButtonCF(r.building):this._getBuildButtonVS(r.building);if(m(l))continue;const h=l.model,d=r.variant===ce.Chronoforge?this.manager.tab.cfPanel:this.manager.tab.vsPanel,g=p(n[r.building]);g.tHidden=!(h!=null&&h.visible)||!h.enabled||!d.visible}const a=t.bulk(e,n,i,"Time");for(const r of a)r.count>0&&(this.build(r.id,r.variant,r.count),s.requestGameUiRefresh=!0)}build(s,e,t){let i=t,n;const a=i;if(e===ce.Chronoforge){const r=game.getUnlockByName(s,"chronoforge"),o=new classes.ui.time.ChronoforgeBtnController(this._host.game),l=o.fetchModel({controller:o,id:r.name});i=this._bulkManager.construct(l,o,i),n=r.label}else{const r=game.getUnlockByName(s,"voidSpace"),o=new classes.ui.time.VoidSpaceBtnController(this._host.game),l=o.fetchModel({controller:o,id:r.name});i=this._bulkManager.construct(l,o,i),n=r.label}i!==a&&(console.warn(...v(`${n} Amount ordered: ${a} Amount Constructed: ${i}`)),i===0)||(this._host.engine.storeForSummary(n,i,"build"),i===1?this._host.engine.iactivity("act.build",[n],"ks-build"):this._host.engine.iactivity("act.builds",[n,this._host.renderAbsolute(i)],"ks-build"))}getBuild(s,e){return e===ce.Chronoforge?this._host.game.time.getCFU(s):this._host.game.time.getVSU(s)}_getBuildButtonCF(s){return this.manager.tab.children[2].children[0].children.find(e=>e.id===s)??null}_getBuildButtonVS(s){return this.manager.tab.children[3].children[0].children.find(e=>e.id===s)??null}fixCryochambers(){if(this._host.game.time.getVSU("usedCryochambers").val<1)return;const s=p(this._host.game.time.getVSU("usedCryochambers").fixPrices);for(const n of s)if(this._workshopManager.getValueAvailable(n.name)<n.val)return;const e=this.manager.tab.vsPanel.children[0].children[0];let t=0,i;do i=!1,i=e.controller.buyItem(p(e.model),new MouseEvent("click")).itemBought,t+=i?1:0;while(i);0<t&&(this._host.engine.iactivity("act.fix.cry",[this._host.renderAbsolute(t)],"ks-fixCry"),this._host.engine.storeForSummary("fix.cry",t))}}class Vn{constructor(s,e,t=new fs){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_workshopManager");this._host=s,this.settings=t,this.manager=new ge(this._host,"Trade"),this._workshopManager=e}tick(s){this.settings.enabled&&(this.manager.render(),this.autoTrade(),this.settings.unlockRaces.enabled&&this.autoUnlock(s),this.settings.buildEmbassies.enabled&&this.autoBuildEmbassies(s),this.settings.feedLeviathans.enabled&&this.autoFeedElders(),this.settings.tradeBlackcoin.enabled&&this.autoTradeBlackcoin())}autoTrade(s){var d;const e=this._workshopManager.getResource("manpower"),t=this._workshopManager.getResource("gold"),i=this.settings.trigger,n=[],a=this._host.game.calendar.getCurSeason().name;for(const g of Object.values(this.settings.races)){const f=this.getRace(g.race),w=re.evaluateSubSectionTrigger(i,g.trigger);if(w<0||!g.enabled||!g.seasons[a].enabled||!f.unlocked||!this.singleTradePossible(i,e,t,g))continue;const b=this.getTradeButton(f.name);if(!((d=b==null?void 0:b.model)!=null&&d.enabled))continue;const k=g.require?this._workshopManager.getResource(g.require):!1,y=this.getProfitability(g.race);(g.limited&&y||!k||w<=k.value/k.maxValue)&&n.push(g.race)}if(n.length===0)return;let r=this.getLowestTradeAmount(null,!0,!1);if(r<1)return;const o=[];for(let g=0;g<n.length;g++){const f=n[g],w=this.settings.races[f],b=w.require?this._workshopManager.getResource(w.require):!1,k=re.evaluateSubSectionTrigger(i,w.trigger),y=(!b||k<=b.value/b.maxValue)&&k<=t.value/t.maxValue,P=this.getLowestTradeAmount(f,w.limited,y);if(P<1){n.splice(g,1),g--;continue}o.push(P)}if(n.length===0)return;const l={};for(;0<n.length&&1<=r;){if(r<n.length){const b=Math.floor(Math.random()*n.length),k=n[b];m(l[k])&&(l[k]=0),l[k]+=1,r-=1,n.splice(b,1),o.splice(b,1);continue}let g=Math.floor(r/n.length),f=0;const w=n[f];for(let b=0;b<n.length;++b)o[b]<g&&(g=o[b],f=b);m(l[w])&&(l[w]=0),l[w]+=g,r-=g,n.splice(f,1),o.splice(f,1)}if(Object.values(l).length===0)return;const h={};for(const[g,f]of z(l)){const w=this.getRace(g),b=this.getMaterials(g);for(const[y,P]of z(b))h[y]||(h[y]=0),h[y]-=P*f;const k=this.getAverageTrade(w);for(const[y,P]of z(k)){const j=this._workshopManager.getResource(y);h[y]||(h[y]=0),h[y]+=j.maxValue>0?Math.min(p(k[y])*p(l[g]),Math.max(j.maxValue-j.value,0)):P*p(l[g])}}m(s)||s.pushToCache({materials:h,timeStamp:this._host.game.timer.ticksTotal});for(const[g,f]of z(l))0<f&&this.trade(g,f)}autoBuildEmbassies(s){var o;if(!this._host.game.diplomacy.races[0].embassyPrices)return;const e=this._workshopManager.getResource("culture");let t=0;const i=this.settings.buildEmbassies.trigger;if(e.value/e.maxValue<Y(i))return;const n=this._host.game.diplomacyTab.racePanels;t=this._workshopManager.getValueAvailable("culture");const a={},r=[];for(let l=0;l<n.length;l++){if(!n[l].embassyButton)continue;const h=n[l].race.name,d=this._host.game.diplomacy.get(h),g=Y(this.settings.buildEmbassies.races[h].max);!this.settings.buildEmbassies.races[h].enabled||g<=d.embassyLevel||!d.unlocked||(a[h]={basePrice:p((o=d.embassyPrices)==null?void 0:o[0]).val,currentEm:d.embassyLevel,max:g,priceSum:0,race:d,val:0},r.push(h))}if(r.length!==0){for(;r.length>0;)for(let l=0;l<r.length;l++){const h=r[l],d=p(a[h]);if(d.max<=d.currentEm+d.val){r.splice(l,1),--l;continue}const g=d.basePrice*1.15**(d.currentEm+d.val);g<=t?(t-=g,d.priceSum+=g,d.val+=1,s.requestGameUiRefresh=!0):(r.splice(l,1),--l)}for(const[,l]of z(a))l.val!==0&&(t=this._workshopManager.getValueAvailable("culture"),t<l.priceSum&&console.warn(...v("Something has gone horribly wrong.",l.priceSum,t)),this._workshopManager.getResource("culture").value-=l.priceSum,l.race.embassyLevel+=l.val,this._host.engine.storeForSummary("embassy",l.val),l.val!==1?this._host.engine.iactivity("build.embassies",[l.val,l.race.title],"ks-build"):this._host.engine.iactivity("build.embassy",[l.val,l.race.title],"ks-build"))}}autoFeedElders(){const s=this._host.game.diplomacy.get("leviathans"),e=this._host.game.resPool.get("necrocorn");!s.unlocked||e.value===0||(1<=e.value?s.energy<this._host.game.diplomacy.getMarkerCap()&&(this._host.game.diplomacy.feedElders(),this._host.engine.iactivity("act.feed"),this._host.engine.storeForSummary("feed",1)):.25*(1+this._host.game.getEffect("corruptionBoostRatio"))<1&&(this._host.engine.storeForSummary("feed",e.value),this._host.game.diplomacy.feedElders(),this._host.engine.iactivity("dispose.necrocorn")))}autoUnlock(s){if(!this._host.game.tabs[4].visible)return;const e=this._host.game.diplomacy.get("leviathans").unlocked?8:7;if(this._host.game.diplomacyTab.racePanels.length<e){let t=this._workshopManager.getValueAvailable("manpower");if(!this._host.game.diplomacy.get("lizards").unlocked&&t>=1e3){this._host.game.resPool.get("manpower").value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}if(!this._host.game.diplomacy.get("sharks").unlocked&&t>=1e3){this._host.game.resPool.get("manpower").value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}if(!this._host.game.diplomacy.get("griffins").unlocked&&t>=1e3){this._host.game.resPool.get("manpower").value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}if(!this._host.game.diplomacy.get("nagas").unlocked&&this._host.game.resPool.get("culture").value>=1500&&t>=1e3){this._host.game.resPool.get("manpower").value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}if(!this._host.game.diplomacy.get("zebras").unlocked&&this._host.game.resPool.get("ship").value>=1&&t>=1e3){this._host.game.resPool.get("manpower").value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}if(!this._host.game.diplomacy.get("spiders").unlocked&&p(this._host.game.resPool.get("ship")).value>=100&&p(this._host.game.resPool.get("science")).maxValue>125e3&&t>=1e3){p(this._host.game.resPool.get("manpower")).value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}if(!this._host.game.diplomacy.get("dragons").unlocked&&this._host.game.science.get("nuclearFission").researched&&t>=1e3){p(this._host.game.resPool.get("manpower")).value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}}}autoTradeBlackcoin(){const s=this._host.game.calendar.cryptoPrice,e=this._host.game.resPool.get("relic").value,t=this._host.game.resPool.get("blackcoin").value;let i=0,n=0;if(s<this.settings.tradeBlackcoin.buy&&this.settings.tradeBlackcoin.trigger<e){this._host.game.diplomacy.buyBcoin();const a=this._host.game.resPool.get("blackcoin").value;i=Math.round(a-t),this._host.engine.iactivity("act.blackcoin.buy",[this._host.renderAbsolute(i)])}else if(s>this.settings.tradeBlackcoin.sell&&0<this._host.game.resPool.get("blackcoin").value){this._host.game.diplomacy.sellBcoin();const a=p(this._host.game.resPool.get("relic")).value;n=Math.round(a-e),this._host.engine.iactivity("act.blackcoin.sell",[this._host.renderAbsolute(n)])}}trade(s,e){var n;const t=this.getRace(s),i=this.getTradeButton(t.name);(!((n=i==null?void 0:i.model)!=null&&n.enabled)||!this.settings.races[s].enabled)&&console.warn(...v("KS trade checks are not functioning properly, please create an issue on the github page.")),this._host.game.diplomacy.tradeMultiple(t,e),this._host.engine.storeForSummary(t.title,e,"trade"),this._host.engine.iactivity("act.trade",[this._host.renderAbsolute(e),X(t.title)],"ks-trade")}getProfitability(s){const e=this.getRace(s);let t=0;const i=this.getMaterials(s);for(const[r,o]of z(i)){const l=this._workshopManager.getTickVal(this._workshopManager.getResource(r));if(l!=="ignore"){if(l<=0)return!1;t+=o/l}}let n=0;const a=this.getAverageTrade(e);for(const[r,o]of z(a)){const l=this._workshopManager.getResource(r),h=this._workshopManager.getTickVal(l);if(h!=="ignore"){if(h<=0)return!0;n+=0<l.maxValue?Math.min(o,Math.max(l.maxValue-l.value,0))/h:o/h}}return t<=n}getAverageTrade(s){const e=this._host.game.getEffect("standingRatio")+this._host.game.diplomacy.calculateStandingFromPolicies(s.name,this._host.game),t=1+s.energy*.02,i=1+this._host.game.diplomacy.getTradeRatio()+this._host.game.diplomacy.calculateTradeBonusFromPolicies(s.name,this._host.game),n=s.standing<0?s.standing+e:0,a=0<n?1+n:1,r=0<s.standing?Math.min(s.standing+e/2,1):0,o={};for(const d of s.sells){if(!this._isValidTrade(d,s)){o[d.name]=0;continue}let g=0;const f=s.embassyPrices?d.chance*(1+this._host.game.getLimitedDR(.01*s.embassyLevel,.75)):d.chance;if(s.name==="zebras"&&d.name==="titanium"){const w=this._host.game.resPool.get("ship").value,b=Math.min(.15+w*.0035,1);g=1.5*(1+w/50)*(a*b)}else{const w=d.seasons?1+d.seasons[this._host.game.calendar.getCurSeason().name]:1,b=(a-r)*Math.min(f/100,1),k=r*Math.min(f/100,1);g=(b+1.25*k)*d.value*t*w*i}o[d.name]=g}const l=s.embassyPrices?.35*(1+.01*s.embassyLevel):.35,h=a*Math.min(l,1);return o.spice=25*h+50*h*i/2,o.blueprint=.1*a,o}_isValidTrade(s,e){return!(s.minLevel&&e.embassyLevel<s.minLevel)&&(this._host.game.resPool.get(s.name).unlocked||s.name==="titanium"||s.name==="uranium"||e.name==="leviathans")}getLowestTradeAmount(s,e,t){let i;const n=this.getMaterials(s);let a;for(const[h,d]of z(n)){if(h==="manpower"){let g=d;this._host.game.challenges.isActive("postApocalypse")&&(g=d*(1+this._host.game.bld.getPollutionLevel())),a=this._workshopManager.getValueAvailable(h)/g}else if(h==="gold"){let g=d;this._host.game.challenges.isActive("postApocalypse")&&(g=d*(1+this._host.game.bld.getPollutionLevel())),a=this._workshopManager.getValueAvailable(h)/g}else a=this._workshopManager.getValueAvailable(h)/d;i=i===void 0||a<i?a:i}if(i=Math.floor(i??0),i===0)return 0;if(s===null||s==="leviathans")return i;const r=this.getRace(s);let o=0;const l=this.getAverageTrade(r);for(const h of r.sells){const d=this._workshopManager.getResource(h.name);let g=0;if(!d.maxValue)continue;g=p(l[h.name]);const f=Math.max((d.maxValue-d.value)/g,0);o=f<o?o:f}return o=Math.ceil(o),o===0?0:(i=o<i?Math.max(o-1,1):i,Math.floor(i))}getMaterials(s=null){const e={gold:15-this._host.game.getEffect("tradeGoldDiscount"),manpower:50-this._host.game.getEffect("tradeCatpowerDiscount")};if(m(s))return e;const t=this.getRace(s).buys;for(const i of t)e[i.name]=i.val;return e}getRace(s){const e=this._host.game.diplomacy.get(s);if(m(e))throw new Error(`Unable to retrieve race '${s}'`);return e}getTradeButton(s){const e=this.manager.tab.racePanels.find(t=>t.race.name===s);return(e==null?void 0:e.tradeBtn)??null}singleTradePossible(s,e,t,i){const n=i?re.evaluateSubSectionTrigger(s,i.trigger):s;if(n<0&&i===void 0)return!0;if(n<0&&i!==void 0||e.value/e.maxValue<n||t.value/t.maxValue<n)return!1;const a=this.getMaterials(i==null?void 0:i.race);for(const[r,o]of z(a))if(this._workshopManager.getValueAvailable(r)<o)return!1;return!0}}class jn{constructor(s){u(this,"_host");u(this,"_cache",new Array);u(this,"_cacheSum",{});this._host=s}pushToCache(s){this._cache.push(s);for(const[e,t]of z(s.materials))this._cacheSum[e]||(this._cacheSum[e]=0),this._cacheSum[e]+=t;for(let e=0;e<this._cache.length;++e){const t=this._cache[e];if(this._cache.length>1e4){const i=t.materials;for(const[n,a]of z(i))this._cacheSum[n]||(this._cacheSum[n]=0),this._cacheSum[n]-=a;this._cache.shift(),e--}else return}}getResValue(s){if(this._cache.length===0||!this._cacheSum[s])return 0;const e=this._host.game.timer.ticksTotal,t=this._cache[0].timeStamp;return this._cacheSum[s]/(e-t)}}class Jn{constructor(s,e,t=new bs){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_cacheManager");u(this,"_workshopManager");this._host=s,this.settings=t,this.manager=new ge(this._host,"Village"),this._cacheManager=new jn(this._host),this._workshopManager=e}tick(s){this.settings.enabled&&(this.autoDistributeKittens(),this.settings.hunt.enabled&&this.autoHunt(this._cacheManager),this.settings.holdFestivals.enabled&&this.autoFestival(this._cacheManager),this.settings.electLeader.enabled&&this.autoElect(),this.settings.promoteLeader.enabled&&this.autoPromoteLeader(),this.settings.promoteKittens.enabled&&this.autoPromoteKittens())}autoDistributeKittens(){const s=this._host.game.village.getFreeKittens();if(s){for(let e=0;e<s;++e){const t=new Array;for(const a of this._host.game.village.jobs){const r=this.settings.jobs[a.name].enabled,o=a.unlocked;if(!r||!o)continue;const l=this._host.game.village.getJobLimit(a.name),h=Y(this.settings.jobs[a.name].max),d=a.value;d<l&&d<h&&t.push({count:d,job:a,toCap:l-d})}if(!t.length)return;const i=!m(t.find(a=>a.job.name==="farmer"&&a.count===0));t.sort((a,r)=>a.count-r.count);const n=i?"farmer":t[0].job.name;this._host.game.village.assignJob(this._host.game.village.getJob(n),1),this.manager.render(),this._host.engine.iactivity("act.distribute",[this._host.engine.i18n(`$village.job.${n}`)],"ks-distribute")}this._host.engine.storeForSummary("distribute",s)}}autoElect(){if(this._host.game.challenges.isActive("anarchy"))return;const s=this._host.game.village.sim.kittens,e=this._host.game.village.leader,t=this.settings.electLeader.job.selected,i=this.settings.electLeader.trait.selected,n=s.filter(r=>(r.job===t||t==="any")&&r.trait.name===i);if(n.length===0)return;n.sort((r,o)=>o.rank-r.rank);const a=n[0];!m(e)&&e.trait.name===i&&(e.job===t||t==="any")&&a.rank<=e.rank||(this._host.game.village.makeLeader(a),this._host.engine.iactivity("act.elect"))}autoPromoteKittens(){const s=this._workshopManager.getResource("gold");if(!(this.settings.promoteKittens.trigger<s.value/s.maxValue))for(let e=0;e<this._host.game.village.sim.kittens.length;e++){let t=-1;const i=this._host.game.village.sim.kittens[e].engineerSpeciality;if(!m(i)&&(t=p(this._host.game.workshop.getCraft(i)).tier,!(t<=this._host.game.village.sim.kittens[e].rank))){this._host.game.village.promoteKittens();return}}}autoPromoteLeader(){var s,e;if(this._host.game.science.get("civil").researched&&this._host.game.village.leader!==null){const t=this._host.game.village.leader,i=t.rank,n=this._workshopManager.getResource("gold"),a=this._workshopManager.getStock("gold");this._host.game.village.sim.goldToPromote(i,i+1,n.value-a)[0]&&this._host.game.village.sim.promote(t,i+1)===1&&(this._host.engine.iactivity("act.promote",[i+1],"ks-promote"),(s=this._host.game.villageTab.censusPanel)==null||s.census.renderGovernment(this._host.game.villageTab.censusPanel.census.container),(e=this._host.game.villageTab.censusPanel)==null||e.census.update(),this._host.engine.storeForSummary("promote",1))}}autoHunt(s){const e=this._workshopManager.getResource("manpower"),t=this.settings.hunt.trigger;if(!(e.value<100||this._host.game.challenges.isActive("pacifism"))&&t<=e.value/e.maxValue&&100<=e.value){const i=Math.floor(e.value/100);this._host.engine.storeForSummary("hunt",i),this._host.engine.iactivity("act.hunt",[this._host.renderAbsolute(i)],"ks-hunt");const n=this._workshopManager.getAverageHunt(),a={};for(const[r,o]of z(n)){const l=this._workshopManager.getResource(r);a[r]=0<l.maxValue?Math.min(o*i,Math.max(l.maxValue-l.value,0)):o*i}m(s)||s.pushToCache({materials:a,timeStamp:this._host.game.timer.ticksTotal}),this._host.game.village.huntAll()}}autoFestival(s){if(!this._host.game.science.get("drama").researched||400<this._host.game.calendar.festivalDays||!this._host.game.prestige.getPerk("carnivals").researched&&0<this._host.game.calendar.festivalDays)return;const e=this._workshopManager;if(e.getValueAvailable("manpower")<1500||e.getValueAvailable("culture")<5e3||e.getValueAvailable("parchment")<2500)return;const t=4e3*e.getTickVal(e.getResource("manpower"),s,!0)>1500,i=4e3*e.getTickVal(e.getResource("culture"),s,!0)>5e3,n=4e3*e.getTickVal(e.getResource("parchment"),s,!0)>2500;if(!(!t&&!i&&!n)&&(this.manager.render(),this._host.game.villageTab.festivalBtn.model.enabled)){const a=this._host.game.calendar.festivalDays;this._host.game.villageTab.festivalBtn.onClick(),this._host.engine.storeForSummary("festival"),a>0?this._host.engine.iactivity("festival.extend",[],"ks-festival"):this._host.engine.iactivity("festival.hold",[],"ks-festival")}}}const ps={"de-DE":hn,"en-US":cn,"he-IL":un,"zh-CN":dn};class re{constructor(s,e){u(this,"_i18nData");u(this,"_isLoaded",!1);u(this,"_host");u(this,"settings");u(this,"bonfireManager");u(this,"religionManager");u(this,"scienceManager");u(this,"spaceManager");u(this,"timeControlManager");u(this,"timeManager");u(this,"tradeManager");u(this,"villageManager");u(this,"workshopManager");u(this,"_activitySummary");u(this,"_timeoutMainLoop");this.settings=new cs,this._i18nData=ps,this.setLanguage(e,!1),this._host=s,this._activitySummary=new ln(this._host),this.workshopManager=new ei(this._host),this.bonfireManager=new on(this._host,this.workshopManager),this.religionManager=new gn(this._host,this.bonfireManager,this.workshopManager),this.scienceManager=new yn(this._host,this.workshopManager),this.spaceManager=new _n(this._host,this.workshopManager),this.timeControlManager=new Zn(this._host,this.bonfireManager,this.religionManager,this.spaceManager,this.workshopManager),this.timeManager=new Kn(this._host,this.workshopManager),this.tradeManager=new Vn(this._host,this.workshopManager),this.villageManager=new Jn(this._host,this.workshopManager)}get isLoaded(){return this._isLoaded}isLanguageSupported(s){return Object.keys(this._i18nData).some(e=>e.startsWith(`${s}-`))}isLocaleSupported(s){return s in this._i18nData}localeSupportsFirstLetterSplits(s=this.settings.locale.selected){return s!=="zh-CN"}localeForLanguage(s){return Object.keys(this._i18nData).find(e=>e.startsWith(`${s}-`))}setLanguage(s,e=!0){const t=this.settings.locale.selected;if(!this.isLanguageSupported(s))console.warn(...v(`Requested language '${s}' is not available. Falling back to '${Te}'.`)),this.settings.locale.selected=Te;else{const i=p(this.localeForLanguage(s));console.info(...v(`Selecting language '${i}'.`)),this.settings.locale.selected=i}t!==this.settings.locale.selected&&e&&this._host.rebuildUi()}setLocale(s,e=!0){const t=this.settings.locale.selected;this.isLocaleSupported(s)?(console.info(...v(`Selecting language '${s}'.`)),this.settings.locale.selected=s):(console.warn(...v(`Requested language '${s}' is not available. Falling back to '${Te}'.`)),this.settings.locale.selected=Te),t!==this.settings.locale.selected&&e&&this._host.rebuildUi()}stateLoad(s,e=!1){this._isLoaded=!0,this.stop(!1);const t=Oe();s.v!==t&&console.warn(...v(`Attempting to load engine state with version tag '${s.v}' when engine is at version '${t}'!`));const i=(n,a)=>{try{n()}catch(r){console.error(...v(`Failed load of ${a} settings.`,r))}};i(()=>{this.settings.load(s.engine,e)},"engine"),i(()=>{this.bonfireManager.settings.load(s.bonfire)},"bonfire"),i(()=>{this.religionManager.settings.load(s.religion)},"religion"),i(()=>{this.scienceManager.settings.load(s.science)},"science"),i(()=>{this.spaceManager.settings.load(s.space)},"space"),i(()=>{this.timeControlManager.settings.load(s.timeControl)},"time control"),i(()=>{this.timeManager.settings.load(s.time)},"time"),i(()=>{this.tradeManager.settings.load(s.trade)},"trade"),i(()=>{this.villageManager.settings.load(s.village)},"village"),i(()=>{this.workshopManager.settings.load(s.workshop)},"workshop"),this.setLocale(this.settings.locale.selected),this.settings.enabled?this.start(!1):this.stop(!1)}static get DEFAULT_STATE(){return{bonfire:new Xt,engine:new cs,religion:new Yt,science:new Qt,space:new St,time:new ms,timeControl:new ds,trade:new fs,v:Oe(),village:new bs,workshop:new xt}}stateReset(){this.stateLoad(re.DEFAULT_STATE)}stateSerialize(){return{bonfire:this.bonfireManager.settings,engine:this.settings,religion:this.religionManager.settings,science:this.scienceManager.settings,space:this.spaceManager.settings,time:this.timeManager.settings,timeControl:this.timeControlManager.settings,trade:this.tradeManager.settings,v:Oe(),village:this.villageManager.settings,workshop:this.workshopManager.settings}}start(s=!0){if(this._timeoutMainLoop)return;const e=()=>{const t={entry:Date.now(),exit:0,measurements:{},requestGameUiRefresh:!1};this._iterate(t).then(()=>{t.exit=Date.now();const i=t.exit-t.entry;document.dispatchEvent(new CustomEvent("ks.reportFrame",{detail:t})),this._timeoutMainLoop!==void 0&&(this._timeoutMainLoop=T.window.setTimeout(e,Math.max(10,this._host.engine.settings.interval-i)))}).catch(i=>{console.warn(...v(Gs(i)))})};this._timeoutMainLoop=T.window.setTimeout(e,this._host.engine.settings.interval),s&&this._host.engine.imessage("status.ks.enable")}stop(s=!0){this._timeoutMainLoop&&(clearTimeout(this._timeoutMainLoop),this._timeoutMainLoop=void 0,s&&this._host.engine.imessage("status.ks.disable"))}async _iterate(s){this.settings.filters.disableKGLog.enabled||this._maintainKGLogFilters();let[,e]=await vt(()=>this.scienceManager.tick(s));s.measurements.scienceManager=e,[,e]=ye(()=>{this.bonfireManager.tick(s)}),s.measurements.bonfireManager=e,[,e]=ye(()=>{this.spaceManager.tick(s)}),s.measurements.spaceManager=e,[,e]=await vt(()=>this.workshopManager.tick(s)),s.measurements.workshopManager=e,[,e]=ye(()=>{this.tradeManager.tick(s)}),s.measurements.tradeManager=e,[,e]=await vt(()=>this.religionManager.tick(s)),s.measurements.religionManager=e,[,e]=ye(()=>{this.timeManager.tick(s)}),s.measurements.timeManager=e,[,e]=ye(()=>{this.villageManager.tick(s)}),s.measurements.villageManager=e,[,e]=await vt(()=>this.timeControlManager.tick(s)),s.measurements.timeControlManager=e,[,e]=ye(()=>{s.requestGameUiRefresh&&this._host.game.ui.render()}),s.measurements.gameUiRefresh=e}_maintainKGLogFilters(){for(const e of Object.values(this._host.game.console.filters))e.enabled=!1;const s=T.window.document.querySelectorAll("[id^=filter-]");for(const e of s)e.checked=!1}symbolForCycle(s){var e;return((e=this._host.game.calendar.cycles.find(t=>t.name===s))==null?void 0:e.uglyph)??""}labelForCycle(s){const e=this.symbolForCycle(s),t=this._host.engine.i18n(`$space.planet.${s==="redmoon"?"moon":s}.label`);return`${e} ${t}`}labelForPlanet(s){const e=s==="moon"?"redmoon":s,t=we.includes(e)?e:void 0,i=this._host.engine.i18n(`$space.planet.${s}.label`);return t===void 0?i:`${this.symbolForCycle(t)} ${i}`}i18n(s,e=[]){let t;if(s.startsWith("$")&&(t=this._host.i18nEngine(s.slice(1))),t=t??this._i18nData[this.settings.locale.selected][s],m(t)){if(t=ps[Te][s],!t)return console.warn(...v(`i18n key '${s}' not found in default language.`)),`$${s}`;console.warn(...v(`i18n key '${s}' not found in selected language.`))}for(let n=0;n<e.length;++n)t=t.replace(`{${n}}`,`${e[n]}`);return t}iactivity(s,e=[],t){const i=this.i18n(s,e);if(t){const n=`type_${t}`;this._printOutput(`ks-activity ${n}`,"#e65C00",i)}else this._printOutput("ks-activity","#e65C00",i)}imessage(s,e=[]){this._printOutput("ks-default","#aa50fe",this.i18n(s,e))}storeForSummary(s,e=1,t="other"){this._activitySummary.storeActivity(s,e,t)}getSummary(){return this._activitySummary.renderSummary()}displayActivitySummary(){const s=this.getSummary();for(const e of s)this._printOutput("ks-summary","#009933",e);this.resetActivitySummary()}resetActivitySummary(){this._activitySummary.resetActivity()}_printOutput(s,e,t){if(this.settings.filters.enabled){for(const n of Object.values(this.settings.filters.filters))if(n.variant===s&&!n.enabled)return}const i=this._host.game.msg(t,s);$(i.span).css("color",e),console.debug(...v(t))}static evaluateSubSectionTrigger(s,e){return s<0?e:e<0?s:e}}const vs=c=>Number.isFinite(c)?c:0,Xn=c=>({days:Math.trunc(c/864e5),hours:Math.trunc(c/36e5%24),minutes:Math.trunc(c/6e4%60),seconds:Math.trunc(c/1e3%60),milliseconds:Math.trunc(c%1e3),microseconds:Math.trunc(vs(c*1e3)%1e3),nanoseconds:Math.trunc(vs(c*1e6)%1e3)}),Yn=c=>({days:c/86400000n,hours:c/3600000n%24n,minutes:c/60000n%60n,seconds:c/1000n%60n,milliseconds:c%1000n,microseconds:0n,nanoseconds:0n}),Qn=c=>{switch(typeof c){case"number":{if(Number.isFinite(c))return Xn(c);break}case"bigint":return Yn(c)}throw new TypeError("Expected a finite number or bigint")},ea=c=>c===0||c===0n,ta=(c,s)=>s===1||s===1n?c:`${c}s`,ia=1e-7,sa=24n*60n*60n*1000n,na=(c,s={colonNotation:!1,compact:!1,formatSubMilliseconds:!1,keepDecimalsOnWholeSeconds:!1,millisecondsDecimalDigits:0,secondsDecimalDigits:1,separateMilliseconds:!1,unitCount:1/0,verbose:!1})=>{const e=typeof c=="bigint";if(!e&&!Number.isFinite(c))throw new TypeError("Expected a finite number or bigint");const t={...s};t.colonNotation&&(t.compact=!1,t.formatSubMilliseconds=!1,t.separateMilliseconds=!1,t.verbose=!1),t.compact&&(t.unitCount=1,t.secondsDecimalDigits=0,t.millisecondsDecimalDigits=0);let i=[];const n=(h,d)=>{const g=Math.floor(h*10**d+ia);return(Math.round(g)/10**d).toFixed(d)},a=(h,d,g,f)=>{if(!((i.length===0||!t.colonNotation)&&ea(h)&&!(t.colonNotation&&g==="m"))){if(f??(f=String(h)),t.colonNotation){const w=f.includes(".")?f.split(".")[0].length:f.length,b=i.length>0?2:1;f="0".repeat(Math.max(0,b-w))+f}else f+=t.verbose?" "+ta(d,h):g;i.push(f)}},r=Qn(c),o=BigInt(r.days);if(a(o/365n,"year","y"),a(o%365n,"day","d"),a(Number(r.hours),"hour","h"),a(Number(r.minutes),"minute","m"),t.separateMilliseconds||t.formatSubMilliseconds||!t.colonNotation&&c<1e3){const h=Number(r.seconds),d=Number(r.milliseconds),g=Number(r.microseconds),f=Number(r.nanoseconds);if(a(h,"second","s"),t.formatSubMilliseconds)a(d,"millisecond","ms"),a(g,"microsecond","µs"),a(f,"nanosecond","ns");else{const w=d+g/1e3+f/1e6,b=typeof t.millisecondsDecimalDigits=="number"?t.millisecondsDecimalDigits:0,k=w>=1?Math.round(w):Math.ceil(w),y=b?w.toFixed(b):k.toString();a(Number.parseFloat(y),"millisecond","ms",y)}}else{const h=(e?Number(c%sa):c)/1e3%60,d=typeof t.secondsDecimalDigits=="number"?t.secondsDecimalDigits:1,g=n(h,d),f=t.keepDecimalsOnWholeSeconds?g:g.replace(/\.0+$/,"");a(Number.parseFloat(f),"second","s",f)}if(i.length===0)return"0"+(t.verbose?" milliseconds":"ms");const l=t.colonNotation?":":" ";return typeof t.unitCount=="number"&&(i=i.slice(0,Math.max(t.unitCount,1))),i.join(l)},A={Bonfire:"M80-80v-183l363-491-67-90 49-35 55 75 56-75 48 35-66 90 362 491v183H80Zm400-623L140-243v103h145l195-273 195 273h145v-103L480-703ZM359-140h242L480-310 359-140Zm121-273 195 273-195-273-195 273 195-273Z",CheckboxCheck:"m419-321 289-289-43-43-246 246-119-119-43 43 162 162ZM120-120v-720h720v720H120Zm60-60h600v-600H180v600Zm0 0v-600 600Z",CheckboxUnCheck:"M120-120v-720h720v720H120Zm60-60h600v-600H180v600Z",Copy:"M240-200v-680h560v680H240Zm60-60h440v-560H300v560ZM120-80v-680h60v620h500v60H120Zm180-180v-560 560Z",Cycles:"M120-80v-740h125v-60h65v60h340v-60h65v60h125v360h-60v-110H180v430h324v60H120ZM760 0q-73 0-127.5-45.5T564-160h62q13 44 49.5 72T760-60q58 0 99-41t41-99q0-58-41-99t-99-41q-29 0-54 10.5T662-300h58v60H560v-160h60v57q27-26 63-41.5t77-15.5q83 0 141.5 58.5T960-200q0 83-58.5 141.5T760 0ZM180-630h600v-130H180v130Zm0 0v-130 130Z",DataUsage:"M480-80q-82 0-155-31.5T197.5-197q-54.5-54-86-127T80-479q0-158 106.5-272T451-877v102q-115 11-192 95.5T182-479q0 124 87 210.5T480-182q72 0 136-32.5T725-306l88 51q-58 83-145.5 129T480-80Zm362-229-88-49q12-31 18-61.5t6-60.5q0-116-76.5-201T511-776v-102q157 11 263 124.5T880-484q0 45-9.5 88.5T842-309Z",Delete:"M201-120v-630h-41v-60h188v-30h264v30h188v60h-41v630H201Zm60-60h438v-570H261v570Zm106-86h60v-399h-60v399Zm166 0h60v-399h-60v399ZM261-750v570-570Z",Draft:"M160-80v-800h421l219 219v581H160Zm391-554v-186H220v680h520v-494H551ZM220-820v186-186 680-680Z",Eco:"M213-175q-43.59-45-68.3-104Q120-338 120-400q0-73 25.5-133.5T222-645q35-35 87-59t122.5-37.5Q502-755 591-758.5t198 3.5q8 108 5.5 197.5t-16 160.75q-13.5 71.25-38 124.56Q716-218.87 680-183q-51 51-110 77T444-80q-69 0-126.5-23.5T213-175Zm103 0q25 17 58 26t69.92 9Q497-140 547-162t91-64q27-27 46-70.5t31-103Q727-459 731-534t0-165q-94-2-168.5 2.5T431-680q-57 12-98 30.5T266-604q-42 43-64 91t-22 98q0 48 20.5 100.5T251-230q53-98 127-176t157-123q-87 75-141 162.5T316-175Zm0 0Zm0 0Z",Edit:"M180-180h44l472-471-44-44-472 471v44Zm-60 60v-128l617-616 128 128-617 616H120Zm659-617-41-41 41 41Zm-105 64-22-22 44 44-22-22Z",ExpandCircleDown:"m480-351 173-173-43-42-130 130-130-130-43 42 173 173Zm0 271q-82 0-155-31.5t-127.5-86Q143-252 111.5-325T80-480q0-83 31.5-156t86-127Q252-817 325-848.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 82-31.5 155T763-197.5q-54 54.5-127 86T480-80Zm0-60q142 0 241-99.5T820-480q0-142-99-241t-241-99q-141 0-240.5 99T140-480q0 141 99.5 240.5T480-140Zm0-340Z",ExpandCircleUp:"m350-394 130-130 130 130 43-42-173-173-173 173 43 42ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-155.5t85.5-127q54-54.5 127-86T480-880q83 0 155.5 31.5t127 86q54.5 54.5 86 127T880-480q0 83-31.5 156t-86 127q-54.5 54-127 85.5T480-80Zm0-60q141 0 240.5-99T820-480q0-141-99.5-240.5T480-820q-142 0-241 99.5T140-480q0 142 99 241t241 99Zm0-340Z",Import:"M450-160v-371L330-411l-43-43 193-193 193 193-43 43-120-120v371h-60ZM160-597v-203h640v203h-60v-143H220v143h-60Z",Religion:"M40-120v-560q0-45.83 32.12-77.92 32.12-32.08 78-32.08T228-757.92q32 32.09 32 77.92v31l220-191 220 191v-31q0-45.83 32.12-77.92 32.12-32.08 78-32.08T888-757.92q32 32.09 32 77.92v560H530v-250H430v250H40Zm720-510h100v-49.82q0-21.18-14.32-35.68-14.33-14.5-35.5-14.5-21.18 0-35.68 14.37Q760-701.25 760-680v50Zm-660 0h100v-49.82q0-21.18-14.32-35.68-14.33-14.5-35.5-14.5-21.18 0-35.68 14.37Q100-701.25 100-680v50Zm0 450h100v-390H100v390Zm160 0h110v-250h220v250h110v-390L480-761 260-570v390Zm500 0h100v-390H760v390ZM479.94-505Q457-505 441-521.06q-16-16.06-16-39T441.06-599q16.06-16 39-16T519-598.94q16 16.06 16 39T518.94-521q-16.06 16-39 16Z",Reset:"M480-160q-133 0-226.5-93.5T160-480q0-133 93.5-226.5T480-800q85 0 149 34.5T740-671v-129h60v254H546v-60h168q-38-60-97-97t-137-37q-109 0-184.5 75.5T220-480q0 109 75.5 184.5T480-220q83 0 152-47.5T728-393h62q-29 105-115 169t-195 64Z",Resources:"M120-40v-880h60v80h600v-80h60v880h-60v-80H180v80h-60Zm60-469h110v-160h220v160h270v-271H180v271Zm0 329h270v-160h220v160h110v-269H180v269Zm170-329h100v-100H350v100Zm160 329h100v-100H510v100ZM350-509h100-100Zm160 329h100-100Z",Save:"M840-683v563H120v-720h563l157 157Zm-60 27L656-780H180v600h600v-476ZM479.76-245q43.24 0 73.74-30.26 30.5-30.27 30.5-73.5 0-43.24-30.26-73.74-30.27-30.5-73.5-30.5-43.24 0-73.74 30.26-30.5 30.27-30.5 73.5 0 43.24 30.26 73.74 30.27 30.5 73.5 30.5ZM233-584h358v-143H233v143Zm-53-72v476-600 124Z",SaveAs:"M120-120v-720h563l157 157v117l-60 60v-150L656-780H180v600h280v60H120Zm60-660v600-600ZM520-40v-123l263-262 122 122L643-40H520Zm300-263-37-37 37 37ZM580-100h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19ZM233-584h358v-143H233v143Zm247 339q14 0 27-3t24-10l39-40q7-11 10.5-24t3.5-27q0-43.33-30.26-73.67Q523.47-453 480.24-453q-43.24 0-73.74 30.26-30.5 30.27-30.5 73.5 0 43.24 30.33 73.74Q436.67-245 480-245Z",Seasons:"M306-394q-17 0-28.5-11.5T266-434q0-17 11.5-28.5T306-474q17 0 28.5 11.5T346-434q0 17-11.5 28.5T306-394Zm177 0q-17 0-28.5-11.5T443-434q0-17 11.5-28.5T483-474q17 0 28.5 11.5T523-434q0 17-11.5 28.5T483-394Zm170 0q-17 0-28.5-11.5T613-434q0-17 11.5-28.5T653-474q17 0 28.5 11.5T693-434q0 17-11.5 28.5T653-394ZM120-80v-740h125v-60h65v60h340v-60h65v60h125v740H120Zm60-60h600v-430H180v430Zm0-490h600v-130H180v130Zm0 0v-130 130Z",Settings:"m388-80-20-126q-19-7-40-19t-37-25l-118 54-93-164 108-79q-2-9-2.5-20.5T185-480q0-9 .5-20.5T188-521L80-600l93-164 118 54q16-13 37-25t40-18l20-127h184l20 126q19 7 40.5 18.5T669-710l118-54 93 164-108 77q2 10 2.5 21.5t.5 21.5q0 10-.5 21t-2.5 21l108 78-93 164-118-54q-16 13-36.5 25.5T592-206L572-80H388Zm48-60h88l14-112q33-8 62.5-25t53.5-41l106 46 40-72-94-69q4-17 6.5-33.5T715-480q0-17-2-33.5t-7-33.5l94-69-40-72-106 46q-23-26-52-43.5T538-708l-14-112h-88l-14 112q-34 7-63.5 24T306-642l-106-46-40 72 94 69q-4 17-6.5 33.5T245-480q0 17 2.5 33.5T254-413l-94 69 40 72 106-46q24 24 53.5 41t62.5 25l14 112Zm44-210q54 0 92-38t38-92q0-54-38-92t-92-38q-54 0-92 38t-38 92q0 54 38 92t92 38Zm0-130Z",Space:"m187-551 106 45q18-36 38.5-71t43.5-67l-79-16-109 109Zm154 81 133 133q57-26 107-59t81-64q81-81 119-166t41-192q-107 3-192 41T464-658q-31 31-64 81t-59 107Zm229-96q-20-20-20-49.5t20-49.5q20-20 49.5-20t49.5 20q20 20 20 49.5T669-566q-20 20-49.5 20T570-566Zm-15 383 109-109-16-79q-32 23-67 43.5T510-289l45 106Zm326-694q9 136-34 248T705-418l-2 2-2 2 22 110q3 15-1.5 29T706-250L535-78l-85-198-170-170-198-85 172-171q11-11 25-15.5t29-1.5l110 22q1-1 2-1.5t2-1.5q99-99 211-142.5T881-877ZM149-325q35-35 85.5-35.5T320-326q35 35 34.5 85.5T319-155q-26 26-80.5 43T75-80q15-109 31.5-164t42.5-81Zm42 43q-14 15-25 47t-19 82q50-8 82-19t47-25q19-17 19.5-42.5T278-284q-19-18-44.5-17.5T191-282Z",State:"M820-240v-480h60v480h-60Zm-340 1-43-42 169-169H80v-60h526L438-679l42-42 241 241-241 241Z",Summary:"M279-621h60v-60h-60v60Zm0 171h60v-60h-60v60Zm0 171h60v-60h-60v60ZM120-120v-720h522l198 198v522H120Zm60-60h600v-429H609v-171H180v600Zm0-600v171.43V-780v600-600Z",Sync:"M167-160v-60h130l-15-12q-64-51-93-111t-29-134q0-106 62.5-190.5T387-784v62q-75 29-121 96.5T220-477q0 63 23.5 109.5T307-287l30 21v-124h60v230H167Zm407-15v-63q76-29 121-96.5T740-483q0-48-23.5-97.5T655-668l-29-26v124h-60v-230h230v60H665l15 14q60 56 90 120t30 123q0 106-62 191T574-175Z",Time:"m627-287 45-45-159-160v-201h-60v225l174 181ZM480-80q-82 0-155-31.5t-127.5-86Q143-252 111.5-325T80-480q0-82 31.5-155t86-127.5Q252-817 325-848.5T480-880q82 0 155 31.5t127.5 86Q817-708 848.5-635T880-480q0 82-31.5 155t-86 127.5Q708-143 635-111.5T480-80Zm0-400Zm0 340q140 0 240-100t100-240q0-140-100-240T480-820q-140 0-240 100T140-480q0 140 100 240t240 100Z",Trigger:"m393-165 279-335H492l36-286-253 366h154l-36 255Zm-73 85 40-280H160l360-520h80l-40 320h240L400-80h-80Zm154-396Z",Workshop:"M768-120 517-371l57-57 251 251-57 57Zm-581 0-57-57 290-290-107-107-23 23-44-44v85l-24 24-122-122 24-24h86l-48-48 131-131q17-17 37-23t44-6q24 0 44 8.5t37 25.5L348-699l48 48-24 24 104 104 122-122q-8-13-12.5-30t-4.5-36q0-53 38.5-91.5T711-841q15 0 25.5 3t17.5 8l-85 85 75 75 85-85q5 8 8.5 19.5T841-709q0 53-38.5 91.5T711-579q-18 0-31-2.5t-24-7.5L187-120Z"},gt=class gt{constructor(s,e){u(this,"componentId");u(this,"host");u(this,"parent");u(this,"options");u(this,"_element");u(this,"children",new Set);u(this,"_needsRefresh");this.componentId=gt.nextComponentId++,this.host=s.host,this.options=e,this.parent=s instanceof gt?s:null,this._needsRefresh=!1}set element(s){this._element=s,this._element[0].id=`KS${Object.getPrototypeOf(this).constructor.name}#${this.componentId}`}get element(){return p(this._element)}requestRefresh(s=!1,e=0,t=!1){var i,n,a;if(t&&console.debug(...v(e<0?"⤒".repeat(e*-1):" ".repeat(e),this.toString(),"requestRefresh()")),(n=(i=this.options)==null?void 0:i.onRefreshRequest)==null||n.call(this),this.parent!==this&&!s&&((a=this.parent)==null||a.requestRefresh(!1,e-1,t)),this._needsRefresh&&t&&console.debug(...v(e<0?"⤒".repeat(e*-1):" ".repeat(e),this.toString(),"requestRefresh() <already pending>")),this._needsRefresh=!0,s){t&&console.debug(...v(e<0?"⤒".repeat(e*-1):" ".repeat(e),this.toString(),"requestRefresh()",`+ ${this.children.size} children`));for(const r of this.children)r.requestRefresh(!0,e+1,t)}else t&&console.debug(...v(e<0?"⤒".repeat(e*-1):" ".repeat(e),this.toString(),"requestRefresh()","<queued>"))}refresh(s=!1,e=0){var t,i;if(!s&&!this._needsRefresh){e===0&&console.debug(...v(this.toString(),"refresh() received and ignored."));return}(i=(t=this.options)==null?void 0:t.onRefresh)==null||i.call(this);for(const n of this.children)n.refresh(s,e+1);this._needsRefresh=!1}addChild(s){return s.parent=this,this.children.add(s),this.element.append(s.element),this}addChildren(s){for(const e of s??[])this.addChild(e);return this}removeChild(s){this.children.has(s)&&(s.element.remove(),this.children.delete(s))}removeChildren(s){for(const e of s)this.removeChild(e)}};u(gt,"nextComponentId",0);let G=gt;class M extends G{constructor(s,e){super(s,{...e}),this.element=$("<div/>");for(const t of(e==null?void 0:e.classes)??[])this.element.addClass(t)}toString(){return`[${M.name}#${this.componentId}]`}}const B={label:"_label_1nlev_1",splitter:"_splitter_1nlev_16",iconLabel:"_iconLabel_1nlev_20",fillSpace:"_fillSpace_1nlev_26"},ke={delimiter:"_delimiter_16hnh_1"};class he extends G{constructor(s,e){super(s,{...e}),this.element=$("<li/>");for(const t of(e==null?void 0:e.classes)??[])this.element.addClass(t);(e==null?void 0:e.delimiter)===!0&&this.element.addClass(ke.delimiter)}toString(){return`[${he.name}#${this.componentId}]`}}const Et={head:"_head_wr1pj_1"};class ue extends he{constructor(e,t,i){super(e,i);u(this,"head");u(this,"elementLabel");if(this.head=new M(e),this.head.element.addClass(Et.head),this.addChild(this.head),this.elementLabel=$("<label/>",{text:`${(i==null?void 0:i.upgradeIndicator)===!0?"⮤ ":""}${t}`}).addClass(B.label).addClass(Et.label),this.head.element.append(this.elementLabel),i!=null&&i.icon){const n=$("<div/>",{html:`<svg style="width: 15px; height: 15px;" viewBox="0 -960 960 960" fill="currentColor"><path d="${i.icon}"/></svg>`}).addClass(B.iconLabel);this.elementLabel.prepend(n)}}toString(){return`[${ue.name}#${this.componentId}]: '${this.elementLabel.text()}'`}addChildHead(e){return this.head.addChild(e),this}addChildrenHead(e){for(const t of e??[])this.head.addChild(t);return this}}const D={setting:"_setting_1ndg5_1",checkbox:"_checkbox_1ndg5_6",panelContent:"_panelContent_1ndg5_10",hidden:"_hidden_1ndg5_17",checked:"_checked_1ndg5_22",expanded:"_expanded_1ndg5_26",readonly:"_readonly_1ndg5_34"};class S extends ue{constructor(e,t,i,n){super(e,i,{...n,onRefresh:()=>{var o;this.setting.enabled?this.element.addClass(D.checked):this.element.removeClass(D.checked),this.readOnly?this.element.addClass(D.readonly):this.element.removeClass(D.readonly),m(this.checkbox)||(this.checkbox.prop("checked",this.setting.enabled),this.checkbox.prop("disabled",this.readOnly)),(o=n==null?void 0:n.onRefresh)==null||o.call(n)}});u(this,"setting");u(this,"checkbox");u(this,"readOnly");this.element.addClass(D.setting);const a=`ks-setting${this.componentId}`,r=$("<input/>",{id:a,type:"checkbox"}).addClass(D.checkbox);this.readOnly=(n==null?void 0:n.readOnly)??!1,r.prop("disabled",this.readOnly),r.on("change",o=>{r.is(":checked")&&!t.enabled?this.check().catch(R(console)):!r.is(":checked")&&t.enabled&&this.uncheck().catch(R(console))}),this.elementLabel.before(r),this.elementLabel.prop("for",a),this.checkbox=r,this.setting=t}toString(){return`[${S.name}#${this.componentId}]: '${this.elementLabel.text()}'`}async check(e=!1){var t,i;this.setting.enabled=!0,await((i=(t=this.options)==null?void 0:t.onCheck)==null?void 0:i.call(e)),this.requestRefresh()}async uncheck(e=!1){var t;this.setting.enabled=!1,await((t=this.options.onUnCheck)==null?void 0:t.call(e)),this.requestRefresh()}}const C={iconButton:"_iconButton_q7zpt_17",inactive:"_inactive_q7zpt_29",ineffective:"_ineffective_q7zpt_37",button:"_button_q7zpt_43",readonly:"_readonly_q7zpt_67",buttonIcon:"_buttonIcon_q7zpt_72",alignRight:"_alignRight_q7zpt_77",large:"_large_q7zpt_81",bordered:"_bordered_q7zpt_85",headAction:"_headAction_q7zpt_97",lastHeadAction:"_lastHeadAction_q7zpt_100",consumeButton:"_consumeButton_q7zpt_104",stockButton:"_stockButton_q7zpt_107"};class ie extends G{constructor(e,t,i,n){super(e,{...n,onRefresh:()=>{var a;this.readOnly?this.element.addClass(C.readonly):this.element.removeClass(C.readonly),this.inactive?this.element.addClass(C.inactive):this.element.removeClass(C.inactive),(a=n==null?void 0:n.onRefresh)==null||a.call(n)}});u(this,"readOnly");u(this,"inactive");this.element=$("<div/>",{html:`<svg style="width: 18px; height: 18px;" viewBox="0 -960 960 960" fill="currentColor"><path d="${t}"/></svg>`,title:i}).addClass(C.iconButton),this.readOnly=(n==null?void 0:n.readOnly)??!1,this.inactive=(n==null?void 0:n.inactive)??!1,this.element.on("click",()=>{this.readOnly||this.click().catch(R(console))})}toString(){return`[${ie.name}#${this.componentId}]`}async click(){var e,t;this.readOnly||(await((t=(e=this.options)==null?void 0:e.onClick)==null?void 0:t.call(this)),this.requestRefresh())}}const Rt={listContainer:"_listContainer_1kxbq_1",itemsList:"_itemsList_1kxbq_5",list:"_list_1kxbq_1",listTools:"_listTools_1kxbq_9"};class x extends G{constructor(e,t){super(e,{...t});u(this,"list");u(this,"disableAllButton");u(this,"enableAllButton");u(this,"resetButton");const i={hasDisableAll:!0,hasEnableAll:!0,...t},n=i.hasDisableAll||i.hasEnableAll||!m(i.onReset);if(this.element=$("<div/>").addClass(Rt.listContainer),this.list=$("<ul/>").addClass(Rt.list).addClass(Rt.itemsList),this.element.append(this.list),n){const a=new M(this,{classes:[Rt.listTools]});i.hasEnableAll&&(this.enableAllButton=new ie(e,A.CheckboxCheck,e.host.engine.i18n("ui.enable.all"),{onClick:async()=>{var l;const o=new Event("enableAll",{cancelable:!0});if(this.element[0].dispatchEvent(o),!o.defaultPrevented){for(const h of this.children)ve(h,S)&&await h.check(!0);(l=t==null?void 0:t.onEnableAll)==null||l.call(this)}}}),a.addChild(this.enableAllButton)),i.hasDisableAll&&(this.disableAllButton=new ie(e,A.CheckboxUnCheck,e.host.engine.i18n("ui.disable.all"),{onClick:async()=>{var l;const o=new Event("disableAll",{cancelable:!0});if(this.element[0].dispatchEvent(o),!o.defaultPrevented){for(const h of this.children)ve(h,S)&&await h.uncheck(!0);(l=t==null?void 0:t.onDisableAll)==null||l.call(this)}}}),a.addChild(this.disableAllButton));const r=i.onReset;m(r)||(this.resetButton=new ie(e,A.Reset,e.host.engine.i18n("ui.reset"),{onClick:()=>{r()}}),a.addChild(this.resetButton)),super.addChild(a)}}toString(){return`[${x.name}#${this.componentId}]`}addChild(e){return e.parent=this,this.children.add(e),this.list.append(e.element),this}}const Ae={expandoButton:"_expandoButton_l1ukp_1",expanded:"_expanded_l1ukp_1",up:"_up_l1ukp_1",down:"_down_l1ukp_4"};class Mt extends G{constructor(e,t){super(e,{...t,onRefresh:()=>{var i;this.ineffective?this.element.addClass(C.ineffective):this.element.removeClass(C.ineffective),(i=t==null?void 0:t.onRefresh)==null||i.call(t)}});u(this,"readOnly");u(this,"inactive");u(this,"ineffective");this.element=$("<div/>",{html:`
|
|
18
|
+
<svg style="width: 18px; height: 18px;" viewBox="0 -960 960 960" fill="currentColor" class="${Ae.down}"><path d="${A.ExpandCircleDown}"/></svg>
|
|
19
|
+
<svg style="width: 18px; height: 18px;" viewBox="0 -960 960 960" fill="currentColor" class="${Ae.up}"><path d="${A.ExpandCircleUp}"/></svg>
|
|
20
|
+
`,title:e.host.engine.i18n("ui.itemsShow")}).addClass(C.iconButton).addClass(Ae.expandoButton),this.element.on("click",()=>{this.readOnly||this.click().catch(R(console))}),this.readOnly=(t==null?void 0:t.readOnly)??!1,this.inactive=(t==null?void 0:t.inactive)??!1,this.ineffective=!1}toString(){return`[${Mt.name}#${this.componentId}]`}setCollapsed(){this.element.removeClass(Ae.expanded),this.element.prop("title",this.host.engine.i18n("ui.itemsShow"))}setExpanded(){this.element.addClass(Ae.expanded),this.element.prop("title",this.host.engine.i18n("ui.itemsHide"))}async click(){var e,t;this.readOnly||(await((t=(e=this.options)==null?void 0:e.onClick)==null?void 0:t.call(this)),this.requestRefresh())}}class _e extends G{constructor(e,t,i){super(e,i);u(this,"container");u(this,"expando");u(this,"head");u(this,"_mainChildVisible");this.head=t,this.container=new M(this),this.container.element.addClass(D.panelContent);const n=new Mt(e,{onClick:()=>this.toggle()});t.head.addChild(n),t.element.append(this.container.element),i!=null&&i.initiallyExpanded?(this.container.element.removeClass(D.hidden),n.setExpanded()):this.container.element.addClass(D.hidden),this._mainChildVisible=(i==null?void 0:i.initiallyExpanded)??!1,this.element=t.element,this.expando=n,this.addChildren([this.head,this.container])}get isExpanded(){return this._mainChildVisible}toString(){return`[${_e.name}#${this.componentId}]`}addChildHead(e){return this.head.addChild(e),this}addChildrenHead(e){for(const t of e??[])this.head.addChild(t);return this}addChildContent(e){return this.container.addChild(e),this}addChildrenContent(e){for(const t of e??[])this.container.addChild(t);return this}toggle(e=void 0,t=!1){const i=e!==void 0?e:!this._mainChildVisible;if(i!==this._mainChildVisible&&(this._mainChildVisible=i,this._mainChildVisible?(this.container.requestRefresh(!0),this.container.element.removeClass(D.hidden),this.expando.setExpanded(),this.head.element.addClass(D.expanded),this.element[0].dispatchEvent(new CustomEvent("panelShown"))):(this.container.element.addClass(D.hidden),this.expando.setCollapsed(),this.head.element.removeClass(D.expanded),this.element[0].dispatchEvent(new CustomEvent("panelHidden")))),t){const n=a=>{for(const r of a)ve(r,_e)?r.toggle(e,t):n(r.children)};n(this.children)}}}class N extends _e{constructor(e,t,i,n){super(e,i,n);u(this,"setting");u(this,"settingItem");this.element=i.element,this.settingItem=i,this.setting=t}get isExpanded(){return this._mainChildVisible}get elementLabel(){return this.head.element}get readOnly(){return!0}set readOnly(e){}async check(){this.setting.enabled=!0,this.requestRefresh()}async uncheck(){this.setting.enabled=!1,this.requestRefresh()}toString(){return`[${N.name}#${this.componentId}]: '${this.settingItem.elementLabel.text()}'`}}class aa extends N{constructor(s,e,t,i){const n=s.host.engine.i18n("ui.upgrade.buildings");super(s,e,new S(s,e,n,{onCheck:o=>{s.host.engine.imessage("status.auto.enable",[n])},onUnCheck:o=>{s.host.engine.imessage("status.auto.disable",[n])}}).addChildrenHead([new M(s,{classes:[B.fillSpace]})]),{onRefreshRequest:()=>{this.expando.ineffective=i.enabled&&e.enabled&&!Object.values(e.buildings).some(o=>o.enabled)}});const a=[];for(const o of Object.values(this.setting.buildings)){const l=this.host.engine.i18n(`$buildings.${o.upgrade}.label`),h=new S(this,o,l,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[l])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[l])}});a.push({button:h,label:l})}a.sort((o,l)=>o.label.localeCompare(l.label));const r=new x(this);for(const o of a)r.addChild(o.button);this.addChildContent(r)}}class J extends G{constructor(e,t,i=null,n){super(e,{...n,onRefresh:()=>{var a;this.readOnly?this.element.addClass(C.readonly):this.element.removeClass(C.readonly),this.inactive?this.element.addClass(C.inactive):this.element.removeClass(C.inactive),this.ineffective?this.element.addClass(C.ineffective):this.element.removeClass(C.ineffective),(a=n==null?void 0:n.onRefresh)==null||a.call(n)}});u(this,"_iconElement");u(this,"readOnly");u(this,"inactive");u(this,"ineffective");this.element=$("<div/>",{title:n==null?void 0:n.title}).addClass(C.button).text(t),(n==null?void 0:n.border)!==!1&&this.element.addClass(C.bordered),(n==null?void 0:n.alignment)==="right"&&this.element.addClass(C.alignRight),i!==null&&(this._iconElement=$(`<svg class="${C.buttonIcon}" style="width: 18px; height: 18px;" viewBox="0 -960 960 960" fill="currentColor"><path d="${i}"/></svg>`),(n==null?void 0:n.alignment)==="right"?this.element.append(this._iconElement):this.element.prepend(this._iconElement));for(const a of(n==null?void 0:n.classes)??[])this.element.addClass(a);this.element.on("click",()=>{this.readOnly||this.click().catch(R(console))}),this.readOnly=(n==null?void 0:n.readOnly)??!1,this.inactive=(n==null?void 0:n.inactive)??!1,this.ineffective=!1}toString(){return`[${J.name}#${this.componentId}]`}updateLabel(e){this.element.text(e),this._iconElement!==void 0&&(this.options.alignment==="right"?this.element.append(this._iconElement):this.element.prepend(this._iconElement))}updateTitle(e){this.element.prop("title",e)}async click(){var e,t;this.readOnly||(await((t=(e=this.options)==null?void 0:e.onClick)==null?void 0:t.call(this)),this.requestRefresh())}}class te extends G{constructor(s){super(s,{}),this.element=$("<div/>").addClass(ke.delimiter)}toString(){return`[${te.name}#${this.componentId}]`}}const ys={dialog:"_dialog_1276o_1",close:"_close_1276o_7"},ws={explainer:"_explainer_1idu3_1"},ra={header:"_header_19ql8_1"};class q extends G{get elementLabel(){return this.element}constructor(s,e,t){super(s,{...t}),this.element=$("<li/>",{text:e}).addClass(ra.header)}toString(){return`[${q.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}class ti extends G{constructor(s,e){super(s,{...e}),this.element=$('<input type="text"/>').addClass("ks-input");for(const t of(e==null?void 0:e.classes)??[])this.element.addClass(t);e!=null&&e.onChange&&this.element.on("change",()=>{var t;return(t=e.onChange)==null?void 0:t.call(e,this.element[0].value)}),e!=null&&e.value&&(this.element[0].value=e.value),e!=null&&e.selected&&(this.element[0].selectionStart=0,this.element[0].selectionEnd=-1),this.element.on("keyup",t=>{var i,n;switch(t.key){case"Enter":(i=e==null?void 0:e.onEnter)==null||i.call(e,this.element[0].value);break;case"Escape":(n=e==null?void 0:e.onEscape)==null||n.call(e,this.element[0].value);break}})}toString(){return`[${ti.name}#${this.componentId}]`}}class Bt extends G{constructor(s,e,t){super(s,{...t}),this.element=$("<p/>").text(e);for(const i of(t==null?void 0:t.classes)??[])this.element.addClass(i)}toString(){return`[${Bt.name}#${this.componentId}]`}}const ks={toolbar:"_toolbar_1654f_1"};class E extends G{constructor(e,t){super(e,{...t});u(this,"container");u(this,"head");u(this,"returnValue");this.element=$("<dialog/>").addClass("dialog").addClass("help").addClass(ys.dialog),(t==null?void 0:t.hasClose)!==!1&&this.addChild(new J(e,"close",null,{classes:[ys.close],onClick:()=>{var i;this.close(),(i=t==null?void 0:t.onCancel)==null||i.call(t)}})),this.returnValue=(t==null?void 0:t.promptValue)??"",this.head=new M(e),this.container=new M(e),this.addChildren(ft([this.head,t!=null&&t.prompt?new ti(e,{onChange:i=>{this.returnValue=i},onEnter:i=>{var n;this.returnValue=i,this.close(),(n=t.onConfirm)==null||n.call(t,this.returnValue)},onEscape:i=>{var n;this.close(),(n=t.onCancel)==null||n.call(t)},selected:!0,value:t.promptValue}):void 0,this.container,new te(e),new M(e,{classes:[ks.toolbar]}).addChildren(ft([new J(e,"OK",null,{classes:[C.large],onClick:()=>{var i;this.close(),(i=t==null?void 0:t.onConfirm)==null||i.call(t,this.returnValue)}}),t!=null&&t.hasCancel?new J(e,"Cancel",null,{classes:[C.large],onClick:()=>{var i;this.close(),(i=t.onCancel)==null||i.call(t)}}):void 0]))]))}toString(){return`[${E.name}#${this.componentId}]`}addChildHead(e){return this.head.addChild(e),this}addChildrenHead(e){for(const t of e??[])this.head.addChild(t);return this}addChildContent(e){return this.container.addChild(e),this}addChildrenContent(e){for(const t of e??[])this.container.addChild(t);return this}show(){$("#gamePageContainer").append(this.element),this.element[0].show()}showModal(){$("#gamePageContainer").append(this.element),this.element[0].showModal()}close(){this.element[0].close(),this.element.remove()}static async prompt(e,t,i,n,a){return new Promise(r=>{new E(e,{hasCancel:!0,hasClose:!1,onCancel:()=>{r(void 0)},onConfirm:o=>{r(o)},prompt:!0,promptValue:n}).addChildrenHead(ft([i?new q(e,i):void 0,new Bt(e,t)])).addChildrenContent(a?[new M(e,{classes:[ws.explainer]}).addChildren([new Bt(e,a)])]:[]).showModal()})}}const oa={maxButton:"_maxButton_133h2_1"};class Pe extends J{constructor(e,t,i){super(e,"",null,{...i,classes:[oa.maxButton,...(i==null?void 0:i.classes)??[]]});u(this,"setting");this.setting=t}toString(){return`[${Pe.name}#${this.componentId}]`}}class Ee extends J{constructor(e,t,i,n){super(e,"",A.Trigger,{...n,onRefresh:()=>{var r,o;const a=this.behavior==="integer"?this.host.renderAbsolute(this.setting.trigger,"invariant"):this.host.renderPercentage(this.setting.trigger,"invariant",!0);this.updateTitle(this.host.engine.i18n("ui.trigger",[a])),(((r=this.options)==null?void 0:r.renderLabel)??!0)&&this.updateLabel(a),this.inactive?this.element.addClass(C.inactive):this.element.removeClass(C.inactive),(o=n==null?void 0:n.onRefresh)==null||o.call(this)}});u(this,"behavior");u(this,"setting");this.behavior=t instanceof V?"percentage":"integer",this.setting=t}toString(){return`[${Ee.name}#${this.componentId}]`}}class At extends S{constructor(e,t,i,n,a){super(e,t,n,a);u(this,"maxButton");u(this,"triggerButton");this.maxButton=new Pe(e,t,{alignment:"right",border:!1,classes:[C.headAction],onClick:async()=>{await a.onSetMax.call(this)},onRefresh:a!=null&&a.onRefreshMax?()=>{var r;return(r=a.onRefreshMax)==null?void 0:r.call(this)}:void 0}),this.triggerButton=new Ee(e,t,i,{border:!1,classes:[C.lastHeadAction],onClick:async()=>{await a.onSetTrigger.call(this)},onRefresh:a!=null&&a.onRefreshTrigger?()=>{var r;return(r=a.onRefreshTrigger)==null?void 0:r.call(this)}:void 0,renderLabel:(a==null?void 0:a.renderLabelTrigger)??!0}),this.addChildrenHead([new M(e,{classes:[B.fillSpace]}),this.maxButton,this.triggerButton])}toString(){return`[${At.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}const oe={getBuildOption:(c,s,e,t,i,n,a)=>{const r=async()=>{const l=await E.prompt(c,c.host.engine.i18n("ui.max.prompt.absolute"),c.host.engine.i18n("ui.max.build.prompt",[i,c.host.renderAbsolute(s.max,e.selected)]),c.host.renderAbsolute(s.max),c.host.engine.i18n("ui.max.build.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){s.max=-1;return}l==="0"&&(s.enabled=!1),s.max=c.host.parseAbsolute(l)??s.max}},o=new At(c,s,e,i,{delimiter:a==null?void 0:a.delimiter,onCheck:async l=>{var h;c.host.engine.imessage("status.sub.enable",[i]),s.max===0&&!l&&await r(),await((h=a==null?void 0:a.onCheck)==null?void 0:h.call(a,l))},onRefreshMax:()=>{o.maxButton.updateLabel(c.host.renderAbsolute(s.max)),o.maxButton.element[0].title=s.max<0?c.host.engine.i18n("ui.max.build.titleInfinite",[i]):s.max===0?c.host.engine.i18n("ui.max.build.titleZero",[i]):c.host.engine.i18n("ui.max.build.title",[c.host.renderAbsolute(s.max),i])},onRefreshRequest:()=>{o.maxButton.inactive=!s.enabled||s.max===-1,o.maxButton.ineffective=t.enabled&&s.enabled&&s.max===0,o.triggerButton.inactive=!s.enabled||s.trigger===-1,o.triggerButton.ineffective=t.enabled&&s.enabled&&t.trigger===-1&&s.trigger===-1},onRefreshTrigger:()=>{o.triggerButton.element[0].title=c.host.engine.i18n("ui.trigger",[s.trigger<0?t.trigger<0?c.host.engine.i18n("ui.trigger.build.blocked",[n]):`${c.host.renderPercentage(t.trigger,e.selected,!0)} (${c.host.engine.i18n("ui.trigger.build.inherited")})`:c.host.renderPercentage(s.trigger,e.selected,!0)])},onSetMax:r,onSetTrigger:async()=>{var h;const l=await E.prompt(c,c.host.engine.i18n("ui.trigger.prompt.percentage"),c.host.engine.i18n("ui.trigger.build.prompt",[i,s.trigger!==-1?c.host.renderPercentage(s.trigger,e.selected,!0):c.host.engine.i18n("ui.trigger.build.inherited")]),s.trigger!==-1?c.host.renderPercentage(s.trigger):"",c.host.engine.i18n("ui.trigger.build.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){s.trigger=-1;return}s.trigger=c.host.parsePercentage(l),await((h=a==null?void 0:a.onSetTrigger)==null?void 0:h.call(void 0))}},onUnCheck:l=>{var h;c.host.engine.imessage("status.sub.disable",[i]),(h=a==null?void 0:a.onUnCheck)==null||h.call(a,l)},renderLabelTrigger:a==null?void 0:a.renderLabelTrigger,upgradeIndicator:a==null?void 0:a.upgradeIndicator});return o}};class H extends S{constructor(e,t,i,n,a){super(e,t,n,a);u(this,"triggerButton");this.triggerButton=new Ee(e,t,i,{alignment:"right",border:!1,onClick:async()=>{await a.onSetTrigger.call(this)},onRefresh:a!=null&&a.onRefreshTrigger?()=>{var r;return(r=a.onRefreshTrigger)==null?void 0:r.call(this)}:void 0,renderLabel:(a==null?void 0:a.renderLabelTrigger)??!0}),this.addChildrenHead([new M(e,{classes:[B.fillSpace]}),this.triggerButton])}toString(){return`[${H.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}class ii extends N{constructor(s,e,t){console.debug(...v(`Constructing ${ii.name}`));const i=s.host.engine.i18n("ui.build");super(s,e,new H(s,e,t,i,{onCheck:n=>{s.host.engine.imessage("status.auto.enable",[i])},onRefreshTrigger:()=>{this.settingItem.triggerButton.element[0].title=s.host.engine.i18n("ui.trigger.section",[e.trigger<0?s.host.engine.i18n("ui.trigger.section.inactive"):s.host.renderPercentage(e.trigger,t.selected,!0)])},onSetTrigger:async()=>{const n=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.percentage"),s.host.engine.i18n("ui.trigger.section.prompt",[i,e.trigger!==-1?s.host.renderPercentage(e.trigger,t.selected,!0):s.host.engine.i18n("ui.infinity")]),e.trigger!==-1?s.host.renderPercentage(e.trigger):"",s.host.engine.i18n("ui.trigger.section.promptExplainer"));if(n!==void 0){if(n===""||n.startsWith("-")){e.trigger=-1;return}e.trigger=s.host.parsePercentage(n)}},onUnCheck:n=>{s.host.engine.imessage("status.auto.disable",[i])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!e.enabled||e.trigger<0,this.settingItem.triggerButton.ineffective=e.enabled&&e.trigger<0&&Object.values(e.buildings).some(n=>n.enabled&&0<n.max&&n.trigger<0),this.expando.ineffective=e.enabled&&Object.values(e.buildings).some(n=>n.enabled&&(n.max===0||n.trigger<0&&e.trigger<0))}}),this.addChildrenContent([new x(this,{onReset:()=>{this.setting.load({buildings:new Xt().buildings})}}).addChildren(ft(this.host.game.bld.buildingGroups.flatMap(n=>[new q(this,n.title),...n.buildings.flatMap(a=>this._getBuildOptions(this,e,t,i,a)),n!==this.host.game.bld.buildingGroups[this.host.game.bld.buildingGroups.length-1]?new te(this):void 0]))),new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new q(this,this.host.engine.i18n("ui.additional")),new S(this,e.gatherCatnip,this.host.engine.i18n("option.catnip"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.catnip")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.catnip")])}}),new S(this,e.turnOnSteamworks,this.host.engine.i18n("option.steamworks"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.steamworks")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.steamworks")])}}),new S(this,e.turnOnMagnetos,this.host.engine.i18n("option.magnetos"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.magnetos")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.magnetos")])}}),new S(this,e.turnOnReactors,this.host.engine.i18n("option.reactors"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.reactors")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.reactors")])}}),new aa(this,e.upgradeBuildings,t,e)])])}_getBuildOptions(s,e,t,i,n){var r;if(n==="unicornPasture"||m(e.buildings[n]))return[];const a=s.host.game.bld.getBuildingExt(n).meta;if(!m(a.stages)){const o=(r=Object.values(e.buildings).find(l=>l.baseBuilding===n))==null?void 0:r.building;return[oe.getBuildOption(s,e.buildings[n],t,e,a.stages[0].label,i,{renderLabelTrigger:!1}),oe.getBuildOption(s,e.buildings[o],t,e,a.stages[1].label,i,{renderLabelTrigger:!1,upgradeIndicator:!0})]}return m(a.label)?[]:[oe.getBuildOption(s,e.buildings[n],t,e,a.label,i,{renderLabelTrigger:!1})]}}class la extends S{constructor(e,t){const i=X(e.host.engine.i18n("ui.engine"));super(e,t,i,{onCheck:()=>{e.host.engine.start(!0)},onUnCheck:()=>{e.host.engine.stop(!0)}});u(this,"expando");this.expando=new Mt(this),this.addChildrenHead([new M(e,{classes:[B.fillSpace]}),this.expando])}}class si extends he{constructor(e,t,i){super(e,{...i});u(this,"button");this.button=t,this.element.addClass(Et.head),this.element.append(t.element)}}const ca={fieldset:"_fieldset_tfwil_1"};class ni extends G{constructor(s,e,t){super(s,{...t}),this.element=$("<fieldset/>").addClass(ca.fieldset),t!=null&&t.delimiter&&this.element.addClass(ke.delimiter);const i=$("<legend/>").text(e).addClass(B.label);this.element.append(i)}toString(){return`[${ni.name}#${this.componentId}]`}}class ai extends G{constructor(e,t,i,n,a){super(e,{...a,onRefresh:()=>{this.input.prop("disabled",this.readOnly)}});u(this,"setting");u(this,"option");u(this,"elementLabel");u(this,"input");u(this,"readOnly");this.element=$("<div/>"),this.element.addClass(D.setting),(a==null?void 0:a.delimiter)===!0&&this.element.addClass(ke.delimiter),this.elementLabel=$("<label/>",{text:`${a!=null&&a.upgradeIndicator?"⮤ ":""}${i.label}`}).addClass(B.label);const r=$("<input/>",{name:n,type:"radio"}).addClass("ks-radio");this.readOnly=(a==null?void 0:a.readOnly)??!1,r.on("change",()=>{this.setting.selected=i.value,m(a==null?void 0:a.onCheck)||a.onCheck()}),this.elementLabel.prepend(r),this.element.append(this.elementLabel),this.input=r,this.setting=t,this.option=i}toString(){return`[${ai.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}class Ie extends G{constructor(e,t,i,n){super(e,{...n,onRefresh:()=>{var a;for(const r of this._items)if(r.option.value===this.setting.selected){r.input.prop("checked",!0);break}(a=n==null?void 0:n.onRefresh)==null||a.call(n)}});u(this,"fieldset");u(this,"setting");u(this,"_items");this.element=$("<li/>"),this.fieldset=new ni(e,t),this.addChild(this.fieldset),this._items=new Array;for(const a of i.options)this._items.push(new ai(e,i,a,t,{onCheck:n==null?void 0:n.onCheck,readOnly:n==null?void 0:n.readOnly}));this.fieldset.addChildren(this._items),this.setting=i}toString(){return`[${Ie.name}#${this.componentId}]`}}const ha={textButton:"_textButton_1mv97_1"};class Ce extends G{constructor(e,t,i){super(e,{...i,onRefresh:()=>{var a;this.readOnly?this.element.addClass(C.readonly):this.element.removeClass(C.readonly),(a=i==null?void 0:i.onRefresh)==null||a.call(this)}});u(this,"readOnly");this.element=$("<div/>").addClass(ha.textButton),t!==void 0&&this.element.text(t);const n=i==null?void 0:i.title;m(n)||this.element.prop("title",n),this.readOnly=!1,this.element.on("click",()=>{this.readOnly||this.click().catch(R(console))})}toString(){return`[${Ce.name}#${this.componentId}]`}async click(){var e,t;this.readOnly||(await((t=(e=this.options)==null?void 0:e.onClick)==null?void 0:t.call(this)),this.requestRefresh())}}class ri extends N{constructor(s,e,t){console.debug(...v(`Constructing ${ri.name}`)),super(s,e,new ue(s,s.host.engine.i18n("ui.internals"),{classes:[D.checked,D.setting],icon:A.Settings}).addChildrenHead([new M(s,{classes:[B.fillSpace]})])),this.addChildrenContent([new x(s,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new si(s,new Ce(s,s.host.engine.i18n("ui.internals.interval",[e.interval]),{onClick:async()=>{const i=await E.prompt(s,s.host.engine.i18n("ui.internals.interval.prompt"),s.host.engine.i18n("ui.internals.interval.promptTitle",[s.host.renderAbsolute(e.interval,t.selected)]),s.host.renderAbsolute(e.interval),s.host.engine.i18n("ui.internals.interval.promptExplainer"));i===void 0||i===""||i.startsWith("-")||(i==="0"&&(e.enabled=!1),e.interval=s.host.parseAbsolute(i)??e.interval)},onRefresh(){this.element.text(s.host.engine.i18n("ui.internals.interval",[e.interval]))}})),new te(s),new S(s,e.ksColumn,s.host.engine.i18n("ui.ksColumn"),{onCheck:()=>{s.host.rebuildUi()},onUnCheck:()=>{s.host.rebuildUi()}}),new te(s),new Ie(s,s.host.engine.i18n("ui.language"),e.locale,{onCheck:()=>{s.host.rebuildUi()}}),new te(s),new ue(s,`Kitten Scientists ${Oe("v")}`)])])}}class oi extends G{constructor(s,e,t){super(s,{...t}),this.element=$("<li/>",{text:s.host.engine.i18n(e)}).addClass(ws.explainer)}toString(){return`[${oi.name}#${this.componentId}]`}}class li extends N{constructor(s,e){console.debug(...v(`Constructing ${li.name}`));const t=s.host.engine.i18n("ui.filter");super(s,e,new S(s,e,t,{onCheck:n=>{s.host.engine.imessage("status.auto.enable",[t])},onUnCheck:n=>{s.host.engine.imessage("status.auto.disable",[t])}}).addChildrenHead([new M(s,{classes:[B.fillSpace]})])),this.addChildContent(new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new S(this,e.disableKGLog,this.host.engine.i18n("filter.allKG"))]));const i=new x(this).addChildren(os.map(n=>({label:this.host.engine.i18n(`filter.${n}`),name:n})).sort((n,a)=>n.label.localeCompare(a.label)).map(n=>new S(this,this.setting.filters[n.name],n.label,{onCheck:()=>{this.host.engine.imessage("filter.enable",[n.label])},onUnCheck:()=>{this.host.engine.imessage("filter.disable",[n.label])}})));this.addChildContent(i),this.addChildContent(new oi(this,"filter.explainer"))}}const Pt={active:"_active_6c09s_16"};class ci extends N{constructor(e,t,i){console.debug(...v(`Constructing ${ci.name}`));const n=e.host.engine.i18n("ui.faith");super(e,t,new H(e,t,i,n,{onCheck:r=>{e.host.engine.imessage("status.auto.enable",[n])},onRefreshTrigger(){this.triggerButton.element[0].title=e.host.engine.i18n("ui.trigger.section",[t.trigger<0?e.host.engine.i18n("ui.trigger.section.inactive"):e.host.renderPercentage(t.trigger,i.selected,!0)])},onSetTrigger:async()=>{const r=await E.prompt(e,e.host.engine.i18n("ui.trigger.prompt.percentage"),e.host.engine.i18n("ui.trigger.section.prompt",[n,t.trigger!==-1?e.host.renderPercentage(t.trigger,i.selected,!0):e.host.engine.i18n("ui.infinity")]),t.trigger!==-1?e.host.renderPercentage(t.trigger):"",e.host.engine.i18n("ui.trigger.section.promptExplainer"));if(r!==void 0){if(r===""||r.startsWith("-")){t.trigger=-1;return}t.trigger=e.host.parsePercentage(r)}},onUnCheck:r=>{e.host.engine.imessage("status.auto.disable",[n])},renderLabelTrigger:!1}),{onRefresh:()=>{for(const[r,o]of this._unicornBuildings.entries())o.elementLabel.attr("data-ks-active-from","❊"),o.elementLabel.attr("data-ks-active-to","✮"),this.setting.bestUnicornBuilding.enabled&&this.setting.bestUnicornBuildingCurrent===r?o.elementLabel.addClass(Pt.active):o.elementLabel.removeClass(Pt.active)},onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!t.enabled||t.trigger===-1,this.settingItem.triggerButton.ineffective=t.enabled&&t.trigger<0&&Object.values(t.buildings).some(r=>r.enabled&&0<r.max&&r.trigger<0),this.expando.ineffective=t.enabled&&Object.values(t.buildings).some(r=>r.enabled&&(r.max===0||r.trigger<0&&t.trigger<0));for(const[r,o]of this._unicornBuildings.entries())o.readOnly=this._bestUnicornBuilding.setting.enabled,o.maxButton.readOnly=this._bestUnicornBuilding.setting.enabled,o.triggerButton.readOnly=this._bestUnicornBuilding.setting.enabled}});u(this,"_unicornBuildings");u(this,"_bestUnicornBuilding");const a=[...kt];this._unicornBuildings=new Map([["unicornPasture",oe.getBuildOption(this,this.setting.buildings.unicornPasture,i,this.setting,this.host.engine.i18n("$buildings.unicornPasture.label"),n,{renderLabelTrigger:!1})],...this.host.game.religion.zigguratUpgrades.filter(r=>a.includes(r.name)&&!m(this.setting.buildings[r.name])).map(r=>[r.name,oe.getBuildOption(this,this.setting.buildings[r.name],i,this.setting,r.label,n,{renderLabelTrigger:!1})])]),this._bestUnicornBuilding=new S(this,this.setting.bestUnicornBuilding,this.host.engine.i18n("option.faith.best.unicorn"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.faith.best.unicorn")]);for(const r of this._unicornBuildings.values())r.setting.enabled=!0,r.setting.max=-1,r.setting.trigger=-1},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.faith.best.unicorn")])},upgradeIndicator:!0}),this.addChildrenContent([new x(this,{onReset:()=>{const r=new Yt;this.setting.load({bestUnicornBuilding:r.bestUnicornBuilding,buildings:r.buildings})}}).addChildren([new q(this,this.host.engine.i18n("$religion.panel.ziggurat.label")),...this._unicornBuildings.values(),this._bestUnicornBuilding,new te(this),...this.host.game.religion.zigguratUpgrades.filter(r=>!a.includes(r.name)&&!m(this.setting.buildings[r.name])).map(r=>oe.getBuildOption(this,this.setting.buildings[r.name],i,this.setting,r.label,n,{renderLabelTrigger:!1})),new te(this),new q(this,this.host.engine.i18n("$religion.panel.orderOfTheSun.label")),...this.host.game.religion.religionUpgrades.filter(r=>!m(this.setting.buildings[r.name])).map(r=>{var o;return oe.getBuildOption(this,this.setting.buildings[r.name],i,this.setting,r.label,n,{delimiter:r.name===((o=this.host.game.religion.religionUpgrades.at(-1))==null?void 0:o.name),renderLabelTrigger:!1})}),new q(this,this.host.engine.i18n("$religion.panel.cryptotheology.label")),...this.host.game.religion.transcendenceUpgrades.filter(r=>!m(this.setting.buildings[r.name])).map(r=>oe.getBuildOption(this,this.setting.buildings[r.name],i,this.setting,r.label,n,{renderLabelTrigger:!1}))]),new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new q(this,this.host.engine.i18n("ui.additional")),...Ys.map(r=>{const o=this.host.engine.i18n(`option.faith.${r}`);if(r==="transcend")return new S(this,this.setting[r],o,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[o])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[o])}});const l=new H(this,this.setting[r],i,o,{classes:[C.lastHeadAction],onCheck:()=>{this.host.engine.imessage("status.sub.enable",[o])},onRefresh:()=>{l.triggerButton.inactive=!this.setting[r].enabled||this.setting[r].trigger===-1},onSetTrigger:async()=>{const h=await E.prompt(this,this.host.engine.i18n(l.triggerButton.behavior==="integer"?"ui.trigger.setinteger":"ui.trigger.setpercentage",[o]),this.host.engine.i18n("ui.trigger.build.prompt",[o,l.triggerButton.behavior==="integer"?this.host.renderAbsolute(this.setting[r].trigger,i.selected):this.host.renderPercentage(this.setting[r].trigger,i.selected,!0)]),l.triggerButton.behavior==="integer"?this.host.renderAbsolute(this.setting[r].trigger):this.host.renderPercentage(this.setting[r].trigger),this.host.engine.i18n(l.triggerButton.behavior==="integer"?"ui.trigger.setinteger.promptExplainer":"ui.trigger.setpercentage.promptExplainer"));h===void 0||h===""||h.startsWith("-")||(this.setting[r].trigger=(l.triggerButton.behavior==="integer"?this.host.parseAbsolute(h):this.host.parsePercentage(h))??this.setting[r].trigger)},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[o])}});return l.triggerButton.element.addClass(C.lastHeadAction),l})])])}}class hi extends J{constructor(e,t,i,n,a){super(e,"",A.DataUsage,{...a,onClick:async()=>{const r=await E.prompt(e,e.host.engine.i18n("resources.consume.prompt"),e.host.engine.i18n("resources.consume.promptTitle",[n,e.host.renderPercentage(t.consume,i.selected,!0)]),e.host.renderPercentage(t.consume),e.host.engine.i18n("resources.consume.promptExplainer"));r!==void 0&&(r===""||r.startsWith("-")||(t.consume=e.host.parsePercentage(r)))},onRefresh:()=>{var l;const r=this.host.renderPercentage(this.setting.consume,this.host.engine.settings.locale.selected,!0),o=this.setting.consume===0?this.host.engine.i18n("resources.consume.titleZero",[this.resourceName]):this.host.engine.i18n("resources.consume.title",[r,this.resourceName]);this.updateTitle(o),(l=a==null?void 0:a.onRefresh)==null||l.call(a)}});u(this,"setting");u(this,"resourceName");this.element.addClass(C.consumeButton),this.resourceName=n,this.setting=t}toString(){return`[${hi.name}#${this.componentId}]`}}class ui extends J{constructor(e,t,i,n,a){super(e,"",null,{...a,onClick:async()=>{const r=await E.prompt(e,e.host.engine.i18n("resources.stock.prompt"),e.host.engine.i18n("resources.stock.promptTitle",[n,e.host.renderAbsolute(t.stock,i.selected)]),e.host.renderAbsolute(t.stock),e.host.engine.i18n("resources.stock.promptExplainer"));if(r!==void 0){if(r===""||r.startsWith("-")){t.stock=-1;return}r==="0"&&(t.enabled=!1),t.stock=e.host.parseAbsolute(r)??t.stock}},onRefresh:()=>{const r=this.host.renderAbsolute(this.setting.stock),o=this.setting.stock<0?this.host.engine.i18n("resources.stock.titleInfinite",[this.resourceName]):this.setting.stock===0?this.host.engine.i18n("resources.stock.titleZero",[this.resourceName]):this.host.engine.i18n("resources.stock.title",[this.host.renderAbsolute(this.setting.stock),this.resourceName]);this.updateTitle(o),this.updateLabel(r)}});u(this,"setting");u(this,"resourceName");this.element.addClass(C.stockButton),this.resourceName=n,this.setting=t}toString(){return`[${ui.name}#${this.componentId}]`}}class di extends N{constructor(s,e,t){console.debug(...v(`Constructing ${di.name}`));const i=s.host.engine.i18n("ui.resources");super(s,e,new ue(s,i,{classes:[D.checked,D.setting],icon:A.Resources}).addChildrenHead([new M(s,{classes:[B.fillSpace]})]));const n=["blackcoin","burnedParagon","elderBox","gflops","hashrates","kittens","paragon","temporalFlux","wrappingPaper","zebras"];this.addChildContent(new x(this).addChildren(this.host.game.resPool.resources.filter(a=>!n.includes(a.name)&&!m(this.setting.resources[a.name])).sort((a,r)=>a.title.localeCompare(r.title,t.selected)).map(a=>[this.setting.resources[a.name],X(a.title)]).map(([a,r])=>this._makeResourceSetting(this,a,t,r))))}_makeResourceSetting(s,e,t,i){const n=new S(s,e,i,{onCheck:()=>{s.host.engine.imessage("status.resource.enable",[i])},onUnCheck:()=>{s.host.engine.imessage("status.resource.disable",[i])}}).addChildrenHead([new M(s,{classes:[B.fillSpace]})]),a=new ui(s,e,t,i,{alignment:"right",border:!1,classes:[C.headAction],onRefreshRequest:()=>{a.inactive=!e.enabled||e.stock===0}});n.head.addChild(a);const r=new hi(s,e,t,i,{border:!1,classes:[C.lastHeadAction],onRefreshRequest:()=>{r.inactive=!e.enabled||e.consume!==100,r.ineffective=e.enabled&&e.consume===0}});return n.head.addChild(r),n}}class ua extends N{constructor(s,e,t,i){const n=s.host.engine.i18n("ui.upgrade.policies");super(s,e,new S(s,e,n,{onCheck:l=>{s.host.engine.imessage("status.auto.enable",[n])},onUnCheck:l=>{s.host.engine.imessage("status.auto.disable",[n])}}).addChildrenHead([new M(s,{classes:[B.fillSpace]})]),{onRefreshRequest:()=>{this.expando.ineffective=i.enabled&&e.enabled&&!Object.values(e.policies).some(l=>l.enabled)}});const a=this.host.game.science.policies.filter(l=>!m(this.setting.policies[l.name])),r=[];let o=a[0].label;for(const l of a.sort((h,d)=>h.label.localeCompare(d.label,t.selected))){const h=this.setting.policies[l.name],d=new S(this,h,l.label,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[l.label])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[l.label])}});this.host.engine.localeSupportsFirstLetterSplits(t.selected)&&o[0]!==l.label[0]&&d.element.addClass(B.splitter),r.push(d),o=l.label}this.addChildContent(new x(this).addChildren(r))}}class da extends N{constructor(s,e,t,i){const n=s.host.engine.i18n("ui.upgrade.techs");super(s,e,new H(s,e,t,n,{onCheck:l=>{s.host.engine.imessage("status.auto.enable",[n])},onRefreshTrigger(){this.triggerButton.element[0].title=s.host.engine.i18n("ui.trigger",[e.trigger<0?s.host.engine.i18n("ui.trigger.section.inactive"):s.host.renderPercentage(e.trigger,t.selected,!0)])},onSetTrigger:async()=>{const l=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.percentage"),s.host.engine.i18n("ui.trigger.section.prompt",[n,e.trigger!==-1?s.host.renderPercentage(e.trigger,t.selected,!0):s.host.engine.i18n("ui.infinity")]),e.trigger!==-1?s.host.renderPercentage(e.trigger):"",s.host.engine.i18n("ui.trigger.section.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){e.trigger=-1;return}e.trigger=s.host.parsePercentage(l)}},onUnCheck:l=>{s.host.engine.imessage("status.auto.disable",[n])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!e.enabled||e.trigger===-1,this.settingItem.triggerButton.ineffective=i.enabled&&e.enabled&&e.trigger===-1&&!Object.values(e.techs).some(l=>l.enabled&&0<=l.trigger),this.expando.ineffective=i.enabled&&e.enabled&&!Object.values(e.techs).some(l=>l.enabled)}});const a=this.host.game.science.techs.filter(l=>!m(this.setting.techs[l.name])),r=[];let o=a[0].label;for(const l of a.sort((h,d)=>h.label.localeCompare(d.label,t.selected))){const h=this.setting.techs[l.name],d=new H(this,h,t,l.label,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[l.label])},onRefresh:()=>{d.triggerButton.inactive=!h.enabled||h.trigger===-1,d.triggerButton.ineffective=i.enabled&&e.enabled&&h.enabled&&e.trigger===-1&&h.trigger===-1},onRefreshTrigger:()=>{d.triggerButton.element[0].title=this.host.engine.i18n("ui.trigger",[h.trigger<0?e.trigger<0?this.host.engine.i18n("ui.trigger.section.blocked",[n]):`${this.host.renderPercentage(e.trigger,t.selected,!0)} (${this.host.engine.i18n("ui.trigger.section.inherited")})`:this.host.renderPercentage(h.trigger,t.selected,!0)])},onSetTrigger:async()=>{const g=await E.prompt(this,this.host.engine.i18n("ui.trigger.prompt.percentage"),this.host.engine.i18n("ui.trigger.section.prompt",[n,h.trigger!==-1?this.host.renderPercentage(h.trigger,t.selected,!0):this.host.engine.i18n("ui.trigger.section.inherited")]),h.trigger!==-1?this.host.renderPercentage(h.trigger):"",this.host.engine.i18n("ui.trigger.section.promptExplainer"));if(g!==void 0){if(g===""||g.startsWith("-")){h.trigger=-1;return}h.trigger=this.host.parsePercentage(g)}},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[l.label])},renderLabelTrigger:!1});d.triggerButton.element.addClass(C.lastHeadAction),this.host.engine.localeSupportsFirstLetterSplits(t.selected)&&o[0]!==l.label[0]&&d.element.addClass(B.splitter),r.push(d),o=l.label}this.addChildContent(new x(this).addChildren(r))}}class gi extends N{constructor(e,t,i){console.debug(...v(`Constructing ${gi.name}`));const n=e.host.engine.i18n("ui.upgrade");super(e,t,new S(e,t,n,{onCheck:r=>{e.host.engine.imessage("status.auto.enable",[n])},onUnCheck:r=>{e.host.engine.imessage("status.auto.disable",[n])}}).addChildrenHead([new M(e,{classes:[B.fillSpace]})]),{onRefresh:()=>{this.setting.observe.enabled?$("#observeButton").hide():$("#observeButton").show()},onRefreshRequest:()=>{this.expando.ineffective=t.enabled&&(this.setting.policies.enabled&&this._policiesUi.expando.ineffective||this.setting.techs.enabled&&(this._techsUi.expando.ineffective||this._techsUi.settingItem.triggerButton.ineffective))}});u(this,"_policiesUi");u(this,"_techsUi");u(this,"_observeStars");this._policiesUi=new ua(this,t.policies,i,t),this._techsUi=new da(this,t.techs,i,t),this._observeStars=new S(this,this.setting.observe,this.host.engine.i18n("option.observe"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.observe")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.observe")])}});const a=new x(this,{hasDisableAll:!1,hasEnableAll:!1});a.addChildren([this._techsUi,this._policiesUi,this._observeStars]),this.addChildContent(a)}}class ga extends N{constructor(e,t,i,n){const a=e.host.engine.i18n("ui.upgrade.missions");super(e,t,new S(e,t,a,{onCheck:o=>{e.host.engine.imessage("status.auto.enable",[a])},onRefresh:()=>{this.expando.ineffective=n.enabled&&t.enabled&&!Object.values(t.missions).some(o=>o.enabled)},onUnCheck:o=>{e.host.engine.imessage("status.auto.disable",[a])}}).addChildrenHead([new M(e,{classes:[B.fillSpace]})]));u(this,"_missions");this._missions=this.host.game.space.programs.filter(o=>!m(this.setting.missions[o.name])).map(o=>new S(this,this.setting.missions[o.name],o.label,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[o.label])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[o.label])}}));const r=new x(this).addChildren(this._missions);this.addChildContent(r)}}class mi extends N{constructor(e,t,i){console.debug(...v(`Constructing ${mi.name}`));const n=e.host.engine.i18n("ui.space");super(e,t,new H(e,t,i,n,{onCheck:r=>{e.host.engine.imessage("status.auto.enable",[n])},onRefreshTrigger(){this.triggerButton.element[0].title=e.host.engine.i18n("ui.trigger.section",[t.trigger<0?e.host.engine.i18n("ui.trigger.section.inactive"):e.host.renderPercentage(t.trigger,i.selected,!0)])},onSetTrigger:async()=>{const r=await E.prompt(e,e.host.engine.i18n("ui.trigger.prompt.percentage"),e.host.engine.i18n("ui.trigger.section.prompt",[n,t.trigger!==-1?e.host.renderPercentage(t.trigger,i.selected,!0):e.host.engine.i18n("ui.infinity")]),t.trigger!==-1?e.host.renderPercentage(t.trigger):"",e.host.engine.i18n("ui.trigger.section.promptExplainer"));if(r!==void 0){if(r===""||r.startsWith("-")){t.trigger=-1;return}t.trigger=e.host.parsePercentage(r)}},onUnCheck:r=>{e.host.engine.imessage("status.auto.disable",[n])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!t.enabled||t.trigger===-1,this.settingItem.triggerButton.ineffective=t.enabled&&t.trigger<0&&Object.values(t.buildings).some(r=>r.enabled&&0<r.max&&r.trigger<0),this.expando.ineffective=t.enabled&&(Object.values(t.buildings).some(r=>r.enabled&&(r.max===0||r.trigger<0&&t.trigger<0))||!Object.values(t.buildings).some(r=>r.enabled)&&!t.unlockMissions.enabled||this._missionsUi.expando.ineffective)}});u(this,"_missionsUi");this.addChildContent(new x(this,{onReset:()=>{this.setting.load({buildings:new St().buildings})}}).addChildren(this.host.game.space.planets.filter(r=>0<r.buildings.length).flatMap((r,o,l)=>[new q(this,this.host.engine.labelForPlanet(r.name)),...r.buildings.filter(h=>!m(this.setting.buildings[h.name])).map((h,d,g)=>oe.getBuildOption(this,this.setting.buildings[h.name],i,this.setting,h.label,n,{delimiter:o<l.length-1&&d===g.length-1,renderLabelTrigger:!1}))])));const a=new x(this,{hasDisableAll:!1,hasEnableAll:!1});a.addChild(new q(this,this.host.engine.i18n("ui.additional"))),this._missionsUi=new ga(this,this.setting.unlockMissions,i,this.setting),a.addChild(this._missionsUi),this.addChildContent(a)}}class fi extends fe{constructor(s,e=400){super("ERR_OS_INVALID_ARGUMENT",s,e),this.name="InvalidArgumentError",typeof Error.captureStackTrace<"u"&&Error.captureStackTrace(this,fi)}}const It=43200,_s=1440,Cs=Symbol.for("constructDateFrom");function bi(c,s){return typeof c=="function"?c(s):c&&typeof c=="object"&&Cs in c?c[Cs](s):c instanceof Date?new c.constructor(s):new Date(s)}function ma(c){return bi(c,Date.now())}const fa={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"}},ba=(c,s,e)=>{let t;const i=fa[c];return typeof i=="string"?t=i:s===1?t=i.one:t=i.other.replace("{{count}}",s.toString()),e!=null&&e.addSuffix?e.comparison&&e.comparison>0?"in "+t:t+" ago":t};function se(c){return(s={})=>{const e=s.width?String(s.width):c.defaultWidth;return c.formats[e]||c.formats[c.defaultWidth]}}const pa={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},va={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},ya={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},wa={date:se({formats:pa,defaultWidth:"full"}),time:se({formats:va,defaultWidth:"full"}),dateTime:se({formats:ya,defaultWidth:"full"})},ka={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},_a=(c,s,e,t)=>ka[c];function Z(c){return(s,e)=>{const t=e!=null&&e.context?String(e.context):"standalone";let i;if(t==="formatting"&&c.formattingValues){const a=c.defaultFormattingWidth||c.defaultWidth,r=e!=null&&e.width?String(e.width):a;i=c.formattingValues[r]||c.formattingValues[a]}else{const a=c.defaultWidth,r=e!=null&&e.width?String(e.width):c.defaultWidth;i=c.values[r]||c.values[a]}const n=c.argumentCallback?c.argumentCallback(s):s;return i[n]}}const Ca={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},Sa={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},xa={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"]},Ta={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"]},Ea={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"}},Ra={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"}},Ma={ordinalNumber:(c,s)=>{const e=Number(c),t=e%100;if(t>20||t<10)switch(t%10){case 1:return e+"st";case 2:return e+"nd";case 3:return e+"rd"}return e+"th"},era:Z({values:Ca,defaultWidth:"wide"}),quarter:Z({values:Sa,defaultWidth:"wide",argumentCallback:c=>c-1}),month:Z({values:xa,defaultWidth:"wide"}),day:Z({values:Ta,defaultWidth:"wide"}),dayPeriod:Z({values:Ea,defaultWidth:"wide",formattingValues:Ra,defaultFormattingWidth:"wide"})};function K(c){return(s,e={})=>{const t=e.width,i=t&&c.matchPatterns[t]||c.matchPatterns[c.defaultMatchWidth],n=s.match(i);if(!n)return null;const a=n[0],r=t&&c.parsePatterns[t]||c.parsePatterns[c.defaultParseWidth],o=Array.isArray(r)?Aa(r,d=>d.test(a)):Ba(r,d=>d.test(a));let l;l=c.valueCallback?c.valueCallback(o):o,l=e.valueCallback?e.valueCallback(l):l;const h=s.slice(a.length);return{value:l,rest:h}}}function Ba(c,s){for(const e in c)if(Object.prototype.hasOwnProperty.call(c,e)&&s(c[e]))return e}function Aa(c,s){for(let e=0;e<c.length;e++)if(s(c[e]))return e}function $t(c){return(s,e={})=>{const t=s.match(c.matchPattern);if(!t)return null;const i=t[0],n=s.match(c.parsePattern);if(!n)return null;let a=c.valueCallback?c.valueCallback(n[0]):n[0];a=e.valueCallback?e.valueCallback(a):a;const r=s.slice(i.length);return{value:a,rest:r}}}const Pa=/^(\d+)(th|st|nd|rd)?/i,Ia=/\d+/i,$a={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},La={any:[/^b/i,/^(a|c)/i]},Oa={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},Ua={any:[/1/i,/2/i,/3/i,/4/i]},Da={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},Na={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]},qa={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},za={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]},Fa={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},Ha={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}},Wa={ordinalNumber:$t({matchPattern:Pa,parsePattern:Ia,valueCallback:c=>parseInt(c,10)}),era:K({matchPatterns:$a,defaultMatchWidth:"wide",parsePatterns:La,defaultParseWidth:"any"}),quarter:K({matchPatterns:Oa,defaultMatchWidth:"wide",parsePatterns:Ua,defaultParseWidth:"any",valueCallback:c=>c+1}),month:K({matchPatterns:Da,defaultMatchWidth:"wide",parsePatterns:Na,defaultParseWidth:"any"}),day:K({matchPatterns:qa,defaultMatchWidth:"wide",parsePatterns:za,defaultParseWidth:"any"}),dayPeriod:K({matchPatterns:Fa,defaultMatchWidth:"any",parsePatterns:Ha,defaultParseWidth:"any"})},Ss={code:"en-US",formatDistance:ba,formatLong:wa,formatRelative:_a,localize:Ma,match:Wa,options:{weekStartsOn:0,firstWeekContainsDate:1}};let Ga={};function xs(){return Ga}function me(c,s){return bi(s||c,c)}function Ts(c){const s=me(c),e=new Date(Date.UTC(s.getFullYear(),s.getMonth(),s.getDate(),s.getHours(),s.getMinutes(),s.getSeconds(),s.getMilliseconds()));return e.setUTCFullYear(s.getFullYear()),+c-+e}function Lt(c,...s){const e=bi.bind(null,c||s.find(t=>typeof t=="object"));return s.map(e)}function Ot(c,s){const e=+me(c)-+me(s);return e<0?-1:e>0?1:e}function Za(c,s,e){const[t,i]=Lt(e==null?void 0:e.in,c,s),n=t.getFullYear()-i.getFullYear(),a=t.getMonth()-i.getMonth();return n*12+a}function Ka(c,s){const e=me(c,s==null?void 0:s.in);return e.setHours(23,59,59,999),e}function Va(c,s){const e=me(c,s==null?void 0:s.in),t=e.getMonth();return e.setFullYear(e.getFullYear(),t+1,0),e.setHours(23,59,59,999),e}function ja(c,s){const e=me(c,s==null?void 0:s.in);return+Ka(e,s)==+Va(e,s)}function Ja(c,s,e){const[t,i,n]=Lt(e==null?void 0:e.in,c,c,s),a=Ot(i,n),r=Math.abs(Za(i,n));if(r<1)return 0;i.getMonth()===1&&i.getDate()>27&&i.setDate(30),i.setMonth(i.getMonth()-a*r);let o=Ot(i,n)===-a;ja(t)&&r===1&&Ot(t,n)===1&&(o=!1);const l=a*(r-+o);return l===0?0:l}function Xa(c){return s=>{const t=(c?Math[c]:Math.trunc)(s);return t===0?0:t}}function Ya(c,s){return+me(c)-+me(s)}function Qa(c,s,e){const t=Ya(c,s)/1e3;return Xa(e==null?void 0:e.roundingMethod)(t)}function er(c,s,e){const t=xs(),i=(e==null?void 0:e.locale)??t.locale??Ss,n=2520,a=Ot(c,s);if(isNaN(a))throw new RangeError("Invalid time value");const r=Object.assign({},e,{addSuffix:e==null?void 0:e.addSuffix,comparison:a}),[o,l]=Lt(e==null?void 0:e.in,...a>0?[s,c]:[c,s]),h=Qa(l,o),d=(Ts(l)-Ts(o))/1e3,g=Math.round((h-d)/60);let f;if(g<2)return e!=null&&e.includeSeconds?h<5?i.formatDistance("lessThanXSeconds",5,r):h<10?i.formatDistance("lessThanXSeconds",10,r):h<20?i.formatDistance("lessThanXSeconds",20,r):h<40?i.formatDistance("halfAMinute",0,r):h<60?i.formatDistance("lessThanXMinutes",1,r):i.formatDistance("xMinutes",1,r):g===0?i.formatDistance("lessThanXMinutes",1,r):i.formatDistance("xMinutes",g,r);if(g<45)return i.formatDistance("xMinutes",g,r);if(g<90)return i.formatDistance("aboutXHours",1,r);if(g<_s){const w=Math.round(g/60);return i.formatDistance("aboutXHours",w,r)}else{if(g<n)return i.formatDistance("xDays",1,r);if(g<It){const w=Math.round(g/_s);return i.formatDistance("xDays",w,r)}else if(g<It*2)return f=Math.round(g/It),i.formatDistance("aboutXMonths",f,r)}if(f=Ja(l,o),f<12){const w=Math.round(g/It);return i.formatDistance("xMonths",w,r)}else{const w=f%12,b=Math.trunc(f/12);return w<3?i.formatDistance("aboutXYears",b,r):w<9?i.formatDistance("overXYears",b,r):i.formatDistance("almostXYears",b+1,r)}}function Es(c,s){return er(c,ma(c),s)}function Rs(c,s){var r,o,l,h;const e=xs(),t=(s==null?void 0:s.weekStartsOn)??((o=(r=s==null?void 0:s.locale)==null?void 0:r.options)==null?void 0:o.weekStartsOn)??e.weekStartsOn??((h=(l=e.locale)==null?void 0:l.options)==null?void 0:h.weekStartsOn)??0,i=me(c,s==null?void 0:s.in),n=i.getDay(),a=(n<t?7:0)+n-t;return i.setDate(i.getDate()-a),i.setHours(0,0,0,0),i}function tr(c,s,e){const[t,i]=Lt(e==null?void 0:e.in,c,s);return+Rs(t,e)==+Rs(i,e)}const Ms={lessThanXSeconds:{standalone:{one:"weniger als 1 Sekunde",other:"weniger als {{count}} Sekunden"},withPreposition:{one:"weniger als 1 Sekunde",other:"weniger als {{count}} Sekunden"}},xSeconds:{standalone:{one:"1 Sekunde",other:"{{count}} Sekunden"},withPreposition:{one:"1 Sekunde",other:"{{count}} Sekunden"}},halfAMinute:{standalone:"eine halbe Minute",withPreposition:"einer halben Minute"},lessThanXMinutes:{standalone:{one:"weniger als 1 Minute",other:"weniger als {{count}} Minuten"},withPreposition:{one:"weniger als 1 Minute",other:"weniger als {{count}} Minuten"}},xMinutes:{standalone:{one:"1 Minute",other:"{{count}} Minuten"},withPreposition:{one:"1 Minute",other:"{{count}} Minuten"}},aboutXHours:{standalone:{one:"etwa 1 Stunde",other:"etwa {{count}} Stunden"},withPreposition:{one:"etwa 1 Stunde",other:"etwa {{count}} Stunden"}},xHours:{standalone:{one:"1 Stunde",other:"{{count}} Stunden"},withPreposition:{one:"1 Stunde",other:"{{count}} Stunden"}},xDays:{standalone:{one:"1 Tag",other:"{{count}} Tage"},withPreposition:{one:"1 Tag",other:"{{count}} Tagen"}},aboutXWeeks:{standalone:{one:"etwa 1 Woche",other:"etwa {{count}} Wochen"},withPreposition:{one:"etwa 1 Woche",other:"etwa {{count}} Wochen"}},xWeeks:{standalone:{one:"1 Woche",other:"{{count}} Wochen"},withPreposition:{one:"1 Woche",other:"{{count}} Wochen"}},aboutXMonths:{standalone:{one:"etwa 1 Monat",other:"etwa {{count}} Monate"},withPreposition:{one:"etwa 1 Monat",other:"etwa {{count}} Monaten"}},xMonths:{standalone:{one:"1 Monat",other:"{{count}} Monate"},withPreposition:{one:"1 Monat",other:"{{count}} Monaten"}},aboutXYears:{standalone:{one:"etwa 1 Jahr",other:"etwa {{count}} Jahre"},withPreposition:{one:"etwa 1 Jahr",other:"etwa {{count}} Jahren"}},xYears:{standalone:{one:"1 Jahr",other:"{{count}} Jahre"},withPreposition:{one:"1 Jahr",other:"{{count}} Jahren"}},overXYears:{standalone:{one:"mehr als 1 Jahr",other:"mehr als {{count}} Jahre"},withPreposition:{one:"mehr als 1 Jahr",other:"mehr als {{count}} Jahren"}},almostXYears:{standalone:{one:"fast 1 Jahr",other:"fast {{count}} Jahre"},withPreposition:{one:"fast 1 Jahr",other:"fast {{count}} Jahren"}}},ir=(c,s,e)=>{let t;const i=e!=null&&e.addSuffix?Ms[c].withPreposition:Ms[c].standalone;return typeof i=="string"?t=i:s===1?t=i.one:t=i.other.replace("{{count}}",String(s)),e!=null&&e.addSuffix?e.comparison&&e.comparison>0?"in "+t:"vor "+t:t},sr={full:"EEEE, do MMMM y",long:"do MMMM y",medium:"do MMM y",short:"dd.MM.y"},nr={full:"HH:mm:ss zzzz",long:"HH:mm:ss z",medium:"HH:mm:ss",short:"HH:mm"},ar={full:"{{date}} 'um' {{time}}",long:"{{date}} 'um' {{time}}",medium:"{{date}} {{time}}",short:"{{date}} {{time}}"},rr={date:se({formats:sr,defaultWidth:"full"}),time:se({formats:nr,defaultWidth:"full"}),dateTime:se({formats:ar,defaultWidth:"full"})},or={lastWeek:"'letzten' eeee 'um' p",yesterday:"'gestern um' p",today:"'heute um' p",tomorrow:"'morgen um' p",nextWeek:"eeee 'um' p",other:"P"},lr=(c,s,e,t)=>or[c],cr={narrow:["v.Chr.","n.Chr."],abbreviated:["v.Chr.","n.Chr."],wide:["vor Christus","nach Christus"]},hr={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1. Quartal","2. Quartal","3. Quartal","4. Quartal"]},pi={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],wide:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]},ur={narrow:pi.narrow,abbreviated:["Jan.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sep.","Okt.","Nov.","Dez."],wide:pi.wide},dr={narrow:["S","M","D","M","D","F","S"],short:["So","Mo","Di","Mi","Do","Fr","Sa"],abbreviated:["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],wide:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"]},gr={narrow:{am:"vm.",pm:"nm.",midnight:"Mitternacht",noon:"Mittag",morning:"Morgen",afternoon:"Nachm.",evening:"Abend",night:"Nacht"},abbreviated:{am:"vorm.",pm:"nachm.",midnight:"Mitternacht",noon:"Mittag",morning:"Morgen",afternoon:"Nachmittag",evening:"Abend",night:"Nacht"},wide:{am:"vormittags",pm:"nachmittags",midnight:"Mitternacht",noon:"Mittag",morning:"Morgen",afternoon:"Nachmittag",evening:"Abend",night:"Nacht"}},mr={narrow:{am:"vm.",pm:"nm.",midnight:"Mitternacht",noon:"Mittag",morning:"morgens",afternoon:"nachm.",evening:"abends",night:"nachts"},abbreviated:{am:"vorm.",pm:"nachm.",midnight:"Mitternacht",noon:"Mittag",morning:"morgens",afternoon:"nachmittags",evening:"abends",night:"nachts"},wide:{am:"vormittags",pm:"nachmittags",midnight:"Mitternacht",noon:"Mittag",morning:"morgens",afternoon:"nachmittags",evening:"abends",night:"nachts"}},fr={ordinalNumber:c=>Number(c)+".",era:Z({values:cr,defaultWidth:"wide"}),quarter:Z({values:hr,defaultWidth:"wide",argumentCallback:c=>c-1}),month:Z({values:pi,formattingValues:ur,defaultWidth:"wide"}),day:Z({values:dr,defaultWidth:"wide"}),dayPeriod:Z({values:gr,defaultWidth:"wide",formattingValues:mr,defaultFormattingWidth:"wide"})},br=/^(\d+)(\.)?/i,pr=/\d+/i,vr={narrow:/^(v\.? ?Chr\.?|n\.? ?Chr\.?)/i,abbreviated:/^(v\.? ?Chr\.?|n\.? ?Chr\.?)/i,wide:/^(vor Christus|vor unserer Zeitrechnung|nach Christus|unserer Zeitrechnung)/i},yr={any:[/^v/i,/^n/i]},wr={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](\.)? Quartal/i},kr={any:[/1/i,/2/i,/3/i,/4/i]},_r={narrow:/^[jfmasond]/i,abbreviated:/^(j[aä]n|feb|mär[z]?|apr|mai|jun[i]?|jul[i]?|aug|sep|okt|nov|dez)\.?/i,wide:/^(januar|februar|märz|april|mai|juni|juli|august|september|oktober|november|dezember)/i},Cr={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:[/^j[aä]/i,/^f/i,/^mär/i,/^ap/i,/^mai/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},Sr={narrow:/^[smdmf]/i,short:/^(so|mo|di|mi|do|fr|sa)/i,abbreviated:/^(son?|mon?|die?|mit?|don?|fre?|sam?)\.?/i,wide:/^(sonntag|montag|dienstag|mittwoch|donnerstag|freitag|samstag)/i},xr={any:[/^so/i,/^mo/i,/^di/i,/^mi/i,/^do/i,/^f/i,/^sa/i]},Tr={narrow:/^(vm\.?|nm\.?|Mitternacht|Mittag|morgens|nachm\.?|abends|nachts)/i,abbreviated:/^(vorm\.?|nachm\.?|Mitternacht|Mittag|morgens|nachm\.?|abends|nachts)/i,wide:/^(vormittags|nachmittags|Mitternacht|Mittag|morgens|nachmittags|abends|nachts)/i},Er={any:{am:/^v/i,pm:/^n/i,midnight:/^Mitte/i,noon:/^Mitta/i,morning:/morgens/i,afternoon:/nachmittags/i,evening:/abends/i,night:/nachts/i}},Rr={ordinalNumber:$t({matchPattern:br,parsePattern:pr,valueCallback:c=>parseInt(c)}),era:K({matchPatterns:vr,defaultMatchWidth:"wide",parsePatterns:yr,defaultParseWidth:"any"}),quarter:K({matchPatterns:wr,defaultMatchWidth:"wide",parsePatterns:kr,defaultParseWidth:"any",valueCallback:c=>c+1}),month:K({matchPatterns:_r,defaultMatchWidth:"wide",parsePatterns:Cr,defaultParseWidth:"any"}),day:K({matchPatterns:Sr,defaultMatchWidth:"wide",parsePatterns:xr,defaultParseWidth:"any"}),dayPeriod:K({matchPatterns:Tr,defaultMatchWidth:"wide",parsePatterns:Er,defaultParseWidth:"any"})},Mr={code:"de",formatDistance:ir,formatLong:rr,formatRelative:lr,localize:fr,match:Rr,options:{weekStartsOn:1,firstWeekContainsDate:4}},Br={lessThanXSeconds:{one:"פחות משנייה",two:"פחות משתי שניות",other:"פחות מ־{{count}} שניות"},xSeconds:{one:"שנייה",two:"שתי שניות",other:"{{count}} שניות"},halfAMinute:"חצי דקה",lessThanXMinutes:{one:"פחות מדקה",two:"פחות משתי דקות",other:"פחות מ־{{count}} דקות"},xMinutes:{one:"דקה",two:"שתי דקות",other:"{{count}} דקות"},aboutXHours:{one:"כשעה",two:"כשעתיים",other:"כ־{{count}} שעות"},xHours:{one:"שעה",two:"שעתיים",other:"{{count}} שעות"},xDays:{one:"יום",two:"יומיים",other:"{{count}} ימים"},aboutXWeeks:{one:"כשבוע",two:"כשבועיים",other:"כ־{{count}} שבועות"},xWeeks:{one:"שבוע",two:"שבועיים",other:"{{count}} שבועות"},aboutXMonths:{one:"כחודש",two:"כחודשיים",other:"כ־{{count}} חודשים"},xMonths:{one:"חודש",two:"חודשיים",other:"{{count}} חודשים"},aboutXYears:{one:"כשנה",two:"כשנתיים",other:"כ־{{count}} שנים"},xYears:{one:"שנה",two:"שנתיים",other:"{{count}} שנים"},overXYears:{one:"יותר משנה",two:"יותר משנתיים",other:"יותר מ־{{count}} שנים"},almostXYears:{one:"כמעט שנה",two:"כמעט שנתיים",other:"כמעט {{count}} שנים"}},Ar=(c,s,e)=>{if(c==="xDays"&&(e!=null&&e.addSuffix)&&s<=2)return e.comparison&&e.comparison>0?s===1?"מחר":"מחרתיים":s===1?"אתמול":"שלשום";let t;const i=Br[c];return typeof i=="string"?t=i:s===1?t=i.one:s===2?t=i.two:t=i.other.replace("{{count}}",String(s)),e!=null&&e.addSuffix?e.comparison&&e.comparison>0?"בעוד "+t:"לפני "+t:t},Pr={full:"EEEE, d בMMMM y",long:"d בMMMM y",medium:"d בMMM y",short:"d.M.y"},Ir={full:"H:mm:ss zzzz",long:"H:mm:ss z",medium:"H:mm:ss",short:"H:mm"},$r={full:"{{date}} 'בשעה' {{time}}",long:"{{date}} 'בשעה' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Lr={date:se({formats:Pr,defaultWidth:"full"}),time:se({formats:Ir,defaultWidth:"full"}),dateTime:se({formats:$r,defaultWidth:"full"})},Or={lastWeek:"eeee 'שעבר בשעה' p",yesterday:"'אתמול בשעה' p",today:"'היום בשעה' p",tomorrow:"'מחר בשעה' p",nextWeek:"eeee 'בשעה' p",other:"P"},Ur=(c,s,e,t)=>Or[c],Dr={narrow:["לפנה״ס","לספירה"],abbreviated:["לפנה״ס","לספירה"],wide:["לפני הספירה","לספירה"]},Nr={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["רבעון 1","רבעון 2","רבעון 3","רבעון 4"]},qr={narrow:["1","2","3","4","5","6","7","8","9","10","11","12"],abbreviated:["ינו׳","פבר׳","מרץ","אפר׳","מאי","יוני","יולי","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳"],wide:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"]},zr={narrow:["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"],short:["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"],abbreviated:["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],wide:["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"]},Fr={narrow:{am:"לפנה״צ",pm:"אחה״צ",midnight:"חצות",noon:"צהריים",morning:"בוקר",afternoon:"אחר הצהריים",evening:"ערב",night:"לילה"},abbreviated:{am:"לפנה״צ",pm:"אחה״צ",midnight:"חצות",noon:"צהריים",morning:"בוקר",afternoon:"אחר הצהריים",evening:"ערב",night:"לילה"},wide:{am:"לפנה״צ",pm:"אחה״צ",midnight:"חצות",noon:"צהריים",morning:"בוקר",afternoon:"אחר הצהריים",evening:"ערב",night:"לילה"}},Hr={narrow:{am:"לפנה״צ",pm:"אחה״צ",midnight:"חצות",noon:"צהריים",morning:"בבוקר",afternoon:"בצהריים",evening:"בערב",night:"בלילה"},abbreviated:{am:"לפנה״צ",pm:"אחה״צ",midnight:"חצות",noon:"צהריים",morning:"בבוקר",afternoon:"אחר הצהריים",evening:"בערב",night:"בלילה"},wide:{am:"לפנה״צ",pm:"אחה״צ",midnight:"חצות",noon:"צהריים",morning:"בבוקר",afternoon:"אחר הצהריים",evening:"בערב",night:"בלילה"}},Wr={ordinalNumber:(c,s)=>{const e=Number(c);if(e<=0||e>10)return String(e);const t=String(s==null?void 0:s.unit),i=["year","hour","minute","second"].indexOf(t)>=0,n=["ראשון","שני","שלישי","רביעי","חמישי","שישי","שביעי","שמיני","תשיעי","עשירי"],a=["ראשונה","שנייה","שלישית","רביעית","חמישית","שישית","שביעית","שמינית","תשיעית","עשירית"],r=e-1;return i?a[r]:n[r]},era:Z({values:Dr,defaultWidth:"wide"}),quarter:Z({values:Nr,defaultWidth:"wide",argumentCallback:c=>c-1}),month:Z({values:qr,defaultWidth:"wide"}),day:Z({values:zr,defaultWidth:"wide"}),dayPeriod:Z({values:Fr,defaultWidth:"wide",formattingValues:Hr,defaultFormattingWidth:"wide"})},Gr=/^(\d+|(ראשון|שני|שלישי|רביעי|חמישי|שישי|שביעי|שמיני|תשיעי|עשירי|ראשונה|שנייה|שלישית|רביעית|חמישית|שישית|שביעית|שמינית|תשיעית|עשירית))/i,Zr=/^(\d+|רא|שנ|של|רב|ח|שי|שב|שמ|ת|ע)/i,Kr={narrow:/^ל(ספירה|פנה״ס)/i,abbreviated:/^ל(ספירה|פנה״ס)/i,wide:/^ל(פני ה)?ספירה/i},Vr={any:[/^לפ/i,/^לס/i]},jr={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^רבעון [1234]/i},Jr={any:[/1/i,/2/i,/3/i,/4/i]},Xr={narrow:/^\d+/i,abbreviated:/^(ינו|פבר|מרץ|אפר|מאי|יוני|יולי|אוג|ספט|אוק|נוב|דצמ)׳?/i,wide:/^(ינואר|פברואר|מרץ|אפריל|מאי|יוני|יולי|אוגוסט|ספטמבר|אוקטובר|נובמבר|דצמבר)/i},Yr={narrow:[/^1$/i,/^2/i,/^3/i,/^4/i,/^5/i,/^6/i,/^7/i,/^8/i,/^9/i,/^10/i,/^11/i,/^12/i],any:[/^ינ/i,/^פ/i,/^מר/i,/^אפ/i,/^מא/i,/^יונ/i,/^יול/i,/^אוג/i,/^ס/i,/^אוק/i,/^נ/i,/^ד/i]},Qr={narrow:/^[אבגדהוש]׳/i,short:/^[אבגדהוש]׳/i,abbreviated:/^(שבת|יום (א|ב|ג|ד|ה|ו)׳)/i,wide:/^יום (ראשון|שני|שלישי|רביעי|חמישי|שישי|שבת)/i},eo={abbreviated:[/א׳$/i,/ב׳$/i,/ג׳$/i,/ד׳$/i,/ה׳$/i,/ו׳$/i,/^ש/i],wide:[/ן$/i,/ני$/i,/לישי$/i,/עי$/i,/מישי$/i,/שישי$/i,/ת$/i],any:[/^א/i,/^ב/i,/^ג/i,/^ד/i,/^ה/i,/^ו/i,/^ש/i]},to={any:/^(אחר ה|ב)?(חצות|צהריים|בוקר|ערב|לילה|אחה״צ|לפנה״צ)/i},io={any:{am:/^לפ/i,pm:/^אחה/i,midnight:/^ח/i,noon:/^צ/i,morning:/בוקר/i,afternoon:/בצ|אחר/i,evening:/ערב/i,night:/לילה/i}},so=["רא","שנ","של","רב","ח","שי","שב","שמ","ת","ע"],no={ordinalNumber:$t({matchPattern:Gr,parsePattern:Zr,valueCallback:c=>{const s=parseInt(c,10);return isNaN(s)?so.indexOf(c)+1:s}}),era:K({matchPatterns:Kr,defaultMatchWidth:"wide",parsePatterns:Vr,defaultParseWidth:"any"}),quarter:K({matchPatterns:jr,defaultMatchWidth:"wide",parsePatterns:Jr,defaultParseWidth:"any",valueCallback:c=>c+1}),month:K({matchPatterns:Xr,defaultMatchWidth:"wide",parsePatterns:Yr,defaultParseWidth:"any"}),day:K({matchPatterns:Qr,defaultMatchWidth:"wide",parsePatterns:eo,defaultParseWidth:"any"}),dayPeriod:K({matchPatterns:to,defaultMatchWidth:"any",parsePatterns:io,defaultParseWidth:"any"})},ao={code:"he",formatDistance:Ar,formatLong:Lr,formatRelative:Ur,localize:Wr,match:no,options:{weekStartsOn:0,firstWeekContainsDate:1}},ro={lessThanXSeconds:{one:"不到 1 秒",other:"不到 {{count}} 秒"},xSeconds:{one:"1 秒",other:"{{count}} 秒"},halfAMinute:"半分钟",lessThanXMinutes:{one:"不到 1 分钟",other:"不到 {{count}} 分钟"},xMinutes:{one:"1 分钟",other:"{{count}} 分钟"},xHours:{one:"1 小时",other:"{{count}} 小时"},aboutXHours:{one:"大约 1 小时",other:"大约 {{count}} 小时"},xDays:{one:"1 天",other:"{{count}} 天"},aboutXWeeks:{one:"大约 1 个星期",other:"大约 {{count}} 个星期"},xWeeks:{one:"1 个星期",other:"{{count}} 个星期"},aboutXMonths:{one:"大约 1 个月",other:"大约 {{count}} 个月"},xMonths:{one:"1 个月",other:"{{count}} 个月"},aboutXYears:{one:"大约 1 年",other:"大约 {{count}} 年"},xYears:{one:"1 年",other:"{{count}} 年"},overXYears:{one:"超过 1 年",other:"超过 {{count}} 年"},almostXYears:{one:"将近 1 年",other:"将近 {{count}} 年"}},oo=(c,s,e)=>{let t;const i=ro[c];return typeof i=="string"?t=i:s===1?t=i.one:t=i.other.replace("{{count}}",String(s)),e!=null&&e.addSuffix?e.comparison&&e.comparison>0?t+"内":t+"前":t},lo={full:"y'年'M'月'd'日' EEEE",long:"y'年'M'月'd'日'",medium:"yyyy-MM-dd",short:"yy-MM-dd"},co={full:"zzzz a h:mm:ss",long:"z a h:mm:ss",medium:"a h:mm:ss",short:"a h:mm"},ho={full:"{{date}} {{time}}",long:"{{date}} {{time}}",medium:"{{date}} {{time}}",short:"{{date}} {{time}}"},uo={date:se({formats:lo,defaultWidth:"full"}),time:se({formats:co,defaultWidth:"full"}),dateTime:se({formats:ho,defaultWidth:"full"})};function Bs(c,s,e){const t="eeee p";return tr(c,s,e)?t:c.getTime()>s.getTime()?"'下个'"+t:"'上个'"+t}const go={lastWeek:Bs,yesterday:"'昨天' p",today:"'今天' p",tomorrow:"'明天' p",nextWeek:Bs,other:"PP p"},mo=(c,s,e,t)=>{const i=go[c];return typeof i=="function"?i(s,e,t):i},fo={narrow:["前","公元"],abbreviated:["前","公元"],wide:["公元前","公元"]},bo={narrow:["1","2","3","4"],abbreviated:["第一季","第二季","第三季","第四季"],wide:["第一季度","第二季度","第三季度","第四季度"]},po={narrow:["一","二","三","四","五","六","七","八","九","十","十一","十二"],abbreviated:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],wide:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},vo={narrow:["日","一","二","三","四","五","六"],short:["日","一","二","三","四","五","六"],abbreviated:["周日","周一","周二","周三","周四","周五","周六"],wide:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]},yo={narrow:{am:"上",pm:"下",midnight:"凌晨",noon:"午",morning:"早",afternoon:"下午",evening:"晚",night:"夜"},abbreviated:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜间"},wide:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜间"}},wo={narrow:{am:"上",pm:"下",midnight:"凌晨",noon:"午",morning:"早",afternoon:"下午",evening:"晚",night:"夜"},abbreviated:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜间"},wide:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜间"}},ko={ordinalNumber:(c,s)=>{const e=Number(c);switch(s==null?void 0:s.unit){case"date":return e.toString()+"日";case"hour":return e.toString()+"时";case"minute":return e.toString()+"分";case"second":return e.toString()+"秒";default:return"第 "+e.toString()}},era:Z({values:fo,defaultWidth:"wide"}),quarter:Z({values:bo,defaultWidth:"wide",argumentCallback:c=>c-1}),month:Z({values:po,defaultWidth:"wide"}),day:Z({values:vo,defaultWidth:"wide"}),dayPeriod:Z({values:yo,defaultWidth:"wide",formattingValues:wo,defaultFormattingWidth:"wide"})},_o=/^(第\s*)?\d+(日|时|分|秒)?/i,Co=/\d+/i,So={narrow:/^(前)/i,abbreviated:/^(前)/i,wide:/^(公元前|公元)/i},xo={any:[/^(前)/i,/^(公元)/i]},To={narrow:/^[1234]/i,abbreviated:/^第[一二三四]刻/i,wide:/^第[一二三四]刻钟/i},Eo={any:[/(1|一)/i,/(2|二)/i,/(3|三)/i,/(4|四)/i]},Ro={narrow:/^(一|二|三|四|五|六|七|八|九|十[二一])/i,abbreviated:/^(一|二|三|四|五|六|七|八|九|十[二一]|\d|1[12])月/i,wide:/^(一|二|三|四|五|六|七|八|九|十[二一])月/i},Mo={narrow:[/^一/i,/^二/i,/^三/i,/^四/i,/^五/i,/^六/i,/^七/i,/^八/i,/^九/i,/^十(?!(一|二))/i,/^十一/i,/^十二/i],any:[/^一|1/i,/^二|2/i,/^三|3/i,/^四|4/i,/^五|5/i,/^六|6/i,/^七|7/i,/^八|8/i,/^九|9/i,/^十(?!(一|二))|10/i,/^十一|11/i,/^十二|12/i]},Bo={narrow:/^[一二三四五六日]/i,short:/^[一二三四五六日]/i,abbreviated:/^周[一二三四五六日]/i,wide:/^星期[一二三四五六日]/i},Ao={any:[/日/i,/一/i,/二/i,/三/i,/四/i,/五/i,/六/i]},Po={any:/^(上午?|下午?|午夜|[中正]午|早上?|下午|晚上?|凌晨|)/i},Io={any:{am:/^上午?/i,pm:/^下午?/i,midnight:/^午夜/i,noon:/^[中正]午/i,morning:/^早上/i,afternoon:/^下午/i,evening:/^晚上?/i,night:/^凌晨/i}},$o={ordinalNumber:$t({matchPattern:_o,parsePattern:Co,valueCallback:c=>parseInt(c,10)}),era:K({matchPatterns:So,defaultMatchWidth:"wide",parsePatterns:xo,defaultParseWidth:"any"}),quarter:K({matchPatterns:To,defaultMatchWidth:"wide",parsePatterns:Eo,defaultParseWidth:"any",valueCallback:c=>c+1}),month:K({matchPatterns:Ro,defaultMatchWidth:"wide",parsePatterns:Mo,defaultParseWidth:"any"}),day:K({matchPatterns:Bo,defaultMatchWidth:"wide",parsePatterns:Ao,defaultParseWidth:"any"}),dayPeriod:K({matchPatterns:Po,defaultMatchWidth:"any",parsePatterns:Io,defaultParseWidth:"any"})},Lo={code:"zh-CN",formatDistance:oo,formatLong:uo,formatRelative:mo,localize:ko,match:$o,options:{weekStartsOn:1,firstWeekContainsDate:4}};class Oo{constructor(s){u(this,"_game");this._game=s}load(s){return new Promise((e,t)=>{if(s===null){e();return}this._game.saveImportDropboxText(s,i=>{if(i){t(i);return}e()})})}loadRaw(s){const e=this._game.compressLZData(JSON.stringify(s));return this.load(e)}}class $e extends he{constructor(s,e){super(s,e),this.element.addClass(ks.toolbar)}toString(){return`[${$e.name}#${this.componentId}]`}addChild(s){return super.addChild(s)}}class vi extends N{constructor(e,t,i){console.debug(...v(`Constructing ${vi.name}`));const n=e.host.engine.i18n("state.title");super(e,t,new ue(e,n,{classes:[D.checked,D.setting],icon:A.State}).addChildrenHead([new M(e,{classes:[B.fillSpace]})]),{onRefresh:()=>{this._refreshGameList(),this._refreshStateList()}});u(this,"games",new Array);u(this,"states",new Array);u(this,"gameList");u(this,"stateList");u(this,"locale");this.gameList=new x(this,{hasDisableAll:!1,hasEnableAll:!1}),this.stateList=new x(this,{hasDisableAll:!1,hasEnableAll:!1}),this.locale=i.selected==="zh-CN"?Lo:i.selected==="he-IL"?ao:i.selected==="de-DE"?Mr:Ss,this.addChildContent(new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new S(this,this.setting.noConfirm,this.host.engine.i18n("state.noConfirm")),new he(this).addChild(new te(this)),new q(this,this.host.engine.i18n("state.local")),new $e(this).addChildren([new J(this,this.host.engine.i18n("state.import"),A.Import,{onClick:()=>{this.import()},title:this.host.engine.i18n("state.importTitle")})]),new he(this).addChild(new te(this)),new q(this,this.host.engine.i18n("state.localStates")),new $e(this).addChildren([new J(this,this.host.engine.i18n("state.store"),A.SaveAs,{onClick:()=>{this.storeState()},title:this.host.engine.i18n("state.storeState")}),new J(this,this.host.engine.i18n("copy"),A.Copy,{onClick:()=>{this.copyState().catch(R(console)),this.host.engine.imessage("state.copied.stateCurrent")},title:this.host.engine.i18n("state.copy.stateCurrent")}),new J(this,this.host.engine.i18n("state.new"),A.Draft,{onClick:()=>{this.storeStateFactoryDefaults(),this.host.engine.imessage("state.stored.state")},title:this.host.engine.i18n("state.storeFactory")}),new J(this,this.host.engine.i18n("state.exportAll"),A.Sync,{onClick:()=>{this.exportStateAll()},title:this.host.engine.i18n("state.exportAllTitle")})]),new he(this).addChild(this.stateList),new he(this).addChild(new te(this)),new q(this,this.host.engine.i18n("state.localGames")),new $e(this).addChildren([new J(this,this.host.engine.i18n("state.store"),A.SaveAs,{onClick:()=>{this.storeGame(),this.host.engine.imessage("state.stored.game")},title:this.host.engine.i18n("state.storeGame")}),new J(this,this.host.engine.i18n("copy"),A.Copy,{onClick:()=>{this.copyGame().catch(R(console)),this.host.engine.imessage("state.copied.gameCurrent")},title:this.host.engine.i18n("state.copy.gameCurrent")})]),new he(this).addChild(this.gameList),new S(this,this.setting.compress,this.host.engine.i18n("state.compress"))])),this._loadGames(),this._loadStates()}_loadGames(){let e=0,t=localStorage.getItem(`ks.game.${e}`);this.games.splice(0);try{for(;!m(t);){const i=JSON.parse(t);this.games.push(new yt(i)),t=localStorage.getItem(`ks.game.${++e}`)}}catch(i){console.error(...v(i))}}_storeGames(){let e=0,t=localStorage.getItem(`ks.game.${e}`);for(;!m(t);)localStorage.removeItem(`ks.game.${e}`),t=localStorage.getItem(`ks.game.${++e}`);e=0;for(const i of this.games)localStorage.setItem(`ks.game.${e++}`,JSON.stringify(i))}_loadStates(){let e=0,t=localStorage.getItem(`ks.state.${e}`);this.states.splice(0);try{for(;!m(t);){const i=JSON.parse(t);de.unknownAsEngineStateOrThrow(i.state),this.states.push(new yt(i)),t=localStorage.getItem(`ks.state.${++e}`)}}catch(i){console.error(...v(i))}}_storeStates(){let e=0,t=localStorage.getItem(`ks.state.${e}`);for(;!m(t);)localStorage.removeItem(`ks.state.${e}`),t=localStorage.getItem(`ks.state.${++e}`);e=0;for(const i of this.states)localStorage.setItem(`ks.state.${e++}`,JSON.stringify(i))}_refreshGameList(){this.gameList.removeChildren(this.gameList.children),this.gameList.addChildren(this.games.sort((e,t)=>new Date(e.unwrap().timestamp).getTime()-new Date(t.unwrap().timestamp).getTime()).map(e=>[e.unwrap(),e]).map(([e,t])=>new si(this,new Ce(this,`${e.label} (${Es(new Date(e.timestamp),{addSuffix:!0,locale:this.locale})})`,{onClick:()=>{this.loadGame(e.game).catch(R(console)),this.host.engine.imessage("state.loaded.game",[e.label])},title:new Date(e.timestamp).toLocaleString()})).addChildren([new M(this,{classes:[B.fillSpace]}),new ie(this,A.Save,this.host.engine.i18n("state.update.game"),{onClick:()=>{this.updateGame(t,this.host.game.save()),this.host.engine.imessage("state.updated.game",[e.label])}}),new ie(this,A.Edit,this.host.engine.i18n("state.edit.game"),{onClick:()=>{this.storeGame(e.game),this.deleteGame(t,!0),this.host.engine.imessage("state.updated.game",[e.label])}}),new ie(this,A.Copy,this.host.engine.i18n("state.copy.game"),{onClick:()=>{this.copyGame(e.game).catch(R(console)),this.host.engine.imessage("state.copied.game",[e.label])}}),new ie(this,A.Delete,this.host.engine.i18n("state.delete.game"),{onClick:()=>{this.deleteGame(t),this.host.engine.imessage("state.deleted.game",[e.label])}})])))}_refreshStateList(){this.stateList.removeChildren(this.stateList.children),this.stateList.addChildren(this.states.sort((e,t)=>new Date(e.unwrap().timestamp).getTime()-new Date(t.unwrap().timestamp).getTime()).map(e=>[e.unwrap(),e]).map(([e,t])=>new si(this,new Ce(this,`${e.label} (${Es(new Date(e.timestamp),{addSuffix:!0,locale:this.locale})})`,{onClick:()=>{this.loadState(e.state),this.host.engine.imessage("state.loaded.state",[e.label])},title:new Date(e.timestamp).toLocaleString()})).addChildren([new M(this,{classes:[B.fillSpace]}),new ie(this,A.Save,this.host.engine.i18n("state.update.state"),{onClick:()=>{this.updateState(t,this.host.engine.stateSerialize()),this.host.engine.imessage("state.updated.state",[e.label])}}),new ie(this,A.Edit,this.host.engine.i18n("state.edit.state"),{onClick:()=>{this.storeState(e.state),this.deleteState(t,!0),this.host.engine.imessage("state.updated.state",[e.label])}}),new ie(this,A.Copy,this.host.engine.i18n("state.copy.state"),{onClick:()=>{this.copyState(e.state).catch(R(console)),this.host.engine.imessage("state.copied.state",[e.label])}}),new ie(this,A.Delete,this.host.engine.i18n("state.delete.state"),{onClick:()=>{this.deleteState(t),this.host.engine.imessage("state.deleted.state",[e.label])}})])))}async copyState(e){await this.host.copySettings(e,!1)}async copyGame(e){const t=e??this.host.game.save(),i=JSON.stringify(t),n=this.setting.compress.enabled?this.host.game.compressLZData(i):i;await T.window.navigator.clipboard.writeText(n)}import(){const e=T.window.prompt(this.host.engine.i18n("state.loadPrompt"));if(m(e))return;const t=new Date().toDateString();let i=1;const n=()=>this.host.engine.i18n("state.importedState",[`${t} #${i++}`]),a=r=>{try{const h=de.decodeSettings(r);this.storeState(h,n()),this.host.engine.imessage("state.imported.state");return}catch{}try{const h=JSON.parse(r),d=de.decodeSettings(h.state);this.storeState(d,h.label),this.host.engine.imessage("state.imported.state");return}catch{}let o;try{o=JSON.parse(r)}catch{const d=this.host.game.decompressLZData(r);try{o=JSON.parse(d)}catch{if(r.match(/\r?\n/))return r.split(/\r?\n/).map(f=>void a(f));throw new fi("The provided input can not be parsed as anything we understand.")}}let l;if(!m(o)&&"ks"in o&&!m(o.ks)){const h=o.ks.state[0];l=this.storeState(h,n())??void 0,this.host.engine.imessage("state.imported.state"),o.ks=void 0}this.storeGame(o,l),this.host.engine.imessage("state.imported.game")};a(e)}storeGame(e,t){let i=t;return m(i)&&(i=T.window.prompt(this.host.engine.i18n("state.storeGame.prompt"))??void 0),m(i)?null:(i=(i===""?void 0:i)??this.host.engine.i18n("state.unlabeledGame"),i=i.substring(0,127),this.games.push(new yt({game:e??this.host.game.save(),label:i,timestamp:new Date().toISOString()})),this._storeGames(),this.requestRefresh(),i)}storeState(e,t){let i=t;return m(i)&&(i=T.window.prompt(this.host.engine.i18n("state.storeState.prompt"))??void 0),m(i)?null:(i=(i===""?void 0:i)??this.host.engine.i18n("state.unlabeledState"),i=i.substring(0,127),this.states.push(new yt({label:i,state:e??this.host.engine.stateSerialize(),timestamp:new Date().toISOString()})),this._storeStates(),this.requestRefresh(),i)}storeStateFactoryDefaults(){this.storeState(re.DEFAULT_STATE)}storeAutoSave(e){const t=this.states.find(i=>i.unwrap().label==="Auto-Save");if(!m(t)){console.info(...v("Updating existing Auto-Save...")),t.replace({...t.unwrap(),state:e,timestamp:new Date().toISOString()}),this._storeStates(),this.requestRefresh();return}console.info(...v("Storing new Auto-Save...")),this.storeState(e,"Auto-Save")}exportStateAll(){const e=this.states.map(a=>a.unwrap()).map(a=>JSON.stringify({label:a.label,state:de.encodeSettings(a.state,!1),timestamp:a.timestamp})).join(`
|
|
21
|
+
`),t=document.createElement("a"),i=new Blob([e],{type:"application/x-ndjson"}),n=URL.createObjectURL(i);t.setAttribute("href",n),t.setAttribute("download",`ks-local-states-${Date.now()}.ndjson`),t.click()}async loadGame(e){this._destructiveActionPrevented()||await new Oo(this.host.game).loadRaw(e)}loadState(e){this._destructiveActionPrevented()||(this.host.engine.stateLoad(e,!0),this.host.refreshEntireUserInterface())}loadAutoSave(){if(this.host.engine.isLoaded){console.info(...v("Not attempting to load Auto-Save, because a state is already loaded."));return}const e=this.states.find(t=>t.unwrap().label==="Auto-Save");if(m(e)){console.info(...v("No Auto-Save settings found."));return}console.info(...v("Loading Auto-Save...")),this.host.engine.stateLoad(e.unwrap().state,!1)}updateGame(e,t){if(this._destructiveActionPrevented())return;const i=e.unwrap().label;e.replace({game:t,label:i,timestamp:new Date().toISOString()}),this._storeGames(),this.requestRefresh()}updateState(e,t){if(this._destructiveActionPrevented())return;const i=e.unwrap().label;e.replace({label:i,state:t,timestamp:new Date().toISOString()}),this._storeStates(),this.requestRefresh()}deleteGame(e,t=!1){if(!t&&this._destructiveActionPrevented())return;const i=this.games.indexOf(e);i<0||(this.games.splice(i,1),this._storeGames(),this.requestRefresh())}deleteState(e,t=!1){if(!t&&this._destructiveActionPrevented())return;const i=this.states.indexOf(e);i<0||(this.states.splice(i,1),this._storeStates(),this.requestRefresh())}_destructiveActionPrevented(){return!this.setting.noConfirm.enabled&&!T.window.confirm(this.host.engine.i18n("state.confirmDestruction"))}}class Re extends _e{constructor(e,t,i,n){super(e,new ue(e,t,{classes:[D.checked,D.setting],icon:n==null?void 0:n.icon}).addChildrenHead([new M(e,{classes:[B.fillSpace]})]),n);u(this,"setting");this.setting=i}}class Uo extends Re{constructor(e,t,i){var r,o;const n=e.host.engine.i18n("ui.build");super(e,n,t,{icon:A.Bonfire,onRefreshRequest:()=>{this.expando.ineffective=t.enabled&&Object.values(t.buildings).some(l=>l.enabled&&l.trigger<=0)}});u(this,"_buildings");this._buildings=[];for(const l of this.host.game.bld.buildingGroups){this._buildings.push(new q(this,l.title));for(const h of l.buildings){if(h==="unicornPasture"||m(this.setting.buildings[h]))continue;const d=this.host.game.bld.getBuildingExt(h).meta;if(m(d.stages))m(d.label)||this._buildings.push(this._getResetOption(this,this.setting.buildings[h],i,t,d.label));else{const g=(r=Object.values(this.setting.buildings).find(f=>f.baseBuilding===h))==null?void 0:r.building;this._buildings.push(this._getResetOption(this,this.setting.buildings[h],i,t,d.stages[0].label),this._getResetOption(this,this.setting.buildings[g],i,t,d.stages[1].label,!1,!0))}}l!==this.host.game.bld.buildingGroups[this.host.game.bld.buildingGroups.length-1]&&((o=this._buildings.at(-1))==null||o.element.addClass(ke.delimiter))}const a=new x(this);a.addChildren(this._buildings),this.addChildContent(a)}_getResetOption(e,t,i,n,a,r=!1,o=!1){const l=new H(e,t,i,a,{delimiter:r,onCheck:()=>{e.host.engine.imessage("status.reset.check.enable",[a])},onRefreshRequest:()=>{l.triggerButton.inactive=!t.enabled||t.trigger===-1,l.triggerButton.ineffective=n.enabled&&t.enabled&&t.trigger===-1},onSetTrigger:async()=>{const h=await E.prompt(e,e.host.engine.i18n("ui.trigger.prompt.absolute"),e.host.engine.i18n("ui.trigger.build.prompt",[a,t.trigger!==-1?e.host.renderAbsolute(t.trigger,i.selected):e.host.engine.i18n("ui.trigger.inactive")]),t.trigger!==-1?e.host.renderAbsolute(t.trigger):"",e.host.engine.i18n("ui.trigger.reset.promptExplainer"));if(h!==void 0){if(h===""||h.startsWith("-")){t.trigger=-1,t.enabled=!1;return}t.trigger=Number(h)}},onUnCheck:()=>{e.host.engine.imessage("status.reset.check.disable",[a])},upgradeIndicator:o});return l.triggerButton.element.addClass(C.lastHeadAction),l}}class Do extends Re{constructor(s,e,t){const i=s.host.engine.i18n("ui.faith");super(s,i,e,{icon:A.Religion,onRefreshRequest:()=>{this.expando.ineffective=e.enabled&&Object.values(e.buildings).some(a=>a.enabled&&a.trigger<=0)}}),this.addChildrenHead([new M(s,{classes:[B.fillSpace]})]);const n=[...kt];this.addChildContent(new x(this).addChildren([new q(this,this.host.engine.i18n("$religion.panel.ziggurat.label")),this._getResetOption(this,this.setting.buildings.unicornPasture,t,e,this.host.engine.i18n("$buildings.unicornPasture.label")),...this.host.game.religion.zigguratUpgrades.filter(a=>n.includes(a.name)&&!m(this.setting.buildings[a.name])).map(a=>this._getResetOption(this,this.setting.buildings[a.name],t,e,a.label)),new te(this),...this.host.game.religion.zigguratUpgrades.filter(a=>!n.includes(a.name)&&!m(this.setting.buildings[a.name])).map(a=>this._getResetOption(this,this.setting.buildings[a.name],t,e,a.label)),new te(this),new q(this,this.host.engine.i18n("$religion.panel.orderOfTheSun.label")),...this.host.game.religion.religionUpgrades.filter(a=>!m(this.setting.buildings[a.name])).map(a=>{var r;return this._getResetOption(this,this.setting.buildings[a.name],t,e,a.label,a.name===((r=this.host.game.religion.religionUpgrades.at(-1))==null?void 0:r.name))}),new q(this,this.host.engine.i18n("$religion.panel.cryptotheology.label")),...this.host.game.religion.transcendenceUpgrades.filter(a=>!m(this.setting.buildings[a.name])).map(a=>this._getResetOption(this,this.setting.buildings[a.name],t,e,a.label))]))}_getResetOption(s,e,t,i,n,a=!1,r=!1){const o=new H(s,e,t,n,{delimiter:a,onCheck:()=>{s.host.engine.imessage("status.reset.check.enable",[n])},onRefreshRequest:()=>{o.triggerButton.inactive=!e.enabled||e.trigger===-1,o.triggerButton.ineffective=i.enabled&&e.enabled&&e.trigger===-1},onSetTrigger:async()=>{const l=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.absolute"),s.host.engine.i18n("ui.trigger.build.prompt",[n,e.trigger!==-1?s.host.renderAbsolute(e.trigger,t.selected):s.host.engine.i18n("ui.trigger.inactive")]),e.trigger!==-1?s.host.renderAbsolute(e.trigger):"",s.host.engine.i18n("ui.trigger.reset.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){e.trigger=-1,e.enabled=!1;return}e.trigger=Number(l)}},onUnCheck:()=>{s.host.engine.imessage("status.reset.check.disable",[n])},upgradeIndicator:r});return o.triggerButton.element.addClass(C.lastHeadAction),o}}class No extends Re{constructor(s,e,t){const i=s.host.engine.i18n("ui.resources");super(s,i,e,{icon:A.Resources,onRefreshRequest:()=>{this.expando.ineffective=e.enabled&&Object.values(e.resources).some(o=>o.enabled&&o.trigger<0)}}),this.addChildrenHead([new M(s,{classes:[B.fillSpace]})]);const n=this.host.game.resPool.resources,a=[];let r=n[0].title;for(const o of[...n].sort((l,h)=>l.title.localeCompare(h.title,t.selected))){const l=this.setting.resources[o.name],h=new H(this,l,t,X(o.title),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[o.title])},onRefreshRequest:()=>{h.triggerButton.inactive=!l.enabled||l.trigger===-1,h.triggerButton.ineffective=e.enabled&&l.enabled&&l.trigger===-1},onSetTrigger:async()=>{const d=await E.prompt(this,this.host.engine.i18n("ui.trigger.prompt.float"),this.host.engine.i18n("ui.trigger.build.prompt",[o.title,l.trigger!==-1?this.host.renderAbsolute(l.trigger,t.selected):this.host.engine.i18n("ui.trigger.inactive")]),l.trigger!==-1?this.host.renderAbsolute(l.trigger):"",this.host.engine.i18n("ui.trigger.reset.promptExplainer"));if(d!==void 0){if(d===""||d.startsWith("-")){l.trigger=-1,l.enabled=!1;return}l.trigger=s.host.parseAbsolute(d)??l.trigger}},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[o.title])}});h.triggerButton.element.addClass(C.lastHeadAction),this.host.engine.localeSupportsFirstLetterSplits(t.selected)&&r[0]!==o.title[0]&&h.element.addClass(B.splitter),a.push(h),r=o.title}this.addChildContent(new x(this).addChildren(a))}}class qo extends Re{constructor(s,e,t){const i=s.host.engine.i18n("ui.space");super(s,i,e,{icon:A.Space,onRefreshRequest:()=>{this.expando.ineffective=e.enabled&&Object.values(e.buildings).some(n=>n.enabled&&n.trigger<=0)}}),this.addChildrenHead([new M(s,{classes:[B.fillSpace]})]),this.addChildContent(new x(this).addChildren(this.host.game.space.planets.filter(n=>0<n.buildings.length).flatMap((n,a,r)=>[new q(this,this.host.engine.labelForPlanet(n.name)),...n.buildings.filter(o=>!m(this.setting.buildings[o.name])).map((o,l,h)=>this._getResetOption(this,this.setting.buildings[o.name],t,e,o.label,a<r.length-1&&l===h.length-1))])))}_getResetOption(s,e,t,i,n,a=!1,r=!1){const o=new H(s,e,t,n,{delimiter:a,onCheck:()=>{s.host.engine.imessage("status.reset.check.enable",[n])},onRefreshRequest:()=>{o.triggerButton.inactive=!e.enabled||e.trigger===-1,o.triggerButton.ineffective=i.enabled&&e.enabled&&e.trigger===-1},onSetTrigger:async()=>{const l=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.absolute"),s.host.engine.i18n("ui.trigger.build.prompt",[n,e.trigger!==-1?s.host.renderAbsolute(e.trigger,t.selected):s.host.engine.i18n("ui.trigger.inactive")]),e.trigger!==-1?s.host.renderAbsolute(e.trigger):"",s.host.engine.i18n("ui.trigger.reset.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){e.trigger=-1,e.enabled=!1;return}e.trigger=Number(l)}},onUnCheck:()=>{s.host.engine.imessage("status.reset.check.disable",[n])},upgradeIndicator:r});return o.triggerButton.element.addClass(C.lastHeadAction),o}}class zo extends Re{constructor(s,e,t){const i=s.host.engine.i18n("ui.time");super(s,i,e,{icon:A.Time,onRefreshRequest:()=>{this.expando.ineffective=e.enabled&&Object.values(e.buildings).some(n=>n.enabled&&n.trigger<=0)}}),this.addChildrenHead([new M(s,{classes:[B.fillSpace]})]),this.addChildContent(new x(this).addChildren([new q(this,this.host.engine.i18n("$workshop.chronoforge.label")),...this.host.game.time.chronoforgeUpgrades.filter(n=>!m(this.setting.buildings[n.name])).map(n=>{var a;return this._getResetOption(this,this.setting.buildings[n.name],t,e,n.label,n.name===((a=this.host.game.time.chronoforgeUpgrades.at(-1))==null?void 0:a.name))}),new q(this,this.host.engine.i18n("$science.voidSpace.label")),...this.host.game.time.voidspaceUpgrades.filter(n=>n.name in this.setting.buildings).map(n=>this._getResetOption(this,this.setting.buildings[n.name],t,e,n.label))]))}_getResetOption(s,e,t,i,n,a=!1,r=!1){const o=new H(s,e,t,n,{delimiter:a,onCheck:()=>{s.host.engine.imessage("status.reset.check.enable",[n])},onRefreshRequest:()=>{o.triggerButton.inactive=!e.enabled||e.trigger===-1,o.triggerButton.ineffective=i.enabled&&e.enabled&&e.trigger===-1},onSetTrigger:async()=>{const l=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.absolute"),s.host.engine.i18n("ui.trigger.build.prompt",[n,e.trigger!==-1?s.host.renderAbsolute(e.trigger,t.selected):s.host.engine.i18n("ui.trigger.inactive")]),e.trigger!==-1?s.host.renderAbsolute(e.trigger):"",s.host.engine.i18n("ui.trigger.reset.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){e.trigger=-1,e.enabled=!1;return}e.trigger=Number(l)}},onUnCheck:()=>{s.host.engine.imessage("status.reset.check.disable",[n])},upgradeIndicator:r});return o.triggerButton.element.addClass(C.lastHeadAction),o}}class Fo extends Re{constructor(s,e,t){const i=s.host.engine.i18n("ui.upgrades");super(s,i,e,{icon:A.Workshop}),this.addChildrenHead([new M(s,{classes:[B.fillSpace]})]);const n=this.host.game.workshop.upgrades.filter(l=>!m(this.setting.upgrades[l.name])),a=[];let r=n[0].label,o;for(const l of n.sort((h,d)=>h.label.localeCompare(d.label,t.selected))){const h=this.setting.upgrades[l.name],d=this._getResetOption(this,h,l.label);this.host.engine.localeSupportsFirstLetterSplits(t.selected)&&r[0]!==l.label[0]&&(m(o)||o.element.addClass(ke.delimiter),d.element.addClass(B.splitter)),o=d,a.push(d),r=l.label}this.addChildContent(new x(this).addChildren(a))}_getResetOption(s,e,t,i=!1,n=!1){return new S(s,e,t,{delimiter:i,onCheck:()=>{s.host.engine.imessage("status.reset.check.enable",[t])},onUnCheck:()=>{s.host.engine.imessage("status.reset.check.disable",[t])},upgradeIndicator:n})}}class Ho extends N{constructor(e,t,i){const n=e.host.engine.i18n("option.time.reset");super(e,t,new S(e,t,n,{onCheck:r=>{e.host.engine.imessage("status.auto.enable",[n])},onUnCheck:r=>{e.host.engine.imessage("status.auto.disable",[n])}}).addChildrenHead([new M(e,{classes:[B.fillSpace]})]),{onRefreshRequest:()=>{this.expando.ineffective=t.enabled&&[this._bonfireUi,this._religionUi,this._resourcesUi,this._spaceUi,this._timeUi,this._upgradesUi].some(r=>r.expando.ineffective)}});u(this,"_bonfireUi");u(this,"_religionUi");u(this,"_resourcesUi");u(this,"_spaceUi");u(this,"_timeUi");u(this,"_upgradesUi");const a=new x(this,{hasDisableAll:!1,hasEnableAll:!1});this._bonfireUi=new Uo(this,this.setting.bonfire,i),this._religionUi=new Do(this,this.setting.religion,i),this._resourcesUi=new No(this,this.setting.resources,i),this._spaceUi=new qo(this,this.setting.space,i),this._timeUi=new zo(this,this.setting.time,i),this._upgradesUi=new Fo(this,this.setting.upgrades,i),a.addChildren([this._bonfireUi,this._religionUi,this._resourcesUi,this._spaceUi,this._timeUi,this._upgradesUi]),this.addChildContent(a)}}class As extends x{constructor(e,t,i){super(e,i);u(this,"setting");this.setting=t;const n=(r,o)=>{const l=e.host.engine.labelForCycle(r);return new S(e,o,l,{onCheck:h=>{var d;(d=i==null?void 0:i.onCheckCycle)==null||d.call(i,l,o,h)},onUnCheck:h=>{var d;(d=i==null?void 0:i.onUnCheckCycle)==null||d.call(i,l,o,h)}})},a=[n("charon",this.setting.charon),n("umbra",this.setting.umbra),n("yarn",this.setting.yarn),n("helios",this.setting.helios),n("cath",this.setting.cath),n("redmoon",this.setting.redmoon),n("dune",this.setting.dune),n("piscine",this.setting.piscine),n("terminus",this.setting.terminus),n("kairo",this.setting.kairo)];this.addChildren(a),this.element[0].addEventListener("enableAll",()=>{for(const r of a)r.check(!0)}),this.element[0].addEventListener("disableAll",()=>{for(const r of a)r.uncheck(!0)})}}class Ut extends x{constructor(e,t,i){super(e,i);u(this,"setting");u(this,"spring");u(this,"summer");u(this,"autumn");u(this,"winter");this.setting=t;const n=(a,r)=>new S(this,r,a,{onCheck:o=>{var l;(l=i==null?void 0:i.onCheckSeason)==null||l.call(i,a,r,o)},onUnCheck:o=>{var l;(l=i==null?void 0:i.onUnCheckSeason)==null||l.call(i,a,r,o)}});this.spring=n(this.host.engine.i18n("$calendar.season.spring"),this.setting.spring),this.summer=n(this.host.engine.i18n("$calendar.season.summer"),this.setting.summer),this.autumn=n(this.host.engine.i18n("$calendar.season.autumn"),this.setting.autumn),this.winter=n(this.host.engine.i18n("$calendar.season.winter"),this.setting.winter),this.addChildren([this.spring,this.summer,this.autumn,this.winter])}toString(){return`[${Ut.name}#${this.componentId}]`}}class Wo extends N{constructor(s,e,t,i,n){const a=s.host.engine.i18n("option.time.activeHeatTransfer");super(s,e,new H(s,e,t,a,{onCheck:r=>{s.host.engine.imessage("status.auto.enable",[a])},onSetTrigger:async()=>{const r=await E.prompt(s,s.host.engine.i18n("ui.trigger.activeHeatTransfer.prompt"),s.host.engine.i18n("ui.trigger.activeHeatTransfer.promptTitle",[s.host.renderPercentage(e.trigger,t.selected,!0)]),s.host.renderPercentage(e.trigger),s.host.engine.i18n("ui.trigger.activeHeatTransfer.promptExplainer"));r===void 0||r===""||r.startsWith("-")||(e.trigger=s.host.parsePercentage(r))},onUnCheck:r=>{s.host.engine.imessage("status.auto.disable",[a]),e.activeHeatTransferStatus.enabled=!1}}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!e.enabled,this.settingItem.triggerButton.ineffective=n.enabled&&i.enabled&&e.enabled&&e.trigger===-1,this.expando.ineffective=n.enabled&&i.enabled&&e.enabled&&!Object.values(e.cycles).some(r=>r.enabled),e.activeHeatTransferStatus.enabled?(this.head.elementLabel.attr("data-ks-active-from","◎"),this.head.elementLabel.attr("data-ks-active-to","◎"),this.head.elementLabel.addClass(Pt.active)):this.head.elementLabel.removeClass(Pt.active)}}),this.addChildContent(new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new As(this,this.setting.cycles,{onCheckCycle:r=>{this.host.engine.imessage("time.heatTransfer.cycle.enable",[r])},onUnCheckCycle:r=>{this.host.engine.imessage("time.heatTransfer.cycle.disable",[r])}})]))}}class Go extends N{constructor(e,t,i,n){const a=e.host.engine.i18n("option.time.skip");super(e,t,new At(e,t,i,a,{onCheck:r=>{e.host.engine.imessage("status.auto.enable",[a])},onRefreshMax(){this.maxButton.updateLabel(e.host.renderAbsolute(t.max)),this.maxButton.element[0].title=t.max<0?e.host.engine.i18n("ui.max.timeSkip.titleInfinite",[a]):t.max===0?e.host.engine.i18n("ui.max.timeSkip.titleZero",[a]):e.host.engine.i18n("ui.max.timeSkip.title",[e.host.renderAbsolute(t.max),a])},onRefreshTrigger(){this.triggerButton.element[0].title=e.host.engine.i18n("ui.trigger",[t.trigger<0?e.host.engine.i18n("ui.trigger.section.inactive"):`${e.host.renderFloat(t.trigger,i.selected)} TC`])},onSetMax:async()=>{const r=await E.prompt(e,e.host.engine.i18n("ui.max.timeSkip.prompt"),e.host.engine.i18n("ui.max.timeSkip.promptTitle",[e.host.renderAbsolute(t.max,i.selected)]),e.host.renderAbsolute(t.max),e.host.engine.i18n("ui.max.timeSkip.promptExplainer"));if(r!==void 0){if(r===""||r.startsWith("-")){t.max=-1;return}r==="0"&&(t.enabled=!1),t.max=e.host.parseAbsolute(r)??t.max}},onSetTrigger:async()=>{const r=await E.prompt(e,e.host.engine.i18n("ui.trigger.timeSkip.prompt"),e.host.engine.i18n("ui.trigger.timeSkip.promptTitle",[e.host.renderAbsolute(t.trigger,i.selected)]),e.host.renderAbsolute(t.trigger),e.host.engine.i18n("ui.trigger.timeSkip.promptExplainer"));r===void 0||r===""||r.startsWith("-")||(t.trigger=e.host.parseAbsolute(r)??t.trigger)},onUnCheck:r=>{e.host.engine.imessage("status.auto.disable",[a])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.maxButton.inactive=!t.enabled||t.max===-1,this.settingItem.triggerButton.inactive=!t.enabled||t.trigger===-1,this.settingItem.maxButton.ineffective=n.enabled&&t.enabled&&t.max===0,this._cycles.expando.ineffective=n.enabled&&t.enabled&&!Object.values(t.cycles).some(r=>r.enabled),this._seasons.expando.ineffective=n.enabled&&t.enabled&&!Object.values(t.seasons).some(r=>r.enabled)}});u(this,"_cycles");u(this,"_seasons");u(this,"_activeHeatTransferUI");this.settingItem.triggerButton.element.removeClass(C.lastHeadAction),this._cycles=new _e(this,new ue(this,X(this.host.engine.i18n("ui.cycles")),{classes:[D.checked,D.setting],icon:A.Cycles}).addChildrenHead([new M(this,{classes:[B.fillSpace]})])).addChildrenContent([new As(this,this.setting.cycles,{onCheckCycle:r=>{this.host.engine.imessage("time.skip.cycle.enable",[r])},onUnCheckCycle:r=>{this.host.engine.imessage("time.skip.cycle.disable",[r])}})]),this._seasons=new _e(this,new ue(this,X(this.host.engine.i18n("trade.seasons")),{classes:[D.checked,D.setting],icon:A.Seasons}).addChildrenHead([new M(this,{classes:[B.fillSpace]})])).addChildrenContent([new Ut(this,this.setting.seasons,{onCheckSeason:r=>{this.host.engine.imessage("time.skip.season.enable",[r])},onUnCheckSeason:r=>{this.host.engine.imessage("time.skip.season.disable",[r])}})]),this._activeHeatTransferUI=new Wo(this,this.setting.activeHeatTransfer,i,t,n),this.addChildContent(new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([this._cycles,this._seasons,new S(this,this.setting.ignoreOverheat,this.host.engine.i18n("option.time.skip.ignoreOverheat")),this._activeHeatTransferUI]))}}class yi extends N{constructor(e,t,i){console.debug(...v(`Constructing ${yi.name}`));const n=e.host.engine.i18n("ui.timeCtrl");super(e,t,new S(e,t,n,{onCheck:o=>{e.host.engine.imessage("status.auto.enable",[n])},onUnCheck:o=>{e.host.engine.imessage("status.auto.disable",[n])}}).addChildrenHead([new M(e,{classes:[B.fillSpace]})]),{onRefreshRequest:()=>{this.expando.ineffective=t.enabled&&[this._timeSkipUi,this._resetUi].some(o=>o.expando.ineffective)}});u(this,"_items");u(this,"_accelerateTime");u(this,"_timeSkipUi");u(this,"_resetUi");const a=new x(this,{hasDisableAll:!1,hasEnableAll:!1}),r=this.host.engine.i18n("option.accelerate");this._accelerateTime=new H(this,this.setting.accelerateTime,i,r,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[r])},onRefresh:()=>{this._accelerateTime.triggerButton.inactive=!this.setting.accelerateTime.enabled,this._accelerateTime.triggerButton.ineffective=this.setting.enabled&&this.setting.accelerateTime.enabled&&this.setting.accelerateTime.trigger===-1},onSetTrigger:async()=>{const o=await E.prompt(this,this.host.engine.i18n("ui.trigger.accelerateTime.prompt"),this.host.engine.i18n("ui.trigger.accelerateTime.promptTitle",[this.host.renderPercentage(this.setting.accelerateTime.trigger,i.selected,!0)]),this.host.renderPercentage(this.setting.accelerateTime.trigger),this.host.engine.i18n("ui.trigger.accelerateTime.promptExplainer"));o===void 0||o===""||o.startsWith("-")||(this.setting.accelerateTime.trigger=this.host.parsePercentage(o))},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[r])}}),this._accelerateTime.triggerButton.element.addClass(C.lastHeadAction),this._timeSkipUi=new Go(this,this.setting.timeSkip,i,t),this._resetUi=new Ho(this,this.setting.reset,i),this._items=[this._accelerateTime,this._timeSkipUi,this._resetUi],a.addChildren(this._items),this.addChildContent(a)}}class wi extends N{constructor(s,e,t){console.debug(...v(`Constructing ${wi.name}`));const i=s.host.engine.i18n("ui.time");super(s,e,new H(s,e,t,i,{onCheck:n=>{s.host.engine.imessage("status.auto.enable",[i])},onRefresh:()=>{this.settingItem.triggerButton.inactive=!e.enabled||e.trigger===-1},onRefreshTrigger(){this.triggerButton.element[0].title=s.host.engine.i18n("ui.trigger.section",[e.trigger<0?s.host.engine.i18n("ui.trigger.section.inactive"):s.host.renderPercentage(e.trigger,t.selected,!0)])},onSetTrigger:async()=>{const n=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.percentage"),s.host.engine.i18n("ui.trigger.section.prompt",[i,e.trigger!==-1?s.host.renderPercentage(e.trigger,t.selected,!0):s.host.engine.i18n("ui.infinity")]),e.trigger!==-1?s.host.renderPercentage(e.trigger):"",s.host.engine.i18n("ui.trigger.section.promptExplainer"));if(n!==void 0){if(n===""||n.startsWith("-")){e.trigger=-1;return}e.trigger=s.host.parsePercentage(n)}},onUnCheck:n=>{s.host.engine.imessage("status.auto.disable",[i])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!e.enabled||e.trigger<0,this.settingItem.triggerButton.ineffective=e.enabled&&e.trigger<0&&Object.values(e.buildings).some(n=>n.enabled&&0<n.max&&n.trigger<0),this.expando.ineffective=e.enabled&&Object.values(e.buildings).some(n=>n.enabled&&(n.max===0||n.trigger<0&&e.trigger<0))}}),this.addChildrenContent([new x(this).addChildren([new q(this,this.host.engine.i18n("$workshop.chronoforge.label")),...this.host.game.time.chronoforgeUpgrades.filter(n=>!m(this.setting.buildings[n.name])).map(n=>{var a;return oe.getBuildOption(this,this.setting.buildings[n.name],t,this.setting,n.label,i,{delimiter:n.name===((a=this.host.game.time.chronoforgeUpgrades.at(-1))==null?void 0:a.name),renderLabelTrigger:!1})}),new q(this,this.host.engine.i18n("$science.voidSpace.label")),...this.host.game.time.voidspaceUpgrades.filter(n=>n.name in this.setting.buildings).map(n=>oe.getBuildOption(this,this.setting.buildings[n.name],t,this.setting,n.label,i,{renderLabelTrigger:!1}))]),new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new q(this,this.host.engine.i18n("ui.additional")),new S(this,this.setting.fixCryochambers,this.host.engine.i18n("option.fix.cry"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.fix.cry")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.fix.cry")])}})])])}}const Zo={buyButton:"_buyButton_10eul_1"};class ki extends Ce{constructor(e,t,i,n){super(e,void 0,{onClick:async()=>{const a=await E.prompt(e,e.host.engine.i18n("blackcoin.buy.prompt"),e.host.engine.i18n("blackcoin.buy.promptTitle",[e.host.renderAbsolute(t.buy,i.selected)]),e.host.renderAbsolute(t.buy),e.host.engine.i18n("blackcoin.buy.promptExplainer"));if(a!==void 0){if(a===""||a.startsWith("-")){t.buy=-1;return}t.buy=e.host.parseAbsolute(a)??t.buy}},onRefresh:()=>{var a;this.element.prop("title",this.host.engine.i18n("blackcoin.buy.title",[this.host.renderAbsolute(this.setting.buy)])),this.element.text(this.host.engine.i18n("blackcoin.buy",[this.host.renderAbsolute(this.setting.buy)])),(a=n==null?void 0:n.onRefresh)==null||a.call(this)}});u(this,"setting");this.element.addClass(Zo.buyButton),this.setting=t}toString(){return`[${ki.name}#${this.componentId}]`}}const Ko={sellButton:"_sellButton_1tmvd_1"};class _i extends Ce{constructor(e,t,i,n){super(e,void 0,{onClick:async()=>{const a=await E.prompt(e,e.host.engine.i18n("blackcoin.sell.prompt"),e.host.engine.i18n("blackcoin.sell.promptTitle",[e.host.renderAbsolute(t.sell,i.selected)]),e.host.renderAbsolute(t.sell),e.host.engine.i18n("blackcoin.sell.promptExplainer"));if(a!==void 0){if(a===""||a.startsWith("-")){t.sell=-1;return}t.sell=e.host.parseAbsolute(a)??t.sell}},onRefresh:()=>{var a;this.element.prop("title",this.host.engine.i18n("blackcoin.sell.title",[this.host.renderAbsolute(this.setting.sell)])),this.element.text(this.host.engine.i18n("blackcoin.sell",[this.host.renderAbsolute(this.setting.sell)])),(a=n==null?void 0:n.onRefresh)==null||a.call(n)}});u(this,"setting");this.element.addClass(Ko.sellButton),this.setting=t}toString(){return`[${_i.name}#${this.componentId}]`}}class Dt extends J{constructor(e,t,i){super(e,"",A.Eco,{border:!1,classes:[],onClick:()=>{var n,a;this.setting.limited=!this.setting.limited,this.setting.limited?(n=i==null?void 0:i.onLimitedCheck)==null||n.call(this):(a=i==null?void 0:i.onLimitedUnCheck)==null||a.call(this)},onRefresh:()=>{var n;this.updateTitle(this.host.engine.i18n(this.setting.limited?"ui.limited.on":"ui.limited.off")),this.setting.limited&&!this.inactive?this.element.removeClass(C.inactive):this.element.addClass(C.inactive),(n=i==null?void 0:i.onRefresh)==null||n.call(this)}});u(this,"setting");this.setting=t;for(const n of(i==null?void 0:i.classes)??[])this.element.addClass(n)}toString(){return`[${Dt.name}#${this.componentId}]`}}class Ci extends S{constructor(e,t,i,n){super(e,t,i,n);u(this,"limitedButton");this.limitedButton=new Dt(e,t,{border:!1,onLimitedCheck:n!=null&&n.onLimitedCheck?()=>{var a;return(a=n.onLimitedCheck)==null?void 0:a.call(this)}:void 0,onLimitedUnCheck:n!=null&&n.onLimitedUnCheck?()=>{var a;return(a=n.onLimitedUnCheck)==null?void 0:a.call(this)}:void 0}),this.addChildrenHead([new M(e,{classes:[B.fillSpace]}),this.limitedButton])}toString(){return`[${Ci.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}class Si extends Ci{constructor(e,t,i,n,a){super(e,t,n,a);u(this,"triggerButton");this.triggerButton=new Ee(e,t,i,{border:!1,onClick:async()=>{await a.onSetTrigger.call(this)},onRefresh:a!=null&&a.onRefreshTrigger?()=>{var r;return(r=a.onRefreshTrigger)==null?void 0:r.call(this)}:void 0,renderLabel:(a==null?void 0:a.renderLabelTrigger)??!0}),this.addChildHead(this.triggerButton)}toString(){return`[${Si.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}class Nt extends S{constructor(e,t,i,n){super(e,t,i,n);u(this,"maxButton");this.maxButton=new Pe(e,t,{border:!1,onClick:async()=>{await n.onSetMax.call(this)},onRefresh:n!=null&&n.onRefreshMax?()=>{var a;return(a=n.onRefreshMax)==null?void 0:a.call(this)}:void 0}),this.addChildrenHead([new M(e,{classes:[B.fillSpace]}),this.maxButton])}toString(){return`[${Nt.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}class Vo extends N{constructor(s,e,t,i){const n=s.host.engine.i18n("option.embassies");super(s,e,new H(s,e,t,n,{onCheck:r=>{s.host.engine.imessage("status.auto.enable",[n])},onSetTrigger:async()=>{const r=await E.prompt(s,s.host.engine.i18n("ui.trigger.embassies.prompt"),s.host.engine.i18n("ui.trigger.embassies.promptTitle",[s.host.renderPercentage(e.trigger,t.selected,!0)]),s.host.renderPercentage(e.trigger),s.host.engine.i18n("ui.trigger.embassies.promptExplainer"));r===void 0||r===""||r.startsWith("-")||(e.trigger=s.host.parsePercentage(r))},onUnCheck:r=>{s.host.engine.imessage("status.auto.disable",[n])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!e.enabled,this.settingItem.triggerButton.ineffective=e.enabled&&e.trigger===-1,this.expando.ineffective=i.enabled&&e.enabled&&!Object.values(e.races).some(r=>r.enabled)}});const a=new x(this).addChildren(this.host.game.diplomacy.races.filter(r=>r.name!=="leviathans"&&!m(this.setting.races[r.name])).map(r=>this._makeEmbassySetting(this,this.setting.races[r.name],t.selected,e,r.title)));this.addChildContent(a)}_makeEmbassySetting(s,e,t,i,n){const a=async()=>{const o=await E.prompt(s,s.host.engine.i18n("ui.max.prompt.absolute"),s.host.engine.i18n("ui.max.build.prompt",[n,s.host.renderAbsolute(e.max,t)]),s.host.renderAbsolute(e.max),s.host.engine.i18n("ui.max.build.promptExplainer"));if(o!==void 0){if(o===""||o.startsWith("-")){e.max=-1;return}o==="0"&&(e.enabled=!1),e.max=s.host.parseAbsolute(o)??e.max}},r=new Nt(s,e,n,{onCheck:o=>{if(s.host.engine.imessage("status.sub.enable",[n]),e.max===0&&!o)return a()},onRefresh:()=>{r.maxButton.inactive=!e.enabled||e.max===-1,r.maxButton.ineffective=i.enabled&&e.enabled&&e.max===0},onRefreshMax:()=>{r.maxButton.updateLabel(s.host.renderAbsolute(e.max)),r.maxButton.element[0].title=e.max<0?s.host.engine.i18n("ui.max.embassy.titleInfinite",[n]):e.max===0?s.host.engine.i18n("ui.max.embassy.titleZero",[n]):s.host.engine.i18n("ui.max.embassy.title",[s.host.renderAbsolute(e.max),n])},onSetMax:a,onUnCheck:()=>{s.host.engine.imessage("status.sub.disable",[n])}});return r.maxButton.element.addClass(C.lastHeadAction),r}}class xi extends N{constructor(e,t,i){console.debug(...v(`Constructing ${xi.name}`));const n=e.host.engine.i18n("ui.trade");super(e,t,new H(e,t,i,n,{onCheck:o=>{e.host.engine.imessage("status.auto.enable",[n])},onRefreshTrigger(){this.triggerButton.element[0].title=e.host.engine.i18n("ui.trigger.section",[t.trigger<0?e.host.engine.i18n("ui.trigger.section.inactive"):e.host.renderPercentage(t.trigger,i.selected,!0)])},onSetTrigger:async()=>{const o=await E.prompt(e,e.host.engine.i18n("ui.trigger.prompt.percentage"),e.host.engine.i18n("ui.trigger.section.prompt",[n,t.trigger!==-1?e.host.renderPercentage(t.trigger,i.selected,!0):e.host.engine.i18n("ui.infinity")]),t.trigger!==-1?e.host.renderPercentage(t.trigger):"",e.host.engine.i18n("ui.trigger.section.promptExplainer"));if(o!==void 0){if(o===""||o.startsWith("-")){t.trigger=-1;return}t.trigger=e.host.parsePercentage(o)}},onUnCheck:o=>{e.host.engine.imessage("status.auto.disable",[n])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!t.enabled||t.trigger===-1,this.settingItem.triggerButton.ineffective=t.enabled&&t.trigger<0&&Object.values(t.races).some(o=>o.enabled&&o.trigger<0),this.expando.ineffective=t.enabled&&Object.values(this._racePanels).some(o=>o.expando.ineffective||o.settingItem.triggerButton.ineffective)}});u(this,"_racePanels");this._racePanels=this.host.game.diplomacy.races.filter(o=>!m(this.setting.races[o.name])).map(o=>{var l;return this._getTradeOption(this,this.setting.races[o.name],i,t,o.title,n,o.name===((l=this.host.game.diplomacy.races.at(-2))==null?void 0:l.name))});const a=new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren(this._racePanels);a.addChild(new S(this,this.setting.feedLeviathans,this.host.engine.i18n("option.autofeed"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.autofeed")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.autofeed")])}})),a.addChild(new N(this,this.setting.tradeBlackcoin,new H(this,this.setting.tradeBlackcoin,i,this.host.engine.i18n("option.crypto"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.crypto")])},onRefreshRequest(){this.triggerButton.inactive=!this.setting.enabled||this.setting.trigger===-1},onSetTrigger:async()=>{const o=await E.prompt(this,this.host.engine.i18n("ui.trigger.crypto.promptTitle"),this.host.engine.i18n("ui.trigger.crypto.prompt",[this.host.renderAbsolute(this.setting.tradeBlackcoin.trigger,i.selected)]),this.host.renderAbsolute(this.setting.tradeBlackcoin.trigger),this.host.engine.i18n("ui.trigger.crypto.promptExplainer"));o===void 0||o===""||o.startsWith("-")||(this.setting.tradeBlackcoin.trigger=this.host.parseAbsolute(o)??this.setting.tradeBlackcoin.trigger)},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.crypto")])}})).addChildrenContent([new ki(this,this.setting.tradeBlackcoin,i),new _i(this,this.setting.tradeBlackcoin,i)])),this.addChildContent(a);const r=new x(this,{hasDisableAll:!1,hasEnableAll:!1});r.addChild(new q(this,this.host.engine.i18n("ui.additional"))),r.addChild(new Vo(this,this.setting.buildEmbassies,i,t)),r.addChild(new S(this,this.setting.unlockRaces,this.host.engine.i18n("ui.upgrade.races"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("ui.upgrade.races")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("ui.upgrade.races")])}})),this.addChildContent(r)}_getTradeOption(e,t,i,n,a,r,o=!1,l=!1){const h=new Si(e,t,i,a,{delimiter:o,onCheck:()=>{e.host.engine.imessage("status.sub.enable",[a])},onLimitedCheck:()=>{e.host.engine.imessage("trade.limited",[a])},onLimitedUnCheck:()=>{e.host.engine.imessage("trade.unlimited",[a])},onRefreshTrigger:()=>{h.triggerButton.element[0].title=e.host.engine.i18n("ui.trigger",[t.trigger<0?n.trigger<0?e.host.engine.i18n("ui.trigger.section.blocked",[r]):`${e.host.renderPercentage(n.trigger,i.selected,!0)} (${e.host.engine.i18n("ui.trigger.section.inherited")})`:e.host.renderPercentage(t.trigger,i.selected,!0)])},onSetTrigger:async()=>{const g=await E.prompt(e,e.host.engine.i18n("ui.trigger.prompt.percentage"),e.host.engine.i18n("ui.trigger.section.prompt",[a,t.trigger!==-1?e.host.renderPercentage(t.trigger,i.selected,!0):e.host.engine.i18n("ui.trigger.section.inherited")]),t.trigger!==-1?e.host.renderPercentage(t.trigger):"",e.host.engine.i18n("ui.trigger.section.promptExplainer"));if(g!==void 0){if(g===""||g.startsWith("-")){t.trigger=-1;return}t.trigger=e.host.parsePercentage(g)}},onUnCheck:()=>{e.host.engine.imessage("status.sub.disable",[a])},renderLabelTrigger:!1,upgradeIndicator:l}),d=new N(e,t,h,{onRefreshRequest:()=>{h.limitedButton.inactive=!t.enabled||!t.limited,h.triggerButton.inactive=!t.enabled||t.trigger===-1,h.triggerButton.ineffective=n.enabled&&t.enabled&&n.trigger===-1&&t.trigger===-1,d.expando.ineffective=n.enabled&&t.enabled&&!t.seasons.autumn.enabled&&!t.seasons.spring.enabled&&!t.seasons.summer.enabled&&!t.seasons.winter.enabled}}).addChildContent(new Ut(e,t.seasons,{onCheckSeason:g=>{e.host.engine.imessage("trade.season.enable",[X(a),g])},onUnCheckSeason:g=>{e.host.engine.imessage("trade.season.disable",[X(a),g])}}));return d}}const Ti={spacer:"_spacer_auis8_44",ui:"_ui_auis8_49",showActivity:"_showActivity_auis8_66"};class Ei extends N{constructor(e,t,i){console.debug(...v(`Constructing ${Ei.name}`));const n=e.host.engine.i18n("ui.distribute");super(e,t,new S(e,t,n,{onCheck:o=>{e.host.engine.imessage("status.auto.enable",[n])},onUnCheck:o=>{e.host.engine.imessage("status.auto.disable",[n])}}).addChildrenHead([new M(e,{classes:[B.fillSpace]})]),{onRefreshRequest:()=>{this.expando.ineffective=t.enabled&&Object.values(t.jobs).some(o=>o.enabled&&o.max===0)}});u(this,"_hunt");u(this,"_festivals");u(this,"_promoteKittens");u(this,"_promoteLeader");u(this,"_electLeader");const a=new x(this).addChildren(this.host.game.village.jobs.filter(o=>!m(this.setting.jobs[o.name])).map(o=>this._getDistributeOption(this.setting.jobs[o.name],i.selected,t,o.title)));this.addChildContent(a);const r=new x(this,{hasDisableAll:!1,hasEnableAll:!1});r.addChild(new q(this,this.host.engine.i18n("ui.additional"))),this._hunt=new H(this,this.setting.hunt,i,this.host.engine.i18n("option.hunt"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.hunt")])},onRefreshRequest:()=>{this._hunt.triggerButton.inactive=!this.setting.hunt.enabled,this._hunt.triggerButton.ineffective=this.setting.enabled&&this.setting.hunt.enabled&&this.setting.hunt.trigger===-1},onSetTrigger:async()=>{const o=await E.prompt(this,this.host.engine.i18n("ui.trigger.prompt.percentage"),this.host.engine.i18n("ui.trigger.hunt.prompt",[this.host.renderPercentage(this.setting.hunt.trigger,i.selected,!0)]),this.host.renderPercentage(this.setting.hunt.trigger),this.host.engine.i18n("ui.trigger.hunt.promptExplainer"));o===void 0||o===""||o.startsWith("-")||(this.setting.hunt.trigger=this.host.parsePercentage(o))},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.hunt")])}}),this._hunt.triggerButton.element.addClass(C.lastHeadAction),r.addChild(this._hunt),this._festivals=new S(this,this.setting.holdFestivals,this.host.engine.i18n("option.festival"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.festival")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.festival")])}}),r.addChild(this._festivals),this._promoteKittens=new H(this,this.setting.promoteKittens,i,this.host.engine.i18n("option.promotekittens"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.promotekittens")])},onRefresh:()=>{this._promoteKittens.triggerButton.inactive=!this.setting.promoteKittens.enabled,this._promoteKittens.triggerButton.ineffective=this.setting.enabled&&this.setting.promoteKittens.enabled&&this.setting.promoteKittens.trigger===-1},onSetTrigger:async()=>{const o=await E.prompt(this,this.host.engine.i18n("ui.trigger.promoteKittens.promptTitle"),this.host.engine.i18n("ui.trigger.promoteKittens.prompt",[this.host.renderPercentage(this.setting.promoteKittens.trigger,i.selected,!0)]),this.host.renderPercentage(this.setting.promoteKittens.trigger),this.host.engine.i18n("ui.trigger.promoteKittens.promptExplainer"));o===void 0||o===""||o.startsWith("-")||(this.setting.promoteKittens.trigger=this.host.parsePercentage(o))},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.promotekittens")])}}),this._promoteKittens.triggerButton.element.addClass(C.lastHeadAction),r.addChild(this._promoteKittens),this._promoteLeader=new S(this,this.setting.promoteLeader,this.host.engine.i18n("option.promote"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.promote")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.promote")])}}),r.addChild(this._promoteLeader);for(const o of this.setting.electLeader.job.options)o.value==="any"?o.label=this.host.engine.i18n("option.elect.job.any"):o.label=this.host.engine.i18n(`$village.job.${o.value}`);for(const o of this.setting.electLeader.trait.options)o.label=this.host.engine.i18n(`$village.trait.${o.value}`);this._electLeader=new S(this,this.setting.electLeader,this.host.engine.i18n("option.elect"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.elect")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.elect")])}}).addChildren([new Ie(this,this.host.engine.i18n("option.elect.job"),this.setting.electLeader.job),new Ie(this,this.host.engine.i18n("option.elect.trait"),this.setting.electLeader.trait)]),r.addChild(this._electLeader),this.addChildContent(r)}_getDistributeOption(e,t,i,n,a=!1){const r=async()=>{const l=await E.prompt(this,this.host.engine.i18n("ui.max.distribute.prompt",[n]),this.host.engine.i18n("ui.max.distribute.promptTitle",[n,this.host.renderAbsolute(e.max,t)]),this.host.renderAbsolute(e.max),this.host.engine.i18n("ui.max.distribute.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){e.max=-1;return}l==="0"&&(e.enabled=!1),e.max=this.host.parseAbsolute(l)??e.max}},o=new Nt(this,e,n,{delimiter:a,onCheck:l=>{if(this.host.engine.imessage("status.sub.enable",[n]),e.max===0&&!l)return r()},onRefresh:()=>{o.maxButton.inactive=!e.enabled||e.max===-1,o.maxButton.ineffective=i.enabled&&e.enabled&&e.max===0},onRefreshMax:()=>{o.maxButton.updateLabel(this.host.renderAbsolute(e.max)),o.maxButton.element[0].title=e.max<0?this.host.engine.i18n("ui.max.distribute.titleInfinite",[n]):e.max===0?this.host.engine.i18n("ui.max.distribute.titleZero",[n]):this.host.engine.i18n("ui.max.distribute.title",[this.host.renderAbsolute(e.max),n])},onSetMax:r,onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[n])}});return o.maxButton.element.addClass(C.lastHeadAction),o}}class Ri extends S{constructor(e,t,i,n,a){super(e,t,n,a);u(this,"limitedButton");u(this,"maxButton");u(this,"triggerButton");this.limitedButton=new Dt(e,t,{...a,classes:[Et.headAction]}),this.maxButton=new Pe(e,t,{alignment:"right",border:!1,classes:[C.headAction],onClick:()=>a.onSetMax.call(this),onRefresh:a!=null&&a.onRefreshMax?()=>{var r;return(r=a.onRefreshMax)==null?void 0:r.call(this)}:void 0}),this.triggerButton=new Ee(e,t,i,{border:!1,classes:[C.lastHeadAction],onClick:async()=>{await a.onSetTrigger.call(this)},onRefresh:a!=null&&a.onRefreshTrigger?()=>{var r;return(r=a.onRefreshTrigger)==null?void 0:r.call(this)}:void 0,renderLabel:(a==null?void 0:a.renderLabelTrigger)??!0}),this.addChildrenHead([new M(e,{classes:[B.fillSpace]}),this.limitedButton,this.maxButton,this.triggerButton])}toString(){return`[${Ri.name}#${this.componentId}]`}}class jo extends N{constructor(s,e,t){const i=s.host.engine.i18n("ui.upgrade.upgrades");super(s,e,new H(s,e,t,i,{onCheck:l=>{s.host.engine.imessage("status.auto.enable",[i])},onRefreshTrigger(){this.triggerButton.element[0].title=s.host.engine.i18n("ui.trigger",[e.trigger===-1?s.host.engine.i18n("ui.trigger.section.inactive"):s.host.renderPercentage(e.trigger,t.selected,!0)])},onSetTrigger:async()=>{const l=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.percentage"),s.host.engine.i18n("ui.trigger.section.prompt",[i,e.trigger!==-1?s.host.renderPercentage(e.trigger,t.selected,!0):s.host.engine.i18n("ui.infinity")]),e.trigger!==-1?s.host.renderPercentage(e.trigger):"",s.host.engine.i18n("ui.trigger.section.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){e.trigger=-1;return}e.trigger=s.host.parsePercentage(l)}},onUnCheck:l=>{s.host.engine.imessage("status.auto.disable",[i])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!e.enabled||e.trigger===-1,this.settingItem.triggerButton.ineffective=e.enabled&&e.trigger<0&&Object.values(e.upgrades).some(l=>l.enabled&&l.trigger<0),this.expando.ineffective=e.enabled&&!Object.values(e.upgrades).some(l=>l.enabled)}});const n=this.host.game.workshop.upgrades.filter(l=>!m(this.setting.upgrades[l.name])),a=[];let r=n[0].label,o;for(const l of n.sort((h,d)=>h.label.localeCompare(d.label,t.selected))){const h=this.setting.upgrades[l.name],d=new H(this,h,t,l.label,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[l.label])},onRefreshRequest:()=>{d.triggerButton.inactive=!h.enabled||h.trigger===-1,d.triggerButton.ineffective=e.enabled&&h.enabled&&e.trigger===-1&&h.trigger===-1},onRefreshTrigger:()=>{d.triggerButton.element[0].title=this.host.engine.i18n("ui.trigger",[h.trigger<0?e.trigger<0?this.host.engine.i18n("ui.trigger.build.blocked",[i]):`${this.host.renderPercentage(e.trigger,t.selected,!0)} (${this.host.engine.i18n("ui.trigger.section.inherited")})`:this.host.renderPercentage(h.trigger,t.selected,!0)])},onSetTrigger:async()=>{const g=await E.prompt(this,this.host.engine.i18n("ui.trigger.prompt.percentage"),this.host.engine.i18n("ui.trigger.section.prompt",[i,h.trigger!==-1?this.host.renderPercentage(h.trigger,t.selected,!0):this.host.engine.i18n("ui.trigger.section.inherited")]),h.trigger!==-1?this.host.renderPercentage(h.trigger):"",this.host.engine.i18n("ui.trigger.section.promptExplainer"));if(g!==void 0){if(g===""||g.startsWith("-")){h.trigger=-1;return}h.trigger=this.host.parsePercentage(g)}},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[l.label])},renderLabelTrigger:!1});d.triggerButton.element.addClass(C.lastHeadAction),this.host.engine.localeSupportsFirstLetterSplits(t.selected)&&r[0]!==l.label[0]&&(m(o)||o.element.addClass(ke.delimiter),d.element.addClass(B.splitter)),o=d,a.push(d),r=l.label}this.addChildContent(new x(this).addChildren(a))}}class Mi extends N{constructor(e,t,i){console.debug(...v(`Constructing ${Mi.name}`));const n=e.host.engine.i18n("ui.craft");super(e,t,new H(e,t,i,n,{onCheck:l=>{e.host.engine.imessage("status.auto.enable",[n])},onRefreshTrigger(){this.triggerButton.element[0].title=e.host.engine.i18n("ui.trigger.section",[t.trigger<0?e.host.engine.i18n("ui.trigger.section.inactive"):e.host.renderPercentage(t.trigger,i.selected,!0)])},onSetTrigger:async()=>{const l=await E.prompt(e,e.host.engine.i18n("ui.trigger.prompt.percentage"),e.host.engine.i18n("ui.trigger.section.prompt",[n,t.trigger!==-1?e.host.renderPercentage(t.trigger,i.selected,!0):e.host.engine.i18n("ui.infinity")]),t.trigger!==-1?e.host.renderPercentage(t.trigger):"",e.host.engine.i18n("ui.trigger.section.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){t.trigger=-1;return}t.trigger=e.host.parsePercentage(l)}},onUnCheck:l=>{e.host.engine.imessage("status.auto.disable",[n])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!t.enabled||t.trigger===-1,this.settingItem.triggerButton.ineffective=t.enabled&&t.trigger<0&&Object.values(t.resources).some(l=>l.enabled&&l.max!==0&&l.trigger<0)}});u(this,"_crafts");let a=[];game.challenges.getChallenge("ironWill").active||(this.setting.resources.bloodstone.enabled=!1,this.setting.resources.tMythril.enabled=!1,a=["bloodstone","tMythril"]);const r=this.host.game.workshop.crafts.filter(l=>!a.includes(l.name)&&!m(this.setting.resources[l.name])).map(l=>[this.setting.resources[l.name],X(l.label)]);this._crafts=[];for(const[l,h]of r){const d=async()=>{const f=await E.prompt(this,this.host.engine.i18n("ui.max.craft.prompt",[h]),this.host.engine.i18n("ui.max.craft.promptTitle",[h,this.host.renderAbsolute(l.max,i.selected)]),this.host.renderAbsolute(l.max),this.host.engine.i18n("ui.max.craft.promptExplainer"));if(f!==void 0){if(f===""||f.startsWith("-")){l.max=-1;return}f==="0"&&(l.enabled=!1),l.max=this.host.parseAbsolute(f)??l.max}},g=new Ri(this,l,i,h,{delimiter:l.resource==="kerosene"||l.resource==="blueprint",onCheck:f=>{if(this.host.engine.imessage("status.sub.enable",[h]),l.max===0&&!f)return d()},onLimitedCheck:()=>{this.host.engine.imessage("craft.limited",[h])},onLimitedUnCheck:()=>{this.host.engine.imessage("craft.unlimited",[h])},onRefreshMax:()=>{g.maxButton.updateLabel(this.host.renderAbsolute(l.max)),g.maxButton.element[0].title=l.max<0?this.host.engine.i18n("ui.max.craft.titleInfinite",[h]):l.max===0?this.host.engine.i18n("ui.max.craft.titleZero",[h]):this.host.engine.i18n("ui.max.craft.title",[this.host.renderAbsolute(l.max),h])},onRefreshRequest:()=>{g.limitedButton.inactive=!l.enabled||!l.limited,g.maxButton.inactive=!l.enabled||l.max===-1,g.maxButton.ineffective=t.enabled&&l.enabled&&l.max===0,g.triggerButton.inactive=!l.enabled||l.trigger===-1,g.triggerButton.ineffective=t.enabled&&l.enabled&&t.trigger===-1&&l.trigger===-1},onRefreshTrigger:()=>{g.triggerButton.element[0].title=this.host.engine.i18n("ui.trigger",[l.trigger<0?t.trigger<0?this.host.engine.i18n("ui.trigger.build.blocked",[h]):`${this.host.renderPercentage(t.trigger,i.selected,!0)} (${this.host.engine.i18n("ui.trigger.build.inherited")})`:this.host.renderPercentage(l.trigger,i.selected,!0)])},onSetMax:d,onSetTrigger:async()=>{const f=await E.prompt(this,this.host.engine.i18n("ui.trigger.prompt.percentage"),this.host.engine.i18n("ui.trigger.section.prompt",[h,l.trigger!==-1?this.host.renderPercentage(l.trigger,i.selected,!0):this.host.engine.i18n("ui.trigger.build.inherited")]),l.trigger!==-1?this.host.renderPercentage(l.trigger):"",this.host.engine.i18n("ui.trigger.build.promptExplainer"));if(f!==void 0){if(f===""||f.startsWith("-")){l.trigger=-1;return}l.trigger=this.host.parsePercentage(f)}},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[h])},renderLabelTrigger:!1});this._crafts.push(g),l.resource==="ship"&&this._crafts.push(new S(this,this.setting.shipOverride,this.host.engine.i18n("option.shipOverride"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.shipOverride")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.shipOverride")])},upgradeIndicator:!0}))}const o=new x(this,{onReset:()=>{this.setting.load({resources:new xt().resources})}}).addChildren(this._crafts);this.addChildContent(o),this.addChildContent(new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new jo(this,this.setting.unlockUpgrades,i)]))}}class Le extends G{constructor(e){console.debug(...v(`Constructing ${Le.name}`));super({host:e},{});u(this,"showActivity");u(this,"_engineUi");u(this,"_sections");u(this,"stateManagementUi");u(this,"_refreshTimeout");const t=e.engine;this._engineUi=new la(this,t.settings),this.stateManagementUi=new vi(this,t.settings.states,t.settings.locale),this._sections=[new ii(this,t.bonfireManager.settings,t.settings.locale),new Ei(this,t.villageManager.settings,t.settings.locale),new gi(this,t.scienceManager.settings,t.settings.locale),new Mi(this,t.workshopManager.settings,t.settings.locale),new di(this,t.settings.resources,t.settings.locale),new xi(this,t.tradeManager.settings,t.settings.locale),new ci(this,t.religionManager.settings,t.settings.locale),new mi(this,t.spaceManager.settings,t.settings.locale),new wi(this,t.timeManager.settings,t.settings.locale),new yi(this,t.timeControlManager.settings,t.settings.locale),new li(this,t.settings.filters),this.stateManagementUi,new ri(this,t.settings,t.settings.locale)],this.parent=this,this.element=$("<div/>").addClass("kitten-scientists").addClass(Ti.ui);for(const h of[this._engineUi,...this._sections])this.addChild(h);const i=$("<ul/>");i.append(this._engineUi.element);for(const h of this._sections)i.append(h.element);this.element.append(i);const n=this._engineUi.expando;let a=!1;n.element.on("click",()=>{a=!a;for(const h of this._sections)h.toggle(a,!0)});let r=0;for(const h of this._sections)h.element[0].addEventListener("panelHidden",()=>{--r,r===0&&(a=!1),a||n.setCollapsed()}),h.element[0].addEventListener("panelShown",()=>{++r,a=!0,n.setExpanded()});this.showActivity=$("<span/>",{html:`<svg style="width: 18px; height: 18px;" viewBox="0 -960 960 960" fill="currentColor"><path d="${A.Summary}"/></svg>`,title:e.engine.i18n("summary.show")}).addClass(Ti.showActivity),this.showActivity.on("click",()=>{e.engine.displayActivitySummary()}),$("#clearLog").prepend(this.showActivity);const o=t.settings.ksColumn.enabled&&game.colorScheme!=="sleek";o?$("#rightColumn").after(`<div id="ksColumn" class="column"><span class="${Ti.spacer}"></span></div>`):$("#ksColumn").remove();const l=$(o?"#ksColumn":"#rightColumn");if(l.length===0){const h=$("#optionsPage .full-screen-position .page .page-content");h.length===0?console.warn(...v("Unable to find right column to inject UI into. Running headless.")):(h.append(this.element),this.element.attr("style","border-top:1px solid grey; padding:15px"))}else l.prepend(this.element);this.element=this.element,this._needsRefresh=!1}toString(){return`[${Le.name}#${this.componentId}]`}destroy(){this._refreshTimeout!==void 0&&(T.window.clearTimeout(this._refreshTimeout),this._refreshTimeout=void 0),this.showActivity.remove(),this.element.remove()}requestRefresh(e=!0,t=0,i=!1){if(this._needsRefresh){this._refreshTimeout===void 0&&console.error(...v("User interface claims to have a refresh pending, but there isn't."));return}this._refreshTimeout=T.window.setTimeout(()=>{const[n,a]=ye(()=>this.refresh());console.info(...v(`UI refresh took ${na(a)}.`)),this._refreshTimeout=void 0},0),super.requestRefresh(!0,t,!1)}forceFullRefresh(){console.warn(...v("Forcing refresh on all user interface components...")),this.requestRefresh(),console.warn(...v("Refresh on all user interface components enforced."))}}const Oe=(c="")=>{if(m("2.0.0-beta.11-live"))throw Error("Build error: RELEASE_VERSION is not defined.");return`${c}2.0.0-beta.11-live`};class de{constructor(s,e,t="en",i){u(this,"game");u(this,"i18nEngine");u(this,"_userInterface");u(this,"engine");u(this,"_gameBeforeSaveHandle");u(this,"_serverLoadHandle");u(this,"_saveManager",{load:s=>{console.info(...v("Looking for Kitten Scientists engine state in save data..."));const e=T.tryEngineStateFromSaveData("ks",s);if(!e){console.info(...v("The Kittens Game save data did not contain a script state."));return}console.info(...v("Found Kitten Scientists engine state in save data.")),this.engine.stateLoad(e),this.refreshEntireUserInterface()},resetState:()=>null,save:s=>{}});var n;console.info(...v(`Kitten Scientists ${Oe("v")} constructed. Checking for previous instances...`)),"kittenScientists"in T.window&&(console.warn(...v("Detected existing KS instance. Trying to unload it...")),(n=T.window.kittenScientists)==null||n.unload()),console.info(...v("You are on the 'fixed' release channel.")),this.game=s,this.i18nEngine=e;try{this.engine=new re(this,t),this._userInterface=new Le(this)}catch(a){throw console.error(...v("Failed to construct core components.",a)),typeof GM<"u"&&console.warn(...v("Detected running in Greasemonkey.")),a}m(i)?this._userInterface.stateManagementUi.loadAutoSave():this.setSettings(i)}rebuildUi(){this._userInterface.destroy(),this._userInterface=new Le(this),this._userInterface.forceFullRefresh()}validateGame(){Qt.validateGame(this.game,this.engine.scienceManager.settings),St.validateGame(this.game,this.engine.spaceManager.settings),xt.validateGame(this.game,this.engine.workshopManager.settings)}unload(){console.warn(...v("Unloading Kitten Scientists...")),this.engine.stop(),this._userInterface.destroy(),$("#ks-styles").remove(),this._gameBeforeSaveHandle!==void 0&&(T.window.dojo.unsubscribe(this._gameBeforeSaveHandle),this._gameBeforeSaveHandle=void 0),this._serverLoadHandle!==void 0&&(T.window.dojo.unsubscribe(this._serverLoadHandle),this._gameBeforeSaveHandle=void 0);const s=this.game.managers.indexOf(this._saveManager);-1<s&&this.game.managers.splice(s,1),T.window.kittenScientists=void 0,console.warn(...v("Kitten Scientists have been unloaded!"))}run(){this.game.console.maxMessages=1e3,this.refreshEntireUserInterface(),this.engine.settings.enabled&&this.engine.start(!0),this.engine.imessage("status.ks.init"),this.runUpdateCheck().catch(R(console)),this._gameBeforeSaveHandle!==void 0&&(T.window.dojo.unsubscribe(this._gameBeforeSaveHandle),this._gameBeforeSaveHandle=void 0),this._gameBeforeSaveHandle=T.window.dojo.subscribe("game/beforesave",s=>{console.info(...v("Injecting Kitten Scientists engine state into save data..."));const e=this.getSettings();s.ks={state:[e]},this._userInterface.stateManagementUi.storeAutoSave(e),document.dispatchEvent(new CustomEvent("ks.reportSavegame",{detail:s}))}),this._serverLoadHandle!==void 0&&(T.window.dojo.unsubscribe(this._serverLoadHandle),this._gameBeforeSaveHandle=void 0),this._serverLoadHandle=T.window.dojo.subscribe("server/load",s=>{const e=T.tryEngineStateFromSaveData("ks",s);if(!e){console.info(...v("The Kittens Game save data did not contain a script state. Trying to load Auto-Save settings..."));return}console.info(...v("Found! Loading settings...")),this.engine.stateLoad(e)})}async runUpdateCheck(){{console.debug(...v("No update check on 'fixed' release channel."));return}}refreshEntireUserInterface(){console.info(...v("Requesting entire user interface to be refreshed.")),this._userInterface.forceFullRefresh()}parseFloat(s){if(s===null||s==="")return null;const e=/[KMGTP]$/i.test(s),t=s.substring(0,s.length-(e?1:0));let i=s.includes("e")||e?Number.parseFloat(t):Number.parseInt(t);if(e){const n=s.substring(s.length-1).toUpperCase();i=i*1e3**["","K","M","G","T","P"].indexOf(n)}return(i===Number.POSITIVE_INFINITY||i<0)&&(i=-1),i}parseAbsolute(s){const e=this.parseFloat(s);return e!==null?Math.round(e):null}parsePercentage(s){const e=s.trim().replace(/%$/,"");return Math.max(0,Math.min(1,Number.parseFloat(e)/100))}renderAbsolute(s,e="invariant"){return s<0||s===Number.POSITIVE_INFINITY?"∞":e!=="invariant"&&Math.floor(Math.log10(s))<9?new Intl.NumberFormat(e,{maximumFractionDigits:0,style:"decimal"}).format(s):this.game.getDisplayValueExt(s,!1,!1)}renderPercentage(s,e="invariant",t){return s<0||s===Number.POSITIVE_INFINITY?"∞":e!=="invariant"?new Intl.NumberFormat(e,{style:"percent"}).format(s):`${this.game.getDisplayValueExt(s*100,!1,!1)}${t?"%":""}`}renderFloat(s,e="invariant"){return s<0||s===Number.POSITIVE_INFINITY?"∞":e!=="invariant"?new Intl.NumberFormat(e,{style:"decimal"}).format(s):this.game.getDisplayValueExt(s,!1,!1)}static encodeSettings(s,e=!0){const t=JSON.stringify(s);return e?T.window.LZString.compressToBase64(t):t}static decodeSettings(s){try{const i=JSON.parse(s);return de.unknownAsEngineStateOrThrow(i)}catch{}if(s.match(/\r?\n/))throw new bt("Multi-line non-JSON input can't be decoded.");const e=T.window.LZString.decompressFromBase64(s),t=JSON.parse(e);return de.unknownAsEngineStateOrThrow(t)}getSettings(){return this.engine.stateSerialize()}getSettingsAsJson(){return JSON.stringify(this.getSettings())}setSettings(s){console.info(...v("Loading engine state..."));const e=this.engine.settings.ksColumn.enabled!==s.engine.ksColumn.enabled;this.engine.stateLoad(s),e&&this.rebuildUi(),this._userInterface.refresh(!0)}importSettingsFromString(s){const e=de.decodeSettings(s);this.setSettings(e)}async copySettings(s=this.getSettings(),e=!0){const t=de.encodeSettings(s,e);await T.window.navigator.clipboard.writeText(t)}static unknownAsEngineStateOrThrow(s){const e=s.v;if(!m(e)&&typeof e=="string"&&e.startsWith("2"))return s;throw new Error("Not a valid engine state.")}installSaveManager(){console.info(...v("Installing save game manager...")),this.game.managers.push(this._saveManager)}}const Ps=async()=>{const c=await new T().waitForGame(de,"ks");T.window.kittenScientists=c,c.validateGame(),c.run()};typeof GM<"u"&&Ps().catch(R(console)),U.main=Ps,Object.defineProperty(U,Symbol.toStringTag,{value:"Module"})});
|
|
22
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2l0dGVuLXNjaWVudGlzdHMubWluLmluamVjdC5qcyIsInNvdXJjZXMiOlsiLi4vbm9kZV9tb2R1bGVzL0BvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvY29uc29sZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9Ab2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanMiLCIuLi9ub2RlX21vZHVsZXMvQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2Vycm9ycy9BYnN0cmFjdEVycm9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvSW52YWxpZE9wZXJhdGlvbkVycm9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9kZWJ1Zy5qcyIsIi4uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvY29uc3RhbnRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9yZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvcGFyc2Utb3B0aW9ucy5qcyIsIi4uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvaWRlbnRpZmllcnMuanMiLCIuLi9ub2RlX21vZHVsZXMvc2VtdmVyL2NsYXNzZXMvc2VtdmVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2d0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvSW50ZXJuYWxFcnJvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9Ab2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZXJyb3JzL1Vua25vd25FcnJvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9Ab2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZXJyb3JzL2Vycm9yLXNlcmlhbGl6ZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL21lYXN1cmVtZW50L3BlcmZvcm1hbmNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL2FycmF5LmpzIiwiLi4vc291cmNlL3Rvb2xzL0xvZy50cyIsIi4uL3NvdXJjZS90b29scy9FbnRyaWVzLnRzIiwiLi4vc291cmNlL3Rvb2xzL0Zvcm1hdC50cyIsIi4uL3NvdXJjZS9oZWxwZXIvQnVsa1B1cmNoYXNlSGVscGVyLnRzIiwiLi4vc291cmNlL3R5cGVzL2luZGV4LnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1NldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL0J1aWxkaW5nVXBncmFkZVNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL0JvbmZpcmVTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9UYWJNYW5hZ2VyLnRzIiwiLi4vc291cmNlL0JvbmZpcmVNYW5hZ2VyLnRzIiwiLi4vc291cmNlL2hlbHBlci9BY3Rpdml0eVN1bW1hcnkudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvUmVsaWdpb25TZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9SZWxpZ2lvbk1hbmFnZXIudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvUG9saWN5U2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvVGVjaFNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1NjaWVuY2VTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9VcGdyYWRlTWFuYWdlci50cyIsIi4uL25vZGVfbW9kdWxlcy9Ab2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvYXN5bmMvYXN5bmMuanMiLCIuLi9zb3VyY2UvVXNlclNjcmlwdExvYWRlci50cyIsIi4uL3NvdXJjZS9TY2llbmNlTWFuYWdlci50cyIsIi4uL3NvdXJjZS9zZXR0aW5ncy9NaXNzaW9uU2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvU3BhY2VTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9TcGFjZU1hbmFnZXIudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvTG9nRmlsdGVyU2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvVXBncmFkZVNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1dvcmtzaG9wU2V0dGluZ3MudHMiLCIuLi9zb3VyY2UvV29ya3Nob3BNYW5hZ2VyLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1Jlc291cmNlc1NldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1N0YXRlU2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvRW5naW5lU2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvUmVzZXRCb25maXJlU2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvUmVzZXRSZWxpZ2lvblNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1Jlc2V0UmVzb3VyY2VzU2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvUmVzZXRTcGFjZVNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1Jlc2V0VGltZVNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1Jlc2V0VXBncmFkZVNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1Jlc2V0U2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvVGltZVNraXBIZWF0U2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvVGltZVNraXBTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9zZXR0aW5ncy9UaW1lQ29udHJvbFNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1RpbWVTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9zZXR0aW5ncy9FbWJhc3N5U2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvVHJhZGVTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9zZXR0aW5ncy9FbGVjdExlYWRlclNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1ZpbGxhZ2VTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9UaW1lQ29udHJvbE1hbmFnZXIudHMiLCIuLi9zb3VyY2UvVGltZU1hbmFnZXIudHMiLCIuLi9zb3VyY2UvVHJhZGVNYW5hZ2VyLnRzIiwiLi4vc291cmNlL2hlbHBlci9NYXRlcmlhbHNDYWNoZS50cyIsIi4uL3NvdXJjZS9WaWxsYWdlTWFuYWdlci50cyIsIi4uL3NvdXJjZS9FbmdpbmUudHMiLCIuLi9ub2RlX21vZHVsZXMvQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2Zvcm1hdC9taWxsaXNlY29uZHMuanMiLCIuLi9zb3VyY2UvaW1hZ2VzL0ljb25zLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvVWlDb21wb25lbnQudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9Db250YWluZXIudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9MaXN0SXRlbS50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0udHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0udHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9JY29uQnV0dG9uLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvYnV0dG9ucy9FeHBhbmRvQnV0dG9uLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvQ29sbGFwc2libGVQYW5lbC50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwudHMiLCIuLi9zb3VyY2UvdWkvQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3NVaS50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0J1dHRvbi50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0RlbGltaXRlci50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0hlYWRlckxpc3RJdGVtLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvSW5wdXQudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9QYXJhZ3JhcGgudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9EaWFsb2cudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9idXR0b25zL01heEJ1dHRvbi50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL2J1dHRvbnMvVHJpZ2dlckJ1dHRvbi50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL1NldHRpbmdNYXhUcmlnZ2VyTGlzdEl0ZW0udHMiLCIuLi9zb3VyY2UvdWkvQnVpbGRTZWN0aW9uVG9vbHMudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLnRzIiwiLi4vc291cmNlL3VpL0JvbmZpcmVTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL0VuZ2luZVNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9CdXR0b25MaXN0SXRlbS50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0ZpZWxkc2V0LnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvUmFkaW9JdGVtLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvT3B0aW9uc0xpc3RJdGVtLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvVGV4dEJ1dHRvbi50cyIsIi4uL3NvdXJjZS91aS9JbnRlcm5hbHNVaS50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0V4cGxhaW5lckxpc3RJdGVtLnRzIiwiLi4vc291cmNlL3VpL0xvZ0ZpbHRlclNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvUmVsaWdpb25TZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvYnV0dG9ucy9Db25zdW1lQnV0dG9uLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvYnV0dG9ucy9TdG9ja0J1dHRvbi50cyIsIi4uL3NvdXJjZS91aS9SZXNvdXJjZXNTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1BvbGljeVNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvVGVjaFNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvU2NpZW5jZVNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvTWlzc2lvblNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvU3BhY2VTZXR0aW5nc1VpLnRzIiwiLi4vbm9kZV9tb2R1bGVzL0BvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvSW52YWxpZEFyZ3VtZW50RXJyb3IuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RhbnRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2NvbnN0cnVjdEZyb20uanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RydWN0Tm93LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdExvbmcuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2xvY2FsaXplLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hGbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZE1hdGNoUGF0dGVybkZuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL21hdGNoLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2RlZmF1bHRPcHRpb25zLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3RvRGF0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9ub3JtYWxpemVEYXRlcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb21wYXJlQXNjLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mRGF5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mTW9udGguanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNMYXN0RGF5T2ZNb250aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5Nb250aHMuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9nZXRSb3VuZGluZ01ldGhvZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluU2Vjb25kcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXREaXN0YW5jZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXREaXN0YW5jZVRvTm93LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZXZWVrLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZVdlZWsuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2RlL19saWIvZm9ybWF0RGlzdGFuY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2RlL19saWIvZm9ybWF0TG9uZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZGUvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZGUvX2xpYi9sb2NhbGl6ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZGUvX2xpYi9tYXRjaC5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZGUuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2hlL19saWIvZm9ybWF0RGlzdGFuY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2hlL19saWIvZm9ybWF0TG9uZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvaGUvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvaGUvX2xpYi9sb2NhbGl6ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvaGUvX2xpYi9tYXRjaC5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvaGUuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL3poLUNOL19saWIvZm9ybWF0RGlzdGFuY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL3poLUNOL19saWIvZm9ybWF0TG9uZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvemgtQ04vX2xpYi9mb3JtYXRSZWxhdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvemgtQ04vX2xpYi9sb2NhbGl6ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvemgtQ04vX2xpYi9tYXRjaC5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvemgtQ04uanMiLCIuLi9zb3VyY2UvdG9vbHMvU2F2ZWdhbWVMb2FkZXIudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9Ub29sYmFyTGlzdEl0ZW0udHMiLCIuLi9zb3VyY2UvdWkvU3RhdGVNYW5hZ2VtZW50VWkudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9JY29uU2V0dGluZ3NQYW5lbC50cyIsIi4uL3NvdXJjZS91aS9SZXNldEJvbmZpcmVTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1Jlc2V0UmVsaWdpb25TZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1Jlc2V0UmVzb3VyY2VzU2V0dGluZ3NVaS50cyIsIi4uL3NvdXJjZS91aS9SZXNldFNwYWNlU2V0dGluZ3NVaS50cyIsIi4uL3NvdXJjZS91aS9SZXNldFRpbWVTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1Jlc2V0VXBncmFkZXNTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1Jlc2V0U2V0dGluZ3NVaS50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0N5Y2xlc0xpc3QudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9TZWFzb25zTGlzdC50cyIsIi4uL3NvdXJjZS91aS9UaW1lU2tpcEhlYXRTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1RpbWVTa2lwU2V0dGluZ3NVaS50cyIsIi4uL3NvdXJjZS91aS9UaW1lQ29udHJvbFNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvVGltZVNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9idXR0b25zLXRleHQvQnV5QnV0dG9uLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvYnV0dG9ucy10ZXh0L1NlbGxCdXR0b24udHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9idXR0b25zL0xpbWl0ZWRCdXR0b24udHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9TZXR0aW5nTGltaXRlZExpc3RJdGVtLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvU2V0dGluZ0xpbWl0ZWRUcmlnZ2VyTGlzdEl0ZW0udHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9TZXR0aW5nTWF4TGlzdEl0ZW0udHMiLCIuLi9zb3VyY2UvdWkvRW1iYXNzeVNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvVHJhZGVTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1ZpbGxhZ2VTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvV29ya3Nob3BDcmFmdExpc3RJdGVtLnRzIiwiLi4vc291cmNlL3VpL1VwZ3JhZGVTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1dvcmtzaG9wU2V0dGluZ3NVaS50cyIsIi4uL3NvdXJjZS91aS9Vc2VySW50ZXJmYWNlLnRzIiwiLi4vc291cmNlL0tpdHRlblNjaWVudGlzdHMudHMiLCIuLi9zb3VyY2UvZW50cnlwb2ludC11c2Vyc2NyaXB0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCByZWNlaXZlIGVycm9ycyAob3IgYW55dGhpbmcgZWxzZSB0aGF0IHdhcyBgdGhyb3dgbilcbiAqIGFuZCBwcmludHMgaXQgdG8gYSB7QGxpbmtjb2RlICFjb25zb2xlfS5cbiAqIEBwYXJhbSBjb25zb2xlIC0gVGhlIGNvbnNvbGUgdG8gcHJpbnQgZXJyb3JzIHRvLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHdpbGwgcHJpbnQgZXJyb3JzIHRvIHRoZSBjb25zb2xlLlxuICovXG5leHBvcnQgY29uc3QgcmVkaXJlY3RFcnJvcnNUb0NvbnNvbGUgPSAoY29uc29sZSkgPT4ge1xuICAgIGNvbnN0IHByaW50RXJyb3JzVG9Db25zb2xlID0gKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH07XG4gICAgcmV0dXJuIHByaW50RXJyb3JzVG9Db25zb2xlO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnNvbGUuanMubWFwIiwiLyoqXG4gKiBDaGVjayBpZiBzb21ldGhpbmcgaXMgbmlsLlxuICogQ2FuIGJlIHVzZWQgYXMgYSB0eXBlZ3VhcmQuXG4gKiBAcGFyYW0gc3ViamVjdCAtIFRoZSBzdWJqZWN0IHRoYXQgY291bGQgYmUgbmlsLlxuICogQHR5cGVQYXJhbSBUU3ViamVjdCAtIFRoZSB0eXBlIG9mIHRoZSBzdWJqZWN0LlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzdWJqZWN0IGlzIG5pbCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05pbChzdWJqZWN0KSB7XG4gICAgcmV0dXJuIHN1YmplY3QgPT09IG51bGwgfHwgc3ViamVjdCA9PT0gdW5kZWZpbmVkO1xufVxuLyoqXG4gKiBDaGVjayBpZiBzb21ldGhpbmcgaXMgYSBjb25jcmV0ZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqIENhbiBiZSB1c2VkIGFzIGEgdHlwZWd1YXJkLlxuICogQHBhcmFtIHN1YmplY3QgLSBUaGUgc3ViamVjdCB0aGF0IGNvdWxkIGJlIG5pbC5cbiAqIEBwYXJhbSBQcm90b3R5cGUgLSBUaGUgcHJvdG90eXBlIHRvIGNoZWNrIGFnYWluc3QuXG4gKiBAdHlwZVBhcmFtIFRTdWJqZWN0IC0gVGhlIHR5cGUgdG8gY2hlY2sgYWdhaW5zdC5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaW5wdXQgZWxlbWVudCBtYXRjaGVzIHRoZSBnaXZlbiB0eXBlLFxuICogYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpcyhzdWJqZWN0LCBQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gIWlzTmlsKHN1YmplY3QpICYmIHN1YmplY3QgaW5zdGFuY2VvZiBQcm90b3R5cGU7XG59XG4vKipcbiAqIFRocm93biB3aGVuIGFuIHVuZXhwZWN0ZWQgbmlsIHZhbHVlIHdhcyBlbmNvdW50ZXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWROaWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGlua2NvZGUgVW5leHBlY3RlZE5pbEVycm9yfS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSBcInVuZXhwZWN0ZWQgbmlsIHZhbHVlXCIpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgfVxufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCB0aGUgcGFzc2VkIHN1YmplY3QgaXMgbm90IG5pbDsgdGhyb3cgb3RoZXJ3aXNlLlxuICogQHBhcmFtIHN1YmplY3QgLSBBIHN1YmplY3QgdGhhdCBpcyBwb3NzaWJseSBuaWwuXG4gKiBAcGFyYW0gZXJyb3JNZXNzYWdlIC0gQW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZSB0byB0aHJvdyB3aGVuIHRoZSBzdWJqZWN0IGlzIG5pbC5cbiAqIEB0eXBlUGFyYW0gVFN1YmplY3QgLSBUaGUgdHlwZSBvZiB0aGUgc3ViamVjdC5cbiAqIEByZXR1cm5zIFRoZSBzdWJqZWN0LCBpZiBpdCBpc24ndCBuaWwuXG4gKiBAdGhyb3dzIHtAbGlua2NvZGUgVW5leHBlY3RlZE5pbEVycm9yfSBXaGVuIHRoZSBzdWJqZWN0IGlzIG5pbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11c3RFeGlzdChzdWJqZWN0LCBlcnJvck1lc3NhZ2UpIHtcbiAgICBpZiAoaXNOaWwoc3ViamVjdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROaWxFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gc3ViamVjdDtcbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgYWxsIHBhc3NlZCBzdWJqZWN0cyBhcmUgbm90IG5pbDsgdGhyb3cgb3RoZXJ3aXNlLlxuICogQHBhcmFtIHN1YmplY3RzIC0gVGhlIHN1YmplY3RzIHRoYXQgYXJlIHBvc3NpYmx5IG5pbC5cbiAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgLSBBbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlIHRvIHRocm93IHdoZW4gYSBzdWJqZWN0IGlzIG5pbC5cbiAqIEB0eXBlUGFyYW0gVFN1YmplY3QgLSBUaGUgdHlwZSBhIHRoZSBzdWJqZWN0LlxuICogQHJldHVybnMgVGhlIHN1YmplY3RzLCBpZiB0aGV5IGFyZW4ndCBuaWwuXG4gKiBAdGhyb3dzIHtAbGlua2NvZGUgVW5leHBlY3RlZE5pbEVycm9yfSBXaGVuIGEgc3ViamVjdCBpcyBuaWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdXN0RXhpc3RBbGwoc3ViamVjdHMsIGVycm9yTWVzc2FnZSkge1xuICAgIGZvciAoY29uc3Qgc3ViamVjdCBvZiBzdWJqZWN0cykge1xuICAgICAgICBpZiAoaXNOaWwoc3ViamVjdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTmlsRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3ViamVjdHM7XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IHRoZSBwYXNzZWQgc3ViamVjdCBpcyBub3QgbmlsOyB0aHJvdyBvdGhlcndpc2UuXG4gKiBAcGFyYW0gc3ViamVjdCAtIEEgc3ViamVjdCB0aGF0IGlzIHBvc3NpYmx5IG5pbC5cbiAqIEB0eXBlUGFyYW0gVFN1YmplY3QgLSBUaGUgdHlwZSBvZiB0aGUgc3ViamVjdC5cbiAqIEB0aHJvd3Mge0BsaW5rY29kZSBVbmV4cGVjdGVkTmlsRXJyb3J9IFdoZW4gdGhlIHN1YmplY3QgaXMgbmlsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RXhpc3RzKHN1YmplY3QpIHtcbiAgICBpZiAoaXNOaWwoc3ViamVjdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROaWxFcnJvcigpO1xuICAgIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgdGhlIHBhc3NlZCBzdWJqZWN0cyBhcmUgbm90IG5pbDsgdGhyb3cgb3RoZXJ3aXNlLlxuICogQHBhcmFtIHN1YmplY3RzIC0gU3ViamVjdHMgdGhhdCBhcmUgcG9zc2libHkgbmlsLlxuICogQHR5cGVQYXJhbSBUU3ViamVjdCAtIFRoZSB0eXBlIG9mIGEgc3ViamVjdC5cbiAqIEB0aHJvd3Mge0BsaW5rY29kZSBVbmV4cGVjdGVkTmlsRXJyb3J9IFdoZW4gYSBzdWJqZWN0IGlzIG5pbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEV4aXN0c0FsbChzdWJqZWN0cykge1xuICAgIGZvciAoY29uc3Qgc3ViamVjdCBvZiBzdWJqZWN0cykge1xuICAgICAgICBpZiAoaXNOaWwoc3ViamVjdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTmlsRXJyb3IoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQ29udmVydCBhIG5pbGFibGUgaW50byBhIHJlYWwgdmFsdWUsIGlmIGl0IGlzIG5pbC5cbiAqIEBwYXJhbSBuaWxhYmxlIC0gVGhlIHN1YmplY3QgdG8gY29udmVydCB0byBhbiBvcHRpb25hbC5cbiAqIEBwYXJhbSB0byAtIFRoZSB2YWx1ZSB0byBjb2FsZXNlIHRvLlxuICogQHJldHVybnMgVGhlIGlucHV0IHZhbHVlLCBpZiBpdCB3YXNuJ3QgbmlsLCBvciB0aGUgdmFsdWUgdG8gY29hbGVzY2UgdG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2FsZXNjZShuaWxhYmxlLCB0bykge1xuICAgIGlmIChpc05pbChuaWxhYmxlKSkge1xuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuICAgIHJldHVybiBuaWxhYmxlO1xufVxuLyoqXG4gKiBEcm9wIGFsbCBuaWwgdmFsdWVzIGZyb20gYW4gYXJyYXksIG9yIHJlcGxhY2VzIHRoZW0gd2l0aCBhbm90aGVyIHZhbHVlLlxuICogQHBhcmFtIG5pbGFibGVzIC0gVGhlIHN1YmplY3QgdG8gY29udmVydC5cbiAqIEBwYXJhbSB0byAtIFRoZSB2YWx1ZSB0byBjb2FsZXNlIHRvLlxuICogQHJldHVybnMgQW4gYXJyYXkgd2l0aCB3aGVyZSBhbGwgdmFsdWVzIGFyZSBub3QgbmlsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29hbGVzY2VBcnJheShuaWxhYmxlcywgdG8pIHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoKTtcbiAgICBmb3IgKGNvbnN0IG5pbGFibGUgb2YgbmlsYWJsZXMpIHtcbiAgICAgICAgaWYgKCFpc05pbChuaWxhYmxlKSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmlsYWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlzTmlsKHRvKSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godG8pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvbnZlcnQgYSBuaWxhYmxlIGludG8gYW4gb3B0aW9uYWwgYXJndW1lbnQuXG4gKiBUaGlzIG1lYW5zIGBudWxsYCBpcyBub3JtYWxpemVkIHRvIGB1bmRlZmluZWRgLlxuICogQHBhcmFtIG5pbGFibGUgLSBUaGUgc3ViamVjdCB0byBjb252ZXJ0IHRvIGFuIG9wdGlvbmFsLlxuICogQHJldHVybnMgVGhlIHZhbHVlLCBub3JtYWxpemVkIHRvIGB1bmRlZmluZWRgLCBpZiBpdCB3YXMgbmlsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9PcHRpb25hbChuaWxhYmxlKSB7XG4gICAgaWYgKGlzTmlsKG5pbGFibGUpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBuaWxhYmxlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bmlsLmpzLm1hcCIsIi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIGVycm9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFic3RyYWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgLyoqXG4gICAgICogVGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBlcnJvci5cbiAgICAgKi9cbiAgICBzdGF0dXM7XG4gICAgLyoqXG4gICAgICogQW4gYXBwbGljYXRpb24tdW5pcXVlLCByZWFkYWJsZSBlcnJvciBjb2RlLlxuICAgICAqL1xuICAgIGNvZGU7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmtjb2RlIEFic3RyYWN0RXJyb3J9LlxuICAgICAqIEBwYXJhbSBjb2RlIC0gVGhlIG1haW4gaWRlbnRpZmljYXRpb24gY29kZSBmb3IgdGhlIGVycm9yLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1haW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gc3RhdHVzIC0gVGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gcmV0dXJuLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIHN0YXR1cykge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJBYnN0cmFjdEVycm9yXCI7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICBpZiAodHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAvLyBDYXB0dXJlIGEgbmV3IHN0YWNrdHJhY2UsIG90aGVyd2lzZSBpdCB3aWxsIGluY2x1ZGUgb3VyIGJhc2UtY2xhc3MgY29uc3RydWN0b3IgaW5zdGVhZCBvZiB0aGUgY29kZVxuICAgICAgICAgICAgLy8gbG9jYXRpb24gd2UncmUgYWN0dWFsbHkgaW50ZXJlc3RlZCBpbi5cbiAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEFic3RyYWN0RXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rY29kZSBBYnN0cmFjdEVycm9yfSwgb3Igb25lIG9mIGl0cyBzdWJjbGFzc2VzLlxuICAgICAqIEBwYXJhbSBlcnJvciAtIFRoZSBvYmplY3QgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIGFsbG93Rm9yZWlnbk1vZHVsZSAtIE9ubHkgY2hlY2sgZm9yIHNpbWlsYXIgbG9va2luZyBlcnJvciBjb2Rlcy5cbiAgICAgKiBZb3UncmUgZ29pbmcgdG8gd2FudCB0byB1c2UgdGhpcyBpZiB5b3UncmUgZGVhbGluZyB3aXRoIGEgc2V0dXAgd2hlcmVcbiAgICAgKiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBqcy11dGlscyBhcmUgbG9hZGVkLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0IGlzIGFuIHtAbGlua2NvZGUgQWJzdHJhY3RFcnJvcn0sIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpc0Fic3RyYWN0RXJyb3IoZXJyb3IsIGFsbG93Rm9yZWlnbk1vZHVsZSA9IHRydWUpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWJzdHJhY3RFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBqcy11dGlscyBhcmUgbG9hZGVkIGF0IHJ1bnRpbWUsIHRoZVxuICAgICAgICAvLyBwcm90b3R5cGVzIG9mIGVycm9ycyBkb24ndCBhbGlnbi4gSW4gdGhhdCBjYXNlLCB3ZSBqdXN0IGFuYWx5emUgdGhlXG4gICAgICAgIC8vIGVycm9yIGNvZGUuXG4gICAgICAgIGlmIChhbGxvd0ZvcmVpZ25Nb2R1bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yUmVjb3JkID0gZXJyb3I7XG4gICAgICAgICAgICBpZiAoT2JqZWN0KGVycm9yKSA9PT0gZXJyb3IgJiZcbiAgICAgICAgICAgICAgICBcImNvZGVcIiBpbiBlcnJvclJlY29yZCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBlcnJvclJlY29yZC5jb2RlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZWRFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlZEVycm9yLmNvZGUubWF0Y2goL15FUlJfT1NfLykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BYnN0cmFjdEVycm9yLmpzLm1hcCIsImltcG9ydCB7IEFic3RyYWN0RXJyb3IgfSBmcm9tIFwiLi9BYnN0cmFjdEVycm9yLmpzXCI7XG4vKipcbiAqIFVzZWQgd2hlbiBhbiBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCB0aGF0IGNhbiBub3QgYmUgY29tcGxldGVkIGluIHRoZSBjdXJyZW50XG4gKiBjb250ZXh0LlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZE9wZXJhdGlvbkVycm9yIGV4dGVuZHMgQWJzdHJhY3RFcnJvciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmtjb2RlIEludmFsaWRPcGVyYXRpb25FcnJvcn0uXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWFpbiBlcnJvciBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBzdGF0dXMgLSBUaGUgSFRUUCBzdGF0dXMgY29kZSB0byByZXR1cm4uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzID0gNDAwKSB7XG4gICAgICAgIHN1cGVyKFwiRVJSX09TX0lOVkFMSURfT1BFUkFUSU9OXCIsIG1lc3NhZ2UsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiSW52YWxpZE9wZXJhdGlvbkVycm9yXCI7XG4gICAgICAgIGlmICh0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIC8vIENhcHR1cmUgYSBuZXcgc3RhY2t0cmFjZSwgb3RoZXJ3aXNlIGl0IHdpbGwgaW5jbHVkZSBvdXIgYmFzZS1jbGFzc1xuICAgICAgICAgICAgLy8gY29uc3RydWN0b3IgaW5zdGVhZCBvZiB0aGUgY29kZSBsb2NhdGlvbiB3ZSdyZSBhY3R1YWxseSBpbnRlcmVzdGVkIGluLlxuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgSW52YWxpZE9wZXJhdGlvbkVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUludmFsaWRPcGVyYXRpb25FcnJvci5qcy5tYXAiLCIndXNlIHN0cmljdCdcblxuY29uc3QgZGVidWcgPSAoXG4gIHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICBwcm9jZXNzLmVudiAmJlxuICBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmXG4gIC9cXGJzZW12ZXJcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcpXG4pID8gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoJ1NFTVZFUicsIC4uLmFyZ3MpXG4gIDogKCkgPT4ge31cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJ1Z1xuIiwiJ3VzZSBzdHJpY3QnXG5cbi8vIE5vdGU6IHRoaXMgaXMgdGhlIHNlbXZlci5vcmcgdmVyc2lvbiBvZiB0aGUgc3BlYyB0aGF0IGl0IGltcGxlbWVudHNcbi8vIE5vdCBuZWNlc3NhcmlseSB0aGUgcGFja2FnZSB2ZXJzaW9uIG9mIHRoaXMgY29kZS5cbmNvbnN0IFNFTVZFUl9TUEVDX1ZFUlNJT04gPSAnMi4wLjAnXG5cbmNvbnN0IE1BWF9MRU5HVEggPSAyNTZcbmNvbnN0IE1BWF9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fFxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gOTAwNzE5OTI1NDc0MDk5MVxuXG4vLyBNYXggc2FmZSBzZWdtZW50IGxlbmd0aCBmb3IgY29lcmNpb24uXG5jb25zdCBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIID0gMTZcblxuLy8gTWF4IHNhZmUgbGVuZ3RoIGZvciBhIGJ1aWxkIGlkZW50aWZpZXIuIFRoZSBtYXggbGVuZ3RoIG1pbnVzIDYgY2hhcmFjdGVycyBmb3Jcbi8vIHRoZSBzaG9ydGVzdCB2ZXJzaW9uIHdpdGggYSBidWlsZCAwLjAuMCtCVUlMRC5cbmNvbnN0IE1BWF9TQUZFX0JVSUxEX0xFTkdUSCA9IE1BWF9MRU5HVEggLSA2XG5cbmNvbnN0IFJFTEVBU0VfVFlQRVMgPSBbXG4gICdtYWpvcicsXG4gICdwcmVtYWpvcicsXG4gICdtaW5vcicsXG4gICdwcmVtaW5vcicsXG4gICdwYXRjaCcsXG4gICdwcmVwYXRjaCcsXG4gICdwcmVyZWxlYXNlJyxcbl1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1BWF9MRU5HVEgsXG4gIE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEgsXG4gIE1BWF9TQUZFX0JVSUxEX0xFTkdUSCxcbiAgTUFYX1NBRkVfSU5URUdFUixcbiAgUkVMRUFTRV9UWVBFUyxcbiAgU0VNVkVSX1NQRUNfVkVSU0lPTixcbiAgRkxBR19JTkNMVURFX1BSRVJFTEVBU0U6IDBiMDAxLFxuICBGTEFHX0xPT1NFOiAwYjAxMCxcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7XG4gIE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEgsXG4gIE1BWF9TQUZFX0JVSUxEX0xFTkdUSCxcbiAgTUFYX0xFTkdUSCxcbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4vZGVidWcnKVxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0ge31cblxuLy8gVGhlIGFjdHVhbCByZWdleHBzIGdvIG9uIGV4cG9ydHMucmVcbmNvbnN0IHJlID0gZXhwb3J0cy5yZSA9IFtdXG5jb25zdCBzYWZlUmUgPSBleHBvcnRzLnNhZmVSZSA9IFtdXG5jb25zdCBzcmMgPSBleHBvcnRzLnNyYyA9IFtdXG5jb25zdCBzYWZlU3JjID0gZXhwb3J0cy5zYWZlU3JjID0gW11cbmNvbnN0IHQgPSBleHBvcnRzLnQgPSB7fVxubGV0IFIgPSAwXG5cbmNvbnN0IExFVFRFUkRBU0hOVU1CRVIgPSAnW2EtekEtWjAtOS1dJ1xuXG4vLyBSZXBsYWNlIHNvbWUgZ3JlZWR5IHJlZ2V4IHRva2VucyB0byBwcmV2ZW50IHJlZ2V4IGRvcyBpc3N1ZXMuIFRoZXNlIHJlZ2V4IGFyZVxuLy8gdXNlZCBpbnRlcm5hbGx5IHZpYSB0aGUgc2FmZVJlIG9iamVjdCBzaW5jZSBhbGwgaW5wdXRzIGluIHRoaXMgbGlicmFyeSBnZXRcbi8vIG5vcm1hbGl6ZWQgZmlyc3QgdG8gdHJpbSBhbmQgY29sbGFwc2UgYWxsIGV4dHJhIHdoaXRlc3BhY2UuIFRoZSBvcmlnaW5hbFxuLy8gcmVnZXhlcyBhcmUgZXhwb3J0ZWQgZm9yIHVzZXJsYW5kIGNvbnN1bXB0aW9uIGFuZCBsb3dlciBsZXZlbCB1c2FnZS4gQVxuLy8gZnV0dXJlIGJyZWFraW5nIGNoYW5nZSBjb3VsZCBleHBvcnQgdGhlIHNhZmVyIHJlZ2V4IG9ubHkgd2l0aCBhIG5vdGUgdGhhdFxuLy8gYWxsIGlucHV0IHNob3VsZCBoYXZlIGV4dHJhIHdoaXRlc3BhY2UgcmVtb3ZlZC5cbmNvbnN0IHNhZmVSZWdleFJlcGxhY2VtZW50cyA9IFtcbiAgWydcXFxccycsIDFdLFxuICBbJ1xcXFxkJywgTUFYX0xFTkdUSF0sXG4gIFtMRVRURVJEQVNITlVNQkVSLCBNQVhfU0FGRV9CVUlMRF9MRU5HVEhdLFxuXVxuXG5jb25zdCBtYWtlU2FmZVJlZ2V4ID0gKHZhbHVlKSA9PiB7XG4gIGZvciAoY29uc3QgW3Rva2VuLCBtYXhdIG9mIHNhZmVSZWdleFJlcGxhY2VtZW50cykge1xuICAgIHZhbHVlID0gdmFsdWVcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0qYCkuam9pbihgJHt0b2tlbn17MCwke21heH19YClcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0rYCkuam9pbihgJHt0b2tlbn17MSwke21heH19YClcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuY29uc3QgY3JlYXRlVG9rZW4gPSAobmFtZSwgdmFsdWUsIGlzR2xvYmFsKSA9PiB7XG4gIGNvbnN0IHNhZmUgPSBtYWtlU2FmZVJlZ2V4KHZhbHVlKVxuICBjb25zdCBpbmRleCA9IFIrK1xuICBkZWJ1ZyhuYW1lLCBpbmRleCwgdmFsdWUpXG4gIHRbbmFtZV0gPSBpbmRleFxuICBzcmNbaW5kZXhdID0gdmFsdWVcbiAgc2FmZVNyY1tpbmRleF0gPSBzYWZlXG4gIHJlW2luZGV4XSA9IG5ldyBSZWdFeHAodmFsdWUsIGlzR2xvYmFsID8gJ2cnIDogdW5kZWZpbmVkKVxuICBzYWZlUmVbaW5kZXhdID0gbmV3IFJlZ0V4cChzYWZlLCBpc0dsb2JhbCA/ICdnJyA6IHVuZGVmaW5lZClcbn1cblxuLy8gVGhlIGZvbGxvd2luZyBSZWd1bGFyIEV4cHJlc3Npb25zIGNhbiBiZSB1c2VkIGZvciB0b2tlbml6aW5nLFxuLy8gdmFsaWRhdGluZywgYW5kIHBhcnNpbmcgU2VtVmVyIHZlcnNpb24gc3RyaW5ncy5cblxuLy8gIyMgTnVtZXJpYyBJZGVudGlmaWVyXG4vLyBBIHNpbmdsZSBgMGAsIG9yIGEgbm9uLXplcm8gZGlnaXQgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGRpZ2l0cy5cblxuY3JlYXRlVG9rZW4oJ05VTUVSSUNJREVOVElGSUVSJywgJzB8WzEtOV1cXFxcZConKVxuY3JlYXRlVG9rZW4oJ05VTUVSSUNJREVOVElGSUVSTE9PU0UnLCAnXFxcXGQrJylcblxuLy8gIyMgTm9uLW51bWVyaWMgSWRlbnRpZmllclxuLy8gWmVybyBvciBtb3JlIGRpZ2l0cywgZm9sbG93ZWQgYnkgYSBsZXR0ZXIgb3IgaHlwaGVuLCBhbmQgdGhlbiB6ZXJvIG9yXG4vLyBtb3JlIGxldHRlcnMsIGRpZ2l0cywgb3IgaHlwaGVucy5cblxuY3JlYXRlVG9rZW4oJ05PTk5VTUVSSUNJREVOVElGSUVSJywgYFxcXFxkKlthLXpBLVotXSR7TEVUVEVSREFTSE5VTUJFUn0qYClcblxuLy8gIyMgTWFpbiBWZXJzaW9uXG4vLyBUaHJlZSBkb3Qtc2VwYXJhdGVkIG51bWVyaWMgaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdNQUlOVkVSU0lPTicsIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlgKVxuXG5jcmVhdGVUb2tlbignTUFJTlZFUlNJT05MT09TRScsIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pYClcblxuLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvbiBJZGVudGlmaWVyXG4vLyBBIG51bWVyaWMgaWRlbnRpZmllciwgb3IgYSBub24tbnVtZXJpYyBpZGVudGlmaWVyLlxuLy8gTm9uLW51bWJlcmljIGlkZW50aWZpZXJzIGluY2x1ZGUgbnVtYmVyaWMgaWRlbnRpZmllcnMgYnV0IGNhbiBiZSBsb25nZXIuXG4vLyBUaGVyZWZvcmUgbm9uLW51bWJlcmljIGlkZW50aWZpZXJzIG11c3QgZ28gZmlyc3QuXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFSURFTlRJRklFUicsIGAoPzoke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXVxufXwke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VJREVOVElGSUVSTE9PU0UnLCBgKD86JHtzcmNbdC5OT05OVU1FUklDSURFTlRJRklFUl1cbn18JHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pYClcblxuLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvblxuLy8gSHlwaGVuLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkb3Qtc2VwYXJhdGVkIHByZS1yZWxlYXNlIHZlcnNpb25cbi8vIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRScsIGAoPzotKCR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSXX0pKikpYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VMT09TRScsIGAoPzotPygke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdfSkqKSlgKVxuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YSBJZGVudGlmaWVyXG4vLyBBbnkgY29tYmluYXRpb24gb2YgZGlnaXRzLCBsZXR0ZXJzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignQlVJTERJREVOVElGSUVSJywgYCR7TEVUVEVSREFTSE5VTUJFUn0rYClcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGFcbi8vIFBsdXMgc2lnbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGVyaW9kLXNlcGFyYXRlZCBidWlsZCBtZXRhZGF0YVxuLy8gaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdCVUlMRCcsIGAoPzpcXFxcKygke3NyY1t0LkJVSUxESURFTlRJRklFUl1cbn0oPzpcXFxcLiR7c3JjW3QuQlVJTERJREVOVElGSUVSXX0pKikpYClcblxuLy8gIyMgRnVsbCBWZXJzaW9uIFN0cmluZ1xuLy8gQSBtYWluIHZlcnNpb24sIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uIGFuZFxuLy8gYnVpbGQgbWV0YWRhdGEuXG5cbi8vIE5vdGUgdGhhdCB0aGUgb25seSBtYWpvciwgbWlub3IsIHBhdGNoLCBhbmQgcHJlLXJlbGVhc2Ugc2VjdGlvbnMgb2Zcbi8vIHRoZSB2ZXJzaW9uIHN0cmluZyBhcmUgY2FwdHVyaW5nIGdyb3Vwcy4gIFRoZSBidWlsZCBtZXRhZGF0YSBpcyBub3QgYVxuLy8gY2FwdHVyaW5nIGdyb3VwLCBiZWNhdXNlIGl0IHNob3VsZCBub3QgZXZlciBiZSB1c2VkIGluIHZlcnNpb25cbi8vIGNvbXBhcmlzb24uXG5cbmNyZWF0ZVRva2VuKCdGVUxMUExBSU4nLCBgdj8ke3NyY1t0Lk1BSU5WRVJTSU9OXVxufSR7c3JjW3QuUFJFUkVMRUFTRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0ZVTEwnLCBgXiR7c3JjW3QuRlVMTFBMQUlOXX0kYClcblxuLy8gbGlrZSBmdWxsLCBidXQgYWxsb3dzIHYxLjIuMyBhbmQgPTEuMi4zLCB3aGljaCBwZW9wbGUgZG8gc29tZXRpbWVzLlxuLy8gYWxzbywgMS4wLjBhbHBoYTEgKHByZXJlbGVhc2Ugd2l0aG91dCB0aGUgaHlwaGVuKSB3aGljaCBpcyBwcmV0dHlcbi8vIGNvbW1vbiBpbiB0aGUgbnBtIHJlZ2lzdHJ5LlxuY3JlYXRlVG9rZW4oJ0xPT1NFUExBSU4nLCBgW3Y9XFxcXHNdKiR7c3JjW3QuTUFJTlZFUlNJT05MT09TRV1cbn0ke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0xPT1NFJywgYF4ke3NyY1t0LkxPT1NFUExBSU5dfSRgKVxuXG5jcmVhdGVUb2tlbignR1RMVCcsICcoKD86PHw+KT89PyknKVxuXG4vLyBTb21ldGhpbmcgbGlrZSBcIjIuKlwiIG9yIFwiMS4yLnhcIi5cbi8vIE5vdGUgdGhhdCBcIngueFwiIGlzIGEgdmFsaWQgeFJhbmdlIGlkZW50aWZlciwgbWVhbmluZyBcImFueSB2ZXJzaW9uXCJcbi8vIE9ubHkgdGhlIGZpcnN0IGl0ZW0gaXMgc3RyaWN0bHkgcmVxdWlyZWQuXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUkxPT1NFJywgYCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19fHh8WHxcXFxcKmApXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUicsIGAke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX18eHxYfFxcXFwqYClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOJywgYFt2PVxcXFxzXSooJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFXX0pPyR7XG4gICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgIGApPyk/YClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOTE9PU0UnLCBgW3Y9XFxcXHNdKigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19KT8ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCk/KT9gKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ1hSQU5HRUxPT1NFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENvZXJjaW9uLlxuLy8gRXh0cmFjdCBhbnl0aGluZyB0aGF0IGNvdWxkIGNvbmNlaXZhYmx5IGJlIGEgcGFydCBvZiBhIHZhbGlkIHNlbXZlclxuY3JlYXRlVG9rZW4oJ0NPRVJDRVBMQUlOJywgYCR7JyhefFteXFxcXGRdKScgK1xuICAgICAgICAgICAgICAnKFxcXFxkezEsJ30ke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSlgICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRScsIGAke3NyY1t0LkNPRVJDRVBMQUlOXX0oPzokfFteXFxcXGRdKWApXG5jcmVhdGVUb2tlbignQ09FUkNFRlVMTCcsIHNyY1t0LkNPRVJDRVBMQUlOXSArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VdfSk/YCArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LkJVSUxEXX0pP2AgK1xuICAgICAgICAgICAgICBgKD86JHxbXlxcXFxkXSlgKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRVJUTCcsIHNyY1t0LkNPRVJDRV0sIHRydWUpXG5jcmVhdGVUb2tlbignQ09FUkNFUlRMRlVMTCcsIHNyY1t0LkNPRVJDRUZVTExdLCB0cnVlKVxuXG4vLyBUaWxkZSByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwicmVhc29uYWJseSBhdCBvciBncmVhdGVyIHRoYW5cIlxuY3JlYXRlVG9rZW4oJ0xPTkVUSUxERScsICcoPzp+Pj8pJylcblxuY3JlYXRlVG9rZW4oJ1RJTERFVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuTE9ORVRJTERFXX1cXFxccytgLCB0cnVlKVxuZXhwb3J0cy50aWxkZVRyaW1SZXBsYWNlID0gJyQxfidcblxuY3JlYXRlVG9rZW4oJ1RJTERFJywgYF4ke3NyY1t0LkxPTkVUSUxERV19JHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignVElMREVMT09TRScsIGBeJHtzcmNbdC5MT05FVElMREVdfSR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENhcmV0IHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJhdCBsZWFzdCBhbmQgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aFwiXG5jcmVhdGVUb2tlbignTE9ORUNBUkVUJywgJyg/OlxcXFxeKScpXG5cbmNyZWF0ZVRva2VuKCdDQVJFVFRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkxPTkVDQVJFVF19XFxcXHMrYCwgdHJ1ZSlcbmV4cG9ydHMuY2FyZXRUcmltUmVwbGFjZSA9ICckMV4nXG5cbmNyZWF0ZVRva2VuKCdDQVJFVCcsIGBeJHtzcmNbdC5MT05FQ0FSRVRdfSR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ0NBUkVUTE9PU0UnLCBgXiR7c3JjW3QuTE9ORUNBUkVUXX0ke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBBIHNpbXBsZSBndC9sdC9lcSB0aGluZywgb3IganVzdCBcIlwiIHRvIGluZGljYXRlIFwiYW55IHZlcnNpb25cIlxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JMT09TRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX0pJHxeJGApXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUicsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5GVUxMUExBSU5dfSkkfF4kYClcblxuLy8gQW4gZXhwcmVzc2lvbiB0byBzdHJpcCBhbnkgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBndGx0IGFuZCB0aGUgdGhpbmdcbi8vIGl0IG1vZGlmaWVzLCBzbyB0aGF0IGA+IDEuMi4zYCA9PT4gYD4xLjIuM2BcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9SVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuR1RMVF1cbn1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX18JHtzcmNbdC5YUkFOR0VQTEFJTl19KWAsIHRydWUpXG5leHBvcnRzLmNvbXBhcmF0b3JUcmltUmVwbGFjZSA9ICckMSQyJDMnXG5cbi8vIFNvbWV0aGluZyBsaWtlIGAxLjIuMyAtIDEuMi40YFxuLy8gTm90ZSB0aGF0IHRoZXNlIGFsbCB1c2UgdGhlIGxvb3NlIGZvcm0sIGJlY2F1c2UgdGhleSdsbCBiZVxuLy8gY2hlY2tlZCBhZ2FpbnN0IGVpdGhlciB0aGUgc3RyaWN0IG9yIGxvb3NlIGNvbXBhcmF0b3IgZm9ybVxuLy8gbGF0ZXIuXG5jcmVhdGVUb2tlbignSFlQSEVOUkFOR0UnLCBgXlxcXFxzKigke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYFxcXFxzKy1cXFxccytgICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgICtcbiAgICAgICAgICAgICAgICAgICBgXFxcXHMqJGApXG5cbmNyZWF0ZVRva2VuKCdIWVBIRU5SQU5HRUxPT1NFJywgYF5cXFxccyooJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgXFxcXHMrLVxcXFxzK2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBcXFxccyokYClcblxuLy8gU3RhciByYW5nZXMgYmFzaWNhbGx5IGp1c3QgYWxsb3cgYW55dGhpbmcgYXQgYWxsLlxuY3JlYXRlVG9rZW4oJ1NUQVInLCAnKDx8Pik/PT9cXFxccypcXFxcKicpXG4vLyA+PTAuMC4wIGlzIGxpa2UgYSBzdGFyXG5jcmVhdGVUb2tlbignR1RFMCcsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wXFxcXHMqJCcpXG5jcmVhdGVUb2tlbignR1RFMFBSRScsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wLTBcXFxccyokJylcbiIsIid1c2Ugc3RyaWN0J1xuXG4vLyBwYXJzZSBvdXQganVzdCB0aGUgb3B0aW9ucyB3ZSBjYXJlIGFib3V0XG5jb25zdCBsb29zZU9wdGlvbiA9IE9iamVjdC5mcmVlemUoeyBsb29zZTogdHJ1ZSB9KVxuY29uc3QgZW1wdHlPcHRzID0gT2JqZWN0LmZyZWV6ZSh7IH0pXG5jb25zdCBwYXJzZU9wdGlvbnMgPSBvcHRpb25zID0+IHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgcmV0dXJuIGVtcHR5T3B0c1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBsb29zZU9wdGlvblxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnNcbn1cbm1vZHVsZS5leHBvcnRzID0gcGFyc2VPcHRpb25zXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgbnVtZXJpYyA9IC9eWzAtOV0rJC9cbmNvbnN0IGNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IGFudW0gPSBudW1lcmljLnRlc3QoYSlcbiAgY29uc3QgYm51bSA9IG51bWVyaWMudGVzdChiKVxuXG4gIGlmIChhbnVtICYmIGJudW0pIHtcbiAgICBhID0gK2FcbiAgICBiID0gK2JcbiAgfVxuXG4gIHJldHVybiBhID09PSBiID8gMFxuICAgIDogKGFudW0gJiYgIWJudW0pID8gLTFcbiAgICA6IChibnVtICYmICFhbnVtKSA/IDFcbiAgICA6IGEgPCBiID8gLTFcbiAgICA6IDFcbn1cblxuY29uc3QgcmNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiBjb21wYXJlSWRlbnRpZmllcnMoYiwgYSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbXBhcmVJZGVudGlmaWVycyxcbiAgcmNvbXBhcmVJZGVudGlmaWVycyxcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IHsgTUFYX0xFTkdUSCwgTUFYX1NBRkVfSU5URUdFUiB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IHsgY29tcGFyZUlkZW50aWZpZXJzIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pZGVudGlmaWVycycpXG5jbGFzcyBTZW1WZXIge1xuICBjb25zdHJ1Y3RvciAodmVyc2lvbiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgICBpZiAodmVyc2lvbi5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlICYmXG4gICAgICAgIHZlcnNpb24uaW5jbHVkZVByZXJlbGVhc2UgPT09ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgICAgICByZXR1cm4gdmVyc2lvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24udmVyc2lvblxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHZlcnNpb24uIE11c3QgYmUgYSBzdHJpbmcuIEdvdCB0eXBlIFwiJHt0eXBlb2YgdmVyc2lvbn1cIi5gKVxuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uLmxlbmd0aCA+IE1BWF9MRU5HVEgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGB2ZXJzaW9uIGlzIGxvbmdlciB0aGFuICR7TUFYX0xFTkdUSH0gY2hhcmFjdGVyc2BcbiAgICAgIClcbiAgICB9XG5cbiAgICBkZWJ1ZygnU2VtVmVyJywgdmVyc2lvbiwgb3B0aW9ucylcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIC8vIHRoaXMgaXNuJ3QgYWN0dWFsbHkgcmVsZXZhbnQgZm9yIHZlcnNpb25zLCBidXQga2VlcCBpdCBzbyB0aGF0IHdlXG4gICAgLy8gZG9uJ3QgcnVuIGludG8gdHJvdWJsZSBwYXNzaW5nIHRoaXMub3B0aW9ucyBhcm91bmQuXG4gICAgdGhpcy5pbmNsdWRlUHJlcmVsZWFzZSA9ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuXG4gICAgY29uc3QgbSA9IHZlcnNpb24udHJpbSgpLm1hdGNoKG9wdGlvbnMubG9vc2UgPyByZVt0LkxPT1NFXSA6IHJlW3QuRlVMTF0pXG5cbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgVmVyc2lvbjogJHt2ZXJzaW9ufWApXG4gICAgfVxuXG4gICAgdGhpcy5yYXcgPSB2ZXJzaW9uXG5cbiAgICAvLyB0aGVzZSBhcmUgYWN0dWFsbHkgbnVtYmVyc1xuICAgIHRoaXMubWFqb3IgPSArbVsxXVxuICAgIHRoaXMubWlub3IgPSArbVsyXVxuICAgIHRoaXMucGF0Y2ggPSArbVszXVxuXG4gICAgaWYgKHRoaXMubWFqb3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWFqb3IgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1ham9yIHZlcnNpb24nKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm1pbm9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1pbm9yIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtaW5vciB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wYXRjaCA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5wYXRjaCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgcGF0Y2ggdmVyc2lvbicpXG4gICAgfVxuXG4gICAgLy8gbnVtYmVyaWZ5IGFueSBwcmVyZWxlYXNlIG51bWVyaWMgaWRzXG4gICAgaWYgKCFtWzRdKSB7XG4gICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByZXJlbGVhc2UgPSBtWzRdLnNwbGl0KCcuJykubWFwKChpZCkgPT4ge1xuICAgICAgICBpZiAoL15bMC05XSskLy50ZXN0KGlkKSkge1xuICAgICAgICAgIGNvbnN0IG51bSA9ICtpZFxuICAgICAgICAgIGlmIChudW0gPj0gMCAmJiBudW0gPCBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpZFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLmJ1aWxkID0gbVs1XSA/IG1bNV0uc3BsaXQoJy4nKSA6IFtdXG4gICAgdGhpcy5mb3JtYXQoKVxuICB9XG5cbiAgZm9ybWF0ICgpIHtcbiAgICB0aGlzLnZlcnNpb24gPSBgJHt0aGlzLm1ham9yfS4ke3RoaXMubWlub3J9LiR7dGhpcy5wYXRjaH1gXG4gICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMudmVyc2lvbiArPSBgLSR7dGhpcy5wcmVyZWxlYXNlLmpvaW4oJy4nKX1gXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZlcnNpb25cbiAgfVxuXG4gIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy52ZXJzaW9uXG4gIH1cblxuICBjb21wYXJlIChvdGhlcikge1xuICAgIGRlYnVnKCdTZW1WZXIuY29tcGFyZScsIHRoaXMudmVyc2lvbiwgdGhpcy5vcHRpb25zLCBvdGhlcilcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3RoZXIgPT09ICdzdHJpbmcnICYmIG90aGVyID09PSB0aGlzLnZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIGlmIChvdGhlci52ZXJzaW9uID09PSB0aGlzLnZlcnNpb24pIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29tcGFyZU1haW4ob3RoZXIpIHx8IHRoaXMuY29tcGFyZVByZShvdGhlcilcbiAgfVxuXG4gIGNvbXBhcmVNYWluIChvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLm1ham9yLCBvdGhlci5tYWpvcikgfHxcbiAgICAgIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLm1pbm9yLCBvdGhlci5taW5vcikgfHxcbiAgICAgIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLnBhdGNoLCBvdGhlci5wYXRjaClcbiAgICApXG4gIH1cblxuICBjb21wYXJlUHJlIChvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgLy8gTk9UIGhhdmluZyBhIHByZXJlbGVhc2UgaXMgPiBoYXZpbmcgb25lXG4gICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgIW90aGVyLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmIG90aGVyLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH0gZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgIW90aGVyLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIGxldCBpID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLnByZXJlbGVhc2VbaV1cbiAgICAgIGNvbnN0IGIgPSBvdGhlci5wcmVyZWxlYXNlW2ldXG4gICAgICBkZWJ1ZygncHJlcmVsZWFzZSBjb21wYXJlJywgaSwgYSwgYilcbiAgICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9IGVsc2UgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfSBlbHNlIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYSwgYilcbiAgICAgIH1cbiAgICB9IHdoaWxlICgrK2kpXG4gIH1cblxuICBjb21wYXJlQnVpbGQgKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICBsZXQgaSA9IDBcbiAgICBkbyB7XG4gICAgICBjb25zdCBhID0gdGhpcy5idWlsZFtpXVxuICAgICAgY29uc3QgYiA9IG90aGVyLmJ1aWxkW2ldXG4gICAgICBkZWJ1ZygnYnVpbGQgY29tcGFyZScsIGksIGEsIGIpXG4gICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSBlbHNlIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpXG4gICAgICB9XG4gICAgfSB3aGlsZSAoKytpKVxuICB9XG5cbiAgLy8gcHJlbWlub3Igd2lsbCBidW1wIHRoZSB2ZXJzaW9uIHVwIHRvIHRoZSBuZXh0IG1pbm9yIHJlbGVhc2UsIGFuZCBpbW1lZGlhdGVseVxuICAvLyBkb3duIHRvIHByZS1yZWxlYXNlLiBwcmVtYWpvciBhbmQgcHJlcGF0Y2ggd29yayB0aGUgc2FtZSB3YXkuXG4gIGluYyAocmVsZWFzZSwgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpIHtcbiAgICBpZiAocmVsZWFzZS5zdGFydHNXaXRoKCdwcmUnKSkge1xuICAgICAgaWYgKCFpZGVudGlmaWVyICYmIGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiBpZGVudGlmaWVyIGlzIGVtcHR5JylcbiAgICAgIH1cbiAgICAgIC8vIEF2b2lkIGFuIGludmFsaWQgc2VtdmVyIHJlc3VsdHNcbiAgICAgIGlmIChpZGVudGlmaWVyKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gYC0ke2lkZW50aWZpZXJ9YC5tYXRjaCh0aGlzLm9wdGlvbnMubG9vc2UgPyByZVt0LlBSRVJFTEVBU0VMT09TRV0gOiByZVt0LlBSRVJFTEVBU0VdKVxuICAgICAgICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGlkZW50aWZpZXI6ICR7aWRlbnRpZmllcn1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZWxlYXNlKSB7XG4gICAgICBjYXNlICdwcmVtYWpvcic6XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMubWlub3IgPSAwXG4gICAgICAgIHRoaXMubWFqb3IrK1xuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwcmVtaW5vcic6XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMubWlub3IrK1xuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwcmVwYXRjaCc6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYWxyZWFkeSBhIHByZXJlbGVhc2UsIGl0IHdpbGwgYnVtcCB0byB0aGUgbmV4dCB2ZXJzaW9uXG4gICAgICAgIC8vIGRyb3AgYW55IHByZXJlbGVhc2VzIHRoYXQgbWlnaHQgYWxyZWFkeSBleGlzdCwgc2luY2UgdGhleSBhcmUgbm90XG4gICAgICAgIC8vIHJlbGV2YW50IGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBJZiB0aGUgaW5wdXQgaXMgYSBub24tcHJlcmVsZWFzZSB2ZXJzaW9uLCB0aGlzIGFjdHMgdGhlIHNhbWUgYXNcbiAgICAgIC8vIHByZXBhdGNoLlxuICAgICAgY2FzZSAncHJlcmVsZWFzZSc6XG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncmVsZWFzZSc6XG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2ZXJzaW9uICR7dGhpcy5yYXd9IGlzIG5vdCBhIHByZXJlbGVhc2VgKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgJ21ham9yJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1tYWpvciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1ham9yIHZlcnNpb24uXG4gICAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgbWFqb3IuXG4gICAgICAgIC8vIDEuMC4wLTUgYnVtcHMgdG8gMS4wLjBcbiAgICAgICAgLy8gMS4xLjAgYnVtcHMgdG8gMi4wLjBcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMubWlub3IgIT09IDAgfHxcbiAgICAgICAgICB0aGlzLnBhdGNoICE9PSAwIHx8XG4gICAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm1ham9yKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1pbm9yID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnbWlub3InOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1pbm9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWlub3IgdmVyc2lvbi5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtaW5vci5cbiAgICAgICAgLy8gMS4yLjAtNSBidW1wcyB0byAxLjIuMFxuICAgICAgICAvLyAxLjIuMSBidW1wcyB0byAxLjMuMFxuICAgICAgICBpZiAodGhpcy5wYXRjaCAhPT0gMCB8fCB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5taW5vcisrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3BhdGNoJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCBpdCB3aWxsIGluY3JlbWVudCB0aGUgcGF0Y2guXG4gICAgICAgIC8vIElmIGl0IGlzIGEgcHJlLXJlbGVhc2UgaXQgd2lsbCBidW1wIHVwIHRvIHRoZSBzYW1lIHBhdGNoIHZlcnNpb24uXG4gICAgICAgIC8vIDEuMi4wLTUgcGF0Y2hlcyB0byAxLjIuMFxuICAgICAgICAvLyAxLjIuMCBwYXRjaGVzIHRvIDEuMi4xXG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5wYXRjaCsrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIC8vIFRoaXMgcHJvYmFibHkgc2hvdWxkbid0IGJlIHVzZWQgcHVibGljbHkuXG4gICAgICAvLyAxLjAuMCAncHJlJyB3b3VsZCBiZWNvbWUgMS4wLjAtMCB3aGljaCBpcyB0aGUgd3JvbmcgZGlyZWN0aW9uLlxuICAgICAgY2FzZSAncHJlJzoge1xuICAgICAgICBjb25zdCBiYXNlID0gTnVtYmVyKGlkZW50aWZpZXJCYXNlKSA/IDEgOiAwXG5cbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbYmFzZV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgaSA9IHRoaXMucHJlcmVsZWFzZS5sZW5ndGhcbiAgICAgICAgICB3aGlsZSAoLS1pID49IDApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmVyZWxlYXNlW2ldID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICB0aGlzLnByZXJlbGVhc2VbaV0rK1xuICAgICAgICAgICAgICBpID0gLTJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBkaWRuJ3QgaW5jcmVtZW50IGFueXRoaW5nXG4gICAgICAgICAgICBpZiAoaWRlbnRpZmllciA9PT0gdGhpcy5wcmVyZWxlYXNlLmpvaW4oJy4nKSAmJiBpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogaWRlbnRpZmllciBhbHJlYWR5IGV4aXN0cycpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UucHVzaChiYXNlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICAgIC8vIDEuMi4wLWJldGEuMSBidW1wcyB0byAxLjIuMC1iZXRhLjIsXG4gICAgICAgICAgLy8gMS4yLjAtYmV0YS5mb29ibHogb3IgMS4yLjAtYmV0YSBidW1wcyB0byAxLjIuMC1iZXRhLjBcbiAgICAgICAgICBsZXQgcHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyLCBiYXNlXVxuICAgICAgICAgIGlmIChpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHByZXJlbGVhc2UgPSBbaWRlbnRpZmllcl1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLnByZXJlbGVhc2VbMF0sIGlkZW50aWZpZXIpID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoaXNOYU4odGhpcy5wcmVyZWxlYXNlWzFdKSkge1xuICAgICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IHByZXJlbGVhc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6ICR7cmVsZWFzZX1gKVxuICAgIH1cbiAgICB0aGlzLnJhdyA9IHRoaXMuZm9ybWF0KClcbiAgICBpZiAodGhpcy5idWlsZC5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmF3ICs9IGArJHt0aGlzLmJ1aWxkLmpvaW4oJy4nKX1gXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTZW1WZXJcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBjb21wYXJlID0gKGEsIGIsIGxvb3NlKSA9PlxuICBuZXcgU2VtVmVyKGEsIGxvb3NlKS5jb21wYXJlKG5ldyBTZW1WZXIoYiwgbG9vc2UpKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGd0ID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA+IDBcbm1vZHVsZS5leHBvcnRzID0gZ3RcbiIsImltcG9ydCB7IEFic3RyYWN0RXJyb3IgfSBmcm9tIFwiLi9BYnN0cmFjdEVycm9yLmpzXCI7XG4vKipcbiAqIFVzZWQgd2hlbiBhbiB7QGxpbmtjb2RlICFFcnJvcn0tbGlrZSBvYmplY3Qgd2FzIGNhdWdodCBhbmQgY29udmVydGVkIGludG8gYW5cbiAqIGltcGxlbWVudGF0aW9uIG9mIHtAbGlua2NvZGUgQWJzdHJhY3RFcnJvcn0gZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEludGVybmFsRXJyb3IgZXh0ZW5kcyBBYnN0cmFjdEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGlua2NvZGUgSW50ZXJuYWxFcnJvcn0uXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWFpbiBlcnJvciBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBzdGF0dXMgLSBUaGUgSFRUUCBzdGF0dXMgY29kZSB0byByZXR1cm4uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzID0gNTAwKSB7XG4gICAgICAgIHN1cGVyKFwiRVJSX09TX0lOVEVSTkFMXCIsIG1lc3NhZ2UsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiSW50ZXJuYWxFcnJvclwiO1xuICAgICAgICBpZiAodHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAvLyBDYXB0dXJlIGEgbmV3IHN0YWNrdHJhY2UsIG90aGVyd2lzZSBpdCB3aWxsIGluY2x1ZGUgb3VyIGJhc2UtY2xhc3NcbiAgICAgICAgICAgIC8vIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgdGhlIGNvZGUgbG9jYXRpb24gd2UncmUgYWN0dWFsbHkgaW50ZXJlc3RlZCBpbi5cbiAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEludGVybmFsRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIGVycm9yIGludG8gYW4ge0BsaW5rY29kZSBJbnRlcm5hbEVycm9yfS5cbiAgICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyBBbiB7QGxpbmtjb2RlIEludGVybmFsRXJyb3J9IHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gZXJyb3IuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21FcnJvcihlcnJvcikge1xuICAgICAgICAvLyBDcmVhdGUgYSBfcmVhbF8gYEludGVybmFsRXJyb3JgIGluc3RhbmNlLCB3aGljaCB3ZSB3aWxsIHJldHVybiBsYXRlci5cbiAgICAgICAgY29uc3QgaW50ZXJuYWxFcnJvciA9IG5ldyBJbnRlcm5hbEVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAvLyBBc3NpZ24gdGhlIGVycm9yIHRvIGl0LCB0byBpbmhlcml0IGFsbCB0aGUgZmllbGRzIGluIHRoZSBlcnJvci5cbiAgICAgICAgLy8gVGhlbiBhc3NpZ24gYW5vdGhlciBgSW50ZXJuYWxFcnJvcmAgdG8gcmVwbGFjZSBrZXkgZmllbGRzLCBsaWtlOlxuICAgICAgICAvLyBuYW1lLCBjb2RlLCBzdGF0dXMsIC4uLlxuICAgICAgICBPYmplY3QuYXNzaWduKGludGVybmFsRXJyb3IsIGVycm9yLCBuZXcgSW50ZXJuYWxFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gICAgICAgIC8vIEluaGVyaXQgdGhlIG9yaWdpbmFsIGVycm9yIHN0YWNrIGFnYWluLlxuICAgICAgICBpbnRlcm5hbEVycm9yLnN0YWNrID0gZXJyb3Iuc3RhY2s7XG4gICAgICAgIHJldHVybiBpbnRlcm5hbEVycm9yO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUludGVybmFsRXJyb3IuanMubWFwIiwiaW1wb3J0IHsgQWJzdHJhY3RFcnJvciB9IGZyb20gXCIuL0Fic3RyYWN0RXJyb3IuanNcIjtcbi8qKlxuICogVXNlZCB3aGVuIGFuIHVua25vd24sIG5vbi17QGxpbmtjb2RlICFFcnJvcn0tbGlrZSBvYmplY3Qgd2FzIGNhdWdodCBhbmQgY29udmVydGVkIGludG8gYVxuICogcmVhbCB7QGxpbmtjb2RlICFFcnJvcn0gaW5zdGFuY2UuXG4gKiBMaWtlIHdoZW4geW91IGNhdGNoIGEgYHRocm93IFwiYm9vbVwiYCwgd2Ugd2lsbCBjb252ZXJ0IHRoZSBjYXVnaHQgYFwiYm9vbVwiYFxuICogaW50byBhbiB7QGxpbmtjb2RlIFVua25vd25FcnJvcn0uXG4gKiBUbyBlbnJpY2ggYW4ge0BsaW5rY29kZSAhRXJyb3J9LWxpa2Ugb2JqZWN0IHRoYXQgd2FzIGNhdWdodCwgdXNlIHRoZSB7QGxpbmtjb2RlIEludGVybmFsRXJyb3J9LlxuICovXG5leHBvcnQgY2xhc3MgVW5rbm93bkVycm9yIGV4dGVuZHMgQWJzdHJhY3RFcnJvciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmtjb2RlIFVua25vd25FcnJvcn0uXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWFpbiBlcnJvciBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBzdGF0dXMgLSBUaGUgSFRUUCBzdGF0dXMgY29kZSB0byByZXR1cm4uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzID0gNTAwKSB7XG4gICAgICAgIHN1cGVyKFwiRVJSX09TX1VOS05PV05cIiwgbWVzc2FnZSwgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJVbmtub3duRXJyb3JcIjtcbiAgICAgICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgLy8gQ2FwdHVyZSBhIG5ldyBzdGFja3RyYWNlLCBvdGhlcndpc2UgaXQgd2lsbCBpbmNsdWRlIG91ciBiYXNlLWNsYXNzXG4gICAgICAgICAgICAvLyBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIHRoZSBjb2RlIGxvY2F0aW9uIHdlJ3JlIGFjdHVhbGx5IGludGVyZXN0ZWQgaW4uXG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBVbmtub3duRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5rbm93bkVycm9yLmpzLm1hcCIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIi4uL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBBYnN0cmFjdEVycm9yIH0gZnJvbSBcIi4vQWJzdHJhY3RFcnJvci5qc1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCIuL0ludGVybmFsRXJyb3IuanNcIjtcbmltcG9ydCB7IFVua25vd25FcnJvciB9IGZyb20gXCIuL1Vua25vd25FcnJvci5qc1wiO1xuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHVua25vd24gc3ViamVjdCBpcyBhbiB7QGxpbmtjb2RlICFFcnJvcn0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gc3ViamVjdCAtIFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3ViamVjdCBpcyBhbiB7QGxpbmtjb2RlICFFcnJvcn0sIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgY29uc3QgaXNFcnJvciA9IChzdWJqZWN0KSA9PiB7XG4gICAgcmV0dXJuIHN1YmplY3QgaW5zdGFuY2VvZiBFcnJvciB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ViamVjdCkgPT09IFwiW29iamVjdCBFcnJvcl1cIjtcbn07XG4vKipcbiAqIFJldHVybnMgYW4ge0BsaW5rY29kZSBBYnN0cmFjdEVycm9yfSB0aGF0IGJlc3QgcmVwcmVzZW50cyB0aGUgcGFzc2VkIHN1YmplY3QuXG4gKiBJZiB0aGUgcGFzc2VkIHN1YmplY3QgaXMgYWxyZWFkeSBhbiB7QGxpbmtjb2RlIEFic3RyYWN0RXJyb3J9LCBpdCBpcyByZXR1cm5lZCBhcy1pcy5cbiAqIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhbiBhcHByb3ByaWF0ZSBlcnJvciB0eXBlLlxuICogQHBhcmFtIHN1YmplY3QgLSBUaGUgc3ViamVjdCB0byBpbnNwZWN0XG4gKiBAcmV0dXJucyBBbiB7QGxpbmtjb2RlIEFic3RyYWN0RXJyb3J9IGluc3RhbmNlLlxuICovXG5leHBvcnQgY29uc3QgdW5rbm93blRvRXJyb3IgPSAoc3ViamVjdCkgPT4ge1xuICAgIGlmIChBYnN0cmFjdEVycm9yLmlzQWJzdHJhY3RFcnJvcihzdWJqZWN0KSkge1xuICAgICAgICByZXR1cm4gc3ViamVjdDtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3Ioc3ViamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIEludGVybmFsRXJyb3IuZnJvbUVycm9yKHN1YmplY3QpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVua25vd25FcnJvcihTdHJpbmcoc3ViamVjdCkpO1xufTtcbi8qKlxuICogU2VyaWFsaXplcyBhbiBlcnJvciBpbnRvIGEgc3RyaW5nLlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIHN0cmluZ2lmeS5cbiAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3IuXG4gKi9cbmV4cG9ydCBjb25zdCBlcnJvclRvU3RyaW5nID0gKGVycm9yKSA9PiB7XG4gICAgcmV0dXJuIGlzTmlsKGVycm9yLnRvU3RyaW5nKSA/IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlcnJvcikgOiBlcnJvci50b1N0cmluZygpO1xufTtcbi8qKlxuICogU2VyaWFsaXplcyBhbiBlcnJvciBpbnRvIGEgSlNPTiBzdHJpbmcuXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gc3RyaW5naWZ5LlxuICogQHJldHVybnMgQSBKU09OIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGVycm9yLlxuICovXG5leHBvcnQgY29uc3QgZXJyb3JUb0pTT04gPSAoZXJyb3IpID0+IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyb3IsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycm9yKSk7XG59O1xuLyoqXG4gKiBDb252ZXJ0cyBhbiBlcnJvciBpbnRvIGEgcmVndWxhciBoYXNoLlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIG5ldyBvYmplY3QgdGhhdCBjb250YWlucyBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGVycm9yLlxuICovXG5leHBvcnQgY29uc3QgZXJyb3JUb1JlY29yZCA9IChlcnJvcikgPT4ge1xuICAgIGNvbnN0IHJlY29yZCA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycm9yKSkge1xuICAgICAgICByZWNvcmRbcHJvcGVydHlOYW1lXSA9IGVycm9yW3Byb3BlcnR5TmFtZV07XG4gICAgfVxuICAgIHJldHVybiByZWNvcmQ7XG59O1xuLyoqXG4gKiBTZXJpYWxpemVzIGFuIGVycm9yIGludG8gYSBzaW1wbGVyIHNoYXBlLlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIHNlcmlhbGl6ZS5cbiAqIEByZXR1cm5zIEEgc2ltcGxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvci5cbiAqL1xuZXhwb3J0IGNvbnN0IGVycm9yVG9TaW1wbGVTZXJpYWxpemFibGUgPSAoZXJyb3IpID0+IHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0ge1xuICAgICAgICBjb2RlOiBlcnJvci5jb2RlLFxuICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgICAgICBzdGFjazogZXJyb3Iuc3RhY2ssXG4gICAgfTtcbiAgICByZXR1cm4gc2VyaWFsaXplZDtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvci1zZXJpYWxpemVyLmpzLm1hcCIsIi8qKlxuICogRXhlY3V0ZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIGFuZCBtZWFzdXJlcyBob3cgbG9uZyB0aGUgZXhlY3V0aW9uIHRha2VzLlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgZnVuY3Rpb24gb2Ygd2hpY2ggdGhlIGV4ZWN1dGlvbiBzcGVlZCBzaG91bGQgYmUgbWVhc3VyZWQuXG4gKiBAcmV0dXJucyBBIHR1cGxlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24sIGFuZCB0aGUgZXhlY3V0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzLlxuICovXG5leHBvcnQgY29uc3QgbWVhc3VyZSA9IChjb250ZXh0KSA9PiB7XG4gICAgY29uc3QgZW50cnkgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICByZXR1cm4gW2NvbnRleHQoKSwgcGVyZm9ybWFuY2Uubm93KCkgLSBlbnRyeV07XG59O1xuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gYXN5bmMgZnVuY3Rpb24gYW5kIG1lYXN1cmVzIGhvdyBsb25nIHRoZSBleGVjdXRpb24gdGFrZXMuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBhc3luYyBmdW5jdGlvbiBvZiB3aGljaCB0aGUgZXhlY3V0aW9uIHNwZWVkIHNob3VsZCBiZSBtZWFzdXJlZC5cbiAqIEByZXR1cm5zIEEgdHVwbGUgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiwgYW5kIHRoZSBleGVjdXRpb24gdGltZSBpbiBtaWxsaXNlY29uZHMuXG4gKi9cbmV4cG9ydCBjb25zdCBtZWFzdXJlQXN5bmMgPSBhc3luYyAoY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgcmV0dXJuIFthd2FpdCBjb250ZXh0KCksIHBlcmZvcm1hbmNlLm5vdygpIC0gZW50cnldO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBlcmZvcm1hbmNlLmpzLm1hcCIsImltcG9ydCB7IGlzIH0gZnJvbSBcIi4vbmlsLmpzXCI7XG4vKipcbiAqIFBsYWNlcyB0aGUgaXRlbXMgaW4gdGhlIGFycmF5IGluIHJhbmRvbSBvcmRlci5cbiAqIFRoZSBhcnJheSBpcyBzaHVmZmxlZCBpbi1wbGFjZSwgbm8gY29weSBpcyBjcmVhdGVkLiBUaGUgcmV0dXJuZWQgYXJyYXkgaXMgZXhhY3RseSB0aGUgcGFzc2VkIGFycmF5LlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gKiBAdHlwZVBhcmFtIFRFbGVtZW50cyAtIFRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkuXG4gKiBAcmV0dXJucyBUaGUgcGFzc2VkIGFycmF5IGluIHJhbmRvbSBvcmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHNodWZmbGVBcnJheSA9IChhcnJheSkgPT4ge1xuICAgIGZvciAobGV0IGluZGV4ID0gYXJyYXkubGVuZ3RoIC0gMTsgaW5kZXggPiAwOyBpbmRleC0tKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC50cnVuYyhNYXRoLnJhbmRvbSgpICogKGluZGV4ICsgMSkpO1xuICAgICAgICBjb25zdCB0ZW1wID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBhcnJheVtpbmRleF0gPSBhcnJheVt0YXJnZXRJbmRleF07XG4gICAgICAgIGFycmF5W3RhcmdldEluZGV4XSA9IHRlbXA7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbn07XG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgdGhhdCBob2xkcyBhbGwgaXRlbXMgdGhhdCBhcHBlYXIgaW4gYm90aFxuICogcGFzc2VkIGFycmF5cy5cbiAqIEBwYXJhbSBhIC0gVGhlIGZpcnN0IGFycmF5LlxuICogQHBhcmFtIGIgLSBUaGUgc2Vjb25kIGFycmF5LlxuICogQHR5cGVQYXJhbSBURWxlbWVudHMgLSBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5LlxuICogQHJldHVybnMgQSBuZXcgYXJyYXkgd2hpY2ggaG9sZHMgdGhlIGl0ZW1zIHRoYXQgYXBwZWFyIGluXG4gKiBib3RoIHBhc3NlZCBhcnJheXMuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnRlcnNlY3QgPSAoYSwgYikgPT4ge1xuICAgIHJldHVybiBhLmZpbHRlcih4ID0+IGIuaW5jbHVkZXMoeCkpO1xufTtcbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSB0aGF0IGhvbGRzIGFsbCBpdGVtcyB0aGF0IG9ubHkgYXBwZWFyIGluIGBhYC5cbiAqIEBwYXJhbSBhIC0gVGhlIGZpcnN0IGFycmF5LlxuICogQHBhcmFtIGIgLSBUaGUgc2Vjb25kIGFycmF5LlxuICogQHR5cGVQYXJhbSBURWxlbWVudHMgLSBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5LlxuICogQHJldHVybnMgQSBuZXcgYXJyYXkgd2hpY2ggaG9sZHMgdGhlIGl0ZW1zIHRoYXQgb255IGFwcGVhciBpbiBgYWAuXG4gKi9cbmV4cG9ydCBjb25zdCBkaWZmZXJlbmNlID0gKGEsIGIpID0+IHtcbiAgICByZXR1cm4gYS5maWx0ZXIoeCA9PiAhYi5pbmNsdWRlcyh4KSk7XG59O1xuLyoqXG4gKiBGcm9tIGFuIGFycmF5IHdpdGggdW5rbm93biBjb250ZW50cywgcmV0cmlldmUgYWxsIHRoZSBlbGVtZW50c1xuICogdGhhdCBhcmUgb2YgYSBjZXJ0YWluIHR5cGUgYW5kIHJldHVybiB0aGVtIGFzIGEgbmV3IGFycmF5LlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IHRvIGZpbHRlci5cbiAqIEBwYXJhbSBJbnN0YW5jZVR5cGUgLSBUaGUgdHlwZSB0byBzZWFyY2ggZm9yLlxuICogQHR5cGVQYXJhbSBURWxlbWVudHMgLSBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5LlxuICogQHJldHVybnMgQSBuZXcgYXJyYXkgd2l0aCB0aGUgZmlsdGVyZWQgaXRlbXMuXG4gKi9cbmV4cG9ydCBjb25zdCBmaWx0ZXJUeXBlID0gKGFycmF5LCBJbnN0YW5jZVR5cGUpID0+IGFycmF5LmZpbHRlcihlbGVtZW50ID0+IGlzKGVsZW1lbnQsIEluc3RhbmNlVHlwZSkpO1xuLyoqXG4gKiBGcm9tIGFuIGl0ZXJhYmxlIHdpdGggdW5rbm93biBjb250ZW50cywgeWllbGQgYXJyYXlzIHRoYXQgY29udGFpbiBpdGVtcyBmcm9tXG4gKiB0aGUgaXRlcmFibGUgdXAgdG8gYSBnaXZlbiBsaW1pdC5cbiAqIEBwYXJhbSBpdGVyYWJsZSAtIFRoZSBpdGVyYWJsZSB0byByZXRyaWV2ZSBpdGVtcyBmcm9tLlxuICogQHBhcmFtIGxpbWl0IC0gVGhlIGFtb3VudCBvZiBpdGVtcyBpbiBlYWNoIGNodW5rLlxuICogQHR5cGVQYXJhbSBURWxlbWVudHMgLSBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGl0ZXJhYmxlLlxuICogQHlpZWxkcyBDaHVua3MgZnJvbSB0aGUgcHJvdmlkZWQgaXRlcmFibGUuXG4gKi9cbmV4cG9ydCBjb25zdCBjaHVua2lmeSA9IGZ1bmN0aW9uKiAoaXRlcmFibGUsIGxpbWl0KSB7XG4gICAgbGV0IGNodW5rID0gW107XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgIGNodW5rLnB1c2goZWxlbWVudCk7XG4gICAgICAgIGlmIChjaHVuay5sZW5ndGggPT09IGxpbWl0KSB7XG4gICAgICAgICAgICB5aWVsZCBjaHVuaztcbiAgICAgICAgICAgIGNodW5rID0gW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNodW5rLmxlbmd0aCkge1xuICAgICAgICB5aWVsZCBjaHVuaztcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXkuanMubWFwIiwiaW1wb3J0IHsgaXMsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBjbCA9IDxUIGV4dGVuZHMgQXJyYXk8dW5rbm93bj4+KC4uLmFyZ3M6IFQpOiBBcnJheTxzdHJpbmcgfCBUW251bWJlcl0+ID0+IFtcbiAgXCLwn5Gp4oCN8J+UrFwiLFxuICAuLi5hcmdzXG4gICAgLmZpbHRlcihhcmcgPT4gYXJnICE9PSBcIlwiKVxuICAgIC5mbGF0TWFwKChtYXliZUVycm9yOiBNYXliZTxFcnJvcj4gfCB1bmtub3duKSA9PiB7XG4gICAgICBpZiAoaXMobWF5YmVFcnJvciwgRXJyb3IpKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbWF5YmVFcnJvcjtcbiAgICAgICAgcmV0dXJuIFtlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFja107XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF5YmVFcnJvcjtcbiAgICB9KSxcbl07XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4vTG9nLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBkZWVwTWVyZ2VMZWZ0ID0gKFxuICBhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgYjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHN1YmplY3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5hIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGIpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgc3ViamVjdFtrZXldID0gZGVlcE1lcmdlTGVmdChcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUaGlzIGlzIGp1c3QgbmF1Z2h0eSBidXNpbmVzcy5cbiAgICAgICAga2V5IGluIGEgPyBhW2tleV0gOiB7fSxcbiAgICAgICAgYltrZXldLFxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBzdWJqZWN0W2tleV0gPSBiW2tleV0gPz8gYVtrZXldO1xuICB9XG4gIHJldHVybiBzdWJqZWN0O1xufTtcblxuLyoqXG4gKiBQcm92aWRlcyB0eXBlLXNhZmUgbWVhbnMgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbnRyaWVzXG4gKiBpbiBhIHBhcnRpYWxseSBmaWxsZWQgc3RydWN0dXJlIHdpdGggdHlwZWQga2V5cy5cbiAqXG4gKiBAcGFyYW0gc3ViamVjdCBTb21lIG9iamVjdC5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGtleS12YWx1ZSB0dXBsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RFbnRyaWVzPFRLZXlzIGV4dGVuZHMgc3RyaW5nLCBUVmFsdWVzPihcbiAgc3ViamVjdDogUGFydGlhbDxSZWNvcmQ8VEtleXMsIFRWYWx1ZXM+Pixcbik6IEFycmF5PFtUS2V5cywgVFZhbHVlc10+IHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHN1YmplY3QpIGFzIEFycmF5PFtUS2V5cywgVFZhbHVlc10+O1xufVxuXG4vKipcbiAqIEdpdmVuIGEgYHN1YmplY3RgIG9iamVjdCBzY2hlbWEsIGNvbnN1bWUgYWxsIGtub3duIHZhbHVlcyBmcm9tIHRoZVxuICogYHNvdXJjZWAgaW50byB0aGUgc2NoZW1hIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gc3ViamVjdCBBbiBvYmplY3QgdGhhdCBzaG91bGQgY29uc3VtZSB2YWx1ZXMgZnJvbSB0aGUgc291cmNlLlxuICogQHBhcmFtIHNvdXJjZSBBbiBvYmplY3QgdGhhdCBpcyBzaW1pbGFyIHRvIHRoZSBgc3ViamVjdGAgZnJvbSB3aGljaCB0byBjb3B5IHZhbHVlcy5cbiAqIEBwYXJhbSBjb25zdW1lciBBIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgZWFjaCBgc3ViamVjdGAgYW5kIGBzb3VyY2VgIHZhbHVlIHBhaXIuXG4gKiBAcmV0dXJucyBUaGUgYHN1YmplY3RgIGFmdGVyIHByb2Nlc3NpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lRW50cmllczxUS2V5cyBleHRlbmRzIHN0cmluZywgVFZhbHVlcz4oXG4gIHN1YmplY3Q6IFBhcnRpYWw8UmVjb3JkPFRLZXlzLCBUVmFsdWVzPj4sXG4gIHNvdXJjZTogUGFydGlhbDxSZWNvcmQ8VEtleXMsIFRWYWx1ZXM+PiB8IHVuZGVmaW5lZCxcbiAgY29uc3VtZXI6IChzdWJqZWN0S2V5OiBUVmFsdWVzLCBzb3VyY2VLZXk6IFRWYWx1ZXMgfCB1bmRlZmluZWQpID0+IHVua25vd24sXG4pOiBQYXJ0aWFsPFJlY29yZDxUS2V5cywgVFZhbHVlcz4+IHtcbiAgaWYgKGlzTmlsKHNvdXJjZSkpIHtcbiAgICByZXR1cm4gc3ViamVjdDtcbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG9iamVjdEVudHJpZXMoc3ViamVjdCkpIHtcbiAgICBjb25zdW1lcih2YWx1ZSwgc291cmNlW2tleV0pO1xuICB9XG4gIHJldHVybiBzdWJqZWN0O1xufVxuXG4vKipcbiAqIEdpdmVuIGEgYHN1YmplY3RgIG9iamVjdCBzY2hlbWEsIGNvbnN1bWUgYWxsIGtub3duIHZhbHVlcyBmcm9tIHRoZVxuICogYHNvdXJjZWAgaW50byB0aGUgc2NoZW1hIG9iamVjdC5cbiAqXG4gKiBBZGRpdGlvbmFsbHksIGxvZyBhIG1lc3NhZ2Ugd2hlbiB0aGUgYHNvdXJjZWAgd2FzIG1pc3NpbmcgYSB2YWx1ZSBleHBlY3RlZFxuICogYnkgdGhlIGBzdWJqZWN0YCBzY2hlbWEgYW5kIGxvZyBhIHdhcm5pbmcgd2hlbiB0aGUgYHNvdXJjZWAgc3VwcGxpZWQgYVxuICogdmFsdWUgdGhhdCB3YXMgbm90IGV4cGVjdGVkIGJ5IHRoZSBgc3ViamVjdGAgc2NoZW1hLlxuICpcbiAqIEBwYXJhbSBzdWJqZWN0IEFuIG9iamVjdCB0aGF0IHNob3VsZCBjb25zdW1lIHZhbHVlcyBmcm9tIHRoZSBzb3VyY2UuXG4gKiBAcGFyYW0gc291cmNlIEFuIG9iamVjdCB0aGF0IGlzIHNpbWlsYXIgdG8gdGhlIGBzdWJqZWN0YCBmcm9tIHdoaWNoIHRvIGNvcHkgdmFsdWVzLlxuICogQHBhcmFtIGNvbnN1bWVyIEEgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBlYWNoIGBzdWJqZWN0YCBhbmQgYHNvdXJjZWAgdmFsdWUgcGFpci5cbiAqIEByZXR1cm5zIFRoZSBgc3ViamVjdGAgYWZ0ZXIgcHJvY2Vzc2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWVFbnRyaWVzUGVkYW50aWM8VEtleXMgZXh0ZW5kcyBzdHJpbmcsIFRWYWx1ZXM+KFxuICBzdWJqZWN0OiBQYXJ0aWFsPFJlY29yZDxUS2V5cywgVFZhbHVlcz4+LFxuICBzb3VyY2U6IFBhcnRpYWw8UmVjb3JkPFRLZXlzLCBUVmFsdWVzPj4gfCB1bmRlZmluZWQsXG4gIGNvbnN1bWVyOiAoc3ViamVjdEtleTogVFZhbHVlcywgc291cmNlS2V5OiBUVmFsdWVzIHwgdW5kZWZpbmVkKSA9PiB1bmtub3duLFxuKTogUGFydGlhbDxSZWNvcmQ8VEtleXMsIFRWYWx1ZXM+PiB7XG4gIGlmIChpc05pbChzb3VyY2UpKSB7XG4gICAgY29uc29sZS53YXJuKC4uLmNsKFwiTm8gc291cmNlIGRhdGEgd2FzIHByb3ZpZGVkLlwiKSk7XG4gICAgcmV0dXJuIHN1YmplY3Q7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmplY3RFbnRyaWVzKHN1YmplY3QpKSB7XG4gICAgaWYgKCEoa2V5IGluIHNvdXJjZSkpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyguLi5jbChgRW50cnkgJyR7a2V5fScgaXMgbWlzc2luZyBpbiBzb3VyY2UuIFVzaW5nIGRlZmF1bHQgdmFsdWUuYCkpO1xuICAgIH1cbiAgICBjb25zdW1lcih2YWx1ZSwgc291cmNlW2tleV0pO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5XSBvZiBvYmplY3RFbnRyaWVzKHNvdXJjZSkpIHtcbiAgICBpZiAoIShrZXkgaW4gc3ViamVjdCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgLi4uY2woXG4gICAgICAgICAgYEVudHJ5ICcke2tleX0nIHdhcyBmb3VuZCBpbiBzb3VyY2UsIGJ1dCBpdCBpcyBub3QgZXhwZWN0ZWQgYnkgdGhlIHN1YmplY3Qgc2NoZW1hLiBUaGlzIGVudHJ5IHdpbGwgYmUgaWdub3JlZC5gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YmplY3Q7XG59XG5cbi8qKlxuICogVW5pcXVlIHdyYXBzIGFuIG9iamVjdCB0byBwcmV2ZW50IGFjY2lkZW50YWwgc2hhcmluZyBvZiByZWZlcmVuY2VzIGJ5XG4gKiByZXR1cm5pbmcgY2xvbmVkIHZlcnNpb25zIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmlxdWU8VD4ge1xuICBwcml2YXRlIF9lbGVtOiBUO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW06IFQpIHtcbiAgICB0aGlzLl9lbGVtID0gc3RydWN0dXJlZENsb25lKGVsZW0pO1xuICB9XG5cbiAgdW53cmFwKCkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fZWxlbSk7XG4gIH1cblxuICByZXBsYWNlKGVsZW06IFQpIHtcbiAgICB0aGlzLl9lbGVtID0gc3RydWN0dXJlZENsb25lKGVsZW0pO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnVud3JhcCgpO1xuICB9XG59XG4iLCIvKipcbiAqIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB3aXRoIHRoZSBmaXJzdCBsZXR0ZXIgaW4gdXBwZXIgY2FzZS5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdWNmaXJzdChpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlucHV0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgaW5wdXQuc2xpY2UoMSk7XG59XG5cbi8qKlxuICogUm91bmRzIHRoZSBnaXZlbiBudW1iZXIgdG8gdHdvIGRlY2ltYWxzLlxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgbnVtYmVyIHRvIHJvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcm91bmRUb1R3byhpbnB1dDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoaW5wdXQgKiAxMDApIC8gMTAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmVnYXRpdmVPbmVUb0luZmluaXR5KHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdmFsdWUgPT09IC0xID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogdmFsdWU7XG59XG4iLCJpbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL2FycmF5LmpzXCI7XG5pbXBvcnQgeyBpc05pbCwgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4uL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgQm9uZmlyZUl0ZW0gfSBmcm9tIFwiLi4vc2V0dGluZ3MvQm9uZmlyZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBvYmplY3RFbnRyaWVzIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IG5lZ2F0aXZlT25lVG9JbmZpbml0eSB9IGZyb20gXCIuLi90b29scy9Gb3JtYXQuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBVbnNhZmVCdWlsZGluZyxcbiAgVW5zYWZlU3RhZ2luZ0JsZEJ1dHRvbk9wdGlvbnMsXG4gIFVuc2FmZVVuc3RhZ2VkQnVpbGRpbmdCdXR0b25PcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXMvYnVpbGRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEJ1aWxkaW5nU3RhY2thYmxlQnRuQ29udHJvbGxlcixcbiAgVW5zYWZlQnVpbGRpbmdCdG5Nb2Rlcm5Nb2RlbCxcbiAgVW5zYWZlQnVpbGRpbmdTdGFja2FibGVCdG5Nb2RlbCxcbn0gZnJvbSBcIi4uL3R5cGVzL2NvcmUuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWxsQnVpbGRpbmdzLFxuICBCdWlsZGluZyxcbiAgUHJpY2UsXG4gIFJlc291cmNlLFxuICBUYWJJZCxcbiAgVGltZUl0ZW1WYXJpYW50LFxuICBVbmljb3JuSXRlbVZhcmlhbnQsXG4gIFVubG9ja3MsXG59IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBVbnNhZmVSZWxpZ2lvbkJ0bk1vZGVsLFxuICBVbnNhZmVSZWxpZ2lvbkJ1dHRvbk9wdGlvbnMsXG4gIFVuc2FmZVJlbGlnaW9uVXBncmFkZSxcbiAgVW5zYWZlVHJhbnNjZW5kZW5jZUJ0bk1vZGVsLFxuICBVbnNhZmVUcmFuc2NlbmRlbmNlQnV0dG9uT3B0aW9ucyxcbiAgVW5zYWZlVHJhbnNjZW5kZW5jZVVwZ3JhZGUsXG4gIFVuc2FmZVppZ2d1cmF0QnRuTW9kZWwsXG4gIFVuc2FmZVppZ2d1cmF0QnV0dG9uT3B0aW9ucyxcbiAgVW5zYWZlWmlnZ3VyYXRVcGdyYWRlLFxufSBmcm9tIFwiLi4vdHlwZXMvcmVsaWdpb24uanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgVW5zYWZlUGxhbmV0QnVpbGRpbmdCdXR0b25PcHRpb25zLFxuICBVbnNhZmVTcGFjZUJ1aWxkaW5nLFxuICBVbnNhZmVTcGFjZVByb2dyYW1CdXR0b25PcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXMvc3BhY2UuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgVW5zYWZlQ2hyb25vRm9yZ2VVcGdyYWRlLFxuICBVbnNhZmVDaHJvbm9mb3JnZVVwZ3JhZGVCdXR0b25PcHRpb25zLFxuICBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlLFxuICBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlQnV0dG9uT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGVzL3RpbWUuanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3Nob3BNYW5hZ2VyIH0gZnJvbSBcIi4uL1dvcmtzaG9wTWFuYWdlci5qc1wiO1xuXG5leHBvcnQgdHlwZSBCdWxrQnVpbGRMaXN0SXRlbSA9IHtcbiAgY291bnQ6IG51bWJlcjtcbiAgaWQ6IEFsbEJ1aWxkaW5ncztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIG5hbWU/OiBBbGxCdWlsZGluZ3M7XG4gIHN0YWdlPzogbnVtYmVyO1xuICB2YXJpYW50PzogVGltZUl0ZW1WYXJpYW50IHwgVW5pY29ybkl0ZW1WYXJpYW50O1xufTtcblxudHlwZSBCdWlsZFJlcXVlc3QgPSB7XG4gIGlkOiBBbGxCdWlsZGluZ3M7XG4gIHByaWNlczogQXJyYXk8UHJpY2U+O1xuICBwcmljZVJhdGlvOiBudW1iZXI7XG4gIHNvdXJjZTogVGFiSWQ7XG4gIGxpbWl0OiBudW1iZXI7XG4gIHZhbDogbnVtYmVyO1xufTtcblxudHlwZSBQb3RlbnRpYWxCdWlsZCA9IHtcbiAgaWQ6IEFsbEJ1aWxkaW5ncztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIG5hbWU/OiBBbGxCdWlsZGluZ3M7XG4gIHNwb3Q6IG51bWJlcjtcbiAgY291bnQ6IG51bWJlcjtcbiAgcHJpY2VzOiBBcnJheTxQcmljZT47XG4gIHByaWNlUmF0aW86IG51bWJlcjtcbiAgc291cmNlOiBUYWJJZDtcbiAgbGltaXQ6IG51bWJlcjtcbiAgdmFsOiBudW1iZXI7XG4gIHZhcmlhbnQ/OiBUaW1lSXRlbVZhcmlhbnQgfCBVbmljb3JuSXRlbVZhcmlhbnQ7XG59O1xuXG5leHBvcnQgY2xhc3MgQnVsa1B1cmNoYXNlSGVscGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogS2l0dGVuU2NpZW50aXN0cztcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoaG9zdDogS2l0dGVuU2NpZW50aXN0cywgd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXIpIHtcbiAgICB0aGlzLl9ob3N0ID0gaG9zdDtcbiAgICB0aGlzLl93b3Jrc2hvcE1hbmFnZXIgPSB3b3Jrc2hvcE1hbmFnZXI7XG4gIH1cblxuICAvKipcbiAgICogVGFrZSBhIGhhc2ggb2YgcG90ZW50aWFsIGJ1aWxkcyBhbmQgZGV0ZXJtaW5lIGhvdyBtYW55IG9mIHRoZW0gY2FuIGJlIGJ1aWx0LlxuICAgKlxuICAgKiBAcGFyYW0gYnVpbGRzIC0gQWxsIHBvdGVudGlhbCBidWlsZHMuXG4gICAqIEBwYXJhbSBtZXRhRGF0YSAtIFRoZSBtZXRhZGF0YSBmb3IgdGhlIHBvdGVudGlhbCBidWlsZHMuXG4gICAqIEBwYXJhbSBzZWN0aW9uVHJpZ2dlciAtIFRoZSBjb25maWd1cmVkIHRyaWdnZXIgdGhyZXNob2xkIGZvciB0aGUgc2VjdGlvbiBvZiB0aGVzZSBidWlsZHMuXG4gICAqIEBwYXJhbSBzb3VyY2VUYWIgLSBUaGUgdGFiIHRoZXNlIGJ1aWxkcyBvcmlnaW5hdGUgZnJvbS5cbiAgICogQHJldHVybnMgQWxsIHRoZSBwb3NzaWJsZSBidWlsZHMuXG4gICAqL1xuICBidWxrKFxuICAgIGJ1aWxkczogUGFydGlhbDxcbiAgICAgIFJlY29yZDxcbiAgICAgICAgQWxsQnVpbGRpbmdzLFxuICAgICAgICB7XG4gICAgICAgICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICAgICAgICBsYWJlbD86IHN0cmluZztcbiAgICAgICAgICBtYXg/OiBudW1iZXI7XG4gICAgICAgICAgYmFzZUJ1aWxkaW5nPzogQnVpbGRpbmc7XG4gICAgICAgICAgYnVpbGRpbmc/OiBBbGxCdWlsZGluZ3MgfCBCb25maXJlSXRlbTtcbiAgICAgICAgICBzdGFnZT86IG51bWJlcjtcbiAgICAgICAgICB0cmlnZ2VyOiBudW1iZXI7XG4gICAgICAgICAgdmFyaWFudD86IFRpbWVJdGVtVmFyaWFudCB8IFVuaWNvcm5JdGVtVmFyaWFudDtcbiAgICAgICAgfVxuICAgICAgPlxuICAgID4sXG4gICAgbWV0YURhdGE6IFBhcnRpYWw8XG4gICAgICBSZWNvcmQ8XG4gICAgICAgIEFsbEJ1aWxkaW5ncyxcbiAgICAgICAgUmVxdWlyZWQ8XG4gICAgICAgICAgfCBVbnNhZmVCdWlsZGluZ1xuICAgICAgICAgIHwgVW5zYWZlQ2hyb25vRm9yZ2VVcGdyYWRlXG4gICAgICAgICAgfCBVbnNhZmVSZWxpZ2lvblVwZ3JhZGVcbiAgICAgICAgICB8IFVuc2FmZVNwYWNlQnVpbGRpbmdcbiAgICAgICAgICB8IFVuc2FmZVRyYW5zY2VuZGVuY2VVcGdyYWRlXG4gICAgICAgICAgfCBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlXG4gICAgICAgICAgfCBVbnNhZmVaaWdndXJhdFVwZ3JhZGVcbiAgICAgICAgPlxuICAgICAgPlxuICAgID4sXG4gICAgc2VjdGlvblRyaWdnZXI6IG51bWJlcixcbiAgICBzb3VyY2VUYWI6IFRhYklkLFxuICApOiBBcnJheTxCdWxrQnVpbGRMaXN0SXRlbT4ge1xuICAgIGNvbnN0IHBvdGVudGlhbEJ1aWxkczogQXJyYXk8UG90ZW50aWFsQnVpbGQ+ID0gW107XG5cbiAgICAvLyBIb3cgbWFueSBidWlsZHMgYXJlIG9uIHRoZSBsaXN0LlxuICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIGJ1aWxkXSBvZiBvYmplY3RFbnRyaWVzKGJ1aWxkcykpIHtcbiAgICAgIGNvbnN0IHRyaWdnZXIgPSBFbmdpbmUuZXZhbHVhdGVTdWJTZWN0aW9uVHJpZ2dlcihzZWN0aW9uVHJpZ2dlciwgYnVpbGQudHJpZ2dlcik7XG4gICAgICBjb25zdCBidWlsZE1ldGFEYXRhID0gbXVzdEV4aXN0KG1ldGFEYXRhW25hbWVdKTtcblxuICAgICAgLy8gSWYgdGhlIGJ1aWxkIGlzIGRpc2FibGVkLCBza2lwIGl0LlxuICAgICAgaWYgKCFidWlsZC5lbmFibGVkIHx8IHRyaWdnZXIgPCAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0SGlkZGVuIGlzIGEgZmxhZyB0aGF0IGlzIG1hbnVhbGx5IHNldCB0byBleGNsdWRlIHRpbWUgYnVpbGRpbmdzIGZyb20gdGhlIHByb2Nlc3MuXG4gICAgICBpZiAoXCJ0SGlkZGVuXCIgaW4gYnVpbGRNZXRhRGF0YSAmJiBidWlsZE1ldGFEYXRhLnRIaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBySGlkZGVuIGlzIGEgZmxhZyB0aGF0IGlzIG1hbnVhbGx5IHNldCB0byBleGNsdWRlIHJlbGlnaW9uIGJ1aWxkaW5ncyBmcm9tIHRoZSBwcm9jZXNzLlxuICAgICAgaWYgKFwickhpZGRlblwiIGluIGJ1aWxkTWV0YURhdGEgJiYgYnVpbGRNZXRhRGF0YS5ySGlkZGVuID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gSWYgdGhlIGJ1aWxkaW5nIGlzbid0IHVubG9ja2VkLCBza2lwIGl0LlxuICAgICAgaWYgKGJ1aWxkTWV0YURhdGEudW5sb2NrZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgbWF4IGFsbG93ZWQgYnVpbGRpbmdzIGhhdmUgYWxyZWFkeSBiZWVuIGJ1aWx0LCB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIHRoZW0uXG4gICAgICBpZiAoIWlzTmlsKGJ1aWxkLm1heCkgJiYgLTEgPCBidWlsZC5tYXggJiYgYnVpbGQubWF4IDw9IGJ1aWxkTWV0YURhdGEudmFsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgY3J5b2NoYW1iZXJzLCBpZiB0aGVyZSBhcmUgdXNlZCBjcnlvY2hhbWJlcnMsIGRvbid0IGJ1aWxkIG5ldyBvbmVzLlxuICAgICAgLy8gQWxzbywgZG9uJ3QgYnVpbGQgbW9yZSBjcnlvY2hhbWJlcnMgdGhhbiB5b3UgaGF2ZSBjaHJvbm9zcGhlcmVzLCBhcyB0aGV5J2xsIHN0YXkgdW51c2VkLlxuICAgICAgaWYgKFxuICAgICAgICBuYW1lID09PSBcImNyeW9jaGFtYmVyc1wiICYmXG4gICAgICAgIChtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnRpbWUuZ2V0VlNVKFwidXNlZENyeW9jaGFtYmVyc1wiKSkudmFsID4gMCB8fFxuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJjaHJvbm9zcGhlcmVcIikubWV0YS52YWwgPD0gYnVpbGRNZXRhRGF0YS52YWwpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIGdlbmVyYWxpemVkIHRvIG1hdGNoIGFsbCBidWlsZHMgdGhhdCBoYXZlIGEgYGxpbWl0QnVpbGRgIHByb3BlcnR5LlxuICAgICAgaWYgKG5hbWUgPT09IFwicmVzc291cmNlUmV0cmlldmFsXCIgJiYgYnVpbGRNZXRhRGF0YS52YWwgPj0gMTAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIHByaWNlcyBhbmQgdGhlIHByaWNlIHJhdGlvIG9mIHRoaXMgYnVpbGQuXG4gICAgICBjb25zdCBwcmljZXMgPSBtdXN0RXhpc3QoXG4gICAgICAgIHRoaXMuX2lzU3RhZ2VkQnVpbGQoYnVpbGRNZXRhRGF0YSlcbiAgICAgICAgICA/IGJ1aWxkTWV0YURhdGEuc3RhZ2VzW2J1aWxkTWV0YURhdGEuc3RhZ2VdLnByaWNlc1xuICAgICAgICAgIDogYnVpbGRNZXRhRGF0YS5wcmljZXMsXG4gICAgICApO1xuICAgICAgY29uc3QgcHJpY2VSYXRpbyA9IHRoaXMuZ2V0UHJpY2VSYXRpbyhidWlsZE1ldGFEYXRhLCBzb3VyY2VUYWIpO1xuXG4gICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gYnVpbGQgdGhpcyBpdGVtLlxuICAgICAgaWYgKCF0aGlzLnNpbmdsZUJ1aWxkUG9zc2libGUoYnVpbGRNZXRhRGF0YSwgcHJpY2VzLCBwcmljZVJhdGlvLCBzb3VyY2VUYWIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGlzIGJ1aWxkLlxuICAgICAgLy8gV2Ugd2FudCBhIGxpc3Qgb2YgYWxsIHJlc291cmNlcyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhpcyBidWlsZCwgd2hpY2ggaGF2ZSBhIGNhcGFjaXR5LlxuICAgICAgY29uc3QgcmVxdWlyZWRNYXRlcmlhbHMgPSBwcmljZXNcbiAgICAgICAgLm1hcChwcmljZSA9PiB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UocHJpY2UubmFtZSkpXG4gICAgICAgIC5maWx0ZXIobWF0ZXJpYWwgPT4gMCA8IG1hdGVyaWFsLm1heFZhbHVlKTtcbiAgICAgIGNvbnN0IGFsbE1hdGVyaWFsc0Fib3ZlVHJpZ2dlciA9XG4gICAgICAgIHJlcXVpcmVkTWF0ZXJpYWxzLmZpbHRlcihtYXRlcmlhbCA9PiBtYXRlcmlhbC52YWx1ZSAvIG1hdGVyaWFsLm1heFZhbHVlIDwgdHJpZ2dlcilcbiAgICAgICAgICAubGVuZ3RoID09PSAwO1xuXG4gICAgICBpZiAoYWxsTWF0ZXJpYWxzQWJvdmVUcmlnZ2VyKSB7XG4gICAgICAgIC8vIElmIHRoZSBidWlsZCBpcyBmb3IgYSBzdGFnZSB0aGF0IHRoZSBidWlsZGluZyBpc24ndCBjdXJyZW50bHkgYXQsIHNraXAgaXQuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLl9pc1N0YWdlZEJ1aWxkKGJ1aWxkTWV0YURhdGEpICYmXG4gICAgICAgICAgdHlwZW9mIGJ1aWxkLnN0YWdlICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgYnVpbGQuc3RhZ2UgIT09IGJ1aWxkTWV0YURhdGEuc3RhZ2VcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtUHJpY2VzID0gW107XG5cbiAgICAgICAgLy8gR2V0IGNvc3QgcmVkdWN0aW9uIG1vZGlmaWVyLlxuICAgICAgICBjb25zdCBwcmljZXNEaXNjb3VudCA9IHRoaXMuX2hvc3QuZ2FtZS5nZXRMaW1pdGVkRFIoXG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChgJHtuYW1lfUNvc3RSZWR1Y3Rpb25gIGFzIGNvbnN0KSxcbiAgICAgICAgICAxLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBwcmljZU1vZGlmaWVyID0gMSAtIHByaWNlc0Rpc2NvdW50O1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgYWN0dWFsIHByaWNlcyBmb3IgdGhpcyBidWlsZGluZy5cbiAgICAgICAgZm9yIChjb25zdCBwcmljZSBvZiBwcmljZXMpIHtcbiAgICAgICAgICBjb25zdCByZXNQcmljZURpc2NvdW50ID0gdGhpcy5faG9zdC5nYW1lLmdldExpbWl0ZWREUihcbiAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXRFZmZlY3QoYCR7cHJpY2UubmFtZX1Db3N0UmVkdWN0aW9uYCBhcyBjb25zdCksXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgcmVzUHJpY2VNb2RpZmllciA9IDEgLSByZXNQcmljZURpc2NvdW50O1xuICAgICAgICAgIGl0ZW1QcmljZXMucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBwcmljZS5uYW1lLFxuICAgICAgICAgICAgdmFsOiBwcmljZS52YWwgKiBwcmljZU1vZGlmaWVyICogcmVzUHJpY2VNb2RpZmllcixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgY2FjaGUgbGlzdCBmb3IgdGhlIGJ1bGsgcHJvY2Vzc2luZy5cbiAgICAgICAgcG90ZW50aWFsQnVpbGRzLnB1c2goe1xuICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgIGlkOiBuYW1lLFxuICAgICAgICAgIGxhYmVsOiBidWlsZC5sYWJlbCxcbiAgICAgICAgICBsaW1pdDogYnVpbGQubWF4IHx8IDAsXG4gICAgICAgICAgbmFtZTogKGJ1aWxkLmJhc2VCdWlsZGluZyA/PyBidWlsZC5idWlsZGluZykgYXMgQnVpbGRpbmcsXG4gICAgICAgICAgcHJpY2VSYXRpbzogcHJpY2VSYXRpbyxcbiAgICAgICAgICBwcmljZXM6IGl0ZW1QcmljZXMsXG4gICAgICAgICAgc291cmNlOiBzb3VyY2VUYWIsXG4gICAgICAgICAgc3BvdDogY291bnRlcixcbiAgICAgICAgICB2YWw6IGJ1aWxkTWV0YURhdGEudmFsLFxuICAgICAgICAgIHZhcmlhbnQ6IGJ1aWxkLnZhcmlhbnQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvdW50ZXIrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG90ZW50aWFsQnVpbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgcmVzb3VyY2VzLlxuICAgIC8vIFdlIG5lZWQgYSBjb3B5LCBiZWNhdXNlIGBfZ2V0UG9zc2libGVCdWlsZENvdW50YCBtb2RpZmllcyB0aGlzIGRhdGEuXG4gICAgY29uc3QgY3VycmVudFJlc291cmNlUG9vbDogUmVjb3JkPFJlc291cmNlLCBudW1iZXI+ID0ge30gYXMgUmVjb3JkPFJlc291cmNlLCBudW1iZXI+O1xuICAgIGZvciAoY29uc3QgcmVzIG9mIHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLnJlc291cmNlcykge1xuICAgICAgY3VycmVudFJlc291cmNlUG9vbFtyZXMubmFtZV0gPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUocmVzLm5hbWUpO1xuICAgIH1cblxuICAgIGxldCBpdGVyYXRpb25zID0gMDtcbiAgICBjb25zdCBidWlsZHNDb21taXR0ZWQgPSBuZXcgQXJyYXk8UG90ZW50aWFsQnVpbGQ+KCk7XG4gICAgd2hpbGUgKGl0ZXJhdGlvbnMgPCAxZTUpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXNUaGlzSXRlcmF0aW9uID0gZGlmZmVyZW5jZShwb3RlbnRpYWxCdWlsZHMsIGJ1aWxkc0NvbW1pdHRlZCk7XG5cbiAgICAgIGxldCBidWlsZFRoaXNJdGVyYXRpb24gPSAwO1xuICAgICAgY29uc3QgY29tbWl0dGVkVGhpc0l0ZXJhdGlvbiA9IFtdO1xuICAgICAgbGV0IHRlbXBQb29sID0geyAuLi5jdXJyZW50UmVzb3VyY2VQb29sIH07XG4gICAgICAvLyBQYXkgYWxyZWFkeSBjb21taXR0ZWQgYnVpbGRzIGZyb20gdGhlIHRlbXAgcG9vbC5cbiAgICAgIGZvciAoY29uc3QgY29tbWl0dGVkQnVpbGQgb2YgYnVpbGRzQ29tbWl0dGVkKSB7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlSW5zdGFuY2VzID0gdGhpcy5fcHJlY2FsY3VsYXRlQnVpbGRzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmNvbW1pdHRlZEJ1aWxkLFxuICAgICAgICAgICAgbGltaXQ6IGNvbW1pdHRlZEJ1aWxkLnZhbCArIGNvbW1pdHRlZEJ1aWxkLmNvdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWV0YURhdGEsXG4gICAgICAgICAgdGVtcFBvb2wsXG4gICAgICAgICk7XG4gICAgICAgIHRlbXBQb29sID0gcG9zc2libGVJbnN0YW5jZXMucmVtYWluaW5nUmVzb3VyY2VzO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3cgc2VlIHdoYXQgd2UgY2FuIGRvIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHBvb2wuXG4gICAgICBmb3IgKGNvbnN0IHBvdGVudGlhbEJ1aWxkIG9mIGNhbmRpZGF0ZXNUaGlzSXRlcmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEluc3RhbmNlQ291bnQgPSBwb3RlbnRpYWxCdWlsZC5jb3VudCArIDE7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlSW5zdGFuY2VzID0gdGhpcy5fcHJlY2FsY3VsYXRlQnVpbGRzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnBvdGVudGlhbEJ1aWxkLFxuICAgICAgICAgICAgbGltaXQ6IE1hdGgubWluKFxuICAgICAgICAgICAgICBuZWdhdGl2ZU9uZVRvSW5maW5pdHkocG90ZW50aWFsQnVpbGQubGltaXQpLFxuICAgICAgICAgICAgICBwb3RlbnRpYWxCdWlsZC52YWwgKyB0YXJnZXRJbnN0YW5jZUNvdW50LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1ldGFEYXRhLFxuICAgICAgICAgIHRlbXBQb29sLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChwb3NzaWJsZUluc3RhbmNlcy5jb3VudCA8IHRhcmdldEluc3RhbmNlQ291bnQpIHtcbiAgICAgICAgICBjb21taXR0ZWRUaGlzSXRlcmF0aW9uLnB1c2gocG90ZW50aWFsQnVpbGQpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcG90ZW50aWFsQnVpbGQuY291bnQgPSB0YXJnZXRJbnN0YW5jZUNvdW50O1xuICAgICAgICB0ZW1wUG9vbCA9IHBvc3NpYmxlSW5zdGFuY2VzLnJlbWFpbmluZ1Jlc291cmNlcztcblxuICAgICAgICBidWlsZFRoaXNJdGVyYXRpb24rKztcbiAgICAgIH1cblxuICAgICAgYnVpbGRzQ29tbWl0dGVkLnB1c2goLi4uY29tbWl0dGVkVGhpc0l0ZXJhdGlvbik7XG5cbiAgICAgIGl0ZXJhdGlvbnMrKztcblxuICAgICAgaWYgKGJ1aWxkVGhpc0l0ZXJhdGlvbiA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBUb29rICcke2l0ZXJhdGlvbnN9JyBpdGVyYXRpb25zIHRvIGV2YWx1YXRlIGJ1bGsgYnVpbGQgcmVxdWVzdC5gKSk7XG5cbiAgICByZXR1cm4gYnVpbGRzQ29tbWl0dGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBob3cgbWFueSBvZiBhIGdpdmVuIGJ1aWxkIGl0ZW0gYnVpbGQgYmUgYnVpbHQgd2l0aCB0aGUgZ2l2ZW4gcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAcGFyYW0gYnVpbGRDYWNoZUl0ZW0gVGhlIGl0ZW0gdG8gYnVpbGQuXG4gICAqIEBwYXJhbSBidWlsZENhY2hlSXRlbS5pZCA/XG4gICAqIEBwYXJhbSBidWlsZENhY2hlSXRlbS5uYW1lID9cbiAgICogQHBhcmFtIGJ1aWxkQ2FjaGVJdGVtLmNvdW50ID9cbiAgICogQHBhcmFtIGJ1aWxkQ2FjaGVJdGVtLnNwb3QgP1xuICAgKiBAcGFyYW0gYnVpbGRDYWNoZUl0ZW0ucHJpY2VzID9cbiAgICogQHBhcmFtIGJ1aWxkQ2FjaGVJdGVtLnByaWNlUmF0aW8gP1xuICAgKiBAcGFyYW0gYnVpbGRDYWNoZUl0ZW0uc291cmNlID9cbiAgICogQHBhcmFtIGJ1aWxkQ2FjaGVJdGVtLmxpbWl0ID9cbiAgICogQHBhcmFtIGJ1aWxkQ2FjaGVJdGVtLnZhbCA/XG4gICAqIEBwYXJhbSBtZXRhRGF0YSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBwb3RlbnRpYWwgYnVpbGRzLlxuICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIHJlc291cmNlcy5cbiAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGNvdWxkIGJlIGJ1aWx0LiBJZiB0aGlzIGlzIG5vbi16ZXJvLCB0aGUgYHJlc291cmNlc2Agd2lsbCBoYXZlIGJlZW4gYWRqdXN0ZWRcbiAgICogdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGJ1aWxkcyBtYWRlLlxuICAgKi9cbiAgcHJpdmF0ZSBfcHJlY2FsY3VsYXRlQnVpbGRzKFxuICAgIGJ1aWxkQ2FjaGVJdGVtOiBCdWlsZFJlcXVlc3QsXG4gICAgbWV0YURhdGE6IFBhcnRpYWw8XG4gICAgICBSZWNvcmQ8XG4gICAgICAgIEFsbEJ1aWxkaW5ncyxcbiAgICAgICAgUmVxdWlyZWQ8XG4gICAgICAgICAgfCBVbnNhZmVCdWlsZGluZ1xuICAgICAgICAgIHwgVW5zYWZlQ2hyb25vRm9yZ2VVcGdyYWRlXG4gICAgICAgICAgfCBVbnNhZmVSZWxpZ2lvblVwZ3JhZGVcbiAgICAgICAgICB8IFVuc2FmZVNwYWNlQnVpbGRpbmdcbiAgICAgICAgICB8IFVuc2FmZVRyYW5zY2VuZGVuY2VVcGdyYWRlXG4gICAgICAgICAgfCBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlXG4gICAgICAgICAgfCBVbnNhZmVaaWdndXJhdFVwZ3JhZGVcbiAgICAgICAgPlxuICAgICAgPlxuICAgID4sXG4gICAgcmVzb3VyY2VzOiBSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4gPSB7fSBhcyBSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4sXG4gICk6IHtcbiAgICBjb3VudDogbnVtYmVyO1xuICAgIHJlbWFpbmluZ1Jlc291cmNlczogUmVjb3JkPFJlc291cmNlLCBudW1iZXI+O1xuICB9IHtcbiAgICBsZXQgYnVpbGRzUG9zc2libGUgPSAwO1xuXG4gICAgY29uc3QgdGVtcFBvb2wgPSBPYmplY3QuYXNzaWduKHt9LCByZXNvdXJjZXMpO1xuXG4gICAgLy8gVGhlIEtHIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVpbGQuXG4gICAgY29uc3QgYnVpbGRNZXRhRGF0YSA9IG11c3RFeGlzdChtZXRhRGF0YVtidWlsZENhY2hlSXRlbS5pZF0pO1xuICAgIGNvbnN0IHByaWNlcyA9IGJ1aWxkQ2FjaGVJdGVtLnByaWNlcztcbiAgICBjb25zdCBwcmljZVJhdGlvID0gYnVpbGRDYWNoZUl0ZW0ucHJpY2VSYXRpbztcbiAgICBjb25zdCBzb3VyY2UgPSBidWlsZENhY2hlSXRlbS5zb3VyY2U7XG4gICAgbGV0IG1heEl0ZW1zQnVpbHQgPSBmYWxzZTtcblxuICAgIGlmIChwcmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyBjb3VudDogMCwgcmVtYWluaW5nUmVzb3VyY2VzOiB0ZW1wUG9vbCB9O1xuICAgIH1cblxuICAgIC8vIFRoZXJlIGlzIGFjdHVhbGx5IG5vIHN0cm9uZyBndWFyYW50ZWUgdGhhdCBgbWF4SXRlbXNCdWlsdGAgY2hhbmdlcyBpbiB0aGUgbG9vcHMgYmVsb3cuXG4gICAgLy8gVGhpcyBjb3VsZCBlbmQgdXAgYmVpbmcgYW4gaW5maW5pdGUgbG9vcCB1bmRlciB1bmV4cGVjdGVkIGNvbmRpdGlvbnMuXG4gICAgd2hpbGUgKCFtYXhJdGVtc0J1aWx0KSB7XG4gICAgICAvLyBHbyB0aHJvdWdoIHRoZSBwcmljZXMgZm9yIHRoaXMgYnVpbGQuXG4gICAgICBmb3IgKGxldCBwcmljZUluZGV4ID0gMDsgcHJpY2VJbmRleCA8IHByaWNlcy5sZW5ndGg7IHByaWNlSW5kZXgrKykge1xuICAgICAgICAvLyBJcyB0aGlzIGFuIG9pbCBjb3N0IGZvciBhIGJ1aWxkIG9uIHRoZSBzcGFjZSB0YWI/XG4gICAgICAgIGxldCBzcGFjZU9pbCA9IGZhbHNlO1xuICAgICAgICAvLyBJcyB0aGlzIGEga2FybWEgY29zdCBmb3IgYnVpbGRpbmcgY3J5b2NoYW1iZXJzP1xuICAgICAgICBsZXQgY3J5b0thcm1hID0gZmFsc2U7XG4gICAgICAgIC8vIFRoZSBhY3R1YWwsIGRpc2NvdW50ZWQgb2lsIHByaWNlIGZvciB0aGUgYnVpbGQuXG4gICAgICAgIGxldCBvaWxQcmljZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgLy8gVGhlIGFjdHVhbCwgZGlzY291bnRlZCBrYXJtYSBwcmljZSBmb3IgdGhlIGJ1aWxkLlxuICAgICAgICBsZXQga2FybWFQcmljZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgZmxhZ3MgYWJvdmUuXG4gICAgICAgIGlmIChzb3VyY2UgPT09IFwiU3BhY2VcIiAmJiBwcmljZXNbcHJpY2VJbmRleF0ubmFtZSA9PT0gXCJvaWxcIikge1xuICAgICAgICAgIHNwYWNlT2lsID0gdHJ1ZTtcblxuICAgICAgICAgIGNvbnN0IG9pbFJlZHVjdGlvblJhdGlvID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcIm9pbFJlZHVjdGlvblJhdGlvXCIpO1xuICAgICAgICAgIG9pbFByaWNlID1cbiAgICAgICAgICAgIHByaWNlc1twcmljZUluZGV4XS52YWwgKiAoMSAtIHRoaXMuX2hvc3QuZ2FtZS5nZXRMaW1pdGVkRFIob2lsUmVkdWN0aW9uUmF0aW8sIDAuNzUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChidWlsZENhY2hlSXRlbS5pZCA9PT0gXCJjcnlvY2hhbWJlcnNcIiAmJiBwcmljZXNbcHJpY2VJbmRleF0ubmFtZSA9PT0gXCJrYXJtYVwiKSB7XG4gICAgICAgICAgY3J5b0thcm1hID0gdHJ1ZTtcblxuICAgICAgICAgIGNvbnN0IGJ1cm5lZFBhcmFnb25SYXRpbyA9IHRoaXMuX2hvc3QuZ2FtZS5wcmVzdGlnZS5nZXRCdXJuZWRQYXJhZ29uUmF0aW8oKTtcbiAgICAgICAgICBrYXJtYVByaWNlID1cbiAgICAgICAgICAgIHByaWNlc1twcmljZUluZGV4XS52YWwgKlxuICAgICAgICAgICAgKDEgLSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKDAuMDEgKiBidXJuZWRQYXJhZ29uUmF0aW8sIDEuMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNwYWNlT2lsKSB7XG4gICAgICAgICAgbWF4SXRlbXNCdWlsdCA9IHRlbXBQb29sLm9pbCA8IG9pbFByaWNlICogMS4wNSAqKiAoYnVpbGRzUG9zc2libGUgKyBidWlsZE1ldGFEYXRhLnZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3J5b0thcm1hKSB7XG4gICAgICAgICAgbWF4SXRlbXNCdWlsdCA9XG4gICAgICAgICAgICB0ZW1wUG9vbC5rYXJtYSA8IGthcm1hUHJpY2UgKiBwcmljZVJhdGlvICoqIChidWlsZHNQb3NzaWJsZSArIGJ1aWxkTWV0YURhdGEudmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXhJdGVtc0J1aWx0ID1cbiAgICAgICAgICAgIHRlbXBQb29sW3ByaWNlc1twcmljZUluZGV4XS5uYW1lXSA8XG4gICAgICAgICAgICBwcmljZXNbcHJpY2VJbmRleF0udmFsICogcHJpY2VSYXRpbyAqKiAoYnVpbGRzUG9zc2libGUgKyBidWlsZE1ldGFEYXRhLnZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBhbnkgc3BlY2lhbCBidWlsZHMgaGF2ZSByZWFjaGVkIHRoZWlyIHJlYXNvbmFibGUgbGltaXQgb2YgdW5pdHMgdG8gYnVpbGQuXG4gICAgICAgIC8vIEluIHdoaWNoIGNhc2Ugd2UgdXBkYXRlIG91ciB0ZW1wb3JhcnkgcmVzb3VyY2VzIGNhY2hlLiBOb3Qgc3VyZSB3aHkuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBtYXhJdGVtc0J1aWx0IHx8XG4gICAgICAgICAgLy8gSXMgdGhpcyBhIG5vbi1zdGFja2FibGUgYnVpbGQ/XG4gICAgICAgICAgLy8gU3BhY2UgbWlzc2lvbnMgYW5kIHJlbGlnaW9uIHVwZ3JhZGVzIChiZWZvcmUgdHJhbnNjZW5kZW5jZSBpcyB1bmxvY2tlZClcbiAgICAgICAgICAvLyBhcmUgZXhhbXBsZSBvZiBub24tc3RhY2thYmxlIGJ1aWxkcy5cbiAgICAgICAgICAoXCJub1N0YWNrYWJsZVwiIGluIGJ1aWxkTWV0YURhdGEgJiZcbiAgICAgICAgICAgIGJ1aWxkTWV0YURhdGEubm9TdGFja2FibGUgJiZcbiAgICAgICAgICAgIGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwgPj0gMSkgfHxcbiAgICAgICAgICAvLyBJcyB0aGlzIHRoZSByZXNvdXJjZSByZXRyaWV2YWwgYnVpbGQ/IFRoaXMgb25lIGlzIGxpbWl0ZWQgdG8gMTAwIHVuaXRzLlxuICAgICAgICAgIChidWlsZENhY2hlSXRlbS5pZCA9PT0gXCJyZXNzb3VyY2VSZXRyaWV2YWxcIiAmJlxuICAgICAgICAgICAgYnVpbGRzUG9zc2libGUgKyBidWlsZE1ldGFEYXRhLnZhbCA+PSAxMDApIHx8XG4gICAgICAgICAgKGJ1aWxkQ2FjaGVJdGVtLmlkID09PSBcImNyeW9jaGFtYmVyc1wiICYmXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KFwiY2hyb25vc3BoZXJlXCIpLm1ldGEudmFsIDw9XG4gICAgICAgICAgICAgIGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHByaWNlcyB0aGF0IHdlIGhhdmUgYWxyZWFkeSBjaGVja2VkLlxuICAgICAgICAgIGZvciAobGV0IHByaWNlSW5kZXgyID0gMDsgcHJpY2VJbmRleDIgPCBwcmljZUluZGV4OyBwcmljZUluZGV4MisrKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBUaGlzIHNlZW1zIHRvIGp1c3QgYmUgYHNwYWNlT2lsYC5cbiAgICAgICAgICAgIC8vIFRPRE86IEEgbG90IG9mIHRoaXMgY29kZSBzZWVtcyB0byBiZSBhIGR1cGxpY2F0aW9uIGZyb20gYSBmZXcgbGluZXMgYWJvdmUuXG4gICAgICAgICAgICBpZiAoc291cmNlID09PSBcIlNwYWNlXCIgJiYgcHJpY2VzW3ByaWNlSW5kZXgyXS5uYW1lID09PSBcIm9pbFwiKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9pbFJlZHVjdGlvblJhdGlvID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcIm9pbFJlZHVjdGlvblJhdGlvXCIpO1xuICAgICAgICAgICAgICBjb25zdCBvaWxQcmljZVJlZnVuZCA9XG4gICAgICAgICAgICAgICAgcHJpY2VzW3ByaWNlSW5kZXgyXS52YWwgKlxuICAgICAgICAgICAgICAgICgxIC0gdGhpcy5faG9zdC5nYW1lLmdldExpbWl0ZWREUihvaWxSZWR1Y3Rpb25SYXRpbywgMC43NSkpO1xuXG4gICAgICAgICAgICAgIHRlbXBQb29sLm9pbCArPSBvaWxQcmljZVJlZnVuZCAqIDEuMDUgKiogKGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwpO1xuXG4gICAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2VlbXMgdG8ganVzdCBiZSBgY3J5b0thcm1hYC5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGJ1aWxkQ2FjaGVJdGVtLmlkID09PSBcImNyeW9jaGFtYmVyc1wiICYmXG4gICAgICAgICAgICAgIHByaWNlc1twcmljZUluZGV4Ml0ubmFtZSA9PT0gXCJrYXJtYVwiXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgYnVybmVkUGFyYWdvblJhdGlvID0gdGhpcy5faG9zdC5nYW1lLnByZXN0aWdlLmdldEJ1cm5lZFBhcmFnb25SYXRpbygpO1xuICAgICAgICAgICAgICBjb25zdCBrYXJtYVByaWNlUmVmdW5kID1cbiAgICAgICAgICAgICAgICBwcmljZXNbcHJpY2VJbmRleDJdLnZhbCAqXG4gICAgICAgICAgICAgICAgKDEgLSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKDAuMDEgKiBidXJuZWRQYXJhZ29uUmF0aW8sIDEuMCkpO1xuXG4gICAgICAgICAgICAgIHRlbXBQb29sLmthcm1hICs9XG4gICAgICAgICAgICAgICAga2FybWFQcmljZVJlZnVuZCAqIHByaWNlUmF0aW8gKiogKGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVmdW5kVmFsID1cbiAgICAgICAgICAgICAgICBwcmljZXNbcHJpY2VJbmRleDJdLnZhbCAqIHByaWNlUmF0aW8gKiogKGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwpO1xuICAgICAgICAgICAgICB0ZW1wUG9vbFtwcmljZXNbcHJpY2VJbmRleDJdLm5hbWVdICs9XG4gICAgICAgICAgICAgICAgcHJpY2VzW3ByaWNlSW5kZXgyXS5uYW1lID09PSBcInZvaWRcIiA/IE1hdGguY2VpbChyZWZ1bmRWYWwpIDogcmVmdW5kVmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElzIHRoaXMgYSBsaW1pdGVkIGJ1aWxkPyBJZiBzbywgZG9uJ3QgYnVpbGQgbW9yZSB0aGFuIHRoZSBsaW1pdC5cbiAgICAgICAgICBpZiAoYnVpbGRDYWNoZUl0ZW0ubGltaXQgJiYgYnVpbGRDYWNoZUl0ZW0ubGltaXQgIT09IC0xKSB7XG4gICAgICAgICAgICBidWlsZHNQb3NzaWJsZSA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBNYXRoLm1pbihidWlsZHNQb3NzaWJsZSwgYnVpbGRDYWNoZUl0ZW0ubGltaXQgLSBidWlsZENhY2hlSXRlbS52YWwpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4geyBjb3VudDogYnVpbGRzUG9zc2libGUsIHJlbWFpbmluZ1Jlc291cmNlczogdGVtcFBvb2wgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZHVjdCB0aGUgY29zdCBvZiB0aGlzIHByaWNlIGZyb20gdGhlIHRlbXBvcmFyeSByZXNvdXJjZSBjYWNoZS5cbiAgICAgICAgaWYgKHNwYWNlT2lsKSB7XG4gICAgICAgICAgdGVtcFBvb2wub2lsIC09IG9pbFByaWNlICogMS4wNSAqKiAoYnVpbGRzUG9zc2libGUgKyBidWlsZE1ldGFEYXRhLnZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3J5b0thcm1hKSB7XG4gICAgICAgICAgdGVtcFBvb2wua2FybWEgLT0ga2FybWFQcmljZSAqIHByaWNlUmF0aW8gKiogKGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5ld1ByaWNlVmFsdWUgPVxuICAgICAgICAgICAgcHJpY2VzW3ByaWNlSW5kZXhdLnZhbCAqIHByaWNlUmF0aW8gKiogKGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwpO1xuICAgICAgICAgIHRlbXBQb29sW3ByaWNlc1twcmljZUluZGV4XS5uYW1lXSAtPVxuICAgICAgICAgICAgcHJpY2VzW3ByaWNlSW5kZXhdLm5hbWUgPT09IFwidm9pZFwiID8gTWF0aC5jZWlsKG5ld1ByaWNlVmFsdWUpIDogbmV3UHJpY2VWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSBuZXh0IHByaWNlLi4uXG4gICAgICB9XG5cbiAgICAgICsrYnVpbGRzUG9zc2libGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY291bnQ6IGJ1aWxkc1Bvc3NpYmxlLCByZW1haW5pbmdSZXNvdXJjZXM6IHRlbXBQb29sIH07XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHRyaWdnZXIgdGhlIGJ1aWxkIGZvciBhIGdpdmVuIGJ1dHRvbi5cbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1dHRvbi5cbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnVpbGQgYnV0dG9uLlxuICAgKiBAcGFyYW0gYW1vdW50IEhvdyBtYW55IGl0ZW1zIHRvIGJ1aWxkLlxuICAgKiBAcmV0dXJucyBIb3cgbWFueSBpdGVtcyB3ZXJlIGJ1aWx0LlxuICAgKi9cbiAgY29uc3RydWN0PFxuICAgIFRNb2RlbCBleHRlbmRzXG4gICAgICB8IFVuc2FmZUJ1aWxkaW5nQnRuTW9kZXJuTW9kZWw8VW5zYWZlU3RhZ2luZ0JsZEJ1dHRvbk9wdGlvbnM+XG4gICAgICB8IFVuc2FmZUJ1aWxkaW5nQnRuTW9kZXJuTW9kZWw8VW5zYWZlVW5zdGFnZWRCdWlsZGluZ0J1dHRvbk9wdGlvbnM+XG4gICAgICB8IFVuc2FmZUJ1aWxkaW5nU3RhY2thYmxlQnRuTW9kZWw8VW5zYWZlQ2hyb25vZm9yZ2VVcGdyYWRlQnV0dG9uT3B0aW9ucz5cbiAgICAgIHwgVW5zYWZlQnVpbGRpbmdTdGFja2FibGVCdG5Nb2RlbDxVbnNhZmVQbGFuZXRCdWlsZGluZ0J1dHRvbk9wdGlvbnM+XG4gICAgICB8IFVuc2FmZUJ1aWxkaW5nU3RhY2thYmxlQnRuTW9kZWw8VW5zYWZlU3BhY2VQcm9ncmFtQnV0dG9uT3B0aW9ucz5cbiAgICAgIHwgVW5zYWZlQnVpbGRpbmdTdGFja2FibGVCdG5Nb2RlbDxVbnNhZmVWb2lkU3BhY2VVcGdyYWRlQnV0dG9uT3B0aW9ucz5cbiAgICAgIHwgVW5zYWZlUmVsaWdpb25CdG5Nb2RlbDxVbnNhZmVSZWxpZ2lvbkJ1dHRvbk9wdGlvbnM+XG4gICAgICB8IFVuc2FmZVRyYW5zY2VuZGVuY2VCdG5Nb2RlbDxVbnNhZmVUcmFuc2NlbmRlbmNlQnV0dG9uT3B0aW9ucz5cbiAgICAgIHwgVW5zYWZlWmlnZ3VyYXRCdG5Nb2RlbDxVbnNhZmVaaWdndXJhdEJ1dHRvbk9wdGlvbnM+LFxuICAgIFRDb250cm9sbGVyIGV4dGVuZHMgQnVpbGRpbmdTdGFja2FibGVCdG5Db250cm9sbGVyPFRNb2RlbD4sXG4gID4obW9kZWw6IFRNb2RlbCwgY29udHJvbGxlcjogVENvbnRyb2xsZXIsIGFtb3VudDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoXCJuYW1lXCIgaW4gbW9kZWwgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKFwiY29udHJvbGxlclwiIGluIG1vZGVsLm9wdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKFwiZ2V0TWV0YWRhdGFcIiBpbiBtb2RlbC5vcHRpb25zLmNvbnRyb2xsZXIgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gbW9kZWwubWV0YWRhdGE7XG4gICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgIGxldCBhbW91bnRDYWxjdWxhdGVkID0gYW1vdW50O1xuXG4gICAgLy8gRm9yIGxpbWl0ZWQgYnVpbGRzLCBvbmx5IGNvbnN0cnVjdCB1cCB0byB0aGUgbWF4LlxuICAgIGNvbnN0IHZzTWV0YSA9IG1ldGEgYXMgUmVxdWlyZWQ8VW5zYWZlVm9pZFNwYWNlVXBncmFkZT47XG4gICAgaWYgKCFpc05pbCh2c01ldGEubGltaXRCdWlsZCkgJiYgdnNNZXRhLmxpbWl0QnVpbGQgLSB2c01ldGEudmFsIDwgYW1vdW50Q2FsY3VsYXRlZCkge1xuICAgICAgYW1vdW50Q2FsY3VsYXRlZCA9IHZzTWV0YS5saW1pdEJ1aWxkIC0gdnNNZXRhLnZhbDtcbiAgICB9XG5cbiAgICBpZiAoKG1vZGVsLmVuYWJsZWQgJiYgY29udHJvbGxlci5oYXNSZXNvdXJjZXMobW9kZWwpKSB8fCB0aGlzLl9ob3N0LmdhbWUuZGV2TW9kZSkge1xuICAgICAgd2hpbGUgKGNvbnRyb2xsZXIuaGFzUmVzb3VyY2VzKG1vZGVsKSAmJiBhbW91bnRDYWxjdWxhdGVkID4gMCkge1xuICAgICAgICBtb2RlbC5wcmljZXMgPSBjb250cm9sbGVyLmdldFByaWNlcyhtb2RlbCk7XG4gICAgICAgIGNvbnRyb2xsZXIucGF5UHJpY2UobW9kZWwpO1xuICAgICAgICBjb250cm9sbGVyLmluY3JlbWVudFZhbHVlKG1vZGVsKTtcbiAgICAgICAgY291bnRlcisrO1xuICAgICAgICBhbW91bnRDYWxjdWxhdGVkLS07XG4gICAgICB9XG4gICAgICBpZiAodnNNZXRhLmJyZWFrSXJvbldpbGwpIHtcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLmlyb25XaWxsID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIWlzTmlsKG1ldGEpKSB7XG4gICAgICAgIGlmIChcInVubG9ja3NcIiBpbiBtZXRhICYmICFpc05pbChtZXRhLnVubG9ja3MpKSB7XG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLnVubG9jayhtZXRhLnVubG9ja3MgYXMgUGFydGlhbDxVbmxvY2tzPik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwidXBncmFkZXNcIiBpbiBtZXRhICYmICFpc05pbChtZXRhLnVwZ3JhZGVzKSkge1xuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS51cGdyYWRlKG1ldGEudXBncmFkZXMgYXMgUGFydGlhbDxVbmxvY2tzPik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH1cblxuICBwcml2YXRlIF9pc1N0YWdlZEJ1aWxkKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogVGhpcyBpcyBjdXJyZW50bHkgdG9vIGhhcmQgdG8gd29yayBhcm91bmQuXG4gICAgZGF0YTogYW55LFxuICApOiBkYXRhIGlzIHtcbiAgICBzdGFnZTogbnVtYmVyO1xuICAgIHN0YWdlczogQXJyYXk8e1xuICAgICAgcHJpY2VSYXRpbzogbnVtYmVyO1xuICAgICAgcHJpY2VzPzogQXJyYXk8UHJpY2U+O1xuICAgIH0+O1xuICB9IHtcbiAgICByZXR1cm4gXCJzdGFnZVwiIGluIGRhdGEgJiYgXCJzdGFnZXNcIiBpbiBkYXRhICYmICFpc05pbChkYXRhLnN0YWdlKSAmJiAhaXNOaWwoZGF0YS5zdGFnZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSB0aGUgcHJpY2UgbW9kaWZpZXIgZm9yIHRoZSBnaXZlbiBidWlsZGluZy5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgVGhlIGJ1aWxkaW5nIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0gc291cmNlIFRoZSB0YWIgdGhlIGJ1aWxkaW5nIGJlbG9uZ3MgdG8uXG4gICAqIEByZXR1cm5zIFRoZSBwcmljZSBtb2RpZmllciBmb3IgdGhpcyBidWlsZGluZy5cbiAgICogQHNlZSBgZ2V0UHJpY2VSYXRpb1dpdGhBY2Nlc3NvcmBAYGJ1aWxkaW5ncy5qc2BcbiAgICovXG4gIGdldFByaWNlUmF0aW8oXG4gICAgZGF0YTpcbiAgICAgIHwgVW5zYWZlQnVpbGRpbmdcbiAgICAgIHwgVW5zYWZlQ2hyb25vRm9yZ2VVcGdyYWRlXG4gICAgICB8IFVuc2FmZVJlbGlnaW9uVXBncmFkZVxuICAgICAgfCBVbnNhZmVTcGFjZUJ1aWxkaW5nXG4gICAgICB8IFVuc2FmZVRyYW5zY2VuZGVuY2VVcGdyYWRlXG4gICAgICB8IFVuc2FmZVZvaWRTcGFjZVVwZ3JhZGVcbiAgICAgIHwgVW5zYWZlWmlnZ3VyYXRVcGdyYWRlLFxuICAgIHNvdXJjZT86IFRhYklkLFxuICApOiBudW1iZXIge1xuICAgIC8vIElmIHRoZSBidWlsZGluZyBoYXMgc3RhZ2VzLCB1c2UgdGhlIHJhdGlvIGZvciB0aGUgY3VycmVudCBzdGFnZS5cbiAgICBjb25zdCByYXRpbyA9XG4gICAgICAvLyBUT0RPOiBUaGlzIHNlZW1zIHdlaXJkLiBXaHkgbm90IHRha2UgdGhlIHByaWNlIHJhdGlvIG9mIHRoZSBzdGFnZSBhcyB0aGUgZGVmYXVsdD9cbiAgICAgIHRoaXMuX2lzU3RhZ2VkQnVpbGQoZGF0YSlcbiAgICAgICAgPyBkYXRhLnByaWNlUmF0aW8gfHwgZGF0YS5zdGFnZXNbZGF0YS5zdGFnZV0ucHJpY2VSYXRpb1xuICAgICAgICA6IChkYXRhLnByaWNlUmF0aW8gPz8gMCk7XG5cbiAgICBsZXQgcmF0aW9EaWZmID0gMDtcbiAgICBpZiAoc291cmNlICYmIHNvdXJjZSA9PT0gXCJCb25maXJlXCIpIHtcbiAgICAgIHJhdGlvRGlmZiA9XG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXRFZmZlY3QoYCR7ZGF0YS5uYW1lfVByaWNlUmF0aW9gIGFzIGNvbnN0KSArXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXRFZmZlY3QoXCJwcmljZVJhdGlvXCIpICtcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcIm1hcFByaWNlUmVkdWN0aW9uXCIpO1xuXG4gICAgICByYXRpb0RpZmYgPSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKHJhdGlvRGlmZiwgcmF0aW8gLSAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmF0aW8gKyByYXRpb0RpZmY7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBnaXZlbiBidWlsZCBjb3VsZCBiZSBwZXJmb3JtZWQuXG4gICAqXG4gICAqIEBwYXJhbSBidWlsZCBUaGUgYnVpbGQgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC5cbiAgICogQHBhcmFtIGJ1aWxkLm5hbWUgVGhlIG5hbWUgb2YgdGhlIGJ1aWxkLlxuICAgKiBAcGFyYW0gYnVpbGQudmFsIFByb2JhYmx5IGhvdyBtYW55IGl0ZW1zIHNob3VsZCBiZSBidWlsdCBpbiB0b3RhbC5cbiAgICogVE9ETzogV2h5IGlzIHRoaXMgcmVsZXZhbnQgaWYgd2Ugb25seSBjYXJlIGFib3V0IGEgc2luZ2xlIGJ1aWxkIGJlaW5nIHBvc3NpYmxlP1xuICAgKiBAcGFyYW0gcHJpY2VzIFRoZSBjdXJyZW50IHByaWNlcyBmb3IgdGhlIGJ1aWxkLlxuICAgKiBAcGFyYW0gcHJpY2VSYXRpbyBUaGUgZ2xvYmFsIHByaWNlIHJhdGlvIG1vZGlmaWVyLlxuICAgKiBAcGFyYW0gc291cmNlIFdoYXQgdGFiIGRpZCB0aGUgYnVpbGQgb3JpZ2luYXRlIGZyb20/XG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYnVpbGQgaXMgcG9zc2libGU7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgc2luZ2xlQnVpbGRQb3NzaWJsZShcbiAgICBidWlsZDogeyBuYW1lOiBBbGxCdWlsZGluZ3M7IHZhbDogbnVtYmVyIH0sXG4gICAgcHJpY2VzOiBBcnJheTxQcmljZT4sXG4gICAgcHJpY2VSYXRpbzogbnVtYmVyLFxuICAgIHNvdXJjZT86IFRhYklkLFxuICApOiBib29sZWFuIHtcbiAgICAvLyBEZXRlcm1pbmUgcHJpY2UgcmVkdWN0aW9uIG9uIHRoaXMgYnVpbGQuXG4gICAgY29uc3QgcHJpY2VzRGlzY291bnQgPSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKFxuICAgICAgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChgJHtidWlsZC5uYW1lfUNvc3RSZWR1Y3Rpb25gIGFzIGNvbnN0KSxcbiAgICAgIDEsXG4gICAgKTtcbiAgICBjb25zdCBwcmljZU1vZGlmaWVyID0gMSAtIHByaWNlc0Rpc2NvdW50O1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgY2FuJ3QgYWZmb3JkIGFueSBvZiB0aGUgcHJpY2VzIGZvciB0aGlzIGJ1aWxkLlxuICAgIC8vIFJldHVybiBgZmFsc2VgIGlmIHdlIGNhbid0IGFmZm9yZCBzb21ldGhpbmcsIG90aGVyd2lzZSBgdHJ1ZWAgaXNcbiAgICAvLyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgIGZvciAoY29uc3QgcHJpY2Ugb2YgcHJpY2VzKSB7XG4gICAgICBjb25zdCByZXNvdXJjZVByaWNlRGlzY291bnQgPSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKFxuICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KGAke3ByaWNlLm5hbWV9Q29zdFJlZHVjdGlvbmAgYXMgY29uc3QpLFxuICAgICAgICAxLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc291cmNlUHJpY2VNb2RpZmllciA9IDEgLSByZXNvdXJjZVByaWNlRGlzY291bnQ7XG4gICAgICBjb25zdCBmaW5hbFJlc291cmNlUHJpY2UgPSBwcmljZS52YWwgKiBwcmljZU1vZGlmaWVyICogcmVzb3VyY2VQcmljZU1vZGlmaWVyO1xuXG4gICAgICAvLyBGb3Igc3BhY2UgYnVpbGRzIHRoYXQgY29uc3VtZSBvaWwsIHRha2UgdGhlIG9pbCBwcmljZSByZWR1Y3Rpb24gaW50byBhY2NvdW50LlxuICAgICAgLy8gVGhpcyBpcyBjYXVzZWQgYnkgc3BhY2UgZWxldmF0b3JzLlxuICAgICAgaWYgKHNvdXJjZSAmJiBzb3VyY2UgPT09IFwiU3BhY2VcIiAmJiBwcmljZS5uYW1lID09PSBcIm9pbFwiKSB7XG4gICAgICAgIGNvbnN0IG9pbE1vZGlmaWVyID0gdGhpcy5faG9zdC5nYW1lLmdldExpbWl0ZWREUihcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwib2lsUmVkdWN0aW9uUmF0aW9cIiksXG4gICAgICAgICAgMC43NSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgb2lsUHJpY2UgPSBmaW5hbFJlc291cmNlUHJpY2UgKiAoMSAtIG9pbE1vZGlmaWVyKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcIm9pbFwiKSA8IG9pbFByaWNlICogMS4wNSAqKiBidWlsZC52YWwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3IgY3J5b2NoYW1iZXJzLCB0YWtlIGJ1cm5lZCBwYXJhZ29uIGludG8gYWNjb3VudCBmb3IgdGhlIGthcm1hIGNvc3QuXG4gICAgICB9IGVsc2UgaWYgKGJ1aWxkLm5hbWUgPT09IFwiY3J5b2NoYW1iZXJzXCIgJiYgcHJpY2UubmFtZSA9PT0gXCJrYXJtYVwiKSB7XG4gICAgICAgIGNvbnN0IGthcm1hTW9kaWZpZXIgPSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKFxuICAgICAgICAgIDAuMDEgKiB0aGlzLl9ob3N0LmdhbWUucHJlc3RpZ2UuZ2V0QnVybmVkUGFyYWdvblJhdGlvKCksXG4gICAgICAgICAgMS4wLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBrYXJtYVByaWNlID0gZmluYWxSZXNvdXJjZVByaWNlICogKDEgLSBrYXJtYU1vZGlmaWVyKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcImthcm1hXCIpIDxcbiAgICAgICAgICBrYXJtYVByaWNlICogcHJpY2VSYXRpbyAqKiBidWlsZC52YWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKHByaWNlLm5hbWUpIDxcbiAgICAgICAgICBmaW5hbFJlc291cmNlUHJpY2UgKiBwcmljZVJhdGlvICoqIGJ1aWxkLnZhbFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBjYW4gYWZmb3JkIHRoaXMgYnVpbGQuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSBKUXVlcnkgZnJvbSBcImpxdWVyeVwiO1xuaW1wb3J0IFwiZG9qb1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4uL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgQWNoaWV2ZW1lbnRzLCBBY2hpZXZlbWVudHNQYW5lbCwgQWNoVGFiLCBCYWRnZXNQYW5lbCB9IGZyb20gXCIuL2FjaGlldmVtZW50cy5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBCdWlsZGluZ0J0bk1vZGVybkNvbnRyb2xsZXIsXG4gIEJ1aWxkaW5nTWV0YSxcbiAgQnVpbGRpbmdzTWFuYWdlcixcbiAgQnVpbGRpbmdzTW9kZXJuLFxuICBHYXRoZXJDYXRuaXBCdXR0b25Db250cm9sbGVyLFxuICBNZXRhZGF0YSxcbiAgUmVmaW5lQ2F0bmlwQnV0dG9uLFxuICBSZWZpbmVDYXRuaXBCdXR0b25Db250cm9sbGVyLFxuICBTdGFnaW5nQmxkQnRuLFxuICBTdGFnaW5nQmxkQnRuQ29udHJvbGxlcixcbiAgVW5zYWZlQnVpbGRpbmcsXG59IGZyb20gXCIuL2J1aWxkaW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDYWxlbmRhciwgRXZlbnQgfSBmcm9tIFwiLi9jYWxlbmRhci5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBDaGFsbGVuZ2VCdG5Db250cm9sbGVyLFxuICBDaGFsbGVuZ2VFZmZlY3RzUGFuZWwsXG4gIENoYWxsZW5nZVBhbmVsLFxuICBDaGFsbGVuZ2VzTWFuYWdlcixcbiAgQ2hhbGxlbmdlc1RhYixcbiAgUmVzZXJ2ZU1hbixcbiAgUmVzZXJ2ZXNQYW5lbCxcbiAgVW5zYWZlQ2hhbGxlbmdlLFxufSBmcm9tIFwiLi9jaGFsbGVuZ2VzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtHQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFsbEJ1aWxkaW5nQnRuT3B0aW9ucyxcbiAgQWxsQnVpbGRpbmdSZXNlYXJjaEJ0bk9wdGlvbnMsXG4gIEFsbEJ1aWxkaW5nU3RhY2thYmxlQnRuT3B0aW9ucyxcbiAgQWxsQnV0dG9uTW9kZXJuT3B0aW9ucyxcbiAgQWxsQnV0dG9uT3B0aW9ucyxcbiAgQnVpbGRpbmdCdG4sXG4gIEJ1aWxkaW5nQnRuQ29udHJvbGxlcixcbiAgQnVpbGRpbmdOb3RTdGFja2FibGVCdG5Db250cm9sbGVyLFxuICBCdWlsZGluZ1Jlc2VhcmNoQnRuLFxuICBCdWlsZGluZ1N0YWNrYWJsZUJ0bixcbiAgQnVpbGRpbmdTdGFja2FibGVCdG5Db250cm9sbGVyLFxuICBCdXR0b24sXG4gIEJ1dHRvbkNvbnRyb2xsZXIsXG4gIEJ1dHRvbk1vZGVybixcbiAgQnV0dG9uTW9kZXJuQ29udHJvbGxlcixcbiAgQ29uc29sZSxcbiAgQ29udGVudFJvd1JlbmRlcmVyLFxuICBDb250cm9sLFxuICBJQ2hpbGRyZW5Bd2FyZSxcbiAgSUdhbWVBd2FyZSxcbiAgUGFuZWwsXG4gIFNwYWNlcixcbiAgVGFiLFxuICBUYWJNYW5hZ2VyLFxuICBVbnNhZmVCdWlsZGluZ0J0bk1vZGVsLFxufSBmcm9tIFwiLi9jb3JlLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEF1dG9QaW5uZWRCdXR0b24sXG4gIEF1dG9QaW5uZWRCdXR0b25Db250cm9sbGVyLFxuICBDcmFzaEJjb2luQnV0dG9uQ29udHJvbGxlcixcbiAgRGlwbG9tYWN5LFxuICBEaXBsb21hY3lNYW5hZ2VyLFxuICBFbGRlcnNQYW5lbCxcbiAgRW1iYXNzeUJ1dHRvbixcbiAgRW1iYXNzeUJ1dHRvbkNvbnRyb2xsZXIsXG4gIFJhY2VQYW5lbCxcbiAgU2VuZEV4cGxvcmVyc0J1dHRvbixcbiAgU2VuZEV4cGxvcmVyc0J1dHRvbkNvbnRyb2xsZXIsXG4gIFRyYWRlQnV0dG9uLFxuICBUcmFkZUJ1dHRvbkNvbnRyb2xsZXIsXG59IGZyb20gXCIuL2RpcGxvbWFjeS5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBFZmZlY3RzTWFuYWdlcixcbiAgR2FtZVBhZ2UsXG4gIElEYXRhU3RvcmFnZUF3YXJlLFxuICBTZXJ2ZXIsXG4gIFRlbGVtZXRyeSxcbiAgVGltZXIsXG4gIFVuZG9DaGFuZ2UsXG59IGZyb20gXCIuL2dhbWUuanNcIjtcbmltcG9ydCB0eXBlIHsgTWF0aCBhcyBLR01hdGggfSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEJ1cm5QYXJhZ29uQnRuQ29udHJvbGxlcixcbiAgUHJlc3RpZ2VCdG5Db250cm9sbGVyLFxuICBQcmVzdGlnZU1hbmFnZXIsXG4gIFByZXN0aWdlUGFuZWwsXG4gIFR1cm5IR09mZkJ1dHRvbkNvbnRyb2xsZXIsXG4gIFVuc2FmZVBlcmssXG59IGZyb20gXCIuL3ByZXN0aWdlLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFsbE11bHRpTGlua0J0bk9wdGlvbnMsXG4gIENyeXB0b3RoZW9sb2d5UGFuZWwsXG4gIENyeXB0b3RoZW9sb2d5V0dULFxuICBNdWx0aUxpbmtCdG4sXG4gIFBhY3RzQnRuQ29udHJvbGxlcixcbiAgUGFjdHNNYW5hZ2VyLFxuICBQYWN0c1BhbmVsLFxuICBQYWN0c1dHVCxcbiAgUHJhaXNlQnRuQ29udHJvbGxlcixcbiAgUmVmaW5lQnRuLFxuICBSZWZpbmVUZWFyc0J0bkNvbnRyb2xsZXIsXG4gIFJlbGlnaW9uQnRuQ29udHJvbGxlcixcbiAgUmVsaWdpb25NYW5hZ2VyLFxuICBSZWxpZ2lvblRhYixcbiAgUmVzZXRGYWl0aEJ0bkNvbnRyb2xsZXIsXG4gIFRyYW5zY2VuZEJ0bkNvbnRyb2xsZXIsXG4gIFRyYW5zY2VuZGVuY2VCdG5Db250cm9sbGVyLFxuICBUcmFuc2Zvcm1CdG5Db250cm9sbGVyLFxuICBVbnNhZmVQYWN0LFxuICBVbnNhZmVSZWxpZ2lvblVwZ3JhZGUsXG4gIFVuc2FmZVRyYW5zY2VuZGVuY2VVcGdyYWRlLFxuICBVbnNhZmVaaWdndXJhdFVwZ3JhZGUsXG4gIFppZ2d1cmF0QnRuQ29udHJvbGxlcixcbn0gZnJvbSBcIi4vcmVsaWdpb24uanNcIjtcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VNYW5hZ2VyIH0gZnJvbSBcIi4vcmVzb3VyY2VzLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIExpYnJhcnksXG4gIFBvbGljeUJ0bkNvbnRyb2xsZXIsXG4gIFBvbGljeVBhbmVsLFxuICBTY2llbmNlTWFuYWdlcixcbiAgVGVjaEJ1dHRvbkNvbnRyb2xsZXIsXG4gIFVuc2FmZVBvbGljeSxcbiAgVW5zYWZlVGVjaCxcbn0gZnJvbSBcIi4vc2NpZW5jZS5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBGdXJ0aGVzdFJpbmdQYW5lbCxcbiAgUGxhbmV0QnVpbGRpbmdCdG5Db250cm9sbGVyLFxuICBQbGFuZXRQYW5lbCxcbiAgU3BhY2VNYW5hZ2VyLFxuICBTcGFjZVByb2dyYW1CdG5Db250cm9sbGVyLFxuICBTcGFjZVRhYixcbiAgVW5zYWZlUGxhbmV0LFxuICBVbnNhZmVTcGFjZUJ1aWxkaW5nLFxufSBmcm9tIFwiLi9zcGFjZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdGF0c01hbmFnZXIsIFN0YXRzVGFiIH0gZnJvbSBcIi4vc3RhdHMuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWNjZWxlcmF0ZVRpbWVCdG4sXG4gIEFjY2VsZXJhdGVUaW1lQnRuQ29udHJvbGxlcixcbiAgQ2hyb25vZm9yZ2VCdG5Db250cm9sbGVyLFxuICBDaHJvbm9mb3JnZVdndCxcbiAgRml4Q3J5b2NoYW1iZXJCdG5Db250cm9sbGVyLFxuICBNYW5hZ2VyLFxuICBRdWV1ZVRhYixcbiAgUmVzZXRXZ3QsXG4gIFNoYXR0ZXJUQ0J0bixcbiAgU2hhdHRlclRDQnRuQ29udHJvbGxlcixcbiAgVGltZUNvbnRyb2xXZ3QsXG4gIFRpbWVNYW5hZ2VyLFxuICBUaW1lVGFiLFxuICBVbnNhZmVDaHJvbm9Gb3JnZVVwZ3JhZGUsXG4gIFVuc2FmZVZvaWRTcGFjZVVwZ3JhZGUsXG4gIFZvaWRTcGFjZUJ0bkNvbnRyb2xsZXIsXG4gIFZvaWRTcGFjZVdndCxcbn0gZnJvbSBcIi4vdGltZS5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBUb29sYmFyLFxuICBUb29sYmFyRW5lcmd5LFxuICBUb29sYmFySGFwcGluZXNzLFxuICBUb29sYmFySWNvbixcbiAgVG9vbGJhck1PVEQsXG59IGZyb20gXCIuL3Rvb2xiYXIuanNcIjtcbmltcG9ydCB0eXBlIHsgRGVza3RvcFVJLCBJUmVhY3RBd2FyZSwgVUlTeXN0ZW0gfSBmcm9tIFwiLi91aS5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBCaW9tZUJ0bixcbiAgQmlvbWVCdG5Db250cm9sbGVyLFxuICBDZW5zdXMsXG4gIENlbnN1c1BhbmVsLFxuICBGZXN0aXZhbEJ1dHRvbixcbiAgRmVzdGl2YWxCdXR0b25Db250cm9sbGVyLFxuICBKb2JCdXR0b24sXG4gIEpvYkJ1dHRvbkNvbnRyb2xsZXIsXG4gIEtpdHRlbixcbiAgS2l0dGVuU2ltLFxuICBMb2Fkb3V0LFxuICBMb2Fkb3V0QnV0dG9uLFxuICBMb2Fkb3V0QnV0dG9uQ29udHJvbGxlcixcbiAgTG9hZG91dENvbnRyb2xsZXIsXG4gIE1hcE92ZXJ2aWV3V2d0LFxuICBVbnNhZmVCaW9tZSxcbiAgVW5zYWZlSm9iLFxuICBVcGdyYWRlRXhwbG9yZXJzQ29udHJvbGxlcixcbiAgVXBncmFkZUhRQ29udHJvbGxlcixcbiAgVmlsbGFnZSxcbiAgVmlsbGFnZUJ1dHRvbkNvbnRyb2xsZXIsXG4gIFZpbGxhZ2VNYW5hZ2VyLFxufSBmcm9tIFwiLi92aWxsYWdlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJvcnNoYWNoV2d0LCBWb2lkTWFuYWdlciB9IGZyb20gXCIuL3ZvaWQuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ3JhZnRCdXR0b24sXG4gIENyYWZ0QnV0dG9uQ29udHJvbGxlcixcbiAgVW5zYWZlQ3JhZnQsXG4gIFVuc2FmZVVwZ3JhZGUsXG4gIFVwZ3JhZGVCdXR0b25Db250cm9sbGVyLFxuICBXb3Jrc2hvcCxcbiAgV29ya3Nob3BNYW5hZ2VyLFxuICBaZWJyYVVwZ3JhZGVCdXR0b25Db250cm9sbGVyLFxufSBmcm9tIFwiLi93b3Jrc2hvcC5qc1wiO1xuXG5leHBvcnQgY29uc3QgQnV5SXRlbVJlc3VsdFJlYXNvbnMgPSBbXG4gIFwiYWxyZWFkeS1ib3VnaHRcIixcbiAgXCJjYW5ub3QtYWZmb3JkXCIsXG4gIFwiZGV2LW1vZGVcIixcbiAgXCJpdGVtLWlzLWZyZWVcIixcbiAgXCJub3QtZW5hYmxlZFwiLFxuICBcIm5vdC11bmxvY2tlZFwiLFxuICBcInBhaWQtZm9yXCIsXG4gIFwicGxheWVyLWRlbmllZFwiLFxuICBcInJlcXVpcmUtY29uZmlybWF0aW9uXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQnV5SXRlbVJlc3VsdFJlYXNvbiA9ICh0eXBlb2YgQnV5SXRlbVJlc3VsdFJlYXNvbnMpW251bWJlcl07XG5cbmV4cG9ydCB0eXBlIFVuc2FmZUJ1eUl0ZW1SZXN1bHQgPSB7XG4gIGl0ZW1Cb3VnaHQ6IGJvb2xlYW47XG4gIHJlYXNvbjogQnV5SXRlbVJlc3VsdFJlYXNvbjtcbn07XG5leHBvcnQgdHlwZSBVbnNhZmVCdXlJdGVtUmVzdWx0RGVmZXJyZWQgPSB7XG4gIGl0ZW1Cb3VnaHQ6IGJvb2xlYW47XG4gIHJlYXNvbjogXCJyZXF1aXJlLWNvbmZpcm1hdGlvblwiO1xuICBkZWY6IGRvam8uRGVmZXJyZWQgJiB7XG4gICAgdGhlbjogKGNhbGxhYmxlOiAocmVzdWx0OiBVbnNhZmVCdXlJdGVtUmVzdWx0KSA9PiB2b2lkKSA9PiB2b2lkO1xuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IEJ1aWxkaW5ncyA9IFtcbiAgXCJhY2FkZW15XCIsXG4gIFwiYWNjZWxlcmF0b3JcIixcbiAgXCJhaUNvcmVcIixcbiAgXCJhbXBoaXRoZWF0cmVcIixcbiAgXCJhcXVlZHVjdFwiLFxuICBcImJhcm5cIixcbiAgXCJiaW9sYWJcIixcbiAgXCJicmV3ZXJ5XCIsXG4gIFwiY2FsY2luZXJcIixcbiAgXCJjaGFwZWxcIixcbiAgXCJjaHJvbm9zcGhlcmVcIixcbiAgXCJmYWN0b3J5XCIsXG4gIFwiZmllbGRcIixcbiAgXCJoYXJib3JcIixcbiAgXCJodXRcIixcbiAgXCJsaWJyYXJ5XCIsXG4gIFwibG9nSG91c2VcIixcbiAgXCJsdW1iZXJNaWxsXCIsXG4gIFwibWFnbmV0b1wiLFxuICBcIm1hbnNpb25cIixcbiAgXCJtaW5lXCIsXG4gIFwibWludFwiLFxuICBcIm9ic2VydmF0b3J5XCIsXG4gIFwib2lsV2VsbFwiLFxuICBcInBhc3R1cmVcIixcbiAgXCJxdWFycnlcIixcbiAgXCJyZWFjdG9yXCIsXG4gIFwic21lbHRlclwiLFxuICBcInN0ZWFtd29ya3NcIixcbiAgXCJ0ZW1wbGVcIixcbiAgXCJ0cmFkZXBvc3RcIixcbiAgXCJ1bmljb3JuUGFzdHVyZVwiLFxuICBcIndhcmVob3VzZVwiLFxuICBcIndvcmtzaG9wXCIsXG4gIFwiemVicmFGb3JnZVwiLFxuICBcInplYnJhT3V0cG9zdFwiLFxuICBcInplYnJhV29ya3Nob3BcIixcbiAgXCJ6aWdndXJhdFwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEJ1aWxkaW5nID0gKHR5cGVvZiBCdWlsZGluZ3MpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBTdGFnZWRCdWlsZGluZ3MgPSBbXG4gIFwiYnJvYWRjYXN0dG93ZXJcIixcbiAgXCJkYXRhQ2VudGVyXCIsXG4gIFwiaHlkcm9wbGFudFwiLFxuICBcInNvbGFyZmFybVwiLFxuICBcInNwYWNlcG9ydFwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFN0YWdlZEJ1aWxkaW5nID0gKHR5cGVvZiBTdGFnZWRCdWlsZGluZ3MpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBCdWlsZGluZ0VmZmVjdHMgPSBbXG4gIC8vIGZyb20gZ2FtZS5ibGRcbiAgXCJhY2FkZW15TWV0ZW9yQm9udXNcIixcbiAgXCJhaUxldmVsXCIsXG4gIFwiYWxpY29yblBlclRpY2tDb25cIixcbiAgXCJibG9vZHN0b25lUmF0aW9cIixcbiAgXCJjYXRoUG9sbHV0aW9uUGVyVGlja0NvblwiLFxuICBcImNhdGhQb2xsdXRpb25QZXJUaWNrUHJvZFwiLFxuICBcImNhdG5pcERlbWFuZFJhdGlvXCIsXG4gIFwiY2F0bmlwTWF4XCIsXG4gIFwiY2F0bmlwUGVyVGlja0Jhc2VcIixcbiAgXCJjYXRuaXBQZXJUaWNrQ29uXCIsXG4gIFwiY2F0bmlwUmF0aW9cIixcbiAgXCJjb2FsTWF4XCIsXG4gIFwiY29hbFBlclRpY2tBdXRvcHJvZFwiLFxuICBcImNvYWxQZXJUaWNrQmFzZVwiLFxuICBcImNvYWxQZXJUaWNrQ29uXCIsXG4gIFwiY29hbFJhdGlvR2xvYmFsXCIsXG4gIFwiY3JhZnRSYXRpb1wiLFxuICBcImN1bHR1cmVNYXhcIixcbiAgXCJjdWx0dXJlTWF4UmF0aW9cIixcbiAgXCJjdWx0dXJlUGVyVGlja0Jhc2VcIixcbiAgXCJlbmVyZ3lDb25zdW1wdGlvblwiLFxuICBcImVuZXJneVByb2R1Y3Rpb25cIixcbiAgXCJmYWl0aE1heFwiLFxuICBcImZhaXRoUGVyVGlja0Jhc2VcIixcbiAgXCJmZXN0aXZhbEFycml2YWxSYXRpb1wiLFxuICBcImZlc3RpdmFsUmF0aW9cIixcbiAgXCJmdXJzRGVtYW5kUmF0aW9cIixcbiAgXCJmdXJzUGVyVGlja1Byb2RcIixcbiAgXCJnZmxvcHNQZXJUaWNrQmFzZVwiLFxuICBcImdvbGRNYXhcIixcbiAgXCJnb2xkUGVyVGlja0F1dG9wcm9kXCIsXG4gIFwiZ29sZFBlclRpY2tDb25cIixcbiAgXCJoYXBwaW5lc3NcIixcbiAgXCJodW50ZXJSYXRpb1wiLFxuICBcImlyb25NYXhcIixcbiAgXCJpcm9uUGVyVGlja0F1dG9wcm9kXCIsXG4gIFwiaXJvblBlclRpY2tDb25cIixcbiAgXCJpdm9yeURlbWFuZFJhdGlvXCIsXG4gIFwiaXZvcnlQZXJUaWNrQ29uXCIsXG4gIFwiaXZvcnlQZXJUaWNrUHJvZFwiLFxuICBcIm1hZ25ldG9Cb29zdFJhdGlvXCIsXG4gIFwibWFnbmV0b1JhdGlvXCIsXG4gIFwibWFucG93ZXJNYXhcIixcbiAgXCJtYW5wb3dlclBlclRpY2tDb25cIixcbiAgXCJtYW51c2NyaXB0UGVyVGlja1Byb2RcIixcbiAgXCJtYXhLaXR0ZW5zXCIsXG4gIFwibWluZXJhbHNNYXhcIixcbiAgXCJtaW5lcmFsc1BlclRpY2tDb25cIixcbiAgXCJtaW5lcmFsc1BlclRpY2tQcm9kXCIsXG4gIFwibWluZXJhbHNSYXRpb1wiLFxuICBcIm9pbE1heFwiLFxuICBcIm9pbFBlclRpY2tcIixcbiAgXCJvaWxQZXJUaWNrQmFzZVwiLFxuICBcIm9pbFBlclRpY2tDb25cIixcbiAgXCJvaWxQZXJUaWNrUHJvZFwiLFxuICBcInByb2R1Y3Rpb25SYXRpb1wiLFxuICBcInJlZmluZVJhdGlvXCIsXG4gIFwicmVzU3Rhc2lzUmF0aW9cIixcbiAgXCJzY2llbmNlTWF4XCIsXG4gIFwic2NpZW5jZVJhdGlvXCIsXG4gIFwic2tpbGxYUFwiLFxuICBcInNwaWNlRGVtYW5kUmF0aW9cIixcbiAgXCJzcGljZVBlclRpY2tDb25cIixcbiAgXCJzdGFuZGluZ1JhdGlvXCIsXG4gIFwic3RhckF1dG9TdWNjZXNzQ2hhbmNlXCIsXG4gIFwic3RhckV2ZW50Q2hhbmNlXCIsXG4gIFwic3RlZWxQZXJUaWNrUHJvZFwiLFxuICBcInRNeXRocmlsQ3JhZnRSYXRpb1wiLFxuICBcInRNeXRocmlsUGVyVGlja1wiLFxuICBcInRlbXBvcmFsRmx1eFByb2R1Y3Rpb25cIixcbiAgXCJ0aG9yaXVtUGVyVGlja1wiLFxuICBcInRpdGFuaXVtTWF4XCIsXG4gIFwidGl0YW5pdW1QZXJUaWNrQXV0b3Byb2RcIixcbiAgXCJ0aXRhbml1bVBlclRpY2tDb25cIixcbiAgXCJ0cmFkZVJhdGlvXCIsXG4gIFwidW5oYXBwaW5lc3NSYXRpb1wiLFxuICBcInVuaWNvcm5zUGVyVGlja0Jhc2VcIixcbiAgXCJ1cmFuaXVtTWF4XCIsXG4gIFwidXJhbml1bVBlclRpY2tcIixcbiAgXCJ1cmFuaXVtUGVyVGlja0F1dG9wcm9kXCIsXG4gIFwidXJhbml1bVBlclRpY2tCYXNlXCIsXG4gIFwid29vZE1heFwiLFxuICBcIndvb2RQZXJUaWNrQ29uXCIsXG4gIFwid29vZFJhdGlvXCIsXG4gIFwiemVicmFQcmVwYXJhdGlvbnNcIixcblxuICAvLyBmcm9tIGdhbWUucmVsaWdpb25cbiAgXCJhY3RpdmVIR1wiLFxuICBcImFsaWNvcm5DaGFuY2VcIixcbiAgXCJhbGljb3JuUGVyVGlja1wiLFxuICBcImJsYWNrTGlicmFyeUJvbnVzXCIsXG4gIFwiYmxzQ29ycnVwdGlvblJhdGlvXCIsXG4gIFwiYmxzTGltaXRcIixcbiAgXCJjb21wZW5kaWFUVEJvb3N0UmF0aW9cIixcbiAgXCJjb3JydXB0aW9uQm9vc3RSYXRpb1wiLFxuICBcImNvcnJ1cHRpb25SYXRpb1wiLFxuICBcImN1bHR1cmVNYXhSYXRpb0JvbnVzXCIsXG4gIFwiZGVmaWNpdFJlY292ZXJ5UmF0aW9cIixcbiAgXCJlbmVyZ3lQcm9kdWN0aW9uUmF0aW9cIixcbiAgXCJmYWl0aFJhdGlvUmVsaWdpb25cIixcbiAgXCJnbG9iYWxSZXNvdXJjZVJhdGlvXCIsXG4gIFwiZ29sZE1heFJhdGlvXCIsXG4gIFwiaXZvcnlNZXRlb3JDaGFuY2VcIixcbiAgXCJpdm9yeU1ldGVvclJhdGlvXCIsXG4gIFwibWF4S2l0dGVuc1JhdGlvXCIsXG4gIFwibmVjcm9jb3JuUGVyRGF5XCIsXG4gIFwicGFjdEJsYWNrTGlicmFyeUJvb3N0XCIsXG4gIFwicGFjdERlZmljaXRSZWNvdmVyeVJhdGlvXCIsXG4gIFwicGFjdEZhaXRoUmF0aW9cIixcbiAgXCJwYWN0R2xvYmFsUHJvZHVjdGlvblJhdGlvXCIsXG4gIFwicGFjdEdsb2JhbFJlc291cmNlUmF0aW9cIixcbiAgXCJwYWN0U3BhY2VDb21wZW5kaXVtUmF0aW9cIixcbiAgXCJwYWN0c0F2YWlsYWJsZVwiLFxuICBcInB5cmFtaWRGYWl0aFJhdGlvXCIsXG4gIFwicHlyYW1pZEdsb2JhbFByb2R1Y3Rpb25SYXRpb1wiLFxuICBcInB5cmFtaWRHbG9iYWxSZXNvdXJjZVJhdGlvXCIsXG4gIFwicHlyYW1pZFJlY292ZXJ5UmF0aW9cIixcbiAgXCJweXJhbWlkU3BhY2VDb21wZW5kaXVtUmF0aW9cIixcbiAgXCJyZWxpY1JlZmluZVJhdGlvXCIsXG4gIFwicmlmdENoYW5jZVwiLFxuICBcInJyUmF0aW9cIixcbiAgXCJzaW1TY2FsaW5nUmF0aW9cIixcbiAgXCJzb2xhclJldm9sdXRpb25MaW1pdFwiLFxuICBcInNvbGFyUmV2b2x1dGlvblJhdGlvXCIsXG4gIFwidGNSZWZpbmVSYXRpb1wiLFxuICBcInRpbWVSYXRpb1wiLFxuICBcInVuaWNvcm5zUmF0aW9SZWxpZ2lvblwiLFxuXG4gIC8vIGZyb20gZ2FtZS53b3Jrc2hvcC51cGdyYWRlc1xuICBcImFjY2VsZXJhdG9yUmF0aW9cIixcbiAgXCJiYXJuUmF0aW9cIixcbiAgXCJiZWFjb25SZWxpY3NQZXJEYXlcIixcbiAgXCJiaW9mdWVsUmF0aW9cIixcbiAgXCJicm9hZGNhc3RUb3dlclJhdGlvXCIsXG4gIFwiY2FkQmx1ZXByaW50Q3JhZnRSYXRpb1wiLFxuICBcImNhbGNpbmVyUmF0aW9cIixcbiAgXCJjYWxjaW5lclN0ZWVsQ3JhZnRSYXRpb1wiLFxuICBcImNhbGNpbmVyU3RlZWxSYXRpb1wiLFxuICBcImNhbGNpbmVyU3RlZWxSZWFjdG9yQm9udXNcIixcbiAgXCJjYXRuaXBEZW1hbmRXb3JrZXJSYXRpb0dsb2JhbFwiLFxuICBcImNhdG5pcEpvYlJhdGlvXCIsXG4gIFwiY2F0bmlwTWF4UmF0aW9cIixcbiAgXCJjb2FsUmF0aW9HbG9iYWxSZWR1Y3Rpb25cIixcbiAgXCJjb2FsU3VwZXJSYXRpb1wiLFxuICBcImNyYWNrZXJSYXRpb1wiLFxuICBcImRhdGFDZW50ZXJBSVJhdGlvXCIsXG4gIFwiZWx1ZGl1bUF1dG9tYXRpb25Cb251c1wiLFxuICBcImZhY3RvcnlSZWZpbmVSYXRpb1wiLFxuICBcImhhcmJvckNvYWxSYXRpb1wiLFxuICBcImhhcmJvclJhdGlvXCIsXG4gIFwiaHV0UHJpY2VSYXRpb1wiLFxuICBcImh5ZHJvUGxhbnRSYXRpb1wiLFxuICBcImxpYnJhcnlSYXRpb1wiLFxuICBcImx1bWJlck1pbGxSYXRpb1wiLFxuICBcImx1bmFyT3V0cG9zdFJhdGlvXCIsXG4gIFwibWFucG93ZXJKb2JSYXRpb1wiLFxuICBcIm9pbFdlbGxSYXRpb1wiLFxuICBcInF1ZXVlQ2FwXCIsXG4gIFwicmVhY3RvckVuZXJneVJhdGlvXCIsXG4gIFwicmVhY3RvclRob3JpdW1QZXJUaWNrXCIsXG4gIFwicm91dGVTcGVlZFwiLFxuICBcInNhdG5hdlJhdGlvXCIsXG4gIFwic2hpcExpbWl0XCIsXG4gIFwic2tpbGxNdWx0aXBsaWVyXCIsXG4gIFwic21lbHRlclJhdGlvXCIsXG4gIFwic29sYXJGYXJtUmF0aW9cIixcbiAgXCJzb2xhckZhcm1TZWFzb25SYXRpb1wiLFxuICBcInNwYWNlU2NpZW5jZVJhdGlvXCIsXG4gIFwic3RhcmNoYXJ0R2xvYmFsUmF0aW9cIixcbiAgXCJ0MUNyYWZ0UmF0aW9cIixcbiAgXCJ0MkNyYWZ0UmF0aW9cIixcbiAgXCJ0M0NyYWZ0UmF0aW9cIixcbiAgXCJ0NENyYWZ0UmF0aW9cIixcbiAgXCJ0NUNyYWZ0UmF0aW9cIixcbiAgXCJ0ZW1wb3JhbEZsdXhQcm9kdWN0aW9uQ2hyb25vc3BoZXJlXCIsXG4gIFwidGVtcG9yYWxQYXJhZG94RGF5Qm9udXNcIixcbiAgXCJ1bmljb3Juc0dsb2JhbFJhdGlvXCIsXG4gIFwidXBsaW5rRENSYXRpb1wiLFxuICBcInVwbGlua0xhYlJhdGlvXCIsXG4gIFwidXJhbml1bVJhdGlvXCIsXG4gIFwid2FyZWhvdXNlUmF0aW9cIixcbiAgXCJ3b29kSm9iUmF0aW9cIixcblxuICAvLyBvdGhlciB0YWJzXG4gIFwiZ29sZFByaWNlUmF0aW9cIixcbiAgXCJoYXBwaW5lc3NLaXR0ZW5Qcm9kdWN0aW9uUmF0aW9cIixcbiAgXCJoZWF0TWF4XCIsXG4gIFwiaGVhdFBlclRpY2tcIixcbiAgXCJvYnNlcnZhdG9yeVJhdGlvXCIsXG4gIFwic3RhcmNoYXJ0UGVyVGlja0Jhc2VTcGFjZVwiLFxuICBcInRlbXBvcmFsRmx1eE1heFwiLFxuICBcInVub2J0YWluaXVtUGVyVGlja1NwYWNlXCIsXG4gIFwidXJhbml1bVBlclRpY2tDb25cIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBCdWlsZGluZ0VmZmVjdCA9ICh0eXBlb2YgQnVpbGRpbmdFZmZlY3RzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgU2Vhc29ucyA9IFtcImF1dHVtblwiLCBcInNwcmluZ1wiLCBcInN1bW1lclwiLCBcIndpbnRlclwiXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNlYXNvbiA9ICh0eXBlb2YgU2Vhc29ucylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IEN5Y2xlcyA9IFtcbiAgXCJjaGFyb25cIixcbiAgXCJ1bWJyYVwiLFxuICBcInlhcm5cIixcbiAgXCJoZWxpb3NcIixcbiAgXCJjYXRoXCIsXG4gIFwicmVkbW9vblwiLFxuICBcImR1bmVcIixcbiAgXCJwaXNjaW5lXCIsXG4gIFwidGVybWludXNcIixcbiAgXCJrYWlyb1wiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEN5Y2xlID0gKHR5cGVvZiBDeWNsZXMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBSZXNvdXJjZXNDcmFmdGFibGUgPSBbXG4gIFwiYWxsb3lcIixcbiAgXCJiZWFtXCIsXG4gIFwiYmxvb2RzdG9uZVwiLFxuICBcImJsdWVwcmludFwiLFxuICBcImNvbXBlZGl1bVwiLFxuICBcImNvbmNyYXRlXCIsXG4gIFwiZWx1ZGl1bVwiLFxuICBcImdlYXJcIixcbiAgXCJrZXJvc2VuZVwiLFxuICBcIm1hbnVzY3JpcHRcIixcbiAgXCJtZWdhbGl0aFwiLFxuICBcInBhcmNobWVudFwiLFxuICBcInBsYXRlXCIsXG4gIFwic2NhZmZvbGRcIixcbiAgXCJzaGlwXCIsXG4gIFwic2xhYlwiLFxuICBcInN0ZWVsXCIsXG4gIFwidGFua2VyXCIsXG4gIFwidE15dGhyaWxcIixcbiAgXCJ0aG9yaXVtXCIsXG4gIFwid29vZFwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFJlc291cmNlQ3JhZnRhYmxlID0gKHR5cGVvZiBSZXNvdXJjZXNDcmFmdGFibGUpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBSZXNvdXJjZXMgPSBbXG4gIC4uLlJlc291cmNlc0NyYWZ0YWJsZSxcbiAgXCJhbGljb3JuXCIsXG4gIFwiYW50aW1hdHRlclwiLFxuICBcImJsYWNrY29pblwiLFxuICBcImJ1cm5lZFBhcmFnb25cIixcbiAgXCJjYXRuaXBcIixcbiAgXCJjb2FsXCIsXG4gIFwiY3VsdHVyZVwiLFxuICBcImVsZGVyQm94XCIsXG4gIFwiZmFpdGhcIixcbiAgXCJmdXJzXCIsXG4gIFwiZ2Zsb3BzXCIsXG4gIFwiZ29sZFwiLFxuICBcImhhc2hyYXRlc1wiLFxuICBcImlyb25cIixcbiAgXCJpdm9yeVwiLFxuICBcImthcm1hXCIsXG4gIFwia2l0dGVuc1wiLFxuICBcIm1hbnBvd2VyXCIsXG4gIFwibWluZXJhbHNcIixcbiAgXCJuZWNyb2Nvcm5cIixcbiAgXCJvaWxcIixcbiAgXCJwYXJhZ29uXCIsXG4gIFwicmVsaWNcIixcbiAgXCJzY2llbmNlXCIsXG4gIFwic29ycm93XCIsXG4gIFwic3BpY2VcIixcbiAgXCJzdGFyY2hhcnRcIixcbiAgXCJ0ZWFyc1wiLFxuICBcInRlbXBvcmFsRmx1eFwiLFxuICBcInRpbWVDcnlzdGFsXCIsXG4gIFwidGl0YW5pdW1cIixcbiAgXCJ1bmljb3Juc1wiLFxuICBcInVub2J0YWluaXVtXCIsXG4gIFwidXJhbml1bVwiLFxuICBcInZvaWRcIixcbiAgXCJ3cmFwcGluZ1BhcGVyXCIsXG4gIFwiemVicmFzXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUmVzb3VyY2UgPSAodHlwZW9mIFJlc291cmNlcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IFRhYklkcyA9IFtcbiAgXCJCb25maXJlXCIsXG4gIFwiUmVsaWdpb25cIixcbiAgXCJTY2llbmNlXCIsXG4gIFwiU3BhY2VcIixcbiAgXCJUaW1lXCIsXG4gIFwiVHJhZGVcIixcbiAgXCJWaWxsYWdlXCIsXG4gIFwiV29ya3Nob3BcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBUYWJJZCA9ICh0eXBlb2YgVGFiSWRzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgSm9icyA9IFtcbiAgXCJhbnlcIixcbiAgXCJlbmdpbmVlclwiLFxuICBcImZhcm1lclwiLFxuICBcImdlb2xvZ2lzdFwiLFxuICBcImh1bnRlclwiLFxuICBcIm1pbmVyXCIsXG4gIFwicHJpZXN0XCIsXG4gIFwic2Nob2xhclwiLFxuICBcIndvb2RjdXR0ZXJcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBKb2IgPSAodHlwZW9mIEpvYnMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBUcmFpdHMgPSBbXG4gIFwiY2hlbWlzdFwiLFxuICBcImVuZ2luZWVyXCIsXG4gIFwibWFuYWdlclwiLFxuICBcIm1ldGFsbHVyZ2lzdFwiLFxuICBcIm1lcmNoYW50XCIsXG4gIFwibm9uZVwiLFxuICBcInNjaWVudGlzdFwiLFxuICBcIndpc2VcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBUcmFpdCA9ICh0eXBlb2YgVHJhaXRzKVtudW1iZXJdO1xuXG5leHBvcnQgZW51bSBVbmljb3JuSXRlbVZhcmlhbnQge1xuICBDcnlwdG90aGVvbG9neSA9IFwiY1wiLFxuICBPcmRlck9mVGhlU3VuID0gXCJzXCIsXG4gIFppZ2d1cmF0ID0gXCJ6XCIsXG4gIFVuaWNvcm5QYXN0dXJlID0gXCJ6cFwiLFxufVxuXG5leHBvcnQgY29uc3QgUmVsaWdpb25VcGdyYWRlcyA9IFtcbiAgXCJhcG9jcmlwaGFcIixcbiAgXCJiYXNpbGljYVwiLFxuICBcImdvbGRlblNwaXJlXCIsXG4gIFwic2Nob2xhc3RpY2lzbVwiLFxuICBcInNvbGFyUmV2b2x1dGlvblwiLFxuICBcInNvbGFyY2hhbnRcIixcbiAgXCJzdGFpbmVkR2xhc3NcIixcbiAgXCJzdW5BbHRhclwiLFxuICBcInRlbXBsYXJzXCIsXG4gIFwidHJhbnNjZW5kZW5jZVwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFJlbGlnaW9uVXBncmFkZSA9ICh0eXBlb2YgUmVsaWdpb25VcGdyYWRlcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IFRyYW5zY2VuZGVuY2VVcGdyYWRlcyA9IFtcbiAgXCJibGFja0NvcmVcIixcbiAgXCJibGFja0xpYnJhcnlcIixcbiAgXCJibGFja05leHVzXCIsXG4gIFwiYmxhY2tPYmVsaXNrXCIsXG4gIFwiYmxhY2tSYWRpYW5jZVwiLFxuICBcImJsYXphclwiLFxuICBcImRhcmtOb3ZhXCIsXG4gIFwiaG9seUdlbm9jaWRlXCIsXG4gIFwibWF1c29sZXVtXCIsXG4gIFwic2luZ3VsYXJpdHlcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBUcmFuc2NlbmRlbmNlVXBncmFkZSA9ICh0eXBlb2YgVHJhbnNjZW5kZW5jZVVwZ3JhZGVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgWmlnZ3VyYXRVcGdyYWRlcyA9IFtcbiAgXCJibGFja1B5cmFtaWRcIixcbiAgXCJpdm9yeUNpdGFkZWxcIixcbiAgXCJpdm9yeVRvd2VyXCIsXG4gIFwibWFya2VyXCIsXG4gIFwic2t5UGFsYWNlXCIsXG4gIFwic3Vuc3BpcmVcIixcbiAgXCJ1bmljb3JuR3JhdmV5YXJkXCIsXG4gIFwidW5pY29ybk5lY3JvcG9saXNcIixcbiAgXCJ1bmljb3JuVG9tYlwiLFxuICBcInVuaWNvcm5VdG9waWFcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBaaWdndXJhdFVwZ3JhZGUgPSAodHlwZW9mIFppZ2d1cmF0VXBncmFkZXMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBQYWN0cyA9IFtcbiAgXCJmcmFjdHVyZWRcIixcbiAgXCJwYWN0T2ZDbGVhbnNpbmdcIixcbiAgXCJwYWN0T2ZEZXN0cnVjdGlvblwiLFxuICBcInBhY3RPZkV4dGVybWluYXRpb25cIixcbiAgXCJwYWN0T2ZQdXJpdHlcIixcbiAgXCJwYXlEZWJ0XCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUGFjdCA9ICh0eXBlb2YgUGFjdHMpW251bWJlcl07XG5cbmV4cG9ydCB0eXBlIEFsbEJ1aWxkaW5ncyA9XG4gIHwgQnVpbGRpbmdcbiAgfCBDaHJvbm9Gb3JnZVVwZ3JhZGVcbiAgfCBSZWxpZ2lvblVwZ3JhZGVcbiAgfCBTcGFjZUJ1aWxkaW5nXG4gIHwgVHJhbnNjZW5kZW5jZVVwZ3JhZGVcbiAgfCBWb2lkU3BhY2VVcGdyYWRlXG4gIHwgWmlnZ3VyYXRVcGdyYWRlO1xuXG5leHBvcnQgY29uc3QgUmFjZXMgPSBbXG4gIFwiZHJhZ29uc1wiLFxuICBcImdyaWZmaW5zXCIsXG4gIFwibmFnYXNcIixcbiAgXCJsZXZpYXRoYW5zXCIsXG4gIFwibGl6YXJkc1wiLFxuICBcInNoYXJrc1wiLFxuICBcInNwaWRlcnNcIixcbiAgXCJ6ZWJyYXNcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBSYWNlID0gKHR5cGVvZiBSYWNlcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IFBvbGljaWVzID0gW1xuICBcImF1dGhvY3JhY3lcIixcbiAgXCJiaWdTdGlja1BvbGljeVwiLFxuICBcImNhcm5pdmFsZVwiLFxuICBcImNpdHlPbkFIaWxsXCIsXG4gIFwiY2xlYXJDdXR0aW5nXCIsXG4gIFwiY29tbXVuaXNtXCIsXG4gIFwiY29uc2VydmF0aW9uXCIsXG4gIFwiY3J5b2NoYW1iZXJFeHRyYWN0aW9uXCIsXG4gIFwiY3VsdHVyYWxFeGNoYW5nZVwiLFxuICBcImRpcGxvbWFjeVwiLFxuICBcImRyYWdvblJlbGF0aW9uc0FzdHJvbG9nZXJzXCIsXG4gIFwiZHJhZ29uUmVsYXRpb25zRHluYW1pY2lzdHNcIixcbiAgXCJkcmFnb25SZWxhdGlvbnNQaHlzaWNpc3RzXCIsXG4gIFwiZW52aXJvbm1lbnRhbGlzbVwiLFxuICBcImVwaWN1cmlhbmlzbVwiLFxuICBcImV4cGFuc2lvbmlzbVwiLFxuICBcImV4dHJhdmFnYW5jZVwiLFxuICBcImZhc2Npc21cIixcbiAgXCJmcnVnYWxpdHlcIixcbiAgXCJmdWxsSW5kdXN0cmlhbGl6YXRpb25cIixcbiAgXCJncmlmZmluUmVsYXRpb25zTWFjaGluaXN0c1wiLFxuICBcImdyaWZmaW5SZWxhdGlvbnNNZXRhbGx1cmdpc3RzXCIsXG4gIFwiZ3JpZmZpblJlbGF0aW9uc1Njb3V0c1wiLFxuICBcImlzb2xhdGlvbmlzbVwiLFxuICBcImtub3dsZWRnZVNoYXJpbmdcIixcbiAgXCJsaWJlcmFsaXNtXCIsXG4gIFwibGliZXJ0eVwiLFxuICBcImxpemFyZFJlbGF0aW9uc0RpcGxvbWF0c1wiLFxuICBcImxpemFyZFJlbGF0aW9uc0Vjb2xvZ2lzdHNcIixcbiAgXCJsaXphcmRSZWxhdGlvbnNQcmllc3RzXCIsXG4gIFwibWlsaXRhcml6ZVNwYWNlXCIsXG4gIFwibW9uYXJjaHlcIixcbiAgXCJteXN0aWNpc21cIixcbiAgXCJuYWdhUmVsYXRpb25zQXJjaGl0ZWN0c1wiLFxuICBcIm5hZ2FSZWxhdGlvbnNDdWx0aXN0c1wiLFxuICBcIm5hZ2FSZWxhdGlvbnNNYXNvbnNcIixcbiAgXCJuZWNyb2NyYWN5XCIsXG4gIFwib3Blbldvb2RsYW5kc1wiLFxuICBcIm91dGVyU3BhY2VUcmVhdHlcIixcbiAgXCJyYWRpY2FsWGVub3Bob2JpYVwiLFxuICBcInJhdGlvbmFsaXR5XCIsXG4gIFwicmF0aW9uaW5nXCIsXG4gIFwicmVwdWJsaWNcIixcbiAgXCJzY2llbnRpZmljQ29tbXVuaXNtXCIsXG4gIFwic2hhcmtSZWxhdGlvbnNCb3RhbmlzdHNcIixcbiAgXCJzaGFya1JlbGF0aW9uc01lcmNoYW50c1wiLFxuICBcInNoYXJrUmVsYXRpb25zU2NyaWJlc1wiLFxuICBcInNpcGhvbmluZ1wiLFxuICBcInNvY2lhbGlzbVwiLFxuICBcInNwaWRlclJlbGF0aW9uc0NoZW1pc3RzXCIsXG4gIFwic3BpZGVyUmVsYXRpb25zR2VvbG9naXN0c1wiLFxuICBcInNwaWRlclJlbGF0aW9uc1BhbGVvbnRvbG9naXN0c1wiLFxuICBcInN0b2ljaXNtXCIsXG4gIFwic3RyaXBNaW5pbmdcIixcbiAgXCJzdXN0YWluYWJpbGl0eVwiLFxuICBcInRlY2hub2NyYWN5XCIsXG4gIFwidGVycmFmb3JtaW5nSW5zaWdodFwiLFxuICBcInRoZW9jcmFjeVwiLFxuICBcInRyYWRpdGlvblwiLFxuICBcInRyYW5za2l0dGVuaXNtXCIsXG4gIFwiemVicmFSZWxhdGlvbnNBcHBlYXNlbWVudFwiLFxuICBcInplYnJhUmVsYXRpb25zQmVsbGljb3NpdHlcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBQb2xpY3kgPSAodHlwZW9mIFBvbGljaWVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgVGVjaG5vbG9naWVzSWdub3JlZCA9IFtcImJyZXdlcnlcIl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBUZWNobm9sb2d5SWdub3JlZCA9ICh0eXBlb2YgVGVjaG5vbG9naWVzSWdub3JlZClbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IFRlY2hub2xvZ2llcyA9IFtcbiAgXCJhY291c3RpY3NcIixcbiAgXCJhZHZFeG9nZW9sb2d5XCIsXG4gIFwiYWdyaWN1bHR1cmVcIixcbiAgXCJhaVwiLFxuICBcImFuaW1hbFwiLFxuICBcImFudGltYXR0ZXJcIixcbiAgXCJhcmNoZW9sb2d5XCIsXG4gIFwiYXJjaGVyeVwiLFxuICBcImFyY2hpdGVjdHVyZVwiLFxuICBcImFydGlmaWNpYWxHcmF2aXR5XCIsXG4gIFwiYXN0cm9ub215XCIsXG4gIFwiYmlvY2hlbWlzdHJ5XCIsXG4gIFwiYmlvbG9neVwiLFxuICBcImJsYWNrY2hhaW5cIixcbiAgXCJjYWxlbmRhclwiLFxuICBcImNoZW1pc3RyeVwiLFxuICBcImNocm9ub3BoeXNpY3NcIixcbiAgXCJjaXZpbFwiLFxuICBcImNvbWJ1c3Rpb25cIixcbiAgXCJjb25zdHJ1Y3Rpb25cIixcbiAgXCJjcnlwdG90aGVvbG9neVwiLFxuICBcImN1cnJlbmN5XCIsXG4gIFwiZGltZW5zaW9uYWxQaHlzaWNzXCIsXG4gIFwiZHJhbWFcIixcbiAgXCJlY29sb2d5XCIsXG4gIFwiZWxlY3RyaWNpdHlcIixcbiAgXCJlbGVjdHJvbmljc1wiLFxuICBcImVuZ2luZWVyaW5nXCIsXG4gIFwiZXhvZ2VvbG9neVwiLFxuICBcImV4b2dlb3BoeXNpY3NcIixcbiAgXCJnZW5ldGljc1wiLFxuICBcImh5ZHJvcG9uaWNzXCIsXG4gIFwiaW5kdXN0cmlhbGl6YXRpb25cIixcbiAgXCJtYWNoaW5lcnlcIixcbiAgXCJtYXRoXCIsXG4gIFwibWVjaGFuaXphdGlvblwiLFxuICBcIm1ldGFsXCIsXG4gIFwibWV0YWx1cmd5XCIsXG4gIFwibWV0YXBoeXNpY3NcIixcbiAgXCJtaW5pbmdcIixcbiAgXCJuYW5vdGVjaG5vbG9neVwiLFxuICBcIm5hdmlnYXRpb25cIixcbiAgXCJudWNsZWFyRmlzc2lvblwiLFxuICBcIm9pbFByb2Nlc3NpbmdcIixcbiAgXCJvcmJpdGFsRW5naW5lZXJpbmdcIixcbiAgXCJwYXJhZG94YWxLbm93bGVkZ2VcIixcbiAgXCJwYXJ0aWNsZVBoeXNpY3NcIixcbiAgXCJwaGlsb3NvcGh5XCIsXG4gIFwicGh5c2ljc1wiLFxuICBcInF1YW50dW1DcnlwdG9ncmFwaHlcIixcbiAgXCJyb2JvdGljc1wiLFxuICBcInJvY2tldHJ5XCIsXG4gIFwic2F0dGVsaXRlc1wiLFxuICBcInN0ZWVsXCIsXG4gIFwic3VwZXJjb25kdWN0b3JzXCIsXG4gIFwidGFjaHlvblRoZW9yeVwiLFxuICBcInRlcnJhZm9ybWF0aW9uXCIsXG4gIFwidGhlb2xvZ3lcIixcbiAgXCJ0aG9yaXVtXCIsXG4gIFwidm9pZFNwYWNlXCIsXG4gIFwid3JpdGluZ1wiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFRlY2hub2xvZ3kgPSAodHlwZW9mIFRlY2hub2xvZ2llcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IE1pc3Npb25zID0gW1xuICBcImNlbnRhdXJ1c1N5c3RlbU1pc3Npb25cIixcbiAgXCJjaGFyb25NaXNzaW9uXCIsXG4gIFwiZHVuZU1pc3Npb25cIixcbiAgXCJmdXJ0aGVzdFJpbmdNaXNzaW9uXCIsXG4gIFwiaGVsaW9zTWlzc2lvblwiLFxuICBcImthaXJvTWlzc2lvblwiLFxuICBcIm1vb25NaXNzaW9uXCIsXG4gIFwib3JiaXRhbExhdW5jaFwiLFxuICBcInBpc2NpbmVNaXNzaW9uXCIsXG4gIFwicm9yc2NoYWNoTWlzc2lvblwiLFxuICBcInRlcm1pbnVzTWlzc2lvblwiLFxuICBcInVtYnJhTWlzc2lvblwiLFxuICBcInlhcm5NaXNzaW9uXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgTWlzc2lvbiA9ICh0eXBlb2YgTWlzc2lvbnMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBQbGFuZXRzID0gW1xuICBcImNhdGhcIixcbiAgXCJjZW50YXVydXNTeXN0ZW1cIixcbiAgXCJjaGFyb25cIixcbiAgXCJkdW5lXCIsXG4gIFwiZnVydGhlc3RSaW5nXCIsXG4gIFwiaGVsaW9zXCIsXG4gIFwia2Fpcm9cIixcbiAgXCJtb29uXCIsXG4gIFwicGlzY2luZVwiLFxuICBcInRlcm1pbnVzXCIsXG4gIFwidW1icmFcIixcbiAgXCJ5YXJuXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUGxhbmV0ID0gKHR5cGVvZiBQbGFuZXRzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgU3BhY2VCdWlsZGluZ3MgPSBbXG4gIFwiY29udGFpbm1lbnRDaGFtYmVyXCIsXG4gIFwiY3J5b3N0YXRpb25cIixcbiAgXCJlbnRhbmdsZXJcIixcbiAgXCJoZWF0c2lua1wiLFxuICBcImhySGFydmVzdGVyXCIsXG4gIFwiaHlkcm9mcmFjdHVyZXJcIixcbiAgXCJoeWRyb3Bvbmljc1wiLFxuICBcIm1vbHRlbkNvcmVcIixcbiAgXCJtb29uQmFzZVwiLFxuICBcIm1vb25PdXRwb3N0XCIsXG4gIFwib3JiaXRhbEFycmF5XCIsXG4gIFwicGxhbmV0Q3JhY2tlclwiLFxuICBcInJlc2VhcmNoVmVzc2VsXCIsXG4gIFwic2F0dGVsaXRlXCIsXG4gIFwic3BhY2VCZWFjb25cIixcbiAgXCJzcGFjZUVsZXZhdG9yXCIsXG4gIFwic3BhY2VTdGF0aW9uXCIsXG4gIFwic3BpY2VSZWZpbmVyeVwiLFxuICBcInN1bmZvcmdlXCIsXG4gIFwic3VubGlmdGVyXCIsXG4gIFwidGVjdG9uaWNcIixcbiAgXCJ0ZXJyYWZvcm1pbmdTdGF0aW9uXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU3BhY2VCdWlsZGluZyA9ICh0eXBlb2YgU3BhY2VCdWlsZGluZ3MpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBTdGF0cyA9IFtcbiAgXCJhdmVyYWdlS2l0dGVuc1wiLFxuICBcImJ1aWxkaW5nc0NvbnN0cnVjdGVkXCIsXG4gIFwiZXZlbnRzT2JzZXJ2ZWRcIixcbiAgXCJraXR0ZW5zRGVhZFwiLFxuICBcInRpbWVQbGF5ZWRcIixcbiAgXCJ0b3RhbENoYWxsZW5nZXNDb21wbGV0ZWRcIixcbiAgXCJ0b3RhbENsaWNrc1wiLFxuICBcInRvdGFsQ3JhZnRzXCIsXG4gIFwidG90YWxLaXR0ZW5zXCIsXG4gIFwidG90YWxQYXJhZ29uXCIsXG4gIFwidG90YWxSZXNldHNcIixcbiAgXCJ0b3RhbFRyYWRlc1wiLFxuICBcInRvdGFsWWVhcnNcIixcbiAgXCJ0cmFuc2NlbmRlbmNlVGllclwiLFxuICBcInVuaWNvcm5zU2FjcmlmaWNlZFwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFN0YXQgPSAodHlwZW9mIFN0YXRzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgQ2hyb25vRm9yZ2VVcGdyYWRlcyA9IFtcbiAgXCJibGFzdEZ1cm5hY2VcIixcbiAgXCJyZXNzb3VyY2VSZXRyaWV2YWxcIixcbiAgXCJ0ZW1wb3JhbEFjY2VsZXJhdG9yXCIsXG4gIFwidGVtcG9yYWxCYXR0ZXJ5XCIsXG4gIFwidGVtcG9yYWxJbXBlZGFuY2VcIixcbiAgXCJ0ZW1wb3JhbFByZXNzXCIsXG4gIFwidGltZUJvaWxlclwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIENocm9ub0ZvcmdlVXBncmFkZSA9ICh0eXBlb2YgQ2hyb25vRm9yZ2VVcGdyYWRlcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IFZvaWRTcGFjZVVwZ3JhZGVzID0gW1xuICBcImNyeW9jaGFtYmVyc1wiLFxuICBcInVzZWRDcnlvY2hhbWJlcnNcIixcbiAgXCJ2b2lkSG9vdmVyXCIsXG4gIFwidm9pZFJpZnRcIixcbiAgXCJjaHJvbm9jb250cm9sXCIsXG4gIFwidm9pZFJlc29uYXRvclwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFZvaWRTcGFjZVVwZ3JhZGUgPSAodHlwZW9mIFZvaWRTcGFjZVVwZ3JhZGVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgVXBncmFkZXMgPSBbXG4gIFwiYWR2YW5jZWRBdXRvbWF0aW9uXCIsXG4gIFwiYWR2YW5jZWRSZWZpbmVtZW50XCIsXG4gIFwiYWlCYXNlc1wiLFxuICBcImFpRW5naW5lZXJzXCIsXG4gIFwiYWxsb3lBcm1vclwiLFxuICBcImFsbG95QXhlXCIsXG4gIFwiYWxsb3lCYXJuc1wiLFxuICBcImFsbG95U2F3XCIsXG4gIFwiYWxsb3lXYXJlaG91c2VzXCIsXG4gIFwiYW1CYXNlc1wiLFxuICBcImFtRHJpdmVcIixcbiAgXCJhbUZpc3Npb25cIixcbiAgXCJhbVJlYWN0b3JzXCIsXG4gIFwiYW1SZWFjdG9yc01LMlwiLFxuICBcImFzc2lzdGFuY2VcIixcbiAgXCJhc3Ryb2xhYmVcIixcbiAgXCJhc3Ryb3BoeXNpY2lzdHNcIixcbiAgXCJhdWd1bWVudGF0aW9uXCIsXG4gIFwiYXV0b21hdGVkUGxhbnRzXCIsXG4gIFwiYmFyZ2VzXCIsXG4gIFwiYmlvZnVlbFwiLFxuICBcImJvbGFzXCIsXG4gIFwiY2FkU3lzdGVtc1wiLFxuICBcImNhcmF2YW5zZXJhaVwiLFxuICBcImNhcmJvblNlcXVlc3RyYXRpb25cIixcbiAgXCJjYXJnb1NoaXBzXCIsXG4gIFwiY2VsZXN0aWFsTWVjaGFuaWNzXCIsXG4gIFwiY2hyb25vRW5naW5lZXJzXCIsXG4gIFwiY2hyb25vZm9yZ2VcIixcbiAgXCJjb2FsRnVybmFjZVwiLFxuICBcImNvbGRGdXNpb25cIixcbiAgXCJjb21idXN0aW9uRW5naW5lXCIsXG4gIFwiY29tcG9zaXRlQm93XCIsXG4gIFwiY29uY3JldGVCYXJuc1wiLFxuICBcImNvbmNyZXRlSHV0c1wiLFxuICBcImNvbmNyZXRlV2FyZWhvdXNlc1wiLFxuICBcImNyb3NzYm93XCIsXG4gIFwiY3J5b2NvbXB1dGluZ1wiLFxuICBcImRhcmtFbmVyZ3lcIixcbiAgXCJkZWVwTWluaW5nXCIsXG4gIFwiZGlzdG9yc2lvblwiLFxuICBcImVsZWN0cm9seXRpY1NtZWx0aW5nXCIsXG4gIFwiZWx1ZGl1bUNyYWNrZXJcIixcbiAgXCJlbHVkaXVtSHV0c1wiLFxuICBcImVsdWRpdW1SZWZsZWN0b3JzXCIsXG4gIFwiZW5lcmd5UmlmdHNcIixcbiAgXCJlbnJpY2hlZFRob3JpdW1cIixcbiAgXCJlbnJpY2hlZFVyYW5pdW1cIixcbiAgXCJmYWN0b3J5QXV0b21hdGlvblwiLFxuICBcImZhY3RvcnlMb2dpc3RpY3NcIixcbiAgXCJmYWN0b3J5T3B0aW1pemF0aW9uXCIsXG4gIFwiZmFjdG9yeVByb2Nlc3NpbmdcIixcbiAgXCJmYWN0b3J5Um9ib3RpY3NcIixcbiAgXCJmbHVpZGl6ZWRSZWFjdG9yc1wiLFxuICBcImZsdXhDb25kZW5zYXRvclwiLFxuICBcImZ1ZWxJbmplY3RvcnNcIixcbiAgXCJnZW9kZXN5XCIsXG4gIFwiZ21vXCIsXG4gIFwiZ29sZE9yZVwiLFxuICBcImh1YmJsZVRlbGVzY29wZVwiLFxuICBcImh1bnRpbmdBcm1vclwiLFxuICBcImh5ZHJvUGxhbnRUdXJiaW5lc1wiLFxuICBcImludGVybmV0XCIsXG4gIFwiaW52aXNpYmxlQmxhY2tIYW5kXCIsXG4gIFwiaXJvbkF4ZXNcIixcbiAgXCJpcm9uSG9lc1wiLFxuICBcImlyb253b29kXCIsXG4gIFwibGhjXCIsXG4gIFwibG9naXN0aWNzXCIsXG4gIFwibG9uZ1JhbmdlU3BhY2VzaGlwc1wiLFxuICBcIm1hY2hpbmVMZWFybmluZ1wiLFxuICBcIm1pbmVyYWxBeGVzXCIsXG4gIFwibWluZXJhbEhvZXNcIixcbiAgXCJtaW5pbmdEcmlsbFwiLFxuICBcIm1XUmVhY3RvclwiLFxuICBcIm5hbm9zdWl0c1wiLFxuICBcIm5ldXJhbE5ldHdvcmtzXCIsXG4gIFwibnVjbGVhclBsYW50c1wiLFxuICBcIm51Y2xlYXJTbWVsdGVyc1wiLFxuICBcIm9mZnNldFByZXNzXCIsXG4gIFwib2lsRGlzdGlsbGF0aW9uXCIsXG4gIFwib2lsUmVmaW5lcnlcIixcbiAgXCJvcmJpdGFsR2VvZGVzeVwiLFxuICBcIm94aWRhdGlvblwiLFxuICBcInBob3RvbGl0aG9ncmFwaHlcIixcbiAgXCJwaG90b3ZvbHRhaWNcIixcbiAgXCJwbmV1bWF0aWNQcmVzc1wiLFxuICBcInByaW50aW5nUHJlc3NcIixcbiAgXCJwdW1wamFja1wiLFxuICBcInB5cm9seXNpc1wiLFxuICBcInFkb3RcIixcbiAgXCJyYWlsZ3VuXCIsXG4gIFwicmVhY3RvclZlc3NlbFwiLFxuICBcInJlZnJpZ2VyYXRpb25cIixcbiAgXCJyZWdpc3RlclwiLFxuICBcInJlaW5mb3JjZWRCYXJuc1wiLFxuICBcInJlaW5mb3JjZWRTYXdcIixcbiAgXCJyZWluZm9yY2VkV2FyZWhvdXNlc1wiLFxuICBcInJlbGljU3RhdGlvblwiLFxuICBcInJvdGFyeUtpbG5cIixcbiAgXCJzYXRlbGxpdGVSYWRpb1wiLFxuICBcInNhdG5hdlwiLFxuICBcInNldGlcIixcbiAgXCJzaWxvc1wiLFxuICBcInNvbGFyU2F0ZWxsaXRlc1wiLFxuICBcInNwYWNlRW5naW5lZXJzXCIsXG4gIFwic3BhY2VNYW51ZmFjdHVyaW5nXCIsXG4gIFwic3BpY2VOYXZpZ2F0aW9uXCIsXG4gIFwic3RhcmxpbmtcIixcbiAgXCJzdGFzaXNDaGFtYmVyc1wiLFxuICBcInN0ZWVsQXJtb3JcIixcbiAgXCJzdGVlbEF4ZVwiLFxuICBcInN0ZWVsUGxhbnRzXCIsXG4gIFwic3RlZWxTYXdcIixcbiAgXCJzdG9uZUJhcm5zXCIsXG4gIFwic3RvcmFnZUJ1bmtlcnNcIixcbiAgXCJzdHJlbmdodGVuQnVpbGRcIixcbiAgXCJ0YWNoeW9uQWNjZWxlcmF0b3JzXCIsXG4gIFwidGhpbkZpbG1cIixcbiAgXCJ0aG9yaXVtRW5naW5lXCIsXG4gIFwidGhvcml1bVJlYWN0b3JzXCIsXG4gIFwidGl0YW5pdW1BeGVcIixcbiAgXCJ0aXRhbml1bUJhcm5zXCIsXG4gIFwidGl0YW5pdW1NaXJyb3JzXCIsXG4gIFwidGl0YW5pdW1TYXdcIixcbiAgXCJ0aXRhbml1bVdhcmVob3VzZXNcIixcbiAgXCJ0dXJuU21vb3RobHlcIixcbiAgXCJ1bmljb3JuU2VsZWN0aW9uXCIsXG4gIFwidW5vYnRhaW5pdW1BeGVcIixcbiAgXCJ1bm9idGFpbml1bURyaWxsXCIsXG4gIFwidW5vYnRhaW5pdW1IdXRzXCIsXG4gIFwidW5vYnRhaW5pdW1SZWZsZWN0b3JzXCIsXG4gIFwidW5vYnRhaW5pdW1TYXdcIixcbiAgXCJ1cGxpbmtcIixcbiAgXCJ2b2lkQXNwaXJhdGlvblwiLFxuICBcInZvaWRFbmVyZ3lcIixcbiAgXCJ2b2lkUmVhY3RvcnNcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBVcGdyYWRlID0gKHR5cGVvZiBVcGdyYWRlcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IFplYnJhVXBncmFkZXMgPSBbXG4gIFwiYmxvb2RzdG9uZUluc3RpdHV0ZVwiLFxuICBcImRhcmtCcmV3XCIsXG4gIFwiZGFya1Jldm9sdXRpb25cIixcbiAgXCJtaW5lcm9sb2d5RGVwYXJ0bWVudFwiLFxuICBcIndoaXNwZXJzXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgWmVicmFVcGdyYWRlID0gKHR5cGVvZiBaZWJyYVVwZ3JhZGVzKVtudW1iZXJdO1xuXG5leHBvcnQgZW51bSBUaW1lSXRlbVZhcmlhbnQge1xuICBDaHJvbm9mb3JnZSA9IFwiY2hyb25vXCIsXG4gIFZvaWRTcGFjZSA9IFwidm9pZFwiLFxufVxuXG5leHBvcnQgdHlwZSBGYWl0aEl0ZW0gPSBFeGNsdWRlPFJlbGlnaW9uSXRlbSwgVW5pY29ybkl0ZW0+O1xuXG5leHBvcnQgY29uc3QgVW5pY29ybkl0ZW1zID0gW1xuICBcIml2b3J5Q2l0YWRlbFwiLFxuICBcIml2b3J5VG93ZXJcIixcbiAgXCJza3lQYWxhY2VcIixcbiAgXCJzdW5zcGlyZVwiLFxuICBcInVuaWNvcm5QYXN0dXJlXCIsXG4gIFwidW5pY29yblRvbWJcIixcbiAgXCJ1bmljb3JuVXRvcGlhXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgVW5pY29ybkl0ZW0gPSAodHlwZW9mIFVuaWNvcm5JdGVtcylbbnVtYmVyXTtcblxuZXhwb3J0IHR5cGUgUmVsaWdpb25JdGVtID0gUmVsaWdpb25VcGdyYWRlIHwgVHJhbnNjZW5kZW5jZVVwZ3JhZGUgfCBaaWdndXJhdFVwZ3JhZGU7XG5leHBvcnQgdHlwZSBSZWxpZ2lvbkFkZGl0aW9uSXRlbSA9IFwiYWRvcmVcIiB8IFwiYXV0b1ByYWlzZVwiIHwgXCJiZXN0VW5pY29ybkJ1aWxkaW5nXCIgfCBcInRyYW5zY2VuZFwiO1xuXG5leHBvcnQgY29uc3QgUmVsaWdpb25PcHRpb25zID0gW1xuICBcInNhY3JpZmljZVVuaWNvcm5zXCIsXG4gIFwic2FjcmlmaWNlQWxpY29ybnNcIixcbiAgXCJyZWZpbmVUZWFyc1wiLFxuICBcInJlZmluZVRpbWVDcnlzdGFsc1wiLFxuICBcInRyYW5zY2VuZFwiLFxuICBcImFkb3JlXCIsXG4gIFwiYXV0b1ByYWlzZVwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFJlbGlnaW9uT3B0aW9uID0gKHR5cGVvZiBSZWxpZ2lvbk9wdGlvbnMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBCaW9tZXMgPSBbXG4gIFwiYmxvb2REZXNlcnRcIixcbiAgXCJib25lRm9yZXN0XCIsXG4gIFwiZGVzZXJ0XCIsXG4gIFwiZm9yZXN0XCIsXG4gIFwiaGlsbHNcIixcbiAgXCJtb3VudGFpblwiLFxuICBcInBsYWluc1wiLFxuICBcInJhaW5Gb3Jlc3RcIixcbiAgXCJzd2FtcFwiLFxuICBcInZpbGxhZ2VcIixcbiAgXCJ2b2xjYW5vXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQmlvbWUgPSAodHlwZW9mIEJpb21lcylbbnVtYmVyXTtcblxuZXhwb3J0IHR5cGUgVW5sb2NrcyA9IHtcbiAgYnVpbGRpbmdzOiBBcnJheTxCdWlsZGluZz47XG4gIGNoYWxsZW5nZXM6IEFycmF5PENoYWxsZW5nZT47XG4gIGNocm9ub2ZvcmdlOiBBcnJheTxDaHJvbm9Gb3JnZVVwZ3JhZGU+O1xuICBjcmFmdHM6IEFycmF5PFJlc291cmNlQ3JhZnRhYmxlPjtcbiAgam9iczogQXJyYXk8Sm9iPjtcbiAgcG9saWNpZXM6IEFycmF5PFBvbGljeT47XG4gIHN0YWdlczogQXJyYXk8U3RhZ2VkQnVpbGRpbmc+O1xuICB0YWJzOiBBcnJheTxUYWJJZD47XG4gIHRlY2g6IEFycmF5PFRlY2hub2xvZ3k+O1xuICB1cGdyYWRlczogQXJyYXk8VXBncmFkZT47XG4gIHZvaWRTcGFjZTogQXJyYXk8Vm9pZFNwYWNlVXBncmFkZT47XG4gIHplYnJhVXBncmFkZXM6IEFycmF5PHVua25vd24+O1xufTtcblxuZXhwb3J0IGNvbnN0IFBlcmtzID0gW1xuICBcImFkanVzdG1lbnRCdXJlYXVcIixcbiAgXCJhbmFjaHJvbm9tYW5jeVwiLFxuICBcImFzY29oXCIsXG4gIFwiYXN0cm9tYW5jeVwiLFxuICBcImJpbmFoXCIsXG4gIFwiYmxhY2tDb2RleFwiLFxuICBcImNhcm5pdmFsc1wiLFxuICBcImNoZXNlZFwiLFxuICBcImNob2tobWFoXCIsXG4gIFwiY2hyb25vbWFuY3lcIixcbiAgXCJjb2RleEFncnVtXCIsXG4gIFwiY29kZXhMZXZpYXRoYW5pYW51c1wiLFxuICBcImNvZGV4TG9nb3NcIixcbiAgXCJjb2RleFZveFwiLFxuICBcImRpcGxvbWFjeVwiLFxuICBcImRpdmluZVByb3BvcnRpb25cIixcbiAgXCJlbmdlbmVlcmluZ1wiLFxuICBcImdldnVyYWhcIixcbiAgXCJnb2xkZW5SYXRpb1wiLFxuICBcImhvZFwiLFxuICBcImtldGVyXCIsXG4gIFwibWFsa3V0aFwiLFxuICBcIm1lZ2Fsb21hbmlhXCIsXG4gIFwibmF2aWdhdGlvbkRpcGxvbWFjeVwiLFxuICBcIm5ldHphY2hcIixcbiAgXCJudW1lcm9sb2d5XCIsXG4gIFwibnVtZXJvbWFuY3lcIixcbiAgXCJwYXdnYW5cIixcbiAgXCJyZW5haXNzYW5jZVwiLFxuICBcInRpZmVyZXRcIixcbiAgXCJ1bmljb3JubWFuY3lcIixcbiAgXCJ2aXRydXZpYW5GZWxpbmVcIixcbiAgXCJ2b2lkT3JkZXJcIixcbiAgXCJ3aWxsZW5mbHVmZlwiLFxuICBcInllc29kXCIsXG4gIFwiemVicmFDb3ZlbmFudFwiLFxuICBcInplYnJhRGlwbG9tYWN5XCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUGVyayA9ICh0eXBlb2YgUGVya3MpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBDb2xvclNjaGVtZXMgPSBbXG4gIFwiYW50aHJhY2l0ZVwiLFxuICBcImFyY3RpY1wiLFxuICBcImJsYWNrXCIsXG4gIFwiYmx1aXNoXCIsXG4gIFwiY2F0bmlwXCIsXG4gIFwiY2hvY29sYXRlXCIsXG4gIFwiY29tcHV0ZXJcIixcbiAgXCJjeWJlclwiLFxuICBcImRhcmtcIixcbiAgXCJkZWZhdWx0XCIsXG4gIFwiZHVuZVwiLFxuICBcImZhY3RvcnlcIixcbiAgXCJmbHVpZFwiLFxuICBcImdvbGRcIixcbiAgXCJncmFzc3lcIixcbiAgXCJncmF5aXNoXCIsXG4gIFwiZ3JlZW5pc2hcIixcbiAgXCJtaW5pbWFsaXN0XCIsXG4gIFwib2lsXCIsXG4gIFwic2Nob29sXCIsXG4gIFwic2xlZWtcIixcbiAgXCJzcGFjZVwiLFxuICBcInNwb29reVwiLFxuICBcInRvbWJzdG9uZVwiLFxuICBcInVuaWNvcm5cIixcbiAgXCJ2ZXNzZWxcIixcbiAgXCJ2aW50YWdlXCIsXG4gIFwid29vZFwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIENvbG9yU2NoZW1lID0gKHR5cGVvZiBDb2xvclNjaGVtZXMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBMb2NhbGVzID0gW1xuICBcImJlXCIsXG4gIFwiYnJcIixcbiAgXCJjelwiLFxuICBcImRlXCIsXG4gIFwiZW5cIixcbiAgXCJlc1wiLFxuICBcImVzbFwiLFxuICBcImZyXCIsXG4gIFwiaXRcIixcbiAgXCJqYVwiLFxuICBcImtvXCIsXG4gIFwicGxcIixcbiAgXCJydVwiLFxuICBcInVrXCIsXG4gIFwiemhcIixcbiAgXCJ6aHRcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBMb2NhbGUgPSAodHlwZW9mIExvY2FsZXMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBOb3RhdGlvbnMgPSBbXCJzaVwiLCBcImVcIiwgXCJzaWVcIl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBOb3RhdGlvbiA9ICh0eXBlb2YgTm90YXRpb25zKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBDeWNsZUVmZmVjdHMgPSB7XG4gIFwiY3J5b3N0YXRpb24tY29hbE1heFwiOiBudW1iZXI7XG4gIFwiY3J5b3N0YXRpb24taXJvbk1heFwiOiBudW1iZXI7XG4gIFwiY3J5b3N0YXRpb24tbWluZXJhbHNNYXhcIjogbnVtYmVyO1xuICBcImNyeW9zdGF0aW9uLW9pbE1heFwiOiBudW1iZXI7XG4gIFwiY3J5b3N0YXRpb24tdGl0YW5pdW1NYXhcIjogbnVtYmVyO1xuICBcImNyeW9zdGF0aW9uLXVub2J0YWluaXVtTWF4XCI6IG51bWJlcjtcbiAgXCJjcnlvc3RhdGlvbi11cmFuaXVtTWF4XCI6IG51bWJlcjtcbiAgXCJjcnlvc3RhdGlvbi13b29kTWF4XCI6IG51bWJlcjtcbiAgXCJlbnRhbmdsZXItZ2Zsb3BzQ29uc3VtcHRpb25cIjogbnVtYmVyO1xuICBcImhySGFydmVzdGVyLWVuZXJneVByb2R1Y3Rpb25cIjogbnVtYmVyO1xuICBcImh5ZHJvZnJhY3R1cmVyLW9pbFBlclRpY2tBdXRvcHJvZFNwYWNlXCI6IG51bWJlcjtcbiAgXCJoeWRyb3Bvbmljcy1jYXRuaXBSYXRpb1wiOiBudW1iZXI7XG4gIFwibW9vbk91dHBvc3QtdW5vYnRhaW5pdW1QZXJUaWNrU3BhY2VcIjogbnVtYmVyO1xuICBcInBsYW5ldENyYWNrZXItdXJhbml1bVBlclRpY2tTcGFjZVwiOiBudW1iZXI7XG4gIFwicmVzZWFyY2hWZXNzZWwtc3RhcmNoYXJ0UGVyVGlja0Jhc2VTcGFjZVwiOiBudW1iZXI7XG4gIFwic2F0dGVsaXRlLW9ic2VydmF0b3J5UmF0aW9cIjogbnVtYmVyO1xuICBcInNhdHRlbGl0ZS1zdGFyY2hhcnRQZXJUaWNrQmFzZVNwYWNlXCI6IG51bWJlcjtcbiAgXCJzcGFjZUJlYWNvbi1zdGFyY2hhcnRQZXJUaWNrQmFzZVNwYWNlXCI6IG51bWJlcjtcbiAgXCJzcGFjZUVsZXZhdG9yLXByb2RUcmFuc2ZlckJvbnVzXCI6IG51bWJlcjtcbiAgXCJzcGFjZVN0YXRpb24tc2NpZW5jZVJhdGlvXCI6IG51bWJlcjtcbiAgXCJzdW5saWZ0ZXItZW5lcmd5UHJvZHVjdGlvblwiOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBGZXN0aXZhbEVmZmVjdHMgPSB7XG4gIGNhdG5pcDogbnVtYmVyO1xuICBjb2FsOiBudW1iZXI7XG4gIGN1bHR1cmU6IG51bWJlcjtcbiAgZmFpdGg6IG51bWJlcjtcbiAgZ29sZDogbnVtYmVyO1xuICBpcm9uOiBudW1iZXI7XG4gIG1hbnBvd2VyOiBudW1iZXI7XG4gIG1pbmVyYWxzOiBudW1iZXI7XG4gIG9pbDogbnVtYmVyO1xuICBzY2llbmNlOiBudW1iZXI7XG4gIHN0YXJjaGFydDogbnVtYmVyO1xuICB0aXRhbml1bTogbnVtYmVyO1xuICB1bmljb3JuczogbnVtYmVyO1xuICB1bm9idGFpbml1bTogbnVtYmVyO1xuICB1cmFuaXVtOiBudW1iZXI7XG4gIHdvb2Q6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFVubG9ja1R5cGVNYXAgPSB7XG4gIGJpb21lczogVW5zYWZlQmlvbWU7XG4gIGJ1aWxkaW5nczogVW5zYWZlQnVpbGRpbmc7XG4gIGNoYWxsZW5nZXM6IFVuc2FmZUNoYWxsZW5nZTtcbiAgY2hyb25vZm9yZ2U6IFVuc2FmZUNocm9ub0ZvcmdlVXBncmFkZTtcbiAgY3JhZnRzOiBVbnNhZmVDcmFmdDtcbiAgam9iczogVW5zYWZlSm9iO1xuICBwYWN0czogVW5zYWZlUGFjdDtcbiAgcGVya3M6IFVuc2FmZVBlcms7XG4gIHBsYW5ldDogVW5zYWZlUGxhbmV0O1xuICBwb2xpY2llczogVW5zYWZlUG9saWN5O1xuICByZWxpZ2lvbjogVW5zYWZlUmVsaWdpb25VcGdyYWRlO1xuICBzY2hlbWVzOiB1bmtub3duO1xuICBzcGFjZUJ1aWxkaW5nOiBVbnNhZmVTcGFjZUJ1aWxkaW5nO1xuICBzcGFjZU1pc3Npb246IFVuc2FmZVBsYW5ldDtcbiAgc3RhZ2VzOiBVbnNhZmVCdWlsZGluZztcbiAgdGFiczogVGFiO1xuICB0ZWNoOiBVbnNhZmVUZWNoO1xuICB0cmFuc2NlbmRlbmNlVXBncmFkZXM6IFVuc2FmZVRyYW5zY2VuZGVuY2VVcGdyYWRlO1xuICB1cGdyYWRlczogVW5zYWZlVXBncmFkZTtcbiAgdm9pZFNwYWNlOiBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlO1xuICB6ZWJyYVVwZ3JhZGVzOiBVbnNhZmVVcGdyYWRlO1xuICB6aWdndXJhdFVwZ3JhZGVzOiBVbnNhZmVaaWdndXJhdFVwZ3JhZGU7XG59O1xuZXhwb3J0IHR5cGUgVW5sb2NrID0ga2V5b2YgVW5sb2NrVHlwZU1hcDtcblxuLyoqXG4gKiBBIGNvbWJpbmF0aW9uIG9mIGEgcmVzb3VyY2UgYW5kIGFuIGFtb3VudC5cbiAqL1xuZXhwb3J0IHR5cGUgUHJpY2UgPSB7IG5hbWU6IFJlc291cmNlOyB2YWw6IG51bWJlciB9O1xuXG5leHBvcnQgY29uc3QgQ2hhbGxlbmdlcyA9IFtcbiAgXCIxMDAwWWVhcnNcIixcbiAgXCJhbmFyY2h5XCIsXG4gIFwiYXRoZWlzbVwiLFxuICBcImVuZXJneVwiLFxuICBcImlyb25XaWxsXCIsXG4gIFwicGFjaWZpc21cIixcbiAgXCJwb3N0QXBvY2FseXBzZVwiLFxuICBcIndpbnRlcklzQ29taW5nXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQ2hhbGxlbmdlID0gKHR5cGVvZiBDaGFsbGVuZ2VzKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBMaW5rID0ge1xuICB2aXNpYmxlOiBib29sZWFuO1xuICB0aXRsZTogc3RyaW5nO1xuICB0b29sdGlwOiBzdHJpbmc7XG4gIGdldERpc3BsYXlWYWx1ZUV4dDogKCkgPT4gc3RyaW5nO1xuICBoYW5kbGVyOiAoZXZlbnQ6IEV2ZW50LCBjYWxsYmFjazogKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHZvaWQpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBDbGFzc0xpc3QgPSB7XG4gIEJ1aWxkaW5nTWV0YTogQnVpbGRpbmdNZXRhO1xuICBkaXBsb21hY3k6IHtcbiAgICB1aToge1xuICAgICAgYXV0b1Bpbm5lZEJ1dHRvbkNvbnRyb2xsZXI6IEF1dG9QaW5uZWRCdXR0b25Db250cm9sbGVyO1xuICAgICAgYXV0b1Bpbm5lZEJ1dHRvbjogQXV0b1Bpbm5lZEJ1dHRvbjtcbiAgICAgIEVsZGVyc1BhbmVsOiBFbGRlcnNQYW5lbDtcbiAgICAgIEVtYmFzc3lCdXR0b25Db250cm9sbGVyOiBFbWJhc3N5QnV0dG9uQ29udHJvbGxlcjtcbiAgICAgIEVtYmFzc3lCdXR0b246IEVtYmFzc3lCdXR0b247XG4gICAgICBSYWNlUGFuZWw6IFJhY2VQYW5lbDtcbiAgICB9O1xuICB9O1xuICBnYW1lOiB7XG4gICAgU2VydmVyOiBTZXJ2ZXI7XG4gICAgVGVsZW1ldHJ5OiBUZWxlbWV0cnk7XG4gICAgVGltZXI6IFRpbWVyO1xuICAgIHVpOiB7XG4gICAgICBHYXRoZXJDYXRuaXBCdXR0b25Db250cm9sbGVyOiBHYXRoZXJDYXRuaXBCdXR0b25Db250cm9sbGVyO1xuICAgICAgUmVmaW5lQ2F0bmlwQnV0dG9uOiBSZWZpbmVDYXRuaXBCdXR0b247XG4gICAgICBSZWZpbmVDYXRuaXBCdXR0b25Db250cm9sbGVyOiBSZWZpbmVDYXRuaXBCdXR0b25Db250cm9sbGVyO1xuICAgIH07XG4gICAgVW5kb0NoYW5nZTogVW5kb0NoYW5nZTtcbiAgfTtcbiAgS0dDb25maWc6IEtHQ29uZmlnO1xuICBtYW5hZ2Vyczoge1xuICAgIEFjaGlldmVtZW50czogQWNoaWV2ZW1lbnRzO1xuICAgIEJ1aWxkaW5nc01hbmFnZXI6IEJ1aWxkaW5nc01hbmFnZXI7XG4gICAgQ2hhbGxlbmdlc01hbmFnZXI6IENoYWxsZW5nZXNNYW5hZ2VyO1xuICAgIERpcGxvbWFjeU1hbmFnZXI6IERpcGxvbWFjeU1hbmFnZXI7XG4gICAgUHJlc3RpZ2VNYW5hZ2VyOiBQcmVzdGlnZU1hbmFnZXI7XG4gICAgUmVsaWdpb25NYW5hZ2VyOiBSZWxpZ2lvbk1hbmFnZXI7XG4gICAgUmVzb3VyY2VNYW5hZ2VyOiBSZXNvdXJjZU1hbmFnZXI7XG4gICAgU2NpZW5jZU1hbmFnZXI6IFNjaWVuY2VNYW5hZ2VyO1xuICAgIFNwYWNlTWFuYWdlcjogU3BhY2VNYW5hZ2VyO1xuICAgIFN0YXRzTWFuYWdlcjogU3RhdHNNYW5hZ2VyO1xuICAgIFRpbWVNYW5hZ2VyOiBUaW1lTWFuYWdlcjtcbiAgICBWaWxsYWdlTWFuYWdlcjogVmlsbGFnZU1hbmFnZXI7XG4gICAgVm9pZE1hbmFnZXI6IFZvaWRNYW5hZ2VyO1xuICAgIFdvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyO1xuICB9O1xuICBNZXRhZGF0YTogTWV0YWRhdGE7XG4gIHF1ZXVlOiB7XG4gICAgbWFuYWdlcjogTWFuYWdlcjtcbiAgfTtcbiAgcmVsaWdpb246IHtcbiAgICBwYWN0c01hbmFnZXI6IFBhY3RzTWFuYWdlcjtcbiAgfTtcbiAgcmVzZXJ2ZU1hbjogUmVzZXJ2ZU1hbjtcbiAgdGFiOiB7XG4gICAgQ2hhbGxlbmdlc1RhYjogQ2hhbGxlbmdlc1RhYjtcbiAgICBRdWV1ZVRhYjogUXVldWVUYWI7XG4gICAgU3RhdHNUYWI6IFN0YXRzVGFiO1xuICAgIFRpbWVUYWI6IFRpbWVUYWI7XG4gIH07XG4gIHRyYWRlOiB7XG4gICAgdWk6IHtcbiAgICAgIFNlbmRFeHBsb3JlcnNCdXR0b25Db250cm9sbGVyOiBTZW5kRXhwbG9yZXJzQnV0dG9uQ29udHJvbGxlcjtcbiAgICAgIFNlbmRFeHBsb3JlcnNCdXR0b246IFNlbmRFeHBsb3JlcnNCdXR0b247XG4gICAgfTtcbiAgfTtcbiAgdWk6IHtcbiAgICBBY2hpZXZlbWVudHNQYW5lbDogQWNoaWV2ZW1lbnRzUGFuZWw7XG4gICAgQmFkZ2VzUGFuZWw6IEJhZGdlc1BhbmVsO1xuICAgIGJ0bjoge1xuICAgICAgQnVpbGRpbmdCdG5Nb2Rlcm5Db250cm9sbGVyOiBCdWlsZGluZ0J0bk1vZGVybkNvbnRyb2xsZXI7XG4gICAgICBTdGFnaW5nQmxkQnRuQ29udHJvbGxlcjogU3RhZ2luZ0JsZEJ0bkNvbnRyb2xsZXI7XG4gICAgICBTdGFnaW5nQmxkQnRuOiBTdGFnaW5nQmxkQnRuO1xuICAgIH07XG4gICAgQnVpbGRpbmdCdG5Db250cm9sbGVyOiBCdWlsZGluZ0J0bkNvbnRyb2xsZXI7XG4gICAgQnVyblBhcmFnb25CdG5Db250cm9sbGVyOiBCdXJuUGFyYWdvbkJ0bkNvbnRyb2xsZXI7XG4gICAgQnV0dG9uQ29udHJvbGxlcjogQnV0dG9uQ29udHJvbGxlcjtcbiAgICBCdXR0b25Nb2Rlcm5Db250cm9sbGVyOiBCdXR0b25Nb2Rlcm5Db250cm9sbGVyO1xuICAgIEJ1aWxkaW5nU3RhY2thYmxlQnRuQ29udHJvbGxlcjogQnVpbGRpbmdTdGFja2FibGVCdG5Db250cm9sbGVyO1xuICAgIENoYWxsZW5nZUJ0bkNvbnRyb2xsZXI6IENoYWxsZW5nZUJ0bkNvbnRyb2xsZXI7XG4gICAgQ2hhbGxlbmdlRWZmZWN0c1BhbmVsOiBDaGFsbGVuZ2VFZmZlY3RzUGFuZWw7XG4gICAgQ2hhbGxlbmdlUGFuZWw6IENoYWxsZW5nZVBhbmVsO1xuICAgIENocm9ub2ZvcmdlV2d0OiBDaHJvbm9mb3JnZVdndDtcbiAgICBDcnlwdG90aGVvbG9neVBhbmVsOiBDcnlwdG90aGVvbG9neVBhbmVsO1xuICAgIENyeXB0b3RoZW9sb2d5V0dUOiBDcnlwdG90aGVvbG9neVdHVDtcbiAgICBEZXNrdG9wVUk6IERlc2t0b3BVSTtcbiAgICBQYWN0c1BhbmVsOiBQYWN0c1BhbmVsO1xuICAgIFBhY3RzV0dUOiBQYWN0c1dHVDtcbiAgICBQb2xpY3lCdG5Db250cm9sbGVyOiBQb2xpY3lCdG5Db250cm9sbGVyO1xuICAgIFBvbGljeVBhbmVsOiBQb2xpY3lQYW5lbDtcbiAgICBQcmVzdGlnZUJ0bkNvbnRyb2xsZXI6IFByZXN0aWdlQnRuQ29udHJvbGxlcjtcbiAgICBQcmVzdGlnZVBhbmVsOiBQcmVzdGlnZVBhbmVsO1xuICAgIFJvcnNoYWNoV2d0OiBSb3JzaGFjaFdndDtcbiAgICByZWxpZ2lvbjoge1xuICAgICAgTXVsdGlMaW5rQnRuOiBNdWx0aUxpbmtCdG48QWxsTXVsdGlMaW5rQnRuT3B0aW9ucz47XG4gICAgICBSZWZpbmVCdG46IFJlZmluZUJ0bjtcbiAgICAgIFJlZmluZVRlYXJzQnRuQ29udHJvbGxlcjogUmVmaW5lVGVhcnNCdG5Db250cm9sbGVyO1xuICAgICAgVHJhbnNmb3JtQnRuQ29udHJvbGxlcjogVHJhbnNmb3JtQnRuQ29udHJvbGxlcjtcbiAgICB9O1xuICAgIFJlc2VydmVzUGFuZWw6IFJlc2VydmVzUGFuZWw7XG4gICAgUmVzZXRXZ3Q6IFJlc2V0V2d0O1xuICAgIHNwYWNlOiB7XG4gICAgICBGdXJ0aGVzdFJpbmdQYW5lbDogRnVydGhlc3RSaW5nUGFuZWw7XG4gICAgICBQbGFuZXRCdWlsZGluZ0J0bkNvbnRyb2xsZXI6IFBsYW5ldEJ1aWxkaW5nQnRuQ29udHJvbGxlcjtcbiAgICAgIFBsYW5ldFBhbmVsOiBQbGFuZXRQYW5lbDtcbiAgICB9O1xuICAgIHRpbWU6IHtcbiAgICAgIEFjY2VsZXJhdGVUaW1lQnRuOiBBY2NlbGVyYXRlVGltZUJ0bjtcbiAgICAgIEFjY2VsZXJhdGVUaW1lQnRuQ29udHJvbGxlcjogQWNjZWxlcmF0ZVRpbWVCdG5Db250cm9sbGVyO1xuICAgICAgQ2hyb25vZm9yZ2VCdG5Db250cm9sbGVyOiBDaHJvbm9mb3JnZUJ0bkNvbnRyb2xsZXI7XG4gICAgICBGaXhDcnlvY2hhbWJlckJ0bkNvbnRyb2xsZXI6IEZpeENyeW9jaGFtYmVyQnRuQ29udHJvbGxlcjtcbiAgICAgIFNoYXR0ZXJUQ0J0bjogU2hhdHRlclRDQnRuO1xuICAgICAgU2hhdHRlclRDQnRuQ29udHJvbGxlcjogU2hhdHRlclRDQnRuQ29udHJvbGxlcjtcbiAgICAgIFZvaWRTcGFjZUJ0bkNvbnRyb2xsZXI6IFZvaWRTcGFjZUJ0bkNvbnRyb2xsZXI7XG4gICAgfTtcbiAgICBUaW1lQ29udHJvbFdndDogVGltZUNvbnRyb2xXZ3Q7XG4gICAgdG9vbGJhcjoge1xuICAgICAgVG9vbGJhckVuZXJneTogVG9vbGJhckVuZXJneTtcbiAgICAgIFRvb2xiYXJIYXBwaW5lc3M6IFRvb2xiYXJIYXBwaW5lc3M7XG4gICAgICBUb29sYmFyTU9URDogVG9vbGJhck1PVEQ7XG4gICAgfTtcbiAgICBUb29sYmFyOiBUb29sYmFyO1xuICAgIFRvb2xiYXJJY29uOiBUb29sYmFySWNvbjtcbiAgICBUcmFuc2NlbmRlbmNlQnRuQ29udHJvbGxlcjogVHJhbnNjZW5kZW5jZUJ0bkNvbnRyb2xsZXI7XG4gICAgdHVybkhHT2ZmQnV0dG9uQ29udHJvbGxlcjogVHVybkhHT2ZmQnV0dG9uQ29udHJvbGxlcjtcbiAgICBVSVN5c3RlbTogVUlTeXN0ZW07XG4gICAgdmlsbGFnZToge1xuICAgICAgQmlvbWVCdG46IEJpb21lQnRuO1xuICAgICAgQmlvbWVCdG5Db250cm9sbGVyOiBCaW9tZUJ0bkNvbnRyb2xsZXI7XG4gICAgICBDZW5zdXM6IENlbnN1cztcbiAgICB9O1xuICAgIFZvaWRTcGFjZVdndDogVm9pZFNwYWNlV2d0O1xuICB9O1xuICB2aWxsYWdlOiB7XG4gICAgS2l0dGVuU2ltOiBLaXR0ZW5TaW07XG4gICAgTG9hZG91dENvbnRyb2xsZXI6IExvYWRvdXRDb250cm9sbGVyO1xuICAgIHVpOiB7XG4gICAgICBGZXN0aXZhbEJ1dHRvbjogRmVzdGl2YWxCdXR0b247XG4gICAgICBGZXN0aXZhbEJ1dHRvbkNvbnRyb2xsZXI6IEZlc3RpdmFsQnV0dG9uQ29udHJvbGxlcjtcbiAgICAgIG1hcDoge1xuICAgICAgICBVcGdyYWRlRXhwbG9yZXJzQ29udHJvbGxlcjogVXBncmFkZUV4cGxvcmVyc0NvbnRyb2xsZXI7XG4gICAgICAgIFVwZ3JhZGVIUUNvbnRyb2xsZXI6IFVwZ3JhZGVIUUNvbnRyb2xsZXI7XG4gICAgICB9O1xuICAgICAgTWFwT3ZlcnZpZXdXZ3Q6IE1hcE92ZXJ2aWV3V2d0O1xuICAgICAgVmlsbGFnZUJ1dHRvbkNvbnRyb2xsZXI6IFZpbGxhZ2VCdXR0b25Db250cm9sbGVyO1xuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBDb21JbnRlcmZhY2UgPSB7XG4gIG51Y2xlYXJ1bmljb3JuOiB7XG4gICAgY29yZToge1xuICAgICAgQ29udHJvbDogQ29udHJvbDtcbiAgICAgIFRhYk1hbmFnZXI6IFRhYk1hbmFnZXI7XG4gICAgfTtcbiAgICBnYW1lOiB7XG4gICAgICBDYWxlbmRhcjogQ2FsZW5kYXI7XG4gICAgICBjYWxlbmRhcjoge1xuICAgICAgICBFdmVudDogRXZlbnQ7XG4gICAgICB9O1xuICAgICAgRWZmZWN0c01hbmFnZXI6IEVmZmVjdHNNYW5hZ2VyO1xuICAgICAgbG9nOiB7XG4gICAgICAgIENvbnNvbGU6IENvbnNvbGU7XG4gICAgICB9O1xuICAgICAgTWF0aDogS0dNYXRoO1xuICAgICAgdWk6IHtcbiAgICAgICAgQnVpbGRpbmdCdG46IEJ1aWxkaW5nQnRuPEFsbEJ1aWxkaW5nQnRuT3B0aW9ucz47XG4gICAgICAgIEJ1aWxkaW5nQnRuQ29udHJvbGxlcjogQnVpbGRpbmdCdG5Db250cm9sbGVyO1xuICAgICAgICBCdWlsZGluZ05vdFN0YWNrYWJsZUJ0bkNvbnRyb2xsZXI6IEJ1aWxkaW5nTm90U3RhY2thYmxlQnRuQ29udHJvbGxlcjtcbiAgICAgICAgQnVpbGRpbmdSZXNlYXJjaEJ0bjogQnVpbGRpbmdSZXNlYXJjaEJ0bjxBbGxCdWlsZGluZ1Jlc2VhcmNoQnRuT3B0aW9ucz47XG4gICAgICAgIEJ1aWxkaW5nU3RhY2thYmxlQnRuOiBCdWlsZGluZ1N0YWNrYWJsZUJ0bjxBbGxCdWlsZGluZ1N0YWNrYWJsZUJ0bk9wdGlvbnM+O1xuICAgICAgICBCdWlsZGluZ1N0YWNrYWJsZUJ0bkNvbnRyb2xsZXI6IEJ1aWxkaW5nU3RhY2thYmxlQnRuQ29udHJvbGxlcjtcbiAgICAgICAgQnV0dG9uOiBCdXR0b248QWxsQnV0dG9uT3B0aW9ucz47XG4gICAgICAgIEJ1dHRvbkNvbnRyb2xsZXI6IEJ1dHRvbkNvbnRyb2xsZXI7XG4gICAgICAgIEJ1dHRvbk1vZGVybjogQnV0dG9uTW9kZXJuPEFsbEJ1dHRvbk1vZGVybk9wdGlvbnM+O1xuICAgICAgICBCdXR0b25Nb2Rlcm5Db250cm9sbGVyOiBCdXR0b25Nb2Rlcm5Db250cm9sbGVyO1xuICAgICAgICBDZW5zdXNQYW5lbDogQ2Vuc3VzUGFuZWw7XG4gICAgICAgIENvbnRlbnRSb3dSZW5kZXJlcjogQ29udGVudFJvd1JlbmRlcmVyO1xuICAgICAgICBDcmFmdEJ1dHRvbjogQ3JhZnRCdXR0b247XG4gICAgICAgIENyYWZ0QnV0dG9uQ29udHJvbGxlcjogQ3JhZnRCdXR0b25Db250cm9sbGVyO1xuICAgICAgICBDcmFzaEJjb2luQnV0dG9uQ29udHJvbGxlcjogQ3Jhc2hCY29pbkJ1dHRvbkNvbnRyb2xsZXI7XG4gICAgICAgIEdhbWVQYWdlOiBHYW1lUGFnZTtcbiAgICAgICAgSm9iQnV0dG9uOiBKb2JCdXR0b247XG4gICAgICAgIEpvYkJ1dHRvbkNvbnRyb2xsZXI6IEpvYkJ1dHRvbkNvbnRyb2xsZXI7XG4gICAgICAgIExvYWRvdXRCdXR0b246IExvYWRvdXRCdXR0b247XG4gICAgICAgIExvYWRvdXRCdXR0b25Db250cm9sbGVyOiBMb2Fkb3V0QnV0dG9uQ29udHJvbGxlcjtcbiAgICAgICAgUGFjdHNCdG5Db250cm9sbGVyOiBQYWN0c0J0bkNvbnRyb2xsZXI7XG4gICAgICAgIFBhbmVsOiBQYW5lbDtcbiAgICAgICAgUHJhaXNlQnRuQ29udHJvbGxlcjogUHJhaXNlQnRuQ29udHJvbGxlcjtcbiAgICAgICAgUmVsaWdpb25CdG5Db250cm9sbGVyOiBSZWxpZ2lvbkJ0bkNvbnRyb2xsZXI7XG4gICAgICAgIFJlc2V0RmFpdGhCdG5Db250cm9sbGVyOiBSZXNldEZhaXRoQnRuQ29udHJvbGxlcjtcbiAgICAgICAgU3BhY2VQcm9ncmFtQnRuQ29udHJvbGxlcjogU3BhY2VQcm9ncmFtQnRuQ29udHJvbGxlcjxVbnNhZmVCdWlsZGluZ0J0bk1vZGVsPjtcbiAgICAgICAgU3BhY2VyOiBTcGFjZXI7XG4gICAgICAgIHRhYjogVGFiICYge1xuICAgICAgICAgIEFjaFRhYjogQWNoVGFiO1xuICAgICAgICAgIEJ1aWxkaW5nc01vZGVybjogQnVpbGRpbmdzTW9kZXJuO1xuICAgICAgICAgIERpcGxvbWFjeTogRGlwbG9tYWN5O1xuICAgICAgICAgIExpYnJhcnk6IExpYnJhcnk7XG4gICAgICAgICAgUmVsaWdpb25UYWI6IFJlbGlnaW9uVGFiO1xuICAgICAgICAgIFNwYWNlVGFiOiBTcGFjZVRhYjtcbiAgICAgICAgICBWaWxsYWdlOiBWaWxsYWdlO1xuICAgICAgICAgIFdvcmtzaG9wOiBXb3Jrc2hvcDtcbiAgICAgICAgfTtcbiAgICAgICAgVGVjaEJ1dHRvbkNvbnRyb2xsZXI6IFRlY2hCdXR0b25Db250cm9sbGVyO1xuICAgICAgICBUcmFkZUJ1dHRvbjogVHJhZGVCdXR0b247XG4gICAgICAgIFRyYWRlQnV0dG9uQ29udHJvbGxlcjogVHJhZGVCdXR0b25Db250cm9sbGVyO1xuICAgICAgICBUcmFuc2NlbmRCdG5Db250cm9sbGVyOiBUcmFuc2NlbmRCdG5Db250cm9sbGVyO1xuICAgICAgICBVcGdyYWRlQnV0dG9uQ29udHJvbGxlcjogVXBncmFkZUJ1dHRvbkNvbnRyb2xsZXI7XG4gICAgICAgIFplYnJhVXBncmFkZUJ1dHRvbkNvbnRyb2xsZXI6IFplYnJhVXBncmFkZUJ1dHRvbkNvbnRyb2xsZXI7XG4gICAgICAgIFppZ2d1cmF0QnRuQ29udHJvbGxlcjogWmlnZ3VyYXRCdG5Db250cm9sbGVyO1xuICAgICAgfTtcbiAgICAgIHZpbGxhZ2U6IHtcbiAgICAgICAgS2l0dGVuOiBLaXR0ZW47XG4gICAgICAgIExvYWRvdXQ6IExvYWRvdXQ7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBNaXhpbkludGVyZmFjZSA9IHtcbiAgSUNoaWxkcmVuQXdhcmU6IElDaGlsZHJlbkF3YXJlO1xuICBJRGF0YVN0b3JhZ2VBd2FyZTogSURhdGFTdG9yYWdlQXdhcmU7XG4gIElHYW1lQXdhcmU6IElHYW1lQXdhcmU7XG4gIElSZWFjdEF3YXJlOiBJUmVhY3RBd2FyZTtcbn07XG5cbmV4cG9ydCB0eXBlIEkxOG5FbmdpbmUgPSAoa2V5OiBzdHJpbmcsIGFyZ3M/OiBBcnJheTxudW1iZXIgfCBzdHJpbmc+KSA9PiBzdHJpbmc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgY29uc3QgY2xhc3NlczogQ2xhc3NMaXN0O1xuICBjb25zdCBjb206IENvbUludGVyZmFjZTtcbiAgY29uc3QgZ2FtZTogR2FtZVBhZ2U7XG4gIGxldCB1bnNhZmVXaW5kb3c6IFdpbmRvdyB8IHVuZGVmaW5lZDtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgJDogSlF1ZXJ5O1xuICAgICRJPzogTWF5YmU8STE4bkVuZ2luZT47XG4gICAgZG9qbzoge1xuICAgICAgY2xvbmU6IDxUPihzdWJqZWN0OiBUKSA9PiBUO1xuICAgICAgc3Vic2NyaWJlOiA8VEV2ZW50IGV4dGVuZHMgc3RyaW5nPihcbiAgICAgICAgZXZlbnQ6IFRFdmVudCxcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOb3Qgb3VyIHR5cGUuXG4gICAgICAgIGhhbmRsZXI6ICguLi5hcmdzOiBBcnJheTxhbnk+KSA9PiB2b2lkLFxuICAgICAgKSA9PiBbVEV2ZW50LCBudW1iZXJdO1xuICAgICAgdW5zdWJzY3JpYmU6IChoYW5kbGU6IFtzdHJpbmcsIG51bWJlcl0pID0+IHZvaWQ7XG4gICAgfTtcbiAgICBnYW1lPzogTWF5YmU8R2FtZVBhZ2U+O1xuICAgIGdhbWVQYWdlPzogTWF5YmU8R2FtZVBhZ2U+O1xuICAgIGtpdHRlblNjaWVudGlzdHM/OiBLaXR0ZW5TY2llbnRpc3RzO1xuICAgIExaU3RyaW5nOiB7XG4gICAgICBjb21wcmVzc1RvQmFzZTY0OiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgICAgY29tcHJlc3NUb1VURjE2OiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgICAgZGVjb21wcmVzc0Zyb21CYXNlNjQ6IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgICBkZWNvbXByZXNzRnJvbVVURjE2OiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0ICogZnJvbSBcIi4vX3JlbGVhc2VzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9fc2F2ZS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vYWNoaWV2ZW1lbnRzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9idWlsZGluZ3MuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NhbGVuZGFyLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jaGFsbGVuZ2VzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb3JlLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kaXBsb21hY3kuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2dhbWUuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21hdGguanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ByZXN0aWdlLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZWxpZ2lvbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVzb3VyY2VzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY2llbmNlLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zcGFjZS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGltZS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdG9vbGJhci5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdWkuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZpbGxhZ2UuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZvaWQuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dvcmtzaG9wLmpzXCI7XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgUmVsaWdpb25JdGVtLCBSZXNvdXJjZSwgU3BhY2VCdWlsZGluZyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCb25maXJlSXRlbSB9IGZyb20gXCIuL0JvbmZpcmVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUaW1lSXRlbSB9IGZyb20gXCIuL1RpbWVTZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgdHlwZSBSZXF1aXJlbWVudCA9IFJlc291cmNlIHwgZmFsc2U7XG5cbi8qKlxuICogVGhlIHR5cGUgbmFtZXMgb2YgYWxsIHN1cHBvcnRlZCBidWlsZGluZ3MuXG4gKi9cbmV4cG9ydCB0eXBlIEFsbEl0ZW1zID0gQm9uZmlyZUl0ZW0gfCBSZWxpZ2lvbkl0ZW0gfCBTcGFjZUJ1aWxkaW5nIHwgVGltZUl0ZW07XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nIHtcbiAgZW5hYmxlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nOiBNYXliZTxQYXJ0aWFsPFNldHRpbmc+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZW5hYmxlZCA9IHNldHRpbmcuZW5hYmxlZCA/PyB0aGlzLmVuYWJsZWQ7XG4gIH1cblxuICBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldHRpbmdMaW1pdGVkIGV4dGVuZHMgU2V0dGluZyB7XG4gIGxpbWl0ZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoZW5hYmxlZCA9IGZhbHNlLCBsaW1pdGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLmxpbWl0ZWQgPSBsaW1pdGVkO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nOiBNYXliZTxQYXJ0aWFsPFNldHRpbmdMaW1pdGVkPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmcpO1xuICAgIHRoaXMubGltaXRlZCA9IHNldHRpbmcubGltaXRlZCA/PyB0aGlzLmxpbWl0ZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHNldHRpbmcgdGhhdCBhbHNvIGluY2x1ZGVzIGEgdHJpZ2dlciB2YWx1ZS5cbiAqIFRyaWdnZXIgdmFsdWVzIHJhbmdlIGZyb20gMCB0byAxLiBUaGV5IHJlZmxlY3QgYSBwZXJjZW50YWdlLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ1RyaWdnZXIgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgdHJpZ2dlcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgdHJpZ2dlciA9IC0xKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy50cmlnZ2VyID0gdHJpZ2dlcjtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZzogTWF5YmU8UGFydGlhbDxTZXR0aW5nVHJpZ2dlcj4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5nKTtcbiAgICB0aGlzLnRyaWdnZXIgPSBzZXR0aW5nLnRyaWdnZXIgPz8gdGhpcy50cmlnZ2VyO1xuICB9XG59XG5cbi8qKlxuICogQSBzZXR0aW5nIHRoYXQgYWxzbyBpbmNsdWRlcyBhbiBhYnNvbHV0ZSB2YWx1ZSB0cmlnZ2VyLlxuICogVHJpZ2dlciB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIEluZmluaXR5LCB3aGlsZSAtMSBkZXNpZ25hdGVzIEluZmluaXR5IGV4cGxpY2l0bHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nVGhyZXNob2xkIGV4dGVuZHMgU2V0dGluZyB7XG4gIHRyaWdnZXI6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UsIHRocmVzaG9sZCA9IDEpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLnRyaWdnZXIgPSB0aHJlc2hvbGQ7XG4gIH1cblxuICBsb2FkKHNldHRpbmc6IE1heWJlPFBhcnRpYWw8U2V0dGluZ1RocmVzaG9sZD4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5nKTtcbiAgICB0aGlzLnRyaWdnZXIgPSBzZXR0aW5nLnRyaWdnZXIgPz8gdGhpcy50cmlnZ2VyO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nTWF4IGV4dGVuZHMgU2V0dGluZyB7XG4gIG1heDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgbWF4ID0gMCkge1xuICAgIHN1cGVyKGVuYWJsZWQpO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICB9XG5cbiAgbG9hZChzZXR0aW5nOiBNYXliZTxQYXJ0aWFsPFNldHRpbmdNYXg+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZyk7XG4gICAgdGhpcy5tYXggPSBzZXR0aW5nLm1heCA/PyB0aGlzLm1heDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ0xpbWl0ZWRNYXggZXh0ZW5kcyBTZXR0aW5nTGltaXRlZCBpbXBsZW1lbnRzIFNldHRpbmdNYXgge1xuICBtYXg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UsIGxpbWl0ZWQgPSBmYWxzZSwgbWF4ID0gMCkge1xuICAgIHN1cGVyKGVuYWJsZWQsIGxpbWl0ZWQpO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICB9XG5cbiAgbG9hZChzZXR0aW5nOiBNYXliZTxQYXJ0aWFsPFNldHRpbmdMaW1pdGVkTWF4Pj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmcpO1xuICAgIHRoaXMubWF4ID0gc2V0dGluZy5tYXggPz8gdGhpcy5tYXg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldHRpbmdMaW1pdGVkTWF4VHJpZ2dlciBleHRlbmRzIFNldHRpbmdMaW1pdGVkTWF4IGltcGxlbWVudHMgU2V0dGluZ1RyaWdnZXIge1xuICB0cmlnZ2VyOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZW5hYmxlZCA9IGZhbHNlLCBsaW1pdGVkID0gZmFsc2UsIG1heCA9IDAsIHRyaWdnZXIgPSAtMSkge1xuICAgIHN1cGVyKGVuYWJsZWQsIGxpbWl0ZWQsIG1heCk7XG4gICAgdGhpcy50cmlnZ2VyID0gdHJpZ2dlcjtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZzogTWF5YmU8UGFydGlhbDxTZXR0aW5nTGltaXRlZE1heFRyaWdnZXI+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZyk7XG4gICAgdGhpcy50cmlnZ2VyID0gc2V0dGluZy50cmlnZ2VyID8/IHRoaXMudHJpZ2dlcjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ0xpbWl0ZWRUcmlnZ2VyIGV4dGVuZHMgU2V0dGluZ0xpbWl0ZWQgaW1wbGVtZW50cyBTZXR0aW5nVHJpZ2dlciB7XG4gIHRyaWdnZXI6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UsIGxpbWl0ZWQgPSBmYWxzZSwgdHJpZ2dlciA9IC0xKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgbGltaXRlZCk7XG4gICAgdGhpcy50cmlnZ2VyID0gdHJpZ2dlcjtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZzogTWF5YmU8UGFydGlhbDxTZXR0aW5nTGltaXRlZFRyaWdnZXI+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZyk7XG4gICAgdGhpcy50cmlnZ2VyID0gc2V0dGluZy50cmlnZ2VyID8/IHRoaXMudHJpZ2dlcjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ1RyaWdnZXJNYXggZXh0ZW5kcyBTZXR0aW5nVHJpZ2dlciBpbXBsZW1lbnRzIFNldHRpbmdNYXgge1xuICBtYXg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UsIHRyaWdnZXIgPSAtMSwgbWF4ID0gMCkge1xuICAgIHN1cGVyKGVuYWJsZWQsIHRyaWdnZXIpO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICB9XG5cbiAgbG9hZChzZXR0aW5nOiBNYXliZTxQYXJ0aWFsPFNldHRpbmdUcmlnZ2VyTWF4Pj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmcpO1xuICAgIHRoaXMubWF4ID0gc2V0dGluZy5tYXggPz8gdGhpcy5tYXg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldHRpbmdUaHJlc2hvbGRNYXggZXh0ZW5kcyBTZXR0aW5nVGhyZXNob2xkIGltcGxlbWVudHMgU2V0dGluZ01heCB7XG4gIG1heDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgdHJpZ2dlciA9IDEsIG1heCA9IDApIHtcbiAgICBzdXBlcihlbmFibGVkLCB0cmlnZ2VyKTtcbiAgICB0aGlzLm1heCA9IG1heDtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZzogTWF5YmU8UGFydGlhbDxTZXR0aW5nVHJpZ2dlck1heD4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5nKTtcbiAgICB0aGlzLm1heCA9IHNldHRpbmcubWF4ID8/IHRoaXMubWF4O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nT3B0aW9uczxUID0gc3RyaW5nPiB7XG4gIHJlYWRvbmx5ICNvcHRpb25zOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBUIH0+O1xuICBzZWxlY3RlZDogVDtcblxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy4jb3B0aW9ucztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNlbGVjdGVkOiBULCBvcHRpb25zID0gbmV3IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IFQgfT4oKSkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvdmlkZWQgc2VsZWN0ZWQgdmFsdWUgZXhpc3RzIGluIG9wdGlvbnMuXG4gICAgaWYgKGlzTmlsKG9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSBzZWxlY3RlZCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlZCBzZWxlY3RlZCB2YWx1ZSBpcyBub3QgaW4gcHJvdmlkZWQgb3B0aW9ucy5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgIHRoaXMuI29wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nOiBNYXliZTxQYXJ0aWFsPFNldHRpbmdPcHRpb25zPFQ+Pj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkID0gc2V0dGluZy5zZWxlY3RlZCA/PyB0aGlzLnNlbGVjdGVkO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nQnV5IGV4dGVuZHMgU2V0dGluZyB7XG4gIGJ1eTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgYnV5ID0gLTEpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLmJ1eSA9IGJ1eTtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZzogTWF5YmU8UGFydGlhbDxTZXR0aW5nQnV5Pj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmcpO1xuICAgIHRoaXMuYnV5ID0gc2V0dGluZy5idXkgPz8gdGhpcy5idXk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldHRpbmdTZWxsIGV4dGVuZHMgU2V0dGluZyB7XG4gIHNlbGw6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UsIHNlbGwgPSAtMSkge1xuICAgIHN1cGVyKGVuYWJsZWQpO1xuICAgIHRoaXMuc2VsbCA9IHNlbGw7XG4gIH1cblxuICBsb2FkKHNldHRpbmc6IE1heWJlPFBhcnRpYWw8U2V0dGluZ1NlbGw+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZyk7XG4gICAgdGhpcy5zZWxsID0gc2V0dGluZy5zZWxsID8/IHRoaXMuc2VsbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ0J1eVNlbGxUaHJlc2hvbGQgZXh0ZW5kcyBTZXR0aW5nVGhyZXNob2xkIGltcGxlbWVudHMgU2V0dGluZ0J1eSwgU2V0dGluZ1NlbGwge1xuICBidXk6IG51bWJlcjtcbiAgc2VsbDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgYnV5ID0gOTUwLjAsIHNlbGwgPSAxMDAwLjAsIHRyaWdnZXIgPSAxKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgdHJpZ2dlcik7XG4gICAgdGhpcy5idXkgPSBidXk7XG4gICAgdGhpcy5zZWxsID0gc2VsbDtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZzogTWF5YmU8UGFydGlhbDxTZXR0aW5nQnV5U2VsbFRocmVzaG9sZD4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5nKTtcbiAgICB0aGlzLmJ1eSA9IHNldHRpbmcuYnV5ID8/IHRoaXMuYnV5O1xuICAgIHRoaXMuc2VsbCA9IHNldHRpbmcuc2VsbCA/PyB0aGlzLnNlbGw7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsLCB0eXBlIE1heWJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgY29uc3VtZUVudHJpZXNQZWRhbnRpYyB9IGZyb20gXCIuLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgeyB0eXBlIFN0YWdlZEJ1aWxkaW5nLCBTdGFnZWRCdWlsZGluZ3MgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmcgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgQnVpbGRpbmdVcGdyYWRlU2V0dGluZyBleHRlbmRzIFNldHRpbmcge1xuICByZWFkb25seSAjdXBncmFkZTogU3RhZ2VkQnVpbGRpbmc7XG5cbiAgZ2V0IHVwZ3JhZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3VwZ3JhZGU7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih1cGdyYWRlOiBTdGFnZWRCdWlsZGluZywgZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy4jdXBncmFkZSA9IHVwZ3JhZGU7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRpbmdVcGRhdGVCdWlsZGluZ1NldHRpbmdzID0gUmVjb3JkPFN0YWdlZEJ1aWxkaW5nLCBCdWlsZGluZ1VwZ3JhZGVTZXR0aW5nPjtcblxuZXhwb3J0IGNsYXNzIEJ1aWxkaW5nVXBncmFkZVNldHRpbmdzIGV4dGVuZHMgU2V0dGluZyB7XG4gIGJ1aWxkaW5nczogQnVpbGRpbmdVcGRhdGVCdWlsZGluZ1NldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIHN1cGVyKGVuYWJsZWQpO1xuICAgIHRoaXMuYnVpbGRpbmdzID0gdGhpcy5pbml0QnVpbGRpbmdzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRCdWlsZGluZ3MoKTogQnVpbGRpbmdVcGRhdGVCdWlsZGluZ1NldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIEJ1aWxkaW5nVXBkYXRlQnVpbGRpbmdTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgU3RhZ2VkQnVpbGRpbmdzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBCdWlsZGluZ1VwZ3JhZGVTZXR0aW5nKGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBsb2FkKHNldHRpbmdzOiBNYXliZTxQYXJ0aWFsPEJ1aWxkaW5nVXBncmFkZVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMuYnVpbGRpbmdzLCBzZXR0aW5ncy5idWlsZGluZ3MsIChidWlsZGluZywgaXRlbSkgPT4ge1xuICAgICAgYnVpbGRpbmcuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gYnVpbGRpbmcuZW5hYmxlZDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IHR5cGUgQnVpbGRpbmcsIEJ1aWxkaW5ncywgdHlwZSBTdGFnZWRCdWlsZGluZywgU3RhZ2VkQnVpbGRpbmdzIH0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBCdWlsZGluZ1VwZ3JhZGVTZXR0aW5ncyB9IGZyb20gXCIuL0J1aWxkaW5nVXBncmFkZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nLCBTZXR0aW5nVHJpZ2dlciwgU2V0dGluZ1RyaWdnZXJNYXggfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG4vKipcbiAqIE9uZSBvZiB0aGUgYnVpbGRpbmcgb3B0aW9ucyBpbiB0aGUgS1MgbWVudS5cbiAqIFRoZXNlIGFyZSBub3QgaWRlbnRpY2FsIHRvIGBCdWlsZGluZ2AhXG4gKiBgQnVpbGRpbmdgIGlzIElEcyBvZiBidWlsZGluZ3MgYXMgZGVmaW5lZCBieSBLRy4gS1MgZGVmaW5lcyB1cGdyYWRlIHN0YWdlcyBhcyB3ZWxsLlxuICovXG5leHBvcnQgdHlwZSBCb25maXJlSXRlbSA9IEJ1aWxkaW5nIHwgU3RhZ2VkQnVpbGRpbmc7XG5cbmV4cG9ydCBjbGFzcyBCb25maXJlQnVpbGRpbmdTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXJNYXgge1xuICAvKipcbiAgICogSW4gY2FzZSB0aGlzIGlzIGFuIHVwZ3JhZGUgb2YgYW5vdGhlciBidWlsZGluZywgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGVcbiAgICogYmFzZSBidWlsZGluZy5cbiAgICovXG4gIHJlYWRvbmx5ICNiYXNlQnVpbGRpbmc6IEJ1aWxkaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBnZXQgYmFzZUJ1aWxkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNiYXNlQnVpbGRpbmc7XG4gIH1cblxuICByZWFkb25seSAjYnVpbGRpbmc6IEJvbmZpcmVJdGVtO1xuICBnZXQgYnVpbGRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2J1aWxkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEluIGNhc2UgdGhpcyBpcyBhbiB1cGdyYWRhYmxlIGJ1aWxkaW5nLCB0aGlzIGluZGljYXRlcyB0aGUgbGV2ZWwgb2ZcbiAgICogdGhlIHN0YWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgI3N0YWdlOiBudW1iZXIgPSAwO1xuICBnZXQgc3RhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0YWdlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnVpbGRpbmc6IEJvbmZpcmVJdGVtLFxuICAgIGVuYWJsZWQgPSBmYWxzZSxcbiAgICB0cmlnZ2VyID0gLTEsXG4gICAgbWF4ID0gMCxcbiAgICBiYXNlU3RhZ2U/OiBCdWlsZGluZyB8IGZhbHNlLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkLCB0cmlnZ2VyLCBtYXgpO1xuXG4gICAgdGhpcy4jYnVpbGRpbmcgPSBidWlsZGluZztcbiAgICBpZiAoYmFzZVN0YWdlKSB7XG4gICAgICB0aGlzLiNzdGFnZSA9IDE7XG4gICAgICB0aGlzLiNiYXNlQnVpbGRpbmcgPSBiYXNlU3RhZ2U7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIEJvbmZpcmVCdWlsZGluZ1NldHRpbmdzID0gUmVjb3JkPFxuICBFeGNsdWRlPEJvbmZpcmVJdGVtLCBcInVuaWNvcm5QYXN0dXJlXCI+LFxuICBCb25maXJlQnVpbGRpbmdTZXR0aW5nXG4+O1xuXG5leHBvcnQgY2xhc3MgQm9uZmlyZVNldHRpbmdzIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXIge1xuICBidWlsZGluZ3M6IEJvbmZpcmVCdWlsZGluZ1NldHRpbmdzO1xuXG4gIGdhdGhlckNhdG5pcDogU2V0dGluZztcbiAgdHVybk9uTWFnbmV0b3M6IFNldHRpbmc7XG4gIHR1cm5PblN0ZWFtd29ya3M6IFNldHRpbmc7XG4gIHR1cm5PblJlYWN0b3JzOiBTZXR0aW5nO1xuICB1cGdyYWRlQnVpbGRpbmdzOiBCdWlsZGluZ1VwZ3JhZGVTZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbmFibGVkID0gZmFsc2UsXG4gICAgdHJpZ2dlciA9IC0xLFxuICAgIGdhdGhlckNhdG5pcCA9IG5ldyBTZXR0aW5nKCksXG4gICAgdHVybk9uU3RlYW13b3JrcyA9IG5ldyBTZXR0aW5nKCksXG4gICAgdHVybk9uTWFnbmV0b3MgPSBuZXcgU2V0dGluZygpLFxuICAgIHR1cm5PblJlYWN0b3JzID0gbmV3IFNldHRpbmcoKSxcbiAgICB1cGdyYWRlQnVpbGRpbmdzID0gbmV3IEJ1aWxkaW5nVXBncmFkZVNldHRpbmdzKCksXG4gICkge1xuICAgIHN1cGVyKGVuYWJsZWQsIHRyaWdnZXIpO1xuICAgIHRoaXMuYnVpbGRpbmdzID0gdGhpcy5pbml0QnVpbGRpbmdzKCk7XG4gICAgdGhpcy5nYXRoZXJDYXRuaXAgPSBnYXRoZXJDYXRuaXA7XG4gICAgdGhpcy50dXJuT25TdGVhbXdvcmtzID0gdHVybk9uU3RlYW13b3JrcztcbiAgICB0aGlzLnR1cm5Pbk1hZ25ldG9zID0gdHVybk9uTWFnbmV0b3M7XG4gICAgdGhpcy50dXJuT25SZWFjdG9ycyA9IHR1cm5PblJlYWN0b3JzO1xuICAgIHRoaXMudXBncmFkZUJ1aWxkaW5ncyA9IHVwZ3JhZGVCdWlsZGluZ3M7XG4gIH1cblxuICBwcml2YXRlIGluaXRCdWlsZGluZ3MoKTogQm9uZmlyZUJ1aWxkaW5nU2V0dGluZ3Mge1xuICAgIGNvbnN0IGJhc2VTdGFnZTogUGFydGlhbDxSZWNvcmQ8U3RhZ2VkQnVpbGRpbmcsIEJ1aWxkaW5nPj4gPSB7XG4gICAgICBicm9hZGNhc3R0b3dlcjogXCJhbXBoaXRoZWF0cmVcIixcbiAgICAgIGRhdGFDZW50ZXI6IFwibGlicmFyeVwiLFxuICAgICAgaHlkcm9wbGFudDogXCJhcXVlZHVjdFwiLFxuICAgICAgc29sYXJmYXJtOiBcInBhc3R1cmVcIixcbiAgICAgIHNwYWNlcG9ydDogXCJ3YXJlaG91c2VcIixcbiAgICB9O1xuXG4gICAgY29uc3QgaXRlbXMgPSB7fSBhcyBCb25maXJlQnVpbGRpbmdTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgQnVpbGRpbmdzKSB7XG4gICAgICBpZiAoaXRlbSA9PT0gXCJ1bmljb3JuUGFzdHVyZVwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgQm9uZmlyZUJ1aWxkaW5nU2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFN0YWdlZEJ1aWxkaW5ncykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgQm9uZmlyZUJ1aWxkaW5nU2V0dGluZyhpdGVtLCBmYWxzZSwgLTEsIDAsIGJhc2VTdGFnZVtpdGVtXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxCb25maXJlU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy5idWlsZGluZ3MsIHNldHRpbmdzLmJ1aWxkaW5ncywgKGJ1aWxkaW5nLCBpdGVtKSA9PiB7XG4gICAgICBidWlsZGluZy5lbmFibGVkID0gaXRlbT8uZW5hYmxlZCA/PyBidWlsZGluZy5lbmFibGVkO1xuICAgICAgYnVpbGRpbmcubWF4ID0gaXRlbT8ubWF4ID8/IGJ1aWxkaW5nLm1heDtcbiAgICAgIGJ1aWxkaW5nLnRyaWdnZXIgPSBpdGVtPy50cmlnZ2VyID8/IGJ1aWxkaW5nLnRyaWdnZXI7XG4gICAgfSk7XG5cbiAgICB0aGlzLmdhdGhlckNhdG5pcC5lbmFibGVkID0gc2V0dGluZ3MuZ2F0aGVyQ2F0bmlwPy5lbmFibGVkID8/IHRoaXMuZ2F0aGVyQ2F0bmlwLmVuYWJsZWQ7XG4gICAgdGhpcy50dXJuT25TdGVhbXdvcmtzLmVuYWJsZWQgPVxuICAgICAgc2V0dGluZ3MudHVybk9uU3RlYW13b3Jrcz8uZW5hYmxlZCA/PyB0aGlzLnR1cm5PblN0ZWFtd29ya3MuZW5hYmxlZDtcbiAgICB0aGlzLnR1cm5Pbk1hZ25ldG9zLmVuYWJsZWQgPSBzZXR0aW5ncy50dXJuT25NYWduZXRvcz8uZW5hYmxlZCA/PyB0aGlzLnR1cm5Pbk1hZ25ldG9zLmVuYWJsZWQ7XG4gICAgdGhpcy50dXJuT25SZWFjdG9ycy5lbmFibGVkID0gc2V0dGluZ3MudHVybk9uUmVhY3RvcnM/LmVuYWJsZWQgPz8gdGhpcy50dXJuT25SZWFjdG9ycy5lbmFibGVkO1xuICAgIHRoaXMudXBncmFkZUJ1aWxkaW5ncy5sb2FkKHNldHRpbmdzLnVwZ3JhZGVCdWlsZGluZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgS2l0dGVuU2NpZW50aXN0cyB9IGZyb20gXCIuL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgVGFiIH0gZnJvbSBcIi4vdHlwZXMvY29yZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUYWJJZCB9IGZyb20gXCIuL3R5cGVzL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBUYWJNYW5hZ2VyPFRUYWIgZXh0ZW5kcyBUYWIgPSBUYWI+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogS2l0dGVuU2NpZW50aXN0cztcbiAgdGFiOiBUVGFiO1xuXG4gIGNvbnN0cnVjdG9yKGhvc3Q6IEtpdHRlblNjaWVudGlzdHMsIG5hbWU6IFRhYklkKSB7XG4gICAgdGhpcy5faG9zdCA9IGhvc3Q7XG5cbiAgICBjb25zdCB0YWIgPSB0aGlzLl9ob3N0LmdhbWUudGFicy5maW5kKHN1YmplY3QgPT4gc3ViamVjdC50YWJJZCA9PT0gbmFtZSkgYXMgVFRhYjtcbiAgICBpZiAoaXNOaWwodGFiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCB0YWIgJHtuYW1lfWApO1xuICAgIH1cblxuICAgIHRoaXMudGFiID0gdGFiO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICByZW5kZXIoKTogdGhpcyB7XG4gICAgaWYgKHRoaXMuX2hvc3QuZ2FtZS51aS5hY3RpdmVUYWJJZCAhPT0gdGhpcy50YWIudGFiSWQpIHtcbiAgICAgIHRoaXMudGFiLnJlbmRlcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRvbWF0aW9uLCBGcmFtZUNvbnRleHQgfSBmcm9tIFwiLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEJ1bGtQdXJjaGFzZUhlbHBlciB9IGZyb20gXCIuL2hlbHBlci9CdWxrUHVyY2hhc2VIZWxwZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgS2l0dGVuU2NpZW50aXN0cyB9IGZyb20gXCIuL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQm9uZmlyZUJ1aWxkaW5nU2V0dGluZyxcbiAgdHlwZSBCb25maXJlSXRlbSxcbiAgQm9uZmlyZVNldHRpbmdzLFxufSBmcm9tIFwiLi9zZXR0aW5ncy9Cb25maXJlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFRhYk1hbmFnZXIgfSBmcm9tIFwiLi9UYWJNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBCdWlsZGluZ0J0bk1vZGVybkNvbnRyb2xsZXIsXG4gIEJ1aWxkaW5nTWV0YSxcbiAgQnVpbGRpbmdzTW9kZXJuLFxuICBHYXRoZXJDYXRuaXBCdXR0b25Db250cm9sbGVyLFxuICBTdGFnaW5nQmxkQnRuQ29udHJvbGxlcixcbiAgVW5zYWZlQnVpbGRpbmcsXG4gIFVuc2FmZVN0YWdpbmdCbGRCdXR0b25PcHRpb25zLFxuICBVbnNhZmVVbnN0YWdlZEJ1aWxkaW5nQnV0dG9uT3B0aW9ucyxcbn0gZnJvbSBcIi4vdHlwZXMvYnVpbGRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVuc2FmZUJ1aWxkaW5nQnRuTW9kZXJuTW9kZWwgfSBmcm9tIFwiLi90eXBlcy9jb3JlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJ1aWxkaW5nIH0gZnJvbSBcIi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3Nob3BNYW5hZ2VyIH0gZnJvbSBcIi4vV29ya3Nob3BNYW5hZ2VyLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBCb25maXJlTWFuYWdlciBpbXBsZW1lbnRzIEF1dG9tYXRpb24ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9ob3N0OiBLaXR0ZW5TY2llbnRpc3RzO1xuICByZWFkb25seSBzZXR0aW5nczogQm9uZmlyZVNldHRpbmdzO1xuICByZWFkb25seSBtYW5hZ2VyOiBUYWJNYW5hZ2VyPEJ1aWxkaW5nc01vZGVybj47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2J1bGtNYW5hZ2VyOiBCdWxrUHVyY2hhc2VIZWxwZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEtpdHRlblNjaWVudGlzdHMsXG4gICAgd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXIsXG4gICAgc2V0dGluZ3MgPSBuZXcgQm9uZmlyZVNldHRpbmdzKCksXG4gICkge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVGFiTWFuYWdlcjxCdWlsZGluZ3NNb2Rlcm4+KHRoaXMuX2hvc3QsIFwiQm9uZmlyZVwiKTtcblxuICAgIHRoaXMuX3dvcmtzaG9wTWFuYWdlciA9IHdvcmtzaG9wTWFuYWdlcjtcbiAgICB0aGlzLl9idWxrTWFuYWdlciA9IG5ldyBCdWxrUHVyY2hhc2VIZWxwZXIodGhpcy5faG9zdCwgdGhpcy5fd29ya3Nob3BNYW5hZ2VyKTtcbiAgfVxuXG4gIHRpY2soY29udGV4dDogRnJhbWVDb250ZXh0KSB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLmVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXZSBtdXN0IGNhbGwgYC5yZW5kZXIoKWAgaGVyZSwgYmVjYXVzZSBldmFsdWF0aW9uIG9mIGF2YWlsYWJpbGl0eSBvZiBvdXIgb3B0aW9uc1xuICAgIC8vIGlzIG9ubHkgcGVyZm9ybWVkIHdoZW4gdGhlIGdhbWUgcmVuZGVycyB0aGUgY29udGVudHMgb2YgdGhhdCB0YWIuXG4gICAgdGhpcy5tYW5hZ2VyLnJlbmRlcigpO1xuXG4gICAgdGhpcy5hdXRvQnVpbGQoY29udGV4dCk7XG4gICAgdGhpcy5hdXRvTWlzYyhjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gYnVpbGQgYXMgbWFueSBvZiB0aGUgcGFzc2VkIGJ1aWxkaW5ncyBhcyBwb3NzaWJsZS5cbiAgICogVXN1YWxseSwgdGhpcyBpcyBjYWxsZWQgYXQgZWFjaCBpdGVyYXRpb24gb2YgdGhlIGF1dG9tYXRpb24gZW5naW5lIHRvXG4gICAqIGhhbmRsZSB0aGUgYnVpbGRpbmcgb2YgaXRlbXMgb24gdGhlIEJvbmZpcmUgdGFiLlxuICAgKlxuICAgKiBAcGFyYW0gYnVpbGRzIFRoZSBidWlsZGluZ3MgdG8gYnVpbGQuXG4gICAqL1xuICBhdXRvQnVpbGQoXG4gICAgY29udGV4dDogRnJhbWVDb250ZXh0LFxuICAgIGJ1aWxkczogUGFydGlhbDxSZWNvcmQ8Qm9uZmlyZUl0ZW0sIEJvbmZpcmVCdWlsZGluZ1NldHRpbmc+PiA9IHRoaXMuc2V0dGluZ3MuYnVpbGRpbmdzLFxuICApIHtcbiAgICBjb25zdCBidWxrTWFuYWdlciA9IHRoaXMuX2J1bGtNYW5hZ2VyO1xuXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1ldGFkYXRhIGZvciBhbGwgdGhlIHJlZmVyZW5jZWQgYnVpbGRpbmdzLlxuICAgIGNvbnN0IG1ldGFEYXRhOiBQYXJ0aWFsPFJlY29yZDxCb25maXJlSXRlbSwgUmVxdWlyZWQ8VW5zYWZlQnVpbGRpbmc+Pj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGJ1aWxkIG9mIE9iamVjdC52YWx1ZXMoYnVpbGRzKSkge1xuICAgICAgbWV0YURhdGFbYnVpbGQuYnVpbGRpbmddID0gdGhpcy5nZXRCdWlsZChcbiAgICAgICAgKGJ1aWxkLmJhc2VCdWlsZGluZyA/PyBidWlsZC5idWlsZGluZykgYXMgQnVpbGRpbmcsXG4gICAgICApLm1ldGE7XG4gICAgfVxuICAgIGNvbnN0IHNlY3Rpb25UcmlnZ2VyID0gdGhpcy5zZXR0aW5ncy50cmlnZ2VyO1xuXG4gICAgLy8gTGV0IHRoZSBidWxrbWFuYWdlciBkZXRlcm1pbmUgdGhlIGJ1aWxkcyB3ZSBjYW4gbWFrZS5cbiAgICBjb25zdCBidWlsZExpc3QgPSBidWxrTWFuYWdlci5idWxrKGJ1aWxkcywgbWV0YURhdGEsIHNlY3Rpb25UcmlnZ2VyLCBcIkJvbmZpcmVcIik7XG5cbiAgICAvLyBCdWlsZCBhbGwgZW50cmllcyBpbiB0aGUgYnVpbGQgbGlzdCwgd2hlcmUgd2UgY2FuIGJ1aWxkIGFueSBpdGVtcy5cbiAgICBmb3IgKGNvbnN0IGJ1aWxkIG9mIGJ1aWxkTGlzdC5maWx0ZXIoaXRlbSA9PiAwIDwgaXRlbS5jb3VudCkpIHtcbiAgICAgIHRoaXMuYnVpbGQoKGJ1aWxkLm5hbWUgfHwgYnVpbGQuaWQpIGFzIEJ1aWxkaW5nLCBidWlsZC5zdGFnZSwgYnVpbGQuY291bnQpO1xuICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgYXV0b1VwZ3JhZGUoY29udGV4dDogRnJhbWVDb250ZXh0KSB7XG4gICAgLy8gR2V0IGN1cnJlbnQgY291bnQgb2YgcGFzdHVyZXMuXG4gICAgY29uc3QgcGFzdHVyZXMgPVxuICAgICAgdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInBhc3R1cmVcIikubWV0YS5zdGFnZSA9PT0gMFxuICAgICAgICA/IHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJwYXN0dXJlXCIpLm1ldGEudmFsXG4gICAgICAgIDogMDtcbiAgICAvLyBHZXQgY3VycmVudCBjb3VudCBvZiBhcXVlZHVjdHMuXG4gICAgY29uc3QgYXF1ZWR1Y3RzID1cbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJhcXVlZHVjdFwiKS5tZXRhLnN0YWdlID09PSAwXG4gICAgICAgID8gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcImFxdWVkdWN0XCIpLm1ldGEudmFsXG4gICAgICAgIDogMDtcblxuICAgIGNvbnN0IHBhc3R1cmVNZXRhID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInBhc3R1cmVcIikubWV0YTtcbiAgICAvLyBJZiBwYXN0dXJlcyBoYXZlbid0IGJlZW4gdXBncmFkZWQgdG8gc29sYXIgZmFybXMgeWV0Li4uXG4gICAgaWYgKFxuICAgICAgdGhpcy5zZXR0aW5ncy51cGdyYWRlQnVpbGRpbmdzLmJ1aWxkaW5ncy5zb2xhcmZhcm0uZW5hYmxlZCAmJlxuICAgICAgcGFzdHVyZU1ldGEudW5sb2NrZWQgJiZcbiAgICAgIHBhc3R1cmVNZXRhLnN0YWdlID09PSAwICYmXG4gICAgICBtdXN0RXhpc3QocGFzdHVyZU1ldGEuc3RhZ2VzKVsxXS5zdGFnZVVubG9ja2VkXG4gICAgKSB7XG4gICAgICAvLyBJZiB3ZSB3b3VsZCByZWR1Y2Ugb3VyIHBhc3R1cmVzIHRvIDAsIGJ5IHVwZ3JhZGluZyB0aGVtLCB3b3VsZCB3ZSBsb3NlIGFueSBjYXRuaXA/XG4gICAgICBpZiAodGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFBvdGVudGlhbENhdG5pcCh0cnVlLCAwLCBhcXVlZHVjdHMpID4gMCkge1xuICAgICAgICBjb25zdCBwcmljZXMgPSBtdXN0RXhpc3QocGFzdHVyZU1ldGEuc3RhZ2VzKVsxXS5wcmljZXM7XG4gICAgICAgIGlmICh0aGlzLl9idWxrTWFuYWdlci5zaW5nbGVCdWlsZFBvc3NpYmxlKHBhc3R1cmVNZXRhLCBwcmljZXMsIDEpKSB7XG4gICAgICAgICAgY29uc3QgYnV0dG9uID0gdGhpcy5nZXRCdWlsZEJ1dHRvbihcInBhc3R1cmVcIiwgMCk7XG4gICAgICAgICAgaWYgKCFpc05pbChidXR0b24/Lm1vZGVsKSkge1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBwZXJmb3JtIHRoZSBwcm9jZXNzIGxpa2UgdGhpcyB0byBhdm9pZCBVSSBjb25maXJtYXRpb25zXG4gICAgICAgICAgICAvLyBmb3Igc2VsbGluZyBpdGVtcy5cbiAgICAgICAgICAgIC8vIFNlbGwgYWxsIHBhc3R1cmVzICh0byByZWdhaW4gdGhlIHJlc291cmNlcykuXG4gICAgICAgICAgICBidXR0b24uY29udHJvbGxlci5zZWxsSW50ZXJuYWwoYnV0dG9uLm1vZGVsLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBNYW51YWxseSB1cGRhdGUgdGhlIG1ldGFkYXRhLCBhcyB3ZSBieXBhc3NlZCB0aGUgZnVsbCBzZWxsaW5nIGxvZ2ljLlxuICAgICAgICAgICAgcGFzdHVyZU1ldGEub24gPSAwO1xuICAgICAgICAgICAgcGFzdHVyZU1ldGEudmFsID0gMDtcbiAgICAgICAgICAgIHBhc3R1cmVNZXRhLnN0YWdlID0gMTtcblxuICAgICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwidXBncmFkZS5idWlsZGluZy5wYXN0dXJlXCIsIFtdLCBcImtzLXVwZ3JhZGVcIik7XG5cbiAgICAgICAgICAgIC8vIFVwZ3JhZGUgdGhlIHBhc3R1cmUuXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUudWk/LnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy5idWlsZChcInBhc3R1cmVcIiwgMSwgMSk7XG4gICAgICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhcXVlZHVjdE1ldGEgPSB0aGlzLl9ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KFwiYXF1ZWR1Y3RcIikubWV0YTtcbiAgICAvLyBJZiBhcXVlZHVjdHMgaGF2ZW4ndCBiZWVuIHVwZ3JhZGVkIHRvIGh5ZHJvIHBsYW50cyB5ZXQuLi5cbiAgICBpZiAoXG4gICAgICB0aGlzLnNldHRpbmdzLnVwZ3JhZGVCdWlsZGluZ3MuYnVpbGRpbmdzLmh5ZHJvcGxhbnQuZW5hYmxlZCAmJlxuICAgICAgYXF1ZWR1Y3RNZXRhLnVubG9ja2VkICYmXG4gICAgICBhcXVlZHVjdE1ldGEuc3RhZ2UgPT09IDAgJiZcbiAgICAgIG11c3RFeGlzdChhcXVlZHVjdE1ldGEuc3RhZ2VzKVsxXS5zdGFnZVVubG9ja2VkXG4gICAgKSB7XG4gICAgICAvLyBJZiB3ZSB3b3VsZCByZWR1Y2Ugb3VyIGFxdWVkdWN0cyB0byAwLCBieSB1cGdyYWRpbmcgdGhlbSwgd291bGQgd2UgbG9zZSBhbnkgY2F0bmlwP1xuICAgICAgaWYgKHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRQb3RlbnRpYWxDYXRuaXAodHJ1ZSwgcGFzdHVyZXMsIDApID4gMCkge1xuICAgICAgICBjb25zdCBwcmljZXMgPSBtdXN0RXhpc3QoYXF1ZWR1Y3RNZXRhLnN0YWdlcylbMV0ucHJpY2VzO1xuICAgICAgICBpZiAodGhpcy5fYnVsa01hbmFnZXIuc2luZ2xlQnVpbGRQb3NzaWJsZShhcXVlZHVjdE1ldGEsIHByaWNlcywgMSkpIHtcbiAgICAgICAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldEJ1aWxkQnV0dG9uKFwiYXF1ZWR1Y3RcIiwgMCk7XG4gICAgICAgICAgaWYgKCFpc05pbChidXR0b24/Lm1vZGVsKSkge1xuICAgICAgICAgICAgYnV0dG9uLmNvbnRyb2xsZXIuc2VsbEludGVybmFsKGJ1dHRvbi5tb2RlbCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgYXF1ZWR1Y3RNZXRhLm9uID0gMDtcbiAgICAgICAgICAgIGFxdWVkdWN0TWV0YS52YWwgPSAwO1xuICAgICAgICAgICAgYXF1ZWR1Y3RNZXRhLnN0YWdlID0gMTtcblxuICAgICAgICAgICAgLy8gVE9ETzogV2h5IGRvIHdlIGRvIHRoaXMgZm9yIHRoZSBhcXVlZHVjdCBhbmQgbm90IGZvciB0aGUgcGFzdHVyZT9cbiAgICAgICAgICAgIGFxdWVkdWN0TWV0YS5jYWxjdWxhdGVFZmZlY3RzPy4oYXF1ZWR1Y3RNZXRhLCB0aGlzLl9ob3N0LmdhbWUpO1xuXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLmJ1aWxkaW5nLmFxdWVkdWN0XCIsIFtdLCBcImtzLXVwZ3JhZGVcIik7XG5cbiAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS51aT8ucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkKFwiYXF1ZWR1Y3RcIiwgMSwgMSk7XG4gICAgICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsaWJyYXJ5TWV0YSA9IHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJsaWJyYXJ5XCIpLm1ldGE7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zZXR0aW5ncy51cGdyYWRlQnVpbGRpbmdzLmJ1aWxkaW5ncy5kYXRhQ2VudGVyLmVuYWJsZWQgJiZcbiAgICAgIGxpYnJhcnlNZXRhLnVubG9ja2VkICYmXG4gICAgICBsaWJyYXJ5TWV0YS5zdGFnZSA9PT0gMCAmJlxuICAgICAgbXVzdEV4aXN0KGxpYnJhcnlNZXRhLnN0YWdlcylbMV0uc3RhZ2VVbmxvY2tlZFxuICAgICkge1xuICAgICAgbGV0IGVuZXJneUNvbnN1bXB0aW9uUmF0ZSA9IHRoaXMuX2hvc3QuZ2FtZS53b3Jrc2hvcC5nZXQoXCJjcnlvY29tcHV0aW5nXCIpLnJlc2VhcmNoZWQgPyAxIDogMjtcbiAgICAgIGlmICh0aGlzLl9ob3N0LmdhbWUuY2hhbGxlbmdlcy5jdXJyZW50Q2hhbGxlbmdlID09PSBcImVuZXJneVwiKSB7XG4gICAgICAgIGVuZXJneUNvbnN1bXB0aW9uUmF0ZSAqPSAyO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGluZGljYXRlcyBob3cgdmFsdWFibGUgYSBkYXRhIGNlbnRlciBpcywgY29tcGFyZWQgdG8gYSBzaW5nbGUgbGlicmFyeS5cbiAgICAgIC8vIFdlIGNoZWNrIGZvciBwb3NzaWJsZSB1cGdyYWRlcywgdGhhdCB3b3VsZCBtYWtlIHRoZW0gbW9yZSB2YWx1YWJsZS5cbiAgICAgIGxldCBsaWJUb0RhdCA9IDM7XG4gICAgICBpZiAodGhpcy5faG9zdC5nYW1lLndvcmtzaG9wLmdldChcInVwbGlua1wiKS5yZXNlYXJjaGVkKSB7XG4gICAgICAgIGxpYlRvRGF0ICo9XG4gICAgICAgICAgMSArXG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcImJpb2xhYlwiKS5tZXRhLnZhbCAqXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwidXBsaW5rRENSYXRpb1wiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9ob3N0LmdhbWUud29ya3Nob3AuZ2V0KFwibWFjaGluZUxlYXJuaW5nXCIpLnJlc2VhcmNoZWQpIHtcbiAgICAgICAgbGliVG9EYXQgKj1cbiAgICAgICAgICAxICtcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KFwiYWlDb3JlXCIpLm1ldGEub24gKlxuICAgICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcImRhdGFDZW50ZXJBSVJhdGlvXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBub3cgaGF2ZSB0aGUgZW5lcmd5IGNvbnN1bXB0aW9uIG9mIGRhdGEgY2VudGVycyBhbmQgdGhlIHZhbHVlIG9mIGRhdGEgY2VudGVycy5cbiAgICAgIC8vIEFzc3VtaW5nLCB3ZSB3b3VsZCB1cGdyYWRlIHRvIGRhdGEgY2VudGVycyBhbmQgYnV5IGFzIG1hbnkgYXMgd2UgbmVlZCB0byBoYXZlIHZhbHVlXG4gICAgICAvLyBlcXVhbCB0byBvdXIgY3VycmVudCBsaWJyYXJpZXMsIGFuZCB0aGF0IHdvdWxkbid0IGNhcCBvdXIgZW5lcmd5LCB1cGdyYWRlIHRoZW0uXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmVuZXJneVByb2QgPj1cbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZW5lcmd5Q29ucyArIChlbmVyZ3lDb25zdW1wdGlvblJhdGUgKiBsaWJyYXJ5TWV0YS52YWwpIC8gbGliVG9EYXRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcmljZXMgPSBtdXN0RXhpc3QobGlicmFyeU1ldGEuc3RhZ2VzKVsxXS5wcmljZXM7XG4gICAgICAgIGlmICh0aGlzLl9idWxrTWFuYWdlci5zaW5nbGVCdWlsZFBvc3NpYmxlKGxpYnJhcnlNZXRhLCBwcmljZXMsIDEpKSB7XG4gICAgICAgICAgY29uc3QgYnV0dG9uID0gbXVzdEV4aXN0KHRoaXMuZ2V0QnVpbGRCdXR0b24oXCJsaWJyYXJ5XCIsIDApKTtcbiAgICAgICAgICBpZiAoaXNOaWwoYnV0dG9uLm1vZGVsKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJ1dHRvbi5jb250cm9sbGVyLnNlbGxJbnRlcm5hbChidXR0b24ubW9kZWwsIDAsIGZhbHNlKTtcbiAgICAgICAgICBsaWJyYXJ5TWV0YS5vbiA9IDA7XG4gICAgICAgICAgbGlicmFyeU1ldGEudmFsID0gMDtcbiAgICAgICAgICBsaWJyYXJ5TWV0YS5zdGFnZSA9IDE7XG4gICAgICAgICAgbGlicmFyeU1ldGEuY2FsY3VsYXRlRWZmZWN0cz8uKGxpYnJhcnlNZXRhLCB0aGlzLl9ob3N0LmdhbWUpO1xuICAgICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcInVwZ3JhZGUuYnVpbGRpbmcubGlicmFyeVwiLCBbXSwgXCJrcy11cGdyYWRlXCIpO1xuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS51aT8ucmVuZGVyKCk7XG4gICAgICAgICAgdGhpcy5idWlsZChcImxpYnJhcnlcIiwgMSwgMSk7XG4gICAgICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2FyZWhvdXNlTWV0YSA9IHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJ3YXJlaG91c2VcIikubWV0YTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNldHRpbmdzLnVwZ3JhZGVCdWlsZGluZ3MuYnVpbGRpbmdzLnNwYWNlcG9ydC5lbmFibGVkICYmXG4gICAgICB3YXJlaG91c2VNZXRhLnVubG9ja2VkICYmXG4gICAgICB3YXJlaG91c2VNZXRhLnN0YWdlID09PSAwICYmXG4gICAgICBtdXN0RXhpc3Qod2FyZWhvdXNlTWV0YS5zdGFnZXMpWzFdLnN0YWdlVW5sb2NrZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IHByaWNlcyA9IG11c3RFeGlzdCh3YXJlaG91c2VNZXRhLnN0YWdlcylbMV0ucHJpY2VzO1xuICAgICAgaWYgKHRoaXMuX2J1bGtNYW5hZ2VyLnNpbmdsZUJ1aWxkUG9zc2libGUod2FyZWhvdXNlTWV0YSwgcHJpY2VzLCAxKSkge1xuICAgICAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldEJ1aWxkQnV0dG9uKFwid2FyZWhvdXNlXCIsIDApO1xuICAgICAgICBpZiAoIWlzTmlsKGJ1dHRvbj8ubW9kZWwpKSB7XG4gICAgICAgICAgYnV0dG9uLmNvbnRyb2xsZXIuc2VsbEludGVybmFsKGJ1dHRvbi5tb2RlbCwgMCwgZmFsc2UpO1xuICAgICAgICAgIHdhcmVob3VzZU1ldGEub24gPSAwO1xuICAgICAgICAgIHdhcmVob3VzZU1ldGEudmFsID0gMDtcbiAgICAgICAgICB3YXJlaG91c2VNZXRhLnN0YWdlID0gMTtcblxuICAgICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcInVwZ3JhZGUuYnVpbGRpbmcud2FyZWhvdXNlXCIsIFtdLCBcImtzLXVwZ3JhZGVcIik7XG5cbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUudWk/LnJlbmRlcigpO1xuICAgICAgICAgIHRoaXMuYnVpbGQoXCJ3YXJlaG91c2VcIiwgMSwgMSk7XG4gICAgICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhbXBoaXRoZWF0cmVNZXRhID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcImFtcGhpdGhlYXRyZVwiKS5tZXRhO1xuICAgIC8vIElmIGFtcGhpdGhlYXRocmVzIGhhdmVuJ3QgYmVlbiB1cGdyYWRlZCB0byBicm9hZGNhc3QgdG93ZXJzIHlldC4uLlxuICAgIC8vIFRoaXMgc2VlbXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBwYXN0dXJlIHVwZ3JhZGUuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zZXR0aW5ncy51cGdyYWRlQnVpbGRpbmdzLmJ1aWxkaW5ncy5icm9hZGNhc3R0b3dlci5lbmFibGVkICYmXG4gICAgICBhbXBoaXRoZWF0cmVNZXRhLnVubG9ja2VkICYmXG4gICAgICBhbXBoaXRoZWF0cmVNZXRhLnN0YWdlID09PSAwICYmXG4gICAgICBtdXN0RXhpc3QoYW1waGl0aGVhdHJlTWV0YS5zdGFnZXMpWzFdLnN0YWdlVW5sb2NrZWRcbiAgICApIHtcbiAgICAgIC8vIFRPRE86IFRoaXMgaXMgcHJvYmxlbWF0aWMuIFVwZ3JhZGluZyBmcm9tIDUwIGFtcGhpdGhlYXRyZXMgdG8gMSBicm9hZGNhc3QgdG93ZXIgc3Vja3NcbiAgICAgIC8vICAgICAgIGlmIHlvdSBkb24ndCBoYXZlIGVub3VnaCByZXNvdXJjZXMgdG8gYnVpbGQgc2V2ZXJhbCBtb3JlLlxuICAgICAgY29uc3QgcHJpY2VzID0gbXVzdEV4aXN0KGFtcGhpdGhlYXRyZU1ldGEuc3RhZ2VzKVsxXS5wcmljZXM7XG4gICAgICBpZiAodGhpcy5fYnVsa01hbmFnZXIuc2luZ2xlQnVpbGRQb3NzaWJsZShhbXBoaXRoZWF0cmVNZXRhLCBwcmljZXMsIDEpKSB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnVpbGRCdXR0b24oXCJhbXBoaXRoZWF0cmVcIiwgMCk7XG4gICAgICAgIGlmICghaXNOaWwoYnV0dG9uPy5tb2RlbCkpIHtcbiAgICAgICAgICBidXR0b24uY29udHJvbGxlci5zZWxsSW50ZXJuYWwoYnV0dG9uLm1vZGVsLCAwLCBmYWxzZSk7XG4gICAgICAgICAgYW1waGl0aGVhdHJlTWV0YS5vbiA9IDA7XG4gICAgICAgICAgYW1waGl0aGVhdHJlTWV0YS52YWwgPSAwO1xuICAgICAgICAgIGFtcGhpdGhlYXRyZU1ldGEuc3RhZ2UgPSAxO1xuXG4gICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwidXBncmFkZS5idWlsZGluZy5hbXBoaXRoZWF0cmVcIiwgW10sIFwia3MtdXBncmFkZVwiKTtcblxuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS51aT8ucmVuZGVyKCk7XG4gICAgICAgICAgdGhpcy5idWlsZChcImFtcGhpdGhlYXRyZVwiLCAxLCAxKTtcbiAgICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGF1dG9NaXNjKGNvbnRleHQ6IEZyYW1lQ29udGV4dCkge1xuICAgIC8vIEF1dG8gdHVybiBvbiBzdGVhbXdvcmtzXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MudHVybk9uU3RlYW13b3Jrcy5lbmFibGVkKSB7XG4gICAgICBjb25zdCBzdGVhbXdvcmtzID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInN0ZWFtd29ya3NcIik7XG4gICAgICBpZiAoc3RlYW13b3Jrcy5tZXRhLnZhbCAmJiBzdGVhbXdvcmtzLm1ldGEub24gPT09IDApIHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gbXVzdEV4aXN0KHRoaXMuZ2V0QnVpbGRCdXR0b24oXCJzdGVhbXdvcmtzXCIpKTtcbiAgICAgICAgaWYgKGlzTmlsKGJ1dHRvbi5tb2RlbCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBidXR0b24uY29udHJvbGxlci5vbkFsbChidXR0b24ubW9kZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEF1dG8gdHVybiBvbiBtYWduZXRvc1xuICAgIGlmICh0aGlzLnNldHRpbmdzLnR1cm5Pbk1hZ25ldG9zLmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IG1hZ25ldG9zID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcIm1hZ25ldG9cIik7XG4gICAgICBpZiAobWFnbmV0b3MubWV0YS52YWwgJiYgbWFnbmV0b3MubWV0YS5vbiA8IG1hZ25ldG9zLm1ldGEudmFsKSB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IG11c3RFeGlzdCh0aGlzLmdldEJ1aWxkQnV0dG9uKFwibWFnbmV0b1wiKSk7XG4gICAgICAgIGlmIChpc05pbChidXR0b24ubW9kZWwpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYnV0dG9uLmNvbnRyb2xsZXIub25BbGwoYnV0dG9uLm1vZGVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBdXRvIHR1cm4gb24gcmVhY3RvcnNcbiAgICBpZiAodGhpcy5zZXR0aW5ncy50dXJuT25SZWFjdG9ycy5lbmFibGVkKSB7XG4gICAgICBjb25zdCByZWFjdG9ycyA9IHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJyZWFjdG9yXCIpO1xuICAgICAgaWYgKHJlYWN0b3JzLm1ldGEudmFsICYmIHJlYWN0b3JzLm1ldGEub24gPCByZWFjdG9ycy5tZXRhLnZhbCkge1xuICAgICAgICBjb25zdCBidXR0b24gPSBtdXN0RXhpc3QodGhpcy5nZXRCdWlsZEJ1dHRvbihcInJlYWN0b3JcIikpO1xuICAgICAgICBpZiAoaXNOaWwoYnV0dG9uLm1vZGVsKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1dHRvbi5jb250cm9sbGVyLm9uQWxsKGJ1dHRvbi5tb2RlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgYnVpbGRpbmdzICh1cGdyYWRlcyBvZiBib25maXJlIGl0ZW1zKSBhcmUgZW5hYmxlZC4uLlxuICAgIGlmICh0aGlzLnNldHRpbmdzLnVwZ3JhZGVCdWlsZGluZ3MuZW5hYmxlZCkge1xuICAgICAgdGhpcy5hdXRvVXBncmFkZShjb250ZXh0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5nYXRoZXJDYXRuaXAuZW5hYmxlZCkge1xuICAgICAgdGhpcy5hdXRvR2F0aGVyKCk7XG4gICAgfVxuICB9XG5cbiAgYXV0b0dhdGhlcigpOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IGNsYXNzZXMuZ2FtZS51aS5HYXRoZXJDYXRuaXBCdXR0b25Db250cm9sbGVyKFxuICAgICAgdGhpcy5faG9zdC5nYW1lLFxuICAgICkgYXMgR2F0aGVyQ2F0bmlwQnV0dG9uQ29udHJvbGxlcjtcbiAgICBmb3IgKGxldCBjbGlja3MgPSAwOyBjbGlja3MgPCBNYXRoLmZsb29yKHRoaXMuX2hvc3QuZW5naW5lLnNldHRpbmdzLmludGVydmFsIC8gMjApOyArK2NsaWNrcykge1xuICAgICAgY29udHJvbGxlci5idXlJdGVtKHVuZGVmaW5lZCwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQobmFtZTogQnVpbGRpbmcsIF9zdGFnZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBhbW91bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBhbW91bnRDYWxjdWxhdGVkID0gYW1vdW50O1xuICAgIGNvbnN0IGFtb3VudFRlbXAgPSBhbW91bnRDYWxjdWxhdGVkO1xuICAgIGxldCBsYWJlbDogc3RyaW5nO1xuICAgIGNvbnN0IGl0ZW1NZXRhUmF3ID0gZ2FtZS5nZXRVbmxvY2tCeU5hbWUobmFtZSwgXCJidWlsZGluZ3NcIik7XG4gICAgY29uc3QgbWV0YSA9IG5ldyBjbGFzc2VzLkJ1aWxkaW5nTWV0YShpdGVtTWV0YVJhdykuZ2V0TWV0YSgpO1xuICAgIGlmIChcInN0YWdlc1wiIGluIG1ldGEpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgY2xhc3Nlcy51aS5idG4uU3RhZ2luZ0JsZEJ0bkNvbnRyb2xsZXIoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICAgICkgYXMgU3RhZ2luZ0JsZEJ0bkNvbnRyb2xsZXI8VW5zYWZlQnVpbGRpbmdCdG5Nb2Rlcm5Nb2RlbDxVbnNhZmVTdGFnaW5nQmxkQnV0dG9uT3B0aW9ucz4+O1xuICAgICAgY29uc3QgbW9kZWwgPSBjb250cm9sbGVyLmZldGNoTW9kZWwoe1xuICAgICAgICBidWlsZGluZzogbmFtZSxcbiAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgZGVzY3JpcHRpb246IG11c3RFeGlzdChtZXRhLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgbmFtZTogbXVzdEV4aXN0KG1ldGEubGFiZWwpLFxuICAgICAgICB0d29Sb3c6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBhbW91bnRDYWxjdWxhdGVkID0gdGhpcy5fYnVsa01hbmFnZXIuY29uc3RydWN0KG1vZGVsLCBjb250cm9sbGVyLCBhbW91bnRDYWxjdWxhdGVkKTtcbiAgICAgIGxhYmVsID0gbWV0YS5sYWJlbCA/PyBcIlwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IGNsYXNzZXMudWkuYnRuLkJ1aWxkaW5nQnRuTW9kZXJuQ29udHJvbGxlcihcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLFxuICAgICAgKSBhcyBCdWlsZGluZ0J0bk1vZGVybkNvbnRyb2xsZXI8XG4gICAgICAgIFVuc2FmZUJ1aWxkaW5nQnRuTW9kZXJuTW9kZWw8VW5zYWZlVW5zdGFnZWRCdWlsZGluZ0J1dHRvbk9wdGlvbnM+XG4gICAgICA+O1xuICAgICAgY29uc3QgbW9kZWwgPSBjb250cm9sbGVyLmZldGNoTW9kZWwoe1xuICAgICAgICBidWlsZGluZzogbmFtZSxcbiAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgZGVzY3JpcHRpb246IG11c3RFeGlzdChtZXRhLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgbmFtZTogbXVzdEV4aXN0KG1ldGEubGFiZWwpLFxuICAgICAgICB0d29Sb3c6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBhbW91bnRDYWxjdWxhdGVkID0gdGhpcy5fYnVsa01hbmFnZXIuY29uc3RydWN0KG1vZGVsLCBjb250cm9sbGVyLCBhbW91bnRDYWxjdWxhdGVkKTtcbiAgICAgIGxhYmVsID0gbWV0YS5sYWJlbCA/PyBcIlwiO1xuICAgIH1cblxuICAgIGlmIChhbW91bnRDYWxjdWxhdGVkICE9PSBhbW91bnRUZW1wKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIC4uLmNsKGAke2xhYmVsfSBBbW91bnQgb3JkZXJlZDogJHthbW91bnRUZW1wfSBBbW91bnQgQ29uc3RydWN0ZWQ6ICR7YW1vdW50Q2FsY3VsYXRlZH1gKSxcbiAgICAgICk7XG4gICAgICAvLyBCYWlsIG91dCB0byBub3QgZmxvb2QgdGhlIGxvZyB3aXRoIGdhcmJhZ2UuXG4gICAgICBpZiAoYW1vdW50Q2FsY3VsYXRlZCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShsYWJlbCwgYW1vdW50Q2FsY3VsYXRlZCwgXCJidWlsZFwiKTtcblxuICAgIGlmIChhbW91bnRDYWxjdWxhdGVkID09PSAxKSB7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJhY3QuYnVpbGRcIiwgW2xhYmVsXSwgXCJrcy1idWlsZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFxuICAgICAgICBcImFjdC5idWlsZHNcIixcbiAgICAgICAgW2xhYmVsLCB0aGlzLl9ob3N0LnJlbmRlckFic29sdXRlKGFtb3VudENhbGN1bGF0ZWQpXSxcbiAgICAgICAgXCJrcy1idWlsZFwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRCdWlsZExhYmVsKG1ldGE6IFVuc2FmZUJ1aWxkaW5nLCBzdGFnZT86IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIG1ldGEuc3RhZ2VzICYmICFpc05pbChzdGFnZSkgPyBtZXRhLnN0YWdlc1tzdGFnZV0ubGFiZWwgOiBtdXN0RXhpc3QobWV0YS5sYWJlbCk7XG4gIH1cblxuICBnZXRCdWlsZChuYW1lOiBCdWlsZGluZyk6IEJ1aWxkaW5nTWV0YTxSZXF1aXJlZDxVbnNhZmVCdWlsZGluZz4+IHtcbiAgICByZXR1cm4gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChuYW1lKSBhcyBCdWlsZGluZ01ldGE8UmVxdWlyZWQ8VW5zYWZlQnVpbGRpbmc+PjtcbiAgfVxuXG4gIGdldEJ1aWxkQnV0dG9uKG5hbWU6IEJ1aWxkaW5nLCBzdGFnZSA9IDApIHtcbiAgICBjb25zdCBtZXRhUmF3ID0gZ2FtZS5ibGQuZ2V0KG5hbWUpO1xuICAgIGNvbnN0IGJ1aWxkaW5nTWV0YSA9IChcbiAgICAgIG5ldyBjbGFzc2VzLkJ1aWxkaW5nTWV0YShtZXRhUmF3KSBhcyBCdWlsZGluZ01ldGE8VW5zYWZlQnVpbGRpbmc+XG4gICAgKS5nZXRNZXRhKCk7XG4gICAgY29uc3QgbWV0YSA9ICFpc05pbChidWlsZGluZ01ldGEuc3RhZ2VzKSA/IGJ1aWxkaW5nTWV0YS5zdGFnZXNbc3RhZ2VdIDogbWV0YVJhdztcbiAgICBjb25zdCBjb250cm9sbGVyID1cbiAgICAgIFwic3RhZ2VzXCIgaW4gbWV0YVxuICAgICAgICA/IChuZXcgY2xhc3Nlcy51aS5idG4uU3RhZ2luZ0JsZEJ0bkNvbnRyb2xsZXIoXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUsXG4gICAgICAgICAgKSBhcyBTdGFnaW5nQmxkQnRuQ29udHJvbGxlcjxVbnNhZmVCdWlsZGluZ0J0bk1vZGVybk1vZGVsPilcbiAgICAgICAgOiAobmV3IGNsYXNzZXMudWkuYnRuLkJ1aWxkaW5nQnRuTW9kZXJuQ29udHJvbGxlcihcbiAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICAgICAgICApIGFzIEJ1aWxkaW5nQnRuTW9kZXJuQ29udHJvbGxlcjxVbnNhZmVCdWlsZGluZ0J0bk1vZGVybk1vZGVsPik7XG4gICAgY29uc3QgbW9kZWwgPSBjb250cm9sbGVyLmZldGNoTW9kZWwoe1xuICAgICAgYnVpbGRpbmc6IG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YS5kZXNjcmlwdGlvbixcbiAgICAgIGtleTogbmFtZSxcbiAgICAgIG5hbWU6IG1ldGEubGFiZWwsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgY29udHJvbGxlciwgbW9kZWwgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4uL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB7IHJvdW5kVG9Ud28sIHVjZmlyc3QgfSBmcm9tIFwiLi4vdG9vbHMvRm9ybWF0LmpzXCI7XG5cbi8qKlxuICogVGhlIGRpZmZlcmVudCBzZWN0aW9ucyBvZiB0aGUgc3VtbWFyeS5cbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZpdHlTdW1tYXJ5U2VjdGlvbiA9XG4gIHwgXCJidWlsZFwiXG4gIHwgXCJjcmFmdFwiXG4gIHwgXCJmYWl0aFwiXG4gIHwgXCJvdGhlclwiXG4gIHwgXCJyZWZpbmVcIlxuICB8IFwicmVzZWFyY2hcIlxuICB8IFwidHJhZGVcIlxuICB8IFwidXBncmFkZVwiO1xuXG4vKipcbiAqIEFjdGl2aXRpZXMgdGhhdCBhcmUgbG9nZ2VkIGluIHRoZSBcIm90aGVyXCIgc2VjdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZpdHlTZWN0aW9uT3RoZXIgPVxuICB8IFwiYWNjZWxlcmF0ZVwiXG4gIHwgXCJhZG9yZVwiXG4gIHwgXCJkaXN0cmlidXRlXCJcbiAgfCBcImVtYmFzc3lcIlxuICB8IFwiZmVlZFwiXG4gIHwgXCJmZXN0aXZhbFwiXG4gIHwgXCJmaXguY3J5XCJcbiAgfCBcImh1bnRcIlxuICB8IFwicHJhaXNlXCJcbiAgfCBcInByb21vdGVcIlxuICB8IFwic3RhcnNcIlxuICB8IFwidHJhbnNjZW5kXCI7XG5cbmV4cG9ydCB0eXBlIEFjdGl2aXR5ID1cbiAgfCBcImFjY2VsZXJhdGVcIlxuICB8IFwiYWRvcmVcIlxuICB8IFwiYnVpbGRcIlxuICB8IFwiY3JhZnRcIlxuICB8IFwiZGlzdHJpYnV0ZVwiXG4gIHwgXCJmYWl0aFwiXG4gIHwgXCJmZXN0aXZhbFwiXG4gIHwgXCJmaXhDcnlcIlxuICB8IFwiaHVudFwiXG4gIHwgXCJwcmFpc2VcIlxuICB8IFwicHJvbW90ZVwiXG4gIHwgXCJyZXNlYXJjaFwiXG4gIHwgXCJzdGFyXCJcbiAgfCBcInRpbWVTa2lwXCJcbiAgfCBcInRyYWRlXCJcbiAgfCBcInRyYW5zY2VuZFwiXG4gIHwgXCJ1cGdyYWRlXCI7XG5leHBvcnQgdHlwZSBBY3Rpdml0eUNsYXNzID0gYGtzLSR7QWN0aXZpdHl9YDtcbmV4cG9ydCB0eXBlIEFjdGl2aXR5VHlwZUNsYXNzID0gYHR5cGVfJHtBY3Rpdml0eUNsYXNzfWA7XG5cbmV4cG9ydCBjbGFzcyBBY3Rpdml0eVN1bW1hcnkge1xuICBwcml2YXRlIHJlYWRvbmx5IF9ob3N0OiBLaXR0ZW5TY2llbnRpc3RzO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF5IGF0IHdoaWNoIHRoZSBhY3Rpdml0eSBzdW1tYXJ5IHdhcyBsYXN0IHJlc2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBfbGFzdGRheTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgeWVhciBhdCB3aGljaCB0aGUgYWN0aXZpdHkgc3VtbWFyeSB3YXMgbGFzdCByZXNldC5cbiAgICovXG4gIHByaXZhdGUgX2xhc3R5ZWFyOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRpdmlkdWFsIHNlY3Rpb25zL2NhdGVnb3JpZXMgb2YgdGhlIGFjdGl2aXR5IHN1bW1hcnkuXG4gICAqL1xuICBwcml2YXRlIF9zZWN0aW9ucyA9IG5ldyBNYXA8QWN0aXZpdHlTdW1tYXJ5U2VjdGlvbiwgTWFwPHN0cmluZywgbnVtYmVyPj4oKTtcblxuICBjb25zdHJ1Y3Rvcihob3N0OiBLaXR0ZW5TY2llbnRpc3RzKSB7XG4gICAgdGhpcy5faG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5yZXNldEFjdGl2aXR5KCk7XG4gIH1cblxuICByZXNldEFjdGl2aXR5KCk6IHZvaWQge1xuICAgIHRoaXMuX3NlY3Rpb25zID0gbmV3IE1hcDxBY3Rpdml0eVN1bW1hcnlTZWN0aW9uLCBNYXA8c3RyaW5nLCBudW1iZXI+PigpO1xuICAgIHRoaXMuX2xhc3RkYXkgPSB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZGF5O1xuICAgIHRoaXMuX2xhc3R5ZWFyID0gdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLnllYXI7XG4gIH1cblxuICBzdG9yZUFjdGl2aXR5KG5hbWU6IHN0cmluZywgYW1vdW50ID0gMSwgc2VjdGlvbjogQWN0aXZpdHlTdW1tYXJ5U2VjdGlvbiA9IFwib3RoZXJcIik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc2VjdGlvbnMuaGFzKHNlY3Rpb24pKSB7XG4gICAgICB0aGlzLl9zZWN0aW9ucy5zZXQoc2VjdGlvbiwgbmV3IE1hcDxBY3Rpdml0eVNlY3Rpb25PdGhlciwgbnVtYmVyPigpKTtcbiAgICB9XG4gICAgY29uc3Qgc3VtbWFyeVNlY3Rpb24gPSBtdXN0RXhpc3QodGhpcy5fc2VjdGlvbnMuZ2V0KHNlY3Rpb24pKTtcblxuICAgIGlmICghc3VtbWFyeVNlY3Rpb24uaGFzKG5hbWUpKSB7XG4gICAgICBzdW1tYXJ5U2VjdGlvbi5zZXQobmFtZSwgMCk7XG4gICAgfVxuICAgIHN1bW1hcnlTZWN0aW9uLnNldChuYW1lLCBtdXN0RXhpc3Qoc3VtbWFyeVNlY3Rpb24uZ2V0KG5hbWUpKSArIGFtb3VudCk7XG4gIH1cblxuICByZW5kZXJTdW1tYXJ5KCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGNvbnN0IHN1bW1hcnkgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgLy8gVW5jYXRlZ29yaXplZCBpdGVtcy5cbiAgICBpZiAodGhpcy5fc2VjdGlvbnMuaGFzKFwib3RoZXJcIikpIHtcbiAgICAgIGNvbnN0IHNlY3Rpb24gPSBtdXN0RXhpc3QodGhpcy5fc2VjdGlvbnMuZ2V0KFwib3RoZXJcIikpIGFzIE1hcDxBY3Rpdml0eVNlY3Rpb25PdGhlciwgbnVtYmVyPjtcbiAgICAgIHNlY3Rpb24uZm9yRWFjaCgoYW1vdW50LCBuYW1lKSA9PlxuICAgICAgICBzdW1tYXJ5LnB1c2goXG4gICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaTE4bihgc3VtbWFyeS4ke25hbWV9YCBhcyBjb25zdCwgW1xuICAgICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dChhbW91bnQpLFxuICAgICAgICAgIF0pLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUZWNobm9sb2dpZXMuXG4gICAgaWYgKHRoaXMuX3NlY3Rpb25zLmhhcyhcInJlc2VhcmNoXCIpKSB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gbXVzdEV4aXN0KHRoaXMuX3NlY3Rpb25zLmdldChcInJlc2VhcmNoXCIpKTtcbiAgICAgIHNlY3Rpb24uZm9yRWFjaCgoX2Ftb3VudCwgbmFtZSkgPT4ge1xuICAgICAgICBzdW1tYXJ5LnB1c2godGhpcy5faG9zdC5lbmdpbmUuaTE4bihcInN1bW1hcnkudGVjaFwiLCBbdWNmaXJzdChuYW1lKV0pKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFVwZ3JhZGVzLlxuICAgIGlmICh0aGlzLl9zZWN0aW9ucy5oYXMoXCJ1cGdyYWRlXCIpKSB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gbXVzdEV4aXN0KHRoaXMuX3NlY3Rpb25zLmdldChcInVwZ3JhZGVcIikpO1xuICAgICAgc2VjdGlvbi5mb3JFYWNoKChfYW1vdW50LCBuYW1lKSA9PiB7XG4gICAgICAgIHN1bW1hcnkucHVzaCh0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwic3VtbWFyeS51cGdyYWRlXCIsIFt1Y2ZpcnN0KG5hbWUpXSkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVXBncmFkZXMuXG4gICAgaWYgKHRoaXMuX3NlY3Rpb25zLmhhcyhcImJ1aWxkXCIpKSB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gbXVzdEV4aXN0KHRoaXMuX3NlY3Rpb25zLmdldChcImJ1aWxkXCIpKTtcbiAgICAgIHNlY3Rpb24uZm9yRWFjaCgoYW1vdW50LCBuYW1lKSA9PiB7XG4gICAgICAgIHN1bW1hcnkucHVzaChcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwic3VtbWFyeS5idWlsZGluZ1wiLCBbXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RGlzcGxheVZhbHVlRXh0KGFtb3VudCksXG4gICAgICAgICAgICB1Y2ZpcnN0KG5hbWUpLFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gWmlnZ3VyYXRzXG4gICAgaWYgKHRoaXMuX3NlY3Rpb25zLmhhcyhcInJlZmluZVwiKSkge1xuICAgICAgY29uc3Qgc2VjdGlvbiA9IG11c3RFeGlzdCh0aGlzLl9zZWN0aW9ucy5nZXQoXCJyZWZpbmVcIikpO1xuICAgICAgc2VjdGlvbi5mb3JFYWNoKChhbW91bnQsIG5hbWUpID0+IHtcbiAgICAgICAgc3VtbWFyeS5wdXNoKFxuICAgICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmkxOG4oXCJzdW1tYXJ5LnJlZmluZVwiLCBbXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RGlzcGxheVZhbHVlRXh0KGFtb3VudCksXG4gICAgICAgICAgICB1Y2ZpcnN0KG5hbWUpLFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIE9yZGVyIG9mIHRoZSBzdW4uXG4gICAgaWYgKHRoaXMuX3NlY3Rpb25zLmhhcyhcImZhaXRoXCIpKSB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gbXVzdEV4aXN0KHRoaXMuX3NlY3Rpb25zLmdldChcImZhaXRoXCIpKTtcbiAgICAgIHNlY3Rpb24uZm9yRWFjaCgoYW1vdW50LCBuYW1lKSA9PiB7XG4gICAgICAgIHN1bW1hcnkucHVzaChcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwic3VtbWFyeS5zdW5cIiwgW1xuICAgICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dChhbW91bnQpLFxuICAgICAgICAgICAgdWNmaXJzdChuYW1lKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENyYWZ0cy5cbiAgICBpZiAodGhpcy5fc2VjdGlvbnMuaGFzKFwiY3JhZnRcIikpIHtcbiAgICAgIGNvbnN0IHNlY3Rpb24gPSBtdXN0RXhpc3QodGhpcy5fc2VjdGlvbnMuZ2V0KFwiY3JhZnRcIikpO1xuICAgICAgc2VjdGlvbi5mb3JFYWNoKChhbW91bnQsIG5hbWUpID0+IHtcbiAgICAgICAgc3VtbWFyeS5wdXNoKFxuICAgICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmkxOG4oXCJzdW1tYXJ5LmNyYWZ0XCIsIFtcbiAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQoYW1vdW50KSxcbiAgICAgICAgICAgIHVjZmlyc3QobmFtZSksXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUcmFkZXMuXG4gICAgaWYgKHRoaXMuX3NlY3Rpb25zLmhhcyhcInRyYWRlXCIpKSB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gbXVzdEV4aXN0KHRoaXMuX3NlY3Rpb25zLmdldChcInRyYWRlXCIpKTtcbiAgICAgIHNlY3Rpb24uZm9yRWFjaCgoYW1vdW50LCBuYW1lKSA9PiB7XG4gICAgICAgIHN1bW1hcnkucHVzaChcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwic3VtbWFyeS50cmFkZVwiLCBbXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RGlzcGxheVZhbHVlRXh0KGFtb3VudCksXG4gICAgICAgICAgICB1Y2ZpcnN0KG5hbWUpLFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xhc3RkYXkgJiYgdGhpcy5fbGFzdHllYXIpIHtcbiAgICAgIGxldCB5ZWFycyA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci55ZWFyIC0gdGhpcy5fbGFzdHllYXI7XG4gICAgICBsZXQgZGF5cyA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5kYXkgLSB0aGlzLl9sYXN0ZGF5O1xuXG4gICAgICBpZiAoZGF5cyA8IDApIHtcbiAgICAgICAgeWVhcnMgLT0gMTtcbiAgICAgICAgZGF5cyArPSA0MDA7XG4gICAgICB9XG5cbiAgICAgIGxldCBkdXJhdGlvbiA9IFwiXCI7XG4gICAgICBpZiAoeWVhcnMgPiAwKSB7XG4gICAgICAgIGR1cmF0aW9uICs9IGAke3llYXJzfSBgO1xuICAgICAgICBkdXJhdGlvbiArPVxuICAgICAgICAgIHllYXJzID09PSAxXG4gICAgICAgICAgICA/IHRoaXMuX2hvc3QuZW5naW5lLmkxOG4oXCJzdW1tYXJ5LnllYXJcIilcbiAgICAgICAgICAgIDogdGhpcy5faG9zdC5lbmdpbmUuaTE4bihcInN1bW1hcnkueWVhcnNcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXlzID49IDApIHtcbiAgICAgICAgaWYgKHllYXJzID4gMCkgZHVyYXRpb24gKz0gdGhpcy5faG9zdC5lbmdpbmUuaTE4bihcInN1bW1hcnkuc2VwYXJhdG9yXCIpO1xuICAgICAgICBkdXJhdGlvbiArPSBgJHtyb3VuZFRvVHdvKGRheXMpfSBgO1xuICAgICAgICBkdXJhdGlvbiArPVxuICAgICAgICAgIGRheXMgPT09IDFcbiAgICAgICAgICAgID8gdGhpcy5faG9zdC5lbmdpbmUuaTE4bihcInN1bW1hcnkuZGF5XCIpXG4gICAgICAgICAgICA6IHRoaXMuX2hvc3QuZW5naW5lLmkxOG4oXCJzdW1tYXJ5LmRheXNcIik7XG4gICAgICB9XG5cbiAgICAgIHN1bW1hcnkucHVzaCh0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwic3VtbWFyeS5oZWFkXCIsIFtkdXJhdGlvbl0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VtbWFyeTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgRmFpdGhJdGVtLFxuICBSZWxpZ2lvblVwZ3JhZGVzLFxuICBUcmFuc2NlbmRlbmNlVXBncmFkZXMsXG4gIHR5cGUgVW5pY29ybkl0ZW0sXG4gIFVuaWNvcm5JdGVtVmFyaWFudCxcbiAgdHlwZSBaaWdndXJhdFVwZ3JhZGUsXG4gIFppZ2d1cmF0VXBncmFkZXMsXG59IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZywgU2V0dGluZ1RocmVzaG9sZCwgU2V0dGluZ1RyaWdnZXIsIFNldHRpbmdUcmlnZ2VyTWF4IH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFJlbGlnaW9uU2V0dGluZ3NJdGVtIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXJNYXgge1xuICByZWFkb25seSAjYnVpbGRpbmc6IEZhaXRoSXRlbSB8IFVuaWNvcm5JdGVtO1xuICByZWFkb25seSAjdmFyaWFudDogVW5pY29ybkl0ZW1WYXJpYW50O1xuXG4gIGdldCBidWlsZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jYnVpbGRpbmc7XG4gIH1cbiAgZ2V0IHZhcmlhbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3ZhcmlhbnQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihidWlsZGluZzogRmFpdGhJdGVtIHwgVW5pY29ybkl0ZW0sIHZhcmlhbnQ6IFVuaWNvcm5JdGVtVmFyaWFudCwgZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy4jYnVpbGRpbmcgPSBidWlsZGluZztcbiAgICB0aGlzLiN2YXJpYW50ID0gdmFyaWFudDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSZWxpZ2lvblNldHRpbmdzSXRlbXMgPSBSZWNvcmQ8RmFpdGhJdGVtIHwgVW5pY29ybkl0ZW0sIFJlbGlnaW9uU2V0dGluZ3NJdGVtPjtcblxuZXhwb3J0IGNsYXNzIFJlbGlnaW9uU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nVHJpZ2dlciB7XG4gIGJ1aWxkaW5nczogUmVsaWdpb25TZXR0aW5nc0l0ZW1zO1xuXG4gIC8qKlxuICAgKiBCdWlsZCBiZXN0IHVuaWNvcm4gYnVpbGRpbmcgZmlyc3QuXG4gICAqL1xuICBiZXN0VW5pY29ybkJ1aWxkaW5nOiBTZXR0aW5nO1xuXG4gIGJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50OiBaaWdndXJhdFVwZ3JhZGUgfCBcInVuaWNvcm5QYXN0dXJlXCIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTYWNyaWZpY2UgYWxpY29ybnMgZm9yIHRpbWUgY3J5c3RhbHMuXG4gICAqL1xuICBzYWNyaWZpY2VBbGljb3JuczogU2V0dGluZ1RocmVzaG9sZDtcblxuICAvKipcbiAgICogU2FjcmlmaWNlIHVuaWNvcm5zIGZvciB0ZWFycy5cbiAgICovXG4gIHNhY3JpZmljZVVuaWNvcm5zOiBTZXR0aW5nVGhyZXNob2xkO1xuXG4gIC8qKlxuICAgKiBSZWZpbmUgdGVhcnMgaW50byBCTFMuXG4gICAqL1xuICByZWZpbmVUZWFyczogU2V0dGluZ1RocmVzaG9sZDtcblxuICAvKipcbiAgICogUmVmaW5lIHRpbWUgY3J5c3RhbHMgaW50byByZWxpY3MuXG4gICAqL1xuICByZWZpbmVUaW1lQ3J5c3RhbHM6IFNldHRpbmdUaHJlc2hvbGQ7XG5cbiAgLyoqXG4gICAqIFByYWlzZSB0aGUgc3VuLlxuICAgKi9cbiAgYXV0b1ByYWlzZTogU2V0dGluZ1RyaWdnZXI7XG5cbiAgLyoqXG4gICAqIEFkb3JlIHRoZSBnYWxheHkuXG4gICAqL1xuICBhZG9yZTogU2V0dGluZ1RyaWdnZXI7XG5cbiAgLyoqXG4gICAqIFRyYW5zY2VuZC5cbiAgICovXG4gIHRyYW5zY2VuZDogU2V0dGluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbmFibGVkID0gZmFsc2UsXG4gICAgdHJpZ2dlciA9IC0xLFxuICAgIGJlc3RVbmljb3JuQnVpbGRpbmcgPSBuZXcgU2V0dGluZygpLFxuICAgIHNhY3JpZmljZUFsaWNvcm5zID0gbmV3IFNldHRpbmdUaHJlc2hvbGQoZmFsc2UsIC0xKSxcbiAgICBzYWNyaWZpY2VVbmljb3JucyA9IG5ldyBTZXR0aW5nVGhyZXNob2xkKGZhbHNlLCAtMSksXG4gICAgcmVmaW5lVGVhcnMgPSBuZXcgU2V0dGluZ1RocmVzaG9sZChmYWxzZSwgLTEpLFxuICAgIHJlZmluZVRpbWVDcnlzdGFscyA9IG5ldyBTZXR0aW5nVGhyZXNob2xkKGZhbHNlLCAtMSksXG4gICAgYXV0b1ByYWlzZSA9IG5ldyBTZXR0aW5nVHJpZ2dlcihmYWxzZSwgMSksXG4gICAgYWRvcmUgPSBuZXcgU2V0dGluZ1RyaWdnZXIoZmFsc2UsIDEpLFxuICAgIHRyYW5zY2VuZCA9IG5ldyBTZXR0aW5nKCksXG4gICkge1xuICAgIHN1cGVyKGVuYWJsZWQsIHRyaWdnZXIpO1xuICAgIHRoaXMuYnVpbGRpbmdzID0gdGhpcy5pbml0QnVpbGRpbmdzKCk7XG4gICAgdGhpcy5iZXN0VW5pY29ybkJ1aWxkaW5nID0gYmVzdFVuaWNvcm5CdWlsZGluZztcbiAgICB0aGlzLnNhY3JpZmljZUFsaWNvcm5zID0gc2FjcmlmaWNlQWxpY29ybnM7XG4gICAgdGhpcy5zYWNyaWZpY2VVbmljb3JucyA9IHNhY3JpZmljZVVuaWNvcm5zO1xuICAgIHRoaXMucmVmaW5lVGVhcnMgPSByZWZpbmVUZWFycztcbiAgICB0aGlzLnJlZmluZVRpbWVDcnlzdGFscyA9IHJlZmluZVRpbWVDcnlzdGFscztcbiAgICB0aGlzLmF1dG9QcmFpc2UgPSBhdXRvUHJhaXNlO1xuICAgIHRoaXMuYWRvcmUgPSBhZG9yZTtcbiAgICB0aGlzLnRyYW5zY2VuZCA9IHRyYW5zY2VuZDtcbiAgICB0aGlzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEJ1aWxkaW5ncygpOiBSZWxpZ2lvblNldHRpbmdzSXRlbXMge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgUmVsaWdpb25TZXR0aW5nc0l0ZW1zO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBSZWxpZ2lvblVwZ3JhZGVzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBSZWxpZ2lvblNldHRpbmdzSXRlbShpdGVtLCBVbmljb3JuSXRlbVZhcmlhbnQuT3JkZXJPZlRoZVN1bik7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBUcmFuc2NlbmRlbmNlVXBncmFkZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlbGlnaW9uU2V0dGluZ3NJdGVtKGl0ZW0sIFVuaWNvcm5JdGVtVmFyaWFudC5DcnlwdG90aGVvbG9neSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBaaWdndXJhdFVwZ3JhZGVzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBSZWxpZ2lvblNldHRpbmdzSXRlbShpdGVtLCBVbmljb3JuSXRlbVZhcmlhbnQuWmlnZ3VyYXQpO1xuICAgIH1cbiAgICBpdGVtcy51bmljb3JuUGFzdHVyZSA9IG5ldyBSZWxpZ2lvblNldHRpbmdzSXRlbShcbiAgICAgIFwidW5pY29yblBhc3R1cmVcIixcbiAgICAgIFVuaWNvcm5JdGVtVmFyaWFudC5Vbmljb3JuUGFzdHVyZSxcbiAgICApO1xuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8UmVsaWdpb25TZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLmJ1aWxkaW5ncywgc2V0dGluZ3MuYnVpbGRpbmdzLCAoYnVpbGRpbmcsIGl0ZW0pID0+IHtcbiAgICAgIGJ1aWxkaW5nLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IGJ1aWxkaW5nLmVuYWJsZWQ7XG4gICAgICBidWlsZGluZy5tYXggPSBpdGVtPy5tYXggPz8gYnVpbGRpbmcubWF4O1xuICAgICAgYnVpbGRpbmcudHJpZ2dlciA9IGl0ZW0/LnRyaWdnZXIgPz8gYnVpbGRpbmcudHJpZ2dlcjtcbiAgICB9KTtcblxuICAgIHRoaXMuYmVzdFVuaWNvcm5CdWlsZGluZy5sb2FkKHNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmcpO1xuICAgIHRoaXMuc2FjcmlmaWNlQWxpY29ybnMubG9hZChzZXR0aW5ncy5zYWNyaWZpY2VBbGljb3Jucyk7XG4gICAgdGhpcy5zYWNyaWZpY2VVbmljb3Jucy5sb2FkKHNldHRpbmdzLnNhY3JpZmljZVVuaWNvcm5zKTtcbiAgICB0aGlzLnJlZmluZVRlYXJzLmxvYWQoc2V0dGluZ3MucmVmaW5lVGVhcnMpO1xuICAgIHRoaXMucmVmaW5lVGltZUNyeXN0YWxzLmxvYWQoc2V0dGluZ3MucmVmaW5lVGltZUNyeXN0YWxzKTtcbiAgICB0aGlzLmF1dG9QcmFpc2UubG9hZChzZXR0aW5ncy5hdXRvUHJhaXNlKTtcbiAgICB0aGlzLmFkb3JlLmxvYWQoc2V0dGluZ3MuYWRvcmUpO1xuICAgIHRoaXMudHJhbnNjZW5kLmxvYWQoc2V0dGluZ3MudHJhbnNjZW5kKTtcbiAgICB0aGlzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50ID1cbiAgICAgIHNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50ID8/IHRoaXMuYmVzdFVuaWNvcm5CdWlsZGluZ0N1cnJlbnQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsLCBtdXN0RXhpc3QgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBJbnZhbGlkT3BlcmF0aW9uRXJyb3IgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2Vycm9ycy9JbnZhbGlkT3BlcmF0aW9uRXJyb3IuanNcIjtcbmltcG9ydCB0eXBlIHsgQm9uZmlyZU1hbmFnZXIgfSBmcm9tIFwiLi9Cb25maXJlTWFuYWdlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRvbWF0aW9uLCBGcmFtZUNvbnRleHQgfSBmcm9tIFwiLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEJ1bGtQdXJjaGFzZUhlbHBlciB9IGZyb20gXCIuL2hlbHBlci9CdWxrUHVyY2hhc2VIZWxwZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgS2l0dGVuU2NpZW50aXN0cyB9IGZyb20gXCIuL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB7IEJvbmZpcmVCdWlsZGluZ1NldHRpbmcgfSBmcm9tIFwiLi9zZXR0aW5ncy9Cb25maXJlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFJlbGlnaW9uU2V0dGluZ3MsIHR5cGUgUmVsaWdpb25TZXR0aW5nc0l0ZW0gfSBmcm9tIFwiLi9zZXR0aW5ncy9SZWxpZ2lvblNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUYWJNYW5hZ2VyIH0gZnJvbSBcIi4vVGFiTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgbmVnYXRpdmVPbmVUb0luZmluaXR5IH0gZnJvbSBcIi4vdG9vbHMvRm9ybWF0LmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBGYWl0aEl0ZW0sXG4gIHR5cGUgUmVsaWdpb25JdGVtLFxuICB0eXBlIFJlbGlnaW9uVXBncmFkZSxcbiAgdHlwZSBUcmFuc2NlbmRlbmNlVXBncmFkZSxcbiAgdHlwZSBVbmljb3JuSXRlbSxcbiAgVW5pY29ybkl0ZW1zLFxuICBVbmljb3JuSXRlbVZhcmlhbnQsXG4gIHR5cGUgWmlnZ3VyYXRVcGdyYWRlLFxufSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBDcnlwdG90aGVvbG9neVBhbmVsLFxuICBDcnlwdG90aGVvbG9neVdHVCxcbiAgUmVsaWdpb25CdG5Db250cm9sbGVyLFxuICBSZWxpZ2lvblRhYixcbiAgVHJhbnNjZW5kZW5jZUJ0bkNvbnRyb2xsZXIsXG4gIFRyYW5zZm9ybUJ0bkNvbnRyb2xsZXIsXG4gIFVuc2FmZVJlbGlnaW9uVXBncmFkZSxcbiAgVW5zYWZlVHJhbnNjZW5kZW5jZUJ0bk1vZGVsLFxuICBVbnNhZmVUcmFuc2NlbmRlbmNlQnV0dG9uT3B0aW9ucyxcbiAgVW5zYWZlVHJhbnNjZW5kZW5jZVVwZ3JhZGUsXG4gIFVuc2FmZVRyYW5zZm9ybUJ0bk1vZGVsLFxuICBVbnNhZmVaaWdndXJhdFVwZ3JhZGUsXG4gIFppZ2d1cmF0QnRuQ29udHJvbGxlcixcbn0gZnJvbSBcIi4vdHlwZXMvcmVsaWdpb24uanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3Nob3BNYW5hZ2VyIH0gZnJvbSBcIi4vV29ya3Nob3BNYW5hZ2VyLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZWxpZ2lvbk1hbmFnZXIgaW1wbGVtZW50cyBBdXRvbWF0aW9uIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogS2l0dGVuU2NpZW50aXN0cztcbiAgcmVhZG9ubHkgc2V0dGluZ3M6IFJlbGlnaW9uU2V0dGluZ3M7XG4gIHJlYWRvbmx5IG1hbmFnZXI6IFRhYk1hbmFnZXI8UmVsaWdpb25UYWI+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9idWxrTWFuYWdlcjogQnVsa1B1cmNoYXNlSGVscGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9ib25maXJlTWFuYWdlcjogQm9uZmlyZU1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEtpdHRlblNjaWVudGlzdHMsXG4gICAgYm9uZmlyZU1hbmFnZXI6IEJvbmZpcmVNYW5hZ2VyLFxuICAgIHdvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyLFxuICAgIHNldHRpbmdzID0gbmV3IFJlbGlnaW9uU2V0dGluZ3MoKSxcbiAgKSB7XG4gICAgdGhpcy5faG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMubWFuYWdlciA9IG5ldyBUYWJNYW5hZ2VyKHRoaXMuX2hvc3QsIFwiUmVsaWdpb25cIik7XG4gICAgdGhpcy5fd29ya3Nob3BNYW5hZ2VyID0gd29ya3Nob3BNYW5hZ2VyO1xuICAgIHRoaXMuX2J1bGtNYW5hZ2VyID0gbmV3IEJ1bGtQdXJjaGFzZUhlbHBlcih0aGlzLl9ob3N0LCB0aGlzLl93b3Jrc2hvcE1hbmFnZXIpO1xuICAgIHRoaXMuX2JvbmZpcmVNYW5hZ2VyID0gYm9uZmlyZU1hbmFnZXI7XG4gIH1cblxuICBhc3luYyB0aWNrKGNvbnRleHQ6IEZyYW1lQ29udGV4dCkge1xuICAgIGlmICghdGhpcy5zZXR0aW5ncy5lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2UgbXVzdCBjYWxsIGAucmVuZGVyKClgIGhlcmUsIGJlY2F1c2UgZXZhbHVhdGlvbiBvZiBhdmFpbGFiaWxpdHkgb2Ygb3VyIG9wdGlvbnNcbiAgICAvLyBpcyBvbmx5IHBlcmZvcm1lZCB3aGVuIHRoZSBnYW1lIHJlbmRlcnMgdGhlIGNvbnRlbnRzIG9mIHRoYXQgdGFiLlxuICAgIHRoaXMubWFuYWdlci5yZW5kZXIoKTtcblxuICAgIHRoaXMuX2F1dG9CdWlsZChjb250ZXh0KTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnNhY3JpZmljZVVuaWNvcm5zLmVuYWJsZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2F1dG9TYWNyaWZpY2VVbmljb3JucygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnNhY3JpZmljZUFsaWNvcm5zLmVuYWJsZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2F1dG9TYWNyaWZpY2VBbGljb3Jucyhjb250ZXh0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5yZWZpbmVUZWFycy5lbmFibGVkKSB7XG4gICAgICB0aGlzLl9hdXRvVGVhcnMoY29udGV4dCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MucmVmaW5lVGltZUNyeXN0YWxzLmVuYWJsZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2F1dG9UQ3MoY29udGV4dCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYXV0b1RBUCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXV0b0J1aWxkKGNvbnRleHQ6IEZyYW1lQ29udGV4dCkge1xuICAgIGlmICh0aGlzLnNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmcuZW5hYmxlZCkge1xuICAgICAgdGhpcy5fYnVpbGRCZXN0VW5pY29ybkJ1aWxkaW5nKCk7XG4gICAgICB0aGlzLl9idWlsZE5vblVuaWNvcm5CdWlsZGluZ3MoY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgbGlzdCBvZiBidWlsZHMsIGV4Y2x1ZGluZyB0aGUgdW5pY29ybiBwYXN0dXJlLlxuICAgICAgLy8gVGhlIHVuaWNvcm4gcGFzdHVyZSByZXF1aXJlcyBhIHNwZWNpYWwgYnVpbGQgcGF0aCwgYmVjYXVzZSBpdCdzIHJlYWxseVxuICAgICAgLy8gYSBib25maXJlIGJ1aWxkaW5nLlxuICAgICAgY29uc3QgYnVpbGRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLnNldHRpbmdzLmJ1aWxkaW5ncykuZmlsdGVyKFxuICAgICAgICAgIChbLCBidWlsZGluZ10pID0+IGJ1aWxkaW5nLnZhcmlhbnQgIT09IFVuaWNvcm5JdGVtVmFyaWFudC5Vbmljb3JuUGFzdHVyZSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICAvLyBCdWlsZCBhIHVuaWNvcm4gcGFzdHVyZSBpZiBwb3NzaWJsZS5cbiAgICAgIGNvbnN0IG1heFBhc3R1cmVzID0gbmVnYXRpdmVPbmVUb0luZmluaXR5KHRoaXMuc2V0dGluZ3MuYnVpbGRpbmdzLnVuaWNvcm5QYXN0dXJlLm1heCk7XG4gICAgICBjb25zdCBtZXRhID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInVuaWNvcm5QYXN0dXJlXCIpLm1ldGE7XG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5idWlsZGluZ3MudW5pY29yblBhc3R1cmUuZW5hYmxlZCAmJiBtZXRhLnZhbCA8IG1heFBhc3R1cmVzKSB7XG4gICAgICAgIHRoaXMuX2JvbmZpcmVNYW5hZ2VyLmF1dG9CdWlsZChjb250ZXh0LCB7XG4gICAgICAgICAgdW5pY29yblBhc3R1cmU6IG5ldyBCb25maXJlQnVpbGRpbmdTZXR0aW5nKFxuICAgICAgICAgICAgXCJ1bmljb3JuUGFzdHVyZVwiLFxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5idWlsZGluZ3MudW5pY29yblBhc3R1cmUuZW5hYmxlZCxcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuYnVpbGRpbmdzLnVuaWNvcm5QYXN0dXJlLnRyaWdnZXIsXG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLmJ1aWxkaW5ncy51bmljb3JuUGFzdHVyZS5tYXgsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBBbmQgdGhlbiB3ZSBidWlsZCBhbGwgb3RoZXIgcG9zc2libGUgcmVsaWdpb24gYnVpbGRpbmdzLlxuICAgICAgdGhpcy5fYnVpbGRSZWxpZ2lvbkJ1aWxkaW5ncyhjb250ZXh0LCBidWlsZHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkQmVzdFVuaWNvcm5CdWlsZGluZygpIHtcbiAgICBjb25zdCBiZXN0VW5pY29ybkJ1aWxkaW5nID0gdGhpcy5nZXRCZXN0VW5pY29ybkJ1aWxkaW5nKCk7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuYmVzdFVuaWNvcm5CdWlsZGluZ0N1cnJlbnQgIT09IGJlc3RVbmljb3JuQnVpbGRpbmcpIHtcbiAgICAgIHRoaXMuc2V0dGluZ3MuYmVzdFVuaWNvcm5CdWlsZGluZ0N1cnJlbnQgPSBiZXN0VW5pY29ybkJ1aWxkaW5nO1xuICAgICAgdGhpcy5faG9zdC5yZWZyZXNoRW50aXJlVXNlckludGVyZmFjZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjdGlvblRyaWdnZXIgPSB0aGlzLnNldHRpbmdzLnRyaWdnZXI7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5iZXN0VW5pY29ybkJ1aWxkaW5nQ3VycmVudCA9PT0gXCJ1bmljb3JuUGFzdHVyZVwiKSB7XG4gICAgICB0aGlzLl9ib25maXJlTWFuYWdlci5idWlsZCh0aGlzLnNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50LCAwLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnVpbGRpbmdCdXR0b24gPSB0aGlzLl9nZXRCdWlsZEJ1dHRvbihcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5iZXN0VW5pY29ybkJ1aWxkaW5nQ3VycmVudCxcbiAgICAgICAgVW5pY29ybkl0ZW1WYXJpYW50LlppZ2d1cmF0LFxuICAgICAgKTtcbiAgICAgIGlmIChpc05pbChidWlsZGluZ0J1dHRvbj8ubW9kZWwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IHRlYXJzTmVlZGVkID0gMDtcbiAgICAgIGNvbnN0IHByaWNlVGVhcnMgPSBtdXN0RXhpc3QoYnVpbGRpbmdCdXR0b24ubW9kZWwucHJpY2VzKS5maW5kKFxuICAgICAgICBzdWJqZWN0ID0+IHN1YmplY3QubmFtZSA9PT0gXCJ0ZWFyc1wiLFxuICAgICAgKTtcbiAgICAgIGlmICghaXNOaWwocHJpY2VUZWFycykpIHtcbiAgICAgICAgdGVhcnNOZWVkZWQgPSBwcmljZVRlYXJzLnZhbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGVhcnNBdmFpbGFibGVGb3JVc2UgPVxuICAgICAgICB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWUoXCJ0ZWFyc1wiKSAtIHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRTdG9jayhcInRlYXJzXCIpO1xuXG4gICAgICBpZiAoIWlzTmlsKHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvblRhYi5zYWNyaWZpY2VCdG4pICYmIHRlYXJzQXZhaWxhYmxlRm9yVXNlIDwgdGVhcnNOZWVkZWQpIHtcbiAgICAgICAgLy8gaWYgbm8gemlnZ3VyYXQsIGdldEJlc3RVbmljb3JuQnVpbGRpbmcgd2lsbCByZXR1cm4gdW5pY29yblBhc3R1cmVcbiAgICAgICAgLy8gVE9ETzog4pidIFllYWguIFNvP1xuXG4gICAgICAgIC8vIEhvdyBtYW55IHRpbWVzIGNhbiB3ZSBzYWNyaWZpY2UgdW5pY29ybnMgdG8gbWFrZSB0ZWFycz9cbiAgICAgICAgY29uc3QgbWF4U2FjcmlmaWNlID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAodGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlKFwidW5pY29ybnNcIikgLVxuICAgICAgICAgICAgdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFN0b2NrKFwidW5pY29ybnNcIikpIC9cbiAgICAgICAgICAgIDI1MDAsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSG93IG1hbnkgc2FjcmlmaWNlcyB3b3VsZCB3ZSBuZWVkLCBzbyB3ZSdkIGVuZCB1cCB3aXRoIGVub3VnaCB0ZWFycy5cbiAgICAgICAgY29uc3QgbmVlZFNhY3JpZmljZSA9IE1hdGguY2VpbChcbiAgICAgICAgICAodGVhcnNOZWVkZWQgLSB0ZWFyc0F2YWlsYWJsZUZvclVzZSkgL1xuICAgICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInppZ2d1cmF0XCIpLm1ldGEub24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2FjcmlmaWNlIHNvbWUgdW5pY29ybnMgdG8gZ2V0IHRoZSB0ZWFycyB0byBidXkgdGhlIGJ1aWxkaW5nLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgbmVlZFNhY3JpZmljZSA8IG1heFNhY3JpZmljZSAmJlxuICAgICAgICAgICFpc05pbCh0aGlzLl9ob3N0LmdhbWUucmVsaWdpb25UYWIuc2FjcmlmaWNlQnRuLm1vZGVsKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb25UYWIuc2FjcmlmaWNlQnRuPy5jb250cm9sbGVyPy5fdHJhbnNmb3JtKFxuICAgICAgICAgICAgdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uVGFiLnNhY3JpZmljZUJ0bi5tb2RlbCxcbiAgICAgICAgICAgIG5lZWRTYWNyaWZpY2UsXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBpYWN0aXZpdHk/XG4gICAgICAgICAgLy8gVE9ETzog4pidIFllYWgsIHNlZW1zIGxpa2UgYSBnb29kIGlkZWEuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm90IGVub3VnaCB1bmljb3JucyB0byBzYWNyaWZpY2UgdG8gbWFrZSBlbm91Z2ggdGVhcnMuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExldCB0aGUgQnVsa01hbmFnZXIgZmlndXJlIG91dCBpZiB0aGUgYnVpbGQgY2FuIGJlIG1hZGUuXG4gICAgICBjb25zdCBidWlsZFJlcXVlc3QgPSB7XG4gICAgICAgIFt0aGlzLnNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50XTpcbiAgICAgICAgICB0aGlzLnNldHRpbmdzLmJ1aWxkaW5nc1t0aGlzLnNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50XSxcbiAgICAgIH07XG4gICAgICBjb25zdCBidWlsZCA9IHRoaXMuX2J1bGtNYW5hZ2VyLmJ1bGsoXG4gICAgICAgIGJ1aWxkUmVxdWVzdCxcbiAgICAgICAgdGhpcy5nZXRCdWlsZE1ldGFEYXRhKGJ1aWxkUmVxdWVzdCksXG4gICAgICAgIHNlY3Rpb25UcmlnZ2VyLFxuICAgICAgICBcIlJlbGlnaW9uXCIsXG4gICAgICApO1xuICAgICAgaWYgKDAgPCBidWlsZC5sZW5ndGggJiYgMCA8IGJ1aWxkWzBdLmNvdW50KSB7XG4gICAgICAgIC8vIFdlIGZvcmNlIG9ubHkgYnVpbGRpbmcgMSBvZiB0aGUgYmVzdCB1bmljb3JuIGJ1aWxkaW5nLCBiZWNhdXNlXG4gICAgICAgIC8vIGFmdGVyd2FyZHMgdGhlIGJlc3QgdW5pY29ybiBidWlsZGluZyBpcyBsaWtlbHkgZ29pbmcgdG8gY2hhbmdlLlxuICAgICAgICB0aGlzLmJ1aWxkKHRoaXMuc2V0dGluZ3MuYmVzdFVuaWNvcm5CdWlsZGluZ0N1cnJlbnQsIFVuaWNvcm5JdGVtVmFyaWFudC5aaWdndXJhdCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgX2J1aWxkTm9uVW5pY29ybkJ1aWxkaW5ncyhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBjb25zdCBhbHJlYWR5SGFuZGxlZDogQXJyYXk8RmFpdGhJdGVtIHwgVW5pY29ybkl0ZW0+ID0gWy4uLlVuaWNvcm5JdGVtc107XG4gICAgY29uc3QgYnVpbGRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5zZXR0aW5ncy5idWlsZGluZ3MpLmZpbHRlcihcbiAgICAgICAgKFssIGJ1aWxkaW5nXSkgPT4gIWFscmVhZHlIYW5kbGVkLmluY2x1ZGVzKGJ1aWxkaW5nLmJ1aWxkaW5nKSxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLl9idWlsZFJlbGlnaW9uQnVpbGRpbmdzKGNvbnRleHQsIGJ1aWxkcyk7XG4gIH1cblxuICBwcml2YXRlIF9idWlsZFJlbGlnaW9uQnVpbGRpbmdzKFxuICAgIGNvbnRleHQ6IEZyYW1lQ29udGV4dCxcbiAgICBidWlsZHM6IFBhcnRpYWw8UmVjb3JkPEZhaXRoSXRlbSwgUmVsaWdpb25TZXR0aW5nc0l0ZW0+PixcbiAgKTogdm9pZCB7XG4gICAgLy8gUmVuZGVyIHRoZSB0YWIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1dHRvbnMgYWN0dWFsbHkgZXhpc3QgaW4gdGhlIERPTS4gT3RoZXJ3aXNlIHdlIGNhbid0IGNsaWNrIHRoZW0uXG4gICAgdGhpcy5tYW5hZ2VyLnJlbmRlcigpO1xuXG4gICAgY29uc3QgbWV0YURhdGE6IFBhcnRpYWw8XG4gICAgICBSZWNvcmQ8XG4gICAgICAgIEZhaXRoSXRlbSxcbiAgICAgICAgUmVxdWlyZWQ8VW5zYWZlUmVsaWdpb25VcGdyYWRlIHwgVW5zYWZlVHJhbnNjZW5kZW5jZVVwZ3JhZGUgfCBVbnNhZmVaaWdndXJhdFVwZ3JhZGU+XG4gICAgICA+XG4gICAgPiA9IHRoaXMuZ2V0QnVpbGRNZXRhRGF0YShidWlsZHMpO1xuICAgIGNvbnN0IHNlY3Rpb25UcmlnZ2VyID0gdGhpcy5zZXR0aW5ncy50cmlnZ2VyO1xuXG4gICAgLy8gTGV0IHRoZSBidWxrIG1hbmFnZXIgZmlndXJlIG91dCB3aGljaCBvZiB0aGUgYnVpbGRzIHRvIGFjdHVhbGx5IGJ1aWxkLlxuICAgIGNvbnN0IGJ1aWxkTGlzdCA9IHRoaXMuX2J1bGtNYW5hZ2VyLmJ1bGsoYnVpbGRzLCBtZXRhRGF0YSwgc2VjdGlvblRyaWdnZXIsIFwiUmVsaWdpb25cIik7XG5cbiAgICBmb3IgKGNvbnN0IGJ1aWxkIG9mIGJ1aWxkTGlzdCkge1xuICAgICAgaWYgKDAgPCBidWlsZC5jb3VudCkge1xuICAgICAgICB0aGlzLmJ1aWxkKFxuICAgICAgICAgIGJ1aWxkLmlkIGFzIFJlbGlnaW9uSXRlbSB8IFwidW5pY29yblBhc3R1cmVcIixcbiAgICAgICAgICBtdXN0RXhpc3QoYnVpbGQudmFyaWFudCkgYXMgVW5pY29ybkl0ZW1WYXJpYW50LFxuICAgICAgICAgIGJ1aWxkLmNvdW50LFxuICAgICAgICApO1xuICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHRoZSBiZXN0IHVuaWNvcm4tcmVsYXRlZCBidWlsZGluZyB0byBidXkgbmV4dC5cbiAgICogVGhpcyBpcyB0aGUgYnVpbGRpbmcgd2hlcmUgdGhlIGNvc3QgaXMgaW4gdGhlIGJlc3QgcHJvcG9ydGlvbiB0byB0aGVcbiAgICogdW5pY29ybiBwcm9kdWN0aW9uIGJvbnVzIGl0IGdlbmVyYXRlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vQmlvbmljbGVnZW5pdXMvTnVtbW9uQ2FsYy9ibG9iLzExMmY3MTZlMmZkZTk5NTZkZmU1MjAwMjFiMDQwMGNiYTdiNzExM2UvTnVtbW9uQ2FsYy5qcyNMNDkwXG4gICAqIEByZXR1cm5zIFRoZSBiZXN0IHVuaWNvcm4gYnVpbGRpbmcuXG4gICAqL1xuICBnZXRCZXN0VW5pY29ybkJ1aWxkaW5nKCk6IFppZ2d1cmF0VXBncmFkZSB8IFwidW5pY29yblBhc3R1cmVcIiB8IG51bGwge1xuICAgIGNvbnN0IHBhc3R1cmVCdXR0b24gPSB0aGlzLl9ib25maXJlTWFuYWdlci5nZXRCdWlsZEJ1dHRvbihcInVuaWNvcm5QYXN0dXJlXCIpO1xuICAgIGlmIChwYXN0dXJlQnV0dG9uID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZEJ1aWxkaW5nczogQXJyYXk8WmlnZ3VyYXRVcGdyYWRlIHwgXCJ1bmljb3JuUGFzdHVyZVwiPiA9IFsuLi5Vbmljb3JuSXRlbXNdLmZpbHRlcihcbiAgICAgIGl0ZW0gPT4gaXRlbSAhPT0gXCJ1bmljb3JuUGFzdHVyZVwiLFxuICAgICk7XG5cbiAgICAvLyBIb3cgbWFueSB1bmljb3JucyBhcmUgcHJvZHVjZWQgcGVyIHNlY29uZC5cbiAgICBjb25zdCB1bmljb3Juc1BlclNlY29uZEJhc2UgPVxuICAgICAgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInVuaWNvcm5zUGVyVGlja0Jhc2VcIikgKiB0aGlzLl9ob3N0LmdhbWUuZ2V0VGlja3NQZXJTZWNvbmRVSSgpO1xuICAgIC8vIFVuaWNvcm4gcmF0aW8gbW9kaWZpZXIuIEZvciBleGFtcGxlLCB0aHJvdWdoIFwidW5pY29ybiBzZWxlY3Rpb25cIi5cbiAgICBjb25zdCBnbG9iYWxSYXRpbyA9IHRoaXMuX2hvc3QuZ2FtZS5nZXRFZmZlY3QoXCJ1bmljb3Juc0dsb2JhbFJhdGlvXCIpICsgMTtcbiAgICAvLyBUaGUgdW5pY29ybiByYXRpbyBtb2RpZmllciB0aHJvdWdoIHJlbGlnaW9uIGJ1aWxkaW5ncy5cbiAgICBjb25zdCByZWxpZ2lvblJhdGlvID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInVuaWNvcm5zUmF0aW9SZWxpZ2lvblwiKSArIDE7XG4gICAgLy8gVGhlIHJhdGlvIG1vZGlmaWVyIHRocm91Z2ggcGFyYWdvbi5cbiAgICBjb25zdCBwYXJhZ29uUmF0aW8gPSB0aGlzLl9ob3N0LmdhbWUucHJlc3RpZ2UuZ2V0UGFyYWdvblByb2R1Y3Rpb25SYXRpbygpICsgMTtcbiAgICAvLyBCb251cyBmcm9tIGNvbGxlY3RlZCBmYWl0aC5cbiAgICBjb25zdCBmYWl0aEJvbnVzID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFNvbGFyUmV2b2x1dGlvblJhdGlvKCkgKyAxO1xuXG4gICAgY29uc3QgY3VycmVudEN5Y2xlSW5kZXggPSB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuY3ljbGU7XG4gICAgY29uc3QgY3VycmVudEN5Y2xlID0gdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLmN5Y2xlc1tjdXJyZW50Q3ljbGVJbmRleF07XG5cbiAgICAvLyBUaGUgbW9kaWZpZXIgYXBwbGllZCBieSB0aGUgY3VycmVudCBjeWNsZSBhbmQgaG9sZGluZyBhIGZlc3RpdmFsLlxuICAgIGxldCBjeWNsZUJvbnVzID0gMTtcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjeWNsZSBoYXMgYW4gZWZmZWN0IG9uIHVuaWNvcm4gcHJvZHVjdGlvbiBkdXJpbmcgZmVzdGl2YWxzXG4gICAgLy8gVE9ETzogU2ltcGxpZnlcbiAgICBpZiAoY3VycmVudEN5Y2xlLmZlc3RpdmFsRWZmZWN0cy51bmljb3JucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBOdW1lcm9tYW5jeSBpcyB0aGUgbWV0YXBoeXNpY3MgdXBncmFkZSB0aGF0IGdyYW50cyBib251c2VzIGJhc2VkIG9uIGN5Y2xlcy5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLnByZXN0aWdlLmdldFBlcmsoXCJudW1lcm9tYW5jeVwiKS5yZXNlYXJjaGVkICYmXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5mZXN0aXZhbERheXNcbiAgICAgICkge1xuICAgICAgICBjeWNsZUJvbnVzID0gY3VycmVudEN5Y2xlLmZlc3RpdmFsRWZmZWN0cy51bmljb3JucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB1bmljb3Juc1BlclNlY29uZCA9XG4gICAgICB1bmljb3Juc1BlclNlY29uZEJhc2UgKiBnbG9iYWxSYXRpbyAqIHJlbGlnaW9uUmF0aW8gKiBwYXJhZ29uUmF0aW8gKiBmYWl0aEJvbnVzICogY3ljbGVCb251cztcblxuICAgIC8vIEJhc2VkIG9uIGhvdyBtYW55IHppZ2d1cmF0cyB3ZSBoYXZlLlxuICAgIGNvbnN0IHppZ2d1cmF0UmF0aW8gPSBNYXRoLm1heCh0aGlzLl9ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KFwiemlnZ3VyYXRcIikubWV0YS5vbiwgMSk7XG4gICAgLy8gSG93IG1hbnkgdW5pY29ybnMgZG8gd2UgcmVjZWl2ZSBpbiBhIHVuaWNvcm4gcmlmdD9cbiAgICBjb25zdCBiYXNlVW5pY29ybnNQZXJSaWZ0ID1cbiAgICAgIDUwMCAqICgxICsgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInVuaWNvcm5zUmF0aW9SZWxpZ2lvblwiKSAqIDAuMSk7XG5cbiAgICAvLyBIb3cgbGlrZWx5IGFyZSB1bmljb3JuIHJpZnRzIHRvIGhhcHBlbj8gVGhlIHVuaWNvcm5tYW5jeSBtZXRhcGh5c2ljcyB1cGdyYWRlIGluY3JlYXNlcyB0aGlzIGNoYW5jZS5cbiAgICBsZXQgcmlmdENoYW5jZVJhdGlvID0gMTtcbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLnByZXN0aWdlLmdldFBlcmsoXCJ1bmljb3JubWFuY3lcIikucmVzZWFyY2hlZCkge1xuICAgICAgcmlmdENoYW5jZVJhdGlvICo9IDEuMTtcbiAgICB9XG4gICAgLy8gP1xuICAgIGNvbnN0IHVuaWNvcm5SaWZ0Q2hhbmdlID1cbiAgICAgICgodGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInJpZnRDaGFuY2VcIikgKiByaWZ0Q2hhbmNlUmF0aW8pIC8gKDEwMDAwICogMikpICpcbiAgICAgIGJhc2VVbmljb3Juc1BlclJpZnQ7XG5cbiAgICAvLyBXZSBub3cgd2FudCB0byBkZXRlcm1pbmUgaG93IHF1aWNrbHkgdGhlIGNvc3Qgb2YgZ2l2ZW4gYnVpbGRpbmcgaXMgbmV1dHJhbGl6ZWRcbiAgICAvLyBieSBpdHMgZWZmZWN0IG9uIHByb2R1Y3Rpb24gb2YgdW5pY29ybnMuXG5cbiAgICBsZXQgYmVzdEFtb3J0aXphdGlvbiA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICBsZXQgYmVzdEJ1aWxkaW5nOiBaaWdndXJhdFVwZ3JhZGUgfCBcInVuaWNvcm5QYXN0dXJlXCIgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCB1bmljb3Juc1BlclRpY2tCYXNlID0gbXVzdEV4aXN0KFxuICAgICAgdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInVuaWNvcm5QYXN0dXJlXCIpLm1ldGEuZWZmZWN0cz8udW5pY29ybnNQZXJUaWNrQmFzZSxcbiAgICApO1xuICAgIGNvbnN0IHBhc3R1cmVQcm9kdWN0aW9uID1cbiAgICAgIHVuaWNvcm5zUGVyVGlja0Jhc2UgKlxuICAgICAgdGhpcy5faG9zdC5nYW1lLmdldFRpY2tzUGVyU2Vjb25kVUkoKSAqXG4gICAgICBnbG9iYWxSYXRpbyAqXG4gICAgICByZWxpZ2lvblJhdGlvICpcbiAgICAgIHBhcmFnb25SYXRpbyAqXG4gICAgICBmYWl0aEJvbnVzICpcbiAgICAgIGN5Y2xlQm9udXM7XG5cbiAgICAvLyBJZiB0aGUgdW5pY29ybiBwYXN0dXJlIGFtb3J0aXplcyBpdHNlbGYgaW4gbGVzcyB0aGFuIGluZmluaXR5IHRpY2tzLFxuICAgIC8vIHNldCBpdCBhcyB0aGUgZGVmYXVsdC4gVGhpcyBpcyBsaWtlbHkgdG8gcHJvdGVjdCBhZ2FpbnN0IGNhc2VzIHdoZXJlXG4gICAgLy8gcHJvZHVjdGlvbiBvZiB1bmljb3JucyBpcyAwLlxuICAgIGNvbnN0IHBhc3R1cmVBbW9ydGl6YXRpb24gPSBtdXN0RXhpc3QocGFzdHVyZUJ1dHRvbi5tb2RlbD8ucHJpY2VzKVswXS52YWwgLyBwYXN0dXJlUHJvZHVjdGlvbjtcbiAgICBpZiAocGFzdHVyZUFtb3J0aXphdGlvbiA8IGJlc3RBbW9ydGl6YXRpb24pIHtcbiAgICAgIGJlc3RBbW9ydGl6YXRpb24gPSBwYXN0dXJlQW1vcnRpemF0aW9uO1xuICAgICAgYmVzdEJ1aWxkaW5nID0gXCJ1bmljb3JuUGFzdHVyZVwiO1xuICAgIH1cblxuICAgIC8vIEZvciBhbGwgemlnZ3VyYXQgdXBncmFkZSBidXR0b25zLi4uXG4gICAgZm9yIChjb25zdCBidXR0b24gb2YgdGhpcy5tYW5hZ2VyLnRhYi56Z1VwZ3JhZGVCdXR0b25zKSB7XG4gICAgICAvLyAuLi50aGF0IGFyZSBpbiB0aGUgXCJ2YWxpZFwiIGJ1aWxkaW5ncyAoYXJlIHVuaWNvcm4tcmVsYXRlZCkgYW5kIHZpc2libGUgKHVubG9ja2VkKS4uLlxuICAgICAgaWYgKHZhbGlkQnVpbGRpbmdzLmluY2x1ZGVzKGJ1dHRvbi5pZCkgJiYgYnV0dG9uLm1vZGVsLnZpc2libGUpIHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGEgcHJpY2UgdmFsdWUgZm9yIHRoaXMgYnVpbGRpbmcuXG4gICAgICAgIGxldCB1bmljb3JuUHJpY2UgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHByaWNlIG9mIG11c3RFeGlzdChidXR0b24ubW9kZWwucHJpY2VzKSkge1xuICAgICAgICAgIC8vIEFkZCB0aGUgYW1vdW50IG9mIHVuaWNvcm5zIHRoZSBidWlsZGluZyBjb3N0cyAoaWYgYW55KS5cbiAgICAgICAgICBpZiAocHJpY2UubmFtZSA9PT0gXCJ1bmljb3Juc1wiKSB7XG4gICAgICAgICAgICB1bmljb3JuUHJpY2UgKz0gcHJpY2UudmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUZWFycyByZXN1bHQgZnJvbSB1bmljb3JuIHNhY3JpZmljZXMsIHNvIGZhY3RvciB0aGF0IGludG8gdGhlIHByaWNlIHByb3BvcnRpb25hbGx5LlxuICAgICAgICAgIGlmIChwcmljZS5uYW1lID09PSBcInRlYXJzXCIpIHtcbiAgICAgICAgICAgIHVuaWNvcm5QcmljZSArPSAocHJpY2UudmFsICogMjUwMCkgLyB6aWdndXJhdFJhdGlvO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgZWZmZWN0IHRoZSBidWlsZGluZyB3aWxsIGhhdmUgb24gdW5pY29ybiBwcm9kdWN0aW9uIGFuZCB1bmljb3JuIHJpZnRzLlxuICAgICAgICBjb25zdCBidWlsZGluZ0luZm8gPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFpVKGJ1dHRvbi5pZCkpO1xuICAgICAgICBsZXQgcmVsaWdpb25Cb251cyA9IHJlbGlnaW9uUmF0aW87XG4gICAgICAgIGxldCByaWZ0Q2hhbmNlID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInJpZnRDaGFuY2VcIik7XG4gICAgICAgIGZvciAoY29uc3QgZWZmZWN0IGluIGJ1aWxkaW5nSW5mby5lZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKGVmZmVjdCA9PT0gXCJ1bmljb3Juc1JhdGlvUmVsaWdpb25cIikge1xuICAgICAgICAgICAgcmVsaWdpb25Cb251cyArPSBtdXN0RXhpc3QoYnVpbGRpbmdJbmZvLmVmZmVjdHMudW5pY29ybnNSYXRpb1JlbGlnaW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVmZmVjdCA9PT0gXCJyaWZ0Q2hhbmNlXCIpIHtcbiAgICAgICAgICAgIHJpZnRDaGFuY2UgKz0gbXVzdEV4aXN0KGJ1aWxkaW5nSW5mby5lZmZlY3RzLnJpZnRDaGFuY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSByZXN0IHNob3VsZCBiZSBzdHJhaWdodCBmb3J3YXJkLlxuICAgICAgICBjb25zdCB1bmljb3Juc1BlclJpZnQgPSA1MDAgKiAoKHJlbGlnaW9uQm9udXMgLSAxKSAqIDAuMSArIDEpO1xuICAgICAgICBsZXQgcmlmdEJvbnVzID0gKChyaWZ0Q2hhbmNlICogcmlmdENoYW5jZVJhdGlvKSAvICgxMDAwMCAqIDIpKSAqIHVuaWNvcm5zUGVyUmlmdDtcbiAgICAgICAgcmlmdEJvbnVzIC09IHVuaWNvcm5SaWZ0Q2hhbmdlO1xuICAgICAgICBsZXQgYnVpbGRpbmdQcm9kdWN0aW9uID1cbiAgICAgICAgICB1bmljb3Juc1BlclNlY29uZEJhc2UgKlxuICAgICAgICAgIGdsb2JhbFJhdGlvICpcbiAgICAgICAgICByZWxpZ2lvbkJvbnVzICpcbiAgICAgICAgICBwYXJhZ29uUmF0aW8gKlxuICAgICAgICAgIGZhaXRoQm9udXMgKlxuICAgICAgICAgIGN5Y2xlQm9udXM7XG4gICAgICAgIGJ1aWxkaW5nUHJvZHVjdGlvbiAtPSB1bmljb3Juc1BlclNlY29uZDtcbiAgICAgICAgYnVpbGRpbmdQcm9kdWN0aW9uICs9IHJpZnRCb251cztcbiAgICAgICAgY29uc3QgYW1vcnRpemF0aW9uID0gdW5pY29yblByaWNlIC8gYnVpbGRpbmdQcm9kdWN0aW9uO1xuXG4gICAgICAgIGlmIChhbW9ydGl6YXRpb24gPCBiZXN0QW1vcnRpemF0aW9uKSB7XG4gICAgICAgICAgaWYgKDAgPCByaWZ0Qm9udXMgfHwgKHJlbGlnaW9uUmF0aW8gPCByZWxpZ2lvbkJvbnVzICYmIDAgPCB1bmljb3JuUHJpY2UpKSB7XG4gICAgICAgICAgICBiZXN0QW1vcnRpemF0aW9uID0gYW1vcnRpemF0aW9uO1xuICAgICAgICAgICAgYmVzdEJ1aWxkaW5nID0gYnV0dG9uLmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdEJ1aWxkaW5nO1xuICB9XG5cbiAgYnVpbGQobmFtZTogUmVsaWdpb25JdGVtIHwgXCJ1bmljb3JuUGFzdHVyZVwiLCB2YXJpYW50OiBVbmljb3JuSXRlbVZhcmlhbnQsIGFtb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGFtb3VudENhbGN1bGF0ZWQgPSBhbW91bnQ7XG4gICAgY29uc3QgYW1vdW50VGVtcCA9IGFtb3VudENhbGN1bGF0ZWQ7XG4gICAgbGV0IGxhYmVsOiBzdHJpbmc7XG4gICAgaWYgKHZhcmlhbnQgPT09IFVuaWNvcm5JdGVtVmFyaWFudC5DcnlwdG90aGVvbG9neSkge1xuICAgICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZShuYW1lLCBcInRyYW5zY2VuZGVuY2VVcGdyYWRlc1wiKTtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgY2xhc3Nlcy51aS5UcmFuc2NlbmRlbmNlQnRuQ29udHJvbGxlcihcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLFxuICAgICAgKSBhcyBUcmFuc2NlbmRlbmNlQnRuQ29udHJvbGxlcjxcbiAgICAgICAgVW5zYWZlVHJhbnNjZW5kZW5jZUJ0bk1vZGVsPFVuc2FmZVRyYW5zY2VuZGVuY2VCdXR0b25PcHRpb25zPlxuICAgICAgPjtcbiAgICAgIGNvbnN0IG1vZGVsID0gY29udHJvbGxlci5mZXRjaE1vZGVsKHsgY29udHJvbGxlciwgaWQ6IGl0ZW1NZXRhUmF3Lm5hbWUgfSk7XG4gICAgICBhbW91bnRDYWxjdWxhdGVkID0gdGhpcy5fYnVsa01hbmFnZXIuY29uc3RydWN0KG1vZGVsLCBjb250cm9sbGVyLCBhbW91bnRDYWxjdWxhdGVkKTtcbiAgICAgIGxhYmVsID0gaXRlbU1ldGFSYXcubGFiZWw7XG4gICAgfSBlbHNlIGlmICh2YXJpYW50ID09PSBVbmljb3JuSXRlbVZhcmlhbnQuT3JkZXJPZlRoZVN1bikge1xuICAgICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZShuYW1lLCBcInJlbGlnaW9uXCIpO1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBjb20ubnVjbGVhcnVuaWNvcm4uZ2FtZS51aS5SZWxpZ2lvbkJ0bkNvbnRyb2xsZXIoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICAgICkgYXMgUmVsaWdpb25CdG5Db250cm9sbGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSBjb250cm9sbGVyLmZldGNoTW9kZWwoeyBjb250cm9sbGVyLCBpZDogaXRlbU1ldGFSYXcubmFtZSB9KTtcbiAgICAgIGFtb3VudENhbGN1bGF0ZWQgPSB0aGlzLl9idWxrTWFuYWdlci5jb25zdHJ1Y3QobW9kZWwsIGNvbnRyb2xsZXIsIGFtb3VudENhbGN1bGF0ZWQpO1xuICAgICAgbGFiZWwgPSBpdGVtTWV0YVJhdy5sYWJlbDtcbiAgICB9IGVsc2UgaWYgKHZhcmlhbnQgPT09IFVuaWNvcm5JdGVtVmFyaWFudC5aaWdndXJhdCkge1xuICAgICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZShuYW1lLCBcInppZ2d1cmF0VXBncmFkZXNcIik7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IGNvbS5udWNsZWFydW5pY29ybi5nYW1lLnVpLlppZ2d1cmF0QnRuQ29udHJvbGxlcihcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLFxuICAgICAgKSBhcyBaaWdndXJhdEJ0bkNvbnRyb2xsZXI7XG4gICAgICBjb25zdCBtb2RlbCA9IGNvbnRyb2xsZXIuZmV0Y2hNb2RlbCh7IGNvbnRyb2xsZXIsIGlkOiBpdGVtTWV0YVJhdy5uYW1lIH0pO1xuICAgICAgYW1vdW50Q2FsY3VsYXRlZCA9IHRoaXMuX2J1bGtNYW5hZ2VyLmNvbnN0cnVjdChtb2RlbCwgY29udHJvbGxlciwgYW1vdW50Q2FsY3VsYXRlZCk7XG4gICAgICBsYWJlbCA9IGl0ZW1NZXRhUmF3LmxhYmVsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkVycm9yKFwidW5zdXBwb3J0ZWRcIik7XG4gICAgfVxuXG4gICAgaWYgKGFtb3VudENhbGN1bGF0ZWQgIT09IGFtb3VudFRlbXApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgLi4uY2woYCR7bGFiZWx9IEFtb3VudCBvcmRlcmVkOiAke2Ftb3VudFRlbXB9IEFtb3VudCBDb25zdHJ1Y3RlZDogJHthbW91bnRDYWxjdWxhdGVkfWApLFxuICAgICAgKTtcbiAgICAgIC8vIEJhaWwgb3V0IHRvIG5vdCBmbG9vZCB0aGUgbG9nIHdpdGggZ2FyYmFnZS5cbiAgICAgIGlmIChhbW91bnRDYWxjdWxhdGVkID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFyaWFudCA9PT0gVW5pY29ybkl0ZW1WYXJpYW50Lk9yZGVyT2ZUaGVTdW4pIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShsYWJlbCwgYW1vdW50Q2FsY3VsYXRlZCwgXCJmYWl0aFwiKTtcbiAgICAgIGlmIChhbW91bnRDYWxjdWxhdGVkID09PSAxKSB7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5zdW4uZGlzY292ZXJcIiwgW2xhYmVsXSwgXCJrcy1mYWl0aFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgICBcImFjdC5zdW4uZGlzY292ZXJzXCIsXG4gICAgICAgICAgW2xhYmVsLCB0aGlzLl9ob3N0LnJlbmRlckFic29sdXRlKGFtb3VudENhbGN1bGF0ZWQpXSxcbiAgICAgICAgICBcImtzLWZhaXRoXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShsYWJlbCwgYW1vdW50Q2FsY3VsYXRlZCwgXCJidWlsZFwiKTtcbiAgICAgIGlmIChhbW91bnRDYWxjdWxhdGVkID09PSAxKSB7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5idWlsZFwiLCBbbGFiZWxdLCBcImtzLWJ1aWxkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFxuICAgICAgICAgIFwiYWN0LmJ1aWxkc1wiLFxuICAgICAgICAgIFtsYWJlbCwgdGhpcy5faG9zdC5yZW5kZXJBYnNvbHV0ZShhbW91bnRDYWxjdWxhdGVkKV0sXG4gICAgICAgICAgXCJrcy1idWlsZFwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldEJ1aWxkTWV0YURhdGEoYnVpbGRzOiBQYXJ0aWFsPFJlY29yZDxGYWl0aEl0ZW0sIFJlbGlnaW9uU2V0dGluZ3NJdGVtPj4pIHtcbiAgICBjb25zdCBtZXRhRGF0YTogUGFydGlhbDxcbiAgICAgIFJlY29yZDxcbiAgICAgICAgRmFpdGhJdGVtLFxuICAgICAgICBSZXF1aXJlZDxVbnNhZmVSZWxpZ2lvblVwZ3JhZGUgfCBVbnNhZmVUcmFuc2NlbmRlbmNlVXBncmFkZSB8IFVuc2FmZVppZ2d1cmF0VXBncmFkZT5cbiAgICAgID5cbiAgICA+ID0ge307XG4gICAgZm9yIChjb25zdCBidWlsZCBvZiBPYmplY3QudmFsdWVzKGJ1aWxkcykpIHtcbiAgICAgIGNvbnN0IGJ1aWxkSW5mbyA9IHRoaXMuZ2V0QnVpbGQoYnVpbGQuYnVpbGRpbmcsIGJ1aWxkLnZhcmlhbnQpO1xuICAgICAgaWYgKGJ1aWxkSW5mbyA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1ldGFEYXRhW2J1aWxkLmJ1aWxkaW5nIGFzIEZhaXRoSXRlbV0gPSBidWlsZEluZm87XG4gICAgICBjb25zdCBidWlsZE1ldGFEYXRhID0gbXVzdEV4aXN0KG1ldGFEYXRhW2J1aWxkLmJ1aWxkaW5nIGFzIEZhaXRoSXRlbV0pO1xuXG4gICAgICAvLyBJZiBhbiBpdGVtIGlzIG1hcmtlZCBhcyBgckhpZGRlbmAsIGl0IHdvdWxkbid0IGJlIGJ1aWxkLlxuICAgICAgLy8gVE9ETzogV2h5IG5vdCByZW1vdmUgaXQgZnJvbSB0aGUgYGJ1aWxkc2AgdGhlbj9cbiAgICAgIGlmICghdGhpcy5fZ2V0QnVpbGRCdXR0b24oYnVpbGQuYnVpbGRpbmcsIGJ1aWxkLnZhcmlhbnQpKSB7XG4gICAgICAgIGJ1aWxkTWV0YURhdGEuckhpZGRlbiA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG11c3RFeGlzdCh0aGlzLl9nZXRCdWlsZEJ1dHRvbihidWlsZC5idWlsZGluZywgYnVpbGQudmFyaWFudCkpLm1vZGVsO1xuICAgICAgICBjb25zdCBwYW5lbCA9XG4gICAgICAgICAgYnVpbGQudmFyaWFudCA9PT0gVW5pY29ybkl0ZW1WYXJpYW50LkNyeXB0b3RoZW9sb2d5XG4gICAgICAgICAgICA/IHRoaXMuX2hvc3QuZ2FtZS5zY2llbmNlLmdldChcImNyeXB0b3RoZW9sb2d5XCIpLnJlc2VhcmNoZWRcbiAgICAgICAgICAgIDogdHJ1ZTtcbiAgICAgICAgYnVpbGRNZXRhRGF0YS5ySGlkZGVuID0gIShtb2RlbD8udmlzaWJsZSAmJiBtb2RlbC5lbmFibGVkICYmIHBhbmVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YURhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYW4gdXBncmFkZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHVwZ3JhZGUuXG4gICAqIEBwYXJhbSB2YXJpYW50IFRoZSB2YXJpYW50IG9mIHRoZSB1cGdyYWRlLlxuICAgKiBAcmV0dXJucyBUaGUgYnVpbGQgaW5mb3JtYXRpb24gZm9yIHRoZSB1cGdyYWRlLlxuICAgKi9cbiAgZ2V0QnVpbGQobmFtZTogUmVsaWdpb25JdGVtIHwgXCJ1bmljb3JuUGFzdHVyZVwiLCB2YXJpYW50OiBVbmljb3JuSXRlbVZhcmlhbnQpIHtcbiAgICBzd2l0Y2ggKHZhcmlhbnQpIHtcbiAgICAgIGNhc2UgVW5pY29ybkl0ZW1WYXJpYW50LlppZ2d1cmF0OlxuICAgICAgICByZXR1cm4gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFpVKG5hbWUgYXMgWmlnZ3VyYXRVcGdyYWRlKSA/PyBudWxsO1xuICAgICAgY2FzZSBVbmljb3JuSXRlbVZhcmlhbnQuT3JkZXJPZlRoZVN1bjpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvbi5nZXRSVShuYW1lIGFzIFJlbGlnaW9uVXBncmFkZSkgPz8gbnVsbDtcbiAgICAgIGNhc2UgVW5pY29ybkl0ZW1WYXJpYW50LkNyeXB0b3RoZW9sb2d5OlxuICAgICAgICByZXR1cm4gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFRVKG5hbWUgYXMgVHJhbnNjZW5kZW5jZVVwZ3JhZGUpID8/IG51bGw7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBidWlsZDogJHtuYW1lfSAoJHt2YXJpYW50fSlgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBidXR0b24gdGhhdCBhbGxvd3MgcHVyY2hhc2luZyBhIGdpdmVuIHVwZ3JhZGUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB1cGdyYWRlLlxuICAgKiBAcGFyYW0gdmFyaWFudCBUaGUgdmFyaWFudCBvZiB0aGUgdXBncmFkZS5cbiAgICogQHJldHVybnMgVGhlIGJ1dHRvbiB0byBidXkgdGhlIHVwZ3JhZGUsIG9yIGBudWxsYC5cbiAgICovXG4gIHByaXZhdGUgX2dldEJ1aWxkQnV0dG9uKG5hbWU6IFJlbGlnaW9uSXRlbSB8IFwidW5pY29yblBhc3R1cmVcIiwgdmFyaWFudDogVW5pY29ybkl0ZW1WYXJpYW50KSB7XG4gICAgbGV0IGJ1dHRvbnM6XG4gICAgICB8IHR5cGVvZiB0aGlzLm1hbmFnZXIudGFiLnpnVXBncmFkZUJ1dHRvbnNcbiAgICAgIHwgdHlwZW9mIHRoaXMubWFuYWdlci50YWIuclVwZ3JhZGVCdXR0b25zXG4gICAgICB8IENyeXB0b3RoZW9sb2d5V0dUW1wiY2hpbGRyZW5cIl07XG4gICAgc3dpdGNoICh2YXJpYW50KSB7XG4gICAgICBjYXNlIFVuaWNvcm5JdGVtVmFyaWFudC5aaWdndXJhdDpcbiAgICAgICAgYnV0dG9ucyA9IHRoaXMubWFuYWdlci50YWIuemdVcGdyYWRlQnV0dG9ucztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFVuaWNvcm5JdGVtVmFyaWFudC5PcmRlck9mVGhlU3VuOlxuICAgICAgICBidXR0b25zID0gdGhpcy5tYW5hZ2VyLnRhYi5yVXBncmFkZUJ1dHRvbnM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBVbmljb3JuSXRlbVZhcmlhbnQuQ3J5cHRvdGhlb2xvZ3k6XG4gICAgICAgIGJ1dHRvbnMgPSAodGhpcy5tYW5hZ2VyLnRhYi5jaGlsZHJlblswXSBhcyBDcnlwdG90aGVvbG9neVBhbmVsKS5jaGlsZHJlblswXS5jaGlsZHJlbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFyaWFudCAnJHt2YXJpYW50fSdgKTtcbiAgICB9XG5cbiAgICBpZiAoYnV0dG9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFNlcmllcyBvZiB1cGdyYWRlcyBpcyBub3QgdW5sb2NrZWQgeWV0LlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYnV0dG9uID0gYnV0dG9ucy5maW5kKGJ1dHRvbiA9PiBidXR0b24uaWQgPT09IG5hbWUpID8/IG51bGw7XG5cbiAgICBpZiAoYnV0dG9uID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb3VsZG4ndCBmaW5kIGJ1dHRvbiBmb3IgJHtuYW1lfSEgVGhpcyB3aWxsIGxpa2VseSBjcmVhdGUgcHJvYmxlbXMuYCkpO1xuICAgIH1cblxuICAgIHJldHVybiBidXR0b247XG4gIH1cblxuICBwcml2YXRlIF90cmFuc2Zvcm1CdG5TYWNyaWZpY2VIZWxwZXI8VE1vZGVsIGV4dGVuZHMgVW5zYWZlVHJhbnNmb3JtQnRuTW9kZWw+KFxuICAgIGF2YWlsYWJsZTogbnVtYmVyLFxuICAgIHRvdGFsOiBudW1iZXIsXG4gICAgY29udHJvbGxlcjogVHJhbnNmb3JtQnRuQ29udHJvbGxlcjxUTW9kZWw+LFxuICAgIG1vZGVsOiBUTW9kZWwsXG4gICkge1xuICAgIGNvbnN0IGNvbnZlcnNpb25QZXJjZW50YWdlID0gYXZhaWxhYmxlIC8gdG90YWw7XG4gICAgY29uc3QgcGVyY2VudGFnZUludmVyc2UgPSAxIC8gY29udmVyc2lvblBlcmNlbnRhZ2U7XG5cbiAgICBjb25zdCBjdXN0b21Db250cm9sbGVyID0gbmV3IGNsYXNzZXMudWkucmVsaWdpb24uVHJhbnNmb3JtQnRuQ29udHJvbGxlcihcbiAgICAgIGdhbWUsXG4gICAgICBjb250cm9sbGVyLmNvbnRyb2xsZXJPcHRzLFxuICAgICkgYXMgVHJhbnNmb3JtQnRuQ29udHJvbGxlcjxUTW9kZWwsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcblxuICAgIGNvbnN0IGxpbmsgPSBjdXN0b21Db250cm9sbGVyLl9uZXdMaW5rKG1vZGVsLCBwZXJjZW50YWdlSW52ZXJzZSk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KHJlc29sdmUgPT4ge1xuICAgICAgbGluay5oYW5kbGVyKG5ldyBFdmVudChcImRlY295XCIpLCByZXNvbHZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2F1dG9TYWNyaWZpY2VVbmljb3JucygpIHtcbiAgICBjb25zdCB1bmljb3JucyA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShcInVuaWNvcm5zXCIpO1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcInVuaWNvcm5zXCIpO1xuXG4gICAgaWYgKFxuICAgICAgIWlzTmlsKHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvblRhYi5zYWNyaWZpY2VCdG4pICYmXG4gICAgICBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodGhpcy5zZXR0aW5ncy5zYWNyaWZpY2VVbmljb3Jucy50cmlnZ2VyKSA8PSBhdmFpbGFibGUgJiZcbiAgICAgIG5lZ2F0aXZlT25lVG9JbmZpbml0eSh0aGlzLnNldHRpbmdzLnNhY3JpZmljZVVuaWNvcm5zLnRyaWdnZXIpIDw9IHVuaWNvcm5zLnZhbHVlXG4gICAgKSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uVGFiLnNhY3JpZmljZUJ0bi5jb250cm9sbGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb25UYWIuc2FjcmlmaWNlQnRuLm1vZGVsO1xuXG4gICAgICBpZiAoaXNOaWwobW9kZWwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5fdHJhbnNmb3JtQnRuU2FjcmlmaWNlSGVscGVyKGF2YWlsYWJsZSwgdW5pY29ybnMudmFsdWUsIGNvbnRyb2xsZXIsIG1vZGVsKTtcblxuICAgICAgY29uc3QgYXZhaWxhYmxlTm93ID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKFwidW5pY29ybnNcIik7XG4gICAgICBjb25zdCBjb3N0ID0gYXZhaWxhYmxlIC0gYXZhaWxhYmxlTm93O1xuXG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXG4gICAgICAgIFwiYWN0LnNhY3JpZmljZVVuaWNvcm5zXCIsXG4gICAgICAgIFt0aGlzLl9ob3N0LmdhbWUuZ2V0RGlzcGxheVZhbHVlRXh0KGNvc3QpXSxcbiAgICAgICAgXCJrcy1mYWl0aFwiLFxuICAgICAgKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShcbiAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaTE4bihcIiRyZXNvdXJjZXMudW5pY29ybnMudGl0bGVcIiksXG4gICAgICAgIGNvc3QsXG4gICAgICAgIFwicmVmaW5lXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2F1dG9TYWNyaWZpY2VBbGljb3Jucyhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBjb25zdCBhbGljb3JucyA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShcImFsaWNvcm5cIik7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKFwiYWxpY29yblwiKTtcbiAgICBpZiAoXG4gICAgICAhaXNOaWwodGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uVGFiLnNhY3JpZmljZUFsaWNvcm5zQnRuKSAmJlxuICAgICAgbmVnYXRpdmVPbmVUb0luZmluaXR5KHRoaXMuc2V0dGluZ3Muc2FjcmlmaWNlQWxpY29ybnMudHJpZ2dlcikgPD0gYXZhaWxhYmxlICYmXG4gICAgICBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodGhpcy5zZXR0aW5ncy5zYWNyaWZpY2VBbGljb3Jucy50cmlnZ2VyKSA8PSBhbGljb3Jucy52YWx1ZVxuICAgICkge1xuICAgICAgdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uVGFiLnNhY3JpZmljZUFsaWNvcm5zQnRuLnJlbmRlcigpO1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvblRhYi5zYWNyaWZpY2VBbGljb3Juc0J0bi5jb250cm9sbGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb25UYWIuc2FjcmlmaWNlQWxpY29ybnNCdG4ubW9kZWw7XG5cbiAgICAgIGlmIChpc05pbChtb2RlbCkpIHtcbiAgICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5fdHJhbnNmb3JtQnRuU2FjcmlmaWNlSGVscGVyKGF2YWlsYWJsZSwgYWxpY29ybnMudmFsdWUsIGNvbnRyb2xsZXIsIG1vZGVsKTtcblxuICAgICAgY29uc3QgYXZhaWxhYmxlTm93ID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKFwiYWxpY29yblwiKTtcbiAgICAgIGNvbnN0IGNvc3QgPSBhdmFpbGFibGUgLSBhdmFpbGFibGVOb3c7XG5cbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgXCJhY3Quc2FjcmlmaWNlQWxpY29ybnNcIixcbiAgICAgICAgW3RoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQoY29zdCldLFxuICAgICAgICBcImtzLWZhaXRoXCIsXG4gICAgICApO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFxuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwiJHJlc291cmNlcy5hbGljb3JuLnRpdGxlXCIpLFxuICAgICAgICBjb3N0LFxuICAgICAgICBcInJlZmluZVwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hdXRvVGVhcnMoY29udGV4dDogRnJhbWVDb250ZXh0KSB7XG4gICAgY29uc3QgdGVhcnMgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UoXCJ0ZWFyc1wiKTtcbiAgICBjb25zdCBhdmFpbGFibGUgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUoXCJ0ZWFyc1wiKTtcbiAgICBjb25zdCBzb3Jyb3cgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UoXCJzb3Jyb3dcIik7XG4gICAgaWYgKFxuICAgICAgIWlzTmlsKHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvblRhYi5yZWZpbmVCdG4pICYmXG4gICAgICBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodGhpcy5zZXR0aW5ncy5yZWZpbmVUZWFycy50cmlnZ2VyKSA8PSBhdmFpbGFibGUgJiZcbiAgICAgIG5lZ2F0aXZlT25lVG9JbmZpbml0eSh0aGlzLnNldHRpbmdzLnJlZmluZVRlYXJzLnRyaWdnZXIpIDw9IHRlYXJzLnZhbHVlICYmXG4gICAgICBzb3Jyb3cudmFsdWUgPCBzb3Jyb3cubWF4VmFsdWVcbiAgICApIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZUZvckNvbnZlcnNpb24gPSBhdmFpbGFibGUgLSB0aGlzLnNldHRpbmdzLnJlZmluZVRlYXJzLnRyaWdnZXI7XG5cbiAgICAgIGlmIChhdmFpbGFibGVGb3JDb252ZXJzaW9uIDwgMTAwMDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uVGFiLnJlZmluZUJ0bi5jb250cm9sbGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb25UYWIucmVmaW5lQnRuLm1vZGVsO1xuXG4gICAgICBpZiAoaXNOaWwobW9kZWwpKSB7XG4gICAgICAgIGNvbnRleHQucmVxdWVzdEdhbWVVaVJlZnJlc2ggPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnRyb2xsZXIuYnV5SXRlbShtb2RlbCwgbmV3IEV2ZW50KFwiZGVjb3lcIiksIGF2YWlsYWJsZUZvckNvbnZlcnNpb24pO1xuXG4gICAgICBjb25zdCBhdmFpbGFibGVOb3cgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUoXCJ0ZWFyc1wiKTtcbiAgICAgIGNvbnN0IGNvc3QgPSBhdmFpbGFibGUgLSBhdmFpbGFibGVOb3c7XG5cbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgXCJhY3QucmVmaW5lVGVhcnNcIixcbiAgICAgICAgW3RoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQoY29zdCldLFxuICAgICAgICBcImtzLWZhaXRoXCIsXG4gICAgICApO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFxuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwiJHJlc291cmNlcy50ZWFycy50aXRsZVwiKSxcbiAgICAgICAgY29zdCxcbiAgICAgICAgXCJyZWZpbmVcIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfYXV0b1RDcyhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBjb25zdCB0aW1lQ3J5c3RhbHMgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UoXCJ0aW1lQ3J5c3RhbFwiKTtcbiAgICBjb25zdCBhdmFpbGFibGUgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUoXCJ0aW1lQ3J5c3RhbFwiKTtcbiAgICBpZiAoXG4gICAgICAhaXNOaWwodGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uVGFiLnJlZmluZVRDQnRuKSAmJlxuICAgICAgbmVnYXRpdmVPbmVUb0luZmluaXR5KHRoaXMuc2V0dGluZ3MucmVmaW5lVGltZUNyeXN0YWxzLnRyaWdnZXIpIDw9IGF2YWlsYWJsZSAmJlxuICAgICAgbmVnYXRpdmVPbmVUb0luZmluaXR5KHRoaXMuc2V0dGluZ3MucmVmaW5lVGltZUNyeXN0YWxzLnRyaWdnZXIpIDw9IHRpbWVDcnlzdGFscy52YWx1ZVxuICAgICkge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvblRhYi5yZWZpbmVUQ0J0bi5jb250cm9sbGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb25UYWIucmVmaW5lVENCdG4ubW9kZWw7XG5cbiAgICAgIGlmIChpc05pbChtb2RlbCkpIHtcbiAgICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5fdHJhbnNmb3JtQnRuU2FjcmlmaWNlSGVscGVyKGF2YWlsYWJsZSwgdGltZUNyeXN0YWxzLnZhbHVlLCBjb250cm9sbGVyLCBtb2RlbCk7XG5cbiAgICAgIGNvbnN0IGF2YWlsYWJsZU5vdyA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcInRpbWVDcnlzdGFsXCIpO1xuICAgICAgY29uc3QgY29zdCA9IGF2YWlsYWJsZSAtIGF2YWlsYWJsZU5vdztcblxuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFxuICAgICAgICBcImFjdC5yZWZpbmVUQ3NcIixcbiAgICAgICAgW3RoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQoY29zdCldLFxuICAgICAgICBcImtzLWZhaXRoXCIsXG4gICAgICApO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFxuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwiJHJlc291cmNlcy50aW1lQ3J5c3RhbC50aXRsZVwiKSxcbiAgICAgICAgY29zdCxcbiAgICAgICAgXCJyZWZpbmVcIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXV0b1RBUCgpIHtcbiAgICBjb25zdCBmYWl0aCA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShcImZhaXRoXCIpO1xuICAgIGNvbnN0IGZhaXRoTGV2ZWwgPSBmYWl0aC52YWx1ZSAvIGZhaXRoLm1heFZhbHVlO1xuICAgIC8vIGVub3VnaCBmYWl0aCwgYW5kIHRoZW4gVEFQICh0cmFuc2NlbmQsIGFkb3JlLCBwcmFpc2UpXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MudHJhbnNjZW5kLmVuYWJsZWQgJiYgdGhpcy5zZXR0aW5ncy5hdXRvUHJhaXNlLnRyaWdnZXIgLSAwLjAyIDw9IGZhaXRoTGV2ZWwpIHtcbiAgICAgIHRoaXMuX2F1dG9UcmFuc2NlbmQoKTtcbiAgICB9XG5cbiAgICAvLyBQcmFpc2UgKGZhaXRoIOKGkiB3b3JzaGlwKVxuICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9QcmFpc2UudHJpZ2dlciA8PSBmYWl0aExldmVsKSB7XG4gICAgICAvLyBBZG9yZSB0aGUgZ2FsYXh5ICh3b3JzaGlwIOKGkiBlcGlwaGFueSlcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5hZG9yZS5lbmFibGVkICYmXG4gICAgICAgIG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24uZ2V0UlUoXCJhcG9jcmlwaGFcIikpLm9uXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fYXV0b0Fkb3JlKHRoaXMuc2V0dGluZ3MuYWRvcmUudHJpZ2dlcik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9QcmFpc2UuZW5hYmxlZCkge1xuICAgICAgICB0aGlzLl9hdXRvUHJhaXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXV0b0Fkb3JlKHRyaWdnZXI6IG51bWJlcikge1xuICAgIGNvbnN0IGZhaXRoID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKFwiZmFpdGhcIik7XG5cbiAgICBjb25zdCB3b3JzaGlwID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmZhaXRoO1xuICAgIGNvbnN0IGVwaXBoYW55ID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmZhaXRoUmF0aW87XG4gICAgY29uc3QgdHJhbnNjZW5kZW5jZVJlYWNoZWQgPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFJVKFwidHJhbnNjZW5kZW5jZVwiKSkub247XG4gICAgY29uc3QgdHJhbnNjZW5kZW5jZVRpZXJDdXJyZW50ID0gdHJhbnNjZW5kZW5jZVJlYWNoZWRcbiAgICAgID8gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLnRyYW5zY2VuZGVuY2VUaWVyXG4gICAgICA6IDA7XG4gICAgLy8gZ2FtZSB2ZXJzaW9uOiAxLjQuOC4xXG4gICAgLy8gc29sYXJSZXZvbHV0aW9uTGltaXQgaXMgaW5jcmVhc2VkIGJ5IGJsYWNrIG9iZWxpc2tzLlxuICAgIGNvbnN0IG1heFNvbGFyUmV2b2x1dGlvbiA9IDEwICsgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInNvbGFyUmV2b2x1dGlvbkxpbWl0XCIpO1xuICAgIC8vIFRoZSBhYnNvbHV0ZSB2YWx1ZSBhdCB3aGljaCB0byB0cmlnZ2VyIGFkb3JpbmcgdGhlIGdhbGF4eS5cbiAgICBjb25zdCB0cmlnZ2VyU29sYXJSZXZvbHV0aW9uID0gbWF4U29sYXJSZXZvbHV0aW9uICogdHJpZ2dlcjtcbiAgICAvLyBIb3cgbXVjaCBlcGlwaGFueSB3ZSdsbCBnZXQgZnJvbSBjb252ZXJ0aW5nIG91ciB3b3JzaGlwLlxuICAgIGNvbnN0IGVwaXBoYW55SW5jcmVhc2UgPVxuICAgICAgKHdvcnNoaXAgLyAxMDAwMDAwKSAqIHRyYW5zY2VuZGVuY2VUaWVyQ3VycmVudCAqIHRyYW5zY2VuZGVuY2VUaWVyQ3VycmVudCAqIDEuMDE7XG4gICAgLy8gSG93IG11Y2ggZXBpcGhhbnkgd2UnbGwgaGF2ZSBhZnRlciBhZG9yaW5nLlxuICAgIGNvbnN0IGVwaXBoYW55QWZ0ZXJBZG9yZSA9IGVwaXBoYW55ICsgZXBpcGhhbnlJbmNyZWFzZTtcbiAgICAvLyBIb3cgbXVjaCB3b3JzaGlwIHdlJ2xsIGhhdmUgYWZ0ZXIgYWRvcmluZy5cbiAgICBjb25zdCB3b3JzaGlwQWZ0ZXJBZG9yZSA9XG4gICAgICAwLjAxICsgZmFpdGgudmFsdWUgKiAoMSArIHRoaXMuX2hvc3QuZ2FtZS5nZXRVbmxpbWl0ZWREUihlcGlwaGFueUFmdGVyQWRvcmUsIDAuMSkgKiAwLjEpO1xuICAgIC8vIEhvdyBtdWNoIHNvbGFyIHJldm9sdXRpb24gYm9udXMgd2UnbGwgaGF2ZSBhZnRlciBhZG9yaW5nLlxuICAgIGNvbnN0IHNvbGFyUmV2b2x1dGlvbkFmdGVyQWRvcmUgPSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKFxuICAgICAgdGhpcy5faG9zdC5nYW1lLmdldFVubGltaXRlZERSKHdvcnNoaXBBZnRlckFkb3JlLCAxMDAwKSAvIDEwMCxcbiAgICAgIG1heFNvbGFyUmV2b2x1dGlvbixcbiAgICApO1xuICAgIC8vIEFmdGVyIGFkb3JpbmcgdGhlIGdhbGF4eSwgd2Ugd2FudCBhIHNpbmdsZSBwcmFpc2UgdG8gYmUgYWJsZSB0byByZWFjaCB0aGUgdHJpZ2dlclxuICAgIC8vIGxldmVsIG9mIHNvbGFyIHJldm9sdXRpb24gYm9udXMuXG4gICAgaWYgKHRyaWdnZXJTb2xhclJldm9sdXRpb24gPD0gc29sYXJSZXZvbHV0aW9uQWZ0ZXJBZG9yZSkge1xuICAgICAgLy8gUGVyZm9ybSB0aGUgYWN0dWFsIGFkb3JhdGlvbi5cbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvbi5fcmVzZXRGYWl0aEludGVybmFsKDEuMDEpO1xuXG4gICAgICAvLyBMb2cgdGhlIGFjdGlvbi5cbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgXCJhY3QuYWRvcmVcIixcbiAgICAgICAgW1xuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQod29yc2hpcCksXG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dChlcGlwaGFueUluY3JlYXNlKSxcbiAgICAgICAgXSxcbiAgICAgICAgXCJrcy1hZG9yZVwiLFxuICAgICAgKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShcImFkb3JlXCIsIGVwaXBoYW55SW5jcmVhc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2F1dG9UcmFuc2NlbmQoKSB7XG4gICAgbGV0IGVwaXBoYW55ID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmZhaXRoUmF0aW87XG4gICAgY29uc3QgdHJhbnNjZW5kZW5jZVJlYWNoZWQgPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFJVKFwidHJhbnNjZW5kZW5jZVwiKSkub247XG4gICAgbGV0IHRyYW5zY2VuZGVuY2VUaWVyQ3VycmVudCA9IHRyYW5zY2VuZGVuY2VSZWFjaGVkXG4gICAgICA/IHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvbi50cmFuc2NlbmRlbmNlVGllclxuICAgICAgOiAwO1xuXG4gICAgLy8gVHJhbnNjZW5kXG4gICAgaWYgKHRyYW5zY2VuZGVuY2VSZWFjaGVkKSB7XG4gICAgICAvLyBIb3cgbXVjaCBvdXIgYWRvcmF0aW9uIHJhdGlvIGluY3JlYXNlcyBmcm9tIHRyYW5zY2VuZGluZy5cbiAgICAgIGNvbnN0IGFkb3JlSW5jcmVhc2VSYXRpbyA9XG4gICAgICAgICgodHJhbnNjZW5kZW5jZVRpZXJDdXJyZW50ICsgMikgLyAodHJhbnNjZW5kZW5jZVRpZXJDdXJyZW50ICsgMSkpICoqIDI7XG4gICAgICAvLyBUaGUgYW1vdW50IG9mIHdvcnNoaXAgbmVlZGVkIHRvIHVwZ3JhZGUgdG8gdGhlIG5leHQgbGV2ZWwuXG4gICAgICBjb25zdCBuZWVkTmV4dExldmVsID1cbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLl9nZXRUcmFuc2NlbmRUb3RhbFByaWNlKHRyYW5zY2VuZGVuY2VUaWVyQ3VycmVudCArIDEpIC1cbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLl9nZXRUcmFuc2NlbmRUb3RhbFByaWNlKHRyYW5zY2VuZGVuY2VUaWVyQ3VycmVudCk7XG5cbiAgICAgIC8vIFdlIHdhbnQgdG8gZGV0ZXJtaW5lIHRoZSBpZGVhbCB2YWx1ZSBmb3Igd2hlbiB0byB0cmFuc2NlbmQuXG4gICAgICAvLyBUT0RPOiBIb3cgZXhhY3RseSB0aGlzIHdvcmtzIGlzbid0IHVuZGVyc3Rvb2QgeWV0LlxuICAgICAgY29uc3QgeCA9IG5lZWROZXh0TGV2ZWw7XG4gICAgICBjb25zdCBrID0gYWRvcmVJbmNyZWFzZVJhdGlvO1xuICAgICAgY29uc3QgZXBpcGhhbnlSZWNvbW1lbmQgPVxuICAgICAgICAoKDEgLSBrICsgTWF0aC5zcXJ0KDgwICogKGsgKiBrIC0gMSkgKiB4ICsgKGsgLSAxKSAqIChrIC0gMSkpKSAqIGspIC9cbiAgICAgICAgICAoNDAgKiAoayArIDEpICogKGsgKyAxKSAqIChrIC0gMSkpICtcbiAgICAgICAgeCArXG4gICAgICAgIHggLyAoayAqIGsgLSAxKTtcblxuICAgICAgaWYgKGVwaXBoYW55UmVjb21tZW5kIDw9IGVwaXBoYW55KSB7XG4gICAgICAgIC8vIGNvZGUgY29weSBmcm9tIGtpdHRlbnMgZ2FtZSdzIHJlbGlnaW9uLmpzOiB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24udHJhbnNjZW5kKClcbiAgICAgICAgLy8gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLnRyYW5zY2VuZCgpIG5lZWQgY29uZmlybSBieSBwbGF5ZXJcbiAgICAgICAgLy8gZ2FtZSB2ZXJzaW9uOiAxLjQuOC4xXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIERPIFRSQU5TQ0VORCBTVEFSVFxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24uZmFpdGhSYXRpbyAtPSBuZWVkTmV4dExldmVsO1xuICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24udGNyYXRpbyArPSBuZWVkTmV4dExldmVsO1xuICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24udHJhbnNjZW5kZW5jZVRpZXIgKz0gMTtcblxuICAgICAgICBjb25zdCBhdGhlaXNtID0gbXVzdEV4aXN0KHRoaXMuX2hvc3QuZ2FtZS5jaGFsbGVuZ2VzLmdldENoYWxsZW5nZShcImF0aGVpc21cIikpO1xuICAgICAgICBhdGhlaXNtLmNhbGN1bGF0ZUVmZmVjdHM/LihhdGhlaXNtLCB0aGlzLl9ob3N0LmdhbWUpO1xuICAgICAgICBjb25zdCBibGFja09iZWxpc2sgPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFRVKFwiYmxhY2tPYmVsaXNrXCIpKTtcbiAgICAgICAgYmxhY2tPYmVsaXNrLmNhbGN1bGF0ZUVmZmVjdHM/LihibGFja09iZWxpc2ssIHRoaXMuX2hvc3QuZ2FtZSk7XG5cbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLm1zZyhcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwiJHJlbGlnaW9uLnRyYW5zY2VuZC5tc2cuc3VjY2Vzc1wiLCBbXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24udHJhbnNjZW5kZW5jZVRpZXIsXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIERPIFRSQU5TQ0VORCBFTkRcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgICBlcGlwaGFueSA9IHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvbi5mYWl0aFJhdGlvO1xuICAgICAgICB0cmFuc2NlbmRlbmNlVGllckN1cnJlbnQgPSB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24udHJhbnNjZW5kZW5jZVRpZXI7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgICBcImFjdC50cmFuc2NlbmRcIixcbiAgICAgICAgICBbdGhpcy5faG9zdC5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dChuZWVkTmV4dExldmVsKSwgdHJhbnNjZW5kZW5jZVRpZXJDdXJyZW50XSxcbiAgICAgICAgICBcImtzLXRyYW5zY2VuZFwiLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJ0cmFuc2NlbmRcIiwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXV0b1ByYWlzZSgpIHtcbiAgICBjb25zdCBmYWl0aCA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShcImZhaXRoXCIpO1xuICAgIGNvbnN0IGFwb2NyeXBoYUJvbnVzID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldEFwb2NyeXBoYUJvbnVzKCk7XG5cbiAgICAvLyBEZXRlcm1pbmUgaG93IG11Y2ggd29yc2hpcCB3ZSdsbCBnYWluIGFuZCBsb2cgaXQuXG4gICAgY29uc3Qgd29yc2hpcEluY3JlYXNlID0gZmFpdGgudmFsdWUgKiAoMSArIGFwb2NyeXBoYUJvbnVzKTtcbiAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJwcmFpc2VcIiwgd29yc2hpcEluY3JlYXNlKTtcbiAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXG4gICAgICBcImFjdC5wcmFpc2VcIixcbiAgICAgIFtcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dChmYWl0aC52YWx1ZSksXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQod29yc2hpcEluY3JlYXNlKSxcbiAgICAgIF0sXG4gICAgICBcImtzLXByYWlzZVwiLFxuICAgICk7XG5cbiAgICAvLyBOb3cgZmluYWxseSBwcmFpc2UgdGhlIHN1bi5cbiAgICB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24ucHJhaXNlKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvYXJyYXkuanNcIjtcbmltcG9ydCB7IGlzTmlsLCB0eXBlIE1heWJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgY29uc3VtZUVudHJpZXNQZWRhbnRpYyB9IGZyb20gXCIuLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZVBhZ2UgfSBmcm9tIFwiLi4vdHlwZXMvZ2FtZS5qc1wiO1xuaW1wb3J0IHsgUG9saWNpZXMsIHR5cGUgUG9saWN5IH0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFBvbGljeVNldHRpbmcgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcmVhZG9ubHkgI3BvbGljeTogUG9saWN5O1xuXG4gIGdldCBwb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMuI3BvbGljeTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBvbGljeTogUG9saWN5LCBlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLiNwb2xpY3kgPSBwb2xpY3k7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUG9saWN5UG9saWN5U2V0dGluZ3MgPSBSZWNvcmQ8UG9saWN5LCBQb2xpY3lTZXR0aW5nPjtcblxuZXhwb3J0IGNsYXNzIFBvbGljeVNldHRpbmdzIGV4dGVuZHMgU2V0dGluZyB7XG4gIHBvbGljaWVzOiBQb2xpY3lQb2xpY3lTZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLnBvbGljaWVzID0gdGhpcy5pbml0UG9saWNpZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFBvbGljaWVzKCk6IFBvbGljeVBvbGljeVNldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIFBvbGljeVBvbGljeVNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBQb2xpY2llcykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgUG9saWN5U2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlR2FtZShnYW1lOiBHYW1lUGFnZSwgc2V0dGluZ3M6IFBvbGljeVNldHRpbmdzKSB7XG4gICAgY29uc3QgaW5TZXR0aW5ncyA9IE9iamVjdC5rZXlzKHNldHRpbmdzLnBvbGljaWVzKTtcbiAgICBjb25zdCBpbkdhbWUgPSBnYW1lLnNjaWVuY2UucG9saWNpZXMubWFwKHBvbGljeSA9PiBwb2xpY3kubmFtZSk7XG5cbiAgICBjb25zdCBtaXNzaW5nSW5TZXR0aW5ncyA9IGRpZmZlcmVuY2UoaW5HYW1lLCBpblNldHRpbmdzKTtcbiAgICBjb25zdCByZWR1bmRhbnRJblNldHRpbmdzID0gZGlmZmVyZW5jZShpblNldHRpbmdzLCBpbkdhbWUpO1xuXG4gICAgZm9yIChjb25zdCBwb2xpY3kgb2YgbWlzc2luZ0luU2V0dGluZ3MpIHtcbiAgICAgIGNvbnNvbGUud2FybiguLi5jbChgVGhlIHBvbGljeSAnJHtwb2xpY3l9JyBpcyBub3QgdHJhY2tlZCBpbiBLaXR0ZW4gU2NpZW50aXN0cyFgKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcG9saWN5IG9mIHJlZHVuZGFudEluU2V0dGluZ3MpIHtcbiAgICAgIGNvbnNvbGUud2FybiguLi5jbChgVGhlIHBvbGljeSAnJHtwb2xpY3l9JyBpcyBub3QgYSBwb2xpY3kgaW4gS2l0dGVucyBHYW1lIWApKTtcbiAgICB9XG4gIH1cblxuICBsb2FkKHNldHRpbmdzOiBNYXliZTxQYXJ0aWFsPFBvbGljeVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMucG9saWNpZXMsIHNldHRpbmdzLnBvbGljaWVzLCAocG9saWN5LCBpdGVtKSA9PiB7XG4gICAgICBwb2xpY3kuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gcG9saWN5LmVuYWJsZWQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvYXJyYXkuanNcIjtcbmltcG9ydCB7IGlzTmlsLCB0eXBlIE1heWJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgY29uc3VtZUVudHJpZXNQZWRhbnRpYyB9IGZyb20gXCIuLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZVBhZ2UgfSBmcm9tIFwiLi4vdHlwZXMvZ2FtZS5qc1wiO1xuaW1wb3J0IHtcbiAgVGVjaG5vbG9naWVzLFxuICBUZWNobm9sb2dpZXNJZ25vcmVkLFxuICB0eXBlIFRlY2hub2xvZ3ksXG4gIHR5cGUgVGVjaG5vbG9neUlnbm9yZWQsXG59IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG50eXBlIEFueVRlY2hub2xvZ3kgPSBUZWNobm9sb2d5IHwgVGVjaG5vbG9neUlnbm9yZWQ7XG5cbmV4cG9ydCBjbGFzcyBUZWNoU2V0dGluZyBleHRlbmRzIFNldHRpbmdUcmlnZ2VyIHtcbiAgcmVhZG9ubHkgI3RlY2g6IFRlY2hub2xvZ3k7XG5cbiAgZ2V0IHRlY2goKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RlY2g7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih0ZWNoOiBUZWNobm9sb2d5LCBlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkLCAtMSk7XG4gICAgdGhpcy4jdGVjaCA9IHRlY2g7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgVGVjaFRlY2hTZXR0aW5ncyA9IFJlY29yZDxUZWNobm9sb2d5LCBUZWNoU2V0dGluZz47XG5cbmV4cG9ydCBjbGFzcyBUZWNoU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nVHJpZ2dlciB7XG4gIHRlY2hzOiBUZWNoVGVjaFNldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIHN1cGVyKGVuYWJsZWQsIC0xKTtcbiAgICB0aGlzLnRlY2hzID0gdGhpcy5pbml0VGVjaHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFRlY2hzKCk6IFRlY2hUZWNoU2V0dGluZ3Mge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgVGVjaFRlY2hTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgVGVjaG5vbG9naWVzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBUZWNoU2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlR2FtZShnYW1lOiBHYW1lUGFnZSwgc2V0dGluZ3M6IFRlY2hTZXR0aW5ncykge1xuICAgIGNvbnN0IGluU2V0dGluZ3MgPSBPYmplY3Qua2V5cyhzZXR0aW5ncy50ZWNocyk7XG4gICAgY29uc3QgaW5HYW1lID0gZ2FtZS5zY2llbmNlLnRlY2hzLm1hcCh0ZWNoID0+IHRlY2gubmFtZSk7XG5cbiAgICBjb25zdCBtaXNzaW5nSW5TZXR0aW5ncyA9IGRpZmZlcmVuY2UoaW5HYW1lLCBpblNldHRpbmdzKSBhcyBBcnJheTxBbnlUZWNobm9sb2d5PjtcbiAgICBjb25zdCByZWR1bmRhbnRJblNldHRpbmdzID0gZGlmZmVyZW5jZShpblNldHRpbmdzLCBpbkdhbWUpIGFzIEFycmF5PEFueVRlY2hub2xvZ3k+O1xuXG4gICAgZm9yIChjb25zdCB0ZWNoIG9mIG1pc3NpbmdJblNldHRpbmdzKSB7XG4gICAgICBpZiAoVGVjaG5vbG9naWVzSWdub3JlZC5pbmNsdWRlcyh0ZWNoIGFzIFRlY2hub2xvZ3lJZ25vcmVkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS53YXJuKC4uLmNsKGBUaGUgdGVjaG5vbG9neSAnJHt0ZWNofScgaXMgbm90IHRyYWNrZWQgaW4gS2l0dGVuIFNjaWVudGlzdHMhYCkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRlY2ggb2YgcmVkdW5kYW50SW5TZXR0aW5ncykge1xuICAgICAgaWYgKFRlY2hub2xvZ2llc0lnbm9yZWQuaW5jbHVkZXModGVjaCBhcyBUZWNobm9sb2d5SWdub3JlZCkpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIC4uLmNsKFxuICAgICAgICAgICAgYFRoZSB0ZWNobm9sb2d5ICcke3RlY2h9JyBpcyBhIHRlY2hub2xvZ3kgaW4gS2l0dGVucyBHYW1lLCBidXQgaXQncyBubyBsb25nZXIgdXNlZC5gLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLndhcm4oLi4uY2woYFRoZSB0ZWNobm9sb2d5ICcke3RlY2h9JyBpcyBub3QgYSB0ZWNobm9sb2d5IGluIEtpdHRlbnMgR2FtZSFgKSk7XG4gICAgfVxuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxUZWNoU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy50ZWNocywgc2V0dGluZ3MudGVjaHMsICh0ZWNoLCBpdGVtKSA9PiB7XG4gICAgICB0ZWNoLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IHRlY2guZW5hYmxlZDtcbiAgICAgIHRlY2gudHJpZ2dlciA9IGl0ZW0/LnRyaWdnZXIgPz8gdGVjaC50cmlnZ2VyO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZVBhZ2UgfSBmcm9tIFwiLi4vdHlwZXMvZ2FtZS5qc1wiO1xuaW1wb3J0IHsgUG9saWN5U2V0dGluZ3MgfSBmcm9tIFwiLi9Qb2xpY3lTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUZWNoU2V0dGluZ3MgfSBmcm9tIFwiLi9UZWNoU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IHR5cGUgU2NpZW5jZUl0ZW0gPSBcInBvbGljaWVzXCIgfCBcInRlY2hzXCI7XG5leHBvcnQgdHlwZSBTY2llbmNlU2V0dGluZ3NJdGVtID0gVGVjaFNldHRpbmdzIHwgUG9saWN5U2V0dGluZ3M7XG5cbmV4cG9ydCBjbGFzcyBTY2llbmNlU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcG9saWNpZXM6IFBvbGljeVNldHRpbmdzO1xuICB0ZWNoczogVGVjaFNldHRpbmdzO1xuICBvYnNlcnZlOiBTZXR0aW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVuYWJsZWQgPSBmYWxzZSxcbiAgICBwb2xpY2llcyA9IG5ldyBQb2xpY3lTZXR0aW5ncygpLFxuICAgIHRlY2hzID0gbmV3IFRlY2hTZXR0aW5ncygpLFxuICAgIG9ic2VydmUgPSBuZXcgU2V0dGluZygpLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLnBvbGljaWVzID0gcG9saWNpZXM7XG4gICAgdGhpcy50ZWNocyA9IHRlY2hzO1xuICAgIHRoaXMub2JzZXJ2ZSA9IG9ic2VydmU7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVHYW1lKGdhbWU6IEdhbWVQYWdlLCBzZXR0aW5nczogU2NpZW5jZVNldHRpbmdzKSB7XG4gICAgUG9saWN5U2V0dGluZ3MudmFsaWRhdGVHYW1lKGdhbWUsIHNldHRpbmdzLnBvbGljaWVzKTtcbiAgICBUZWNoU2V0dGluZ3MudmFsaWRhdGVHYW1lKGdhbWUsIHNldHRpbmdzLnRlY2hzKTtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8U2NpZW5jZVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICB0aGlzLnBvbGljaWVzLmxvYWQoc2V0dGluZ3MucG9saWNpZXMpO1xuICAgIHRoaXMudGVjaHMubG9hZChzZXR0aW5ncy50ZWNocyk7XG5cbiAgICB0aGlzLm9ic2VydmUuZW5hYmxlZCA9IHNldHRpbmdzLm9ic2VydmU/LmVuYWJsZWQgPz8gdGhpcy5vYnNlcnZlLmVuYWJsZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgS2l0dGVuU2NpZW50aXN0cyB9IGZyb20gXCIuL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgVGFiTWFuYWdlciB9IGZyb20gXCIuL1RhYk1hbmFnZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9saWN5LCBUZWNobm9sb2d5LCBVcGdyYWRlIH0gZnJvbSBcIi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgUG9saWN5QnRuQ29udHJvbGxlciwgVGVjaEJ1dHRvbkNvbnRyb2xsZXIgfSBmcm9tIFwiLi90eXBlcy9zY2llbmNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVwZ3JhZGVCdXR0b25Db250cm9sbGVyIH0gZnJvbSBcIi4vdHlwZXMvd29ya3Nob3AuanNcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVwZ3JhZGVNYW5hZ2VyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9ob3N0OiBLaXR0ZW5TY2llbnRpc3RzO1xuICBhYnN0cmFjdCBtYW5hZ2VyOiBUYWJNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKGhvc3Q6IEtpdHRlblNjaWVudGlzdHMpIHtcbiAgICB0aGlzLl9ob3N0ID0gaG9zdDtcbiAgfVxuXG4gIHVwZ3JhZGUoXG4gICAgdXBncmFkZTogeyBsYWJlbDogc3RyaW5nOyBuYW1lOiBQb2xpY3kgfCBVcGdyYWRlIHwgVGVjaG5vbG9neSB9LFxuICAgIHZhcmlhbnQ6IFwicG9saWN5XCIgfCBcInNjaWVuY2VcIiB8IFwid29ya3Nob3BcIixcbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICBpZiAodmFyaWFudCA9PT0gXCJwb2xpY3lcIikge1xuICAgICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZSh1cGdyYWRlLm5hbWUsIFwicG9saWNpZXNcIik7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IGNsYXNzZXMudWkuUG9saWN5QnRuQ29udHJvbGxlcih0aGlzLl9ob3N0LmdhbWUpIGFzIFBvbGljeUJ0bkNvbnRyb2xsZXI7XG4gICAgICBjb25zdCBtb2RlbCA9IGNvbnRyb2xsZXIuZmV0Y2hNb2RlbCh7IGNvbnRyb2xsZXIsIGlkOiBpdGVtTWV0YVJhdy5uYW1lIH0pO1xuICAgICAgc3VjY2VzcyA9IFVwZ3JhZGVNYW5hZ2VyLnNraXBDb25maXJtKCgpID0+IGNvbnRyb2xsZXIuYnV5SXRlbShtb2RlbCkpLml0ZW1Cb3VnaHQ7XG4gICAgfSBlbHNlIGlmICh2YXJpYW50ID09PSBcInNjaWVuY2VcIikge1xuICAgICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZSh1cGdyYWRlLm5hbWUsIFwidGVjaFwiKTtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgY29tLm51Y2xlYXJ1bmljb3JuLmdhbWUudWkuVGVjaEJ1dHRvbkNvbnRyb2xsZXIoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICAgICkgYXMgVGVjaEJ1dHRvbkNvbnRyb2xsZXI7XG4gICAgICBjb25zdCBtb2RlbCA9IGNvbnRyb2xsZXIuZmV0Y2hNb2RlbCh7IGNvbnRyb2xsZXIsIGlkOiBpdGVtTWV0YVJhdy5uYW1lIH0pO1xuICAgICAgc3VjY2VzcyA9IFVwZ3JhZGVNYW5hZ2VyLnNraXBDb25maXJtKCgpID0+IGNvbnRyb2xsZXIuYnV5SXRlbShtb2RlbCkpLml0ZW1Cb3VnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGl0ZW1NZXRhUmF3ID0gZ2FtZS5nZXRVbmxvY2tCeU5hbWUodXBncmFkZS5uYW1lLCBcInVwZ3JhZGVzXCIpO1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBjb20ubnVjbGVhcnVuaWNvcm4uZ2FtZS51aS5VcGdyYWRlQnV0dG9uQ29udHJvbGxlcihcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLFxuICAgICAgKSBhcyBVcGdyYWRlQnV0dG9uQ29udHJvbGxlcjtcbiAgICAgIGNvbnN0IG1vZGVsID0gY29udHJvbGxlci5mZXRjaE1vZGVsKHsgY29udHJvbGxlciwgaWQ6IGl0ZW1NZXRhUmF3Lm5hbWUgfSk7XG4gICAgICBzdWNjZXNzID0gVXBncmFkZU1hbmFnZXIuc2tpcENvbmZpcm0oKCkgPT4gY29udHJvbGxlci5idXlJdGVtKG1vZGVsKSkuaXRlbUJvdWdodDtcbiAgICB9XG5cbiAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBsYWJlbCA9IHVwZ3JhZGUubGFiZWw7XG5cbiAgICBpZiAodmFyaWFudCA9PT0gXCJ3b3Jrc2hvcFwiKSB7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkobGFiZWwsIDEsIFwidXBncmFkZVwiKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcInVwZ3JhZGUudXBncmFkZVwiLCBbbGFiZWxdLCBcImtzLXVwZ3JhZGVcIik7XG4gICAgfSBlbHNlIGlmICh2YXJpYW50ID09PSBcInBvbGljeVwiKSB7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLnBvbGljeVwiLCBbbGFiZWxdKTtcbiAgICB9IGVsc2UgaWYgKHZhcmlhbnQgPT09IFwic2NpZW5jZVwiKSB7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkobGFiZWwsIDEsIFwicmVzZWFyY2hcIik7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLnRlY2hcIiwgW2xhYmVsXSwgXCJrcy1yZXNlYXJjaFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSBwaWVjZSBvZiBjb2RlIHRoYXQgbWlnaHQgaW52b2tlIFVJIGNvbmZpcm1hdGlvbiBhbmRcbiAgICogc2tpcCB0aGF0IFVJIGNvbmZpcm1hdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGFjdGlvbiBUaGUgZnVuY3Rpb24gdG8gcnVuIHdpdGhvdXQgVUkgY29uZmlybWF0aW9uLlxuICAgKiBAcmV0dXJucyBXaGF0ZXZlciBgYWN0aW9uYCByZXR1cm5zLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHNraXBDb25maXJtQXN5bmM8VD4oYWN0aW9uOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3Qgb3JpZ2luYWxDb25maXJtID0gZ2FtZS51aS5jb25maXJtO1xuICAgIHRyeSB7XG4gICAgICBnYW1lLnVpLmNvbmZpcm0gPSAoKSA9PiB0cnVlO1xuICAgICAgcmV0dXJuIGF3YWl0IGFjdGlvbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBnYW1lLnVpLmNvbmZpcm0gPSBvcmlnaW5hbENvbmZpcm07XG4gICAgfVxuICB9XG4gIHN0YXRpYyBza2lwQ29uZmlybTxUPihhY3Rpb246ICgpID0+IFQpOiBUIHtcbiAgICBjb25zdCBvcmlnaW5hbENvbmZpcm0gPSBnYW1lLnVpLmNvbmZpcm07XG4gICAgdHJ5IHtcbiAgICAgIGdhbWUudWkuY29uZmlybSA9ICgpID0+IHRydWU7XG4gICAgICByZXR1cm4gYWN0aW9uKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGdhbWUudWkuY29uZmlybSA9IG9yaWdpbmFsQ29uZmlybTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlIH0gZnJvbSBcIi4uL2Vycm9ycy9jb25zb2xlLmpzXCI7XG4vKipcbiAqIFdyYXBzIHRoZSBnaXZlbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gaW4gYSBuZXcgZnVuY3Rpb24gdGhhdCB3aWxsIGlnbm9yZSBhbnkgb3V0Y29tZSBvZlxuICogdGhlIGNvbnRleHQgYXMgaXQgcmVzb2x2ZXMuXG4gKlxuICogVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gcHJvdmlkaW5nIGFzeW5jaG9ub3VzIGV2ZW50IGhhbmRsZXIgdG8gYC5hZGRFdmVudGxpc3RlbmVyKClgLFxuICogd2hpY2ggb25seSBleHBlY3RzIHN5bmNocm9ub3VzIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBleGVjdXRlLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiByZXR1cm5pbmcgbm90aGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHByZXBhcmVBc3luY0NvbnRleHQgPSAoY29udGV4dCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgLyoqXG4gICAgICogVGhlIGFyZ3VtZW50cyB0aGF0IG91ciBuZXcgZnVuY3Rpb24gd2FzIGNhbGxlZCB3aXRoLlxuICAgICAqL1xuICAgIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgdm9pZCBjb250ZXh0KC4uLmFyZ3MpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB1bmRlZmluZWQpXG4gICAgICAgICAgICAuY2F0Y2gocmVkaXJlY3RFcnJvcnNUb0NvbnNvbGUoY29uc29sZSkpO1xuICAgIH07XG59O1xuLyoqXG4gKiBFeGVjdXRlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYW5kIHJlc29sdmVzIHdpdGggYW4gYWx0ZXJuYXRpdmUgcmVzdWx0XG4gKiBpbiBjYXNlIHRoZSBmdW5jdGlvbiBmYWlsZWQuXG4gKiBAcGFyYW0gZXhlY3V0YWJsZSAtIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAqIEBwYXJhbSB0byAtIFRoZSByZXN1bHQgd2Ugd2FudCB0byByZXR1cm4gd2hlbiB0aGUgZnVuY3Rpb24gZXJyb3JzLlxuICogQHBhcmFtIGZpbHRlciAtIEFuIHtAbGlua2NvZGUgIUVycm9yfSBzdWJjbGFzcy4gSWYgZGVmaW5lZCwgb25seSBlcnJvcnMgb2ZcbiAqIHRoaXMgdHlwZSB3aWxsIGJlIGNvYWxlc2NlZC5cbiAqIEB0eXBlUGFyYW0gVEV4ZWN1dGFibGVSZXR1cm4gLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLlxuICogQHR5cGVQYXJhbSBUQ29hbGVzY2UgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGNvYWxlc2NlIHRvLlxuICogQHR5cGVQYXJhbSBURmlsdGVyIC0gVGhlIHR5cGUgb2YgdGhlIGVycm9yIGZpbHRlci5cbiAqIEByZXR1cm5zIFdoYXRldmVyIHRoZSBmdW5jdGlvbiByZXNvbHZlZCB0bywgb3IgdGhlIHByb3ZpZGVkIHJlcGxhY2VtZW50LFxuICogaW4gY2FzZSB0aGUgZnVuY3Rpb24gZmFpbGVkLlxuICovXG5leHBvcnQgY29uc3QgY29hbGVzY2VPblJlamVjdGlvbiA9IGFzeW5jIChleGVjdXRhYmxlLCB0bywgZmlsdGVyKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGFibGUoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICgoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZXJyb3IgaW5zdGFuY2VvZiBmaWx0ZXIpIHx8ICFmaWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0bztcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59O1xuLyoqXG4gKiBXYWl0IGEgZ2l2ZW4gcGVyaW9kIGJlZm9yZSBjb250aW51aW5nIGV4ZWN1dGlvbi5cbiAqIEBwYXJhbSBkdXJhdGlvbiAtIEhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byB3YWl0LlxuICogQHJldHVybnMgTm90aGluZ1xuICovXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAoZHVyYXRpb24pID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGR1cmF0aW9uKSk7XG59O1xuLyoqXG4gKiBFeGVjdXRlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYW5kIHJldHJpZXMgdGhlIGV4ZWN1dGlvbiBpZiBpdCByZWplY3RzLlxuICogQHBhcmFtIGV4ZWN1dGFibGUgLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKiBAcGFyYW0gcmV0cnlEZWxheSAtIFRoZSBkdXJhdGlvbiB0byB3YWl0IGFmdGVyIGEgZmFpbGVkIGV4ZWN1dGlvbi5cbiAqIEBwYXJhbSByZXRyeUNvdW50IC0gSG93IG9mdGVuIHNob3VsZCB0aGUgZXhlY3V0aW9uIGJlIHJldHJpZWQ/XG4gKiBAdHlwZVBhcmFtIFRFeGVjdXRhYmxlUmV0dXJuIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIFdoYXRldmVyIHRoZSBmdW5jdGlvbiByZXNvbHZlZCB0by5cbiAqL1xuZXhwb3J0IGNvbnN0IHJldHJ5ID0gYXN5bmMgKGV4ZWN1dGFibGUsIHJldHJ5RGVsYXkgPSAwLCByZXRyeUNvdW50ID0gMCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRhYmxlKCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoMCA8IHJldHJ5Q291bnQpIHtcbiAgICAgICAgICAgIGlmICgwIDwgcmV0cnlEZWxheSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHNsZWVwKHJldHJ5RGVsYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldHJ5KGV4ZWN1dGFibGUsIHJldHJ5RGVsYXksIC0tcmV0cnlDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzeW5jLmpzLm1hcCIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9hc3luYy9hc3luYy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3Rvck9mIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9jb3JlLmpzXCI7XG5pbXBvcnQgeyBpc05pbCwgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbmdpbmVTdGF0ZSwgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGUgfSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuXG5leHBvcnQgY29uc3QgRmFsbGJhY2tMb2NhbGU6IFN1cHBvcnRlZExvY2FsZSA9IFwiZW4tVVNcIjtcblxuLy8gSG93IGxvbmcgdG8gd2FpdCBmb3IgS0cgdG8gbG9hZCwgaW4gbWlsbGlzZWNvbmRzLlxuY29uc3QgVElNRU9VVF9ERUZBVUxUID0gMiAqIDYwICogMTAwMDtcblxuLy8gQWxsb3dzIHRoZSB1c2VyIHRvIGRlZmluZSBhIHRpbWVvdXQgb3ZlcnJpZGUgaW4gdGhlaXIgYnJvd3NlcidzIHdlYiBzdG9yYWdlLlxuLy8gVGhpcyBhbGxvd3MgdXNlcnMgdG8gZXh0ZW5kIHRoZSB0aW1lb3V0IHBlcmlvZCwgaW4gY2FzZSB0aGVpciBsb2NhbCBjb25maWd1cmF0aW9uXG4vLyByZXF1aXJlcyBpdC5cbmNvbnN0IFRJTUVPVVRfT1ZFUlJJREUgPVxuICBcImxvY2FsU3RvcmFnZVwiIGluIGdsb2JhbFRoaXMgJiYgIWlzTmlsKGxvY2FsU3RvcmFnZVtcImtzLnRpbWVvdXRcIl0pXG4gICAgPyBOdW1iZXIobG9jYWxTdG9yYWdlW1wia3MudGltZW91dFwiXSlcbiAgICA6IHVuZGVmaW5lZDtcblxuZXhwb3J0IGNsYXNzIFVzZXJTY3JpcHRMb2FkZXIge1xuICAvKipcbiAgICogU3RvcmVzIGlmIHdlIGNhdWdodCB0aGUgYGdhbWUvc3RhcnRgIHNpZ25hbCBmcm9tIHRoZSBnYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2FtZVN0YXJ0U2lnbmFsOiBQcm9taXNlPGJvb2xlYW4+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9nYW1lU3RhcnRTaWduYWxSZXNvbHZlcjogdW5kZWZpbmVkIHwgKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCk7XG5cbiAgcHJpdmF0ZSBfcG9zc2libGVFbmdpbmVTdGF0ZTogdW5rbm93bjtcblxuICBzdGF0aWMgdHJ5RW5naW5lU3RhdGVGcm9tU2F2ZURhdGEoc2F2ZURhdGFLZXk6IHN0cmluZywgc2F2ZURhdGE6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBzYXZlRGF0YVByb3h5ID0gc2F2ZURhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKCEoc2F2ZURhdGFLZXkgaW4gc2F2ZURhdGFQcm94eSkpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoLi4uY2woYEZhaWxlZDogXFxgJHtzYXZlRGF0YUtleX1cXGAgbm90IGZvdW5kIGluIHNhdmUgZGF0YS5gKSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGtzRGF0YSA9IHNhdmVEYXRhUHJveHkua3MgYXMgeyBzdGF0ZT86IEFycmF5PEVuZ2luZVN0YXRlPiB9O1xuICAgIGlmICghKFwic3RhdGVcIiBpbiBrc0RhdGEpKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBGYWlsZWQ6IFxcYCR7c2F2ZURhdGFLZXl9LnN0YXRlXFxgIG5vdCBmb3VuZCBpbiBzYXZlIGRhdGEuYCkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IGtzRGF0YS5zdGF0ZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3RhdGUpKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBGYWlsZWQ6IFxcYCR7c2F2ZURhdGFLZXl9LnN0YXRlXFxgIG5vdCBcXGBBcnJheVxcYC5gKSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZVswXTtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JHYW1lPFRVc2VyU2NyaXB0PihcbiAgICBVc2VyU2NyaXB0OiBDb25zdHJ1Y3Rvck9mPFRVc2VyU2NyaXB0PixcbiAgICBzYXZlRGF0YUtleT86IHN0cmluZyxcbiAgICB0aW1lb3V0ID0gVElNRU9VVF9PVkVSUklERSA/PyBUSU1FT1VUX0RFRkFVTFQsXG4gICk6IFByb21pc2U8VFVzZXJTY3JpcHQ+IHtcbiAgICBpZiAoVXNlclNjcmlwdExvYWRlci5faXNHYW1lTG9hZGVkKCkpIHtcbiAgICAgIGNvbnN0IGdhbWUgPSBtdXN0RXhpc3QoVXNlclNjcmlwdExvYWRlci53aW5kb3cuZ2FtZSk7XG4gICAgICBjb25zdCBpMThuRW5naW5lID0gbXVzdEV4aXN0KFVzZXJTY3JpcHRMb2FkZXIud2luZG93LiRJKTtcbiAgICAgIGNvbnN0IGdhbWVMYW5ndWFnZSA9IGxvY2FsU3RvcmFnZVtcImNvbS5udWNsZWFydW5pY29ybi5raXR0ZW5nYW1lLmxhbmd1YWdlXCJdIGFzXG4gICAgICAgIHwgTG9jYWxlXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gbmV3IFVzZXJTY3JpcHQoZ2FtZSwgaTE4bkVuZ2luZSwgZ2FtZUxhbmd1YWdlLCB0aGlzLl9wb3NzaWJsZUVuZ2luZVN0YXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduYWxzOiBBcnJheTxQcm9taXNlPHVua25vd24+PiA9IFtzbGVlcCgyMDAwKV07XG5cbiAgICBpZiAoaXNOaWwodGhpcy5fZ2FtZVN0YXJ0U2lnbmFsKSAmJiB0eXBlb2YgVXNlclNjcmlwdExvYWRlci53aW5kb3cuZG9qbyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5fZ2FtZVN0YXJ0U2lnbmFsID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHRoaXMuX2dhbWVTdGFydFNpZ25hbFJlc29sdmVyID0gcmVzb2x2ZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzdWJHYW1lU3RhcnQgPSBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5kb2pvLnN1YnNjcmliZShcImdhbWUvc3RhcnRcIiwgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAgIC4uLmNsKGAnZ2FtZS9zdGFydCcgc2lnbmFsIGNhdWdodC4gRmFzdC10cmFja2luZyBzY3JpcHQgbG9hZCBmb3IgJyR7c2F2ZURhdGFLZXl9Jy4uLmApLFxuICAgICAgICApO1xuICAgICAgICBtdXN0RXhpc3QodGhpcy5fZ2FtZVN0YXJ0U2lnbmFsUmVzb2x2ZXIpKHRydWUpO1xuICAgICAgICBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5kb2pvLnVuc3Vic2NyaWJlKHN1YkdhbWVTdGFydCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHNhdmVEYXRhS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc3ViU2VydmVyTG9hZCA9IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8uc3Vic2NyaWJlKFxuICAgICAgICAgIFwic2VydmVyL2xvYWRcIixcbiAgICAgICAgICAoc2F2ZURhdGE6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgLi4uY2woXG4gICAgICAgICAgICAgICAgYCdzZXJ2ZXIvbG9hZCcgc2lnbmFsIGNhdWdodC4gTG9va2luZyBmb3Igc2NyaXB0IHN0YXRlIHdpdGgga2V5ICcke3NhdmVEYXRhS2V5fScgaW4gc2F2ZSBkYXRhLi4uYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gVXNlclNjcmlwdExvYWRlci50cnlFbmdpbmVTdGF0ZUZyb21TYXZlRGF0YShzYXZlRGF0YUtleSwgc2F2ZURhdGEpO1xuXG4gICAgICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgICAuLi5jbChcbiAgICAgICAgICAgICAgICAgIGBUaGUgS2l0dGVucyBHYW1lIHNhdmUgZGF0YSBkaWQgbm90IGNvbnRhaW4gYSBzY3JpcHQgc3RhdGUgZm9yICcke3NhdmVEYXRhS2V5fScuYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgLi4uY2woXG4gICAgICAgICAgICAgICAgYEZvdW5kIGtleSAnJHtzYXZlRGF0YUtleX0nISBQcm92aWRlZCBzYXZlIGRhdGEgd2lsbCBiZSB1c2VkIGFzIHNlZWQgZm9yIG5leHQgc2NyaXB0IGluc3RhbmNlLmAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5fcG9zc2libGVFbmdpbmVTdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgVXNlclNjcmlwdExvYWRlci53aW5kb3cuZG9qby51bnN1YnNjcmliZShzdWJTZXJ2ZXJMb2FkKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNOaWwodGhpcy5fZ2FtZVN0YXJ0U2lnbmFsKSkge1xuICAgICAgc2lnbmFscy5wdXNoKHRoaXMuX2dhbWVTdGFydFNpZ25hbCk7XG4gICAgfVxuXG4gICAgaWYgKHRpbWVvdXQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVW5hYmxlIHRvIGZpbmQgZ2FtZS4gR2l2aW5nIHVwLiBNYXliZSB0aGUgZ2FtZSBpcyBub3QgZXhwb3J0ZWQgYXQgYHdpbmRvdy5nYW1lYD9cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc29sZS5kZWJ1ZyguLi5jbChgV2FpdGluZyBmb3IgZ2FtZS4uLiAodGltZW91dDogJHtNYXRoLnJvdW5kKHRpbWVvdXQgLyAxMDAwKX1zKWApKTtcblxuICAgIGF3YWl0IFByb21pc2UucmFjZShzaWduYWxzKTtcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yR2FtZShVc2VyU2NyaXB0LCBzYXZlRGF0YUtleSwgdGltZW91dCAtIDIwMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2lzR2FtZUxvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIWlzTmlsKFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmdhbWUpICYmXG4gICAgICAoVXNlclNjcmlwdExvYWRlci53aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJnYW1lXCIpPy5jaGVja1Zpc2liaWxpdHkoKSA/PyBmYWxzZSkgJiZcbiAgICAgICFpc05pbChVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy4kSSlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGdldCB3aW5kb3coKTogV2luZG93IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG11c3RFeGlzdCh1bnNhZmVXaW5kb3cpO1xuICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgRW5naW5lLCB0eXBlIEZyYW1lQ29udGV4dCB9IGZyb20gXCIuL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4vS2l0dGVuU2NpZW50aXN0cy5qc1wiO1xuaW1wb3J0IHsgU2NpZW5jZVNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvU2NpZW5jZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUYWJNYW5hZ2VyIH0gZnJvbSBcIi4vVGFiTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB0eXBlIHsgTGlicmFyeSwgVW5zYWZlUG9saWN5LCBVbnNhZmVUZWNoIH0gZnJvbSBcIi4vdHlwZXMvc2NpZW5jZS5qc1wiO1xuaW1wb3J0IHsgVXBncmFkZU1hbmFnZXIgfSBmcm9tIFwiLi9VcGdyYWRlTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgVXNlclNjcmlwdExvYWRlciB9IGZyb20gXCIuL1VzZXJTY3JpcHRMb2FkZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3Nob3BNYW5hZ2VyIH0gZnJvbSBcIi4vV29ya3Nob3BNYW5hZ2VyLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBTY2llbmNlTWFuYWdlciBleHRlbmRzIFVwZ3JhZGVNYW5hZ2VyIHtcbiAgcmVhZG9ubHkgbWFuYWdlcjogVGFiTWFuYWdlcjxMaWJyYXJ5PjtcbiAgcmVhZG9ubHkgc2V0dGluZ3M6IFNjaWVuY2VTZXR0aW5ncztcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaG9zdDogS2l0dGVuU2NpZW50aXN0cyxcbiAgICB3b3Jrc2hvcE1hbmFnZXI6IFdvcmtzaG9wTWFuYWdlcixcbiAgICBzZXR0aW5ncyA9IG5ldyBTY2llbmNlU2V0dGluZ3MoKSxcbiAgKSB7XG4gICAgc3VwZXIoaG9zdCk7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMubWFuYWdlciA9IG5ldyBUYWJNYW5hZ2VyKHRoaXMuX2hvc3QsIFwiU2NpZW5jZVwiKTtcbiAgICB0aGlzLl93b3Jrc2hvcE1hbmFnZXIgPSB3b3Jrc2hvcE1hbmFnZXI7XG4gIH1cblxuICBhc3luYyB0aWNrKF9jb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdlIG11c3QgY2FsbCBgLnJlbmRlcigpYCBoZXJlLCBiZWNhdXNlIGV2YWx1YXRpb24gb2YgYXZhaWxhYmlsaXR5IG9mIG91ciBvcHRpb25zXG4gICAgLy8gaXMgb25seSBwZXJmb3JtZWQgd2hlbiB0aGUgZ2FtZSByZW5kZXJzIHRoZSBjb250ZW50cyBvZiB0aGF0IHRhYi5cbiAgICB0aGlzLm1hbmFnZXIucmVuZGVyKCk7XG5cbiAgICAvLyBJZiB0ZWNocyAoc2NpZW5jZSBpdGVtcykgYXJlIGVuYWJsZWQuLi5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy50ZWNocy5lbmFibGVkICYmIHRoaXMuX2hvc3QuZ2FtZS50YWJzWzJdLnZpc2libGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuYXV0b1VubG9jaygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnBvbGljaWVzLmVuYWJsZWQgJiYgdGhpcy5faG9zdC5nYW1lLnRhYnNbMl0udmlzaWJsZSkge1xuICAgICAgYXdhaXQgdGhpcy5hdXRvUG9saWN5KCk7XG4gICAgfVxuXG4gICAgLy8gT2JzZXJ2ZSBhc3Ryb25vbWljYWwgZXZlbnRzLlxuICAgIGlmICh0aGlzLnNldHRpbmdzLm9ic2VydmUuZW5hYmxlZCkge1xuICAgICAgdGhpcy5vYnNlcnZlU3RhcnMoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhdXRvVW5sb2NrKCkge1xuICAgIGNvbnN0IHRlY2hzID0gdGhpcy5faG9zdC5nYW1lLnNjaWVuY2UudGVjaHM7XG4gICAgY29uc3QgdG9VbmxvY2sgPSBuZXcgQXJyYXk8VW5zYWZlVGVjaD4oKTtcblxuICAgIHdvcmtMb29wOiBmb3IgKGNvbnN0IHNldHRpbmcgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnNldHRpbmdzLnRlY2hzLnRlY2hzKSkge1xuICAgICAgaWYgKCFzZXR0aW5nLmVuYWJsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRlY2ggPSB0ZWNocy5maW5kKHN1YmplY3QgPT4gc3ViamVjdC5uYW1lID09PSBzZXR0aW5nLnRlY2gpO1xuICAgICAgaWYgKGlzTmlsKHRlY2gpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uY2woYFRlY2ggJyR7c2V0dGluZy50ZWNofScgbm90IGZvdW5kIGluIGdhbWUhYCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRlY2gucmVzZWFyY2hlZCB8fCAhdGVjaC51bmxvY2tlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IHByaWNlcyA9IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8uY2xvbmUodGVjaC5wcmljZXMpO1xuICAgICAgcHJpY2VzID0gdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuZ2V0RWZmZWN0TGVhZGVyKFwic2NpZW50aXN0XCIsIHByaWNlcyk7XG4gICAgICBmb3IgKGNvbnN0IHByaWNlIG9mIHByaWNlcykge1xuICAgICAgICBjb25zdCBhdmFpbGFibGUgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUocHJpY2UubmFtZSk7XG4gICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKHByaWNlLm5hbWUpO1xuICAgICAgICBjb25zdCB0cmlnZ2VyID0gRW5naW5lLmV2YWx1YXRlU3ViU2VjdGlvblRyaWdnZXIoXG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy50ZWNocy50cmlnZ2VyLFxuICAgICAgICAgIHNldHRpbmcudHJpZ2dlcixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRyaWdnZXIgPCAwIHx8IGF2YWlsYWJsZSA8IHJlc291cmNlLm1heFZhbHVlICogdHJpZ2dlciB8fCBhdmFpbGFibGUgPCBwcmljZS52YWwpIHtcbiAgICAgICAgICBjb250aW51ZSB3b3JrTG9vcDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0b1VubG9jay5wdXNoKHRlY2gpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0b1VubG9jaykge1xuICAgICAgYXdhaXQgdGhpcy51cGdyYWRlKGl0ZW0sIFwic2NpZW5jZVwiKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhdXRvUG9saWN5KCkge1xuICAgIGNvbnN0IHBvbGljaWVzID0gdGhpcy5faG9zdC5nYW1lLnNjaWVuY2UucG9saWNpZXM7XG4gICAgY29uc3QgdG9VbmxvY2sgPSBuZXcgQXJyYXk8VW5zYWZlUG9saWN5PigpO1xuXG4gICAgZm9yIChjb25zdCBzZXR0aW5nIG9mIE9iamVjdC52YWx1ZXModGhpcy5zZXR0aW5ncy5wb2xpY2llcy5wb2xpY2llcykpIHtcbiAgICAgIGlmICghc2V0dGluZy5lbmFibGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXRQb2xpY3kgPSBwb2xpY2llcy5maW5kKHN1YmplY3QgPT4gc3ViamVjdC5uYW1lID09PSBzZXR0aW5nLnBvbGljeSk7XG4gICAgICBpZiAoaXNOaWwodGFyZ2V0UG9saWN5KSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKC4uLmNsKGBQb2xpY3kgJyR7c2V0dGluZy5wb2xpY3l9JyBub3QgZm91bmQgaW4gZ2FtZSFgKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRhcmdldFBvbGljeS5yZXNlYXJjaGVkICYmICF0YXJnZXRQb2xpY3kuYmxvY2tlZCAmJiB0YXJnZXRQb2xpY3kudW5sb2NrZWQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRhcmdldFBvbGljeS5yZXF1aXJlZExlYWRlckpvYiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLmxlYWRlciAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UubGVhZGVyLmpvYiA9PT0gdGFyZ2V0UG9saWN5LnJlcXVpcmVkTGVhZGVySm9iKVxuICAgICAgICApIHtcbiAgICAgICAgICB0b1VubG9jay5wdXNoKHRhcmdldFBvbGljeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdG9VbmxvY2spIHtcbiAgICAgIGF3YWl0IHRoaXMudXBncmFkZShpdGVtLCBcInBvbGljeVwiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlcmUgaXMgY3VycmVudGx5IGFuIGFzdHJvbm9taWNhbCBldmVudCwgb2JzZXJ2ZSBpdC5cbiAgICovXG4gIG9ic2VydmVTdGFycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLm9ic2VydmVCdG4gIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5vYnNlcnZlSGFuZGxlcigpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwiYWN0Lm9ic2VydmVcIiwgW10sIFwia3Mtc3RhclwiKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShcInN0YXJzXCIsIDEpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgZGlmZmVyZW5jZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9hcnJheS5qc1wiO1xuaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBHYW1lUGFnZSB9IGZyb20gXCIuLi90eXBlcy9nYW1lLmpzXCI7XG5pbXBvcnQgeyB0eXBlIE1pc3Npb24sIE1pc3Npb25zIH0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIE1pc3Npb25TZXR0aW5nIGV4dGVuZHMgU2V0dGluZyB7XG4gIHJlYWRvbmx5ICNtaXNzaW9uOiBNaXNzaW9uO1xuXG4gIGdldCBtaXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNtaXNzaW9uO1xuICB9XG5cbiAgY29uc3RydWN0b3IobWlzc2lvbjogTWlzc2lvbiwgZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy4jbWlzc2lvbiA9IG1pc3Npb247XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTWlzc2lvbk1pc3Npb25TZXR0aW5ncyA9IFJlY29yZDxNaXNzaW9uLCBNaXNzaW9uU2V0dGluZz47XG5cbmV4cG9ydCBjbGFzcyBNaXNzaW9uU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgbWlzc2lvbnM6IE1pc3Npb25NaXNzaW9uU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy5taXNzaW9ucyA9IHRoaXMuaW5pdE1pc3Npb25zKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRNaXNzaW9ucygpOiBNaXNzaW9uTWlzc2lvblNldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIE1pc3Npb25NaXNzaW9uU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIE1pc3Npb25zKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBNaXNzaW9uU2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlR2FtZShnYW1lOiBHYW1lUGFnZSwgc2V0dGluZ3M6IE1pc3Npb25TZXR0aW5ncykge1xuICAgIGNvbnN0IGluU2V0dGluZ3MgPSBPYmplY3Qua2V5cyhzZXR0aW5ncy5taXNzaW9ucyk7XG4gICAgY29uc3QgaW5HYW1lID0gZ2FtZS5zcGFjZS5wcm9ncmFtcy5tYXAocHJvZ3JhbSA9PiBwcm9ncmFtLm5hbWUpO1xuXG4gICAgY29uc3QgbWlzc2luZ0luU2V0dGluZ3MgPSBkaWZmZXJlbmNlKGluR2FtZSwgaW5TZXR0aW5ncyk7XG4gICAgY29uc3QgcmVkdW5kYW50SW5TZXR0aW5ncyA9IGRpZmZlcmVuY2UoaW5TZXR0aW5ncywgaW5HYW1lKTtcblxuICAgIGZvciAoY29uc3QgbWlzc2lvbiBvZiBtaXNzaW5nSW5TZXR0aW5ncykge1xuICAgICAgY29uc29sZS53YXJuKC4uLmNsKGBUaGUgc3BhY2UgbWlzc2lvbiAnJHttaXNzaW9ufScgaXMgbm90IHRyYWNrZWQgaW4gS2l0dGVuIFNjaWVudGlzdHMhYCkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1pc3Npb24gb2YgcmVkdW5kYW50SW5TZXR0aW5ncykge1xuICAgICAgY29uc29sZS53YXJuKC4uLmNsKGBUaGUgc3BhY2UgbWlzc2lvbiAnJHttaXNzaW9ufScgaXMgbm90IGEgc3BhY2UgbWlzc2lvbiBpbiBLaXR0ZW5zIEdhbWUhYCkpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8TWlzc2lvblNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMubWlzc2lvbnMsIHNldHRpbmdzLm1pc3Npb25zLCAobWlzc2lvbiwgaXRlbSkgPT4ge1xuICAgICAgbWlzc2lvbi5lbmFibGVkID0gaXRlbT8uZW5hYmxlZCA/PyBtaXNzaW9uLmVuYWJsZWQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsLCB0eXBlIE1heWJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgY29uc3VtZUVudHJpZXNQZWRhbnRpYyB9IGZyb20gXCIuLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdhbWVQYWdlIH0gZnJvbSBcIi4uL3R5cGVzL2dhbWUuanNcIjtcbmltcG9ydCB7IHR5cGUgU3BhY2VCdWlsZGluZywgU3BhY2VCdWlsZGluZ3MgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IE1pc3Npb25TZXR0aW5ncyB9IGZyb20gXCIuL01pc3Npb25TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ1RyaWdnZXIsIFNldHRpbmdUcmlnZ2VyTWF4IH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFNwYWNlQnVpbGRpbmdTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXJNYXgge1xuICByZWFkb25seSAjYnVpbGRpbmc6IFNwYWNlQnVpbGRpbmc7XG5cbiAgZ2V0IGJ1aWxkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNidWlsZGluZztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGJ1aWxkaW5nOiBTcGFjZUJ1aWxkaW5nKSB7XG4gICAgc3VwZXIoZmFsc2UsIC0xLCAwKTtcbiAgICB0aGlzLiNidWlsZGluZyA9IGJ1aWxkaW5nO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFNwYWNlQnVpbGRpbmdTZXR0aW5ncyA9IFJlY29yZDxTcGFjZUJ1aWxkaW5nLCBTcGFjZUJ1aWxkaW5nU2V0dGluZz47XG5cbmV4cG9ydCBjbGFzcyBTcGFjZVNldHRpbmdzIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXIge1xuICBidWlsZGluZ3M6IFNwYWNlQnVpbGRpbmdTZXR0aW5ncztcblxuICB1bmxvY2tNaXNzaW9uczogTWlzc2lvblNldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgdHJpZ2dlciA9IC0xLCB1bmxvY2tNaXNzaW9ucyA9IG5ldyBNaXNzaW9uU2V0dGluZ3MoKSkge1xuICAgIHN1cGVyKGVuYWJsZWQsIHRyaWdnZXIpO1xuICAgIHRoaXMuYnVpbGRpbmdzID0gdGhpcy5pbml0QnVpbGRpbmdzKCk7XG4gICAgdGhpcy51bmxvY2tNaXNzaW9ucyA9IHVubG9ja01pc3Npb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0QnVpbGRpbmdzKCk6IFNwYWNlQnVpbGRpbmdTZXR0aW5ncyB7XG4gICAgY29uc3QgaXRlbXMgPSB7fSBhcyBTcGFjZUJ1aWxkaW5nU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFNwYWNlQnVpbGRpbmdzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBTcGFjZUJ1aWxkaW5nU2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlR2FtZShnYW1lOiBHYW1lUGFnZSwgc2V0dGluZ3M6IFNwYWNlU2V0dGluZ3MpIHtcbiAgICBNaXNzaW9uU2V0dGluZ3MudmFsaWRhdGVHYW1lKGdhbWUsIHNldHRpbmdzLnVubG9ja01pc3Npb25zKTtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8U3BhY2VTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLmJ1aWxkaW5ncywgc2V0dGluZ3MuYnVpbGRpbmdzLCAoYnVpbGRpbmcsIGl0ZW0pID0+IHtcbiAgICAgIGJ1aWxkaW5nLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IGJ1aWxkaW5nLmVuYWJsZWQ7XG4gICAgICBidWlsZGluZy5tYXggPSBpdGVtPy5tYXggPz8gYnVpbGRpbmcubWF4O1xuICAgICAgYnVpbGRpbmcudHJpZ2dlciA9IGl0ZW0/LnRyaWdnZXIgPz8gYnVpbGRpbmcudHJpZ2dlcjtcbiAgICB9KTtcblxuICAgIHRoaXMudW5sb2NrTWlzc2lvbnMubG9hZChzZXR0aW5ncy51bmxvY2tNaXNzaW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsLCBtdXN0RXhpc3QgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dG9tYXRpb24sIEZyYW1lQ29udGV4dCB9IGZyb20gXCIuL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgQnVsa1B1cmNoYXNlSGVscGVyIH0gZnJvbSBcIi4vaGVscGVyL0J1bGtQdXJjaGFzZUhlbHBlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4vS2l0dGVuU2NpZW50aXN0cy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBTcGFjZUJ1aWxkaW5nU2V0dGluZywgU3BhY2VTZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzL1NwYWNlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFRhYk1hbmFnZXIgfSBmcm9tIFwiLi9UYWJNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCdWlsZGluZ1N0YWNrYWJsZUJ0biwgVW5zYWZlQnVpbGRpbmdTdGFja2FibGVCdG5Nb2RlbCB9IGZyb20gXCIuL3R5cGVzL2NvcmUuanNcIjtcbmltcG9ydCB0eXBlIHsgTWlzc2lvbiwgU3BhY2VCdWlsZGluZyB9IGZyb20gXCIuL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFBsYW5ldEJ1aWxkaW5nQnRuQ29udHJvbGxlcixcbiAgU3BhY2VUYWIsXG4gIFVuc2FmZVBsYW5ldCxcbiAgVW5zYWZlUGxhbmV0QnVpbGRpbmdCdXR0b25PcHRpb25zLFxuICBVbnNhZmVTcGFjZUJ1aWxkaW5nLFxuICBVbnNhZmVTcGFjZVByb2dyYW0sXG4gIFVuc2FmZVNwYWNlUHJvZ3JhbUJ1dHRvbk9wdGlvbnMsXG59IGZyb20gXCIuL3R5cGVzL3NwYWNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzaG9wTWFuYWdlciB9IGZyb20gXCIuL1dvcmtzaG9wTWFuYWdlci5qc1wiO1xuXG5leHBvcnQgY2xhc3MgU3BhY2VNYW5hZ2VyIGltcGxlbWVudHMgQXV0b21hdGlvbiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hvc3Q6IEtpdHRlblNjaWVudGlzdHM7XG4gIHJlYWRvbmx5IHNldHRpbmdzOiBTcGFjZVNldHRpbmdzO1xuICByZWFkb25seSBtYW5hZ2VyOiBUYWJNYW5hZ2VyPFNwYWNlVGFiPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYnVsa01hbmFnZXI6IEJ1bGtQdXJjaGFzZUhlbHBlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaG9zdDogS2l0dGVuU2NpZW50aXN0cyxcbiAgICB3b3Jrc2hvcE1hbmFnZXI6IFdvcmtzaG9wTWFuYWdlcixcbiAgICBzZXR0aW5ncyA9IG5ldyBTcGFjZVNldHRpbmdzKCksXG4gICkge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVGFiTWFuYWdlcih0aGlzLl9ob3N0LCBcIlNwYWNlXCIpO1xuXG4gICAgdGhpcy5fd29ya3Nob3BNYW5hZ2VyID0gd29ya3Nob3BNYW5hZ2VyO1xuICAgIHRoaXMuX2J1bGtNYW5hZ2VyID0gbmV3IEJ1bGtQdXJjaGFzZUhlbHBlcih0aGlzLl9ob3N0LCB0aGlzLl93b3Jrc2hvcE1hbmFnZXIpO1xuICB9XG5cbiAgdGljayhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdlIG11c3QgY2FsbCBgLnJlbmRlcigpYCBoZXJlLCBiZWNhdXNlIGV2YWx1YXRpb24gb2YgYXZhaWxhYmlsaXR5IG9mIG91ciBvcHRpb25zXG4gICAgLy8gaXMgb25seSBwZXJmb3JtZWQgd2hlbiB0aGUgZ2FtZSByZW5kZXJzIHRoZSBjb250ZW50cyBvZiB0aGF0IHRhYi5cbiAgICB0aGlzLm1hbmFnZXIucmVuZGVyKCk7XG5cbiAgICB0aGlzLmF1dG9CdWlsZChjb250ZXh0KTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnVubG9ja01pc3Npb25zLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuYXV0b1VubG9jayhjb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGJ1aWxkIGFzIG1hbnkgb2YgdGhlIHBhc3NlZCBidWlsZGluZ3MgYXMgcG9zc2libGUuXG4gICAqIFVzdWFsbHksIHRoaXMgaXMgY2FsbGVkIGF0IGVhY2ggaXRlcmF0aW9uIG9mIHRoZSBhdXRvbWF0aW9uIGVuZ2luZSB0b1xuICAgKiBoYW5kbGUgdGhlIGJ1aWxkaW5nIG9mIGl0ZW1zIG9uIHRoZSBTcGFjZSB0YWIuXG4gICAqXG4gICAqIEBwYXJhbSBidWlsZHMgVGhlIGJ1aWxkaW5ncyB0byBidWlsZC5cbiAgICovXG4gIGF1dG9CdWlsZChcbiAgICBjb250ZXh0OiBGcmFtZUNvbnRleHQsXG4gICAgYnVpbGRzOiBQYXJ0aWFsPFJlY29yZDxTcGFjZUJ1aWxkaW5nLCBTcGFjZUJ1aWxkaW5nU2V0dGluZz4+ID0gdGhpcy5zZXR0aW5ncy5idWlsZGluZ3MsXG4gICkge1xuICAgIGNvbnN0IGJ1bGtNYW5hZ2VyID0gdGhpcy5fYnVsa01hbmFnZXI7XG4gICAgY29uc3Qgc2VjdGlvblRyaWdnZXIgPSB0aGlzLnNldHRpbmdzLnRyaWdnZXI7XG5cbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWV0YWRhdGEgZm9yIGFsbCB0aGUgcmVmZXJlbmNlZCBidWlsZGluZ3MuXG4gICAgY29uc3QgbWV0YURhdGE6IFBhcnRpYWw8UmVjb3JkPFNwYWNlQnVpbGRpbmcsIFJlcXVpcmVkPFVuc2FmZVNwYWNlQnVpbGRpbmc+Pj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGJ1aWxkIG9mIE9iamVjdC52YWx1ZXMoYnVpbGRzKSkge1xuICAgICAgbWV0YURhdGFbYnVpbGQuYnVpbGRpbmddID0gdGhpcy5nZXRCdWlsZChidWlsZC5idWlsZGluZyk7XG4gICAgfVxuXG4gICAgLy8gTGV0IHRoZSBidWxrbWFuYWdlciBkZXRlcm1pbmUgdGhlIGJ1aWxkcyB3ZSBjYW4gbWFrZS5cbiAgICBjb25zdCBidWlsZExpc3QgPSBidWxrTWFuYWdlci5idWxrKGJ1aWxkcywgbWV0YURhdGEsIHNlY3Rpb25UcmlnZ2VyLCBcIlNwYWNlXCIpO1xuXG4gICAgLy8gQnVpbGQgYWxsIGVudHJpZXMgaW4gdGhlIGJ1aWxkIGxpc3QsIHdoZXJlIHdlIGNhbiBidWlsZCBhbnkgaXRlbXMuXG4gICAgZm9yIChjb25zdCBidWlsZCBvZiBidWlsZExpc3QpIHtcbiAgICAgIGlmIChidWlsZC5jb3VudCA8PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKDAgPT09IHRoaXMuYnVpbGQoYnVpbGQuaWQgYXMgU3BhY2VCdWlsZGluZywgYnVpbGQuY291bnQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgYXV0b1VubG9jayhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuX2hvc3QuZ2FtZS50YWJzWzZdLnZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtaXNzaW9ucyA9IHRoaXMuX2hvc3QuZ2FtZS5zcGFjZS5tZXRhWzBdLm1ldGEgYXMgQXJyYXk8UmVxdWlyZWQ8VW5zYWZlU3BhY2VQcm9ncmFtPj47XG4gICAgbWlzc2lvbkxvb3A6IGZvciAobGV0IGkgPSAwOyBpIDwgbWlzc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIElmIHRoZSBtaXNzaW9uIGlzIGFscmVhZHkgcHVyY2hhc2VkIG9yIG5vdCBhdmFpbGFibGUgeWV0LCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IG9uZS5cbiAgICAgIGlmIChcbiAgICAgICAgMCA8IG1pc3Npb25zW2ldLnZhbCB8fFxuICAgICAgICAhbWlzc2lvbnNbaV0udW5sb2NrZWQgfHxcbiAgICAgICAgIXRoaXMuc2V0dGluZ3MudW5sb2NrTWlzc2lvbnMubWlzc2lvbnNbbWlzc2lvbnNbaV0ubmFtZSBhcyBNaXNzaW9uXS5lbmFibGVkXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tYW5hZ2VyLnRhYi5HQ1BhbmVsPy5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChpc05pbChtb2RlbCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcmljZXMgPSBtdXN0RXhpc3QobW9kZWwubW9kZWw/LnByaWNlcyk7XG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHByaWNlcykge1xuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBhZmZvcmQgdGhpcyByZXNvdXJjZSBwcmljZSwgY29udGludWUgd2l0aCB0aGUgbmV4dCBtaXNzaW9uLlxuICAgICAgICBpZiAodGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKHJlc291cmNlLm5hbWUpIDwgcmVzb3VyY2UudmFsKSB7XG4gICAgICAgICAgY29udGludWUgbWlzc2lvbkxvb3A7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3RhcnQgdGhlIG1pc3Npb24gYnkgY2xpY2tpbmcgdGhlIGJ1dHRvbi5cbiAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBpbnRvIHRoZSBTcGFjZU1hbmFnZXI/XG4gICAgICBtb2RlbC5kb21Ob2RlLmNsaWNrKCk7XG4gICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgIGlmIChpID09PSA3IHx8IGkgPT09IDEyKSB7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcInVwZ3JhZGUuc3BhY2UubWlzc2lvblwiLCBbbWlzc2lvbnNbaV0ubGFiZWxdLCBcImtzLXVwZ3JhZGVcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLnNwYWNlXCIsIFttaXNzaW9uc1tpXS5sYWJlbF0sIFwia3MtdXBncmFkZVwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBidWlsZChuYW1lOiBTcGFjZUJ1aWxkaW5nLCBhbW91bnQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGFtb3VudENhbGN1bGF0ZWQgPSBhbW91bnQ7XG4gICAgY29uc3QgYW1vdW50VGVtcCA9IGFtb3VudENhbGN1bGF0ZWQ7XG4gICAgbGV0IGxhYmVsOiBzdHJpbmc7XG4gICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZShuYW1lLCBcInNwYWNlQnVpbGRpbmdcIik7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBjbGFzc2VzLnVpLnNwYWNlLlBsYW5ldEJ1aWxkaW5nQnRuQ29udHJvbGxlcihcbiAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICApIGFzIFBsYW5ldEJ1aWxkaW5nQnRuQ29udHJvbGxlcjxcbiAgICAgIFVuc2FmZUJ1aWxkaW5nU3RhY2thYmxlQnRuTW9kZWw8VW5zYWZlUGxhbmV0QnVpbGRpbmdCdXR0b25PcHRpb25zPlxuICAgID47XG4gICAgY29uc3QgbW9kZWwgPSBjb250cm9sbGVyLmZldGNoTW9kZWwoeyBjb250cm9sbGVyLCBpZDogaXRlbU1ldGFSYXcubmFtZSB9KTtcbiAgICBhbW91bnRDYWxjdWxhdGVkID0gdGhpcy5fYnVsa01hbmFnZXIuY29uc3RydWN0KG1vZGVsLCBjb250cm9sbGVyLCBhbW91bnRDYWxjdWxhdGVkKTtcbiAgICBsYWJlbCA9IGl0ZW1NZXRhUmF3LmxhYmVsO1xuXG4gICAgaWYgKGFtb3VudENhbGN1bGF0ZWQgIT09IGFtb3VudFRlbXApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgLi4uY2woYCR7bGFiZWx9IEFtb3VudCBvcmRlcmVkOiAke2Ftb3VudFRlbXB9IEFtb3VudCBDb25zdHJ1Y3RlZDogJHthbW91bnRDYWxjdWxhdGVkfWApLFxuICAgICAgKTtcbiAgICAgIC8vIEJhaWwgb3V0IHRvIG5vdCBmbG9vZCB0aGUgbG9nIHdpdGggZ2FyYmFnZS5cbiAgICAgIGlmIChhbW91bnRDYWxjdWxhdGVkID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkobGFiZWwsIGFtb3VudENhbGN1bGF0ZWQsIFwiYnVpbGRcIik7XG5cbiAgICBpZiAoYW1vdW50Q2FsY3VsYXRlZCA9PT0gMSkge1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwiYWN0LmJ1aWxkXCIsIFtsYWJlbF0sIFwia3MtYnVpbGRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgXCJhY3QuYnVpbGRzXCIsXG4gICAgICAgIFtsYWJlbCwgdGhpcy5faG9zdC5yZW5kZXJBYnNvbHV0ZShhbW91bnRDYWxjdWxhdGVkKV0sXG4gICAgICAgIFwia3MtYnVpbGRcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFtb3VudENhbGN1bGF0ZWQ7XG4gIH1cblxuICBnZXRCdWlsZChuYW1lOiBTcGFjZUJ1aWxkaW5nKTogUmVxdWlyZWQ8VW5zYWZlU3BhY2VCdWlsZGluZz4ge1xuICAgIHJldHVybiB0aGlzLl9ob3N0LmdhbWUuc3BhY2UuZ2V0QnVpbGRpbmcobmFtZSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRCdWlsZEJ1dHRvbihpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGFuZWxzID0gdGhpcy5tYW5hZ2VyLnRhYi5wbGFuZXRQYW5lbHM7XG5cbiAgICBpZiAoaXNOaWwocGFuZWxzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGJ1dHRvbjogQnVpbGRpbmdTdGFja2FibGVCdG48e1xuICAgICAgaWQ6IFNwYWNlQnVpbGRpbmc7XG4gICAgICBwbGFuZXQ6IFVuc2FmZVBsYW5ldDtcbiAgICAgIGNvbnRyb2xsZXI6IFBsYW5ldEJ1aWxkaW5nQnRuQ29udHJvbGxlcjxcbiAgICAgICAgVW5zYWZlQnVpbGRpbmdTdGFja2FibGVCdG5Nb2RlbDxVbnNhZmVTcGFjZVByb2dyYW1CdXR0b25PcHRpb25zPlxuICAgICAgPjtcbiAgICB9PiB8IG51bGwgPSBudWxsO1xuICAgIGZvciAoY29uc3QgcGFuZWwgb2YgcGFuZWxzKSB7XG4gICAgICBidXR0b24gPSBwYW5lbC5jaGlsZHJlbi5maW5kKGNoaWxkID0+IGNoaWxkLmlkID09PSBpZCkgPz8gbnVsbDtcblxuICAgICAgaWYgKCFpc05pbChidXR0b24pKSB7XG4gICAgICAgIHJldHVybiBidXR0b247XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGJ1dHRvbiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGJ1dHRvbiBmb3IgJHtpZH0hYCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBlbnVtIExvZ0ZpbHRlckl0ZW1WYXJpYW50IHtcbiAgYnVpbGQgPSBcImtzLWFjdGl2aXR5IHR5cGVfa3MtYnVpbGRcIixcbiAgY3JhZnQgPSBcImtzLWFjdGl2aXR5IHR5cGVfa3MtY3JhZnRcIixcbiAgdXBncmFkZSA9IFwia3MtYWN0aXZpdHkgdHlwZV9rcy11cGdyYWRlXCIsXG4gIHJlc2VhcmNoID0gXCJrcy1hY3Rpdml0eSB0eXBlX2tzLXJlc2VhcmNoXCIsXG4gIHRyYWRlID0gXCJrcy1hY3Rpdml0eSB0eXBlX2tzLXRyYWRlXCIsXG4gIGh1bnQgPSBcImtzLWFjdGl2aXR5IHR5cGVfa3MtaHVudFwiLFxuICBwcmFpc2UgPSBcImtzLWFjdGl2aXR5IHR5cGVfa3MtcHJhaXNlXCIsXG4gIGFkb3JlID0gXCJrcy1hY3Rpdml0eSB0eXBlX2tzLWFkb3JlXCIsXG4gIHRyYW5zY2VuZCA9IFwia3MtYWN0aXZpdHkgdHlwZV9rcy10cmFuc2NlbmRcIixcbiAgZmFpdGggPSBcImtzLWFjdGl2aXR5IHR5cGVfa3MtZmFpdGhcIixcbiAgYWNjZWxlcmF0ZSA9IFwia3MtYWN0aXZpdHkgdHlwZV9rcy1hY2NlbGVyYXRlXCIsXG4gIHRpbWVTa2lwID0gXCJrcy1hY3Rpdml0eSB0eXBlX2tzLXRpbWVTa2lwXCIsXG4gIGZlc3RpdmFsID0gXCJrcy1hY3Rpdml0eSB0eXBlX2tzLWZlc3RpdmFsXCIsXG4gIHN0YXIgPSBcImtzLWFjdGl2aXR5IHR5cGVfa3Mtc3RhclwiLFxuICBkaXN0cmlidXRlID0gXCJrcy1hY3Rpdml0eSB0eXBlX2tzLWRpc3RyaWJ1dGVcIixcbiAgcHJvbW90ZSA9IFwia3MtYWN0aXZpdHkgdHlwZV9rcy1wcm9tb3RlXCIsXG4gIG1pc2MgPSBcImtzLWFjdGl2aXR5XCIsXG59XG5cbmV4cG9ydCBjb25zdCBGaWx0ZXJJdGVtcyA9IFtcbiAgXCJhY2NlbGVyYXRlXCIsXG4gIFwiYWRvcmVcIixcbiAgXCJidWlsZFwiLFxuICBcImNyYWZ0XCIsXG4gIFwiZGlzdHJpYnV0ZVwiLFxuICBcImZhaXRoXCIsXG4gIFwiZmVzdGl2YWxcIixcbiAgXCJodW50XCIsXG4gIFwibWlzY1wiLFxuICBcInByYWlzZVwiLFxuICBcInByb21vdGVcIixcbiAgXCJyZXNlYXJjaFwiLFxuICBcInN0YXJcIixcbiAgXCJ0aW1lU2tpcFwiLFxuICBcInRyYWRlXCIsXG4gIFwidHJhbnNjZW5kXCIsXG4gIFwidXBncmFkZVwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEZpbHRlckl0ZW0gPSAodHlwZW9mIEZpbHRlckl0ZW1zKVtudW1iZXJdO1xuXG5leHBvcnQgY2xhc3MgTG9nRmlsdGVyU2V0dGluZ3NJdGVtIGV4dGVuZHMgU2V0dGluZyB7XG4gIHJlYWRvbmx5ICN2YXJpYW50OiBMb2dGaWx0ZXJJdGVtVmFyaWFudDtcblxuICBnZXQgdmFyaWFudCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdmFyaWFudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHZhcmlhbnQ6IExvZ0ZpbHRlckl0ZW1WYXJpYW50KSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gICAgdGhpcy4jdmFyaWFudCA9IHZhcmlhbnQ7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTG9nRmlsdGVyU2V0dGluZ3NJdGVtcyA9IFJlY29yZDxGaWx0ZXJJdGVtLCBMb2dGaWx0ZXJTZXR0aW5nc0l0ZW0+O1xuXG5leHBvcnQgY2xhc3MgTG9nRmlsdGVyU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgZmlsdGVyczogTG9nRmlsdGVyU2V0dGluZ3NJdGVtcztcbiAgZGlzYWJsZUtHTG9nOiBTZXR0aW5nO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgZGlzYWJsZUtHTG9nID0gbmV3IFNldHRpbmcodHJ1ZSkpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLmZpbHRlcnMgPSB0aGlzLmluaXRGaWx0ZXJzKCk7XG4gICAgdGhpcy5kaXNhYmxlS0dMb2cgPSBkaXNhYmxlS0dMb2c7XG4gIH1cblxuICBwcml2YXRlIGluaXRGaWx0ZXJzKCk6IExvZ0ZpbHRlclNldHRpbmdzSXRlbXMge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgTG9nRmlsdGVyU2V0dGluZ3NJdGVtcztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgRmlsdGVySXRlbXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IExvZ0ZpbHRlclNldHRpbmdzSXRlbShMb2dGaWx0ZXJJdGVtVmFyaWFudFtpdGVtXSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8TG9nRmlsdGVyU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy5maWx0ZXJzLCBzZXR0aW5ncy5maWx0ZXJzLCAoZmlsdGVyLCBpdGVtKSA9PiB7XG4gICAgICBmaWx0ZXIuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gZmlsdGVyLmVuYWJsZWQ7XG4gICAgfSk7XG4gICAgdGhpcy5kaXNhYmxlS0dMb2cuZW5hYmxlZCA9IHNldHRpbmdzLmRpc2FibGVLR0xvZz8uZW5hYmxlZCA/PyB0aGlzLmRpc2FibGVLR0xvZy5lbmFibGVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL2FycmF5LmpzXCI7XG5pbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdhbWVQYWdlIH0gZnJvbSBcIi4uL3R5cGVzL2dhbWUuanNcIjtcbmltcG9ydCB7IHR5cGUgVXBncmFkZSwgVXBncmFkZXMgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyIH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFVwZ3JhZGVTZXR0aW5nc0l0ZW0gZXh0ZW5kcyBTZXR0aW5nVHJpZ2dlciB7XG4gIHJlYWRvbmx5ICN1cGdyYWRlOiBVcGdyYWRlO1xuXG4gIGdldCB1cGdyYWRlKCkge1xuICAgIHJldHVybiB0aGlzLiN1cGdyYWRlO1xuICB9XG5cbiAgY29uc3RydWN0b3IodXBncmFkZTogVXBncmFkZSwgZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgLTEpO1xuICAgIHRoaXMuI3VwZ3JhZGUgPSB1cGdyYWRlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFVwZ3JhZGVTZXR0aW5nc0l0ZW1zID0gUmVjb3JkPFVwZ3JhZGUsIFVwZ3JhZGVTZXR0aW5nc0l0ZW0+O1xuXG5leHBvcnQgY2xhc3MgVXBncmFkZVNldHRpbmdzIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXIge1xuICByZWFkb25seSB1cGdyYWRlczogVXBncmFkZVNldHRpbmdzSXRlbXM7XG5cbiAgY29uc3RydWN0b3IoZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgLTEpO1xuICAgIHRoaXMudXBncmFkZXMgPSB0aGlzLmluaXRVcGdyYWRlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0VXBncmFkZXMoKTogVXBncmFkZVNldHRpbmdzSXRlbXMge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgVXBncmFkZVNldHRpbmdzSXRlbXM7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFVwZ3JhZGVzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBVcGdyYWRlU2V0dGluZ3NJdGVtKGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVHYW1lKGdhbWU6IEdhbWVQYWdlLCBzZXR0aW5nczogVXBncmFkZVNldHRpbmdzKSB7XG4gICAgY29uc3QgaW5TZXR0aW5ncyA9IE9iamVjdC5rZXlzKHNldHRpbmdzLnVwZ3JhZGVzKTtcbiAgICBjb25zdCBpbkdhbWUgPSBnYW1lLndvcmtzaG9wLnVwZ3JhZGVzLm1hcCh1cGdyYWRlID0+IHVwZ3JhZGUubmFtZSk7XG5cbiAgICBjb25zdCBtaXNzaW5nSW5TZXR0aW5ncyA9IGRpZmZlcmVuY2UoaW5HYW1lLCBpblNldHRpbmdzKTtcbiAgICBjb25zdCByZWR1bmRhbnRJblNldHRpbmdzID0gZGlmZmVyZW5jZShpblNldHRpbmdzLCBpbkdhbWUpO1xuXG4gICAgZm9yIChjb25zdCB1cGdyYWRlIG9mIG1pc3NpbmdJblNldHRpbmdzKSB7XG4gICAgICBjb25zb2xlLndhcm4oLi4uY2woYFRoZSB3b3Jrc2hvcCB1cGdyYWRlICcke3VwZ3JhZGV9JyBpcyBub3QgdHJhY2tlZCBpbiBLaXR0ZW4gU2NpZW50aXN0cyFgKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdXBncmFkZSBvZiByZWR1bmRhbnRJblNldHRpbmdzKSB7XG4gICAgICBjb25zb2xlLndhcm4oLi4uY2woYFRoZSB3b3Jrc2hvcCB1cGdyYWRlICcke3VwZ3JhZGV9JyBpcyBub3QgYW4gdXBncmFkZSBpbiBLaXR0ZW5zIEdhbWUhYCkpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8VXBncmFkZVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMudXBncmFkZXMsIHNldHRpbmdzLnVwZ3JhZGVzLCAodXBncmFkZSwgaXRlbSkgPT4ge1xuICAgICAgdXBncmFkZS5lbmFibGVkID0gaXRlbT8uZW5hYmxlZCA/PyB1cGdyYWRlLmVuYWJsZWQ7XG4gICAgICB1cGdyYWRlLnRyaWdnZXIgPSBpdGVtPy50cmlnZ2VyID8/IHVwZ3JhZGUudHJpZ2dlcjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZGlmZmVyZW5jZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9hcnJheS5qc1wiO1xuaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBHYW1lUGFnZSB9IGZyb20gXCIuLi90eXBlcy9nYW1lLmpzXCI7XG5pbXBvcnQgeyB0eXBlIFJlc291cmNlQ3JhZnRhYmxlLCBSZXNvdXJjZXNDcmFmdGFibGUgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmcsIFNldHRpbmdMaW1pdGVkTWF4VHJpZ2dlciwgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVXBncmFkZVNldHRpbmdzIH0gZnJvbSBcIi4vVXBncmFkZVNldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBDcmFmdFNldHRpbmdzSXRlbSBleHRlbmRzIFNldHRpbmdMaW1pdGVkTWF4VHJpZ2dlciB7XG4gIHJlYWRvbmx5ICNyZXNvdXJjZTogUmVzb3VyY2VDcmFmdGFibGU7XG5cbiAgZ2V0IHJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLiNyZXNvdXJjZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHJlc291cmNlOiBSZXNvdXJjZUNyYWZ0YWJsZSwgZW5hYmxlZCA9IGZhbHNlLCBsaW1pdGVkID0gdHJ1ZSkge1xuICAgIHN1cGVyKGVuYWJsZWQsIGxpbWl0ZWQpO1xuICAgIHRoaXMuI3Jlc291cmNlID0gcmVzb3VyY2U7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgV29ya3Nob3BSZXNvdXJjZVNldHRpbmdzID0gUmVjb3JkPFJlc291cmNlQ3JhZnRhYmxlLCBDcmFmdFNldHRpbmdzSXRlbT47XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hvcFNldHRpbmdzIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXIge1xuICByZXNvdXJjZXM6IFdvcmtzaG9wUmVzb3VyY2VTZXR0aW5ncztcblxuICBzaGlwT3ZlcnJpZGU6IFNldHRpbmc7XG4gIHVubG9ja1VwZ3JhZGVzOiBVcGdyYWRlU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW5hYmxlZCA9IGZhbHNlLFxuICAgIHRyaWdnZXIgPSAtMSxcbiAgICB1bmxvY2tVcGdyYWRlcyA9IG5ldyBVcGdyYWRlU2V0dGluZ3MoKSxcbiAgICBzaGlwT3ZlcnJpZGUgPSBuZXcgU2V0dGluZygpLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkLCB0cmlnZ2VyKTtcbiAgICB0aGlzLnJlc291cmNlcyA9IHRoaXMuaW5pdFJlc291cmNlcygpO1xuICAgIHRoaXMuc2hpcE92ZXJyaWRlID0gc2hpcE92ZXJyaWRlO1xuICAgIHRoaXMudW5sb2NrVXBncmFkZXMgPSB1bmxvY2tVcGdyYWRlcztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFJlc291cmNlcygpOiBXb3Jrc2hvcFJlc291cmNlU2V0dGluZ3Mge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgV29ya3Nob3BSZXNvdXJjZVNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBSZXNvdXJjZXNDcmFmdGFibGUpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IENyYWZ0U2V0dGluZ3NJdGVtKGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVHYW1lKGdhbWU6IEdhbWVQYWdlLCBzZXR0aW5nczogV29ya3Nob3BTZXR0aW5ncykge1xuICAgIGNvbnN0IGluU2V0dGluZ3MgPSBPYmplY3Qua2V5cyhzZXR0aW5ncy5yZXNvdXJjZXMpO1xuICAgIGNvbnN0IGluR2FtZSA9IGdhbWUud29ya3Nob3AuY3JhZnRzLm1hcChjcmFmdCA9PiBjcmFmdC5uYW1lKTtcblxuICAgIGNvbnN0IG1pc3NpbmdJblNldHRpbmdzID0gZGlmZmVyZW5jZShpbkdhbWUsIGluU2V0dGluZ3MpO1xuICAgIGNvbnN0IHJlZHVuZGFudEluU2V0dGluZ3MgPSBkaWZmZXJlbmNlKGluU2V0dGluZ3MsIGluR2FtZSk7XG5cbiAgICBmb3IgKGNvbnN0IGNyYWZ0IG9mIG1pc3NpbmdJblNldHRpbmdzKSB7XG4gICAgICBjb25zb2xlLndhcm4oLi4uY2woYFRoZSB3b3Jrc2hvcCBjcmFmdCAnJHtjcmFmdH0nIGlzIG5vdCB0cmFja2VkIGluIEtpdHRlbiBTY2llbnRpc3RzIWApKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjcmFmdCBvZiByZWR1bmRhbnRJblNldHRpbmdzKSB7XG4gICAgICBjb25zb2xlLndhcm4oLi4uY2woYFRoZSB3b3Jrc2hvcCBjcmFmdCAnJHtjcmFmdH0nIGlzIG5vdCBhbiB1cGdyYWRlIGluIEtpdHRlbnMgR2FtZSFgKSk7XG4gICAgfVxuXG4gICAgVXBncmFkZVNldHRpbmdzLnZhbGlkYXRlR2FtZShnYW1lLCBzZXR0aW5ncy51bmxvY2tVcGdyYWRlcyk7XG4gIH1cblxuICBsb2FkKHNldHRpbmdzOiBNYXliZTxQYXJ0aWFsPFdvcmtzaG9wU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy5yZXNvdXJjZXMsIHNldHRpbmdzLnJlc291cmNlcywgKHJlc291cmNlLCBpdGVtKSA9PiB7XG4gICAgICByZXNvdXJjZS5lbmFibGVkID0gaXRlbT8uZW5hYmxlZCA/PyByZXNvdXJjZS5lbmFibGVkO1xuICAgICAgcmVzb3VyY2UubGltaXRlZCA9IGl0ZW0/LmxpbWl0ZWQgPz8gcmVzb3VyY2UubGltaXRlZDtcbiAgICAgIHJlc291cmNlLm1heCA9IGl0ZW0/Lm1heCA/PyByZXNvdXJjZS5tYXg7XG4gICAgICByZXNvdXJjZS50cmlnZ2VyID0gaXRlbT8udHJpZ2dlciA/PyByZXNvdXJjZS50cmlnZ2VyO1xuICAgIH0pO1xuXG4gICAgdGhpcy51bmxvY2tVcGdyYWRlcy5sb2FkKHNldHRpbmdzLnVubG9ja1VwZ3JhZGVzKTtcblxuICAgIHRoaXMuc2hpcE92ZXJyaWRlLmVuYWJsZWQgPSBzZXR0aW5ncy5zaGlwT3ZlcnJpZGU/LmVuYWJsZWQgPz8gdGhpcy5zaGlwT3ZlcnJpZGUuZW5hYmxlZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIG11c3RFeGlzdCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IHR5cGUgQXV0b21hdGlvbiwgRW5naW5lLCB0eXBlIEZyYW1lQ29udGV4dCB9IGZyb20gXCIuL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBNYXRlcmlhbHNDYWNoZSB9IGZyb20gXCIuL2hlbHBlci9NYXRlcmlhbHNDYWNoZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4vS2l0dGVuU2NpZW50aXN0cy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBDcmFmdFNldHRpbmdzSXRlbSwgV29ya3Nob3BTZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzL1dvcmtzaG9wU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFRhYk1hbmFnZXIgfSBmcm9tIFwiLi9UYWJNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBvYmplY3RFbnRyaWVzIH0gZnJvbSBcIi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgbmVnYXRpdmVPbmVUb0luZmluaXR5IH0gZnJvbSBcIi4vdG9vbHMvRm9ybWF0LmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSwgUmVzb3VyY2VDcmFmdGFibGUgfSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZU1hbmFnZXIsIFVuc2FmZVJlc291cmNlIH0gZnJvbSBcIi4vdHlwZXMvcmVzb3VyY2VzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFZpbGxhZ2UgfSBmcm9tIFwiLi90eXBlcy92aWxsYWdlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVuc2FmZUNyYWZ0LCBVbnNhZmVVcGdyYWRlIH0gZnJvbSBcIi4vdHlwZXMvd29ya3Nob3AuanNcIjtcbmltcG9ydCB7IFVwZ3JhZGVNYW5hZ2VyIH0gZnJvbSBcIi4vVXBncmFkZU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IFVzZXJTY3JpcHRMb2FkZXIgfSBmcm9tIFwiLi9Vc2VyU2NyaXB0TG9hZGVyLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hvcE1hbmFnZXIgZXh0ZW5kcyBVcGdyYWRlTWFuYWdlciBpbXBsZW1lbnRzIEF1dG9tYXRpb24ge1xuICByZWFkb25seSBzZXR0aW5nczogV29ya3Nob3BTZXR0aW5ncztcbiAgcmVhZG9ubHkgbWFuYWdlcjogVGFiTWFuYWdlcjxWaWxsYWdlPjtcblxuICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9DT05TVU1FX1JBVEUgPSAxO1xuXG4gIGNvbnN0cnVjdG9yKGhvc3Q6IEtpdHRlblNjaWVudGlzdHMsIHNldHRpbmdzID0gbmV3IFdvcmtzaG9wU2V0dGluZ3MoKSkge1xuICAgIHN1cGVyKGhvc3QpO1xuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVGFiTWFuYWdlcih0aGlzLl9ob3N0LCBcIldvcmtzaG9wXCIpO1xuICB9XG5cbiAgdGljayhfY29udGV4dDogRnJhbWVDb250ZXh0KSB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLmVuYWJsZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmF1dG9DcmFmdCgpO1xuICAgIHRoaXMucmVmcmVzaFN0b2NrKCk7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy51bmxvY2tVcGdyYWRlcy5lbmFibGVkKSB7XG4gICAgICB0aGlzLm1hbmFnZXIucmVuZGVyKCk7XG4gICAgICByZXR1cm4gdGhpcy5hdXRvVW5sb2NrKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgYXN5bmMgYXV0b1VubG9jaygpIHtcbiAgICBpZiAoIXRoaXMuX2hvc3QuZ2FtZS53b3Jrc2hvcFRhYi52aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdXBncmFkZXMgPSB0aGlzLl9ob3N0LmdhbWUud29ya3Nob3AudXBncmFkZXM7XG4gICAgY29uc3QgdG9VbmxvY2sgPSBuZXcgQXJyYXk8VW5zYWZlVXBncmFkZT4oKTtcblxuICAgIHdvcmtMb29wOiBmb3IgKGNvbnN0IHNldHRpbmcgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnNldHRpbmdzLnVubG9ja1VwZ3JhZGVzLnVwZ3JhZGVzKSkge1xuICAgICAgaWYgKCFzZXR0aW5nLmVuYWJsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVwZ3JhZGUgPSB1cGdyYWRlcy5maW5kKHN1YmplY3QgPT4gc3ViamVjdC5uYW1lID09PSBzZXR0aW5nLnVwZ3JhZGUpO1xuICAgICAgaWYgKGlzTmlsKHVwZ3JhZGUpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uY2woYFVwZ3JhZGUgJyR7c2V0dGluZy51cGdyYWRlfScgbm90IGZvdW5kIGluIGdhbWUhYCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwZ3JhZGUucmVzZWFyY2hlZCB8fCAhdXBncmFkZS51bmxvY2tlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgcHJpY2VzIGZvciB0aGlzIHVwZ3JhZGUsIHNvIHRoYXQgd2UgY2FuIGFwcGx5IGVmZmVjdHMgdG8gaXQuXG4gICAgICBsZXQgcHJpY2VzID0gVXNlclNjcmlwdExvYWRlci53aW5kb3cuZG9qby5jbG9uZSh1cGdyYWRlLnByaWNlcyk7XG4gICAgICBwcmljZXMgPSB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5nZXRFZmZlY3RMZWFkZXIoXCJzY2llbnRpc3RcIiwgcHJpY2VzKTtcbiAgICAgIGZvciAoY29uc3QgcHJpY2Ugb2YgcHJpY2VzKSB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IHRoaXMuZ2V0VmFsdWVBdmFpbGFibGUocHJpY2UubmFtZSk7XG4gICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5nZXRSZXNvdXJjZShwcmljZS5uYW1lKTtcbiAgICAgICAgY29uc3QgdHJpZ2dlciA9IEVuZ2luZS5ldmFsdWF0ZVN1YlNlY3Rpb25UcmlnZ2VyKFxuICAgICAgICAgIHRoaXMuc2V0dGluZ3MudW5sb2NrVXBncmFkZXMudHJpZ2dlcixcbiAgICAgICAgICBzZXR0aW5nLnRyaWdnZXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0cmlnZ2VyIDwgMCB8fFxuICAgICAgICAgICgwIDwgdHJpZ2dlciAmJiBhdmFpbGFibGUgPCByZXNvdXJjZS5tYXhWYWx1ZSAqIHRyaWdnZXIpIHx8XG4gICAgICAgICAgYXZhaWxhYmxlIDwgcHJpY2UudmFsXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlIHdvcmtMb29wO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRvVW5sb2NrLnB1c2godXBncmFkZSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRvVW5sb2NrKSB7XG4gICAgICBhd2FpdCB0aGlzLnVwZ3JhZGUoaXRlbSwgXCJ3b3Jrc2hvcFwiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGNyYWZ0IGFzIG1hbnkgb2YgdGhlIHBhc3NlZCByZXNvdXJjZXMgYXMgcG9zc2libGUuXG4gICAqIFVzdWFsbHksIHRoaXMgaXMgY2FsbGVkIGF0IGVhY2ggaXRlcmF0aW9uIG9mIHRoZSBhdXRvbWF0aW9uIGVuZ2luZSB0b1xuICAgKiBoYW5kbGUgdGhlIGNyYWZ0aW5nIG9mIGl0ZW1zIG9uIHRoZSBXb3Jrc2hvcCB0YWIuXG4gICAqXG4gICAqIEBwYXJhbSBjcmFmdHMgVGhlIHJlc291cmNlcyB0byBidWlsZC5cbiAgICovXG4gIGF1dG9DcmFmdChcbiAgICBjcmFmdHM6IFBhcnRpYWw8UmVjb3JkPFJlc291cmNlQ3JhZnRhYmxlLCBDcmFmdFNldHRpbmdzSXRlbT4+ID0gdGhpcy5zZXR0aW5ncy5yZXNvdXJjZXMsXG4gICkge1xuICAgIGNvbnN0IGNyYWZ0UmVxdWVzdHMgPSBuZXcgTWFwPFxuICAgICAgQ3JhZnRTZXR0aW5nc0l0ZW0sXG4gICAgICB7XG4gICAgICAgIGNvdW50UmVxdWVzdGVkOiBudW1iZXI7XG4gICAgICAgIG1hdGVyaWFsczogQXJyYXk8e1xuICAgICAgICAgIHJlc291cmNlOiBSZXNvdXJjZTtcbiAgICAgICAgICBjb25zdW1lOiBudW1iZXI7XG4gICAgICAgIH0+O1xuICAgICAgfVxuICAgID4oKTtcbiAgICBjb25zdCBzZWN0aW9uVHJpZ2dlciA9IHRoaXMuc2V0dGluZ3MudHJpZ2dlcjtcblxuICAgIC8vIEZpbmQgYWxsIHJlc291cmNlcyB3ZSB3b3VsZCB3YW50IHRvIGNyYWZ0LlxuICAgIC8vIEZvciBjcmFmdHMgdGhhdCByZXF1aXJlIHJlc291cmNlcyB3aXRoIGEgY2FwYWNpdHksIHRob3NlIHJlc291cmNlcyBtdXN0XG4gICAgLy8gYmUgYXQgb3IgYWJvdmUgdGhlIHRyaWdnZXIgZm9yIHRoZW0gdG8gYmUgY29uc2lkZXJlZCB0byBiZSBjcmFmdGVkLlxuICAgIGZvciAoY29uc3QgY3JhZnQgb2YgT2JqZWN0LnZhbHVlcyhjcmFmdHMpKSB7XG4gICAgICBjb25zdCB0cmlnZ2VyID0gRW5naW5lLmV2YWx1YXRlU3ViU2VjdGlvblRyaWdnZXIoc2VjdGlvblRyaWdnZXIsIGNyYWZ0LnRyaWdnZXIpO1xuICAgICAgaWYgKHRyaWdnZXIgPCAwIHx8ICFjcmFmdC5lbmFibGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50ID0gIWNyYWZ0Lm1heCA/IGZhbHNlIDogdGhpcy5nZXRSZXNvdXJjZShjcmFmdC5yZXNvdXJjZSk7XG4gICAgICBjb25zdCBtYXggPSBuZWdhdGl2ZU9uZVRvSW5maW5pdHkoY3JhZnQubWF4KTtcbiAgICAgIGlmIChjdXJyZW50ICYmIG1heCA8IGN1cnJlbnQudmFsdWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHdlIGNhbid0IGV2ZW4gY3JhZnQgYSBzaW5nbGUgaXRlbSBvZiB0aGUgcmVzb3VyY2UsIHNraXAgaXQuXG4gICAgICBpZiAoIXRoaXMuc2luZ2xlQ3JhZnRQb3NzaWJsZShjcmFmdC5yZXNvdXJjZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IE9iamVjdC5rZXlzKHRoaXMuZ2V0TWF0ZXJpYWxzKGNyYWZ0LnJlc291cmNlKSkgYXMgQXJyYXk8UmVzb3VyY2U+O1xuICAgICAgLy8gVGhlIHJlc291cmNlIGluZm9ybWF0aW9uIGZvciB0aGUgcmVxdWlyZW1lbnQgb2YgdGhpcyBjcmFmdCB3aGljaCBoYXZlIGEgY2FwYWNpdHkuXG4gICAgICBjb25zdCByZXF1aXJlZE1hdGVyaWFscyA9IG1hdGVyaWFsc1xuICAgICAgICAubWFwKG1hdGVyaWFsID0+IHRoaXMuZ2V0UmVzb3VyY2UobWF0ZXJpYWwpKVxuICAgICAgICAuZmlsdGVyKG1hdGVyaWFsID0+IDAgPCBtYXRlcmlhbC5tYXhWYWx1ZSk7XG5cbiAgICAgIGNvbnN0IGFsbE1hdGVyaWFsc0Fib3ZlVHJpZ2dlciA9XG4gICAgICAgIHJlcXVpcmVkTWF0ZXJpYWxzLmZpbHRlcihtYXRlcmlhbCA9PiBtYXRlcmlhbC52YWx1ZSAvIG1hdGVyaWFsLm1heFZhbHVlIDwgdHJpZ2dlcilcbiAgICAgICAgICAubGVuZ3RoID09PSAwO1xuXG4gICAgICBpZiAoIWFsbE1hdGVyaWFsc0Fib3ZlVHJpZ2dlcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY3JhZnRSZXF1ZXN0cy5zZXQoY3JhZnQsIHtcbiAgICAgICAgY291bnRSZXF1ZXN0ZWQ6IDEsXG4gICAgICAgIG1hdGVyaWFsczogbWF0ZXJpYWxzLm1hcChtYXRlcmlhbCA9PiAoe1xuICAgICAgICAgIGNvbnN1bWU6IDAsXG4gICAgICAgICAgcmVzb3VyY2U6IG1hdGVyaWFsLFxuICAgICAgICB9KSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY3JhZnRSZXF1ZXN0cy5zaXplIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBhbGwgY3JhZnRzIHVuZGVyIGNvbnNpZGVyYXRpb24sIGZpbmQgdGhlIGNyYWZ0cyB0aGF0IHNoYXJlIHJlc291cmNlcyBpbiB0aGVpciByZXF1aXJlbWVudHMuXG4gICAgLy8gV2Ugd2lsbCB1c2UgdGhpcyB0byBzcGxpdCBjcmFmdHMgZXZlbmx5IGFtb25nIHRoZSBhdmFpbGFibGUgc3RvY2sgb2YgdGhhdCByZXNvdXJjZS5cbiAgICBjb25zdCBiaWxsT2ZNYXRlcmlhbHMgPSBuZXcgTWFwPFJlc291cmNlLCBBcnJheTxSZXNvdXJjZUNyYWZ0YWJsZT4+KCk7XG4gICAgZm9yIChjb25zdCBbY3JhZnQsIHJlcXVlc3RdIG9mIGNyYWZ0UmVxdWVzdHMpIHtcbiAgICAgIGZvciAoY29uc3QgbWF0ZXJpYWwgb2YgcmVxdWVzdC5tYXRlcmlhbHMpIHtcbiAgICAgICAgaWYgKCFiaWxsT2ZNYXRlcmlhbHMuaGFzKG1hdGVyaWFsLnJlc291cmNlKSkge1xuICAgICAgICAgIGJpbGxPZk1hdGVyaWFscy5zZXQobWF0ZXJpYWwucmVzb3VyY2UsIG5ldyBBcnJheTxSZXNvdXJjZUNyYWZ0YWJsZT4oKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uc3VtZXJzID0gbXVzdEV4aXN0KGJpbGxPZk1hdGVyaWFscy5nZXQobWF0ZXJpYWwucmVzb3VyY2UpKTtcbiAgICAgICAgY29uc3VtZXJzLnB1c2goY3JhZnQucmVzb3VyY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERldGVybWluZSBob3cgbXVjaCBvZiBlYWNoIHJlc291cmNlIHdlIHdhbnQgdG8gc3BlbmQgb24gZWFjaCBjcmFmdC5cbiAgICBmb3IgKGNvbnN0IFssIHJlcXVlc3RdIG9mIGNyYWZ0UmVxdWVzdHMpIHtcbiAgICAgIGZvciAoY29uc3QgbWF0ZXJpYWwgb2YgcmVxdWVzdC5tYXRlcmlhbHMpIHtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlID0gdGhpcy5nZXRWYWx1ZUF2YWlsYWJsZShtYXRlcmlhbC5yZXNvdXJjZSk7XG4gICAgICAgIG1hdGVyaWFsLmNvbnN1bWUgPSBhdmFpbGFibGUgLyBtdXN0RXhpc3QoYmlsbE9mTWF0ZXJpYWxzLmdldChtYXRlcmlhbC5yZXNvdXJjZSkpLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaG93IG11Y2ggb2YgZWFjaCBjcmFmdCB3ZSB3YW50IHRvIHBlcmZvcm0sIGdpdmVuIG91ciByZXNvdXJjZSBhbGxvY2F0aW9ucy5cbiAgICBmb3IgKGNvbnN0IFtjcmFmdCwgcmVxdWVzdF0gb2YgY3JhZnRSZXF1ZXN0cykge1xuICAgICAgY29uc3QgbWF0ZXJpYWxzID0gdGhpcy5nZXRNYXRlcmlhbHMoY3JhZnQucmVzb3VyY2UpO1xuICAgICAgbGV0IGFtb3VudCA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICBmb3IgKGNvbnN0IG1hdGVyaWFsIG9mIHJlcXVlc3QubWF0ZXJpYWxzKSB7XG4gICAgICAgIC8vIEhvdyBtdWNoIG9mIHRoZSBtYXRlcmlhbCBpcyBuZWVkZWQgdG8gY3JhZnQgMSBuZXcgcmVzb3VyY2UuXG4gICAgICAgIGNvbnN0IG1hdGVyaWFsQW1vdW50ID0gbXVzdEV4aXN0KG1hdGVyaWFsc1ttYXRlcmlhbC5yZXNvdXJjZV0pO1xuXG4gICAgICAgIGNvbnN0IG1hdGVyaWFsUmVzb3VyY2UgPSB0aGlzLmdldFJlc291cmNlKG1hdGVyaWFsLnJlc291cmNlKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgLy8gRm9yIHVubGltaXRlZCBjcmFmdHMsIGFzc2lnbiBhbGwgcmVzb3VyY2VzLlxuICAgICAgICAgICFjcmFmdC5saW1pdGVkIHx8XG4gICAgICAgICAgLy8gSGFuZGxlIHRoZSBzaGlwIG92ZXJyaWRlLlxuICAgICAgICAgIChjcmFmdC5yZXNvdXJjZSA9PT0gXCJzaGlwXCIgJiZcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3Muc2hpcE92ZXJyaWRlLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHRoaXMuZ2V0UmVzb3VyY2UoXCJzaGlwXCIpLnZhbHVlIDwgMjQzKVxuICAgICAgICApIHtcbiAgICAgICAgICBhbW91bnQgPSBNYXRoLm1pbihhbW91bnQsIG1hdGVyaWFsLmNvbnN1bWUgLyBtYXRlcmlhbEFtb3VudCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYXRpbyA9IHRoaXMuX2hvc3QuZ2FtZS5nZXRSZXNDcmFmdFJhdGlvKGNyYWZ0LnJlc291cmNlKTtcblxuICAgICAgICAvLyBRdWFudGl0eSBvZiBzb3VyY2UgYW5kIHRhcmdldCByZXNvdXJjZSBjdXJyZW50bHkgYXZhaWxhYmxlLlxuICAgICAgICBjb25zdCBhdmFpbGFibGVTb3VyY2UgPVxuICAgICAgICAgIHRoaXMuZ2V0VmFsdWVBdmFpbGFibGUobWF0ZXJpYWwucmVzb3VyY2UpIC9cbiAgICAgICAgICBtdXN0RXhpc3QoYmlsbE9mTWF0ZXJpYWxzLmdldChtYXRlcmlhbC5yZXNvdXJjZSkpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlVGFyZ2V0ID0gdGhpcy5nZXRWYWx1ZUF2YWlsYWJsZShjcmFmdC5yZXNvdXJjZSk7XG5cbiAgICAgICAgLy8gSG93IG11Y2ggc291cmNlIHJlc291cmNlIGlzIGNvbnN1bWVkIGFuZCB0YXJnZXQgcmVzb3VyY2UgaXMgY3JhZnRlZCBwZXIgY3JhZnQgb3BlcmF0aW9uLlxuICAgICAgICBjb25zdCByZWNpcGVSZXF1aXJlcyA9IG1hdGVyaWFsQW1vdW50O1xuICAgICAgICBjb25zdCByZWNpcGVQcm9kdWNlcyA9IDEgKyByYXRpbztcblxuICAgICAgICAvLyBIb3cgbWFueSBjcmFmdHMgY291bGQgd2UgZG8gZ2l2ZW4gdGhlIGFtb3VudCBvZiBzb3VyY2UgcmVzb3VyY2UgYXZhaWxhYmxlLlxuICAgICAgICBjb25zdCBjcmFmdHNQb3NzaWJsZSA9IGF2YWlsYWJsZVNvdXJjZSAvIHJlY2lwZVJlcXVpcmVzO1xuXG4gICAgICAgIC8vIEhvdyBtYW55IGNyYWZ0cyB3ZXJlIGh5cG90aGV0aWNhbGx5IGRvbmUgdG8gcHJvZHVjZSB0aGUgY3VycmVudCBhbW91bnQgb2YgdGFyZ2V0IHJlc291cmNlLlxuICAgICAgICBjb25zdCBjcmFmdHNEb25lID0gYXZhaWxhYmxlVGFyZ2V0IC8gcmVjaXBlUHJvZHVjZXM7XG4gICAgICAgIC8vIFRoZSBcIm9yZGVyIG9mIG1hZ25pdHVkZVwiIChob3cgbWFueSBwb3dlcnMgb2YgMTApIG9mIHRoZSBleGlzdGluZyB0YXJnZXQgcmVzb3VyY2UuXG4gICAgICAgIGNvbnN0IG9yZGVyRG9uZSA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoTWF0aC5sb2coY3JhZnRzRG9uZSkgLyBNYXRoLkxOMTAgKyAwLjAwMDAwMDAwMSkpO1xuXG4gICAgICAgIC8vIENyYWZ0aW5nIGdldHMgcHJvZ3Jlc3NpdmVseSBtb3JlIGV4cGVuc2l2ZSBhcyB0aGUgYW1vdW50IG9mIHRoZSB0YXJnZXQgaW5jcmVhc2VzLlxuICAgICAgICAvLyBUaGlzIGhldXJpc3RpYyBnaXZlcyBvdGhlciwgY2hlYXBlciwgdGFyZ2V0cyBhIGNoYW5jZSB0byBnZXQgYnVpbHQgZnJvbSB0aGUgc2FtZSBzb3VyY2UgcmVzb3VyY2UuXG4gICAgICAgIGFtb3VudCA9IE1hdGgubWluKFxuICAgICAgICAgIC8vIFdoYXRldmVyIHdhcyBwcmV2aW91c2x5IGFzc3VtZWQgYXMgdGhlIGJlc3QgYW1vdW50LlxuICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAvLyBXZSB3YW50IHRvIGNyYWZ0IHRoZSBsb3dlc3QgYW1vdW50IG9mIHRoZXNlIHZhbHVlcywgYXMgd2UncmUgaW4gdGhlIFwibGltaXRlZFwiIG1vZGUuXG4gICAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgICAvLyBXZSB0YWtlIHRoZSBwb3NzaWJsZSBjcmFmdHMgYXMgdGhlIGJhc2VsaW5lXG4gICAgICAgICAgICBjcmFmdHNQb3NzaWJsZSAtXG4gICAgICAgICAgICAgIC8vIElmIHRoZSBzb3VyY2UgbWF0ZXJpYWwgaXMgb25lIHRoYXQgaGFzIGEgc3RvcmFnZSBjYXBhY2l0eSwgYW5kIHRoZSBzdG9yYWdlIGlzIGZ1bGwsXG4gICAgICAgICAgICAgIC8vIHRoZW4gd2Ugd2FudCB0byBhbGxvdyBhbGwgcG9zc2libGUgY3JhZnRzIHRvIGJlIGNyYWZ0ZWQuIFNvIHdlIHN1YnRyYWN0IDAuXG4gICAgICAgICAgICAgICgwIDwgbWF0ZXJpYWxSZXNvdXJjZS5tYXhWYWx1ZSAmJiBtYXRlcmlhbFJlc291cmNlLm1heFZhbHVlIDw9IG1hdGVyaWFsUmVzb3VyY2UudmFsdWVcbiAgICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgICA6IC8vIElmIHRoZSByZXNvdXJjZSBpcyBub3QgY2FwcGVkLCB3ZSBzdWJ0cmFjdCB0aGUgY3JhZnRzIHdlIGhhdmUgYWxyZWFkeSBkb25lLlxuICAgICAgICAgICAgICAgICAgY3JhZnRzRG9uZSksXG4gICAgICAgICAgICAvLyBUaGUgc2FmZSBsaW1pdCBpcyB0byBidXkgdGhlIG5leHQgaGlnaGVyIG9yZGVyIG9mIG1hZ25pdHVkZSBvZiBpdGVtcywgdG8gbm90XG4gICAgICAgICAgICAvLyB3YXN0ZSBhbGwgcmVzb3VyY2VzIGlmIHRoZSB0YXJnZXQgcmVzb3VyY2UgaXMgdmVyeSBsb3csIGxpa2UgYWZ0ZXIgYSByZXNldCB3aXRoIGNocm9ub3NwaGVyZXMuXG4gICAgICAgICAgICAxMCAqKiAob3JkZXJEb25lICsgMSksXG4gICAgICAgICAgKSxcbiAgICAgICAgICAvLyBUaGUgYW1vdW50IG9mIHJlc291cmNlcyB3ZSBjb3VsZCBjcmFmdCwgYmFzZWQgb24gb3VyIGNvbnN1bWUgcmF0ZS5cbiAgICAgICAgICBtYXRlcmlhbC5jb25zdW1lIC8gbWF0ZXJpYWxBbW91bnQsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF2YWlsYWJsZVRhcmdldCA9IHRoaXMuZ2V0VmFsdWVBdmFpbGFibGUoY3JhZnQucmVzb3VyY2UpO1xuICAgICAgY29uc3QgcmVjaXBlUHJvZHVjZXMgPSAxICsgdGhpcy5faG9zdC5nYW1lLmdldFJlc0NyYWZ0UmF0aW8oY3JhZnQucmVzb3VyY2UpO1xuXG4gICAgICAvLyBJbiBhbnkgY2FzZSwgYXV0b0NyYWZ0IGFtb3VudCBzaG91bGQgbm90IGV4Y2VlZCBOdW1iZXIuTUFYX1ZBTFVFXG4gICAgICBjb25zdCBjcmFmdHNNYXhMaW1pdCA9IE51bWJlci5NQVhfVkFMVUUgLyByZWNpcGVQcm9kdWNlcyAtIGF2YWlsYWJsZVRhcmdldCAvIHJlY2lwZVByb2R1Y2VzO1xuICAgICAgYW1vdW50ID0gTWF0aC5taW4oYW1vdW50LCBjcmFmdHNNYXhMaW1pdCk7XG5cbiAgICAgIHJlcXVlc3QuY291bnRSZXF1ZXN0ZWQgPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgY3JhZnQubWF4ID09PSAtMVxuICAgICAgICAgID8gYW1vdW50XG4gICAgICAgICAgOiBNYXRoLm1pbihhbW91bnQsIChjcmFmdC5tYXggLSBhdmFpbGFibGVUYXJnZXQpIC8gcmVjaXBlUHJvZHVjZXMpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjcmFmdCwgcmVxdWVzdF0gb2YgY3JhZnRSZXF1ZXN0cykge1xuICAgICAgaWYgKHJlcXVlc3QuY291bnRSZXF1ZXN0ZWQgPCAxKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5jcmFmdChjcmFmdC5yZXNvdXJjZSwgcmVxdWVzdC5jb3VudFJlcXVlc3RlZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyYWZ0IGEgY2VydGFpbiBhbW91bnQgb2YgaXRlbXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSByZXNvdXJjZSB0byBjcmFmdC5cbiAgICogQHBhcmFtIGFtb3VudCBIb3cgbWFueSBpdGVtcyBvZiB0aGUgcmVzb3VyY2UgdG8gY3JhZnQuXG4gICAqL1xuICBjcmFmdChuYW1lOiBSZXNvdXJjZUNyYWZ0YWJsZSwgYW1vdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgYW1vdW50Q2FsY3VsYXRlZCA9IE1hdGguZmxvb3IoYW1vdW50KTtcblxuICAgIGlmIChhbW91bnRDYWxjdWxhdGVkIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2NhbkNyYWZ0KG5hbWUsIGFtb3VudENhbGN1bGF0ZWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3JhZnQgPSB0aGlzLmdldENyYWZ0KG5hbWUpO1xuICAgIGNvbnN0IHJhdGlvID0gdGhpcy5faG9zdC5nYW1lLmdldFJlc0NyYWZ0UmF0aW8oY3JhZnQubmFtZSk7XG5cbiAgICB0aGlzLl9ob3N0LmdhbWUuY3JhZnQoY3JhZnQubmFtZSwgYW1vdW50Q2FsY3VsYXRlZCk7XG5cbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KG5hbWUpKS50aXRsZTtcblxuICAgIC8vIERldGVybWluZSBhY3R1YWwgYW1vdW50IGFmdGVyIGNyYWZ0aW5nIHVwZ3JhZGVzXG4gICAgYW1vdW50Q2FsY3VsYXRlZCA9IE51bWJlci5wYXJzZUZsb2F0KChhbW91bnRDYWxjdWxhdGVkICogKDEgKyByYXRpbykpLnRvRml4ZWQoMikpO1xuXG4gICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KHJlc291cmNlTmFtZSwgYW1vdW50Q2FsY3VsYXRlZCwgXCJjcmFmdFwiKTtcbiAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXG4gICAgICBcImFjdC5jcmFmdFwiLFxuICAgICAgW3RoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQoYW1vdW50Q2FsY3VsYXRlZCksIHJlc291cmNlTmFtZV0sXG4gICAgICBcImtzLWNyYWZ0XCIsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbkNyYWZ0KG5hbWU6IFJlc291cmNlQ3JhZnRhYmxlLCBhbW91bnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIC8vIENhbid0IGNyYWZ0IGFueXRoaW5nIGJ1dCB3b29kIHVudGlsIHdvcmtzaG9wIGlzIHVubG9ja2VkLlxuICAgIGlmICghdGhpcy5faG9zdC5nYW1lLndvcmtzaG9wVGFiLnZpc2libGUgJiYgbmFtZSAhPT0gXCJ3b29kXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmFmdCA9IHRoaXMuZ2V0Q3JhZnQobmFtZSk7XG4gICAgY29uc3QgZW5hYmxlZCA9IG11c3RFeGlzdCh0aGlzLnNldHRpbmdzLnJlc291cmNlc1tuYW1lXSkuZW5hYmxlZDtcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICBpZiAoY3JhZnQudW5sb2NrZWQgJiYgZW5hYmxlZCkge1xuICAgICAgcmVzdWx0ID0gdHJ1ZTtcblxuICAgICAgY29uc3QgcHJpY2VzID0gdGhpcy5faG9zdC5nYW1lLndvcmtzaG9wLmdldENyYWZ0UHJpY2UoY3JhZnQpO1xuICAgICAgZm9yIChjb25zdCBwcmljZSBvZiBwcmljZXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlQXZhaWxhYmxlKHByaWNlLm5hbWUpO1xuXG4gICAgICAgIGlmICh2YWx1ZSA8IHByaWNlLnZhbCAqIGFtb3VudCkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgcmVzb3VyY2UgaW5mb3JtYXRpb24gb2JqZWN0IGZyb20gdGhlIGdhbWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjcmFmdGFibGUgcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIFRoZSBpbmZvcm1hdGlvbiBvYmplY3QgZm9yIHRoZSByZXNvdXJjZS5cbiAgICovXG4gIGdldENyYWZ0KG5hbWU6IFJlc291cmNlQ3JhZnRhYmxlKTogVW5zYWZlQ3JhZnQge1xuICAgIGNvbnN0IGNyYWZ0ID0gdGhpcy5faG9zdC5nYW1lLndvcmtzaG9wLmdldENyYWZ0KG5hbWUpO1xuICAgIGlmICghY3JhZnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgY3JhZnQgJyR7bmFtZX0nYCk7XG4gICAgfVxuICAgIHJldHVybiBjcmFmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB3ZSBoYXZlIGVub3VnaCByZXNvdXJjZXMgdG8gY3JhZnQgYSBzaW5nbGUgY3JhZnRhYmxlIHJlc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYnVpbGQgaXMgcG9zc2libGU7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgc2luZ2xlQ3JhZnRQb3NzaWJsZShuYW1lOiBSZXNvdXJjZUNyYWZ0YWJsZSk6IGJvb2xlYW4ge1xuICAgIC8vIENhbid0IGNyYWZ0IGFueXRoaW5nIGJ1dCB3b29kIHVudGlsIHdvcmtzaG9wIGlzIHVubG9ja2VkLlxuICAgIGlmICghdGhpcy5faG9zdC5nYW1lLndvcmtzaG9wVGFiLnZpc2libGUgJiYgbmFtZSAhPT0gXCJ3b29kXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRlcmlhbHMgPSB0aGlzLmdldE1hdGVyaWFscyhuYW1lKTtcbiAgICBmb3IgKGNvbnN0IFttYXRlcmlhbCwgYW1vdW50XSBvZiBvYmplY3RFbnRyaWVzKG1hdGVyaWFscykpIHtcbiAgICAgIGlmICh0aGlzLmdldFZhbHVlQXZhaWxhYmxlKG1hdGVyaWFsKSA8IGFtb3VudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBoYXNoIG9mIHRoZSByZXF1aXJlZCBzb3VyY2UgcmVzb3VyY2VzIGFuZCB0aGVpclxuICAgKiBhbW91bnQgdG8gY3JhZnQgdGhlIGdpdmVuIHJlc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgcmVzb3VyY2UgdG8gY3JhZnQuXG4gICAqIEByZXR1cm5zIFRoZSBzb3VyY2UgcmVzb3VyY2VzIHlvdSBuZWVkIGFuZCBob3cgbWFueS5cbiAgICovXG4gIGdldE1hdGVyaWFscyhuYW1lOiBSZXNvdXJjZUNyYWZ0YWJsZSk6IFBhcnRpYWw8UmVjb3JkPFJlc291cmNlLCBudW1iZXI+PiB7XG4gICAgY29uc3QgbWF0ZXJpYWxzOiBQYXJ0aWFsPFJlY29yZDxSZXNvdXJjZSwgbnVtYmVyPj4gPSB7fTtcbiAgICBjb25zdCBjcmFmdCA9IHRoaXMuZ2V0Q3JhZnQobmFtZSk7XG5cbiAgICBjb25zdCBwcmljZXMgPSB0aGlzLl9ob3N0LmdhbWUud29ya3Nob3AuZ2V0Q3JhZnRQcmljZShjcmFmdCk7XG5cbiAgICBmb3IgKGNvbnN0IHByaWNlIG9mIHByaWNlcykge1xuICAgICAgbWF0ZXJpYWxzW3ByaWNlLm5hbWVdID0gcHJpY2UudmFsO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRlcmlhbHM7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGhvdyBtdWNoIG9mIGEgcmVzb3VyY2UgaXMgcHJvZHVjZWQgcGVyIHRpY2suIEZvciBjcmFmdGFibGUgcmVzb3VyY2VzLFxuICAgKiB0aGlzIGFsc28gaW5jbHVkZXMgaG93IG1hbnkgb2YgdGhlbSB3ZSAqY291bGQqIGNyYWZ0IHRoaXMgdGljay5cbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZSB0byByZXRyaWV2ZSB0aGUgcHJvZHVjdGlvbiBmb3IuXG4gICAqIEBwYXJhbSBjYWNoZU1hbmFnZXIgQSBgQ2FjaGVNYW5hZ2VyYCB0byB1c2UgaW4gdGhlIHByb2Nlc3MuXG4gICAqIEBwYXJhbSBwcmVUcmFkZSA/XG4gICAqIEByZXR1cm5zIFRoZSBhbW91bnQgb2YgcmVzb3VyY2VzIHByb2R1Y2VkIHBlciB0aWNrLCBhZGp1c3RlZCBhcmJpdHJhcmlseS5cbiAgICovXG4gIGdldFRpY2tWYWwoXG4gICAgcmVzb3VyY2U6IFVuc2FmZVJlc291cmNlLFxuICAgIGNhY2hlTWFuYWdlcj86IE1hdGVyaWFsc0NhY2hlLFxuICAgIHByZVRyYWRlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICApOiBudW1iZXIgfCBcImlnbm9yZVwiIHtcbiAgICBsZXQgcHJvZHVjdGlvbiA9IHRoaXMuX2hvc3QuZ2FtZS5nZXRSZXNvdXJjZVBlclRpY2socmVzb3VyY2UubmFtZSwgdHJ1ZSk7XG5cbiAgICAvLyBGb3IgY3JhZnRhYmxlIHJlc291cmNlcywgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IGhvdyBtdWNoIG9mIHRoZW1cbiAgICAvLyB3ZSAqY291bGQqIGNyYWZ0LlxuICAgIGlmIChyZXNvdXJjZS5jcmFmdGFibGUpIHtcbiAgICAgIGxldCBtaW5Qcm9kID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IHRoaXMuZ2V0TWF0ZXJpYWxzKHJlc291cmNlLm5hbWUgYXMgUmVzb3VyY2VDcmFmdGFibGUpO1xuICAgICAgZm9yIChjb25zdCBbbWF0LCBhbW91bnRdIG9mIG9iamVjdEVudHJpZXM8UmVzb3VyY2UsIG51bWJlcj4obWF0ZXJpYWxzKSkge1xuICAgICAgICBjb25zdCByYXQgPVxuICAgICAgICAgICgxICsgdGhpcy5faG9zdC5nYW1lLmdldFJlc0NyYWZ0UmF0aW8ocmVzb3VyY2UubmFtZSBhcyBSZXNvdXJjZUNyYWZ0YWJsZSkpIC8gYW1vdW50O1xuICAgICAgICAvLyBDdXJyZW50bHkgcHJlVHJhZGUgaXMgb25seSB0cnVlIGZvciB0aGUgZmVzdGl2YWwgc3R1ZmYsIHNvIGluY2x1ZGluZyBmdXJzIGZyb20gaHVudGluZyBpcyBpZGVhbC5cbiAgICAgICAgY29uc3QgYWRkUHJvZCA9IHRoaXMuZ2V0VGlja1ZhbCh0aGlzLmdldFJlc291cmNlKG1hdCkpO1xuICAgICAgICBpZiAoYWRkUHJvZCA9PT0gXCJpZ25vcmVcIikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1pblByb2QgPSBNYXRoLm1pbihhZGRQcm9kICogcmF0LCBtaW5Qcm9kKTtcbiAgICAgIH1cbiAgICAgIHByb2R1Y3Rpb24gKz0gbWluUHJvZCAhPT0gTnVtYmVyLk1BWF9WQUxVRSA/IG1pblByb2QgOiAwO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgbmVnYXRpdmUgcHJvZHVjdGlvbiAob3Igbm9uZSksIGFuZCB3ZSdyZSBsb29raW5nIGF0IGVpdGhlciBzcGljZSBvclxuICAgIC8vIGJsdWVwcmludHMsIHJldHVybiBcImlnbm9yZVwiLlxuICAgIC8vIFRPRE86IFRoaXMgc3BlY2lhbCBjYXNlIHNlZW1zIHRvIHJldm9sdmUgYXJvdW5kIHRyYWRpbmcuIEFzIHRyYWRpbmcgcmVzdWx0cyBpblxuICAgIC8vICAgICAgIHNwaWNlIGFuZCBibHVlcHJpbnRzLlxuICAgIGlmIChwcm9kdWN0aW9uIDw9IDAgJiYgKHJlc291cmNlLm5hbWUgPT09IFwic3BpY2VcIiB8fCByZXNvdXJjZS5uYW1lID09PSBcImJsdWVwcmludFwiKSkge1xuICAgICAgcmV0dXJuIFwiaWdub3JlXCI7XG4gICAgfVxuXG4gICAgLy8gSWYgXCJwcmVUcmFkZVwiIHdhcyBzZXQsIGluY3JlYXNlIHRoZSBwcm9kdWN0aW9uLiBUaGUgXCJyZXNWYWx1ZVwiIHN0b3JlZCBpbiB0aGUgY2FjaGVcbiAgICAvLyBtYWtlcyBubyBzZW5zZS5cbiAgICAvLyBUT0RPOiBUaGUgb25seSB0aW1lIHRoaXMgaXMgdXNlZCBpcyBmb3IgaG9sZGluZyBmZXN0aXZhbHMuXG4gICAgLy8gICAgICAgSXQncyB1bmNsZWFyIHdoeSB0aGlzIHdvdWxkIGJlIG5lY2Vzc2FyeS5cbiAgICBpZiAoIXByZVRyYWRlICYmICFpc05pbChjYWNoZU1hbmFnZXIpKSB7XG4gICAgICBwcm9kdWN0aW9uICs9IGNhY2hlTWFuYWdlci5nZXRSZXNWYWx1ZShyZXNvdXJjZS5uYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2R1Y3Rpb247XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHRoZSByZXNvdXJjZXMgYW5kIHRoZWlyIGFtb3VudCB0aGF0IHdvdWxkIHVzdWFsbHkgcmVzdWx0IGZyb20gYSBodW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgYW1vdW50cyBvZiByZXNvdXJjZXMgdXN1YWxseSBnYWluZWQgZnJvbSBodW50aW5nLlxuICAgKi9cbiAgZ2V0QXZlcmFnZUh1bnQoKTogUGFydGlhbDxSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4+IHtcbiAgICBjb25zdCBvdXRwdXQ6IFBhcnRpYWw8UmVjb3JkPFJlc291cmNlLCBudW1iZXI+PiA9IHt9O1xuICAgIGNvbnN0IGh1bnRlclJhdGlvID1cbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXRFZmZlY3QoXCJodW50ZXJSYXRpb1wiKSArXG4gICAgICB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5nZXRFZmZlY3RMZWFkZXIoXCJtYW5hZ2VyXCIsIDApO1xuXG4gICAgb3V0cHV0LmZ1cnMgPSA0MCArIDMyLjUgKiBodW50ZXJSYXRpbztcblxuICAgIG91dHB1dC5pdm9yeSA9XG4gICAgICA1MCAqIE1hdGgubWluKDAuMjI1ICsgMC4wMSAqIGh1bnRlclJhdGlvLCAwLjUpICtcbiAgICAgIDQwICogaHVudGVyUmF0aW8gKiBNYXRoLm1pbigwLjIyNSArIDAuMDEgKiBodW50ZXJSYXRpbywgMC41KTtcblxuICAgIG91dHB1dC51bmljb3JucyA9IDAuMDU7XG5cbiAgICBpZiAodGhpcy5nZXRWYWx1ZShcInplYnJhc1wiKSA+PSAxMCkge1xuICAgICAgb3V0cHV0LmJsb29kc3RvbmUgPSB0aGlzLmdldFZhbHVlKFwiYmxvb2RzdG9uZVwiKSA9PT0gMCA/IDAuMDUgOiAwLjAwMDU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2hvc3QuZ2FtZS5pcm9uV2lsbCAmJiB0aGlzLl9ob3N0LmdhbWUud29ya3Nob3AuZ2V0KFwiZ29sZE9yZVwiKS5yZXNlYXJjaGVkKSB7XG4gICAgICBvdXRwdXQuZ29sZCA9IDAuNjI1ICsgMC42MjUgKiBodW50ZXJSYXRpbztcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBpbmZvcm1hdGlvbiBvYmplY3QgZm9yIGEgcmVzb3VyY2UuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSByZXNvdXJjZSB0byByZXRyaWV2ZSBpbmZvIGZvci5cbiAgICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIG9iamVjdCBmb3IgdGhlIHJlc291cmNlLlxuICAgKi9cbiAgZ2V0UmVzb3VyY2UobmFtZTogUmVzb3VyY2UpOiBSZXR1cm5UeXBlPFJlc291cmNlTWFuYWdlcltcImdldFwiXT4ge1xuICAgIGNvbnN0IHJlcyA9IHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmdldChuYW1lKTtcbiAgICBpZiAoaXNOaWwocmVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCByZXNvdXJjZSAke25hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGhvdyBtYW55IGl0ZW1zIG9mIGEgcmVzb3VyY2UgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSByZXNvdXJjZS5cbiAgICogQHJldHVybnMgSG93IG1hbnkgaXRlbXMgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqL1xuICBnZXRWYWx1ZShuYW1lOiBSZXNvdXJjZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2UobmFtZSkudmFsdWUgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaG93IG1hbnkgaXRlbXMgb2YgdGhlIHJlc291cmNlIHRvIGFsd2F5cyBrZWVwIGluIHN0b2NrLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIEhvdyBtYW55IGl0ZW1zIG9mIHRoZSByZXNvdXJjZSB0byBhbHdheXMga2VlcCBpbiBzdG9jay5cbiAgICovXG4gIGdldFN0b2NrKG5hbWU6IFJlc291cmNlKTogbnVtYmVyIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuX2hvc3QuZW5naW5lLnNldHRpbmdzLnJlc291cmNlcy5yZXNvdXJjZXNbbmFtZV07XG4gICAgY29uc3Qgc3RvY2sgPSByZXNvdXJjZS5lbmFibGVkID8gcmVzb3VyY2Uuc3RvY2sgOiAwO1xuXG4gICAgcmV0dXJuIHN0b2NrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBjb25zdW1lIHJhdGUgZm9yIGEgcmVzb3VyY2UuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIHJlc291cmNlLlxuICAgKiBAcmV0dXJucyBUaGUgY29uc3VtZSByYXRlIGZvciB0aGUgcmVzb3VyY2UuXG4gICAqL1xuICBnZXRDb25zdW1lKG5hbWU6IFJlc291cmNlKTogbnVtYmVyIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuX2hvc3QuZW5naW5lLnNldHRpbmdzLnJlc291cmNlcy5yZXNvdXJjZXNbbmFtZV07XG4gICAgY29uc3QgY29uc3VtZSA9IHJlc291cmNlLmVuYWJsZWQgPyByZXNvdXJjZS5jb25zdW1lIDogMTtcblxuICAgIHJldHVybiBjb25zdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBob3cgbXVjaCBvZiBhIHJlc291cmNlIGlzIGF2YWlsYWJsZSBmb3IgYSBjZXJ0YWluIG9wZXJhdGlvblxuICAgKiB0byB1c2UuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSByZXNvdXJjZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgVGhlIGF2YWlsYWJsZSBhbW91bnQgb2YgdGhlIHJlc291cmNlLlxuICAgKi9cbiAgZ2V0VmFsdWVBdmFpbGFibGUobmFtZTogUmVzb3VyY2UpOiBudW1iZXIge1xuICAgIC8vIEhvdyBtYW55IGl0ZW1zIHRvIGtlZXAgaW4gc3RvY2suXG4gICAgbGV0IHN0b2NrID0gdGhpcy5nZXRTdG9jayhuYW1lKTtcblxuICAgIC8vIElmIHRoZSByZXNvdXJjZSBpcyBjYXRuaXAsIGVuc3VyZSB0byBub3QgdXNlIHNvIG11Y2ggdGhhdCB3ZSBjYW4ndCBzYXRpc2Z5XG4gICAgLy8gY29uc3VtcHRpb24gYnkga2l0dGVucy5cbiAgICBpZiAoXCJjYXRuaXBcIiA9PT0gbmFtZSkge1xuICAgICAgY29uc3QgcGFzdHVyZU1ldGEgPSB0aGlzLl9ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KFwicGFzdHVyZVwiKS5tZXRhO1xuICAgICAgY29uc3QgYXF1ZWR1Y3RNZXRhID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcImFxdWVkdWN0XCIpLm1ldGE7XG4gICAgICBjb25zdCBwYXN0dXJlcyA9IHBhc3R1cmVNZXRhLnN0YWdlID09PSAwID8gcGFzdHVyZU1ldGEudmFsIDogMDtcbiAgICAgIGNvbnN0IGFxdWVkdWN0cyA9IGFxdWVkdWN0TWV0YS5zdGFnZSA9PT0gMCA/IGFxdWVkdWN0TWV0YS52YWwgOiAwO1xuICAgICAgLy8gSG93IG1hbnkgY2F0bmlwIHBlciB0aWNrIGRvIHdlIGhhdmUgYXZhaWxhYmxlPyBUaGlzIGNhbiBiZSBuZWdhdGl2ZS5cbiAgICAgIGNvbnN0IHJlc1BlclRpY2sgPSB0aGlzLmdldFBvdGVudGlhbENhdG5pcCh0cnVlLCBwYXN0dXJlcywgYXF1ZWR1Y3RzKTtcblxuICAgICAgLy8gSWYgb3VyIHN0b2NrIGlzIGN1cnJlbnRseSBkZWNyZWFzaW5nLiBFbnN1cmUgd2Ugd29yayB3aXRoIHRoZSB2YWx1ZVxuICAgICAgLy8gd2hlcmUgaXQgc2hvdWxkIGJlIGluIDUgdGlja3MuXG4gICAgICAvLyBUT0RPOiBJJ20gYXNzdW1pbmcgMjAyIGlzIHRoZSBjYXRuaXAgY29uc3VtcHRpb24gcGVyIHRpY2sgYW5kIHRoZSA1IGFyZSBhXG4gICAgICAvLyAgICAgICBtYWdpYyB2YWx1ZSB0aGF0IGp1c3QgbWFkZSBzZW5zZSwgb3IgdGhlIHNjcmlwdCBhc3N1bWVzIGl0IHJ1bnMgZXZlcnlcbiAgICAgIC8vICAgICAgIDUgdGlja3MuIFdoaWNoIHdvdWxkIG1lYW4gaXQgcHJvYmFibHkgaWdub3JlcyB0aGUgYGludGVydmFsYCBzZXR0aW5nLlxuICAgICAgaWYgKHJlc1BlclRpY2sgPCAwKSB7XG4gICAgICAgIHN0b2NrIC09IHJlc1BlclRpY2sgKiAyMDIgKiA1O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhvdyBtYW55IGl0ZW1zIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlLlxuICAgIGxldCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUobmFtZSk7XG4gICAgLy8gU3VidHJhY3QgdGhlIGFtb3VudCB0byBrZWVwIGluIHN0b2NrLlxuICAgIHZhbHVlID0gTWF0aC5tYXgodmFsdWUgLSBzdG9jaywgMCk7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIGNvbnN1bWUgcmF0ZS5cbiAgICBjb25zdCBjb25zdW1lID0gdGhpcy5nZXRDb25zdW1lKG5hbWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlICogY29uc3VtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaG93IG11Y2ggY2F0bmlwIHdlIGhhdmUgYXZhaWxhYmxlIHRvIFwid29yayB3aXRoXCIgcGVyIHRpY2suXG4gICAqXG4gICAqIEBwYXJhbSB3b3JzdFdlYXRoZXIgU2hvdWxkIHRoZSB3b3JzdCB3ZWF0aGVyIGJlIGFzc3VtZWQgZm9yIHRoaXMgY2FsY3VsYXRpb24/XG4gICAqIEBwYXJhbSBwYXN0dXJlcyBIb3cgbWFueSBwYXN0dXJlcyB0byB0YWtlIGludG8gYWNjb3VudC5cbiAgICogQHBhcmFtIGFxdWVkdWN0cyBIb3cgbWFueSBhcXVlZHVjdHMgdG8gdGFrZSBpbnRvIGFjY291bnRcbiAgICogQHJldHVybnMgVGhlIHBvdGVudGlhbCBjYXRuaXAgcGVyIHRpY2suXG4gICAqL1xuICBnZXRQb3RlbnRpYWxDYXRuaXAod29yc3RXZWF0aGVyOiBib29sZWFuLCBwYXN0dXJlczogbnVtYmVyLCBhcXVlZHVjdHM6IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gU3RhcnQgb2YgYnkgY2hlY2tpbmcgaG93IG11Y2ggY2F0bmlwIHdlIHByb2R1Y2UgcGVyIHRpY2sgYXQgYmFzZSBsZXZlbC5cbiAgICBsZXQgcHJvZHVjdGlvbkZpZWxkID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcImNhdG5pcFBlclRpY2tCYXNlXCIpO1xuXG4gICAgaWYgKHdvcnN0V2VhdGhlcikge1xuICAgICAgLy8gQXNzdW1lIGZpZWxkcyBydW4gYXQgLTkwJVxuICAgICAgcHJvZHVjdGlvbkZpZWxkICo9IDAuMTtcbiAgICAgIC8vIEZhY3RvciBpbiBjb2xkIGhhcnNobmVzcy5cbiAgICAgIHByb2R1Y3Rpb25GaWVsZCAqPVxuICAgICAgICAxICsgdGhpcy5faG9zdC5nYW1lLmdldExpbWl0ZWREUih0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwiY29sZEhhcnNobmVzc1wiKSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2R1Y3Rpb25GaWVsZCAqPVxuICAgICAgICB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZ2V0V2VhdGhlck1vZCh7IG5hbWU6IFwiY2F0bmlwXCIgfSkgK1xuICAgICAgICB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZ2V0Q3VyU2Vhc29uKCkubW9kaWZpZXJzLmNhdG5pcDtcbiAgICB9XG5cbiAgICAvLyBXaGVuIHRoZSBjb21tdW5pc20gcG9saWN5IGlzIGFjdGl2ZSxcbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLnNjaWVuY2UuZ2V0UG9saWN5KFwiY29tbXVuaXNtXCIpLnJlc2VhcmNoZWQpIHtcbiAgICAgIHByb2R1Y3Rpb25GaWVsZCA9IDA7XG4gICAgfVxuXG4gICAgLy8gR2V0IGJhc2UgcHJvZHVjdGlvbiB2YWx1ZXMgZm9yIGpvYnMuXG4gICAgY29uc3QgcmVzb3VyY2VQcm9kdWN0aW9uID0gdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuZ2V0UmVzUHJvZHVjdGlvbigpO1xuICAgIC8vIENoZWNrIGhvdyBtdWNoIGNhdG5pcCB3ZSdyZSBwcm9kdWNpbmcgdGhyb3VnaCBraXR0ZW4gam9icy5cbiAgICBjb25zdCBwcm9kdWN0aW9uVmlsbGFnZXIgPSByZXNvdXJjZVByb2R1Y3Rpb24uY2F0bmlwXG4gICAgICA/IHJlc291cmNlUHJvZHVjdGlvbi5jYXRuaXAgKiAoMSArIHRoaXMuX2hvc3QuZ2FtZS5nZXRFZmZlY3QoXCJjYXRuaXBKb2JSYXRpb1wiKSlcbiAgICAgIDogMDtcblxuICAgIC8vIEJhc2UgcHJvZHVjdGlvbiBpcyBjYXRuaXAgZmllbGRzICsgZmFybWVycy5cbiAgICBsZXQgYmFzZVByb2QgPSBwcm9kdWN0aW9uRmllbGQgKyBwcm9kdWN0aW9uVmlsbGFnZXI7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIGVmZmVjdCBvZiBvdGhlciBidWlsZGluZ3Mgb24gdGhlIHByb2R1Y3Rpb24gdmFsdWUuXG4gICAgbGV0IGh5ZHJvcG9uaWNzID0gdGhpcy5faG9zdC5nYW1lLnNwYWNlLmdldEJ1aWxkaW5nKFwiaHlkcm9wb25pY3NcIikudmFsO1xuICAgIC8vIEluZGV4IDIxIGlzIHRoZSBcInBhd2dhbiByaXR1YWxzXCIgbWV0YXBoeXNpY3MgdXBncmFkZS4gVGhpcyBtYWtlcyBubyBzZW5zZS5cbiAgICAvLyBUaGlzIGxpa2VseSB3YW50cyBpbmRleCAyMiwgd2hpY2ggaXMgXCJudW1lcm9tYW5jeVwiLCB3aGljaCBoYXMgZWZmZWN0cyBvblxuICAgIC8vIGNhdG5pcCBwcm9kdWN0aW9uIGluIGN5Y2xlcyBhdCBpbmRleCAyIGFuZCA3LlxuICAgIC8vIFRPRE86IEZpeCB0aGlzIHNvIHRoZSB1cGdyYWRlIGlzIHByb3Blcmx5IHRha2VuIGludG8gYWNjb3VudC5cbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLnByZXN0aWdlLm1ldGFbMF0ubWV0YVsyMV0ucmVzZWFyY2hlZCkge1xuICAgICAgaWYgKHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5jeWNsZSA9PT0gMikge1xuICAgICAgICBoeWRyb3BvbmljcyAqPSAyO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5jeWNsZSA9PT0gNykge1xuICAgICAgICBoeWRyb3BvbmljcyAqPSAwLjU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3VyIGJhc2UgcHJvZHVjdGlvbiB2YWx1ZSBpcyBib29zdGVkIGJ5IG91ciBhcXVlZHVjdHMgYW5kIGh5ZHJvcG9uaWNzIGFjY29yZGluZ2x5LlxuICAgIGJhc2VQcm9kICo9IDEgKyAwLjAzICogYXF1ZWR1Y3RzICsgMC4wMjUgKiBoeWRyb3BvbmljcztcblxuICAgIC8vIEFwcGx5IHBhcmFnb24gYm9udXMsIGV4Y2VwdCBkdXJpbmcgdGhlIFwid2ludGVyIGlzIGNvbWluZ1wiIGNoYWxsZW5nZS5cbiAgICBjb25zdCBpc1dpbnRlckNvbWluZyA9IHRoaXMuX2hvc3QuZ2FtZS5jaGFsbGVuZ2VzLmN1cnJlbnRDaGFsbGVuZ2UgPT09IFwid2ludGVySXNDb21pbmdcIjtcbiAgICBjb25zdCBwYXJhZ29uQm9udXMgPSBpc1dpbnRlckNvbWluZyA/IDAgOiB0aGlzLl9ob3N0LmdhbWUucHJlc3RpZ2UuZ2V0UGFyYWdvblByb2R1Y3Rpb25SYXRpbygpO1xuICAgIGJhc2VQcm9kICo9IDEgKyBwYXJhZ29uQm9udXM7XG5cbiAgICAvLyBBcHBseSBmYWl0aCBib251cy5cbiAgICBiYXNlUHJvZCAqPSAxICsgdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFNvbGFyUmV2b2x1dGlvblJhdGlvKCk7XG5cbiAgICAvLyBVbmxlc3MgdGhlIHVzZXIgZGlzYWJsZWQgdGhlIFwiZ2xvYmFsIGRvbmF0ZSBib251c1wiLCBhcHBseSBpdC5cbiAgICBpZiAoIXRoaXMuX2hvc3QuZ2FtZS5vcHRzLmRpc2FibGVDTUJSKSB7XG4gICAgICBiYXNlUHJvZCAqPSAxICsgdGhpcy5faG9zdC5nYW1lLmdldENNQlJCb251cygpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHRoZSBlZmZlY3RzIG9mIHBvc3NpYmx5IHJ1bm5pbmcgZmVzdGl2YWwuXG4gICAgYmFzZVByb2QgPSBtdXN0RXhpc3QoXG4gICAgICB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuY3ljbGVFZmZlY3RzRmVzdGl2YWwoeyBjYXRuaXA6IGJhc2VQcm9kIH0pLmNhdG5pcCxcbiAgICApO1xuXG4gICAgLy8gRGV0ZXJtaW5lIG91ciBkZW1hbmQgZm9yIGNhdG5pcC4gVGhpcyBpcyB1c3VhbGx5IGEgbmVnYXRpdmUgdmFsdWUuXG4gICAgbGV0IGJhc2VEZW1hbmQgPSB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5nZXRSZXNDb25zdW1wdGlvbigpLmNhdG5pcDtcbiAgICAvLyBQYXN0dXJlcyBhbmQgdW5pY3JvbiBwYXN0dXJlcyByZWR1Y2UgY2F0bmlwIGRlbWFuZC4gRmFjdG9yIHRoYXQgaW4uXG4gICAgY29uc3QgdW5pY29yblBhc3R1cmVzID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInVuaWNvcm5QYXN0dXJlXCIpLm1ldGEudmFsO1xuICAgIGJhc2VEZW1hbmQgKj1cbiAgICAgIDEgKyB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKHBhc3R1cmVzICogLTAuMDA1ICsgdW5pY29yblBhc3R1cmVzICogLTAuMDAxNSwgMS4wKTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW55IGtpdHRlbnMgYW5kIGhhcHBpbmVzcyBvdmVyIDEwMCUuXG4gICAgaWYgKHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnNpbS5raXR0ZW5zLmxlbmd0aCA+IDAgJiYgdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuaGFwcGluZXNzID4gMSkge1xuICAgICAgLy8gSG93IGhhcHB5IGJleW9uZCAxMDAlIGFyZSB3ZT9cbiAgICAgIGNvbnN0IGhhcHB5Q29uID0gdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuaGFwcGluZXNzIC0gMTtcbiAgICAgIGNvbnN0IGNhdG5pcERlbWFuZFdvcmtlclJhdGlvR2xvYmFsID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcbiAgICAgICAgXCJjYXRuaXBEZW1hbmRXb3JrZXJSYXRpb0dsb2JhbFwiLFxuICAgICAgKTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBlZmZlY3Qgb2Yga2l0dGVucyB3aXRob3V0IGpvYnMuXG4gICAgICBpZiAodGhpcy5faG9zdC5nYW1lLmNoYWxsZW5nZXMuY3VycmVudENoYWxsZW5nZSA9PT0gXCJhbmFyY2h5XCIpIHtcbiAgICAgICAgLy8gRHVyaW5nIGFuYXJjaHksIHRoZXkgaGF2ZSBubyBlZmZlY3QuIFRoZXkgZWF0IGFsbCB0aGUgY2F0bmlwLlxuICAgICAgICBiYXNlRGVtYW5kICo9IDEgKyBoYXBweUNvbiAqICgxICsgY2F0bmlwRGVtYW5kV29ya2VyUmF0aW9HbG9iYWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRHVyaW5nIG5vcm1hbCBvcGVyYXRpb24sIHJlZHVjZSB0aGUgZGVtYW5kIHByb3BvcnRpb25hbGx5LlxuICAgICAgICAvLyBUT0RPOiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBzcGxpdCB1cCBpbnRvIDIgc3RlcHMuXG4gICAgICAgIGJhc2VEZW1hbmQgKj1cbiAgICAgICAgICAxICtcbiAgICAgICAgICBoYXBweUNvbiAqXG4gICAgICAgICAgICAoMSArIGNhdG5pcERlbWFuZFdvcmtlclJhdGlvR2xvYmFsKSAqXG4gICAgICAgICAgICAoMSAtXG4gICAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLmdldEZyZWVLaXR0ZW5zKCkgL1xuICAgICAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnNpbS5raXR0ZW5zLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VidHJhY3QgdGhlIGRlbWFuZCBmcm9tIHRoZSBwcm9kdWN0aW9uLiBEZW1hbmQgaXMgbmVnYXRpdmUuXG4gICAgYmFzZVByb2QgKz0gYmFzZURlbWFuZDtcblxuICAgIC8vIFN1YnRyYWN0IHBvc3NpYmxlIGNhdG5pcCBjb25zdW1lcnMsIGxpa2UgYnJld2VyaWVzLlxuICAgIGJhc2VQcm9kICs9IHRoaXMuX2hvc3QuZ2FtZS5nZXRSZXNvdXJjZVBlclRpY2tDb252ZXJ0aW9uKFwiY2F0bmlwXCIpO1xuXG4gICAgLy8gTWlnaHQgbmVlZCB0byBldmVudHVhbGx5IGZhY3RvciBpbiB0aW1lIGFjY2VsZXJhdGlvbiB1c2luZyB0aGlzLl9ob3N0LmdhbWVQYWdlLnRpbWVBY2NlbGVyYXRpb25SYXRpbygpLlxuICAgIHJldHVybiBiYXNlUHJvZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWludGFpbnMgdGhlIENTUyBjbGFzc2VzIGluIHRoZSByZXNvdXJjZSBpbmRpY2F0b3JzIGluIHRoZSBnYW1lIFVJIHRvXG4gICAqIHJlZmxlY3QgaWYgdGhlIGFtb3VudCBvZiByZXNvdXJjZSBpbiBzdG9jayBpcyBiZWxvdyBvciBhYm92ZSB0aGUgZGVzaXJlZFxuICAgKiB0b3RhbCBhbW91bnQgdG8ga2VlcCBpbiBzdG9jay5cbiAgICogVGhlIHVzZXIgY2FuIGNvbmZpZ3VyZSB0aGlzIGluIHRoZSBXb3Jrc2hvcCBhdXRvbWF0aW9uIHNlY3Rpb24uXG4gICAqL1xuICByZWZyZXNoU3RvY2soKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgcmVzb3VyY2VdIG9mIG9iamVjdEVudHJpZXModGhpcy5faG9zdC5lbmdpbmUuc2V0dGluZ3MucmVzb3VyY2VzLnJlc291cmNlcykpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlQ2VsbHMgPSBbXG4gICAgICAgIC8vIFJlc291cmNlIHRhYmxlIG9uIHRoZSB0b3AuXG4gICAgICAgIC4uLiQoYCNnYW1lIC5yZXMtcm93LnJlc291cmNlXyR7bmFtZX0gLnJlcy1jZWxsLnJlc0Ftb3VudGApLFxuICAgICAgICAvLyBDcmFmdCB0YWJsZSBvbiB0aGUgYm90dG9tLlxuICAgICAgICAuLi4kKGAjZ2FtZSAucmVzLXJvdy5yZXNvdXJjZV8ke25hbWV9IC5yZXMtY2VsbC5yZXNvdXJjZS12YWx1ZWApLFxuICAgICAgXTtcblxuICAgICAgaWYgKCFyZXNvdXJjZS5lbmFibGVkIHx8IHJlc291cmNlLnN0b2NrID09PSAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2VDZWxsIG9mIHJlc291cmNlQ2VsbHMpIHtcbiAgICAgICAgICByZXNvdXJjZUNlbGwuY2xhc3NMaXN0LnJlbW92ZShcImtzLXN0b2NrLWFib3ZlXCIsIFwia3Mtc3RvY2stYmVsb3dcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQmVsb3cgPSB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQobmFtZSkudmFsdWUgPCByZXNvdXJjZS5zdG9jaztcblxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZUNlbGwgb2YgcmVzb3VyY2VDZWxscykge1xuICAgICAgICByZXNvdXJjZUNlbGwuY2xhc3NMaXN0LmFkZChpc0JlbG93ID8gXCJrcy1zdG9jay1iZWxvd1wiIDogXCJrcy1zdG9jay1hYm92ZVwiKTtcbiAgICAgICAgcmVzb3VyY2VDZWxsLmNsYXNzTGlzdC5yZW1vdmUoaXNCZWxvdyA/IFwia3Mtc3RvY2stYWJvdmVcIiA6IFwia3Mtc3RvY2stYmVsb3dcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBSZXNvdXJjZSwgUmVzb3VyY2VzIH0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBXb3Jrc2hvcE1hbmFnZXIgfSBmcm9tIFwiLi4vV29ya3Nob3BNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlc1NldHRpbmdzSXRlbSBleHRlbmRzIFNldHRpbmcge1xuICByZWFkb25seSAjcmVzb3VyY2U6IFJlc291cmNlO1xuICBjb25zdW1lOiBudW1iZXI7XG4gIHN0b2NrID0gMDtcblxuICBnZXQgcmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlLFxuICAgIGVuYWJsZWQgPSBmYWxzZSxcbiAgICBjb25zdW1lID0gV29ya3Nob3BNYW5hZ2VyLkRFRkFVTFRfQ09OU1VNRV9SQVRFLFxuICAgIHN0b2NrID0gMCxcbiAgKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy4jcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgICB0aGlzLmNvbnN1bWUgPSBjb25zdW1lO1xuICAgIHRoaXMuc3RvY2sgPSBzdG9jaztcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSZXNvdXJjZXNSZXNvdXJjZVNldHRpbmdzID0gUmVjb3JkPFJlc291cmNlLCBSZXNvdXJjZXNTZXR0aW5nc0l0ZW0+O1xuXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VzU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcmVzb3VyY2VzOiBSZXNvdXJjZXNSZXNvdXJjZVNldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIHN1cGVyKGVuYWJsZWQpO1xuICAgIHRoaXMucmVzb3VyY2VzID0gdGhpcy5pbml0UmVzb3VyY2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRSZXNvdXJjZXMoKTogUmVzb3VyY2VzUmVzb3VyY2VTZXR0aW5ncyB7XG4gICAgY29uc3QgaXRlbXMgPSB7fSBhcyBSZXNvdXJjZXNSZXNvdXJjZVNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBSZXNvdXJjZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc291cmNlc1NldHRpbmdzSXRlbShpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxSZXNvdXJjZXNTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLnJlc291cmNlcywgc2V0dGluZ3MucmVzb3VyY2VzLCAocmVzb3VyY2UsIGl0ZW0pID0+IHtcbiAgICAgIHJlc291cmNlLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IHJlc291cmNlLmVuYWJsZWQ7XG4gICAgICByZXNvdXJjZS5jb25zdW1lID0gaXRlbT8uY29uc3VtZSA/PyByZXNvdXJjZS5jb25zdW1lO1xuICAgICAgcmVzb3VyY2Uuc3RvY2sgPSBpdGVtPy5zdG9jayA/PyByZXNvdXJjZS5zdG9jaztcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFN0YXRlU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcmVhZG9ubHkgbm9Db25maXJtOiBTZXR0aW5nO1xuICByZWFkb25seSBjb21wcmVzczogU2V0dGluZztcblxuICBjb25zdHJ1Y3Rvcihub0NvbmZpcm0gPSBuZXcgU2V0dGluZygpLCBjb21wcmVzcyA9IG5ldyBTZXR0aW5nKHRydWUpKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gICAgdGhpcy5ub0NvbmZpcm0gPSBub0NvbmZpcm07XG4gICAgdGhpcy5jb21wcmVzcyA9IGNvbXByZXNzO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxTdGF0ZVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICB0aGlzLm5vQ29uZmlybS5sb2FkKHNldHRpbmdzLm5vQ29uZmlybSk7XG4gICAgdGhpcy5jb21wcmVzcy5sb2FkKHNldHRpbmdzLmNvbXByZXNzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEZhbGxiYWNrTG9jYWxlIH0gZnJvbSBcIi4uL1VzZXJTY3JpcHRMb2FkZXIuanNcIjtcbmltcG9ydCB7IExvZ0ZpbHRlclNldHRpbmdzIH0gZnJvbSBcIi4vTG9nRmlsdGVyU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFJlc291cmNlc1NldHRpbmdzIH0gZnJvbSBcIi4vUmVzb3VyY2VzU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFNldHRpbmcsIFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFN0YXRlU2V0dGluZ3MgfSBmcm9tIFwiLi9TdGF0ZVNldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBFbmdpbmVTZXR0aW5ncyBleHRlbmRzIFNldHRpbmcge1xuICAvKipcbiAgICogVGhlIGludGVydmFsIGF0IHdoaWNoIHRoZSBpbnRlcm5hbCBwcm9jZXNzaW5nIGxvb3AgaXMgcnVuLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBpbnRlcnZhbCA9IDIwMDA7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGFuZ3VhZ2UuXG4gICAqL1xuICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT47XG5cbiAgLyoqXG4gICAqIFVzZSBhIGRlZGljYXRlZCBjb2x1bW4gaW4gdGhlIFVJIGZvciBLUy5cbiAgICovXG4gIGtzQ29sdW1uOiBTZXR0aW5nO1xuXG4gIGZpbHRlcnM6IExvZ0ZpbHRlclNldHRpbmdzO1xuICByZXNvdXJjZXM6IFJlc291cmNlc1NldHRpbmdzO1xuICByZWFkb25seSBzdGF0ZXM6IFN0YXRlU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW5hYmxlZCA9IGZhbHNlLFxuICAgIGZpbHRlcnMgPSBuZXcgTG9nRmlsdGVyU2V0dGluZ3MoKSxcbiAgICByZXNvdXJjZXMgPSBuZXcgUmVzb3VyY2VzU2V0dGluZ3MoKSxcbiAgICBzdGF0ZXMgPSBuZXcgU3RhdGVTZXR0aW5ncygpLFxuICAgIGxhbmd1YWdlID0gRmFsbGJhY2tMb2NhbGUsXG4gICAga3NDb2x1bW4gPSBuZXcgU2V0dGluZygpLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgIHRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzO1xuICAgIHRoaXMuc3RhdGVzID0gc3RhdGVzO1xuICAgIHRoaXMubG9jYWxlID0gbmV3IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4obGFuZ3VhZ2UsIFtcbiAgICAgIHsgbGFiZWw6IFwiRGV1dHNjaFwiLCB2YWx1ZTogXCJkZS1ERVwiIH0sXG4gICAgICB7IGxhYmVsOiBcIkVuZ2xpc2hcIiwgdmFsdWU6IFwiZW4tVVNcIiB9LFxuICAgICAgeyBsYWJlbDogXCLXota015HXqNa015nXqlwiLCB2YWx1ZTogXCJoZS1JTFwiIH0sXG4gICAgICB7IGxhYmVsOiBcIuS4reaWh1wiLCB2YWx1ZTogXCJ6aC1DTlwiIH0sXG4gICAgXSk7XG4gICAgdGhpcy5rc0NvbHVtbiA9IGtzQ29sdW1uO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxFbmdpbmVTZXR0aW5ncz4+LCByZXRhaW5NZXRhQmVoYXZpb3IgPSBmYWxzZSkge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGlmICghcmV0YWluTWV0YUJlaGF2aW9yKSB7XG4gICAgICB0aGlzLmludGVydmFsID0gc2V0dGluZ3MuaW50ZXJ2YWwgPz8gdGhpcy5pbnRlcnZhbDtcbiAgICAgIHRoaXMuc3RhdGVzLmxvYWQoc2V0dGluZ3Muc3RhdGVzKTtcbiAgICAgIHRoaXMubG9jYWxlLmxvYWQoc2V0dGluZ3MubG9jYWxlKTtcbiAgICAgIHRoaXMua3NDb2x1bW4ubG9hZChzZXR0aW5ncy5rc0NvbHVtbik7XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJzLmxvYWQoc2V0dGluZ3MuZmlsdGVycyk7XG4gICAgdGhpcy5yZXNvdXJjZXMubG9hZChzZXR0aW5ncy5yZXNvdXJjZXMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBCdWlsZGluZywgQnVpbGRpbmdzLCB0eXBlIFN0YWdlZEJ1aWxkaW5nLCBTdGFnZWRCdWlsZGluZ3MgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgQm9uZmlyZUl0ZW0gfSBmcm9tIFwiLi9Cb25maXJlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFNldHRpbmcsIFNldHRpbmdUaHJlc2hvbGQgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRCb25maXJlQnVpbGRpbmdTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ1RocmVzaG9sZCB7XG4gIC8qKlxuICAgKiBJbiBjYXNlIHRoaXMgaXMgYW4gdXBncmFkZSBvZiBhbm90aGVyIGJ1aWxkaW5nLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZVxuICAgKiBiYXNlIGJ1aWxkaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgI2Jhc2VCdWlsZGluZzogQnVpbGRpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIGdldCBiYXNlQnVpbGRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Jhc2VCdWlsZGluZztcbiAgfVxuXG4gIHJlYWRvbmx5ICNidWlsZGluZzogQm9uZmlyZUl0ZW07XG5cbiAgZ2V0IGJ1aWxkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNidWlsZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBjYXNlIHRoaXMgaXMgYW4gdXBncmFkYWJsZSBidWlsZGluZywgdGhpcyBpbmRpY2F0ZXMgdGhlIGxldmVsIG9mXG4gICAqIHRoZSBzdGFnZS5cbiAgICovXG4gIHJlYWRvbmx5ICNzdGFnZTogbnVtYmVyID0gMDtcbiAgZ2V0IHN0YWdlKCkge1xuICAgIHJldHVybiB0aGlzLiNzdGFnZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1aWxkaW5nOiBCb25maXJlSXRlbSxcbiAgICBlbmFibGVkID0gZmFsc2UsXG4gICAgdGhyZXNob2xkID0gLTEsXG4gICAgYmFzZVN0YWdlPzogQnVpbGRpbmcgfCBmYWxzZSxcbiAgKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgdGhyZXNob2xkKTtcblxuICAgIHRoaXMuI2J1aWxkaW5nID0gYnVpbGRpbmc7XG4gICAgaWYgKGJhc2VTdGFnZSkge1xuICAgICAgdGhpcy4jc3RhZ2UgPSAxO1xuICAgICAgdGhpcy4jYmFzZUJ1aWxkaW5nID0gYmFzZVN0YWdlO1xuICAgIH1cbiAgfVxufVxuXG4vLyB1bmljb3JuUGFzdHVyZSBpcyBoYW5kbGVkIGluIHRoZSBSZWxpZ2lvbiBzZWN0aW9uLlxuZXhwb3J0IHR5cGUgUmVzZXRCb25maXJlQnVpbGRpbmdTZXR0aW5ncyA9IFJlY29yZDxcbiAgRXhjbHVkZTxCb25maXJlSXRlbSwgXCJ1bmljb3JuUGFzdHVyZVwiPixcbiAgUmVzZXRCb25maXJlQnVpbGRpbmdTZXR0aW5nXG4+O1xuXG5leHBvcnQgY2xhc3MgUmVzZXRCb25maXJlU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcmVhZG9ubHkgYnVpbGRpbmdzOiBSZXNldEJvbmZpcmVCdWlsZGluZ1NldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIHN1cGVyKGVuYWJsZWQpO1xuICAgIHRoaXMuYnVpbGRpbmdzID0gdGhpcy5pbml0QnVpbGRpbmdzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRCdWlsZGluZ3MoKTogUmVzZXRCb25maXJlQnVpbGRpbmdTZXR0aW5ncyB7XG4gICAgY29uc3QgYmFzZVN0YWdlOiBQYXJ0aWFsPFJlY29yZDxTdGFnZWRCdWlsZGluZywgQnVpbGRpbmc+PiA9IHtcbiAgICAgIGJyb2FkY2FzdHRvd2VyOiBcImFtcGhpdGhlYXRyZVwiLFxuICAgICAgZGF0YUNlbnRlcjogXCJsaWJyYXJ5XCIsXG4gICAgICBoeWRyb3BsYW50OiBcImFxdWVkdWN0XCIsXG4gICAgICBzb2xhcmZhcm06IFwicGFzdHVyZVwiLFxuICAgICAgc3BhY2Vwb3J0OiBcIndhcmVob3VzZVwiLFxuICAgIH07XG5cbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIFJlc2V0Qm9uZmlyZUJ1aWxkaW5nU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIEJ1aWxkaW5ncykge1xuICAgICAgaWYgKGl0ZW0gPT09IFwidW5pY29yblBhc3R1cmVcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc2V0Qm9uZmlyZUJ1aWxkaW5nU2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFN0YWdlZEJ1aWxkaW5ncykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgUmVzZXRCb25maXJlQnVpbGRpbmdTZXR0aW5nKGl0ZW0sIGZhbHNlLCAtMSwgYmFzZVN0YWdlW2l0ZW1dKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBsb2FkKHNldHRpbmdzOiBNYXliZTxQYXJ0aWFsPFJlc2V0Qm9uZmlyZVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMuYnVpbGRpbmdzLCBzZXR0aW5ncy5idWlsZGluZ3MsIChidWlsZGluZywgaXRlbSkgPT4ge1xuICAgICAgYnVpbGRpbmcuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gYnVpbGRpbmcuZW5hYmxlZDtcbiAgICAgIGJ1aWxkaW5nLnRyaWdnZXIgPSBpdGVtPy50cmlnZ2VyID8/IGJ1aWxkaW5nLnRyaWdnZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsLCB0eXBlIE1heWJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgY29uc3VtZUVudHJpZXNQZWRhbnRpYyB9IGZyb20gXCIuLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIEZhaXRoSXRlbSxcbiAgUmVsaWdpb25VcGdyYWRlcyxcbiAgVHJhbnNjZW5kZW5jZVVwZ3JhZGVzLFxuICB0eXBlIFVuaWNvcm5JdGVtLFxuICBVbmljb3JuSXRlbVZhcmlhbnQsXG4gIFppZ2d1cmF0VXBncmFkZXMsXG59IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZywgU2V0dGluZ1RocmVzaG9sZCB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNldFJlbGlnaW9uQnVpbGRpbmdTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ1RocmVzaG9sZCB7XG4gIHJlYWRvbmx5ICNidWlsZGluZzogRmFpdGhJdGVtIHwgVW5pY29ybkl0ZW07XG4gIHJlYWRvbmx5ICN2YXJpYW50OiBVbmljb3JuSXRlbVZhcmlhbnQ7XG5cbiAgZ2V0IGJ1aWxkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNidWlsZGluZztcbiAgfVxuICBnZXQgdmFyaWFudCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdmFyaWFudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1aWxkaW5nOiBGYWl0aEl0ZW0gfCBVbmljb3JuSXRlbSxcbiAgICB2YXJpYW50OiBVbmljb3JuSXRlbVZhcmlhbnQsXG4gICAgZW5hYmxlZCA9IGZhbHNlLFxuICAgIHRocmVzaG9sZCA9IC0xLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkLCB0aHJlc2hvbGQpO1xuICAgIHRoaXMuI2J1aWxkaW5nID0gYnVpbGRpbmc7XG4gICAgdGhpcy4jdmFyaWFudCA9IHZhcmlhbnQ7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUmVzZXRSZWxpZ2lvbkJ1aWxkaW5nU2V0dGluZ3MgPSBSZWNvcmQ8XG4gIEZhaXRoSXRlbSB8IFVuaWNvcm5JdGVtLFxuICBSZXNldFJlbGlnaW9uQnVpbGRpbmdTZXR0aW5nXG4+O1xuXG5leHBvcnQgY2xhc3MgUmVzZXRSZWxpZ2lvblNldHRpbmdzIGV4dGVuZHMgU2V0dGluZyB7XG4gIHJlYWRvbmx5IGJ1aWxkaW5nczogUmVzZXRSZWxpZ2lvbkJ1aWxkaW5nU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy5idWlsZGluZ3MgPSB0aGlzLmluaXRCdWlsZGluZ3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEJ1aWxkaW5ncygpOiBSZXNldFJlbGlnaW9uQnVpbGRpbmdTZXR0aW5ncyB7XG4gICAgY29uc3QgaXRlbXMgPSB7fSBhcyBSZXNldFJlbGlnaW9uQnVpbGRpbmdTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgUmVsaWdpb25VcGdyYWRlcykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgUmVzZXRSZWxpZ2lvbkJ1aWxkaW5nU2V0dGluZyhpdGVtLCBVbmljb3JuSXRlbVZhcmlhbnQuT3JkZXJPZlRoZVN1bik7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBUcmFuc2NlbmRlbmNlVXBncmFkZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc2V0UmVsaWdpb25CdWlsZGluZ1NldHRpbmcoaXRlbSwgVW5pY29ybkl0ZW1WYXJpYW50LkNyeXB0b3RoZW9sb2d5KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFppZ2d1cmF0VXBncmFkZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc2V0UmVsaWdpb25CdWlsZGluZ1NldHRpbmcoaXRlbSwgVW5pY29ybkl0ZW1WYXJpYW50LlppZ2d1cmF0KTtcbiAgICB9XG4gICAgaXRlbXMudW5pY29yblBhc3R1cmUgPSBuZXcgUmVzZXRSZWxpZ2lvbkJ1aWxkaW5nU2V0dGluZyhcbiAgICAgIFwidW5pY29yblBhc3R1cmVcIixcbiAgICAgIFVuaWNvcm5JdGVtVmFyaWFudC5Vbmljb3JuUGFzdHVyZSxcbiAgICApO1xuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8UmVzZXRSZWxpZ2lvblNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMuYnVpbGRpbmdzLCBzZXR0aW5ncy5idWlsZGluZ3MsIChidWlsZGluZywgaXRlbSkgPT4ge1xuICAgICAgYnVpbGRpbmcuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gYnVpbGRpbmcuZW5hYmxlZDtcbiAgICAgIGJ1aWxkaW5nLnRyaWdnZXIgPSBpdGVtPy50cmlnZ2VyID8/IGJ1aWxkaW5nLnRyaWdnZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsLCB0eXBlIE1heWJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgY29uc3VtZUVudHJpZXNQZWRhbnRpYyB9IGZyb20gXCIuLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgeyB0eXBlIFJlc291cmNlLCBSZXNvdXJjZXMgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmcsIFNldHRpbmdUaHJlc2hvbGQgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRSZXNvdXJjZXNTZXR0aW5nc0l0ZW0gZXh0ZW5kcyBTZXR0aW5nVGhyZXNob2xkIHtcbiAgcmVhZG9ubHkgI3Jlc291cmNlOiBSZXNvdXJjZTtcblxuICBnZXQgcmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlO1xuICB9XG5cbiAgY29uc3RydWN0b3IocmVzb3VyY2U6IFJlc291cmNlLCBlbmFibGVkID0gZmFsc2UsIHRocmVzaG9sZCA9IC0xKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgdGhyZXNob2xkKTtcbiAgICB0aGlzLiNyZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFJlc2V0UmVzb3VyY2VzUmVzb3VyY2VTZXR0aW5ncyA9IFJlY29yZDxSZXNvdXJjZSwgUmVzZXRSZXNvdXJjZXNTZXR0aW5nc0l0ZW0+O1xuXG5leHBvcnQgY2xhc3MgUmVzZXRSZXNvdXJjZXNTZXR0aW5ncyBleHRlbmRzIFNldHRpbmcge1xuICByZXNvdXJjZXM6IFJlc2V0UmVzb3VyY2VzUmVzb3VyY2VTZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLnJlc291cmNlcyA9IHRoaXMuaW5pdFJlc291cmNlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0UmVzb3VyY2VzKCk6IFJlc2V0UmVzb3VyY2VzUmVzb3VyY2VTZXR0aW5ncyB7XG4gICAgY29uc3QgaXRlbXMgPSB7fSBhcyBSZXNldFJlc291cmNlc1Jlc291cmNlU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFJlc291cmNlcykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgUmVzZXRSZXNvdXJjZXNTZXR0aW5nc0l0ZW0oaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8UmVzZXRSZXNvdXJjZXNTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLnJlc291cmNlcywgc2V0dGluZ3MucmVzb3VyY2VzLCAocmVzb3VyY2UsIGl0ZW0pID0+IHtcbiAgICAgIHJlc291cmNlLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IHJlc291cmNlLmVuYWJsZWQ7XG4gICAgICByZXNvdXJjZS50cmlnZ2VyID0gaXRlbT8udHJpZ2dlciA/PyByZXNvdXJjZS50cmlnZ2VyO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBTcGFjZUJ1aWxkaW5nLCBTcGFjZUJ1aWxkaW5ncyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZywgU2V0dGluZ1RocmVzaG9sZCB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNldFNwYWNlQnVpbGRpbmdTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ1RocmVzaG9sZCB7XG4gIHJlYWRvbmx5ICNidWlsZGluZzogU3BhY2VCdWlsZGluZztcblxuICBnZXQgYnVpbGRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2J1aWxkaW5nO1xuICB9XG5cbiAgY29uc3RydWN0b3IoYnVpbGRpbmc6IFNwYWNlQnVpbGRpbmcsIGVuYWJsZWQgPSBmYWxzZSwgdGhyZXNob2xkID0gLTEpIHtcbiAgICBzdXBlcihlbmFibGVkLCB0aHJlc2hvbGQpO1xuICAgIHRoaXMuI2J1aWxkaW5nID0gYnVpbGRpbmc7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUmVzZXRTcGFjZUJ1aWxkaW5nU2V0dGluZ3MgPSBSZWNvcmQ8U3BhY2VCdWlsZGluZywgU2V0dGluZ1RocmVzaG9sZD47XG5cbmV4cG9ydCBjbGFzcyBSZXNldFNwYWNlU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcmVhZG9ubHkgYnVpbGRpbmdzOiBSZXNldFNwYWNlQnVpbGRpbmdTZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLmJ1aWxkaW5ncyA9IHRoaXMuaW5pdEJ1aWxkaW5ncygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0QnVpbGRpbmdzKCk6IFJlc2V0U3BhY2VCdWlsZGluZ1NldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIFJlc2V0U3BhY2VCdWlsZGluZ1NldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBTcGFjZUJ1aWxkaW5ncykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgUmVzZXRTcGFjZUJ1aWxkaW5nU2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxSZXNldFNwYWNlU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy5idWlsZGluZ3MsIHNldHRpbmdzLmJ1aWxkaW5ncywgKGJ1aWxkaW5nLCBpdGVtKSA9PiB7XG4gICAgICBidWlsZGluZy5lbmFibGVkID0gaXRlbT8uZW5hYmxlZCA/PyBidWlsZGluZy5lbmFibGVkO1xuICAgICAgYnVpbGRpbmcudHJpZ2dlciA9IGl0ZW0/LnRyaWdnZXIgPz8gYnVpbGRpbmcudHJpZ2dlcjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IENocm9ub0ZvcmdlVXBncmFkZXMsIFRpbWVJdGVtVmFyaWFudCwgVm9pZFNwYWNlVXBncmFkZXMgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmcsIFNldHRpbmdUaHJlc2hvbGQgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUaW1lSXRlbSB9IGZyb20gXCIuL1RpbWVTZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRUaW1lQnVpbGRpbmdTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ1RocmVzaG9sZCB7XG4gIHJlYWRvbmx5ICNidWlsZGluZzogVGltZUl0ZW07XG4gIHJlYWRvbmx5ICN2YXJpYW50OiBUaW1lSXRlbVZhcmlhbnQ7XG5cbiAgZ2V0IGJ1aWxkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNidWlsZGluZztcbiAgfVxuICBnZXQgdmFyaWFudCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdmFyaWFudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGlkOiBUaW1lSXRlbSwgdmFyaWFudDogVGltZUl0ZW1WYXJpYW50LCBlbmFibGVkID0gZmFsc2UsIHRocmVzaG9sZCA9IC0xKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgdGhyZXNob2xkKTtcbiAgICB0aGlzLiNidWlsZGluZyA9IGlkO1xuICAgIHRoaXMuI3ZhcmlhbnQgPSB2YXJpYW50O1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFJlc2V0VGltZUJ1aWxkaW5nU2V0dGluZ3MgPSBSZWNvcmQ8VGltZUl0ZW0sIFJlc2V0VGltZUJ1aWxkaW5nU2V0dGluZz47XG5cbmV4cG9ydCBjbGFzcyBSZXNldFRpbWVTZXR0aW5ncyBleHRlbmRzIFNldHRpbmcge1xuICByZWFkb25seSBidWlsZGluZ3M6IFJlc2V0VGltZUJ1aWxkaW5nU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy5idWlsZGluZ3MgPSB0aGlzLmluaXRCdWlsZGluZ3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEJ1aWxkaW5ncygpOiBSZXNldFRpbWVCdWlsZGluZ1NldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIFJlc2V0VGltZUJ1aWxkaW5nU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIENocm9ub0ZvcmdlVXBncmFkZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc2V0VGltZUJ1aWxkaW5nU2V0dGluZyhpdGVtLCBUaW1lSXRlbVZhcmlhbnQuQ2hyb25vZm9yZ2UpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgVm9pZFNwYWNlVXBncmFkZXMpIHtcbiAgICAgIGlmIChpdGVtID09PSBcInVzZWRDcnlvY2hhbWJlcnNcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc2V0VGltZUJ1aWxkaW5nU2V0dGluZyhpdGVtLCBUaW1lSXRlbVZhcmlhbnQuVm9pZFNwYWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxSZXNldFRpbWVTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLmJ1aWxkaW5ncywgc2V0dGluZ3MuYnVpbGRpbmdzLCAoYnVpbGRpbmcsIGl0ZW0pID0+IHtcbiAgICAgIGJ1aWxkaW5nLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IGJ1aWxkaW5nLmVuYWJsZWQ7XG4gICAgICBidWlsZGluZy50cmlnZ2VyID0gaXRlbT8udHJpZ2dlciA/PyBidWlsZGluZy50cmlnZ2VyO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBVcGdyYWRlLCBVcGdyYWRlcyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNldFVwZ3JhZGVTZXR0aW5nc0l0ZW0gZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcmVhZG9ubHkgI3VwZ3JhZGU6IFVwZ3JhZGU7XG5cbiAgZ2V0IHVwZ3JhZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3VwZ3JhZGU7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih1cGdyYWRlOiBVcGdyYWRlLCBlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLiN1cGdyYWRlID0gdXBncmFkZTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSZXNldFVwZ3JhZGVTZXR0aW5nc0l0ZW1zID0gUmVjb3JkPFVwZ3JhZGUsIFJlc2V0VXBncmFkZVNldHRpbmdzSXRlbT47XG5cbmV4cG9ydCBjbGFzcyBSZXNldFVwZ3JhZGVTZXR0aW5ncyBleHRlbmRzIFNldHRpbmcge1xuICByZWFkb25seSB1cGdyYWRlczogUmVzZXRVcGdyYWRlU2V0dGluZ3NJdGVtcztcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLnVwZ3JhZGVzID0gdGhpcy5pbml0VXBncmFkZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFVwZ3JhZGVzKCk6IFJlc2V0VXBncmFkZVNldHRpbmdzSXRlbXMge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgUmVzZXRVcGdyYWRlU2V0dGluZ3NJdGVtcztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgVXBncmFkZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc2V0VXBncmFkZVNldHRpbmdzSXRlbShpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxSZXNldFVwZ3JhZGVTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLnVwZ3JhZGVzLCBzZXR0aW5ncy51cGdyYWRlcywgKHVwZ3JhZGUsIGl0ZW0pID0+IHtcbiAgICAgIHVwZ3JhZGUuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gdXBncmFkZS5lbmFibGVkO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IFJlc2V0Qm9uZmlyZVNldHRpbmdzIH0gZnJvbSBcIi4vUmVzZXRCb25maXJlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFJlc2V0UmVsaWdpb25TZXR0aW5ncyB9IGZyb20gXCIuL1Jlc2V0UmVsaWdpb25TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgUmVzZXRSZXNvdXJjZXNTZXR0aW5ncyB9IGZyb20gXCIuL1Jlc2V0UmVzb3VyY2VzU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFJlc2V0U3BhY2VTZXR0aW5ncyB9IGZyb20gXCIuL1Jlc2V0U3BhY2VTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgUmVzZXRUaW1lU2V0dGluZ3MgfSBmcm9tIFwiLi9SZXNldFRpbWVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgUmVzZXRVcGdyYWRlU2V0dGluZ3MgfSBmcm9tIFwiLi9SZXNldFVwZ3JhZGVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNldFNldHRpbmdzIGV4dGVuZHMgU2V0dGluZyB7XG4gIGJvbmZpcmU6IFJlc2V0Qm9uZmlyZVNldHRpbmdzO1xuICByZWxpZ2lvbjogUmVzZXRSZWxpZ2lvblNldHRpbmdzO1xuICByZXNvdXJjZXM6IFJlc2V0UmVzb3VyY2VzU2V0dGluZ3M7XG4gIHNwYWNlOiBSZXNldFNwYWNlU2V0dGluZ3M7XG4gIHRpbWU6IFJlc2V0VGltZVNldHRpbmdzO1xuICB1cGdyYWRlczogUmVzZXRVcGdyYWRlU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW5hYmxlZCA9IGZhbHNlLFxuICAgIGJvbmZpcmUgPSBuZXcgUmVzZXRCb25maXJlU2V0dGluZ3MoKSxcbiAgICByZWxpZ2lvbiA9IG5ldyBSZXNldFJlbGlnaW9uU2V0dGluZ3MoKSxcbiAgICByZXNvdXJjZXMgPSBuZXcgUmVzZXRSZXNvdXJjZXNTZXR0aW5ncygpLFxuICAgIHNwYWNlID0gbmV3IFJlc2V0U3BhY2VTZXR0aW5ncygpLFxuICAgIHRpbWUgPSBuZXcgUmVzZXRUaW1lU2V0dGluZ3MoKSxcbiAgICB1cGdyYWRlcyA9IG5ldyBSZXNldFVwZ3JhZGVTZXR0aW5ncygpLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLmJvbmZpcmUgPSBib25maXJlO1xuICAgIHRoaXMucmVsaWdpb24gPSByZWxpZ2lvbjtcbiAgICB0aGlzLnJlc291cmNlcyA9IHJlc291cmNlcztcbiAgICB0aGlzLnNwYWNlID0gc3BhY2U7XG4gICAgdGhpcy50aW1lID0gdGltZTtcbiAgICB0aGlzLnVwZ3JhZGVzID0gdXBncmFkZXM7XG4gIH1cblxuICBsb2FkKHNldHRpbmdzOiBNYXliZTxQYXJ0aWFsPFJlc2V0U2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIHRoaXMuYm9uZmlyZS5sb2FkKHNldHRpbmdzLmJvbmZpcmUpO1xuICAgIHRoaXMucmVsaWdpb24ubG9hZChzZXR0aW5ncy5yZWxpZ2lvbik7XG4gICAgdGhpcy5yZXNvdXJjZXMubG9hZChzZXR0aW5ncy5yZXNvdXJjZXMpO1xuICAgIHRoaXMuc3BhY2UubG9hZChzZXR0aW5ncy5zcGFjZSk7XG4gICAgdGhpcy50aW1lLmxvYWQoc2V0dGluZ3MudGltZSk7XG4gICAgdGhpcy51cGdyYWRlcy5sb2FkKHNldHRpbmdzLnVwZ3JhZGVzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IEN5Y2xlcyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZywgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDeWNsZXNTZXR0aW5ncyB9IGZyb20gXCIuL1RpbWVTa2lwU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFRpbWVTa2lwSGVhdFNldHRpbmdzIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXIge1xuICByZWFkb25seSBjeWNsZXM6IEN5Y2xlc1NldHRpbmdzO1xuICByZWFkb25seSBhY3RpdmVIZWF0VHJhbnNmZXJTdGF0dXM6IFNldHRpbmc7XG5cbiAgY29uc3RydWN0b3IoYWN0aXZlSGVhdFRyYW5zZmVyU3RhdHVzID0gbmV3IFNldHRpbmcoKSkge1xuICAgIHN1cGVyKGZhbHNlLCAxKTtcbiAgICB0aGlzLmN5Y2xlcyA9IHRoaXMuaW5pdEN5Y2xlcygpO1xuICAgIHRoaXMuYWN0aXZlSGVhdFRyYW5zZmVyU3RhdHVzID0gYWN0aXZlSGVhdFRyYW5zZmVyU3RhdHVzO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q3ljbGVzKCk6IEN5Y2xlc1NldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIEN5Y2xlc1NldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBDeWNsZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFNldHRpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxUaW1lU2tpcEhlYXRTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLmN5Y2xlcywgc2V0dGluZ3MuY3ljbGVzLCAoY3ljbGUsIGl0ZW0pID0+IHtcbiAgICAgIGN5Y2xlLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IGN5Y2xlLmVuYWJsZWQ7XG4gICAgfSk7XG4gICAgdGhpcy5hY3RpdmVIZWF0VHJhbnNmZXJTdGF0dXMubG9hZChzZXR0aW5ncy5hY3RpdmVIZWF0VHJhbnNmZXJTdGF0dXMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IFRpbWVTa2lwSGVhdFNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1RpbWVTa2lwSGVhdFNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IHR5cGUgQ3ljbGUsIEN5Y2xlcywgdHlwZSBTZWFzb24sIFNlYXNvbnMgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmcsIFNldHRpbmdUaHJlc2hvbGRNYXggfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgdHlwZSBDeWNsZXNTZXR0aW5ncyA9IFJlY29yZDxDeWNsZSwgU2V0dGluZz47XG5leHBvcnQgdHlwZSBTZWFzb25zU2V0dGluZ3MgPSBSZWNvcmQ8U2Vhc29uLCBTZXR0aW5nPjtcblxuZXhwb3J0IGNsYXNzIFRpbWVTa2lwU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nVGhyZXNob2xkTWF4IHtcbiAgcmVhZG9ubHkgY3ljbGVzOiBDeWNsZXNTZXR0aW5ncztcbiAgcmVhZG9ubHkgc2Vhc29uczogU2Vhc29uc1NldHRpbmdzO1xuICByZWFkb25seSBhY3RpdmVIZWF0VHJhbnNmZXI6IFRpbWVTa2lwSGVhdFNldHRpbmdzO1xuICByZWFkb25seSBpZ25vcmVPdmVyaGVhdDogU2V0dGluZztcblxuICBjb25zdHJ1Y3RvcihpZ25vcmVPdmVyaGVhdCA9IG5ldyBTZXR0aW5nKCksIGFjdGl2ZUhlYXRUcmFuc2ZlciA9IG5ldyBUaW1lU2tpcEhlYXRTZXR0aW5ncygpKSB7XG4gICAgc3VwZXIoZmFsc2UsIDUpO1xuICAgIHRoaXMuY3ljbGVzID0gdGhpcy5pbml0Q3ljbGVzKCk7XG4gICAgdGhpcy5zZWFzb25zID0gdGhpcy5pbml0U2Vhc29uKCk7XG4gICAgdGhpcy5hY3RpdmVIZWF0VHJhbnNmZXIgPSBhY3RpdmVIZWF0VHJhbnNmZXI7XG4gICAgdGhpcy5pZ25vcmVPdmVyaGVhdCA9IGlnbm9yZU92ZXJoZWF0O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q3ljbGVzKCk6IEN5Y2xlc1NldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIEN5Y2xlc1NldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBDeWNsZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFNldHRpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0U2Vhc29uKCk6IFNlYXNvbnNTZXR0aW5ncyB7XG4gICAgY29uc3QgaXRlbXMgPSB7fSBhcyBTZWFzb25zU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFNlYXNvbnMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFNldHRpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxUaW1lU2tpcFNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMuY3ljbGVzLCBzZXR0aW5ncy5jeWNsZXMsIChjeWNsZSwgaXRlbSkgPT4ge1xuICAgICAgY3ljbGUuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gY3ljbGUuZW5hYmxlZDtcbiAgICB9KTtcbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMuc2Vhc29ucywgc2V0dGluZ3Muc2Vhc29ucywgKHNlYXNvbiwgaXRlbSkgPT4ge1xuICAgICAgc2Vhc29uLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IHNlYXNvbi5lbmFibGVkO1xuICAgIH0pO1xuICAgIHRoaXMuaWdub3JlT3ZlcmhlYXQubG9hZChzZXR0aW5ncy5pZ25vcmVPdmVyaGVhdCk7XG4gICAgdGhpcy5hY3RpdmVIZWF0VHJhbnNmZXIubG9hZChzZXR0aW5ncy5hY3RpdmVIZWF0VHJhbnNmZXIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IFJlc2V0U2V0dGluZ3MgfSBmcm9tIFwiLi9SZXNldFNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nLCBTZXR0aW5nVHJpZ2dlciB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUaW1lU2tpcFNldHRpbmdzIH0gZnJvbSBcIi4vVGltZVNraXBTZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgdHlwZSBDeWNsZUluZGljZXMgPSAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDggfCA5O1xuXG5leHBvcnQgdHlwZSBUaW1lQ29udHJvbEl0ZW0gPSBcImFjY2VsZXJhdGVUaW1lXCIgfCBcInJlc2V0XCIgfCBcInRpbWVTa2lwXCI7XG5cbmV4cG9ydCBjbGFzcyBUaW1lQ29udHJvbFNldHRpbmdzIGV4dGVuZHMgU2V0dGluZyB7XG4gIGFjY2VsZXJhdGVUaW1lOiBTZXR0aW5nVHJpZ2dlcjtcbiAgdGltZVNraXA6IFRpbWVTa2lwU2V0dGluZ3M7XG4gIHJlc2V0OiBSZXNldFNldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVuYWJsZWQgPSBmYWxzZSxcbiAgICBhY2NlbGVyYXRlVGltZSA9IG5ldyBTZXR0aW5nVHJpZ2dlcihmYWxzZSwgMSksXG4gICAgcmVzZXQgPSBuZXcgUmVzZXRTZXR0aW5ncygpLFxuICAgIHRpbWVTa2lwID0gbmV3IFRpbWVTa2lwU2V0dGluZ3MoKSxcbiAgKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy5hY2NlbGVyYXRlVGltZSA9IGFjY2VsZXJhdGVUaW1lO1xuICAgIHRoaXMucmVzZXQgPSByZXNldDtcbiAgICB0aGlzLnRpbWVTa2lwID0gdGltZVNraXA7XG4gIH1cblxuICBsb2FkKHNldHRpbmdzOiBNYXliZTxQYXJ0aWFsPFRpbWVDb250cm9sU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIHRoaXMuYWNjZWxlcmF0ZVRpbWUubG9hZChzZXR0aW5ncy5hY2NlbGVyYXRlVGltZSk7XG4gICAgdGhpcy5yZXNldC5sb2FkKHNldHRpbmdzLnJlc2V0KTtcbiAgICB0aGlzLnRpbWVTa2lwLmxvYWQoc2V0dGluZ3MudGltZVNraXApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBDaHJvbm9Gb3JnZVVwZ3JhZGUsXG4gIENocm9ub0ZvcmdlVXBncmFkZXMsXG4gIFRpbWVJdGVtVmFyaWFudCxcbiAgdHlwZSBWb2lkU3BhY2VVcGdyYWRlLFxuICBWb2lkU3BhY2VVcGdyYWRlcyxcbn0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nLCBTZXR0aW5nVHJpZ2dlciwgU2V0dGluZ1RyaWdnZXJNYXggfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG4vKipcbiAqIFRoZSB1cGdyYWRlcyBvbiB0aGUgVGltZSB0YWIgdGhhdCB3ZSBoYXZlIG9wdGlvbnMgZm9yLlxuICovXG5leHBvcnQgdHlwZSBUaW1lSXRlbSA9IEV4Y2x1ZGU8Q2hyb25vRm9yZ2VVcGdyYWRlIHwgVm9pZFNwYWNlVXBncmFkZSwgXCJ1c2VkQ3J5b2NoYW1iZXJzXCI+O1xuXG5leHBvcnQgY2xhc3MgVGltZVNldHRpbmdzSXRlbSBleHRlbmRzIFNldHRpbmdUcmlnZ2VyTWF4IHtcbiAgcmVhZG9ubHkgI2J1aWxkaW5nOiBUaW1lSXRlbTtcbiAgcmVhZG9ubHkgI3ZhcmlhbnQ6IFRpbWVJdGVtVmFyaWFudDtcblxuICBnZXQgYnVpbGRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2J1aWxkaW5nO1xuICB9XG4gIGdldCB2YXJpYW50KCkge1xuICAgIHJldHVybiB0aGlzLiN2YXJpYW50O1xuICB9XG5cbiAgY29uc3RydWN0b3IoYnVpbGRpbmc6IFRpbWVJdGVtLCB2YXJpYW50OiBUaW1lSXRlbVZhcmlhbnQsIGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIHN1cGVyKGVuYWJsZWQsIC0xLCAwKTtcbiAgICB0aGlzLiNidWlsZGluZyA9IGJ1aWxkaW5nO1xuICAgIHRoaXMuI3ZhcmlhbnQgPSB2YXJpYW50O1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFRpbWVCdWlsZGluZ3NTZXR0aW5ncyA9IFJlY29yZDxUaW1lSXRlbSwgVGltZVNldHRpbmdzSXRlbT47XG5cbmV4cG9ydCBjbGFzcyBUaW1lU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nVHJpZ2dlciB7XG4gIGJ1aWxkaW5nczogVGltZUJ1aWxkaW5nc1NldHRpbmdzO1xuXG4gIGZpeENyeW9jaGFtYmVyczogU2V0dGluZztcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UsIHRyaWdnZXIgPSAtMSwgZml4Q3J5b2NoYW1iZXJzID0gbmV3IFNldHRpbmcoKSkge1xuICAgIHN1cGVyKGVuYWJsZWQsIHRyaWdnZXIpO1xuICAgIHRoaXMuYnVpbGRpbmdzID0gdGhpcy5pbml0QnVpbGRpbmdzKCk7XG4gICAgdGhpcy5maXhDcnlvY2hhbWJlcnMgPSBmaXhDcnlvY2hhbWJlcnM7XG4gIH1cblxuICBwcml2YXRlIGluaXRCdWlsZGluZ3MoKTogVGltZUJ1aWxkaW5nc1NldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIFRpbWVCdWlsZGluZ3NTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgQ2hyb25vRm9yZ2VVcGdyYWRlcykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgVGltZVNldHRpbmdzSXRlbShpdGVtLCBUaW1lSXRlbVZhcmlhbnQuQ2hyb25vZm9yZ2UpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgVm9pZFNwYWNlVXBncmFkZXMpIHtcbiAgICAgIGlmIChpdGVtID09PSBcInVzZWRDcnlvY2hhbWJlcnNcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFRpbWVTZXR0aW5nc0l0ZW0oaXRlbSwgVGltZUl0ZW1WYXJpYW50LlZvaWRTcGFjZSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8VGltZVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMuYnVpbGRpbmdzLCBzZXR0aW5ncy5idWlsZGluZ3MsIChidWlsZGluZywgaXRlbSkgPT4ge1xuICAgICAgYnVpbGRpbmcuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gYnVpbGRpbmcuZW5hYmxlZDtcbiAgICAgIGJ1aWxkaW5nLm1heCA9IGl0ZW0/Lm1heCA/PyBidWlsZGluZy5tYXg7XG4gICAgICBidWlsZGluZy50cmlnZ2VyID0gaXRlbT8udHJpZ2dlciA/PyBidWlsZGluZy50cmlnZ2VyO1xuICAgIH0pO1xuXG4gICAgdGhpcy5maXhDcnlvY2hhbWJlcnMubG9hZChzZXR0aW5ncy5maXhDcnlvY2hhbWJlcnMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBSYWNlLCBSYWNlcyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ01heCwgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgRW1iYXNzeVNldHRpbmcgZXh0ZW5kcyBTZXR0aW5nTWF4IHtcbiAgcmVhZG9ubHkgI3JhY2U6IFJhY2U7XG5cbiAgZ2V0IHJhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3JhY2U7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihyYWNlOiBSYWNlLCBlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLiNyYWNlID0gcmFjZTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBFbWJhc3N5UmFjZVNldHRpbmdzID0gUmVjb3JkPFJhY2UsIFNldHRpbmdNYXg+O1xuXG5leHBvcnQgY2xhc3MgRW1iYXNzeVNldHRpbmdzIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXIge1xuICByYWNlczogRW1iYXNzeVJhY2VTZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLnJhY2VzID0gdGhpcy5pbml0UmFjZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFJhY2VzKCk6IEVtYmFzc3lSYWNlU2V0dGluZ3Mge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgRW1iYXNzeVJhY2VTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgUmFjZXMpIHtcbiAgICAgIC8vIExldmlhdGhhbnMgaGF2ZSBubyBlbWJhc3NpZXMuXG4gICAgICBpZiAoaXRlbSA9PT0gXCJsZXZpYXRoYW5zXCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBFbWJhc3N5U2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxFbWJhc3N5U2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy5yYWNlcywgc2V0dGluZ3MucmFjZXMsIChyYWNlLCBpdGVtKSA9PiB7XG4gICAgICByYWNlLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IHJhY2UuZW5hYmxlZDtcbiAgICAgIHJhY2UubWF4ID0gaXRlbT8ubWF4ID8/IHJhY2UubWF4O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBSYWNlLCBSYWNlcywgdHlwZSBTZWFzb24gfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IEVtYmFzc3lTZXR0aW5ncyB9IGZyb20gXCIuL0VtYmFzc3lTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBSZXF1aXJlbWVudCxcbiAgU2V0dGluZyxcbiAgU2V0dGluZ0J1eVNlbGxUaHJlc2hvbGQsXG4gIFNldHRpbmdMaW1pdGVkVHJpZ2dlcixcbiAgU2V0dGluZ1RyaWdnZXIsXG59IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBUcmFkZVNldHRpbmdzSXRlbSBleHRlbmRzIFNldHRpbmdMaW1pdGVkVHJpZ2dlciB7XG4gIHJlYWRvbmx5ICNyYWNlOiBSYWNlO1xuICByZWFkb25seSBzZWFzb25zOiBSZWNvcmQ8U2Vhc29uLCBTZXR0aW5nPjtcblxuICAvKipcbiAgICogQSByZXNvdXJjZSB0aGF0IGlzIHJlcXVpcmVkIHRvIHRyYWRlIHdpdGggdGhlIHJhY2UuXG4gICAqL1xuICByZWFkb25seSAjcmVxdWlyZTogUmVxdWlyZW1lbnQ7XG5cbiAgZ2V0IHJhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3JhY2U7XG4gIH1cbiAgZ2V0IHJlcXVpcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3JlcXVpcmU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICByYWNlOiBSYWNlLFxuICAgIGVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgbGltaXRlZDogYm9vbGVhbixcbiAgICBzdW1tZXI6IGJvb2xlYW4sXG4gICAgYXV0dW1uOiBib29sZWFuLFxuICAgIHdpbnRlcjogYm9vbGVhbixcbiAgICBzcHJpbmc6IGJvb2xlYW4sXG4gICAgcmVxdWlyZTogUmVxdWlyZW1lbnQgPSBmYWxzZSxcbiAgKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgbGltaXRlZCk7XG4gICAgdGhpcy4jcmFjZSA9IHJhY2U7XG4gICAgdGhpcy5zZWFzb25zID0ge1xuICAgICAgYXV0dW1uOiBuZXcgU2V0dGluZyhhdXR1bW4pLFxuICAgICAgc3ByaW5nOiBuZXcgU2V0dGluZyhzcHJpbmcpLFxuICAgICAgc3VtbWVyOiBuZXcgU2V0dGluZyhzdW1tZXIpLFxuICAgICAgd2ludGVyOiBuZXcgU2V0dGluZyh3aW50ZXIpLFxuICAgIH07XG4gICAgdGhpcy4jcmVxdWlyZSA9IHJlcXVpcmU7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgVHJhZGVTZXR0aW5nc0l0ZW1zID0gUmVjb3JkPFJhY2UsIFRyYWRlU2V0dGluZ3NJdGVtPjtcblxuZXhwb3J0IGNsYXNzIFRyYWRlU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nVHJpZ2dlciB7XG4gIHJhY2VzOiBUcmFkZVNldHRpbmdzSXRlbXM7XG5cbiAgZmVlZExldmlhdGhhbnM6IFNldHRpbmc7XG4gIGJ1aWxkRW1iYXNzaWVzOiBFbWJhc3N5U2V0dGluZ3M7XG4gIHRyYWRlQmxhY2tjb2luOiBTZXR0aW5nQnV5U2VsbFRocmVzaG9sZDtcbiAgdW5sb2NrUmFjZXM6IFNldHRpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW5hYmxlZCA9IGZhbHNlLFxuICAgIHRyaWdnZXIgPSAtMSxcbiAgICBidWlsZEVtYmFzc2llcyA9IG5ldyBFbWJhc3N5U2V0dGluZ3MoKSxcbiAgICBmZWVkTGV2aWF0aGFucyA9IG5ldyBTZXR0aW5nKCksXG4gICAgdHJhZGVCbGFja2NvaW4gPSBuZXcgU2V0dGluZ0J1eVNlbGxUaHJlc2hvbGQoZmFsc2UsIDEwOTAuMCwgMTA5NS4wLCAxMDAwMCksXG4gICAgdW5sb2NrUmFjZXMgPSBuZXcgU2V0dGluZygpLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkLCB0cmlnZ2VyKTtcbiAgICB0aGlzLnJhY2VzID0gdGhpcy5pbml0UmFjZXMoKTtcbiAgICB0aGlzLmJ1aWxkRW1iYXNzaWVzID0gYnVpbGRFbWJhc3NpZXM7XG4gICAgdGhpcy5mZWVkTGV2aWF0aGFucyA9IGZlZWRMZXZpYXRoYW5zO1xuICAgIHRoaXMudHJhZGVCbGFja2NvaW4gPSB0cmFkZUJsYWNrY29pbjtcbiAgICB0aGlzLnVubG9ja1JhY2VzID0gdW5sb2NrUmFjZXM7XG4gIH1cblxuICBwcml2YXRlIGluaXRSYWNlcygpOiBUcmFkZVNldHRpbmdzSXRlbXMge1xuICAgIGNvbnN0IGRlZmF1bHRSZXF1aXJlOiBQYXJ0aWFsPFJlY29yZDxSYWNlLCBSZXF1aXJlbWVudD4+ID0ge1xuICAgICAgZHJhZ29uczogXCJ0aXRhbml1bVwiLFxuICAgICAgZ3JpZmZpbnM6IFwid29vZFwiLFxuICAgICAgbGV2aWF0aGFuczogXCJ1bm9idGFpbml1bVwiLFxuICAgICAgbGl6YXJkczogXCJtaW5lcmFsc1wiLFxuICAgICAgc2hhcmtzOiBcImlyb25cIixcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgVHJhZGVTZXR0aW5nc0l0ZW1zO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBSYWNlcykge1xuICAgICAgY29uc3QgcmVxdWlyZSA9IGRlZmF1bHRSZXF1aXJlW2l0ZW1dID8/IGZhbHNlO1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgVHJhZGVTZXR0aW5nc0l0ZW0oaXRlbSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgcmVxdWlyZSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8VHJhZGVTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLnJhY2VzLCBzZXR0aW5ncy5yYWNlcywgKHJhY2UsIGl0ZW0pID0+IHtcbiAgICAgIHJhY2UuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gcmFjZS5lbmFibGVkO1xuICAgICAgcmFjZS5saW1pdGVkID0gaXRlbT8ubGltaXRlZCA/PyByYWNlLmxpbWl0ZWQ7XG4gICAgICByYWNlLnRyaWdnZXIgPSBpdGVtPy50cmlnZ2VyID8/IHJhY2UudHJpZ2dlcjtcbiAgICAgIHJhY2Uuc2Vhc29ucy5hdXR1bW4uZW5hYmxlZCA9IGl0ZW0/LnNlYXNvbnMuYXV0dW1uLmVuYWJsZWQgPz8gcmFjZS5zZWFzb25zLmF1dHVtbi5lbmFibGVkO1xuICAgICAgcmFjZS5zZWFzb25zLnNwcmluZy5lbmFibGVkID0gaXRlbT8uc2Vhc29ucy5zcHJpbmcuZW5hYmxlZCA/PyByYWNlLnNlYXNvbnMuc3ByaW5nLmVuYWJsZWQ7XG4gICAgICByYWNlLnNlYXNvbnMuc3VtbWVyLmVuYWJsZWQgPSBpdGVtPy5zZWFzb25zLnN1bW1lci5lbmFibGVkID8/IHJhY2Uuc2Vhc29ucy5zdW1tZXIuZW5hYmxlZDtcbiAgICAgIHJhY2Uuc2Vhc29ucy53aW50ZXIuZW5hYmxlZCA9IGl0ZW0/LnNlYXNvbnMud2ludGVyLmVuYWJsZWQgPz8gcmFjZS5zZWFzb25zLndpbnRlci5lbmFibGVkO1xuICAgIH0pO1xuXG4gICAgdGhpcy5idWlsZEVtYmFzc2llcy5sb2FkKHNldHRpbmdzLmJ1aWxkRW1iYXNzaWVzKTtcbiAgICB0aGlzLmZlZWRMZXZpYXRoYW5zLmxvYWQoc2V0dGluZ3MuZmVlZExldmlhdGhhbnMpO1xuICAgIHRoaXMudHJhZGVCbGFja2NvaW4ubG9hZChzZXR0aW5ncy50cmFkZUJsYWNrY29pbik7XG4gICAgdGhpcy51bmxvY2tSYWNlcy5sb2FkKHNldHRpbmdzLnVubG9ja1JhY2VzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyB0eXBlIEpvYiwgSm9icywgdHlwZSBUcmFpdCwgVHJhaXRzIH0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nLCBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBFbGVjdExlYWRlclNldHRpbmdzIGV4dGVuZHMgU2V0dGluZyB7XG4gIHJlYWRvbmx5IGpvYjogU2V0dGluZ09wdGlvbnM8Sm9iPjtcbiAgcmVhZG9ubHkgdHJhaXQ6IFNldHRpbmdPcHRpb25zPFRyYWl0PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbmFibGVkID0gZmFsc2UsXG4gICAgam9iID0gbmV3IFNldHRpbmdPcHRpb25zPEpvYj4oXG4gICAgICBcImFueVwiLFxuICAgICAgSm9icy5tYXAoaXRlbSA9PiB7XG4gICAgICAgIHJldHVybiB7IGxhYmVsOiBcIlwiLCB2YWx1ZTogaXRlbSB9O1xuICAgICAgfSksXG4gICAgKSxcbiAgICB0cmFpdCA9IG5ldyBTZXR0aW5nT3B0aW9uczxUcmFpdD4oXG4gICAgICBcIm5vbmVcIixcbiAgICAgIFRyYWl0cy5tYXAoaXRlbSA9PiB7XG4gICAgICAgIHJldHVybiB7IGxhYmVsOiBcIlwiLCB2YWx1ZTogaXRlbSB9O1xuICAgICAgfSksXG4gICAgKSxcbiAgKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy5qb2IgPSBqb2I7XG4gICAgdGhpcy50cmFpdCA9IHRyYWl0O1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxFbGVjdExlYWRlclNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICB0aGlzLmpvYi5sb2FkKHNldHRpbmdzLmpvYik7XG4gICAgdGhpcy50cmFpdC5sb2FkKHNldHRpbmdzLnRyYWl0KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IHR5cGUgSm9iLCBKb2JzIH0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBFbGVjdExlYWRlclNldHRpbmdzIH0gZnJvbSBcIi4vRWxlY3RMZWFkZXJTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZywgU2V0dGluZ01heCwgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgdHlwZSBWaWxsYWdlSm9iU2V0dGluZ3MgPSBSZWNvcmQ8Sm9iLCBTZXR0aW5nTWF4PjtcblxuZXhwb3J0IGNsYXNzIFZpbGxhZ2VTZXR0aW5ncyBleHRlbmRzIFNldHRpbmcge1xuICBqb2JzOiBWaWxsYWdlSm9iU2V0dGluZ3M7XG5cbiAgaG9sZEZlc3RpdmFsczogU2V0dGluZztcbiAgaHVudDogU2V0dGluZ1RyaWdnZXI7XG4gIHByb21vdGVLaXR0ZW5zOiBTZXR0aW5nVHJpZ2dlcjtcbiAgcHJvbW90ZUxlYWRlcjogU2V0dGluZztcbiAgZWxlY3RMZWFkZXI6IEVsZWN0TGVhZGVyU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW5hYmxlZCA9IGZhbHNlLFxuICAgIGhvbGRGZXN0aXZhbHMgPSBuZXcgU2V0dGluZygpLFxuICAgIGh1bnQgPSBuZXcgU2V0dGluZ1RyaWdnZXIoZmFsc2UsIDAuOTgpLFxuICAgIHByb21vdGVLaXR0ZW5zID0gbmV3IFNldHRpbmdUcmlnZ2VyKGZhbHNlLCAxKSxcbiAgICBwcm9tb3RlTGVhZGVyID0gbmV3IFNldHRpbmcoKSxcbiAgICBlbGVjdExlYWRlciA9IG5ldyBFbGVjdExlYWRlclNldHRpbmdzKCksXG4gICkge1xuICAgIHN1cGVyKGVuYWJsZWQpO1xuICAgIHRoaXMuam9icyA9IHRoaXMuaW5pdEpvYnMoKTtcbiAgICB0aGlzLmhvbGRGZXN0aXZhbHMgPSBob2xkRmVzdGl2YWxzO1xuICAgIHRoaXMuaHVudCA9IGh1bnQ7XG4gICAgdGhpcy5wcm9tb3RlS2l0dGVucyA9IHByb21vdGVLaXR0ZW5zO1xuICAgIHRoaXMucHJvbW90ZUxlYWRlciA9IHByb21vdGVMZWFkZXI7XG4gICAgdGhpcy5lbGVjdExlYWRlciA9IGVsZWN0TGVhZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Sm9icygpOiBWaWxsYWdlSm9iU2V0dGluZ3Mge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgVmlsbGFnZUpvYlNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBKb2JzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBTZXR0aW5nTWF4KGZhbHNlLCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxWaWxsYWdlU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy5qb2JzLCBzZXR0aW5ncy5qb2JzLCAoam9iLCBpdGVtKSA9PiB7XG4gICAgICBqb2IuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gam9iLmVuYWJsZWQ7XG4gICAgICBqb2IubWF4ID0gaXRlbT8ubWF4ID8/IGpvYi5tYXg7XG4gICAgfSk7XG5cbiAgICB0aGlzLmhvbGRGZXN0aXZhbHMuZW5hYmxlZCA9IHNldHRpbmdzLmhvbGRGZXN0aXZhbHM/LmVuYWJsZWQgPz8gdGhpcy5ob2xkRmVzdGl2YWxzLmVuYWJsZWQ7XG4gICAgdGhpcy5odW50LmxvYWQoc2V0dGluZ3MuaHVudCk7XG4gICAgdGhpcy5wcm9tb3RlS2l0dGVucy5lbmFibGVkID0gc2V0dGluZ3MucHJvbW90ZUtpdHRlbnM/LmVuYWJsZWQgPz8gdGhpcy5wcm9tb3RlS2l0dGVucy5lbmFibGVkO1xuICAgIHRoaXMucHJvbW90ZUxlYWRlci5lbmFibGVkID0gc2V0dGluZ3MucHJvbW90ZUxlYWRlcj8uZW5hYmxlZCA/PyB0aGlzLnByb21vdGVMZWFkZXIuZW5hYmxlZDtcbiAgICB0aGlzLmVsZWN0TGVhZGVyLmxvYWQoc2V0dGluZ3MuZWxlY3RMZWFkZXIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCb25maXJlTWFuYWdlciB9IGZyb20gXCIuL0JvbmZpcmVNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEVuZ2luZSwgRnJhbWVDb250ZXh0IH0gZnJvbSBcIi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtpdHRlblNjaWVudGlzdHMgfSBmcm9tIFwiLi9LaXR0ZW5TY2llbnRpc3RzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJlbGlnaW9uTWFuYWdlciB9IGZyb20gXCIuL1JlbGlnaW9uTWFuYWdlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTcGFjZU1hbmFnZXIgfSBmcm9tIFwiLi9TcGFjZU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IHR5cGUgQ3ljbGVJbmRpY2VzLCBUaW1lQ29udHJvbFNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvVGltZUNvbnRyb2xTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVGFiTWFuYWdlciB9IGZyb20gXCIuL1RhYk1hbmFnZXIuanNcIjtcbmltcG9ydCB7IG9iamVjdEVudHJpZXMgfSBmcm9tIFwiLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgeyBuZWdhdGl2ZU9uZVRvSW5maW5pdHkgfSBmcm9tIFwiLi90b29scy9Gb3JtYXQuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQnVpbGRpbmdNZXRhLFxuICBVbnNhZmVCdWlsZGluZyxcbiAgVW5zYWZlVW5zdGFnZWRCdWlsZGluZ0J1dHRvbk9wdGlvbnMsXG59IGZyb20gXCIuL3R5cGVzL2J1aWxkaW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCdWlsZGluZ0J0biwgVW5zYWZlQnVpbGRpbmdCdG5Nb2RlbCB9IGZyb20gXCIuL3R5cGVzL2NvcmUuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ2hyb25vRm9yZ2VVcGdyYWRlLFxuICBDeWNsZXMsXG4gIHR5cGUgUHJpY2UsXG4gIFRpbWVJdGVtVmFyaWFudCxcbiAgdHlwZSBWb2lkU3BhY2VVcGdyYWRlLFxufSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTaGF0dGVyVENCdG4sIFNoYXR0ZXJUQ0J0bkNvbnRyb2xsZXIsIFRpbWVUYWIgfSBmcm9tIFwiLi90eXBlcy90aW1lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzaG9wTWFuYWdlciB9IGZyb20gXCIuL1dvcmtzaG9wTWFuYWdlci5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVGltZUNvbnRyb2xNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogS2l0dGVuU2NpZW50aXN0cztcbiAgcmVhZG9ubHkgc2V0dGluZ3M6IFRpbWVDb250cm9sU2V0dGluZ3M7XG4gIHJlYWRvbmx5IG1hbmFnZXI6IFRhYk1hbmFnZXI8VGltZVRhYj47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2JvbmZpcmVNYW5hZ2VyOiBCb25maXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVsaWdpb25NYW5hZ2VyOiBSZWxpZ2lvbk1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NwYWNlTWFuYWdlcjogU3BhY2VNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3Jrc2hvcE1hbmFnZXI6IFdvcmtzaG9wTWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0OiBLaXR0ZW5TY2llbnRpc3RzLFxuICAgIGJvbmZpcmVNYW5hZ2VyOiBCb25maXJlTWFuYWdlcixcbiAgICByZWxpZ2lvbk1hbmFnZXI6IFJlbGlnaW9uTWFuYWdlcixcbiAgICBzcGFjZU1hbmFnZXI6IFNwYWNlTWFuYWdlcixcbiAgICB3b3Jrc2hvcE1hbmFnZXI6IFdvcmtzaG9wTWFuYWdlcixcbiAgICBzZXR0aW5ncyA9IG5ldyBUaW1lQ29udHJvbFNldHRpbmdzKCksXG4gICkge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVGFiTWFuYWdlcih0aGlzLl9ob3N0LCBcIlRpbWVcIik7XG5cbiAgICB0aGlzLl9ib25maXJlTWFuYWdlciA9IGJvbmZpcmVNYW5hZ2VyO1xuICAgIHRoaXMuX3JlbGlnaW9uTWFuYWdlciA9IHJlbGlnaW9uTWFuYWdlcjtcbiAgICB0aGlzLl9zcGFjZU1hbmFnZXIgPSBzcGFjZU1hbmFnZXI7XG4gICAgdGhpcy5fd29ya3Nob3BNYW5hZ2VyID0gd29ya3Nob3BNYW5hZ2VyO1xuICB9XG5cbiAgYXN5bmMgdGljayhfY29udGV4dDogRnJhbWVDb250ZXh0KSB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLmVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5hY2NlbGVyYXRlVGltZS5lbmFibGVkKSB7XG4gICAgICB0aGlzLmFjY2VsZXJhdGVUaW1lKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNldHRpbmdzLnRpbWVTa2lwLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMudGltZVNraXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MucmVzZXQuZW5hYmxlZCkge1xuICAgICAgYXdhaXQgdGhpcy5hdXRvUmVzZXQodGhpcy5faG9zdC5lbmdpbmUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGF1dG9SZXNldChlbmdpbmU6IEVuZ2luZSkge1xuICAgIC8vIERvbid0IHJlc2V0IGlmIHRoZXJlJ3MgYSBjaGFsbGVuZ2UgcnVubmluZy5cbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLmNoYWxsZW5nZXMuY3VycmVudENoYWxsZW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrZWRMaXN0OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHJpZ2dlcjogbnVtYmVyOyB2YWw6IG51bWJlciB9PiA9IFtdO1xuICAgIGNvbnN0IGNoZWNrTGlzdDogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgdXMgdG8gcXVpY2tseSBjaGVjayBhIGxpc3Qgb2YgaXRlbXMgZm9yIG91clxuICAgIC8vIGFiaWxpdHkgdG8gYnV5IHRoZW0uXG4gICAgLy8gVGhlIGlkZWEgaXMgdGhhdCwgaWYgd2UgZG9uJ3QgaGF2ZSBhIGdpdmVuIGJ1aWxkaW5nIHlldCwgd2UgcHV0XG4gICAgLy8gaXQgb24gdGhlIGBjaGVja0xpc3RgLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiBjaGVjayB0aGUgcHJvdmlkZWRcbiAgICAvLyBidXR0b25zIGFuZCBzZWUgaWYgdGhlIGl0ZW0gYXBwZWFycyBvbiB0aGUgY2hlY2tsaXN0LlxuICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBnaXZlbiBpdGVtLCBidXQgd2UgKmNvdWxkKiBidXkgaXQsIHRoZW4gd2UgYWN0XG4gICAgLy8gYXMgaWYgd2UgYWxyZWFkeSBoYWQgaXQuXG4gICAgY29uc3QgY2hlY2sgPSA8XG4gICAgICBUIGV4dGVuZHMgQnVpbGRpbmdCdG48VW5zYWZlQnVpbGRpbmdCdG5Nb2RlbDxVbnNhZmVVbnN0YWdlZEJ1aWxkaW5nQnV0dG9uT3B0aW9ucz4+LFxuICAgID4oXG4gICAgICBidXR0b25zOiBBcnJheTxUPixcbiAgICApID0+IHtcbiAgICAgIGlmIChjaGVja0xpc3QubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgYnV0dG9uIG9mIGJ1dHRvbnMpIHtcbiAgICAgICAgICBpZiAoaXNOaWwoYnV0dG9uLm1vZGVsKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbW9kZWwgPSBidXR0b24ubW9kZWwgYXMgeyBtZXRhZGF0YTogeyBuYW1lOiBzdHJpbmcgfTsgcHJpY2VzOiBBcnJheTxQcmljZT4gfTtcblxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBtb2RlbC5tZXRhZGF0YS5uYW1lO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2hlY2tMaXN0LmluZGV4T2YobmFtZSk7XG4gICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY2hlY2tMaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICBpZiAodGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuaGFzUmVzKG11c3RFeGlzdChtb2RlbC5wcmljZXMpKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgLy8gY2hlY2sgYnVpbGRpbmdcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2Ygb2JqZWN0RW50cmllcyh0aGlzLnNldHRpbmdzLnJlc2V0LmJvbmZpcmUuYnVpbGRpbmdzKSkge1xuICAgICAgaWYgKCFlbnRyeS5lbmFibGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgdHJpZ2dlciBmb3IgYW4gaXRlbSBpcyBzZXQgdG8gaW5maW5pdHksIGl0IGJhc2ljYWxseSBkaXNhYmxlcyB0aGUgZW50aXJlIGZlYXR1cmUuXG4gICAgICBpZiAoZW50cnkudHJpZ2dlciA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBPYnZpb3VzIGVycm9yIGhlcmUuIEZvciB1cGdyYWRlZCBidWlsZGluZ3MsIGl0IG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcuXG4gICAgICBsZXQgYmxkOiBCdWlsZGluZ01ldGE8VW5zYWZlQnVpbGRpbmc+IHwgbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgT2J2aW91cyBlcnJvciBoZXJlLiBGb3IgdXBncmFkZWQgYnVpbGRpbmdzLCBpdCBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nLlxuICAgICAgICBibGQgPSB0aGlzLl9ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KG5hbWUpO1xuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgIGJsZCA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoaXNOaWwoYmxkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY2hlY2tlZExpc3QucHVzaCh7XG4gICAgICAgIG5hbWU6IGJsZC5tZXRhLmxhYmVsID8/IG11c3RFeGlzdChibGQubWV0YS5zdGFnZXMpW211c3RFeGlzdChibGQubWV0YS5zdGFnZSldLmxhYmVsLFxuICAgICAgICB0cmlnZ2VyOiBlbnRyeS50cmlnZ2VyLFxuICAgICAgICB2YWw6IGJsZC5tZXRhLnZhbCxcbiAgICAgIH0pO1xuICAgICAgaWYgKDAgPCBlbnRyeS50cmlnZ2VyKSB7XG4gICAgICAgIC8vIElmIHRoZSByZXF1aXJlZCBhbW91bnQgb2YgYnVpbGRpbmdzIGhhc24ndCBiZWVuIGJ1aWx0IHlldCwgYmFpbCBvdXQuXG4gICAgICAgIGlmIChibGQubWV0YS52YWwgPCBlbnRyeS50cmlnZ2VyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja0xpc3QucHVzaChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB1bmljb3JuUGFzdHVyZVxuICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHVuaWNvcm4gcGFzdHVyZS4gQXMgaXQncyBsaXN0ZWQgdW5kZXIgcmVsaWdpb24sIGJ1dCBpc1xuICAgIC8vIGFjdHVhbGx5IGEgYm9uZmlyZSBpdGVtLlxuICAgIGNvbnN0IHVuaWNvcm5QYXN0dXJlID0gdGhpcy5zZXR0aW5ncy5yZXNldC5yZWxpZ2lvbi5idWlsZGluZ3MudW5pY29yblBhc3R1cmU7XG4gICAgaWYgKHVuaWNvcm5QYXN0dXJlLmVuYWJsZWQpIHtcbiAgICAgIC8vIElmIHRoZSB0cmlnZ2VyIGZvciBhbiBpdGVtIGlzIHNldCB0byBpbmZpbml0eSwgaXQgYmFzaWNhbGx5IGRpc2FibGVzIHRoZSBlbnRpcmUgZmVhdHVyZS5cbiAgICAgIGlmICh1bmljb3JuUGFzdHVyZS50cmlnZ2VyIDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsZCA9IHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJ1bmljb3JuUGFzdHVyZVwiKTtcbiAgICAgIGNoZWNrZWRMaXN0LnB1c2goe1xuICAgICAgICBuYW1lOiBtdXN0RXhpc3QoYmxkLm1ldGEubGFiZWwpLFxuICAgICAgICB0cmlnZ2VyOiB1bmljb3JuUGFzdHVyZS50cmlnZ2VyLFxuICAgICAgICB2YWw6IGJsZC5tZXRhLnZhbCxcbiAgICAgIH0pO1xuICAgICAgaWYgKDAgPCB1bmljb3JuUGFzdHVyZS50cmlnZ2VyKSB7XG4gICAgICAgIGlmIChibGQubWV0YS52YWwgPCB1bmljb3JuUGFzdHVyZS50cmlnZ2VyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja0xpc3QucHVzaChcInVuaWNvcm5QYXN0dXJlXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRoZSBgY2hlY2soKWAgY2FsbHMgYXJlIHVuc2FmZSBhbmQgbmVlZCB0byBiZSByZXdyaXR0ZW4uXG4gICAgaWYgKGNoZWNrKHRoaXMuX2JvbmZpcmVNYW5hZ2VyLm1hbmFnZXIudGFiLmNoaWxkcmVuKSB8fCBjaGVja0xpc3QubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgc3BhY2VcbiAgICAvLyBUaGlzIGlzIGlkZW50aWNhbCB0byByZWd1bGFyIGJ1aWxkaW5ncy5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2Ygb2JqZWN0RW50cmllcyh0aGlzLnNldHRpbmdzLnJlc2V0LnNwYWNlLmJ1aWxkaW5ncykpIHtcbiAgICAgIGlmICghZW50cnkuZW5hYmxlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHRyaWdnZXIgZm9yIGFuIGl0ZW0gaXMgc2V0IHRvIGluZmluaXR5LCBpdCBiYXNpY2FsbHkgZGlzYWJsZXMgdGhlIGVudGlyZSBmZWF0dXJlLlxuICAgICAgaWYgKGVudHJ5LnRyaWdnZXIgPCAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmxkID0gdGhpcy5faG9zdC5nYW1lLnNwYWNlLmdldEJ1aWxkaW5nKG5hbWUpO1xuICAgICAgY2hlY2tlZExpc3QucHVzaCh7IG5hbWU6IGJsZC5sYWJlbCwgdHJpZ2dlcjogZW50cnkudHJpZ2dlciwgdmFsOiBibGQudmFsIH0pO1xuICAgICAgaWYgKDAgPCBlbnRyeS50cmlnZ2VyKSB7XG4gICAgICAgIGlmIChibGQudmFsIDwgZW50cnkudHJpZ2dlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tMaXN0LnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHBhbmVscyA9IG11c3RFeGlzdCh0aGlzLl9zcGFjZU1hbmFnZXIubWFuYWdlci50YWIucGxhbmV0UGFuZWxzKTtcbiAgICAgIGZvciAoY29uc3QgcGFuZWwgb2YgcGFuZWxzKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFuZWxCdXR0b24gb2YgcGFuZWwuY2hpbGRyZW4pIHtcbiAgICAgICAgICBjb25zdCBtb2RlbCA9IG11c3RFeGlzdChwYW5lbEJ1dHRvbi5tb2RlbCk7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IG1vZGVsLm1ldGFkYXRhLm5hbWU7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBjaGVja0xpc3QuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBjaGVja0xpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5oYXNSZXMobXVzdEV4aXN0KG1vZGVsLnByaWNlcykpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hlY2tMaXN0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIHJlbGlnaW9uXG4gICAgZm9yIChjb25zdCBbbmFtZSwgZW50cnldIG9mIG9iamVjdEVudHJpZXModGhpcy5zZXR0aW5ncy5yZXNldC5yZWxpZ2lvbi5idWlsZGluZ3MpKSB7XG4gICAgICBpZiAoIWVudHJ5LmVuYWJsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB0cmlnZ2VyIGZvciBhbiBpdGVtIGlzIHNldCB0byBpbmZpbml0eSwgaXQgYmFzaWNhbGx5IGRpc2FibGVzIHRoZSBlbnRpcmUgZmVhdHVyZS5cbiAgICAgIGlmIChlbnRyeS50cmlnZ2VyIDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsZCA9IG11c3RFeGlzdCh0aGlzLl9yZWxpZ2lvbk1hbmFnZXIuZ2V0QnVpbGQobmFtZSwgZW50cnkudmFyaWFudCkpO1xuICAgICAgY2hlY2tlZExpc3QucHVzaCh7IG5hbWU6IGJsZC5sYWJlbCwgdHJpZ2dlcjogZW50cnkudHJpZ2dlciwgdmFsOiBibGQudmFsIH0pO1xuICAgICAgaWYgKDAgPCBlbnRyeS50cmlnZ2VyKSB7XG4gICAgICAgIGlmIChibGQudmFsIDwgZW50cnkudHJpZ2dlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tMaXN0LnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUaGUgYGNoZWNrKClgIGNhbGxzIGFyZSB1bnNhZmUgYW5kIG5lZWQgdG8gYmUgcmV3cml0dGVuLlxuICAgICAgY2hlY2sodGhpcy5fcmVsaWdpb25NYW5hZ2VyLm1hbmFnZXIudGFiLnpnVXBncmFkZUJ1dHRvbnMpIHx8XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRoZSBgY2hlY2soKWAgY2FsbHMgYXJlIHVuc2FmZSBhbmQgbmVlZCB0byBiZSByZXdyaXR0ZW4uXG4gICAgICBjaGVjayh0aGlzLl9yZWxpZ2lvbk1hbmFnZXIubWFuYWdlci50YWIuclVwZ3JhZGVCdXR0b25zKSB8fFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUaGUgYGNoZWNrKClgIGNhbGxzIGFyZSB1bnNhZmUgYW5kIG5lZWQgdG8gYmUgcmV3cml0dGVuLlxuICAgICAgY2hlY2sodGhpcy5fcmVsaWdpb25NYW5hZ2VyLm1hbmFnZXIudGFiLmN0UGFuZWwuY2hpbGRyZW5bMF0uY2hpbGRyZW4pIHx8XG4gICAgICBjaGVja0xpc3QubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgdGltZVxuICAgIGZvciAoY29uc3QgW25hbWUsIGVudHJ5XSBvZiBvYmplY3RFbnRyaWVzKHRoaXMuc2V0dGluZ3MucmVzZXQudGltZS5idWlsZGluZ3MpKSB7XG4gICAgICBpZiAoIWVudHJ5LmVuYWJsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB0cmlnZ2VyIGZvciBhbiBpdGVtIGlzIHNldCB0byBpbmZpbml0eSwgaXQgYmFzaWNhbGx5IGRpc2FibGVzIHRoZSBlbnRpcmUgZmVhdHVyZS5cbiAgICAgIGlmIChlbnRyeS50cmlnZ2VyIDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsZCA9IG11c3RFeGlzdCh0aGlzLmdldEJ1aWxkKG5hbWUsIGVudHJ5LnZhcmlhbnQpKTtcbiAgICAgIGNoZWNrZWRMaXN0LnB1c2goeyBuYW1lOiBibGQubGFiZWwsIHRyaWdnZXI6IGVudHJ5LnRyaWdnZXIsIHZhbDogYmxkLnZhbCB9KTtcbiAgICAgIGlmICgwIDwgZW50cnkudHJpZ2dlcikge1xuICAgICAgICBpZiAoYmxkLnZhbCA8IGVudHJ5LnRyaWdnZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrTGlzdC5wdXNoKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGhlIGBjaGVjaygpYCBjYWxscyBhcmUgdW5zYWZlIGFuZCBuZWVkIHRvIGJlIHJld3JpdHRlbi5cbiAgICAgIGNoZWNrKHRoaXMubWFuYWdlci50YWIuY2ZQYW5lbC5jaGlsZHJlblswXS5jaGlsZHJlbikgfHxcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGhlIGBjaGVjaygpYCBjYWxscyBhcmUgdW5zYWZlIGFuZCBuZWVkIHRvIGJlIHJld3JpdHRlbi5cbiAgICAgIGNoZWNrKHRoaXMubWFuYWdlci50YWIudnNQYW5lbC5jaGlsZHJlblswXS5jaGlsZHJlbikgfHxcbiAgICAgIGNoZWNrTGlzdC5sZW5ndGhcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjaGVjayByZXNvdXJjZXNcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2Ygb2JqZWN0RW50cmllcyh0aGlzLnNldHRpbmdzLnJlc2V0LnJlc291cmNlcy5yZXNvdXJjZXMpKSB7XG4gICAgICBpZiAoIWVudHJ5LmVuYWJsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB0cmlnZ2VyIGZvciBhbiBpdGVtIGlzIHNldCB0byBpbmZpbml0eSwgaXQgYmFzaWNhbGx5IGRpc2FibGVzIHRoZSBlbnRpcmUgZmVhdHVyZS5cbiAgICAgIGlmIChlbnRyeS50cmlnZ2VyIDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcyA9IG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQobmFtZSkpO1xuICAgICAgY2hlY2tlZExpc3QucHVzaCh7XG4gICAgICAgIG5hbWU6IHRoaXMuX2hvc3QuZW5naW5lLmkxOG4oYCRyZXNvdXJjZXMuJHtlbnRyeS5yZXNvdXJjZX0udGl0bGVgKSxcbiAgICAgICAgdHJpZ2dlcjogZW50cnkudHJpZ2dlcixcbiAgICAgICAgdmFsOiByZXMudmFsdWUsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMudmFsdWUgPCBlbnRyeS50cmlnZ2VyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBXb3Jrc2hvcCB1cGdyYWRlc1xuICAgIGZvciAoY29uc3QgWywgZW50cnldIG9mIG9iamVjdEVudHJpZXModGhpcy5zZXR0aW5ncy5yZXNldC51cGdyYWRlcy51cGdyYWRlcykpIHtcbiAgICAgIGlmIChlbnRyeS5lbmFibGVkKSB7XG4gICAgICAgIGNvbnN0IHVwZ3JhZGUgPSBtdXN0RXhpc3QoXG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLndvcmtzaG9wLnVwZ3JhZGVzLmZpbmQoc3ViamVjdCA9PiBzdWJqZWN0Lm5hbWUgPT09IGVudHJ5LnVwZ3JhZGUpLFxuICAgICAgICApO1xuICAgICAgICBjaGVja2VkTGlzdC5wdXNoKHsgbmFtZTogdXBncmFkZS5sYWJlbCwgdHJpZ2dlcjogMSwgdmFsOiB1cGdyYWRlLnJlc2VhcmNoZWQgPyAxIDogMCB9KTtcbiAgICAgICAgaWYgKCF1cGdyYWRlLnJlc2VhcmNoZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBoYXZlIG5vdyBkZXRlcm1pbmVkIHRoYXQgd2UgZWl0aGVyIGhhdmUgYWxsIGl0ZW1zIG9yIGNvdWxkIGJ1eSBhbGwgaXRlbXMuXG5cbiAgICAvLyBzdG9wIVxuICAgIGVuZ2luZS5zdG9wKGZhbHNlKTtcblxuICAgIGNvbnN0IHNsZWVwID0gYXN5bmMgKHRpbWUgPSAxNTAwKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX2hvc3QuZW5naW5lLnNldHRpbmdzLmVuYWJsZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiY2FuY2VsZWQgYnkgcGxheWVyXCIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCB0aW1lKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBjaGVja2VkIG9mIGNoZWNrZWRMaXN0KSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKDUwMCk7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY2hlY2tcIiwgW1xuICAgICAgICAgIGNoZWNrZWQubmFtZSxcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RGlzcGxheVZhbHVlRXh0KGNoZWNrZWQudHJpZ2dlciksXG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dChjaGVja2VkLnZhbCksXG4gICAgICAgIF0pO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY2hlY2tlZFwiKTtcbiAgICAgIGF3YWl0IHNsZWVwKCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJyZXNldC50aXBcIik7XG4gICAgICBhd2FpdCBzbGVlcCgpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJyZXNldC5jb3VudGRvd24uMTBcIik7XG4gICAgICBhd2FpdCBzbGVlcCgyMDAwKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY291bnRkb3duLjlcIik7XG4gICAgICBhd2FpdCBzbGVlcCgpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJyZXNldC5jb3VudGRvd24uOFwiKTtcbiAgICAgIGF3YWl0IHNsZWVwKCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pbWVzc2FnZShcInJlc2V0LmNvdW50ZG93bi43XCIpO1xuICAgICAgYXdhaXQgc2xlZXAoKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY291bnRkb3duLjZcIik7XG4gICAgICBhd2FpdCBzbGVlcCgpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJyZXNldC5jb3VudGRvd24uNVwiKTtcbiAgICAgIGF3YWl0IHNsZWVwKCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pbWVzc2FnZShcInJlc2V0LmNvdW50ZG93bi40XCIpO1xuICAgICAgYXdhaXQgc2xlZXAoKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY291bnRkb3duLjNcIik7XG4gICAgICBhd2FpdCBzbGVlcCgpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJyZXNldC5jb3VudGRvd24uMlwiKTtcbiAgICAgIGF3YWl0IHNsZWVwKCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pbWVzc2FnZShcInJlc2V0LmNvdW50ZG93bi4xXCIpO1xuICAgICAgYXdhaXQgc2xlZXAoKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY291bnRkb3duLjBcIik7XG4gICAgICBhd2FpdCBzbGVlcCgpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwicmVzZXQubGFzdC5tZXNzYWdlXCIpO1xuICAgICAgYXdhaXQgc2xlZXAoKTtcbiAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY2FuY2VsLm1lc3NhZ2VcIik7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJyZXNldC5jYW5jZWwuYWN0aXZpdHlcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgZm9yIChcbiAgICAgIGxldCBjaGFsbGVuZ2VJbmRleCA9IDA7XG4gICAgICBjaGFsbGVuZ2VJbmRleCA8IHRoaXMuX2hvc3QuZ2FtZS5jaGFsbGVuZ2VzLmNoYWxsZW5nZXMubGVuZ3RoO1xuICAgICAgY2hhbGxlbmdlSW5kZXgrK1xuICAgICkge1xuICAgICAgdGhpcy5faG9zdC5nYW1lLmNoYWxsZW5nZXMuY2hhbGxlbmdlc1tjaGFsbGVuZ2VJbmRleF0ucGVuZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9ob3N0LmdhbWUucmVzZXRBdXRvbWF0aWMoKTtcbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgfVxuXG4gIGFjY2VsZXJhdGVUaW1lKCkge1xuICAgIGNvbnN0IHRlbXBvcmFsRmx1eEF2YWlsYWJsZSA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcInRlbXBvcmFsRmx1eFwiKTtcblxuICAgIC8vIElmIHRoZXJlJ3Mgbm8gYXZhaWxhYmxlIGZsdXggKHdlIHdlbnQgYmVsb3cgdGhlIGxpbWl0KVxuICAgIGlmICh0ZW1wb3JhbEZsdXhBdmFpbGFibGUgPD0gMCkge1xuICAgICAgaWYgKHRoaXMuX2hvc3QuZ2FtZS50aW1lLmlzQWNjZWxlcmF0ZWQpIHtcbiAgICAgICAgLy8gU3RvcCB0aGUgYWNjZWxlcmF0aW9uXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS50aW1lLmlzQWNjZWxlcmF0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLnRpbWUuaXNBY2NlbGVyYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBvcmFsRmx1eCA9IHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmdldChcInRlbXBvcmFsRmx1eFwiKTtcblxuICAgIGlmICh0ZW1wb3JhbEZsdXgubWF4VmFsdWUgKiB0aGlzLnNldHRpbmdzLmFjY2VsZXJhdGVUaW1lLnRyaWdnZXIgPD0gdGVtcG9yYWxGbHV4LnZhbHVlKSB7XG4gICAgICB0aGlzLl9ob3N0LmdhbWUudGltZS5pc0FjY2VsZXJhdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5hY2NlbGVyYXRlXCIsIFtdLCBcImtzLWFjY2VsZXJhdGVcIik7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJhY2NlbGVyYXRlXCIsIDEpO1xuICAgIH1cbiAgfVxuXG4gIHRpbWVTa2lwKCkge1xuICAgIGlmICghdGhpcy5faG9zdC5nYW1lLndvcmtzaG9wLmdldChcImNocm9ub2ZvcmdlXCIpLnJlc2VhcmNoZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCB0aW1lIHNraXAgd2hpbGUgd2UncmUgaW4gYSB0ZW1wb3JhbCBwYXJhZG94LlxuICAgIGlmICh0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZGF5IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgbGVzcyB0aW1lIGNyeXN0YWxzIHRoYW4gb3VyIHJlcXVpcmVkIHRyaWdnZXIgdmFsdWUsIGJhaWwgb3V0LlxuICAgIGNvbnN0IHNoYXR0ZXJDb3N0SW5jcmVhc2VDaGFsbGVuZ2UgPSB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwic2hhdHRlckNvc3RJbmNyZWFzZUNoYWxsZW5nZVwiKTtcbiAgICBjb25zdCB0aW1lQ3J5c3RhbHNBdmFpbGFibGUgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUoXCJ0aW1lQ3J5c3RhbFwiKTtcbiAgICBpZiAoXG4gICAgICB0aW1lQ3J5c3RhbHNBdmFpbGFibGUgPCB0aGlzLnNldHRpbmdzLnRpbWVTa2lwLnRyaWdnZXIgfHxcbiAgICAgIHRpbWVDcnlzdGFsc0F2YWlsYWJsZSA8IDEgKyBzaGF0dGVyQ29zdEluY3JlYXNlQ2hhbGxlbmdlXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhdHRlclZvaWRDb3N0ID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInNoYXR0ZXJWb2lkQ29zdFwiKTtcbiAgICBjb25zdCB2b2lkQXZhaWxhYmxlID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKFwidm9pZFwiKTtcbiAgICBpZiAodm9pZEF2YWlsYWJsZSA8IHNoYXR0ZXJWb2lkQ29zdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHNraXBwaW5nIGR1cmluZyB0aGlzIHNlYXNvbiB3YXMgZGlzYWJsZWQsIGJhaWwgb3V0LlxuICAgIGNvbnN0IHNlYXNvbiA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5zZWFzb247XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLnRpbWVTa2lwLnNlYXNvbnNbdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLnNlYXNvbnNbc2Vhc29uXS5uYW1lXS5lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgc2tpcHBpbmcgZHVyaW5nIHRoaXMgY3ljbGUgd2FzIGRpc2FibGVkLCBiYWlsIG91dC5cbiAgICBjb25zdCBjdXJyZW50Q3ljbGUgPSB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuY3ljbGU7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLnRpbWVTa2lwLmN5Y2xlc1tDeWNsZXNbY3VycmVudEN5Y2xlXV0uZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgdG9vIG11Y2ggc3RvcmVkIGhlYXQsIHdhaXQgZm9yIGl0IHRvIGNvb2wgZG93bi5cbiAgICBjb25zdCBoZWF0TWF4ID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcImhlYXRNYXhcIik7XG4gICAgY29uc3QgaGVhdE5vdyA9IHRoaXMuX2hvc3QuZ2FtZS50aW1lLmhlYXQ7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLnRpbWVTa2lwLmlnbm9yZU92ZXJoZWF0LmVuYWJsZWQpIHtcbiAgICAgIGlmIChoZWF0TWF4IDw9IGhlYXROb3cpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZhY3RvciA9IHRoaXMuX2hvc3QuZ2FtZS5jaGFsbGVuZ2VzLmdldENoYWxsZW5nZShcIjEwMDBZZWFyc1wiKS5yZXNlYXJjaGVkID8gNSA6IDEwO1xuICAgIGxldCBtYXhTa2lwc0FjdGl2ZUhlYXRUcmFuc2ZlciA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAvLyBBY3RpdmUgSGVhdCBUcmFuc2ZlclxuICAgIGlmIChcbiAgICAgICF0aGlzLnNldHRpbmdzLnRpbWVTa2lwLmlnbm9yZU92ZXJoZWF0LmVuYWJsZWQgJiZcbiAgICAgIHRoaXMuc2V0dGluZ3MudGltZVNraXAuYWN0aXZlSGVhdFRyYW5zZmVyLmVuYWJsZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IGhlYXRQZXJUaWNrID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcImhlYXRQZXJUaWNrXCIpO1xuICAgICAgY29uc3QgdGlja3NQZXJTZWNvbmQgPSB0aGlzLl9ob3N0LmdhbWUudGlja3NQZXJTZWNvbmQ7XG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy50aW1lU2tpcC5hY3RpdmVIZWF0VHJhbnNmZXIuYWN0aXZlSGVhdFRyYW5zZmVyU3RhdHVzLmVuYWJsZWQpIHtcbiAgICAgICAgLy8gSGVhdCBUcmFuc2ZlciB0byBzcGVjaWZpZWQgdmFsdWVcbiAgICAgICAgaWYgKGhlYXROb3cgPD0gaGVhdE1heCAqIHRoaXMuc2V0dGluZ3MudGltZVNraXAuYWN0aXZlSGVhdFRyYW5zZmVyLnRyaWdnZXIpIHtcbiAgICAgICAgICB0aGlzLnNldHRpbmdzLnRpbWVTa2lwLmFjdGl2ZUhlYXRUcmFuc2Zlci5hY3RpdmVIZWF0VHJhbnNmZXJTdGF0dXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuX2hvc3QucmVmcmVzaEVudGlyZVVzZXJJbnRlcmZhY2UoKTtcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJhY3QudGltZS5hY3RpdmVIZWF0VHJhbnNmZXJFbmRcIiwgW10sIFwia3MtdGltZVNraXBcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2V0IHRlbXBvcmFsRmx1eFxuICAgICAgICAvLyBUT0RPOiBNb3JlIGp1ZGdtZW50KGUuZy4gZGV0ZXJtaW5pbmcgY3J5c3RhbCBjb3N0KT8gT3Igc2hvdWxkIHRoZSBwbGF5ZXJzIGRlY2lkZSBmb3IgdGhlbXNlbHZlcyhBZGQgb3B0aW9ucyk/XG4gICAgICAgIGNvbnN0IHRlbXBvcmFsRmx1eFByb2R1Y3Rpb24gPSB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwidGVtcG9yYWxGbHV4UHJvZHVjdGlvblwiKTtcbiAgICAgICAgY29uc3QgZGF5c1BlclllYXIgPVxuICAgICAgICAgICh0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZGF5c1BlclNlYXNvbiArXG4gICAgICAgICAgICAxMCArXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwidGVtcG9yYWxQYXJhZG94RGF5XCIpKSAqXG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLnNlYXNvbnNQZXJZZWFyO1xuICAgICAgICBjb25zdCB0aWNrc1BlckRheSA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci50aWNrc1BlckRheTtcbiAgICAgICAgY29uc3QgZGF5c1BlclRpY2tzID0gKDEgKyB0aGlzLl9ob3N0LmdhbWUudGltZUFjY2VsZXJhdGlvblJhdGlvKCkpIC8gdGlja3NQZXJEYXk7XG4gICAgICAgIGNvbnN0IHRpY2tzUGVyWWVhciA9IGRheXNQZXJZZWFyIC8gZGF5c1BlclRpY2tzO1xuICAgICAgICBjb25zdCB0ZW1wb3JhbEZsdXggPSB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJ0ZW1wb3JhbEZsdXhcIik7XG4gICAgICAgIGNvbnN0IGZsdXhFbmFibGVkID0gdGVtcG9yYWxGbHV4Lm1heFZhbHVlID4gdGlja3NQZXJZZWFyO1xuICAgICAgICBjb25zdCBmbHV4ID0gdGVtcG9yYWxGbHV4LnZhbHVlIDwgdGlja3NQZXJZZWFyO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXNlYXNvbiAmJlxuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5kYXkgPCAxMCAmJlxuICAgICAgICAgIHRlbXBvcmFsRmx1eFByb2R1Y3Rpb24gPiBmYWN0b3IgLyBoZWF0UGVyVGljayAmJlxuICAgICAgICAgIHRoaXMuc2V0dGluZ3MuYWNjZWxlcmF0ZVRpbWUuZW5hYmxlZCAmJlxuICAgICAgICAgIGZsdXhFbmFibGVkICYmXG4gICAgICAgICAgZmx1eFxuICAgICAgICApIHtcbiAgICAgICAgICBtYXhTa2lwc0FjdGl2ZUhlYXRUcmFuc2ZlciA9IE1hdGguY2VpbChcbiAgICAgICAgICAgICh0aWNrc1BlclllYXIgKyB0aWNrc1BlckRheSAqIDEwIC0gdGVtcG9yYWxGbHV4LnZhbHVlKSAvIHRlbXBvcmFsRmx1eFByb2R1Y3Rpb24sXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJhY3QudGltZS5nZXRUZW1wb3JhbEZsdXhcIiwgW10sIFwia3MtdGltZVNraXBcIik7XG4gICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFwidGltZS5nZXRUZW1wb3JhbEZsdXhcIiwgMSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXR0aW5ncy50aW1lU2tpcC5hY3RpdmVIZWF0VHJhbnNmZXIuY3ljbGVzW0N5Y2xlc1tjdXJyZW50Q3ljbGVdXS5lbmFibGVkKSB7XG4gICAgICAgICAgLy8gSGVhdCBUcmFuc2ZlciBkdXJpbmcgc2VsZWN0ZWQgY3ljbGVzXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1heFNraXBzQWN0aXZlSGVhdFRyYW5zZmVyID1cbiAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci55ZWFyc1BlckN5Y2xlIC0gdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLmN5Y2xlWWVhcjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChoZWF0Tm93ID49IGhlYXRNYXggLSBoZWF0UGVyVGljayAqIHRpY2tzUGVyU2Vjb25kICogMTApIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncy50aW1lU2tpcC5hY3RpdmVIZWF0VHJhbnNmZXIuYWN0aXZlSGVhdFRyYW5zZmVyU3RhdHVzLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9ob3N0LnJlZnJlc2hFbnRpcmVVc2VySW50ZXJmYWNlKCk7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC50aW1lLmFjdGl2ZUhlYXRUcmFuc2ZlclN0YXJ0XCIsIFtdLCBcImtzLXRpbWVTa2lwXCIpO1xuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJ0aW1lLmFjdGl2ZUhlYXRUcmFuc2ZlclN0YXJ0XCIsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBtYXhpbXVtIHllYXJzIHRvIHNraXAsIGJhc2VkIG9uIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24uXG4gICAgY29uc3QgbWF4U2tpcHMgPSBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodGhpcy5zZXR0aW5ncy50aW1lU2tpcC5tYXgpO1xuXG4gICAgLy8gVGhlIGFtb3VudCBvZiBza2lwcyB3ZSBjYW4gcGVyZm9ybS5cbiAgICBsZXQgY2FuU2tpcCA9IE1hdGguZmxvb3IoXG4gICAgICBNYXRoLm1pbihcbiAgICAgICAgdGhpcy5zZXR0aW5ncy50aW1lU2tpcC5pZ25vcmVPdmVyaGVhdC5lbmFibGVkXG4gICAgICAgICAgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICA6IChoZWF0TWF4IC0gaGVhdE5vdykgLyBmYWN0b3IsXG4gICAgICAgIG1heFNraXBzLFxuICAgICAgICBtYXhTa2lwc0FjdGl2ZUhlYXRUcmFuc2ZlcixcbiAgICAgICAgdGltZUNyeXN0YWxzQXZhaWxhYmxlIC8gKDEgKyBzaGF0dGVyQ29zdEluY3JlYXNlQ2hhbGxlbmdlKSxcbiAgICAgICAgMCA8IHNoYXR0ZXJWb2lkQ29zdCA/IHZvaWRBdmFpbGFibGUgLyBzaGF0dGVyVm9pZENvc3QgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgICApLFxuICAgICk7XG5cbiAgICAvLyBUaGUgYW1vdW50IG9mIHNraXBzIHRvIHBlcmZvcm0uXG4gICAgbGV0IHdpbGxTa2lwID0gMDtcblxuICAgIGNvbnN0IHllYXJzUGVyQ3ljbGUgPSB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIueWVhcnNQZXJDeWNsZTtcbiAgICBjb25zdCByZW1haW5pbmdZZWFyc0N1cnJlbnRDeWNsZSA9IHllYXJzUGVyQ3ljbGUgLSB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuY3ljbGVZZWFyO1xuICAgIGNvbnN0IGN5Y2xlc1BlckVyYSA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5jeWNsZXNQZXJFcmE7XG4gICAgLy8gSWYgdGhlIGN5Y2xlIGhhcyBtb3JlIHllYXJzIHJlbWFpbmluZyB0aGFuIHdlIGNhbiBldmVuIHNraXAsIHNraXAgYWxsIG9mIHRoZW0uXG4gICAgLy8gSSBndWVzcyB0aGUgaWRlYSBoZXJlIGlzIHRvIG5vdCBza2lwIHRocm91Z2ggeWVhcnMgb2YgYW5vdGhlciBjeWNsZSwgaWYgdGhhdFxuICAgIC8vIGN5Y2xlIG1heSBub3QgYmUgZW5hYmxlZCBmb3Igc2tpcHBpbmcuXG4gICAgaWYgKGNhblNraXAgPCByZW1haW5pbmdZZWFyc0N1cnJlbnRDeWNsZSkge1xuICAgICAgd2lsbFNraXAgPSBjYW5Ta2lwO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aWxsU2tpcCArPSByZW1haW5pbmdZZWFyc0N1cnJlbnRDeWNsZTtcbiAgICAgIGNhblNraXAgLT0gcmVtYWluaW5nWWVhcnNDdXJyZW50Q3ljbGU7XG4gICAgICBsZXQgc2tpcEN5Y2xlcyA9IDE7XG4gICAgICB3aGlsZSAoXG4gICAgICAgIHllYXJzUGVyQ3ljbGUgPCBjYW5Ta2lwICYmXG4gICAgICAgIHRoaXMuc2V0dGluZ3MudGltZVNraXAuY3ljbGVzW1xuICAgICAgICAgIEN5Y2xlc1soKGN1cnJlbnRDeWNsZSArIHNraXBDeWNsZXMpICUgY3ljbGVzUGVyRXJhKSBhcyBDeWNsZUluZGljZXNdXG4gICAgICAgIF0uZW5hYmxlZFxuICAgICAgKSB7XG4gICAgICAgIHdpbGxTa2lwICs9IHllYXJzUGVyQ3ljbGU7XG4gICAgICAgIGNhblNraXAgLT0geWVhcnNQZXJDeWNsZTtcbiAgICAgICAgc2tpcEN5Y2xlcyArPSAxO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnNldHRpbmdzLnRpbWVTa2lwLmN5Y2xlc1tcbiAgICAgICAgICBDeWNsZXNbKChjdXJyZW50Q3ljbGUgKyBza2lwQ3ljbGVzKSAlIGN5Y2xlc1BlckVyYSkgYXMgQ3ljbGVJbmRpY2VzXVxuICAgICAgICBdLmVuYWJsZWQgJiZcbiAgICAgICAgMCA8IGNhblNraXBcbiAgICAgICkge1xuICAgICAgICB3aWxsU2tpcCArPSBjYW5Ta2lwO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB3ZSBmb3VuZCB3ZSBjYW4gc2tpcCBhbnkgeWVhcnMsIGRvIHNvIG5vdy5cbiAgICBpZiAoMCA8IHdpbGxTa2lwKSB7XG4gICAgICBjb25zdCBzaGF0dGVyID0gdGhpcy5faG9zdC5nYW1lLnRpbWVUYWIuY2ZQYW5lbC5jaGlsZHJlblswXS5jaGlsZHJlblswXSBhcyBTaGF0dGVyVENCdG47IC8vIGNoZWNrP1xuICAgICAgaWYgKGlzTmlsKHNoYXR0ZXIubW9kZWwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC50aW1lLnNraXBcIiwgW3dpbGxTa2lwXSwgXCJrcy10aW1lU2tpcFwiKTtcbiAgICAgIChzaGF0dGVyLmNvbnRyb2xsZXIgYXMgU2hhdHRlclRDQnRuQ29udHJvbGxlcikuZG9TaGF0dGVyQW10KHNoYXR0ZXIubW9kZWwsIHdpbGxTa2lwKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShcInRpbWUuc2tpcFwiLCB3aWxsU2tpcCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QnVpbGQobmFtZTogQ2hyb25vRm9yZ2VVcGdyYWRlIHwgVm9pZFNwYWNlVXBncmFkZSwgdmFyaWFudDogVGltZUl0ZW1WYXJpYW50KSB7XG4gICAgaWYgKHZhcmlhbnQgPT09IFRpbWVJdGVtVmFyaWFudC5DaHJvbm9mb3JnZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hvc3QuZ2FtZS50aW1lLmdldENGVShuYW1lIGFzIENocm9ub0ZvcmdlVXBncmFkZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ob3N0LmdhbWUudGltZS5nZXRWU1UobmFtZSBhcyBWb2lkU3BhY2VVcGdyYWRlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIG11c3RFeGlzdCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgRnJhbWVDb250ZXh0IH0gZnJvbSBcIi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgeyBCdWxrUHVyY2hhc2VIZWxwZXIgfSBmcm9tIFwiLi9oZWxwZXIvQnVsa1B1cmNoYXNlSGVscGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtpdHRlblNjaWVudGlzdHMgfSBmcm9tIFwiLi9LaXR0ZW5TY2llbnRpc3RzLmpzXCI7XG5pbXBvcnQgeyB0eXBlIFRpbWVJdGVtLCBUaW1lU2V0dGluZ3MsIHR5cGUgVGltZVNldHRpbmdzSXRlbSB9IGZyb20gXCIuL3NldHRpbmdzL1RpbWVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVGFiTWFuYWdlciB9IGZyb20gXCIuL1RhYk1hbmFnZXIuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJ1aWxkaW5nU3RhY2thYmxlQnRuLCBCdXR0b25Nb2Rlcm4gfSBmcm9tIFwiLi90eXBlcy9jb3JlLmpzXCI7XG5pbXBvcnQgeyB0eXBlIENocm9ub0ZvcmdlVXBncmFkZSwgVGltZUl0ZW1WYXJpYW50LCB0eXBlIFZvaWRTcGFjZVVwZ3JhZGUgfSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBDaHJvbm9mb3JnZUJ0bkNvbnRyb2xsZXIsXG4gIFRpbWVUYWIsXG4gIFVuc2FmZUNocm9ub0ZvcmdlVXBncmFkZSxcbiAgVW5zYWZlQ2hyb25vZm9yZ2VVcGdyYWRlQnV0dG9uT3B0aW9ucyxcbiAgVW5zYWZlRml4Q3J5b2NoYW1iZXJCdXR0b25PcHRpb25zLFxuICBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlLFxuICBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlQnV0dG9uT3B0aW9ucyxcbiAgVm9pZFNwYWNlQnRuQ29udHJvbGxlcixcbn0gZnJvbSBcIi4vdHlwZXMvdGltZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc2hvcE1hbmFnZXIgfSBmcm9tIFwiLi9Xb3Jrc2hvcE1hbmFnZXIuanNcIjtcblxuZXhwb3J0IGNsYXNzIFRpbWVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogS2l0dGVuU2NpZW50aXN0cztcbiAgcmVhZG9ubHkgc2V0dGluZ3M6IFRpbWVTZXR0aW5ncztcbiAgcmVhZG9ubHkgbWFuYWdlcjogVGFiTWFuYWdlcjxUaW1lVGFiPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYnVsa01hbmFnZXI6IEJ1bGtQdXJjaGFzZUhlbHBlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaG9zdDogS2l0dGVuU2NpZW50aXN0cyxcbiAgICB3b3Jrc2hvcE1hbmFnZXI6IFdvcmtzaG9wTWFuYWdlcixcbiAgICBzZXR0aW5ncyA9IG5ldyBUaW1lU2V0dGluZ3MoKSxcbiAgKSB7XG4gICAgdGhpcy5faG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMubWFuYWdlciA9IG5ldyBUYWJNYW5hZ2VyKHRoaXMuX2hvc3QsIFwiVGltZVwiKTtcbiAgICB0aGlzLl9idWxrTWFuYWdlciA9IG5ldyBCdWxrUHVyY2hhc2VIZWxwZXIodGhpcy5faG9zdCwgd29ya3Nob3BNYW5hZ2VyKTtcbiAgICB0aGlzLl93b3Jrc2hvcE1hbmFnZXIgPSB3b3Jrc2hvcE1hbmFnZXI7XG4gIH1cblxuICB0aWNrKGNvbnRleHQ6IEZyYW1lQ29udGV4dCkge1xuICAgIGlmICghdGhpcy5zZXR0aW5ncy5lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIHRoZSB0YWIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1dHRvbnMgYWN0dWFsbHkgZXhpc3QgaW4gdGhlIERPTS5cbiAgICAvLyBUT0RPOiBJcyB0aGlzIHJlYWxseSByZXF1aXJlZD9cbiAgICB0aGlzLm1hbmFnZXIucmVuZGVyKCk7XG5cbiAgICB0aGlzLmF1dG9CdWlsZChjb250ZXh0KTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLmZpeENyeW9jaGFtYmVycy5lbmFibGVkKSB7XG4gICAgICB0aGlzLmZpeENyeW9jaGFtYmVycygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gYnVpbGQgYXMgbWFueSBvZiB0aGUgcGFzc2VkIGJ1aWxkaW5ncyBhcyBwb3NzaWJsZS5cbiAgICogVXN1YWxseSwgdGhpcyBpcyBjYWxsZWQgYXQgZWFjaCBpdGVyYXRpb24gb2YgdGhlIGF1dG9tYXRpb24gZW5naW5lIHRvXG4gICAqIGhhbmRsZSB0aGUgYnVpbGRpbmcgb2YgaXRlbXMgb24gdGhlIFRpbWUgdGFiLlxuICAgKlxuICAgKiBAcGFyYW0gYnVpbGRzIFRoZSBidWlsZGluZ3MgdG8gYnVpbGQuXG4gICAqL1xuICBhdXRvQnVpbGQoXG4gICAgY29udGV4dDogRnJhbWVDb250ZXh0LFxuICAgIGJ1aWxkczogUGFydGlhbDxSZWNvcmQ8VGltZUl0ZW0sIFRpbWVTZXR0aW5nc0l0ZW0+PiA9IHRoaXMuc2V0dGluZ3MuYnVpbGRpbmdzLFxuICApIHtcbiAgICBjb25zdCBidWxrTWFuYWdlciA9IHRoaXMuX2J1bGtNYW5hZ2VyO1xuICAgIGNvbnN0IHNlY3Rpb25UcmlnZ2VyID0gdGhpcy5zZXR0aW5ncy50cmlnZ2VyO1xuXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1ldGFkYXRhIGZvciBhbGwgdGhlIHJlZmVyZW5jZWQgYnVpbGRpbmdzLlxuICAgIGNvbnN0IG1ldGFEYXRhOiBQYXJ0aWFsPFxuICAgICAgUmVjb3JkPFRpbWVJdGVtLCBSZXF1aXJlZDxVbnNhZmVDaHJvbm9Gb3JnZVVwZ3JhZGUgfCBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlPj5cbiAgICA+ID0ge307XG4gICAgZm9yIChjb25zdCBidWlsZCBvZiBPYmplY3QudmFsdWVzKGJ1aWxkcykpIHtcbiAgICAgIGNvbnN0IGJ1aWxkTWV0YSA9IHRoaXMuZ2V0QnVpbGQoYnVpbGQuYnVpbGRpbmcsIGJ1aWxkLnZhcmlhbnQpO1xuICAgICAgbWV0YURhdGFbYnVpbGQuYnVpbGRpbmddID0gbXVzdEV4aXN0KGJ1aWxkTWV0YSk7XG5cbiAgICAgIGNvbnN0IGJ1aWxkQnV0dG9uID1cbiAgICAgICAgYnVpbGQudmFyaWFudCA9PT0gVGltZUl0ZW1WYXJpYW50LkNocm9ub2ZvcmdlXG4gICAgICAgICAgPyB0aGlzLl9nZXRCdWlsZEJ1dHRvbkNGKGJ1aWxkLmJ1aWxkaW5nIGFzIENocm9ub0ZvcmdlVXBncmFkZSlcbiAgICAgICAgICA6IHRoaXMuX2dldEJ1aWxkQnV0dG9uVlMoYnVpbGQuYnVpbGRpbmcgYXMgVm9pZFNwYWNlVXBncmFkZSk7XG4gICAgICBpZiAoaXNOaWwoYnVpbGRCdXR0b24pKSB7XG4gICAgICAgIC8vIE5vdCBhdmFpbGFibGUgaW4gdGhpcyBidWlsZCBvZiBLRy5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBtb2RlbCA9IGJ1aWxkQnV0dG9uLm1vZGVsO1xuICAgICAgY29uc3QgcGFuZWwgPVxuICAgICAgICBidWlsZC52YXJpYW50ID09PSBUaW1lSXRlbVZhcmlhbnQuQ2hyb25vZm9yZ2VcbiAgICAgICAgICA/IHRoaXMubWFuYWdlci50YWIuY2ZQYW5lbFxuICAgICAgICAgIDogdGhpcy5tYW5hZ2VyLnRhYi52c1BhbmVsO1xuXG4gICAgICBjb25zdCBidWlsZGluZ01ldGFEYXRhID0gbXVzdEV4aXN0KG1ldGFEYXRhW2J1aWxkLmJ1aWxkaW5nXSk7XG4gICAgICBidWlsZGluZ01ldGFEYXRhLnRIaWRkZW4gPSAhbW9kZWw/LnZpc2libGUgfHwgIW1vZGVsLmVuYWJsZWQgfHwgIXBhbmVsLnZpc2libGU7XG4gICAgfVxuXG4gICAgLy8gTGV0IHRoZSBidWxrbWFuYWdlciBkZXRlcm1pbmUgdGhlIGJ1aWxkcyB3ZSBjYW4gbWFrZS5cbiAgICBjb25zdCBidWlsZExpc3QgPSBidWxrTWFuYWdlci5idWxrKGJ1aWxkcywgbWV0YURhdGEsIHNlY3Rpb25UcmlnZ2VyLCBcIlRpbWVcIik7XG5cbiAgICBmb3IgKGNvbnN0IGJ1aWxkIG9mIGJ1aWxkTGlzdCkge1xuICAgICAgaWYgKGJ1aWxkLmNvdW50ID4gMCkge1xuICAgICAgICB0aGlzLmJ1aWxkKFxuICAgICAgICAgIGJ1aWxkLmlkIGFzIENocm9ub0ZvcmdlVXBncmFkZSB8IFZvaWRTcGFjZVVwZ3JhZGUsXG4gICAgICAgICAgYnVpbGQudmFyaWFudCBhcyBUaW1lSXRlbVZhcmlhbnQsXG4gICAgICAgICAgYnVpbGQuY291bnQsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRleHQucmVxdWVzdEdhbWVVaVJlZnJlc2ggPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGJ1aWxkKFxuICAgIG5hbWU6IENocm9ub0ZvcmdlVXBncmFkZSB8IFZvaWRTcGFjZVVwZ3JhZGUsXG4gICAgdmFyaWFudDogVGltZUl0ZW1WYXJpYW50LFxuICAgIGFtb3VudDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBsZXQgYW1vdW50Q2FsY3VsYXRlZCA9IGFtb3VudDtcbiAgICBsZXQgbGFiZWw6IHN0cmluZztcbiAgICBjb25zdCBhbW91bnRUZW1wID0gYW1vdW50Q2FsY3VsYXRlZDtcbiAgICBpZiAodmFyaWFudCA9PT0gVGltZUl0ZW1WYXJpYW50LkNocm9ub2ZvcmdlKSB7XG4gICAgICBjb25zdCBpdGVtTWV0YVJhdyA9IGdhbWUuZ2V0VW5sb2NrQnlOYW1lKG5hbWUsIFwiY2hyb25vZm9yZ2VcIik7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IGNsYXNzZXMudWkudGltZS5DaHJvbm9mb3JnZUJ0bkNvbnRyb2xsZXIoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICAgICkgYXMgQ2hyb25vZm9yZ2VCdG5Db250cm9sbGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSBjb250cm9sbGVyLmZldGNoTW9kZWwoeyBjb250cm9sbGVyLCBpZDogaXRlbU1ldGFSYXcubmFtZSB9KTtcbiAgICAgIGFtb3VudENhbGN1bGF0ZWQgPSB0aGlzLl9idWxrTWFuYWdlci5jb25zdHJ1Y3QobW9kZWwsIGNvbnRyb2xsZXIsIGFtb3VudENhbGN1bGF0ZWQpO1xuICAgICAgbGFiZWwgPSBpdGVtTWV0YVJhdy5sYWJlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZShuYW1lLCBcInZvaWRTcGFjZVwiKTtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgY2xhc3Nlcy51aS50aW1lLlZvaWRTcGFjZUJ0bkNvbnRyb2xsZXIoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICAgICkgYXMgVm9pZFNwYWNlQnRuQ29udHJvbGxlcjtcbiAgICAgIGNvbnN0IG1vZGVsID0gY29udHJvbGxlci5mZXRjaE1vZGVsKHsgY29udHJvbGxlciwgaWQ6IGl0ZW1NZXRhUmF3Lm5hbWUgfSk7XG4gICAgICBhbW91bnRDYWxjdWxhdGVkID0gdGhpcy5fYnVsa01hbmFnZXIuY29uc3RydWN0KG1vZGVsLCBjb250cm9sbGVyLCBhbW91bnRDYWxjdWxhdGVkKTtcbiAgICAgIGxhYmVsID0gaXRlbU1ldGFSYXcubGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKGFtb3VudENhbGN1bGF0ZWQgIT09IGFtb3VudFRlbXApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgLi4uY2woYCR7bGFiZWx9IEFtb3VudCBvcmRlcmVkOiAke2Ftb3VudFRlbXB9IEFtb3VudCBDb25zdHJ1Y3RlZDogJHthbW91bnRDYWxjdWxhdGVkfWApLFxuICAgICAgKTtcbiAgICAgIC8vIEJhaWwgb3V0IHRvIG5vdCBmbG9vZCB0aGUgbG9nIHdpdGggZ2FyYmFnZS5cbiAgICAgIGlmIChhbW91bnRDYWxjdWxhdGVkID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KGxhYmVsLCBhbW91bnRDYWxjdWxhdGVkLCBcImJ1aWxkXCIpO1xuXG4gICAgaWYgKGFtb3VudENhbGN1bGF0ZWQgPT09IDEpIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5idWlsZFwiLCBbbGFiZWxdLCBcImtzLWJ1aWxkXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXG4gICAgICAgIFwiYWN0LmJ1aWxkc1wiLFxuICAgICAgICBbbGFiZWwsIHRoaXMuX2hvc3QucmVuZGVyQWJzb2x1dGUoYW1vdW50Q2FsY3VsYXRlZCldLFxuICAgICAgICBcImtzLWJ1aWxkXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGdldEJ1aWxkKG5hbWU6IENocm9ub0ZvcmdlVXBncmFkZSB8IFZvaWRTcGFjZVVwZ3JhZGUsIHZhcmlhbnQ6IFRpbWVJdGVtVmFyaWFudCkge1xuICAgIGlmICh2YXJpYW50ID09PSBUaW1lSXRlbVZhcmlhbnQuQ2hyb25vZm9yZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9ob3N0LmdhbWUudGltZS5nZXRDRlUobmFtZSBhcyBDaHJvbm9Gb3JnZVVwZ3JhZGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faG9zdC5nYW1lLnRpbWUuZ2V0VlNVKG5hbWUgYXMgVm9pZFNwYWNlVXBncmFkZSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRCdWlsZEJ1dHRvbkNGKG5hbWU6IENocm9ub0ZvcmdlVXBncmFkZSkge1xuICAgIHJldHVybiAodGhpcy5tYW5hZ2VyLnRhYi5jaGlsZHJlblsyXS5jaGlsZHJlblswXS5jaGlsZHJlbi5maW5kKGJ1dHRvbiA9PiBidXR0b24uaWQgPT09IG5hbWUpID8/XG4gICAgICBudWxsKSBhcyBCdWlsZGluZ1N0YWNrYWJsZUJ0bjxVbnNhZmVDaHJvbm9mb3JnZVVwZ3JhZGVCdXR0b25PcHRpb25zPjtcbiAgfVxuICBwcml2YXRlIF9nZXRCdWlsZEJ1dHRvblZTKG5hbWU6IFZvaWRTcGFjZVVwZ3JhZGUpIHtcbiAgICByZXR1cm4gKHRoaXMubWFuYWdlci50YWIuY2hpbGRyZW5bM10uY2hpbGRyZW5bMF0uY2hpbGRyZW4uZmluZChidXR0b24gPT4gYnV0dG9uLmlkID09PSBuYW1lKSA/P1xuICAgICAgbnVsbCkgYXMgQnVpbGRpbmdTdGFja2FibGVCdG48VW5zYWZlVm9pZFNwYWNlVXBncmFkZUJ1dHRvbk9wdGlvbnM+O1xuICB9XG5cbiAgZml4Q3J5b2NoYW1iZXJzKCkge1xuICAgIGlmICh0aGlzLl9ob3N0LmdhbWUudGltZS5nZXRWU1UoXCJ1c2VkQ3J5b2NoYW1iZXJzXCIpLnZhbCA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmljZXMgPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnRpbWUuZ2V0VlNVKFwidXNlZENyeW9jaGFtYmVyc1wiKS5maXhQcmljZXMpO1xuICAgIGZvciAoY29uc3QgcHJpY2Ugb2YgcHJpY2VzKSB7XG4gICAgICBjb25zdCBhdmFpbGFibGUgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUocHJpY2UubmFtZSk7XG4gICAgICBpZiAoYXZhaWxhYmxlIDwgcHJpY2UudmFsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBidG4gPSB0aGlzLm1hbmFnZXIudGFiLnZzUGFuZWwuY2hpbGRyZW5bMF1cbiAgICAgIC5jaGlsZHJlblswXSBhcyBCdXR0b25Nb2Rlcm48VW5zYWZlRml4Q3J5b2NoYW1iZXJCdXR0b25PcHRpb25zPjtcblxuICAgIGxldCBmaXhlZCA9IDA7XG4gICAgbGV0IGZpeEhhcHBlbmVkOiBib29sZWFuO1xuICAgIGRvIHtcbiAgICAgIGZpeEhhcHBlbmVkID0gZmFsc2U7XG4gICAgICBjb25zdCBidXlSZXN1bHQgPSBidG4uY29udHJvbGxlci5idXlJdGVtKG11c3RFeGlzdChidG4ubW9kZWwpLCBuZXcgTW91c2VFdmVudChcImNsaWNrXCIpKTtcbiAgICAgIGZpeEhhcHBlbmVkID0gYnV5UmVzdWx0Lml0ZW1Cb3VnaHQ7XG4gICAgICBmaXhlZCArPSBmaXhIYXBwZW5lZCA/IDEgOiAwO1xuICAgIH0gd2hpbGUgKGZpeEhhcHBlbmVkKTtcblxuICAgIGlmICgwIDwgZml4ZWQpIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5maXguY3J5XCIsIFt0aGlzLl9ob3N0LnJlbmRlckFic29sdXRlKGZpeGVkKV0sIFwia3MtZml4Q3J5XCIpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFwiZml4LmNyeVwiLCBmaXhlZCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSwgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgdHlwZSBBdXRvbWF0aW9uLCBFbmdpbmUsIHR5cGUgRnJhbWVDb250ZXh0IH0gZnJvbSBcIi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE1hdGVyaWFsc0NhY2hlIH0gZnJvbSBcIi4vaGVscGVyL01hdGVyaWFsc0NhY2hlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtpdHRlblNjaWVudGlzdHMgfSBmcm9tIFwiLi9LaXR0ZW5TY2llbnRpc3RzLmpzXCI7XG5pbXBvcnQgeyBUcmFkZVNldHRpbmdzLCB0eXBlIFRyYWRlU2V0dGluZ3NJdGVtIH0gZnJvbSBcIi4vc2V0dGluZ3MvVHJhZGVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVGFiTWFuYWdlciB9IGZyb20gXCIuL1RhYk1hbmFnZXIuanNcIjtcbmltcG9ydCB7IG9iamVjdEVudHJpZXMgfSBmcm9tIFwiLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgeyBuZWdhdGl2ZU9uZVRvSW5maW5pdHksIHVjZmlyc3QgfSBmcm9tIFwiLi90b29scy9Gb3JtYXQuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgdHlwZSB7IERpcGxvbWFjeSwgVW5zYWZlUmFjZSwgVW5zYWZlVHJhZGVTZWxsT2ZmZXIgfSBmcm9tIFwiLi90eXBlcy9kaXBsb21hY3kuanNcIjtcbmltcG9ydCB0eXBlIHsgUmFjZSwgUmVzb3VyY2UgfSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVbnNhZmVSZXNvdXJjZSB9IGZyb20gXCIuL3R5cGVzL3Jlc291cmNlcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc2hvcE1hbmFnZXIgfSBmcm9tIFwiLi9Xb3Jrc2hvcE1hbmFnZXIuanNcIjtcblxuZXhwb3J0IGNsYXNzIFRyYWRlTWFuYWdlciBpbXBsZW1lbnRzIEF1dG9tYXRpb24ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9ob3N0OiBLaXR0ZW5TY2llbnRpc3RzO1xuICByZWFkb25seSBzZXR0aW5nczogVHJhZGVTZXR0aW5ncztcbiAgcmVhZG9ubHkgbWFuYWdlcjogVGFiTWFuYWdlcjxEaXBsb21hY3k+O1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3Jrc2hvcE1hbmFnZXI6IFdvcmtzaG9wTWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0OiBLaXR0ZW5TY2llbnRpc3RzLFxuICAgIHdvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyLFxuICAgIHNldHRpbmdzID0gbmV3IFRyYWRlU2V0dGluZ3MoKSxcbiAgKSB7XG4gICAgdGhpcy5faG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMubWFuYWdlciA9IG5ldyBUYWJNYW5hZ2VyKHRoaXMuX2hvc3QsIFwiVHJhZGVcIik7XG4gICAgdGhpcy5fd29ya3Nob3BNYW5hZ2VyID0gd29ya3Nob3BNYW5hZ2VyO1xuICB9XG5cbiAgdGljayhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWFuYWdlci5yZW5kZXIoKTtcblxuICAgIHRoaXMuYXV0b1RyYWRlKCk7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy51bmxvY2tSYWNlcy5lbmFibGVkKSB7XG4gICAgICB0aGlzLmF1dG9VbmxvY2soY29udGV4dCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNldHRpbmdzLmJ1aWxkRW1iYXNzaWVzLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuYXV0b0J1aWxkRW1iYXNzaWVzKGNvbnRleHQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5mZWVkTGV2aWF0aGFucy5lbmFibGVkKSB7XG4gICAgICB0aGlzLmF1dG9GZWVkRWxkZXJzKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNldHRpbmdzLnRyYWRlQmxhY2tjb2luLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuYXV0b1RyYWRlQmxhY2tjb2luKCk7XG4gICAgfVxuICB9XG5cbiAgYXV0b1RyYWRlKGNhY2hlTWFuYWdlcj86IE1hdGVyaWFsc0NhY2hlKSB7XG4gICAgY29uc3QgY2F0cG93ZXIgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UoXCJtYW5wb3dlclwiKTtcbiAgICBjb25zdCBnb2xkID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKFwiZ29sZFwiKTtcbiAgICBjb25zdCBzZWN0aW9uVHJpZ2dlciA9IHRoaXMuc2V0dGluZ3MudHJpZ2dlcjtcblxuICAgIC8vIFRoZSByYWNlcyB3ZSBtaWdodCB3YW50IHRvIHRyYWRlIHdpdGggZHVyaW5nIHRoaXMgZnJhbWUuXG4gICAgY29uc3QgdHJhZGVzOiBBcnJheTxSYWNlPiA9IFtdO1xuXG4gICAgY29uc3Qgc2Vhc29uID0gdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLmdldEN1clNlYXNvbigpLm5hbWU7XG5cbiAgICAvLyBEZXRlcm1pbmUgaG93IG1hbnkgcmFjZXMgd2Ugd2lsbCB0cmFkZSB3aXRoIHRoaXMgY3ljbGUuXG4gICAgZm9yIChjb25zdCB0cmFkZSBvZiBPYmplY3QudmFsdWVzKHRoaXMuc2V0dGluZ3MucmFjZXMpKSB7XG4gICAgICBjb25zdCByYWNlID0gdGhpcy5nZXRSYWNlKHRyYWRlLnJhY2UpO1xuICAgICAgY29uc3QgdHJpZ2dlciA9IEVuZ2luZS5ldmFsdWF0ZVN1YlNlY3Rpb25UcmlnZ2VyKHNlY3Rpb25UcmlnZ2VyLCB0cmFkZS50cmlnZ2VyKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJhY2UgaXMgZW5hYmxlZCwgaW4gc2Vhc29uLCB1bmxvY2tlZCwgYW5kIHdlIGNhbiBhY3R1YWxseSBhZmZvcmQgaXQuXG4gICAgICBpZiAoXG4gICAgICAgIHRyaWdnZXIgPCAwIHx8XG4gICAgICAgICF0cmFkZS5lbmFibGVkIHx8XG4gICAgICAgICF0cmFkZS5zZWFzb25zW3NlYXNvbl0uZW5hYmxlZCB8fFxuICAgICAgICAhcmFjZS51bmxvY2tlZCB8fFxuICAgICAgICAhdGhpcy5zaW5nbGVUcmFkZVBvc3NpYmxlKHNlY3Rpb25UcmlnZ2VyLCBjYXRwb3dlciwgZ29sZCwgdHJhZGUpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGl0aW9uYWxseSwgd2Ugbm93IGNoZWNrIGlmIHRoZSB0cmFkZSBidXR0b24gaXMgZW5hYmxlZCwgd2hpY2gga2luZGEgbWFrZXMgYWxsIHByZXZpb3VzXG4gICAgICAvLyBjaGVja3MgbW9vdCwgYnV0IHdoYXRldmVyIDpEXG4gICAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldFRyYWRlQnV0dG9uKHJhY2UubmFtZSk7XG4gICAgICBpZiAoIWJ1dHRvbj8ubW9kZWw/LmVuYWJsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIERldGVybWluZSB3aGljaCByZXNvdXJjZSB0aGUgcmFjZSByZXF1aXJlcyBmb3IgdHJhZGluZywgaWYgYW55LlxuICAgICAgY29uc3QgcmVxdWlyZSA9IHRyYWRlLnJlcXVpcmUgPyB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UodHJhZGUucmVxdWlyZSkgOiBmYWxzZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyB0cmFkZSB3b3VsZCBiZSBwcm9maXRhYmxlLlxuICAgICAgY29uc3QgcHJvZml0YWJsZSA9IHRoaXMuZ2V0UHJvZml0YWJpbGl0eSh0cmFkZS5yYWNlKTtcbiAgICAgIC8vIElmIHRoZSB0cmFkZSBpcyBzZXQgdG8gYmUgbGltaXRlZCBhbmQgcHJvZml0YWJsZSwgbWFrZSB0aGlzIHRyYWRlLlxuICAgICAgaWYgKHRyYWRlLmxpbWl0ZWQgJiYgcHJvZml0YWJsZSkge1xuICAgICAgICB0cmFkZXMucHVzaCh0cmFkZS5yYWNlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIC8vIElmIHRoaXMgdHJhZGUgaXMgbm90IGxpbWl0ZWQsIGl0IG11c3QgZWl0aGVyIG5vdCByZXF1aXJlIGFueXRoaW5nLCBvclxuICAgICAgICAvLyB0aGUgcmVxdWlyZWQgcmVzb3VyY2UgbXVzdCBiZSBvdmVyIHRoZSB0cmlnZ2VyIHZhbHVlLlxuICAgICAgICAvLyBBZGRpdGlvbmFsbHksIGdvbGQgbXVzdCBhbHNvIGJlIG92ZXIgdGhlIHRyaWdnZXIgdmFsdWUuXG4gICAgICAgICFyZXF1aXJlIHx8XG4gICAgICAgIHRyaWdnZXIgPD0gcmVxdWlyZS52YWx1ZSAvIHJlcXVpcmUubWF4VmFsdWVcbiAgICAgICkge1xuICAgICAgICB0cmFkZXMucHVzaCh0cmFkZS5yYWNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBubyBwb3NzaWJsZSB0cmFkZXMgd2VyZSBmb3VuZCwgYmFpbCBvdXQuXG4gICAgaWYgKHRyYWRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaWd1cmUgb3V0IGhvdyBtdWNoIHdlIGNhbiBjdXJyZW50bHkgdHJhZGVcbiAgICBsZXQgbWF4VHJhZGVzID0gdGhpcy5nZXRMb3dlc3RUcmFkZUFtb3VudChudWxsLCB0cnVlLCBmYWxzZSk7XG5cbiAgICAvLyBJZiBubyB0cmFkZXMgYXJlIHBvc3NpYmxlLCBiYWlsIG91dC5cbiAgICBpZiAobWF4VHJhZGVzIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERpc3RyaWJ1dGUgbWF4IHRyYWRlcyB3aXRob3V0IHN0YXJ2aW5nIGFueSByYWNlLlxuXG4gICAgLy8gVGhpcyBhcnJheSBzaG91bGQgaG9sZCB0aGUgYW1vdW50IG9mIHRyYWRlcyBwb3NzaWJsZSB3aXRoIGVhY2ggcmFjZS5cbiAgICAvLyBUaGUgaW5kaWNlcyBiZXR3ZWVuIHRoaXMgYXJyYXkgYW5kIGB0cmFkZXNgIGFsaWduLlxuICAgIGNvbnN0IG1heEJ5UmFjZTogQXJyYXk8bnVtYmVyPiA9IFtdO1xuICAgIC8vIEZvciBhbGwgcmFjZXMgd2UgY29uc2lkZXIgdHJhZGluZyB3aXRoLCBwZXJmb3JtIGEgbW9yZSB0aG9yb3VnaCBjaGVja1xuICAgIC8vIGlmIHdlIGFjdHVhbGx5IGNhbiB0cmFkZSB3aXRoIHRoZW0gYW5kIGhvdyBtYW55IHRpbWVzIHdlIGNvdWxkIHRyYWRlXG4gICAgLy8gd2l0aCB0aGVtLlxuICAgIGZvciAobGV0IHRyYWRlSW5kZXggPSAwOyB0cmFkZUluZGV4IDwgdHJhZGVzLmxlbmd0aDsgdHJhZGVJbmRleCsrKSB7XG4gICAgICBjb25zdCByYWNlID0gdHJhZGVzW3RyYWRlSW5kZXhdO1xuICAgICAgY29uc3QgdHJhZGVTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MucmFjZXNbcmFjZV07XG5cbiAgICAgIC8vIERvZXMgdGhpcyB0cmFkZSByZXF1aXJlIGEgY2VydGFpbiByZXNvdXJjZT9cbiAgICAgIGNvbnN0IHJlcXVpcmUgPSAhdHJhZGVTZXR0aW5ncy5yZXF1aXJlXG4gICAgICAgID8gZmFsc2VcbiAgICAgICAgOiB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UodHJhZGVTZXR0aW5ncy5yZXF1aXJlKTtcblxuICAgICAgLy8gSGF2ZSB0aGUgdHJpZ2dlciBjb25kaXRpb25zIGZvciB0aGlzIHRyYWRlIGJlZW4gbWV0P1xuICAgICAgY29uc3QgdHJpZ2dlciA9IEVuZ2luZS5ldmFsdWF0ZVN1YlNlY3Rpb25UcmlnZ2VyKHNlY3Rpb25UcmlnZ2VyLCB0cmFkZVNldHRpbmdzLnRyaWdnZXIpO1xuICAgICAgY29uc3QgdHJpZ0NvbmRpdGlvbnMgPVxuICAgICAgICAoIXJlcXVpcmUgfHwgdHJpZ2dlciA8PSByZXF1aXJlLnZhbHVlIC8gcmVxdWlyZS5tYXhWYWx1ZSkgJiZcbiAgICAgICAgdHJpZ2dlciA8PSBnb2xkLnZhbHVlIC8gZ29sZC5tYXhWYWx1ZTtcblxuICAgICAgLy8gSG93IG1hbnkgdHJhZGVzIGNvdWxkIHdlIGRvP1xuICAgICAgY29uc3QgdHJhZGVQb3MgPSB0aGlzLmdldExvd2VzdFRyYWRlQW1vdW50KHJhY2UsIHRyYWRlU2V0dGluZ3MubGltaXRlZCwgdHJpZ0NvbmRpdGlvbnMpO1xuXG4gICAgICAvLyBJZiBubyB0cmFkZXMgYXJlIHBvc3NpYmxlLCByZW1vdmUgdGhlIHJhY2UuXG4gICAgICBpZiAodHJhZGVQb3MgPCAxKSB7XG4gICAgICAgIHRyYWRlcy5zcGxpY2UodHJhZGVJbmRleCwgMSk7XG4gICAgICAgIHRyYWRlSW5kZXgtLTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIG1heEJ5UmFjZS5wdXNoKHRyYWRlUG9zKTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyB0cmFkZXMgYXJlIGxlZnQgb3ZlciBhZnRlciB0aGlzIGNoZWNrLCBiYWlsIG91dC5cbiAgICBpZiAodHJhZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vdyBsZXQncyBkbyBzb21lIHRyYWRlcy5cblxuICAgIC8vIFRoaXMga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgdHJhZGVzIHdlJ3ZlIGRvbmUgd2l0aCBlYWNoIHJhY2UuXG4gICAgY29uc3QgdHJhZGVzRG9uZTogUGFydGlhbDxSZWNvcmQ8UmFjZSwgbnVtYmVyPj4gPSB7fTtcbiAgICAvLyBXaGlsZSB3ZSBoYXZlIHJhY2VzIGxlZnQgdG8gdHJhZGUgd2l0aCwgYW5kIGVub3VnaCByZXNvdXJjZXMgdG8gdHJhZGUgKHRoaXNcbiAgICAvLyBpcyBpbmRpY2F0ZWQgYnkgYG1heFRyYWRlc2ApLi4uXG4gICAgd2hpbGUgKDAgPCB0cmFkZXMubGVuZ3RoICYmIDEgPD0gbWF4VHJhZGVzKSB7XG4gICAgICAvLyBJZiB3ZSBjYW4gbWFrZSBmZXdlciB0cmFkZXMgdGhhbiB3ZSBoYXZlIHJlc291cmNlcyBhdmFpbGFibGUgZm9yLi4uXG4gICAgICBpZiAobWF4VHJhZGVzIDwgdHJhZGVzLmxlbmd0aCkge1xuICAgICAgICAvLyAuLi5maW5kIGEgcmFuZG9tIHJhY2UgdG8gdHJhZGUgd2l0aFxuICAgICAgICBjb25zdCByYW5kb21SYWNlSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0cmFkZXMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdHJhZGVJbmRleCA9IHRyYWRlc1tyYW5kb21SYWNlSW5kZXhdO1xuICAgICAgICAvLyBJbml0IHRoZSBjb3VudGVyIGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgaWYgKGlzTmlsKHRyYWRlc0RvbmVbdHJhZGVJbmRleF0pKSB7XG4gICAgICAgICAgdHJhZGVzRG9uZVt0cmFkZUluZGV4XSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdHJhZGVzRG9uZVt0cmFkZUluZGV4XSArPSAxO1xuICAgICAgICBtYXhUcmFkZXMgLT0gMTtcblxuICAgICAgICAvLyBBcyB3ZSBhcmUgY29uc3RyYWluZWQgb24gcmVzb3VyY2VzLCBkb24ndCB0cmFkZSB3aXRoIHRoaXMgcmFjZSBhZ2Fpbi5cbiAgICAgICAgLy8gV2Ugd2FudCB0byBkaXN0cmlidXRlIHRoZSBmZXcgcmVzb3VyY2VzIHdlIGhhdmUgYmV0d2VlbiByYWNlcy5cbiAgICAgICAgdHJhZGVzLnNwbGljZShyYW5kb21SYWNlSW5kZXgsIDEpO1xuICAgICAgICBtYXhCeVJhY2Uuc3BsaWNlKHJhbmRvbVJhY2VJbmRleCwgMSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBub3cgd2FudCB0byBkZXRlcm1pbmUgd2hpY2ggcmFjZSB3ZSBjYW4gdHJhZGUgd2l0aCB0aGUgbGVhc3QgYW1vdW50XG4gICAgICAvLyBvZiB0aW1lcy5cbiAgICAgIC8vIFRoaXMgbGlrZWx5IHRvIGRldGVybWluZSB0aGUgXCJiZXN0XCIgdHJhZGVzIHRvIHBlcmZvcm0uXG4gICAgICAvLyBUaGUgcmVzdWx0IGlzIHRoYXQgd2UgdHJhZGUgZmlyc3Qgd2l0aCB0aGUgcmFjZXMgdGhhdCB3ZSBjYW4gbWFrZSB0aGVcbiAgICAgIC8vIGxlYXN0IGFtb3VudCBvZiB0cmFkZXMgd2l0aCwgdGhlbiBjb250aW51ZSB0byBtYWtlIHRyYWRlcyB3aXRoIHRoZVxuICAgICAgLy8gcmFjZXMgd2UgY2FuIG1ha2UgbW9yZSB0cmFkZXMgd2l0aCAoYWx0aG91Z2ggdGhhdCBhbW91bnQgY291bGQgYmUgcmVkdWNlZFxuICAgICAgLy8gYnkgdGhlIHRpbWUgd2UgZ2V0IHRvIHRoZW0pLlxuICAgICAgbGV0IG1pblRyYWRlcyA9IE1hdGguZmxvb3IobWF4VHJhZGVzIC8gdHJhZGVzLmxlbmd0aCk7XG4gICAgICBsZXQgbWluVHJhZGVJbmRleCA9IDA7XG4gICAgICBjb25zdCB0cmFkZUluZGV4ID0gdHJhZGVzW21pblRyYWRlSW5kZXhdO1xuICAgICAgZm9yIChsZXQgdHJhZGVJbmRleCA9IDA7IHRyYWRlSW5kZXggPCB0cmFkZXMubGVuZ3RoOyArK3RyYWRlSW5kZXgpIHtcbiAgICAgICAgaWYgKG1heEJ5UmFjZVt0cmFkZUluZGV4XSA8IG1pblRyYWRlcykge1xuICAgICAgICAgIG1pblRyYWRlcyA9IG1heEJ5UmFjZVt0cmFkZUluZGV4XTtcbiAgICAgICAgICBtaW5UcmFkZUluZGV4ID0gdHJhZGVJbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB0aGlzIHRyYWRlIGluIHRoZSB0cmFkZXMgd2UndmUgXCJkb25lXCIuXG4gICAgICBpZiAoaXNOaWwodHJhZGVzRG9uZVt0cmFkZUluZGV4XSkpIHtcbiAgICAgICAgdHJhZGVzRG9uZVt0cmFkZUluZGV4XSA9IDA7XG4gICAgICB9XG4gICAgICB0cmFkZXNEb25lW3RyYWRlSW5kZXhdICs9IG1pblRyYWRlcztcbiAgICAgIG1heFRyYWRlcyAtPSBtaW5UcmFkZXM7XG4gICAgICB0cmFkZXMuc3BsaWNlKG1pblRyYWRlSW5kZXgsIDEpO1xuICAgICAgbWF4QnlSYWNlLnNwbGljZShtaW5UcmFkZUluZGV4LCAxKTtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBmb3VuZCBubyB0cmFkZXMgdG8gZG8sIGJhaWwgb3V0LlxuICAgIGlmIChPYmplY3QudmFsdWVzKHRyYWRlc0RvbmUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBob3cgbXVjaCB3ZSB3aWxsIHNwZW5kIGFuZCBlYXJuIGZyb20gdHJhZGVzLlxuICAgIC8vIFRoaXMgaXMgc3RyYWlnaHQgZm9yd2FyZC5cbiAgICBjb25zdCB0cmFkZU5ldDogUGFydGlhbDxSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4+ID0ge307XG4gICAgZm9yIChjb25zdCBbbmFtZSwgYW1vdW50XSBvZiBvYmplY3RFbnRyaWVzKHRyYWRlc0RvbmUpKSB7XG4gICAgICBjb25zdCByYWNlID0gdGhpcy5nZXRSYWNlKG5hbWUpO1xuXG4gICAgICBjb25zdCBtYXRlcmlhbHMgPSB0aGlzLmdldE1hdGVyaWFscyhuYW1lKTtcbiAgICAgIGZvciAoY29uc3QgW21hdCwgbWF0QW1vdW50XSBvZiBvYmplY3RFbnRyaWVzKG1hdGVyaWFscykpIHtcbiAgICAgICAgaWYgKCF0cmFkZU5ldFttYXRdKSB7XG4gICAgICAgICAgdHJhZGVOZXRbbWF0XSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdHJhZGVOZXRbbWF0XSAtPSBtYXRBbW91bnQgKiBhbW91bnQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lYW5PdXRwdXQgPSB0aGlzLmdldEF2ZXJhZ2VUcmFkZShyYWNlKTtcbiAgICAgIGZvciAoY29uc3QgW291dCwgb3V0VmFsdWVdIG9mIG9iamVjdEVudHJpZXMobWVhbk91dHB1dCkpIHtcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKG91dCk7XG4gICAgICAgIGlmICghdHJhZGVOZXRbb3V0XSkge1xuICAgICAgICAgIHRyYWRlTmV0W291dF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRyYWRlTmV0W291dF0gKz1cbiAgICAgICAgICByZXMubWF4VmFsdWUgPiAwXG4gICAgICAgICAgICA/IE1hdGgubWluKFxuICAgICAgICAgICAgICAgIG11c3RFeGlzdChtZWFuT3V0cHV0W291dF0pICogbXVzdEV4aXN0KHRyYWRlc0RvbmVbbmFtZV0pLFxuICAgICAgICAgICAgICAgIE1hdGgubWF4KHJlcy5tYXhWYWx1ZSAtIHJlcy52YWx1ZSwgMCksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogb3V0VmFsdWUgKiBtdXN0RXhpc3QodHJhZGVzRG9uZVtuYW1lXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBjYWNoZSB3aXRoIHRoZSBjaGFuZ2VzIHByb2R1Y2VkIGZyb20gdGhlIHRyYWRlcy5cbiAgICBpZiAoIWlzTmlsKGNhY2hlTWFuYWdlcikpIHtcbiAgICAgIGNhY2hlTWFuYWdlci5wdXNoVG9DYWNoZSh7XG4gICAgICAgIG1hdGVyaWFsczogdHJhZGVOZXQsXG4gICAgICAgIHRpbWVTdGFtcDogdGhpcy5faG9zdC5nYW1lLnRpbWVyLnRpY2tzVG90YWwsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBOb3cgYWN0dWFsbHkgcGVyZm9ybSB0aGUgY2FsY3VsYXRlZCB0cmFkZXMuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgY291bnRdIG9mIG9iamVjdEVudHJpZXModHJhZGVzRG9uZSkpIHtcbiAgICAgIC8vIFRPRE86IFRoaXMgY2hlY2sgc2hvdWxkIGJlIHJlZHVuZGFudC4gSWYgbm8gdHJhZGVzIHdlcmUgcG9zc2libGUsXG4gICAgICAvLyAgICAgICB0aGUgZW50cnkgc2hvdWxkbid0IGV2ZW4gZXhpc3QuXG4gICAgICBpZiAoMCA8IGNvdW50KSB7XG4gICAgICAgIHRoaXMudHJhZGUobmFtZSwgY291bnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGF1dG9CdWlsZEVtYmFzc2llcyhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kucmFjZXNbMF0uZW1iYXNzeVByaWNlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyaWVzIHRvIGNhbGN1bGF0ZSBob3cgbWFueSBlbWJhc3NpZXMgZm9yIHdoaWNoIHJhY2VzIGl0IGNhbiBidXksXG4gICAgLy8gdGhlbiBpdCBidXlzIHRoZW0uIENvZGUgc2hvdWxkIGJlIHN0cmFpZ2h0LWZvcndhcmQuXG5cbiAgICBjb25zdCBjdWx0dXJlID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKFwiY3VsdHVyZVwiKTtcbiAgICBsZXQgY3VsdHVyZVZhbCA9IDA7XG4gICAgY29uc3QgdHJpZ2dlciA9IHRoaXMuc2V0dGluZ3MuYnVpbGRFbWJhc3NpZXMudHJpZ2dlcjtcbiAgICBpZiAoY3VsdHVyZS52YWx1ZSAvIGN1bHR1cmUubWF4VmFsdWUgPCBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodHJpZ2dlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByYWNlUGFuZWxzID0gdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeVRhYi5yYWNlUGFuZWxzO1xuICAgIGN1bHR1cmVWYWwgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUoXCJjdWx0dXJlXCIpO1xuXG4gICAgY29uc3QgZW1iYXNzeUJ1bGs6IFBhcnRpYWw8XG4gICAgICBSZWNvcmQ8XG4gICAgICAgIFJhY2UsXG4gICAgICAgIHtcbiAgICAgICAgICB2YWw6IG51bWJlcjtcbiAgICAgICAgICBtYXg6IG51bWJlcjtcbiAgICAgICAgICBiYXNlUHJpY2U6IG51bWJlcjtcbiAgICAgICAgICBjdXJyZW50RW06IG51bWJlcjtcbiAgICAgICAgICBwcmljZVN1bTogbnVtYmVyO1xuICAgICAgICAgIHJhY2U6IFVuc2FmZVJhY2U7XG4gICAgICAgIH1cbiAgICAgID5cbiAgICA+ID0ge307XG4gICAgY29uc3QgYnVsa1RyYWNrZXI6IEFycmF5PFJhY2U+ID0gW107XG5cbiAgICBmb3IgKGxldCBwYW5lbEluZGV4ID0gMDsgcGFuZWxJbmRleCA8IHJhY2VQYW5lbHMubGVuZ3RoOyBwYW5lbEluZGV4KyspIHtcbiAgICAgIGlmICghcmFjZVBhbmVsc1twYW5lbEluZGV4XS5lbWJhc3N5QnV0dG9uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gcmFjZVBhbmVsc1twYW5lbEluZGV4XS5yYWNlLm5hbWU7XG4gICAgICBjb25zdCByYWNlID0gdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXQobmFtZSk7XG4gICAgICBjb25zdCBtYXggPSBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodGhpcy5zZXR0aW5ncy5idWlsZEVtYmFzc2llcy5yYWNlc1tuYW1lXS5tYXgpO1xuXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnNldHRpbmdzLmJ1aWxkRW1iYXNzaWVzLnJhY2VzW25hbWVdLmVuYWJsZWQgfHxcbiAgICAgICAgbWF4IDw9IHJhY2UuZW1iYXNzeUxldmVsIHx8XG4gICAgICAgICFyYWNlLnVubG9ja2VkXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGVtYmFzc3lCdWxrW25hbWVdID0ge1xuICAgICAgICBiYXNlUHJpY2U6IG11c3RFeGlzdChyYWNlLmVtYmFzc3lQcmljZXM/LlswXSkudmFsLFxuICAgICAgICBjdXJyZW50RW06IHJhY2UuZW1iYXNzeUxldmVsLFxuICAgICAgICBtYXgsXG4gICAgICAgIHByaWNlU3VtOiAwLFxuICAgICAgICByYWNlOiByYWNlLFxuICAgICAgICB2YWw6IDAsXG4gICAgICB9O1xuICAgICAgYnVsa1RyYWNrZXIucHVzaChuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoYnVsa1RyYWNrZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2hpbGUgKGJ1bGtUcmFja2VyLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAobGV0IHJhY2VJbmRleCA9IDA7IHJhY2VJbmRleCA8IGJ1bGtUcmFja2VyLmxlbmd0aDsgcmFjZUluZGV4KyspIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGJ1bGtUcmFja2VyW3JhY2VJbmRleF07XG4gICAgICAgIGNvbnN0IGVtQnVsayA9IG11c3RFeGlzdChlbWJhc3N5QnVsa1tuYW1lXSk7XG5cbiAgICAgICAgaWYgKGVtQnVsay5tYXggPD0gZW1CdWxrLmN1cnJlbnRFbSArIGVtQnVsay52YWwpIHtcbiAgICAgICAgICBidWxrVHJhY2tlci5zcGxpY2UocmFjZUluZGV4LCAxKTtcbiAgICAgICAgICAtLXJhY2VJbmRleDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5leHRQcmljZSA9IGVtQnVsay5iYXNlUHJpY2UgKiAxLjE1ICoqIChlbUJ1bGsuY3VycmVudEVtICsgZW1CdWxrLnZhbCk7XG4gICAgICAgIGlmIChuZXh0UHJpY2UgPD0gY3VsdHVyZVZhbCkge1xuICAgICAgICAgIGN1bHR1cmVWYWwgLT0gbmV4dFByaWNlO1xuICAgICAgICAgIGVtQnVsay5wcmljZVN1bSArPSBuZXh0UHJpY2U7XG4gICAgICAgICAgZW1CdWxrLnZhbCArPSAxO1xuICAgICAgICAgIGNvbnRleHQucmVxdWVzdEdhbWVVaVJlZnJlc2ggPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1bGtUcmFja2VyLnNwbGljZShyYWNlSW5kZXgsIDEpO1xuICAgICAgICAgIC0tcmFjZUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbLCBlbUJ1bGtdIG9mIG9iamVjdEVudHJpZXMoZW1iYXNzeUJ1bGspKSB7XG4gICAgICBpZiAoZW1CdWxrLnZhbCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGN1bHR1cmVWYWwgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUoXCJjdWx0dXJlXCIpO1xuICAgICAgaWYgKGN1bHR1cmVWYWwgPCBlbUJ1bGsucHJpY2VTdW0pIHtcbiAgICAgICAgY29uc29sZS53YXJuKC4uLmNsKFwiU29tZXRoaW5nIGhhcyBnb25lIGhvcnJpYmx5IHdyb25nLlwiLCBlbUJ1bGsucHJpY2VTdW0sIGN1bHR1cmVWYWwpKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gaW52b2tlIHRoZSBlbWJhc3N5IGJ1aWxkIGFjdGlvbiBtdWx0aXBsZSB0aW1lcywgYXNcbiAgICAgIC8vIHRoYXQgd291bGQgY2F1c2UgbG90cyBvZiBsb2cgbWVzc2FnZXMuXG4gICAgICAvLyBJbnN0ZWFkLCB3ZSByZXBsaWNhdGUgdGhlIGJlaGF2aW9yIG9mIHRoZSBnYW1lIGhlcmUgYW5kIHB1cmNoYXNlIGluIGJ1bGsuXG4gICAgICB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UoXCJjdWx0dXJlXCIpLnZhbHVlIC09IGVtQnVsay5wcmljZVN1bTtcbiAgICAgIGVtQnVsay5yYWNlLmVtYmFzc3lMZXZlbCArPSBlbUJ1bGsudmFsO1xuXG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJlbWJhc3N5XCIsIGVtQnVsay52YWwpO1xuICAgICAgaWYgKGVtQnVsay52YWwgIT09IDEpIHtcbiAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwiYnVpbGQuZW1iYXNzaWVzXCIsIFtlbUJ1bGsudmFsLCBlbUJ1bGsucmFjZS50aXRsZV0sIFwia3MtYnVpbGRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJidWlsZC5lbWJhc3N5XCIsIFtlbUJ1bGsudmFsLCBlbUJ1bGsucmFjZS50aXRsZV0sIFwia3MtYnVpbGRcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXV0b0ZlZWRFbGRlcnMoKSB7XG4gICAgY29uc3QgbGV2aWF0aGFuSW5mbyA9IHRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kuZ2V0KFwibGV2aWF0aGFuc1wiKTtcbiAgICBjb25zdCBuZWNyb2Nvcm5zID0gdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwibmVjcm9jb3JuXCIpO1xuXG4gICAgaWYgKCFsZXZpYXRoYW5JbmZvLnVubG9ja2VkIHx8IG5lY3JvY29ybnMudmFsdWUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoMSA8PSBuZWNyb2Nvcm5zLnZhbHVlKSB7XG4gICAgICAvLyBJZiBmZWVkaW5nIHRoZSBlbGRlcnMgd291bGQgaW5jcmVhc2UgdGhlaXIgZW5lcmd5IGxldmVsIHRvd2FyZHMgdGhlXG4gICAgICAvLyBjYXAsIGRvIGl0LlxuICAgICAgaWYgKGxldmlhdGhhbkluZm8uZW5lcmd5IDwgdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXRNYXJrZXJDYXAoKSkge1xuICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5LmZlZWRFbGRlcnMoKTtcbiAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwiYWN0LmZlZWRcIik7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShcImZlZWRcIiwgMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIGNhbiByZWFjaCB0aGlzIGJyYW5jaCBpZiB3ZSBoYXZlIHBhcnRpYWwgbmVjcm9jb3JucyBmcm9tIHJlc2V0cy5cbiAgICAgIC8vIFRoZSBwYXJ0aWFsIG5lY3JvY29ybnMgd2lsbCB0aGVuIGJlIGZlZWQgdG8gdGhlIGVsZGVycyB0byBicmluZyB1cyBiYWNrXG4gICAgICAvLyB0byBldmVuIHplcm8uXG4gICAgICBpZiAoMC4yNSAqICgxICsgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcImNvcnJ1cHRpb25Cb29zdFJhdGlvXCIpKSA8IDEpIHtcbiAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFwiZmVlZFwiLCBuZWNyb2Nvcm5zLnZhbHVlKTtcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5mZWVkRWxkZXJzKCk7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImRpc3Bvc2UubmVjcm9jb3JuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGF1dG9VbmxvY2soY29udGV4dDogRnJhbWVDb250ZXh0KSB7XG4gICAgaWYgKCF0aGlzLl9ob3N0LmdhbWUudGFic1s0XS52aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaG93IG1hbnkgcmFjZXMgd2UgY291bGQgcmVhc29uYWJseSB1bmxvY2sgYXQgdGhpcyBwb2ludC5cbiAgICBjb25zdCBtYXhSYWNlcyA9IHRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kuZ2V0KFwibGV2aWF0aGFuc1wiKS51bmxvY2tlZCA/IDggOiA3O1xuICAgIC8vIElmIHdlIGhhdmVuJ3QgdW5sb2NrZWQgdGhhdCBtYW55IHJhY2VzIHlldC4uLlxuICAgIGlmICh0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5VGFiLnJhY2VQYW5lbHMubGVuZ3RoIDwgbWF4UmFjZXMpIHtcbiAgICAgIC8vIEdldCB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBjYXRwb3dlci5cbiAgICAgIGxldCBtYW5wb3dlciA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcIm1hbnBvd2VyXCIpO1xuICAgICAgLy8gVE9ETzogVGhlc2Ugc2hvdWxkIGJlIGNoZWNrZWQgaW4gcmV2ZXJzZSBvcmRlci4gT3RoZXJ3aXNlIHRoZSBjaGVjayBmb3IgbGl6YXJkc1xuICAgICAgLy8gICAgICAgY2FuIGNhdXNlIHRoZSB6ZWJyYXMgdG8gYmUgZGlzY292ZXJlZCBhdCBsYXRlciBzdGFnZXMgaW4gdGhlIGdhbWUuIFRoZW4gaXRcbiAgICAgIC8vICAgICAgIGdldHMgdG8gdGhlIGNoZWNrIGZvciB0aGUgemVicmFzIGFuZCBkb2Vzbid0IGV4cGxvcmUgYWdhaW4sIGFzIHRoZXkncmVcbiAgICAgIC8vICAgICAgIGFscmVhZHkgdW5sb2NrZWQuIFRoZW4gaXQgdGFrZXMgYW5vdGhlciBpdGVyYXRpb24gdG8gdW5sb2NrIHRoZSBvdGhlciByYWNlLlxuICAgICAgLy8gU2VuZCBleHBsb3JlcnMgaWYgd2UgaGF2ZW4ndCBkaXNjb3ZlcmVkIHRoZSBsaXphcmRzIHlldC5cbiAgICAgIGlmICghdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXQoXCJsaXphcmRzXCIpLnVubG9ja2VkKSB7XG4gICAgICAgIGlmIChtYW5wb3dlciA+PSAxMDAwKSB7XG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwibWFucG93ZXJcIikudmFsdWUgLT0gMTAwMDtcbiAgICAgICAgICBjb25zdCB1bmxvY2tlZFJhY2UgPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS51bmxvY2tSYW5kb21SYWNlKCkpO1xuICAgICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcInVwZ3JhZGUucmFjZVwiLCBbdW5sb2NrZWRSYWNlLnRpdGxlXSwgXCJrcy11cGdyYWRlXCIpO1xuICAgICAgICAgIG1hbnBvd2VyIC09IDEwMDA7XG4gICAgICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRG8gZXhhY3RseSB0aGUgc2FtZSBmb3IgdGhlIHNoYXJrcy5cbiAgICAgIGlmICghdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXQoXCJzaGFya3NcIikudW5sb2NrZWQpIHtcbiAgICAgICAgaWYgKG1hbnBvd2VyID49IDEwMDApIHtcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJtYW5wb3dlclwiKS52YWx1ZSAtPSAxMDAwO1xuICAgICAgICAgIGNvbnN0IHVubG9ja2VkUmFjZSA9IG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5LnVubG9ja1JhbmRvbVJhY2UoKSk7XG4gICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwidXBncmFkZS5yYWNlXCIsIFt1bmxvY2tlZFJhY2UudGl0bGVdLCBcImtzLXVwZ3JhZGVcIik7XG4gICAgICAgICAgbWFucG93ZXIgLT0gMTAwMDtcbiAgICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEbyBleGFjdGx5IHRoZSBzYW1lIGZvciB0aGUgZ3JpZmZpbnMuXG4gICAgICBpZiAoIXRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kuZ2V0KFwiZ3JpZmZpbnNcIikudW5sb2NrZWQpIHtcbiAgICAgICAgaWYgKG1hbnBvd2VyID49IDEwMDApIHtcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJtYW5wb3dlclwiKS52YWx1ZSAtPSAxMDAwO1xuICAgICAgICAgIGNvbnN0IHVubG9ja2VkUmFjZSA9IG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5LnVubG9ja1JhbmRvbVJhY2UoKSk7XG4gICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwidXBncmFkZS5yYWNlXCIsIFt1bmxvY2tlZFJhY2UudGl0bGVdLCBcImtzLXVwZ3JhZGVcIik7XG4gICAgICAgICAgbWFucG93ZXIgLT0gMTAwMDtcbiAgICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGb3IgbmFnYXMsIHdlIGFkZGl0aW9uYWxseSBuZWVkIGVub3VnaCBjdWx0dXJlLlxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXQoXCJuYWdhc1wiKS51bmxvY2tlZCAmJlxuICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJjdWx0dXJlXCIpLnZhbHVlID49IDE1MDBcbiAgICAgICkge1xuICAgICAgICBpZiAobWFucG93ZXIgPj0gMTAwMCkge1xuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmdldChcIm1hbnBvd2VyXCIpLnZhbHVlIC09IDEwMDA7XG4gICAgICAgICAgY29uc3QgdW5sb2NrZWRSYWNlID0gbXVzdEV4aXN0KHRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kudW5sb2NrUmFuZG9tUmFjZSgpKTtcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLnJhY2VcIiwgW3VubG9ja2VkUmFjZS50aXRsZV0sIFwia3MtdXBncmFkZVwiKTtcbiAgICAgICAgICBtYW5wb3dlciAtPSAxMDAwO1xuICAgICAgICAgIGNvbnRleHQucmVxdWVzdEdhbWVVaVJlZnJlc2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFplYnJhcyByZXF1aXJlIHVzIHRvIGhhdmUgYSBzaGlwLlxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXQoXCJ6ZWJyYXNcIikudW5sb2NrZWQgJiZcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwic2hpcFwiKS52YWx1ZSA+PSAxXG4gICAgICApIHtcbiAgICAgICAgaWYgKG1hbnBvd2VyID49IDEwMDApIHtcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJtYW5wb3dlclwiKS52YWx1ZSAtPSAxMDAwO1xuICAgICAgICAgIGNvbnN0IHVubG9ja2VkUmFjZSA9IG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5LnVubG9ja1JhbmRvbVJhY2UoKSk7XG4gICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwidXBncmFkZS5yYWNlXCIsIFt1bmxvY2tlZFJhY2UudGl0bGVdLCBcImtzLXVwZ3JhZGVcIik7XG4gICAgICAgICAgbWFucG93ZXIgLT0gMTAwMDtcbiAgICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGb3Igc3BpZGVycywgd2UgbmVlZCAxMDAgc2hpcHMgYW5kIDEyNTAwMCBzY2llbmNlLlxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXQoXCJzcGlkZXJzXCIpLnVubG9ja2VkICYmXG4gICAgICAgIG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJzaGlwXCIpKS52YWx1ZSA+PSAxMDAgJiZcbiAgICAgICAgbXVzdEV4aXN0KHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmdldChcInNjaWVuY2VcIikpLm1heFZhbHVlID4gMTI1MDAwXG4gICAgICApIHtcbiAgICAgICAgaWYgKG1hbnBvd2VyID49IDEwMDApIHtcbiAgICAgICAgICBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwibWFucG93ZXJcIikpLnZhbHVlIC09IDEwMDA7XG4gICAgICAgICAgY29uc3QgdW5sb2NrZWRSYWNlID0gbXVzdEV4aXN0KHRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kudW5sb2NrUmFuZG9tUmFjZSgpKTtcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLnJhY2VcIiwgW3VubG9ja2VkUmFjZS50aXRsZV0sIFwia3MtdXBncmFkZVwiKTtcbiAgICAgICAgICBtYW5wb3dlciAtPSAxMDAwO1xuICAgICAgICAgIGNvbnRleHQucmVxdWVzdEdhbWVVaVJlZnJlc2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERyYWdvbnMgcmVxdWlyZSBudWNsZWFyIGZpc3Npb24gdG8gYmUgcmVzZWFyY2hlZC5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kuZ2V0KFwiZHJhZ29uc1wiKS51bmxvY2tlZCAmJlxuICAgICAgICB0aGlzLl9ob3N0LmdhbWUuc2NpZW5jZS5nZXQoXCJudWNsZWFyRmlzc2lvblwiKS5yZXNlYXJjaGVkXG4gICAgICApIHtcbiAgICAgICAgaWYgKG1hbnBvd2VyID49IDEwMDApIHtcbiAgICAgICAgICBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwibWFucG93ZXJcIikpLnZhbHVlIC09IDEwMDA7XG4gICAgICAgICAgY29uc3QgdW5sb2NrZWRSYWNlID0gbXVzdEV4aXN0KHRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kudW5sb2NrUmFuZG9tUmFjZSgpKTtcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLnJhY2VcIiwgW3VubG9ja2VkUmFjZS50aXRsZV0sIFwia3MtdXBncmFkZVwiKTtcbiAgICAgICAgICBtYW5wb3dlciAtPSAxMDAwO1xuICAgICAgICAgIGNvbnRleHQucmVxdWVzdEdhbWVVaVJlZnJlc2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXV0b1RyYWRlQmxhY2tjb2luKCkge1xuICAgIGNvbnN0IGNvaW5QcmljZSA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5jcnlwdG9QcmljZTtcbiAgICBjb25zdCByZWxpY3NJbml0aWFsID0gdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwicmVsaWNcIikudmFsdWU7XG4gICAgY29uc3QgY29pbnNJbml0aWFsID0gdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwiYmxhY2tjb2luXCIpLnZhbHVlO1xuICAgIGxldCBjb2luc0V4Y2hhbmdlZCA9IDAuMDtcbiAgICBsZXQgcmVsaWNzRXhjaGFuZ2VkID0gMC4wO1xuXG4gICAgLy8gQWxsIG9mIHRoaXMgY29kZSBpcyBzdHJhaWdodC1mb3J3YXJkLiBCdXkgbG93LCBzZWxsIGhpZ2guXG5cbiAgICAvLyBFeGNoYW5nZXMgdXAgdG8gYSBjZXJ0YWluIHRocmVzaG9sZCwgaW4gb3JkZXIgdG8ga2VlcCBhIGdvb2QgZXhjaGFuZ2UgcmF0ZSwgdGhlbiB3YWl0c1xuICAgIC8vIGZvciBhIGhpZ2hlciB0aHJlc2hvbGQgYmVmb3JlIGV4Y2hhbmdpbmcgZm9yIHJlbGljcy5cbiAgICBpZiAoXG4gICAgICBjb2luUHJpY2UgPCB0aGlzLnNldHRpbmdzLnRyYWRlQmxhY2tjb2luLmJ1eSAmJlxuICAgICAgdGhpcy5zZXR0aW5ncy50cmFkZUJsYWNrY29pbi50cmlnZ2VyIDwgcmVsaWNzSW5pdGlhbFxuICAgICkge1xuICAgICAgdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5idXlCY29pbigpO1xuXG4gICAgICBjb25zdCBjdXJyZW50Q29pbiA9IHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmdldChcImJsYWNrY29pblwiKS52YWx1ZTtcbiAgICAgIGNvaW5zRXhjaGFuZ2VkID0gTWF0aC5yb3VuZChjdXJyZW50Q29pbiAtIGNvaW5zSW5pdGlhbCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJhY3QuYmxhY2tjb2luLmJ1eVwiLCBbdGhpcy5faG9zdC5yZW5kZXJBYnNvbHV0ZShjb2luc0V4Y2hhbmdlZCldKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY29pblByaWNlID4gdGhpcy5zZXR0aW5ncy50cmFkZUJsYWNrY29pbi5zZWxsICYmXG4gICAgICAwIDwgdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwiYmxhY2tjb2luXCIpLnZhbHVlXG4gICAgKSB7XG4gICAgICB0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5LnNlbGxCY29pbigpO1xuXG4gICAgICBjb25zdCByZWxpY3NDdXJyZW50ID0gbXVzdEV4aXN0KHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmdldChcInJlbGljXCIpKS52YWx1ZTtcbiAgICAgIHJlbGljc0V4Y2hhbmdlZCA9IE1hdGgucm91bmQocmVsaWNzQ3VycmVudCAtIHJlbGljc0luaXRpYWwpO1xuXG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJhY3QuYmxhY2tjb2luLnNlbGxcIiwgW1xuICAgICAgICB0aGlzLl9ob3N0LnJlbmRlckFic29sdXRlKHJlbGljc0V4Y2hhbmdlZCksXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJhZGUgd2l0aCB0aGUgZ2l2ZW4gcmFjZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgVGhlIHJhY2UgdG8gdHJhZGUgd2l0aC5cbiAgICogQHBhcmFtIGFtb3VudCBIb3cgb2Z0ZW4gdG8gdHJhZGUgd2l0aCB0aGUgcmFjZS5cbiAgICovXG4gIHRyYWRlKG5hbWU6IFJhY2UsIGFtb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcmFjZSA9IHRoaXMuZ2V0UmFjZShuYW1lKTtcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldFRyYWRlQnV0dG9uKHJhY2UubmFtZSk7XG5cbiAgICBpZiAoIWJ1dHRvbj8ubW9kZWw/LmVuYWJsZWQgfHwgIXRoaXMuc2V0dGluZ3MucmFjZXNbbmFtZV0uZW5hYmxlZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAuLi5jbChcbiAgICAgICAgICBcIktTIHRyYWRlIGNoZWNrcyBhcmUgbm90IGZ1bmN0aW9uaW5nIHByb3Blcmx5LCBwbGVhc2UgY3JlYXRlIGFuIGlzc3VlIG9uIHRoZSBnaXRodWIgcGFnZS5cIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS50cmFkZU11bHRpcGxlKHJhY2UsIGFtb3VudCk7XG4gICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KHJhY2UudGl0bGUsIGFtb3VudCwgXCJ0cmFkZVwiKTtcbiAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXG4gICAgICBcImFjdC50cmFkZVwiLFxuICAgICAgW3RoaXMuX2hvc3QucmVuZGVyQWJzb2x1dGUoYW1vdW50KSwgdWNmaXJzdChyYWNlLnRpdGxlKV0sXG4gICAgICBcImtzLXRyYWRlXCIsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaWYgYSB0cmFkZSB3aXRoIHRoZSBnaXZlbiByYWNlIHdvdWxkIGJlIGNvbnNpZGVyZWQgcHJvZml0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgVGhlIHJhY2UgdG8gdHJhZGUgd2l0aC5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0cmFkZSBpcyBwcm9maXRhYmxlOyBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIGdldFByb2ZpdGFiaWxpdHkobmFtZTogUmFjZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJhY2UgPSB0aGlzLmdldFJhY2UobmFtZSk7XG5cbiAgICAvLyBUaGlzIHdpbGwga2VlcCB0cmFjayBvZiBob3cgbXVjaCB3ZSBoYXZlIHRvIHNwZW5kIG9uIGEgZ2l2ZW4gdHJhZGUuXG4gICAgLy8gSGlnaGVyIHZhbHVlcyBhcmUgd29yc2UuXG4gICAgbGV0IGNvc3QgPSAwO1xuICAgIC8vIEdldCBtYXRlcmlhbHMgcmVxdWlyZWQgdG8gdHJhZGUgd2l0aCB0aGUgcmFjZS5cbiAgICBjb25zdCBtYXRlcmlhbHMgPSB0aGlzLmdldE1hdGVyaWFscyhuYW1lKTtcbiAgICAvLyBGb3IgZWFjaCBtYXRlcmlhbCByZXF1aXJlZCB0byB0cmFkZSB3aXRoIHRoZSByYWNlLi4uXG4gICAgZm9yIChjb25zdCBbbWF0LCBhbW91bnRdIG9mIG9iamVjdEVudHJpZXMobWF0ZXJpYWxzKSkge1xuICAgICAgLy8gLi4uZGV0ZXJtaW5lIGhvdyBtdWNoIG9mIHRoZSByZXNvdXJjZSBpcyBwcm9kdWNlZCBlYWNoIHRpY2suXG4gICAgICBjb25zdCB0aWNrID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFRpY2tWYWwodGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKG1hdCkpO1xuICAgICAgLy8gSWYgd2UncmUgbm90IHByb2R1Y2luZyBhbnkgb2YgdGhpcyByZXNvdXJjZSwgaXQncyBzcGljZSwgb3IgYmx1ZXByaW50cyxcbiAgICAgIC8vIGRvbid0IGNvbnNpZGVyIGl0IGluIHRoZSBjYWxjdWxhdGlvbi5cbiAgICAgIGlmICh0aWNrID09PSBcImlnbm9yZVwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gSWYgd2UncmUgY29uc3VtaW5nIHRoaXMgcmVzb3VyY2UgaW5zdGVhZCBvZiBwcm9kdWNpbmcgaXQsXG4gICAgICAvLyBpbnN0YW50bHkgY29uc2lkZXIgdGhpcyB0cmFkZSBub3QgcHJvZml0YWJsZS5cbiAgICAgIGlmICh0aWNrIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdG8gdGhlIGNvc3QuXG4gICAgICAvLyBXZSBjb25zaWRlciBhbGwgcmVzb3VyY2VzIHRvIGJlIGVxdWFsIGluIHRoZSBwcm9maXRhYmlsaXR5IGNhbGN1bGF0aW9uLlxuICAgICAgLy8gV2UganVzdCBhZGQgdGhlIGNvc3Qgb2YgdGhlIHJlc291cmNlLCBkaXZpZGVkIGJ5IGhvdyBtdWNoIG9mIGl0IHdlJ3JlXG4gICAgICAvLyBwcm9kdWNpbmcuIFNvIHJlc291cmNlcyB0aGF0IHdlIHByb2R1Y2UgYSBsb3Qgb2YsIGRvbid0IFwiY29zdFwiIGFzIG11Y2guXG4gICAgICBjb3N0ICs9IGFtb3VudCAvIHRpY2s7XG4gICAgfVxuXG4gICAgLy8gVGhpcyB3aWxsIGtlZXAgdHJhY2sgb2YgaG93IG11Y2ggd2UgcmVjZWl2ZSBmcm9tIGEgZ2l2ZW4gdHJhZGUuXG4gICAgbGV0IHByb2ZpdCA9IDA7XG4gICAgLy8gR2V0IHJlc291cmNlcyByZXR1cm5lZCBmcm9tIHRyYWRlLlxuICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuZ2V0QXZlcmFnZVRyYWRlKHJhY2UpO1xuICAgIC8vIEZvciBlYWNoIG1hdGVyaWFsIHJlc3VsdGluZyBmcm9tIGEgdHJhZGUgd2l0aCB0aGUgcmFjZS4uLlxuICAgIGZvciAoY29uc3QgW3Byb2QsIGFtb3VudF0gb2Ygb2JqZWN0RW50cmllcyhvdXRwdXQpKSB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShwcm9kKTtcbiAgICAgIC8vIC4uLmRldGVybWluZSBob3cgbXVjaCBvZiB0aGUgcmVzb3VyY2UgaXMgcHJvZHVjZWQgZWFjaCB0aWNrLlxuICAgICAgY29uc3QgdGljayA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRUaWNrVmFsKHJlc291cmNlKTtcbiAgICAgIC8vIElmIHdlJ3JlIG5vdCBwcm9kdWNpbmcgYW55IG9mIHRoaXMgcmVzb3VyY2UsIGl0J3Mgc3BpY2UsIG9yIGJsdWVwcmludHMsXG4gICAgICAvLyBkb24ndCBjb25zaWRlciBpdCBpbiB0aGUgY2FsY3VsYXRpb24uXG4gICAgICBpZiAodGljayA9PT0gXCJpZ25vcmVcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIElmIHdlJ3JlIGNvbnN1bWluZyB0aGlzIHJlc291cmNlIGluc3RlYWQgb2YgcHJvZHVjaW5nIGl0LFxuICAgICAgLy8gaW5zdGFudGx5IGNvbnNpZGVyIHRoaXMgdHJhZGUgcHJvZml0YWJsZS5cbiAgICAgIGlmICh0aWNrIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHByb2ZpdCArPVxuICAgICAgICAvLyBGb3IgY2FwcGVkIHJlc291cmNlcy4uLlxuICAgICAgICAwIDwgcmVzb3VyY2UubWF4VmFsdWVcbiAgICAgICAgICA/IC8vIC4uLiBvbmx5IGFkZCBhcyBtdWNoIHRvIHRoZSBwcm9maXQgYXMgd2UgY2FuIHN0b3JlLlxuICAgICAgICAgICAgTWF0aC5taW4oYW1vdW50LCBNYXRoLm1heChyZXNvdXJjZS5tYXhWYWx1ZSAtIHJlc291cmNlLnZhbHVlLCAwKSkgLyB0aWNrXG4gICAgICAgICAgOiAvLyBGb3IgdW5jYXBwZWQgcmVzb3VyY2VzLCBhZGQgYWxsIG9mIGl0LlxuICAgICAgICAgICAgYW1vdW50IC8gdGljaztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgcHJvZml0IGlzIGhpZ2hlciB0aGFuIHRoZSBjb3N0LCBjb25zaWRlciB0aGlzIHByb2ZpdGFibGUuXG4gICAgcmV0dXJuIGNvc3QgPD0gcHJvZml0O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSB3aGljaCByZXNvdXJjZXMgYW5kIGhvdyBtdWNoIG9mIHRoZW0gYSB0cmFkZSB3aXRoIHRoZSBnaXZlbiByYWNlIHJlc3VsdHMgaW4uXG4gICAqXG4gICAqIEBwYXJhbSByYWNlIFRoZSByYWNlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBUaGUgcmVzb3VyY2VzIHJldHVybmVkIGZyb20gYW4gYXZlcmFnZSB0cmFkZSBhbmQgdGhlaXIgYW1vdW50LlxuICAgKi9cbiAgZ2V0QXZlcmFnZVRyYWRlKHJhY2U6IFVuc2FmZVJhY2UpOiBQYXJ0aWFsPFJlY29yZDxSZXNvdXJjZSwgbnVtYmVyPj4ge1xuICAgIC8vIFRPRE86IFRoaXMgaXMgYSBsb3Qgb2YgbWFnaWMuIEl0J3MgcG9zc2libGUgc29tZSBvZiBpdCB3YXMgY29waWVkIGRpcmVjdGx5IGZyb20gdGhlIGdhbWUuXG4gICAgY29uc3Qgc3RhbmRpbmdSYXRpbyA9XG4gICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwic3RhbmRpbmdSYXRpb1wiKSArXG4gICAgICB0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5LmNhbGN1bGF0ZVN0YW5kaW5nRnJvbVBvbGljaWVzKHJhY2UubmFtZSwgdGhpcy5faG9zdC5nYW1lKTtcblxuICAgIGNvbnN0IHJhY2VSYXRpbyA9IDEgKyByYWNlLmVuZXJneSAqIDAuMDI7XG5cbiAgICBjb25zdCB0cmFkZVJhdGlvID1cbiAgICAgIDEgK1xuICAgICAgdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXRUcmFkZVJhdGlvKCkgK1xuICAgICAgdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5jYWxjdWxhdGVUcmFkZUJvbnVzRnJvbVBvbGljaWVzKHJhY2UubmFtZSwgdGhpcy5faG9zdC5nYW1lKTtcblxuICAgIGNvbnN0IGZhaWxlZFJhdGlvID0gcmFjZS5zdGFuZGluZyA8IDAgPyByYWNlLnN0YW5kaW5nICsgc3RhbmRpbmdSYXRpbyA6IDA7XG4gICAgY29uc3Qgc3VjY2Vzc1JhdGlvID0gMCA8IGZhaWxlZFJhdGlvID8gMSArIGZhaWxlZFJhdGlvIDogMTtcbiAgICBjb25zdCBib251c1JhdGlvID0gMCA8IHJhY2Uuc3RhbmRpbmcgPyBNYXRoLm1pbihyYWNlLnN0YW5kaW5nICsgc3RhbmRpbmdSYXRpbyAvIDIsIDEpIDogMDtcblxuICAgIGNvbnN0IG91dHB1dDogUGFydGlhbDxSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4+ID0ge307XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHJhY2Uuc2VsbHMpIHtcbiAgICAgIGlmICghdGhpcy5faXNWYWxpZFRyYWRlKGl0ZW0sIHJhY2UpKSB7XG4gICAgICAgIC8vIFN0aWxsIHB1dCBpbnZhbGlkIHRyYWRlcyBpbnRvIHRoZSByZXN1bHQgdG8gbm90IGNhdXNlIG1pc3Npbmcga2V5cy5cbiAgICAgICAgb3V0cHV0W2l0ZW0ubmFtZV0gPSAwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG1lYW4gPSAwO1xuICAgICAgY29uc3QgdHJhZGVDaGFuY2UgPSByYWNlLmVtYmFzc3lQcmljZXNcbiAgICAgICAgPyBpdGVtLmNoYW5jZSAqICgxICsgdGhpcy5faG9zdC5nYW1lLmdldExpbWl0ZWREUigwLjAxICogcmFjZS5lbWJhc3N5TGV2ZWwsIDAuNzUpKVxuICAgICAgICA6IGl0ZW0uY2hhbmNlO1xuICAgICAgaWYgKHJhY2UubmFtZSA9PT0gXCJ6ZWJyYXNcIiAmJiBpdGVtLm5hbWUgPT09IFwidGl0YW5pdW1cIikge1xuICAgICAgICBjb25zdCBzaGlwQ291bnQgPSB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJzaGlwXCIpLnZhbHVlO1xuICAgICAgICBjb25zdCB0aXRhbml1bVByb2JhYmlsaXR5ID0gTWF0aC5taW4oMC4xNSArIHNoaXBDb3VudCAqIDAuMDAzNSwgMSk7XG4gICAgICAgIGNvbnN0IHRpdGFuaXVtUmF0aW8gPSAxICsgc2hpcENvdW50IC8gNTA7XG4gICAgICAgIG1lYW4gPSAxLjUgKiB0aXRhbml1bVJhdGlvICogKHN1Y2Nlc3NSYXRpbyAqIHRpdGFuaXVtUHJvYmFiaWxpdHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2Vhc2lvblJhdGlvID0gIWl0ZW0uc2Vhc29uc1xuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMSArIGl0ZW0uc2Vhc29uc1t0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZ2V0Q3VyU2Vhc29uKCkubmFtZV07XG4gICAgICAgIGNvbnN0IG5vcm1Cb3VnaHQgPSAoc3VjY2Vzc1JhdGlvIC0gYm9udXNSYXRpbykgKiBNYXRoLm1pbih0cmFkZUNoYW5jZSAvIDEwMCwgMSk7XG4gICAgICAgIGNvbnN0IG5vcm1Cb251cyA9IGJvbnVzUmF0aW8gKiBNYXRoLm1pbih0cmFkZUNoYW5jZSAvIDEwMCwgMSk7XG4gICAgICAgIG1lYW4gPSAobm9ybUJvdWdodCArIDEuMjUgKiBub3JtQm9udXMpICogaXRlbS52YWx1ZSAqIHJhY2VSYXRpbyAqIHNlYXNpb25SYXRpbyAqIHRyYWRlUmF0aW87XG4gICAgICB9XG4gICAgICBvdXRwdXRbaXRlbS5uYW1lXSA9IG1lYW47XG4gICAgfVxuXG4gICAgY29uc3Qgc3BpY2VDaGFuY2UgPSByYWNlLmVtYmFzc3lQcmljZXMgPyAwLjM1ICogKDEgKyAwLjAxICogcmFjZS5lbWJhc3N5TGV2ZWwpIDogMC4zNTtcbiAgICBjb25zdCBzcGljZVRyYWRlQW1vdW50ID0gc3VjY2Vzc1JhdGlvICogTWF0aC5taW4oc3BpY2VDaGFuY2UsIDEpO1xuICAgIG91dHB1dC5zcGljZSA9IDI1ICogc3BpY2VUcmFkZUFtb3VudCArICg1MCAqIHNwaWNlVHJhZGVBbW91bnQgKiB0cmFkZVJhdGlvKSAvIDI7XG4gICAgb3V0cHV0LmJsdWVwcmludCA9IDAuMSAqIHN1Y2Nlc3NSYXRpbztcblxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIHRoaXMgdHJhZGUgaXMgdmFsaWQuXG4gICAqXG4gICAqIEBwYXJhbSBpdGVtIFRoZSB0cmFkZWFibGUgaXRlbS5cbiAgICogQHBhcmFtIHJhY2UgVGhlIHJhY2UgdG8gdHJhZGUgd2l0aC5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0cmFkZSBpcyB2YWxpZDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwcml2YXRlIF9pc1ZhbGlkVHJhZGUoaXRlbTogVW5zYWZlVHJhZGVTZWxsT2ZmZXIsIHJhY2U6IFVuc2FmZVJhY2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgLy8gRG8gd2UgaGF2ZSBlbm91Z2ggZW1iYXNzaWVzIHRvIHJlY2VpdmUgdGhlIGl0ZW0/XG4gICAgICAhKGl0ZW0ubWluTGV2ZWwgJiYgcmFjZS5lbWJhc3N5TGV2ZWwgPCBpdGVtLm1pbkxldmVsKSAmJlxuICAgICAgLy8gVE9ETzogVGhlc2Ugc2VlbSBhIGJpdCB0b28gbWFnaWNhbC5cbiAgICAgICh0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoaXRlbS5uYW1lKS51bmxvY2tlZCB8fFxuICAgICAgICBpdGVtLm5hbWUgPT09IFwidGl0YW5pdW1cIiB8fFxuICAgICAgICBpdGVtLm5hbWUgPT09IFwidXJhbml1bVwiIHx8XG4gICAgICAgIHJhY2UubmFtZSA9PT0gXCJsZXZpYXRoYW5zXCIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaG93IG1hbnkgdHJhZGVzIGFyZSBhdCBsZWFzdCBwb3NzaWJsZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgVGhlIHJhY2UgdG8gdHJhZGUgd2l0aC5cbiAgICogQHBhcmFtIF9saW1pdGVkIElzIHRoZSByYWNlIHNldCB0byBiZSBsaW1pdGVkLlxuICAgKiBAcGFyYW0gX3RyaWdDb25kaXRpb25zIElnbm9yZWRcbiAgICogQHJldHVybnMgVGhlIGxvd2VzdCBudW1iZXIgb2YgdHJhZGVzIHBvc3NpYmxlIHdpdGggdGhpcyByYWNlLlxuICAgKi9cbiAgZ2V0TG93ZXN0VHJhZGVBbW91bnQobmFtZTogUmFjZSB8IG51bGwsIF9saW1pdGVkOiBib29sZWFuLCBfdHJpZ0NvbmRpdGlvbnM6IHVua25vd24pOiBudW1iZXIge1xuICAgIGxldCBhbW91bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXRlcmlhbHMgPSB0aGlzLmdldE1hdGVyaWFscyhuYW1lKTtcblxuICAgIGxldCB0b3RhbDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW3Jlc291cmNlLCByZXF1aXJlZF0gb2Ygb2JqZWN0RW50cmllcyhtYXRlcmlhbHMpKSB7XG4gICAgICBpZiAocmVzb3VyY2UgPT09IFwibWFucG93ZXJcIikge1xuICAgICAgICBsZXQgbWFucG93ZXJDb3N0ID0gcmVxdWlyZWQ7XG4gICAgICAgIGlmICh0aGlzLl9ob3N0LmdhbWUuY2hhbGxlbmdlcy5pc0FjdGl2ZShcInBvc3RBcG9jYWx5cHNlXCIpKSB7XG4gICAgICAgICAgbWFucG93ZXJDb3N0ID0gcmVxdWlyZWQgKiAoMSArIHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0UG9sbHV0aW9uTGV2ZWwoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdG90YWwgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUocmVzb3VyY2UpIC8gbWFucG93ZXJDb3N0O1xuICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZSA9PT0gXCJnb2xkXCIpIHtcbiAgICAgICAgbGV0IGdvbGRDb3N0ID0gcmVxdWlyZWQ7XG4gICAgICAgIGlmICh0aGlzLl9ob3N0LmdhbWUuY2hhbGxlbmdlcy5pc0FjdGl2ZShcInBvc3RBcG9jYWx5cHNlXCIpKSB7XG4gICAgICAgICAgZ29sZENvc3QgPSByZXF1aXJlZCAqICgxICsgdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRQb2xsdXRpb25MZXZlbCgpKTtcbiAgICAgICAgfVxuICAgICAgICB0b3RhbCA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShyZXNvdXJjZSkgLyBnb2xkQ29zdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvdGFsID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKHJlc291cmNlKSAvIHJlcXVpcmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIGFtb3VudCB0byB0aGUgbG93ZXN0IGFtb3VudCBvZiBwb3NzaWJsZSB0cmFkZXMgc2VlbiB5ZXQuXG4gICAgICBhbW91bnQgPSBhbW91bnQgPT09IHVuZGVmaW5lZCB8fCB0b3RhbCA8IGFtb3VudCA/IHRvdGFsIDogYW1vdW50O1xuICAgIH1cblxuICAgIC8vIFJvdW5kIHRoZSBhbW91bnQgZG93biBhbmQgbm9ybWFsaXplIHRvIDAuXG4gICAgYW1vdW50ID0gTWF0aC5mbG9vcihhbW91bnQgPz8gMCk7XG5cbiAgICAvLyBJZiB0aGUgbG93ZXN0IGFtb3VudCBpcyAwLCByZXR1cm4gMC5cbiAgICBpZiAoYW1vdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBJZiBubyByYWNlIHdhcyBzcGVjaWZpZWQsIG9yIHRoaXMgaXMgdHJhZGluZyB3aXRoIGxldmlhdGhhbnMsIHJldHVybiB0aGVcbiAgICAvLyBjdXJyZW50bHkga25vd24sIGxvd2VzdCBhbW91bnQuXG4gICAgLy8gVGhlIHNwZWNpYWwgY2FzZSBmb3IgbGV2aWF0aGFucyBpbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgaXMgYnVnZ3kgb3JcbiAgICAvLyBwcm9ibGVtYXRpYywgYXMgbGV2aWF0aGFucyBhcmUgdGhlIGxhc3QgcmFjZS5cbiAgICBpZiAobmFtZSA9PT0gbnVsbCB8fCBuYW1lID09PSBcImxldmlhdGhhbnNcIikge1xuICAgICAgcmV0dXJuIGFtb3VudDtcbiAgICB9XG5cbiAgICBjb25zdCByYWNlID0gdGhpcy5nZXRSYWNlKG5hbWUpO1xuXG4gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBpdGVtcyBvYnRhaW5lZCBieSB0aGUgcmFjZSwgYW5kIGRldGVybWluZVxuICAgIC8vIHdoaWNoIHJlc291cmNlIGhhcyB0aGUgbW9zdCBzcGFjZSBsZWZ0LiBPbmNlIHdlJ3ZlIGRldGVybWluZWQgdGhpcyxcbiAgICAvLyByZWR1Y2UgdGhlIGFtb3VudCBieSB0aGlzIGNhcGFjaXR5LiBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBjb250aW51ZSB0byB0cmFkZVxuICAgIC8vIGFzIGxvbmcgYXMgYXQgbGVhc3Qgb25lIHJlc291cmNlIGhhcyBjYXBhY2l0eSwgYW5kIHdlIG5ldmVyIG92ZXItdHJhZGUuXG5cbiAgICBsZXQgaGlnaGVzdENhcGFjaXR5ID0gMDtcbiAgICBjb25zdCB0cmFkZU91dHB1dCA9IHRoaXMuZ2V0QXZlcmFnZVRyYWRlKHJhY2UpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiByYWNlLnNlbGxzKSB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShpdGVtLm5hbWUpO1xuICAgICAgbGV0IG1heCA9IDA7XG5cbiAgICAgIC8vIE5vIG5lZWQgdG8gcHJvY2VzcyByZXNvdXJjZXMgdGhhdCBkb24ndCBjYXBcbiAgICAgIGlmICghcmVzb3VyY2UubWF4VmFsdWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIG1heCA9IG11c3RFeGlzdCh0cmFkZU91dHB1dFtpdGVtLm5hbWVdKTtcblxuICAgICAgY29uc3QgY2FwYWNpdHkgPSBNYXRoLm1heCgocmVzb3VyY2UubWF4VmFsdWUgLSByZXNvdXJjZS52YWx1ZSkgLyBtYXgsIDApO1xuXG4gICAgICBoaWdoZXN0Q2FwYWNpdHkgPSBjYXBhY2l0eSA8IGhpZ2hlc3RDYXBhY2l0eSA/IGhpZ2hlc3RDYXBhY2l0eSA6IGNhcGFjaXR5O1xuICAgIH1cblxuICAgIC8vIFdlIG11c3QgdGFrZSB0aGUgY2VpbGluZyBvZiBjYXBhY2l0eSBzbyB0aGF0IHdlIHdpbGwgdHJhZGUgYXMgbG9uZ1xuICAgIC8vIGFzIHRoZXJlIGlzIGFueSByb29tLCBldmVuIGlmIGl0IGRvZXNuJ3QgaGF2ZSBleGFjdCBzcGFjZS4gT3RoZXJ3aXNlXG4gICAgLy8gd2Ugc2VlbSB0byBzdGFydmUgdHJhZGluZyBhbHRvZ2V0aGVyLlxuICAgIGhpZ2hlc3RDYXBhY2l0eSA9IE1hdGguY2VpbChoaWdoZXN0Q2FwYWNpdHkpO1xuXG4gICAgLy8gSWYgYW55IG9mIHRoZSByZXNvdXJjZXMgcmVzdWx0aW5nIGZyb20gYSB0cmFkZSBhcmUgYWxyZWFkeSBjYXBwZWQsIHdlXG4gICAgLy8gZG9uJ3Qgd2FudCB0byB0cmFkZSB3aXRoIHRoaXMgcmFjZS5cbiAgICBpZiAoaGlnaGVzdENhcGFjaXR5ID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoZSBtb3N0IHdlICpzaG91bGQqIHRyYWRlIGZvciwgY2hlY2sgdG8gZW5zdXJlIHRoYXRcbiAgICAvLyB3ZSB0cmFkZSBmb3Igb3VyIG1heCBjb3N0LCBvciBvdXIgbWF4IGNhcGFjaXR5LCB3aGljaGV2ZXIgaXMgbG93ZXIuXG4gICAgLy8gVGhpcyBoZWxwcyB1cyBwcmV2ZW50IHRyYWRpbmcgZm9yIHJlc291cmNlcyB3ZSBjYW4ndCBzdG9yZS4gTm90ZSB0aGF0IHdlXG4gICAgLy8gZXNzZW50aWFsbHkgaWdub3JlIGJsdWVwcmludHMgaGVyZS5cblxuICAgIGFtb3VudCA9IGhpZ2hlc3RDYXBhY2l0eSA8IGFtb3VudCA/IE1hdGgubWF4KGhpZ2hlc3RDYXBhY2l0eSAtIDEsIDEpIDogYW1vdW50O1xuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgdGhlIHJlc291cmNlcyByZXF1aXJlZCB0byB0cmFkZSB3aXRoIHRoZSBnaXZlbiByYWNlLlxuICAgKlxuICAgKiBAcGFyYW0gcmFjZSBUaGUgcmFjZSB0byBjaGVjay4gSWYgbm90IHNwZWNpZmllZCB0aGUgcmVzb3VyY2VzIGZvciBhbnlcbiAgICogdHJhZGUgd2lsbCBiZSByZXR1cm5lZC5cbiAgICogQHJldHVybnMgVGhlIHJlc291cmNlcyBuZWVkIHRvIHRyYWRlIHdpdGggdGhlIHJhY2UuXG4gICAqL1xuICBnZXRNYXRlcmlhbHMocmFjZTogTWF5YmU8UmFjZT4gPSBudWxsKTogUGFydGlhbDxSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4+IHtcbiAgICBjb25zdCBtYXRlcmlhbHM6IFBhcnRpYWw8UmVjb3JkPFJlc291cmNlLCBudW1iZXI+PiA9IHtcbiAgICAgIGdvbGQ6IDE1IC0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInRyYWRlR29sZERpc2NvdW50XCIpLFxuICAgICAgbWFucG93ZXI6IDUwIC0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInRyYWRlQ2F0cG93ZXJEaXNjb3VudFwiKSxcbiAgICB9O1xuXG4gICAgaWYgKGlzTmlsKHJhY2UpKSB7XG4gICAgICByZXR1cm4gbWF0ZXJpYWxzO1xuICAgIH1cblxuICAgIGNvbnN0IHByaWNlcyA9IHRoaXMuZ2V0UmFjZShyYWNlKS5idXlzO1xuXG4gICAgZm9yIChjb25zdCBwcmljZSBvZiBwcmljZXMpIHtcbiAgICAgIG1hdGVyaWFsc1twcmljZS5uYW1lXSA9IHByaWNlLnZhbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0ZXJpYWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnaXZlbiByYWNlIGZyb20gdGhlIGdhbWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSByYWNlIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gb2JqZWN0IGZvci5cbiAgICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIG9iamVjdCBmb3IgdGhlIGdpdmVuIHJhY2UuXG4gICAqL1xuICBnZXRSYWNlKG5hbWU6IFJhY2UpOiBVbnNhZmVSYWNlIHtcbiAgICBjb25zdCByYWNlSW5mbyA9IHRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kuZ2V0KG5hbWUpO1xuICAgIGlmIChpc05pbChyYWNlSW5mbykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJldHJpZXZlIHJhY2UgJyR7bmFtZX0nYCk7XG4gICAgfVxuICAgIHJldHVybiByYWNlSW5mbztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBhIHJlZmVyZW5jZSB0byB0aGUgdHJhZGUgYnV0dG9uIGZvciB0aGUgZ2l2ZW4gcmFjZSBmcm9tIHRoZSBnYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gcmFjZSBUaGUgcmFjZSB0byBnZXQgdGhlIGJ1dHRvbiByZWZlcmVuY2UgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgcmVmZXJlbmNlIHRvIHRoZSB0cmFkZSBidXR0b24uXG4gICAqL1xuICBnZXRUcmFkZUJ1dHRvbihyYWNlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYW5lbCA9IHRoaXMubWFuYWdlci50YWIucmFjZVBhbmVscy5maW5kKHN1YmplY3QgPT4gc3ViamVjdC5yYWNlLm5hbWUgPT09IHJhY2UpO1xuICAgIHJldHVybiBwYW5lbD8udHJhZGVCdG4gPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaWYgYXQgbGVhc3QgYSBzaW5nbGUgdHJhZGUgY2FuIGJlIG1hZGUuXG4gICAqXG4gICAqIEBwYXJhbSB0cmFkZSAtIFRoZSB0cmFkZSBvcHRpb24gdG8gY2hlY2suIElmIG5vdCBzcGVjaWZpZWQsIGFsbCByYWNlcyBhcmUgY2hlY2tlZC5cbiAgICogQHJldHVybnMgSWYgdGhlIHJlcXVlc3RlZCB0cmFkZSBpcyBwb3NzaWJsZS5cbiAgICovXG4gIHNpbmdsZVRyYWRlUG9zc2libGUoXG4gICAgc2VjdGlvblRyaWdnZXI6IG51bWJlcixcbiAgICBjYXRwb3dlcjogUmVxdWlyZWQ8VW5zYWZlUmVzb3VyY2U+LFxuICAgIGdvbGQ6IFJlcXVpcmVkPFVuc2FmZVJlc291cmNlPixcbiAgICB0cmFkZT86IFRyYWRlU2V0dGluZ3NJdGVtLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCB0cmlnZ2VyID0gdHJhZGVcbiAgICAgID8gRW5naW5lLmV2YWx1YXRlU3ViU2VjdGlvblRyaWdnZXIoc2VjdGlvblRyaWdnZXIsIHRyYWRlLnRyaWdnZXIpXG4gICAgICA6IHNlY3Rpb25UcmlnZ2VyO1xuXG4gICAgaWYgKHRyaWdnZXIgPCAwICYmIHRyYWRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFdlIHdpbGwgaGF2ZSB0byBjaGVjayBhbGwgcG90ZW50aWFsIHRyYWRlcyBpbmRpdmlkdWFsbHkuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlciA8IDAgJiYgdHJhZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyB3aWxsIG5ldmVyIHRyaWdnZXIuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gV2Ugc2hvdWxkIG9ubHkgdHJhZGUgaWYgY2F0cG93ZXIgYW5kIGdvbGQgaGl0IHRoZSB0cmlnZ2VyIHZhbHVlLlxuICAgIC8vIFRyYWRlcyBjYW4gYWRkaXRpb25hbGx5IHJlcXVpcmUgc3BlY2lmaWMgcmVzb3VyY2VzLiBXZSB3aWxsIGNoZWNrIGZvciB0aG9zZSBsYXRlci5cbiAgICBpZiAoY2F0cG93ZXIudmFsdWUgLyBjYXRwb3dlci5tYXhWYWx1ZSA8IHRyaWdnZXIgfHwgZ29sZC52YWx1ZSAvIGdvbGQubWF4VmFsdWUgPCB0cmlnZ2VyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBtYXRlcmlhbHMgcmVxdWlyZWQgdG8gdHJhZGUgd2l0aCB0aGUgcmFjZS5cbiAgICBjb25zdCBtYXRlcmlhbHMgPSB0aGlzLmdldE1hdGVyaWFscyh0cmFkZT8ucmFjZSk7XG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2UsIGFtb3VudF0gb2Ygb2JqZWN0RW50cmllczxSZXNvdXJjZSwgbnVtYmVyPihtYXRlcmlhbHMpKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgc3VmZmljaWVudCBhbW91bnQgb2YgdGhhdCByZXNvdXJjZSBpbiBzdG9yYWdlLlxuICAgICAgaWYgKHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShyZXNvdXJjZSkgPCBhbW91bnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4uL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB7IG9iamVjdEVudHJpZXMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuXG4vKipcbiAqIFRoZSBgQ2FjaGVNYW5hZ2VyYCBhcHBhcmVudGx5IHN0b3JlcyBhIHN0YXRlIG9mIHJlc291cmNlcyBpbiBzdG9jay5cbiAqIENvbXBvbmVudHMgY2FuIHB1c2ggaW5kaXZpZHVhbCByZXNvdXJjZSBzZXRzIGludG8gdGhlIGNhY2hlIHRvIHVwZGF0ZVxuICogdGhlIG92ZXJhbGwgc3RvY2sgY2FjaGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRlcmlhbHNDYWNoZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hvc3Q6IEtpdHRlblNjaWVudGlzdHM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfY2FjaGUgPSBuZXcgQXJyYXk8e1xuICAgIG1hdGVyaWFsczogUGFydGlhbDxSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4+O1xuICAgIHRpbWVTdGFtcDogbnVtYmVyO1xuICB9PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jYWNoZVN1bTogUGFydGlhbDxSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4+ID0ge307XG5cbiAgY29uc3RydWN0b3IoaG9zdDogS2l0dGVuU2NpZW50aXN0cykge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIGEgc2V0IG9mIG1hdGVyaWFscyBpbiB0aGUgY2FjaGUuXG4gICAqIFRoaXMgaXMgdXN1YWxseSBkb25lICphZnRlciogaHVudGluZyBhbmQgdHJhZGluZy5cbiAgICogVE9ETzogVGhpcyBpcyBpbmRpY2F0aXZlIG9mIHRoZSBkZXNpcmUgdG8ga25vdyB0aGUgcmVzb3VyY2Ugc3RhdGUgYXQgdGhlIGJlZ2lubmluZyBvZlxuICAgKiAgICAgICBhIGZyYW1lLiBUaGlzIGlzIGxpa2VseSByZXF1aXJlZCB0byBtYWtlIGRpZmZlcmVudCBhdXRvbWF0aW9ucyBwbGF5IG5pY2UgdG9nZXRoZXIuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBtYXRlcmlhbHMgdG8gc3RvcmUgaW4gdGhlIGNhY2hlLlxuICAgKiBAcGFyYW0gZGF0YS5tYXRlcmlhbHMgVGhlIG1hdGVyaWFscyB0aGVtc2VsdmVzLlxuICAgKiBAcGFyYW0gZGF0YS50aW1lU3RhbXAgVGhlIGN1cnJlbnQgdGltZS5cbiAgICovXG4gIHB1c2hUb0NhY2hlKGRhdGE6IHsgbWF0ZXJpYWxzOiBQYXJ0aWFsPFJlY29yZDxSZXNvdXJjZSwgbnVtYmVyPj47IHRpbWVTdGFtcDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICAvLyBTdG9yZSB0aGlzIGVudHJ5IGluIHRoZSBjYWNoZS5cbiAgICB0aGlzLl9jYWNoZS5wdXNoKGRhdGEpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjYWNoZWQgc3VtcyBmb3IgdGhlIHBhc3NlZCBtYXRlcmlhbHMuXG4gICAgZm9yIChjb25zdCBbbWF0LCBhbW91bnRdIG9mIG9iamVjdEVudHJpZXMoZGF0YS5tYXRlcmlhbHMpKSB7XG4gICAgICBpZiAoIXRoaXMuX2NhY2hlU3VtW21hdF0pIHtcbiAgICAgICAgdGhpcy5fY2FjaGVTdW1bbWF0XSA9IDA7XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWNoZVN1bVttYXRdICs9IGFtb3VudDtcbiAgICB9XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGVudHJpZXMgaW4gdGhlIGNhY2hlLlxuICAgIC8vIFRPRE86IFRoaXMgc2VlbXMgdG8gYmUgY29tcGxldGVseSBwb2ludGxlc3MsIGFzIHRoZSBjYWNoZSBpcyBuZXZlciBhY2Nlc3NlZC5cbiAgICAvLyAgICAgICBCZXlvbmQgdGhhdCwgaXQgc2VlbXMgdG8gYmUgYSBjbGVhbnVwIHByb2NlZHVyZSB0aGF0IGlzIHZlcnkgcG9vcmx5XG4gICAgLy8gICAgICAgaW1wbGVtZW50ZWQuXG4gICAgZm9yIChsZXQgY2FjaGVJbmRleCA9IDA7IGNhY2hlSW5kZXggPCB0aGlzLl9jYWNoZS5sZW5ndGg7ICsrY2FjaGVJbmRleCkge1xuICAgICAgY29uc3Qgb2xkRGF0YSA9IHRoaXMuX2NhY2hlW2NhY2hlSW5kZXhdO1xuICAgICAgaWYgKHRoaXMuX2NhY2hlLmxlbmd0aCA+IDEwMDAwKSB7XG4gICAgICAgIGNvbnN0IG9sZE1hdGVyaWFscyA9IG9sZERhdGEubWF0ZXJpYWxzO1xuICAgICAgICBmb3IgKGNvbnN0IFttYXQsIGFtb3VudF0gb2Ygb2JqZWN0RW50cmllcyhvbGRNYXRlcmlhbHMpKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLl9jYWNoZVN1bVttYXRdKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZVN1bVttYXRdID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fY2FjaGVTdW1bbWF0XSAtPSBhbW91bnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2FjaGUuc2hpZnQoKTtcbiAgICAgICAgY2FjaGVJbmRleC0tO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgcmVzb3VyY2UgYW1vdW50IHRoYXQgaXMgc3RvcmVkIGluIHRoZSBjYWNoZS5cbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgVGhlIGNhY2hlZCByZXNvdXJjZSBhbW91bnQsIGRpdmlkZWQgYnkgaG93IGxvbmcgaXQgaGFzIGJlZW4gY2FjaGVkLlxuICAgKi9cbiAgZ2V0UmVzVmFsdWUocmVzb3VyY2U6IFJlc291cmNlKTogbnVtYmVyIHtcbiAgICAvLyBJZiB0aGUgY2FjaGUgaXMgZW1wdHksIG9yIG5vIHN1bSB3YXMgc3RvcmVkIHlldCwgcmV0dXJuIDAuXG4gICAgaWYgKHRoaXMuX2NhY2hlLmxlbmd0aCA9PT0gMCB8fCAhdGhpcy5fY2FjaGVTdW1bcmVzb3VyY2VdKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VGljayA9IHRoaXMuX2hvc3QuZ2FtZS50aW1lci50aWNrc1RvdGFsO1xuICAgIGNvbnN0IHN0YXJ0aW5nVGljayA9IHRoaXMuX2NhY2hlWzBdLnRpbWVTdGFtcDtcblxuICAgIC8vIEFkanVzdCB0aGUgY2FjaGVkIHZhbHVlIGJ5IHRoZSBhbW91bnQgb2YgdGlja3MgdGhhdCBoYXZlIHBhc3NlZFxuICAgIC8vIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGNhY2hlIHdhcyB1cGRhdGVkLlxuICAgIC8vIFRPRE86IFdoeT8gVGhpcyBzZWVtcyBhcmJpdHJhcnksIGp1c3QgbGlrZSB0aGlzIGVudGlyZSBjYWNoZSBtYW5hZ2VyLlxuICAgIHJldHVybiB0aGlzLl9jYWNoZVN1bVtyZXNvdXJjZV0gLyAoY3VycmVudFRpY2sgLSBzdGFydGluZ1RpY2spO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRvbWF0aW9uLCBGcmFtZUNvbnRleHQgfSBmcm9tIFwiLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IE1hdGVyaWFsc0NhY2hlIH0gZnJvbSBcIi4vaGVscGVyL01hdGVyaWFsc0NhY2hlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtpdHRlblNjaWVudGlzdHMgfSBmcm9tIFwiLi9LaXR0ZW5TY2llbnRpc3RzLmpzXCI7XG5pbXBvcnQgeyBWaWxsYWdlU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9WaWxsYWdlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFRhYk1hbmFnZXIgfSBmcm9tIFwiLi9UYWJNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBvYmplY3RFbnRyaWVzIH0gZnJvbSBcIi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgbmVnYXRpdmVPbmVUb0luZmluaXR5IH0gZnJvbSBcIi4vdG9vbHMvRm9ybWF0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlIH0gZnJvbSBcIi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgVW5zYWZlSm9iLCBWaWxsYWdlIH0gZnJvbSBcIi4vdHlwZXMvdmlsbGFnZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc2hvcE1hbmFnZXIgfSBmcm9tIFwiLi9Xb3Jrc2hvcE1hbmFnZXIuanNcIjtcblxuZXhwb3J0IGNsYXNzIFZpbGxhZ2VNYW5hZ2VyIGltcGxlbWVudHMgQXV0b21hdGlvbiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hvc3Q6IEtpdHRlblNjaWVudGlzdHM7XG4gIHJlYWRvbmx5IHNldHRpbmdzOiBWaWxsYWdlU2V0dGluZ3M7XG4gIHJlYWRvbmx5IG1hbmFnZXI6IFRhYk1hbmFnZXI8VmlsbGFnZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NhY2hlTWFuYWdlcjogTWF0ZXJpYWxzQ2FjaGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEtpdHRlblNjaWVudGlzdHMsXG4gICAgd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXIsXG4gICAgc2V0dGluZ3MgPSBuZXcgVmlsbGFnZVNldHRpbmdzKCksXG4gICkge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVGFiTWFuYWdlcih0aGlzLl9ob3N0LCBcIlZpbGxhZ2VcIik7XG4gICAgdGhpcy5fY2FjaGVNYW5hZ2VyID0gbmV3IE1hdGVyaWFsc0NhY2hlKHRoaXMuX2hvc3QpO1xuICAgIHRoaXMuX3dvcmtzaG9wTWFuYWdlciA9IHdvcmtzaG9wTWFuYWdlcjtcbiAgfVxuXG4gIHRpY2soX2NvbnRleHQ6IEZyYW1lQ29udGV4dCkge1xuICAgIGlmICghdGhpcy5zZXR0aW5ncy5lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hdXRvRGlzdHJpYnV0ZUtpdHRlbnMoKTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLmh1bnQuZW5hYmxlZCkge1xuICAgICAgdGhpcy5hdXRvSHVudCh0aGlzLl9jYWNoZU1hbmFnZXIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNldHRpbmdzLmhvbGRGZXN0aXZhbHMuZW5hYmxlZCkge1xuICAgICAgdGhpcy5hdXRvRmVzdGl2YWwodGhpcy5fY2FjaGVNYW5hZ2VyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5lbGVjdExlYWRlci5lbmFibGVkKSB7XG4gICAgICB0aGlzLmF1dG9FbGVjdCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnByb21vdGVMZWFkZXIuZW5hYmxlZCkge1xuICAgICAgdGhpcy5hdXRvUHJvbW90ZUxlYWRlcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnByb21vdGVLaXR0ZW5zLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuYXV0b1Byb21vdGVLaXR0ZW5zKCk7XG4gICAgfVxuICB9XG5cbiAgYXV0b0Rpc3RyaWJ1dGVLaXR0ZW5zKCkge1xuICAgIGNvbnN0IGZyZWVLaXR0ZW5zID0gdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuZ2V0RnJlZUtpdHRlbnMoKTtcbiAgICBpZiAoIWZyZWVLaXR0ZW5zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgYXNzaWduZWRLaXR0ZW4gPSAwOyBhc3NpZ25lZEtpdHRlbiA8IGZyZWVLaXR0ZW5zOyArK2Fzc2lnbmVkS2l0dGVuKSB7XG4gICAgICAvLyBGaW5kIGFsbCBqb2JzIHdoZXJlIHdlIGhhdmVuJ3QgYXNzaWduZWQgdGhlIG1heGltdW0gZGVzaXJlZCBraXR0ZW5zIHlldC5cbiAgICAgIGNvbnN0IGpvYnNOb3RDYXBwZWQgPSBuZXcgQXJyYXk8eyBqb2I6IFVuc2FmZUpvYjsgY291bnQ6IG51bWJlcjsgdG9DYXA6IG51bWJlciB9PigpO1xuICAgICAgZm9yIChjb25zdCBqb2Igb2YgdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2Uuam9icykge1xuICAgICAgICAvLyBTa2lwIGRpc2FibGVkIGpvYnMgYW5kIHRob3NlIHRoYXQgaGF2ZW4ndCBiZWVuIHVubG9ja2VkO1xuICAgICAgICBjb25zdCBlbmFibGVkID0gdGhpcy5zZXR0aW5ncy5qb2JzW2pvYi5uYW1lXS5lbmFibGVkO1xuICAgICAgICBjb25zdCB1bmxvY2tlZCA9IGpvYi51bmxvY2tlZDtcbiAgICAgICAgaWYgKCFlbmFibGVkIHx8ICF1bmxvY2tlZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF4S2l0dGVuc0luSm9iID0gdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuZ2V0Sm9iTGltaXQoam9iLm5hbWUpO1xuICAgICAgICBjb25zdCBtYXhLaXR0ZW5zVG9Bc3NpZ24gPSBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodGhpcy5zZXR0aW5ncy5qb2JzW2pvYi5uYW1lXS5tYXgpO1xuICAgICAgICBjb25zdCBraXR0ZW5zSW5Kb2IgPSBqb2IudmFsdWU7XG4gICAgICAgIGlmIChraXR0ZW5zSW5Kb2IgPCBtYXhLaXR0ZW5zSW5Kb2IgJiYga2l0dGVuc0luSm9iIDwgbWF4S2l0dGVuc1RvQXNzaWduKSB7XG4gICAgICAgICAgam9ic05vdENhcHBlZC5wdXNoKHsgY291bnQ6IGtpdHRlbnNJbkpvYiwgam9iLCB0b0NhcDogbWF4S2l0dGVuc0luSm9iIC0ga2l0dGVuc0luSm9iIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgham9ic05vdENhcHBlZC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB3ZSBfY291bGRfIGFzc2lnbiBmYXJtZXJzIF9hbmRfIGN1cnJlbnRseSBkb24ndCBoYXZlIGFueSBhc3NpZ25lZC5cbiAgICAgIC8vIFRoZSBpZGVhIGhlcmUgaXMsIGRvbid0IGFzc2lnbiBhbnkga2l0dGVucyBpbnRvIGpvYnMgd2l0aG91dCBoYXZpbmcgZmlsbGVkXG4gICAgICAvLyB0aGF0IHNpbmdsZSBvcGVuIGZhcm1lciBwb3NpdGlvbiBmaXJzdC4gVGhpcyBtaWdodCBwcmV2ZW50IGtpdHRlbiBkZWF0aCBpblxuICAgICAgLy8gY2VydGFpbiBzY2VuYXJpb3MuXG4gICAgICBjb25zdCBub0Zhcm1lcnNBc3NpZ25lZCA9ICFpc05pbChcbiAgICAgICAgam9ic05vdENhcHBlZC5maW5kKGpvYiA9PiBqb2Iuam9iLm5hbWUgPT09IFwiZmFybWVyXCIgJiYgam9iLmNvdW50ID09PSAwKSxcbiAgICAgICk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIGpvYiB3aXRoIHRoZSBsZWFzdCBraXR0ZW5zIGFzc2lnbmVkIGFuZCBhc3NpZ24gYSBraXR0ZW4gdG8gdGhhdCBqb2IuXG4gICAgICBqb2JzTm90Q2FwcGVkLnNvcnQoKGEsIGIpID0+IGEuY291bnQgLSBiLmNvdW50KTtcbiAgICAgIGNvbnN0IGpvYk5hbWUgPSBub0Zhcm1lcnNBc3NpZ25lZCA/IFwiZmFybWVyXCIgOiBqb2JzTm90Q2FwcGVkWzBdLmpvYi5uYW1lO1xuXG4gICAgICB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5hc3NpZ25Kb2IodGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuZ2V0Sm9iKGpvYk5hbWUpLCAxKTtcbiAgICAgIHRoaXMubWFuYWdlci5yZW5kZXIoKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgXCJhY3QuZGlzdHJpYnV0ZVwiLFxuICAgICAgICBbdGhpcy5faG9zdC5lbmdpbmUuaTE4bihgJHZpbGxhZ2Uuam9iLiR7am9iTmFtZX1gIGFzIGNvbnN0KV0sXG4gICAgICAgIFwia3MtZGlzdHJpYnV0ZVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFwiZGlzdHJpYnV0ZVwiLCBmcmVlS2l0dGVucyk7XG4gIH1cblxuICBhdXRvRWxlY3QoKTogdm9pZCB7XG4gICAgLy8gV2UgY2FuJ3QgYXNzaWduIGEgbGVhZGVyIGluIHRoZSBBbmFyY2h5IGNoYWxsZW5nZS5cbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLmNoYWxsZW5nZXMuaXNBY3RpdmUoXCJhbmFyY2h5XCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2l0dGVucyA9IHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnNpbS5raXR0ZW5zO1xuICAgIGNvbnN0IGxlYWRlciA9IHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLmxlYWRlcjtcbiAgICBjb25zdCBqb2IgPSB0aGlzLnNldHRpbmdzLmVsZWN0TGVhZGVyLmpvYi5zZWxlY3RlZDtcbiAgICBjb25zdCB0cmFpdCA9IHRoaXMuc2V0dGluZ3MuZWxlY3RMZWFkZXIudHJhaXQuc2VsZWN0ZWQ7XG5cbiAgICBjb25zdCBsZWFkZXJDYW5kaWRhdGVzID0ga2l0dGVucy5maWx0ZXIoXG4gICAgICBraXR0ZW4gPT4gKGtpdHRlbi5qb2IgPT09IGpvYiB8fCBqb2IgPT09IFwiYW55XCIpICYmIGtpdHRlbi50cmFpdC5uYW1lID09PSB0cmFpdCxcbiAgICApO1xuXG4gICAgaWYgKGxlYWRlckNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGVhZGVyQ2FuZGlkYXRlcy5zb3J0KChhLCBiKSA9PiBiLnJhbmsgLSBhLnJhbmspO1xuICAgIGNvbnN0IGJlc3RMZWFkZXIgPSBsZWFkZXJDYW5kaWRhdGVzWzBdO1xuICAgIGlmICghaXNOaWwobGVhZGVyKSkge1xuICAgICAgaWYgKFxuICAgICAgICBsZWFkZXIudHJhaXQubmFtZSA9PT0gdHJhaXQgJiZcbiAgICAgICAgKGxlYWRlci5qb2IgPT09IGpvYiB8fCBqb2IgPT09IFwiYW55XCIpICYmXG4gICAgICAgIGJlc3RMZWFkZXIucmFuayA8PSBsZWFkZXIucmFua1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5tYWtlTGVhZGVyKGJlc3RMZWFkZXIpO1xuICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5lbGVjdFwiKTtcbiAgfVxuXG4gIGF1dG9Qcm9tb3RlS2l0dGVucygpOiB2b2lkIHtcbiAgICBjb25zdCBnb2xkID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKFwiZ29sZFwiKTtcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5wcm9tb3RlS2l0dGVucy50cmlnZ2VyIDwgZ29sZC52YWx1ZSAvIGdvbGQubWF4VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKFxuICAgICAgbGV0IGtpdHRlbkluZGV4ID0gMDtcbiAgICAgIGtpdHRlbkluZGV4IDwgdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2Uuc2ltLmtpdHRlbnMubGVuZ3RoO1xuICAgICAga2l0dGVuSW5kZXgrK1xuICAgICkge1xuICAgICAgbGV0IHRpZXIgPSAtMTtcbiAgICAgIGNvbnN0IGVuZ2luZWVyU3BlY2lhbGl0eSA9XG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnNpbS5raXR0ZW5zW2tpdHRlbkluZGV4XS5lbmdpbmVlclNwZWNpYWxpdHk7XG4gICAgICAvLyBJZiB0aGlzIGtpdHRlbiBoYXMgbm8gZW5naW5lZXIgc3BlY2lhbHR5LCBza2lwIGl0LlxuICAgICAgaWYgKGlzTmlsKGVuZ2luZWVyU3BlY2lhbGl0eSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHdoaWNoIHJhbmsgd291bGQgYmUgaWRlYWwgZm9yIHRoZWlyIGNyYWZ0LlxuICAgICAgdGllciA9IG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUud29ya3Nob3AuZ2V0Q3JhZnQoZW5naW5lZXJTcGVjaWFsaXR5KSkudGllcjtcbiAgICAgIC8vIElmIHRoZSByYW5rIGhhcyBhbHJlYWR5IGJlZW4gcmVhY2hlZCwgY2hlY2sgbmV4dCBraXR0ZW4uXG4gICAgICBpZiAodGllciA8PSB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5zaW0ua2l0dGVuc1traXR0ZW5JbmRleF0ucmFuaykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBhbiBlbmdpbmVlciB0aGF0IGlzbid0IGF0IHRoZWlyIGlkZWFsIHJhbmsuXG4gICAgICAvLyBObyBuZWVkIHRvIGxvb2sgZnVydGhlci5cbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnByb21vdGVLaXR0ZW5zKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgYXV0b1Byb21vdGVMZWFkZXIoKTogdm9pZCB7XG4gICAgLy8gSWYgd2UgaGF2ZSBDaXZpbCBTZXJ2aWNlIHVubG9ja2VkIGFuZCBhIGxlYWRlciBlbGVjdGVkLlxuICAgIGlmIChcbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS5zY2llbmNlLmdldChcImNpdmlsXCIpLnJlc2VhcmNoZWQgJiZcbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLmxlYWRlciAhPT0gbnVsbFxuICAgICkge1xuICAgICAgY29uc3QgbGVhZGVyID0gdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UubGVhZGVyO1xuICAgICAgY29uc3QgcmFuayA9IGxlYWRlci5yYW5rO1xuICAgICAgY29uc3QgZ29sZCA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShcImdvbGRcIik7XG4gICAgICBjb25zdCBnb2xkU3RvY2sgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0U3RvY2soXCJnb2xkXCIpO1xuXG4gICAgICAvLyB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5zaW0uZ29sZFRvUHJvbW90ZSB3aWxsIGNoZWNrIGdvbGRcbiAgICAgIC8vIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnNpbS5wcm9tb3RlIGNoZWNrIGJvdGggZ29sZCBhbmQgZXhwXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnNpbS5nb2xkVG9Qcm9tb3RlKHJhbmssIHJhbmsgKyAxLCBnb2xkLnZhbHVlIC0gZ29sZFN0b2NrKVswXSAmJlxuICAgICAgICB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5zaW0ucHJvbW90ZShsZWFkZXIsIHJhbmsgKyAxKSA9PT0gMVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5wcm9tb3RlXCIsIFtyYW5rICsgMV0sIFwia3MtcHJvbW90ZVwiKTtcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2VUYWIuY2Vuc3VzUGFuZWw/LmNlbnN1cy5yZW5kZXJHb3Zlcm5tZW50KFxuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlVGFiLmNlbnN1c1BhbmVsLmNlbnN1cy5jb250YWluZXIsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlVGFiLmNlbnN1c1BhbmVsPy5jZW5zdXMudXBkYXRlKCk7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShcInByb21vdGVcIiwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXV0b0h1bnQoY2FjaGVNYW5hZ2VyPzogTWF0ZXJpYWxzQ2FjaGUpIHtcbiAgICBjb25zdCBtYW5wb3dlciA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShcIm1hbnBvd2VyXCIpO1xuICAgIGNvbnN0IHRyaWdnZXIgPSB0aGlzLnNldHRpbmdzLmh1bnQudHJpZ2dlcjtcblxuICAgIGlmIChtYW5wb3dlci52YWx1ZSA8IDEwMCB8fCB0aGlzLl9ob3N0LmdhbWUuY2hhbGxlbmdlcy5pc0FjdGl2ZShcInBhY2lmaXNtXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXIgPD0gbWFucG93ZXIudmFsdWUgLyBtYW5wb3dlci5tYXhWYWx1ZSAmJiAxMDAgPD0gbWFucG93ZXIudmFsdWUpIHtcbiAgICAgIC8vIERldGVybWluZSBob3cgbWFueSBodW50cyBhcmUgYmVpbmcgcGVyZm9ybWVkLlxuICAgICAgY29uc3QgaHVudENvdW50ID0gTWF0aC5mbG9vcihtYW5wb3dlci52YWx1ZSAvIDEwMCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJodW50XCIsIGh1bnRDb3VudCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJhY3QuaHVudFwiLCBbdGhpcy5faG9zdC5yZW5kZXJBYnNvbHV0ZShodW50Q291bnQpXSwgXCJrcy1odW50XCIpO1xuXG4gICAgICBjb25zdCBhdmVyYWdlT3V0cHV0ID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldEF2ZXJhZ2VIdW50KCk7XG4gICAgICBjb25zdCB0cnVlT3V0cHV0OiBQYXJ0aWFsPFJlY29yZDxSZXNvdXJjZSwgbnVtYmVyPj4gPSB7fTtcblxuICAgICAgZm9yIChjb25zdCBbb3V0LCBvdXRWYWx1ZV0gb2Ygb2JqZWN0RW50cmllcyhhdmVyYWdlT3V0cHV0KSkge1xuICAgICAgICBjb25zdCByZXMgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2Uob3V0KTtcbiAgICAgICAgdHJ1ZU91dHB1dFtvdXRdID1cbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgY2FwcGVkIHJlc291cmNlLi4uXG4gICAgICAgICAgMCA8IHJlcy5tYXhWYWx1ZVxuICAgICAgICAgICAgPyAvLyBtdWx0aXBseSB0aGUgYW1vdW50IG9mIHRpbWVzIHdlIGh1bnRlZCB3aXRoIHRoZSByZXN1bHQgb2YgYW4gYXZlcmFnZSBodW50LlxuICAgICAgICAgICAgICAvLyBDYXBwaW5nIGF0IHRoZSBtYXggdmFsdWUgYW5kIDAgYm91bmRzLlxuICAgICAgICAgICAgICBNYXRoLm1pbihvdXRWYWx1ZSAqIGh1bnRDb3VudCwgTWF0aC5tYXgocmVzLm1heFZhbHVlIC0gcmVzLnZhbHVlLCAwKSlcbiAgICAgICAgICAgIDogLy8gT3RoZXJ3aXNlLCBqdXN0IG11bHRpcGx5IHVuYm91bmRlZFxuICAgICAgICAgICAgICBvdXRWYWx1ZSAqIGh1bnRDb3VudDtcbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUgdGhlIGh1bnRlZCByZXNvdXJjZXMgaW4gdGhlIGNhY2hlLiBXaHk/IE5vIGlkZWEuXG4gICAgICBpZiAoIWlzTmlsKGNhY2hlTWFuYWdlcikpIHtcbiAgICAgICAgY2FjaGVNYW5hZ2VyLnB1c2hUb0NhY2hlKHtcbiAgICAgICAgICBtYXRlcmlhbHM6IHRydWVPdXRwdXQsXG4gICAgICAgICAgdGltZVN0YW1wOiB0aGlzLl9ob3N0LmdhbWUudGltZXIudGlja3NUb3RhbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdyBhY3R1YWxseSBwZXJmb3JtIHRoZSBodW50cy5cbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLmh1bnRBbGwoKTtcbiAgICB9XG4gIH1cblxuICBhdXRvRmVzdGl2YWwoY2FjaGVNYW5hZ2VyPzogTWF0ZXJpYWxzQ2FjaGUpIHtcbiAgICAvLyBJZiB3ZSBoYXZlbid0IHJlc2VhcmNoZWQgZmVzdGl2YWxzIHlldCwgb3Igc3RpbGwgaGF2ZSBtb3JlIHRoYW4gNDAwIGRheXMgbGVmdCBvbiBvbmUsXG4gICAgLy8gZG9uJ3QgaG9sZCAoYW5vdGhlcikgb25lLlxuICAgIGlmIChcbiAgICAgICF0aGlzLl9ob3N0LmdhbWUuc2NpZW5jZS5nZXQoXCJkcmFtYVwiKS5yZXNlYXJjaGVkIHx8XG4gICAgICA0MDAgPCB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZmVzdGl2YWxEYXlzXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBzdGFja2VkIGZlc3RpdmFscyByZXNlYXJjaGVkIHlldCwgYW5kIHdlIHN0aWxsIGhhdmUgZGF5cyBsZWZ0IG9uIG9uZSxcbiAgICAvLyBkb24ndCBob2xkIG9uZS5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5faG9zdC5nYW1lLnByZXN0aWdlLmdldFBlcmsoXCJjYXJuaXZhbHNcIikucmVzZWFyY2hlZCAmJlxuICAgICAgMCA8IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5mZXN0aXZhbERheXNcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBjYW4gYWZmb3JkIGEgZmVzdGl2YWwuXG4gICAgY29uc3QgY3JhZnRNYW5hZ2VyID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyO1xuICAgIGlmIChcbiAgICAgIGNyYWZ0TWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcIm1hbnBvd2VyXCIpIDwgMTUwMCB8fFxuICAgICAgY3JhZnRNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKFwiY3VsdHVyZVwiKSA8IDUwMDAgfHxcbiAgICAgIGNyYWZ0TWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcInBhcmNobWVudFwiKSA8IDI1MDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZmVzdGl2YWwgd291bGQgZXZlbiBiZSBwcm9maXRhYmxlIGZvciBhbnkgcmVzb3VyY2UgcHJvZHVjdGlvbi5cbiAgICBjb25zdCBjYXRwb3dQcm9maXRhYmxlID1cbiAgICAgIDQwMDAgKlxuICAgICAgICAoY3JhZnRNYW5hZ2VyLmdldFRpY2tWYWwoXG4gICAgICAgICAgY3JhZnRNYW5hZ2VyLmdldFJlc291cmNlKFwibWFucG93ZXJcIiksXG4gICAgICAgICAgY2FjaGVNYW5hZ2VyLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICkgYXMgbnVtYmVyKSA+XG4gICAgICAxNTAwO1xuICAgIGNvbnN0IGN1bHR1cmVQcm9maXRhYmxlID1cbiAgICAgIDQwMDAgKlxuICAgICAgICAoY3JhZnRNYW5hZ2VyLmdldFRpY2tWYWwoXG4gICAgICAgICAgY3JhZnRNYW5hZ2VyLmdldFJlc291cmNlKFwiY3VsdHVyZVwiKSxcbiAgICAgICAgICBjYWNoZU1hbmFnZXIsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKSBhcyBudW1iZXIpID5cbiAgICAgIDUwMDA7XG4gICAgY29uc3QgcGFyY2hQcm9maXRhYmxlID1cbiAgICAgIDQwMDAgKlxuICAgICAgICAoY3JhZnRNYW5hZ2VyLmdldFRpY2tWYWwoXG4gICAgICAgICAgY3JhZnRNYW5hZ2VyLmdldFJlc291cmNlKFwicGFyY2htZW50XCIpLFxuICAgICAgICAgIGNhY2hlTWFuYWdlcixcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApIGFzIG51bWJlcikgPlxuICAgICAgMjUwMDtcblxuICAgIGlmICghY2F0cG93UHJvZml0YWJsZSAmJiAhY3VsdHVyZVByb2ZpdGFibGUgJiYgIXBhcmNoUHJvZml0YWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciB0aGUgdGFiIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidXR0b25zIGFjdHVhbGx5IGV4aXN0IGluIHRoZSBET00uIE90aGVyd2lzZSB3ZSBjYW4ndCBjbGljayB0aGVtLlxuICAgIHRoaXMubWFuYWdlci5yZW5kZXIoKTtcblxuICAgIC8vIE5vdyB3ZSBob2xkIHRoZSBmZXN0aXZhbC5cbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLnZpbGxhZ2VUYWIuZmVzdGl2YWxCdG4ubW9kZWwuZW5hYmxlZCkge1xuICAgICAgY29uc3QgYmVmb3JlRGF5cyA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5mZXN0aXZhbERheXM7XG4gICAgICB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZVRhYi5mZXN0aXZhbEJ0bi5vbkNsaWNrKCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJmZXN0aXZhbFwiKTtcbiAgICAgIGlmIChiZWZvcmVEYXlzID4gMCkge1xuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJmZXN0aXZhbC5leHRlbmRcIiwgW10sIFwia3MtZmVzdGl2YWxcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJmZXN0aXZhbC5ob2xkXCIsIFtdLCBcImtzLWZlc3RpdmFsXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUsIG11c3RFeGlzdCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IHVua25vd25Ub0Vycm9yIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvZXJyb3Itc2VyaWFsaXplci5qc1wiO1xuaW1wb3J0IHsgbWVhc3VyZSwgbWVhc3VyZUFzeW5jIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9tZWFzdXJlbWVudC9wZXJmb3JtYW5jZS5qc1wiO1xuaW1wb3J0IHsgQm9uZmlyZU1hbmFnZXIgfSBmcm9tIFwiLi9Cb25maXJlTWFuYWdlci5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBBY3Rpdml0eUNsYXNzLFxuICBBY3Rpdml0eVN1bW1hcnksXG4gIHR5cGUgQWN0aXZpdHlTdW1tYXJ5U2VjdGlvbixcbiAgdHlwZSBBY3Rpdml0eVR5cGVDbGFzcyxcbn0gZnJvbSBcIi4vaGVscGVyL0FjdGl2aXR5U3VtbWFyeS5qc1wiO1xuaW1wb3J0IGVuVVMgZnJvbSBcIi4vaTE4bi9lbi1VUy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgZGVERSBmcm9tIFwiLi9pMThuL3RyYW5zbGF0aW9ucy9kZS1ERS5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgaGVJTCBmcm9tIFwiLi9pMThuL3RyYW5zbGF0aW9ucy9oZS1JTC5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgemhDTiBmcm9tIFwiLi9pMThuL3RyYW5zbGF0aW9ucy96aC1DTi5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgeyB0eXBlIEtpdHRlblNjaWVudGlzdHMsIGtzVmVyc2lvbiB9IGZyb20gXCIuL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB7IFJlbGlnaW9uTWFuYWdlciB9IGZyb20gXCIuL1JlbGlnaW9uTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgU2NpZW5jZU1hbmFnZXIgfSBmcm9tIFwiLi9TY2llbmNlTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgU3BhY2VNYW5hZ2VyIH0gZnJvbSBcIi4vU3BhY2VNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBCb25maXJlU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9Cb25maXJlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IEVuZ2luZVNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvRW5naW5lU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFJlbGlnaW9uU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9SZWxpZ2lvblNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBTY2llbmNlU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9TY2llbmNlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFNwYWNlU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9TcGFjZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUaW1lQ29udHJvbFNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvVGltZUNvbnRyb2xTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVGltZVNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvVGltZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUcmFkZVNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvVHJhZGVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVmlsbGFnZVNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvVmlsbGFnZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBXb3Jrc2hvcFNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvV29ya3Nob3BTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVGltZUNvbnRyb2xNYW5hZ2VyIH0gZnJvbSBcIi4vVGltZUNvbnRyb2xNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBUaW1lTWFuYWdlciB9IGZyb20gXCIuL1RpbWVNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBUcmFkZU1hbmFnZXIgfSBmcm9tIFwiLi9UcmFkZU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgeyB0eXBlIEN5Y2xlLCBDeWNsZXMsIHR5cGUgTG9jYWxlLCB0eXBlIFBsYW5ldCB9IGZyb20gXCIuL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBGYWxsYmFja0xvY2FsZSwgVXNlclNjcmlwdExvYWRlciB9IGZyb20gXCIuL1VzZXJTY3JpcHRMb2FkZXIuanNcIjtcbmltcG9ydCB7IFZpbGxhZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vVmlsbGFnZU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IFdvcmtzaG9wTWFuYWdlciB9IGZyb20gXCIuL1dvcmtzaG9wTWFuYWdlci5qc1wiO1xuXG5jb25zdCBpMThuRGF0YSA9IHsgXCJkZS1ERVwiOiBkZURFLCBcImVuLVVTXCI6IGVuVVMsIFwiaGUtSUxcIjogaGVJTCwgXCJ6aC1DTlwiOiB6aENOIH07XG5cbmV4cG9ydCB0eXBlIEZyYW1lQ29udGV4dCA9IHtcbiAgcmVxdWVzdEdhbWVVaVJlZnJlc2g6IGJvb2xlYW47XG5cbiAgZW50cnk6IG51bWJlcjtcbiAgZXhpdDogbnVtYmVyO1xuICBtZWFzdXJlbWVudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHVuZGVmaW5lZD47XG59O1xuZXhwb3J0IHR5cGUgQXV0b21hdGlvbiA9IHtcbiAgdGljayhjb250ZXh0OiBGcmFtZUNvbnRleHQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbn07XG5leHBvcnQgdHlwZSBFbmdpbmVTdGF0ZSA9IHtcbiAgdjogc3RyaW5nO1xuICBlbmdpbmU6IEVuZ2luZVNldHRpbmdzO1xuICBib25maXJlOiBCb25maXJlU2V0dGluZ3M7XG4gIHJlbGlnaW9uOiBSZWxpZ2lvblNldHRpbmdzO1xuICBzY2llbmNlOiBTY2llbmNlU2V0dGluZ3M7XG4gIHNwYWNlOiBTcGFjZVNldHRpbmdzO1xuICB0aW1lQ29udHJvbDogVGltZUNvbnRyb2xTZXR0aW5ncztcbiAgdGltZTogVGltZVNldHRpbmdzO1xuICB0cmFkZTogVHJhZGVTZXR0aW5ncztcbiAgdmlsbGFnZTogVmlsbGFnZVNldHRpbmdzO1xuICB3b3Jrc2hvcDogV29ya3Nob3BTZXR0aW5ncztcbn07XG5cbmV4cG9ydCB0eXBlIFN1cHBvcnRlZExvY2FsZSA9IFwiZGUtREVcIiB8IFwiZW4tVVNcIiB8IFwiaGUtSUxcIiB8IFwiemgtQ05cIjtcblxuZXhwb3J0IHR5cGUgVHJhbnNsYXRlZFN0cmluZzxUS2l0dGVuR2FtZUxpdGVyYWwgZXh0ZW5kcyBgJCR7c3RyaW5nfWA+ID1cbiAgfCBrZXlvZiAodHlwZW9mIGkxOG5EYXRhKVtcImVuLVVTXCJdXG4gIHwgVEtpdHRlbkdhbWVMaXRlcmFsO1xuXG5leHBvcnQgY2xhc3MgRW5naW5lIHtcbiAgLyoqXG4gICAqIEFsbCBpMThuIGxpdGVyYWxzIG9mIHRoZSB1c2Vyc2NyaXB0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaTE4bkRhdGE6IHR5cGVvZiBpMThuRGF0YTtcblxuICAvKipcbiAgICogV2FzIGFueSBzdGF0ZSBsb2FkZWQgaW50byB0aGlzIGVuZ2luZSBhdCBhbnkgcG9pbnQgaW4gdGltZT9cbiAgICovXG4gIHByaXZhdGUgX2lzTG9hZGVkID0gZmFsc2U7XG5cbiAgZ2V0IGlzTG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0xvYWRlZDtcbiAgfVxuXG4gIHJlYWRvbmx5IF9ob3N0OiBLaXR0ZW5TY2llbnRpc3RzO1xuICByZWFkb25seSBzZXR0aW5nczogRW5naW5lU2V0dGluZ3M7XG4gIHJlYWRvbmx5IGJvbmZpcmVNYW5hZ2VyOiBCb25maXJlTWFuYWdlcjtcbiAgcmVhZG9ubHkgcmVsaWdpb25NYW5hZ2VyOiBSZWxpZ2lvbk1hbmFnZXI7XG4gIHJlYWRvbmx5IHNjaWVuY2VNYW5hZ2VyOiBTY2llbmNlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc3BhY2VNYW5hZ2VyOiBTcGFjZU1hbmFnZXI7XG4gIHJlYWRvbmx5IHRpbWVDb250cm9sTWFuYWdlcjogVGltZUNvbnRyb2xNYW5hZ2VyO1xuICByZWFkb25seSB0aW1lTWFuYWdlcjogVGltZU1hbmFnZXI7XG4gIHJlYWRvbmx5IHRyYWRlTWFuYWdlcjogVHJhZGVNYW5hZ2VyO1xuICByZWFkb25seSB2aWxsYWdlTWFuYWdlcjogVmlsbGFnZU1hbmFnZXI7XG4gIHJlYWRvbmx5IHdvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyO1xuXG4gIHByaXZhdGUgX2FjdGl2aXR5U3VtbWFyeTogQWN0aXZpdHlTdW1tYXJ5O1xuICBwcml2YXRlIF90aW1lb3V0TWFpbkxvb3A6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihob3N0OiBLaXR0ZW5TY2llbnRpc3RzLCBnYW1lTGFuZ3VhZ2U6IExvY2FsZSkge1xuICAgIHRoaXMuc2V0dGluZ3MgPSBuZXcgRW5naW5lU2V0dGluZ3MoKTtcblxuICAgIHRoaXMuX2kxOG5EYXRhID0gaTE4bkRhdGE7XG4gICAgdGhpcy5zZXRMYW5ndWFnZShnYW1lTGFuZ3VhZ2UsIGZhbHNlKTtcblxuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgIHRoaXMuX2FjdGl2aXR5U3VtbWFyeSA9IG5ldyBBY3Rpdml0eVN1bW1hcnkodGhpcy5faG9zdCk7XG5cbiAgICB0aGlzLndvcmtzaG9wTWFuYWdlciA9IG5ldyBXb3Jrc2hvcE1hbmFnZXIodGhpcy5faG9zdCk7XG5cbiAgICB0aGlzLmJvbmZpcmVNYW5hZ2VyID0gbmV3IEJvbmZpcmVNYW5hZ2VyKHRoaXMuX2hvc3QsIHRoaXMud29ya3Nob3BNYW5hZ2VyKTtcbiAgICB0aGlzLnJlbGlnaW9uTWFuYWdlciA9IG5ldyBSZWxpZ2lvbk1hbmFnZXIoXG4gICAgICB0aGlzLl9ob3N0LFxuICAgICAgdGhpcy5ib25maXJlTWFuYWdlcixcbiAgICAgIHRoaXMud29ya3Nob3BNYW5hZ2VyLFxuICAgICk7XG4gICAgdGhpcy5zY2llbmNlTWFuYWdlciA9IG5ldyBTY2llbmNlTWFuYWdlcih0aGlzLl9ob3N0LCB0aGlzLndvcmtzaG9wTWFuYWdlcik7XG4gICAgdGhpcy5zcGFjZU1hbmFnZXIgPSBuZXcgU3BhY2VNYW5hZ2VyKHRoaXMuX2hvc3QsIHRoaXMud29ya3Nob3BNYW5hZ2VyKTtcbiAgICB0aGlzLnRpbWVDb250cm9sTWFuYWdlciA9IG5ldyBUaW1lQ29udHJvbE1hbmFnZXIoXG4gICAgICB0aGlzLl9ob3N0LFxuICAgICAgdGhpcy5ib25maXJlTWFuYWdlcixcbiAgICAgIHRoaXMucmVsaWdpb25NYW5hZ2VyLFxuICAgICAgdGhpcy5zcGFjZU1hbmFnZXIsXG4gICAgICB0aGlzLndvcmtzaG9wTWFuYWdlcixcbiAgICApO1xuICAgIHRoaXMudGltZU1hbmFnZXIgPSBuZXcgVGltZU1hbmFnZXIodGhpcy5faG9zdCwgdGhpcy53b3Jrc2hvcE1hbmFnZXIpO1xuICAgIHRoaXMudHJhZGVNYW5hZ2VyID0gbmV3IFRyYWRlTWFuYWdlcih0aGlzLl9ob3N0LCB0aGlzLndvcmtzaG9wTWFuYWdlcik7XG4gICAgdGhpcy52aWxsYWdlTWFuYWdlciA9IG5ldyBWaWxsYWdlTWFuYWdlcih0aGlzLl9ob3N0LCB0aGlzLndvcmtzaG9wTWFuYWdlcik7XG4gIH1cblxuICBpc0xhbmd1YWdlU3VwcG9ydGVkKGxhbmd1YWdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5faTE4bkRhdGEpLnNvbWUobG9jYWxlID0+IGxvY2FsZS5zdGFydHNXaXRoKGAke2xhbmd1YWdlfS1gKSk7XG4gIH1cblxuICBpc0xvY2FsZVN1cHBvcnRlZChsb2NhbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsb2NhbGUgaW4gdGhpcy5faTE4bkRhdGE7XG4gIH1cblxuICBsb2NhbGVTdXBwb3J0c0ZpcnN0TGV0dGVyU3BsaXRzKGxvY2FsZSA9IHRoaXMuc2V0dGluZ3MubG9jYWxlLnNlbGVjdGVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGxvY2FsZSAhPT0gXCJ6aC1DTlwiO1xuICB9XG5cbiAgbG9jYWxlRm9yTGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyk6IFN1cHBvcnRlZExvY2FsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIChPYmplY3Qua2V5cyh0aGlzLl9pMThuRGF0YSkgYXMgUmVhZG9ubHlBcnJheTxTdXBwb3J0ZWRMb2NhbGU+KS5maW5kKGxvY2FsZSA9PlxuICAgICAgbG9jYWxlLnN0YXJ0c1dpdGgoYCR7bGFuZ3VhZ2V9LWApLFxuICAgICk7XG4gIH1cblxuICBzZXRMYW5ndWFnZShsYW5ndWFnZTogTG9jYWxlLCByZWJ1aWxkVUkgPSB0cnVlKSB7XG4gICAgY29uc3QgcHJldmlvdXNMb2NhbGUgPSB0aGlzLnNldHRpbmdzLmxvY2FsZS5zZWxlY3RlZDtcbiAgICBpZiAoIXRoaXMuaXNMYW5ndWFnZVN1cHBvcnRlZChsYW5ndWFnZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgLi4uY2woXG4gICAgICAgICAgYFJlcXVlc3RlZCBsYW5ndWFnZSAnJHtsYW5ndWFnZX0nIGlzIG5vdCBhdmFpbGFibGUuIEZhbGxpbmcgYmFjayB0byAnJHtGYWxsYmFja0xvY2FsZX0nLmAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgdGhpcy5zZXR0aW5ncy5sb2NhbGUuc2VsZWN0ZWQgPSBGYWxsYmFja0xvY2FsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbG9jYWxlID0gbXVzdEV4aXN0KHRoaXMubG9jYWxlRm9yTGFuZ3VhZ2UobGFuZ3VhZ2UpKTtcbiAgICAgIGNvbnNvbGUuaW5mbyguLi5jbChgU2VsZWN0aW5nIGxhbmd1YWdlICcke2xvY2FsZX0nLmApKTtcbiAgICAgIHRoaXMuc2V0dGluZ3MubG9jYWxlLnNlbGVjdGVkID0gbG9jYWxlO1xuICAgIH1cblxuICAgIGlmIChwcmV2aW91c0xvY2FsZSAhPT0gdGhpcy5zZXR0aW5ncy5sb2NhbGUuc2VsZWN0ZWQgJiYgcmVidWlsZFVJKSB7XG4gICAgICB0aGlzLl9ob3N0LnJlYnVpbGRVaSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldExvY2FsZShsb2NhbGU6IFN1cHBvcnRlZExvY2FsZSwgcmVidWlsZFVJID0gdHJ1ZSkge1xuICAgIGNvbnN0IHByZXZpb3VzTG9jYWxlID0gdGhpcy5zZXR0aW5ncy5sb2NhbGUuc2VsZWN0ZWQ7XG4gICAgaWYgKCF0aGlzLmlzTG9jYWxlU3VwcG9ydGVkKGxvY2FsZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgLi4uY2woXG4gICAgICAgICAgYFJlcXVlc3RlZCBsYW5ndWFnZSAnJHtsb2NhbGV9JyBpcyBub3QgYXZhaWxhYmxlLiBGYWxsaW5nIGJhY2sgdG8gJyR7RmFsbGJhY2tMb2NhbGV9Jy5gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHRoaXMuc2V0dGluZ3MubG9jYWxlLnNlbGVjdGVkID0gRmFsbGJhY2tMb2NhbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuaW5mbyguLi5jbChgU2VsZWN0aW5nIGxhbmd1YWdlICcke2xvY2FsZX0nLmApKTtcbiAgICAgIHRoaXMuc2V0dGluZ3MubG9jYWxlLnNlbGVjdGVkID0gbG9jYWxlO1xuICAgIH1cblxuICAgIGlmIChwcmV2aW91c0xvY2FsZSAhPT0gdGhpcy5zZXR0aW5ncy5sb2NhbGUuc2VsZWN0ZWQgJiYgcmVidWlsZFVJKSB7XG4gICAgICB0aGlzLl9ob3N0LnJlYnVpbGRVaSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIG5ldyBzdGF0ZSBpbnRvIHRoZSBlbmdpbmUuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgZW5naW5lIHN0YXRlIHRvIGxvYWQuXG4gICAqIEBwYXJhbSByZXRhaW5NZXRhQmVoYXZpb3IgV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgZW5naW5lIHdpbGwgbm90IGJlIHN0b3BwZWQgb3Igc3RhcnRlZCwgaWYgdGhlIGVuZ2luZVxuICAgKiBzdGF0ZSB3b3VsZCByZXF1aXJlIHRoYXQuIFRoZSBzZXR0aW5ncyBmb3Igc3RhdGUgbWFuYWdlbWVudCBhcmUgYWxzbyBub3QgbG9hZGVkIGZyb20gdGhlIGVuZ2luZSBzdGF0ZS5cbiAgICogVGhpcyBpcyBpbnRlbmRlZCB0byBtYWtlIGxvYWRpbmcgb2YgcHJldmlvdXMgc2V0dGluZ3Mgc25hcHNob3RzIG1vcmUgaW50dWl0aXZlLlxuICAgKi9cbiAgc3RhdGVMb2FkKHNldHRpbmdzOiBFbmdpbmVTdGF0ZSwgcmV0YWluTWV0YUJlaGF2aW9yID0gZmFsc2UpIHtcbiAgICB0aGlzLl9pc0xvYWRlZCA9IHRydWU7XG5cbiAgICB0aGlzLnN0b3AoZmFsc2UpO1xuXG4gICAgLy8gRm9yIG5vdywgd2Ugb25seSBsb2cgYSB3YXJuaW5nIG9uIG1pc21hdGNoaW5nIHRhZ3MuXG4gICAgLy8gSWRlYWxseSwgd2Ugd291bGQgcGVyZm9ybSBzZW12ZXIgY29tcGFyaXNvbiwgYnV0IHRoYXQgaXNcbiAgICAvLyBleGNlc3NpdmUgYXQgdGhpcyBwb2ludCBpbiB0aW1lLiBUaGUgZ29hbCBzaG91bGQgYmUgYSBzdGFibGVcbiAgICAvLyBzdGF0ZSBpbXBvcnQgb2YgbW9zdCB2ZXJzaW9ucyBhbnl3YXkuXG4gICAgY29uc3QgdmVyc2lvbiA9IGtzVmVyc2lvbigpO1xuICAgIGlmIChzZXR0aW5ncy52ICE9PSB2ZXJzaW9uKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIC4uLmNsKFxuICAgICAgICAgIGBBdHRlbXB0aW5nIHRvIGxvYWQgZW5naW5lIHN0YXRlIHdpdGggdmVyc2lvbiB0YWcgJyR7c2V0dGluZ3Mudn0nIHdoZW4gZW5naW5lIGlzIGF0IHZlcnNpb24gJyR7dmVyc2lvbn0nIWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gdGhlIGxvYWQgb2YgZWFjaCBzdWIgc2V0dGluZ3Mgc2VjdGlvbiBpbiBhIHRyeS1jYXRjaCB0b1xuICAgIC8vIGFsbG93IHVzIHRvIHN0aWxsIGxvYWQgdGhlIG90aGVyIHNlY3Rpb25zIGlmIHRoZXJlIHdlcmUgc2NoZW1hXG4gICAgLy8gY2hhbmdlcy5cbiAgICBjb25zdCBhdHRlbXB0TG9hZCA9IChsb2FkZXI6ICgpID0+IHVua25vd24sIGVycm9yTWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2FkZXIoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uY2woYEZhaWxlZCBsb2FkIG9mICR7ZXJyb3JNZXNzYWdlfSBzZXR0aW5ncy5gLCBlcnJvcikpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBhdHRlbXB0TG9hZCgoKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzLmxvYWQoc2V0dGluZ3MuZW5naW5lLCByZXRhaW5NZXRhQmVoYXZpb3IpO1xuICAgIH0sIFwiZW5naW5lXCIpO1xuICAgIGF0dGVtcHRMb2FkKCgpID0+IHtcbiAgICAgIHRoaXMuYm9uZmlyZU1hbmFnZXIuc2V0dGluZ3MubG9hZChzZXR0aW5ncy5ib25maXJlKTtcbiAgICB9LCBcImJvbmZpcmVcIik7XG4gICAgYXR0ZW1wdExvYWQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWxpZ2lvbk1hbmFnZXIuc2V0dGluZ3MubG9hZChzZXR0aW5ncy5yZWxpZ2lvbik7XG4gICAgfSwgXCJyZWxpZ2lvblwiKTtcbiAgICBhdHRlbXB0TG9hZCgoKSA9PiB7XG4gICAgICB0aGlzLnNjaWVuY2VNYW5hZ2VyLnNldHRpbmdzLmxvYWQoc2V0dGluZ3Muc2NpZW5jZSk7XG4gICAgfSwgXCJzY2llbmNlXCIpO1xuICAgIGF0dGVtcHRMb2FkKCgpID0+IHtcbiAgICAgIHRoaXMuc3BhY2VNYW5hZ2VyLnNldHRpbmdzLmxvYWQoc2V0dGluZ3Muc3BhY2UpO1xuICAgIH0sIFwic3BhY2VcIik7XG4gICAgYXR0ZW1wdExvYWQoKCkgPT4ge1xuICAgICAgdGhpcy50aW1lQ29udHJvbE1hbmFnZXIuc2V0dGluZ3MubG9hZChzZXR0aW5ncy50aW1lQ29udHJvbCk7XG4gICAgfSwgXCJ0aW1lIGNvbnRyb2xcIik7XG4gICAgYXR0ZW1wdExvYWQoKCkgPT4ge1xuICAgICAgdGhpcy50aW1lTWFuYWdlci5zZXR0aW5ncy5sb2FkKHNldHRpbmdzLnRpbWUpO1xuICAgIH0sIFwidGltZVwiKTtcbiAgICBhdHRlbXB0TG9hZCgoKSA9PiB7XG4gICAgICB0aGlzLnRyYWRlTWFuYWdlci5zZXR0aW5ncy5sb2FkKHNldHRpbmdzLnRyYWRlKTtcbiAgICB9LCBcInRyYWRlXCIpO1xuICAgIGF0dGVtcHRMb2FkKCgpID0+IHtcbiAgICAgIHRoaXMudmlsbGFnZU1hbmFnZXIuc2V0dGluZ3MubG9hZChzZXR0aW5ncy52aWxsYWdlKTtcbiAgICB9LCBcInZpbGxhZ2VcIik7XG4gICAgYXR0ZW1wdExvYWQoKCkgPT4ge1xuICAgICAgdGhpcy53b3Jrc2hvcE1hbmFnZXIuc2V0dGluZ3MubG9hZChzZXR0aW5ncy53b3Jrc2hvcCk7XG4gICAgfSwgXCJ3b3Jrc2hvcFwiKTtcblxuICAgIHRoaXMuc2V0TG9jYWxlKHRoaXMuc2V0dGluZ3MubG9jYWxlLnNlbGVjdGVkKTtcblxuICAgIC8vIEVuc3VyZSB0aGUgbWFpbiBlbmdpbmUgc2V0dGluZyBpcyByZXNwZWN0ZWQuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgdGhpcy5zdGFydChmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBERUZBVUxUX1NUQVRFKCkge1xuICAgIHJldHVybiB7XG4gICAgICBib25maXJlOiBuZXcgQm9uZmlyZVNldHRpbmdzKCksXG4gICAgICBlbmdpbmU6IG5ldyBFbmdpbmVTZXR0aW5ncygpLFxuICAgICAgcmVsaWdpb246IG5ldyBSZWxpZ2lvblNldHRpbmdzKCksXG4gICAgICBzY2llbmNlOiBuZXcgU2NpZW5jZVNldHRpbmdzKCksXG4gICAgICBzcGFjZTogbmV3IFNwYWNlU2V0dGluZ3MoKSxcbiAgICAgIHRpbWU6IG5ldyBUaW1lU2V0dGluZ3MoKSxcbiAgICAgIHRpbWVDb250cm9sOiBuZXcgVGltZUNvbnRyb2xTZXR0aW5ncygpLFxuICAgICAgdHJhZGU6IG5ldyBUcmFkZVNldHRpbmdzKCksXG4gICAgICB2OiBrc1ZlcnNpb24oKSxcbiAgICAgIHZpbGxhZ2U6IG5ldyBWaWxsYWdlU2V0dGluZ3MoKSxcbiAgICAgIHdvcmtzaG9wOiBuZXcgV29ya3Nob3BTZXR0aW5ncygpLFxuICAgIH07XG4gIH1cblxuICBzdGF0ZVJlc2V0KCkge1xuICAgIHRoaXMuc3RhdGVMb2FkKEVuZ2luZS5ERUZBVUxUX1NUQVRFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGFsbCBzZXR0aW5ncyBpbiB0aGUgZW5naW5lLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGVuZ2luZSBzZXR0aW5ncyBzdGF0ZS5cbiAgICovXG4gIHN0YXRlU2VyaWFsaXplKCk6IEVuZ2luZVN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9uZmlyZTogdGhpcy5ib25maXJlTWFuYWdlci5zZXR0aW5ncyxcbiAgICAgIGVuZ2luZTogdGhpcy5zZXR0aW5ncyxcbiAgICAgIHJlbGlnaW9uOiB0aGlzLnJlbGlnaW9uTWFuYWdlci5zZXR0aW5ncyxcbiAgICAgIHNjaWVuY2U6IHRoaXMuc2NpZW5jZU1hbmFnZXIuc2V0dGluZ3MsXG4gICAgICBzcGFjZTogdGhpcy5zcGFjZU1hbmFnZXIuc2V0dGluZ3MsXG4gICAgICB0aW1lOiB0aGlzLnRpbWVNYW5hZ2VyLnNldHRpbmdzLFxuICAgICAgdGltZUNvbnRyb2w6IHRoaXMudGltZUNvbnRyb2xNYW5hZ2VyLnNldHRpbmdzLFxuICAgICAgdHJhZGU6IHRoaXMudHJhZGVNYW5hZ2VyLnNldHRpbmdzLFxuICAgICAgdjoga3NWZXJzaW9uKCksXG4gICAgICB2aWxsYWdlOiB0aGlzLnZpbGxhZ2VNYW5hZ2VyLnNldHRpbmdzLFxuICAgICAgd29ya3Nob3A6IHRoaXMud29ya3Nob3BNYW5hZ2VyLnNldHRpbmdzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGhlIEtpdHRlbiBTY2llbnRpc3RzIGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyBTaG91bGQgd2UgcHJpbnQgdG8gdGhlIGxvZyB0aGF0IHRoZSBlbmdpbmUgd2FzIHN0YXJ0ZWQ/XG4gICAqL1xuICBzdGFydChtc2cgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3RpbWVvdXRNYWluTG9vcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxvb3AgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0OiBGcmFtZUNvbnRleHQgPSB7XG4gICAgICAgIGVudHJ5OiBEYXRlLm5vdygpLFxuICAgICAgICBleGl0OiAwLFxuICAgICAgICBtZWFzdXJlbWVudHM6IHt9LFxuICAgICAgICByZXF1ZXN0R2FtZVVpUmVmcmVzaDogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9pdGVyYXRlKGNvbnRleHQpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBjb250ZXh0LmV4aXQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IHRpbWVUYWtlbiA9IGNvbnRleHQuZXhpdCAtIGNvbnRleHQuZW50cnk7XG5cbiAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHR5cGVvZiBjb250ZXh0PihcImtzLnJlcG9ydEZyYW1lXCIsIHsgZGV0YWlsOiBjb250ZXh0IH0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbWFpbiBsb29wIHdhcyB0ZXJtaW5hdGVkIGR1cmluZ1xuICAgICAgICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbi5cbiAgICAgICAgICBpZiAodGhpcy5fdGltZW91dE1haW5Mb29wID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl90aW1lb3V0TWFpbkxvb3AgPSBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICAgICAgbG9vcCxcbiAgICAgICAgICAgIE1hdGgubWF4KDEwLCB0aGlzLl9ob3N0LmVuZ2luZS5zZXR0aW5ncy5pbnRlcnZhbCAtIHRpbWVUYWtlbiksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybiguLi5jbCh1bmtub3duVG9FcnJvcihlcnJvcikpKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLl90aW1lb3V0TWFpbkxvb3AgPSBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgbG9vcCxcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnNldHRpbmdzLmludGVydmFsLFxuICAgICk7XG5cbiAgICBpZiAobXNnKSB7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5rcy5lbmFibGVcIik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIEtpdHRlbiBTY2llbnRpc3RzIGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyBTaG91bGQgd2UgcHJpbnQgdG8gdGhlIGxvZyB0aGF0IHRoZSBlbmdpbmUgd2FzIHN0b3BwZWQ/XG4gICAqL1xuICBzdG9wKG1zZyA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3RpbWVvdXRNYWluTG9vcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0TWFpbkxvb3ApO1xuICAgIHRoaXMuX3RpbWVvdXRNYWluTG9vcCA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChtc2cpIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmtzLmRpc2FibGVcIik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYWluIGxvb3Agb2YgdGhlIGF1dG9tYXRpb24gc2NyaXB0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfaXRlcmF0ZShjb250ZXh0OiBGcmFtZUNvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBUaGUgbG9naWMgaGVyZSBpcyBpbnZlcnRlZCwgYmVjYXVzZSBfZGlzYWJsZWRfIGl0ZW1zIGFyZSBoaWRkZW4gZnJvbSB0aGUgbG9nLlxuICAgIGlmICghdGhpcy5zZXR0aW5ncy5maWx0ZXJzLmRpc2FibGVLR0xvZy5lbmFibGVkKSB7XG4gICAgICB0aGlzLl9tYWludGFpbktHTG9nRmlsdGVycygpO1xuICAgIH1cblxuICAgIC8vIFRoZSBvcmRlciBpbiB3aGljaCB0aGVzZSBhY3Rpb25zIGFyZSBwZXJmb3JtZWQgaXMgcHJvYmFibHlcbiAgICAvLyBzZW1pLWludGVudGlvbmFsIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIG9yIGltcHJvdmVkLlxuICAgIGxldCBbLCBkdXJhdGlvbl0gPSBhd2FpdCBtZWFzdXJlQXN5bmMoKCkgPT4gdGhpcy5zY2llbmNlTWFuYWdlci50aWNrKGNvbnRleHQpKTtcbiAgICBjb250ZXh0Lm1lYXN1cmVtZW50cy5zY2llbmNlTWFuYWdlciA9IGR1cmF0aW9uO1xuXG4gICAgWywgZHVyYXRpb25dID0gbWVhc3VyZSgoKSA9PiB7XG4gICAgICB0aGlzLmJvbmZpcmVNYW5hZ2VyLnRpY2soY29udGV4dCk7XG4gICAgfSk7XG4gICAgY29udGV4dC5tZWFzdXJlbWVudHMuYm9uZmlyZU1hbmFnZXIgPSBkdXJhdGlvbjtcblxuICAgIFssIGR1cmF0aW9uXSA9IG1lYXN1cmUoKCkgPT4ge1xuICAgICAgdGhpcy5zcGFjZU1hbmFnZXIudGljayhjb250ZXh0KTtcbiAgICB9KTtcbiAgICBjb250ZXh0Lm1lYXN1cmVtZW50cy5zcGFjZU1hbmFnZXIgPSBkdXJhdGlvbjtcblxuICAgIFssIGR1cmF0aW9uXSA9IGF3YWl0IG1lYXN1cmVBc3luYygoKSA9PiB0aGlzLndvcmtzaG9wTWFuYWdlci50aWNrKGNvbnRleHQpKTtcbiAgICBjb250ZXh0Lm1lYXN1cmVtZW50cy53b3Jrc2hvcE1hbmFnZXIgPSBkdXJhdGlvbjtcblxuICAgIFssIGR1cmF0aW9uXSA9IG1lYXN1cmUoKCkgPT4ge1xuICAgICAgdGhpcy50cmFkZU1hbmFnZXIudGljayhjb250ZXh0KTtcbiAgICB9KTtcbiAgICBjb250ZXh0Lm1lYXN1cmVtZW50cy50cmFkZU1hbmFnZXIgPSBkdXJhdGlvbjtcblxuICAgIFssIGR1cmF0aW9uXSA9IGF3YWl0IG1lYXN1cmVBc3luYygoKSA9PiB0aGlzLnJlbGlnaW9uTWFuYWdlci50aWNrKGNvbnRleHQpKTtcbiAgICBjb250ZXh0Lm1lYXN1cmVtZW50cy5yZWxpZ2lvbk1hbmFnZXIgPSBkdXJhdGlvbjtcblxuICAgIFssIGR1cmF0aW9uXSA9IG1lYXN1cmUoKCkgPT4ge1xuICAgICAgdGhpcy50aW1lTWFuYWdlci50aWNrKGNvbnRleHQpO1xuICAgIH0pO1xuICAgIGNvbnRleHQubWVhc3VyZW1lbnRzLnRpbWVNYW5hZ2VyID0gZHVyYXRpb247XG5cbiAgICBbLCBkdXJhdGlvbl0gPSBtZWFzdXJlKCgpID0+IHtcbiAgICAgIHRoaXMudmlsbGFnZU1hbmFnZXIudGljayhjb250ZXh0KTtcbiAgICB9KTtcbiAgICBjb250ZXh0Lm1lYXN1cmVtZW50cy52aWxsYWdlTWFuYWdlciA9IGR1cmF0aW9uO1xuXG4gICAgWywgZHVyYXRpb25dID0gYXdhaXQgbWVhc3VyZUFzeW5jKCgpID0+IHRoaXMudGltZUNvbnRyb2xNYW5hZ2VyLnRpY2soY29udGV4dCkpO1xuICAgIGNvbnRleHQubWVhc3VyZW1lbnRzLnRpbWVDb250cm9sTWFuYWdlciA9IGR1cmF0aW9uO1xuXG4gICAgWywgZHVyYXRpb25dID0gbWVhc3VyZSgoKSA9PiB7XG4gICAgICBpZiAoY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCkge1xuICAgICAgICB0aGlzLl9ob3N0LmdhbWUudWkucmVuZGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29udGV4dC5tZWFzdXJlbWVudHMuZ2FtZVVpUmVmcmVzaCA9IGR1cmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgYWxsIGxvZyBmaWx0ZXJzIGluIEtHIGFyZSB1bmNoZWNrZWQuIFRoaXMgbWVhbnMgdGhlIGV2ZW50cyB3aWxsIG5vdCBiZSBsb2dnZWQuXG4gICAqL1xuICBwcml2YXRlIF9tYWludGFpbktHTG9nRmlsdGVycygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2hvc3QuZ2FtZS5jb25zb2xlLmZpbHRlcnMpKSB7XG4gICAgICBmaWx0ZXIuZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlckNoZWNrYm94ZXMgPSBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2lkXj1maWx0ZXItXVwiKTtcbiAgICBmb3IgKGNvbnN0IGNoZWNrYm94IG9mIGZpbHRlckNoZWNrYm94ZXMpIHtcbiAgICAgIChjaGVja2JveCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3ltYm9sRm9yQ3ljbGUoY3ljbGU6IEN5Y2xlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLmN5Y2xlcy5maW5kKGVudHJ5ID0+IGVudHJ5Lm5hbWUgPT09IGN5Y2xlKT8udWdseXBoID8/IFwiXCI7XG4gIH1cblxuICBsYWJlbEZvckN5Y2xlKGN5Y2xlOiBDeWNsZSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3ltYm9sID0gdGhpcy5zeW1ib2xGb3JDeWNsZShjeWNsZSk7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFxuICAgICAgYCRzcGFjZS5wbGFuZXQuJHtjeWNsZSA9PT0gXCJyZWRtb29uXCIgPyBcIm1vb25cIiA6IGN5Y2xlfS5sYWJlbGAsXG4gICAgKTtcbiAgICByZXR1cm4gYCR7c3ltYm9sfSAke2xhYmVsfWA7XG4gIH1cblxuICBsYWJlbEZvclBsYW5ldChwbGFuZXQ6IFBsYW5ldCk6IHN0cmluZyB7XG4gICAgY29uc3QgY3ljbGVDYW5kaWRhdGU6IHN0cmluZyA9IHBsYW5ldCA9PT0gXCJtb29uXCIgPyAoXCJyZWRtb29uXCIgYXMgQ3ljbGUpIDogcGxhbmV0O1xuICAgIGNvbnN0IGN5Y2xlOiBDeWNsZSB8IHVuZGVmaW5lZCA9IEN5Y2xlcy5pbmNsdWRlcyhjeWNsZUNhbmRpZGF0ZSBhcyBDeWNsZSlcbiAgICAgID8gKGN5Y2xlQ2FuZGlkYXRlIGFzIEN5Y2xlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKGAkc3BhY2UucGxhbmV0LiR7cGxhbmV0fS5sYWJlbGApO1xuICAgIHJldHVybiBjeWNsZSA9PT0gdW5kZWZpbmVkID8gbGFiZWwgOiBgJHt0aGlzLnN5bWJvbEZvckN5Y2xlKGN5Y2xlKX0gJHtsYWJlbH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGFuIGludGVybmF0aW9uYWxpemVkIHN0cmluZyBsaXRlcmFsLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gcmV0cmlldmUgZnJvbSB0aGUgdHJhbnNsYXRpb24gdGFibGUuXG4gICAqIEBwYXJhbSBhcmdzIFZhcmlhYmxlIGFyZ3VtZW50cyB0byByZW5kZXIgaW50byB0aGUgc3RyaW5nLlxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNsYXRlZCBzdHJpbmcuXG4gICAqL1xuICBpMThuPFRLaXR0ZW5HYW1lTGl0ZXJhbCBleHRlbmRzIGAkJHtzdHJpbmd9YD4oXG4gICAga2V5OiBUcmFuc2xhdGVkU3RyaW5nPFRLaXR0ZW5HYW1lTGl0ZXJhbD4sXG4gICAgYXJnczogQXJyYXk8bnVtYmVyIHwgc3RyaW5nPiA9IFtdLFxuICApOiBzdHJpbmcge1xuICAgIGxldCB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gS2V5IGlzIHRvIGJlIHRyYW5zbGF0ZWQgdGhyb3VnaCBLRyBlbmdpbmUuXG4gICAgaWYgKGtleS5zdGFydHNXaXRoKFwiJFwiKSkge1xuICAgICAgdmFsdWUgPSB0aGlzLl9ob3N0LmkxOG5FbmdpbmUoa2V5LnNsaWNlKDEpKTtcbiAgICB9XG5cbiAgICB2YWx1ZSA9XG4gICAgICB2YWx1ZSA/P1xuICAgICAgdGhpcy5faTE4bkRhdGFbdGhpcy5zZXR0aW5ncy5sb2NhbGUuc2VsZWN0ZWRdW1xuICAgICAgICBrZXkgYXMga2V5b2YgKHR5cGVvZiBpMThuRGF0YSlbU3VwcG9ydGVkTG9jYWxlXVxuICAgICAgXTtcblxuICAgIGNvbnN0IGNoZWNrOiBNYXliZTxzdHJpbmc+ID0gdmFsdWU7XG5cbiAgICBpZiAoaXNOaWwoY2hlY2spKSB7XG4gICAgICB2YWx1ZSA9IGkxOG5EYXRhW0ZhbGxiYWNrTG9jYWxlXVtrZXkgYXMga2V5b2YgKHR5cGVvZiBpMThuRGF0YSlbU3VwcG9ydGVkTG9jYWxlXV07XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybiguLi5jbChgaTE4biBrZXkgJyR7a2V5fScgbm90IGZvdW5kIGluIGRlZmF1bHQgbGFuZ3VhZ2UuYCkpO1xuICAgICAgICByZXR1cm4gYCQke2tleX1gO1xuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKC4uLmNsKGBpMThuIGtleSAnJHtrZXl9JyBub3QgZm91bmQgaW4gc2VsZWN0ZWQgbGFuZ3VhZ2UuYCkpO1xuICAgIH1cbiAgICBmb3IgKGxldCBhcmdJbmRleCA9IDA7IGFyZ0luZGV4IDwgYXJncy5sZW5ndGg7ICsrYXJnSW5kZXgpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShgeyR7YXJnSW5kZXh9fWAsIGAke2FyZ3NbYXJnSW5kZXhdfWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpYWN0aXZpdHkoXG4gICAgaTE4bkxpdGVyYWw6IGtleW9mICh0eXBlb2YgaTE4bkRhdGEpW1wiZW4tVVNcIl0sXG4gICAgaTE4bkFyZ3M6IEFycmF5PG51bWJlciB8IHN0cmluZz4gPSBbXSxcbiAgICBsb2dTdHlsZT86IEFjdGl2aXR5Q2xhc3MsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmkxOG4oaTE4bkxpdGVyYWwsIGkxOG5BcmdzKTtcbiAgICBpZiAobG9nU3R5bGUpIHtcbiAgICAgIGNvbnN0IGFjdGl2aXR5Q2xhc3M6IEFjdGl2aXR5VHlwZUNsYXNzID0gYHR5cGVfJHtsb2dTdHlsZX1gIGFzIGNvbnN0O1xuICAgICAgdGhpcy5fcHJpbnRPdXRwdXQoYGtzLWFjdGl2aXR5ICR7YWN0aXZpdHlDbGFzc31gIGFzIGNvbnN0LCBcIiNlNjVDMDBcIiwgdGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ByaW50T3V0cHV0KFwia3MtYWN0aXZpdHlcIiwgXCIjZTY1QzAwXCIsIHRleHQpO1xuICAgIH1cbiAgfVxuXG4gIGltZXNzYWdlKFxuICAgIGkxOG5MaXRlcmFsOiBrZXlvZiAodHlwZW9mIGkxOG5EYXRhKVtcImVuLVVTXCJdLFxuICAgIGkxOG5BcmdzOiBBcnJheTxudW1iZXIgfCBzdHJpbmc+ID0gW10sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX3ByaW50T3V0cHV0KFwia3MtZGVmYXVsdFwiLCBcIiNhYTUwZmVcIiwgdGhpcy5pMThuKGkxOG5MaXRlcmFsLCBpMThuQXJncykpO1xuICB9XG5cbiAgc3RvcmVGb3JTdW1tYXJ5KG5hbWU6IHN0cmluZywgYW1vdW50ID0gMSwgc2VjdGlvbjogQWN0aXZpdHlTdW1tYXJ5U2VjdGlvbiA9IFwib3RoZXJcIik6IHZvaWQge1xuICAgIHRoaXMuX2FjdGl2aXR5U3VtbWFyeS5zdG9yZUFjdGl2aXR5KG5hbWUsIGFtb3VudCwgc2VjdGlvbik7XG4gIH1cblxuICBnZXRTdW1tYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpdml0eVN1bW1hcnkucmVuZGVyU3VtbWFyeSgpO1xuICB9XG5cbiAgZGlzcGxheUFjdGl2aXR5U3VtbWFyeSgpOiB2b2lkIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5nZXRTdW1tYXJ5KCk7XG4gICAgZm9yIChjb25zdCBzdW1tYXJ5TGluZSBvZiBzdW1tYXJ5KSB7XG4gICAgICB0aGlzLl9wcmludE91dHB1dChcImtzLXN1bW1hcnlcIiwgXCIjMDA5OTMzXCIsIHN1bW1hcnlMaW5lKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciBvdXQgdGhlIG9sZCBhY3Rpdml0eVxuICAgIHRoaXMucmVzZXRBY3Rpdml0eVN1bW1hcnkoKTtcbiAgfVxuXG4gIHJlc2V0QWN0aXZpdHlTdW1tYXJ5KCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGl2aXR5U3VtbWFyeS5yZXNldEFjdGl2aXR5KCk7XG4gIH1cblxuICBwcml2YXRlIF9wcmludE91dHB1dChcbiAgICBjc3NDbGFzc2VzOiBcImtzLWFjdGl2aXR5XCIgfCBga3MtYWN0aXZpdHkgJHtBY3Rpdml0eVR5cGVDbGFzc31gIHwgXCJrcy1kZWZhdWx0XCIgfCBcImtzLXN1bW1hcnlcIixcbiAgICBjb2xvcjogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuZmlsdGVycy5lbmFibGVkKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbHRlckl0ZW0gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnNldHRpbmdzLmZpbHRlcnMuZmlsdGVycykpIHtcbiAgICAgICAgaWYgKGZpbHRlckl0ZW0udmFyaWFudCA9PT0gY3NzQ2xhc3NlcyAmJiAhZmlsdGVySXRlbS5lbmFibGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIHRoZSBjb2xvciBvZiB0aGUgbWVzc2FnZSBpbW1lZGlhdGVseSBhZnRlciBhZGRpbmdcbiAgICBjb25zdCBtc2cgPSB0aGlzLl9ob3N0LmdhbWUubXNnKG1lc3NhZ2UsIGNzc0NsYXNzZXMpO1xuICAgICQobXNnLnNwYW4pLmNzcyhcImNvbG9yXCIsIGNvbG9yKTtcblxuICAgIGNvbnNvbGUuZGVidWcoLi4uY2wobWVzc2FnZSkpO1xuICB9XG5cbiAgc3RhdGljIGV2YWx1YXRlU3ViU2VjdGlvblRyaWdnZXIoc2VjdGlvblRyaWdnZXI6IG51bWJlciwgc3ViU2VjdGlvblRyaWdnZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHNlY3Rpb25UcmlnZ2VyIDwgMFxuICAgICAgPyBzdWJTZWN0aW9uVHJpZ2dlclxuICAgICAgOiBzdWJTZWN0aW9uVHJpZ2dlciA8IDBcbiAgICAgICAgPyBzZWN0aW9uVHJpZ2dlclxuICAgICAgICA6IHN1YlNlY3Rpb25UcmlnZ2VyO1xuICB9XG59XG4iLCIvKipcbiAqIFRoaXMgY29kZSB3YXMgZGVyaXZlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvcGFyc2UtbXMvdHJlZS9hMTg2MzZiYjYwOTc5MzMyNmExYmQ4ZDU0MWFhZDQ5ZjcxNWYwYTQwXG4gKiBhbmQgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9wcmV0dHktbXMvdHJlZS83NjNmZTA3NWQ4YTYyYWE4ZDllZTYwM2JmYWQyZjMxMDdjM2E5ZjAyLlxuICogSXQgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuY29uc3QgdG9aZXJvSWZJbmZpbml0eSA9ICh2YWx1ZSkgPT4gKE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IDApO1xuY29uc3QgcGFyc2VOdW1iZXIgPSAobWlsbGlzZWNvbmRzKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF5czogTWF0aC50cnVuYyhtaWxsaXNlY29uZHMgLyA4Nl80MDBfMDAwKSxcbiAgICAgICAgaG91cnM6IE1hdGgudHJ1bmMoKG1pbGxpc2Vjb25kcyAvIDNfNjAwXzAwMCkgJSAyNCksXG4gICAgICAgIG1pbnV0ZXM6IE1hdGgudHJ1bmMoKG1pbGxpc2Vjb25kcyAvIDYwXzAwMCkgJSA2MCksXG4gICAgICAgIHNlY29uZHM6IE1hdGgudHJ1bmMoKG1pbGxpc2Vjb25kcyAvIDEwMDApICUgNjApLFxuICAgICAgICBtaWxsaXNlY29uZHM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzICUgMTAwMCksXG4gICAgICAgIG1pY3Jvc2Vjb25kczogTWF0aC50cnVuYyh0b1plcm9JZkluZmluaXR5KG1pbGxpc2Vjb25kcyAqIDEwMDApICUgMTAwMCksXG4gICAgICAgIG5hbm9zZWNvbmRzOiBNYXRoLnRydW5jKHRvWmVyb0lmSW5maW5pdHkobWlsbGlzZWNvbmRzICogMWU2KSAlIDEwMDApLFxuICAgIH07XG59O1xuY29uc3QgcGFyc2VCaWdpbnQgPSAobWlsbGlzZWNvbmRzKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF5czogbWlsbGlzZWNvbmRzIC8gODY0MDAwMDBuLFxuICAgICAgICBob3VyczogKG1pbGxpc2Vjb25kcyAvIDM2MDAwMDBuKSAlIDI0bixcbiAgICAgICAgbWludXRlczogKG1pbGxpc2Vjb25kcyAvIDYwMDAwbikgJSA2MG4sXG4gICAgICAgIHNlY29uZHM6IChtaWxsaXNlY29uZHMgLyAxMDAwbikgJSA2MG4sXG4gICAgICAgIG1pbGxpc2Vjb25kczogbWlsbGlzZWNvbmRzICUgMTAwMG4sXG4gICAgICAgIG1pY3Jvc2Vjb25kczogMG4sXG4gICAgICAgIG5hbm9zZWNvbmRzOiAwbixcbiAgICB9O1xufTtcbmNvbnN0IHBhcnNlTWlsbGlzZWNvbmRzID0gKG1pbGxpc2Vjb25kcykgPT4ge1xuICAgIHN3aXRjaCAodHlwZW9mIG1pbGxpc2Vjb25kcykge1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUobWlsbGlzZWNvbmRzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZU51bWJlcihtaWxsaXNlY29uZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImJpZ2ludFwiOiB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VCaWdpbnQobWlsbGlzZWNvbmRzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkZWZhdWx0XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBhIGZpbml0ZSBudW1iZXIgb3IgYmlnaW50XCIpO1xufTtcbmNvbnN0IGlzWmVybyA9ICh2YWx1ZSkgPT4gdmFsdWUgPT09IDAgfHwgdmFsdWUgPT09IDBuO1xuY29uc3QgcGx1cmFsaXplID0gKHdvcmQsIGNvdW50KSA9PiBjb3VudCA9PT0gMSB8fCBjb3VudCA9PT0gMW4gPyB3b3JkIDogYCR7d29yZH1zYDtcbmNvbnN0IFNFQ09ORF9ST1VORElOR19FUFNJTE9OID0gMC4wMDBfMDAwXzE7XG5jb25zdCBPTkVfREFZX0lOX01JTExJU0VDT05EUyA9IDI0biAqIDYwbiAqIDYwbiAqIDEwMDBuO1xuLyoqXG4gKiBDb252ZXJ0IG1pbGxpc2Vjb25kcyB0byBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZzogYDEzMzcwMDAwMDBgIOKGkiBgMTVkIDExaCAyM20gMjBzYC5cbiAqIEBwYXJhbSBtaWxsaXNlY29uZHMgLSBNaWxsaXNlY29uZHMgdG8gaHVtYW5pemUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGh1bWFuaXppbmcgdGhlIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIFRoZSBodW1hbml6ZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogaW1wb3J0IGZvcm1hdE1pbGxpc2Vjb25kcyBmcm9tICdAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZm9ybWF0L21pbGxpc2Vjb25kcy5qcyc7XG4gKlxuICogZm9ybWF0TWlsbGlzZWNvbmRzKDEzMzcwMDAwMDApO1xuICogLy89PiAnMTVkIDExaCAyM20gMjBzJ1xuICpcbiAqIGZvcm1hdE1pbGxpc2Vjb25kcygxMzM3KTtcbiAqIC8vPT4gJzEuM3MnXG4gKlxuICogZm9ybWF0TWlsbGlzZWNvbmRzKDEzMyk7XG4gKiAvLz0+ICcxMzNtcydcbiAqXG4gKiAvLyBgY29tcGFjdGAgb3B0aW9uXG4gKiBmb3JtYXRNaWxsaXNlY29uZHMoMTMzNywge2NvbXBhY3Q6IHRydWV9KTtcbiAqIC8vPT4gJzFzJ1xuICpcbiAqIC8vIGB2ZXJib3NlYCBvcHRpb25cbiAqIGZvcm1hdE1pbGxpc2Vjb25kcygxMzM1NjY5MDAwLCB7dmVyYm9zZTogdHJ1ZX0pO1xuICogLy89PiAnMTUgZGF5cyAxMSBob3VycyAxIG1pbnV0ZSA5IHNlY29uZHMnXG4gKlxuICogLy8gYGNvbG9uTm90YXRpb25gIG9wdGlvblxuICogZm9ybWF0TWlsbGlzZWNvbmRzKDk1NTAwLCB7Y29sb25Ob3RhdGlvbjogdHJ1ZX0pO1xuICogLy89PiAnMTozNS41J1xuICpcbiAqIC8vIGBmb3JtYXRTdWJNaWxsaXNlY29uZHNgIG9wdGlvblxuICogZm9ybWF0TWlsbGlzZWNvbmRzKDEwMC40MDAwODAsIHtmb3JtYXRTdWJNaWxsaXNlY29uZHM6IHRydWV9KVxuICogLy89PiAnMTAwbXMgNDAwwrVzIDgwbnMnXG4gKlxuICogLy8gQ2FuIGJlIHVzZWZ1bCBmb3IgdGltZSBkdXJhdGlvbnNcbiAqIGZvcm1hdE1pbGxpc2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCAwLCAxLCAxMCwgNDApIC0gbmV3IERhdGUoMjAxNCwgMCwgMSwgMTAsIDUpKVxuICogLy89PiAnMzVtJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRNaWxsaXNlY29uZHMgPSAobWlsbGlzZWNvbmRzLCBvcHRpb25zID0ge1xuICAgIGNvbG9uTm90YXRpb246IGZhbHNlLFxuICAgIGNvbXBhY3Q6IGZhbHNlLFxuICAgIGZvcm1hdFN1Yk1pbGxpc2Vjb25kczogZmFsc2UsXG4gICAga2VlcERlY2ltYWxzT25XaG9sZVNlY29uZHM6IGZhbHNlLFxuICAgIG1pbGxpc2Vjb25kc0RlY2ltYWxEaWdpdHM6IDAsXG4gICAgc2Vjb25kc0RlY2ltYWxEaWdpdHM6IDEsXG4gICAgc2VwYXJhdGVNaWxsaXNlY29uZHM6IGZhbHNlLFxuICAgIHVuaXRDb3VudDogSW5maW5pdHksXG4gICAgdmVyYm9zZTogZmFsc2UsXG59KSA9PiB7XG4gICAgY29uc3QgaXNCaWdJbnQgPSB0eXBlb2YgbWlsbGlzZWNvbmRzID09PSBcImJpZ2ludFwiO1xuICAgIGlmICghaXNCaWdJbnQgJiYgIU51bWJlci5pc0Zpbml0ZShtaWxsaXNlY29uZHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBhIGZpbml0ZSBudW1iZXIgb3IgYmlnaW50XCIpO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zQWRqdXN0ZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICBpZiAob3B0aW9uc0FkanVzdGVkLmNvbG9uTm90YXRpb24pIHtcbiAgICAgICAgb3B0aW9uc0FkanVzdGVkLmNvbXBhY3QgPSBmYWxzZTtcbiAgICAgICAgb3B0aW9uc0FkanVzdGVkLmZvcm1hdFN1Yk1pbGxpc2Vjb25kcyA9IGZhbHNlO1xuICAgICAgICBvcHRpb25zQWRqdXN0ZWQuc2VwYXJhdGVNaWxsaXNlY29uZHMgPSBmYWxzZTtcbiAgICAgICAgb3B0aW9uc0FkanVzdGVkLnZlcmJvc2UgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnNBZGp1c3RlZC5jb21wYWN0KSB7XG4gICAgICAgIG9wdGlvbnNBZGp1c3RlZC51bml0Q291bnQgPSAxO1xuICAgICAgICBvcHRpb25zQWRqdXN0ZWQuc2Vjb25kc0RlY2ltYWxEaWdpdHMgPSAwO1xuICAgICAgICBvcHRpb25zQWRqdXN0ZWQubWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0cyA9IDA7XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBmbG9vckRlY2ltYWxzID0gKHZhbHVlLCBkZWNpbWFsRGlnaXRzKSA9PiB7XG4gICAgICAgIGNvbnN0IGZsb29yZWRJbnRlcmltVmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlICogMTAgKiogZGVjaW1hbERpZ2l0cyArIFNFQ09ORF9ST1VORElOR19FUFNJTE9OKTtcbiAgICAgICAgY29uc3QgZmxvb3JlZFZhbHVlID0gTWF0aC5yb3VuZChmbG9vcmVkSW50ZXJpbVZhbHVlKSAvIDEwICoqIGRlY2ltYWxEaWdpdHM7XG4gICAgICAgIHJldHVybiBmbG9vcmVkVmFsdWUudG9GaXhlZChkZWNpbWFsRGlnaXRzKTtcbiAgICB9O1xuICAgIGNvbnN0IGFkZCA9ICh2YWx1ZSwgbG9uZywgc2hvcnQsIHZhbHVlU3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICgocmVzdWx0Lmxlbmd0aCA9PT0gMCB8fCAhb3B0aW9uc0FkanVzdGVkLmNvbG9uTm90YXRpb24pICYmXG4gICAgICAgICAgICBpc1plcm8odmFsdWUpICYmXG4gICAgICAgICAgICAhKG9wdGlvbnNBZGp1c3RlZC5jb2xvbk5vdGF0aW9uICYmIHNob3J0ID09PSBcIm1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZVN0cmluZyA/Pz0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgaWYgKG9wdGlvbnNBZGp1c3RlZC5jb2xvbk5vdGF0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCB3aG9sZURpZ2l0cyA9IHZhbHVlU3RyaW5nLmluY2x1ZGVzKFwiLlwiKVxuICAgICAgICAgICAgICAgID8gdmFsdWVTdHJpbmcuc3BsaXQoXCIuXCIpWzBdLmxlbmd0aFxuICAgICAgICAgICAgICAgIDogdmFsdWVTdHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbWluTGVuZ3RoID0gcmVzdWx0Lmxlbmd0aCA+IDAgPyAyIDogMTtcbiAgICAgICAgICAgIHZhbHVlU3RyaW5nID0gXCIwXCIucmVwZWF0KE1hdGgubWF4KDAsIG1pbkxlbmd0aCAtIHdob2xlRGlnaXRzKSkgKyB2YWx1ZVN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlU3RyaW5nICs9IG9wdGlvbnNBZGp1c3RlZC52ZXJib3NlID8gXCIgXCIgKyBwbHVyYWxpemUobG9uZywgdmFsdWUpIDogc2hvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2godmFsdWVTdHJpbmcpO1xuICAgIH07XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VNaWxsaXNlY29uZHMobWlsbGlzZWNvbmRzKTtcbiAgICBjb25zdCBkYXlzID0gQmlnSW50KHBhcnNlZC5kYXlzKTtcbiAgICBhZGQoZGF5cyAvIDM2NW4sIFwieWVhclwiLCBcInlcIik7XG4gICAgYWRkKGRheXMgJSAzNjVuLCBcImRheVwiLCBcImRcIik7XG4gICAgYWRkKE51bWJlcihwYXJzZWQuaG91cnMpLCBcImhvdXJcIiwgXCJoXCIpO1xuICAgIGFkZChOdW1iZXIocGFyc2VkLm1pbnV0ZXMpLCBcIm1pbnV0ZVwiLCBcIm1cIik7XG4gICAgaWYgKG9wdGlvbnNBZGp1c3RlZC5zZXBhcmF0ZU1pbGxpc2Vjb25kcyB8fFxuICAgICAgICBvcHRpb25zQWRqdXN0ZWQuZm9ybWF0U3ViTWlsbGlzZWNvbmRzIHx8XG4gICAgICAgICghb3B0aW9uc0FkanVzdGVkLmNvbG9uTm90YXRpb24gJiYgbWlsbGlzZWNvbmRzIDwgMTAwMCkpIHtcbiAgICAgICAgY29uc3Qgc2Vjb25kcyA9IE51bWJlcihwYXJzZWQuc2Vjb25kcyk7XG4gICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kcyA9IE51bWJlcihwYXJzZWQubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgY29uc3QgbWljcm9zZWNvbmRzID0gTnVtYmVyKHBhcnNlZC5taWNyb3NlY29uZHMpO1xuICAgICAgICBjb25zdCBuYW5vc2Vjb25kcyA9IE51bWJlcihwYXJzZWQubmFub3NlY29uZHMpO1xuICAgICAgICBhZGQoc2Vjb25kcywgXCJzZWNvbmRcIiwgXCJzXCIpO1xuICAgICAgICBpZiAob3B0aW9uc0FkanVzdGVkLmZvcm1hdFN1Yk1pbGxpc2Vjb25kcykge1xuICAgICAgICAgICAgYWRkKG1pbGxpc2Vjb25kcywgXCJtaWxsaXNlY29uZFwiLCBcIm1zXCIpO1xuICAgICAgICAgICAgYWRkKG1pY3Jvc2Vjb25kcywgXCJtaWNyb3NlY29uZFwiLCBcIsK1c1wiKTtcbiAgICAgICAgICAgIGFkZChuYW5vc2Vjb25kcywgXCJuYW5vc2Vjb25kXCIsIFwibnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtaWxsaXNlY29uZHNBbmRCZWxvdyA9IG1pbGxpc2Vjb25kcyArIG1pY3Jvc2Vjb25kcyAvIDEwMDAgKyBuYW5vc2Vjb25kcyAvIDFlNjtcbiAgICAgICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kc0RlY2ltYWxEaWdpdHMgPSB0eXBlb2Ygb3B0aW9uc0FkanVzdGVkLm1pbGxpc2Vjb25kc0RlY2ltYWxEaWdpdHMgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICA/IG9wdGlvbnNBZGp1c3RlZC5taWxsaXNlY29uZHNEZWNpbWFsRGlnaXRzXG4gICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgY29uc3Qgcm91bmRlZE1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kc0FuZEJlbG93ID49IDFcbiAgICAgICAgICAgICAgICA/IE1hdGgucm91bmQobWlsbGlzZWNvbmRzQW5kQmVsb3cpXG4gICAgICAgICAgICAgICAgOiBNYXRoLmNlaWwobWlsbGlzZWNvbmRzQW5kQmVsb3cpO1xuICAgICAgICAgICAgY29uc3QgbWlsbGlzZWNvbmRzU3RyaW5nID0gbWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0c1xuICAgICAgICAgICAgICAgID8gbWlsbGlzZWNvbmRzQW5kQmVsb3cudG9GaXhlZChtaWxsaXNlY29uZHNEZWNpbWFsRGlnaXRzKVxuICAgICAgICAgICAgICAgIDogcm91bmRlZE1pbGxpc2Vjb25kcy50b1N0cmluZygpO1xuICAgICAgICAgICAgYWRkKE51bWJlci5wYXJzZUZsb2F0KG1pbGxpc2Vjb25kc1N0cmluZyksIFwibWlsbGlzZWNvbmRcIiwgXCJtc1wiLCBtaWxsaXNlY29uZHNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBzZWNvbmRzID0gKChpc0JpZ0ludCA/IE51bWJlcihtaWxsaXNlY29uZHMgJSBPTkVfREFZX0lOX01JTExJU0VDT05EUykgOiBtaWxsaXNlY29uZHMpIC8gMTAwMCkgJSA2MDtcbiAgICAgICAgY29uc3Qgc2Vjb25kc0RlY2ltYWxEaWdpdHMgPSB0eXBlb2Ygb3B0aW9uc0FkanVzdGVkLnNlY29uZHNEZWNpbWFsRGlnaXRzID09PSBcIm51bWJlclwiXG4gICAgICAgICAgICA/IG9wdGlvbnNBZGp1c3RlZC5zZWNvbmRzRGVjaW1hbERpZ2l0c1xuICAgICAgICAgICAgOiAxO1xuICAgICAgICBjb25zdCBzZWNvbmRzRml4ZWQgPSBmbG9vckRlY2ltYWxzKHNlY29uZHMsIHNlY29uZHNEZWNpbWFsRGlnaXRzKTtcbiAgICAgICAgY29uc3Qgc2Vjb25kc1N0cmluZyA9IG9wdGlvbnNBZGp1c3RlZC5rZWVwRGVjaW1hbHNPbldob2xlU2Vjb25kc1xuICAgICAgICAgICAgPyBzZWNvbmRzRml4ZWRcbiAgICAgICAgICAgIDogc2Vjb25kc0ZpeGVkLnJlcGxhY2UoL1xcLjArJC8sIFwiXCIpO1xuICAgICAgICBhZGQoTnVtYmVyLnBhcnNlRmxvYXQoc2Vjb25kc1N0cmluZyksIFwic2Vjb25kXCIsIFwic1wiLCBzZWNvbmRzU3RyaW5nKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFwiMFwiICsgKG9wdGlvbnNBZGp1c3RlZC52ZXJib3NlID8gXCIgbWlsbGlzZWNvbmRzXCIgOiBcIm1zXCIpO1xuICAgIH1cbiAgICBjb25zdCBzZXBhcmF0b3IgPSBvcHRpb25zQWRqdXN0ZWQuY29sb25Ob3RhdGlvbiA/IFwiOlwiIDogXCIgXCI7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zQWRqdXN0ZWQudW5pdENvdW50ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBNYXRoLm1heChvcHRpb25zQWRqdXN0ZWQudW5pdENvdW50LCAxKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuam9pbihzZXBhcmF0b3IpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pbGxpc2Vjb25kcy5qcy5tYXAiLCJleHBvcnQgY29uc3QgSWNvbnMgPSB7XG4gIC8qKlxuICAgKiBjYW1waW5nXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBCb25maXJlOlxuICAgIFwiTTgwLTgwdi0xODNsMzYzLTQ5MS02Ny05MCA0OS0zNSA1NSA3NSA1Ni03NSA0OCAzNS02NiA5MCAzNjIgNDkxdjE4M0g4MFptNDAwLTYyM0wxNDAtMjQzdjEwM2gxNDVsMTk1LTI3MyAxOTUgMjczaDE0NXYtMTAzTDQ4MC03MDNaTTM1OS0xNDBoMjQyTDQ4MC0zMTAgMzU5LTE0MFptMTIxLTI3MyAxOTUgMjczLTE5NS0yNzMtMTk1IDI3MyAxOTUtMjczWlwiLFxuXG4gIC8qKlxuICAgKiBjaGVja19ib3hfNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIENoZWNrYm94Q2hlY2s6XG4gICAgXCJtNDE5LTMyMSAyODktMjg5LTQzLTQzLTI0NiAyNDYtMTE5LTExOS00MyA0MyAxNjIgMTYyWk0xMjAtMTIwdi03MjBoNzIwdjcyMEgxMjBabTYwLTYwaDYwMHYtNjAwSDE4MHY2MDBabTAgMHYtNjAwIDYwMFpcIixcblxuICAvKipcbiAgICogY2hlY2tfYm94X291dGxpbmVfYmxhbmtfNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIENoZWNrYm94VW5DaGVjazogXCJNMTIwLTEyMHYtNzIwaDcyMHY3MjBIMTIwWm02MC02MGg2MDB2LTYwMEgxODB2NjAwWlwiLFxuXG4gIC8qKlxuICAgKiBjb250ZW50X2NvcHlfNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIENvcHk6IFwiTTI0MC0yMDB2LTY4MGg1NjB2NjgwSDI0MFptNjAtNjBoNDQwdi01NjBIMzAwdjU2MFpNMTIwLTgwdi02ODBoNjB2NjIwaDUwMHY2MEgxMjBabTE4MC0xODB2LTU2MCA1NjBaXCIsXG5cbiAgLyoqXG4gICAqIGV2ZW50X3JlcGVhdF80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgQ3ljbGVzOlxuICAgIFwiTTEyMC04MHYtNzQwaDEyNXYtNjBoNjV2NjBoMzQwdi02MGg2NXY2MGgxMjV2MzYwaC02MHYtMTEwSDE4MHY0MzBoMzI0djYwSDEyMFpNNzYwIDBxLTczIDAtMTI3LjUtNDUuNVQ1NjQtMTYwaDYycTEzIDQ0IDQ5LjUgNzJUNzYwLTYwcTU4IDAgOTktNDF0NDEtOTlxMC01OC00MS05OXQtOTktNDFxLTI5IDAtNTQgMTAuNVQ2NjItMzAwaDU4djYwSDU2MHYtMTYwaDYwdjU3cTI3LTI2IDYzLTQxLjV0NzctMTUuNXE4MyAwIDE0MS41IDU4LjVUOTYwLTIwMHEwIDgzLTU4LjUgMTQxLjVUNzYwIDBaTTE4MC02MzBoNjAwdi0xMzBIMTgwdjEzMFptMCAwdi0xMzAgMTMwWlwiLFxuXG4gIC8qKlxuICAgKiBkYXRhX3VzYWdlXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBEYXRhVXNhZ2U6XG4gICAgXCJNNDgwLTgwcS04MiAwLTE1NS0zMS41VDE5Ny41LTE5N3EtNTQuNS01NC04Ni0xMjdUODAtNDc5cTAtMTU4IDEwNi41LTI3MlQ0NTEtODc3djEwMnEtMTE1IDExLTE5MiA5NS41VDE4Mi00NzlxMCAxMjQgODcgMjEwLjVUNDgwLTE4MnE3MiAwIDEzNi0zMi41VDcyNS0zMDZsODggNTFxLTU4IDgzLTE0NS41IDEyOVQ0ODAtODBabTM2Mi0yMjktODgtNDlxMTItMzEgMTgtNjEuNXQ2LTYwLjVxMC0xMTYtNzYuNS0yMDFUNTExLTc3NnYtMTAycTE1NyAxMSAyNjMgMTI0LjVUODgwLTQ4NHEwIDQ1LTkuNSA4OC41VDg0Mi0zMDlaXCIsXG5cbiAgLyoqXG4gICAqIGRlbGV0ZV80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgRGVsZXRlOlxuICAgIFwiTTIwMS0xMjB2LTYzMGgtNDF2LTYwaDE4OHYtMzBoMjY0djMwaDE4OHY2MGgtNDF2NjMwSDIwMVptNjAtNjBoNDM4di01NzBIMjYxdjU3MFptMTA2LTg2aDYwdi0zOTloLTYwdjM5OVptMTY2IDBoNjB2LTM5OWgtNjB2Mzk5Wk0yNjEtNzUwdjU3MC01NzBaXCIsXG5cbiAgLyoqXG4gICAqIGRyYWZ0XzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBEcmFmdDpcbiAgICBcIk0xNjAtODB2LTgwMGg0MjFsMjE5IDIxOXY1ODFIMTYwWm0zOTEtNTU0di0xODZIMjIwdjY4MGg1MjB2LTQ5NEg1NTFaTTIyMC04MjB2MTg2LTE4NiA2ODAtNjgwWlwiLFxuXG4gIC8qKlxuICAgKiBlY29fNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIEVjbzogXCJNMjEzLTE3NXEtNDMuNTktNDUtNjguMy0xMDRRMTIwLTMzOCAxMjAtNDAwcTAtNzMgMjUuNS0xMzMuNVQyMjItNjQ1cTM1LTM1IDg3LTU5dDEyMi41LTM3LjVRNTAyLTc1NSA1OTEtNzU4LjV0MTk4IDMuNXE4IDEwOCA1LjUgMTk3LjV0LTE2IDE2MC43NXEtMTMuNSA3MS4yNS0zOCAxMjQuNTZRNzE2LTIxOC44NyA2ODAtMTgzcS01MSA1MS0xMTAgNzdUNDQ0LTgwcS02OSAwLTEyNi41LTIzLjVUMjEzLTE3NVptMTAzIDBxMjUgMTcgNTggMjZ0NjkuOTIgOVE0OTctMTQwIDU0Ny0xNjJ0OTEtNjRxMjctMjcgNDYtNzAuNXQzMS0xMDNRNzI3LTQ1OSA3MzEtNTM0dDAtMTY1cS05NC0yLTE2OC41IDIuNVQ0MzEtNjgwcS01NyAxMi05OCAzMC41VDI2Ni02MDRxLTQyIDQzLTY0IDkxdC0yMiA5OHEwIDQ4IDIwLjUgMTAwLjVUMjUxLTIzMHE1My05OCAxMjctMTc2dDE1Ny0xMjNxLTg3IDc1LTE0MSAxNjIuNVQzMTYtMTc1Wm0wIDBabTAgMFpcIixcblxuICAvKipcbiAgICogZWRpdF80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgRWRpdDogXCJNMTgwLTE4MGg0NGw0NzItNDcxLTQ0LTQ0LTQ3MiA0NzF2NDRabS02MCA2MHYtMTI4bDYxNy02MTYgMTI4IDEyOC02MTcgNjE2SDEyMFptNjU5LTYxNy00MS00MSA0MSA0MVptLTEwNSA2NC0yMi0yMiA0NCA0NC0yMi0yMlpcIixcblxuICAvKipcbiAgICogZXhwYW5kX2NpcmNsZV9kb3duXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBFeHBhbmRDaXJjbGVEb3duOlxuICAgIFwibTQ4MC0zNTEgMTczLTE3My00My00Mi0xMzAgMTMwLTEzMC0xMzAtNDMgNDIgMTczIDE3M1ptMCAyNzFxLTgyIDAtMTU1LTMxLjV0LTEyNy41LTg2UTE0My0yNTIgMTExLjUtMzI1VDgwLTQ4MHEwLTgzIDMxLjUtMTU2dDg2LTEyN1EyNTItODE3IDMyNS04NDguNVQ0ODAtODgwcTgzIDAgMTU2IDMxLjVUNzYzLTc2M3E1NCA1NCA4NS41IDEyN1Q4ODAtNDgwcTAgODItMzEuNSAxNTVUNzYzLTE5Ny41cS01NCA1NC41LTEyNyA4NlQ0ODAtODBabTAtNjBxMTQyIDAgMjQxLTk5LjVUODIwLTQ4MHEwLTE0Mi05OS0yNDF0LTI0MS05OXEtMTQxIDAtMjQwLjUgOTlUMTQwLTQ4MHEwIDE0MSA5OS41IDI0MC41VDQ4MC0xNDBabTAtMzQwWlwiLFxuXG4gIC8qKlxuICAgKiBleHBhbmRfY2lyY2xlX3VwXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBFeHBhbmRDaXJjbGVVcDpcbiAgICBcIm0zNTAtMzk0IDEzMC0xMzAgMTMwIDEzMCA0My00Mi0xNzMtMTczLTE3MyAxNzMgNDMgNDJaTTQ4MC04MHEtODMgMC0xNTYtMzEuNVQxOTctMTk3cS01NC01NC04NS41LTEyN1Q4MC00ODBxMC04MyAzMS41LTE1NS41dDg1LjUtMTI3cTU0LTU0LjUgMTI3LTg2VDQ4MC04ODBxODMgMCAxNTUuNSAzMS41dDEyNyA4NnE1NC41IDU0LjUgODYgMTI3VDg4MC00ODBxMCA4My0zMS41IDE1NnQtODYgMTI3cS01NC41IDU0LTEyNyA4NS41VDQ4MC04MFptMC02MHExNDEgMCAyNDAuNS05OVQ4MjAtNDgwcTAtMTQxLTk5LjUtMjQwLjVUNDgwLTgyMHEtMTQyIDAtMjQxIDk5LjVUMTQwLTQ4MHEwIDE0MiA5OSAyNDF0MjQxIDk5Wm0wLTM0MFpcIixcblxuICAvKipcbiAgICogcHVibGlzaF80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgSW1wb3J0OlxuICAgIFwiTTQ1MC0xNjB2LTM3MUwzMzAtNDExbC00My00MyAxOTMtMTkzIDE5MyAxOTMtNDMgNDMtMTIwLTEyMHYzNzFoLTYwWk0xNjAtNTk3di0yMDNoNjQwdjIwM2gtNjB2LTE0M0gyMjB2MTQzaC02MFpcIixcblxuICAvKipcbiAgICogaW52ZW50b3J5XzJfNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIEludmVudG9yeTI6XG4gICAgXCJNMTIwLTgwdi01NDBIODB2LTI2MGg4MDB2MjYwaC00MHY1NDBIMTIwWm02MC02MGg2MDB2LTQ4MEgxODB2NDgwWm0tNDAtNTQwaDY4MHYtMTQwSDE0MHYxNDBabTIyMCAyNjBoMjQwdi02MEgzNjB2NjBabTEyMCA0MFpcIixcblxuICAvKipcbiAgICogY29udGVudF9wYXN0ZV80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgUGFzdGU6XG4gICAgXCJNMTIwLTEyMHYtNzIwaDI2MnE3LTM1IDM0LjUtNTcuNVQ0ODAtOTIwcTM2IDAgNjMuNSAyMi41VDU3OC04NDBoMjYydjcyMEgxMjBabTYwLTYwaDYwMHYtNjAwaC02MHY5MEgyNDB2LTkwaC02MHY2MDBabTMwMC02MDBxMTcgMCAyOC41LTExLjVUNTIwLTgyMHEwLTE3LTExLjUtMjguNVQ0ODAtODYwcS0xNyAwLTI4LjUgMTEuNVQ0NDAtODIwcTAgMTcgMTEuNSAyOC41VDQ4MC03ODBaXCIsXG5cbiAgLyoqXG4gICAqIHN5bmFnb2d1ZV80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgUmVsaWdpb246XG4gICAgXCJNNDAtMTIwdi01NjBxMC00NS44MyAzMi4xMi03Ny45MiAzMi4xMi0zMi4wOCA3OC0zMi4wOFQyMjgtNzU3LjkycTMyIDMyLjA5IDMyIDc3LjkydjMxbDIyMC0xOTEgMjIwIDE5MXYtMzFxMC00NS44MyAzMi4xMi03Ny45MiAzMi4xMi0zMi4wOCA3OC0zMi4wOFQ4ODgtNzU3LjkycTMyIDMyLjA5IDMyIDc3LjkydjU2MEg1MzB2LTI1MEg0MzB2MjUwSDQwWm03MjAtNTEwaDEwMHYtNDkuODJxMC0yMS4xOC0xNC4zMi0zNS42OC0xNC4zMy0xNC41LTM1LjUtMTQuNS0yMS4xOCAwLTM1LjY4IDE0LjM3UTc2MC03MDEuMjUgNzYwLTY4MHY1MFptLTY2MCAwaDEwMHYtNDkuODJxMC0yMS4xOC0xNC4zMi0zNS42OC0xNC4zMy0xNC41LTM1LjUtMTQuNS0yMS4xOCAwLTM1LjY4IDE0LjM3UTEwMC03MDEuMjUgMTAwLTY4MHY1MFptMCA0NTBoMTAwdi0zOTBIMTAwdjM5MFptMTYwIDBoMTEwdi0yNTBoMjIwdjI1MGgxMTB2LTM5MEw0ODAtNzYxIDI2MC01NzB2MzkwWm01MDAgMGgxMDB2LTM5MEg3NjB2MzkwWk00NzkuOTQtNTA1UTQ1Ny01MDUgNDQxLTUyMS4wNnEtMTYtMTYuMDYtMTYtMzlUNDQxLjA2LTU5OXExNi4wNi0xNiAzOS0xNlQ1MTktNTk4Ljk0cTE2IDE2LjA2IDE2IDM5VDUxOC45NC01MjFxLTE2LjA2IDE2LTM5IDE2WlwiLFxuXG4gIC8qKlxuICAgKiByZWZyZXNoXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBSZXNldDpcbiAgICBcIk00ODAtMTYwcS0xMzMgMC0yMjYuNS05My41VDE2MC00ODBxMC0xMzMgOTMuNS0yMjYuNVQ0ODAtODAwcTg1IDAgMTQ5IDM0LjVUNzQwLTY3MXYtMTI5aDYwdjI1NEg1NDZ2LTYwaDE2OHEtMzgtNjAtOTctOTd0LTEzNy0zN3EtMTA5IDAtMTg0LjUgNzUuNVQyMjAtNDgwcTAgMTA5IDc1LjUgMTg0LjVUNDgwLTIyMHE4MyAwIDE1Mi00Ny41VDcyOC0zOTNoNjJxLTI5IDEwNS0xMTUgMTY5dC0xOTUgNjRaXCIsXG5cbiAgLyoqXG4gICAqIHNoZWx2ZXNfNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIFJlc291cmNlczpcbiAgICBcIk0xMjAtNDB2LTg4MGg2MHY4MGg2MDB2LTgwaDYwdjg4MGgtNjB2LTgwSDE4MHY4MGgtNjBabTYwLTQ2OWgxMTB2LTE2MGgyMjB2MTYwaDI3MHYtMjcxSDE4MHYyNzFabTAgMzI5aDI3MHYtMTYwaDIyMHYxNjBoMTEwdi0yNjlIMTgwdjI2OVptMTcwLTMyOWgxMDB2LTEwMEgzNTB2MTAwWm0xNjAgMzI5aDEwMHYtMTAwSDUxMHYxMDBaTTM1MC01MDloMTAwLTEwMFptMTYwIDMyOWgxMDAtMTAwWlwiLFxuXG4gIC8qKlxuICAgKiBzYXZlXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBTYXZlOiBcIk04NDAtNjgzdjU2M0gxMjB2LTcyMGg1NjNsMTU3IDE1N1ptLTYwIDI3TDY1Ni03ODBIMTgwdjYwMGg2MDB2LTQ3NlpNNDc5Ljc2LTI0NXE0My4yNCAwIDczLjc0LTMwLjI2IDMwLjUtMzAuMjcgMzAuNS03My41IDAtNDMuMjQtMzAuMjYtNzMuNzQtMzAuMjctMzAuNS03My41LTMwLjUtNDMuMjQgMC03My43NCAzMC4yNi0zMC41IDMwLjI3LTMwLjUgNzMuNSAwIDQzLjI0IDMwLjI2IDczLjc0IDMwLjI3IDMwLjUgNzMuNSAzMC41Wk0yMzMtNTg0aDM1OHYtMTQzSDIzM3YxNDNabS01My03MnY0NzYtNjAwIDEyNFpcIixcblxuICAvKipcbiAgICogc2F2ZV9hc180OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgU2F2ZUFzOlxuICAgIFwiTTEyMC0xMjB2LTcyMGg1NjNsMTU3IDE1N3YxMTdsLTYwIDYwdi0xNTBMNjU2LTc4MEgxODB2NjAwaDI4MHY2MEgxMjBabTYwLTY2MHY2MDAtNjAwWk01MjAtNDB2LTEyM2wyNjMtMjYyIDEyMiAxMjJMNjQzLTQwSDUyMFptMzAwLTI2My0zNy0zNyAzNyAzN1pNNTgwLTEwMGgzOGwxMjEtMTIyLTE4LTE5LTE5LTE4LTEyMiAxMjF2MzhabTE0MS0xNDEtMTktMTggMzcgMzctMTgtMTlaTTIzMy01ODRoMzU4di0xNDNIMjMzdjE0M1ptMjQ3IDMzOXExNCAwIDI3LTN0MjQtMTBsMzktNDBxNy0xMSAxMC41LTI0dDMuNS0yN3EwLTQzLjMzLTMwLjI2LTczLjY3UTUyMy40Ny00NTMgNDgwLjI0LTQ1M3EtNDMuMjQgMC03My43NCAzMC4yNi0zMC41IDMwLjI3LTMwLjUgNzMuNSAwIDQzLjI0IDMwLjMzIDczLjc0UTQzNi42Ny0yNDUgNDgwLTI0NVpcIixcblxuICAvKipcbiAgICogZGF0ZV9yYW5nZV80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgU2Vhc29uczpcbiAgICBcIk0zMDYtMzk0cS0xNyAwLTI4LjUtMTEuNVQyNjYtNDM0cTAtMTcgMTEuNS0yOC41VDMwNi00NzRxMTcgMCAyOC41IDExLjVUMzQ2LTQzNHEwIDE3LTExLjUgMjguNVQzMDYtMzk0Wm0xNzcgMHEtMTcgMC0yOC41LTExLjVUNDQzLTQzNHEwLTE3IDExLjUtMjguNVQ0ODMtNDc0cTE3IDAgMjguNSAxMS41VDUyMy00MzRxMCAxNy0xMS41IDI4LjVUNDgzLTM5NFptMTcwIDBxLTE3IDAtMjguNS0xMS41VDYxMy00MzRxMC0xNyAxMS41LTI4LjVUNjUzLTQ3NHExNyAwIDI4LjUgMTEuNVQ2OTMtNDM0cTAgMTctMTEuNSAyOC41VDY1My0zOTRaTTEyMC04MHYtNzQwaDEyNXYtNjBoNjV2NjBoMzQwdi02MGg2NXY2MGgxMjV2NzQwSDEyMFptNjAtNjBoNjAwdi00MzBIMTgwdjQzMFptMC00OTBoNjAwdi0xMzBIMTgwdjEzMFptMCAwdi0xMzAgMTMwWlwiLFxuXG4gIC8qKlxuICAgKiBzZXR0aW5nc180OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgU2V0dGluZ3M6XG4gICAgXCJtMzg4LTgwLTIwLTEyNnEtMTktNy00MC0xOXQtMzctMjVsLTExOCA1NC05My0xNjQgMTA4LTc5cS0yLTktMi41LTIwLjVUMTg1LTQ4MHEwLTkgLjUtMjAuNVQxODgtNTIxTDgwLTYwMGw5My0xNjQgMTE4IDU0cTE2LTEzIDM3LTI1dDQwLTE4bDIwLTEyN2gxODRsMjAgMTI2cTE5IDcgNDAuNSAxOC41VDY2OS03MTBsMTE4LTU0IDkzIDE2NC0xMDggNzdxMiAxMCAyLjUgMjEuNXQuNSAyMS41cTAgMTAtLjUgMjF0LTIuNSAyMWwxMDggNzgtOTMgMTY0LTExOC01NHEtMTYgMTMtMzYuNSAyNS41VDU5Mi0yMDZMNTcyLTgwSDM4OFptNDgtNjBoODhsMTQtMTEycTMzLTggNjIuNS0yNXQ1My41LTQxbDEwNiA0NiA0MC03Mi05NC02OXE0LTE3IDYuNS0zMy41VDcxNS00ODBxMC0xNy0yLTMzLjV0LTctMzMuNWw5NC02OS00MC03Mi0xMDYgNDZxLTIzLTI2LTUyLTQzLjVUNTM4LTcwOGwtMTQtMTEyaC04OGwtMTQgMTEycS0zNCA3LTYzLjUgMjRUMzA2LTY0MmwtMTA2LTQ2LTQwIDcyIDk0IDY5cS00IDE3LTYuNSAzMy41VDI0NS00ODBxMCAxNyAyLjUgMzMuNVQyNTQtNDEzbC05NCA2OSA0MCA3MiAxMDYtNDZxMjQgMjQgNTMuNSA0MXQ2Mi41IDI1bDE0IDExMlptNDQtMjEwcTU0IDAgOTItMzh0MzgtOTJxMC01NC0zOC05MnQtOTItMzhxLTU0IDAtOTIgMzh0LTM4IDkycTAgNTQgMzggOTJ0OTIgMzhabTAtMTMwWlwiLFxuXG4gIC8qKlxuICAgKiByb2NrZXRfbGF1bmNoXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBTcGFjZTpcbiAgICBcIm0xODctNTUxIDEwNiA0NXExOC0zNiAzOC41LTcxdDQzLjUtNjdsLTc5LTE2LTEwOSAxMDlabTE1NCA4MSAxMzMgMTMzcTU3LTI2IDEwNy01OXQ4MS02NHE4MS04MSAxMTktMTY2dDQxLTE5MnEtMTA3IDMtMTkyIDQxVDQ2NC02NThxLTMxIDMxLTY0IDgxdC01OSAxMDdabTIyOS05NnEtMjAtMjAtMjAtNDkuNXQyMC00OS41cTIwLTIwIDQ5LjUtMjB0NDkuNSAyMHEyMCAyMCAyMCA0OS41VDY2OS01NjZxLTIwIDIwLTQ5LjUgMjBUNTcwLTU2NlptLTE1IDM4MyAxMDktMTA5LTE2LTc5cS0zMiAyMy02NyA0My41VDUxMC0yODlsNDUgMTA2Wm0zMjYtNjk0cTkgMTM2LTM0IDI0OFQ3MDUtNDE4bC0yIDItMiAyIDIyIDExMHEzIDE1LTEuNSAyOVQ3MDYtMjUwTDUzNS03OGwtODUtMTk4LTE3MC0xNzAtMTk4LTg1IDE3Mi0xNzFxMTEtMTEgMjUtMTUuNXQyOS0xLjVsMTEwIDIycTEtMSAyLTEuNXQyLTEuNXE5OS05OSAyMTEtMTQyLjVUODgxLTg3N1pNMTQ5LTMyNXEzNS0zNSA4NS41LTM1LjVUMzIwLTMyNnEzNSAzNSAzNC41IDg1LjVUMzE5LTE1NXEtMjYgMjYtODAuNSA0M1Q3NS04MHExNS0xMDkgMzEuNS0xNjR0NDIuNS04MVptNDIgNDNxLTE0IDE1LTI1IDQ3dC0xOSA4MnE1MC04IDgyLTE5dDQ3LTI1cTE5LTE3IDE5LjUtNDIuNVQyNzgtMjg0cS0xOS0xOC00NC41LTE3LjVUMTkxLTI4MlpcIixcblxuICAvKipcbiAgICoga2V5Ym9hcmRfdGFiXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBTdGF0ZTogXCJNODIwLTI0MHYtNDgwaDYwdjQ4MGgtNjBabS0zNDAgMS00My00MiAxNjktMTY5SDgwdi02MGg1MjZMNDM4LTY3OWw0Mi00MiAyNDEgMjQxLTI0MSAyNDFaXCIsXG5cbiAgLyoqXG4gICAqIHN1bW1hcml6ZV80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgU3VtbWFyeTpcbiAgICBcIk0yNzktNjIxaDYwdi02MGgtNjB2NjBabTAgMTcxaDYwdi02MGgtNjB2NjBabTAgMTcxaDYwdi02MGgtNjB2NjBaTTEyMC0xMjB2LTcyMGg1MjJsMTk4IDE5OHY1MjJIMTIwWm02MC02MGg2MDB2LTQyOUg2MDl2LTE3MUgxODB2NjAwWm0wLTYwMHYxNzEuNDNWLTc4MHY2MDAtNjAwWlwiLFxuXG4gIC8qKlxuICAgKiBzeW5jXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBTeW5jOiBcIk0xNjctMTYwdi02MGgxMzBsLTE1LTEycS02NC01MS05My0xMTF0LTI5LTEzNHEwLTEwNiA2Mi41LTE5MC41VDM4Ny03ODR2NjJxLTc1IDI5LTEyMSA5Ni41VDIyMC00NzdxMCA2MyAyMy41IDEwOS41VDMwNy0yODdsMzAgMjF2LTEyNGg2MHYyMzBIMTY3Wm00MDctMTV2LTYzcTc2LTI5IDEyMS05Ni41VDc0MC00ODNxMC00OC0yMy41LTk3LjVUNjU1LTY2OGwtMjktMjZ2MTI0aC02MHYtMjMwaDIzMHY2MEg2NjVsMTUgMTRxNjAgNTYgOTAgMTIwdDMwIDEyM3EwIDEwNi02MiAxOTFUNTc0LTE3NVpcIixcblxuICAvKipcbiAgICogc2NoZWR1bGVfNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIFRpbWU6IFwibTYyNy0yODcgNDUtNDUtMTU5LTE2MHYtMjAxaC02MHYyMjVsMTc0IDE4MVpNNDgwLTgwcS04MiAwLTE1NS0zMS41dC0xMjcuNS04NlExNDMtMjUyIDExMS41LTMyNVQ4MC00ODBxMC04MiAzMS41LTE1NXQ4Ni0xMjcuNVEyNTItODE3IDMyNS04NDguNVQ0ODAtODgwcTgyIDAgMTU1IDMxLjV0MTI3LjUgODZRODE3LTcwOCA4NDguNS02MzVUODgwLTQ4MHEwIDgyLTMxLjUgMTU1dC04NiAxMjcuNVE3MDgtMTQzIDYzNS0xMTEuNVQ0ODAtODBabTAtNDAwWm0wIDM0MHExNDAgMCAyNDAtMTAwdDEwMC0yNDBxMC0xNDAtMTAwLTI0MFQ0ODAtODIwcS0xNDAgMC0yNDAgMTAwVDE0MC00ODBxMCAxNDAgMTAwIDI0MHQyNDAgMTAwWlwiLFxuXG4gIC8qKlxuICAgKiBib2x0XzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBUcmlnZ2VyOlxuICAgIFwibTM5My0xNjUgMjc5LTMzNUg0OTJsMzYtMjg2LTI1MyAzNjZoMTU0bC0zNiAyNTVabS03MyA4NSA0MC0yODBIMTYwbDM2MC01MjBoODBsLTQwIDMyMGgyNDBMNDAwLTgwaC04MFptMTU0LTM5NlpcIixcblxuICAvKipcbiAgICogY29uc3RydWN0aW9uXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBXb3Jrc2hvcDpcbiAgICBcIk03NjgtMTIwIDUxNy0zNzFsNTctNTcgMjUxIDI1MS01NyA1N1ptLTU4MSAwLTU3LTU3IDI5MC0yOTAtMTA3LTEwNy0yMyAyMy00NC00NHY4NWwtMjQgMjQtMTIyLTEyMiAyNC0yNGg4NmwtNDgtNDggMTMxLTEzMXExNy0xNyAzNy0yM3Q0NC02cTI0IDAgNDQgOC41dDM3IDI1LjVMMzQ4LTY5OWw0OCA0OC0yNCAyNCAxMDQgMTA0IDEyMi0xMjJxLTgtMTMtMTIuNS0zMHQtNC41LTM2cTAtNTMgMzguNS05MS41VDcxMS04NDFxMTUgMCAyNS41IDN0MTcuNSA4bC04NSA4NSA3NSA3NSA4NS04NXE1IDggOC41IDE5LjVUODQxLTcwOXEwIDUzLTM4LjUgOTEuNVQ3MTEtNTc5cS0xOCAwLTMxLTIuNXQtMjQtNy41TDE4Ny0xMjBaXCIsXG59O1xuIiwiaW1wb3J0IHsgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4uLy4uL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uLy4uL3Rvb2xzL0xvZy5qc1wiO1xuXG5leHBvcnQgdHlwZSBVaUNvbXBvbmVudEludGVyZmFjZSA9IHtcbiAgcmVhZG9ubHkgY2hpbGRyZW46IEl0ZXJhYmxlPFVpQ29tcG9uZW50SW50ZXJmYWNlPjtcbiAgcGFyZW50OiBVaUNvbXBvbmVudEludGVyZmFjZSB8IG51bGw7XG4gIGdldCBlbGVtZW50KCk6IEpRdWVyeTxIVE1MRWxlbWVudD47XG4gIHJlcXVlc3RSZWZyZXNoKHdpdGhDaGlsZHJlbj86IGJvb2xlYW4sIGRlcHRoPzogbnVtYmVyLCB0cmFjZT86IGJvb2xlYW4pOiB2b2lkO1xuICByZWZyZXNoKGZvcmNlPzogYm9vbGVhbiwgZGVwdGg/OiBudW1iZXIpOiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgVWlDb21wb25lbnRPcHRpb25zID0ge1xuICBsZW5ndGg/OiBuZXZlcjtcbiAgcmVhZG9ubHkgb25SZWZyZXNoPzogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25SZWZyZXNoUmVxdWVzdD86ICgpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVWlDb21wb25lbnQ8VEVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PlxuICBpbXBsZW1lbnRzIFVpQ29tcG9uZW50SW50ZXJmYWNlXG57XG4gIHByaXZhdGUgc3RhdGljIG5leHRDb21wb25lbnRJZCA9IDA7XG4gIHJlYWRvbmx5IGNvbXBvbmVudElkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0IGl0c2VsZi5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q6IEtpdHRlblNjaWVudGlzdHM7XG4gIHBhcmVudDogVWlDb21wb25lbnRJbnRlcmZhY2UgfCBudWxsO1xuXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFVpQ29tcG9uZW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG1haW4gRE9NIGVsZW1lbnQgZm9yIHRoaXMgY29tcG9uZW50LCBpbiBhIEpRdWVyeSB3cmFwcGVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9lbGVtZW50OiBKUXVlcnk8VEVsZW1lbnQ+IHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBzZXQgZWxlbWVudCh2YWx1ZTogSlF1ZXJ5PFRFbGVtZW50Pikge1xuICAgIHRoaXMuX2VsZW1lbnQgPSB2YWx1ZTtcbiAgICB0aGlzLl9lbGVtZW50WzBdLmlkID0gYEtTJHtPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfWA7XG4gIH1cbiAgZ2V0IGVsZW1lbnQoKTogSlF1ZXJ5PFRFbGVtZW50PiB7XG4gICAgcmV0dXJuIG11c3RFeGlzdCh0aGlzLl9lbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOT1RFOiBJdCBpcyBpbnRlbnRpb25hbCB0aGF0IGFsbCBjaGlsZHJlbiBhcmUgb2YgdGhlIG1vc3QgZnVuZGFtZW50YWwgYmFzZSB0eXBlLlxuICAgKiBJZiBhIG1vcmUgc3BlY2lmaWNhbGx5IHR5cGVkIHJlZmVyZW5jZSBmb3IgYSBjaGlsZCBpcyByZXF1aXJlZCwgaXQgc2hvdWxkIGJlIHN0b3JlZFxuICAgKiBvbiBjb25zdHJ1Y3Rpb24uXG4gICAqIFRoZSAnY2hpbGRyZW4nIHNldCBpcyBpbnRlbmRlZCBvbmx5IGZvciBpbnRlci1jb21wb25lbnQgb3JjaGVzdHJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNoaWxkcmVuID0gbmV3IFNldDxVaUNvbXBvbmVudEludGVyZmFjZT4oKTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyB0aGUgYmFzZSBgVWlDb21wb25lbnRgLlxuICAgKiBTdWJjbGFzc2VzIE1VU1QgYWRkIGNoaWxkcmVuIGZyb20gb3B0aW9ucyB3aGVuIGB0aGlzLmVsZW1lbnRgIGlzIGNvbnN0cnVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCB8IHsgaG9zdDogS2l0dGVuU2NpZW50aXN0cyB9LCBvcHRpb25zPzogVWlDb21wb25lbnRPcHRpb25zKSB7XG4gICAgdGhpcy5jb21wb25lbnRJZCA9IFVpQ29tcG9uZW50Lm5leHRDb21wb25lbnRJZCsrO1xuXG4gICAgdGhpcy5ob3N0ID0gcGFyZW50Lmhvc3Q7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudCBpbnN0YW5jZW9mIFVpQ29tcG9uZW50ID8gcGFyZW50IDogbnVsbDtcbiAgICB0aGlzLl9uZWVkc1JlZnJlc2ggPSBmYWxzZTtcbiAgfVxuXG4gIGFic3RyYWN0IHRvU3RyaW5nKCk6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgX25lZWRzUmVmcmVzaDtcbiAgcmVxdWVzdFJlZnJlc2god2l0aENoaWxkcmVuID0gZmFsc2UsIGRlcHRoID0gMCwgdHJhY2UgPSBmYWxzZSkge1xuICAgIGlmICh0cmFjZSkge1xuICAgICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgICAgLi4uY2woXG4gICAgICAgICAgZGVwdGggPCAwID8gXCLipJJcIi5yZXBlYXQoZGVwdGggKiAtMSkgOiBcIiBcIi5yZXBlYXQoZGVwdGgpLFxuICAgICAgICAgIHRoaXMudG9TdHJpbmcoKSxcbiAgICAgICAgICBcInJlcXVlc3RSZWZyZXNoKClcIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zPy5vblJlZnJlc2hSZXF1ZXN0Py5jYWxsKHRoaXMpO1xuXG4gICAgaWYgKHRoaXMucGFyZW50ICE9PSB0aGlzICYmICF3aXRoQ2hpbGRyZW4pIHtcbiAgICAgIHRoaXMucGFyZW50Py5yZXF1ZXN0UmVmcmVzaChmYWxzZSwgZGVwdGggLSAxLCB0cmFjZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX25lZWRzUmVmcmVzaCkge1xuICAgICAgaWYgKHRyYWNlKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgICAgLi4uY2woXG4gICAgICAgICAgICBkZXB0aCA8IDAgPyBcIuKkklwiLnJlcGVhdChkZXB0aCAqIC0xKSA6IFwiIFwiLnJlcGVhdChkZXB0aCksXG4gICAgICAgICAgICB0aGlzLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBcInJlcXVlc3RSZWZyZXNoKCkgPGFscmVhZHkgcGVuZGluZz5cIixcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX25lZWRzUmVmcmVzaCA9IHRydWU7XG5cbiAgICBpZiAod2l0aENoaWxkcmVuKSB7XG4gICAgICBpZiAodHJhY2UpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgICAgICAuLi5jbChcbiAgICAgICAgICAgIGRlcHRoIDwgMCA/IFwi4qSSXCIucmVwZWF0KGRlcHRoICogLTEpIDogXCIgXCIucmVwZWF0KGRlcHRoKSxcbiAgICAgICAgICAgIHRoaXMudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIFwicmVxdWVzdFJlZnJlc2goKVwiLFxuICAgICAgICAgICAgYCsgJHt0aGlzLmNoaWxkcmVuLnNpemV9IGNoaWxkcmVuYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgIGNoaWxkLnJlcXVlc3RSZWZyZXNoKHRydWUsIGRlcHRoICsgMSwgdHJhY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHJhY2UpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgICAgICAuLi5jbChcbiAgICAgICAgICAgIGRlcHRoIDwgMCA/IFwi4qSSXCIucmVwZWF0KGRlcHRoICogLTEpIDogXCIgXCIucmVwZWF0KGRlcHRoKSxcbiAgICAgICAgICAgIHRoaXMudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIFwicmVxdWVzdFJlZnJlc2goKVwiLFxuICAgICAgICAgICAgXCI8cXVldWVkPlwiLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVmcmVzaChmb3JjZSA9IGZhbHNlLCBkZXB0aCA9IDApIHtcbiAgICBpZiAoIWZvcmNlICYmICF0aGlzLl9uZWVkc1JlZnJlc2gpIHtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKC4uLmNsKHRoaXMudG9TdHJpbmcoKSwgXCJyZWZyZXNoKCkgcmVjZWl2ZWQgYW5kIGlnbm9yZWQuXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXQVJOSU5HOiBFbmFibGUgdGhpcyBzZWN0aW9uIG9ubHkgZHVyaW5nIHJlZnJlc2ggbG9naWMgZGVidWdnaW5nIVxuICAgIC8vICAgICAgICAgIFdoZW4gdGhpcyB3YXMgaW1wbGVtZW50ZWQsIGEgZnVsbCByZWZyZXNoIGxvZ2dlZCAxNksgbWVzc2FnZXMuXG4gICAgLy8gICAgICAgICAgRXZlbiB3aGVuIHRoZXNlIGFyZSBmaWx0ZXJlZCBmcm9tIHRoZSBKUyBjb25zb2xlLCB0aGVyZSBhcmVcbiAgICAvLyAgICAgICAgICBub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGlzc3Vlcy4gRE8gTk9UIEVOQUJMRSBUSElTIFVOTEVTUyBZT1UgTkVFRCBUTy5cbiAgICAvKlxuICAgIGlmICghZm9yY2UpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgIC4uLmNsKFxuICAgICAgICAgIGRlcHRoIDwgMCA/IFwi4qSSXCIucmVwZWF0KGRlcHRoICogLTEpIDogXCIgXCIucmVwZWF0KGRlcHRoKSxcbiAgICAgICAgICB0aGlzLnRvU3RyaW5nKCksXG4gICAgICAgICAgXCJyZWZyZXNoXCIsXG4gICAgICAgICAgdHlwZW9mIHRoaXMub3B0aW9ucz8ub25SZWZyZXNoICE9PSBcInVuZGVmaW5lZFwiID8gXCJ3aXRoIG9uUmVmcmVzaCgpXCIgOiBcIlwiLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgKi9cblxuICAgIHRoaXMub3B0aW9ucz8ub25SZWZyZXNoPy5jYWxsKHRoaXMpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgY2hpbGQucmVmcmVzaChmb3JjZSwgZGVwdGggKyAxKTtcbiAgICB9XG5cbiAgICB0aGlzLl9uZWVkc1JlZnJlc2ggPSBmYWxzZTtcbiAgfVxuXG4gIGFkZENoaWxkKGNoaWxkOiBVaUNvbXBvbmVudEludGVyZmFjZSk6IHRoaXMge1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpO1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmQoY2hpbGQuZWxlbWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgYWRkQ2hpbGRyZW4oY2hpbGRyZW4/OiBJdGVyYWJsZTxVaUNvbXBvbmVudEludGVyZmFjZT4pOiB0aGlzIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuID8/IFtdKSB7XG4gICAgICB0aGlzLmFkZENoaWxkKGNoaWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZW1vdmVDaGlsZChjaGlsZDogVWlDb21wb25lbnRJbnRlcmZhY2UpIHtcbiAgICBpZiAoIXRoaXMuY2hpbGRyZW4uaGFzKGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNoaWxkLmVsZW1lbnQucmVtb3ZlKCk7XG4gICAgdGhpcy5jaGlsZHJlbi5kZWxldGUoY2hpbGQpO1xuICB9XG4gIHJlbW92ZUNoaWxkcmVuKGNoaWxkcmVuOiBJdGVyYWJsZTxVaUNvbXBvbmVudEludGVyZmFjZT4pIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICB0aGlzLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFVpQ29tcG9uZW50LCB0eXBlIFVpQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIENvbnRhaW5lck9wdGlvbnMgPSBUaGlzVHlwZTxDb250YWluZXI+ICZcbiAgVWlDb21wb25lbnRPcHRpb25zICYge1xuICAgIHJlYWRvbmx5IGNsYXNzZXM/OiBBcnJheTxzdHJpbmc+O1xuICB9O1xuXG5leHBvcnQgY2xhc3MgQ29udGFpbmVyIGV4dGVuZHMgVWlDb21wb25lbnQge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IENvbnRhaW5lck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBzaW1wbGUgY29udGFpbmVyIGVsZW1lbnQgd2l0aG91dCBhbnkgc3BlY2lhbCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogVWlDb21wb25lbnQsIG9wdGlvbnM/OiBDb250YWluZXJPcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCB7IC4uLm9wdGlvbnMgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSAkKFwiPGRpdi8+XCIpO1xuXG4gICAgZm9yIChjb25zdCBjbGFzc05hbWUgb2Ygb3B0aW9ucz8uY2xhc3NlcyA/PyBbXSkge1xuICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0NvbnRhaW5lci5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCBzdHlsZXNEZWxpbWl0ZXIgZnJvbSBcIi4vRGVsaW1pdGVyLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFVpQ29tcG9uZW50LCB0eXBlIFVpQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIExpc3RJdGVtT3B0aW9ucyA9IFRoaXNUeXBlPExpc3RJdGVtPiAmXG4gIFVpQ29tcG9uZW50T3B0aW9ucyAmIHtcbiAgICAvKipcbiAgICAgKiBTaG91bGQgdGhlcmUgYmUgYWRkaXRpb25hbCBwYWRkaW5nIGJlbG93IHRoaXMgZWxlbWVudD9cbiAgICAgKi9cbiAgICByZWFkb25seSBkZWxpbWl0ZXI/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGNsYXNzZXM/OiBBcnJheTxzdHJpbmc+O1xuICB9O1xuXG5leHBvcnQgY2xhc3MgTGlzdEl0ZW0gZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogTGlzdEl0ZW1PcHRpb25zO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBuZXcgc2ltcGxlIGxpc3QgaXRlbSB3aXRoIG9ubHkgYSBjb250YWluZXIgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgVGhlIHVzZXJzY3JpcHQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBsaXN0IGl0ZW0uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBvcHRpb25zPzogTGlzdEl0ZW1PcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCB7IC4uLm9wdGlvbnMgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSAkKFwiPGxpLz5cIik7XG5cbiAgICBmb3IgKGNvbnN0IGNsYXNzTmFtZSBvZiBvcHRpb25zPy5jbGFzc2VzID8/IFtdKSB7XG4gICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8uZGVsaW1pdGVyID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzRGVsaW1pdGVyLmRlbGltaXRlcik7XG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0xpc3RJdGVtLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4vQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgTGlzdEl0ZW0sIHR5cGUgTGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNMaXN0SXRlbSBmcm9tIFwiLi9MaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50LCBVaUNvbXBvbmVudEludGVyZmFjZSB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIExhYmVsTGlzdEl0ZW1PcHRpb25zID0gVGhpc1R5cGU8TGFiZWxMaXN0SXRlbT4gJlxuICBMaXN0SXRlbU9wdGlvbnMgJiB7XG4gICAgLyoqXG4gICAgICogV2hlbiBzZXQgdG8gYW4gU1ZHIHBhdGgsIHdpbGwgYmUgdXNlZCBhcyBhbiBpY29uIG9uIHRoZSBsYWJlbC5cbiAgICAgKi9cbiAgICByZWFkb25seSBpY29uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIGFuIGluZGljYXRvciBiZSByZW5kZXJlZCBpbiBmcm9udCBvZiB0aGUgZWxlbWVudCxcbiAgICAgKiB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYW4gdXBncmFkZSBvZiBhIHByaW9yIHNldHRpbmc/XG4gICAgICovXG4gICAgcmVhZG9ubHkgdXBncmFkZUluZGljYXRvcj86IGJvb2xlYW47XG4gIH07XG5cbmV4cG9ydCBjbGFzcyBMYWJlbExpc3RJdGVtIGV4dGVuZHMgTGlzdEl0ZW0ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IExhYmVsTGlzdEl0ZW1PcHRpb25zO1xuICByZWFkb25seSBoZWFkOiBDb250YWluZXI7XG4gIHJlYWRvbmx5IGVsZW1lbnRMYWJlbDogSlF1ZXJ5O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBuZXcgbGFiZWwgbGlzdCBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBUaGUgdXNlcnNjcmlwdCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBvbiB0aGUgc2V0dGluZyBlbGVtZW50LlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgbGlzdCBpdGVtLlxuICAgKi9cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgbGFiZWw6IHN0cmluZywgb3B0aW9ucz86IExhYmVsTGlzdEl0ZW1PcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCBvcHRpb25zKTtcblxuICAgIHRoaXMuaGVhZCA9IG5ldyBDb250YWluZXIocGFyZW50KTtcbiAgICB0aGlzLmhlYWQuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNMaXN0SXRlbS5oZWFkKTtcbiAgICB0aGlzLmFkZENoaWxkKHRoaXMuaGVhZCk7XG5cbiAgICB0aGlzLmVsZW1lbnRMYWJlbCA9ICQoXCI8bGFiZWwvPlwiLCB7XG4gICAgICB0ZXh0OiBgJHtvcHRpb25zPy51cGdyYWRlSW5kaWNhdG9yID09PSB0cnVlID8gXCLirqQgXCIgOiBcIlwifSR7bGFiZWx9YCxcbiAgICB9KVxuICAgICAgLmFkZENsYXNzKHN0eWxlcy5sYWJlbClcbiAgICAgIC5hZGRDbGFzcyhzdHlsZXNMaXN0SXRlbS5sYWJlbCk7XG4gICAgdGhpcy5oZWFkLmVsZW1lbnQuYXBwZW5kKHRoaXMuZWxlbWVudExhYmVsKTtcblxuICAgIGlmIChvcHRpb25zPy5pY29uKSB7XG4gICAgICBjb25zdCBpY29uRWxlbWVudCA9ICQoXCI8ZGl2Lz5cIiwge1xuICAgICAgICBodG1sOiBgPHN2ZyBzdHlsZT1cIndpZHRoOiAxNXB4OyBoZWlnaHQ6IDE1cHg7XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjxwYXRoIGQ9XCIke29wdGlvbnMuaWNvbn1cIi8+PC9zdmc+YCxcbiAgICAgIH0pLmFkZENsYXNzKHN0eWxlcy5pY29uTGFiZWwpO1xuICAgICAgdGhpcy5lbGVtZW50TGFiZWwucHJlcGVuZChpY29uRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0xhYmVsTGlzdEl0ZW0ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV06ICcke3RoaXMuZWxlbWVudExhYmVsLnRleHQoKX0nYDtcbiAgfVxuXG4gIGFkZENoaWxkSGVhZChjaGlsZDogVWlDb21wb25lbnRJbnRlcmZhY2UpOiB0aGlzIHtcbiAgICB0aGlzLmhlYWQuYWRkQ2hpbGQoY2hpbGQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGFkZENoaWxkcmVuSGVhZChjaGlsZHJlbj86IEl0ZXJhYmxlPFVpQ29tcG9uZW50SW50ZXJmYWNlPik6IHRoaXMge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgIHRoaXMuaGVhZC5hZGRDaGlsZChjaGlsZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvY29uc29sZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBMYWJlbExpc3RJdGVtLCB0eXBlIExhYmVsTGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vTGFiZWxMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBzdHlsZXMsIGRlZmF1bHQgYXMgc3R5bGVzU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vU2V0dGluZ0xpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBTZXR0aW5nTGlzdEl0ZW1PcHRpb25zID0gVGhpc1R5cGU8U2V0dGluZ0xpc3RJdGVtPiAmXG4gIExhYmVsTGlzdEl0ZW1PcHRpb25zICYge1xuICAgIC8qKlxuICAgICAqIFdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSB1c2VyIGNoZWNrcyB0aGUgY2hlY2tib3guXG4gICAgICovXG4gICAgcmVhZG9ubHkgb25DaGVjaz86IChpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogV2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHVzZXIgdW5jaGVja3MgdGhlIGNoZWNrYm94LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG9uVW5DaGVjaz86IChpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIHRoZSB1c2VyIGJlIHByZXZlbnRlZCBmcm9tIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQ/XG4gICAgICovXG4gICAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xuICB9O1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ0xpc3RJdGVtPFRTZXR0aW5nIGV4dGVuZHMgU2V0dGluZyA9IFNldHRpbmc+IGV4dGVuZHMgTGFiZWxMaXN0SXRlbSB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogU2V0dGluZ0xpc3RJdGVtT3B0aW9ucztcbiAgcmVhZG9ubHkgc2V0dGluZzogVFNldHRpbmc7XG4gIHJlYWRvbmx5IGNoZWNrYm94PzogSlF1ZXJ5O1xuXG4gIHJlYWRPbmx5OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBuZXcgc2V0dGluZyBlbGVtZW50LlxuICAgKiBUaGlzIGlzIGEgc2ltcGxlIGNoZWNrYm94IHdpdGggYSBsYWJlbC5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgVGhlIHVzZXJzY3JpcHQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgb24gdGhlIHNldHRpbmcgZWxlbWVudC5cbiAgICogQHBhcmFtIHNldHRpbmcgVGhlIHNldHRpbmcgdGhpcyBlbGVtZW50IGlzIGxpbmtlZCB0by5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhpcyBsaXN0IGl0ZW0uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFRTZXR0aW5nLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFNldHRpbmdMaXN0SXRlbU9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgbGFiZWwsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5lbmFibGVkKSB7XG4gICAgICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlcy5jaGVja2VkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzLmNoZWNrZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzU2V0dGluZ0xpc3RJdGVtLnJlYWRvbmx5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzU2V0dGluZ0xpc3RJdGVtLnJlYWRvbmx5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNOaWwodGhpcy5jaGVja2JveCkpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrYm94LnByb3AoXCJjaGVja2VkXCIsIHRoaXMuc2V0dGluZy5lbmFibGVkKTtcbiAgICAgICAgICB0aGlzLmNoZWNrYm94LnByb3AoXCJkaXNhYmxlZFwiLCB0aGlzLnJlYWRPbmx5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnM/Lm9uUmVmcmVzaD8uKCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlcy5zZXR0aW5nKTtcblxuICAgIGNvbnN0IGlkID0gYGtzLXNldHRpbmcke3RoaXMuY29tcG9uZW50SWR9YDtcbiAgICBjb25zdCBjaGVja2JveCA9ICQoXCI8aW5wdXQvPlwiLCB7XG4gICAgICBpZCxcbiAgICAgIHR5cGU6IFwiY2hlY2tib3hcIixcbiAgICB9KS5hZGRDbGFzcyhzdHlsZXMuY2hlY2tib3gpO1xuXG4gICAgdGhpcy5yZWFkT25seSA9IG9wdGlvbnM/LnJlYWRPbmx5ID8/IGZhbHNlO1xuICAgIGNoZWNrYm94LnByb3AoXCJkaXNhYmxlZFwiLCB0aGlzLnJlYWRPbmx5KTtcblxuICAgIGNoZWNrYm94Lm9uKFwiY2hhbmdlXCIsIChfZXZlbnQ6IEpRdWVyeS5DaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgaWYgKGNoZWNrYm94LmlzKFwiOmNoZWNrZWRcIikgJiYgIXNldHRpbmcuZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmNoZWNrKCkuY2F0Y2gocmVkaXJlY3RFcnJvcnNUb0NvbnNvbGUoY29uc29sZSkpO1xuICAgICAgfSBlbHNlIGlmICghY2hlY2tib3guaXMoXCI6Y2hlY2tlZFwiKSAmJiBzZXR0aW5nLmVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy51bmNoZWNrKCkuY2F0Y2gocmVkaXJlY3RFcnJvcnNUb0NvbnNvbGUoY29uc29sZSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50TGFiZWwuYmVmb3JlKGNoZWNrYm94KTtcbiAgICB0aGlzLmVsZW1lbnRMYWJlbC5wcm9wKFwiZm9yXCIsIGlkKTtcblxuICAgIHRoaXMuY2hlY2tib3ggPSBjaGVja2JveDtcbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske1NldHRpbmdMaXN0SXRlbS5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XTogJyR7dGhpcy5lbGVtZW50TGFiZWwudGV4dCgpfSdgO1xuICB9XG5cbiAgYXN5bmMgY2hlY2soaXNCYXRjaFByb2Nlc3MgPSBmYWxzZSkge1xuICAgIHRoaXMuc2V0dGluZy5lbmFibGVkID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnM/Lm9uQ2hlY2s/LmNhbGwoaXNCYXRjaFByb2Nlc3MpO1xuICAgIHRoaXMucmVxdWVzdFJlZnJlc2goKTtcbiAgfVxuXG4gIGFzeW5jIHVuY2hlY2soaXNCYXRjaFByb2Nlc3MgPSBmYWxzZSkge1xuICAgIHRoaXMuc2V0dGluZy5lbmFibGVkID0gZmFsc2U7XG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLm9uVW5DaGVjaz8uY2FsbChpc0JhdGNoUHJvY2Vzcyk7XG4gICAgdGhpcy5yZXF1ZXN0UmVmcmVzaCgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyByZWRpcmVjdEVycm9yc1RvQ29uc29sZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZXJyb3JzL2NvbnNvbGUuanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4vQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFVpQ29tcG9uZW50LCB0eXBlIFVpQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIEljb25CdXR0b25PcHRpb25zID0gVGhpc1R5cGU8SWNvbkJ1dHRvbj4gJlxuICBVaUNvbXBvbmVudE9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGluYWN0aXZlPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBvbkNsaWNrOiAoZXZlbnQ/OiBNb3VzZUV2ZW50KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgfTtcblxuLyoqXG4gKiBBIGJ1dHRvbiB0aGF0IGlzIHZpc3VhbGx5IHJlcHJlc2VudGVkIHRocm91Z2ggYW4gU1ZHIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBJY29uQnV0dG9uIGV4dGVuZHMgVWlDb21wb25lbnQge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IEljb25CdXR0b25PcHRpb25zO1xuICByZWFkT25seTogYm9vbGVhbjtcbiAgaW5hY3RpdmU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYW4gYEljb25CdXR0b25gLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIHBhdGhEYXRhIFRoZSBTVkcgcGF0aCBkYXRhIG9mIHRoZSBpY29uLlxuICAgKiBAcGFyYW0gdGl0bGUgVGhlIGB0aXRsZWAgb2YgdGhlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBpY29uIGJ1dHRvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogVWlDb21wb25lbnQsIHBhdGhEYXRhOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIG9wdGlvbnM/OiBJY29uQnV0dG9uT3B0aW9ucykge1xuICAgIHN1cGVyKHBhcmVudCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNCdXR0b24ucmVhZG9ubHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhzdHlsZXNCdXR0b24ucmVhZG9ubHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5hY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmluYWN0aXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzQnV0dG9uLmluYWN0aXZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnM/Lm9uUmVmcmVzaD8uKCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gJChcIjxkaXYvPlwiLCB7XG4gICAgICBodG1sOiBgPHN2ZyBzdHlsZT1cIndpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjxwYXRoIGQ9XCIke3BhdGhEYXRhfVwiLz48L3N2Zz5gLFxuICAgICAgdGl0bGUsXG4gICAgfSkuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmljb25CdXR0b24pO1xuXG4gICAgdGhpcy5yZWFkT25seSA9IG9wdGlvbnM/LnJlYWRPbmx5ID8/IGZhbHNlO1xuICAgIHRoaXMuaW5hY3RpdmUgPSBvcHRpb25zPy5pbmFjdGl2ZSA/PyBmYWxzZTtcblxuICAgIHRoaXMuZWxlbWVudC5vbihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbGljaygpLmNhdGNoKHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlKGNvbnNvbGUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtJY29uQnV0dG9uLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxuXG4gIGFzeW5jIGNsaWNrKCkge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zPy5vbkNsaWNrPy5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5yZXF1ZXN0UmVmcmVzaCgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpcywgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCIuLi8uLi9pbWFnZXMvSWNvbnMuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgSWNvbkJ1dHRvbiB9IGZyb20gXCIuL0ljb25CdXR0b24uanNcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSB9IGZyb20gXCIuL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9TZXR0aW5nc0xpc3QubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgVWlDb21wb25lbnQsIHR5cGUgVWlDb21wb25lbnRPcHRpb25zIH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgU2V0dGluZ3NMaXN0T3B0aW9ucyA9IFRoaXNUeXBlPFNldHRpbmdzTGlzdD4gJlxuICBVaUNvbXBvbmVudE9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgaGFzRW5hYmxlQWxsPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBoYXNEaXNhYmxlQWxsPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBvbkVuYWJsZUFsbD86ICgpID0+IHZvaWQ7XG4gICAgcmVhZG9ubHkgb25EaXNhYmxlQWxsPzogKCkgPT4gdm9pZDtcbiAgICByZWFkb25seSBvblJlc2V0PzogKCkgPT4gdm9pZDtcbiAgfTtcblxuLyoqXG4gKiBUaGUgYFNldHRpbmdzTGlzdGAgaXMgYSBgPHVsPmAgZGVzaWduZWQgdG8gaG9zdCBgU2V0dGluZ0xpc3RJdGVtYCBpbnN0YW5jZXMuXG4gKlxuICogSXQgaGFzIGVuYWJsZS9kaXNhYmxlIGJ1dHRvbnMgdG8gY2hlY2svdW5jaGVjayBhbGwgc2V0dGluZ3MgY29udGFpbmVkIGluIGl0LlxuICogTW9zdCBjb21tb25seSwgaXQgaXMgdXNlZCBhcyBwYXJ0IG9mIHRoZSBgU2V0dGluZ3NQYW5lbGAuXG4gKlxuICogVGhpcyBjb25zdHJ1Y3QgaXMgYWxzbyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgYW4gXCJpdGVtcyBsaXN0XCIgZm9yIGhpc3RvcmljIHJlYXNvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc0xpc3QgZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogU2V0dGluZ3NMaXN0T3B0aW9ucztcbiAgcmVhZG9ubHkgbGlzdDogSlF1ZXJ5O1xuXG4gIHJlYWRvbmx5IGRpc2FibGVBbGxCdXR0b246IEljb25CdXR0b24gfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGVuYWJsZUFsbEJ1dHRvbjogSWNvbkJ1dHRvbiB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgcmVzZXRCdXR0b246IEljb25CdXR0b24gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgU2V0dGluZ3NMaXN0YC5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgQSByZWZlcmVuY2UgdG8gdGhlIGhvc3QuXG4gICAqIEBwYXJhbSBvcHRpb25zIFdoaWNoIHRvb2xzIHNob3VsZCBiZSBhdmFpbGFibGUgb24gdGhlIGxpc3Q/XG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBvcHRpb25zPzogU2V0dGluZ3NMaXN0T3B0aW9ucykge1xuICAgIHN1cGVyKHBhcmVudCwgeyAuLi5vcHRpb25zIH0pO1xuXG4gICAgY29uc3QgdG9vbE9wdGlvbnMgPSB7XG4gICAgICBoYXNEaXNhYmxlQWxsOiB0cnVlLFxuICAgICAgaGFzRW5hYmxlQWxsOiB0cnVlLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICAgIGNvbnN0IGhhc1Rvb2xzID1cbiAgICAgIHRvb2xPcHRpb25zLmhhc0Rpc2FibGVBbGwgfHwgdG9vbE9wdGlvbnMuaGFzRW5hYmxlQWxsIHx8ICFpc05pbCh0b29sT3B0aW9ucy5vblJlc2V0KTtcblxuICAgIHRoaXMuZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3Moc3R5bGVzLmxpc3RDb250YWluZXIpO1xuXG4gICAgdGhpcy5saXN0ID0gJChcIjx1bC8+XCIpLmFkZENsYXNzKHN0eWxlcy5saXN0KS5hZGRDbGFzcyhzdHlsZXMuaXRlbXNMaXN0KTtcblxuICAgIHRoaXMuZWxlbWVudC5hcHBlbmQodGhpcy5saXN0KTtcblxuICAgIGlmIChoYXNUb29scykge1xuICAgICAgY29uc3QgdG9vbHMgPSBuZXcgQ29udGFpbmVyKHRoaXMsIHsgY2xhc3NlczogW3N0eWxlcy5saXN0VG9vbHNdIH0pO1xuXG4gICAgICBpZiAodG9vbE9wdGlvbnMuaGFzRW5hYmxlQWxsKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlQWxsQnV0dG9uID0gbmV3IEljb25CdXR0b24oXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIEljb25zLkNoZWNrYm94Q2hlY2ssXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5lbmFibGUuYWxsXCIpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uQ2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoXCJlbmFibGVBbGxcIiwgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRbMF0uZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzKGNoaWxkLCBTZXR0aW5nTGlzdEl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBjaGlsZC5jaGVjayh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBvcHRpb25zPy5vbkVuYWJsZUFsbD8uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdG9vbHMuYWRkQ2hpbGQodGhpcy5lbmFibGVBbGxCdXR0b24pO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9vbE9wdGlvbnMuaGFzRGlzYWJsZUFsbCkge1xuICAgICAgICB0aGlzLmRpc2FibGVBbGxCdXR0b24gPSBuZXcgSWNvbkJ1dHRvbihcbiAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgSWNvbnMuQ2hlY2tib3hVbkNoZWNrLFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuZGlzYWJsZS5hbGxcIiksXG4gICAgICAgICAge1xuICAgICAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudChcImRpc2FibGVBbGxcIiwgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRbMF0uZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzKGNoaWxkLCBTZXR0aW5nTGlzdEl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBjaGlsZC51bmNoZWNrKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG9wdGlvbnM/Lm9uRGlzYWJsZUFsbD8uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdG9vbHMuYWRkQ2hpbGQodGhpcy5kaXNhYmxlQWxsQnV0dG9uKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25SZXNldCA9IHRvb2xPcHRpb25zLm9uUmVzZXQ7XG4gICAgICBpZiAoIWlzTmlsKG9uUmVzZXQpKSB7XG4gICAgICAgIHRoaXMucmVzZXRCdXR0b24gPSBuZXcgSWNvbkJ1dHRvbihcbiAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgSWNvbnMuUmVzZXQsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5yZXNldFwiKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIG9uUmVzZXQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdG9vbHMuYWRkQ2hpbGQodGhpcy5yZXNldEJ1dHRvbik7XG4gICAgICB9XG5cbiAgICAgIHN1cGVyLmFkZENoaWxkKHRvb2xzKTtcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7U2V0dGluZ3NMaXN0Lm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFkZENoaWxkKGNoaWxkOiBVaUNvbXBvbmVudCk6IHRoaXMge1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpO1xuICAgIHRoaXMubGlzdC5hcHBlbmQoY2hpbGQuZWxlbWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCB7IHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvY29uc29sZS5qc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vLi4vLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQgc3R5bGVzQnV0dG9uIGZyb20gXCIuLi9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHR5cGUgeyBJY29uQnV0dG9uT3B0aW9ucyB9IGZyb20gXCIuLi9JY29uQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuLi9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9FeHBhbmRvQnV0dG9uLm1vZHVsZS5jc3NcIjtcblxuZXhwb3J0IHR5cGUgRXhwYW5kb0J1dHRvbk9wdGlvbnMgPSBUaGlzVHlwZTxFeHBhbmRvQnV0dG9uPiAmIEljb25CdXR0b25PcHRpb25zO1xuXG5leHBvcnQgY2xhc3MgRXhwYW5kb0J1dHRvbiBleHRlbmRzIFVpQ29tcG9uZW50IHtcbiAgZGVjbGFyZSByZWFkb25seSBvcHRpb25zOiBFeHBhbmRvQnV0dG9uT3B0aW9ucztcbiAgcmVhZE9ubHk6IGJvb2xlYW47XG4gIGluYWN0aXZlOiBib29sZWFuO1xuICBpbmVmZmVjdGl2ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhbiBleHBhbmRvIGVsZW1lbnQgdGhhdCBpcyBjb21tb25seSB1c2VkIHRvIGV4cGFuZCBhbmRcbiAgICogY29sbGFwc2VzIGEgc2VjdGlvbiBvZiB0aGUgVUkuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGlzIGV4cGFuZG8uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBvcHRpb25zPzogRXhwYW5kb0J1dHRvbk9wdGlvbnMpIHtcbiAgICBzdXBlcihwYXJlbnQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5lZmZlY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmluZWZmZWN0aXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzQnV0dG9uLmluZWZmZWN0aXZlKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zPy5vblJlZnJlc2g/LigpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIiwge1xuICAgICAgaHRtbDogYFxuICAgICAgPHN2ZyBzdHlsZT1cIndpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGNsYXNzPVwiJHtzdHlsZXMuZG93bn1cIj48cGF0aCBkPVwiJHtJY29ucy5FeHBhbmRDaXJjbGVEb3dufVwiLz48L3N2Zz5cbiAgICAgIDxzdmcgc3R5bGU9XCJ3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4O1wiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBjbGFzcz1cIiR7c3R5bGVzLnVwfVwiPjxwYXRoIGQ9XCIke0ljb25zLkV4cGFuZENpcmNsZVVwfVwiLz48L3N2Zz5cbiAgICAgIGAsXG4gICAgICB0aXRsZTogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pdGVtc1Nob3dcIiksXG4gICAgfSlcbiAgICAgIC5hZGRDbGFzcyhzdHlsZXNCdXR0b24uaWNvbkJ1dHRvbilcbiAgICAgIC5hZGRDbGFzcyhzdHlsZXMuZXhwYW5kb0J1dHRvbik7XG5cbiAgICB0aGlzLmVsZW1lbnQub24oXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2xpY2soKS5jYXRjaChyZWRpcmVjdEVycm9yc1RvQ29uc29sZShjb25zb2xlKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlYWRPbmx5ID0gb3B0aW9ucz8ucmVhZE9ubHkgPz8gZmFsc2U7XG4gICAgdGhpcy5pbmFjdGl2ZSA9IG9wdGlvbnM/LmluYWN0aXZlID8/IGZhbHNlO1xuICAgIHRoaXMuaW5lZmZlY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtFeHBhbmRvQnV0dG9uLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxuXG4gIHNldENvbGxhcHNlZCgpIHtcbiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzLmV4cGFuZGVkKTtcbiAgICB0aGlzLmVsZW1lbnQucHJvcChcInRpdGxlXCIsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLml0ZW1zU2hvd1wiKSk7XG4gIH1cbiAgc2V0RXhwYW5kZWQoKSB7XG4gICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlcy5leHBhbmRlZCk7XG4gICAgdGhpcy5lbGVtZW50LnByb3AoXCJ0aXRsZVwiLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pdGVtc0hpZGVcIikpO1xuICB9XG5cbiAgYXN5bmMgY2xpY2soKSB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9wdGlvbnM/Lm9uQ2xpY2s/LmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgRXhwYW5kb0J1dHRvbiB9IGZyb20gXCIuL2J1dHRvbnMvRXhwYW5kb0J1dHRvbi5qc1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4vQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IExhYmVsTGlzdEl0ZW0gfSBmcm9tIFwiLi9MYWJlbExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgc3R5bGVzU2V0dGluZ0xpc3RJdGVtIGZyb20gXCIuL1NldHRpbmdMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBVaUNvbXBvbmVudCwgdHlwZSBVaUNvbXBvbmVudEludGVyZmFjZSwgdHlwZSBVaUNvbXBvbmVudE9wdGlvbnMgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBDb2xsYXBzaWJsZVBhbmVsT3B0aW9ucyA9IFRoaXNUeXBlPENvbGxhcHNpYmxlUGFuZWw+ICZcbiAgVWlDb21wb25lbnRPcHRpb25zICYge1xuICAgIC8qKlxuICAgICAqIFNob3VsZCB0aGUgbWFpbiBjaGlsZCBiZSBleHBhbmRlZCByaWdodCBhd2F5P1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGluaXRpYWxseUV4cGFuZGVkPzogYm9vbGVhbjtcbiAgfTtcblxuLyoqXG4gKiBBIGBQYW5lbGAgaXMgYSBzZWN0aW9uIG9mIHRoZSBVSSB0aGF0IGNhbiBiZSBleHBhbmRlZCBhbmQgY29sbGFwc2VkXG4gKiB0aHJvdWdoIGFuIGV4cGFuZG8gYnV0dG9uLlxuICogVGhlIHBhbmVsIGFsc28gaGFzIGEgaGVhZCBlbGVtZW50LCB3aGljaCBpcyBleHRlbmRlZCB0byBjcmVhdGUgdGhlIHBhbmVsXG4gKiBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbGxhcHNpYmxlUGFuZWw8VEhlYWQgZXh0ZW5kcyBMYWJlbExpc3RJdGVtID0gTGFiZWxMaXN0SXRlbT4gZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogQ29sbGFwc2libGVQYW5lbE9wdGlvbnM7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXI6IFVpQ29tcG9uZW50O1xuICByZWFkb25seSBleHBhbmRvOiBFeHBhbmRvQnV0dG9uO1xuICByZWFkb25seSBoZWFkOiBUSGVhZDtcbiAgcHJvdGVjdGVkIF9tYWluQ2hpbGRWaXNpYmxlOiBib29sZWFuO1xuXG4gIGdldCBpc0V4cGFuZGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9tYWluQ2hpbGRWaXNpYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBzZXR0aW5ncyBwYW5lbCB0aGF0IGlzIHVzZWQgdG8gY29udGFpbiBhIHNpbmdsZSBjaGlsZCBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIGhlYWQgQW5vdGhlciBjb21wb25lbnQgdG8gaG9zdCBpbiB0aGUgaGVhZCBvZiB0aGUgcGFuZWwuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoaXMgcGFuZWwuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBoZWFkOiBUSGVhZCwgb3B0aW9ucz86IENvbGxhcHNpYmxlUGFuZWxPcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCBvcHRpb25zKTtcblxuICAgIHRoaXMuaGVhZCA9IGhlYWQ7XG4gICAgdGhpcy5jb250YWluZXIgPSBuZXcgQ29udGFpbmVyKHRoaXMpO1xuICAgIHRoaXMuY29udGFpbmVyLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzU2V0dGluZ0xpc3RJdGVtLnBhbmVsQ29udGVudCk7XG5cbiAgICAvLyBUaGUgZXhwYW5kbyBidXR0b24gZm9yIHRoaXMgcGFuZWwuXG4gICAgY29uc3QgZXhwYW5kbyA9IG5ldyBFeHBhbmRvQnV0dG9uKHBhcmVudCwge1xuICAgICAgb25DbGljazogKCkgPT4gdGhpcy50b2dnbGUoKSxcbiAgICB9KTtcbiAgICBoZWFkLmhlYWQuYWRkQ2hpbGQoZXhwYW5kbyk7XG5cbiAgICBoZWFkLmVsZW1lbnQuYXBwZW5kKHRoaXMuY29udGFpbmVyLmVsZW1lbnQpO1xuXG4gICAgaWYgKG9wdGlvbnM/LmluaXRpYWxseUV4cGFuZGVkKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5lbGVtZW50LnJlbW92ZUNsYXNzKHN0eWxlc1NldHRpbmdMaXN0SXRlbS5oaWRkZW4pO1xuICAgICAgZXhwYW5kby5zZXRFeHBhbmRlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5lbGVtZW50LmFkZENsYXNzKHN0eWxlc1NldHRpbmdMaXN0SXRlbS5oaWRkZW4pO1xuICAgIH1cblxuICAgIHRoaXMuX21haW5DaGlsZFZpc2libGUgPSBvcHRpb25zPy5pbml0aWFsbHlFeHBhbmRlZCA/PyBmYWxzZTtcbiAgICB0aGlzLmVsZW1lbnQgPSBoZWFkLmVsZW1lbnQ7XG4gICAgdGhpcy5leHBhbmRvID0gZXhwYW5kbztcblxuICAgIHRoaXMuYWRkQ2hpbGRyZW4oW3RoaXMuaGVhZCwgdGhpcy5jb250YWluZXJdKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtDb2xsYXBzaWJsZVBhbmVsLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxuXG4gIGFkZENoaWxkSGVhZChjaGlsZDogVWlDb21wb25lbnRJbnRlcmZhY2UpOiB0aGlzIHtcbiAgICB0aGlzLmhlYWQuYWRkQ2hpbGQoY2hpbGQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGFkZENoaWxkcmVuSGVhZChjaGlsZHJlbj86IEl0ZXJhYmxlPFVpQ29tcG9uZW50SW50ZXJmYWNlPik6IHRoaXMge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgIHRoaXMuaGVhZC5hZGRDaGlsZChjaGlsZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQ2hpbGRDb250ZW50KGNoaWxkOiBVaUNvbXBvbmVudCk6IHRoaXMge1xuICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGNoaWxkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBhZGRDaGlsZHJlbkNvbnRlbnQoY2hpbGRyZW4/OiBJdGVyYWJsZTxVaUNvbXBvbmVudEludGVyZmFjZT4pOiB0aGlzIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuID8/IFtdKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZChjaGlsZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2wgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHBhbmVsJ3MgY29udGVudHMuXG4gICAqXG4gICAqIEBwYXJhbSBleHBhbmQgU2hvdWxkIHRoZSBwYW5lbCBiZSBleHBhbmRlZD8gSWYgbm90IHNldCwgdGhlIHBhbmVsIGlzIHRvZ2dsZWQuXG4gICAqIEBwYXJhbSB0b2dnbGVOZXN0ZWQgQWxzbyB0b2dnbGUgYWxsIHBhbmVscyBpbnNpZGUgdGhpcyBwYW5lbD9cbiAgICovXG4gIHRvZ2dsZShleHBhbmQ6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsIHRvZ2dsZU5lc3RlZCA9IGZhbHNlKSB7XG4gICAgY29uc3QgdmlzaWJsZSA9IGV4cGFuZCAhPT0gdW5kZWZpbmVkID8gZXhwYW5kIDogIXRoaXMuX21haW5DaGlsZFZpc2libGU7XG4gICAgaWYgKHZpc2libGUgIT09IHRoaXMuX21haW5DaGlsZFZpc2libGUpIHtcbiAgICAgIHRoaXMuX21haW5DaGlsZFZpc2libGUgPSB2aXNpYmxlO1xuICAgICAgaWYgKHRoaXMuX21haW5DaGlsZFZpc2libGUpIHtcbiAgICAgICAgLy8gUmVmcmVzaCBwYW5lbCBVSSBvbiBleHBhbmQuXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlcXVlc3RSZWZyZXNoKHRydWUpO1xuICAgICAgICAvLyBTaG93IHRoZSBET00gZWxlbWVudC5cbiAgICAgICAgdGhpcy5jb250YWluZXIuZWxlbWVudC5yZW1vdmVDbGFzcyhzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uaGlkZGVuKTtcbiAgICAgICAgLy8gUmVmbGVjdCBleHBhbmRlZCBzdGF0ZSBvbiBleHBhbmRvLlxuICAgICAgICB0aGlzLmV4cGFuZG8uc2V0RXhwYW5kZWQoKTtcbiAgICAgICAgLy8gUmVmbGVjdCBleHBhbmRlZCBzdGF0ZSBmb3IgQ1NTLlxuICAgICAgICB0aGlzLmhlYWQuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uZXhwYW5kZWQpO1xuICAgICAgICAvLyBUaGlzIGlzIE5PVCBhIERPTSBldmVudCEgSXQgY2FuIG9ubHkgYmUgY2F1Z2h0IGJ5IGxpc3RlbmluZyBvbiB0aGlzIHBhbmVsIGRpcmVjdGx5LlxuICAgICAgICB0aGlzLmVsZW1lbnRbMF0uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJwYW5lbFNob3duXCIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzU2V0dGluZ0xpc3RJdGVtLmhpZGRlbik7XG4gICAgICAgIHRoaXMuZXhwYW5kby5zZXRDb2xsYXBzZWQoKTtcbiAgICAgICAgdGhpcy5oZWFkLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzU2V0dGluZ0xpc3RJdGVtLmV4cGFuZGVkKTtcbiAgICAgICAgdGhpcy5lbGVtZW50WzBdLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwicGFuZWxIaWRkZW5cIikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0b2dnbGVOZXN0ZWQpIHtcbiAgICAgIGNvbnN0IHRvZ2dsZUNoaWxkcmVuID0gKGNoaWxkcmVuOiBJdGVyYWJsZTxVaUNvbXBvbmVudEludGVyZmFjZT4pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgIGlmIChpczxDb2xsYXBzaWJsZVBhbmVsPihjaGlsZCwgQ29sbGFwc2libGVQYW5lbCkpIHtcbiAgICAgICAgICAgIGNoaWxkLnRvZ2dsZShleHBhbmQsIHRvZ2dsZU5lc3RlZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvZ2dsZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRvZ2dsZUNoaWxkcmVuKHRoaXMuY2hpbGRyZW4pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTZXR0aW5nIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBDb2xsYXBzaWJsZVBhbmVsLCB0eXBlIENvbGxhcHNpYmxlUGFuZWxPcHRpb25zIH0gZnJvbSBcIi4vQ29sbGFwc2libGVQYW5lbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBMYWJlbExpc3RJdGVtIH0gZnJvbSBcIi4vTGFiZWxMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nTGlzdEl0ZW0gfSBmcm9tIFwiLi9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBTZXR0aW5nc1BhbmVsT3B0aW9uczxUTGlzdEl0ZW0gZXh0ZW5kcyBMYWJlbExpc3RJdGVtID0gTGFiZWxMaXN0SXRlbT4gPVxuICBUaGlzVHlwZTxTZXR0aW5nc1BhbmVsPiAmXG4gICAgQ29sbGFwc2libGVQYW5lbE9wdGlvbnMgJiB7XG4gICAgICByZWFkb25seSBzZXR0aW5nSXRlbT86IFRMaXN0SXRlbTtcbiAgICB9O1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NQYW5lbDxcbiAgICBUU2V0dGluZyBleHRlbmRzIFNldHRpbmcgPSBTZXR0aW5nLFxuICAgIFRMaXN0SXRlbSBleHRlbmRzIExhYmVsTGlzdEl0ZW0gPSBMYWJlbExpc3RJdGVtLFxuICA+XG4gIGV4dGVuZHMgQ29sbGFwc2libGVQYW5lbFxuICBpbXBsZW1lbnRzIFNldHRpbmdMaXN0SXRlbVxue1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IFNldHRpbmdzUGFuZWxPcHRpb25zPFRMaXN0SXRlbT47XG4gIHJlYWRvbmx5IHNldHRpbmc6IFRTZXR0aW5nO1xuICByZWFkb25seSBzZXR0aW5nSXRlbTogVExpc3RJdGVtO1xuXG4gIGdldCBpc0V4cGFuZGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9tYWluQ2hpbGRWaXNpYmxlO1xuICB9XG5cbiAgLy8gU2V0dGluZ0xpc3RJdGVtIGludGVyZmFjZVxuICBnZXQgZWxlbWVudExhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLmhlYWQuZWxlbWVudDtcbiAgfVxuXG4gIGdldCByZWFkT25seSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBzZXQgcmVhZE9ubHkoX3ZhbHVlOiBib29sZWFuKSB7XG4gICAgLyogbm9vcCAqL1xuICB9XG5cbiAgYXN5bmMgY2hlY2soKSB7XG4gICAgdGhpcy5zZXR0aW5nLmVuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMucmVxdWVzdFJlZnJlc2goKTtcbiAgfVxuXG4gIGFzeW5jIHVuY2hlY2soKSB7XG4gICAgdGhpcy5zZXR0aW5nLmVuYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIHNldHRpbmdzIHBhbmVsIHRoYXQgaXMgdXNlZCB0byBjb250YWluIGEgbWFqb3Igc2VjdGlvbiBvZiB0aGUgVUkuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IC0gQSByZWZlcmVuY2UgdG8gdGhlIGhvc3QuXG4gICAqIEBwYXJhbSBzZXR0aW5nSXRlbSAtIFRoZSBVSSBlbGVtZW50IHRvIGJlIHBsYWNlZCBpbiB0aGUgaGVhZCBvZiB0aGUgcGFuZWwuXG4gICAqIEBwYXJhbSBzZXR0aW5nIC0gQW4gc2V0dGluZyBmb3Igd2hpY2ggdGhpcyBpcyB0aGUgc2V0dGluZ3MgcGFuZWwuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhpcyBwYW5lbC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZzogVFNldHRpbmcsXG4gICAgc2V0dGluZ0l0ZW06IFRMaXN0SXRlbSxcbiAgICBvcHRpb25zPzogU2V0dGluZ3NQYW5lbE9wdGlvbnM8VExpc3RJdGVtPixcbiAgKSB7XG4gICAgc3VwZXIocGFyZW50LCBzZXR0aW5nSXRlbSwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSBzZXR0aW5nSXRlbS5lbGVtZW50O1xuICAgIHRoaXMuc2V0dGluZ0l0ZW0gPSBzZXR0aW5nSXRlbTtcbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske1NldHRpbmdzUGFuZWwubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV06ICcke3RoaXMuc2V0dGluZ0l0ZW0uZWxlbWVudExhYmVsLnRleHQoKX0nYDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJvbmZpcmVTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9Cb25maXJlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8QnVpbGRpbmdVcGdyYWRlU2V0dGluZ3M+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3MsXG4gICAgX2xvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICBzZWN0aW9uU2V0dGluZzogQm9uZmlyZVNldHRpbmdzLFxuICApIHtcbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudXBncmFkZS5idWlsZGluZ3NcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0ocGFyZW50LCBzZXR0aW5ncywgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICB9KS5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSldKSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICAhT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5idWlsZGluZ3MpLnNvbWUoYnVpbGRpbmcgPT4gYnVpbGRpbmcuZW5hYmxlZCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2V0dGluZyBvZiBPYmplY3QudmFsdWVzKHRoaXMuc2V0dGluZy5idWlsZGluZ3MpKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihgJGJ1aWxkaW5ncy4ke3NldHRpbmcudXBncmFkZX0ubGFiZWxgKTtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IG5ldyBTZXR0aW5nTGlzdEl0ZW0odGhpcywgc2V0dGluZywgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBpdGVtcy5wdXNoKHsgYnV0dG9uOiBidXR0b24sIGxhYmVsOiBsYWJlbCB9KTtcbiAgICB9XG4gICAgLy8gRW5zdXJlIGJ1dHRvbnMgYXJlIGFkZGVkIGludG8gVUkgd2l0aCB0aGVpciBsYWJlbHMgYWxwaGFiZXRpemVkLlxuICAgIGl0ZW1zLnNvcnQoKGEsIGIpID0+IGEubGFiZWwubG9jYWxlQ29tcGFyZShiLmxhYmVsKSk7XG4gICAgY29uc3QgaXRlbXNMaXN0ID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzKTtcbiAgICBmb3IgKGNvbnN0IGJ1dHRvbiBvZiBpdGVtcykge1xuICAgICAgaXRlbXNMaXN0LmFkZENoaWxkKGJ1dHRvbi5idXR0b24pO1xuICAgIH1cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChpdGVtc0xpc3QpO1xuICB9XG59XG4iLCJpbXBvcnQgeyByZWRpcmVjdEVycm9yc1RvQ29uc29sZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZXJyb3JzL2NvbnNvbGUuanNcIjtcbmltcG9ydCBzdHlsZXMgZnJvbSBcIi4vQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB0eXBlIHsgSWNvbkJ1dHRvbk9wdGlvbnMgfSBmcm9tIFwiLi9JY29uQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIEJ1dHRvbk9wdGlvbnMgPSBUaGlzVHlwZTxCdXR0b24+ICZcbiAgSWNvbkJ1dHRvbk9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgYm9yZGVyPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBhbGlnbm1lbnQ/OiBcImxlZnRcIiB8IFwicmlnaHRcIjtcbiAgICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbiAgICByZWFkb25seSBjbGFzc2VzPzogQXJyYXk8c3RyaW5nPjtcbiAgfTtcblxuLyoqXG4gKiBBIGJ1dHRvbiB0aGF0IGhhcyBhIGxhYmVsIGFuZCBjYW4gb3B0aW9uYWxseSBoYXZlIGFuIFNWRyBpY29uLlxuICovXG5leHBvcnQgY2xhc3MgQnV0dG9uIGV4dGVuZHMgVWlDb21wb25lbnQge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IEJ1dHRvbk9wdGlvbnM7XG4gIHByb3RlY3RlZCByZWFkb25seSBfaWNvbkVsZW1lbnQ6IEpRdWVyeSB8IHVuZGVmaW5lZDtcbiAgcmVhZE9ubHk6IGJvb2xlYW47XG4gIGluYWN0aXZlOiBib29sZWFuO1xuICBpbmVmZmVjdGl2ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIGBCdXR0b25gLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gbGFiZWwgLSBUaGUgdGV4dCB0byBkaXNwbGF5IG9uIHRoZSBidXR0b24uXG4gICAqIEBwYXJhbSBwYXRoRGF0YSAtIFRoZSBTVkcgcGF0aCBkYXRhIG9mIHRoZSBpY29uLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBpY29uIGJ1dHRvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBwYXRoRGF0YTogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICAgb3B0aW9ucz86IEJ1dHRvbk9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXMucmVhZG9ubHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhzdHlsZXMucmVhZG9ubHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5hY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzLmluYWN0aXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzLmluYWN0aXZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluZWZmZWN0aXZlKSB7XG4gICAgICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlcy5pbmVmZmVjdGl2ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHN0eWxlcy5pbmVmZmVjdGl2ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zPy5vblJlZnJlc2g/LigpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIiwgeyB0aXRsZTogb3B0aW9ucz8udGl0bGUgfSkuYWRkQ2xhc3Moc3R5bGVzLmJ1dHRvbikudGV4dChsYWJlbCk7XG5cbiAgICBpZiAob3B0aW9ucz8uYm9yZGVyICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlcy5ib3JkZXJlZCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LmFsaWdubWVudCA9PT0gXCJyaWdodFwiKSB7XG4gICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzLmFsaWduUmlnaHQpO1xuICAgIH1cblxuICAgIGlmIChwYXRoRGF0YSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5faWNvbkVsZW1lbnQgPSAkKFxuICAgICAgICBgPHN2ZyBjbGFzcz1cIiR7c3R5bGVzLmJ1dHRvbkljb259XCIgc3R5bGU9XCJ3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4O1wiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48cGF0aCBkPVwiJHtwYXRoRGF0YX1cIi8+PC9zdmc+YCxcbiAgICAgICk7XG4gICAgICBpZiAob3B0aW9ucz8uYWxpZ25tZW50ID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZCh0aGlzLl9pY29uRWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsZW1lbnQucHJlcGVuZCh0aGlzLl9pY29uRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjbGFzc05hbWUgb2Ygb3B0aW9ucz8uY2xhc3NlcyA/PyBbXSkge1xuICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50Lm9uKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNsaWNrKCkuY2F0Y2gocmVkaXJlY3RFcnJvcnNUb0NvbnNvbGUoY29uc29sZSkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWFkT25seSA9IG9wdGlvbnM/LnJlYWRPbmx5ID8/IGZhbHNlO1xuICAgIHRoaXMuaW5hY3RpdmUgPSBvcHRpb25zPy5pbmFjdGl2ZSA/PyBmYWxzZTtcbiAgICB0aGlzLmluZWZmZWN0aXZlID0gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7QnV0dG9uLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxuXG4gIHVwZGF0ZUxhYmVsKGxhYmVsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVsZW1lbnQudGV4dChsYWJlbCk7XG4gICAgaWYgKHRoaXMuX2ljb25FbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxpZ25tZW50ID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZCh0aGlzLl9pY29uRWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsZW1lbnQucHJlcGVuZCh0aGlzLl9pY29uRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHVwZGF0ZVRpdGxlKHRpdGxlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVsZW1lbnQucHJvcChcInRpdGxlXCIsIHRpdGxlKTtcbiAgfVxuXG4gIGFzeW5jIGNsaWNrKCkge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zPy5vbkNsaWNrPy5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5yZXF1ZXN0UmVmcmVzaCgpO1xuICB9XG59XG4iLCJpbXBvcnQgc3R5bGVzIGZyb20gXCIuL0RlbGltaXRlci5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZWxpbWl0ZXIgZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgYERlbGltaXRlcmAuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIG9uIHRoZSBmaWVsZHNldC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGZpZWxkc2V0LlxuICAgKi9cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCkge1xuICAgIHN1cGVyKHBhcmVudCwge30pO1xuICAgIHRoaXMuZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3Moc3R5bGVzLmRlbGltaXRlcik7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7RGVsaW1pdGVyLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxufVxuIiwiaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9IZWFkZXJMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RJdGVtLCBMaXN0SXRlbU9wdGlvbnMgfSBmcm9tIFwiLi9MaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBIZWFkZXJMaXN0SXRlbU9wdGlvbnMgPSBUaGlzVHlwZTxIZWFkZXJMaXN0SXRlbT4gJiBMaXN0SXRlbU9wdGlvbnM7XG5cbmV4cG9ydCBjbGFzcyBIZWFkZXJMaXN0SXRlbSBleHRlbmRzIFVpQ29tcG9uZW50IGltcGxlbWVudHMgTGlzdEl0ZW0ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IExpc3RJdGVtT3B0aW9ucztcblxuICBnZXQgZWxlbWVudExhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0IGFuIGluZm9ybWF0aW9uYWwgdGV4dCBpdGVtLlxuICAgKiBUaGlzIGlzIHB1cmVseSBmb3IgY29zbWV0aWMvaW5mb3JtYXRpb25hbCB2YWx1ZSBpbiB0aGUgVUkuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBhcHBlYXIgb24gdGhlIGhlYWRlciBlbGVtZW50LlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgaGVhZGVyLlxuICAgKi9cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgdGV4dDogc3RyaW5nLCBvcHRpb25zPzogTGlzdEl0ZW1PcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCB7IC4uLm9wdGlvbnMgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSAkKFwiPGxpLz5cIiwgeyB0ZXh0IH0pLmFkZENsYXNzKHN0eWxlcy5oZWFkZXIpO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0hlYWRlckxpc3RJdGVtLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dOiAnJHt0aGlzLmVsZW1lbnRMYWJlbC50ZXh0KCl9J2A7XG4gIH1cbn1cbiIsImltcG9ydCB7IFVpQ29tcG9uZW50LCB0eXBlIFVpQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIElucHV0T3B0aW9ucyA9IFRoaXNUeXBlPElucHV0PiAmXG4gIFVpQ29tcG9uZW50T3B0aW9ucyAmIHtcbiAgICByZWFkb25seSBvbkNoYW5nZT86ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHJlYWRvbmx5IG9uRW50ZXI/OiAoY3VycmVudFZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgcmVhZG9ubHkgb25Fc2NhcGU/OiAoY3VycmVudFZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgcmVhZG9ubHkgc2VsZWN0ZWQ/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGNsYXNzZXM/OiBBcnJheTxzdHJpbmc+O1xuICB9O1xuXG5leHBvcnQgY2xhc3MgSW5wdXQgZXh0ZW5kcyBVaUNvbXBvbmVudDxIVE1MSW5wdXRFbGVtZW50PiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogSW5wdXRPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGFuIGlucHV0IGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gbGFiZWwgLSBUaGUgbGFiZWwgb24gdGhlIGlucHV0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIFVJIGVsZW1lbnQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBvcHRpb25zPzogSW5wdXRPcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCB7IC4uLm9wdGlvbnMgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSAkPEhUTUxJbnB1dEVsZW1lbnQ+KCc8aW5wdXQgdHlwZT1cInRleHRcIi8+JykuYWRkQ2xhc3MoXCJrcy1pbnB1dFwiKTtcblxuICAgIGZvciAoY29uc3QgY2xhc3NOYW1lIG9mIG9wdGlvbnM/LmNsYXNzZXMgPz8gW10pIHtcbiAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhjbGFzc05hbWUpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5vbkNoYW5nZSkge1xuICAgICAgdGhpcy5lbGVtZW50Lm9uKFwiY2hhbmdlXCIsICgpID0+IG9wdGlvbnMub25DaGFuZ2U/Lih0aGlzLmVsZW1lbnRbMF0udmFsdWUpKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8udmFsdWUpIHtcbiAgICAgIHRoaXMuZWxlbWVudFswXS52YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LnNlbGVjdGVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRbMF0uc2VsZWN0aW9uU3RhcnQgPSAwO1xuICAgICAgdGhpcy5lbGVtZW50WzBdLnNlbGVjdGlvbkVuZCA9IC0xO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudC5vbihcImtleXVwXCIsIChldmVudDogSlF1ZXJ5LktleVVwRXZlbnQpID0+IHtcbiAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgIG9wdGlvbnM/Lm9uRW50ZXI/Lih0aGlzLmVsZW1lbnRbMF0udmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRXNjYXBlXCI6XG4gICAgICAgICAgb3B0aW9ucz8ub25Fc2NhcGU/Lih0aGlzLmVsZW1lbnRbMF0udmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0lucHV0Lm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVWlDb21wb25lbnQsIHR5cGUgVWlDb21wb25lbnRPcHRpb25zIH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgUGFyYWdyYXBoT3B0aW9ucyA9IFRoaXNUeXBlPFBhcmFncmFwaD4gJlxuICBVaUNvbXBvbmVudE9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgY2xhc3Nlcz86IEFycmF5PHN0cmluZz47XG4gIH07XG5cbmV4cG9ydCBjbGFzcyBQYXJhZ3JhcGggZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogUGFyYWdyYXBoT3B0aW9ucztcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIHBhcmFncmFwaC5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCBpbnNpZGUgdGhlIHBhcmFncmFwaC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgVUkgZWxlbWVudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogVWlDb21wb25lbnQsIHRleHQ6IHN0cmluZywgb3B0aW9ucz86IFBhcmFncmFwaE9wdGlvbnMpIHtcbiAgICBzdXBlcihwYXJlbnQsIHsgLi4ub3B0aW9ucyB9KTtcblxuICAgIHRoaXMuZWxlbWVudCA9ICQ8SFRNTFBhcmFncmFwaEVsZW1lbnQ+KFwiPHAvPlwiKS50ZXh0KHRleHQpO1xuXG4gICAgZm9yIChjb25zdCBjbGFzc05hbWUgb2Ygb3B0aW9ucz8uY2xhc3NlcyA/PyBbXSkge1xuICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske1BhcmFncmFwaC5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvYWxlc2NlQXJyYXkgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tIFwiLi9CdXR0b24uanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4vQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgRGVsaW1pdGVyIH0gZnJvbSBcIi4vRGVsaW1pdGVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL0RpYWxvZy5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgc3R5bGVzRXhwbGFpbmVyIGZyb20gXCIuL0V4cGxhaW5lckxpdGVJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IEhlYWRlckxpc3RJdGVtIH0gZnJvbSBcIi4vSGVhZGVyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IElucHV0IH0gZnJvbSBcIi4vSW5wdXQuanNcIjtcbmltcG9ydCB7IFBhcmFncmFwaCB9IGZyb20gXCIuL1BhcmFncmFwaC5qc1wiO1xuaW1wb3J0IHN0eWxlc1Rvb2xiYXJMaXN0SXRlbSBmcm9tIFwiLi9Ub29sYmFyTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgVWlDb21wb25lbnQsIHR5cGUgVWlDb21wb25lbnRJbnRlcmZhY2UsIHR5cGUgVWlDb21wb25lbnRPcHRpb25zIH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgRGlhbG9nT3B0aW9ucyA9IFRoaXNUeXBlPERpYWxvZz4gJlxuICBVaUNvbXBvbmVudE9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgaGFzQ2FuY2VsPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBoYXNDbG9zZT86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgb25DYW5jZWw/OiAoKSA9PiB2b2lkO1xuICAgIHJlYWRvbmx5IG9uQ29uZmlybT86IChyZXN1bHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgICByZWFkb25seSBwcm9tcHQ/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHByb21wdFZhbHVlPzogc3RyaW5nO1xuICB9O1xuXG5leHBvcnQgY2xhc3MgRGlhbG9nIGV4dGVuZHMgVWlDb21wb25lbnQ8SFRNTERpYWxvZ0VsZW1lbnQ+IHtcbiAgZGVjbGFyZSByZWFkb25seSBvcHRpb25zOiBEaWFsb2dPcHRpb25zO1xuICByZWFkb25seSBjb250YWluZXI6IENvbnRhaW5lcjtcbiAgcmVhZG9ubHkgaGVhZDogQ29udGFpbmVyO1xuICByZXR1cm5WYWx1ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgZGlhbG9nLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBkaWFsb2cuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBvcHRpb25zPzogRGlhbG9nT3B0aW9ucykge1xuICAgIHN1cGVyKHBhcmVudCwgeyAuLi5vcHRpb25zIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gJDxIVE1MRGlhbG9nRWxlbWVudD4oXCI8ZGlhbG9nLz5cIilcbiAgICAgIC5hZGRDbGFzcyhcImRpYWxvZ1wiKVxuICAgICAgLmFkZENsYXNzKFwiaGVscFwiKVxuICAgICAgLmFkZENsYXNzKHN0eWxlcy5kaWFsb2cpO1xuXG4gICAgaWYgKG9wdGlvbnM/Lmhhc0Nsb3NlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5hZGRDaGlsZChcbiAgICAgICAgbmV3IEJ1dHRvbihwYXJlbnQsIFwiY2xvc2VcIiwgbnVsbCwge1xuICAgICAgICAgIGNsYXNzZXM6IFtzdHlsZXMuY2xvc2VdLFxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uQ2FuY2VsPy4oKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXR1cm5WYWx1ZSA9IG9wdGlvbnM/LnByb21wdFZhbHVlID8/IFwiXCI7XG5cbiAgICB0aGlzLmhlYWQgPSBuZXcgQ29udGFpbmVyKHBhcmVudCk7XG4gICAgdGhpcy5jb250YWluZXIgPSBuZXcgQ29udGFpbmVyKHBhcmVudCk7XG5cbiAgICB0aGlzLmFkZENoaWxkcmVuKFxuICAgICAgY29hbGVzY2VBcnJheShbXG4gICAgICAgIHRoaXMuaGVhZCxcbiAgICAgICAgb3B0aW9ucz8ucHJvbXB0XG4gICAgICAgICAgPyBuZXcgSW5wdXQocGFyZW50LCB7XG4gICAgICAgICAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb25FbnRlcjogKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJldHVyblZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMub25Db25maXJtPy4odGhpcy5yZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9uRXNjYXBlOiAoX3ZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vbkNhbmNlbD8uKCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5wcm9tcHRWYWx1ZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHRoaXMuY29udGFpbmVyLFxuICAgICAgICBuZXcgRGVsaW1pdGVyKHBhcmVudCksXG4gICAgICAgIG5ldyBDb250YWluZXIocGFyZW50LCB7XG4gICAgICAgICAgY2xhc3NlczogW3N0eWxlc1Rvb2xiYXJMaXN0SXRlbS50b29sYmFyXSxcbiAgICAgICAgfSkuYWRkQ2hpbGRyZW4oXG4gICAgICAgICAgY29hbGVzY2VBcnJheShbXG4gICAgICAgICAgICBuZXcgQnV0dG9uKHBhcmVudCwgXCJPS1wiLCBudWxsLCB7XG4gICAgICAgICAgICAgIGNsYXNzZXM6IFtzdHlsZXNCdXR0b24ubGFyZ2VdLFxuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIG9wdGlvbnM/Lm9uQ29uZmlybT8uKHRoaXMucmV0dXJuVmFsdWUpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBvcHRpb25zPy5oYXNDYW5jZWxcbiAgICAgICAgICAgICAgPyBuZXcgQnV0dG9uKHBhcmVudCwgXCJDYW5jZWxcIiwgbnVsbCwge1xuICAgICAgICAgICAgICAgICAgY2xhc3NlczogW3N0eWxlc0J1dHRvbi5sYXJnZV0sXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkNhbmNlbD8uKCk7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIF0pLFxuICAgICAgICApLFxuICAgICAgXSksXG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtEaWFsb2cubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG5cbiAgYWRkQ2hpbGRIZWFkKGNoaWxkOiBVaUNvbXBvbmVudEludGVyZmFjZSk6IHRoaXMge1xuICAgIHRoaXMuaGVhZC5hZGRDaGlsZChjaGlsZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgYWRkQ2hpbGRyZW5IZWFkKGNoaWxkcmVuPzogSXRlcmFibGU8VWlDb21wb25lbnRJbnRlcmZhY2U+KTogdGhpcyB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbiA/PyBbXSkge1xuICAgICAgdGhpcy5oZWFkLmFkZENoaWxkKGNoaWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRDaGlsZENvbnRlbnQoY2hpbGQ6IFVpQ29tcG9uZW50KTogdGhpcyB7XG4gICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoY2hpbGQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGFkZENoaWxkcmVuQ29udGVudChjaGlsZHJlbj86IEl0ZXJhYmxlPFVpQ29tcG9uZW50SW50ZXJmYWNlPik6IHRoaXMge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGNoaWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzaG93KCkge1xuICAgICQoXCIjZ2FtZVBhZ2VDb250YWluZXJcIikuYXBwZW5kKHRoaXMuZWxlbWVudCk7XG4gICAgdGhpcy5lbGVtZW50WzBdLnNob3coKTtcbiAgfVxuICBzaG93TW9kYWwoKSB7XG4gICAgJChcIiNnYW1lUGFnZUNvbnRhaW5lclwiKS5hcHBlbmQodGhpcy5lbGVtZW50KTtcbiAgICB0aGlzLmVsZW1lbnRbMF0uc2hvd01vZGFsKCk7XG4gIH1cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5lbGVtZW50WzBdLmNsb3NlKCk7XG4gICAgdGhpcy5lbGVtZW50LnJlbW92ZSgpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHByb21wdChcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB0aXRsZT86IHN0cmluZyxcbiAgICBpbml0aWFsVmFsdWU/OiBzdHJpbmcsXG4gICAgZXhwbGFpbmVyPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIG5ldyBEaWFsb2cocGFyZW50LCB7XG4gICAgICAgIGhhc0NhbmNlbDogdHJ1ZSxcbiAgICAgICAgaGFzQ2xvc2U6IGZhbHNlLFxuICAgICAgICBvbkNhbmNlbDogKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Db25maXJtOiAocmVzdWx0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHByb21wdDogdHJ1ZSxcbiAgICAgICAgcHJvbXB0VmFsdWU6IGluaXRpYWxWYWx1ZSxcbiAgICAgIH0pXG4gICAgICAgIC5hZGRDaGlsZHJlbkhlYWQoXG4gICAgICAgICAgY29hbGVzY2VBcnJheShbXG4gICAgICAgICAgICB0aXRsZSA/IG5ldyBIZWFkZXJMaXN0SXRlbShwYXJlbnQsIHRpdGxlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5ldyBQYXJhZ3JhcGgocGFyZW50LCB0ZXh0KSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKVxuICAgICAgICAuYWRkQ2hpbGRyZW5Db250ZW50KFxuICAgICAgICAgIGV4cGxhaW5lclxuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgbmV3IENvbnRhaW5lcihwYXJlbnQsIHtcbiAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFtzdHlsZXNFeHBsYWluZXIuZXhwbGFpbmVyXSxcbiAgICAgICAgICAgICAgICB9KS5hZGRDaGlsZHJlbihbbmV3IFBhcmFncmFwaChwYXJlbnQsIGV4cGxhaW5lcildKSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXSxcbiAgICAgICAgKVxuICAgICAgICAuc2hvd01vZGFsKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU2V0dGluZ01heCB9IGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgQnV0dG9uLCB0eXBlIEJ1dHRvbk9wdGlvbnMgfSBmcm9tIFwiLi4vQnV0dG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4uL1VpQ29tcG9uZW50LmpzXCI7XG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL01heEJ1dHRvbi5tb2R1bGUuY3NzXCI7XG5cbmV4cG9ydCB0eXBlIE1heEJ1dHRvbk9wdGlvbnMgPSBUaGlzVHlwZTxNYXhCdXR0b24+ICYgQnV0dG9uT3B0aW9ucztcblxuZXhwb3J0IGNsYXNzIE1heEJ1dHRvbiBleHRlbmRzIEJ1dHRvbiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogTWF4QnV0dG9uT3B0aW9ucztcbiAgcmVhZG9ubHkgc2V0dGluZzogU2V0dGluZ01heDtcblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBzZXR0aW5nOiBTZXR0aW5nTWF4LCBvcHRpb25zOiBNYXhCdXR0b25PcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCBcIlwiLCBudWxsLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgY2xhc3NlczogW3N0eWxlcy5tYXhCdXR0b24sIC4uLihvcHRpb25zPy5jbGFzc2VzID8/IFtdKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske01heEJ1dHRvbi5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uLy4uLy4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vLi4vLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIFNldHRpbmdPcHRpb25zLFxuICB0eXBlIFNldHRpbmdUaHJlc2hvbGQsXG4gIFNldHRpbmdUcmlnZ2VyLFxufSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IEJ1dHRvbiwgdHlwZSBCdXR0b25PcHRpb25zIH0gZnJvbSBcIi4uL0J1dHRvbi5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi4vQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgVHJpZ2dlckJ1dHRvbkJlaGF2aW9yID0gXCJpbnRlZ2VyXCIgfCBcInBlcmNlbnRhZ2VcIjtcblxuZXhwb3J0IHR5cGUgVHJpZ2dlckJ1dHRvbk9wdGlvbnMgPSBUaGlzVHlwZTxUcmlnZ2VyQnV0dG9uPiAmXG4gIEJ1dHRvbk9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgcmVuZGVyTGFiZWw/OiBib29sZWFuO1xuICB9O1xuXG5leHBvcnQgY2xhc3MgVHJpZ2dlckJ1dHRvbiBleHRlbmRzIEJ1dHRvbiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogVHJpZ2dlckJ1dHRvbk9wdGlvbnM7XG4gIHJlYWRvbmx5IGJlaGF2aW9yOiBUcmlnZ2VyQnV0dG9uQmVoYXZpb3I7XG4gIHJlYWRvbmx5IHNldHRpbmc6IFNldHRpbmdUcmlnZ2VyIHwgU2V0dGluZ1RocmVzaG9sZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFNldHRpbmdUcmlnZ2VyIHwgU2V0dGluZ1RocmVzaG9sZCxcbiAgICBfbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIG9wdGlvbnM6IFRyaWdnZXJCdXR0b25PcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihwYXJlbnQsIFwiXCIsIEljb25zLlRyaWdnZXIsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgY29uc3QgdHJpZ2dlclZhbHVlID1cbiAgICAgICAgICB0aGlzLmJlaGF2aW9yID09PSBcImludGVnZXJcIlxuICAgICAgICAgICAgPyB0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUodGhpcy5zZXR0aW5nLnRyaWdnZXIsIFwiaW52YXJpYW50XCIpXG4gICAgICAgICAgICA6IHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHRoaXMuc2V0dGluZy50cmlnZ2VyLCBcImludmFyaWFudFwiLCB0cnVlKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVRpdGxlKHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXJcIiwgW3RyaWdnZXJWYWx1ZV0pKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucz8ucmVuZGVyTGFiZWwgPz8gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlTGFiZWwodHJpZ2dlclZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pbmFjdGl2ZSkge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhzdHlsZXNCdXR0b24uaW5hY3RpdmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNCdXR0b24uaW5hY3RpdmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucz8ub25SZWZyZXNoPy5jYWxsKHRoaXMpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuYmVoYXZpb3IgPSBzZXR0aW5nIGluc3RhbmNlb2YgU2V0dGluZ1RyaWdnZXIgPyBcInBlcmNlbnRhZ2VcIiA6IFwiaW50ZWdlclwiO1xuXG4gICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZztcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtUcmlnZ2VyQnV0dG9uLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zLCBTZXR0aW5nVHJpZ2dlck1heCB9IGZyb20gXCIuLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgTWF4QnV0dG9uIH0gZnJvbSBcIi4vYnV0dG9ucy9NYXhCdXR0b24uanNcIjtcbmltcG9ydCB7IFRyaWdnZXJCdXR0b24gfSBmcm9tIFwiLi9idXR0b25zL1RyaWdnZXJCdXR0b24uanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0sIHR5cGUgU2V0dGluZ0xpc3RJdGVtT3B0aW9ucyB9IGZyb20gXCIuL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nTWF4TGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vU2V0dGluZ01heExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vU2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFNldHRpbmdNYXhUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zID0gVGhpc1R5cGU8U2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbT4gJlxuICBTZXR0aW5nTGlzdEl0ZW1PcHRpb25zICZcbiAgU2V0dGluZ01heExpc3RJdGVtT3B0aW9ucyAmXG4gIFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zICYge1xuICAgIHJlYWRvbmx5IHJlbmRlckxhYmVsVHJpZ2dlcj86IGJvb2xlYW47XG4gIH07XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nTWF4VHJpZ2dlckxpc3RJdGVtIGV4dGVuZHMgU2V0dGluZ0xpc3RJdGVtPFNldHRpbmdUcmlnZ2VyTWF4PiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogU2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbU9wdGlvbnM7XG4gIHJlYWRvbmx5IG1heEJ1dHRvbjogTWF4QnV0dG9uO1xuICByZWFkb25seSB0cmlnZ2VyQnV0dG9uOiBUcmlnZ2VyQnV0dG9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZzogU2V0dGluZ1RyaWdnZXJNYXgsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgb3B0aW9uczogU2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbU9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgc2V0dGluZywgbGFiZWwsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5tYXhCdXR0b24gPSBuZXcgTWF4QnV0dG9uKHBhcmVudCwgc2V0dGluZywge1xuICAgICAgYWxpZ25tZW50OiBcInJpZ2h0XCIsXG4gICAgICBib3JkZXI6IGZhbHNlLFxuICAgICAgY2xhc3NlczogW3N0eWxlc0J1dHRvbi5oZWFkQWN0aW9uXSxcbiAgICAgIG9uQ2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5vblNldE1heC5jYWxsKHRoaXMpO1xuICAgICAgfSxcbiAgICAgIG9uUmVmcmVzaDogb3B0aW9ucz8ub25SZWZyZXNoTWF4ID8gKCkgPT4gb3B0aW9ucy5vblJlZnJlc2hNYXg/LmNhbGwodGhpcykgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2VyQnV0dG9uID0gbmV3IFRyaWdnZXJCdXR0b24ocGFyZW50LCBzZXR0aW5nLCBsb2NhbGUsIHtcbiAgICAgIGJvcmRlcjogZmFsc2UsXG4gICAgICBjbGFzc2VzOiBbc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uXSxcbiAgICAgIG9uQ2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5vblNldFRyaWdnZXIuY2FsbCh0aGlzKTtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2g6IG9wdGlvbnM/Lm9uUmVmcmVzaFRyaWdnZXIgPyAoKSA9PiBvcHRpb25zLm9uUmVmcmVzaFRyaWdnZXI/LmNhbGwodGhpcykgOiB1bmRlZmluZWQsXG4gICAgICByZW5kZXJMYWJlbDogb3B0aW9ucz8ucmVuZGVyTGFiZWxUcmlnZ2VyID8/IHRydWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZENoaWxkcmVuSGVhZChbXG4gICAgICBuZXcgQ29udGFpbmVyKHBhcmVudCwgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pLFxuICAgICAgdGhpcy5tYXhCdXR0b24sXG4gICAgICB0aGlzLnRyaWdnZXJCdXR0b24sXG4gICAgXSk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7U2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbS5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XTogJyR7dGhpcy5lbGVtZW50TGFiZWwudGV4dCgpfSdgO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMsIFNldHRpbmdUcmlnZ2VyLCBTZXR0aW5nVHJpZ2dlck1heCB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7XG4gIFNldHRpbmdNYXhUcmlnZ2VyTGlzdEl0ZW0sXG4gIHR5cGUgU2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbU9wdGlvbnMsXG59IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IGNvbnN0IEJ1aWxkU2VjdGlvblRvb2xzID0ge1xuICBnZXRCdWlsZE9wdGlvbjogKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgb3B0aW9uOiBTZXR0aW5nVHJpZ2dlck1heCxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgc2VjdGlvblNldHRpbmc6IFNldHRpbmdUcmlnZ2VyLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgc2VjdGlvbkxhYmVsOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8U2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbU9wdGlvbnM+LFxuICApID0+IHtcbiAgICBjb25zdCBvblNldE1heCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5wcm9tcHQuYWJzb2x1dGVcIiksXG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLm1heCwgbG9jYWxlLnNlbGVjdGVkKSxcbiAgICAgICAgXSksXG4gICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi5tYXgpLFxuICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5idWlsZC5wcm9tcHRFeHBsYWluZXJcIiksXG4gICAgICApO1xuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICBvcHRpb24ubWF4ID0gLTE7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID09PSBcIjBcIikge1xuICAgICAgICBvcHRpb24uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBvcHRpb24ubWF4ID0gcGFyZW50Lmhvc3QucGFyc2VBYnNvbHV0ZSh2YWx1ZSkgPz8gb3B0aW9uLm1heDtcbiAgICB9O1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nTWF4VHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgb3B0aW9uLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXI6IG9wdGlvbnM/LmRlbGltaXRlcixcbiAgICAgIG9uQ2hlY2s6IGFzeW5jIChpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIGlmIChvcHRpb24ubWF4ID09PSAwICYmICFpc0JhdGNoUHJvY2Vzcykge1xuICAgICAgICAgIGF3YWl0IG9uU2V0TWF4KCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgb3B0aW9ucz8ub25DaGVjaz8uKGlzQmF0Y2hQcm9jZXNzKTtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2hNYXg6ICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5tYXhCdXR0b24udXBkYXRlTGFiZWwocGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLm1heCkpO1xuICAgICAgICBlbGVtZW50Lm1heEJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID1cbiAgICAgICAgICBvcHRpb24ubWF4IDwgMFxuICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5idWlsZC50aXRsZUluZmluaXRlXCIsIFtsYWJlbF0pXG4gICAgICAgICAgICA6IG9wdGlvbi5tYXggPT09IDBcbiAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5idWlsZC50aXRsZVplcm9cIiwgW2xhYmVsXSlcbiAgICAgICAgICAgICAgOiBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5idWlsZC50aXRsZVwiLCBbXG4gICAgICAgICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJBYnNvbHV0ZShvcHRpb24ubWF4KSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgfSxcbiAgICAgIG9uUmVmcmVzaFJlcXVlc3Q6ICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5tYXhCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLm1heCA9PT0gLTE7XG4gICAgICAgIGVsZW1lbnQubWF4QnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmIG9wdGlvbi5lbmFibGVkICYmIG9wdGlvbi5tYXggPT09IDA7XG5cbiAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID0gIW9wdGlvbi5lbmFibGVkIHx8IG9wdGlvbi50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmXG4gICAgICAgICAgb3B0aW9uLmVuYWJsZWQgJiZcbiAgICAgICAgICBzZWN0aW9uU2V0dGluZy50cmlnZ2VyID09PSAtMSAmJlxuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyID09PSAtMTtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2hUcmlnZ2VyOiAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyXCIsIFtcbiAgICAgICAgICBvcHRpb24udHJpZ2dlciA8IDBcbiAgICAgICAgICAgID8gc2VjdGlvblNldHRpbmcudHJpZ2dlciA8IDBcbiAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYnVpbGQuYmxvY2tlZFwiLCBbc2VjdGlvbkxhYmVsXSlcbiAgICAgICAgICAgICAgOiBgJHtwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNlY3Rpb25TZXR0aW5nLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSl9ICgke3BhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5idWlsZC5pbmhlcml0ZWRcIil9KWBcbiAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShvcHRpb24udHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKSxcbiAgICAgICAgXSk7XG4gICAgICB9LFxuICAgICAgb25TZXRNYXgsXG4gICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uob3B0aW9uLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgOiBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYnVpbGQuaW5oZXJpdGVkXCIpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uob3B0aW9uLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYnVpbGQucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24udHJpZ2dlciA9IHBhcmVudC5ob3N0LnBhcnNlUGVyY2VudGFnZSh2YWx1ZSk7XG4gICAgICAgIGF3YWl0IG9wdGlvbnM/Lm9uU2V0VHJpZ2dlcj8uY2FsbCh0aGlzKTtcbiAgICAgIH0sXG4gICAgICBvblVuQ2hlY2s6IChpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICBvcHRpb25zPy5vblVuQ2hlY2s/Lihpc0JhdGNoUHJvY2Vzcyk7XG4gICAgICB9LFxuICAgICAgcmVuZGVyTGFiZWxUcmlnZ2VyOiBvcHRpb25zPy5yZW5kZXJMYWJlbFRyaWdnZXIsXG4gICAgICB1cGdyYWRlSW5kaWNhdG9yOiBvcHRpb25zPy51cGdyYWRlSW5kaWNhdG9yLFxuICAgIH0pO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9LFxufTtcbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uLy4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucywgU2V0dGluZ1RocmVzaG9sZCwgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFRyaWdnZXJCdXR0b24gfSBmcm9tIFwiLi9idXR0b25zL1RyaWdnZXJCdXR0b24uanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0sIHR5cGUgU2V0dGluZ0xpc3RJdGVtT3B0aW9ucyB9IGZyb20gXCIuL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zID0gVGhpc1R5cGU8U2V0dGluZ1RyaWdnZXJMaXN0SXRlbT4gJlxuICBTZXR0aW5nTGlzdEl0ZW1PcHRpb25zICYge1xuICAgIHJlYWRvbmx5IG9uUmVmcmVzaFRyaWdnZXI/OiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICByZWFkb25seSBvblNldFRyaWdnZXI6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIHJlYWRvbmx5IHJlbmRlckxhYmVsVHJpZ2dlcj86IGJvb2xlYW47XG4gIH07XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPFxuICBUU2V0dGluZyBleHRlbmRzIFNldHRpbmdUcmlnZ2VyIHwgU2V0dGluZ1RocmVzaG9sZCA9IFNldHRpbmdUcmlnZ2VyIHwgU2V0dGluZ1RocmVzaG9sZCxcbj4gZXh0ZW5kcyBTZXR0aW5nTGlzdEl0ZW08VFNldHRpbmc+IHtcbiAgZGVjbGFyZSByZWFkb25seSBvcHRpb25zOiBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtT3B0aW9ucztcbiAgcmVhZG9ubHkgdHJpZ2dlckJ1dHRvbjogVHJpZ2dlckJ1dHRvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFRTZXR0aW5nLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihwYXJlbnQsIHNldHRpbmcsIGxhYmVsLCBvcHRpb25zKTtcblxuICAgIHRoaXMudHJpZ2dlckJ1dHRvbiA9IG5ldyBUcmlnZ2VyQnV0dG9uKHBhcmVudCwgc2V0dGluZywgbG9jYWxlLCB7XG4gICAgICBhbGlnbm1lbnQ6IFwicmlnaHRcIixcbiAgICAgIGJvcmRlcjogZmFsc2UsXG4gICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMub25TZXRUcmlnZ2VyLmNhbGwodGhpcyk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoOiBvcHRpb25zPy5vblJlZnJlc2hUcmlnZ2VyID8gKCkgPT4gb3B0aW9ucy5vblJlZnJlc2hUcmlnZ2VyPy5jYWxsKHRoaXMpIDogdW5kZWZpbmVkLFxuICAgICAgcmVuZGVyTGFiZWw6IG9wdGlvbnM/LnJlbmRlckxhYmVsVHJpZ2dlciA/PyB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkQ2hpbGRyZW5IZWFkKFtcbiAgICAgIG5ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSksXG4gICAgICB0aGlzLnRyaWdnZXJCdXR0b24sXG4gICAgXSk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7U2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XTogJyR7dGhpcy5lbGVtZW50TGFiZWwudGV4dCgpfSdgO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjb2FsZXNjZUFycmF5LCBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgQm9uZmlyZVNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL0JvbmZpcmVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJ1aWxkaW5nLCBTdGFnZWRCdWlsZGluZyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3NVaSB9IGZyb20gXCIuL0J1aWxkaW5nVXBncmFkZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IEJ1aWxkU2VjdGlvblRvb2xzIH0gZnJvbSBcIi4vQnVpbGRTZWN0aW9uVG9vbHMuanNcIjtcbmltcG9ydCB7IERlbGltaXRlciB9IGZyb20gXCIuL2NvbXBvbmVudHMvRGVsaW1pdGVyLmpzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHsgSGVhZGVyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL0hlYWRlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBCb25maXJlU2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8Qm9uZmlyZVNldHRpbmdzLCBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IEJvbmZpcmVTZXR0aW5ncyxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICkge1xuICAgIGNvbnNvbGUuZGVidWcoLi4uY2woYENvbnN0cnVjdGluZyAke0JvbmZpcmVTZXR0aW5nc1VpLm5hbWV9YCkpO1xuXG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLmJ1aWxkXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbShwYXJlbnQsIHNldHRpbmdzLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hUcmlnZ2VyOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXR0aW5nSXRlbS50cmlnZ2VyQnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcbiAgICAgICAgICAgIFwidWkudHJpZ2dlci5zZWN0aW9uXCIsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPCAwXG4gICAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmFjdGl2ZVwiKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbmZpbml0eVwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPCAwO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMCAmJlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5idWlsZGluZ3MpLnNvbWUoXyA9PiBfLmVuYWJsZWQgJiYgMCA8IF8ubWF4ICYmIF8udHJpZ2dlciA8IDApO1xuXG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoc2V0dGluZ3MuYnVpbGRpbmdzKS5zb21lKFxuICAgICAgICAgICAgICBfID0+IF8uZW5hYmxlZCAmJiAoMCA9PT0gXy5tYXggfHwgKF8udHJpZ2dlciA8IDAgJiYgc2V0dGluZ3MudHJpZ2dlciA8IDApKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBQb3N0LXN1cGVyKCkgY2hpbGQgaW5zZXJ0aW9uLCBzbyB3ZSBjYW4gdXNlIHRoaXMuX2dldEJ1aWxkT3B0aW9ucygpLlxuICAgIC8vIFdlIHdhbnQgdGhlIGFiaWxpdHkgdG8gdXNlIGB0aGlzYCBpbiBvdXIgY2FsbGJhY2tzLCB0byBjb25zdHJ1Y3QgbW9yZSBjb21wbGV4XG4gICAgLy8gdXNhZ2Ugc2NlbmFyaW9zIHdoZXJlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBlbnRpcmUgVUkgc2VjdGlvbi5cbiAgICB0aGlzLmFkZENoaWxkcmVuQ29udGVudChbXG4gICAgICBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgICAgb25SZXNldDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZy5sb2FkKHsgYnVpbGRpbmdzOiBuZXcgQm9uZmlyZVNldHRpbmdzKCkuYnVpbGRpbmdzIH0pO1xuICAgICAgICB9LFxuICAgICAgfSkuYWRkQ2hpbGRyZW4oXG4gICAgICAgIGNvYWxlc2NlQXJyYXkoXG4gICAgICAgICAgdGhpcy5ob3N0LmdhbWUuYmxkLmJ1aWxkaW5nR3JvdXBzLmZsYXRNYXAoYnVpbGRpbmdHcm91cCA9PiBbXG4gICAgICAgICAgICBuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgYnVpbGRpbmdHcm91cC50aXRsZSksXG4gICAgICAgICAgICAuLi5idWlsZGluZ0dyb3VwLmJ1aWxkaW5ncy5mbGF0TWFwKGJ1aWxkaW5nID0+XG4gICAgICAgICAgICAgIHRoaXMuX2dldEJ1aWxkT3B0aW9ucyh0aGlzLCBzZXR0aW5ncywgbG9jYWxlLCBsYWJlbCwgYnVpbGRpbmcpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGJ1aWxkaW5nR3JvdXAgIT09XG4gICAgICAgICAgICB0aGlzLmhvc3QuZ2FtZS5ibGQuYnVpbGRpbmdHcm91cHNbdGhpcy5ob3N0LmdhbWUuYmxkLmJ1aWxkaW5nR3JvdXBzLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgID8gbmV3IERlbGltaXRlcih0aGlzKVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgICBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgICAgaGFzRGlzYWJsZUFsbDogZmFsc2UsXG4gICAgICAgIGhhc0VuYWJsZUFsbDogZmFsc2UsXG4gICAgICB9KS5hZGRDaGlsZHJlbihbXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5hZGRpdGlvbmFsXCIpKSxcbiAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbSh0aGlzLCBzZXR0aW5ncy5nYXRoZXJDYXRuaXAsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5jYXRuaXBcIiksIHtcbiAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5lbmFibGVcIiwgW1xuICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uY2F0bmlwXCIpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW1xuICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uY2F0bmlwXCIpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBzZXR0aW5ncy50dXJuT25TdGVhbXdvcmtzLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5zdGVhbXdvcmtzXCIpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uc3RlYW13b3Jrc1wiKSxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5zdGVhbXdvcmtzXCIpLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHNldHRpbmdzLnR1cm5Pbk1hZ25ldG9zLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5tYWduZXRvc1wiKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLm1hZ25ldG9zXCIpLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLm1hZ25ldG9zXCIpLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHNldHRpbmdzLnR1cm5PblJlYWN0b3JzLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5yZWFjdG9yc1wiKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLnJlYWN0b3JzXCIpLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLnJlYWN0b3JzXCIpLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IEJ1aWxkaW5nVXBncmFkZVNldHRpbmdzVWkodGhpcywgc2V0dGluZ3MudXBncmFkZUJ1aWxkaW5ncywgbG9jYWxlLCBzZXR0aW5ncyksXG4gICAgICBdKSxcbiAgICBdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEJ1aWxkT3B0aW9ucyhcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBCb25maXJlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIHNlY3Rpb25MYWJlbDogc3RyaW5nLFxuICAgIGJ1aWxkaW5nOiBCdWlsZGluZyxcbiAgKSB7XG4gICAgaWYgKGJ1aWxkaW5nID09PSBcInVuaWNvcm5QYXN0dXJlXCIgfHwgaXNOaWwoc2V0dGluZ3MuYnVpbGRpbmdzW2J1aWxkaW5nXSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gcGFyZW50Lmhvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoYnVpbGRpbmcpLm1ldGE7XG4gICAgaWYgKCFpc05pbChtZXRhLnN0YWdlcykpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBPYmplY3QudmFsdWVzKHNldHRpbmdzLmJ1aWxkaW5ncykuZmluZChpdGVtID0+IGl0ZW0uYmFzZUJ1aWxkaW5nID09PSBidWlsZGluZylcbiAgICAgICAgPy5idWlsZGluZyBhcyBTdGFnZWRCdWlsZGluZztcbiAgICAgIHJldHVybiBbXG4gICAgICAgIEJ1aWxkU2VjdGlvblRvb2xzLmdldEJ1aWxkT3B0aW9uKFxuICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICBzZXR0aW5ncy5idWlsZGluZ3NbYnVpbGRpbmddLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICBtZXRhLnN0YWdlc1swXS5sYWJlbCxcbiAgICAgICAgICBzZWN0aW9uTGFiZWwsXG4gICAgICAgICAgeyByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlIH0sXG4gICAgICAgICksXG4gICAgICAgIEJ1aWxkU2VjdGlvblRvb2xzLmdldEJ1aWxkT3B0aW9uKFxuICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICBzZXR0aW5ncy5idWlsZGluZ3NbbmFtZV0sXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgIG1ldGEuc3RhZ2VzWzFdLmxhYmVsLFxuICAgICAgICAgIHNlY3Rpb25MYWJlbCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlLFxuICAgICAgICAgICAgdXBncmFkZUluZGljYXRvcjogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKCFpc05pbChtZXRhLmxhYmVsKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgQnVpbGRTZWN0aW9uVG9vbHMuZ2V0QnVpbGRPcHRpb24oXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHNldHRpbmdzLmJ1aWxkaW5nc1tidWlsZGluZ10sXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgIG1ldGEubGFiZWwsXG4gICAgICAgICAgc2VjdGlvbkxhYmVsLFxuICAgICAgICAgIHsgcmVuZGVyTGFiZWxUcmlnZ2VyOiBmYWxzZSB9LFxuICAgICAgICApLFxuICAgICAgXTtcbiAgICB9XG5cbiAgICByZXR1cm4gW107XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgRW5naW5lU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvRW5naW5lU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IHVjZmlyc3QgfSBmcm9tIFwiLi4vdG9vbHMvRm9ybWF0LmpzXCI7XG5pbXBvcnQgeyBFeHBhbmRvQnV0dG9uIH0gZnJvbSBcIi4vY29tcG9uZW50cy9idXR0b25zL0V4cGFuZG9CdXR0b24uanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBFbmdpbmVTZXR0aW5nc1VpIGV4dGVuZHMgU2V0dGluZ0xpc3RJdGVtIHtcbiAgcmVhZG9ubHkgZXhwYW5kbzogRXhwYW5kb0J1dHRvbjtcblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBzZXR0aW5nczogRW5naW5lU2V0dGluZ3MpIHtcbiAgICBjb25zdCBsYWJlbCA9IHVjZmlyc3QocGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5lbmdpbmVcIikpO1xuICAgIHN1cGVyKHBhcmVudCwgc2V0dGluZ3MsIGxhYmVsLCB7XG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5zdGFydCh0cnVlKTtcbiAgICAgIH0sXG4gICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLnN0b3AodHJ1ZSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5leHBhbmRvID0gbmV3IEV4cGFuZG9CdXR0b24odGhpcyk7XG4gICAgdGhpcy5hZGRDaGlsZHJlbkhlYWQoW1xuICAgICAgbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KSxcbiAgICAgIHRoaXMuZXhwYW5kbyxcbiAgICBdKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTGlzdEl0ZW0sIHR5cGUgTGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNMaXN0SXRlbSBmcm9tIFwiLi9MaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgdHlwZSB7IFRleHRCdXR0b24gfSBmcm9tIFwiLi9UZXh0QnV0dG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgQnV0dG9uTGlzdEl0ZW1PcHRpb25zID0gVGhpc1R5cGU8QnV0dG9uTGlzdEl0ZW0+ICYgTGlzdEl0ZW1PcHRpb25zO1xuXG5leHBvcnQgY2xhc3MgQnV0dG9uTGlzdEl0ZW0gZXh0ZW5kcyBMaXN0SXRlbSB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogQnV0dG9uTGlzdEl0ZW1PcHRpb25zO1xuICByZWFkb25seSBidXR0b246IFRleHRCdXR0b247XG5cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgYnV0dG9uOiBUZXh0QnV0dG9uLCBvcHRpb25zPzogQnV0dG9uTGlzdEl0ZW1PcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCB7IC4uLm9wdGlvbnMgfSk7XG5cbiAgICB0aGlzLmJ1dHRvbiA9IGJ1dHRvbjtcblxuICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNMaXN0SXRlbS5oZWFkKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kKGJ1dHRvbi5lbGVtZW50KTtcbiAgfVxufVxuIiwiaW1wb3J0IHN0eWxlc0RlbGltaXRlciBmcm9tIFwiLi9EZWxpbWl0ZXIubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9GaWVsZHNldC5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWwgZnJvbSBcIi4vTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBVaUNvbXBvbmVudCwgdHlwZSBVaUNvbXBvbmVudE9wdGlvbnMgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBGaWVsZHNldE9wdGlvbnMgPSBUaGlzVHlwZTxGaWVsZHNldD4gJlxuICBVaUNvbXBvbmVudE9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgZGVsaW1pdGVyPzogYm9vbGVhbjtcbiAgfTtcblxuZXhwb3J0IGNsYXNzIEZpZWxkc2V0IGV4dGVuZHMgVWlDb21wb25lbnQge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IEZpZWxkc2V0T3B0aW9ucztcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIGBGaWVsZHNldGAuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIG9uIHRoZSBmaWVsZHNldC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGZpZWxkc2V0LlxuICAgKi9cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgbGFiZWw6IHN0cmluZywgb3B0aW9ucz86IEZpZWxkc2V0T3B0aW9ucykge1xuICAgIHN1cGVyKHBhcmVudCwgeyAuLi5vcHRpb25zIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gJChcIjxmaWVsZHNldC8+XCIpLmFkZENsYXNzKHN0eWxlcy5maWVsZHNldCk7XG4gICAgaWYgKG9wdGlvbnM/LmRlbGltaXRlcikge1xuICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0RlbGltaXRlci5kZWxpbWl0ZXIpO1xuICAgIH1cbiAgICBjb25zdCBsZWdlbmQgPSAkKFwiPGxlZ2VuZC8+XCIpLnRleHQobGFiZWwpLmFkZENsYXNzKHN0eWxlc0xhYmVsLmxhYmVsKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kKGxlZ2VuZCk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7RmllbGRzZXQubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCBzdHlsZXNEZWxpbWl0ZXIgZnJvbSBcIi4vRGVsaW1pdGVyLm1vZHVsZS5jc3NcIjtcbmltcG9ydCBzdHlsZXNMYWJlbCBmcm9tIFwiLi9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCBzdHlsZXNTZXR0aW5nTGlzdEl0ZW0gZnJvbSBcIi4vU2V0dGluZ0xpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFVpQ29tcG9uZW50LCB0eXBlIFVpQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFJhZGlvSXRlbU9wdGlvbnMgPSBUaGlzVHlwZTxSYWRpb0l0ZW0+ICZcbiAgVWlDb21wb25lbnRPcHRpb25zICYge1xuICAgIC8qKlxuICAgICAqIFdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhpcyByYWRpbyBpdGVtLlxuICAgICAqL1xuICAgIG9uQ2hlY2s/OiAoaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIHRoZXJlIGJlIGFkZGl0aW9uYWwgcGFkZGluZyBiZWxvdyB0aGlzIGVsZW1lbnQ/XG4gICAgICovXG4gICAgZGVsaW1pdGVyPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNob3VsZCBhbiBpbmRpY2F0b3IgYmUgcmVuZGVyZWQgaW4gZnJvbnQgb2YgdGhlIGVsZW1lbnQsXG4gICAgICogdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGFuIHVwZ3JhZGUgb2YgYSBwcmlvciBzZXR0aW5nP1xuICAgICAqL1xuICAgIHVwZ3JhZGVJbmRpY2F0b3I/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIHRoZSB1c2VyIGJlIHByZXZlbnRlZCBmcm9tIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQ/XG4gICAgICovXG4gICAgcmVhZE9ubHk/OiBib29sZWFuO1xuICB9O1xuXG5leHBvcnQgY2xhc3MgUmFkaW9JdGVtPFRTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ09wdGlvbnMgPSBTZXR0aW5nT3B0aW9ucz4gZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogUmFkaW9JdGVtT3B0aW9ucztcbiAgcmVhZG9ubHkgc2V0dGluZzogVFNldHRpbmc7XG4gIHJlYWRvbmx5IG9wdGlvbjogVFNldHRpbmdbXCJvcHRpb25zXCJdWzBdO1xuICByZWFkb25seSBlbGVtZW50TGFiZWw6IEpRdWVyeTxIVE1MTGFiZWxFbGVtZW50PjtcbiAgcmVhZG9ubHkgaW5wdXQ6IEpRdWVyeTtcblxuICByZWFkT25seTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uc3RydWN0IGEgbmV3IHJhZGlvIHNldHRpbmcgZWxlbWVudC5cbiAgICogVGhpcyBpcyBhIHJhZGlvIGlucHV0IHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgaG9zdGVkIGluIGEgYEZpZWxkc2V0YC5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgVGhlIHVzZXJzY3JpcHQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBzZXR0aW5nIFRoZSBzZXR0aW5nIHRoaXMgZWxlbWVudCBpcyBsaW5rZWQgdG8uXG4gICAqIEBwYXJhbSBvcHRpb24gVGhlIHNwZWNpZmljIG9wdGlvbiBvdXQgb2YgdGhlIHNldHRpbmcgdGhhdCB0aGlzIHJhZGlvIGl0ZW0gcmVwcmVzZW50cy5cbiAgICogQHBhcmFtIGdyb3VwS2V5IEEgdW5pcXVlIG5hbWUgZm9yIHRoZSBncm91cCBvZiByYWRpbyBpdGVtcyB0aGlzIG9uZSBiZWxvbmdzIHRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGlzIHJhZGlvIGl0ZW0uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFRTZXR0aW5nLFxuICAgIG9wdGlvbjogVFNldHRpbmdbXCJvcHRpb25zXCJdWzBdLFxuICAgIGdyb3VwS2V5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFJhZGlvSXRlbU9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICB0aGlzLmlucHV0LnByb3AoXCJkaXNhYmxlZFwiLCB0aGlzLnJlYWRPbmx5KTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSAkKFwiPGRpdi8+XCIpO1xuICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uc2V0dGluZyk7XG5cbiAgICBpZiAob3B0aW9ucz8uZGVsaW1pdGVyID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzRGVsaW1pdGVyLmRlbGltaXRlcik7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50TGFiZWwgPSAkPEhUTUxMYWJlbEVsZW1lbnQ+KFwiPGxhYmVsLz5cIiwge1xuICAgICAgdGV4dDogYCR7b3B0aW9ucz8udXBncmFkZUluZGljYXRvciA/IFwi4q6kIFwiIDogXCJcIn0ke29wdGlvbi5sYWJlbH1gLFxuICAgIH0pLmFkZENsYXNzKHN0eWxlc0xhYmVsLmxhYmVsKTtcblxuICAgIGNvbnN0IGlucHV0ID0gJChcIjxpbnB1dC8+XCIsIHtcbiAgICAgIG5hbWU6IGdyb3VwS2V5LFxuICAgICAgdHlwZTogXCJyYWRpb1wiLFxuICAgIH0pLmFkZENsYXNzKFwia3MtcmFkaW9cIik7XG5cbiAgICB0aGlzLnJlYWRPbmx5ID0gb3B0aW9ucz8ucmVhZE9ubHkgPz8gZmFsc2U7XG5cbiAgICBpbnB1dC5vbihcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmcuc2VsZWN0ZWQgPSBvcHRpb24udmFsdWU7XG4gICAgICBpZiAoIWlzTmlsKG9wdGlvbnM/Lm9uQ2hlY2spKSB7XG4gICAgICAgIG9wdGlvbnMub25DaGVjaygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50TGFiZWwucHJlcGVuZChpbnB1dCk7XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZCh0aGlzLmVsZW1lbnRMYWJlbCk7XG5cbiAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZztcbiAgICB0aGlzLm9wdGlvbiA9IG9wdGlvbjtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtSYWRpb0l0ZW0ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV06ICcke3RoaXMuZWxlbWVudExhYmVsLnRleHQoKX0nYDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgRmllbGRzZXQgfSBmcm9tIFwiLi9GaWVsZHNldC5qc1wiO1xuaW1wb3J0IHsgUmFkaW9JdGVtIH0gZnJvbSBcIi4vUmFkaW9JdGVtLmpzXCI7XG5pbXBvcnQgeyBVaUNvbXBvbmVudCwgdHlwZSBVaUNvbXBvbmVudE9wdGlvbnMgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBPcHRpb25zTGlzdEl0ZW1PcHRpb25zID0gVGhpc1R5cGU8T3B0aW9uc0xpc3RJdGVtPiAmXG4gIFVpQ29tcG9uZW50T3B0aW9ucyAmIHtcbiAgICByZWFkb25seSBvbkNoZWNrPzogKGlzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4gdm9pZDtcbiAgICByZWFkb25seSByZWFkT25seT86IGJvb2xlYW47XG4gIH07XG5cbmV4cG9ydCBjbGFzcyBPcHRpb25zTGlzdEl0ZW08VFNldHRpbmcgZXh0ZW5kcyBTZXR0aW5nT3B0aW9ucyA9IFNldHRpbmdPcHRpb25zPiBleHRlbmRzIFVpQ29tcG9uZW50IHtcbiAgZGVjbGFyZSByZWFkb25seSBvcHRpb25zOiBPcHRpb25zTGlzdEl0ZW1PcHRpb25zO1xuICByZWFkb25seSBmaWVsZHNldDogRmllbGRzZXQ7XG4gIHJlYWRvbmx5IHNldHRpbmc6IFRTZXR0aW5nO1xuICByZWFkb25seSBfaXRlbXM6IEFycmF5PFJhZGlvSXRlbT47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIG5ldyBvcHRpb25zIHNldHRpbmcgZWxlbWVudC5cbiAgICogVGhpcyBpcyBhIGxpc3Qgb2Ygb3B0aW9ucywgd2hlcmUgdGhlIHNlbGVjdGVkIG9wdGlvbiB3aWxsIGJlIHB1dCBpbnRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBUaGUgdXNlcnNjcmlwdCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBvbiB0aGUgc2V0dGluZyBlbGVtZW50LlxuICAgKiBAcGFyYW0gc2V0dGluZyBUaGUgc2V0dGluZyB0aGlzIGVsZW1lbnQgaXMgbGlua2VkIHRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgbGlzdCBpdGVtLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIHNldHRpbmc6IFRTZXR0aW5nLFxuICAgIG9wdGlvbnM/OiBPcHRpb25zTGlzdEl0ZW1PcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihwYXJlbnQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5faXRlbXMpIHtcbiAgICAgICAgICBpZiAob3B0aW9uLm9wdGlvbi52YWx1ZSA9PT0gdGhpcy5zZXR0aW5nLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICBvcHRpb24uaW5wdXQucHJvcChcImNoZWNrZWRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucz8ub25SZWZyZXNoPy4oKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSAkKFwiPGxpLz5cIik7XG5cbiAgICB0aGlzLmZpZWxkc2V0ID0gbmV3IEZpZWxkc2V0KHBhcmVudCwgbGFiZWwpO1xuICAgIHRoaXMuYWRkQ2hpbGQodGhpcy5maWVsZHNldCk7XG5cbiAgICB0aGlzLl9pdGVtcyA9IG5ldyBBcnJheTxSYWRpb0l0ZW0+KCk7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2Ygc2V0dGluZy5vcHRpb25zKSB7XG4gICAgICB0aGlzLl9pdGVtcy5wdXNoKFxuICAgICAgICBuZXcgUmFkaW9JdGVtKHBhcmVudCwgc2V0dGluZywgb3B0aW9uLCBsYWJlbCwge1xuICAgICAgICAgIG9uQ2hlY2s6IG9wdGlvbnM/Lm9uQ2hlY2ssXG4gICAgICAgICAgcmVhZE9ubHk6IG9wdGlvbnM/LnJlYWRPbmx5LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZmllbGRzZXQuYWRkQ2hpbGRyZW4odGhpcy5faXRlbXMpO1xuXG4gICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZztcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtPcHRpb25zTGlzdEl0ZW0ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvY29uc29sZS5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9UZXh0QnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFVpQ29tcG9uZW50LCB0eXBlIFVpQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFRleHRCdXR0b25PcHRpb25zID0gVGhpc1R5cGU8VGV4dEJ1dHRvbj4gJlxuICBVaUNvbXBvbmVudE9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgb25DbGljaz86IChldmVudD86IE1vdXNlRXZlbnQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICB9O1xuXG5leHBvcnQgY2xhc3MgVGV4dEJ1dHRvbiBleHRlbmRzIFVpQ29tcG9uZW50IHtcbiAgZGVjbGFyZSByZWFkb25seSBvcHRpb25zOiBUZXh0QnV0dG9uT3B0aW9ucztcbiAgcmVhZE9ubHk6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgbGFiZWw/OiBzdHJpbmcsIG9wdGlvbnM/OiBUZXh0QnV0dG9uT3B0aW9ucykge1xuICAgIHN1cGVyKHBhcmVudCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNCdXR0b24ucmVhZG9ubHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhzdHlsZXNCdXR0b24ucmVhZG9ubHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucz8ub25SZWZyZXNoPy5jYWxsKHRoaXMpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3Moc3R5bGVzLnRleHRCdXR0b24pO1xuICAgIGlmIChsYWJlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnQudGV4dChsYWJlbCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGl0bGUgPSBvcHRpb25zPy50aXRsZTtcbiAgICBpZiAoIWlzTmlsKHRpdGxlKSkge1xuICAgICAgdGhpcy5lbGVtZW50LnByb3AoXCJ0aXRsZVwiLCB0aXRsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWFkT25seSA9IGZhbHNlO1xuXG4gICAgdGhpcy5lbGVtZW50Lm9uKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNsaWNrKCkuY2F0Y2gocmVkaXJlY3RFcnJvcnNUb0NvbnNvbGUoY29uc29sZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske1RleHRCdXR0b24ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG5cbiAgYXN5bmMgY2xpY2soKSB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9wdGlvbnM/Lm9uQ2xpY2s/LmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQgeyBrc1ZlcnNpb24gfSBmcm9tIFwiLi4vS2l0dGVuU2NpZW50aXN0cy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbmdpbmVTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9FbmdpbmVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgeyBCdXR0b25MaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvQnV0dG9uTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgeyBEZWxpbWl0ZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RlbGltaXRlci5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7IExhYmVsTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL2NvbXBvbmVudHMvTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBPcHRpb25zTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL09wdGlvbnNMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNTZXR0aW5nTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFRleHRCdXR0b24gfSBmcm9tIFwiLi9jb21wb25lbnRzL1RleHRCdXR0b24uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbHNVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8RW5naW5lU2V0dGluZ3M+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogRW5naW5lU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtJbnRlcm5hbHNVaS5uYW1lfWApKTtcblxuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgTGFiZWxMaXN0SXRlbShwYXJlbnQsIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuaW50ZXJuYWxzXCIpLCB7XG4gICAgICAgIGNsYXNzZXM6IFtzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uY2hlY2tlZCwgc3R5bGVzU2V0dGluZ0xpc3RJdGVtLnNldHRpbmddLFxuICAgICAgICBpY29uOiBJY29ucy5TZXR0aW5ncyxcbiAgICAgIH0pLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pLFxuICAgICk7XG5cbiAgICB0aGlzLmFkZENoaWxkcmVuQ29udGVudChbXG4gICAgICBuZXcgU2V0dGluZ3NMaXN0KHBhcmVudCwge1xuICAgICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICAgIH0pLmFkZENoaWxkcmVuKFtcbiAgICAgICAgbmV3IEJ1dHRvbkxpc3RJdGVtKFxuICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICBuZXcgVGV4dEJ1dHRvbihcbiAgICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuaW50ZXJuYWxzLmludGVydmFsXCIsIFtzZXR0aW5ncy5pbnRlcnZhbF0pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgICAgICAgcGFyZW50LFxuICAgICAgICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbnRlcm5hbHMuaW50ZXJ2YWwucHJvbXB0XCIpLFxuICAgICAgICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbnRlcm5hbHMuaW50ZXJ2YWwucHJvbXB0VGl0bGVcIiwgW1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJBYnNvbHV0ZShzZXR0aW5ncy5pbnRlcnZhbCwgbG9jYWxlLnNlbGVjdGVkKSxcbiAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUoc2V0dGluZ3MuaW50ZXJ2YWwpLFxuICAgICAgICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbnRlcm5hbHMuaW50ZXJ2YWwucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCIwXCIpIHtcbiAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5pbnRlcnZhbCA9IHBhcmVudC5ob3N0LnBhcnNlQWJzb2x1dGUodmFsdWUpID8/IHNldHRpbmdzLmludGVydmFsO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvblJlZnJlc2goKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnRleHQoXG4gICAgICAgICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLmludGVybmFscy5pbnRlcnZhbFwiLCBbc2V0dGluZ3MuaW50ZXJ2YWxdKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgICBuZXcgRGVsaW1pdGVyKHBhcmVudCksXG5cbiAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbShwYXJlbnQsIHNldHRpbmdzLmtzQ29sdW1uLCBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLmtzQ29sdW1uXCIpLCB7XG4gICAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgICAgcGFyZW50Lmhvc3QucmVidWlsZFVpKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlYnVpbGRVaSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgRGVsaW1pdGVyKHBhcmVudCksXG5cbiAgICAgICAgbmV3IE9wdGlvbnNMaXN0SXRlbShwYXJlbnQsIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubGFuZ3VhZ2VcIiksIHNldHRpbmdzLmxvY2FsZSwge1xuICAgICAgICAgIG9uQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlYnVpbGRVaSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgRGVsaW1pdGVyKHBhcmVudCksXG5cbiAgICAgICAgbmV3IExhYmVsTGlzdEl0ZW0ocGFyZW50LCBgS2l0dGVuIFNjaWVudGlzdHMgJHtrc1ZlcnNpb24oXCJ2XCIpfWApLFxuICAgICAgXSksXG4gICAgXSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVHJhbnNsYXRlZFN0cmluZyB9IGZyb20gXCIuLi8uLi9FbmdpbmUuanNcIjtcbmltcG9ydCBzdHlsZXMgZnJvbSBcIi4vRXhwbGFpbmVyTGl0ZUl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgVWlDb21wb25lbnQsIHR5cGUgVWlDb21wb25lbnRPcHRpb25zIH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgRXhwbGFpbmVyTGlzdEl0ZW1PcHRpb25zPFRLaXR0ZW5HYW1lTGl0ZXJhbCBleHRlbmRzIGAkJHtzdHJpbmd9YD4gPSBVaUNvbXBvbmVudE9wdGlvbnMgJlxuICBUaGlzVHlwZTxFeHBsYWluZXJMaXN0SXRlbTxUS2l0dGVuR2FtZUxpdGVyYWw+PjtcblxuZXhwb3J0IGNsYXNzIEV4cGxhaW5lckxpc3RJdGVtPFRLaXR0ZW5HYW1lTGl0ZXJhbCBleHRlbmRzIGAkJHtzdHJpbmd9YD4gZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogRXhwbGFpbmVyTGlzdEl0ZW1PcHRpb25zPFRLaXR0ZW5HYW1lTGl0ZXJhbD47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhbiBlbGVtZW50IHRvIGV4cGxhaW4gYW4gYXJlYSBvZiB0aGUgVUkuXG4gICAqIFRoaXMgaXMgcHVyZWx5IGZvciBjb3NtZXRpYy9pbmZvcm1hdGlvbmFsIHZhbHVlIGluIHRoZSBVSS5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIGtleSAtIFRoZSBpMThuIGtleSBmb3IgdGhlIHRleHQgdG8gYXBwZWFyIG9uIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoaXMgZXhwbGFpbmVyLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBrZXk6IFRyYW5zbGF0ZWRTdHJpbmc8VEtpdHRlbkdhbWVMaXRlcmFsPixcbiAgICBvcHRpb25zPzogRXhwbGFpbmVyTGlzdEl0ZW1PcHRpb25zPFRLaXR0ZW5HYW1lTGl0ZXJhbD4sXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgeyAuLi5vcHRpb25zIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gJChcIjxsaS8+XCIsIHsgdGV4dDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oa2V5KSB9KS5hZGRDbGFzcyhzdHlsZXMuZXhwbGFpbmVyKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtFeHBsYWluZXJMaXN0SXRlbS5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZpbHRlckl0ZW1zLCB0eXBlIExvZ0ZpbHRlclNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL0xvZ0ZpbHRlclNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgeyBFeHBsYWluZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvRXhwbGFpbmVyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL2NvbXBvbmVudHMvTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBMb2dGaWx0ZXJzU2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8TG9nRmlsdGVyU2V0dGluZ3M+IHtcbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgc2V0dGluZ3M6IExvZ0ZpbHRlclNldHRpbmdzKSB7XG4gICAgY29uc29sZS5kZWJ1ZyguLi5jbChgQ29uc3RydWN0aW5nICR7TG9nRmlsdGVyc1NldHRpbmdzVWkubmFtZX1gKSk7XG5cbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuZmlsdGVyXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pLFxuICAgICk7XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChcbiAgICAgIG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICAgIH0pLmFkZENoaWxkcmVuKFtcbiAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbSh0aGlzLCBzZXR0aW5ncy5kaXNhYmxlS0dMb2csIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcImZpbHRlci5hbGxLR1wiKSksXG4gICAgICBdKSxcbiAgICApO1xuXG4gICAgY29uc3QgbGlzdEZpbHRlcnMgPSBuZXcgU2V0dGluZ3NMaXN0KHRoaXMpLmFkZENoaWxkcmVuKFxuICAgICAgRmlsdGVySXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4geyBsYWJlbDogdGhpcy5ob3N0LmVuZ2luZS5pMThuKGBmaWx0ZXIuJHtpdGVtfWApLCBuYW1lOiBpdGVtIH07XG4gICAgICB9KVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sYWJlbC5sb2NhbGVDb21wYXJlKGIubGFiZWwpKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIGl0ZW0gPT5cbiAgICAgICAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0odGhpcywgdGhpcy5zZXR0aW5nLmZpbHRlcnNbaXRlbS5uYW1lXSwgaXRlbS5sYWJlbCwge1xuICAgICAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcImZpbHRlci5lbmFibGVcIiwgW2l0ZW0ubGFiZWxdKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcImZpbHRlci5kaXNhYmxlXCIsIFtpdGVtLmxhYmVsXSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICApO1xuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KGxpc3RGaWx0ZXJzKTtcblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KG5ldyBFeHBsYWluZXJMaXN0SXRlbSh0aGlzLCBcImZpbHRlci5leHBsYWluZXJcIikpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgUmVsaWdpb25TZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9SZWxpZ2lvblNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB7IFJlbGlnaW9uT3B0aW9ucywgVW5pY29ybkl0ZW1zLCB0eXBlIFppZ2d1cmF0VXBncmFkZSB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgQnVpbGRTZWN0aW9uVG9vbHMgfSBmcm9tIFwiLi9CdWlsZFNlY3Rpb25Ub29scy5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBEZWxpbWl0ZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RlbGltaXRlci5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7IEhlYWRlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9IZWFkZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5pbXBvcnQgc3R5bGVzVGltZVNraXBIZWF0U2V0dGluZ3MgZnJvbSBcIi4vVGltZVNraXBIZWF0U2V0dGluZ3NVaS5tb2R1bGUuY3NzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZWxpZ2lvblNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPFJlbGlnaW9uU2V0dGluZ3MsIFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfdW5pY29ybkJ1aWxkaW5nczogTWFwPFxuICAgIFppZ2d1cmF0VXBncmFkZSB8IFwidW5pY29yblBhc3R1cmVcIixcbiAgICBTZXR0aW5nTWF4VHJpZ2dlckxpc3RJdGVtXG4gID47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Jlc3RVbmljb3JuQnVpbGRpbmc6IFNldHRpbmdMaXN0SXRlbTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBSZWxpZ2lvblNldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgKSB7XG4gICAgY29uc29sZS5kZWJ1ZyguLi5jbChgQ29uc3RydWN0aW5nICR7UmVsaWdpb25TZXR0aW5nc1VpLm5hbWV9YCkpO1xuXG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLmZhaXRoXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbShwYXJlbnQsIHNldHRpbmdzLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hUcmlnZ2VyKCkge1xuICAgICAgICAgIHRoaXMudHJpZ2dlckJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb25cIiwgW1xuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciA8IDBcbiAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmFjdGl2ZVwiKVxuICAgICAgICAgICAgICA6IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgcGFyZW50LFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21wdC5wZXJjZW50YWdlXCIpLFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0XCIsIFtcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgIT09IC0xXG4gICAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICA6IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuaW5maW5pdHlcIiksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgIT09IC0xID8gcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRFeHBsYWluZXJcIiksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gLTE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciA9IHBhcmVudC5ob3N0LnBhcnNlUGVyY2VudGFnZSh2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlLFxuICAgICAgfSksXG4gICAgICB7XG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgW2J1aWxkaW5nTmFtZSwgYnVpbGRpbmddIG9mIHRoaXMuX3VuaWNvcm5CdWlsZGluZ3MuZW50cmllcygpKSB7XG4gICAgICAgICAgICBidWlsZGluZy5lbGVtZW50TGFiZWwuYXR0cihcImRhdGEta3MtYWN0aXZlLWZyb21cIiwgXCLinYpcIik7XG4gICAgICAgICAgICBidWlsZGluZy5lbGVtZW50TGFiZWwuYXR0cihcImRhdGEta3MtYWN0aXZlLXRvXCIsIFwi4pyuXCIpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5iZXN0VW5pY29ybkJ1aWxkaW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50ID09PSBidWlsZGluZ05hbWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBidWlsZGluZy5lbGVtZW50TGFiZWwuYWRkQ2xhc3Moc3R5bGVzVGltZVNraXBIZWF0U2V0dGluZ3MuYWN0aXZlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJ1aWxkaW5nLmVsZW1lbnRMYWJlbC5yZW1vdmVDbGFzcyhzdHlsZXNUaW1lU2tpcEhlYXRTZXR0aW5ncy5hY3RpdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMCAmJlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5idWlsZGluZ3MpLnNvbWUoXyA9PiBfLmVuYWJsZWQgJiYgMCA8IF8ubWF4ICYmIF8udHJpZ2dlciA8IDApO1xuXG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoc2V0dGluZ3MuYnVpbGRpbmdzKS5zb21lKFxuICAgICAgICAgICAgICBfID0+IF8uZW5hYmxlZCAmJiAoMCA9PT0gXy5tYXggfHwgKF8udHJpZ2dlciA8IDAgJiYgc2V0dGluZ3MudHJpZ2dlciA8IDApKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBidWlsZGluZ10gb2YgdGhpcy5fdW5pY29ybkJ1aWxkaW5ncy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGJ1aWxkaW5nLnJlYWRPbmx5ID0gdGhpcy5fYmVzdFVuaWNvcm5CdWlsZGluZy5zZXR0aW5nLmVuYWJsZWQ7XG4gICAgICAgICAgICBidWlsZGluZy5tYXhCdXR0b24ucmVhZE9ubHkgPSB0aGlzLl9iZXN0VW5pY29ybkJ1aWxkaW5nLnNldHRpbmcuZW5hYmxlZDtcbiAgICAgICAgICAgIGJ1aWxkaW5nLnRyaWdnZXJCdXR0b24ucmVhZE9ubHkgPSB0aGlzLl9iZXN0VW5pY29ybkJ1aWxkaW5nLnNldHRpbmcuZW5hYmxlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCB1bmljb3Juc0FycmF5OiBBcnJheTxaaWdndXJhdFVwZ3JhZGUgfCBcInVuaWNvcm5QYXN0dXJlXCI+ID0gWy4uLlVuaWNvcm5JdGVtc107XG5cbiAgICB0aGlzLl91bmljb3JuQnVpbGRpbmdzID0gbmV3IE1hcChbXG4gICAgICBbXG4gICAgICAgIFwidW5pY29yblBhc3R1cmVcIixcbiAgICAgICAgQnVpbGRTZWN0aW9uVG9vbHMuZ2V0QnVpbGRPcHRpb24oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLnNldHRpbmcuYnVpbGRpbmdzLnVuaWNvcm5QYXN0dXJlLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICB0aGlzLnNldHRpbmcsXG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJGJ1aWxkaW5ncy51bmljb3JuUGFzdHVyZS5sYWJlbFwiKSxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICB7IHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UgfSxcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICAuLi50aGlzLmhvc3QuZ2FtZS5yZWxpZ2lvbi56aWdndXJhdFVwZ3JhZGVzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgaXRlbSA9PiB1bmljb3Juc0FycmF5LmluY2x1ZGVzKGl0ZW0ubmFtZSkgJiYgIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSksXG4gICAgICAgIClcbiAgICAgICAgLm1hcChcbiAgICAgICAgICB6aWdndXJhdFVwZ3JhZGUgPT5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgemlnZ3VyYXRVcGdyYWRlLm5hbWUsXG4gICAgICAgICAgICAgIEJ1aWxkU2VjdGlvblRvb2xzLmdldEJ1aWxkT3B0aW9uKFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t6aWdndXJhdFVwZ3JhZGUubmFtZV0sXG4gICAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZyxcbiAgICAgICAgICAgICAgICB6aWdndXJhdFVwZ3JhZGUubGFiZWwsXG4gICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgeyByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICBdIGFzIFtaaWdndXJhdFVwZ3JhZGUgfCBcInVuaWNvcm5QYXN0dXJlXCIsIFNldHRpbmdNYXhUcmlnZ2VyTGlzdEl0ZW1dLFxuICAgICAgICApLFxuICAgIF0pO1xuXG4gICAgdGhpcy5fYmVzdFVuaWNvcm5CdWlsZGluZyA9IG5ldyBTZXR0aW5nTGlzdEl0ZW0oXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5zZXR0aW5nLmJlc3RVbmljb3JuQnVpbGRpbmcsXG4gICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZmFpdGguYmVzdC51bmljb3JuXCIpLFxuICAgICAge1xuICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5mYWl0aC5iZXN0LnVuaWNvcm5cIiksXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgZm9yIChjb25zdCBidWlsZGluZyBvZiB0aGlzLl91bmljb3JuQnVpbGRpbmdzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBidWlsZGluZy5zZXR0aW5nLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnVpbGRpbmcuc2V0dGluZy5tYXggPSAtMTtcbiAgICAgICAgICAgIGJ1aWxkaW5nLnNldHRpbmcudHJpZ2dlciA9IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZmFpdGguYmVzdC51bmljb3JuXCIpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICB1cGdyYWRlSW5kaWNhdG9yOiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDaGlsZHJlbkNvbnRlbnQoW1xuICAgICAgbmV3IFNldHRpbmdzTGlzdCh0aGlzLCB7XG4gICAgICAgIG9uUmVzZXQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0cyA9IG5ldyBSZWxpZ2lvblNldHRpbmdzKCk7XG4gICAgICAgICAgdGhpcy5zZXR0aW5nLmxvYWQoe1xuICAgICAgICAgICAgYmVzdFVuaWNvcm5CdWlsZGluZzogZGVmYXVsdHMuYmVzdFVuaWNvcm5CdWlsZGluZyxcbiAgICAgICAgICAgIGJ1aWxkaW5nczogZGVmYXVsdHMuYnVpbGRpbmdzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSkuYWRkQ2hpbGRyZW4oW1xuICAgICAgICBuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJHJlbGlnaW9uLnBhbmVsLnppZ2d1cmF0LmxhYmVsXCIpKSxcbiAgICAgICAgLi4udGhpcy5fdW5pY29ybkJ1aWxkaW5ncy52YWx1ZXMoKSxcbiAgICAgICAgdGhpcy5fYmVzdFVuaWNvcm5CdWlsZGluZyxcbiAgICAgICAgbmV3IERlbGltaXRlcih0aGlzKSxcblxuICAgICAgICAuLi50aGlzLmhvc3QuZ2FtZS5yZWxpZ2lvbi56aWdndXJhdFVwZ3JhZGVzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIGl0ZW0gPT4gIXVuaWNvcm5zQXJyYXkuaW5jbHVkZXMoaXRlbS5uYW1lKSAmJiAhaXNOaWwodGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tpdGVtLm5hbWVdKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCh1cGdyYWRlID0+XG4gICAgICAgICAgICBCdWlsZFNlY3Rpb25Ub29scy5nZXRCdWlsZE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t1cGdyYWRlLm5hbWVdLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZyxcbiAgICAgICAgICAgICAgdXBncmFkZS5sYWJlbCxcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIHsgcmVuZGVyTGFiZWxUcmlnZ2VyOiBmYWxzZSB9LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICBuZXcgRGVsaW1pdGVyKHRoaXMpLFxuXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkcmVsaWdpb24ucGFuZWwub3JkZXJPZlRoZVN1bi5sYWJlbFwiKSksXG4gICAgICAgIC4uLnRoaXMuaG9zdC5nYW1lLnJlbGlnaW9uLnJlbGlnaW9uVXBncmFkZXNcbiAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSkpXG4gICAgICAgICAgLm1hcCh1cGdyYWRlID0+XG4gICAgICAgICAgICBCdWlsZFNlY3Rpb25Ub29scy5nZXRCdWlsZE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t1cGdyYWRlLm5hbWVdLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZyxcbiAgICAgICAgICAgICAgdXBncmFkZS5sYWJlbCxcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6IHVwZ3JhZGUubmFtZSA9PT0gdGhpcy5ob3N0LmdhbWUucmVsaWdpb24ucmVsaWdpb25VcGdyYWRlcy5hdCgtMSk/Lm5hbWUsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFiZWxUcmlnZ2VyOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcblxuICAgICAgICBuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJHJlbGlnaW9uLnBhbmVsLmNyeXB0b3RoZW9sb2d5LmxhYmVsXCIpKSxcbiAgICAgICAgLi4udGhpcy5ob3N0LmdhbWUucmVsaWdpb24udHJhbnNjZW5kZW5jZVVwZ3JhZGVzXG4gICAgICAgICAgLmZpbHRlcihpdGVtID0+ICFpc05pbCh0aGlzLnNldHRpbmcuYnVpbGRpbmdzW2l0ZW0ubmFtZV0pKVxuICAgICAgICAgIC5tYXAodXBncmFkZSA9PlxuICAgICAgICAgICAgQnVpbGRTZWN0aW9uVG9vbHMuZ2V0QnVpbGRPcHRpb24oXG4gICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5idWlsZGluZ3NbdXBncmFkZS5uYW1lXSxcbiAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICB0aGlzLnNldHRpbmcsXG4gICAgICAgICAgICAgIHVwZ3JhZGUubGFiZWwsXG4gICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICB7IHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UgfSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgIF0pLFxuXG4gICAgICBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgICAgaGFzRGlzYWJsZUFsbDogZmFsc2UsXG4gICAgICAgIGhhc0VuYWJsZUFsbDogZmFsc2UsXG4gICAgICB9KS5hZGRDaGlsZHJlbihbXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5hZGRpdGlvbmFsXCIpKSxcbiAgICAgICAgLi4uUmVsaWdpb25PcHRpb25zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihgb3B0aW9uLmZhaXRoLiR7aXRlbX1gKTtcbiAgICAgICAgICBpZiAoaXRlbSA9PT0gXCJ0cmFuc2NlbmRcIikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nTGlzdEl0ZW0odGhpcywgdGhpcy5zZXR0aW5nW2l0ZW1dLCBsYWJlbCwge1xuICAgICAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHRoaXMsIHRoaXMuc2V0dGluZ1tpdGVtXSwgbG9jYWxlLCBsYWJlbCwge1xuICAgICAgICAgICAgY2xhc3NlczogW3N0eWxlc0J1dHRvbi5sYXN0SGVhZEFjdGlvbl0sXG4gICAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID1cbiAgICAgICAgICAgICAgICAhdGhpcy5zZXR0aW5nW2l0ZW1dLmVuYWJsZWQgfHwgdGhpcy5zZXR0aW5nW2l0ZW1dLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXG4gICAgICAgICAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uYmVoYXZpb3IgPT09IFwiaW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgID8gXCJ1aS50cmlnZ2VyLnNldGludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICA6IFwidWkudHJpZ2dlci5zZXRwZXJjZW50YWdlXCIsXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5idWlsZC5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uYmVoYXZpb3IgPT09IFwiaW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5ob3N0LnJlbmRlckFic29sdXRlKHRoaXMuc2V0dGluZ1tpdGVtXS50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5ob3N0LnJlbmRlclBlcmNlbnRhZ2UodGhpcy5zZXR0aW5nW2l0ZW1dLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmJlaGF2aW9yID09PSBcImludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgPyB0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUodGhpcy5zZXR0aW5nW2l0ZW1dLnRyaWdnZXIpXG4gICAgICAgICAgICAgICAgICA6IHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHRoaXMuc2V0dGluZ1tpdGVtXS50cmlnZ2VyKSxcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXG4gICAgICAgICAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uYmVoYXZpb3IgPT09IFwiaW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgID8gXCJ1aS50cmlnZ2VyLnNldGludGVnZXIucHJvbXB0RXhwbGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcInVpLnRyaWdnZXIuc2V0cGVyY2VudGFnZS5wcm9tcHRFeHBsYWluZXJcIixcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nW2l0ZW1dLnRyaWdnZXIgPVxuICAgICAgICAgICAgICAgIChlbGVtZW50LnRyaWdnZXJCdXR0b24uYmVoYXZpb3IgPT09IFwiaW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuaG9zdC5wYXJzZUFic29sdXRlKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgOiB0aGlzLmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKSkgPz8gdGhpcy5zZXR0aW5nW2l0ZW1dLnRyaWdnZXI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0J1dHRvbi5sYXN0SGVhZEFjdGlvbik7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH0pLFxuICAgICAgXSksXG4gICAgXSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uLy4uLy4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vLi4vLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlc1NldHRpbmdzSXRlbSB9IGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9SZXNvdXJjZXNTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgQnV0dG9uLCB0eXBlIEJ1dHRvbk9wdGlvbnMgfSBmcm9tIFwiLi4vQnV0dG9uLmpzXCI7XG5pbXBvcnQgc3R5bGVzQnV0dG9uIGZyb20gXCIuLi9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4uL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBDb25zdW1lQnV0dG9uT3B0aW9ucyA9IFRoaXNUeXBlPENvbnN1bWVCdXR0b24+ICYgQnV0dG9uT3B0aW9ucztcblxuZXhwb3J0IGNsYXNzIENvbnN1bWVCdXR0b24gZXh0ZW5kcyBCdXR0b24ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IENvbnN1bWVCdXR0b25PcHRpb25zO1xuICByZWFkb25seSBzZXR0aW5nOiBSZXNvdXJjZXNTZXR0aW5nc0l0ZW07XG4gIHJlYWRvbmx5IHJlc291cmNlTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZzogUmVzb3VyY2VzU2V0dGluZ3NJdGVtLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICByZXNvdXJjZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBPbWl0PENvbnN1bWVCdXR0b25PcHRpb25zLCBcIm9uQ2xpY2tcIj4sXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgXCJcIiwgSWNvbnMuRGF0YVVzYWdlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwicmVzb3VyY2VzLmNvbnN1bWUucHJvbXB0XCIpLFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwicmVzb3VyY2VzLmNvbnN1bWUucHJvbXB0VGl0bGVcIiwgW1xuICAgICAgICAgICAgcmVzb3VyY2VOYW1lLFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5nLmNvbnN1bWUsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSksXG4gICAgICAgICAgXSksXG4gICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5nLmNvbnN1bWUpLFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwicmVzb3VyY2VzLmNvbnN1bWUucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0dGluZy5jb25zdW1lID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgY29uc3QgY29uc3VtZVZhbHVlID0gdGhpcy5ob3N0LnJlbmRlclBlcmNlbnRhZ2UoXG4gICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbnN1bWUsXG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5zZXR0aW5ncy5sb2NhbGUuc2VsZWN0ZWQsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdGl0bGUgPVxuICAgICAgICAgIHRoaXMuc2V0dGluZy5jb25zdW1lID09PSAwXG4gICAgICAgICAgICA/IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInJlc291cmNlcy5jb25zdW1lLnRpdGxlWmVyb1wiLCBbdGhpcy5yZXNvdXJjZU5hbWVdKVxuICAgICAgICAgICAgOiB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJyZXNvdXJjZXMuY29uc3VtZS50aXRsZVwiLCBbY29uc3VtZVZhbHVlLCB0aGlzLnJlc291cmNlTmFtZV0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVRpdGxlKHRpdGxlKTtcblxuICAgICAgICBvcHRpb25zPy5vblJlZnJlc2g/LigpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNCdXR0b24uY29uc3VtZUJ1dHRvbik7XG5cbiAgICB0aGlzLnJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZTtcbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0NvbnN1bWVCdXR0b24ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi8uLi8uLi9FbmdpbmUuanNcIjtcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VzU2V0dGluZ3NJdGVtIH0gZnJvbSBcIi4uLy4uLy4uL3NldHRpbmdzL1Jlc291cmNlc1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBCdXR0b24sIHR5cGUgQnV0dG9uT3B0aW9ucyB9IGZyb20gXCIuLi9CdXR0b24uanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4uL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi4vRGlhbG9nLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4uL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFN0b2NrQnV0dG9uT3B0aW9ucyA9IFRoaXNUeXBlPFN0b2NrQnV0dG9uPiAmIEJ1dHRvbk9wdGlvbnM7XG5cbmV4cG9ydCBjbGFzcyBTdG9ja0J1dHRvbiBleHRlbmRzIEJ1dHRvbiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogU3RvY2tCdXR0b25PcHRpb25zO1xuICByZWFkb25seSBzZXR0aW5nOiBSZXNvdXJjZXNTZXR0aW5nc0l0ZW07XG4gIHJlYWRvbmx5IHJlc291cmNlTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZzogUmVzb3VyY2VzU2V0dGluZ3NJdGVtLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICByZXNvdXJjZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBPbWl0PFN0b2NrQnV0dG9uT3B0aW9ucywgXCJvbkNsaWNrXCI+LFxuICApIHtcbiAgICBzdXBlcihwYXJlbnQsIFwiXCIsIG51bGwsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJyZXNvdXJjZXMuc3RvY2sucHJvbXB0XCIpLFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwicmVzb3VyY2VzLnN0b2NrLnByb21wdFRpdGxlXCIsIFtcbiAgICAgICAgICAgIHJlc291cmNlTmFtZSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKHNldHRpbmcuc3RvY2ssIGxvY2FsZS5zZWxlY3RlZCksXG4gICAgICAgICAgXSksXG4gICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUoc2V0dGluZy5zdG9jayksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJyZXNvdXJjZXMuc3RvY2sucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICApO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIHNldHRpbmcuc3RvY2sgPSAtMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IFwiMFwiKSB7XG4gICAgICAgICAgc2V0dGluZy5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBzZXR0aW5nLnN0b2NrID0gcGFyZW50Lmhvc3QucGFyc2VBYnNvbHV0ZSh2YWx1ZSkgPz8gc2V0dGluZy5zdG9jaztcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvY2tWYWx1ZSA9IHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZSh0aGlzLnNldHRpbmcuc3RvY2spO1xuICAgICAgICBjb25zdCB0aXRsZSA9XG4gICAgICAgICAgdGhpcy5zZXR0aW5nLnN0b2NrIDwgMFxuICAgICAgICAgICAgPyB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJyZXNvdXJjZXMuc3RvY2sudGl0bGVJbmZpbml0ZVwiLCBbdGhpcy5yZXNvdXJjZU5hbWVdKVxuICAgICAgICAgICAgOiB0aGlzLnNldHRpbmcuc3RvY2sgPT09IDBcbiAgICAgICAgICAgICAgPyB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJyZXNvdXJjZXMuc3RvY2sudGl0bGVaZXJvXCIsIFt0aGlzLnJlc291cmNlTmFtZV0pXG4gICAgICAgICAgICAgIDogdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwicmVzb3VyY2VzLnN0b2NrLnRpdGxlXCIsIFtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZSh0aGlzLnNldHRpbmcuc3RvY2spLFxuICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgIHRoaXMudXBkYXRlVGl0bGUodGl0bGUpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxhYmVsKHN0b2NrVmFsdWUpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNCdXR0b24uc3RvY2tCdXR0b24pO1xuXG4gICAgdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWU7XG4gICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZztcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtTdG9ja0J1dHRvbi5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCIuLi9pbWFnZXMvSWNvbnMuanNcIjtcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VzU2V0dGluZ3MsIFJlc291cmNlc1NldHRpbmdzSXRlbSB9IGZyb20gXCIuLi9zZXR0aW5ncy9SZXNvdXJjZXNTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgdWNmaXJzdCB9IGZyb20gXCIuLi90b29scy9Gb3JtYXQuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBDb25zdW1lQnV0dG9uIH0gZnJvbSBcIi4vY29tcG9uZW50cy9idXR0b25zL0NvbnN1bWVCdXR0b24uanNcIjtcbmltcG9ydCB7IFN0b2NrQnV0dG9uIH0gZnJvbSBcIi4vY29tcG9uZW50cy9idXR0b25zL1N0b2NrQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgTGFiZWxMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvTGFiZWxMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgc3R5bGVzU2V0dGluZ0xpc3RJdGVtIGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ0xpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VzU2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8UmVzb3VyY2VzU2V0dGluZ3M+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogUmVzb3VyY2VzU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtSZXNvdXJjZXNTZXR0aW5nc1VpLm5hbWV9YCkpO1xuXG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnJlc291cmNlc1wiKTtcbiAgICBzdXBlcihcbiAgICAgIHBhcmVudCxcbiAgICAgIHNldHRpbmdzLFxuICAgICAgbmV3IExhYmVsTGlzdEl0ZW0ocGFyZW50LCBsYWJlbCwge1xuICAgICAgICBjbGFzc2VzOiBbc3R5bGVzU2V0dGluZ0xpc3RJdGVtLmNoZWNrZWQsIHN0eWxlc1NldHRpbmdMaXN0SXRlbS5zZXR0aW5nXSxcbiAgICAgICAgaWNvbjogSWNvbnMuUmVzb3VyY2VzLFxuICAgICAgfSkuYWRkQ2hpbGRyZW5IZWFkKFtuZXcgQ29udGFpbmVyKHBhcmVudCwgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pXSksXG4gICAgKTtcblxuICAgIGNvbnN0IGlnbm9yZWRSZXNvdXJjZXM6IEFycmF5PFJlc291cmNlPiA9IFtcbiAgICAgIFwiYmxhY2tjb2luXCIsXG4gICAgICBcImJ1cm5lZFBhcmFnb25cIixcbiAgICAgIFwiZWxkZXJCb3hcIixcbiAgICAgIFwiZ2Zsb3BzXCIsXG4gICAgICBcImhhc2hyYXRlc1wiLFxuICAgICAgXCJraXR0ZW5zXCIsXG4gICAgICBcInBhcmFnb25cIixcbiAgICAgIFwidGVtcG9yYWxGbHV4XCIsXG4gICAgICBcIndyYXBwaW5nUGFwZXJcIixcbiAgICAgIFwiemVicmFzXCIsXG4gICAgXTtcblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KFxuICAgICAgbmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihcbiAgICAgICAgdGhpcy5ob3N0LmdhbWUucmVzUG9vbC5yZXNvdXJjZXNcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgaXRlbSA9PlxuICAgICAgICAgICAgICAhaWdub3JlZFJlc291cmNlcy5pbmNsdWRlcyhpdGVtLm5hbWUpICYmICFpc05pbCh0aGlzLnNldHRpbmcucmVzb3VyY2VzW2l0ZW0ubmFtZV0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS50aXRsZS5sb2NhbGVDb21wYXJlKGIudGl0bGUsIGxvY2FsZS5zZWxlY3RlZCkpXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIHJlc291cmNlID0+IFt0aGlzLnNldHRpbmcucmVzb3VyY2VzW3Jlc291cmNlLm5hbWVdLCB1Y2ZpcnN0KHJlc291cmNlLnRpdGxlKV0gYXMgY29uc3QsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKFtzZXR0aW5nLCB0aXRsZV0pID0+IHRoaXMuX21ha2VSZXNvdXJjZVNldHRpbmcodGhpcywgc2V0dGluZywgbG9jYWxlLCB0aXRsZSkpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBVSSBlbGVtZW50IHRoYXQgcmVmbGVjdHMgc3RvY2sgYW5kIGNvbnN1bWUgdmFsdWVzIGZvciBhIGdpdmVuIHJlc291cmNlLlxuICAgKiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIHRoZSBjcmFmdCBzZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIHRpdGxlIHRvIGFwcGx5IHRvIHRoZSBvcHRpb24uXG4gICAqIEBwYXJhbSBvcHRpb24gVGhlIG9wdGlvbiB0aGF0IGlzIGJlaW5nIGNvbnRyb2xsZWQuXG4gICAqIEByZXR1cm5zIEEgbmV3IG9wdGlvbiB3aXRoIHN0b2NrIGFuZCBjb25zdW1lIHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgX21ha2VSZXNvdXJjZVNldHRpbmcoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBvcHRpb246IFJlc291cmNlc1NldHRpbmdzSXRlbSxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nTGlzdEl0ZW0ocGFyZW50LCBvcHRpb24sIGxhYmVsLCB7XG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNvdXJjZS5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNvdXJjZS5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICB9KS5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSldKTtcblxuICAgIC8vIEhvdyBtYW55IGl0ZW1zIHRvIHN0b2NrLlxuICAgIGNvbnN0IHN0b2NrRWxlbWVudCA9IG5ldyBTdG9ja0J1dHRvbihwYXJlbnQsIG9wdGlvbiwgbG9jYWxlLCBsYWJlbCwge1xuICAgICAgYWxpZ25tZW50OiBcInJpZ2h0XCIsXG4gICAgICBib3JkZXI6IGZhbHNlLFxuICAgICAgY2xhc3NlczogW3N0eWxlc0J1dHRvbi5oZWFkQWN0aW9uXSxcbiAgICAgIG9uUmVmcmVzaFJlcXVlc3Q6ICgpID0+IHtcbiAgICAgICAgc3RvY2tFbGVtZW50LmluYWN0aXZlID0gIW9wdGlvbi5lbmFibGVkIHx8IG9wdGlvbi5zdG9jayA9PT0gMDtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZWxlbWVudC5oZWFkLmFkZENoaWxkKHN0b2NrRWxlbWVudCk7XG5cbiAgICAvLyBUaGUgY29uc3VtZSByYXRlIGZvciB0aGUgcmVzb3VyY2UuXG4gICAgY29uc3QgY29uc3VtZUVsZW1lbnQgPSBuZXcgQ29uc3VtZUJ1dHRvbihwYXJlbnQsIG9wdGlvbiwgbG9jYWxlLCBsYWJlbCwge1xuICAgICAgYm9yZGVyOiBmYWxzZSxcbiAgICAgIGNsYXNzZXM6IFtzdHlsZXNCdXR0b24ubGFzdEhlYWRBY3Rpb25dLFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICBjb25zdW1lRWxlbWVudC5pbmFjdGl2ZSA9ICFvcHRpb24uZW5hYmxlZCB8fCBvcHRpb24uY29uc3VtZSAhPT0gMTAwO1xuICAgICAgICBjb25zdW1lRWxlbWVudC5pbmVmZmVjdGl2ZSA9IG9wdGlvbi5lbmFibGVkICYmIG9wdGlvbi5jb25zdW1lID09PSAwO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICBlbGVtZW50LmhlYWQuYWRkQ2hpbGQoY29uc3VtZUVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvbGljeVNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1BvbGljeVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjaWVuY2VTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TY2llbmNlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUG9saWN5U2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8UG9saWN5U2V0dGluZ3M+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogUG9saWN5U2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIHNlY3Rpb25TZXR0aW5nOiBTY2llbmNlU2V0dGluZ3MsXG4gICkge1xuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS51cGdyYWRlLnBvbGljaWVzXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pLFxuICAgICAge1xuICAgICAgICBvblJlZnJlc2hSZXF1ZXN0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgICFPYmplY3QudmFsdWVzKHNldHRpbmdzLnBvbGljaWVzKS5zb21lKHBvbGljeSA9PiBwb2xpY3kuZW5hYmxlZCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBwb2xpY2llcyA9IHRoaXMuaG9zdC5nYW1lLnNjaWVuY2UucG9saWNpZXMuZmlsdGVyKFxuICAgICAgcG9saWN5ID0+ICFpc05pbCh0aGlzLnNldHRpbmcucG9saWNpZXNbcG9saWN5Lm5hbWVdKSxcbiAgICApO1xuXG4gICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICBsZXQgbGFzdExhYmVsID0gcG9saWNpZXNbMF0ubGFiZWw7XG4gICAgZm9yIChjb25zdCBwb2xpY3kgb2YgcG9saWNpZXMuc29ydCgoYSwgYikgPT4gYS5sYWJlbC5sb2NhbGVDb21wYXJlKGIubGFiZWwsIGxvY2FsZS5zZWxlY3RlZCkpKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSB0aGlzLnNldHRpbmcucG9saWNpZXNbcG9saWN5Lm5hbWVdO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gbmV3IFNldHRpbmdMaXN0SXRlbSh0aGlzLCBvcHRpb24sIHBvbGljeS5sYWJlbCwge1xuICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtwb2xpY3kubGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbcG9saWN5LmxhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuaG9zdC5lbmdpbmUubG9jYWxlU3VwcG9ydHNGaXJzdExldHRlclNwbGl0cyhsb2NhbGUuc2VsZWN0ZWQpKSB7XG4gICAgICAgIGlmIChsYXN0TGFiZWxbMF0gIT09IHBvbGljeS5sYWJlbFswXSkge1xuICAgICAgICAgIGVsZW1lbnQuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNMYWJlbExpc3RJdGVtLnNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpdGVtcy5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICBsYXN0TGFiZWwgPSBwb2xpY3kubGFiZWw7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihpdGVtcykpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTY2llbmNlU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2NpZW5jZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFRlY2hTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9UZWNoU2V0dGluZ3MuanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4vY29tcG9uZW50cy9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL2NvbXBvbmVudHMvTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IGNsYXNzIFRlY2hTZXR0aW5nc1VpIGV4dGVuZHMgU2V0dGluZ3NQYW5lbDxUZWNoU2V0dGluZ3MsIFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogVGVjaFNldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICBzZWN0aW9uU2V0dGluZzogU2NpZW5jZVNldHRpbmdzLFxuICApIHtcbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudXBncmFkZS50ZWNoc1wiKTtcbiAgICBzdXBlcihcbiAgICAgIHBhcmVudCxcbiAgICAgIHNldHRpbmdzLFxuICAgICAgbmV3IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0ocGFyZW50LCBzZXR0aW5ncywgbG9jYWxlLCBsYWJlbCwge1xuICAgICAgICBvbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoVHJpZ2dlcigpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJCdXR0b24uZWxlbWVudFswXS50aXRsZSA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlclwiLCBbXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluYWN0aXZlXCIpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbmZpbml0eVwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID09PSAtMSAmJlxuICAgICAgICAgICAgIU9iamVjdC52YWx1ZXMoc2V0dGluZ3MudGVjaHMpLnNvbWUodGVjaCA9PiB0ZWNoLmVuYWJsZWQgJiYgMCA8PSB0ZWNoLnRyaWdnZXIpO1xuXG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgICFPYmplY3QudmFsdWVzKHNldHRpbmdzLnRlY2hzKS5zb21lKHRlY2ggPT4gdGVjaC5lbmFibGVkKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHRlY2hzID0gdGhpcy5ob3N0LmdhbWUuc2NpZW5jZS50ZWNocy5maWx0ZXIoXG4gICAgICB0ZWNoID0+ICFpc05pbCh0aGlzLnNldHRpbmcudGVjaHNbdGVjaC5uYW1lXSksXG4gICAgKTtcblxuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgbGV0IGxhc3RMYWJlbCA9IHRlY2hzWzBdLmxhYmVsO1xuICAgIGZvciAoY29uc3QgdGVjaCBvZiB0ZWNocy5zb3J0KChhLCBiKSA9PiBhLmxhYmVsLmxvY2FsZUNvbXBhcmUoYi5sYWJlbCwgbG9jYWxlLnNlbGVjdGVkKSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuc2V0dGluZy50ZWNoc1t0ZWNoLm5hbWVdO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gbmV3IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0odGhpcywgb3B0aW9uLCBsb2NhbGUsIHRlY2gubGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbdGVjaC5sYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBvcHRpb24uZW5hYmxlZCAmJlxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciA9PT0gLTEgJiZcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoVHJpZ2dlcjogKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID0gdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlclwiLCBbXG4gICAgICAgICAgICBvcHRpb24udHJpZ2dlciA8IDBcbiAgICAgICAgICAgICAgPyBzZXR0aW5ncy50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICAgID8gdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmJsb2NrZWRcIiwgW2xhYmVsXSlcbiAgICAgICAgICAgICAgICA6IGAke3RoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSl9ICgke3RoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmhlcml0ZWRcIil9KWBcbiAgICAgICAgICAgICAgOiB0aGlzLmhvc3QucmVuZGVyUGVyY2VudGFnZShvcHRpb24udHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0XCIsIFtcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICAgID8gdGhpcy5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uob3B0aW9uLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICA6IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmhlcml0ZWRcIiksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvcHRpb24udHJpZ2dlciA9IHRoaXMuaG9zdC5wYXJzZVBlcmNlbnRhZ2UodmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFt0ZWNoLmxhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0J1dHRvbi5sYXN0SGVhZEFjdGlvbik7XG5cbiAgICAgIGlmICh0aGlzLmhvc3QuZW5naW5lLmxvY2FsZVN1cHBvcnRzRmlyc3RMZXR0ZXJTcGxpdHMobG9jYWxlLnNlbGVjdGVkKSkge1xuICAgICAgICBpZiAobGFzdExhYmVsWzBdICE9PSB0ZWNoLmxhYmVsWzBdKSB7XG4gICAgICAgICAgZWxlbWVudC5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0xhYmVsTGlzdEl0ZW0uc3BsaXR0ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGl0ZW1zLnB1c2goZWxlbWVudCk7XG5cbiAgICAgIGxhc3RMYWJlbCA9IHRlY2gubGFiZWw7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihpdGVtcykpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB0eXBlIHsgU2NpZW5jZVNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NjaWVuY2VTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcbmltcG9ydCB7IFBvbGljeVNldHRpbmdzVWkgfSBmcm9tIFwiLi9Qb2xpY3lTZXR0aW5nc1VpLmpzXCI7XG5pbXBvcnQgeyBUZWNoU2V0dGluZ3NVaSB9IGZyb20gXCIuL1RlY2hTZXR0aW5nc1VpLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBTY2llbmNlU2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8U2NpZW5jZVNldHRpbmdzPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BvbGljaWVzVWk6IFBvbGljeVNldHRpbmdzVWk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3RlY2hzVWk6IFRlY2hTZXR0aW5nc1VpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9vYnNlcnZlU3RhcnM6IFNldHRpbmdMaXN0SXRlbTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBTY2llbmNlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtTY2llbmNlU2V0dGluZ3NVaS5uYW1lfWApKTtcblxuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS51cGdyYWRlXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIG9uVW5DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgfSkuYWRkQ2hpbGRyZW5IZWFkKFtuZXcgQ29udGFpbmVyKHBhcmVudCwgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pXSksXG4gICAgICB7XG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcub2JzZXJ2ZS5lbmFibGVkKSB7XG4gICAgICAgICAgICAkKFwiI29ic2VydmVCdXR0b25cIikuaGlkZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKFwiI29ic2VydmVCdXR0b25cIikuc2hvdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICAoKHRoaXMuc2V0dGluZy5wb2xpY2llcy5lbmFibGVkICYmIHRoaXMuX3BvbGljaWVzVWkuZXhwYW5kby5pbmVmZmVjdGl2ZSkgfHxcbiAgICAgICAgICAgICAgKHRoaXMuc2V0dGluZy50ZWNocy5lbmFibGVkICYmXG4gICAgICAgICAgICAgICAgKHRoaXMuX3RlY2hzVWkuZXhwYW5kby5pbmVmZmVjdGl2ZSB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy5fdGVjaHNVaS5zZXR0aW5nSXRlbS50cmlnZ2VyQnV0dG9uLmluZWZmZWN0aXZlKSkpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5fcG9saWNpZXNVaSA9IG5ldyBQb2xpY3lTZXR0aW5nc1VpKHRoaXMsIHNldHRpbmdzLnBvbGljaWVzLCBsb2NhbGUsIHNldHRpbmdzKTtcbiAgICB0aGlzLl90ZWNoc1VpID0gbmV3IFRlY2hTZXR0aW5nc1VpKHRoaXMsIHNldHRpbmdzLnRlY2hzLCBsb2NhbGUsIHNldHRpbmdzKTtcblxuICAgIHRoaXMuX29ic2VydmVTdGFycyA9IG5ldyBTZXR0aW5nTGlzdEl0ZW0oXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5zZXR0aW5nLm9ic2VydmUsXG4gICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24ub2JzZXJ2ZVwiKSxcbiAgICAgIHtcbiAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLm9ic2VydmVcIildKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24ub2JzZXJ2ZVwiKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGl0ZW1zTGlzdCA9IG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgaGFzRGlzYWJsZUFsbDogZmFsc2UsXG4gICAgICBoYXNFbmFibGVBbGw6IGZhbHNlLFxuICAgIH0pO1xuICAgIGl0ZW1zTGlzdC5hZGRDaGlsZHJlbihbdGhpcy5fdGVjaHNVaSwgdGhpcy5fcG9saWNpZXNVaSwgdGhpcy5fb2JzZXJ2ZVN0YXJzXSk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQoaXRlbXNMaXN0KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB0eXBlIHsgTWlzc2lvblNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL01pc3Npb25TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTcGFjZVNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NwYWNlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgTWlzc2lvblNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPE1pc3Npb25TZXR0aW5ncz4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9taXNzaW9uczogQXJyYXk8U2V0dGluZ0xpc3RJdGVtPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBNaXNzaW9uU2V0dGluZ3MsXG4gICAgX2xvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICBzZWN0aW9uU2V0dGluZzogU3BhY2VTZXR0aW5ncyxcbiAgKSB7XG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnVwZ3JhZGUubWlzc2lvbnNcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0ocGFyZW50LCBzZXR0aW5ncywgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICAhT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5taXNzaW9ucykuc29tZShtaXNzaW9uID0+IG1pc3Npb24uZW5hYmxlZCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgfSkuYWRkQ2hpbGRyZW5IZWFkKFtuZXcgQ29udGFpbmVyKHBhcmVudCwgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pXSksXG4gICAgKTtcblxuICAgIC8vIE1pc3Npb25zIHNob3VsZCBiZSBzb3J0ZWQgYnkgS0cuIEZvciBleGFtcGxlLCB3aGVuIGdvaW5nIHRvIHRoZSBzdW4ganVzdCBjaG9vc2UgdGhlIHRvcCBmaXZlIENoZWNrYm94IGluc3RlYWQgb2YgbG9va2luZyB0aHJvdWdoIHRoZSBsaXN0XG4gICAgdGhpcy5fbWlzc2lvbnMgPSB0aGlzLmhvc3QuZ2FtZS5zcGFjZS5wcm9ncmFtc1xuICAgICAgLmZpbHRlcihpdGVtID0+ICFpc05pbCh0aGlzLnNldHRpbmcubWlzc2lvbnNbaXRlbS5uYW1lXSkpXG4gICAgICAubWFwKFxuICAgICAgICBtaXNzaW9uID0+XG4gICAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbSh0aGlzLCB0aGlzLnNldHRpbmcubWlzc2lvbnNbbWlzc2lvbi5uYW1lXSwgbWlzc2lvbi5sYWJlbCwge1xuICAgICAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5lbmFibGVcIiwgW21pc3Npb24ubGFiZWxdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbbWlzc2lvbi5sYWJlbF0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVtc0xpc3QgPSBuZXcgU2V0dGluZ3NMaXN0KHRoaXMpLmFkZENoaWxkcmVuKHRoaXMuX21pc3Npb25zKTtcbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChpdGVtc0xpc3QpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgU3BhY2VTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TcGFjZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB7IEJ1aWxkU2VjdGlvblRvb2xzIH0gZnJvbSBcIi4vQnVpbGRTZWN0aW9uVG9vbHMuanNcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuL2NvbXBvbmVudHMvRGlhbG9nLmpzXCI7XG5pbXBvcnQgeyBIZWFkZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvSGVhZGVyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHsgTWlzc2lvblNldHRpbmdzVWkgfSBmcm9tIFwiLi9NaXNzaW9uU2V0dGluZ3NVaS5qc1wiO1xuXG5leHBvcnQgY2xhc3MgU3BhY2VTZXR0aW5nc1VpIGV4dGVuZHMgU2V0dGluZ3NQYW5lbDxTcGFjZVNldHRpbmdzLCBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21pc3Npb25zVWk6IE1pc3Npb25TZXR0aW5nc1VpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IFNwYWNlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtTcGFjZVNldHRpbmdzVWkubmFtZX1gKSk7XG5cbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuc3BhY2VcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxvY2FsZSwgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaFRyaWdnZXIoKSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyQnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvblwiLCBbXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluYWN0aXZlXCIpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbmZpbml0eVwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMCAmJlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5idWlsZGluZ3MpLnNvbWUoXyA9PiBfLmVuYWJsZWQgJiYgMCA8IF8ubWF4ICYmIF8udHJpZ2dlciA8IDApO1xuXG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIChPYmplY3QudmFsdWVzKHNldHRpbmdzLmJ1aWxkaW5ncykuc29tZShcbiAgICAgICAgICAgICAgXyA9PiBfLmVuYWJsZWQgJiYgKDAgPT09IF8ubWF4IHx8IChfLnRyaWdnZXIgPCAwICYmIHNldHRpbmdzLnRyaWdnZXIgPCAwKSksXG4gICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICghT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5idWlsZGluZ3MpLnNvbWUoXyA9PiBfLmVuYWJsZWQpICYmXG4gICAgICAgICAgICAgICAgIXNldHRpbmdzLnVubG9ja01pc3Npb25zLmVuYWJsZWQpIHx8XG4gICAgICAgICAgICAgIHRoaXMuX21pc3Npb25zVWkuZXhwYW5kby5pbmVmZmVjdGl2ZSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChcbiAgICAgIG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgICBvblJlc2V0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXR0aW5nLmxvYWQoeyBidWlsZGluZ3M6IG5ldyBTcGFjZVNldHRpbmdzKCkuYnVpbGRpbmdzIH0pO1xuICAgICAgICB9LFxuICAgICAgfSkuYWRkQ2hpbGRyZW4oXG4gICAgICAgIHRoaXMuaG9zdC5nYW1lLnNwYWNlLnBsYW5ldHNcbiAgICAgICAgICAuZmlsdGVyKHBsYW5ldCA9PiAwIDwgcGxhbmV0LmJ1aWxkaW5ncy5sZW5ndGgpXG4gICAgICAgICAgLmZsYXRNYXAoKHBsYW5ldCwgaW5kZXhQbGFuZXQsIGFycmF5UGxhbnQpID0+IFtcbiAgICAgICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmxhYmVsRm9yUGxhbmV0KHBsYW5ldC5uYW1lKSksXG4gICAgICAgICAgICAuLi5wbGFuZXQuYnVpbGRpbmdzXG4gICAgICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiAhaXNOaWwodGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tpdGVtLm5hbWVdKSlcbiAgICAgICAgICAgICAgLm1hcCgoYnVpbGRpbmcsIGluZGV4QnVpbGRpbmcsIGFycmF5QnVpbGRpbmcpID0+XG4gICAgICAgICAgICAgICAgQnVpbGRTZWN0aW9uVG9vbHMuZ2V0QnVpbGRPcHRpb24oXG4gICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tidWlsZGluZy5uYW1lXSxcbiAgICAgICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZyxcbiAgICAgICAgICAgICAgICAgIGJ1aWxkaW5nLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcjpcbiAgICAgICAgICAgICAgICAgICAgICBpbmRleFBsYW5ldCA8IGFycmF5UGxhbnQubGVuZ3RoIC0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgIGluZGV4QnVpbGRpbmcgPT09IGFycmF5QnVpbGRpbmcubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyTGFiZWxUcmlnZ2VyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGNvbnN0IGxpc3RBZGRpdGlvbiA9IG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgaGFzRGlzYWJsZUFsbDogZmFsc2UsXG4gICAgICBoYXNFbmFibGVBbGw6IGZhbHNlLFxuICAgIH0pO1xuICAgIGxpc3RBZGRpdGlvbi5hZGRDaGlsZChuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkuYWRkaXRpb25hbFwiKSkpO1xuXG4gICAgdGhpcy5fbWlzc2lvbnNVaSA9IG5ldyBNaXNzaW9uU2V0dGluZ3NVaShcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLnNldHRpbmcudW5sb2NrTWlzc2lvbnMsXG4gICAgICBsb2NhbGUsXG4gICAgICB0aGlzLnNldHRpbmcsXG4gICAgKTtcbiAgICBsaXN0QWRkaXRpb24uYWRkQ2hpbGQodGhpcy5fbWlzc2lvbnNVaSk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobGlzdEFkZGl0aW9uKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQWJzdHJhY3RFcnJvciB9IGZyb20gXCIuL0Fic3RyYWN0RXJyb3IuanNcIjtcbi8qKlxuICogVXNlZCB3aGVuIHRoZSB1c2VyIHN1cHBsaWVkIGFuIGFyZ3VtZW50IHRoYXQgaXMgbm90IHZhbGlkIGluIHRoZSBjdXJyZW50XG4gKiBjb250ZXh0LlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZEFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBBYnN0cmFjdEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGlua2NvZGUgSW52YWxpZEFyZ3VtZW50RXJyb3J9LlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1haW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gc3RhdHVzIC0gVGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gcmV0dXJuLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cyA9IDQwMCkge1xuICAgICAgICBzdXBlcihcIkVSUl9PU19JTlZBTElEX0FSR1VNRU5UXCIsIG1lc3NhZ2UsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiSW52YWxpZEFyZ3VtZW50RXJyb3JcIjtcbiAgICAgICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgLy8gQ2FwdHVyZSBhIG5ldyBzdGFja3RyYWNlLCBvdGhlcndpc2UgaXQgd2lsbCBpbmNsdWRlIG91ciBiYXNlLWNsYXNzXG4gICAgICAgICAgICAvLyBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIHRoZSBjb2RlIGxvY2F0aW9uIHdlJ3JlIGFjdHVhbGx5IGludGVyZXN0ZWQgaW4uXG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBJbnZhbGlkQXJndW1lbnRFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbnZhbGlkQXJndW1lbnRFcnJvci5qcy5tYXAiLCIvKipcbiAqIEBtb2R1bGUgY29uc3RhbnRzXG4gKiBAc3VtbWFyeSBVc2VmdWwgY29uc3RhbnRzXG4gKiBAZGVzY3JpcHRpb25cbiAqIENvbGxlY3Rpb24gb2YgdXNlZnVsIGRhdGUgY29uc3RhbnRzLlxuICpcbiAqIFRoZSBjb25zdGFudHMgY291bGQgYmUgaW1wb3J0ZWQgZnJvbSBgZGF0ZS1mbnMvY29uc3RhbnRzYDpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgbWF4VGltZSwgbWluVGltZSB9IGZyb20gXCIuL2NvbnN0YW50cy9kYXRlLWZucy9jb25zdGFudHNcIjtcbiAqXG4gKiBmdW5jdGlvbiBpc0FsbG93ZWRUaW1lKHRpbWUpIHtcbiAqICAgcmV0dXJuIHRpbWUgPD0gbWF4VGltZSAmJiB0aW1lID49IG1pblRpbWU7XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgZGF5c0luV2Vla1xuICogQHN1bW1hcnkgRGF5cyBpbiAxIHdlZWsuXG4gKi9cbmV4cG9ydCBjb25zdCBkYXlzSW5XZWVrID0gNztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIGRheXNJblllYXJcbiAqIEBzdW1tYXJ5IERheXMgaW4gMSB5ZWFyLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSG93IG1hbnkgZGF5cyBpbiBhIHllYXIuXG4gKlxuICogT25lIHllYXJzIGVxdWFscyAzNjUuMjQyNSBkYXlzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYTpcbiAqXG4gKiA+IExlYXAgeWVhciBvY2N1cnMgZXZlcnkgNCB5ZWFycywgZXhjZXB0IGZvciB5ZWFycyB0aGF0IGFyZSBkaXZpc2libGUgYnkgMTAwIGFuZCBub3QgZGl2aXNpYmxlIGJ5IDQwMC5cbiAqID4gMSBtZWFuIHllYXIgPSAoMzY1KzEvNC0xLzEwMCsxLzQwMCkgZGF5cyA9IDM2NS4yNDI1IGRheXNcbiAqL1xuZXhwb3J0IGNvbnN0IGRheXNJblllYXIgPSAzNjUuMjQyNTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1heFRpbWVcbiAqIEBzdW1tYXJ5IE1heGltdW0gYWxsb3dlZCB0aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBtYXhUaW1lIH0gZnJvbSBcIi4vY29uc3RhbnRzL2RhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGNvbnN0IGlzVmFsaWQgPSA4NjQwMDAwMDAwMDAwMDAxIDw9IG1heFRpbWU7XG4gKiAvLz0+IGZhbHNlXG4gKlxuICogbmV3IERhdGUoODY0MDAwMDAwMDAwMDAwMSk7XG4gKiAvLz0+IEludmFsaWQgRGF0ZVxuICovXG5leHBvcnQgY29uc3QgbWF4VGltZSA9IE1hdGgucG93KDEwLCA4KSAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW5UaW1lXG4gKiBAc3VtbWFyeSBNaW5pbXVtIGFsbG93ZWQgdGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbWluVGltZSB9IGZyb20gXCIuL2NvbnN0YW50cy9kYXRlLWZucy9jb25zdGFudHNcIjtcbiAqXG4gKiBjb25zdCBpc1ZhbGlkID0gLTg2NDAwMDAwMDAwMDAwMDEgPj0gbWluVGltZTtcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBuZXcgRGF0ZSgtODY0MDAwMDAwMDAwMDAwMSlcbiAqIC8vPT4gSW52YWxpZCBEYXRlXG4gKi9cbmV4cG9ydCBjb25zdCBtaW5UaW1lID0gLW1heFRpbWU7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbldlZWtcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIHdlZWsuXG4gKi9cbmV4cG9ydCBjb25zdCBtaWxsaXNlY29uZHNJbldlZWsgPSA2MDQ4MDAwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbkRheVxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgZGF5LlxuICovXG5leHBvcnQgY29uc3QgbWlsbGlzZWNvbmRzSW5EYXkgPSA4NjQwMDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luTWludXRlXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBtaW51dGVcbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luTWludXRlID0gNjAwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbkhvdXJcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIGhvdXJcbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luSG91ciA9IDM2MDAwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJblNlY29uZFxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgc2Vjb25kXG4gKi9cbmV4cG9ydCBjb25zdCBtaWxsaXNlY29uZHNJblNlY29uZCA9IDEwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5ZZWFyXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgeWVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbnV0ZXNJblllYXIgPSA1MjU2MDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5Nb250aFxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIG1vbnRoLlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luTW9udGggPSA0MzIwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbkRheVxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIGRheS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbnV0ZXNJbkRheSA9IDE0NDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5Ib3VyXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgaG91ci5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbnV0ZXNJbkhvdXIgPSA2MDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1vbnRoc0luUXVhcnRlclxuICogQHN1bW1hcnkgTW9udGhzIGluIDEgcXVhcnRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IG1vbnRoc0luUXVhcnRlciA9IDM7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtb250aHNJblllYXJcbiAqIEBzdW1tYXJ5IE1vbnRocyBpbiAxIHllYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBtb250aHNJblllYXIgPSAxMjtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHF1YXJ0ZXJzSW5ZZWFyXG4gKiBAc3VtbWFyeSBRdWFydGVycyBpbiAxIHllYXJcbiAqL1xuZXhwb3J0IGNvbnN0IHF1YXJ0ZXJzSW5ZZWFyID0gNDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbkhvdXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBob3VyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luSG91ciA9IDM2MDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5NaW51dGVcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBtaW51dGUuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5NaW51dGUgPSA2MDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbkRheVxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIGRheS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJbkRheSA9IHNlY29uZHNJbkhvdXIgKiAyNDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbldlZWtcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSB3ZWVrLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luV2VlayA9IHNlY29uZHNJbkRheSAqIDc7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5ZZWFyXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgeWVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJblllYXIgPSBzZWNvbmRzSW5EYXkgKiBkYXlzSW5ZZWFyO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luTW9udGhcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBtb250aFxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luTW9udGggPSBzZWNvbmRzSW5ZZWFyIC8gMTI7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5RdWFydGVyXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgcXVhcnRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJblF1YXJ0ZXIgPSBzZWNvbmRzSW5Nb250aCAqIDM7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBjb25zdHJ1Y3RGcm9tU3ltYm9sXG4gKiBAc3VtbWFyeSBTeW1ib2wgZW5hYmxpbmcgRGF0ZSBleHRlbnNpb25zIHRvIGluaGVyaXQgcHJvcGVydGllcyBmcm9tIHRoZSByZWZlcmVuY2UgZGF0ZS5cbiAqXG4gKiBUaGUgc3ltYm9sIGlzIHVzZWQgdG8gZW5hYmxlIHRoZSBgY29uc3RydWN0RnJvbWAgZnVuY3Rpb24gdG8gY29uc3RydWN0IGEgZGF0ZVxuICogdXNpbmcgYSByZWZlcmVuY2UgZGF0ZSBhbmQgYSB2YWx1ZS4gSXQgYWxsb3dzIHRvIHRyYW5zZmVyIGV4dHJhIHByb3BlcnRpZXNcbiAqIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS4gSXQncyB1c2VmdWwgZm9yIGV4dGVuc2lvbnMgbGlrZVxuICogW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopIHRoYXQgYWNjZXB0IGEgdGltZSB6b25lIGFzXG4gKiBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICovXG5leHBvcnQgY29uc3QgY29uc3RydWN0RnJvbVN5bWJvbCA9IFN5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKTtcbiIsImltcG9ydCB7IGNvbnN0cnVjdEZyb21TeW1ib2wgfSBmcm9tIFwiLi9jb25zdGFudHMuanNcIjtcblxuLyoqXG4gKiBAbmFtZSBjb25zdHJ1Y3RGcm9tXG4gKiBAY2F0ZWdvcnkgR2VuZXJpYyBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZGF0ZSB1c2luZyB0aGUgcmVmZXJlbmNlIGRhdGUgYW5kIHRoZSB2YWx1ZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGZ1bmN0aW9uIGNvbnN0cnVjdHMgYSBuZXcgZGF0ZSB1c2luZyB0aGUgY29uc3RydWN0b3IgZnJvbSB0aGUgcmVmZXJlbmNlXG4gKiBkYXRlIGFuZCB0aGUgZ2l2ZW4gdmFsdWUuIEl0IGhlbHBzIHRvIGJ1aWxkIGdlbmVyaWMgZnVuY3Rpb25zIHRoYXQgYWNjZXB0XG4gKiBkYXRlIGV4dGVuc2lvbnMuXG4gKlxuICogSXQgZGVmYXVsdHMgdG8gYERhdGVgIGlmIHRoZSBwYXNzZWQgcmVmZXJlbmNlIGRhdGUgaXMgYSBudW1iZXIgb3IgYSBzdHJpbmcuXG4gKlxuICogU3RhcnRpbmcgZnJvbSB2My43LjAsIGl0IGFsbG93cyB0byBjb25zdHJ1Y3QgYSBkYXRlIHVzaW5nIGBbU3ltYm9sLmZvcihcImNvbnN0cnVjdERhdGVGcm9tXCIpXWBcbiAqIGVuYWJsaW5nIHRvIHRyYW5zZmVyIGV4dHJhIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVmZXJlbmNlIGRhdGUgdG8gdGhlIG5ldyBkYXRlLlxuICogSXQncyB1c2VmdWwgZm9yIGV4dGVuc2lvbnMgbGlrZSBbYFRaRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy90eilcbiAqIHRoYXQgYWNjZXB0IGEgdGltZSB6b25lIGFzIGEgY29uc3RydWN0b3IgYXJndW1lbnQuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgcmVmZXJlbmNlIGRhdGUgdG8gdGFrZSBjb25zdHJ1Y3RvciBmcm9tXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY3JlYXRlIHRoZSBkYXRlXG4gKlxuICogQHJldHVybnMgRGF0ZSBpbml0aWFsaXplZCB1c2luZyB0aGUgZ2l2ZW4gZGF0ZSBhbmQgdmFsdWVcbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20vZGF0ZS1mbnNcIjtcbiAqXG4gKiAvLyBBIGZ1bmN0aW9uIHRoYXQgY2xvbmVzIGEgZGF0ZSBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCB0eXBlXG4gKiBmdW5jdGlvbiBjbG9uZURhdGU8RGF0ZVR5cGUgZXh0ZW5kcyBEYXRlPihkYXRlOiBEYXRlVHlwZSk6IERhdGVUeXBlIHtcbiAqICAgcmV0dXJuIGNvbnN0cnVjdEZyb20oXG4gKiAgICAgZGF0ZSwgLy8gVXNlIGNvbnN0cnVjdG9yIGZyb20gdGhlIGdpdmVuIGRhdGVcbiAqICAgICBkYXRlLmdldFRpbWUoKSAvLyBVc2UgdGhlIGRhdGUgdmFsdWUgdG8gY3JlYXRlIGEgbmV3IGRhdGVcbiAqICAgKTtcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdEZyb20oZGF0ZSwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBkYXRlID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBkYXRlKHZhbHVlKTtcblxuICBpZiAoZGF0ZSAmJiB0eXBlb2YgZGF0ZSA9PT0gXCJvYmplY3RcIiAmJiBjb25zdHJ1Y3RGcm9tU3ltYm9sIGluIGRhdGUpXG4gICAgcmV0dXJuIGRhdGVbY29uc3RydWN0RnJvbVN5bWJvbF0odmFsdWUpO1xuXG4gIGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIG5ldyBkYXRlLmNvbnN0cnVjdG9yKHZhbHVlKTtcblxuICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGNvbnN0cnVjdEZyb207XG4iLCJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIGNvbnN0cnVjdE5vd1xuICogQGNhdGVnb3J5IEdlbmVyaWMgSGVscGVyc1xuICogQHN1bW1hcnkgQ29uc3RydWN0cyBhIG5ldyBjdXJyZW50IGRhdGUgdXNpbmcgdGhlIHBhc3NlZCB2YWx1ZSBjb25zdHJ1Y3Rvci5cbiAqIEBwdXJlIGZhbHNlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgZnVuY3Rpb24gY29uc3RydWN0cyBhIG5ldyBjdXJyZW50IGRhdGUgdXNpbmcgdGhlIGNvbnN0cnVjdG9yIGZyb21cbiAqIHRoZSByZWZlcmVuY2UgZGF0ZS4gSXQgaGVscHMgdG8gYnVpbGQgZ2VuZXJpYyBmdW5jdGlvbnMgdGhhdCBhY2NlcHQgZGF0ZVxuICogZXh0ZW5zaW9ucyBhbmQgdXNlIHRoZSBjdXJyZW50IGRhdGUuXG4gKlxuICogSXQgZGVmYXVsdHMgdG8gYERhdGVgIGlmIHRoZSBwYXNzZWQgcmVmZXJlbmNlIGRhdGUgaXMgYSBudW1iZXIgb3IgYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgcmVmZXJlbmNlIGRhdGUgdG8gdGFrZSBjb25zdHJ1Y3RvciBmcm9tXG4gKlxuICogQHJldHVybnMgQ3VycmVudCBkYXRlIGluaXRpYWxpemVkIHVzaW5nIHRoZSBnaXZlbiBkYXRlIGNvbnN0cnVjdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGNvbnN0cnVjdE5vdywgaXNTYW1lRGF5IH0gZnJvbSAnZGF0ZS1mbnMnXG4gKlxuICogZnVuY3Rpb24gaXNUb2RheTxEYXRlVHlwZSBleHRlbmRzIERhdGU+KFxuICogICBkYXRlOiBEYXRlQXJnPERhdGVUeXBlPixcbiAqICk6IGJvb2xlYW4ge1xuICogICAvLyBJZiB3ZSB3ZXJlIHRvIHVzZSBgbmV3IERhdGUoKWAgZGlyZWN0bHksIHRoZSBmdW5jdGlvbiB3b3VsZCAgYmVoYXZlXG4gKiAgIC8vIGRpZmZlcmVudGx5IGluIGRpZmZlcmVudCB0aW1lem9uZXMgYW5kIHJldHVybiBmYWxzZSBmb3IgdGhlIHNhbWUgZGF0ZS5cbiAqICAgcmV0dXJuIGlzU2FtZURheShkYXRlLCBjb25zdHJ1Y3ROb3coZGF0ZSkpO1xuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0Tm93KGRhdGUpIHtcbiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oZGF0ZSwgRGF0ZS5ub3coKSk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgY29uc3RydWN0Tm93O1xuIiwiY29uc3QgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7XG4gIGxlc3NUaGFuWFNlY29uZHM6IHtcbiAgICBvbmU6IFwibGVzcyB0aGFuIGEgc2Vjb25kXCIsXG4gICAgb3RoZXI6IFwibGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzXCIsXG4gIH0sXG5cbiAgeFNlY29uZHM6IHtcbiAgICBvbmU6IFwiMSBzZWNvbmRcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gc2Vjb25kc1wiLFxuICB9LFxuXG4gIGhhbGZBTWludXRlOiBcImhhbGYgYSBtaW51dGVcIixcblxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiBcImxlc3MgdGhhbiBhIG1pbnV0ZVwiLFxuICAgIG90aGVyOiBcImxlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlc1wiLFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgb25lOiBcIjEgbWludXRlXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IG1pbnV0ZXNcIixcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIG9uZTogXCJhYm91dCAxIGhvdXJcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gaG91cnNcIixcbiAgfSxcblxuICB4SG91cnM6IHtcbiAgICBvbmU6IFwiMSBob3VyXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IGhvdXJzXCIsXG4gIH0sXG5cbiAgeERheXM6IHtcbiAgICBvbmU6IFwiMSBkYXlcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gZGF5c1wiLFxuICB9LFxuXG4gIGFib3V0WFdlZWtzOiB7XG4gICAgb25lOiBcImFib3V0IDEgd2Vla1wiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSB3ZWVrc1wiLFxuICB9LFxuXG4gIHhXZWVrczoge1xuICAgIG9uZTogXCIxIHdlZWtcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gd2Vla3NcIixcbiAgfSxcblxuICBhYm91dFhNb250aHM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSBtb250aFwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSBtb250aHNcIixcbiAgfSxcblxuICB4TW9udGhzOiB7XG4gICAgb25lOiBcIjEgbW9udGhcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gbW9udGhzXCIsXG4gIH0sXG5cbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG5cbiAgeFllYXJzOiB7XG4gICAgb25lOiBcIjEgeWVhclwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIG92ZXJYWWVhcnM6IHtcbiAgICBvbmU6IFwib3ZlciAxIHllYXJcIixcbiAgICBvdGhlcjogXCJvdmVyIHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogXCJhbG1vc3QgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWxtb3N0IHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdERpc3RhbmNlID0gKHRva2VuLCBjb3VudCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzdWx0O1xuXG4gIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoXCJ7e2NvdW50fX1cIiwgY291bnQudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gXCJpbiBcIiArIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIFwiIGFnb1wiO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRm9ybWF0TG9uZ0ZuKGFyZ3MpIHtcbiAgcmV0dXJuIChvcHRpb25zID0ge30pID0+IHtcbiAgICAvLyBUT0RPOiBSZW1vdmUgU3RyaW5nKClcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICBjb25zdCBmb3JtYXQgPSBhcmdzLmZvcm1hdHNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0c1thcmdzLmRlZmF1bHRXaWR0aF07XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfTtcbn1cbiIsImltcG9ydCB7IGJ1aWxkRm9ybWF0TG9uZ0ZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRGb3JtYXRMb25nRm4uanNcIjtcblxuY29uc3QgZGF0ZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwiRUVFRSwgTU1NTSBkbywgeVwiLFxuICBsb25nOiBcIk1NTU0gZG8sIHlcIixcbiAgbWVkaXVtOiBcIk1NTSBkLCB5XCIsXG4gIHNob3J0OiBcIk1NL2RkL3l5eXlcIixcbn07XG5cbmNvbnN0IHRpbWVGb3JtYXRzID0ge1xuICBmdWxsOiBcImg6bW06c3MgYSB6enp6XCIsXG4gIGxvbmc6IFwiaDptbTpzcyBhIHpcIixcbiAgbWVkaXVtOiBcImg6bW06c3MgYVwiLFxuICBzaG9ydDogXCJoOm1tIGFcIixcbn07XG5cbmNvbnN0IGRhdGVUaW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJ7e2RhdGV9fSAnYXQnIHt7dGltZX19XCIsXG4gIGxvbmc6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBtZWRpdW06IFwie3tkYXRlfX0sIHt7dGltZX19XCIsXG4gIHNob3J0OiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdExvbmcgPSB7XG4gIGRhdGU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6IFwiZnVsbFwiLFxuICB9KSxcblxuICB0aW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogdGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgZGF0ZVRpbWU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlVGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG59O1xuIiwiY29uc3QgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBcIidsYXN0JyBlZWVlICdhdCcgcFwiLFxuICB5ZXN0ZXJkYXk6IFwiJ3llc3RlcmRheSBhdCcgcFwiLFxuICB0b2RheTogXCIndG9kYXkgYXQnIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ3RvbW9ycm93IGF0JyBwXCIsXG4gIG5leHRXZWVrOiBcImVlZWUgJ2F0JyBwXCIsXG4gIG90aGVyOiBcIlBcIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRSZWxhdGl2ZSA9ICh0b2tlbiwgX2RhdGUsIF9iYXNlRGF0ZSwgX29wdGlvbnMpID0+XG4gIGZvcm1hdFJlbGF0aXZlTG9jYWxlW3Rva2VuXTtcbiIsIi8qKlxuICogVGhlIGxvY2FsaXplIGZ1bmN0aW9uIGFyZ3VtZW50IGNhbGxiYWNrIHdoaWNoIGFsbG93cyB0byBjb252ZXJ0IHJhdyB2YWx1ZSB0b1xuICogdGhlIGFjdHVhbCB0eXBlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0XG4gKlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCB2YWx1ZVxuICovXG5cbi8qKlxuICogVGhlIG1hcCBvZiBsb2NhbGl6ZWQgdmFsdWVzIGZvciBlYWNoIHdpZHRoLlxuICovXG5cbi8qKlxuICogVGhlIGluZGV4IHR5cGUgb2YgdGhlIGxvY2FsZSB1bml0IHZhbHVlLiBJdCB0eXBlcyBjb252ZXJzaW9uIG9mIHVuaXRzIG9mXG4gKiB2YWx1ZXMgdGhhdCBkb24ndCBzdGFydCBhdCAwIChpLmUuIHF1YXJ0ZXJzKS5cbiAqL1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSB1bml0IHZhbHVlIHRvIHRoZSB0dXBsZSBvZiB2YWx1ZXMuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIGVyYSB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgQkMsXG4gKiB0aGUgc2Vjb25kIGVsZW1lbnQgcmVwcmVzZW50cyBBRC5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgcXVhcnRlciB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgUTEuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIGRheSB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgU3VuZGF5LlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBtb250aCB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgSmFudWFyeS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMb2NhbGl6ZUZuKGFyZ3MpIHtcbiAgcmV0dXJuICh2YWx1ZSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBvcHRpb25zPy5jb250ZXh0ID8gU3RyaW5nKG9wdGlvbnMuY29udGV4dCkgOiBcInN0YW5kYWxvbmVcIjtcblxuICAgIGxldCB2YWx1ZXNBcnJheTtcbiAgICBpZiAoY29udGV4dCA9PT0gXCJmb3JtYXR0aW5nXCIgJiYgYXJncy5mb3JtYXR0aW5nVmFsdWVzKSB7XG4gICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRGb3JtYXR0aW5nV2lkdGggfHwgYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnM/LndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogZGVmYXVsdFdpZHRoO1xuXG4gICAgICB2YWx1ZXNBcnJheSA9XG4gICAgICAgIGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1t3aWR0aF0gfHwgYXJncy5mb3JtYXR0aW5nVmFsdWVzW2RlZmF1bHRXaWR0aF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgICAgY29uc3Qgd2lkdGggPSBvcHRpb25zPy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuXG4gICAgICB2YWx1ZXNBcnJheSA9IGFyZ3MudmFsdWVzW3dpZHRoXSB8fCBhcmdzLnZhbHVlc1tkZWZhdWx0V2lkdGhdO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGFyZ3MuYXJndW1lbnRDYWxsYmFjayA/IGFyZ3MuYXJndW1lbnRDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBGb3Igc29tZSByZWFzb24gVHlwZVNjcmlwdCBqdXN0IGRvbid0IHdhbnQgdG8gbWF0Y2ggaXQsIG5vIG1hdHRlciBob3cgaGFyZCB3ZSB0cnkuIEkgY2hhbGxlbmdlIHlvdSB0byB0cnkgdG8gcmVtb3ZlIGl0IVxuICAgIHJldHVybiB2YWx1ZXNBcnJheVtpbmRleF07XG4gIH07XG59XG4iLCJpbXBvcnQgeyBidWlsZExvY2FsaXplRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZExvY2FsaXplRm4uanNcIjtcblxuY29uc3QgZXJhVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIkJcIiwgXCJBXCJdLFxuICBhYmJyZXZpYXRlZDogW1wiQkNcIiwgXCJBRFwiXSxcbiAgd2lkZTogW1wiQmVmb3JlIENocmlzdFwiLCBcIkFubm8gRG9taW5pXCJdLFxufTtcblxuY29uc3QgcXVhcnRlclZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCJdLFxuICBhYmJyZXZpYXRlZDogW1wiUTFcIiwgXCJRMlwiLCBcIlEzXCIsIFwiUTRcIl0sXG4gIHdpZGU6IFtcIjFzdCBxdWFydGVyXCIsIFwiMm5kIHF1YXJ0ZXJcIiwgXCIzcmQgcXVhcnRlclwiLCBcIjR0aCBxdWFydGVyXCJdLFxufTtcblxuLy8gTm90ZTogaW4gRW5nbGlzaCwgdGhlIG5hbWVzIG9mIGRheXMgb2YgdGhlIHdlZWsgYW5kIG1vbnRocyBhcmUgY2FwaXRhbGl6ZWQuXG4vLyBJZiB5b3UgYXJlIG1ha2luZyBhIG5ldyBsb2NhbGUgYmFzZWQgb24gdGhpcyBvbmUsIGNoZWNrIGlmIHRoZSBzYW1lIGlzIHRydWUgZm9yIHRoZSBsYW5ndWFnZSB5b3UncmUgd29ya2luZyBvbi5cbi8vIEdlbmVyYWxseSwgZm9ybWF0dGVkIGRhdGVzIHNob3VsZCBsb29rIGxpa2UgdGhleSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHNlbnRlbmNlLFxuLy8gZS5nLiBpbiBTcGFuaXNoIGxhbmd1YWdlIHRoZSB3ZWVrZGF5cyBhbmQgbW9udGhzIHNob3VsZCBiZSBpbiB0aGUgbG93ZXJjYXNlLlxuY29uc3QgbW9udGhWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiSlwiLCBcIkZcIiwgXCJNXCIsIFwiQVwiLCBcIk1cIiwgXCJKXCIsIFwiSlwiLCBcIkFcIiwgXCJTXCIsIFwiT1wiLCBcIk5cIiwgXCJEXCJdLFxuICBhYmJyZXZpYXRlZDogW1xuICAgIFwiSmFuXCIsXG4gICAgXCJGZWJcIixcbiAgICBcIk1hclwiLFxuICAgIFwiQXByXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1blwiLFxuICAgIFwiSnVsXCIsXG4gICAgXCJBdWdcIixcbiAgICBcIlNlcFwiLFxuICAgIFwiT2N0XCIsXG4gICAgXCJOb3ZcIixcbiAgICBcIkRlY1wiLFxuICBdLFxuXG4gIHdpZGU6IFtcbiAgICBcIkphbnVhcnlcIixcbiAgICBcIkZlYnJ1YXJ5XCIsXG4gICAgXCJNYXJjaFwiLFxuICAgIFwiQXByaWxcIixcbiAgICBcIk1heVwiLFxuICAgIFwiSnVuZVwiLFxuICAgIFwiSnVseVwiLFxuICAgIFwiQXVndXN0XCIsXG4gICAgXCJTZXB0ZW1iZXJcIixcbiAgICBcIk9jdG9iZXJcIixcbiAgICBcIk5vdmVtYmVyXCIsXG4gICAgXCJEZWNlbWJlclwiLFxuICBdLFxufTtcblxuY29uc3QgZGF5VmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIlNcIiwgXCJNXCIsIFwiVFwiLCBcIldcIiwgXCJUXCIsIFwiRlwiLCBcIlNcIl0sXG4gIHNob3J0OiBbXCJTdVwiLCBcIk1vXCIsIFwiVHVcIiwgXCJXZVwiLCBcIlRoXCIsIFwiRnJcIiwgXCJTYVwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXSxcbiAgd2lkZTogW1xuICAgIFwiU3VuZGF5XCIsXG4gICAgXCJNb25kYXlcIixcbiAgICBcIlR1ZXNkYXlcIixcbiAgICBcIldlZG5lc2RheVwiLFxuICAgIFwiVGh1cnNkYXlcIixcbiAgICBcIkZyaWRheVwiLFxuICAgIFwiU2F0dXJkYXlcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwiYVwiLFxuICAgIHBtOiBcInBcIixcbiAgICBtaWRuaWdodDogXCJtaVwiLFxuICAgIG5vb246IFwiblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcIkFNXCIsXG4gICAgcG06IFwiUE1cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwiYS5tLlwiLFxuICAgIHBtOiBcInAubS5cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxufTtcblxuY29uc3QgZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwiYVwiLFxuICAgIHBtOiBcInBcIixcbiAgICBtaWRuaWdodDogXCJtaVwiLFxuICAgIG5vb246IFwiblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcIkFNXCIsXG4gICAgcG06IFwiUE1cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwiYS5tLlwiLFxuICAgIHBtOiBcInAubS5cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxufTtcblxuY29uc3Qgb3JkaW5hbE51bWJlciA9IChkaXJ0eU51bWJlciwgX29wdGlvbnMpID0+IHtcbiAgY29uc3QgbnVtYmVyID0gTnVtYmVyKGRpcnR5TnVtYmVyKTtcblxuICAvLyBJZiBvcmRpbmFsIG51bWJlcnMgZGVwZW5kIG9uIGNvbnRleHQsIGZvciBleGFtcGxlLFxuICAvLyBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBncmFtbWF0aWNhbCBnZW5kZXJzLFxuICAvLyB1c2UgYG9wdGlvbnMudW5pdGAuXG4gIC8vXG4gIC8vIGB1bml0YCBjYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RhdGUnLCAnZGF5T2ZZZWFyJyxcbiAgLy8gJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLlxuXG4gIGNvbnN0IHJlbTEwMCA9IG51bWJlciAlIDEwMDtcbiAgaWYgKHJlbTEwMCA+IDIwIHx8IHJlbTEwMCA8IDEwKSB7XG4gICAgc3dpdGNoIChyZW0xMDAgJSAxMCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJzdFwiO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJuZFwiO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJyZFwiO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVtYmVyICsgXCJ0aFwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGxvY2FsaXplID0ge1xuICBvcmRpbmFsTnVtYmVyLFxuXG4gIGVyYTogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGVyYVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBxdWFydGVyOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogcXVhcnRlclZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGFyZ3VtZW50Q2FsbGJhY2s6IChxdWFydGVyKSA9PiBxdWFydGVyIC0gMSxcbiAgfSksXG5cbiAgbW9udGg6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBtb250aFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBkYXk6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBkYXlWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5UGVyaW9kOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gICAgZm9ybWF0dGluZ1ZhbHVlczogZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0Rm9ybWF0dGluZ1dpZHRoOiBcIndpZGVcIixcbiAgfSksXG59O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2hGbihhcmdzKSB7XG4gIHJldHVybiAoc3RyaW5nLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGg7XG5cbiAgICBjb25zdCBtYXRjaFBhdHRlcm4gPVxuICAgICAgKHdpZHRoICYmIGFyZ3MubWF0Y2hQYXR0ZXJuc1t3aWR0aF0pIHx8XG4gICAgICBhcmdzLm1hdGNoUGF0dGVybnNbYXJncy5kZWZhdWx0TWF0Y2hXaWR0aF07XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2gobWF0Y2hQYXR0ZXJuKTtcblxuICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG5cbiAgICBjb25zdCBwYXJzZVBhdHRlcm5zID1cbiAgICAgICh3aWR0aCAmJiBhcmdzLnBhcnNlUGF0dGVybnNbd2lkdGhdKSB8fFxuICAgICAgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdO1xuXG4gICAgY29uc3Qga2V5ID0gQXJyYXkuaXNBcnJheShwYXJzZVBhdHRlcm5zKVxuICAgICAgPyBmaW5kSW5kZXgocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSlcbiAgICAgIDogLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgZmluZEtleShwYXJzZVBhdHRlcm5zLCAocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpKTtcblxuICAgIGxldCB2YWx1ZTtcblxuICAgIHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKGtleSkgOiBrZXk7XG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlKVxuICAgICAgOiB2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHsgdmFsdWUsIHJlc3QgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmXG4gICAgICBwcmVkaWNhdGUob2JqZWN0W2tleV0pXG4gICAgKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSkge1xuICBmb3IgKGxldCBrZXkgPSAwOyBrZXkgPCBhcnJheS5sZW5ndGg7IGtleSsrKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtrZXldKSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZE1hdGNoUGF0dGVybkZuKGFyZ3MpIHtcbiAgcmV0dXJuIChzdHJpbmcsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gc3RyaW5nLm1hdGNoKGFyZ3MubWF0Y2hQYXR0ZXJuKTtcbiAgICBpZiAoIW1hdGNoUmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG5cbiAgICBjb25zdCBwYXJzZVJlc3VsdCA9IHN0cmluZy5tYXRjaChhcmdzLnBhcnNlUGF0dGVybik7XG4gICAgaWYgKCFwYXJzZVJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgbGV0IHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrXG4gICAgICA/IGFyZ3MudmFsdWVDYWxsYmFjayhwYXJzZVJlc3VsdFswXSlcbiAgICAgIDogcGFyc2VSZXN1bHRbMF07XG5cbiAgICAvLyBbVE9ET10gSSBjaGFsbGVuZ2UgeW91IHRvIGZpeCB0aGUgdHlwZVxuICAgIHZhbHVlID0gb3B0aW9ucy52YWx1ZUNhbGxiYWNrID8gb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgY29uc3QgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG5cbiAgICByZXR1cm4geyB2YWx1ZSwgcmVzdCB9O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgYnVpbGRNYXRjaEZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRNYXRjaEZuLmpzXCI7XG5pbXBvcnQgeyBidWlsZE1hdGNoUGF0dGVybkZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi5qc1wiO1xuXG5jb25zdCBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL14oXFxkKykodGh8c3R8bmR8cmQpPy9pO1xuY29uc3QgcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9cXGQrL2k7XG5cbmNvbnN0IG1hdGNoRXJhUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14oYnxhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oYlxcLj9cXHM/Y1xcLj98YlxcLj9cXHM/Y1xcLj9cXHM/ZVxcLj98YVxcLj9cXHM/ZFxcLj98Y1xcLj9cXHM/ZVxcLj8pL2ksXG4gIHdpZGU6IC9eKGJlZm9yZSBjaHJpc3R8YmVmb3JlIGNvbW1vbiBlcmF8YW5ubyBkb21pbml8Y29tbW9uIGVyYSkvaSxcbn07XG5jb25zdCBwYXJzZUVyYVBhdHRlcm5zID0ge1xuICBhbnk6IFsvXmIvaSwgL14oYXxjKS9pXSxcbn07XG5cbmNvbnN0IG1hdGNoUXVhcnRlclBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eWzEyMzRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXnFbMTIzNF0vaSxcbiAgd2lkZTogL15bMTIzNF0odGh8c3R8bmR8cmQpPyBxdWFydGVyL2ksXG59O1xuY29uc3QgcGFyc2VRdWFydGVyUGF0dGVybnMgPSB7XG4gIGFueTogWy8xL2ksIC8yL2ksIC8zL2ksIC80L2ldLFxufTtcblxuY29uc3QgbWF0Y2hNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eW2pmbWFzb25kXS9pLFxuICBhYmJyZXZpYXRlZDogL14oamFufGZlYnxtYXJ8YXByfG1heXxqdW58anVsfGF1Z3xzZXB8b2N0fG5vdnxkZWMpL2ksXG4gIHdpZGU6IC9eKGphbnVhcnl8ZmVicnVhcnl8bWFyY2h8YXByaWx8bWF5fGp1bmV8anVseXxhdWd1c3R8c2VwdGVtYmVyfG9jdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXIpL2ksXG59O1xuY29uc3QgcGFyc2VNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFtcbiAgICAvXmovaSxcbiAgICAvXmYvaSxcbiAgICAvXm0vaSxcbiAgICAvXmEvaSxcbiAgICAvXm0vaSxcbiAgICAvXmovaSxcbiAgICAvXmovaSxcbiAgICAvXmEvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcblxuICBhbnk6IFtcbiAgICAvXmphL2ksXG4gICAgL15mL2ksXG4gICAgL15tYXIvaSxcbiAgICAvXmFwL2ksXG4gICAgL15tYXkvaSxcbiAgICAvXmp1bi9pLFxuICAgIC9eanVsL2ksXG4gICAgL15hdS9pLFxuICAgIC9ecy9pLFxuICAgIC9eby9pLFxuICAgIC9ebi9pLFxuICAgIC9eZC9pLFxuICBdLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltzbXR3Zl0vaSxcbiAgc2hvcnQ6IC9eKHN1fG1vfHR1fHdlfHRofGZyfHNhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oc3VufG1vbnx0dWV8d2VkfHRodXxmcml8c2F0KS9pLFxuICB3aWRlOiAvXihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSkvaSxcbn07XG5jb25zdCBwYXJzZURheVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFsvXnMvaSwgL15tL2ksIC9edC9pLCAvXncvaSwgL150L2ksIC9eZi9pLCAvXnMvaV0sXG4gIGFueTogWy9ec3UvaSwgL15tL2ksIC9edHUvaSwgL153L2ksIC9edGgvaSwgL15mL2ksIC9ec2EvaV0sXG59O1xuXG5jb25zdCBtYXRjaERheVBlcmlvZFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKGF8cHxtaXxufChpbiB0aGV8YXQpIChtb3JuaW5nfGFmdGVybm9vbnxldmVuaW5nfG5pZ2h0KSkvaSxcbiAgYW55OiAvXihbYXBdXFwuP1xccz9tXFwuP3xtaWRuaWdodHxub29ufChpbiB0aGV8YXQpIChtb3JuaW5nfGFmdGVybm9vbnxldmVuaW5nfG5pZ2h0KSkvaSxcbn07XG5jb25zdCBwYXJzZURheVBlcmlvZFBhdHRlcm5zID0ge1xuICBhbnk6IHtcbiAgICBhbTogL15hL2ksXG4gICAgcG06IC9ecC9pLFxuICAgIG1pZG5pZ2h0OiAvXm1pL2ksXG4gICAgbm9vbjogL15uby9pLFxuICAgIG1vcm5pbmc6IC9tb3JuaW5nL2ksXG4gICAgYWZ0ZXJub29uOiAvYWZ0ZXJub29uL2ksXG4gICAgZXZlbmluZzogL2V2ZW5pbmcvaSxcbiAgICBuaWdodDogL25pZ2h0L2ksXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgbWF0Y2ggPSB7XG4gIG9yZGluYWxOdW1iZXI6IGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oe1xuICAgIG1hdGNoUGF0dGVybjogbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICBwYXJzZVBhdHRlcm46IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgdmFsdWVDYWxsYmFjazogKHZhbHVlKSA9PiBwYXJzZUludCh2YWx1ZSwgMTApLFxuICB9KSxcblxuICBlcmE6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hFcmFQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VFcmFQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gICAgdmFsdWVDYWxsYmFjazogKGluZGV4KSA9PiBpbmRleCArIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBkYXk6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hEYXlQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5UGVyaW9kOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwiYW55XCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG59O1xuIiwiaW1wb3J0IHsgZm9ybWF0RGlzdGFuY2UgfSBmcm9tIFwiLi9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRMb25nIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRSZWxhdGl2ZSB9IGZyb20gXCIuL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanNcIjtcbmltcG9ydCB7IGxvY2FsaXplIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9sb2NhbGl6ZS5qc1wiO1xuaW1wb3J0IHsgbWF0Y2ggfSBmcm9tIFwiLi9lbi1VUy9fbGliL21hdGNoLmpzXCI7XG5cbi8qKlxuICogQGNhdGVnb3J5IExvY2FsZXNcbiAqIEBzdW1tYXJ5IEVuZ2xpc2ggbG9jYWxlIChVbml0ZWQgU3RhdGVzKS5cbiAqIEBsYW5ndWFnZSBFbmdsaXNoXG4gKiBAaXNvLTYzOS0yIGVuZ1xuICogQGF1dGhvciBTYXNoYSBLb3NzIFtAa29zc25vY29ycF0oaHR0cHM6Ly9naXRodWIuY29tL2tvc3Nub2NvcnApXG4gKiBAYXV0aG9yIExlc2hhIEtvc3MgW0BsZXNoYWtvc3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9sZXNoYWtvc3MpXG4gKi9cbmV4cG9ydCBjb25zdCBlblVTID0ge1xuICBjb2RlOiBcImVuLVVTXCIsXG4gIGZvcm1hdERpc3RhbmNlOiBmb3JtYXREaXN0YW5jZSxcbiAgZm9ybWF0TG9uZzogZm9ybWF0TG9uZyxcbiAgZm9ybWF0UmVsYXRpdmU6IGZvcm1hdFJlbGF0aXZlLFxuICBsb2NhbGl6ZTogbG9jYWxpemUsXG4gIG1hdGNoOiBtYXRjaCxcbiAgb3B0aW9uczoge1xuICAgIHdlZWtTdGFydHNPbjogMCAvKiBTdW5kYXkgKi8sXG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiAxLFxuICB9LFxufTtcblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBlblVTO1xuIiwibGV0IGRlZmF1bHRPcHRpb25zID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIGRlZmF1bHRPcHRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMobmV3T3B0aW9ucykge1xuICBkZWZhdWx0T3B0aW9ucyA9IG5ld09wdGlvbnM7XG59XG4iLCJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIHRvRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXRzIGNsb25lLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhIG51bWJlciwgaXQgaXMgdHJlYXRlZCBhcyBhIHRpbWVzdGFtcC5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgbm9uZSBvZiB0aGUgYWJvdmUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEludmFsaWQgRGF0ZS5cbiAqXG4gKiBTdGFydGluZyBmcm9tIHYzLjcuMCwgaXQgY2xvbmVzIGEgZGF0ZSB1c2luZyBgW1N5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKV1gXG4gKiBlbmFibGluZyB0byB0cmFuc2ZlciBleHRyYSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS5cbiAqIEl0J3MgdXNlZnVsIGZvciBleHRlbnNpb25zIGxpa2UgW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopXG4gKiB0aGF0IGFjY2VwdCBhIHRpbWUgem9uZSBhcyBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gYXJndW1lbnQgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENsb25lIHRoZSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKG5ldyBEYXRlKDIwMTQsIDEsIDExLCAxMSwgMzAsIDMwKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKDEzOTIwOTg0MzAwMDApXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKGFyZ3VtZW50LCBjb250ZXh0KSB7XG4gIC8vIFtUT0RPXSBHZXQgcmlkIG9mIGB0b0RhdGVgIG9yIGBjb25zdHJ1Y3RGcm9tYD9cbiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oY29udGV4dCB8fCBhcmd1bWVudCwgYXJndW1lbnQpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHRvRGF0ZTtcbiIsImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBHb29nbGUgQ2hyb21lIGFzIG9mIDY3LjAuMzM5Ni44NyBpbnRyb2R1Y2VkIHRpbWV6b25lcyB3aXRoIG9mZnNldCB0aGF0IGluY2x1ZGVzIHNlY29uZHMuXG4gKiBUaGV5IHVzdWFsbHkgYXBwZWFyIGZvciBkYXRlcyB0aGF0IGRlbm90ZSB0aW1lIGJlZm9yZSB0aGUgdGltZXpvbmVzIHdlcmUgaW50cm9kdWNlZFxuICogKGUuZy4gZm9yICdFdXJvcGUvUHJhZ3VlJyB0aW1lem9uZSB0aGUgb2Zmc2V0IGlzIEdNVCswMDo1Nzo0NCBiZWZvcmUgMSBPY3RvYmVyIDE4OTFcbiAqIGFuZCBHTVQrMDE6MDA6MDAgYWZ0ZXIgdGhhdCBkYXRlKVxuICpcbiAqIERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgYW5kIHdvdWxkIHJldHVybiA1NyBmb3IgdGhlIGV4YW1wbGUgYWJvdmUsXG4gKiB3aGljaCB3b3VsZCBsZWFkIHRvIGluY29ycmVjdCBjYWxjdWxhdGlvbnMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGFrZXMgc2Vjb25kcyBpbiBhY2NvdW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUpO1xuICBjb25zdCB1dGNEYXRlID0gbmV3IERhdGUoXG4gICAgRGF0ZS5VVEMoXG4gICAgICBfZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgX2RhdGUuZ2V0TW9udGgoKSxcbiAgICAgIF9kYXRlLmdldERhdGUoKSxcbiAgICAgIF9kYXRlLmdldEhvdXJzKCksXG4gICAgICBfZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgICBfZGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgICBfZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgICApLFxuICApO1xuICB1dGNEYXRlLnNldFVUQ0Z1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCkpO1xuICByZXR1cm4gK2RhdGUgLSArdXRjRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi4vY29uc3RydWN0RnJvbS5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGF0ZXMoY29udGV4dCwgLi4uZGF0ZXMpIHtcbiAgY29uc3Qgbm9ybWFsaXplID0gY29uc3RydWN0RnJvbS5iaW5kKFxuICAgIG51bGwsXG4gICAgY29udGV4dCB8fCBkYXRlcy5maW5kKChkYXRlKSA9PiB0eXBlb2YgZGF0ZSA9PT0gXCJvYmplY3RcIiksXG4gICk7XG4gIHJldHVybiBkYXRlcy5tYXAobm9ybWFsaXplKTtcbn1cbiIsImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIGNvbXBhcmVBc2NcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgQ29tcGFyZSB0aGUgdHdvIGRhdGVzIGFuZCByZXR1cm4gLTEsIDAgb3IgMS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENvbXBhcmUgdGhlIHR3byBkYXRlcyBhbmQgcmV0dXJuIDEgaWYgdGhlIGZpcnN0IGRhdGUgaXMgYWZ0ZXIgdGhlIHNlY29uZCxcbiAqIC0xIGlmIHRoZSBmaXJzdCBkYXRlIGlzIGJlZm9yZSB0aGUgc2Vjb25kIG9yIDAgaWYgZGF0ZXMgYXJlIGVxdWFsLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBmaXJzdCBkYXRlIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgc2Vjb25kIGRhdGUgdG8gY29tcGFyZVxuICpcbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb25cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29tcGFyZSAxMSBGZWJydWFyeSAxOTg3IGFuZCAxMCBKdWx5IDE5ODk6XG4gKiBjb25zdCByZXN1bHQgPSBjb21wYXJlQXNjKG5ldyBEYXRlKDE5ODcsIDEsIDExKSwgbmV3IERhdGUoMTk4OSwgNiwgMTApKVxuICogLy89PiAtMVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTb3J0IHRoZSBhcnJheSBvZiBkYXRlczpcbiAqIGNvbnN0IHJlc3VsdCA9IFtcbiAqICAgbmV3IERhdGUoMTk5NSwgNiwgMiksXG4gKiAgIG5ldyBEYXRlKDE5ODcsIDEsIDExKSxcbiAqICAgbmV3IERhdGUoMTk4OSwgNiwgMTApXG4gKiBdLnNvcnQoY29tcGFyZUFzYylcbiAqIC8vPT4gW1xuICogLy8gICBXZWQgRmViIDExIDE5ODcgMDA6MDA6MDAsXG4gKiAvLyAgIE1vbiBKdWwgMTAgMTk4OSAwMDowMDowMCxcbiAqIC8vICAgU3VuIEp1bCAwMiAxOTk1IDAwOjAwOjAwXG4gKiAvLyBdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlQXNjKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHtcbiAgY29uc3QgZGlmZiA9ICt0b0RhdGUoZGF0ZUxlZnQpIC0gK3RvRGF0ZShkYXRlUmlnaHQpO1xuXG4gIGlmIChkaWZmIDwgMCkgcmV0dXJuIC0xO1xuICBlbHNlIGlmIChkaWZmID4gMCkgcmV0dXJuIDE7XG5cbiAgLy8gUmV0dXJuIDAgaWYgZGlmZiBpcyAwOyByZXR1cm4gTmFOIGlmIGRpZmYgaXMgTmFOXG4gIHJldHVybiBkaWZmO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGNvbXBhcmVBc2M7XG4iLCJpbXBvcnQgeyBub3JtYWxpemVEYXRlcyB9IGZyb20gXCIuL19saWIvbm9ybWFsaXplRGF0ZXMuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHNcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBtb250aHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBtb250aHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHBhcmFtIGxhdGVyRGF0ZSAtIFRoZSBsYXRlciBkYXRlXG4gKiBAcGFyYW0gZWFybGllckRhdGUgLSBUaGUgZWFybGllciBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRoc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBjYWxlbmRhciBtb250aHMgYXJlIGJldHdlZW4gMzEgSmFudWFyeSAyMDE0IGFuZCAxIFNlcHRlbWJlciAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDgsIDEpLFxuICogICBuZXcgRGF0ZSgyMDE0LCAwLCAzMSlcbiAqIClcbiAqIC8vPT4gOFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKFxuICAgIG9wdGlvbnM/LmluLFxuICAgIGxhdGVyRGF0ZSxcbiAgICBlYXJsaWVyRGF0ZSxcbiAgKTtcblxuICBjb25zdCB5ZWFyc0RpZmYgPSBsYXRlckRhdGVfLmdldEZ1bGxZZWFyKCkgLSBlYXJsaWVyRGF0ZV8uZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGhzRGlmZiA9IGxhdGVyRGF0ZV8uZ2V0TW9udGgoKSAtIGVhcmxpZXJEYXRlXy5nZXRNb250aCgpO1xuXG4gIHJldHVybiB5ZWFyc0RpZmYgKiAxMiArIG1vbnRoc0RpZmY7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHM7XG4iLCJpbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGVuZE9mRGF5fSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZW5kT2ZEYXlcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBlbmQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBlbmQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGVuZCBvZiBhIGRheVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgZW5kIG9mIGEgZGF5IGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZW5kT2ZEYXkobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAwMiAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kT2ZEYXkoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7XG4gIHJldHVybiBfZGF0ZTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBlbmRPZkRheTtcbiIsImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZW5kT2ZNb250aH0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGVuZE9mTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGVuZCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZW5kIG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGVuZCBvZiBhIG1vbnRoXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBlbmQgb2YgYSBtb250aCBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAzMCAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kT2ZNb250aChkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgbW9udGggPSBfZGF0ZS5nZXRNb250aCgpO1xuICBfZGF0ZS5zZXRGdWxsWWVhcihfZGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aCArIDEsIDApO1xuICBfZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICByZXR1cm4gX2RhdGU7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZW5kT2ZNb250aDtcbiIsImltcG9ydCB7IGVuZE9mRGF5IH0gZnJvbSBcIi4vZW5kT2ZEYXkuanNcIjtcbmltcG9ydCB7IGVuZE9mTW9udGggfSBmcm9tIFwiLi9lbmRPZk1vbnRoLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBAbmFtZSBpc0xhc3REYXlPZk1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIGRhdGUgdGhlIGxhc3QgZGF5IG9mIGEgbW9udGg/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJcyB0aGUgZ2l2ZW4gZGF0ZSB0aGUgbGFzdCBkYXkgb2YgYSBtb250aD9cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF0ZSBpcyB0aGUgbGFzdCBkYXkgb2YgYSBtb250aFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJcyAyOCBGZWJydWFyeSAyMDE0IHRoZSBsYXN0IGRheSBvZiBhIG1vbnRoP1xuICogY29uc3QgcmVzdWx0ID0gaXNMYXN0RGF5T2ZNb250aChuZXcgRGF0ZSgyMDE0LCAxLCAyOCkpXG4gKiAvLz0+IHRydWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGFzdERheU9mTW9udGgoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIHJldHVybiArZW5kT2ZEYXkoX2RhdGUsIG9wdGlvbnMpID09PSArZW5kT2ZNb250aChfZGF0ZSwgb3B0aW9ucyk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgaXNMYXN0RGF5T2ZNb250aDtcbiIsImltcG9ydCB7IG5vcm1hbGl6ZURhdGVzIH0gZnJvbSBcIi4vX2xpYi9ub3JtYWxpemVEYXRlcy5qc1wiO1xuaW1wb3J0IHsgY29tcGFyZUFzYyB9IGZyb20gXCIuL2NvbXBhcmVBc2MuanNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzIH0gZnJvbSBcIi4vZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMuanNcIjtcbmltcG9ydCB7IGlzTGFzdERheU9mTW9udGggfSBmcm9tIFwiLi9pc0xhc3REYXlPZk1vbnRoLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBkaWZmZXJlbmNlSW5Nb250aHN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5Nb250aHNcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBmdWxsIG1vbnRocyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAcGFyYW0gbGF0ZXJEYXRlIC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBlYXJsaWVyRGF0ZSAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgZnVsbCBtb250aHNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgZnVsbCBtb250aHMgYXJlIGJldHdlZW4gMzEgSmFudWFyeSAyMDE0IGFuZCAxIFNlcHRlbWJlciAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluTW9udGhzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCBuZXcgRGF0ZSgyMDE0LCAwLCAzMSkpXG4gKiAvLz0+IDdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZlcmVuY2VJbk1vbnRocyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IFtsYXRlckRhdGVfLCB3b3JraW5nTGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoXG4gICAgb3B0aW9ucz8uaW4sXG4gICAgbGF0ZXJEYXRlLFxuICAgIGxhdGVyRGF0ZSxcbiAgICBlYXJsaWVyRGF0ZSxcbiAgKTtcblxuICBjb25zdCBzaWduID0gY29tcGFyZUFzYyh3b3JraW5nTGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZV8pO1xuICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoXG4gICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMod29ya2luZ0xhdGVyRGF0ZSwgZWFybGllckRhdGVfKSxcbiAgKTtcblxuICBpZiAoZGlmZmVyZW5jZSA8IDEpIHJldHVybiAwO1xuXG4gIGlmICh3b3JraW5nTGF0ZXJEYXRlLmdldE1vbnRoKCkgPT09IDEgJiYgd29ya2luZ0xhdGVyRGF0ZS5nZXREYXRlKCkgPiAyNylcbiAgICB3b3JraW5nTGF0ZXJEYXRlLnNldERhdGUoMzApO1xuXG4gIHdvcmtpbmdMYXRlckRhdGUuc2V0TW9udGgod29ya2luZ0xhdGVyRGF0ZS5nZXRNb250aCgpIC0gc2lnbiAqIGRpZmZlcmVuY2UpO1xuXG4gIGxldCBpc0xhc3RNb250aE5vdEZ1bGwgPSBjb21wYXJlQXNjKHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlXykgPT09IC1zaWduO1xuXG4gIGlmIChcbiAgICBpc0xhc3REYXlPZk1vbnRoKGxhdGVyRGF0ZV8pICYmXG4gICAgZGlmZmVyZW5jZSA9PT0gMSAmJlxuICAgIGNvbXBhcmVBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKSA9PT0gMVxuICApIHtcbiAgICBpc0xhc3RNb250aE5vdEZ1bGwgPSBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHNpZ24gKiAoZGlmZmVyZW5jZSAtICtpc0xhc3RNb250aE5vdEZ1bGwpO1xuICByZXR1cm4gcmVzdWx0ID09PSAwID8gMCA6IHJlc3VsdDtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBkaWZmZXJlbmNlSW5Nb250aHM7XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0Um91bmRpbmdNZXRob2QobWV0aG9kKSB7XG4gIHJldHVybiAobnVtYmVyKSA9PiB7XG4gICAgY29uc3Qgcm91bmQgPSBtZXRob2QgPyBNYXRoW21ldGhvZF0gOiBNYXRoLnRydW5jO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJvdW5kKG51bWJlcik7XG4gICAgLy8gUHJldmVudCBuZWdhdGl2ZSB6ZXJvXG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7XG4gIH07XG59XG4iLCJpbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHNcbiAqIEBjYXRlZ29yeSBNaWxsaXNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHBhcmFtIGxhdGVyRGF0ZSAtIFRoZSBsYXRlciBkYXRlXG4gKiBAcGFyYW0gZWFybGllckRhdGUgLSBUaGUgZWFybGllciBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgbWlsbGlzZWNvbmRzIGFyZSBiZXR3ZWVuXG4gKiAvLyAyIEp1bHkgMjAxNCAxMjozMDoyMC42MDAgYW5kIDIgSnVseSAyMDE0IDEyOjMwOjIxLjcwMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcyhcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMiwgMTIsIDMwLCAyMSwgNzAwKSxcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMiwgMTIsIDMwLCAyMCwgNjAwKVxuICogKVxuICogLy89PiAxMTAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSkge1xuICByZXR1cm4gK3RvRGF0ZShsYXRlckRhdGUpIC0gK3RvRGF0ZShlYXJsaWVyRGF0ZSk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzO1xuIiwiaW1wb3J0IHsgZ2V0Um91bmRpbmdNZXRob2QgfSBmcm9tIFwiLi9fbGliL2dldFJvdW5kaW5nTWV0aG9kLmpzXCI7XG5pbXBvcnQgeyBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMgfSBmcm9tIFwiLi9kaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGRpZmZlcmVuY2VJblNlY29uZHN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5TZWNvbmRzXG4gKiBAY2F0ZWdvcnkgU2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBwYXJhbSBsYXRlckRhdGUgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGVhcmxpZXJEYXRlIC0gVGhlIGVhcmxpZXIgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2Ygc2Vjb25kc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBzZWNvbmRzIGFyZSBiZXR3ZWVuXG4gKiAvLyAyIEp1bHkgMjAxNCAxMjozMDowNy45OTkgYW5kIDIgSnVseSAyMDE0IDEyOjMwOjIwLjAwMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJblNlY29uZHMoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDYsIDIsIDEyLCAzMCwgMjAsIDApLFxuICogICBuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxMiwgMzAsIDcsIDk5OSlcbiAqIClcbiAqIC8vPT4gMTJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZlcmVuY2VJblNlY29uZHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUpIC8gMTAwMDtcbiAgcmV0dXJuIGdldFJvdW5kaW5nTWV0aG9kKG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kKShkaWZmKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBkaWZmZXJlbmNlSW5TZWNvbmRzO1xuIiwiaW1wb3J0IHsgZGVmYXVsdExvY2FsZSB9IGZyb20gXCIuL19saWIvZGVmYXVsdExvY2FsZS5qc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzIH0gZnJvbSBcIi4vX2xpYi9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzLmpzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVEYXRlcyB9IGZyb20gXCIuL19saWIvbm9ybWFsaXplRGF0ZXMuanNcIjtcbmltcG9ydCB7IGNvbXBhcmVBc2MgfSBmcm9tIFwiLi9jb21wYXJlQXNjLmpzXCI7XG5pbXBvcnQgeyBtaW51dGVzSW5EYXksIG1pbnV0ZXNJbk1vbnRoIH0gZnJvbSBcIi4vY29uc3RhbnRzLmpzXCI7XG5pbXBvcnQgeyBkaWZmZXJlbmNlSW5Nb250aHMgfSBmcm9tIFwiLi9kaWZmZXJlbmNlSW5Nb250aHMuanNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VJblNlY29uZHMgfSBmcm9tIFwiLi9kaWZmZXJlbmNlSW5TZWNvbmRzLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBmb3JtYXREaXN0YW5jZX0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGZvcm1hdERpc3RhbmNlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMgaW4gd29yZHMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzIGluIHdvcmRzLlxuICpcbiAqIHwgRGlzdGFuY2UgYmV0d2VlbiBkYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgMCAuLi4gMzAgc2VjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsZXNzIHRoYW4gYSBtaW51dGUgIHxcbiAqIHwgMzAgc2VjcyAuLi4gMSBtaW4gMzAgc2VjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxIG1pbnV0ZSAgICAgICAgICAgIHxcbiAqIHwgMSBtaW4gMzAgc2VjcyAuLi4gNDQgbWlucyAzMCBzZWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbMi4uNDRdIG1pbnV0ZXMgICAgIHxcbiAqIHwgNDQgbWlucyAuLi4gMzAgc2VjcyAuLi4gODkgbWlucyAzMCBzZWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYm91dCAxIGhvdXIgICAgICAgIHxcbiAqIHwgODkgbWlucyAzMCBzZWNzIC4uLiAyMyBocnMgNTkgbWlucyAzMCBzZWNzICAgICAgICAgICAgICAgICAgICAgICAgfCBhYm91dCBbMi4uMjRdIGhvdXJzIHxcbiAqIHwgMjMgaHJzIDU5IG1pbnMgMzAgc2VjcyAuLi4gNDEgaHJzIDU5IG1pbnMgMzAgc2VjcyAgICAgICAgICAgICAgICAgfCAxIGRheSAgICAgICAgICAgICAgIHxcbiAqIHwgNDEgaHJzIDU5IG1pbnMgMzAgc2VjcyAuLi4gMjkgZGF5cyAyMyBocnMgNTkgbWlucyAzMCBzZWNzICAgICAgICAgfCBbMi4uMzBdIGRheXMgICAgICAgIHxcbiAqIHwgMjkgZGF5cyAyMyBocnMgNTkgbWlucyAzMCBzZWNzIC4uLiA0NCBkYXlzIDIzIGhycyA1OSBtaW5zIDMwIHNlY3MgfCBhYm91dCAxIG1vbnRoICAgICAgIHxcbiAqIHwgNDQgZGF5cyAyMyBocnMgNTkgbWlucyAzMCBzZWNzIC4uLiA1OSBkYXlzIDIzIGhycyA1OSBtaW5zIDMwIHNlY3MgfCBhYm91dCAyIG1vbnRocyAgICAgIHxcbiAqIHwgNTkgZGF5cyAyMyBocnMgNTkgbWlucyAzMCBzZWNzIC4uLiAxIHlyICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbMi4uMTJdIG1vbnRocyAgICAgIHxcbiAqIHwgMSB5ciAuLi4gMSB5ciAzIG1vbnRocyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYm91dCAxIHllYXIgICAgICAgIHxcbiAqIHwgMSB5ciAzIG1vbnRocyAuLi4gMSB5ciA5IG1vbnRoIHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvdmVyIDEgeWVhciAgICAgICAgIHxcbiAqIHwgMSB5ciA5IG1vbnRocyAuLi4gMiB5cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbG1vc3QgMiB5ZWFycyAgICAgIHxcbiAqIHwgTiB5cnMgLi4uIE4geXJzIDMgbW9udGhzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYm91dCBOIHllYXJzICAgICAgIHxcbiAqIHwgTiB5cnMgMyBtb250aHMgLi4uIE4geXJzIDkgbW9udGhzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvdmVyIE4geWVhcnMgICAgICAgIHxcbiAqIHwgTiB5cnMgOSBtb250aHMgLi4uIE4rMSB5cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbG1vc3QgTisxIHllYXJzICAgIHxcbiAqXG4gKiBXaXRoIGBvcHRpb25zLmluY2x1ZGVTZWNvbmRzID09IHRydWVgOlxuICogfCBEaXN0YW5jZSBiZXR3ZWVuIGRhdGVzIHwgUmVzdWx0ICAgICAgICAgICAgICAgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCAwIHNlY3MgLi4uIDUgc2VjcyAgICAgIHwgbGVzcyB0aGFuIDUgc2Vjb25kcyAgfFxuICogfCA1IHNlY3MgLi4uIDEwIHNlY3MgICAgIHwgbGVzcyB0aGFuIDEwIHNlY29uZHMgfFxuICogfCAxMCBzZWNzIC4uLiAyMCBzZWNzICAgIHwgbGVzcyB0aGFuIDIwIHNlY29uZHMgfFxuICogfCAyMCBzZWNzIC4uLiA0MCBzZWNzICAgIHwgaGFsZiBhIG1pbnV0ZSAgICAgICAgfFxuICogfCA0MCBzZWNzIC4uLiA2MCBzZWNzICAgIHwgbGVzcyB0aGFuIGEgbWludXRlICAgfFxuICogfCA2MCBzZWNzIC4uLiA5MCBzZWNzICAgIHwgMSBtaW51dGUgICAgICAgICAgICAgfFxuICpcbiAqIEBwYXJhbSBsYXRlckRhdGUgLSBUaGUgZGF0ZVxuICogQHBhcmFtIGVhcmxpZXJEYXRlIC0gVGhlIGRhdGUgdG8gY29tcGFyZSB3aXRoXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGlzdGFuY2UgaW4gd29yZHNcbiAqXG4gKiBAdGhyb3dzIGBkYXRlYCBtdXN0IG5vdCBiZSBJbnZhbGlkIERhdGVcbiAqIEB0aHJvd3MgYGJhc2VEYXRlYCBtdXN0IG5vdCBiZSBJbnZhbGlkIERhdGVcbiAqIEB0aHJvd3MgYG9wdGlvbnMubG9jYWxlYCBtdXN0IGNvbnRhaW4gYGZvcm1hdERpc3RhbmNlYCBwcm9wZXJ0eVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGF0IGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIDIgSnVseSAyMDE0IGFuZCAxIEphbnVhcnkgMjAxNT9cbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdERpc3RhbmNlKG5ldyBEYXRlKDIwMTQsIDYsIDIpLCBuZXcgRGF0ZSgyMDE1LCAwLCAxKSlcbiAqIC8vPT4gJzYgbW9udGhzJ1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGF0IGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIDEgSmFudWFyeSAyMDE1IDAwOjAwOjE1XG4gKiAvLyBhbmQgMSBKYW51YXJ5IDIwMTUgMDA6MDA6MDAsIGluY2x1ZGluZyBzZWNvbmRzP1xuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0RGlzdGFuY2UoXG4gKiAgIG5ldyBEYXRlKDIwMTUsIDAsIDEsIDAsIDAsIDE1KSxcbiAqICAgbmV3IERhdGUoMjAxNSwgMCwgMSwgMCwgMCwgMCksXG4gKiAgIHsgaW5jbHVkZVNlY29uZHM6IHRydWUgfVxuICogKVxuICogLy89PiAnbGVzcyB0aGFuIDIwIHNlY29uZHMnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoYXQgaXMgdGhlIGRpc3RhbmNlIGZyb20gMSBKYW51YXJ5IDIwMTZcbiAqIC8vIHRvIDEgSmFudWFyeSAyMDE1LCB3aXRoIGEgc3VmZml4P1xuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0RGlzdGFuY2UobmV3IERhdGUoMjAxNSwgMCwgMSksIG5ldyBEYXRlKDIwMTYsIDAsIDEpLCB7XG4gKiAgIGFkZFN1ZmZpeDogdHJ1ZVxuICogfSlcbiAqIC8vPT4gJ2Fib3V0IDEgeWVhciBhZ28nXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoYXQgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gMSBBdWd1c3QgMjAxNiBhbmQgMSBKYW51YXJ5IDIwMTUgaW4gRXNwZXJhbnRvP1xuICogaW1wb3J0IHsgZW9Mb2NhbGUgfSBmcm9tICdkYXRlLWZucy9sb2NhbGUvZW8nXG4gKiBjb25zdCByZXN1bHQgPSBmb3JtYXREaXN0YW5jZShuZXcgRGF0ZSgyMDE2LCA3LCAxKSwgbmV3IERhdGUoMjAxNSwgMCwgMSksIHtcbiAqICAgbG9jYWxlOiBlb0xvY2FsZVxuICogfSlcbiAqIC8vPT4gJ3BsaSBvbCAxIGphcm8nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREaXN0YW5jZShsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgY29uc3QgbG9jYWxlID0gb3B0aW9ucz8ubG9jYWxlID8/IGRlZmF1bHRPcHRpb25zLmxvY2FsZSA/PyBkZWZhdWx0TG9jYWxlO1xuICBjb25zdCBtaW51dGVzSW5BbG1vc3RUd29EYXlzID0gMjUyMDtcblxuICBjb25zdCBjb21wYXJpc29uID0gY29tcGFyZUFzYyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlKTtcblxuICBpZiAoaXNOYU4oY29tcGFyaXNvbikpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB0aW1lIHZhbHVlXCIpO1xuXG4gIGNvbnN0IGxvY2FsaXplT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHtcbiAgICBhZGRTdWZmaXg6IG9wdGlvbnM/LmFkZFN1ZmZpeCxcbiAgICBjb21wYXJpc29uOiBjb21wYXJpc29uLFxuICB9KTtcblxuICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKFxuICAgIG9wdGlvbnM/LmluLFxuICAgIC4uLihjb21wYXJpc29uID4gMCA/IFtlYXJsaWVyRGF0ZSwgbGF0ZXJEYXRlXSA6IFtsYXRlckRhdGUsIGVhcmxpZXJEYXRlXSksXG4gICk7XG5cbiAgY29uc3Qgc2Vjb25kcyA9IGRpZmZlcmVuY2VJblNlY29uZHMoZWFybGllckRhdGVfLCBsYXRlckRhdGVfKTtcbiAgY29uc3Qgb2Zmc2V0SW5TZWNvbmRzID1cbiAgICAoZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhlYXJsaWVyRGF0ZV8pIC1cbiAgICAgIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMobGF0ZXJEYXRlXykpIC9cbiAgICAxMDAwO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5yb3VuZCgoc2Vjb25kcyAtIG9mZnNldEluU2Vjb25kcykgLyA2MCk7XG4gIGxldCBtb250aHM7XG5cbiAgLy8gMCB1cCB0byAyIG1pbnNcbiAgaWYgKG1pbnV0ZXMgPCAyKSB7XG4gICAgaWYgKG9wdGlvbnM/LmluY2x1ZGVTZWNvbmRzKSB7XG4gICAgICBpZiAoc2Vjb25kcyA8IDUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcImxlc3NUaGFuWFNlY29uZHNcIiwgNSwgbG9jYWxpemVPcHRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAoc2Vjb25kcyA8IDEwKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoXCJsZXNzVGhhblhTZWNvbmRzXCIsIDEwLCBsb2NhbGl6ZU9wdGlvbnMpO1xuICAgICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgMjApIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcImxlc3NUaGFuWFNlY29uZHNcIiwgMjAsIGxvY2FsaXplT3B0aW9ucyk7XG4gICAgICB9IGVsc2UgaWYgKHNlY29uZHMgPCA0MCkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKFwiaGFsZkFNaW51dGVcIiwgMCwgbG9jYWxpemVPcHRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAoc2Vjb25kcyA8IDYwKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoXCJsZXNzVGhhblhNaW51dGVzXCIsIDEsIGxvY2FsaXplT3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKFwieE1pbnV0ZXNcIiwgMSwgbG9jYWxpemVPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcImxlc3NUaGFuWE1pbnV0ZXNcIiwgMSwgbG9jYWxpemVPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoXCJ4TWludXRlc1wiLCBtaW51dGVzLCBsb2NhbGl6ZU9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIgbWlucyB1cCB0byAwLjc1IGhyc1xuICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCA0NSkge1xuICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoXCJ4TWludXRlc1wiLCBtaW51dGVzLCBsb2NhbGl6ZU9wdGlvbnMpO1xuXG4gICAgLy8gMC43NSBocnMgdXAgdG8gMS41IGhyc1xuICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCA5MCkge1xuICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoXCJhYm91dFhIb3Vyc1wiLCAxLCBsb2NhbGl6ZU9wdGlvbnMpO1xuXG4gICAgLy8gMS41IGhycyB1cCB0byAyNCBocnNcbiAgfSBlbHNlIGlmIChtaW51dGVzIDwgbWludXRlc0luRGF5KSB7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyA2MCk7XG4gICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcImFib3V0WEhvdXJzXCIsIGhvdXJzLCBsb2NhbGl6ZU9wdGlvbnMpO1xuXG4gICAgLy8gMSBkYXkgdXAgdG8gMS43NSBkYXlzXG4gIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkFsbW9zdFR3b0RheXMpIHtcbiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKFwieERheXNcIiwgMSwgbG9jYWxpemVPcHRpb25zKTtcblxuICAgIC8vIDEuNzUgZGF5cyB1cCB0byAzMCBkYXlzXG4gIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbk1vbnRoKSB7XG4gICAgY29uc3QgZGF5cyA9IE1hdGgucm91bmQobWludXRlcyAvIG1pbnV0ZXNJbkRheSk7XG4gICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcInhEYXlzXCIsIGRheXMsIGxvY2FsaXplT3B0aW9ucyk7XG5cbiAgICAvLyAxIG1vbnRoIHVwIHRvIDIgbW9udGhzXG4gIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbk1vbnRoICogMikge1xuICAgIG1vbnRocyA9IE1hdGgucm91bmQobWludXRlcyAvIG1pbnV0ZXNJbk1vbnRoKTtcbiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKFwiYWJvdXRYTW9udGhzXCIsIG1vbnRocywgbG9jYWxpemVPcHRpb25zKTtcbiAgfVxuXG4gIG1vbnRocyA9IGRpZmZlcmVuY2VJbk1vbnRocyhlYXJsaWVyRGF0ZV8sIGxhdGVyRGF0ZV8pO1xuXG4gIC8vIDIgbW9udGhzIHVwIHRvIDEyIG1vbnRoc1xuICBpZiAobW9udGhzIDwgMTIpIHtcbiAgICBjb25zdCBuZWFyZXN0TW9udGggPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyBtaW51dGVzSW5Nb250aCk7XG4gICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcInhNb250aHNcIiwgbmVhcmVzdE1vbnRoLCBsb2NhbGl6ZU9wdGlvbnMpO1xuXG4gICAgLy8gMSB5ZWFyIHVwIHRvIG1heCBEYXRlXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbW9udGhzU2luY2VTdGFydE9mWWVhciA9IG1vbnRocyAlIDEyO1xuICAgIGNvbnN0IHllYXJzID0gTWF0aC50cnVuYyhtb250aHMgLyAxMik7XG5cbiAgICAvLyBOIHllYXJzIHVwIHRvIDEgeWVhcnMgMyBtb250aHNcbiAgICBpZiAobW9udGhzU2luY2VTdGFydE9mWWVhciA8IDMpIHtcbiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoXCJhYm91dFhZZWFyc1wiLCB5ZWFycywgbG9jYWxpemVPcHRpb25zKTtcblxuICAgICAgLy8gTiB5ZWFycyAzIG1vbnRocyB1cCB0byBOIHllYXJzIDkgbW9udGhzXG4gICAgfSBlbHNlIGlmIChtb250aHNTaW5jZVN0YXJ0T2ZZZWFyIDwgOSkge1xuICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcIm92ZXJYWWVhcnNcIiwgeWVhcnMsIGxvY2FsaXplT3B0aW9ucyk7XG5cbiAgICAgIC8vIE4geWVhcnMgOSBtb250aHMgdXAgdG8gTiB5ZWFyIDEyIG1vbnRoc1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKFwiYWxtb3N0WFllYXJzXCIsIHllYXJzICsgMSwgbG9jYWxpemVPcHRpb25zKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBmb3JtYXREaXN0YW5jZTtcbiIsImltcG9ydCB7IGNvbnN0cnVjdE5vdyB9IGZyb20gXCIuL2NvbnN0cnVjdE5vdy5qc1wiO1xuXG5pbXBvcnQgeyBmb3JtYXREaXN0YW5jZSB9IGZyb20gXCIuL2Zvcm1hdERpc3RhbmNlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBmb3JtYXREaXN0YW5jZVRvTm93fSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZm9ybWF0RGlzdGFuY2VUb05vd1xuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGdpdmVuIGRhdGUgYW5kIG5vdyBpbiB3b3Jkcy5cbiAqIEBwdXJlIGZhbHNlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGdpdmVuIGRhdGUgYW5kIG5vdyBpbiB3b3Jkcy5cbiAqXG4gKiB8IERpc3RhbmNlIHRvIG5vdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IDAgLi4uIDMwIHNlY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbGVzcyB0aGFuIGEgbWludXRlICB8XG4gKiB8IDMwIHNlY3MgLi4uIDEgbWluIDMwIHNlY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMSBtaW51dGUgICAgICAgICAgICB8XG4gKiB8IDEgbWluIDMwIHNlY3MgLi4uIDQ0IG1pbnMgMzAgc2VjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWzIuLjQ0XSBtaW51dGVzICAgICB8XG4gKiB8IDQ0IG1pbnMgLi4uIDMwIHNlY3MgLi4uIDg5IG1pbnMgMzAgc2VjcyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWJvdXQgMSBob3VyICAgICAgICB8XG4gKiB8IDg5IG1pbnMgMzAgc2VjcyAuLi4gMjMgaHJzIDU5IG1pbnMgMzAgc2VjcyAgICAgICAgICAgICAgICAgICAgICAgIHwgYWJvdXQgWzIuLjI0XSBob3VycyB8XG4gKiB8IDIzIGhycyA1OSBtaW5zIDMwIHNlY3MgLi4uIDQxIGhycyA1OSBtaW5zIDMwIHNlY3MgICAgICAgICAgICAgICAgIHwgMSBkYXkgICAgICAgICAgICAgICB8XG4gKiB8IDQxIGhycyA1OSBtaW5zIDMwIHNlY3MgLi4uIDI5IGRheXMgMjMgaHJzIDU5IG1pbnMgMzAgc2VjcyAgICAgICAgIHwgWzIuLjMwXSBkYXlzICAgICAgICB8XG4gKiB8IDI5IGRheXMgMjMgaHJzIDU5IG1pbnMgMzAgc2VjcyAuLi4gNDQgZGF5cyAyMyBocnMgNTkgbWlucyAzMCBzZWNzIHwgYWJvdXQgMSBtb250aCAgICAgICB8XG4gKiB8IDQ0IGRheXMgMjMgaHJzIDU5IG1pbnMgMzAgc2VjcyAuLi4gNTkgZGF5cyAyMyBocnMgNTkgbWlucyAzMCBzZWNzIHwgYWJvdXQgMiBtb250aHMgICAgICB8XG4gKiB8IDU5IGRheXMgMjMgaHJzIDU5IG1pbnMgMzAgc2VjcyAuLi4gMSB5ciAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWzIuLjEyXSBtb250aHMgICAgICB8XG4gKiB8IDEgeXIgLi4uIDEgeXIgMyBtb250aHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWJvdXQgMSB5ZWFyICAgICAgICB8XG4gKiB8IDEgeXIgMyBtb250aHMgLi4uIDEgeXIgOSBtb250aCBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3ZlciAxIHllYXIgICAgICAgICB8XG4gKiB8IDEgeXIgOSBtb250aHMgLi4uIDIgeXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxtb3N0IDIgeWVhcnMgICAgICB8XG4gKiB8IE4geXJzIC4uLiBOIHlycyAzIG1vbnRocyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWJvdXQgTiB5ZWFycyAgICAgICB8XG4gKiB8IE4geXJzIDMgbW9udGhzIC4uLiBOIHlycyA5IG1vbnRocyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3ZlciBOIHllYXJzICAgICAgICB8XG4gKiB8IE4geXJzIDkgbW9udGhzIC4uLiBOKzEgeXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxtb3N0IE4rMSB5ZWFycyAgICB8XG4gKlxuICogV2l0aCBgb3B0aW9ucy5pbmNsdWRlU2Vjb25kcyA9PSB0cnVlYDpcbiAqIHwgRGlzdGFuY2UgdG8gbm93ICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgMCBzZWNzIC4uLiA1IHNlY3MgICB8IGxlc3MgdGhhbiA1IHNlY29uZHMgIHxcbiAqIHwgNSBzZWNzIC4uLiAxMCBzZWNzICB8IGxlc3MgdGhhbiAxMCBzZWNvbmRzIHxcbiAqIHwgMTAgc2VjcyAuLi4gMjAgc2VjcyB8IGxlc3MgdGhhbiAyMCBzZWNvbmRzIHxcbiAqIHwgMjAgc2VjcyAuLi4gNDAgc2VjcyB8IGhhbGYgYSBtaW51dGUgICAgICAgIHxcbiAqIHwgNDAgc2VjcyAuLi4gNjAgc2VjcyB8IGxlc3MgdGhhbiBhIG1pbnV0ZSAgIHxcbiAqIHwgNjAgc2VjcyAuLi4gOTAgc2VjcyB8IDEgbWludXRlICAgICAgICAgICAgIHxcbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGRpc3RhbmNlIGluIHdvcmRzXG4gKlxuICogQHRocm93cyBgZGF0ZWAgbXVzdCBub3QgYmUgSW52YWxpZCBEYXRlXG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBmb3JtYXREaXN0YW5jZWAgcHJvcGVydHlcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSWYgdG9kYXkgaXMgMSBKYW51YXJ5IDIwMTUsIHdoYXQgaXMgdGhlIGRpc3RhbmNlIHRvIDIgSnVseSAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0RGlzdGFuY2VUb05vdyhcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMilcbiAqIClcbiAqIC8vPT4gJzYgbW9udGhzJ1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiBub3cgaXMgMSBKYW51YXJ5IDIwMTUgMDA6MDA6MDAsXG4gKiAvLyB3aGF0IGlzIHRoZSBkaXN0YW5jZSB0byAxIEphbnVhcnkgMjAxNSAwMDowMDoxNSwgaW5jbHVkaW5nIHNlY29uZHM/XG4gKiBjb25zdCByZXN1bHQgPSBmb3JtYXREaXN0YW5jZVRvTm93KFxuICogICBuZXcgRGF0ZSgyMDE1LCAwLCAxLCAwLCAwLCAxNSksXG4gKiAgIHtpbmNsdWRlU2Vjb25kczogdHJ1ZX1cbiAqIClcbiAqIC8vPT4gJ2xlc3MgdGhhbiAyMCBzZWNvbmRzJ1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB0b2RheSBpcyAxIEphbnVhcnkgMjAxNSxcbiAqIC8vIHdoYXQgaXMgdGhlIGRpc3RhbmNlIHRvIDEgSmFudWFyeSAyMDE2LCB3aXRoIGEgc3VmZml4P1xuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0RGlzdGFuY2VUb05vdyhcbiAqICAgbmV3IERhdGUoMjAxNiwgMCwgMSksXG4gKiAgIHthZGRTdWZmaXg6IHRydWV9XG4gKiApXG4gKiAvLz0+ICdpbiBhYm91dCAxIHllYXInXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRvZGF5IGlzIDEgSmFudWFyeSAyMDE1LFxuICogLy8gd2hhdCBpcyB0aGUgZGlzdGFuY2UgdG8gMSBBdWd1c3QgMjAxNiBpbiBFc3BlcmFudG8/XG4gKiBjb25zdCBlb0xvY2FsZSA9IHJlcXVpcmUoJ2RhdGUtZm5zL2xvY2FsZS9lbycpXG4gKiBjb25zdCByZXN1bHQgPSBmb3JtYXREaXN0YW5jZVRvTm93KFxuICogICBuZXcgRGF0ZSgyMDE2LCA3LCAxKSxcbiAqICAge2xvY2FsZTogZW9Mb2NhbGV9XG4gKiApXG4gKiAvLz0+ICdwbGkgb2wgMSBqYXJvJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGlzdGFuY2VUb05vdyhkYXRlLCBvcHRpb25zKSB7XG4gIHJldHVybiBmb3JtYXREaXN0YW5jZShkYXRlLCBjb25zdHJ1Y3ROb3coZGF0ZSksIG9wdGlvbnMpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGZvcm1hdERpc3RhbmNlVG9Ob3c7XG4iLCJpbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZldlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mV2Vla1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gU3VuIEF1ZyAzMSAyMDE0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXksIHRoZSBzdGFydCBvZiB0aGUgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCksIHsgd2Vla1N0YXJ0c09uOiAxIH0pXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwMDowMDowMFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRPZldlZWsoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCBkYXkgPSBfZGF0ZS5nZXREYXkoKTtcbiAgY29uc3QgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyA3IDogMCkgKyBkYXkgLSB3ZWVrU3RhcnRzT247XG5cbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgLSBkaWZmKTtcbiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBfZGF0ZTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mV2VlaztcbiIsImltcG9ydCB7IG5vcm1hbGl6ZURhdGVzIH0gZnJvbSBcIi4vX2xpYi9ub3JtYWxpemVEYXRlcy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWsgfSBmcm9tIFwiLi9zdGFydE9mV2Vlay5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgaXNTYW1lV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGlzU2FtZVdlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgd2VlayAoYW5kIG1vbnRoIGFuZCB5ZWFyKT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgd2VlayAoYW5kIG1vbnRoIGFuZCB5ZWFyKT9cbiAqXG4gKiBAcGFyYW0gbGF0ZXJEYXRlIC0gVGhlIGZpcnN0IGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSBlYXJsaWVyRGF0ZSAtIFRoZSBzZWNvbmQgZGF0ZSB0byBjaGVja1xuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGVzIGFyZSBpbiB0aGUgc2FtZSB3ZWVrIChhbmQgbW9udGggYW5kIHllYXIpXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAzMSBBdWd1c3QgMjAxNCBhbmQgNCBTZXB0ZW1iZXIgMjAxNCBpbiB0aGUgc2FtZSB3ZWVrP1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lV2VlayhuZXcgRGF0ZSgyMDE0LCA3LCAzMSksIG5ldyBEYXRlKDIwMTQsIDgsIDQpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHdlZWsgc3RhcnRzIHdpdGggTW9uZGF5LFxuICogLy8gYXJlIDMxIEF1Z3VzdCAyMDE0IGFuZCA0IFNlcHRlbWJlciAyMDE0IGluIHRoZSBzYW1lIHdlZWs/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVXZWVrKG5ldyBEYXRlKDIwMTQsIDcsIDMxKSwgbmV3IERhdGUoMjAxNCwgOCwgNCksIHtcbiAqICAgd2Vla1N0YXJ0c09uOiAxXG4gKiB9KVxuICogLy89PiBmYWxzZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMSBKYW51YXJ5IDIwMTQgYW5kIDEgSmFudWFyeSAyMDE1IGluIHRoZSBzYW1lIHdlZWs/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVXZWVrKG5ldyBEYXRlKDIwMTQsIDAsIDEpLCBuZXcgRGF0ZSgyMDE1LCAwLCAxKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZVdlZWsobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKFxuICAgIG9wdGlvbnM/LmluLFxuICAgIGxhdGVyRGF0ZSxcbiAgICBlYXJsaWVyRGF0ZSxcbiAgKTtcbiAgcmV0dXJuIChcbiAgICArc3RhcnRPZldlZWsobGF0ZXJEYXRlXywgb3B0aW9ucykgPT09ICtzdGFydE9mV2VlayhlYXJsaWVyRGF0ZV8sIG9wdGlvbnMpXG4gICk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgaXNTYW1lV2VlaztcbiIsImNvbnN0IGZvcm1hdERpc3RhbmNlTG9jYWxlID0ge1xuICBsZXNzVGhhblhTZWNvbmRzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcIndlbmlnZXIgYWxzIDEgU2VrdW5kZVwiLFxuICAgICAgb3RoZXI6IFwid2VuaWdlciBhbHMge3tjb3VudH19IFNla3VuZGVuXCIsXG4gICAgfSxcbiAgICB3aXRoUHJlcG9zaXRpb246IHtcbiAgICAgIG9uZTogXCJ3ZW5pZ2VyIGFscyAxIFNla3VuZGVcIixcbiAgICAgIG90aGVyOiBcIndlbmlnZXIgYWxzIHt7Y291bnR9fSBTZWt1bmRlblwiLFxuICAgIH0sXG4gIH0sXG5cbiAgeFNlY29uZHM6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwiMSBTZWt1bmRlXCIsXG4gICAgICBvdGhlcjogXCJ7e2NvdW50fX0gU2VrdW5kZW5cIixcbiAgICB9LFxuICAgIHdpdGhQcmVwb3NpdGlvbjoge1xuICAgICAgb25lOiBcIjEgU2VrdW5kZVwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IFNla3VuZGVuXCIsXG4gICAgfSxcbiAgfSxcblxuICBoYWxmQU1pbnV0ZToge1xuICAgIHN0YW5kYWxvbmU6IFwiZWluZSBoYWxiZSBNaW51dGVcIixcbiAgICB3aXRoUHJlcG9zaXRpb246IFwiZWluZXIgaGFsYmVuIE1pbnV0ZVwiLFxuICB9LFxuXG4gIGxlc3NUaGFuWE1pbnV0ZXM6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwid2VuaWdlciBhbHMgMSBNaW51dGVcIixcbiAgICAgIG90aGVyOiBcIndlbmlnZXIgYWxzIHt7Y291bnR9fSBNaW51dGVuXCIsXG4gICAgfSxcbiAgICB3aXRoUHJlcG9zaXRpb246IHtcbiAgICAgIG9uZTogXCJ3ZW5pZ2VyIGFscyAxIE1pbnV0ZVwiLFxuICAgICAgb3RoZXI6IFwid2VuaWdlciBhbHMge3tjb3VudH19IE1pbnV0ZW5cIixcbiAgICB9LFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcIjEgTWludXRlXCIsXG4gICAgICBvdGhlcjogXCJ7e2NvdW50fX0gTWludXRlblwiLFxuICAgIH0sXG4gICAgd2l0aFByZXBvc2l0aW9uOiB7XG4gICAgICBvbmU6IFwiMSBNaW51dGVcIixcbiAgICAgIG90aGVyOiBcInt7Y291bnR9fSBNaW51dGVuXCIsXG4gICAgfSxcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIHN0YW5kYWxvbmU6IHtcbiAgICAgIG9uZTogXCJldHdhIDEgU3R1bmRlXCIsXG4gICAgICBvdGhlcjogXCJldHdhIHt7Y291bnR9fSBTdHVuZGVuXCIsXG4gICAgfSxcbiAgICB3aXRoUHJlcG9zaXRpb246IHtcbiAgICAgIG9uZTogXCJldHdhIDEgU3R1bmRlXCIsXG4gICAgICBvdGhlcjogXCJldHdhIHt7Y291bnR9fSBTdHVuZGVuXCIsXG4gICAgfSxcbiAgfSxcblxuICB4SG91cnM6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwiMSBTdHVuZGVcIixcbiAgICAgIG90aGVyOiBcInt7Y291bnR9fSBTdHVuZGVuXCIsXG4gICAgfSxcbiAgICB3aXRoUHJlcG9zaXRpb246IHtcbiAgICAgIG9uZTogXCIxIFN0dW5kZVwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IFN0dW5kZW5cIixcbiAgICB9LFxuICB9LFxuXG4gIHhEYXlzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcIjEgVGFnXCIsXG4gICAgICBvdGhlcjogXCJ7e2NvdW50fX0gVGFnZVwiLFxuICAgIH0sXG4gICAgd2l0aFByZXBvc2l0aW9uOiB7XG4gICAgICBvbmU6IFwiMSBUYWdcIixcbiAgICAgIG90aGVyOiBcInt7Y291bnR9fSBUYWdlblwiLFxuICAgIH0sXG4gIH0sXG5cbiAgYWJvdXRYV2Vla3M6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwiZXR3YSAxIFdvY2hlXCIsXG4gICAgICBvdGhlcjogXCJldHdhIHt7Y291bnR9fSBXb2NoZW5cIixcbiAgICB9LFxuICAgIHdpdGhQcmVwb3NpdGlvbjoge1xuICAgICAgb25lOiBcImV0d2EgMSBXb2NoZVwiLFxuICAgICAgb3RoZXI6IFwiZXR3YSB7e2NvdW50fX0gV29jaGVuXCIsXG4gICAgfSxcbiAgfSxcblxuICB4V2Vla3M6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwiMSBXb2NoZVwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IFdvY2hlblwiLFxuICAgIH0sXG4gICAgd2l0aFByZXBvc2l0aW9uOiB7XG4gICAgICBvbmU6IFwiMSBXb2NoZVwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IFdvY2hlblwiLFxuICAgIH0sXG4gIH0sXG5cbiAgYWJvdXRYTW9udGhzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcImV0d2EgMSBNb25hdFwiLFxuICAgICAgb3RoZXI6IFwiZXR3YSB7e2NvdW50fX0gTW9uYXRlXCIsXG4gICAgfSxcbiAgICB3aXRoUHJlcG9zaXRpb246IHtcbiAgICAgIG9uZTogXCJldHdhIDEgTW9uYXRcIixcbiAgICAgIG90aGVyOiBcImV0d2Ege3tjb3VudH19IE1vbmF0ZW5cIixcbiAgICB9LFxuICB9LFxuXG4gIHhNb250aHM6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwiMSBNb25hdFwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IE1vbmF0ZVwiLFxuICAgIH0sXG4gICAgd2l0aFByZXBvc2l0aW9uOiB7XG4gICAgICBvbmU6IFwiMSBNb25hdFwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IE1vbmF0ZW5cIixcbiAgICB9LFxuICB9LFxuXG4gIGFib3V0WFllYXJzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcImV0d2EgMSBKYWhyXCIsXG4gICAgICBvdGhlcjogXCJldHdhIHt7Y291bnR9fSBKYWhyZVwiLFxuICAgIH0sXG4gICAgd2l0aFByZXBvc2l0aW9uOiB7XG4gICAgICBvbmU6IFwiZXR3YSAxIEphaHJcIixcbiAgICAgIG90aGVyOiBcImV0d2Ege3tjb3VudH19IEphaHJlblwiLFxuICAgIH0sXG4gIH0sXG5cbiAgeFllYXJzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcIjEgSmFoclwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IEphaHJlXCIsXG4gICAgfSxcbiAgICB3aXRoUHJlcG9zaXRpb246IHtcbiAgICAgIG9uZTogXCIxIEphaHJcIixcbiAgICAgIG90aGVyOiBcInt7Y291bnR9fSBKYWhyZW5cIixcbiAgICB9LFxuICB9LFxuXG4gIG92ZXJYWWVhcnM6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwibWVociBhbHMgMSBKYWhyXCIsXG4gICAgICBvdGhlcjogXCJtZWhyIGFscyB7e2NvdW50fX0gSmFocmVcIixcbiAgICB9LFxuICAgIHdpdGhQcmVwb3NpdGlvbjoge1xuICAgICAgb25lOiBcIm1laHIgYWxzIDEgSmFoclwiLFxuICAgICAgb3RoZXI6IFwibWVociBhbHMge3tjb3VudH19IEphaHJlblwiLFxuICAgIH0sXG4gIH0sXG5cbiAgYWxtb3N0WFllYXJzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcImZhc3QgMSBKYWhyXCIsXG4gICAgICBvdGhlcjogXCJmYXN0IHt7Y291bnR9fSBKYWhyZVwiLFxuICAgIH0sXG4gICAgd2l0aFByZXBvc2l0aW9uOiB7XG4gICAgICBvbmU6IFwiZmFzdCAxIEphaHJcIixcbiAgICAgIG90aGVyOiBcImZhc3Qge3tjb3VudH19IEphaHJlblwiLFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0RGlzdGFuY2UgPSAodG9rZW4sIGNvdW50LCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXN1bHQ7XG5cbiAgY29uc3QgdG9rZW5WYWx1ZSA9IG9wdGlvbnM/LmFkZFN1ZmZpeFxuICAgID8gZm9ybWF0RGlzdGFuY2VMb2NhbGVbdG9rZW5dLndpdGhQcmVwb3NpdGlvblxuICAgIDogZm9ybWF0RGlzdGFuY2VMb2NhbGVbdG9rZW5dLnN0YW5kYWxvbmU7XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoXCJ7e2NvdW50fX1cIiwgU3RyaW5nKGNvdW50KSk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gXCJpbiBcIiArIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwidm9yIFwiICsgcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiaW1wb3J0IHsgYnVpbGRGb3JtYXRMb25nRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZEZvcm1hdExvbmdGbi5qc1wiO1xuXG4vLyBESU4gNTAwODogaHR0cHM6Ly9kZS53aWtpcGVkaWEub3JnL3dpa2kvRGF0dW1zZm9ybWF0I0RJTl81MDA4XG5jb25zdCBkYXRlRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJFRUVFLCBkbyBNTU1NIHlcIiwgLy8gTW9udGFnLCA3LiBKYW51YXIgMjAxOFxuICBsb25nOiBcImRvIE1NTU0geVwiLCAvLyA3LiBKYW51YXIgMjAxOFxuICBtZWRpdW06IFwiZG8gTU1NIHlcIiwgLy8gNy4gSmFuLiAyMDE4XG4gIHNob3J0OiBcImRkLk1NLnlcIiwgLy8gMDcuMDEuMjAxOFxufTtcblxuY29uc3QgdGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwiSEg6bW06c3Mgenp6elwiLFxuICBsb25nOiBcIkhIOm1tOnNzIHpcIixcbiAgbWVkaXVtOiBcIkhIOm1tOnNzXCIsXG4gIHNob3J0OiBcIkhIOm1tXCIsXG59O1xuXG5jb25zdCBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0gJ3VtJyB7e3RpbWV9fVwiLFxuICBsb25nOiBcInt7ZGF0ZX19ICd1bScge3t0aW1lfX1cIixcbiAgbWVkaXVtOiBcInt7ZGF0ZX19IHt7dGltZX19XCIsXG4gIHNob3J0OiBcInt7ZGF0ZX19IHt7dGltZX19XCIsXG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0TG9uZyA9IHtcbiAgZGF0ZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IGRhdGVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxuXG4gIHRpbWU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiB0aW1lRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6IFwiZnVsbFwiLFxuICB9KSxcblxuICBkYXRlVGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IGRhdGVUaW1lRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6IFwiZnVsbFwiLFxuICB9KSxcbn07XG4iLCJjb25zdCBmb3JtYXRSZWxhdGl2ZUxvY2FsZSA9IHtcbiAgbGFzdFdlZWs6IFwiJ2xldHp0ZW4nIGVlZWUgJ3VtJyBwXCIsXG4gIHllc3RlcmRheTogXCInZ2VzdGVybiB1bScgcFwiLFxuICB0b2RheTogXCInaGV1dGUgdW0nIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ21vcmdlbiB1bScgcFwiLFxuICBuZXh0V2VlazogXCJlZWVlICd1bScgcFwiLFxuICBvdGhlcjogXCJQXCIsXG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0UmVsYXRpdmUgPSAodG9rZW4sIF9kYXRlLCBfYmFzZURhdGUsIF9vcHRpb25zKSA9PlxuICBmb3JtYXRSZWxhdGl2ZUxvY2FsZVt0b2tlbl07XG4iLCJpbXBvcnQgeyBidWlsZExvY2FsaXplRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZExvY2FsaXplRm4uanNcIjtcblxuY29uc3QgZXJhVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcInYuQ2hyLlwiLCBcIm4uQ2hyLlwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcInYuQ2hyLlwiLCBcIm4uQ2hyLlwiXSxcbiAgd2lkZTogW1widm9yIENocmlzdHVzXCIsIFwibmFjaCBDaHJpc3R1c1wiXSxcbn07XG5cbmNvbnN0IHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdLFxuICB3aWRlOiBbXCIxLiBRdWFydGFsXCIsIFwiMi4gUXVhcnRhbFwiLCBcIjMuIFF1YXJ0YWxcIiwgXCI0LiBRdWFydGFsXCJdLFxufTtcblxuLy8gTm90ZTogaW4gR2VybWFuLCB0aGUgbmFtZXMgb2YgZGF5cyBvZiB0aGUgd2VlayBhbmQgbW9udGhzIGFyZSBjYXBpdGFsaXplZC5cbi8vIElmIHlvdSBhcmUgbWFraW5nIGEgbmV3IGxvY2FsZSBiYXNlZCBvbiB0aGlzIG9uZSwgY2hlY2sgaWYgdGhlIHNhbWUgaXMgdHJ1ZSBmb3IgdGhlIGxhbmd1YWdlIHlvdSdyZSB3b3JraW5nIG9uLlxuLy8gR2VuZXJhbGx5LCBmb3JtYXR0ZWQgZGF0ZXMgc2hvdWxkIGxvb2sgbGlrZSB0aGV5IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgc2VudGVuY2UsXG4vLyBlLmcuIGluIFNwYW5pc2ggbGFuZ3VhZ2UgdGhlIHdlZWtkYXlzIGFuZCBtb250aHMgc2hvdWxkIGJlIGluIHRoZSBsb3dlcmNhc2UuXG5jb25zdCBtb250aFZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJKXCIsIFwiRlwiLCBcIk1cIiwgXCJBXCIsIFwiTVwiLCBcIkpcIiwgXCJKXCIsIFwiQVwiLCBcIlNcIiwgXCJPXCIsIFwiTlwiLCBcIkRcIl0sXG4gIGFiYnJldmlhdGVkOiBbXG4gICAgXCJKYW5cIixcbiAgICBcIkZlYlwiLFxuICAgIFwiTcOkclwiLFxuICAgIFwiQXByXCIsXG4gICAgXCJNYWlcIixcbiAgICBcIkp1blwiLFxuICAgIFwiSnVsXCIsXG4gICAgXCJBdWdcIixcbiAgICBcIlNlcFwiLFxuICAgIFwiT2t0XCIsXG4gICAgXCJOb3ZcIixcbiAgICBcIkRlelwiLFxuICBdLFxuXG4gIHdpZGU6IFtcbiAgICBcIkphbnVhclwiLFxuICAgIFwiRmVicnVhclwiLFxuICAgIFwiTcOkcnpcIixcbiAgICBcIkFwcmlsXCIsXG4gICAgXCJNYWlcIixcbiAgICBcIkp1bmlcIixcbiAgICBcIkp1bGlcIixcbiAgICBcIkF1Z3VzdFwiLFxuICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgXCJPa3RvYmVyXCIsXG4gICAgXCJOb3ZlbWJlclwiLFxuICAgIFwiRGV6ZW1iZXJcIixcbiAgXSxcbn07XG5cbi8vIGh0dHBzOi8vc3QudW5pY29kZS5vcmcvY2xkci1hcHBzL3YjL2RlL0dyZWdvcmlhbi9cbmNvbnN0IGZvcm1hdHRpbmdNb250aFZhbHVlcyA9IHtcbiAgbmFycm93OiBtb250aFZhbHVlcy5uYXJyb3csXG4gIGFiYnJldmlhdGVkOiBbXG4gICAgXCJKYW4uXCIsXG4gICAgXCJGZWIuXCIsXG4gICAgXCJNw6RyelwiLFxuICAgIFwiQXByLlwiLFxuICAgIFwiTWFpXCIsXG4gICAgXCJKdW5pXCIsXG4gICAgXCJKdWxpXCIsXG4gICAgXCJBdWcuXCIsXG4gICAgXCJTZXAuXCIsXG4gICAgXCJPa3QuXCIsXG4gICAgXCJOb3YuXCIsXG4gICAgXCJEZXouXCIsXG4gIF0sXG5cbiAgd2lkZTogbW9udGhWYWx1ZXMud2lkZSxcbn07XG5cbmNvbnN0IGRheVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJTXCIsIFwiTVwiLCBcIkRcIiwgXCJNXCIsIFwiRFwiLCBcIkZcIiwgXCJTXCJdLFxuICBzaG9ydDogW1wiU29cIiwgXCJNb1wiLCBcIkRpXCIsIFwiTWlcIiwgXCJEb1wiLCBcIkZyXCIsIFwiU2FcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCJTby5cIiwgXCJNby5cIiwgXCJEaS5cIiwgXCJNaS5cIiwgXCJEby5cIiwgXCJGci5cIiwgXCJTYS5cIl0sXG4gIHdpZGU6IFtcbiAgICBcIlNvbm50YWdcIixcbiAgICBcIk1vbnRhZ1wiLFxuICAgIFwiRGllbnN0YWdcIixcbiAgICBcIk1pdHR3b2NoXCIsXG4gICAgXCJEb25uZXJzdGFnXCIsXG4gICAgXCJGcmVpdGFnXCIsXG4gICAgXCJTYW1zdGFnXCIsXG4gIF0sXG59O1xuXG4vLyBodHRwczovL3d3dy51bmljb2RlLm9yZy9jbGRyL2NoYXJ0cy8zMi9zdW1tYXJ5L2RlLmh0bWwjMTg4MVxuY29uc3QgZGF5UGVyaW9kVmFsdWVzID0ge1xuICBuYXJyb3c6IHtcbiAgICBhbTogXCJ2bS5cIixcbiAgICBwbTogXCJubS5cIixcbiAgICBtaWRuaWdodDogXCJNaXR0ZXJuYWNodFwiLFxuICAgIG5vb246IFwiTWl0dGFnXCIsXG4gICAgbW9ybmluZzogXCJNb3JnZW5cIixcbiAgICBhZnRlcm5vb246IFwiTmFjaG0uXCIsXG4gICAgZXZlbmluZzogXCJBYmVuZFwiLFxuICAgIG5pZ2h0OiBcIk5hY2h0XCIsXG4gIH0sXG4gIGFiYnJldmlhdGVkOiB7XG4gICAgYW06IFwidm9ybS5cIixcbiAgICBwbTogXCJuYWNobS5cIixcbiAgICBtaWRuaWdodDogXCJNaXR0ZXJuYWNodFwiLFxuICAgIG5vb246IFwiTWl0dGFnXCIsXG4gICAgbW9ybmluZzogXCJNb3JnZW5cIixcbiAgICBhZnRlcm5vb246IFwiTmFjaG1pdHRhZ1wiLFxuICAgIGV2ZW5pbmc6IFwiQWJlbmRcIixcbiAgICBuaWdodDogXCJOYWNodFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwidm9ybWl0dGFnc1wiLFxuICAgIHBtOiBcIm5hY2htaXR0YWdzXCIsXG4gICAgbWlkbmlnaHQ6IFwiTWl0dGVybmFjaHRcIixcbiAgICBub29uOiBcIk1pdHRhZ1wiLFxuICAgIG1vcm5pbmc6IFwiTW9yZ2VuXCIsXG4gICAgYWZ0ZXJub29uOiBcIk5hY2htaXR0YWdcIixcbiAgICBldmVuaW5nOiBcIkFiZW5kXCIsXG4gICAgbmlnaHQ6IFwiTmFjaHRcIixcbiAgfSxcbn07XG5jb25zdCBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzID0ge1xuICBuYXJyb3c6IHtcbiAgICBhbTogXCJ2bS5cIixcbiAgICBwbTogXCJubS5cIixcbiAgICBtaWRuaWdodDogXCJNaXR0ZXJuYWNodFwiLFxuICAgIG5vb246IFwiTWl0dGFnXCIsXG4gICAgbW9ybmluZzogXCJtb3JnZW5zXCIsXG4gICAgYWZ0ZXJub29uOiBcIm5hY2htLlwiLFxuICAgIGV2ZW5pbmc6IFwiYWJlbmRzXCIsXG4gICAgbmlnaHQ6IFwibmFjaHRzXCIsXG4gIH0sXG4gIGFiYnJldmlhdGVkOiB7XG4gICAgYW06IFwidm9ybS5cIixcbiAgICBwbTogXCJuYWNobS5cIixcbiAgICBtaWRuaWdodDogXCJNaXR0ZXJuYWNodFwiLFxuICAgIG5vb246IFwiTWl0dGFnXCIsXG4gICAgbW9ybmluZzogXCJtb3JnZW5zXCIsXG4gICAgYWZ0ZXJub29uOiBcIm5hY2htaXR0YWdzXCIsXG4gICAgZXZlbmluZzogXCJhYmVuZHNcIixcbiAgICBuaWdodDogXCJuYWNodHNcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcInZvcm1pdHRhZ3NcIixcbiAgICBwbTogXCJuYWNobWl0dGFnc1wiLFxuICAgIG1pZG5pZ2h0OiBcIk1pdHRlcm5hY2h0XCIsXG4gICAgbm9vbjogXCJNaXR0YWdcIixcbiAgICBtb3JuaW5nOiBcIm1vcmdlbnNcIixcbiAgICBhZnRlcm5vb246IFwibmFjaG1pdHRhZ3NcIixcbiAgICBldmVuaW5nOiBcImFiZW5kc1wiLFxuICAgIG5pZ2h0OiBcIm5hY2h0c1wiLFxuICB9LFxufTtcblxuY29uc3Qgb3JkaW5hbE51bWJlciA9IChkaXJ0eU51bWJlcikgPT4ge1xuICBjb25zdCBudW1iZXIgPSBOdW1iZXIoZGlydHlOdW1iZXIpO1xuXG4gIHJldHVybiBudW1iZXIgKyBcIi5cIjtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcixcblxuICBlcmE6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBlcmFWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IHF1YXJ0ZXJWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBhcmd1bWVudENhbGxiYWNrOiAocXVhcnRlcikgPT4gcXVhcnRlciAtIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogbW9udGhWYWx1ZXMsXG4gICAgZm9ybWF0dGluZ1ZhbHVlczogZm9ybWF0dGluZ01vbnRoVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheTogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBkYXlQZXJpb2Q6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBkYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBmb3JtYXR0aW5nVmFsdWVzOiBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRGb3JtYXR0aW5nV2lkdGg6IFwid2lkZVwiLFxuICB9KSxcbn07XG4iLCJpbXBvcnQgeyBidWlsZE1hdGNoRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZE1hdGNoRm4uanNcIjtcbmltcG9ydCB7IGJ1aWxkTWF0Y2hQYXR0ZXJuRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZE1hdGNoUGF0dGVybkZuLmpzXCI7XG5cbmNvbnN0IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXihcXGQrKShcXC4pPy9pO1xuY29uc3QgcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9cXGQrL2k7XG5cbmNvbnN0IG1hdGNoRXJhUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14odlxcLj8gP0NoclxcLj98blxcLj8gP0NoclxcLj8pL2ksXG4gIGFiYnJldmlhdGVkOiAvXih2XFwuPyA/Q2hyXFwuP3xuXFwuPyA/Q2hyXFwuPykvaSxcbiAgd2lkZTogL14odm9yIENocmlzdHVzfHZvciB1bnNlcmVyIFplaXRyZWNobnVuZ3xuYWNoIENocmlzdHVzfHVuc2VyZXIgWmVpdHJlY2hudW5nKS9pLFxufTtcbmNvbnN0IHBhcnNlRXJhUGF0dGVybnMgPSB7XG4gIGFueTogWy9edi9pLCAvXm4vaV0sXG59O1xuXG5jb25zdCBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlsxMjM0XS9pLFxuICBhYmJyZXZpYXRlZDogL15xWzEyMzRdL2ksXG4gIHdpZGU6IC9eWzEyMzRdKFxcLik/IFF1YXJ0YWwvaSxcbn07XG5jb25zdCBwYXJzZVF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgYW55OiBbLzEvaSwgLzIvaSwgLzMvaSwgLzQvaV0sXG59O1xuXG5jb25zdCBtYXRjaE1vbnRoUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bamZtYXNvbmRdL2ksXG4gIGFiYnJldmlhdGVkOlxuICAgIC9eKGpbYcOkXW58ZmVifG3DpHJbel0/fGFwcnxtYWl8anVuW2ldP3xqdWxbaV0/fGF1Z3xzZXB8b2t0fG5vdnxkZXopXFwuPy9pLFxuICB3aWRlOiAvXihqYW51YXJ8ZmVicnVhcnxtw6RyenxhcHJpbHxtYWl8anVuaXxqdWxpfGF1Z3VzdHxzZXB0ZW1iZXJ8b2t0b2Jlcnxub3ZlbWJlcnxkZXplbWJlcikvaSxcbn07XG5jb25zdCBwYXJzZU1vbnRoUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogW1xuICAgIC9eai9pLFxuICAgIC9eZi9pLFxuICAgIC9ebS9pLFxuICAgIC9eYS9pLFxuICAgIC9ebS9pLFxuICAgIC9eai9pLFxuICAgIC9eai9pLFxuICAgIC9eYS9pLFxuICAgIC9ecy9pLFxuICAgIC9eby9pLFxuICAgIC9ebi9pLFxuICAgIC9eZC9pLFxuICBdLFxuXG4gIGFueTogW1xuICAgIC9ealthw6RdL2ksXG4gICAgL15mL2ksXG4gICAgL15tw6RyL2ksXG4gICAgL15hcC9pLFxuICAgIC9ebWFpL2ksXG4gICAgL15qdW4vaSxcbiAgICAvXmp1bC9pLFxuICAgIC9eYXUvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcbn07XG5cbmNvbnN0IG1hdGNoRGF5UGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bc21kbWZdL2ksXG4gIHNob3J0OiAvXihzb3xtb3xkaXxtaXxkb3xmcnxzYSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKHNvbj98bW9uP3xkaWU/fG1pdD98ZG9uP3xmcmU/fHNhbT8pXFwuPy9pLFxuICB3aWRlOiAvXihzb25udGFnfG1vbnRhZ3xkaWVuc3RhZ3xtaXR0d29jaHxkb25uZXJzdGFnfGZyZWl0YWd8c2Ftc3RhZykvaSxcbn07XG5jb25zdCBwYXJzZURheVBhdHRlcm5zID0ge1xuICBhbnk6IFsvXnNvL2ksIC9ebW8vaSwgL15kaS9pLCAvXm1pL2ksIC9eZG8vaSwgL15mL2ksIC9ec2EvaV0sXG59O1xuXG5jb25zdCBtYXRjaERheVBlcmlvZFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKHZtXFwuP3xubVxcLj98TWl0dGVybmFjaHR8TWl0dGFnfG1vcmdlbnN8bmFjaG1cXC4/fGFiZW5kc3xuYWNodHMpL2ksXG4gIGFiYnJldmlhdGVkOlxuICAgIC9eKHZvcm1cXC4/fG5hY2htXFwuP3xNaXR0ZXJuYWNodHxNaXR0YWd8bW9yZ2Vuc3xuYWNobVxcLj98YWJlbmRzfG5hY2h0cykvaSxcbiAgd2lkZTogL14odm9ybWl0dGFnc3xuYWNobWl0dGFnc3xNaXR0ZXJuYWNodHxNaXR0YWd8bW9yZ2Vuc3xuYWNobWl0dGFnc3xhYmVuZHN8bmFjaHRzKS9pLFxufTtcbmNvbnN0IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMgPSB7XG4gIGFueToge1xuICAgIGFtOiAvXnYvaSxcbiAgICBwbTogL15uL2ksXG4gICAgbWlkbmlnaHQ6IC9eTWl0dGUvaSxcbiAgICBub29uOiAvXk1pdHRhL2ksXG4gICAgbW9ybmluZzogL21vcmdlbnMvaSxcbiAgICBhZnRlcm5vb246IC9uYWNobWl0dGFncy9pLCAvLyB3aWxsIG5ldmVyIGJlIG1hdGNoZWQuIEFmdGVybm9vbiBpcyBtYXRjaGVkIGJ5IGBwbWBcbiAgICBldmVuaW5nOiAvYWJlbmRzL2ksXG4gICAgbmlnaHQ6IC9uYWNodHMvaSwgLy8gd2lsbCBuZXZlciBiZSBtYXRjaGVkLiBOaWdodCBpcyBtYXRjaGVkIGJ5IGBwbWBcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBtYXRjaCA9IHtcbiAgb3JkaW5hbE51bWJlcjogYnVpbGRNYXRjaFBhdHRlcm5Gbih7XG4gICAgbWF0Y2hQYXR0ZXJuOiBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHBhcnNlUGF0dGVybjogcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICB2YWx1ZUNhbGxiYWNrOiAodmFsdWUpID0+IHBhcnNlSW50KHZhbHVlKSxcbiAgfSksXG5cbiAgZXJhOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICAgIHZhbHVlQ2FsbGJhY2s6IChpbmRleCkgPT4gaW5kZXggKyAxLFxuICB9KSxcblxuICBtb250aDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaE1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcbn07XG4iLCJpbXBvcnQgeyBmb3JtYXREaXN0YW5jZSB9IGZyb20gXCIuL2RlL19saWIvZm9ybWF0RGlzdGFuY2UuanNcIjtcbmltcG9ydCB7IGZvcm1hdExvbmcgfSBmcm9tIFwiLi9kZS9fbGliL2Zvcm1hdExvbmcuanNcIjtcbmltcG9ydCB7IGZvcm1hdFJlbGF0aXZlIH0gZnJvbSBcIi4vZGUvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qc1wiO1xuaW1wb3J0IHsgbG9jYWxpemUgfSBmcm9tIFwiLi9kZS9fbGliL2xvY2FsaXplLmpzXCI7XG5pbXBvcnQgeyBtYXRjaCB9IGZyb20gXCIuL2RlL19saWIvbWF0Y2guanNcIjtcblxuLyoqXG4gKiBAY2F0ZWdvcnkgTG9jYWxlc1xuICogQHN1bW1hcnkgR2VybWFuIGxvY2FsZS5cbiAqIEBsYW5ndWFnZSBHZXJtYW5cbiAqIEBpc28tNjM5LTIgZGV1XG4gKiBAYXV0aG9yIFRob21hcyBFaWxtc3RlaW5lciBbQERlTXV1XShodHRwczovL2dpdGh1Yi5jb20vRGVNdXUpXG4gKiBAYXV0aG9yIEFzaWEgW0Bhc2lhLXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hc2lhLXQpXG4gKiBAYXV0aG9yIFZhbiBWdW9uZyBOZ28gW0B2YW52dW9uZ25nb10oaHR0cHM6Ly9naXRodWIuY29tL3ZhbnZ1b25nbmdvKVxuICogQGF1dGhvciBSb21hbkVybnN0IFtAcGV4XShodHRwczovL2dpdGh1Yi5jb20vcGV4KVxuICogQGF1dGhvciBQaGlsaXBwIEtlY2sgW0BQaGlsaXBwOTFdKGh0dHBzOi8vZ2l0aHViLmNvbS9QaGlsaXBwOTEpXG4gKi9cbmV4cG9ydCBjb25zdCBkZSA9IHtcbiAgY29kZTogXCJkZVwiLFxuICBmb3JtYXREaXN0YW5jZTogZm9ybWF0RGlzdGFuY2UsXG4gIGZvcm1hdExvbmc6IGZvcm1hdExvbmcsXG4gIGZvcm1hdFJlbGF0aXZlOiBmb3JtYXRSZWxhdGl2ZSxcbiAgbG9jYWxpemU6IGxvY2FsaXplLFxuICBtYXRjaDogbWF0Y2gsXG4gIG9wdGlvbnM6IHtcbiAgICB3ZWVrU3RhcnRzT246IDEgLyogTW9uZGF5ICovLFxuICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNCxcbiAgfSxcbn07XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZGU7XG4iLCJjb25zdCBmb3JtYXREaXN0YW5jZUxvY2FsZSA9IHtcbiAgbGVzc1RoYW5YU2Vjb25kczoge1xuICAgIG9uZTogXCLXpNeX15XXqiDXntep16DXmdeZ15RcIixcbiAgICB0d286IFwi16TXl9eV16og157Xqdeq15kg16nXoNeZ15XXqlwiLFxuICAgIG90aGVyOiBcItek15fXldeqINee1r57e2NvdW50fX0g16nXoNeZ15XXqlwiLFxuICB9LFxuXG4gIHhTZWNvbmRzOiB7XG4gICAgb25lOiBcItep16DXmdeZ15RcIixcbiAgICB0d286IFwi16nXqteZINep16DXmdeV16pcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0g16nXoNeZ15XXqlwiLFxuICB9LFxuXG4gIGhhbGZBTWludXRlOiBcIteX16bXmSDXk9en15RcIixcblxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiBcItek15fXldeqINee15PXp9eUXCIsXG4gICAgdHdvOiBcItek15fXldeqINee16nXqteZINeT16fXldeqXCIsXG4gICAgb3RoZXI6IFwi16TXl9eV16og157Wvnt7Y291bnR9fSDXk9en15XXqlwiLFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgb25lOiBcIteT16fXlFwiLFxuICAgIHR3bzogXCLXqdeq15kg15PXp9eV16pcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0g15PXp9eV16pcIixcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIG9uZTogXCLXm9ep16LXlFwiLFxuICAgIHR3bzogXCLXm9ep16LXqteZ15nXnVwiLFxuICAgIG90aGVyOiBcIteb1r57e2NvdW50fX0g16nXoteV16pcIixcbiAgfSxcblxuICB4SG91cnM6IHtcbiAgICBvbmU6IFwi16nXoteUXCIsXG4gICAgdHdvOiBcItep16LXqteZ15nXnVwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSDXqdei15XXqlwiLFxuICB9LFxuXG4gIHhEYXlzOiB7XG4gICAgb25lOiBcIteZ15XXnVwiLFxuICAgIHR3bzogXCLXmdeV157XmdeZ151cIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0g15nXnteZ151cIixcbiAgfSxcblxuICBhYm91dFhXZWVrczoge1xuICAgIG9uZTogXCLXm9ep15HXldeiXCIsXG4gICAgdHdvOiBcIteb16nXkdeV16LXmdeZ151cIixcbiAgICBvdGhlcjogXCLXm9a+e3tjb3VudH19INep15HXldei15XXqlwiLFxuICB9LFxuXG4gIHhXZWVrczoge1xuICAgIG9uZTogXCLXqdeR15XXolwiLFxuICAgIHR3bzogXCLXqdeR15XXoteZ15nXnVwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSDXqdeR15XXoteV16pcIixcbiAgfSxcblxuICBhYm91dFhNb250aHM6IHtcbiAgICBvbmU6IFwi15vXl9eV15PXqVwiLFxuICAgIHR3bzogXCLXm9eX15XXk9ep15nXmdedXCIsXG4gICAgb3RoZXI6IFwi15vWvnt7Y291bnR9fSDXl9eV15PXqdeZ151cIixcbiAgfSxcblxuICB4TW9udGhzOiB7XG4gICAgb25lOiBcIteX15XXk9epXCIsXG4gICAgdHdvOiBcIteX15XXk9ep15nXmdedXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19INeX15XXk9ep15nXnVwiLFxuICB9LFxuXG4gIGFib3V0WFllYXJzOiB7XG4gICAgb25lOiBcIteb16nXoNeUXCIsXG4gICAgdHdvOiBcIteb16nXoNeq15nXmdedXCIsXG4gICAgb3RoZXI6IFwi15vWvnt7Y291bnR9fSDXqdeg15nXnVwiLFxuICB9LFxuXG4gIHhZZWFyczoge1xuICAgIG9uZTogXCLXqdeg15RcIixcbiAgICB0d286IFwi16nXoNeq15nXmdedXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19INep16DXmdedXCIsXG4gIH0sXG5cbiAgb3ZlclhZZWFyczoge1xuICAgIG9uZTogXCLXmdeV16rXqCDXntep16DXlFwiLFxuICAgIHR3bzogXCLXmdeV16rXqCDXntep16DXqteZ15nXnVwiLFxuICAgIG90aGVyOiBcIteZ15XXqteoINee1r57e2NvdW50fX0g16nXoNeZ151cIixcbiAgfSxcblxuICBhbG1vc3RYWWVhcnM6IHtcbiAgICBvbmU6IFwi15vXntei15gg16nXoNeUXCIsXG4gICAgdHdvOiBcIteb157XoteYINep16DXqteZ15nXnVwiLFxuICAgIG90aGVyOiBcIteb157XoteYIHt7Y291bnR9fSDXqdeg15nXnVwiLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdERpc3RhbmNlID0gKHRva2VuLCBjb3VudCwgb3B0aW9ucykgPT4ge1xuICAvLyBSZXR1cm4gd29yZCBpbnN0ZWFkIG9mIGBpbiBvbmUgZGF5YCBvciBgb25lIGRheSBhZ29gXG4gIGlmICh0b2tlbiA9PT0gXCJ4RGF5c1wiICYmIG9wdGlvbnM/LmFkZFN1ZmZpeCAmJiBjb3VudCA8PSAyKSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gY291bnQgPT09IDEgPyBcItee15fXqFwiIDogXCLXnteX16jXqteZ15nXnVwiO1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudCA9PT0gMSA/IFwi15DXqtee15XXnFwiIDogXCLXqdec16nXldedXCI7XG4gIH1cblxuICBsZXQgcmVzdWx0O1xuXG4gIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIGlmIChjb3VudCA9PT0gMikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUudHdvO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub3RoZXIucmVwbGFjZShcInt7Y291bnR9fVwiLCBTdHJpbmcoY291bnQpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5hZGRTdWZmaXgpIHtcbiAgICBpZiAob3B0aW9ucy5jb21wYXJpc29uICYmIG9wdGlvbnMuY29tcGFyaXNvbiA+IDApIHtcbiAgICAgIHJldHVybiBcIteR16LXldeTIFwiICsgcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCLXnNek16DXmSBcIiArIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsImltcG9ydCB7IGJ1aWxkRm9ybWF0TG9uZ0ZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRGb3JtYXRMb25nRm4uanNcIjtcblxuY29uc3QgZGF0ZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwiRUVFRSwgZCDXkU1NTU0geVwiLFxuICBsb25nOiBcImQg15FNTU1NIHlcIixcbiAgbWVkaXVtOiBcImQg15FNTU0geVwiLFxuICBzaG9ydDogXCJkLk0ueVwiLFxufTtcblxuY29uc3QgdGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwiSDptbTpzcyB6enp6XCIsXG4gIGxvbmc6IFwiSDptbTpzcyB6XCIsXG4gIG1lZGl1bTogXCJIOm1tOnNzXCIsXG4gIHNob3J0OiBcIkg6bW1cIixcbn07XG5cbmNvbnN0IGRhdGVUaW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJ7e2RhdGV9fSAn15HXqdei15QnIHt7dGltZX19XCIsXG4gIGxvbmc6IFwie3tkYXRlfX0gJ9eR16nXoteUJyB7e3RpbWV9fVwiLFxuICBtZWRpdW06IFwie3tkYXRlfX0sIHt7dGltZX19XCIsXG4gIHNob3J0OiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdExvbmcgPSB7XG4gIGRhdGU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6IFwiZnVsbFwiLFxuICB9KSxcblxuICB0aW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogdGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgZGF0ZVRpbWU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlVGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG59O1xuIiwiY29uc3QgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBcImVlZWUgJ9ep16LXkdeoINeR16nXoteUJyBwXCIsXG4gIHllc3RlcmRheTogXCIn15DXqtee15XXnCDXkdep16LXlCcgcFwiLFxuICB0b2RheTogXCIn15TXmdeV150g15HXqdei15QnIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ9ee15fXqCDXkdep16LXlCcgcFwiLFxuICBuZXh0V2VlazogXCJlZWVlICfXkdep16LXlCcgcFwiLFxuICBvdGhlcjogXCJQXCIsXG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0UmVsYXRpdmUgPSAodG9rZW4sIF9kYXRlLCBfYmFzZURhdGUsIF9vcHRpb25zKSA9PlxuICBmb3JtYXRSZWxhdGl2ZUxvY2FsZVt0b2tlbl07XG4iLCJpbXBvcnQgeyBidWlsZExvY2FsaXplRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZExvY2FsaXplRm4uanNcIjtcblxuY29uc3QgZXJhVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcItec16TXoNeU17TXoVwiLCBcItec16HXpNeZ16jXlFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcItec16TXoNeU17TXoVwiLCBcItec16HXpNeZ16jXlFwiXSxcbiAgd2lkZTogW1wi15zXpNeg15kg15TXodek15nXqNeUXCIsIFwi15zXodek15nXqNeUXCJdLFxufTtcblxuY29uc3QgcXVhcnRlclZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCJdLFxuICBhYmJyZXZpYXRlZDogW1wiUTFcIiwgXCJRMlwiLCBcIlEzXCIsIFwiUTRcIl0sXG4gIHdpZGU6IFtcIteo15HXoteV158gMVwiLCBcIteo15HXoteV158gMlwiLCBcIteo15HXoteV158gM1wiLCBcIteo15HXoteV158gNFwiXSxcbn07XG5cbmNvbnN0IG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIiwgXCI4XCIsIFwiOVwiLCBcIjEwXCIsIFwiMTFcIiwgXCIxMlwiXSxcblxuICBhYmJyZXZpYXRlZDogW1xuICAgIFwi15nXoNeV17NcIixcbiAgICBcItek15HXqNezXCIsXG4gICAgXCLXnteo16VcIixcbiAgICBcIteQ16TXqNezXCIsXG4gICAgXCLXnteQ15lcIixcbiAgICBcIteZ15XXoNeZXCIsXG4gICAgXCLXmdeV15zXmVwiLFxuICAgIFwi15DXldeS17NcIixcbiAgICBcIteh16TXmNezXCIsXG4gICAgXCLXkNeV16fXs1wiLFxuICAgIFwi16DXldeR17NcIixcbiAgICBcIteT16bXntezXCIsXG4gIF0sXG5cbiAgd2lkZTogW1xuICAgIFwi15nXoNeV15DXqFwiLFxuICAgIFwi16TXkdeo15XXkNeoXCIsXG4gICAgXCLXnteo16VcIixcbiAgICBcIteQ16TXqNeZ15xcIixcbiAgICBcItee15DXmVwiLFxuICAgIFwi15nXldeg15lcIixcbiAgICBcIteZ15XXnNeZXCIsXG4gICAgXCLXkNeV15LXldeh15hcIixcbiAgICBcIteh16TXmNee15HXqFwiLFxuICAgIFwi15DXlden15jXldeR16hcIixcbiAgICBcIteg15XXkdee15HXqFwiLFxuICAgIFwi15PXptee15HXqFwiLFxuICBdLFxufTtcblxuY29uc3QgZGF5VmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIteQ17NcIiwgXCLXkdezXCIsIFwi15LXs1wiLCBcIteT17NcIiwgXCLXlNezXCIsIFwi15XXs1wiLCBcItep17NcIl0sXG4gIHNob3J0OiBbXCLXkNezXCIsIFwi15HXs1wiLCBcIteS17NcIiwgXCLXk9ezXCIsIFwi15TXs1wiLCBcIteV17NcIiwgXCLXqdezXCJdLFxuICBhYmJyZXZpYXRlZDogW1xuICAgIFwi15nXldedINeQ17NcIixcbiAgICBcIteZ15XXnSDXkdezXCIsXG4gICAgXCLXmdeV150g15LXs1wiLFxuICAgIFwi15nXldedINeT17NcIixcbiAgICBcIteZ15XXnSDXlNezXCIsXG4gICAgXCLXmdeV150g15XXs1wiLFxuICAgIFwi16nXkdeqXCIsXG4gIF0sXG5cbiAgd2lkZTogW1xuICAgIFwi15nXldedINeo15DXqdeV159cIixcbiAgICBcIteZ15XXnSDXqdeg15lcIixcbiAgICBcIteZ15XXnSDXqdec15nXqdeZXCIsXG4gICAgXCLXmdeV150g16jXkdeZ16LXmVwiLFxuICAgIFwi15nXldedINeX157Xmdep15lcIixcbiAgICBcIteZ15XXnSDXqdeZ16nXmVwiLFxuICAgIFwi15nXldedINep15HXqlwiLFxuICBdLFxufTtcblxuY29uc3QgZGF5UGVyaW9kVmFsdWVzID0ge1xuICBuYXJyb3c6IHtcbiAgICBhbTogXCLXnNek16DXlNe016ZcIixcbiAgICBwbTogXCLXkNeX15TXtNemXCIsXG4gICAgbWlkbmlnaHQ6IFwi15fXpteV16pcIixcbiAgICBub29uOiBcItem15TXqNeZ15nXnVwiLFxuICAgIG1vcm5pbmc6IFwi15HXlden16hcIixcbiAgICBhZnRlcm5vb246IFwi15DXl9eoINeU16bXlNeo15nXmdedXCIsXG4gICAgZXZlbmluZzogXCLXoteo15FcIixcbiAgICBuaWdodDogXCLXnNeZ15zXlFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcItec16TXoNeU17TXplwiLFxuICAgIHBtOiBcIteQ15fXlNe016ZcIixcbiAgICBtaWRuaWdodDogXCLXl9em15XXqlwiLFxuICAgIG5vb246IFwi16bXlNeo15nXmdedXCIsXG4gICAgbW9ybmluZzogXCLXkdeV16fXqFwiLFxuICAgIGFmdGVybm9vbjogXCLXkNeX16gg15TXpteU16jXmdeZ151cIixcbiAgICBldmVuaW5nOiBcItei16jXkVwiLFxuICAgIG5pZ2h0OiBcItec15nXnNeUXCIsXG4gIH0sXG4gIHdpZGU6IHtcbiAgICBhbTogXCLXnNek16DXlNe016ZcIixcbiAgICBwbTogXCLXkNeX15TXtNemXCIsXG4gICAgbWlkbmlnaHQ6IFwi15fXpteV16pcIixcbiAgICBub29uOiBcItem15TXqNeZ15nXnVwiLFxuICAgIG1vcm5pbmc6IFwi15HXlden16hcIixcbiAgICBhZnRlcm5vb246IFwi15DXl9eoINeU16bXlNeo15nXmdedXCIsXG4gICAgZXZlbmluZzogXCLXoteo15FcIixcbiAgICBuaWdodDogXCLXnNeZ15zXlFwiLFxuICB9LFxufTtcblxuY29uc3QgZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwi15zXpNeg15TXtNemXCIsXG4gICAgcG06IFwi15DXl9eU17TXplwiLFxuICAgIG1pZG5pZ2h0OiBcIteX16bXldeqXCIsXG4gICAgbm9vbjogXCLXpteU16jXmdeZ151cIixcbiAgICBtb3JuaW5nOiBcIteR15HXlden16hcIixcbiAgICBhZnRlcm5vb246IFwi15HXpteU16jXmdeZ151cIixcbiAgICBldmVuaW5nOiBcIteR16LXqNeRXCIsXG4gICAgbmlnaHQ6IFwi15HXnNeZ15zXlFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcItec16TXoNeU17TXplwiLFxuICAgIHBtOiBcIteQ15fXlNe016ZcIixcbiAgICBtaWRuaWdodDogXCLXl9em15XXqlwiLFxuICAgIG5vb246IFwi16bXlNeo15nXmdedXCIsXG4gICAgbW9ybmluZzogXCLXkdeR15XXp9eoXCIsXG4gICAgYWZ0ZXJub29uOiBcIteQ15fXqCDXlNem15TXqNeZ15nXnVwiLFxuICAgIGV2ZW5pbmc6IFwi15HXoteo15FcIixcbiAgICBuaWdodDogXCLXkdec15nXnNeUXCIsXG4gIH0sXG4gIHdpZGU6IHtcbiAgICBhbTogXCLXnNek16DXlNe016ZcIixcbiAgICBwbTogXCLXkNeX15TXtNemXCIsXG4gICAgbWlkbmlnaHQ6IFwi15fXpteV16pcIixcbiAgICBub29uOiBcItem15TXqNeZ15nXnVwiLFxuICAgIG1vcm5pbmc6IFwi15HXkdeV16fXqFwiLFxuICAgIGFmdGVybm9vbjogXCLXkNeX16gg15TXpteU16jXmdeZ151cIixcbiAgICBldmVuaW5nOiBcIteR16LXqNeRXCIsXG4gICAgbmlnaHQ6IFwi15HXnNeZ15zXlFwiLFxuICB9LFxufTtcblxuY29uc3Qgb3JkaW5hbE51bWJlciA9IChkaXJ0eU51bWJlciwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBudW1iZXIgPSBOdW1iZXIoZGlydHlOdW1iZXIpO1xuXG4gIC8vIFdlIG9ubHkgc2hvdyB3b3JkcyB0aWxsIDEwXG4gIGlmIChudW1iZXIgPD0gMCB8fCBudW1iZXIgPiAxMCkgcmV0dXJuIFN0cmluZyhudW1iZXIpO1xuXG4gIGNvbnN0IHVuaXQgPSBTdHJpbmcob3B0aW9ucz8udW5pdCk7XG5cbiAgY29uc3QgaXNGZW1hbGUgPSBbXCJ5ZWFyXCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiXS5pbmRleE9mKHVuaXQpID49IDA7XG5cbiAgY29uc3QgbWFsZSA9IFtcbiAgICBcIteo15DXqdeV159cIixcbiAgICBcItep16DXmVwiLFxuICAgIFwi16nXnNeZ16nXmVwiLFxuICAgIFwi16jXkdeZ16LXmVwiLFxuICAgIFwi15fXnteZ16nXmVwiLFxuICAgIFwi16nXmdep15lcIixcbiAgICBcItep15HXmdei15lcIixcbiAgICBcItep157Xmdeg15lcIixcbiAgICBcIteq16nXmdei15lcIixcbiAgICBcItei16nXmdeo15lcIixcbiAgXTtcblxuICBjb25zdCBmZW1hbGUgPSBbXG4gICAgXCLXqNeQ16nXldeg15RcIixcbiAgICBcItep16DXmdeZ15RcIixcbiAgICBcItep15zXmdep15nXqlwiLFxuICAgIFwi16jXkdeZ16LXmdeqXCIsXG4gICAgXCLXl9ee15nXqdeZ16pcIixcbiAgICBcItep15nXqdeZ16pcIixcbiAgICBcItep15HXmdei15nXqlwiLFxuICAgIFwi16nXnteZ16DXmdeqXCIsXG4gICAgXCLXqtep15nXoteZ16pcIixcbiAgICBcItei16nXmdeo15nXqlwiLFxuICBdO1xuXG4gIGNvbnN0IGluZGV4ID0gbnVtYmVyIC0gMTtcbiAgcmV0dXJuIGlzRmVtYWxlID8gZmVtYWxlW2luZGV4XSA6IG1hbGVbaW5kZXhdO1xufTtcblxuZXhwb3J0IGNvbnN0IGxvY2FsaXplID0ge1xuICBvcmRpbmFsTnVtYmVyLFxuXG4gIGVyYTogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGVyYVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBxdWFydGVyOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogcXVhcnRlclZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGFyZ3VtZW50Q2FsbGJhY2s6IChxdWFydGVyKSA9PiBxdWFydGVyIC0gMSxcbiAgfSksXG5cbiAgbW9udGg6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBtb250aFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBkYXk6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBkYXlWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5UGVyaW9kOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gICAgZm9ybWF0dGluZ1ZhbHVlczogZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0Rm9ybWF0dGluZ1dpZHRoOiBcIndpZGVcIixcbiAgfSksXG59O1xuIiwiaW1wb3J0IHsgYnVpbGRNYXRjaEZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRNYXRjaEZuLmpzXCI7XG5pbXBvcnQgeyBidWlsZE1hdGNoUGF0dGVybkZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi5qc1wiO1xuXG5jb25zdCBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuID1cbiAgL14oXFxkK3wo16jXkNep15XXn3zXqdeg15l816nXnNeZ16nXmXzXqNeR15nXoteZfNeX157Xmdep15l816nXmdep15l816nXkdeZ16LXmXzXqdee15nXoNeZfNeq16nXmdei15l816LXqdeZ16jXmXzXqNeQ16nXldeg15R816nXoNeZ15nXlHzXqdec15nXqdeZ16p816jXkdeZ16LXmdeqfNeX157Xmdep15nXqnzXqdeZ16nXmdeqfNep15HXmdei15nXqnzXqdee15nXoNeZ16p816rXqdeZ16LXmdeqfNei16nXmdeo15nXqikpL2k7XG5jb25zdCBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL14oXFxkK3zXqNeQfNep16B816nXnHzXqNeRfNeXfNep15l816nXkXzXqdeefNeqfNeiKS9pO1xuXG5jb25zdCBtYXRjaEVyYVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9e15wo16HXpNeZ16jXlHzXpNeg15TXtNehKS9pLFxuICBhYmJyZXZpYXRlZDogL17XnCjXodek15nXqNeUfNek16DXlNe016EpL2ksXG4gIHdpZGU6IC9e15wo16TXoNeZINeUKT/Xodek15nXqNeUL2ksXG59O1xuY29uc3QgcGFyc2VFcmFQYXR0ZXJucyA9IHtcbiAgYW55OiBbL17XnNekL2ksIC9e15zXoS9pXSxcbn07XG5cbmNvbnN0IG1hdGNoUXVhcnRlclBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eWzEyMzRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXnFbMTIzNF0vaSxcbiAgd2lkZTogL17XqNeR16LXldefIFsxMjM0XS9pLFxufTtcbmNvbnN0IHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXSxcbn07XG5cbmNvbnN0IG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlxcZCsvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKNeZ16DXlXzXpNeR16h8157XqNelfNeQ16TXqHzXnteQ15l815nXldeg15l815nXldec15l815DXldeSfNeh16TXmHzXkNeV16d816DXldeRfNeT16bXninXsz8vaSxcbiAgd2lkZTogL14o15nXoNeV15DXqHzXpNeR16jXldeQ16h8157XqNelfNeQ16TXqNeZ15x8157XkNeZfNeZ15XXoNeZfNeZ15XXnNeZfNeQ15XXkteV16HXmHzXodek15jXnteR16h815DXlden15jXldeR16h816DXldeR157XkdeofNeT16bXnteR16gpL2ksXG59O1xuY29uc3QgcGFyc2VNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFtcbiAgICAvXjEkL2ksXG4gICAgL14yL2ksXG4gICAgL14zL2ksXG4gICAgL140L2ksXG4gICAgL141L2ksXG4gICAgL142L2ksXG4gICAgL143L2ksXG4gICAgL144L2ksXG4gICAgL145L2ksXG4gICAgL14xMC9pLFxuICAgIC9eMTEvaSxcbiAgICAvXjEyL2ksXG4gIF0sXG5cbiAgYW55OiBbXG4gICAgL17XmdegL2ksXG4gICAgL17XpC9pLFxuICAgIC9e157XqC9pLFxuICAgIC9e15DXpC9pLFxuICAgIC9e157XkC9pLFxuICAgIC9e15nXldegL2ksXG4gICAgL17XmdeV15wvaSxcbiAgICAvXteQ15XXki9pLFxuICAgIC9e16EvaSxcbiAgICAvXteQ15XXpy9pLFxuICAgIC9e16AvaSxcbiAgICAvXteTL2ksXG4gIF0sXG59O1xuXG5jb25zdCBtYXRjaERheVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eW9eQ15HXkteT15TXldepXdezL2ksXG4gIHNob3J0OiAvXlvXkNeR15LXk9eU15XXqV3Xsy9pLFxuICBhYmJyZXZpYXRlZDogL14o16nXkdeqfNeZ15XXnSAo15B815F815J815N815R815Up17MpL2ksXG4gIHdpZGU6IC9e15nXldedICjXqNeQ16nXldeffNep16DXmXzXqdec15nXqdeZfNeo15HXmdei15l815fXnteZ16nXmXzXqdeZ16nXmXzXqdeR16opL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQYXR0ZXJucyA9IHtcbiAgYWJicmV2aWF0ZWQ6IFsv15DXsyQvaSwgL9eR17MkL2ksIC/XktezJC9pLCAv15PXsyQvaSwgL9eU17MkL2ksIC/XldezJC9pLCAvXtepL2ldLFxuICB3aWRlOiBbL9efJC9pLCAv16DXmSQvaSwgL9ec15nXqdeZJC9pLCAv16LXmSQvaSwgL9ee15nXqdeZJC9pLCAv16nXmdep15kkL2ksIC/XqiQvaV0sXG4gIGFueTogWy9e15AvaSwgL17XkS9pLCAvXteSL2ksIC9e15MvaSwgL17XlC9pLCAvXteVL2ksIC9e16kvaV0sXG59O1xuXG5jb25zdCBtYXRjaERheVBlcmlvZFBhdHRlcm5zID0ge1xuICBhbnk6IC9eKNeQ15fXqCDXlHzXkSk/KNeX16bXldeqfNem15TXqNeZ15nXnXzXkdeV16fXqHzXoteo15F815zXmdec15R815DXl9eU17TXpnzXnNek16DXlNe016YpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiB7XG4gICAgYW06IC9e15zXpC9pLFxuICAgIHBtOiAvXteQ15fXlC9pLFxuICAgIG1pZG5pZ2h0OiAvXteXL2ksXG4gICAgbm9vbjogL17Xpi9pLFxuICAgIG1vcm5pbmc6IC/XkdeV16fXqC9pLFxuICAgIGFmdGVybm9vbjogL9eR16Z815DXl9eoL2ksXG4gICAgZXZlbmluZzogL9ei16jXkS9pLFxuICAgIG5pZ2h0OiAv15zXmdec15QvaSxcbiAgfSxcbn07XG5cbmNvbnN0IG9yZGluYWxOYW1lID0gW1wi16jXkFwiLCBcItep16BcIiwgXCLXqdecXCIsIFwi16jXkVwiLCBcIteXXCIsIFwi16nXmVwiLCBcItep15FcIiwgXCLXqdeeXCIsIFwi16pcIiwgXCLXolwiXTtcblxuZXhwb3J0IGNvbnN0IG1hdGNoID0ge1xuICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHtcbiAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHZhbHVlQ2FsbGJhY2s6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgbnVtYmVyID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICAgIHJldHVybiBpc05hTihudW1iZXIpID8gb3JkaW5hbE5hbWUuaW5kZXhPZih2YWx1ZSkgKyAxIDogbnVtYmVyO1xuICAgIH0sXG4gIH0pLFxuXG4gIGVyYTogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaEVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZUVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBxdWFydGVyOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZVF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgICB2YWx1ZUNhbGxiYWNrOiAoaW5kZXgpID0+IGluZGV4ICsgMSxcbiAgfSksXG5cbiAgbW9udGg6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZU1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheTogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBkYXlQZXJpb2Q6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJhbnlcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcbn07XG4iLCJpbXBvcnQgeyBmb3JtYXREaXN0YW5jZSB9IGZyb20gXCIuL2hlL19saWIvZm9ybWF0RGlzdGFuY2UuanNcIjtcbmltcG9ydCB7IGZvcm1hdExvbmcgfSBmcm9tIFwiLi9oZS9fbGliL2Zvcm1hdExvbmcuanNcIjtcbmltcG9ydCB7IGZvcm1hdFJlbGF0aXZlIH0gZnJvbSBcIi4vaGUvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qc1wiO1xuaW1wb3J0IHsgbG9jYWxpemUgfSBmcm9tIFwiLi9oZS9fbGliL2xvY2FsaXplLmpzXCI7XG5pbXBvcnQgeyBtYXRjaCB9IGZyb20gXCIuL2hlL19saWIvbWF0Y2guanNcIjtcblxuLyoqXG4gKiBAY2F0ZWdvcnkgTG9jYWxlc1xuICogQHN1bW1hcnkgSGVicmV3IGxvY2FsZS5cbiAqIEBsYW5ndWFnZSBIZWJyZXdcbiAqIEBpc28tNjM5LTIgaGViXG4gKiBAYXV0aG9yIE5pciBMYWhhZCBbQG5pcmxhaF0oaHR0cHM6Ly9naXRodWIuY29tL25pcmxhaClcbiAqL1xuZXhwb3J0IGNvbnN0IGhlID0ge1xuICBjb2RlOiBcImhlXCIsXG4gIGZvcm1hdERpc3RhbmNlOiBmb3JtYXREaXN0YW5jZSxcbiAgZm9ybWF0TG9uZzogZm9ybWF0TG9uZyxcbiAgZm9ybWF0UmVsYXRpdmU6IGZvcm1hdFJlbGF0aXZlLFxuICBsb2NhbGl6ZTogbG9jYWxpemUsXG4gIG1hdGNoOiBtYXRjaCxcbiAgb3B0aW9uczoge1xuICAgIHdlZWtTdGFydHNPbjogMCAvKiBTdW5kYXkgKi8sXG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiAxLFxuICB9LFxufTtcblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBoZTtcbiIsImNvbnN0IGZvcm1hdERpc3RhbmNlTG9jYWxlID0ge1xuICBsZXNzVGhhblhTZWNvbmRzOiB7XG4gICAgb25lOiBcIuS4jeWIsCAxIOenklwiLFxuICAgIG90aGVyOiBcIuS4jeWIsCB7e2NvdW50fX0g56eSXCIsXG4gIH0sXG5cbiAgeFNlY29uZHM6IHtcbiAgICBvbmU6IFwiMSDnp5JcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0g56eSXCIsXG4gIH0sXG5cbiAgaGFsZkFNaW51dGU6IFwi5Y2K5YiG6ZKfXCIsXG5cbiAgbGVzc1RoYW5YTWludXRlczoge1xuICAgIG9uZTogXCLkuI3liLAgMSDliIbpkp9cIixcbiAgICBvdGhlcjogXCLkuI3liLAge3tjb3VudH19IOWIhumSn1wiLFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgb25lOiBcIjEg5YiG6ZKfXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IOWIhumSn1wiLFxuICB9LFxuXG4gIHhIb3Vyczoge1xuICAgIG9uZTogXCIxIOWwj+aXtlwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSDlsI/ml7ZcIixcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIG9uZTogXCLlpKfnuqYgMSDlsI/ml7ZcIixcbiAgICBvdGhlcjogXCLlpKfnuqYge3tjb3VudH19IOWwj+aXtlwiLFxuICB9LFxuXG4gIHhEYXlzOiB7XG4gICAgb25lOiBcIjEg5aSpXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IOWkqVwiLFxuICB9LFxuXG4gIGFib3V0WFdlZWtzOiB7XG4gICAgb25lOiBcIuWkp+e6piAxIOS4quaYn+acn1wiLFxuICAgIG90aGVyOiBcIuWkp+e6piB7e2NvdW50fX0g5Liq5pif5pyfXCIsXG4gIH0sXG5cbiAgeFdlZWtzOiB7XG4gICAgb25lOiBcIjEg5Liq5pif5pyfXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IOS4quaYn+acn1wiLFxuICB9LFxuXG4gIGFib3V0WE1vbnRoczoge1xuICAgIG9uZTogXCLlpKfnuqYgMSDkuKrmnIhcIixcbiAgICBvdGhlcjogXCLlpKfnuqYge3tjb3VudH19IOS4quaciFwiLFxuICB9LFxuXG4gIHhNb250aHM6IHtcbiAgICBvbmU6IFwiMSDkuKrmnIhcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0g5Liq5pyIXCIsXG4gIH0sXG5cbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6IFwi5aSn57qmIDEg5bm0XCIsXG4gICAgb3RoZXI6IFwi5aSn57qmIHt7Y291bnR9fSDlubRcIixcbiAgfSxcblxuICB4WWVhcnM6IHtcbiAgICBvbmU6IFwiMSDlubRcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0g5bm0XCIsXG4gIH0sXG5cbiAgb3ZlclhZZWFyczoge1xuICAgIG9uZTogXCLotoXov4cgMSDlubRcIixcbiAgICBvdGhlcjogXCLotoXov4cge3tjb3VudH19IOW5tFwiLFxuICB9LFxuXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogXCLlsIbov5EgMSDlubRcIixcbiAgICBvdGhlcjogXCLlsIbov5Ege3tjb3VudH19IOW5tFwiLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdERpc3RhbmNlID0gKHRva2VuLCBjb3VudCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzdWx0O1xuXG4gIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoXCJ7e2NvdW50fX1cIiwgU3RyaW5nKGNvdW50KSk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgXCLlhoVcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIFwi5YmNXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJpbXBvcnQgeyBidWlsZEZvcm1hdExvbmdGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzXCI7XG5cbmNvbnN0IGRhdGVGb3JtYXRzID0ge1xuICBmdWxsOiBcInkn5bm0J00n5pyIJ2Qn5pelJyBFRUVFXCIsXG4gIGxvbmc6IFwieSflubQnTSfmnIgnZCfml6UnXCIsXG4gIG1lZGl1bTogXCJ5eXl5LU1NLWRkXCIsXG4gIHNob3J0OiBcInl5LU1NLWRkXCIsXG59O1xuXG5jb25zdCB0aW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJ6enp6IGEgaDptbTpzc1wiLFxuICBsb25nOiBcInogYSBoOm1tOnNzXCIsXG4gIG1lZGl1bTogXCJhIGg6bW06c3NcIixcbiAgc2hvcnQ6IFwiYSBoOm1tXCIsXG59O1xuXG5jb25zdCBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0ge3t0aW1lfX1cIixcbiAgbG9uZzogXCJ7e2RhdGV9fSB7e3RpbWV9fVwiLFxuICBtZWRpdW06IFwie3tkYXRlfX0ge3t0aW1lfX1cIixcbiAgc2hvcnQ6IFwie3tkYXRlfX0ge3t0aW1lfX1cIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRMb25nID0ge1xuICBkYXRlOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgdGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxuXG4gIGRhdGVUaW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZVRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxufTtcbiIsImltcG9ydCB7IGlzU2FtZVdlZWsgfSBmcm9tIFwiLi4vLi4vLi4vaXNTYW1lV2Vlay5qc1wiO1xuXG5mdW5jdGlvbiBjaGVja1dlZWsoZGF0ZSwgYmFzZURhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgYmFzZUZvcm1hdCA9IFwiZWVlZSBwXCI7XG5cbiAgaWYgKGlzU2FtZVdlZWsoZGF0ZSwgYmFzZURhdGUsIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIGJhc2VGb3JtYXQ7IC8vIGluIHNhbWUgd2Vla1xuICB9IGVsc2UgaWYgKGRhdGUuZ2V0VGltZSgpID4gYmFzZURhdGUuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIFwiJ+S4i+S4qidcIiArIGJhc2VGb3JtYXQ7IC8vIGluIG5leHQgd2Vla1xuICB9XG4gIHJldHVybiBcIifkuIrkuKonXCIgKyBiYXNlRm9ybWF0OyAvLyBpbiBsYXN0IHdlZWtcbn1cblxuY29uc3QgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBjaGVja1dlZWssIC8vIGRheXMgYmVmb3JlIHllc3RlcmRheSwgbWF5YmUgaW4gdGhpcyB3ZWVrIG9yIGxhc3Qgd2Vla1xuICB5ZXN0ZXJkYXk6IFwiJ+aYqOWkqScgcFwiLFxuICB0b2RheTogXCIn5LuK5aSpJyBwXCIsXG4gIHRvbW9ycm93OiBcIifmmI7lpKknIHBcIixcbiAgbmV4dFdlZWs6IGNoZWNrV2VlaywgLy8gZGF5cyBhZnRlciB0b21vcnJvdywgbWF5YmUgaW4gdGhpcyB3ZWVrIG9yIG5leHQgd2Vla1xuICBvdGhlcjogXCJQUCBwXCIsXG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0UmVsYXRpdmUgPSAodG9rZW4sIGRhdGUsIGJhc2VEYXRlLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IGZvcm1hdCA9IGZvcm1hdFJlbGF0aXZlTG9jYWxlW3Rva2VuXTtcblxuICBpZiAodHlwZW9mIGZvcm1hdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGZvcm1hdChkYXRlLCBiYXNlRGF0ZSwgb3B0aW9ucyk7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0O1xufTtcbiIsImltcG9ydCB7IGJ1aWxkTG9jYWxpemVGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTG9jYWxpemVGbi5qc1wiO1xuXG5jb25zdCBlcmFWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wi5YmNXCIsIFwi5YWs5YWDXCJdLFxuICBhYmJyZXZpYXRlZDogW1wi5YmNXCIsIFwi5YWs5YWDXCJdLFxuICB3aWRlOiBbXCLlhazlhYPliY1cIiwgXCLlhazlhYNcIl0sXG59O1xuXG5jb25zdCBxdWFydGVyVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCLnrKzkuIDlraNcIiwgXCLnrKzkuozlraNcIiwgXCLnrKzkuInlraNcIiwgXCLnrKzlm5vlraNcIl0sXG4gIHdpZGU6IFtcIuesrOS4gOWto+W6plwiLCBcIuesrOS6jOWto+W6plwiLCBcIuesrOS4ieWto+W6plwiLCBcIuesrOWbm+Wto+W6plwiXSxcbn07XG5cbmNvbnN0IG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcbiAgICBcIuS4gFwiLFxuICAgIFwi5LqMXCIsXG4gICAgXCLkuIlcIixcbiAgICBcIuWbm1wiLFxuICAgIFwi5LqUXCIsXG4gICAgXCLlha1cIixcbiAgICBcIuS4g1wiLFxuICAgIFwi5YWrXCIsXG4gICAgXCLkuZ1cIixcbiAgICBcIuWNgVwiLFxuICAgIFwi5Y2B5LiAXCIsXG4gICAgXCLljYHkuoxcIixcbiAgXSxcblxuICBhYmJyZXZpYXRlZDogW1xuICAgIFwiMeaciFwiLFxuICAgIFwiMuaciFwiLFxuICAgIFwiM+aciFwiLFxuICAgIFwiNOaciFwiLFxuICAgIFwiNeaciFwiLFxuICAgIFwiNuaciFwiLFxuICAgIFwiN+aciFwiLFxuICAgIFwiOOaciFwiLFxuICAgIFwiOeaciFwiLFxuICAgIFwiMTDmnIhcIixcbiAgICBcIjEx5pyIXCIsXG4gICAgXCIxMuaciFwiLFxuICBdLFxuXG4gIHdpZGU6IFtcbiAgICBcIuS4gOaciFwiLFxuICAgIFwi5LqM5pyIXCIsXG4gICAgXCLkuInmnIhcIixcbiAgICBcIuWbm+aciFwiLFxuICAgIFwi5LqU5pyIXCIsXG4gICAgXCLlha3mnIhcIixcbiAgICBcIuS4g+aciFwiLFxuICAgIFwi5YWr5pyIXCIsXG4gICAgXCLkuZ3mnIhcIixcbiAgICBcIuWNgeaciFwiLFxuICAgIFwi5Y2B5LiA5pyIXCIsXG4gICAgXCLljYHkuozmnIhcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCLml6VcIiwgXCLkuIBcIiwgXCLkuoxcIiwgXCLkuIlcIiwgXCLlm5tcIiwgXCLkupRcIiwgXCLlha1cIl0sXG4gIHNob3J0OiBbXCLml6VcIiwgXCLkuIBcIiwgXCLkuoxcIiwgXCLkuIlcIiwgXCLlm5tcIiwgXCLkupRcIiwgXCLlha1cIl0sXG4gIGFiYnJldmlhdGVkOiBbXCLlkajml6VcIiwgXCLlkajkuIBcIiwgXCLlkajkuoxcIiwgXCLlkajkuIlcIiwgXCLlkajlm5tcIiwgXCLlkajkupRcIiwgXCLlkajlha1cIl0sXG5cbiAgd2lkZTogW1wi5pif5pyf5pelXCIsIFwi5pif5pyf5LiAXCIsIFwi5pif5pyf5LqMXCIsIFwi5pif5pyf5LiJXCIsIFwi5pif5pyf5ZubXCIsIFwi5pif5pyf5LqUXCIsIFwi5pif5pyf5YWtXCJdLFxufTtcblxuY29uc3QgZGF5UGVyaW9kVmFsdWVzID0ge1xuICBuYXJyb3c6IHtcbiAgICBhbTogXCLkuIpcIixcbiAgICBwbTogXCLkuItcIixcbiAgICBtaWRuaWdodDogXCLlh4zmmahcIixcbiAgICBub29uOiBcIuWNiFwiLFxuICAgIG1vcm5pbmc6IFwi5pepXCIsXG4gICAgYWZ0ZXJub29uOiBcIuS4i+WNiFwiLFxuICAgIGV2ZW5pbmc6IFwi5pmaXCIsXG4gICAgbmlnaHQ6IFwi5aScXCIsXG4gIH0sXG4gIGFiYnJldmlhdGVkOiB7XG4gICAgYW06IFwi5LiK5Y2IXCIsXG4gICAgcG06IFwi5LiL5Y2IXCIsXG4gICAgbWlkbmlnaHQ6IFwi5YeM5pmoXCIsXG4gICAgbm9vbjogXCLkuK3ljYhcIixcbiAgICBtb3JuaW5nOiBcIuaXqeaZqFwiLFxuICAgIGFmdGVybm9vbjogXCLkuK3ljYhcIixcbiAgICBldmVuaW5nOiBcIuaZmuS4ilwiLFxuICAgIG5pZ2h0OiBcIuWknOmXtFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwi5LiK5Y2IXCIsXG4gICAgcG06IFwi5LiL5Y2IXCIsXG4gICAgbWlkbmlnaHQ6IFwi5YeM5pmoXCIsXG4gICAgbm9vbjogXCLkuK3ljYhcIixcbiAgICBtb3JuaW5nOiBcIuaXqeaZqFwiLFxuICAgIGFmdGVybm9vbjogXCLkuK3ljYhcIixcbiAgICBldmVuaW5nOiBcIuaZmuS4ilwiLFxuICAgIG5pZ2h0OiBcIuWknOmXtFwiLFxuICB9LFxufTtcblxuY29uc3QgZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwi5LiKXCIsXG4gICAgcG06IFwi5LiLXCIsXG4gICAgbWlkbmlnaHQ6IFwi5YeM5pmoXCIsXG4gICAgbm9vbjogXCLljYhcIixcbiAgICBtb3JuaW5nOiBcIuaXqVwiLFxuICAgIGFmdGVybm9vbjogXCLkuIvljYhcIixcbiAgICBldmVuaW5nOiBcIuaZmlwiLFxuICAgIG5pZ2h0OiBcIuWknFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcIuS4iuWNiFwiLFxuICAgIHBtOiBcIuS4i+WNiFwiLFxuICAgIG1pZG5pZ2h0OiBcIuWHjOaZqFwiLFxuICAgIG5vb246IFwi5Lit5Y2IXCIsXG4gICAgbW9ybmluZzogXCLml6nmmahcIixcbiAgICBhZnRlcm5vb246IFwi5Lit5Y2IXCIsXG4gICAgZXZlbmluZzogXCLmmZrkuIpcIixcbiAgICBuaWdodDogXCLlpJzpl7RcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcIuS4iuWNiFwiLFxuICAgIHBtOiBcIuS4i+WNiFwiLFxuICAgIG1pZG5pZ2h0OiBcIuWHjOaZqFwiLFxuICAgIG5vb246IFwi5Lit5Y2IXCIsXG4gICAgbW9ybmluZzogXCLml6nmmahcIixcbiAgICBhZnRlcm5vb246IFwi5Lit5Y2IXCIsXG4gICAgZXZlbmluZzogXCLmmZrkuIpcIixcbiAgICBuaWdodDogXCLlpJzpl7RcIixcbiAgfSxcbn07XG5cbmNvbnN0IG9yZGluYWxOdW1iZXIgPSAoZGlydHlOdW1iZXIsIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgbnVtYmVyID0gTnVtYmVyKGRpcnR5TnVtYmVyKTtcblxuICBzd2l0Y2ggKG9wdGlvbnM/LnVuaXQpIHtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIG51bWJlci50b1N0cmluZygpICsgXCLml6VcIjtcbiAgICBjYXNlIFwiaG91clwiOlxuICAgICAgcmV0dXJuIG51bWJlci50b1N0cmluZygpICsgXCLml7ZcIjtcbiAgICBjYXNlIFwibWludXRlXCI6XG4gICAgICByZXR1cm4gbnVtYmVyLnRvU3RyaW5nKCkgKyBcIuWIhlwiO1xuICAgIGNhc2UgXCJzZWNvbmRcIjpcbiAgICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoKSArIFwi56eSXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcIuesrCBcIiArIG51bWJlci50b1N0cmluZygpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgbG9jYWxpemUgPSB7XG4gIG9yZGluYWxOdW1iZXIsXG5cbiAgZXJhOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZXJhVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBxdWFydGVyVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gICAgYXJndW1lbnRDYWxsYmFjazogKHF1YXJ0ZXIpID0+IHF1YXJ0ZXIgLSAxLFxuICB9KSxcblxuICBtb250aDogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IG1vbnRoVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheTogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBkYXlQZXJpb2Q6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBkYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBmb3JtYXR0aW5nVmFsdWVzOiBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRGb3JtYXR0aW5nV2lkdGg6IFwid2lkZVwiLFxuICB9KSxcbn07XG4iLCJpbXBvcnQgeyBidWlsZE1hdGNoRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZE1hdGNoRm4uanNcIjtcbmltcG9ydCB7IGJ1aWxkTWF0Y2hQYXR0ZXJuRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZE1hdGNoUGF0dGVybkZuLmpzXCI7XG5cbmNvbnN0IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXijnrKxcXHMqKT9cXGQrKOaXpXzml7Z85YiGfOenkik/L2k7XG5jb25zdCBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL1xcZCsvaTtcblxuY29uc3QgbWF0Y2hFcmFQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXijliY0pL2ksXG4gIGFiYnJldmlhdGVkOiAvXijliY0pL2ksXG4gIHdpZGU6IC9eKOWFrOWFg+WJjXzlhazlhYMpL2ksXG59O1xuY29uc3QgcGFyc2VFcmFQYXR0ZXJucyA9IHtcbiAgYW55OiBbL14o5YmNKS9pLCAvXijlhazlhYMpL2ldLFxufTtcblxuY29uc3QgbWF0Y2hRdWFydGVyUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bMTIzNF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9e56ysW+S4gOS6jOS4ieWbm13liLsvaSxcbiAgd2lkZTogL17nrKxb5LiA5LqM5LiJ5ZubXeWIu+mSny9pLFxufTtcbmNvbnN0IHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvKDF85LiAKS9pLCAvKDJ85LqMKS9pLCAvKDN85LiJKS9pLCAvKDR85ZubKS9pXSxcbn07XG5cbmNvbnN0IG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXijkuIB85LqMfOS4iXzlm5t85LqUfOWFrXzkuIN85YWrfOS5nXzljYFb5LqM5LiAXSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKOS4gHzkuox85LiJfOWbm3zkupR85YWtfOS4g3zlhat85LmdfOWNgVvkuozkuIBdfFxcZHwxWzEyXSnmnIgvaSxcbiAgd2lkZTogL14o5LiAfOS6jHzkuIl85ZubfOS6lHzlha185LiDfOWFq3zkuZ185Y2BW+S6jOS4gF0p5pyIL2ksXG59O1xuY29uc3QgcGFyc2VNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFtcbiAgICAvXuS4gC9pLFxuICAgIC9e5LqML2ksXG4gICAgL17kuIkvaSxcbiAgICAvXuWbmy9pLFxuICAgIC9e5LqUL2ksXG4gICAgL17lha0vaSxcbiAgICAvXuS4gy9pLFxuICAgIC9e5YWrL2ksXG4gICAgL17kuZ0vaSxcbiAgICAvXuWNgSg/ISjkuIB85LqMKSkvaSxcbiAgICAvXuWNgeS4gC9pLFxuICAgIC9e5Y2B5LqML2ksXG4gIF0sXG5cbiAgYW55OiBbXG4gICAgL17kuIB8MS9pLFxuICAgIC9e5LqMfDIvaSxcbiAgICAvXuS4iXwzL2ksXG4gICAgL17lm5t8NC9pLFxuICAgIC9e5LqUfDUvaSxcbiAgICAvXuWFrXw2L2ksXG4gICAgL17kuIN8Ny9pLFxuICAgIC9e5YWrfDgvaSxcbiAgICAvXuS5nXw5L2ksXG4gICAgL17ljYEoPyEo5LiAfOS6jCkpfDEwL2ksXG4gICAgL17ljYHkuIB8MTEvaSxcbiAgICAvXuWNgeS6jHwxMi9pLFxuICBdLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlvkuIDkuozkuInlm5vkupTlha3ml6VdL2ksXG4gIHNob3J0OiAvXlvkuIDkuozkuInlm5vkupTlha3ml6VdL2ksXG4gIGFiYnJldmlhdGVkOiAvXuWRqFvkuIDkuozkuInlm5vkupTlha3ml6VdL2ksXG4gIHdpZGU6IC9e5pif5pyfW+S4gOS6jOS4ieWbm+S6lOWFreaXpV0vaSxcbn07XG5jb25zdCBwYXJzZURheVBhdHRlcm5zID0ge1xuICBhbnk6IFsv5pelL2ksIC/kuIAvaSwgL+S6jC9pLCAv5LiJL2ksIC/lm5svaSwgL+S6lC9pLCAv5YWtL2ldLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiAvXijkuIrljYg/fOS4i+WNiD985Y2I5aScfFvkuK3mraNd5Y2IfOaXqeS4ij985LiL5Y2IfOaZmuS4ij985YeM5pmofCkvaSxcbn07XG5jb25zdCBwYXJzZURheVBlcmlvZFBhdHRlcm5zID0ge1xuICBhbnk6IHtcbiAgICBhbTogL17kuIrljYg/L2ksXG4gICAgcG06IC9e5LiL5Y2IPy9pLFxuICAgIG1pZG5pZ2h0OiAvXuWNiOWknC9pLFxuICAgIG5vb246IC9eW+S4reato13ljYgvaSxcbiAgICBtb3JuaW5nOiAvXuaXqeS4ii9pLFxuICAgIGFmdGVybm9vbjogL17kuIvljYgvaSxcbiAgICBldmVuaW5nOiAvXuaZmuS4ij8vaSxcbiAgICBuaWdodDogL17lh4zmmagvaSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBtYXRjaCA9IHtcbiAgb3JkaW5hbE51bWJlcjogYnVpbGRNYXRjaFBhdHRlcm5Gbih7XG4gICAgbWF0Y2hQYXR0ZXJuOiBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHBhcnNlUGF0dGVybjogcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICB2YWx1ZUNhbGxiYWNrOiAodmFsdWUpID0+IHBhcnNlSW50KHZhbHVlLCAxMCksXG4gIH0pLFxuXG4gIGVyYTogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaEVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZUVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBxdWFydGVyOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZVF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgICB2YWx1ZUNhbGxiYWNrOiAoaW5kZXgpID0+IGluZGV4ICsgMSxcbiAgfSksXG5cbiAgbW9udGg6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZU1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheTogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBkYXlQZXJpb2Q6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJhbnlcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcbn07XG4iLCJpbXBvcnQgeyBmb3JtYXREaXN0YW5jZSB9IGZyb20gXCIuL3poLUNOL19saWIvZm9ybWF0RGlzdGFuY2UuanNcIjtcbmltcG9ydCB7IGZvcm1hdExvbmcgfSBmcm9tIFwiLi96aC1DTi9fbGliL2Zvcm1hdExvbmcuanNcIjtcbmltcG9ydCB7IGZvcm1hdFJlbGF0aXZlIH0gZnJvbSBcIi4vemgtQ04vX2xpYi9mb3JtYXRSZWxhdGl2ZS5qc1wiO1xuaW1wb3J0IHsgbG9jYWxpemUgfSBmcm9tIFwiLi96aC1DTi9fbGliL2xvY2FsaXplLmpzXCI7XG5pbXBvcnQgeyBtYXRjaCB9IGZyb20gXCIuL3poLUNOL19saWIvbWF0Y2guanNcIjtcblxuLyoqXG4gKiBAY2F0ZWdvcnkgTG9jYWxlc1xuICogQHN1bW1hcnkgQ2hpbmVzZSBTaW1wbGlmaWVkIGxvY2FsZS5cbiAqIEBsYW5ndWFnZSBDaGluZXNlIFNpbXBsaWZpZWRcbiAqIEBpc28tNjM5LTIgemhvXG4gKiBAYXV0aG9yIENoYW5neXUgR2VuZyBbQEtpbmdNYXJpb10oaHR0cHM6Ly9naXRodWIuY29tL0tpbmdNYXJpbylcbiAqIEBhdXRob3IgU29uZyBTaHVveXVuIFtAZm5sY3RybF0oaHR0cHM6Ly9naXRodWIuY29tL2ZubGN0cmwpXG4gKiBAYXV0aG9yIHNhYnJpbmFNIFtAc2FicmluYW1pYW9dKGh0dHBzOi8vZ2l0aHViLmNvbS9zYWJyaW5hbWlhbylcbiAqIEBhdXRob3IgQ2FybmV5IFd1IFtAY3ViaWN3b3JrXShodHRwczovL2dpdGh1Yi5jb20vY3ViaWN3b3JrKVxuICogQGF1dGhvciBUZXJyZW5jZSBMYW0gW0Bza3l1cGxhbV0oaHR0cHM6Ly9naXRodWIuY29tL3NreXVwbGFtKVxuICovXG5leHBvcnQgY29uc3QgemhDTiA9IHtcbiAgY29kZTogXCJ6aC1DTlwiLFxuICBmb3JtYXREaXN0YW5jZTogZm9ybWF0RGlzdGFuY2UsXG4gIGZvcm1hdExvbmc6IGZvcm1hdExvbmcsXG4gIGZvcm1hdFJlbGF0aXZlOiBmb3JtYXRSZWxhdGl2ZSxcbiAgbG9jYWxpemU6IGxvY2FsaXplLFxuICBtYXRjaDogbWF0Y2gsXG4gIG9wdGlvbnM6IHtcbiAgICB3ZWVrU3RhcnRzT246IDEgLyogTW9uZGF5ICovLFxuICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNCxcbiAgfSxcbn07XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgemhDTjtcbiIsImltcG9ydCB0eXBlIHsgS0dTYXZlRGF0YSB9IGZyb20gXCIuLi90eXBlcy9fc2F2ZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBHYW1lUGFnZSB9IGZyb20gXCIuLi90eXBlcy9nYW1lLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBTYXZlZ2FtZUxvYWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2dhbWU6IEdhbWVQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKGdhbWU6IEdhbWVQYWdlKSB7XG4gICAgdGhpcy5fZ2FtZSA9IGdhbWU7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVudGx5IHdyYXBzIHRoZSBzYXZlZ2FtZSBsb2FkaW5nIHByb2Nlc3MgaW4gYW4gYXN5bmMgY29uc3RydWN0LlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgc2F2ZWdhbWUgZGF0YSB0byBsb2FkLiBXZSBhY2NlcHQgYG51bGxgIGhlcmUgZm9yIGNvbnZlbmllbmNlXG4gICAqIHdoZW4gZGVhbGluZyB3aXRoIGBpbXBvcnRgZWQgc2F2ZSBnYW1lIGRhdGEuXG4gICAqIEByZXR1cm5zIE5vdGhpbmdcbiAgICovXG4gIGxvYWQoZGF0YTogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZ2FtZS5zYXZlSW1wb3J0RHJvcGJveFRleHQoZGF0YSwgZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbG9hZFJhdyhkYXRhOiBLR1NhdmVEYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29tcHJlc3NlZCA9IHRoaXMuX2dhbWUuY29tcHJlc3NMWkRhdGEoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgIHJldHVybiB0aGlzLmxvYWQoY29tcHJlc3NlZCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQnV0dG9uIH0gZnJvbSBcIi4vQnV0dG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEljb25CdXR0b24gfSBmcm9tIFwiLi9JY29uQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBMaXN0SXRlbSwgdHlwZSBMaXN0SXRlbU9wdGlvbnMgfSBmcm9tIFwiLi9MaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9Ub29sYmFyTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFRvb2xiYXJMaXN0SXRlbU9wdGlvbnMgPSBUaGlzVHlwZTxUb29sYmFyTGlzdEl0ZW0+ICYgTGlzdEl0ZW1PcHRpb25zO1xuXG5leHBvcnQgY2xhc3MgVG9vbGJhckxpc3RJdGVtIGV4dGVuZHMgTGlzdEl0ZW0ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IFRvb2xiYXJMaXN0SXRlbU9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgb3B0aW9ucz86IFRvb2xiYXJMaXN0SXRlbU9wdGlvbnMpIHtcbiAgICBzdXBlcihwYXJlbnQsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlcy50b29sYmFyKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtUb29sYmFyTGlzdEl0ZW0ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWRkQ2hpbGQoY2hpbGQ6IEJ1dHRvbiB8IEljb25CdXR0b24pOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXIuYWRkQ2hpbGQoY2hpbGQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvY29uc29sZS5qc1wiO1xuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2Vycm9ycy9JbnZhbGlkQXJndW1lbnRFcnJvci5qc1wiO1xuaW1wb3J0IHsgZm9ybWF0RGlzdGFuY2VUb05vdyB9IGZyb20gXCJkYXRlLWZucy9mb3JtYXREaXN0YW5jZVRvTm93XCI7XG5pbXBvcnQgeyBkZSwgZW5VUywgaGUsIHR5cGUgTG9jYWxlLCB6aENOIH0gZnJvbSBcImRhdGUtZm5zL2xvY2FsZVwiO1xuaW1wb3J0IHsgRW5naW5lLCB0eXBlIEVuZ2luZVN0YXRlLCB0eXBlIFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIi4uL2ltYWdlcy9JY29ucy5qc1wiO1xuaW1wb3J0IHsgS2l0dGVuU2NpZW50aXN0cyB9IGZyb20gXCIuLi9LaXR0ZW5TY2llbnRpc3RzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU3RhdGVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVW5pcXVlIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHsgU2F2ZWdhbWVMb2FkZXIgfSBmcm9tIFwiLi4vdG9vbHMvU2F2ZWdhbWVMb2FkZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgS0dTYXZlRGF0YSB9IGZyb20gXCIuLi90eXBlcy9fc2F2ZS5qc1wiO1xuaW1wb3J0IHsgVXNlclNjcmlwdExvYWRlciB9IGZyb20gXCIuLi9Vc2VyU2NyaXB0TG9hZGVyLmpzXCI7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5qc1wiO1xuaW1wb3J0IHsgQnV0dG9uTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbkxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgRGVsaW1pdGVyIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EZWxpbWl0ZXIuanNcIjtcbmltcG9ydCB7IEhlYWRlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9IZWFkZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgSWNvbkJ1dHRvbiB9IGZyb20gXCIuL2NvbXBvbmVudHMvSWNvbkJ1dHRvbi5qc1wiO1xuaW1wb3J0IHsgTGFiZWxMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvTGFiZWxMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IExpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9MaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNTZXR0aW5nTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFRleHRCdXR0b24gfSBmcm9tIFwiLi9jb21wb25lbnRzL1RleHRCdXR0b24uanNcIjtcbmltcG9ydCB7IFRvb2xiYXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvVG9vbGJhckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBTdG9yZWRHYW1lID0ge1xuICBsYWJlbDogc3RyaW5nO1xuICBnYW1lOiBLR1NhdmVEYXRhO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBTdG9yZWRTdGF0ZSA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgc3RhdGU6IEVuZ2luZVN0YXRlO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBTdGF0ZU1hbmFnZW1lbnRVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8U3RhdGVTZXR0aW5ncz4ge1xuICByZWFkb25seSBnYW1lcyA9IG5ldyBBcnJheTxVbmlxdWU8U3RvcmVkR2FtZT4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0ZXMgcGVyc2lzdGVkIHRvIGxvY2FsIHN0b3JhZ2UuIFRoZXkgdXNlIFVuaXF1ZTxUPiBzbyB0aGF0IHdoZW4gd2VcbiAgICogcHJvdmlkZSBhIHN0YXRlIHRvIHRoZSBlbmdpbmUgdG8gbG9hZCBvciBnZXQgYSBzdGF0ZSBmcm9tIHRoZSBlbmdpbmUgdG9cbiAgICogc2F2ZSwgd2UgYXJlIG5vdCBhY2NpZGVudGFsbHkgc2hhcmluZyBhIHJlZmVyZW5jZSB0byBhIGxpdmUgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGVzID0gbmV3IEFycmF5PFVuaXF1ZTxTdG9yZWRTdGF0ZT4+KCk7XG5cbiAgcmVhZG9ubHkgZ2FtZUxpc3Q6IFNldHRpbmdzTGlzdDtcbiAgcmVhZG9ubHkgc3RhdGVMaXN0OiBTZXR0aW5nc0xpc3Q7XG4gIHJlYWRvbmx5IGxvY2FsZTogTG9jYWxlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IFN0YXRlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtTdGF0ZU1hbmFnZW1lbnRVaS5uYW1lfWApKTtcblxuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS50aXRsZVwiKTtcbiAgICBzdXBlcihcbiAgICAgIHBhcmVudCxcbiAgICAgIHNldHRpbmdzLFxuICAgICAgbmV3IExhYmVsTGlzdEl0ZW0ocGFyZW50LCBsYWJlbCwge1xuICAgICAgICBjbGFzc2VzOiBbc3R5bGVzU2V0dGluZ0xpc3RJdGVtLmNoZWNrZWQsIHN0eWxlc1NldHRpbmdMaXN0SXRlbS5zZXR0aW5nXSxcbiAgICAgICAgaWNvbjogSWNvbnMuU3RhdGUsXG4gICAgICB9KS5hZGRDaGlsZHJlbkhlYWQoW1xuICAgICAgICBuZXcgQ29udGFpbmVyKHBhcmVudCwge1xuICAgICAgICAgIGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0sXG4gICAgICAgIH0pLFxuICAgICAgXSksXG4gICAgICB7XG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3JlZnJlc2hHYW1lTGlzdCgpO1xuICAgICAgICAgIHRoaXMuX3JlZnJlc2hTdGF0ZUxpc3QoKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMuZ2FtZUxpc3QgPSBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgIGhhc0Rpc2FibGVBbGw6IGZhbHNlLFxuICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLnN0YXRlTGlzdCA9IG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgaGFzRGlzYWJsZUFsbDogZmFsc2UsXG4gICAgICBoYXNFbmFibGVBbGw6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2NhbGUgPVxuICAgICAgbG9jYWxlLnNlbGVjdGVkID09PSBcInpoLUNOXCJcbiAgICAgICAgPyB6aENOXG4gICAgICAgIDogbG9jYWxlLnNlbGVjdGVkID09PSBcImhlLUlMXCJcbiAgICAgICAgICA/IGhlXG4gICAgICAgICAgOiBsb2NhbGUuc2VsZWN0ZWQgPT09IFwiZGUtREVcIlxuICAgICAgICAgICAgPyBkZVxuICAgICAgICAgICAgOiBlblVTO1xuXG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQoXG4gICAgICBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgICAgaGFzRGlzYWJsZUFsbDogZmFsc2UsXG4gICAgICAgIGhhc0VuYWJsZUFsbDogZmFsc2UsXG4gICAgICB9KS5hZGRDaGlsZHJlbihbXG4gICAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0odGhpcywgdGhpcy5zZXR0aW5nLm5vQ29uZmlybSwgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUubm9Db25maXJtXCIpKSxcbiAgICAgICAgbmV3IExpc3RJdGVtKHRoaXMpLmFkZENoaWxkKG5ldyBEZWxpbWl0ZXIodGhpcykpLFxuXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5sb2NhbFwiKSksXG4gICAgICAgIG5ldyBUb29sYmFyTGlzdEl0ZW0odGhpcykuYWRkQ2hpbGRyZW4oW1xuICAgICAgICAgIG5ldyBCdXR0b24odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuaW1wb3J0XCIpLCBJY29ucy5JbXBvcnQsIHtcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5pbXBvcnQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuaW1wb3J0VGl0bGVcIiksXG4gICAgICAgICAgfSksXG4gICAgICAgIF0pLFxuICAgICAgICBuZXcgTGlzdEl0ZW0odGhpcykuYWRkQ2hpbGQobmV3IERlbGltaXRlcih0aGlzKSksXG5cbiAgICAgICAgbmV3IEhlYWRlckxpc3RJdGVtKHRoaXMsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLmxvY2FsU3RhdGVzXCIpKSxcbiAgICAgICAgbmV3IFRvb2xiYXJMaXN0SXRlbSh0aGlzKS5hZGRDaGlsZHJlbihbXG4gICAgICAgICAgbmV3IEJ1dHRvbih0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5zdG9yZVwiKSwgSWNvbnMuU2F2ZUFzLCB7XG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcmVTdGF0ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5zdG9yZVN0YXRlXCIpLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG5ldyBCdXR0b24odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiY29weVwiKSwgSWNvbnMuQ29weSwge1xuICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNvcHlTdGF0ZSgpLmNhdGNoKHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlKGNvbnNvbGUpKTtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXRlLmNvcGllZC5zdGF0ZUN1cnJlbnRcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLmNvcHkuc3RhdGVDdXJyZW50XCIpLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG5ldyBCdXR0b24odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUubmV3XCIpLCBJY29ucy5EcmFmdCwge1xuICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnN0b3JlU3RhdGVGYWN0b3J5RGVmYXVsdHMoKTtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXRlLnN0b3JlZC5zdGF0ZVwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuc3RvcmVGYWN0b3J5XCIpLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG5ldyBCdXR0b24odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuZXhwb3J0QWxsXCIpLCBJY29ucy5TeW5jLCB7XG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZXhwb3J0U3RhdGVBbGwoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuZXhwb3J0QWxsVGl0bGVcIiksXG4gICAgICAgICAgfSksXG4gICAgICAgIF0pLFxuICAgICAgICBuZXcgTGlzdEl0ZW0odGhpcykuYWRkQ2hpbGQodGhpcy5zdGF0ZUxpc3QpLFxuICAgICAgICBuZXcgTGlzdEl0ZW0odGhpcykuYWRkQ2hpbGQobmV3IERlbGltaXRlcih0aGlzKSksXG5cbiAgICAgICAgbmV3IEhlYWRlckxpc3RJdGVtKHRoaXMsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLmxvY2FsR2FtZXNcIikpLFxuICAgICAgICBuZXcgVG9vbGJhckxpc3RJdGVtKHRoaXMpLmFkZENoaWxkcmVuKFtcbiAgICAgICAgICBuZXcgQnV0dG9uKHRoaXMsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLnN0b3JlXCIpLCBJY29ucy5TYXZlQXMsIHtcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zdG9yZUdhbWUoKTtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXRlLnN0b3JlZC5nYW1lXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5zdG9yZUdhbWVcIiksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgbmV3IEJ1dHRvbih0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJjb3B5XCIpLCBJY29ucy5Db3B5LCB7XG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY29weUdhbWUoKS5jYXRjaChyZWRpcmVjdEVycm9yc1RvQ29uc29sZShjb25zb2xlKSk7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0ZS5jb3BpZWQuZ2FtZUN1cnJlbnRcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLmNvcHkuZ2FtZUN1cnJlbnRcIiksXG4gICAgICAgICAgfSksXG4gICAgICAgIF0pLFxuICAgICAgICBuZXcgTGlzdEl0ZW0odGhpcykuYWRkQ2hpbGQodGhpcy5nYW1lTGlzdCksXG4gICAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0odGhpcywgdGhpcy5zZXR0aW5nLmNvbXByZXNzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5jb21wcmVzc1wiKSksXG4gICAgICBdKSxcbiAgICApO1xuXG4gICAgdGhpcy5fbG9hZEdhbWVzKCk7XG4gICAgdGhpcy5fbG9hZFN0YXRlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZEdhbWVzKCkge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgbGV0IGdhbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShga3MuZ2FtZS4ke2luZGV4fWApO1xuICAgIHRoaXMuZ2FtZXMuc3BsaWNlKDApO1xuICAgIHRyeSB7XG4gICAgICB3aGlsZSAoIWlzTmlsKGdhbWUpKSB7XG4gICAgICAgIGNvbnN0IGdhbWVPYmplY3QgPSBKU09OLnBhcnNlKGdhbWUpIGFzIFN0b3JlZEdhbWU7XG4gICAgICAgIHRoaXMuZ2FtZXMucHVzaChuZXcgVW5pcXVlKGdhbWVPYmplY3QpKTtcbiAgICAgICAgZ2FtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBrcy5nYW1lLiR7KytpbmRleH1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvciguLi5jbChlcnJvcikpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9zdG9yZUdhbWVzKCkge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgbGV0IGdhbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShga3MuZ2FtZS4ke2luZGV4fWApO1xuICAgIHdoaWxlICghaXNOaWwoZ2FtZSkpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGBrcy5nYW1lLiR7aW5kZXh9YCk7XG4gICAgICBnYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYGtzLmdhbWUuJHsrK2luZGV4fWApO1xuICAgIH1cblxuICAgIGluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IGdhbWUgb2YgdGhpcy5nYW1lcykge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYGtzLmdhbWUuJHtpbmRleCsrfWAsIEpTT04uc3RyaW5naWZ5KGdhbWUpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9sb2FkU3RhdGVzKCkge1xuICAgIGxldCBzdGF0ZUluZGV4ID0gMDtcbiAgICBsZXQgc3RhdGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShga3Muc3RhdGUuJHtzdGF0ZUluZGV4fWApO1xuICAgIHRoaXMuc3RhdGVzLnNwbGljZSgwKTtcbiAgICB0cnkge1xuICAgICAgd2hpbGUgKCFpc05pbChzdGF0ZSkpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVPYmplY3QgPSBKU09OLnBhcnNlKHN0YXRlKSBhcyBTdG9yZWRTdGF0ZTtcbiAgICAgICAgS2l0dGVuU2NpZW50aXN0cy51bmtub3duQXNFbmdpbmVTdGF0ZU9yVGhyb3coc3RhdGVPYmplY3Quc3RhdGUpO1xuICAgICAgICB0aGlzLnN0YXRlcy5wdXNoKG5ldyBVbmlxdWUoc3RhdGVPYmplY3QpKTtcbiAgICAgICAgc3RhdGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShga3Muc3RhdGUuJHsrK3N0YXRlSW5kZXh9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoLi4uY2woZXJyb3IpKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfc3RvcmVTdGF0ZXMoKSB7XG4gICAgbGV0IHN0YXRlSW5kZXggPSAwO1xuICAgIGxldCBzdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBrcy5zdGF0ZS4ke3N0YXRlSW5kZXh9YCk7XG4gICAgd2hpbGUgKCFpc05pbChzdGF0ZSkpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGBrcy5zdGF0ZS4ke3N0YXRlSW5kZXh9YCk7XG4gICAgICBzdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBrcy5zdGF0ZS4keysrc3RhdGVJbmRleH1gKTtcbiAgICB9XG5cbiAgICBzdGF0ZUluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHRoaXMuc3RhdGVzKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShga3Muc3RhdGUuJHtzdGF0ZUluZGV4Kyt9YCwgSlNPTi5zdHJpbmdpZnkoc3RhdGUpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoR2FtZUxpc3QoKSB7XG4gICAgdGhpcy5nYW1lTGlzdC5yZW1vdmVDaGlsZHJlbih0aGlzLmdhbWVMaXN0LmNoaWxkcmVuKTtcbiAgICB0aGlzLmdhbWVMaXN0LmFkZENoaWxkcmVuKFxuICAgICAgdGhpcy5nYW1lc1xuICAgICAgICAuc29ydChcbiAgICAgICAgICAoYSwgYikgPT5cbiAgICAgICAgICAgIG5ldyBEYXRlKGEudW53cmFwKCkudGltZXN0YW1wKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiLnVud3JhcCgpLnRpbWVzdGFtcCkuZ2V0VGltZSgpLFxuICAgICAgICApXG4gICAgICAgIC5tYXAoZ2FtZSA9PiBbZ2FtZS51bndyYXAoKSwgZ2FtZV0gYXMgY29uc3QpXG4gICAgICAgIC5tYXAoKFtnYW1lLCBnYW1lU2xvdF0pID0+XG4gICAgICAgICAgbmV3IEJ1dHRvbkxpc3RJdGVtKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG5ldyBUZXh0QnV0dG9uKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBgJHtnYW1lLmxhYmVsfSAoJHtmb3JtYXREaXN0YW5jZVRvTm93KG5ldyBEYXRlKGdhbWUudGltZXN0YW1wKSwge1xuICAgICAgICAgICAgICAgIGFkZFN1ZmZpeDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAgICAgICB9KX0pYCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMubG9hZEdhbWUoZ2FtZS5nYW1lKS5jYXRjaChyZWRpcmVjdEVycm9yc1RvQ29uc29sZShjb25zb2xlKSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUubG9hZGVkLmdhbWVcIiwgW2dhbWUubGFiZWxdKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRpdGxlOiBuZXcgRGF0ZShnYW1lLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKS5hZGRDaGlsZHJlbihbXG4gICAgICAgICAgICBuZXcgQ29udGFpbmVyKHRoaXMsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KSxcbiAgICAgICAgICAgIG5ldyBJY29uQnV0dG9uKHRoaXMsIEljb25zLlNhdmUsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLnVwZGF0ZS5nYW1lXCIpLCB7XG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUdhbWUoZ2FtZVNsb3QsIHRoaXMuaG9zdC5nYW1lLnNhdmUoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXRlLnVwZGF0ZWQuZ2FtZVwiLCBbZ2FtZS5sYWJlbF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgSWNvbkJ1dHRvbih0aGlzLCBJY29ucy5FZGl0LCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5lZGl0LmdhbWVcIiksIHtcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmVHYW1lKGdhbWUuZ2FtZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVHYW1lKGdhbWVTbG90LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUudXBkYXRlZC5nYW1lXCIsIFtnYW1lLmxhYmVsXSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBJY29uQnV0dG9uKHRoaXMsIEljb25zLkNvcHksIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLmNvcHkuZ2FtZVwiKSwge1xuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5R2FtZShnYW1lLmdhbWUpLmNhdGNoKHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlKGNvbnNvbGUpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUuY29waWVkLmdhbWVcIiwgW2dhbWUubGFiZWxdKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEljb25CdXR0b24odGhpcywgSWNvbnMuRGVsZXRlLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5kZWxldGUuZ2FtZVwiKSwge1xuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVHYW1lKGdhbWVTbG90KTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUuZGVsZXRlZC5nYW1lXCIsIFtnYW1lLmxhYmVsXSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICApO1xuICB9XG4gIHByaXZhdGUgX3JlZnJlc2hTdGF0ZUxpc3QoKSB7XG4gICAgdGhpcy5zdGF0ZUxpc3QucmVtb3ZlQ2hpbGRyZW4odGhpcy5zdGF0ZUxpc3QuY2hpbGRyZW4pO1xuICAgIHRoaXMuc3RhdGVMaXN0LmFkZENoaWxkcmVuKFxuICAgICAgdGhpcy5zdGF0ZXNcbiAgICAgICAgLnNvcnQoXG4gICAgICAgICAgKGEsIGIpID0+XG4gICAgICAgICAgICBuZXcgRGF0ZShhLnVud3JhcCgpLnRpbWVzdGFtcCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYi51bndyYXAoKS50aW1lc3RhbXApLmdldFRpbWUoKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKHN0YXRlU2xvdCA9PiBbc3RhdGVTbG90LnVud3JhcCgpLCBzdGF0ZVNsb3RdIGFzIGNvbnN0KVxuICAgICAgICAubWFwKChbc3RhdGUsIHN0YXRlU2xvdF0pID0+XG4gICAgICAgICAgbmV3IEJ1dHRvbkxpc3RJdGVtKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG5ldyBUZXh0QnV0dG9uKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBgJHtzdGF0ZS5sYWJlbH0gKCR7Zm9ybWF0RGlzdGFuY2VUb05vdyhuZXcgRGF0ZShzdGF0ZS50aW1lc3RhbXApLCB7XG4gICAgICAgICAgICAgICAgYWRkU3VmZml4OiB0cnVlLFxuICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgICAgIH0pfSlgLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkU3RhdGUoc3RhdGUuc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXRlLmxvYWRlZC5zdGF0ZVwiLCBbc3RhdGUubGFiZWxdKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRpdGxlOiBuZXcgRGF0ZShzdGF0ZS50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApLFxuICAgICAgICAgICkuYWRkQ2hpbGRyZW4oW1xuICAgICAgICAgICAgbmV3IENvbnRhaW5lcih0aGlzLCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSksXG4gICAgICAgICAgICBuZXcgSWNvbkJ1dHRvbih0aGlzLCBJY29ucy5TYXZlLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS51cGRhdGUuc3RhdGVcIiksIHtcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUoc3RhdGVTbG90LCB0aGlzLmhvc3QuZW5naW5lLnN0YXRlU2VyaWFsaXplKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0ZS51cGRhdGVkLnN0YXRlXCIsIFtzdGF0ZS5sYWJlbF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgSWNvbkJ1dHRvbih0aGlzLCBJY29ucy5FZGl0LCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5lZGl0LnN0YXRlXCIpLCB7XG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlU3RhdGUoc3RhdGUuc3RhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlU3RhdGUoc3RhdGVTbG90LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUudXBkYXRlZC5zdGF0ZVwiLCBbc3RhdGUubGFiZWxdKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEljb25CdXR0b24odGhpcywgSWNvbnMuQ29weSwgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuY29weS5zdGF0ZVwiKSwge1xuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5U3RhdGUoc3RhdGUuc3RhdGUpLmNhdGNoKHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlKGNvbnNvbGUpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUuY29waWVkLnN0YXRlXCIsIFtzdGF0ZS5sYWJlbF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgSWNvbkJ1dHRvbih0aGlzLCBJY29ucy5EZWxldGUsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLmRlbGV0ZS5zdGF0ZVwiKSwge1xuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVTdGF0ZShzdGF0ZVNsb3QpO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0ZS5kZWxldGVkLnN0YXRlXCIsIFtzdGF0ZS5sYWJlbF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSksXG4gICAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGNvcHlTdGF0ZShzdGF0ZT86IEVuZ2luZVN0YXRlKSB7XG4gICAgYXdhaXQgdGhpcy5ob3N0LmNvcHlTZXR0aW5ncyhzdGF0ZSwgZmFsc2UpO1xuICB9XG5cbiAgYXN5bmMgY29weUdhbWUoZ2FtZT86IEtHU2F2ZURhdGEpIHtcbiAgICBjb25zdCBzYXZlRGF0YSA9IGdhbWUgPz8gdGhpcy5ob3N0LmdhbWUuc2F2ZSgpO1xuICAgIGNvbnN0IHNhdmVEYXRhU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoc2F2ZURhdGEpO1xuICAgIGNvbnN0IGVuY29kZWREYXRhID0gdGhpcy5zZXR0aW5nLmNvbXByZXNzLmVuYWJsZWRcbiAgICAgID8gdGhpcy5ob3N0LmdhbWUuY29tcHJlc3NMWkRhdGEoc2F2ZURhdGFTdHJpbmcpXG4gICAgICA6IHNhdmVEYXRhU3RyaW5nO1xuXG4gICAgYXdhaXQgVXNlclNjcmlwdExvYWRlci53aW5kb3cubmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoZW5jb2RlZERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGV4dCBpbnB1dCBmcm9tIHRoZSB1c2VyLCBhbmQgdHJ5IHRvIGltcG9ydCBpdC5cbiAgICpcbiAgICogVGhpbmdzIHVzZXJzIG1pZ2h0IHBhc3RlLCBpbiBubyBzcGVjaWZpYyBvcmRlcjpcbiAgICogMS4gS2l0dGVucyBHYW1lIFNhdmUsIHVuY29tcHJlc3NlZCBsaW5lLWFnbm9zdGljIEpTT05cbiAgICogMi4gS2l0dGVucyBHYW1lIFNhdmUsIGx6LXN0cmluZyBjb21wcmVzc2VkIHNpbmdsZS1saW5lIFVURi04IHN0cmluZ1xuICAgKiAzLiBLaXR0ZW5zIEdhbWUgU2F2ZSwgbHotc3RyaW5nIGNvbXByZXNzZWQgc2luZ2xlLWxpbmUgVVRGLTE2IHN0cmluZ1xuICAgKiA0LiBLaXR0ZW4gU2NpZW50aXN0cyBTZXR0aW5ncywgdW5jb21wcmVzc2VkIGxpbmUtYWdub3N0aWMgSlNPTlxuICAgKiA1LiBLaXR0ZW4gU2NpZW50aXN0cyBTZXR0aW5ncywgbHotc3RyaW5nIGNvbXByZXNzZWQgc2luZ2xlLWxpbmUgQmFzZTY0IHN0cmluZ1xuICAgKiA2LiBLaXR0ZW4gU2NpZW50aXN0cyBTZXR0aW5ncyBFeHBvcnQsIG11bHRpLWxpbmUgc3RyaW5nIHdoZXJlIGFsbCBsaW5lcyBhcmUgZWl0aGVyOlxuICAgKiAgICAtICM0LCBidXQgbXVzdCBiZSBzaW5nbGUtbGluZVxuICAgKiAgICAtICM1XG4gICAqIDcuIEtpdHRlbiBTY2llbnRpc3RzIFNldHRpbmdzIEV4cG9ydCwgbXVsdGktbGluZSBzdHJpbmcgd2hlcmUgZWFjaCBsaW5lIGlzXG4gICAqICAgIGFuIHVuY29tcHJlc3NlZCBKU09OIHN0cmluZyBzZXJpYWxpemF0aW9uIG9mOlxuICAgKiAgICB7XG4gICAqICAgICAgbGFiZWw6IFwiVGhlIGxhYmVsIHRoZSB1c2VyIHByZXZpb3VzbHkgYXNzaWduZWQgdG8gdGhlc2Ugc2V0dGluZ3MuXCIsXG4gICAqICAgICAgc3RhdGU6IFwiVGhlIHNhbWUgb3B0aW9ucyBhcyAjNlwiLFxuICAgKiAgICAgIHRpbWVzdGFtcDogXCJMYXN0IHRpbWUgdGhlIHNldHRpbmdzIHdlcmUgbW9kaWZpZWQuIEFzIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5cIixcbiAgICogICAgfVxuICAgKi9cbiAgaW1wb3J0KCkge1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LnByb21wdCh0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5sb2FkUHJvbXB0XCIpKTtcbiAgICBpZiAoaXNOaWwodXNlcklucHV0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGltcG9ydElkID0gbmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKTtcbiAgICBsZXQgaW1wb3J0U2VxdWVuY2UgPSAxO1xuICAgIGNvbnN0IG1ha2VJbXBvcnRMYWJlbCA9ICgpID0+XG4gICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5pbXBvcnRlZFN0YXRlXCIsIFtgJHtpbXBvcnRJZH0gIyR7aW1wb3J0U2VxdWVuY2UrK31gXSk7XG5cbiAgICBjb25zdCBpbnRlcm5hbEltcG9ydCA9IChpbnB1dDogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBIYW5kbGVzICM0IGFuZCAjNVxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gZGVjb2RlU2V0dGluZ3MgdGhyb3dzIGlmIHRoZSBpbnB1dCBpcyBub3QgYSB2YWxpZCBlbmdpbmUgc3RhdGUuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gS2l0dGVuU2NpZW50aXN0cy5kZWNvZGVTZXR0aW5ncyhpbnB1dCk7XG4gICAgICAgIHRoaXMuc3RvcmVTdGF0ZShzdGF0ZSwgbWFrZUltcG9ydExhYmVsKCkpO1xuICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUuaW1wb3J0ZWQuc3RhdGVcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAvLyBOb3QgYSB2YWxpZCBLaXR0ZW4gU2NpZW50aXN0cyBzdGF0ZS5cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlcyAjN1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3ViamVjdERhdGEgPSBKU09OLnBhcnNlKGlucHV0KSBhcyB7XG4gICAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgICBzdGF0ZTogc3RyaW5nO1xuICAgICAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdGF0ZSA9IEtpdHRlblNjaWVudGlzdHMuZGVjb2RlU2V0dGluZ3Moc3ViamVjdERhdGEuc3RhdGUpO1xuICAgICAgICB0aGlzLnN0b3JlU3RhdGUoc3RhdGUsIHN1YmplY3REYXRhLmxhYmVsKTtcbiAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXRlLmltcG9ydGVkLnN0YXRlXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgLy8gTm90IGEgdmFsaWQgS2l0dGVuIFNjaWVudGlzdHMgc3RhdGUuXG4gICAgICB9XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gcGFyc2UgYXMgS0cgc2F2ZS5cbiAgICAgIGxldCBzdWJqZWN0RGF0YTogS0dTYXZlRGF0YTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN1YmplY3REYXRhID0gSlNPTi5wYXJzZShpbnB1dCkgYXMgS0dTYXZlRGF0YTtcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAvLyBFeHBlY3RlZCwgYXMgd2UgYXNzdW1lIGNvbXByZXNzZWQgaW5wdXQuXG4gICAgICAgIGNvbnN0IHVuY29tcHJlc3NlZCA9IHRoaXMuaG9zdC5nYW1lLmRlY29tcHJlc3NMWkRhdGEoaW5wdXQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN1YmplY3REYXRhID0gSlNPTi5wYXJzZSh1bmNvbXByZXNzZWQpIGFzIEtHU2F2ZURhdGE7XG4gICAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAgIC8vIENvbnRpbnVlZCBmYWlsdXJlIHRvIHBhcnNlIGFzIEpTT04gbWlnaHQgaW5kaWNhdGUgbmV3bGluZS1kZWxpbWl0ZWQgSlNPTi5cbiAgICAgICAgICBpZiAoaW5wdXQubWF0Y2goL1xccj9cXG4vKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LnNwbGl0KC9cXHI/XFxuLykubWFwKGxpbmUgPT4gdm9pZCBpbnRlcm5hbEltcG9ydChsaW5lKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgICAgXCJUaGUgcHJvdmlkZWQgaW5wdXQgY2FuIG5vdCBiZSBwYXJzZWQgYXMgYW55dGhpbmcgd2UgdW5kZXJzdGFuZC5cIixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGdhbWUgY29udGFpbnMgS1Mgc2V0dGluZ3MsIGltcG9ydCB0aG9zZSBzZXBhcmF0ZWx5LlxuICAgICAgbGV0IHN0YXRlTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghaXNOaWwoc3ViamVjdERhdGEpICYmIFwia3NcIiBpbiBzdWJqZWN0RGF0YSAmJiAhaXNOaWwoc3ViamVjdERhdGEua3MpKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3ViamVjdERhdGEua3Muc3RhdGVbMF07XG4gICAgICAgIHN0YXRlTGFiZWwgPSB0aGlzLnN0b3JlU3RhdGUoc3RhdGUsIG1ha2VJbXBvcnRMYWJlbCgpKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0ZS5pbXBvcnRlZC5zdGF0ZVwiKTtcbiAgICAgICAgc3ViamVjdERhdGEua3MgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RvcmVHYW1lKHN1YmplY3REYXRhLCBzdGF0ZUxhYmVsKTtcbiAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0ZS5pbXBvcnRlZC5nYW1lXCIpO1xuICAgIH07XG5cbiAgICBpbnRlcm5hbEltcG9ydCh1c2VySW5wdXQpO1xuICB9XG5cbiAgc3RvcmVHYW1lKGdhbWU/OiBLR1NhdmVEYXRhLCBsYWJlbD86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGxldCBnYW1lTGFiZWwgPSBsYWJlbDtcblxuICAgIGlmIChpc05pbChnYW1lTGFiZWwpKSB7XG4gICAgICBnYW1lTGFiZWwgPVxuICAgICAgICBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5wcm9tcHQodGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuc3RvcmVHYW1lLnByb21wdFwiKSkgPz9cbiAgICAgICAgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChpc05pbChnYW1lTGFiZWwpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgZW1wdHkgc3RyaW5nIHRvIFwibm8gbGFiZWxcIi5cbiAgICBnYW1lTGFiZWwgPVxuICAgICAgKGdhbWVMYWJlbCA9PT0gXCJcIiA/IHVuZGVmaW5lZCA6IGdhbWVMYWJlbCkgPz8gdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUudW5sYWJlbGVkR2FtZVwiKTtcblxuICAgIC8vIEVuc3VyZSBsYWJlbHMgYXJlbid0IGV4Y2Vzc2l2ZWx5IGxvbmcuXG4gICAgZ2FtZUxhYmVsID0gZ2FtZUxhYmVsLnN1YnN0cmluZygwLCAxMjcpO1xuXG4gICAgdGhpcy5nYW1lcy5wdXNoKFxuICAgICAgbmV3IFVuaXF1ZSh7XG4gICAgICAgIGdhbWU6IGdhbWUgPz8gdGhpcy5ob3N0LmdhbWUuc2F2ZSgpLFxuICAgICAgICBsYWJlbDogZ2FtZUxhYmVsLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLl9zdG9yZUdhbWVzKCk7XG4gICAgdGhpcy5yZXF1ZXN0UmVmcmVzaCgpO1xuXG4gICAgcmV0dXJuIGdhbWVMYWJlbDtcbiAgfVxuXG4gIHN0b3JlU3RhdGUoc3RhdGU/OiBFbmdpbmVTdGF0ZSwgbGFiZWw/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBsZXQgc3RhdGVMYWJlbCA9IGxhYmVsO1xuXG4gICAgaWYgKGlzTmlsKHN0YXRlTGFiZWwpKSB7XG4gICAgICBzdGF0ZUxhYmVsID1cbiAgICAgICAgVXNlclNjcmlwdExvYWRlci53aW5kb3cucHJvbXB0KHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLnN0b3JlU3RhdGUucHJvbXB0XCIpKSA/P1xuICAgICAgICB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGlzTmlsKHN0YXRlTGFiZWwpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgZW1wdHkgc3RyaW5nIHRvIFwibm8gbGFiZWxcIi5cbiAgICBzdGF0ZUxhYmVsID1cbiAgICAgIChzdGF0ZUxhYmVsID09PSBcIlwiID8gdW5kZWZpbmVkIDogc3RhdGVMYWJlbCkgPz8gdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUudW5sYWJlbGVkU3RhdGVcIik7XG5cbiAgICAvLyBFbnN1cmUgbGFiZWxzIGFyZW4ndCBleGNlc3NpdmVseSBsb25nLlxuICAgIHN0YXRlTGFiZWwgPSBzdGF0ZUxhYmVsLnN1YnN0cmluZygwLCAxMjcpO1xuXG4gICAgdGhpcy5zdGF0ZXMucHVzaChcbiAgICAgIG5ldyBVbmlxdWUoe1xuICAgICAgICBsYWJlbDogc3RhdGVMYWJlbCxcbiAgICAgICAgc3RhdGU6IHN0YXRlID8/IHRoaXMuaG9zdC5lbmdpbmUuc3RhdGVTZXJpYWxpemUoKSxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy5fc3RvcmVTdGF0ZXMoKTtcbiAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG5cbiAgICByZXR1cm4gc3RhdGVMYWJlbDtcbiAgfVxuXG4gIHN0b3JlU3RhdGVGYWN0b3J5RGVmYXVsdHMoKSB7XG4gICAgdGhpcy5zdG9yZVN0YXRlKEVuZ2luZS5ERUZBVUxUX1NUQVRFKTtcbiAgfVxuXG4gIHN0b3JlQXV0b1NhdmUoc3RhdGU6IEVuZ2luZVN0YXRlKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnN0YXRlcy5maW5kKHN0YXRlID0+IHN0YXRlLnVud3JhcCgpLmxhYmVsID09PSBcIkF1dG8tU2F2ZVwiKTtcbiAgICBpZiAoIWlzTmlsKGV4aXN0aW5nKSkge1xuICAgICAgY29uc29sZS5pbmZvKC4uLmNsKFwiVXBkYXRpbmcgZXhpc3RpbmcgQXV0by1TYXZlLi4uXCIpKTtcbiAgICAgIGV4aXN0aW5nLnJlcGxhY2Uoe1xuICAgICAgICAuLi5leGlzdGluZy51bndyYXAoKSxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3N0b3JlU3RhdGVzKCk7XG4gICAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oLi4uY2woXCJTdG9yaW5nIG5ldyBBdXRvLVNhdmUuLi5cIikpO1xuICAgIHRoaXMuc3RvcmVTdGF0ZShzdGF0ZSwgXCJBdXRvLVNhdmVcIik7XG4gIH1cblxuICBleHBvcnRTdGF0ZUFsbCgpIHtcbiAgICBjb25zdCBzdGF0ZXNKc29uID0gdGhpcy5zdGF0ZXNcbiAgICAgIC5tYXAoc3RhdGUgPT4gc3RhdGUudW53cmFwKCkpXG4gICAgICAubWFwKHN0YXRlID0+XG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBsYWJlbDogc3RhdGUubGFiZWwsXG4gICAgICAgICAgc3RhdGU6IEtpdHRlblNjaWVudGlzdHMuZW5jb2RlU2V0dGluZ3Moc3RhdGUuc3RhdGUsIGZhbHNlKSxcbiAgICAgICAgICB0aW1lc3RhbXA6IHN0YXRlLnRpbWVzdGFtcCxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtzdGF0ZXNKc29uXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL3gtbmRqc29uXCIgfSk7XG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBhLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgdXJsKTtcbiAgICBhLnNldEF0dHJpYnV0ZShcImRvd25sb2FkXCIsIGBrcy1sb2NhbC1zdGF0ZXMtJHtEYXRlLm5vdygpfS5uZGpzb25gKTtcbiAgICBhLmNsaWNrKCk7XG4gIH1cblxuICBhc3luYyBsb2FkR2FtZShnYW1lOiBLR1NhdmVEYXRhKSB7XG4gICAgaWYgKHRoaXMuX2Rlc3RydWN0aXZlQWN0aW9uUHJldmVudGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgU2F2ZWdhbWVMb2FkZXIodGhpcy5ob3N0LmdhbWUpLmxvYWRSYXcoZ2FtZSk7XG4gIH1cblxuICBsb2FkU3RhdGUoc3RhdGU6IEVuZ2luZVN0YXRlKSB7XG4gICAgaWYgKHRoaXMuX2Rlc3RydWN0aXZlQWN0aW9uUHJldmVudGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhvc3QuZW5naW5lLnN0YXRlTG9hZChzdGF0ZSwgdHJ1ZSk7XG4gICAgdGhpcy5ob3N0LnJlZnJlc2hFbnRpcmVVc2VySW50ZXJmYWNlKCk7XG4gIH1cblxuICBsb2FkQXV0b1NhdmUoKSB7XG4gICAgaWYgKHRoaXMuaG9zdC5lbmdpbmUuaXNMb2FkZWQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIk5vdCBhdHRlbXB0aW5nIHRvIGxvYWQgQXV0by1TYXZlLCBiZWNhdXNlIGEgc3RhdGUgaXMgYWxyZWFkeSBsb2FkZWQuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuc3RhdGVzLmZpbmQoc3RhdGUgPT4gc3RhdGUudW53cmFwKCkubGFiZWwgPT09IFwiQXV0by1TYXZlXCIpO1xuICAgIGlmIChpc05pbChleGlzdGluZykpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIk5vIEF1dG8tU2F2ZSBzZXR0aW5ncyBmb3VuZC5cIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIkxvYWRpbmcgQXV0by1TYXZlLi4uXCIpKTtcbiAgICB0aGlzLmhvc3QuZW5naW5lLnN0YXRlTG9hZChleGlzdGluZy51bndyYXAoKS5zdGF0ZSwgZmFsc2UpO1xuICB9XG5cbiAgdXBkYXRlR2FtZShnYW1lOiBVbmlxdWU8U3RvcmVkR2FtZT4sIG5ld0dhbWU6IEtHU2F2ZURhdGEpIHtcbiAgICBpZiAodGhpcy5fZGVzdHJ1Y3RpdmVBY3Rpb25QcmV2ZW50ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhYmVsID0gZ2FtZS51bndyYXAoKS5sYWJlbDtcbiAgICBnYW1lLnJlcGxhY2Uoe1xuICAgICAgZ2FtZTogbmV3R2FtZSxcbiAgICAgIGxhYmVsLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfSk7XG4gICAgdGhpcy5fc3RvcmVHYW1lcygpO1xuICAgIHRoaXMucmVxdWVzdFJlZnJlc2goKTtcbiAgfVxuXG4gIHVwZGF0ZVN0YXRlKHN0YXRlOiBVbmlxdWU8U3RvcmVkU3RhdGU+LCBuZXdTdGF0ZTogRW5naW5lU3RhdGUpIHtcbiAgICBpZiAodGhpcy5fZGVzdHJ1Y3RpdmVBY3Rpb25QcmV2ZW50ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhYmVsID0gc3RhdGUudW53cmFwKCkubGFiZWw7XG4gICAgc3RhdGUucmVwbGFjZSh7XG4gICAgICBsYWJlbCxcbiAgICAgIHN0YXRlOiBuZXdTdGF0ZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH0pO1xuICAgIHRoaXMuX3N0b3JlU3RhdGVzKCk7XG4gICAgdGhpcy5yZXF1ZXN0UmVmcmVzaCgpO1xuICB9XG5cbiAgZGVsZXRlR2FtZShnYW1lOiBVbmlxdWU8U3RvcmVkR2FtZT4sIGZvcmNlID0gZmFsc2UpIHtcbiAgICBpZiAoIWZvcmNlICYmIHRoaXMuX2Rlc3RydWN0aXZlQWN0aW9uUHJldmVudGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2FtZXMuaW5kZXhPZihnYW1lKTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5nYW1lcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuX3N0b3JlR2FtZXMoKTtcbiAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG4gIH1cblxuICBkZWxldGVTdGF0ZShzdGF0ZTogVW5pcXVlPFN0b3JlZFN0YXRlPiwgZm9yY2UgPSBmYWxzZSkge1xuICAgIGlmICghZm9yY2UgJiYgdGhpcy5fZGVzdHJ1Y3RpdmVBY3Rpb25QcmV2ZW50ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zdGF0ZXMuaW5kZXhPZihzdGF0ZSk7XG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5fc3RvcmVTdGF0ZXMoKTtcbiAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG4gIH1cblxuICBwcml2YXRlIF9kZXN0cnVjdGl2ZUFjdGlvblByZXZlbnRlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5zZXR0aW5nLm5vQ29uZmlybS5lbmFibGVkICYmXG4gICAgICAhVXNlclNjcmlwdExvYWRlci53aW5kb3cuY29uZmlybSh0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5jb25maXJtRGVzdHJ1Y3Rpb25cIikpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU2V0dGluZyB9IGZyb20gXCIuLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgQ29sbGFwc2libGVQYW5lbCwgdHlwZSBDb2xsYXBzaWJsZVBhbmVsT3B0aW9ucyB9IGZyb20gXCIuL0NvbGxhcHNpYmxlUGFuZWwuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgTGFiZWxMaXN0SXRlbSwgdHlwZSBMYWJlbExpc3RJdGVtT3B0aW9ucyB9IGZyb20gXCIuL0xhYmVsTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHN0eWxlc1NldHRpbmdMaXN0SXRlbSBmcm9tIFwiLi9TZXR0aW5nTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIEljb25TZXR0aW5nc1BhbmVsT3B0aW9ucyA9IFRoaXNUeXBlPEljb25TZXR0aW5nc1BhbmVsPiAmXG4gIExhYmVsTGlzdEl0ZW1PcHRpb25zICZcbiAgQ29sbGFwc2libGVQYW5lbE9wdGlvbnMgJiB7XG4gICAgLyoqXG4gICAgICogV2hlbiBzZXQgdG8gYW4gU1ZHIHBhdGgsIHdpbGwgYmUgdXNlZCBhcyBhbiBpY29uIG9uIHRoZSBwYW5lbC5cbiAgICAgKi9cbiAgICByZWFkb25seSBpY29uOiBzdHJpbmc7XG4gIH07XG5cbmV4cG9ydCBjbGFzcyBJY29uU2V0dGluZ3NQYW5lbDxUU2V0dGluZyBleHRlbmRzIFNldHRpbmcgPSBTZXR0aW5nPiBleHRlbmRzIENvbGxhcHNpYmxlUGFuZWwge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IEljb25TZXR0aW5nc1BhbmVsT3B0aW9ucztcbiAgcmVhZG9ubHkgc2V0dGluZzogVFNldHRpbmc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBzZXR0aW5ncyBwYW5lbCB0aGF0IGNhbiBoYXZlIGFuIGljb24uXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIHB1dCBtYWluIGNoZWNrYm94IG9mIHRoaXMgc2VjdGlvbi5cbiAgICogQHBhcmFtIHNldHRpbmcgQW4gc2V0dGluZyBmb3Igd2hpY2ggdGhpcyBpcyB0aGUgc2V0dGluZ3MgcGFuZWwuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBwYW5lbC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBzZXR0aW5nOiBUU2V0dGluZyxcbiAgICBvcHRpb25zPzogSWNvblNldHRpbmdzUGFuZWxPcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIHBhcmVudCxcbiAgICAgIG5ldyBMYWJlbExpc3RJdGVtKHBhcmVudCwgbGFiZWwsIHtcbiAgICAgICAgY2xhc3NlczogW3N0eWxlc1NldHRpbmdMaXN0SXRlbS5jaGVja2VkLCBzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uc2V0dGluZ10sXG4gICAgICAgIGljb246IG9wdGlvbnM/Lmljb24sXG4gICAgICB9KS5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSldKSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJlc2V0Qm9uZmlyZVNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1Jlc2V0Qm9uZmlyZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zLCBTZXR0aW5nVHJpZ2dlciB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdGFnZWRCdWlsZGluZyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgc3R5bGVzRGVsaW1pdGVyIGZyb20gXCIuL2NvbXBvbmVudHMvRGVsaW1pdGVyLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuL2NvbXBvbmVudHMvRGlhbG9nLmpzXCI7XG5pbXBvcnQgeyBIZWFkZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvSGVhZGVyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IEljb25TZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9JY29uU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNldEJvbmZpcmVTZXR0aW5nc1VpIGV4dGVuZHMgSWNvblNldHRpbmdzUGFuZWw8UmVzZXRCb25maXJlU2V0dGluZ3M+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfYnVpbGRpbmdzOiBBcnJheTxIZWFkZXJMaXN0SXRlbSB8IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IFJlc2V0Qm9uZmlyZVNldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgKSB7XG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLmJ1aWxkXCIpO1xuICAgIHN1cGVyKHBhcmVudCwgbGFiZWwsIHNldHRpbmdzLCB7XG4gICAgICBpY29uOiBJY29ucy5Cb25maXJlLFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICB0aGlzLmV4cGFuZG8uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICBPYmplY3QudmFsdWVzKHNldHRpbmdzLmJ1aWxkaW5ncykuc29tZShfID0+IF8uZW5hYmxlZCAmJiBfLnRyaWdnZXIgPD0gMCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5fYnVpbGRpbmdzID0gW107XG4gICAgZm9yIChjb25zdCBidWlsZGluZ0dyb3VwIG9mIHRoaXMuaG9zdC5nYW1lLmJsZC5idWlsZGluZ0dyb3Vwcykge1xuICAgICAgdGhpcy5fYnVpbGRpbmdzLnB1c2gobmV3IEhlYWRlckxpc3RJdGVtKHRoaXMsIGJ1aWxkaW5nR3JvdXAudGl0bGUpKTtcbiAgICAgIGZvciAoY29uc3QgYnVpbGRpbmcgb2YgYnVpbGRpbmdHcm91cC5idWlsZGluZ3MpIHtcbiAgICAgICAgaWYgKGJ1aWxkaW5nID09PSBcInVuaWNvcm5QYXN0dXJlXCIgfHwgaXNOaWwodGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tidWlsZGluZ10pKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KGJ1aWxkaW5nKS5tZXRhO1xuICAgICAgICBpZiAoIWlzTmlsKG1ldGEuc3RhZ2VzKSkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBPYmplY3QudmFsdWVzKHRoaXMuc2V0dGluZy5idWlsZGluZ3MpLmZpbmQoXG4gICAgICAgICAgICBpdGVtID0+IGl0ZW0uYmFzZUJ1aWxkaW5nID09PSBidWlsZGluZyxcbiAgICAgICAgICApPy5idWlsZGluZyBhcyBTdGFnZWRCdWlsZGluZztcbiAgICAgICAgICB0aGlzLl9idWlsZGluZ3MucHVzaChcbiAgICAgICAgICAgIHRoaXMuX2dldFJlc2V0T3B0aW9uKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYnVpbGRpbmdzW2J1aWxkaW5nXSxcbiAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgICAgbWV0YS5zdGFnZXNbMF0ubGFiZWwsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy5fZ2V0UmVzZXRPcHRpb24oXG4gICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5idWlsZGluZ3NbbmFtZV0sXG4gICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgICAgICAgIG1ldGEuc3RhZ2VzWzFdLmxhYmVsLFxuICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNOaWwobWV0YS5sYWJlbCkpIHtcbiAgICAgICAgICB0aGlzLl9idWlsZGluZ3MucHVzaChcbiAgICAgICAgICAgIHRoaXMuX2dldFJlc2V0T3B0aW9uKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYnVpbGRpbmdzW2J1aWxkaW5nXSxcbiAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgICAgbWV0YS5sYWJlbCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgcGFkZGluZyBhZnRlciBlYWNoIGdyb3VwLiBFeGNlcHQgZm9yIHRoZSBsYXN0IGdyb3VwLCB3aGljaCBlbmRzIHRoZSBsaXN0LlxuICAgICAgaWYgKFxuICAgICAgICBidWlsZGluZ0dyb3VwICE9PVxuICAgICAgICB0aGlzLmhvc3QuZ2FtZS5ibGQuYnVpbGRpbmdHcm91cHNbdGhpcy5ob3N0LmdhbWUuYmxkLmJ1aWxkaW5nR3JvdXBzLmxlbmd0aCAtIDFdXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fYnVpbGRpbmdzLmF0KC0xKT8uZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNEZWxpbWl0ZXIuZGVsaW1pdGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsaXN0QnVpbGRpbmdzID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzKTtcbiAgICBsaXN0QnVpbGRpbmdzLmFkZENoaWxkcmVuKHRoaXMuX2J1aWxkaW5ncyk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobGlzdEJ1aWxkaW5ncyk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZXNldE9wdGlvbihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIG9wdGlvbjogU2V0dGluZ1RyaWdnZXIsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIHNlY3Rpb25TZXR0aW5nOiBSZXNldEJvbmZpcmVTZXR0aW5ncyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGRlbGltaXRlciA9IGZhbHNlLFxuICAgIHVwZ3JhZGVJbmRpY2F0b3IgPSBmYWxzZSxcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgb3B0aW9uLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiYgb3B0aW9uLmVuYWJsZWQgJiYgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgfSxcbiAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5wcm9tcHQuYWJzb2x1dGVcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmluYWN0aXZlXCIpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnJlc2V0LnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyID0gLTE7XG4gICAgICAgICAgb3B0aW9uLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24udHJpZ2dlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICAgIHVwZ3JhZGVJbmRpY2F0b3IsXG4gICAgfSk7XG4gICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIi4uL2ltYWdlcy9JY29ucy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNldFJlbGlnaW9uU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvUmVzZXRSZWxpZ2lvblNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zLCBTZXR0aW5nVHJpZ2dlciB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVW5pY29ybkl0ZW1zLCB0eXBlIFppZ2d1cmF0VXBncmFkZSB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgRGVsaW1pdGVyIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EZWxpbWl0ZXIuanNcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuL2NvbXBvbmVudHMvRGlhbG9nLmpzXCI7XG5pbXBvcnQgeyBIZWFkZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvSGVhZGVyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IEljb25TZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9JY29uU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRSZWxpZ2lvblNldHRpbmdzVWkgZXh0ZW5kcyBJY29uU2V0dGluZ3NQYW5lbDxSZXNldFJlbGlnaW9uU2V0dGluZ3M+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogUmVzZXRSZWxpZ2lvblNldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgKSB7XG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLmZhaXRoXCIpO1xuICAgIHN1cGVyKHBhcmVudCwgbGFiZWwsIHNldHRpbmdzLCB7XG4gICAgICBpY29uOiBJY29ucy5SZWxpZ2lvbixcbiAgICAgIG9uUmVmcmVzaFJlcXVlc3Q6ICgpID0+IHtcbiAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5idWlsZGluZ3MpLnNvbWUoXyA9PiBfLmVuYWJsZWQgJiYgXy50cmlnZ2VyIDw9IDApO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkQ2hpbGRyZW5IZWFkKFtuZXcgQ29udGFpbmVyKHBhcmVudCwgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pXSk7XG5cbiAgICBjb25zdCB1bmljb3Juc0FycmF5OiBBcnJheTxaaWdndXJhdFVwZ3JhZGUgfCBcInVuaWNvcm5QYXN0dXJlXCI+ID0gWy4uLlVuaWNvcm5JdGVtc107XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChcbiAgICAgIG5ldyBTZXR0aW5nc0xpc3QodGhpcykuYWRkQ2hpbGRyZW4oW1xuICAgICAgICBuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJHJlbGlnaW9uLnBhbmVsLnppZ2d1cmF0LmxhYmVsXCIpKSxcbiAgICAgICAgdGhpcy5fZ2V0UmVzZXRPcHRpb24oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLnNldHRpbmcuYnVpbGRpbmdzLnVuaWNvcm5QYXN0dXJlLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkYnVpbGRpbmdzLnVuaWNvcm5QYXN0dXJlLmxhYmVsXCIpLFxuICAgICAgICApLFxuXG4gICAgICAgIC4uLnRoaXMuaG9zdC5nYW1lLnJlbGlnaW9uLnppZ2d1cmF0VXBncmFkZXNcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgaXRlbSA9PiB1bmljb3Juc0FycmF5LmluY2x1ZGVzKGl0ZW0ubmFtZSkgJiYgIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoemlnZ3VyYXRVcGdyYWRlID0+XG4gICAgICAgICAgICB0aGlzLl9nZXRSZXNldE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t6aWdndXJhdFVwZ3JhZGUubmFtZV0sXG4gICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgICAgICAgIHppZ2d1cmF0VXBncmFkZS5sYWJlbCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgbmV3IERlbGltaXRlcih0aGlzKSxcblxuICAgICAgICAuLi50aGlzLmhvc3QuZ2FtZS5yZWxpZ2lvbi56aWdndXJhdFVwZ3JhZGVzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIGl0ZW0gPT4gIXVuaWNvcm5zQXJyYXkuaW5jbHVkZXMoaXRlbS5uYW1lKSAmJiAhaXNOaWwodGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tpdGVtLm5hbWVdKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCh1cGdyYWRlID0+XG4gICAgICAgICAgICB0aGlzLl9nZXRSZXNldE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t1cGdyYWRlLm5hbWVdLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICB1cGdyYWRlLmxhYmVsLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICBuZXcgRGVsaW1pdGVyKHRoaXMpLFxuXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkcmVsaWdpb24ucGFuZWwub3JkZXJPZlRoZVN1bi5sYWJlbFwiKSksXG4gICAgICAgIC4uLnRoaXMuaG9zdC5nYW1lLnJlbGlnaW9uLnJlbGlnaW9uVXBncmFkZXNcbiAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSkpXG4gICAgICAgICAgLm1hcCh1cGdyYWRlID0+XG4gICAgICAgICAgICB0aGlzLl9nZXRSZXNldE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t1cGdyYWRlLm5hbWVdLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICB1cGdyYWRlLmxhYmVsLFxuICAgICAgICAgICAgICB1cGdyYWRlLm5hbWUgPT09IHRoaXMuaG9zdC5nYW1lLnJlbGlnaW9uLnJlbGlnaW9uVXBncmFkZXMuYXQoLTEpPy5uYW1lLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkcmVsaWdpb24ucGFuZWwuY3J5cHRvdGhlb2xvZ3kubGFiZWxcIikpLFxuICAgICAgICAuLi50aGlzLmhvc3QuZ2FtZS5yZWxpZ2lvbi50cmFuc2NlbmRlbmNlVXBncmFkZXNcbiAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSkpXG4gICAgICAgICAgLm1hcCh1cGdyYWRlID0+XG4gICAgICAgICAgICB0aGlzLl9nZXRSZXNldE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t1cGdyYWRlLm5hbWVdLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICB1cGdyYWRlLmxhYmVsLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgXSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlc2V0T3B0aW9uKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgb3B0aW9uOiBTZXR0aW5nVHJpZ2dlcixcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgc2VjdGlvblNldHRpbmc6IFJlc2V0UmVsaWdpb25TZXR0aW5ncyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGRlbGltaXRlciA9IGZhbHNlLFxuICAgIHVwZ3JhZGVJbmRpY2F0b3IgPSBmYWxzZSxcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgb3B0aW9uLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiYgb3B0aW9uLmVuYWJsZWQgJiYgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgfSxcbiAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5wcm9tcHQuYWJzb2x1dGVcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmluYWN0aXZlXCIpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnJlc2V0LnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyID0gLTE7XG4gICAgICAgICAgb3B0aW9uLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24udHJpZ2dlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICAgIHVwZ3JhZGVJbmRpY2F0b3IsXG4gICAgfSk7XG4gICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCIuLi9pbWFnZXMvSWNvbnMuanNcIjtcbmltcG9ydCB0eXBlIHsgUmVzZXRSZXNvdXJjZXNTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9SZXNldFJlc291cmNlc1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyB1Y2ZpcnN0IH0gZnJvbSBcIi4uL3Rvb2xzL0Zvcm1hdC5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7IEljb25TZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9JY29uU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRSZXNvdXJjZXNTZXR0aW5nc1VpIGV4dGVuZHMgSWNvblNldHRpbmdzUGFuZWw8UmVzZXRSZXNvdXJjZXNTZXR0aW5ncz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBSZXNldFJlc291cmNlc1NldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgKSB7XG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnJlc291cmNlc1wiKTtcbiAgICBzdXBlcihwYXJlbnQsIGxhYmVsLCBzZXR0aW5ncywge1xuICAgICAgaWNvbjogSWNvbnMuUmVzb3VyY2VzLFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICB0aGlzLmV4cGFuZG8uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICBPYmplY3QudmFsdWVzKHNldHRpbmdzLnJlc291cmNlcykuc29tZShfID0+IF8uZW5hYmxlZCAmJiBfLnRyaWdnZXIgPCAwKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pO1xuXG4gICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy5ob3N0LmdhbWUucmVzUG9vbC5yZXNvdXJjZXM7XG5cbiAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgIGxldCBsYXN0TGFiZWwgPSByZXNvdXJjZXNbMF0udGl0bGU7XG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBbLi4ucmVzb3VyY2VzXS5zb3J0KChhLCBiKSA9PlxuICAgICAgYS50aXRsZS5sb2NhbGVDb21wYXJlKGIudGl0bGUsIGxvY2FsZS5zZWxlY3RlZCksXG4gICAgKSkge1xuICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5zZXR0aW5nLnJlc291cmNlc1tyZXNvdXJjZS5uYW1lXTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHRoaXMsIG9wdGlvbiwgbG9jYWxlLCB1Y2ZpcnN0KHJlc291cmNlLnRpdGxlKSwge1xuICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtyZXNvdXJjZS50aXRsZV0pO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hSZXF1ZXN0OiAoKSA9PiB7XG4gICAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID0gIW9wdGlvbi5lbmFibGVkIHx8IG9wdGlvbi50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgICAgc2V0dGluZ3MuZW5hYmxlZCAmJiBvcHRpb24uZW5hYmxlZCAmJiBvcHRpb24udHJpZ2dlciA9PT0gLTE7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21wdC5mbG9hdFwiKSxcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYnVpbGQucHJvbXB0XCIsIFtcbiAgICAgICAgICAgICAgcmVzb3VyY2UudGl0bGUsXG4gICAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICAgID8gdGhpcy5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAgICAgOiB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmluYWN0aXZlXCIpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBvcHRpb24udHJpZ2dlciAhPT0gLTEgPyB0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucmVzZXQucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIG9wdGlvbi5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSBwYXJlbnQuaG9zdC5wYXJzZUFic29sdXRlKHZhbHVlKSA/PyBvcHRpb24udHJpZ2dlcjtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbcmVzb3VyY2UudGl0bGVdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcblxuICAgICAgaWYgKHRoaXMuaG9zdC5lbmdpbmUubG9jYWxlU3VwcG9ydHNGaXJzdExldHRlclNwbGl0cyhsb2NhbGUuc2VsZWN0ZWQpKSB7XG4gICAgICAgIGlmIChsYXN0TGFiZWxbMF0gIT09IHJlc291cmNlLnRpdGxlWzBdKSB7XG4gICAgICAgICAgZWxlbWVudC5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0xhYmVsTGlzdEl0ZW0uc3BsaXR0ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGl0ZW1zLnB1c2goZWxlbWVudCk7XG5cbiAgICAgIGxhc3RMYWJlbCA9IHJlc291cmNlLnRpdGxlO1xuICAgIH1cblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KG5ldyBTZXR0aW5nc0xpc3QodGhpcykuYWRkQ2hpbGRyZW4oaXRlbXMpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIi4uL2ltYWdlcy9JY29ucy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNldFNwYWNlU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvUmVzZXRTcGFjZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zLCBTZXR0aW5nVHJpZ2dlciB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7IEhlYWRlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9IZWFkZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgSWNvblNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL0ljb25TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNldFNwYWNlU2V0dGluZ3NVaSBleHRlbmRzIEljb25TZXR0aW5nc1BhbmVsPFJlc2V0U3BhY2VTZXR0aW5ncz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBSZXNldFNwYWNlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuc3BhY2VcIik7XG4gICAgc3VwZXIocGFyZW50LCBsYWJlbCwgc2V0dGluZ3MsIHtcbiAgICAgIGljb246IEljb25zLlNwYWNlLFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICB0aGlzLmV4cGFuZG8uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICBPYmplY3QudmFsdWVzKHNldHRpbmdzLmJ1aWxkaW5ncykuc29tZShfID0+IF8uZW5hYmxlZCAmJiBfLnRyaWdnZXIgPD0gMCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSldKTtcblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KFxuICAgICAgbmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihcbiAgICAgICAgdGhpcy5ob3N0LmdhbWUuc3BhY2UucGxhbmV0c1xuICAgICAgICAgIC5maWx0ZXIocGxhbnQgPT4gMCA8IHBsYW50LmJ1aWxkaW5ncy5sZW5ndGgpXG4gICAgICAgICAgLmZsYXRNYXAoKHBsYW5ldCwgaW5kZXhQbGFuZXQsIGFycmF5UGxhbnQpID0+IFtcbiAgICAgICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmxhYmVsRm9yUGxhbmV0KHBsYW5ldC5uYW1lKSksXG4gICAgICAgICAgICAuLi5wbGFuZXQuYnVpbGRpbmdzXG4gICAgICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiAhaXNOaWwodGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tpdGVtLm5hbWVdKSlcbiAgICAgICAgICAgICAgLm1hcCgoYnVpbGRpbmcsIGluZGV4QnVpbGRpbmcsIGFycmF5QnVpbGRpbmcpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0UmVzZXRPcHRpb24oXG4gICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tidWlsZGluZy5uYW1lXSxcbiAgICAgICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICAgICAgYnVpbGRpbmcubGFiZWwsXG4gICAgICAgICAgICAgICAgICBpbmRleFBsYW5ldCA8IGFycmF5UGxhbnQubGVuZ3RoIC0gMSAmJiBpbmRleEJ1aWxkaW5nID09PSBhcnJheUJ1aWxkaW5nLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlc2V0T3B0aW9uKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgb3B0aW9uOiBTZXR0aW5nVHJpZ2dlcixcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgc2VjdGlvblNldHRpbmc6IFJlc2V0U3BhY2VTZXR0aW5ncyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGRlbGltaXRlciA9IGZhbHNlLFxuICAgIHVwZ3JhZGVJbmRpY2F0b3IgPSBmYWxzZSxcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgb3B0aW9uLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiYgb3B0aW9uLmVuYWJsZWQgJiYgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgfSxcbiAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5wcm9tcHQuYWJzb2x1dGVcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmluYWN0aXZlXCIpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnJlc2V0LnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyID0gLTE7XG4gICAgICAgICAgb3B0aW9uLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24udHJpZ2dlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICAgIHVwZ3JhZGVJbmRpY2F0b3IsXG4gICAgfSk7XG4gICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIi4uL2ltYWdlcy9JY29ucy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNldFRpbWVTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9SZXNldFRpbWVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucywgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgVGltZUl0ZW0gfSBmcm9tIFwiLi4vc2V0dGluZ3MvVGltZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgc3R5bGVzQnV0dG9uIGZyb20gXCIuL2NvbXBvbmVudHMvQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHsgSGVhZGVyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL0hlYWRlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBJY29uU2V0dGluZ3NQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvSWNvblNldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL2NvbXBvbmVudHMvTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc2V0VGltZVNldHRpbmdzVWkgZXh0ZW5kcyBJY29uU2V0dGluZ3NQYW5lbDxSZXNldFRpbWVTZXR0aW5ncz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBSZXNldFRpbWVTZXR0aW5ncyxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICkge1xuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50aW1lXCIpO1xuICAgIHN1cGVyKHBhcmVudCwgbGFiZWwsIHNldHRpbmdzLCB7XG4gICAgICBpY29uOiBJY29ucy5UaW1lLFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICB0aGlzLmV4cGFuZG8uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICBPYmplY3QudmFsdWVzKHNldHRpbmdzLmJ1aWxkaW5ncykuc29tZShfID0+IF8uZW5hYmxlZCAmJiBfLnRyaWdnZXIgPD0gMCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSldKTtcblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KFxuICAgICAgbmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihbXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkd29ya3Nob3AuY2hyb25vZm9yZ2UubGFiZWxcIikpLFxuICAgICAgICAuLi50aGlzLmhvc3QuZ2FtZS50aW1lLmNocm9ub2ZvcmdlVXBncmFkZXNcbiAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSkpXG4gICAgICAgICAgLm1hcChidWlsZGluZyA9PlxuICAgICAgICAgICAgdGhpcy5fZ2V0UmVzZXRPcHRpb24oXG4gICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5idWlsZGluZ3NbYnVpbGRpbmcubmFtZV0sXG4gICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgICAgICAgIGJ1aWxkaW5nLmxhYmVsLFxuICAgICAgICAgICAgICBidWlsZGluZy5uYW1lID09PSB0aGlzLmhvc3QuZ2FtZS50aW1lLmNocm9ub2ZvcmdlVXBncmFkZXMuYXQoLTEpPy5uYW1lLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkc2NpZW5jZS52b2lkU3BhY2UubGFiZWxcIikpLFxuICAgICAgICAuLi50aGlzLmhvc3QuZ2FtZS50aW1lLnZvaWRzcGFjZVVwZ3JhZGVzXG4gICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0ubmFtZSBpbiB0aGlzLnNldHRpbmcuYnVpbGRpbmdzKVxuICAgICAgICAgIC5tYXAoYnVpbGRpbmcgPT5cbiAgICAgICAgICAgIHRoaXMuX2dldFJlc2V0T3B0aW9uKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYnVpbGRpbmdzW2J1aWxkaW5nLm5hbWUgYXMgVGltZUl0ZW1dLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICBidWlsZGluZy5sYWJlbCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgIF0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZXNldE9wdGlvbihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIG9wdGlvbjogU2V0dGluZ1RyaWdnZXIsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIHNlY3Rpb25TZXR0aW5nOiBSZXNldFRpbWVTZXR0aW5ncyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGRlbGltaXRlciA9IGZhbHNlLFxuICAgIHVwZ3JhZGVJbmRpY2F0b3IgPSBmYWxzZSxcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgb3B0aW9uLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiYgb3B0aW9uLmVuYWJsZWQgJiYgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgfSxcbiAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5wcm9tcHQuYWJzb2x1dGVcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmluYWN0aXZlXCIpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnJlc2V0LnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyID0gLTE7XG4gICAgICAgICAgb3B0aW9uLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24udHJpZ2dlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICAgIHVwZ3JhZGVJbmRpY2F0b3IsXG4gICAgfSk7XG4gICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIi4uL2ltYWdlcy9JY29ucy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNldFVwZ3JhZGVTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9SZXNldFVwZ3JhZGVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nLCBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4vY29tcG9uZW50cy9Db250YWluZXIuanNcIjtcbmltcG9ydCBzdHlsZXNEZWxpbWl0ZXIgZnJvbSBcIi4vY29tcG9uZW50cy9EZWxpbWl0ZXIubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgSWNvblNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL0ljb25TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRVcGdyYWRlc1NldHRpbmdzVWkgZXh0ZW5kcyBJY29uU2V0dGluZ3NQYW5lbDxSZXNldFVwZ3JhZGVTZXR0aW5ncz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBSZXNldFVwZ3JhZGVTZXR0aW5ncyxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICkge1xuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS51cGdyYWRlc1wiKTtcbiAgICBzdXBlcihwYXJlbnQsIGxhYmVsLCBzZXR0aW5ncywge1xuICAgICAgaWNvbjogSWNvbnMuV29ya3Nob3AsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pO1xuXG4gICAgY29uc3QgdXBncmFkZXMgPSB0aGlzLmhvc3QuZ2FtZS53b3Jrc2hvcC51cGdyYWRlcy5maWx0ZXIoXG4gICAgICB1cGdyYWRlID0+ICFpc05pbCh0aGlzLnNldHRpbmcudXBncmFkZXNbdXBncmFkZS5uYW1lXSksXG4gICAgKTtcblxuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgbGV0IGxhc3RMYWJlbCA9IHVwZ3JhZGVzWzBdLmxhYmVsO1xuICAgIGxldCBsYXN0RWxlbWVudDogU2V0dGluZ0xpc3RJdGVtIHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgdXBncmFkZSBvZiB1cGdyYWRlcy5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5sYWJlbC5sb2NhbGVDb21wYXJlKGIubGFiZWwsIGxvY2FsZS5zZWxlY3RlZCksXG4gICAgKSkge1xuICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5zZXR0aW5nLnVwZ3JhZGVzW3VwZ3JhZGUubmFtZV07XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9nZXRSZXNldE9wdGlvbih0aGlzLCBvcHRpb24sIHVwZ3JhZGUubGFiZWwpO1xuXG4gICAgICBpZiAodGhpcy5ob3N0LmVuZ2luZS5sb2NhbGVTdXBwb3J0c0ZpcnN0TGV0dGVyU3BsaXRzKGxvY2FsZS5zZWxlY3RlZCkpIHtcbiAgICAgICAgaWYgKGxhc3RMYWJlbFswXSAhPT0gdXBncmFkZS5sYWJlbFswXSkge1xuICAgICAgICAgIGlmICghaXNOaWwobGFzdEVsZW1lbnQpKSB7XG4gICAgICAgICAgICBsYXN0RWxlbWVudC5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0RlbGltaXRlci5kZWxpbWl0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbGVtZW50LmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzTGFiZWxMaXN0SXRlbS5zcGxpdHRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgaXRlbXMucHVzaChlbGVtZW50KTtcblxuICAgICAgbGFzdExhYmVsID0gdXBncmFkZS5sYWJlbDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChuZXcgU2V0dGluZ3NMaXN0KHRoaXMpLmFkZENoaWxkcmVuKGl0ZW1zKSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZXNldE9wdGlvbihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIG9wdGlvbjogU2V0dGluZyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGRlbGltaXRlciA9IGZhbHNlLFxuICAgIHVwZ3JhZGVJbmRpY2F0b3IgPSBmYWxzZSxcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBTZXR0aW5nTGlzdEl0ZW0ocGFyZW50LCBvcHRpb24sIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICAgIHVwZ3JhZGVJbmRpY2F0b3IsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNldFNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1Jlc2V0U2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHsgUmVzZXRCb25maXJlU2V0dGluZ3NVaSB9IGZyb20gXCIuL1Jlc2V0Qm9uZmlyZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFJlc2V0UmVsaWdpb25TZXR0aW5nc1VpIH0gZnJvbSBcIi4vUmVzZXRSZWxpZ2lvblNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFJlc2V0UmVzb3VyY2VzU2V0dGluZ3NVaSB9IGZyb20gXCIuL1Jlc2V0UmVzb3VyY2VzU2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHsgUmVzZXRTcGFjZVNldHRpbmdzVWkgfSBmcm9tIFwiLi9SZXNldFNwYWNlU2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHsgUmVzZXRUaW1lU2V0dGluZ3NVaSB9IGZyb20gXCIuL1Jlc2V0VGltZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFJlc2V0VXBncmFkZXNTZXR0aW5nc1VpIH0gZnJvbSBcIi4vUmVzZXRVcGdyYWRlc1NldHRpbmdzVWkuanNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc2V0U2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8UmVzZXRTZXR0aW5ncz4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9ib25maXJlVWk6IFJlc2V0Qm9uZmlyZVNldHRpbmdzVWk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlbGlnaW9uVWk6IFJlc2V0UmVsaWdpb25TZXR0aW5nc1VpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXNvdXJjZXNVaTogUmVzZXRSZXNvdXJjZXNTZXR0aW5nc1VpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zcGFjZVVpOiBSZXNldFNwYWNlU2V0dGluZ3NVaTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdGltZVVpOiBSZXNldFRpbWVTZXR0aW5nc1VpO1xuICBwcml2YXRlIHJlYWRvbmx5IF91cGdyYWRlc1VpOiBSZXNldFVwZ3JhZGVzU2V0dGluZ3NVaTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBSZXNldFNldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgKSB7XG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi50aW1lLnJlc2V0XCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pLFxuICAgICAge1xuICAgICAgICBvblJlZnJlc2hSZXF1ZXN0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgdGhpcy5fYm9uZmlyZVVpLFxuICAgICAgICAgICAgICB0aGlzLl9yZWxpZ2lvblVpLFxuICAgICAgICAgICAgICB0aGlzLl9yZXNvdXJjZXNVaSxcbiAgICAgICAgICAgICAgdGhpcy5fc3BhY2VVaSxcbiAgICAgICAgICAgICAgdGhpcy5fdGltZVVpLFxuICAgICAgICAgICAgICB0aGlzLl91cGdyYWRlc1VpLFxuICAgICAgICAgICAgXS5zb21lKF8gPT4gXy5leHBhbmRvLmluZWZmZWN0aXZlKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGxpc3QgPSBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgIGhhc0Rpc2FibGVBbGw6IGZhbHNlLFxuICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLl9ib25maXJlVWkgPSBuZXcgUmVzZXRCb25maXJlU2V0dGluZ3NVaSh0aGlzLCB0aGlzLnNldHRpbmcuYm9uZmlyZSwgbG9jYWxlKTtcbiAgICB0aGlzLl9yZWxpZ2lvblVpID0gbmV3IFJlc2V0UmVsaWdpb25TZXR0aW5nc1VpKHRoaXMsIHRoaXMuc2V0dGluZy5yZWxpZ2lvbiwgbG9jYWxlKTtcbiAgICB0aGlzLl9yZXNvdXJjZXNVaSA9IG5ldyBSZXNldFJlc291cmNlc1NldHRpbmdzVWkodGhpcywgdGhpcy5zZXR0aW5nLnJlc291cmNlcywgbG9jYWxlKTtcbiAgICB0aGlzLl9zcGFjZVVpID0gbmV3IFJlc2V0U3BhY2VTZXR0aW5nc1VpKHRoaXMsIHRoaXMuc2V0dGluZy5zcGFjZSwgbG9jYWxlKTtcbiAgICB0aGlzLl90aW1lVWkgPSBuZXcgUmVzZXRUaW1lU2V0dGluZ3NVaSh0aGlzLCB0aGlzLnNldHRpbmcudGltZSwgbG9jYWxlKTtcbiAgICB0aGlzLl91cGdyYWRlc1VpID0gbmV3IFJlc2V0VXBncmFkZXNTZXR0aW5nc1VpKHRoaXMsIHRoaXMuc2V0dGluZy51cGdyYWRlcywgbG9jYWxlKTtcblxuICAgIGxpc3QuYWRkQ2hpbGRyZW4oW1xuICAgICAgdGhpcy5fYm9uZmlyZVVpLFxuICAgICAgdGhpcy5fcmVsaWdpb25VaSxcbiAgICAgIHRoaXMuX3Jlc291cmNlc1VpLFxuICAgICAgdGhpcy5fc3BhY2VVaSxcbiAgICAgIHRoaXMuX3RpbWVVaSxcbiAgICAgIHRoaXMuX3VwZ3JhZGVzVWksXG4gICAgXSk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobGlzdCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU2V0dGluZyB9IGZyb20gXCIuLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDeWNsZSB9IGZyb20gXCIuLi8uLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vU2V0dGluZ0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QsIHR5cGUgU2V0dGluZ3NMaXN0T3B0aW9ucyB9IGZyb20gXCIuL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFNldHRpbmdXaXRoQ3ljbGVzID0gUmVjb3JkPEN5Y2xlLCBTZXR0aW5nPjtcblxuZXhwb3J0IHR5cGUgQ3ljbGVzTGlzdE9wdGlvbnMgPSBUaGlzVHlwZTxDeWNsZXNMaXN0PiAmXG4gIFNldHRpbmdzTGlzdE9wdGlvbnMgJiB7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBjeWNsZSBpcyBjaGVja2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBvbiB0aGUgY3ljbGUgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gc2V0dGluZyBUaGUgc2V0dGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGN5Y2xlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG9uQ2hlY2tDeWNsZT86IChsYWJlbDogc3RyaW5nLCBzZXR0aW5nOiBTZXR0aW5nLCBpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIGN5Y2xlIGlzIHVuY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgb24gdGhlIGN5Y2xlIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHNldHRpbmcgVGhlIHNldHRpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBjeWNsZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBvblVuQ2hlY2tDeWNsZT86IChsYWJlbDogc3RyaW5nLCBzZXR0aW5nOiBTZXR0aW5nLCBpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHZvaWQ7XG4gIH07XG5cbi8qKlxuICogQSBsaXN0IG9mIHNldHRpbmdzIGNvcnJlbGF0aW5nIHRvIHRoZSBwbGFuZXRhcnkgY3ljbGVzIGluIHRoZSBnYW1lLlxuICovXG5leHBvcnQgY2xhc3MgQ3ljbGVzTGlzdCBleHRlbmRzIFNldHRpbmdzTGlzdCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogQ3ljbGVzTGlzdE9wdGlvbnM7XG4gIHJlYWRvbmx5IHNldHRpbmc6IFNldHRpbmdXaXRoQ3ljbGVzO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgYFNlYXNvbnNMaXN0YC5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgQSByZWZlcmVuY2UgdG8gdGhlIGhvc3QuXG4gICAqIEBwYXJhbSBzZXR0aW5nIFRoZSBzZXR0aW5ncyB0aGF0IGNvcnJlbGF0ZSB0byB0aGlzIGxpc3QuXG4gICAqIEBwYXJhbSBiZWhhdmlvciBDb250cm9sIGN5Y2xlIGNoZWNrIGJveCBsb2cgb3V0cHV0XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoaXMgbGlzdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogVWlDb21wb25lbnQsIHNldHRpbmc6IFNldHRpbmdXaXRoQ3ljbGVzLCBvcHRpb25zPzogQ3ljbGVzTGlzdE9wdGlvbnMpIHtcbiAgICBzdXBlcihwYXJlbnQsIG9wdGlvbnMpO1xuICAgIHRoaXMuc2V0dGluZyA9IHNldHRpbmc7XG5cbiAgICBjb25zdCBtYWtlQ3ljbGUgPSAoY3ljbGU6IEN5Y2xlLCBzZXR0aW5nOiBTZXR0aW5nKSA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5sYWJlbEZvckN5Y2xlKGN5Y2xlKTtcbiAgICAgIHJldHVybiBuZXcgU2V0dGluZ0xpc3RJdGVtKHBhcmVudCwgc2V0dGluZywgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKGlzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIG9wdGlvbnM/Lm9uQ2hlY2tDeWNsZT8uKGxhYmVsLCBzZXR0aW5nLCBpc0JhdGNoUHJvY2Vzcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5DaGVjazogKGlzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIG9wdGlvbnM/Lm9uVW5DaGVja0N5Y2xlPy4obGFiZWwsIHNldHRpbmcsIGlzQmF0Y2hQcm9jZXNzKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBjeWNsZXMgPSBbXG4gICAgICBtYWtlQ3ljbGUoXCJjaGFyb25cIiwgdGhpcy5zZXR0aW5nLmNoYXJvbiksXG4gICAgICBtYWtlQ3ljbGUoXCJ1bWJyYVwiLCB0aGlzLnNldHRpbmcudW1icmEpLFxuICAgICAgbWFrZUN5Y2xlKFwieWFyblwiLCB0aGlzLnNldHRpbmcueWFybiksXG4gICAgICBtYWtlQ3ljbGUoXCJoZWxpb3NcIiwgdGhpcy5zZXR0aW5nLmhlbGlvcyksXG4gICAgICBtYWtlQ3ljbGUoXCJjYXRoXCIsIHRoaXMuc2V0dGluZy5jYXRoKSxcbiAgICAgIG1ha2VDeWNsZShcInJlZG1vb25cIiwgdGhpcy5zZXR0aW5nLnJlZG1vb24pLFxuICAgICAgbWFrZUN5Y2xlKFwiZHVuZVwiLCB0aGlzLnNldHRpbmcuZHVuZSksXG4gICAgICBtYWtlQ3ljbGUoXCJwaXNjaW5lXCIsIHRoaXMuc2V0dGluZy5waXNjaW5lKSxcbiAgICAgIG1ha2VDeWNsZShcInRlcm1pbnVzXCIsIHRoaXMuc2V0dGluZy50ZXJtaW51cyksXG4gICAgICBtYWtlQ3ljbGUoXCJrYWlyb1wiLCB0aGlzLnNldHRpbmcua2Fpcm8pLFxuICAgIF07XG4gICAgdGhpcy5hZGRDaGlsZHJlbihjeWNsZXMpO1xuXG4gICAgdGhpcy5lbGVtZW50WzBdLmFkZEV2ZW50TGlzdGVuZXIoXCJlbmFibGVBbGxcIiwgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjeWNsZSBvZiBjeWNsZXMpIHtcbiAgICAgICAgY3ljbGUuY2hlY2sodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5lbGVtZW50WzBdLmFkZEV2ZW50TGlzdGVuZXIoXCJkaXNhYmxlQWxsXCIsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY3ljbGUgb2YgY3ljbGVzKSB7XG4gICAgICAgIGN5Y2xlLnVuY2hlY2sodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU2V0dGluZyB9IGZyb20gXCIuLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZWFzb24gfSBmcm9tIFwiLi4vLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSB9IGZyb20gXCIuL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0LCB0eXBlIFNldHRpbmdzTGlzdE9wdGlvbnMgfSBmcm9tIFwiLi9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBTZXR0aW5nV2l0aFNlYXNvbnMgPSBSZWNvcmQ8U2Vhc29uLCBTZXR0aW5nPjtcblxuZXhwb3J0IHR5cGUgU2Vhc29uc0xpc3RPcHRpb25zID0gVGhpc1R5cGU8U2Vhc29uc0xpc3Q+ICZcbiAgU2V0dGluZ3NMaXN0T3B0aW9ucyAmIHtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHNlYXNvbiBpcyBjaGVja2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBvbiB0aGUgc2Vhc29uIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHNldHRpbmcgVGhlIHNldHRpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWFzb24uXG4gICAgICovXG4gICAgcmVhZG9ubHkgb25DaGVja1NlYXNvbj86IChsYWJlbDogc3RyaW5nLCBzZXR0aW5nOiBTZXR0aW5nLCBpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHNlYXNvbiBpcyB1bmNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIG9uIHRoZSBzZWFzb24gZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gc2V0dGluZyBUaGUgc2V0dGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlYXNvbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBvblVuQ2hlY2tTZWFzb24/OiAobGFiZWw6IHN0cmluZywgc2V0dGluZzogU2V0dGluZywgaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB2b2lkO1xuICB9O1xuXG4vKipcbiAqIEEgbGlzdCBvZiA0IHNldHRpbmdzIGNvcnJlbGF0aW5nIHRvIHRoZSA0IHNlYXNvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFzb25zTGlzdCBleHRlbmRzIFNldHRpbmdzTGlzdCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogU2Vhc29uc0xpc3RPcHRpb25zO1xuICByZWFkb25seSBzZXR0aW5nOiBTZXR0aW5nV2l0aFNlYXNvbnM7XG5cbiAgcmVhZG9ubHkgc3ByaW5nOiBTZXR0aW5nTGlzdEl0ZW07XG4gIHJlYWRvbmx5IHN1bW1lcjogU2V0dGluZ0xpc3RJdGVtO1xuICByZWFkb25seSBhdXR1bW46IFNldHRpbmdMaXN0SXRlbTtcbiAgcmVhZG9ubHkgd2ludGVyOiBTZXR0aW5nTGlzdEl0ZW07XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgU2Vhc29uc0xpc3RgLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIHNldHRpbmcgVGhlIHNldHRpbmdzIHRoYXQgY29ycmVsYXRlIHRvIHRoaXMgbGlzdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhpcyBsaXN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBzZXR0aW5nOiBTZXR0aW5nV2l0aFNlYXNvbnMsIG9wdGlvbnM/OiBTZWFzb25zTGlzdE9wdGlvbnMpIHtcbiAgICBzdXBlcihwYXJlbnQsIG9wdGlvbnMpO1xuICAgIHRoaXMuc2V0dGluZyA9IHNldHRpbmc7XG5cbiAgICBjb25zdCBtYWtlU2Vhc29uID0gKGxhYmVsOiBzdHJpbmcsIHNldHRpbmc6IFNldHRpbmcpID0+IHtcbiAgICAgIHJldHVybiBuZXcgU2V0dGluZ0xpc3RJdGVtKHRoaXMsIHNldHRpbmcsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBvcHRpb25zPy5vbkNoZWNrU2Vhc29uPy4obGFiZWwsIHNldHRpbmcsIGlzQmF0Y2hQcm9jZXNzKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgb3B0aW9ucz8ub25VbkNoZWNrU2Vhc29uPy4obGFiZWwsIHNldHRpbmcsIGlzQmF0Y2hQcm9jZXNzKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aGlzLnNwcmluZyA9IG1ha2VTZWFzb24odGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJGNhbGVuZGFyLnNlYXNvbi5zcHJpbmdcIiksIHRoaXMuc2V0dGluZy5zcHJpbmcpO1xuICAgIHRoaXMuc3VtbWVyID0gbWFrZVNlYXNvbih0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkY2FsZW5kYXIuc2Vhc29uLnN1bW1lclwiKSwgdGhpcy5zZXR0aW5nLnN1bW1lcik7XG4gICAgdGhpcy5hdXR1bW4gPSBtYWtlU2Vhc29uKHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIiRjYWxlbmRhci5zZWFzb24uYXV0dW1uXCIpLCB0aGlzLnNldHRpbmcuYXV0dW1uKTtcbiAgICB0aGlzLndpbnRlciA9IG1ha2VTZWFzb24odGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJGNhbGVuZGFyLnNlYXNvbi53aW50ZXJcIiksIHRoaXMuc2V0dGluZy53aW50ZXIpO1xuXG4gICAgdGhpcy5hZGRDaGlsZHJlbihbdGhpcy5zcHJpbmcsIHRoaXMuc3VtbWVyLCB0aGlzLmF1dHVtbiwgdGhpcy53aW50ZXJdKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtTZWFzb25zTGlzdC5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUaW1lQ29udHJvbFNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1RpbWVDb250cm9sU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgVGltZVNraXBIZWF0U2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvVGltZVNraXBIZWF0U2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgVGltZVNraXBTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9UaW1lU2tpcFNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBDeWNsZXNMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9DeWNsZXNMaXN0LmpzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL1RpbWVTa2lwSGVhdFNldHRpbmdzVWkubW9kdWxlLmNzc1wiO1xuXG5leHBvcnQgY2xhc3MgVGltZVNraXBIZWF0U2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8XG4gIFRpbWVTa2lwSGVhdFNldHRpbmdzLFxuICBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtXG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogVGltZVNraXBIZWF0U2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIHNlY3Rpb25TZXR0aW5nOiBUaW1lU2tpcFNldHRpbmdzLFxuICAgIHNlY3Rpb25QYXJlbnRTZXR0aW5nOiBUaW1lQ29udHJvbFNldHRpbmdzLFxuICApIHtcbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLnRpbWUuYWN0aXZlSGVhdFRyYW5zZmVyXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbShwYXJlbnQsIHNldHRpbmdzLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYWN0aXZlSGVhdFRyYW5zZmVyLnByb21wdFwiKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5hY3RpdmVIZWF0VHJhbnNmZXIucHJvbXB0VGl0bGVcIiwgW1xuICAgICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYWN0aXZlSGVhdFRyYW5zZmVyLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgICAgc2V0dGluZ3MuYWN0aXZlSGVhdFRyYW5zZmVyU3RhdHVzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAge1xuICAgICAgICBvblJlZnJlc2hSZXF1ZXN0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXR0aW5nSXRlbS50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID0gIXNldHRpbmdzLmVuYWJsZWQ7XG4gICAgICAgICAgdGhpcy5zZXR0aW5nSXRlbS50cmlnZ2VyQnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNlY3Rpb25QYXJlbnRTZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuXG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNlY3Rpb25QYXJlbnRTZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgICFPYmplY3QudmFsdWVzKHNldHRpbmdzLmN5Y2xlcykuc29tZShjeWNsZSA9PiBjeWNsZS5lbmFibGVkKTtcblxuICAgICAgICAgIGlmIChzZXR0aW5ncy5hY3RpdmVIZWF0VHJhbnNmZXJTdGF0dXMuZW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkLmVsZW1lbnRMYWJlbC5hdHRyKFwiZGF0YS1rcy1hY3RpdmUtZnJvbVwiLCBcIuKXjlwiKTtcbiAgICAgICAgICAgIHRoaXMuaGVhZC5lbGVtZW50TGFiZWwuYXR0cihcImRhdGEta3MtYWN0aXZlLXRvXCIsIFwi4peOXCIpO1xuICAgICAgICAgICAgdGhpcy5oZWFkLmVsZW1lbnRMYWJlbC5hZGRDbGFzcyhzdHlsZXMuYWN0aXZlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oZWFkLmVsZW1lbnRMYWJlbC5yZW1vdmVDbGFzcyhzdHlsZXMuYWN0aXZlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChcbiAgICAgIG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICAgIH0pLmFkZENoaWxkcmVuKFtcbiAgICAgICAgbmV3IEN5Y2xlc0xpc3QodGhpcywgdGhpcy5zZXR0aW5nLmN5Y2xlcywge1xuICAgICAgICAgIG9uQ2hlY2tDeWNsZTogKGxhYmVsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0aW1lLmhlYXRUcmFuc2Zlci5jeWNsZS5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblVuQ2hlY2tDeWNsZTogKGxhYmVsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0aW1lLmhlYXRUcmFuc2Zlci5jeWNsZS5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgXSksXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCIuLi9pbWFnZXMvSWNvbnMuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgVGltZUNvbnRyb2xTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9UaW1lQ29udHJvbFNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFRpbWVTa2lwU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvVGltZVNraXBTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgdWNmaXJzdCB9IGZyb20gXCIuLi90b29scy9Gb3JtYXQuanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4vY29tcG9uZW50cy9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgQ29sbGFwc2libGVQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29sbGFwc2libGVQYW5lbC5qc1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4vY29tcG9uZW50cy9Db250YWluZXIuanNcIjtcbmltcG9ydCB7IEN5Y2xlc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL0N5Y2xlc0xpc3QuanNcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuL2NvbXBvbmVudHMvRGlhbG9nLmpzXCI7XG5pbXBvcnQgeyBMYWJlbExpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2Vhc29uc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NlYXNvbnNMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHN0eWxlc1NldHRpbmdMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTWF4VHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTWF4VHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcbmltcG9ydCB7IFRpbWVTa2lwSGVhdFNldHRpbmdzVWkgfSBmcm9tIFwiLi9UaW1lU2tpcEhlYXRTZXR0aW5nc1VpLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBUaW1lU2tpcFNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPFRpbWVTa2lwU2V0dGluZ3MsIFNldHRpbmdNYXhUcmlnZ2VyTGlzdEl0ZW0+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfY3ljbGVzOiBDb2xsYXBzaWJsZVBhbmVsO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZWFzb25zOiBDb2xsYXBzaWJsZVBhbmVsO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hY3RpdmVIZWF0VHJhbnNmZXJVSTogVGltZVNraXBIZWF0U2V0dGluZ3NVaTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBUaW1lU2tpcFNldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICBzZWN0aW9uU2V0dGluZzogVGltZUNvbnRyb2xTZXR0aW5ncyxcbiAgKSB7XG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi50aW1lLnNraXBcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nTWF4VHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxvY2FsZSwgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaE1heCgpIHtcbiAgICAgICAgICB0aGlzLm1heEJ1dHRvbi51cGRhdGVMYWJlbChwYXJlbnQuaG9zdC5yZW5kZXJBYnNvbHV0ZShzZXR0aW5ncy5tYXgpKTtcbiAgICAgICAgICB0aGlzLm1heEJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID1cbiAgICAgICAgICAgIHNldHRpbmdzLm1heCA8IDBcbiAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC50aW1lU2tpcC50aXRsZUluZmluaXRlXCIsIFtsYWJlbF0pXG4gICAgICAgICAgICAgIDogc2V0dGluZ3MubWF4ID09PSAwXG4gICAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC50aW1lU2tpcC50aXRsZVplcm9cIiwgW2xhYmVsXSlcbiAgICAgICAgICAgICAgICA6IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LnRpbWVTa2lwLnRpdGxlXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUoc2V0dGluZ3MubWF4KSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoVHJpZ2dlcigpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJCdXR0b24uZWxlbWVudFswXS50aXRsZSA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlclwiLCBbXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluYWN0aXZlXCIpXG4gICAgICAgICAgICAgIDogYCR7cGFyZW50Lmhvc3QucmVuZGVyRmxvYXQoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkKX0gVENgLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldE1heDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LnRpbWVTa2lwLnByb21wdFwiKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LnRpbWVTa2lwLnByb21wdFRpdGxlXCIsIFtcbiAgICAgICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUoc2V0dGluZ3MubWF4LCBsb2NhbGUuc2VsZWN0ZWQpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJBYnNvbHV0ZShzZXR0aW5ncy5tYXgpLFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5tYXgudGltZVNraXAucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgc2V0dGluZ3MubWF4ID0gLTE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSBcIjBcIikge1xuICAgICAgICAgICAgc2V0dGluZ3MuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNldHRpbmdzLm1heCA9IHBhcmVudC5ob3N0LnBhcnNlQWJzb2x1dGUodmFsdWUpID8/IHNldHRpbmdzLm1heDtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgcGFyZW50LFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnRpbWVTa2lwLnByb21wdFwiKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci50aW1lU2tpcC5wcm9tcHRUaXRsZVwiLCBbXG4gICAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKHNldHRpbmdzLnRyaWdnZXIpLFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnRpbWVTa2lwLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VBYnNvbHV0ZSh2YWx1ZSkgPz8gc2V0dGluZ3MudHJpZ2dlcjtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0ubWF4QnV0dG9uLmluYWN0aXZlID0gIXNldHRpbmdzLmVuYWJsZWQgfHwgc2V0dGluZ3MubWF4ID09PSAtMTtcbiAgICAgICAgICB0aGlzLnNldHRpbmdJdGVtLnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhc2V0dGluZ3MuZW5hYmxlZCB8fCBzZXR0aW5ncy50cmlnZ2VyID09PSAtMTtcblxuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0ubWF4QnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiYgc2V0dGluZ3MuZW5hYmxlZCAmJiBzZXR0aW5ncy5tYXggPT09IDA7XG5cbiAgICAgICAgICB0aGlzLl9jeWNsZXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICAhT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5jeWNsZXMpLnNvbWUoY3ljbGUgPT4gY3ljbGUuZW5hYmxlZCk7XG4gICAgICAgICAgdGhpcy5fc2Vhc29ucy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgICFPYmplY3QudmFsdWVzKHNldHRpbmdzLnNlYXNvbnMpLnNvbWUoc2Vhc29uID0+IHNlYXNvbi5lbmFibGVkKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLnNldHRpbmdJdGVtLnRyaWdnZXJCdXR0b24uZWxlbWVudC5yZW1vdmVDbGFzcyhzdHlsZXNCdXR0b24ubGFzdEhlYWRBY3Rpb24pO1xuXG4gICAgdGhpcy5fY3ljbGVzID0gbmV3IENvbGxhcHNpYmxlUGFuZWwoXG4gICAgICB0aGlzLFxuICAgICAgbmV3IExhYmVsTGlzdEl0ZW0odGhpcywgdWNmaXJzdCh0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5jeWNsZXNcIikpLCB7XG4gICAgICAgIGNsYXNzZXM6IFtzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uY2hlY2tlZCwgc3R5bGVzU2V0dGluZ0xpc3RJdGVtLnNldHRpbmddLFxuICAgICAgICBpY29uOiBJY29ucy5DeWNsZXMsXG4gICAgICB9KS5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIodGhpcywgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pXSksXG4gICAgKS5hZGRDaGlsZHJlbkNvbnRlbnQoW1xuICAgICAgbmV3IEN5Y2xlc0xpc3QodGhpcywgdGhpcy5zZXR0aW5nLmN5Y2xlcywge1xuICAgICAgICBvbkNoZWNrQ3ljbGU6IChsYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInRpbWUuc2tpcC5jeWNsZS5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5DaGVja0N5Y2xlOiAobGFiZWw6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0aW1lLnNraXAuY3ljbGUuZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF0pO1xuICAgIHRoaXMuX3NlYXNvbnMgPSBuZXcgQ29sbGFwc2libGVQYW5lbChcbiAgICAgIHRoaXMsXG4gICAgICBuZXcgTGFiZWxMaXN0SXRlbSh0aGlzLCB1Y2ZpcnN0KHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInRyYWRlLnNlYXNvbnNcIikpLCB7XG4gICAgICAgIGNsYXNzZXM6IFtzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uY2hlY2tlZCwgc3R5bGVzU2V0dGluZ0xpc3RJdGVtLnNldHRpbmddLFxuICAgICAgICBpY29uOiBJY29ucy5TZWFzb25zLFxuICAgICAgfSkuYWRkQ2hpbGRyZW5IZWFkKFtuZXcgQ29udGFpbmVyKHRoaXMsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pLFxuICAgICkuYWRkQ2hpbGRyZW5Db250ZW50KFtcbiAgICAgIG5ldyBTZWFzb25zTGlzdCh0aGlzLCB0aGlzLnNldHRpbmcuc2Vhc29ucywge1xuICAgICAgICBvbkNoZWNrU2Vhc29uOiAobGFiZWw6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0aW1lLnNraXAuc2Vhc29uLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrU2Vhc29uOiAobGFiZWw6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0aW1lLnNraXAuc2Vhc29uLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICBdKTtcbiAgICB0aGlzLl9hY3RpdmVIZWF0VHJhbnNmZXJVSSA9IG5ldyBUaW1lU2tpcEhlYXRTZXR0aW5nc1VpKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuc2V0dGluZy5hY3RpdmVIZWF0VHJhbnNmZXIsXG4gICAgICBsb2NhbGUsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHNlY3Rpb25TZXR0aW5nLFxuICAgICk7XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChcbiAgICAgIG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICAgIH0pLmFkZENoaWxkcmVuKFtcbiAgICAgICAgdGhpcy5fY3ljbGVzLFxuICAgICAgICB0aGlzLl9zZWFzb25zLFxuICAgICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5zZXR0aW5nLmlnbm9yZU92ZXJoZWF0LFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi50aW1lLnNraXAuaWdub3JlT3ZlcmhlYXRcIiksXG4gICAgICAgICksXG4gICAgICAgIHRoaXMuX2FjdGl2ZUhlYXRUcmFuc2ZlclVJLFxuICAgICAgXSksXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFRpbWVDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvVGltZUNvbnRyb2xTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgc3R5bGVzQnV0dG9uIGZyb20gXCIuL2NvbXBvbmVudHMvQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcbmltcG9ydCB7IFJlc2V0U2V0dGluZ3NVaSB9IGZyb20gXCIuL1Jlc2V0U2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHsgVGltZVNraXBTZXR0aW5nc1VpIH0gZnJvbSBcIi4vVGltZVNraXBTZXR0aW5nc1VpLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBUaW1lQ29udHJvbFNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPFRpbWVDb250cm9sU2V0dGluZ3M+IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9pdGVtczogQXJyYXk8U2V0dGluZ0xpc3RJdGVtPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hY2NlbGVyYXRlVGltZTogU2V0dGluZ1RyaWdnZXJMaXN0SXRlbTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdGltZVNraXBVaTogVGltZVNraXBTZXR0aW5nc1VpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXNldFVpOiBSZXNldFNldHRpbmdzVWk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogVGltZUNvbnRyb2xTZXR0aW5ncyxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICkge1xuICAgIGNvbnNvbGUuZGVidWcoLi4uY2woYENvbnN0cnVjdGluZyAke1RpbWVDb250cm9sU2V0dGluZ3NVaS5uYW1lfWApKTtcblxuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50aW1lQ3RybFwiKTtcbiAgICBzdXBlcihcbiAgICAgIHBhcmVudCxcbiAgICAgIHNldHRpbmdzLFxuICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbShwYXJlbnQsIHNldHRpbmdzLCBsYWJlbCwge1xuICAgICAgICBvbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICB9KS5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSldKSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmIFt0aGlzLl90aW1lU2tpcFVpLCB0aGlzLl9yZXNldFVpXS5zb21lKF8gPT4gXy5leHBhbmRvLmluZWZmZWN0aXZlKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGxpc3QgPSBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgIGhhc0Rpc2FibGVBbGw6IGZhbHNlLFxuICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCBhY2NlbGVyYXRlTGFiZWwgPSB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uYWNjZWxlcmF0ZVwiKTtcbiAgICB0aGlzLl9hY2NlbGVyYXRlVGltZSA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuc2V0dGluZy5hY2NlbGVyYXRlVGltZSxcbiAgICAgIGxvY2FsZSxcbiAgICAgIGFjY2VsZXJhdGVMYWJlbCxcbiAgICAgIHtcbiAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbYWNjZWxlcmF0ZUxhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2FjY2VsZXJhdGVUaW1lLnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhdGhpcy5zZXR0aW5nLmFjY2VsZXJhdGVUaW1lLmVuYWJsZWQ7XG4gICAgICAgICAgdGhpcy5fYWNjZWxlcmF0ZVRpbWUudHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuZW5hYmxlZCAmJlxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmFjY2VsZXJhdGVUaW1lLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5hY2NlbGVyYXRlVGltZS50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYWNjZWxlcmF0ZVRpbWUucHJvbXB0XCIpLFxuICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5hY2NlbGVyYXRlVGltZS5wcm9tcHRUaXRsZVwiLCBbXG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5hY2NlbGVyYXRlVGltZS50cmlnZ2VyLFxuICAgICAgICAgICAgICAgIGxvY2FsZS5zZWxlY3RlZCxcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB0aGlzLmhvc3QucmVuZGVyUGVyY2VudGFnZSh0aGlzLnNldHRpbmcuYWNjZWxlcmF0ZVRpbWUudHJpZ2dlciksXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmFjY2VsZXJhdGVUaW1lLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnNldHRpbmcuYWNjZWxlcmF0ZVRpbWUudHJpZ2dlciA9IHRoaXMuaG9zdC5wYXJzZVBlcmNlbnRhZ2UodmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFthY2NlbGVyYXRlTGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLl9hY2NlbGVyYXRlVGltZS50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICB0aGlzLl90aW1lU2tpcFVpID0gbmV3IFRpbWVTa2lwU2V0dGluZ3NVaSh0aGlzLCB0aGlzLnNldHRpbmcudGltZVNraXAsIGxvY2FsZSwgc2V0dGluZ3MpO1xuICAgIHRoaXMuX3Jlc2V0VWkgPSBuZXcgUmVzZXRTZXR0aW5nc1VpKHRoaXMsIHRoaXMuc2V0dGluZy5yZXNldCwgbG9jYWxlKTtcblxuICAgIHRoaXMuX2l0ZW1zID0gW3RoaXMuX2FjY2VsZXJhdGVUaW1lLCB0aGlzLl90aW1lU2tpcFVpLCB0aGlzLl9yZXNldFVpXTtcblxuICAgIGxpc3QuYWRkQ2hpbGRyZW4odGhpcy5faXRlbXMpO1xuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KGxpc3QpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUaW1lSXRlbSwgVGltZVNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1RpbWVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgeyBCdWlsZFNlY3Rpb25Ub29scyB9IGZyb20gXCIuL0J1aWxkU2VjdGlvblRvb2xzLmpzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHsgSGVhZGVyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL0hlYWRlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBUaW1lU2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8VGltZVNldHRpbmdzLCBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IFRpbWVTZXR0aW5ncyxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICkge1xuICAgIGNvbnNvbGUuZGVidWcoLi4uY2woYENvbnN0cnVjdGluZyAke1RpbWVTZXR0aW5nc1VpLm5hbWV9YCkpO1xuXG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRpbWVcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxvY2FsZSwgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hUcmlnZ2VyKCkge1xuICAgICAgICAgIHRoaXMudHJpZ2dlckJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb25cIiwgW1xuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciA8IDBcbiAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmFjdGl2ZVwiKVxuICAgICAgICAgICAgICA6IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgcGFyZW50LFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21wdC5wZXJjZW50YWdlXCIpLFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0XCIsIFtcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgIT09IC0xXG4gICAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICA6IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuaW5maW5pdHlcIiksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgIT09IC0xID8gcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRFeHBsYWluZXJcIiksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gLTE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciA9IHBhcmVudC5ob3N0LnBhcnNlUGVyY2VudGFnZSh2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlLFxuICAgICAgfSksXG4gICAgICB7XG4gICAgICAgIG9uUmVmcmVzaFJlcXVlc3Q6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldHRpbmdJdGVtLnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhc2V0dGluZ3MuZW5hYmxlZCB8fCBzZXR0aW5ncy50cmlnZ2VyIDwgMDtcbiAgICAgICAgICB0aGlzLnNldHRpbmdJdGVtLnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgICAgc2V0dGluZ3MuZW5hYmxlZCAmJlxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciA8IDAgJiZcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoc2V0dGluZ3MuYnVpbGRpbmdzKS5zb21lKF8gPT4gXy5lbmFibGVkICYmIDAgPCBfLm1heCAmJiBfLnRyaWdnZXIgPCAwKTtcblxuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKHNldHRpbmdzLmJ1aWxkaW5ncykuc29tZShcbiAgICAgICAgICAgICAgXyA9PiBfLmVuYWJsZWQgJiYgKDAgPT09IF8ubWF4IHx8IChfLnRyaWdnZXIgPCAwICYmIHNldHRpbmdzLnRyaWdnZXIgPCAwKSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDaGlsZHJlbkNvbnRlbnQoW1xuICAgICAgbmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihbXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkd29ya3Nob3AuY2hyb25vZm9yZ2UubGFiZWxcIikpLFxuICAgICAgICAuLi50aGlzLmhvc3QuZ2FtZS50aW1lLmNocm9ub2ZvcmdlVXBncmFkZXNcbiAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSkpXG4gICAgICAgICAgLm1hcChidWlsZGluZyA9PlxuICAgICAgICAgICAgQnVpbGRTZWN0aW9uVG9vbHMuZ2V0QnVpbGRPcHRpb24oXG4gICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5idWlsZGluZ3NbYnVpbGRpbmcubmFtZV0sXG4gICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLFxuICAgICAgICAgICAgICBidWlsZGluZy5sYWJlbCxcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6IGJ1aWxkaW5nLm5hbWUgPT09IHRoaXMuaG9zdC5nYW1lLnRpbWUuY2hyb25vZm9yZ2VVcGdyYWRlcy5hdCgtMSk/Lm5hbWUsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFiZWxUcmlnZ2VyOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcblxuICAgICAgICBuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJHNjaWVuY2Uudm9pZFNwYWNlLmxhYmVsXCIpKSxcbiAgICAgICAgLi4udGhpcy5ob3N0LmdhbWUudGltZS52b2lkc3BhY2VVcGdyYWRlc1xuICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtLm5hbWUgaW4gdGhpcy5zZXR0aW5nLmJ1aWxkaW5ncylcbiAgICAgICAgICAubWFwKGJ1aWxkaW5nID0+XG4gICAgICAgICAgICBCdWlsZFNlY3Rpb25Ub29scy5nZXRCdWlsZE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tidWlsZGluZy5uYW1lIGFzIFRpbWVJdGVtXSxcbiAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICB0aGlzLnNldHRpbmcsXG4gICAgICAgICAgICAgIGJ1aWxkaW5nLmxhYmVsLFxuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgeyByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlIH0sXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICBdKSxcblxuICAgICAgbmV3IFNldHRpbmdzTGlzdCh0aGlzLCB7XG4gICAgICAgIGhhc0Rpc2FibGVBbGw6IGZhbHNlLFxuICAgICAgICBoYXNFbmFibGVBbGw6IGZhbHNlLFxuICAgICAgfSkuYWRkQ2hpbGRyZW4oW1xuICAgICAgICBuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkuYWRkaXRpb25hbFwiKSksXG4gICAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLnNldHRpbmcuZml4Q3J5b2NoYW1iZXJzLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5maXguY3J5XCIpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZml4LmNyeVwiKSxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5maXguY3J5XCIpLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgIF0pLFxuICAgIF0pO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi8uLi8uLi9FbmdpbmUuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ0J1eSwgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuLi9EaWFsb2cuanNcIjtcbmltcG9ydCB7IFRleHRCdXR0b24sIHR5cGUgVGV4dEJ1dHRvbk9wdGlvbnMgfSBmcm9tIFwiLi4vVGV4dEJ1dHRvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuLi9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9CdXlCdXR0b24ubW9kdWxlLmNzc1wiO1xuXG5leHBvcnQgdHlwZSBCdXlCdXR0b25PcHRpb25zID0gVGhpc1R5cGU8QnV5QnV0dG9uPiAmIFRleHRCdXR0b25PcHRpb25zO1xuXG5leHBvcnQgY2xhc3MgQnV5QnV0dG9uIGV4dGVuZHMgVGV4dEJ1dHRvbiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogQnV5QnV0dG9uT3B0aW9ucztcbiAgcmVhZG9ubHkgc2V0dGluZzogU2V0dGluZ0J1eTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFNldHRpbmdCdXksXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIG9wdGlvbnM/OiBCdXlCdXR0b25PcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihwYXJlbnQsIHVuZGVmaW5lZCwge1xuICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwiYmxhY2tjb2luLmJ1eS5wcm9tcHRcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJibGFja2NvaW4uYnV5LnByb21wdFRpdGxlXCIsIFtcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKHNldHRpbmcuYnV5LCBsb2NhbGUuc2VsZWN0ZWQpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKHNldHRpbmcuYnV5KSxcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcImJsYWNrY29pbi5idXkucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgc2V0dGluZy5idXkgPSAtMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXR0aW5nLmJ1eSA9IHBhcmVudC5ob3N0LnBhcnNlQWJzb2x1dGUodmFsdWUpID8/IHNldHRpbmcuYnV5O1xuICAgICAgfSxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICB0aGlzLmVsZW1lbnQucHJvcChcbiAgICAgICAgICBcInRpdGxlXCIsXG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiYmxhY2tjb2luLmJ1eS50aXRsZVwiLCBbXG4gICAgICAgICAgICB0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUodGhpcy5zZXR0aW5nLmJ1eSksXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZWxlbWVudC50ZXh0KFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcImJsYWNrY29pbi5idXlcIiwgW3RoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZSh0aGlzLnNldHRpbmcuYnV5KV0pLFxuICAgICAgICApO1xuXG4gICAgICAgIG9wdGlvbnM/Lm9uUmVmcmVzaD8uY2FsbCh0aGlzKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzLmJ1eUJ1dHRvbik7XG5cbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0J1eUJ1dHRvbi5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uLy4uLy4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucywgU2V0dGluZ1NlbGwgfSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuLi9EaWFsb2cuanNcIjtcbmltcG9ydCB7IFRleHRCdXR0b24sIHR5cGUgVGV4dEJ1dHRvbk9wdGlvbnMgfSBmcm9tIFwiLi4vVGV4dEJ1dHRvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuLi9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9TZWxsQnV0dG9uLm1vZHVsZS5jc3NcIjtcblxuZXhwb3J0IHR5cGUgU2VsbEJ1dHRvbk9wdGlvbnMgPSBUaGlzVHlwZTxTZWxsQnV0dG9uPiAmIFRleHRCdXR0b25PcHRpb25zO1xuXG5leHBvcnQgY2xhc3MgU2VsbEJ1dHRvbiBleHRlbmRzIFRleHRCdXR0b24ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IFNlbGxCdXR0b25PcHRpb25zO1xuICByZWFkb25seSBzZXR0aW5nOiBTZXR0aW5nU2VsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFNldHRpbmdTZWxsLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICBvcHRpb25zPzogU2VsbEJ1dHRvbk9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgdW5kZWZpbmVkLCB7XG4gICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJibGFja2NvaW4uc2VsbC5wcm9tcHRcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJibGFja2NvaW4uc2VsbC5wcm9tcHRUaXRsZVwiLCBbXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJBYnNvbHV0ZShzZXR0aW5nLnNlbGwsIGxvY2FsZS5zZWxlY3RlZCksXG4gICAgICAgICAgXSksXG4gICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUoc2V0dGluZy5zZWxsKSxcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcImJsYWNrY29pbi5zZWxsLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIHNldHRpbmcuc2VsbCA9IC0xO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldHRpbmcuc2VsbCA9IHBhcmVudC5ob3N0LnBhcnNlQWJzb2x1dGUodmFsdWUpID8/IHNldHRpbmcuc2VsbDtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnByb3AoXG4gICAgICAgICAgXCJ0aXRsZVwiLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcImJsYWNrY29pbi5zZWxsLnRpdGxlXCIsIFtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZSh0aGlzLnNldHRpbmcuc2VsbCksXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZWxlbWVudC50ZXh0KFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcImJsYWNrY29pbi5zZWxsXCIsIFt0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUodGhpcy5zZXR0aW5nLnNlbGwpXSksXG4gICAgICAgICk7XG5cbiAgICAgICAgb3B0aW9ucz8ub25SZWZyZXNoPy4oKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzLnNlbGxCdXR0b24pO1xuXG4gICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZztcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtTZWxsQnV0dG9uLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vLi4vLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdMaW1pdGVkIH0gZnJvbSBcIi4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBCdXR0b24sIHR5cGUgQnV0dG9uT3B0aW9ucyB9IGZyb20gXCIuLi9CdXR0b24uanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4uL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4uL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIExpbWl0ZWRCdXR0b25PcHRpb25zID0gVGhpc1R5cGU8TGltaXRlZEJ1dHRvbj4gJlxuICBCdXR0b25PcHRpb25zICYge1xuICAgIHJlYWRvbmx5IG9uTGltaXRlZENoZWNrPzogKCkgPT4gdm9pZDtcbiAgICByZWFkb25seSBvbkxpbWl0ZWRVbkNoZWNrPzogKCkgPT4gdm9pZDtcbiAgfTtcblxuZXhwb3J0IGNsYXNzIExpbWl0ZWRCdXR0b24gZXh0ZW5kcyBCdXR0b24ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IExpbWl0ZWRCdXR0b25PcHRpb25zO1xuICByZWFkb25seSBzZXR0aW5nOiBTZXR0aW5nTGltaXRlZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFNldHRpbmdMaW1pdGVkLFxuICAgIG9wdGlvbnM6IE9taXQ8TGltaXRlZEJ1dHRvbk9wdGlvbnMsIFwib25DbGlja1wiPixcbiAgKSB7XG4gICAgc3VwZXIocGFyZW50LCBcIlwiLCBJY29ucy5FY28sIHtcbiAgICAgIGJvcmRlcjogZmFsc2UsXG4gICAgICBjbGFzc2VzOiBbXSxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXR0aW5nLmxpbWl0ZWQgPSAhdGhpcy5zZXR0aW5nLmxpbWl0ZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5saW1pdGVkKSB7XG4gICAgICAgICAgb3B0aW9ucz8ub25MaW1pdGVkQ2hlY2s/LmNhbGwodGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9ucz8ub25MaW1pdGVkVW5DaGVjaz8uY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVRpdGxlKFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bih0aGlzLnNldHRpbmcubGltaXRlZCA/IFwidWkubGltaXRlZC5vblwiIDogXCJ1aS5saW1pdGVkLm9mZlwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmxpbWl0ZWQgJiYgIXRoaXMuaW5hY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzQnV0dG9uLmluYWN0aXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmluYWN0aXZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnM/Lm9uUmVmcmVzaD8uY2FsbCh0aGlzKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuXG4gICAgZm9yIChjb25zdCBjbGFzc05hbWUgb2Ygb3B0aW9ucz8uY2xhc3NlcyA/PyBbXSkge1xuICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0xpbWl0ZWRCdXR0b24ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNldHRpbmdMaW1pdGVkIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBMaW1pdGVkQnV0dG9uIH0gZnJvbSBcIi4vYnV0dG9ucy9MaW1pdGVkQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9Db250YWluZXIuanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtLCB0eXBlIFNldHRpbmdMaXN0SXRlbU9wdGlvbnMgfSBmcm9tIFwiLi9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBTZXR0aW5nTGltaXRlZExpc3RJdGVtT3B0aW9ucyA9IFRoaXNUeXBlPFNldHRpbmdMaW1pdGVkTGlzdEl0ZW0+ICZcbiAgU2V0dGluZ0xpc3RJdGVtT3B0aW9ucyAmIHtcbiAgICAvKipcbiAgICAgKiBJcyBjYWxsZWQgd2hlbiB0aGUgXCJMaW1pdGVkXCIgY2hlY2tib3ggaXMgY2hlY2tlZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBvbkxpbWl0ZWRDaGVjaz86ICgpID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBJcyBjYWxsZWQgd2hlbiB0aGUgXCJMaW1pdGVkXCIgY2hlY2tib3ggaXMgdW5jaGVja2VkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG9uTGltaXRlZFVuQ2hlY2s/OiAoKSA9PiB2b2lkO1xuICB9O1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ0xpbWl0ZWRMaXN0SXRlbSBleHRlbmRzIFNldHRpbmdMaXN0SXRlbSB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogU2V0dGluZ0xpbWl0ZWRMaXN0SXRlbU9wdGlvbnM7XG4gIHJlYWRvbmx5IGxpbWl0ZWRCdXR0b246IExpbWl0ZWRCdXR0b247XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFVJIGVsZW1lbnQgZm9yIGEgc2V0dGluZyB0aGF0IGNhbiBiZSBsaW1pdGVkLlxuICAgKiBUaGlzIHdpbGwgcmVzdWx0IGluIGFuIGVsZW1lbnQgd2l0aCBhIGNoZWNrYm94IHRoYXQgaGFzIGEgXCJMaW1pdGVkXCIgbGFiZWwuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IFRoZSB1c2Vyc2NyaXB0IGluc3RhbmNlLlxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIGZvciB0aGUgc2V0dGluZy5cbiAgICogQHBhcmFtIHNldHRpbmcgVGhlIHNldHRpbmcgbW9kZWwuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBsaXN0IGl0ZW0uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFNldHRpbmdMaW1pdGVkLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgb3B0aW9uczogU2V0dGluZ0xpbWl0ZWRMaXN0SXRlbU9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgc2V0dGluZywgbGFiZWwsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5saW1pdGVkQnV0dG9uID0gbmV3IExpbWl0ZWRCdXR0b24ocGFyZW50LCBzZXR0aW5nLCB7XG4gICAgICBib3JkZXI6IGZhbHNlLFxuICAgICAgb25MaW1pdGVkQ2hlY2s6IG9wdGlvbnM/Lm9uTGltaXRlZENoZWNrXG4gICAgICAgID8gKCkgPT4gb3B0aW9ucy5vbkxpbWl0ZWRDaGVjaz8uY2FsbCh0aGlzKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIG9uTGltaXRlZFVuQ2hlY2s6IG9wdGlvbnM/Lm9uTGltaXRlZFVuQ2hlY2tcbiAgICAgICAgPyAoKSA9PiBvcHRpb25zLm9uTGltaXRlZFVuQ2hlY2s/LmNhbGwodGhpcylcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy5hZGRDaGlsZHJlbkhlYWQoW1xuICAgICAgbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KSxcbiAgICAgIHRoaXMubGltaXRlZEJ1dHRvbixcbiAgICBdKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtTZXR0aW5nTGltaXRlZExpc3RJdGVtLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dOiAnJHt0aGlzLmVsZW1lbnRMYWJlbC50ZXh0KCl9J2A7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uLy4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nTGltaXRlZFRyaWdnZXIsIFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUcmlnZ2VyQnV0dG9uIH0gZnJvbSBcIi4vYnV0dG9ucy9UcmlnZ2VyQnV0dG9uLmpzXCI7XG5pbXBvcnQge1xuICBTZXR0aW5nTGltaXRlZExpc3RJdGVtLFxuICB0eXBlIFNldHRpbmdMaW1pdGVkTGlzdEl0ZW1PcHRpb25zLFxufSBmcm9tIFwiLi9TZXR0aW5nTGltaXRlZExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdMaXN0SXRlbU9wdGlvbnMgfSBmcm9tIFwiLi9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbU9wdGlvbnMgfSBmcm9tIFwiLi9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgU2V0dGluZ0xpbWl0ZWRUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zID0gU2V0dGluZ0xpc3RJdGVtT3B0aW9ucyAmXG4gIFNldHRpbmdMaW1pdGVkTGlzdEl0ZW1PcHRpb25zICZcbiAgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbU9wdGlvbnMgJlxuICBUaGlzVHlwZTxTZXR0aW5nTGltaXRlZFRyaWdnZXJMaXN0SXRlbT47XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nTGltaXRlZFRyaWdnZXJMaXN0SXRlbSBleHRlbmRzIFNldHRpbmdMaW1pdGVkTGlzdEl0ZW0ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IFNldHRpbmdMaW1pdGVkVHJpZ2dlckxpc3RJdGVtT3B0aW9ucztcbiAgcmVhZG9ubHkgdHJpZ2dlckJ1dHRvbjogVHJpZ2dlckJ1dHRvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFNldHRpbmdMaW1pdGVkVHJpZ2dlcixcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBTZXR0aW5nTGltaXRlZFRyaWdnZXJMaXN0SXRlbU9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgc2V0dGluZywgbGFiZWwsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy50cmlnZ2VyQnV0dG9uID0gbmV3IFRyaWdnZXJCdXR0b24ocGFyZW50LCBzZXR0aW5nLCBsb2NhbGUsIHtcbiAgICAgIGJvcmRlcjogZmFsc2UsXG4gICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMub25TZXRUcmlnZ2VyLmNhbGwodGhpcyk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoOiBvcHRpb25zPy5vblJlZnJlc2hUcmlnZ2VyID8gKCkgPT4gb3B0aW9ucy5vblJlZnJlc2hUcmlnZ2VyPy5jYWxsKHRoaXMpIDogdW5kZWZpbmVkLFxuICAgICAgcmVuZGVyTGFiZWw6IG9wdGlvbnM/LnJlbmRlckxhYmVsVHJpZ2dlciA/PyB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkQ2hpbGRIZWFkKHRoaXMudHJpZ2dlckJ1dHRvbik7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7U2V0dGluZ0xpbWl0ZWRUcmlnZ2VyTGlzdEl0ZW0ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV06ICcke3RoaXMuZWxlbWVudExhYmVsLnRleHQoKX0nYDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTZXR0aW5nTWF4IH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBNYXhCdXR0b24gfSBmcm9tIFwiLi9idXR0b25zL01heEJ1dHRvbi5qc1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4vQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSwgdHlwZSBTZXR0aW5nTGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vU2V0dGluZ0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgU2V0dGluZ01heExpc3RJdGVtT3B0aW9ucyA9IFRoaXNUeXBlPFNldHRpbmdNYXhMaXN0SXRlbT4gJlxuICBTZXR0aW5nTGlzdEl0ZW1PcHRpb25zICYge1xuICAgIHJlYWRvbmx5IG9uUmVmcmVzaE1heD86ICgpID0+IHZvaWQ7XG4gICAgcmVhZG9ubHkgb25TZXRNYXg6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICB9O1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ01heExpc3RJdGVtIGV4dGVuZHMgU2V0dGluZ0xpc3RJdGVtPFNldHRpbmdNYXg+IHtcbiAgZGVjbGFyZSByZWFkb25seSBvcHRpb25zOiBTZXR0aW5nTWF4TGlzdEl0ZW1PcHRpb25zO1xuICByZWFkb25seSBtYXhCdXR0b246IE1heEJ1dHRvbjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgVUkgZWxlbWVudCBmb3IgYSBzZXR0aW5nIHRoYXQgY2FuIGhhdmUgYSBtYXhpbXVtLlxuICAgKiBUaGlzIHdpbGwgcmVzdWx0IGluIGFuIGVsZW1lbnQgd2l0aCBhIGxhYmVsZWQgY2hlY2tib3ggYW5kIGEgXCJNYXhcIiBpbmRpY2F0b3IsXG4gICAqIHdoaWNoIGNvbnRyb2xzIHRoZSByZXNwZWN0aXZlIGBtYXhgIHByb3BlcnR5IGluIHRoZSBzZXR0aW5nIG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBUaGUgdXNlcnNjcmlwdCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBmb3IgdGhlIHNldHRpbmcuXG4gICAqIEBwYXJhbSBzZXR0aW5nIFRoZSBzZXR0aW5nIG1vZGVsLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgbGlzdCBpdGVtLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nOiBTZXR0aW5nTWF4LFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgb3B0aW9uczogU2V0dGluZ01heExpc3RJdGVtT3B0aW9ucyxcbiAgKSB7XG4gICAgc3VwZXIocGFyZW50LCBzZXR0aW5nLCBsYWJlbCwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLm1heEJ1dHRvbiA9IG5ldyBNYXhCdXR0b24ocGFyZW50LCBzZXR0aW5nLCB7XG4gICAgICBib3JkZXI6IGZhbHNlLFxuICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBvcHRpb25zLm9uU2V0TWF4LmNhbGwodGhpcyk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoOiBvcHRpb25zPy5vblJlZnJlc2hNYXggPyAoKSA9PiBvcHRpb25zLm9uUmVmcmVzaE1heD8uY2FsbCh0aGlzKSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICB0aGlzLmFkZENoaWxkcmVuSGVhZChbXG4gICAgICBuZXcgQ29udGFpbmVyKHBhcmVudCwgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pLFxuICAgICAgdGhpcy5tYXhCdXR0b24sXG4gICAgXSk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7U2V0dGluZ01heExpc3RJdGVtLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dOiAnJHt0aGlzLmVsZW1lbnRMYWJlbC50ZXh0KCl9J2A7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEVtYmFzc3lTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9FbWJhc3N5U2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ01heCwgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgVHJhZGVTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9UcmFkZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgc3R5bGVzQnV0dG9uIGZyb20gXCIuL2NvbXBvbmVudHMvQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuL2NvbXBvbmVudHMvRGlhbG9nLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTWF4TGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdNYXhMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBFbWJhc3N5U2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8RW1iYXNzeVNldHRpbmdzLCBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IEVtYmFzc3lTZXR0aW5ncyxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgc2VjdGlvblNldHRpbmc6IFRyYWRlU2V0dGluZ3MsXG4gICkge1xuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZW1iYXNzaWVzXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbShwYXJlbnQsIHNldHRpbmdzLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuZW1iYXNzaWVzLnByb21wdFwiKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5lbWJhc3NpZXMucHJvbXB0VGl0bGVcIiwgW1xuICAgICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuZW1iYXNzaWVzLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9IHNldHRpbmdzLmVuYWJsZWQgJiYgc2V0dGluZ3MudHJpZ2dlciA9PT0gLTE7XG5cbiAgICAgICAgICB0aGlzLmV4cGFuZG8uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgICAgc2VjdGlvblNldHRpbmcuZW5hYmxlZCAmJlxuICAgICAgICAgICAgc2V0dGluZ3MuZW5hYmxlZCAmJlxuICAgICAgICAgICAgIU9iamVjdC52YWx1ZXMoc2V0dGluZ3MucmFjZXMpLnNvbWUocmFjZSA9PiByYWNlLmVuYWJsZWQpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgbGlzdFJhY2VzID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihcbiAgICAgIHRoaXMuaG9zdC5nYW1lLmRpcGxvbWFjeS5yYWNlc1xuICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5uYW1lICE9PSBcImxldmlhdGhhbnNcIiAmJiAhaXNOaWwodGhpcy5zZXR0aW5nLnJhY2VzW2l0ZW0ubmFtZV0pKVxuICAgICAgICAubWFwKHJhY2UgPT5cbiAgICAgICAgICB0aGlzLl9tYWtlRW1iYXNzeVNldHRpbmcoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnJhY2VzW3JhY2UubmFtZV0sXG4gICAgICAgICAgICBsb2NhbGUuc2VsZWN0ZWQsXG4gICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgIHJhY2UudGl0bGUsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICApO1xuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KGxpc3RSYWNlcyk7XG4gIH1cblxuICBwcml2YXRlIF9tYWtlRW1iYXNzeVNldHRpbmcoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBvcHRpb246IFNldHRpbmdNYXgsXG4gICAgbG9jYWxlOiBTdXBwb3J0ZWRMb2NhbGUsXG4gICAgc2VjdGlvblNldHRpbmc6IEVtYmFzc3lTZXR0aW5ncyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCBvblNldE1heCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5wcm9tcHQuYWJzb2x1dGVcIiksXG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLm1heCwgbG9jYWxlKSxcbiAgICAgICAgXSksXG4gICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi5tYXgpLFxuICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5idWlsZC5wcm9tcHRFeHBsYWluZXJcIiksXG4gICAgICApO1xuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICBvcHRpb24ubWF4ID0gLTE7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID09PSBcIjBcIikge1xuICAgICAgICBvcHRpb24uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBvcHRpb24ubWF4ID0gcGFyZW50Lmhvc3QucGFyc2VBYnNvbHV0ZSh2YWx1ZSkgPz8gb3B0aW9uLm1heDtcbiAgICB9O1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nTWF4TGlzdEl0ZW0ocGFyZW50LCBvcHRpb24sIGxhYmVsLCB7XG4gICAgICBvbkNoZWNrOiAoaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICBpZiAob3B0aW9uLm1heCA9PT0gMCAmJiAhaXNCYXRjaFByb2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gb25TZXRNYXgoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICBlbGVtZW50Lm1heEJ1dHRvbi5pbmFjdGl2ZSA9ICFvcHRpb24uZW5hYmxlZCB8fCBvcHRpb24ubWF4ID09PSAtMTtcbiAgICAgICAgZWxlbWVudC5tYXhCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiYgb3B0aW9uLmVuYWJsZWQgJiYgb3B0aW9uLm1heCA9PT0gMDtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2hNYXg6ICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5tYXhCdXR0b24udXBkYXRlTGFiZWwocGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLm1heCkpO1xuICAgICAgICBlbGVtZW50Lm1heEJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID1cbiAgICAgICAgICBvcHRpb24ubWF4IDwgMFxuICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5lbWJhc3N5LnRpdGxlSW5maW5pdGVcIiwgW2xhYmVsXSlcbiAgICAgICAgICAgIDogb3B0aW9uLm1heCA9PT0gMFxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LmVtYmFzc3kudGl0bGVaZXJvXCIsIFtsYWJlbF0pXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5tYXguZW1iYXNzeS50aXRsZVwiLCBbXG4gICAgICAgICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJBYnNvbHV0ZShvcHRpb24ubWF4KSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgfSxcbiAgICAgIG9uU2V0TWF4LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZWxlbWVudC5tYXhCdXR0b24uZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNCdXR0b24ubGFzdEhlYWRBY3Rpb24pO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBTZXR0aW5nQnV5U2VsbFRocmVzaG9sZCxcbiAgU2V0dGluZ0xpbWl0ZWRUcmlnZ2VyLFxuICBTZXR0aW5nT3B0aW9ucyxcbiAgU2V0dGluZ1RyaWdnZXIsXG59IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUcmFkZVNldHRpbmdzLCBUcmFkZVNldHRpbmdzSXRlbSB9IGZyb20gXCIuLi9zZXR0aW5ncy9UcmFkZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyB1Y2ZpcnN0IH0gZnJvbSBcIi4uL3Rvb2xzL0Zvcm1hdC5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgeyBCdXlCdXR0b24gfSBmcm9tIFwiLi9jb21wb25lbnRzL2J1dHRvbnMtdGV4dC9CdXlCdXR0b24uanNcIjtcbmltcG9ydCB7IFNlbGxCdXR0b24gfSBmcm9tIFwiLi9jb21wb25lbnRzL2J1dHRvbnMtdGV4dC9TZWxsQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHsgSGVhZGVyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL0hlYWRlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZWFzb25zTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2Vhc29uc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdMaW1pdGVkVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGltaXRlZFRyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHsgRW1iYXNzeVNldHRpbmdzVWkgfSBmcm9tIFwiLi9FbWJhc3N5U2V0dGluZ3NVaS5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVHJhZGVTZXR0aW5nc1VpIGV4dGVuZHMgU2V0dGluZ3NQYW5lbDxUcmFkZVNldHRpbmdzLCBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPiB7XG4gIHByaXZhdGUgX3JhY2VQYW5lbHM6IEFycmF5PFNldHRpbmdzUGFuZWw8U2V0dGluZ0xpbWl0ZWRUcmlnZ2VyLCBTZXR0aW5nTGltaXRlZFRyaWdnZXJMaXN0SXRlbT4+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IFRyYWRlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtUcmFkZVNldHRpbmdzVWkubmFtZX1gKSk7XG5cbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJhZGVcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxvY2FsZSwgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaFRyaWdnZXIoKSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyQnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvblwiLCBbXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluYWN0aXZlXCIpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbmZpbml0eVwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMCAmJlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5yYWNlcykuc29tZShfID0+IF8uZW5hYmxlZCAmJiBfLnRyaWdnZXIgPCAwKTtcblxuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuX3JhY2VQYW5lbHMpLnNvbWUoXG4gICAgICAgICAgICAgIF8gPT4gXy5leHBhbmRvLmluZWZmZWN0aXZlIHx8IF8uc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLl9yYWNlUGFuZWxzID0gdGhpcy5ob3N0LmdhbWUuZGlwbG9tYWN5LnJhY2VzXG4gICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5yYWNlc1tpdGVtLm5hbWVdKSlcbiAgICAgIC5tYXAocmFjZSA9PlxuICAgICAgICB0aGlzLl9nZXRUcmFkZU9wdGlvbihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuc2V0dGluZy5yYWNlc1tyYWNlLm5hbWVdLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICByYWNlLnRpdGxlLFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIHJhY2UubmFtZSA9PT0gdGhpcy5ob3N0LmdhbWUuZGlwbG9tYWN5LnJhY2VzLmF0KC0yKT8ubmFtZSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgY29uc3QgbGlzdFJhY2VzID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzLCB7XG4gICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgIGhhc0VuYWJsZUFsbDogZmFsc2UsXG4gICAgfSkuYWRkQ2hpbGRyZW4odGhpcy5fcmFjZVBhbmVscyk7XG5cbiAgICBsaXN0UmFjZXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLnNldHRpbmcuZmVlZExldmlhdGhhbnMsXG4gICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5hdXRvZmVlZFwiKSxcbiAgICAgICAge1xuICAgICAgICAgIG9uQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbXG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5hdXRvZmVlZFwiKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmF1dG9mZWVkXCIpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGxpc3RSYWNlcy5hZGRDaGlsZChcbiAgICAgIG5ldyBTZXR0aW5nc1BhbmVsPFNldHRpbmdCdXlTZWxsVGhyZXNob2xkLCBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5zZXR0aW5nLnRyYWRlQmxhY2tjb2luLFxuICAgICAgICBuZXcgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuc2V0dGluZy50cmFkZUJsYWNrY29pbixcbiAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmNyeXB0b1wiKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmNyeXB0b1wiKSxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25SZWZyZXNoUmVxdWVzdCgpIHtcbiAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID0gIXRoaXMuc2V0dGluZy5lbmFibGVkIHx8IHRoaXMuc2V0dGluZy50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5jcnlwdG8ucHJvbXB0VGl0bGVcIiksXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5jcnlwdG8ucHJvbXB0XCIsIFtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZSh0aGlzLnNldHRpbmcudHJhZGVCbGFja2NvaW4udHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkKSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUodGhpcy5zZXR0aW5nLnRyYWRlQmxhY2tjb2luLnRyaWdnZXIpLFxuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuY3J5cHRvLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZy50cmFkZUJsYWNrY29pbi50cmlnZ2VyID1cbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QucGFyc2VBYnNvbHV0ZSh2YWx1ZSkgPz8gdGhpcy5zZXR0aW5nLnRyYWRlQmxhY2tjb2luLnRyaWdnZXI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5jcnlwdG9cIiksXG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKS5hZGRDaGlsZHJlbkNvbnRlbnQoW1xuICAgICAgICBuZXcgQnV5QnV0dG9uKHRoaXMsIHRoaXMuc2V0dGluZy50cmFkZUJsYWNrY29pbiwgbG9jYWxlKSxcbiAgICAgICAgbmV3IFNlbGxCdXR0b24odGhpcywgdGhpcy5zZXR0aW5nLnRyYWRlQmxhY2tjb2luLCBsb2NhbGUpLFxuICAgICAgXSksXG4gICAgKTtcbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChsaXN0UmFjZXMpO1xuXG4gICAgY29uc3QgbGlzdEFkZGl0aW9uID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzLCB7XG4gICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgIGhhc0VuYWJsZUFsbDogZmFsc2UsXG4gICAgfSk7XG4gICAgbGlzdEFkZGl0aW9uLmFkZENoaWxkKG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5hZGRpdGlvbmFsXCIpKSk7XG5cbiAgICBsaXN0QWRkaXRpb24uYWRkQ2hpbGQoXG4gICAgICBuZXcgRW1iYXNzeVNldHRpbmdzVWkodGhpcywgdGhpcy5zZXR0aW5nLmJ1aWxkRW1iYXNzaWVzLCBsb2NhbGUsIHNldHRpbmdzKSxcbiAgICApO1xuXG4gICAgbGlzdEFkZGl0aW9uLmFkZENoaWxkKFxuICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5zZXR0aW5nLnVubG9ja1JhY2VzLFxuICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS51cGdyYWRlLnJhY2VzXCIpLFxuICAgICAgICB7XG4gICAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudXBncmFkZS5yYWNlc1wiKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudXBncmFkZS5yYWNlc1wiKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobGlzdEFkZGl0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFRyYWRlT3B0aW9uKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgb3B0aW9uOiBUcmFkZVNldHRpbmdzSXRlbSxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgc2VjdGlvblNldHRpbmc6IFNldHRpbmdUcmlnZ2VyLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgc2VjdGlvbkxhYmVsOiBzdHJpbmcsXG4gICAgZGVsaW1pdGVyID0gZmFsc2UsXG4gICAgdXBncmFkZUluZGljYXRvciA9IGZhbHNlLFxuICApIHtcbiAgICBjb25zdCBlbGVtZW50ID0gbmV3IFNldHRpbmdMaW1pdGVkVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgb3B0aW9uLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICAgIG9uTGltaXRlZENoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInRyYWRlLmxpbWl0ZWRcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25MaW1pdGVkVW5DaGVjazogKCkgPT4ge1xuICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0cmFkZS51bmxpbWl0ZWRcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoVHJpZ2dlcjogKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uZWxlbWVudFswXS50aXRsZSA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlclwiLCBbXG4gICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPCAwXG4gICAgICAgICAgICA/IHNlY3Rpb25TZXR0aW5nLnRyaWdnZXIgPCAwXG4gICAgICAgICAgICAgID8gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24uYmxvY2tlZFwiLCBbc2VjdGlvbkxhYmVsXSlcbiAgICAgICAgICAgICAgOiBgJHtwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNlY3Rpb25TZXR0aW5nLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSl9ICgke3BhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluaGVyaXRlZFwiKX0pYFxuICAgICAgICAgICAgOiBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICBdKTtcbiAgICAgIH0sXG4gICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0XCIsIFtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgIT09IC0xXG4gICAgICAgICAgICAgID8gcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShvcHRpb24udHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICA6IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluaGVyaXRlZFwiKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgICBvcHRpb24udHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24udHJpZ2dlciA9IHBhcmVudC5ob3N0LnBhcnNlUGVyY2VudGFnZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgIH0sXG4gICAgICByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlLFxuICAgICAgdXBncmFkZUluZGljYXRvcixcbiAgICB9KTtcblxuICAgIGNvbnN0IHBhbmVsID0gbmV3IFNldHRpbmdzUGFuZWwocGFyZW50LCBvcHRpb24sIGVsZW1lbnQsIHtcbiAgICAgIG9uUmVmcmVzaFJlcXVlc3Q6ICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5saW1pdGVkQnV0dG9uLmluYWN0aXZlID0gIW9wdGlvbi5lbmFibGVkIHx8ICFvcHRpb24ubGltaXRlZDtcblxuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICBvcHRpb24uZW5hYmxlZCAmJlxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLnRyaWdnZXIgPT09IC0xICYmXG4gICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuXG4gICAgICAgIHBhbmVsLmV4cGFuZG8uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICBvcHRpb24uZW5hYmxlZCAmJlxuICAgICAgICAgICFvcHRpb24uc2Vhc29ucy5hdXR1bW4uZW5hYmxlZCAmJlxuICAgICAgICAgICFvcHRpb24uc2Vhc29ucy5zcHJpbmcuZW5hYmxlZCAmJlxuICAgICAgICAgICFvcHRpb24uc2Vhc29ucy5zdW1tZXIuZW5hYmxlZCAmJlxuICAgICAgICAgICFvcHRpb24uc2Vhc29ucy53aW50ZXIuZW5hYmxlZDtcbiAgICAgIH0sXG4gICAgfSkuYWRkQ2hpbGRDb250ZW50KFxuICAgICAgbmV3IFNlYXNvbnNMaXN0KHBhcmVudCwgb3B0aW9uLnNlYXNvbnMsIHtcbiAgICAgICAgb25DaGVja1NlYXNvbjogKGxhYmVsU2Vhc29uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0cmFkZS5zZWFzb24uZW5hYmxlXCIsIFt1Y2ZpcnN0KGxhYmVsKSwgbGFiZWxTZWFzb25dKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrU2Vhc29uOiAobGFiZWxTZWFzb246IHN0cmluZykgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInRyYWRlLnNlYXNvbi5kaXNhYmxlXCIsIFt1Y2ZpcnN0KGxhYmVsKSwgbGFiZWxTZWFzb25dKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gcGFuZWw7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdNYXgsIFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFZpbGxhZ2VTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9WaWxsYWdlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7IEhlYWRlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9IZWFkZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IE9wdGlvbnNMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvT3B0aW9uc0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ01heExpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTWF4TGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVmlsbGFnZVNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPFZpbGxhZ2VTZXR0aW5ncz4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9odW50OiBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtO1xuICBwcml2YXRlIHJlYWRvbmx5IF9mZXN0aXZhbHM6IFNldHRpbmdMaXN0SXRlbTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvbW90ZUtpdHRlbnM6IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW07XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb21vdGVMZWFkZXI6IFNldHRpbmdMaXN0SXRlbTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZWxlY3RMZWFkZXI6IFNldHRpbmdMaXN0SXRlbTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBWaWxsYWdlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtWaWxsYWdlU2V0dGluZ3NVaS5uYW1lfWApKTtcblxuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5kaXN0cmlidXRlXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pLFxuICAgICAge1xuICAgICAgICBvblJlZnJlc2hSZXF1ZXN0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiYgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5qb2JzKS5zb21lKF8gPT4gXy5lbmFibGVkICYmIDAgPT09IF8ubWF4KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGxpc3RKb2JzID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihcbiAgICAgIHRoaXMuaG9zdC5nYW1lLnZpbGxhZ2Uuam9ic1xuICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5qb2JzW2l0ZW0ubmFtZV0pKVxuICAgICAgICAubWFwKGpvYiA9PlxuICAgICAgICAgIHRoaXMuX2dldERpc3RyaWJ1dGVPcHRpb24oXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuam9ic1tqb2IubmFtZV0sXG4gICAgICAgICAgICBsb2NhbGUuc2VsZWN0ZWQsXG4gICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgIGpvYi50aXRsZSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobGlzdEpvYnMpO1xuXG4gICAgY29uc3QgbGlzdEFkZGl0aW9uID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzLCB7XG4gICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgIGhhc0VuYWJsZUFsbDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBsaXN0QWRkaXRpb24uYWRkQ2hpbGQobmV3IEhlYWRlckxpc3RJdGVtKHRoaXMsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLmFkZGl0aW9uYWxcIikpKTtcblxuICAgIHRoaXMuX2h1bnQgPSBuZXcgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbShcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLnNldHRpbmcuaHVudCxcbiAgICAgIGxvY2FsZSxcbiAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5odW50XCIpLFxuICAgICAge1xuICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFt0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uaHVudFwiKV0pO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hSZXF1ZXN0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faHVudC50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID0gIXRoaXMuc2V0dGluZy5odW50LmVuYWJsZWQ7XG4gICAgICAgICAgdGhpcy5faHVudC50cmlnZ2VyQnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5lbmFibGVkICYmIHRoaXMuc2V0dGluZy5odW50LmVuYWJsZWQgJiYgdGhpcy5zZXR0aW5nLmh1bnQudHJpZ2dlciA9PT0gLTE7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21wdC5wZXJjZW50YWdlXCIpLFxuICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5odW50LnByb21wdFwiLCBbXG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHRoaXMuc2V0dGluZy5odW50LnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHRoaXMuc2V0dGluZy5odW50LnRyaWdnZXIpLFxuICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5odW50LnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnNldHRpbmcuaHVudC50cmlnZ2VyID0gdGhpcy5ob3N0LnBhcnNlUGVyY2VudGFnZSh2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW3RoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5odW50XCIpXSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5faHVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICBsaXN0QWRkaXRpb24uYWRkQ2hpbGQodGhpcy5faHVudCk7XG5cbiAgICB0aGlzLl9mZXN0aXZhbHMgPSBuZXcgU2V0dGluZ0xpc3RJdGVtKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuc2V0dGluZy5ob2xkRmVzdGl2YWxzLFxuICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmZlc3RpdmFsXCIpLFxuICAgICAge1xuICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5mZXN0aXZhbFwiKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZmVzdGl2YWxcIiksXG4gICAgICAgICAgXSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgbGlzdEFkZGl0aW9uLmFkZENoaWxkKHRoaXMuX2Zlc3RpdmFscyk7XG5cbiAgICB0aGlzLl9wcm9tb3RlS2l0dGVucyA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuc2V0dGluZy5wcm9tb3RlS2l0dGVucyxcbiAgICAgIGxvY2FsZSxcbiAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5wcm9tb3Rla2l0dGVuc1wiKSxcbiAgICAgIHtcbiAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24ucHJvbW90ZWtpdHRlbnNcIiksXG4gICAgICAgICAgXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3Byb21vdGVLaXR0ZW5zLnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhdGhpcy5zZXR0aW5nLnByb21vdGVLaXR0ZW5zLmVuYWJsZWQ7XG4gICAgICAgICAgdGhpcy5fcHJvbW90ZUtpdHRlbnMudHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuZW5hYmxlZCAmJlxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnByb21vdGVLaXR0ZW5zLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5wcm9tb3RlS2l0dGVucy50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbW90ZUtpdHRlbnMucHJvbXB0VGl0bGVcIiksXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21vdGVLaXR0ZW5zLnByb21wdFwiLCBbXG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5wcm9tb3RlS2l0dGVucy50cmlnZ2VyLFxuICAgICAgICAgICAgICAgIGxvY2FsZS5zZWxlY3RlZCxcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB0aGlzLmhvc3QucmVuZGVyUGVyY2VudGFnZSh0aGlzLnNldHRpbmcucHJvbW90ZUtpdHRlbnMudHJpZ2dlciksXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21vdGVLaXR0ZW5zLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnNldHRpbmcucHJvbW90ZUtpdHRlbnMudHJpZ2dlciA9IHRoaXMuaG9zdC5wYXJzZVBlcmNlbnRhZ2UodmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5wcm9tb3Rla2l0dGVuc1wiKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLl9wcm9tb3RlS2l0dGVucy50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICBsaXN0QWRkaXRpb24uYWRkQ2hpbGQodGhpcy5fcHJvbW90ZUtpdHRlbnMpO1xuXG4gICAgdGhpcy5fcHJvbW90ZUxlYWRlciA9IG5ldyBTZXR0aW5nTGlzdEl0ZW0oXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5zZXR0aW5nLnByb21vdGVMZWFkZXIsXG4gICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24ucHJvbW90ZVwiKSxcbiAgICAgIHtcbiAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLnByb21vdGVcIildKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24ucHJvbW90ZVwiKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBsaXN0QWRkaXRpb24uYWRkQ2hpbGQodGhpcy5fcHJvbW90ZUxlYWRlcik7XG5cbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiB0aGlzLnNldHRpbmcuZWxlY3RMZWFkZXIuam9iLm9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb24udmFsdWUgPT09IFwiYW55XCIpIHtcbiAgICAgICAgb3B0aW9uLmxhYmVsID0gdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmVsZWN0LmpvYi5hbnlcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb24ubGFiZWwgPSB0aGlzLmhvc3QuZW5naW5lLmkxOG4oYCR2aWxsYWdlLmpvYi4ke29wdGlvbi52YWx1ZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiB0aGlzLnNldHRpbmcuZWxlY3RMZWFkZXIudHJhaXQub3B0aW9ucykge1xuICAgICAgb3B0aW9uLmxhYmVsID0gdGhpcy5ob3N0LmVuZ2luZS5pMThuKGAkdmlsbGFnZS50cmFpdC4ke29wdGlvbi52YWx1ZX1gKTtcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVjdExlYWRlciA9IG5ldyBTZXR0aW5nTGlzdEl0ZW0oXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5zZXR0aW5nLmVsZWN0TGVhZGVyLFxuICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmVsZWN0XCIpLFxuICAgICAge1xuICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFt0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZWxlY3RcIildKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmVsZWN0XCIpXSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICkuYWRkQ2hpbGRyZW4oW1xuICAgICAgbmV3IE9wdGlvbnNMaXN0SXRlbShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmVsZWN0LmpvYlwiKSxcbiAgICAgICAgdGhpcy5zZXR0aW5nLmVsZWN0TGVhZGVyLmpvYixcbiAgICAgICksXG4gICAgICBuZXcgT3B0aW9uc0xpc3RJdGVtKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZWxlY3QudHJhaXRcIiksXG4gICAgICAgIHRoaXMuc2V0dGluZy5lbGVjdExlYWRlci50cmFpdCxcbiAgICAgICksXG4gICAgXSk7XG4gICAgbGlzdEFkZGl0aW9uLmFkZENoaWxkKHRoaXMuX2VsZWN0TGVhZGVyKTtcblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KGxpc3RBZGRpdGlvbik7XG4gIH1cblxuICBwcml2YXRlIF9nZXREaXN0cmlidXRlT3B0aW9uKFxuICAgIG9wdGlvbjogU2V0dGluZ01heCxcbiAgICBsb2NhbGU6IFN1cHBvcnRlZExvY2FsZSxcbiAgICBzZWN0aW9uU2V0dGluZzogVmlsbGFnZVNldHRpbmdzLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgZGVsaW1pdGVyID0gZmFsc2UsXG4gICkge1xuICAgIGNvbnN0IG9uU2V0TWF4ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5tYXguZGlzdHJpYnV0ZS5wcm9tcHRcIiwgW2xhYmVsXSksXG4gICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5kaXN0cmlidXRlLnByb21wdFRpdGxlXCIsIFtcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICB0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLm1heCwgbG9jYWxlKSxcbiAgICAgICAgXSksXG4gICAgICAgIHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZShvcHRpb24ubWF4KSxcbiAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LmRpc3RyaWJ1dGUucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgKTtcblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgb3B0aW9uLm1heCA9IC0xO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gXCIwXCIpIHtcbiAgICAgICAgb3B0aW9uLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgb3B0aW9uLm1heCA9IHRoaXMuaG9zdC5wYXJzZUFic29sdXRlKHZhbHVlKSA/PyBvcHRpb24ubWF4O1xuICAgIH07XG5cbiAgICBjb25zdCBlbGVtZW50ID0gbmV3IFNldHRpbmdNYXhMaXN0SXRlbSh0aGlzLCBvcHRpb24sIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgaWYgKG9wdGlvbi5tYXggPT09IDAgJiYgIWlzQmF0Y2hQcm9jZXNzKSB7XG4gICAgICAgICAgcmV0dXJuIG9uU2V0TWF4KCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5tYXhCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLm1heCA9PT0gLTE7XG4gICAgICAgIGVsZW1lbnQubWF4QnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmIG9wdGlvbi5lbmFibGVkICYmIG9wdGlvbi5tYXggPT09IDA7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoTWF4OiAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQubWF4QnV0dG9uLnVwZGF0ZUxhYmVsKHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZShvcHRpb24ubWF4KSk7XG4gICAgICAgIGVsZW1lbnQubWF4QnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPVxuICAgICAgICAgIG9wdGlvbi5tYXggPCAwXG4gICAgICAgICAgICA/IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5kaXN0cmlidXRlLnRpdGxlSW5maW5pdGVcIiwgW2xhYmVsXSlcbiAgICAgICAgICAgIDogb3B0aW9uLm1heCA9PT0gMFxuICAgICAgICAgICAgICA/IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5kaXN0cmlidXRlLnRpdGxlWmVyb1wiLCBbbGFiZWxdKVxuICAgICAgICAgICAgICA6IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5kaXN0cmlidXRlLnRpdGxlXCIsIFtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZShvcHRpb24ubWF4KSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgfSxcbiAgICAgIG9uU2V0TWF4LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGVsZW1lbnQubWF4QnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENyYWZ0U2V0dGluZ3NJdGVtIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1dvcmtzaG9wU2V0dGluZ3MuanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4vQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IExpbWl0ZWRCdXR0b24gfSBmcm9tIFwiLi9idXR0b25zL0xpbWl0ZWRCdXR0b24uanNcIjtcbmltcG9ydCB7IE1heEJ1dHRvbiB9IGZyb20gXCIuL2J1dHRvbnMvTWF4QnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBUcmlnZ2VyQnV0dG9uIH0gZnJvbSBcIi4vYnV0dG9ucy9UcmlnZ2VyQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9Db250YWluZXIuanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHN0eWxlc0xpc3RJdGVtIGZyb20gXCIuL0xpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ0xpbWl0ZWRMaXN0SXRlbU9wdGlvbnMgfSBmcm9tIFwiLi9TZXR0aW5nTGltaXRlZExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0sIHR5cGUgU2V0dGluZ0xpc3RJdGVtT3B0aW9ucyB9IGZyb20gXCIuL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nTWF4TGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vU2V0dGluZ01heExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vU2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFdvcmtzaG9wQ3JhZnRMaXN0SXRlbU9wdGlvbnMgPSBTZXR0aW5nTGlzdEl0ZW1PcHRpb25zICZcbiAgU2V0dGluZ0xpbWl0ZWRMaXN0SXRlbU9wdGlvbnMgJlxuICBTZXR0aW5nTWF4TGlzdEl0ZW1PcHRpb25zICZcbiAgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbU9wdGlvbnMgJlxuICBUaGlzVHlwZTxXb3Jrc2hvcENyYWZ0TGlzdEl0ZW0+O1xuXG5leHBvcnQgY2xhc3MgV29ya3Nob3BDcmFmdExpc3RJdGVtIGV4dGVuZHMgU2V0dGluZ0xpc3RJdGVtPENyYWZ0U2V0dGluZ3NJdGVtPiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogV29ya3Nob3BDcmFmdExpc3RJdGVtT3B0aW9ucztcbiAgcmVhZG9ubHkgbGltaXRlZEJ1dHRvbjogTGltaXRlZEJ1dHRvbjtcbiAgcmVhZG9ubHkgbWF4QnV0dG9uOiBNYXhCdXR0b247XG4gIHJlYWRvbmx5IHRyaWdnZXJCdXR0b246IFRyaWdnZXJCdXR0b247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nOiBDcmFmdFNldHRpbmdzSXRlbSxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBXb3Jrc2hvcENyYWZ0TGlzdEl0ZW1PcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihwYXJlbnQsIHNldHRpbmcsIGxhYmVsLCBvcHRpb25zKTtcblxuICAgIHRoaXMubGltaXRlZEJ1dHRvbiA9IG5ldyBMaW1pdGVkQnV0dG9uKHBhcmVudCwgc2V0dGluZywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGNsYXNzZXM6IFtzdHlsZXNMaXN0SXRlbS5oZWFkQWN0aW9uXSxcbiAgICB9KTtcblxuICAgIHRoaXMubWF4QnV0dG9uID0gbmV3IE1heEJ1dHRvbihwYXJlbnQsIHNldHRpbmcsIHtcbiAgICAgIGFsaWdubWVudDogXCJyaWdodFwiLFxuICAgICAgYm9yZGVyOiBmYWxzZSxcbiAgICAgIGNsYXNzZXM6IFtzdHlsZXNCdXR0b24uaGVhZEFjdGlvbl0sXG4gICAgICBvbkNsaWNrOiAoKSA9PiBvcHRpb25zLm9uU2V0TWF4LmNhbGwodGhpcyksXG4gICAgICBvblJlZnJlc2g6IG9wdGlvbnM/Lm9uUmVmcmVzaE1heCA/ICgpID0+IG9wdGlvbnMub25SZWZyZXNoTWF4Py5jYWxsKHRoaXMpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgdGhpcy50cmlnZ2VyQnV0dG9uID0gbmV3IFRyaWdnZXJCdXR0b24ocGFyZW50LCBzZXR0aW5nLCBsb2NhbGUsIHtcbiAgICAgIGJvcmRlcjogZmFsc2UsXG4gICAgICBjbGFzc2VzOiBbc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uXSxcbiAgICAgIG9uQ2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5vblNldFRyaWdnZXIuY2FsbCh0aGlzKTtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2g6IG9wdGlvbnM/Lm9uUmVmcmVzaFRyaWdnZXIgPyAoKSA9PiBvcHRpb25zLm9uUmVmcmVzaFRyaWdnZXI/LmNhbGwodGhpcykgOiB1bmRlZmluZWQsXG4gICAgICByZW5kZXJMYWJlbDogb3B0aW9ucz8ucmVuZGVyTGFiZWxUcmlnZ2VyID8/IHRydWUsXG4gICAgfSk7XG4gICAgdGhpcy5hZGRDaGlsZHJlbkhlYWQoW1xuICAgICAgbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KSxcbiAgICAgIHRoaXMubGltaXRlZEJ1dHRvbixcbiAgICAgIHRoaXMubWF4QnV0dG9uLFxuICAgICAgdGhpcy50cmlnZ2VyQnV0dG9uLFxuICAgIF0pO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske1dvcmtzaG9wQ3JhZnRMaXN0SXRlbS5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVwZ3JhZGVTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9VcGdyYWRlU2V0dGluZ3MuanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4vY29tcG9uZW50cy9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHN0eWxlc0RlbGltaXRlciBmcm9tIFwiLi9jb21wb25lbnRzL0RlbGltaXRlci5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVXBncmFkZVNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPFVwZ3JhZGVTZXR0aW5ncywgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbT4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBVcGdyYWRlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudXBncmFkZS51cGdyYWRlc1wiKTtcbiAgICBzdXBlcihcbiAgICAgIHBhcmVudCxcbiAgICAgIHNldHRpbmdzLFxuICAgICAgbmV3IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0ocGFyZW50LCBzZXR0aW5ncywgbG9jYWxlLCBsYWJlbCwge1xuICAgICAgICBvbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoVHJpZ2dlcigpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJCdXR0b24uZWxlbWVudFswXS50aXRsZSA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlclwiLCBbXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID09PSAtMVxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluYWN0aXZlXCIpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbmZpbml0eVwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMCAmJlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy51cGdyYWRlcykuc29tZShfID0+IF8uZW5hYmxlZCAmJiBfLnRyaWdnZXIgPCAwKTtcblxuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmICFPYmplY3QudmFsdWVzKHNldHRpbmdzLnVwZ3JhZGVzKS5zb21lKF8gPT4gXy5lbmFibGVkKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZ3JhZGVzID0gdGhpcy5ob3N0LmdhbWUud29ya3Nob3AudXBncmFkZXMuZmlsdGVyKFxuICAgICAgdXBncmFkZSA9PiAhaXNOaWwodGhpcy5zZXR0aW5nLnVwZ3JhZGVzW3VwZ3JhZGUubmFtZV0pLFxuICAgICk7XG5cbiAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgIGxldCBsYXN0TGFiZWwgPSB1cGdyYWRlc1swXS5sYWJlbDtcbiAgICBsZXQgbGFzdEVsZW1lbnQ6IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCB1cGdyYWRlIG9mIHVwZ3JhZGVzLnNvcnQoKGEsIGIpID0+XG4gICAgICBhLmxhYmVsLmxvY2FsZUNvbXBhcmUoYi5sYWJlbCwgbG9jYWxlLnNlbGVjdGVkKSxcbiAgICApKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSB0aGlzLnNldHRpbmcudXBncmFkZXNbdXBncmFkZS5uYW1lXTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHRoaXMsIG9wdGlvbiwgbG9jYWxlLCB1cGdyYWRlLmxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5lbmFibGVcIiwgW3VwZ3JhZGUubGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFvcHRpb24uZW5hYmxlZCB8fCBvcHRpb24udHJpZ2dlciA9PT0gLTE7XG4gICAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiYgb3B0aW9uLmVuYWJsZWQgJiYgc2V0dGluZ3MudHJpZ2dlciA9PT0gLTEgJiYgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hUcmlnZ2VyOiAoKSA9PiB7XG4gICAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPSB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyXCIsIFtcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICA/IHNldHRpbmdzLnRyaWdnZXIgPCAwXG4gICAgICAgICAgICAgICAgPyB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLmJsb2NrZWRcIiwgW2xhYmVsXSlcbiAgICAgICAgICAgICAgICA6IGAke3RoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSl9ICgke3RoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmhlcml0ZWRcIil9KWBcbiAgICAgICAgICAgICAgOiB0aGlzLmhvc3QucmVuZGVyUGVyY2VudGFnZShvcHRpb24udHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0XCIsIFtcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICAgID8gdGhpcy5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uob3B0aW9uLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICA6IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmhlcml0ZWRcIiksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvcHRpb24udHJpZ2dlciA9IHRoaXMuaG9zdC5wYXJzZVBlcmNlbnRhZ2UodmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFt1cGdyYWRlLmxhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0J1dHRvbi5sYXN0SGVhZEFjdGlvbik7XG5cbiAgICAgIGlmICh0aGlzLmhvc3QuZW5naW5lLmxvY2FsZVN1cHBvcnRzRmlyc3RMZXR0ZXJTcGxpdHMobG9jYWxlLnNlbGVjdGVkKSkge1xuICAgICAgICBpZiAobGFzdExhYmVsWzBdICE9PSB1cGdyYWRlLmxhYmVsWzBdKSB7XG4gICAgICAgICAgaWYgKCFpc05pbChsYXN0RWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxhc3RFbGVtZW50LmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzRGVsaW1pdGVyLmRlbGltaXRlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnQuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNMYWJlbExpc3RJdGVtLnNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICBpdGVtcy5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICBsYXN0TGFiZWwgPSB1cGdyYWRlLmxhYmVsO1xuICAgIH1cblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KG5ldyBTZXR0aW5nc0xpc3QodGhpcykuYWRkQ2hpbGRyZW4oaXRlbXMpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IHR5cGUgQ3JhZnRTZXR0aW5nc0l0ZW0sIFdvcmtzaG9wU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvV29ya3Nob3BTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgdWNmaXJzdCB9IGZyb20gXCIuLi90b29scy9Gb3JtYXQuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUNyYWZ0YWJsZSB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcbmltcG9ydCB7IFdvcmtzaG9wQ3JhZnRMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvV29ya3Nob3BDcmFmdExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBVcGdyYWRlU2V0dGluZ3NVaSB9IGZyb20gXCIuL1VwZ3JhZGVTZXR0aW5nc1VpLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hvcFNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPFdvcmtzaG9wU2V0dGluZ3MsIFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfY3JhZnRzOiBBcnJheTxTZXR0aW5nTGlzdEl0ZW0+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IFdvcmtzaG9wU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtXb3Jrc2hvcFNldHRpbmdzVWkubmFtZX1gKSk7XG5cbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuY3JhZnRcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxvY2FsZSwgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaFRyaWdnZXIoKSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyQnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvblwiLCBbXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluYWN0aXZlXCIpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbmZpbml0eVwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMCAmJlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5yZXNvdXJjZXMpLnNvbWUoXyA9PiBfLmVuYWJsZWQgJiYgMCAhPT0gXy5tYXggJiYgXy50cmlnZ2VyIDwgMCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBsZXQgZXhjbHVkZUNyYWZ0c0FycmF5OiBBcnJheTxSZXNvdXJjZUNyYWZ0YWJsZT4gPSBbXTtcbiAgICBpZiAoIWdhbWUuY2hhbGxlbmdlcy5nZXRDaGFsbGVuZ2UoXCJpcm9uV2lsbFwiKS5hY3RpdmUpIHtcbiAgICAgIHRoaXMuc2V0dGluZy5yZXNvdXJjZXMuYmxvb2RzdG9uZS5lbmFibGVkID0gZmFsc2U7XG4gICAgICB0aGlzLnNldHRpbmcucmVzb3VyY2VzLnRNeXRocmlsLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIGV4Y2x1ZGVDcmFmdHNBcnJheSA9IFtcImJsb29kc3RvbmVcIiwgXCJ0TXl0aHJpbFwiXTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVwYXJlZENyYWZ0czogQXJyYXk8W0NyYWZ0U2V0dGluZ3NJdGVtLCBzdHJpbmddPiA9IHRoaXMuaG9zdC5nYW1lLndvcmtzaG9wLmNyYWZ0c1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgaXRlbSA9PlxuICAgICAgICAgICFleGNsdWRlQ3JhZnRzQXJyYXkuaW5jbHVkZXMoaXRlbS5uYW1lKSAmJiAhaXNOaWwodGhpcy5zZXR0aW5nLnJlc291cmNlc1tpdGVtLm5hbWVdKSxcbiAgICAgIClcbiAgICAgIC5tYXAocmVzb3VyY2UgPT4gW3RoaXMuc2V0dGluZy5yZXNvdXJjZXNbcmVzb3VyY2UubmFtZV0sIHVjZmlyc3QocmVzb3VyY2UubGFiZWwpXSk7XG5cbiAgICB0aGlzLl9jcmFmdHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtvcHRpb24sIGxhYmVsXSBvZiBwcmVwYXJlZENyYWZ0cykge1xuICAgICAgY29uc3Qgb25TZXRNYXggPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5jcmFmdC5wcm9tcHRcIiwgW2xhYmVsXSksXG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LmNyYWZ0LnByb21wdFRpdGxlXCIsIFtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgdGhpcy5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi5tYXgsIGxvY2FsZS5zZWxlY3RlZCksXG4gICAgICAgICAgXSksXG4gICAgICAgICAgdGhpcy5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi5tYXgpLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5jcmFmdC5wcm9tcHRFeHBsYWluZXJcIiksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBvcHRpb24ubWF4ID0gLTE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBcIjBcIikge1xuICAgICAgICAgIG9wdGlvbi5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24ubWF4ID0gdGhpcy5ob3N0LnBhcnNlQWJzb2x1dGUodmFsdWUpID8/IG9wdGlvbi5tYXg7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gbmV3IFdvcmtzaG9wQ3JhZnRMaXN0SXRlbSh0aGlzLCBvcHRpb24sIGxvY2FsZSwgbGFiZWwsIHtcbiAgICAgICAgZGVsaW1pdGVyOiBvcHRpb24ucmVzb3VyY2UgPT09IFwia2Vyb3NlbmVcIiB8fCBvcHRpb24ucmVzb3VyY2UgPT09IFwiYmx1ZXByaW50XCIsXG4gICAgICAgIG9uQ2hlY2s6IChpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgICAgaWYgKG9wdGlvbi5tYXggPT09IDAgJiYgIWlzQmF0Y2hQcm9jZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gb25TZXRNYXgoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uTGltaXRlZENoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcImNyYWZ0LmxpbWl0ZWRcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uTGltaXRlZFVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwiY3JhZnQudW5saW1pdGVkXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hNYXg6ICgpID0+IHtcbiAgICAgICAgICBlbGVtZW50Lm1heEJ1dHRvbi51cGRhdGVMYWJlbCh0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLm1heCkpO1xuICAgICAgICAgIGVsZW1lbnQubWF4QnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPVxuICAgICAgICAgICAgb3B0aW9uLm1heCA8IDBcbiAgICAgICAgICAgICAgPyB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5tYXguY3JhZnQudGl0bGVJbmZpbml0ZVwiLCBbbGFiZWxdKVxuICAgICAgICAgICAgICA6IG9wdGlvbi5tYXggPT09IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5jcmFmdC50aXRsZVplcm9cIiwgW2xhYmVsXSlcbiAgICAgICAgICAgICAgICA6IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5jcmFmdC50aXRsZVwiLCBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZShvcHRpb24ubWF4KSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQubGltaXRlZEJ1dHRvbi5pbmFjdGl2ZSA9ICFvcHRpb24uZW5hYmxlZCB8fCAhb3B0aW9uLmxpbWl0ZWQ7XG4gICAgICAgICAgZWxlbWVudC5tYXhCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLm1heCA9PT0gLTE7XG4gICAgICAgICAgZWxlbWVudC5tYXhCdXR0b24uaW5lZmZlY3RpdmUgPSBzZXR0aW5ncy5lbmFibGVkICYmIG9wdGlvbi5lbmFibGVkICYmIG9wdGlvbi5tYXggPT09IDA7XG4gICAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID0gIW9wdGlvbi5lbmFibGVkIHx8IG9wdGlvbi50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgICAgc2V0dGluZ3MuZW5hYmxlZCAmJiBvcHRpb24uZW5hYmxlZCAmJiBzZXR0aW5ncy50cmlnZ2VyID09PSAtMSAmJiBvcHRpb24udHJpZ2dlciA9PT0gLTE7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaFRyaWdnZXI6ICgpID0+IHtcbiAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uZWxlbWVudFswXS50aXRsZSA9IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXJcIiwgW1xuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPCAwXG4gICAgICAgICAgICAgID8gc2V0dGluZ3MudHJpZ2dlciA8IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYnVpbGQuYmxvY2tlZFwiLCBbbGFiZWxdKVxuICAgICAgICAgICAgICAgIDogYCR7dGhpcy5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKX0gKCR7dGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5idWlsZC5pbmhlcml0ZWRcIil9KWBcbiAgICAgICAgICAgICAgOiB0aGlzLmhvc3QucmVuZGVyUGVyY2VudGFnZShvcHRpb24udHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRNYXgsXG4gICAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21wdC5wZXJjZW50YWdlXCIpLFxuICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdFwiLCBbXG4gICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICBvcHRpb24udHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpXG4gICAgICAgICAgICAgICAgOiB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLmluaGVyaXRlZFwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgIT09IC0xID8gdGhpcy5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uob3B0aW9uLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYnVpbGQucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvcHRpb24udHJpZ2dlciA9IHRoaXMuaG9zdC5wYXJzZVBlcmNlbnRhZ2UodmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLl9jcmFmdHMucHVzaChlbGVtZW50KTtcblxuICAgICAgaWYgKG9wdGlvbi5yZXNvdXJjZSA9PT0gXCJzaGlwXCIpIHtcbiAgICAgICAgdGhpcy5fY3JhZnRzLnB1c2goXG4gICAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbShcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuc2hpcE92ZXJyaWRlLFxuICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLnNoaXBPdmVycmlkZVwiKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbXG4gICAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uc2hpcE92ZXJyaWRlXCIpLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5zaGlwT3ZlcnJpZGVcIiksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVwZ3JhZGVJbmRpY2F0b3I6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdENyYWZ0cyA9IG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgb25SZXNldDogKCkgPT4ge1xuICAgICAgICB0aGlzLnNldHRpbmcubG9hZCh7IHJlc291cmNlczogbmV3IFdvcmtzaG9wU2V0dGluZ3MoKS5yZXNvdXJjZXMgfSk7XG4gICAgICB9LFxuICAgIH0pLmFkZENoaWxkcmVuKHRoaXMuX2NyYWZ0cyk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobGlzdENyYWZ0cyk7XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChcbiAgICAgIG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICAgIH0pLmFkZENoaWxkcmVuKFtuZXcgVXBncmFkZVNldHRpbmdzVWkodGhpcywgdGhpcy5zZXR0aW5nLnVubG9ja1VwZ3JhZGVzLCBsb2NhbGUpXSksXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZm9ybWF0TWlsbGlzZWNvbmRzIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9mb3JtYXQvbWlsbGlzZWNvbmRzLmpzXCI7XG5pbXBvcnQgeyBtZWFzdXJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9tZWFzdXJlbWVudC9wZXJmb3JtYW5jZS5qc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtpdHRlblNjaWVudGlzdHMgfSBmcm9tIFwiLi4vS2l0dGVuU2NpZW50aXN0cy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgeyBVc2VyU2NyaXB0TG9hZGVyIH0gZnJvbSBcIi4uL1VzZXJTY3JpcHRMb2FkZXIuanNcIjtcbmltcG9ydCB7IEJvbmZpcmVTZXR0aW5nc1VpIH0gZnJvbSBcIi4vQm9uZmlyZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHsgRW5naW5lU2V0dGluZ3NVaSB9IGZyb20gXCIuL0VuZ2luZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IEludGVybmFsc1VpIH0gZnJvbSBcIi4vSW50ZXJuYWxzVWkuanNcIjtcbmltcG9ydCB7IExvZ0ZpbHRlcnNTZXR0aW5nc1VpIH0gZnJvbSBcIi4vTG9nRmlsdGVyU2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHsgUmVsaWdpb25TZXR0aW5nc1VpIH0gZnJvbSBcIi4vUmVsaWdpb25TZXR0aW5nc1VpLmpzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZXNTZXR0aW5nc1VpIH0gZnJvbSBcIi4vUmVzb3VyY2VzU2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHsgU2NpZW5jZVNldHRpbmdzVWkgfSBmcm9tIFwiLi9TY2llbmNlU2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHsgU3BhY2VTZXR0aW5nc1VpIH0gZnJvbSBcIi4vU3BhY2VTZXR0aW5nc1VpLmpzXCI7XG5pbXBvcnQgeyBTdGF0ZU1hbmFnZW1lbnRVaSB9IGZyb20gXCIuL1N0YXRlTWFuYWdlbWVudFVpLmpzXCI7XG5pbXBvcnQgeyBUaW1lQ29udHJvbFNldHRpbmdzVWkgfSBmcm9tIFwiLi9UaW1lQ29udHJvbFNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFRpbWVTZXR0aW5nc1VpIH0gZnJvbSBcIi4vVGltZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFRyYWRlU2V0dGluZ3NVaSB9IGZyb20gXCIuL1RyYWRlU2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9Vc2VySW50ZXJmYWNlLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFZpbGxhZ2VTZXR0aW5nc1VpIH0gZnJvbSBcIi4vVmlsbGFnZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFdvcmtzaG9wU2V0dGluZ3NVaSB9IGZyb20gXCIuL1dvcmtzaG9wU2V0dGluZ3NVaS5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVXNlckludGVyZmFjZSBleHRlbmRzIFVpQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgc2hvd0FjdGl2aXR5OiBKUXVlcnk7XG5cbiAgcHJpdmF0ZSBfZW5naW5lVWk6IEVuZ2luZVNldHRpbmdzVWk7XG4gIHByaXZhdGUgX3NlY3Rpb25zOiBBcnJheTxcbiAgICB8IEJvbmZpcmVTZXR0aW5nc1VpXG4gICAgfCBTcGFjZVNldHRpbmdzVWlcbiAgICB8IFdvcmtzaG9wU2V0dGluZ3NVaVxuICAgIHwgUmVzb3VyY2VzU2V0dGluZ3NVaVxuICAgIHwgU2NpZW5jZVNldHRpbmdzVWlcbiAgICB8IFRyYWRlU2V0dGluZ3NVaVxuICAgIHwgUmVsaWdpb25TZXR0aW5nc1VpXG4gICAgfCBUaW1lU2V0dGluZ3NVaVxuICAgIHwgVGltZUNvbnRyb2xTZXR0aW5nc1VpXG4gICAgfCBWaWxsYWdlU2V0dGluZ3NVaVxuICAgIHwgTG9nRmlsdGVyc1NldHRpbmdzVWlcbiAgICB8IFN0YXRlTWFuYWdlbWVudFVpXG4gICAgfCBJbnRlcm5hbHNVaVxuICA+O1xuICBzdGF0ZU1hbmFnZW1lbnRVaTogU3RhdGVNYW5hZ2VtZW50VWk7XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaFRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihob3N0OiBLaXR0ZW5TY2llbnRpc3RzKSB7XG4gICAgY29uc29sZS5kZWJ1ZyguLi5jbChgQ29uc3RydWN0aW5nICR7VXNlckludGVyZmFjZS5uYW1lfWApKTtcblxuICAgIHN1cGVyKHsgaG9zdCB9LCB7fSk7XG5cbiAgICBjb25zdCBlbmdpbmUgPSBob3N0LmVuZ2luZTtcbiAgICB0aGlzLl9lbmdpbmVVaSA9IG5ldyBFbmdpbmVTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS5zZXR0aW5ncyk7XG4gICAgdGhpcy5zdGF0ZU1hbmFnZW1lbnRVaSA9IG5ldyBTdGF0ZU1hbmFnZW1lbnRVaShcbiAgICAgIHRoaXMsXG4gICAgICBlbmdpbmUuc2V0dGluZ3Muc3RhdGVzLFxuICAgICAgZW5naW5lLnNldHRpbmdzLmxvY2FsZSxcbiAgICApO1xuICAgIHRoaXMuX3NlY3Rpb25zID0gW1xuICAgICAgbmV3IEJvbmZpcmVTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS5ib25maXJlTWFuYWdlci5zZXR0aW5ncywgZW5naW5lLnNldHRpbmdzLmxvY2FsZSksXG4gICAgICBuZXcgVmlsbGFnZVNldHRpbmdzVWkodGhpcywgZW5naW5lLnZpbGxhZ2VNYW5hZ2VyLnNldHRpbmdzLCBlbmdpbmUuc2V0dGluZ3MubG9jYWxlKSxcbiAgICAgIG5ldyBTY2llbmNlU2V0dGluZ3NVaSh0aGlzLCBlbmdpbmUuc2NpZW5jZU1hbmFnZXIuc2V0dGluZ3MsIGVuZ2luZS5zZXR0aW5ncy5sb2NhbGUpLFxuICAgICAgbmV3IFdvcmtzaG9wU2V0dGluZ3NVaSh0aGlzLCBlbmdpbmUud29ya3Nob3BNYW5hZ2VyLnNldHRpbmdzLCBlbmdpbmUuc2V0dGluZ3MubG9jYWxlKSxcbiAgICAgIG5ldyBSZXNvdXJjZXNTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS5zZXR0aW5ncy5yZXNvdXJjZXMsIGVuZ2luZS5zZXR0aW5ncy5sb2NhbGUpLFxuICAgICAgbmV3IFRyYWRlU2V0dGluZ3NVaSh0aGlzLCBlbmdpbmUudHJhZGVNYW5hZ2VyLnNldHRpbmdzLCBlbmdpbmUuc2V0dGluZ3MubG9jYWxlKSxcbiAgICAgIG5ldyBSZWxpZ2lvblNldHRpbmdzVWkodGhpcywgZW5naW5lLnJlbGlnaW9uTWFuYWdlci5zZXR0aW5ncywgZW5naW5lLnNldHRpbmdzLmxvY2FsZSksXG4gICAgICBuZXcgU3BhY2VTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS5zcGFjZU1hbmFnZXIuc2V0dGluZ3MsIGVuZ2luZS5zZXR0aW5ncy5sb2NhbGUpLFxuICAgICAgbmV3IFRpbWVTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS50aW1lTWFuYWdlci5zZXR0aW5ncywgZW5naW5lLnNldHRpbmdzLmxvY2FsZSksXG4gICAgICBuZXcgVGltZUNvbnRyb2xTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS50aW1lQ29udHJvbE1hbmFnZXIuc2V0dGluZ3MsIGVuZ2luZS5zZXR0aW5ncy5sb2NhbGUpLFxuICAgICAgbmV3IExvZ0ZpbHRlcnNTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS5zZXR0aW5ncy5maWx0ZXJzKSxcbiAgICAgIHRoaXMuc3RhdGVNYW5hZ2VtZW50VWksXG4gICAgICBuZXcgSW50ZXJuYWxzVWkodGhpcywgZW5naW5lLnNldHRpbmdzLCBlbmdpbmUuc2V0dGluZ3MubG9jYWxlKSxcbiAgICBdO1xuXG4gICAgdGhpcy5wYXJlbnQgPSB0aGlzO1xuICAgIHRoaXMuZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3MoXCJraXR0ZW4tc2NpZW50aXN0c1wiKS5hZGRDbGFzcyhzdHlsZXMudWkpO1xuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBbdGhpcy5fZW5naW5lVWksIC4uLnRoaXMuX3NlY3Rpb25zXSkge1xuICAgICAgdGhpcy5hZGRDaGlsZChzZWN0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zTGlzdEVsZW1lbnQgPSAkKFwiPHVsLz5cIik7XG4gICAgb3B0aW9uc0xpc3RFbGVtZW50LmFwcGVuZCh0aGlzLl9lbmdpbmVVaS5lbGVtZW50KTtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fc2VjdGlvbnMpIHtcbiAgICAgIG9wdGlvbnNMaXN0RWxlbWVudC5hcHBlbmQoc2VjdGlvbi5lbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZChvcHRpb25zTGlzdEVsZW1lbnQpO1xuXG4gICAgLy8gTWFrZSBfZW5naW5lVUkncyBleHBhbmRvIGJ1dHRvbiBoaWRlL3Nob3cgdGhlIG90aGVyIG9wdGlvbiBncm91cHNcbiAgICBjb25zdCBleHBhbmRvID0gdGhpcy5fZW5naW5lVWkuZXhwYW5kbztcbiAgICBsZXQgc2VjdGlvbnNWaXNpYmxlID0gZmFsc2U7XG4gICAgZXhwYW5kby5lbGVtZW50Lm9uKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgc2VjdGlvbnNWaXNpYmxlID0gIXNlY3Rpb25zVmlzaWJsZTtcbiAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLl9zZWN0aW9ucykge1xuICAgICAgICBzZWN0aW9uLnRvZ2dsZShzZWN0aW9uc1Zpc2libGUsIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gS2VlcCB0cmFjayBvZiBvcGVuIHBhbmVscyBhbmQgYWRqdXN0IHRoZSBzdGF0ZSBvZiB0aGVcbiAgICAvLyBleHBhbmRvIGFjY29yZGluZ2x5LlxuICAgIGxldCBwYW5lbHNPcGVuID0gMDtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fc2VjdGlvbnMpIHtcbiAgICAgIHNlY3Rpb24uZWxlbWVudFswXS5hZGRFdmVudExpc3RlbmVyKFwicGFuZWxIaWRkZW5cIiwgKCkgPT4ge1xuICAgICAgICAtLXBhbmVsc09wZW47XG4gICAgICAgIGlmIChwYW5lbHNPcGVuID09PSAwKSB7XG4gICAgICAgICAgc2VjdGlvbnNWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWN0aW9uc1Zpc2libGUpIHtcbiAgICAgICAgICBleHBhbmRvLnNldENvbGxhcHNlZCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHNlY3Rpb24uZWxlbWVudFswXS5hZGRFdmVudExpc3RlbmVyKFwicGFuZWxTaG93blwiLCAoKSA9PiB7XG4gICAgICAgICsrcGFuZWxzT3BlbjtcbiAgICAgICAgc2VjdGlvbnNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgZXhwYW5kby5zZXRFeHBhbmRlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIHRoZSBcInNob3cgYWN0aXZpdHkgc3VtbWFyeVwiIGFyZWEuXG4gICAgdGhpcy5zaG93QWN0aXZpdHkgPSAkKFwiPHNwYW4vPlwiLCB7XG4gICAgICBodG1sOiBgPHN2ZyBzdHlsZT1cIndpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjxwYXRoIGQ9XCIke0ljb25zLlN1bW1hcnl9XCIvPjwvc3ZnPmAsXG4gICAgICB0aXRsZTogaG9zdC5lbmdpbmUuaTE4bihcInN1bW1hcnkuc2hvd1wiKSxcbiAgICB9KS5hZGRDbGFzcyhzdHlsZXMuc2hvd0FjdGl2aXR5KTtcblxuICAgIHRoaXMuc2hvd0FjdGl2aXR5Lm9uKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgaG9zdC5lbmdpbmUuZGlzcGxheUFjdGl2aXR5U3VtbWFyeSgpO1xuICAgIH0pO1xuXG4gICAgJChcIiNjbGVhckxvZ1wiKS5wcmVwZW5kKHRoaXMuc2hvd0FjdGl2aXR5KTtcblxuICAgIC8vIEFkZCBLaXR0ZW4gU2NpZW50aXN0cyBhYm92ZSB0aGUgZ2FtZSBsb2cuXG5cbiAgICBjb25zdCB1c2luZ0tTQ29sdW1uID0gZW5naW5lLnNldHRpbmdzLmtzQ29sdW1uLmVuYWJsZWQgJiYgZ2FtZS5jb2xvclNjaGVtZSAhPT0gXCJzbGVla1wiO1xuICAgIGlmICh1c2luZ0tTQ29sdW1uKSB7XG4gICAgICAkKFwiI3JpZ2h0Q29sdW1uXCIpLmFmdGVyKFxuICAgICAgICBgPGRpdiBpZD1cImtzQ29sdW1uXCIgY2xhc3M9XCJjb2x1bW5cIj48c3BhbiBjbGFzcz1cIiR7c3R5bGVzLnNwYWNlcn1cIj48L3NwYW4+PC9kaXY+YCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQoXCIja3NDb2x1bW5cIikucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmlnaHQgPSAkKHVzaW5nS1NDb2x1bW4gPyBcIiNrc0NvbHVtblwiIDogXCIjcmlnaHRDb2x1bW5cIik7XG4gICAgaWYgKHJpZ2h0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gVHJ5IHRvIGZhbGwgYmFjayB0byBvcHRpb25zIHBhZ2UuXG4gICAgICBjb25zdCBvcHRpb25zUGFnZUNvbnRlbnQgPSAkKFwiI29wdGlvbnNQYWdlIC5mdWxsLXNjcmVlbi1wb3NpdGlvbiAucGFnZSAucGFnZS1jb250ZW50XCIpO1xuICAgICAgaWYgKG9wdGlvbnNQYWdlQ29udGVudC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc29sZS53YXJuKC4uLmNsKFwiVW5hYmxlIHRvIGZpbmQgcmlnaHQgY29sdW1uIHRvIGluamVjdCBVSSBpbnRvLiBSdW5uaW5nIGhlYWRsZXNzLlwiKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zUGFnZUNvbnRlbnQuYXBwZW5kKHRoaXMuZWxlbWVudCk7XG4gICAgICAgIHRoaXMuZWxlbWVudC5hdHRyKFwic3R5bGVcIiwgXCJib3JkZXItdG9wOjFweCBzb2xpZCBncmV5OyBwYWRkaW5nOjE1cHhcIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJpZ2h0LnByZXBlbmQodGhpcy5lbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5lbGVtZW50O1xuXG4gICAgdGhpcy5fbmVlZHNSZWZyZXNoID0gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7VXNlckludGVyZmFjZS5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl9yZWZyZXNoVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fcmVmcmVzaFRpbWVvdXQpO1xuICAgICAgdGhpcy5fcmVmcmVzaFRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuc2hvd0FjdGl2aXR5LnJlbW92ZSgpO1xuICAgIHRoaXMuZWxlbWVudC5yZW1vdmUoKTtcbiAgfVxuXG4gIHJlcXVlc3RSZWZyZXNoKF93aXRoQ2hpbGRyZW4gPSB0cnVlLCBkZXB0aCA9IDAsIF90cmFjZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX25lZWRzUmVmcmVzaCkge1xuICAgICAgaWYgKHRoaXMuX3JlZnJlc2hUaW1lb3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvciguLi5jbChcIlVzZXIgaW50ZXJmYWNlIGNsYWltcyB0byBoYXZlIGEgcmVmcmVzaCBwZW5kaW5nLCBidXQgdGhlcmUgaXNuJ3QuXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWZyZXNoVGltZW91dCA9IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgW18sIGR1cmF0aW9uXSA9IG1lYXN1cmUoKCkgPT4gdGhpcy5yZWZyZXNoKCkpO1xuICAgICAgY29uc29sZS5pbmZvKC4uLmNsKGBVSSByZWZyZXNoIHRvb2sgJHtmb3JtYXRNaWxsaXNlY29uZHMoZHVyYXRpb24pfS5gKSk7XG4gICAgICB0aGlzLl9yZWZyZXNoVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICB9LCAwKTtcblxuICAgIHN1cGVyLnJlcXVlc3RSZWZyZXNoKHRydWUsIGRlcHRoLCBmYWxzZSk7XG4gIH1cblxuICBmb3JjZUZ1bGxSZWZyZXNoKCk6IHZvaWQge1xuICAgIGNvbnNvbGUud2FybiguLi5jbChcIkZvcmNpbmcgcmVmcmVzaCBvbiBhbGwgdXNlciBpbnRlcmZhY2UgY29tcG9uZW50cy4uLlwiKSk7XG4gICAgdGhpcy5yZXF1ZXN0UmVmcmVzaCgpO1xuICAgIGNvbnNvbGUud2FybiguLi5jbChcIlJlZnJlc2ggb24gYWxsIHVzZXIgaW50ZXJmYWNlIGNvbXBvbmVudHMgZW5mb3JjZWQuXCIpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyByZWRpcmVjdEVycm9yc1RvQ29uc29sZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZXJyb3JzL2NvbnNvbGUuanNcIjtcbmltcG9ydCB7IEludmFsaWRPcGVyYXRpb25FcnJvciB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZXJyb3JzL0ludmFsaWRPcGVyYXRpb25FcnJvci5qc1wiO1xuaW1wb3J0IGd0IGZyb20gXCJzZW12ZXIvZnVuY3Rpb25zL2d0LmpzXCI7XG5pbXBvcnQgeyBFbmdpbmUsIHR5cGUgRW5naW5lU3RhdGUsIHR5cGUgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgeyBTY2llbmNlU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9TY2llbmNlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFNwYWNlU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9TcGFjZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBXb3Jrc2hvcFNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvV29ya3Nob3BTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB0eXBlIHsgUmVsZWFzZUNoYW5uZWwsIFJlbGVhc2VJbmZvU2NoZW1hIH0gZnJvbSBcIi4vdHlwZXMvX3JlbGVhc2VzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdhbWVQYWdlIH0gZnJvbSBcIi4vdHlwZXMvZ2FtZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJMThuRW5naW5lLCBMb2NhbGUgfSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgVXNlclNjcmlwdExvYWRlciB9IGZyb20gXCIuL1VzZXJTY3JpcHRMb2FkZXIuanNcIjtcbmltcG9ydCB7IFVzZXJJbnRlcmZhY2UgfSBmcm9tIFwiLi91aS9Vc2VySW50ZXJmYWNlLmpzXCI7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgY29uc3QgR006IHVua25vd247XG4gIGNvbnN0IFJFTEVBU0VfQ0hBTk5FTDogUmVsZWFzZUNoYW5uZWw7XG4gIGNvbnN0IFJFTEVBU0VfVkVSU0lPTjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY29uc3Qga3NWZXJzaW9uID0gKHByZWZpeCA9IFwiXCIpID0+IHtcbiAgaWYgKGlzTmlsKFJFTEVBU0VfVkVSU0lPTikpIHtcbiAgICB0aHJvdyBFcnJvcihcIkJ1aWxkIGVycm9yOiBSRUxFQVNFX1ZFUlNJT04gaXMgbm90IGRlZmluZWQuXCIpO1xuICB9XG5cbiAgcmV0dXJuIGAke3ByZWZpeH0ke1JFTEVBU0VfVkVSU0lPTn1gO1xufTtcblxuZXhwb3J0IGNsYXNzIEtpdHRlblNjaWVudGlzdHMge1xuICByZWFkb25seSBnYW1lOiBHYW1lUGFnZTtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiBpbiB0aGUgZ2FtZSB0aGF0IGFsbG93cyB0byByZXRyaWV2ZSB0cmFuc2xhdGVkIG1lc3NhZ2VzLlxuICAgKlxuICAgKiBJZGVhbGx5LCB5b3Ugc2hvdWxkIG5ldmVyIGFjY2VzcyB0aGlzIGRpcmVjdGx5IGFuZCBpbnN0ZWFkIHVzZSB0aGVcbiAgICogaTE4biBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgYEVuZ2luZWAuXG4gICAqL1xuICByZWFkb25seSBpMThuRW5naW5lOiBJMThuRW5naW5lO1xuXG4gIHByaXZhdGUgX3VzZXJJbnRlcmZhY2U6IFVzZXJJbnRlcmZhY2U7XG4gIGVuZ2luZTogRW5naW5lO1xuXG4gIHByaXZhdGUgX2dhbWVCZWZvcmVTYXZlSGFuZGxlOiBbXCJnYW1lL2JlZm9yZXNhdmVcIiwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfc2VydmVyTG9hZEhhbmRsZTogW1wic2VydmVyL2xvYWRcIiwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBnYW1lOiBHYW1lUGFnZSxcbiAgICBpMThuRW5naW5lOiBJMThuRW5naW5lLFxuICAgIGdhbWVMYW5ndWFnZTogTG9jYWxlID0gXCJlblwiLFxuICAgIGVuZ2luZVN0YXRlPzogRW5naW5lU3RhdGUsXG4gICkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIC4uLmNsKGBLaXR0ZW4gU2NpZW50aXN0cyAke2tzVmVyc2lvbihcInZcIil9IGNvbnN0cnVjdGVkLiBDaGVja2luZyBmb3IgcHJldmlvdXMgaW5zdGFuY2VzLi4uYCksXG4gICAgKTtcbiAgICBpZiAoXCJraXR0ZW5TY2llbnRpc3RzXCIgaW4gVXNlclNjcmlwdExvYWRlci53aW5kb3cpIHtcbiAgICAgIGNvbnNvbGUud2FybiguLi5jbChcIkRldGVjdGVkIGV4aXN0aW5nIEtTIGluc3RhbmNlLiBUcnlpbmcgdG8gdW5sb2FkIGl0Li4uXCIpKTtcbiAgICAgIFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmtpdHRlblNjaWVudGlzdHM/LnVubG9hZCgpO1xuICAgIH1cbiAgICBjb25zb2xlLmluZm8oLi4uY2woYFlvdSBhcmUgb24gdGhlICcke1N0cmluZyhSRUxFQVNFX0NIQU5ORUwpfScgcmVsZWFzZSBjaGFubmVsLmApKTtcblxuICAgIHRoaXMuZ2FtZSA9IGdhbWU7XG4gICAgdGhpcy5pMThuRW5naW5lID0gaTE4bkVuZ2luZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5lbmdpbmUgPSBuZXcgRW5naW5lKHRoaXMsIGdhbWVMYW5ndWFnZSk7XG4gICAgICB0aGlzLl91c2VySW50ZXJmYWNlID0gbmV3IFVzZXJJbnRlcmZhY2UodGhpcyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoLi4uY2woXCJGYWlsZWQgdG8gY29uc3RydWN0IGNvcmUgY29tcG9uZW50cy5cIiwgZXJyb3IpKTtcbiAgICAgIGlmICh0eXBlb2YgR00gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKC4uLmNsKFwiRGV0ZWN0ZWQgcnVubmluZyBpbiBHcmVhc2Vtb25rZXkuXCIpKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmICghaXNOaWwoZW5naW5lU3RhdGUpKSB7XG4gICAgICB0aGlzLnNldFNldHRpbmdzKGVuZ2luZVN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdXNlckludGVyZmFjZS5zdGF0ZU1hbmFnZW1lbnRVaS5sb2FkQXV0b1NhdmUoKTtcbiAgICB9XG4gIH1cblxuICByZWJ1aWxkVWkoKSB7XG4gICAgdGhpcy5fdXNlckludGVyZmFjZS5kZXN0cm95KCk7XG4gICAgdGhpcy5fdXNlckludGVyZmFjZSA9IG5ldyBVc2VySW50ZXJmYWNlKHRoaXMpO1xuICAgIHRoaXMuX3VzZXJJbnRlcmZhY2UuZm9yY2VGdWxsUmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc29tZSB2YWxpZGF0aW9ucyBhZ2FpbnN0IHRoZSBnYW1lIHRvIGRldGVybWluZSBpZiBpbnRlcm5hbCBjb250cm9sXG4gICAqIHN0cnVjdHVyZXMgc3RpbGwgbWF0Y2ggdXAgd2l0aCBleHBlY3RhdGlvbnMuXG4gICAqIElzc3VlcyBzaG91bGQgYmUgbG9nZ2VkIHRvIHRoZSBjb25zb2xlLlxuICAgKi9cbiAgdmFsaWRhdGVHYW1lKCkge1xuICAgIFNjaWVuY2VTZXR0aW5ncy52YWxpZGF0ZUdhbWUodGhpcy5nYW1lLCB0aGlzLmVuZ2luZS5zY2llbmNlTWFuYWdlci5zZXR0aW5ncyk7XG4gICAgU3BhY2VTZXR0aW5ncy52YWxpZGF0ZUdhbWUodGhpcy5nYW1lLCB0aGlzLmVuZ2luZS5zcGFjZU1hbmFnZXIuc2V0dGluZ3MpO1xuICAgIFdvcmtzaG9wU2V0dGluZ3MudmFsaWRhdGVHYW1lKHRoaXMuZ2FtZSwgdGhpcy5lbmdpbmUud29ya3Nob3BNYW5hZ2VyLnNldHRpbmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIEtpdHRlbiBTY2llbnRpc3RzIGZyb20gdGhlIGJyb3dzZXIuXG4gICAqL1xuICB1bmxvYWQoKTogdm9pZCB7XG4gICAgY29uc29sZS53YXJuKC4uLmNsKFwiVW5sb2FkaW5nIEtpdHRlbiBTY2llbnRpc3RzLi4uXCIpKTtcbiAgICB0aGlzLmVuZ2luZS5zdG9wKCk7XG4gICAgdGhpcy5fdXNlckludGVyZmFjZS5kZXN0cm95KCk7XG4gICAgJChcIiNrcy1zdHlsZXNcIikucmVtb3ZlKCk7XG4gICAgaWYgKHRoaXMuX2dhbWVCZWZvcmVTYXZlSGFuZGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8udW5zdWJzY3JpYmUodGhpcy5fZ2FtZUJlZm9yZVNhdmVIYW5kbGUpO1xuICAgICAgdGhpcy5fZ2FtZUJlZm9yZVNhdmVIYW5kbGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zZXJ2ZXJMb2FkSGFuZGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8udW5zdWJzY3JpYmUodGhpcy5fc2VydmVyTG9hZEhhbmRsZSk7XG4gICAgICB0aGlzLl9nYW1lQmVmb3JlU2F2ZUhhbmRsZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlckluZGV4ID0gdGhpcy5nYW1lLm1hbmFnZXJzLmluZGV4T2YodGhpcy5fc2F2ZU1hbmFnZXIpO1xuICAgIGlmICgtMSA8IG1hbmFnZXJJbmRleCkge1xuICAgICAgdGhpcy5nYW1lLm1hbmFnZXJzLnNwbGljZShtYW5hZ2VySW5kZXgsIDEpO1xuICAgIH1cbiAgICBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5raXR0ZW5TY2llbnRpc3RzID0gdW5kZWZpbmVkO1xuICAgIGNvbnNvbGUud2FybiguLi5jbChcIktpdHRlbiBTY2llbnRpc3RzIGhhdmUgYmVlbiB1bmxvYWRlZCFcIikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSB1c2VyIHNjcmlwdCBhZnRlciBsb2FkaW5nIGFuZCBjb25maWd1cmluZyBpdC5cbiAgICovXG4gIHJ1bigpOiB2b2lkIHtcbiAgICAvLyBJbmNyZWFzZSBtZXNzYWdlcyBkaXNwbGF5ZWQgaW4gbG9nXG4gICAgLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgY29uZmlndXJhYmxlLlxuICAgIHRoaXMuZ2FtZS5jb25zb2xlLm1heE1lc3NhZ2VzID0gMTAwMDtcblxuICAgIHRoaXMucmVmcmVzaEVudGlyZVVzZXJJbnRlcmZhY2UoKTtcblxuICAgIGlmICh0aGlzLmVuZ2luZS5zZXR0aW5ncy5lbmFibGVkKSB7XG4gICAgICB0aGlzLmVuZ2luZS5zdGFydCh0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5rcy5pbml0XCIpO1xuXG4gICAgdGhpcy5ydW5VcGRhdGVDaGVjaygpLmNhdGNoKHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlKGNvbnNvbGUpKTtcblxuICAgIGlmICh0aGlzLl9nYW1lQmVmb3JlU2F2ZUhhbmRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5kb2pvLnVuc3Vic2NyaWJlKHRoaXMuX2dhbWVCZWZvcmVTYXZlSGFuZGxlKTtcbiAgICAgIHRoaXMuX2dhbWVCZWZvcmVTYXZlSGFuZGxlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLl9nYW1lQmVmb3JlU2F2ZUhhbmRsZSA9IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8uc3Vic2NyaWJlKFxuICAgICAgXCJnYW1lL2JlZm9yZXNhdmVcIixcbiAgICAgIChzYXZlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgY29uc29sZS5pbmZvKC4uLmNsKFwiSW5qZWN0aW5nIEtpdHRlbiBTY2llbnRpc3RzIGVuZ2luZSBzdGF0ZSBpbnRvIHNhdmUgZGF0YS4uLlwiKSk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRTZXR0aW5ncygpO1xuICAgICAgICBzYXZlRGF0YS5rcyA9IHsgc3RhdGU6IFtzdGF0ZV0gfTtcbiAgICAgICAgdGhpcy5fdXNlckludGVyZmFjZS5zdGF0ZU1hbmFnZW1lbnRVaS5zdG9yZUF1dG9TYXZlKHN0YXRlKTtcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8dHlwZW9mIHNhdmVEYXRhPihcImtzLnJlcG9ydFNhdmVnYW1lXCIsIHsgZGV0YWlsOiBzYXZlRGF0YSB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGlmICh0aGlzLl9zZXJ2ZXJMb2FkSGFuZGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8udW5zdWJzY3JpYmUodGhpcy5fc2VydmVyTG9hZEhhbmRsZSk7XG4gICAgICB0aGlzLl9nYW1lQmVmb3JlU2F2ZUhhbmRsZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5fc2VydmVyTG9hZEhhbmRsZSA9IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8uc3Vic2NyaWJlKFxuICAgICAgXCJzZXJ2ZXIvbG9hZFwiLFxuICAgICAgKHNhdmVEYXRhOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gVXNlclNjcmlwdExvYWRlci50cnlFbmdpbmVTdGF0ZUZyb21TYXZlRGF0YShcImtzXCIsIHNhdmVEYXRhKSBhc1xuICAgICAgICAgIHwgRW5naW5lU3RhdGVcbiAgICAgICAgICB8IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgLi4uY2woXG4gICAgICAgICAgICAgIFwiVGhlIEtpdHRlbnMgR2FtZSBzYXZlIGRhdGEgZGlkIG5vdCBjb250YWluIGEgc2NyaXB0IHN0YXRlLiBUcnlpbmcgdG8gbG9hZCBBdXRvLVNhdmUgc2V0dGluZ3MuLi5cIixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmluZm8oLi4uY2woXCJGb3VuZCEgTG9hZGluZyBzZXR0aW5ncy4uLlwiKSk7XG4gICAgICAgIHRoaXMuZW5naW5lLnN0YXRlTG9hZChzdGF0ZSk7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hpY2ggdmVyc2lvbnMgb2YgS1MgYXJlIGN1cnJlbnRseSBwdWJsaXNoZWQuXG4gICAqL1xuICBhc3luYyBydW5VcGRhdGVDaGVjaygpIHtcbiAgICBpZiAoUkVMRUFTRV9DSEFOTkVMID09PSBcImZpeGVkXCIpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoLi4uY2woXCJObyB1cGRhdGUgY2hlY2sgb24gJ2ZpeGVkJyByZWxlYXNlIGNoYW5uZWwuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8va2l0dGVuLXNjaWVuY2UuY29tL3JlbGVhc2UtaW5mby5qc29uXCIpO1xuICAgICAgY29uc3QgcmVsZWFzZUluZm8gPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBSZWxlYXNlSW5mb1NjaGVtYTtcbiAgICAgIGNvbnNvbGUuZGVidWcoLi4uY2wocmVsZWFzZUluZm8pKTtcblxuICAgICAgaWYgKFxuICAgICAgICBpc05pbChyZWxlYXNlSW5mb1tSRUxFQVNFX0NIQU5ORUxdLnZlcnNpb24pIHx8XG4gICAgICAgIHJlbGVhc2VJbmZvW1JFTEVBU0VfQ0hBTk5FTF0udmVyc2lvbiA9PT0gXCJcIlxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgICAgXCJDb3VsZCBub3QgcmVhZCBjdXJyZW50IHZlcnNpb24gZm9yIG91ciByZWxlYXNlIGNoYW5uZWwgZnJvbSBwcm92aWRlZCBtZXRhZGF0YSFcIixcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmlsKFJFTEVBU0VfVkVSU0lPTikgJiYgZ3QocmVsZWFzZUluZm9bUkVMRUFTRV9DSEFOTkVMXS52ZXJzaW9uLCBSRUxFQVNFX1ZFUlNJT04pKSB7XG4gICAgICAgIHRoaXMuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmtzLnVwZ3JhZGVcIiwgW1xuICAgICAgICAgIHJlbGVhc2VJbmZvW1JFTEVBU0VfQ0hBTk5FTF0udmVyc2lvbixcbiAgICAgICAgICBSRUxFQVNFX1ZFUlNJT04sXG4gICAgICAgICAgcmVsZWFzZUluZm9bUkVMRUFTRV9DSEFOTkVMXS51cmwucmVsZWFzZSxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybiguLi5jbChcIlVwZGF0ZSBjaGVjayBmYWlsZWQuXCIpKTtcbiAgICAgIGNvbnNvbGUud2FybiguLi5jbChlcnJvcikpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyB0aGUgdXNlciBpbnRlcmZhY2UgdG8gcmVmcmVzaC5cbiAgICovXG4gIHJlZnJlc2hFbnRpcmVVc2VySW50ZXJmYWNlKCk6IHZvaWQge1xuICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIlJlcXVlc3RpbmcgZW50aXJlIHVzZXIgaW50ZXJmYWNlIHRvIGJlIHJlZnJlc2hlZC5cIikpO1xuICAgIHRoaXMuX3VzZXJJbnRlcmZhY2UuZm9yY2VGdWxsUmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm5zIGEgc3RyaW5nIGxpa2UgNTIuNyBpbnRvIHRoZSBudW1iZXIgNTIuN1xuICAgKiBAcGFyYW0gdmFsdWUgLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gYWJzb2x1dGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgSW5maW5pdHksIHdoZXJlIEluZmluaXR5IGlzIHJlcHJlc2VudGVkIGFzIC0xLlxuICAgKi9cbiAgcGFyc2VGbG9hdCh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IG51bWJlciB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzU3VmZml4ID0gL1tLTUdUUF0kL2kudGVzdCh2YWx1ZSk7XG4gICAgY29uc3QgYmFzZVZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCAtIChoYXNTdWZmaXggPyAxIDogMCkpO1xuXG4gICAgbGV0IG51bWVyaWNWYWx1ZSA9XG4gICAgICB2YWx1ZS5pbmNsdWRlcyhcImVcIikgfHwgaGFzU3VmZml4ID8gTnVtYmVyLnBhcnNlRmxvYXQoYmFzZVZhbHVlKSA6IE51bWJlci5wYXJzZUludChiYXNlVmFsdWUpO1xuICAgIGlmIChoYXNTdWZmaXgpIHtcbiAgICAgIGNvbnN0IHN1ZmZpeCA9IHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5sZW5ndGggLSAxKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgbnVtZXJpY1ZhbHVlID0gbnVtZXJpY1ZhbHVlICogMTAwMCAqKiBbXCJcIiwgXCJLXCIsIFwiTVwiLCBcIkdcIiwgXCJUXCIsIFwiUFwiXS5pbmRleE9mKHN1ZmZpeCk7XG4gICAgfVxuICAgIGlmIChudW1lcmljVmFsdWUgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCBudW1lcmljVmFsdWUgPCAwKSB7XG4gICAgICBudW1lcmljVmFsdWUgPSAtMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVtZXJpY1ZhbHVlO1xuICB9XG5cbiAgcGFyc2VBYnNvbHV0ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGZsb2F0VmFsdWUgPSB0aGlzLnBhcnNlRmxvYXQodmFsdWUpO1xuICAgIHJldHVybiBmbG9hdFZhbHVlICE9PSBudWxsID8gTWF0aC5yb3VuZChmbG9hdFZhbHVlKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVHVybnMgYSBzdHJpbmcgbGlrZSA1Mi43IGludG8gdGhlIG51bWJlciAwLjUyN1xuICAgKiBAcGFyYW0gdmFsdWUgLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBwZXJjZW50YWdlLlxuICAgKiBAcmV0dXJucyBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgcmVwcmVzZW50aW5nIHRoZSBkZXNjcmliZWQgcGVyY2VudGFnZS5cbiAgICovXG4gIHBhcnNlUGVyY2VudGFnZSh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjbGVhbmVkVmFsdWUgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvJSQvLCBcIlwiKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgTnVtYmVyLnBhcnNlRmxvYXQoY2xlYW5lZFZhbHVlKSAvIDEwMCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm5zIGEgbnVtYmVyIGludG8gYSBnYW1lLW5hdGl2ZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gICAqIEluZmluaXR5LCBlaXRoZXIgYnkgYWN0dWFsIHZhbHVlIG9yIGJ5IC0xIHJlcHJlc2VudGF0aW9uLCBpcyByZW5kZXJlZCBhcyBhIHN5bWJvbC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG51bWJlciB0byByZW5kZXIgYXMgYSBzdHJpbmcuXG4gICAqIEBwYXJhbSBob3N0IC0gVGhlIGhvc3QgaW5zdGFuY2Ugd2hpY2ggd2UgY2FuIHVzZSB0byBsZXQgdGhlIGdhbWUgcmVuZGVyIHZhbHVlcyBmb3IgdXMuXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gbnVtYmVyLlxuICAgKi9cbiAgcmVuZGVyQWJzb2x1dGUodmFsdWU6IG51bWJlciwgbG9jYWxlOiBTdXBwb3J0ZWRMb2NhbGUgfCBcImludmFyaWFudFwiID0gXCJpbnZhcmlhbnRcIikge1xuICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgcmV0dXJuIFwi4oieXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsZSAhPT0gXCJpbnZhcmlhbnRcIiAmJiBNYXRoLmZsb29yKE1hdGgubG9nMTAodmFsdWUpKSA8IDlcbiAgICAgID8gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZSwgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDAsIHN0eWxlOiBcImRlY2ltYWxcIiB9KS5mb3JtYXQodmFsdWUpXG4gICAgICA6IHRoaXMuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQodmFsdWUsIGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogVHVybnMgYSBudW1iZXIgbGlrZSAwLjUyNyBpbnRvIGEgc3RyaW5nIGxpa2UgNTIuN1xuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbnVtYmVyIHRvIHJlbmRlciBhcyBhIHN0cmluZy5cbiAgICogQHBhcmFtIGxvY2FsZSAtIFRoZSBsb2NhbGUgaW4gd2hpY2ggdG8gcmVuZGVyIHRoZSBwZXJjZW50YWdlLlxuICAgKiBAcGFyYW0gd2l0aFVuaXQgLSBTaG91bGQgdGhlIHBlcmNlbnRhZ2Ugc2lnbiBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0P1xuICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHBlcmNlbnRhZ2UuXG4gICAqL1xuICByZW5kZXJQZXJjZW50YWdlKFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgbG9jYWxlOiBTdXBwb3J0ZWRMb2NhbGUgfCBcImludmFyaWFudFwiID0gXCJpbnZhcmlhbnRcIixcbiAgICB3aXRoVW5pdD86IGJvb2xlYW4sXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7XG4gICAgICByZXR1cm4gXCLiiJ5cIjtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9jYWxlICE9PSBcImludmFyaWFudFwiXG4gICAgICA/IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUsIHsgc3R5bGU6IFwicGVyY2VudFwiIH0pLmZvcm1hdCh2YWx1ZSlcbiAgICAgIDogYCR7dGhpcy5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dCh2YWx1ZSAqIDEwMCwgZmFsc2UsIGZhbHNlKX0ke3dpdGhVbml0ID8gXCIlXCIgOiBcIlwifWA7XG4gIH1cblxuICByZW5kZXJGbG9hdCh2YWx1ZTogbnVtYmVyLCBsb2NhbGU6IFN1cHBvcnRlZExvY2FsZSB8IFwiaW52YXJpYW50XCIgPSBcImludmFyaWFudFwiKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgIHJldHVybiBcIuKInlwiO1xuICAgIH1cblxuICAgIHJldHVybiBsb2NhbGUgIT09IFwiaW52YXJpYW50XCJcbiAgICAgID8gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZSwgeyBzdHlsZTogXCJkZWNpbWFsXCIgfSkuZm9ybWF0KHZhbHVlKVxuICAgICAgOiB0aGlzLmdhbWUuZ2V0RGlzcGxheVZhbHVlRXh0KHZhbHVlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgLy8jcmVnaW9uIFNldHRpbmdzXG4gIC8qKlxuICAgKiBFbmNvZGVzIGFuIGVuZ2luZSBzdGF0ZXMgaW50byBhIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBlbmdpbmUgc3RhdGUgdG8gZW5jb2RlLlxuICAgKiBAcGFyYW0gY29tcHJlc3MgU2hvdWxkIHdlIHVzZSBMWlN0cmluZyBjb21wcmVzc2lvbj9cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmdzIGVuY29kZWQgaW50byBhIHN0cmluZy5cbiAgICovXG4gIHN0YXRpYyBlbmNvZGVTZXR0aW5ncyhzZXR0aW5nczogRW5naW5lU3RhdGUsIGNvbXByZXNzID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2V0dGluZ3NTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gICAgcmV0dXJuIGNvbXByZXNzXG4gICAgICA/IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LkxaU3RyaW5nLmNvbXByZXNzVG9CYXNlNjQoc2V0dGluZ3NTdHJpbmcpXG4gICAgICA6IHNldHRpbmdzU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgc2VyaWFsaXplZCBlbmdpbmUgc3RhdGUsIGF0dGVtcHRzIHRvIGRlc2VyaWFsaXplIHRoYXQgZW5naW5lIHN0YXRlLlxuICAgKiBBc3N1bWVzIHRoZSBpbnB1dCBoYXMgYmVlbiBjb21wcmVzc2VkIHdpdGggTFpTdHJpbmcsIHdpbGwgYWNjZXB0IHVuY29tcHJlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIGNvbXByZXNzZWRTZXR0aW5ncyBBbiBlbmdpbmUgc3RhdGUgdGhhdCBoYXMgcHJldmlvdXNseSBiZWVuIHNlcmlhbGl6ZWQgdG8gYSBzdHJpbmcuXG4gICAqIEByZXR1cm5zIFRoZSBlbmdpbmUgc3RhdGUsIGlmIHZhbGlkLlxuICAgKi9cbiAgc3RhdGljIGRlY29kZVNldHRpbmdzKGNvbXByZXNzZWRTZXR0aW5nczogc3RyaW5nKTogRW5naW5lU3RhdGUge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBuYWl2ZVBhcnNlID0gSlNPTi5wYXJzZShjb21wcmVzc2VkU2V0dGluZ3MpIGFzIHsgdj86IHN0cmluZyB9O1xuICAgICAgcmV0dXJuIEtpdHRlblNjaWVudGlzdHMudW5rbm93bkFzRW5naW5lU3RhdGVPclRocm93KG5haXZlUGFyc2UpO1xuICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgLyogZXhwZWN0ZWQsIGFzIHdlIGFzc3VtZSB0aGUgaW5wdXQgdG8gYmUgY29tcHJlc3NlZC4gKi9cbiAgICB9XG5cbiAgICBpZiAoY29tcHJlc3NlZFNldHRpbmdzLm1hdGNoKC9cXHI/XFxuLykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXJyb3IoXCJNdWx0aS1saW5lIG5vbi1KU09OIGlucHV0IGNhbid0IGJlIGRlY29kZWQuXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzU3RyaW5nID1cbiAgICAgIFVzZXJTY3JpcHRMb2FkZXIud2luZG93LkxaU3RyaW5nLmRlY29tcHJlc3NGcm9tQmFzZTY0KGNvbXByZXNzZWRTZXR0aW5ncyk7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzZXR0aW5nc1N0cmluZykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcmV0dXJuIEtpdHRlblNjaWVudGlzdHMudW5rbm93bkFzRW5naW5lU3RhdGVPclRocm93KHBhcnNlZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzdGF0ZSBmcm9tIHRoZSBlbmdpbmUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBlbmdpbmUgc3RhdGUuXG4gICAqL1xuICBnZXRTZXR0aW5ncygpOiBFbmdpbmVTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLnN0YXRlU2VyaWFsaXplKCk7XG4gIH1cblxuICBnZXRTZXR0aW5nc0FzSnNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmdldFNldHRpbmdzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGVuZ2luZSB3aXRoIGEgbmV3IHN0YXRlLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIGVuZ2luZSBzdGF0ZSB0byBhcHBseS5cbiAgICovXG4gIHNldFNldHRpbmdzKHNldHRpbmdzOiBFbmdpbmVTdGF0ZSkge1xuICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIkxvYWRpbmcgZW5naW5lIHN0YXRlLi4uXCIpKTtcbiAgICBjb25zdCByZXF1aXJlc1VpUmVidWlsZCA9XG4gICAgICB0aGlzLmVuZ2luZS5zZXR0aW5ncy5rc0NvbHVtbi5lbmFibGVkICE9PSBzZXR0aW5ncy5lbmdpbmUua3NDb2x1bW4uZW5hYmxlZDtcbiAgICB0aGlzLmVuZ2luZS5zdGF0ZUxvYWQoc2V0dGluZ3MpO1xuXG4gICAgaWYgKHJlcXVpcmVzVWlSZWJ1aWxkKSB7XG4gICAgICB0aGlzLnJlYnVpbGRVaSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3VzZXJJbnRlcmZhY2UucmVmcmVzaCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbiBlbmNvZGVkIHN0YXRlIGludG8gdGhlIGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIGVuY29kZWRTZXR0aW5ncyBUaGUgZW5jb2RlZCBzZXR0aW5ncy5cbiAgICovXG4gIGltcG9ydFNldHRpbmdzRnJvbVN0cmluZyhlbmNvZGVkU2V0dGluZ3M6IHN0cmluZykge1xuICAgIGNvbnN0IHNldHRpbmdzID0gS2l0dGVuU2NpZW50aXN0cy5kZWNvZGVTZXR0aW5ncyhlbmNvZGVkU2V0dGluZ3MpO1xuICAgIHRoaXMuc2V0U2V0dGluZ3Moc2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcGllcyBhbiBlbmdpbmUgc3RhdGUgdG8gdGhlIGNsaXBib2FyZC5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBlbmdpbmUgc3RhdGUgdG8gY29weSB0byB0aGUgY2xpcGJvYXJkLlxuICAgKiBUaGUgZGVmYXVsdCBpcyB0aGlzIGVuZ2luZSdzIGN1cnJlbnQgc3RhdGUuXG4gICAqIEBwYXJhbSBjb21wcmVzcyBTaG91bGQgdGhlIHN0YXRlIGJlIGNvbXByZXNzZWQ/XG4gICAqL1xuICBhc3luYyBjb3B5U2V0dGluZ3Moc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKCksIGNvbXByZXNzID0gdHJ1ZSkge1xuICAgIGNvbnN0IGVuY29kZWRTZXR0aW5ncyA9IEtpdHRlblNjaWVudGlzdHMuZW5jb2RlU2V0dGluZ3Moc2V0dGluZ3MsIGNvbXByZXNzKTtcbiAgICBhd2FpdCBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5uYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChlbmNvZGVkU2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYW4gb2JqZWN0IGlzIGFuIGVuZ2luZSBzdGF0ZSwgYW5kIHRocm93cyBhblxuICAgKiBleGNlcHRpb24gb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0gc3ViamVjdCBUaGUgb2JqZWN0IHRoYXQgaXMgaG9wZWZ1bGx5IGFuIGVuZ2luZSBzdGF0ZS5cbiAgICogQHBhcmFtIHN1YmplY3QudiBUaGUgdmVyc2lvbiBpbiB0aGUgZW5naW5lIHN0YXRlLlxuICAgKiBAcmV0dXJucyBBbiBlbmdpbmUgc3RhdGUuXG4gICAqL1xuICBzdGF0aWMgdW5rbm93bkFzRW5naW5lU3RhdGVPclRocm93KHN1YmplY3Q/OiB1bmtub3duKTogRW5naW5lU3RhdGUge1xuICAgIGNvbnN0IHYgPSAoc3ViamVjdCBhcyB7IHY/OiBzdHJpbmcgfSkudjtcbiAgICBpZiAoIWlzTmlsKHYpICYmIHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAodi5zdGFydHNXaXRoKFwiMlwiKSkge1xuICAgICAgICByZXR1cm4gc3ViamVjdCBhcyBFbmdpbmVTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGEgdmFsaWQgZW5naW5lIHN0YXRlLlwiKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gU2F2ZU1hbmFnZXJcbiAgaW5zdGFsbFNhdmVNYW5hZ2VyKCkge1xuICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIkluc3RhbGxpbmcgc2F2ZSBnYW1lIG1hbmFnZXIuLi5cIikpO1xuICAgIHRoaXMuZ2FtZS5tYW5hZ2Vycy5wdXNoKHRoaXMuX3NhdmVNYW5hZ2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NhdmVNYW5hZ2VyID0ge1xuICAgIGxvYWQ6IChzYXZlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIkxvb2tpbmcgZm9yIEtpdHRlbiBTY2llbnRpc3RzIGVuZ2luZSBzdGF0ZSBpbiBzYXZlIGRhdGEuLi5cIikpO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IFVzZXJTY3JpcHRMb2FkZXIudHJ5RW5naW5lU3RhdGVGcm9tU2F2ZURhdGEoXCJrc1wiLCBzYXZlRGF0YSkgYXNcbiAgICAgICAgfCBFbmdpbmVTdGF0ZVxuICAgICAgICB8IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKCFzdGF0ZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oLi4uY2woXCJUaGUgS2l0dGVucyBHYW1lIHNhdmUgZGF0YSBkaWQgbm90IGNvbnRhaW4gYSBzY3JpcHQgc3RhdGUuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmluZm8oLi4uY2woXCJGb3VuZCBLaXR0ZW4gU2NpZW50aXN0cyBlbmdpbmUgc3RhdGUgaW4gc2F2ZSBkYXRhLlwiKSk7XG4gICAgICB0aGlzLmVuZ2luZS5zdGF0ZUxvYWQoc3RhdGUpO1xuICAgICAgdGhpcy5yZWZyZXNoRW50aXJlVXNlckludGVyZmFjZSgpO1xuICAgIH0sXG4gICAgcmVzZXRTdGF0ZTogKCkgPT4gbnVsbCxcbiAgICBzYXZlOiAoX3NhdmVEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgLy8gV2UgaWdub3JlIHRoZSBtYW5hZ2VyIGludm9jYXRpb24sIGJlY2F1c2Ugd2UgYWxyZWFkeSBoYW5kbGUgdGhlXG4gICAgICAvLyBgZ2FtZS9iZWZvcmVzYXZlYCBldmVudCwgd2hpY2ggaXMgaW50ZW5kZWQgZm9yIGV4dGVybmFsIGNvbnN1bWVycy5cbiAgICB9LFxuICB9O1xuICAvLyNlbmRyZWdpb25cbn1cbiIsImltcG9ydCB7IHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvY29uc29sZS5qc1wiO1xuaW1wb3J0IHsgS2l0dGVuU2NpZW50aXN0cyB9IGZyb20gXCIuL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB7IFVzZXJTY3JpcHRMb2FkZXIgfSBmcm9tIFwiLi9Vc2VyU2NyaXB0TG9hZGVyLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBtYWluID0gYXN5bmMgKCkgPT4ge1xuICBjb25zdCB1c2VyU2NyaXB0ID0gYXdhaXQgbmV3IFVzZXJTY3JpcHRMb2FkZXIoKS53YWl0Rm9yR2FtZShLaXR0ZW5TY2llbnRpc3RzLCBcImtzXCIpO1xuXG4gIFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmtpdHRlblNjaWVudGlzdHMgPSB1c2VyU2NyaXB0O1xuXG4gIHVzZXJTY3JpcHQudmFsaWRhdGVHYW1lKCk7XG4gIHVzZXJTY3JpcHQucnVuKCk7XG59O1xuXG4vLyBXZSBhdXRvLWlnbml0ZSB0aGUgbG9hZGVyLCB1bmxlc3Mgd2UncmUgcnVubmluZyBpbiBHcmVhc2VNb25rZXkgKGNvbnRlbnQgc2NyaXB0KS5cbi8vIFRoZSBjb250ZW50IHNjcmlwdCBsb2FkZXIgd2lsbCBoYW5kbGUgdGhlIG9yY2hlc3RyYXRpb24gb2YgdGhhdCBzY2VuYXJpby5cbmlmICh0eXBlb2YgR00gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgbWFpbigpLmNhdGNoKHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlKGNvbnNvbGUpKTtcbn1cbiJdLCJuYW1lcyI6WyJyZWRpcmVjdEVycm9yc1RvQ29uc29sZSIsImNvbnNvbGUiLCJlcnJvciIsImlzTmlsIiwic3ViamVjdCIsImlzIiwiUHJvdG90eXBlIiwiVW5leHBlY3RlZE5pbEVycm9yIiwibWVzc2FnZSIsIm11c3RFeGlzdCIsImVycm9yTWVzc2FnZSIsImNvYWxlc2NlQXJyYXkiLCJuaWxhYmxlcyIsInRvIiwicmVzdWx0IiwibmlsYWJsZSIsIkFic3RyYWN0RXJyb3IiLCJjb2RlIiwic3RhdHVzIiwiX19wdWJsaWNGaWVsZCIsImFsbG93Rm9yZWlnbk1vZHVsZSIsImVycm9yUmVjb3JkIiwiSW52YWxpZE9wZXJhdGlvbkVycm9yIiwiZGVidWdfMSIsImFyZ3MiLCJTRU1WRVJfU1BFQ19WRVJTSU9OIiwiTUFYX0xFTkdUSCIsIk1BWF9TQUZFX0lOVEVHRVIiLCJNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIIiwiTUFYX1NBRkVfQlVJTERfTEVOR1RIIiwiY29uc3RhbnRzIiwicmVxdWlyZSQkMCIsImRlYnVnIiwicmVxdWlyZSQkMSIsImV4cG9ydHMiLCJtb2R1bGUiLCJyZSIsInNhZmVSZSIsInNyYyIsInNhZmVTcmMiLCJ0IiwiUiIsIkxFVFRFUkRBU0hOVU1CRVIiLCJzYWZlUmVnZXhSZXBsYWNlbWVudHMiLCJtYWtlU2FmZVJlZ2V4IiwidmFsdWUiLCJ0b2tlbiIsIm1heCIsImNyZWF0ZVRva2VuIiwibmFtZSIsImlzR2xvYmFsIiwic2FmZSIsImluZGV4IiwibG9vc2VPcHRpb24iLCJlbXB0eU9wdHMiLCJwYXJzZU9wdGlvbnNfMSIsIm9wdGlvbnMiLCJudW1lcmljIiwiY29tcGFyZUlkZW50aWZpZXJzIiwiYSIsImIiLCJhbnVtIiwiYm51bSIsImlkZW50aWZpZXJzIiwicmVxdWlyZSQkMiIsInBhcnNlT3B0aW9ucyIsInJlcXVpcmUkJDMiLCJyZXF1aXJlJCQ0IiwiU2VtVmVyIiwidmVyc2lvbiIsIm0iLCJpZCIsIm51bSIsIm90aGVyIiwiaSIsInJlbGVhc2UiLCJpZGVudGlmaWVyIiwiaWRlbnRpZmllckJhc2UiLCJtYXRjaCIsImJhc2UiLCJwcmVyZWxlYXNlIiwic2VtdmVyIiwiY29tcGFyZV8xIiwibG9vc2UiLCJjb21wYXJlIiwiZ3RfMSIsIkludGVybmFsRXJyb3IiLCJpbnRlcm5hbEVycm9yIiwiVW5rbm93bkVycm9yIiwiaXNFcnJvciIsInVua25vd25Ub0Vycm9yIiwibWVhc3VyZSIsImNvbnRleHQiLCJlbnRyeSIsIm1lYXN1cmVBc3luYyIsImRpZmZlcmVuY2UiLCJ4IiwiY2wiLCJhcmciLCJtYXliZUVycm9yIiwib2JqZWN0RW50cmllcyIsImNvbnN1bWVFbnRyaWVzUGVkYW50aWMiLCJzb3VyY2UiLCJjb25zdW1lciIsImtleSIsIlVuaXF1ZSIsImVsZW0iLCJ1Y2ZpcnN0IiwiaW5wdXQiLCJyb3VuZFRvVHdvIiwibmVnYXRpdmVPbmVUb0luZmluaXR5IiwiQnVsa1B1cmNoYXNlSGVscGVyIiwiaG9zdCIsIndvcmtzaG9wTWFuYWdlciIsImJ1aWxkcyIsIm1ldGFEYXRhIiwic2VjdGlvblRyaWdnZXIiLCJzb3VyY2VUYWIiLCJwb3RlbnRpYWxCdWlsZHMiLCJjb3VudGVyIiwiYnVpbGQiLCJ0cmlnZ2VyIiwiRW5naW5lIiwiYnVpbGRNZXRhRGF0YSIsInByaWNlcyIsInByaWNlUmF0aW8iLCJwcmljZSIsIm1hdGVyaWFsIiwiaXRlbVByaWNlcyIsInByaWNlTW9kaWZpZXIiLCJyZXNQcmljZU1vZGlmaWVyIiwiY3VycmVudFJlc291cmNlUG9vbCIsInJlcyIsIml0ZXJhdGlvbnMiLCJidWlsZHNDb21taXR0ZWQiLCJjYW5kaWRhdGVzVGhpc0l0ZXJhdGlvbiIsImJ1aWxkVGhpc0l0ZXJhdGlvbiIsImNvbW1pdHRlZFRoaXNJdGVyYXRpb24iLCJ0ZW1wUG9vbCIsImNvbW1pdHRlZEJ1aWxkIiwicG90ZW50aWFsQnVpbGQiLCJ0YXJnZXRJbnN0YW5jZUNvdW50IiwicG9zc2libGVJbnN0YW5jZXMiLCJidWlsZENhY2hlSXRlbSIsInJlc291cmNlcyIsImJ1aWxkc1Bvc3NpYmxlIiwibWF4SXRlbXNCdWlsdCIsInByaWNlSW5kZXgiLCJzcGFjZU9pbCIsImNyeW9LYXJtYSIsIm9pbFByaWNlIiwia2FybWFQcmljZSIsIm9pbFJlZHVjdGlvblJhdGlvIiwiYnVybmVkUGFyYWdvblJhdGlvIiwicHJpY2VJbmRleDIiLCJvaWxQcmljZVJlZnVuZCIsImthcm1hUHJpY2VSZWZ1bmQiLCJyZWZ1bmRWYWwiLCJuZXdQcmljZVZhbHVlIiwibW9kZWwiLCJjb250cm9sbGVyIiwiYW1vdW50IiwibWV0YSIsImFtb3VudENhbGN1bGF0ZWQiLCJ2c01ldGEiLCJkYXRhIiwicmF0aW8iLCJyYXRpb0RpZmYiLCJyZXNvdXJjZVByaWNlTW9kaWZpZXIiLCJmaW5hbFJlc291cmNlUHJpY2UiLCJvaWxNb2RpZmllciIsImthcm1hTW9kaWZpZXIiLCJCdWlsZGluZ3MiLCJTdGFnZWRCdWlsZGluZ3MiLCJTZWFzb25zIiwiQ3ljbGVzIiwiUmVzb3VyY2VzQ3JhZnRhYmxlIiwiUmVzb3VyY2VzIiwiSm9icyIsIlRyYWl0cyIsIlVuaWNvcm5JdGVtVmFyaWFudCIsIlJlbGlnaW9uVXBncmFkZXMiLCJUcmFuc2NlbmRlbmNlVXBncmFkZXMiLCJaaWdndXJhdFVwZ3JhZGVzIiwiUmFjZXMiLCJQb2xpY2llcyIsIlRlY2hub2xvZ2llc0lnbm9yZWQiLCJUZWNobm9sb2dpZXMiLCJNaXNzaW9ucyIsIlNwYWNlQnVpbGRpbmdzIiwiQ2hyb25vRm9yZ2VVcGdyYWRlcyIsIlZvaWRTcGFjZVVwZ3JhZGVzIiwiVXBncmFkZXMiLCJUaW1lSXRlbVZhcmlhbnQiLCJVbmljb3JuSXRlbXMiLCJSZWxpZ2lvbk9wdGlvbnMiLCJTZXR0aW5nIiwiZW5hYmxlZCIsInNldHRpbmciLCJTZXR0aW5nTGltaXRlZCIsImxpbWl0ZWQiLCJTZXR0aW5nVHJpZ2dlciIsIlNldHRpbmdUaHJlc2hvbGQiLCJ0aHJlc2hvbGQiLCJTZXR0aW5nTWF4IiwiU2V0dGluZ0xpbWl0ZWRNYXgiLCJTZXR0aW5nTGltaXRlZE1heFRyaWdnZXIiLCJTZXR0aW5nTGltaXRlZFRyaWdnZXIiLCJTZXR0aW5nVHJpZ2dlck1heCIsIlNldHRpbmdUaHJlc2hvbGRNYXgiLCJTZXR0aW5nT3B0aW9ucyIsInNlbGVjdGVkIiwiX19wcml2YXRlQWRkIiwiX29wdGlvbnMiLCJvcHRpb24iLCJfX3ByaXZhdGVTZXQiLCJfX3ByaXZhdGVHZXQiLCJTZXR0aW5nQnV5U2VsbFRocmVzaG9sZCIsImJ1eSIsInNlbGwiLCJCdWlsZGluZ1VwZ3JhZGVTZXR0aW5nIiwidXBncmFkZSIsIl91cGdyYWRlIiwiQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3MiLCJpdGVtcyIsIml0ZW0iLCJzZXR0aW5ncyIsImJ1aWxkaW5nIiwiQm9uZmlyZUJ1aWxkaW5nU2V0dGluZyIsImJhc2VTdGFnZSIsIl9iYXNlQnVpbGRpbmciLCJfYnVpbGRpbmciLCJfc3RhZ2UiLCJCb25maXJlU2V0dGluZ3MiLCJnYXRoZXJDYXRuaXAiLCJ0dXJuT25TdGVhbXdvcmtzIiwidHVybk9uTWFnbmV0b3MiLCJ0dXJuT25SZWFjdG9ycyIsInVwZ3JhZGVCdWlsZGluZ3MiLCJfYSIsIl9iIiwiX2MiLCJfZCIsIlRhYk1hbmFnZXIiLCJ0YWIiLCJCb25maXJlTWFuYWdlciIsImJ1bGtNYW5hZ2VyIiwiYnVpbGRMaXN0IiwicGFzdHVyZXMiLCJhcXVlZHVjdHMiLCJwYXN0dXJlTWV0YSIsImJ1dHRvbiIsImFxdWVkdWN0TWV0YSIsImxpYnJhcnlNZXRhIiwiZW5lcmd5Q29uc3VtcHRpb25SYXRlIiwibGliVG9EYXQiLCJfZSIsIndhcmVob3VzZU1ldGEiLCJfZiIsImFtcGhpdGhlYXRyZU1ldGEiLCJfZyIsInN0ZWFtd29ya3MiLCJtYWduZXRvcyIsInJlYWN0b3JzIiwiY2xpY2tzIiwiYW1vdW50VGVtcCIsImxhYmVsIiwiaXRlbU1ldGFSYXciLCJzdGFnZSIsIm1ldGFSYXciLCJidWlsZGluZ01ldGEiLCJBY3Rpdml0eVN1bW1hcnkiLCJzZWN0aW9uIiwic3VtbWFyeVNlY3Rpb24iLCJzdW1tYXJ5IiwiX2Ftb3VudCIsInllYXJzIiwiZGF5cyIsImR1cmF0aW9uIiwiUmVsaWdpb25TZXR0aW5nc0l0ZW0iLCJ2YXJpYW50IiwiX3ZhcmlhbnQiLCJSZWxpZ2lvblNldHRpbmdzIiwiYmVzdFVuaWNvcm5CdWlsZGluZyIsInNhY3JpZmljZUFsaWNvcm5zIiwic2FjcmlmaWNlVW5pY29ybnMiLCJyZWZpbmVUZWFycyIsInJlZmluZVRpbWVDcnlzdGFscyIsImF1dG9QcmFpc2UiLCJhZG9yZSIsInRyYW5zY2VuZCIsIlJlbGlnaW9uTWFuYWdlciIsImJvbmZpcmVNYW5hZ2VyIiwibWF4UGFzdHVyZXMiLCJidWlsZGluZ0J1dHRvbiIsInRlYXJzTmVlZGVkIiwicHJpY2VUZWFycyIsInRlYXJzQXZhaWxhYmxlRm9yVXNlIiwibWF4U2FjcmlmaWNlIiwibmVlZFNhY3JpZmljZSIsImJ1aWxkUmVxdWVzdCIsImFscmVhZHlIYW5kbGVkIiwicGFzdHVyZUJ1dHRvbiIsInZhbGlkQnVpbGRpbmdzIiwidW5pY29ybnNQZXJTZWNvbmRCYXNlIiwiZ2xvYmFsUmF0aW8iLCJyZWxpZ2lvblJhdGlvIiwicGFyYWdvblJhdGlvIiwiZmFpdGhCb251cyIsImN1cnJlbnRDeWNsZUluZGV4IiwiY3VycmVudEN5Y2xlIiwiY3ljbGVCb251cyIsInVuaWNvcm5zUGVyU2Vjb25kIiwiemlnZ3VyYXRSYXRpbyIsImJhc2VVbmljb3Juc1BlclJpZnQiLCJyaWZ0Q2hhbmNlUmF0aW8iLCJ1bmljb3JuUmlmdENoYW5nZSIsImJlc3RBbW9ydGl6YXRpb24iLCJiZXN0QnVpbGRpbmciLCJwYXN0dXJlUHJvZHVjdGlvbiIsInBhc3R1cmVBbW9ydGl6YXRpb24iLCJ1bmljb3JuUHJpY2UiLCJidWlsZGluZ0luZm8iLCJyZWxpZ2lvbkJvbnVzIiwicmlmdENoYW5jZSIsImVmZmVjdCIsInVuaWNvcm5zUGVyUmlmdCIsInJpZnRCb251cyIsImJ1aWxkaW5nUHJvZHVjdGlvbiIsImFtb3J0aXphdGlvbiIsImJ1aWxkSW5mbyIsInBhbmVsIiwiYnV0dG9ucyIsImF2YWlsYWJsZSIsInRvdGFsIiwicGVyY2VudGFnZUludmVyc2UiLCJsaW5rIiwicmVzb2x2ZSIsInVuaWNvcm5zIiwiYXZhaWxhYmxlTm93IiwiY29zdCIsImFsaWNvcm5zIiwidGVhcnMiLCJzb3Jyb3ciLCJhdmFpbGFibGVGb3JDb252ZXJzaW9uIiwidGltZUNyeXN0YWxzIiwiZmFpdGgiLCJmYWl0aExldmVsIiwid29yc2hpcCIsImVwaXBoYW55IiwidHJhbnNjZW5kZW5jZVRpZXJDdXJyZW50IiwibWF4U29sYXJSZXZvbHV0aW9uIiwidHJpZ2dlclNvbGFyUmV2b2x1dGlvbiIsImVwaXBoYW55SW5jcmVhc2UiLCJlcGlwaGFueUFmdGVyQWRvcmUiLCJ3b3JzaGlwQWZ0ZXJBZG9yZSIsInNvbGFyUmV2b2x1dGlvbkFmdGVyQWRvcmUiLCJ0cmFuc2NlbmRlbmNlUmVhY2hlZCIsImFkb3JlSW5jcmVhc2VSYXRpbyIsIm5lZWROZXh0TGV2ZWwiLCJrIiwiYXRoZWlzbSIsImJsYWNrT2JlbGlzayIsImFwb2NyeXBoYUJvbnVzIiwid29yc2hpcEluY3JlYXNlIiwiUG9saWN5U2V0dGluZyIsInBvbGljeSIsIl9wb2xpY3kiLCJQb2xpY3lTZXR0aW5ncyIsImdhbWUiLCJpblNldHRpbmdzIiwiaW5HYW1lIiwibWlzc2luZ0luU2V0dGluZ3MiLCJyZWR1bmRhbnRJblNldHRpbmdzIiwiVGVjaFNldHRpbmciLCJ0ZWNoIiwiX3RlY2giLCJUZWNoU2V0dGluZ3MiLCJTY2llbmNlU2V0dGluZ3MiLCJwb2xpY2llcyIsInRlY2hzIiwib2JzZXJ2ZSIsIlVwZ3JhZGVNYW5hZ2VyIiwic3VjY2VzcyIsImFjdGlvbiIsIm9yaWdpbmFsQ29uZmlybSIsInNsZWVwIiwiRmFsbGJhY2tMb2NhbGUiLCJUSU1FT1VUX0RFRkFVTFQiLCJUSU1FT1VUX09WRVJSSURFIiwiVXNlclNjcmlwdExvYWRlciIsInNhdmVEYXRhS2V5Iiwic2F2ZURhdGEiLCJzYXZlRGF0YVByb3h5Iiwia3NEYXRhIiwic3RhdGUiLCJVc2VyU2NyaXB0IiwidGltZW91dCIsImkxOG5FbmdpbmUiLCJnYW1lTGFuZ3VhZ2UiLCJzaWduYWxzIiwic3ViR2FtZVN0YXJ0Iiwic3ViU2VydmVyTG9hZCIsIlNjaWVuY2VNYW5hZ2VyIiwiX2NvbnRleHQiLCJ0b1VubG9jayIsIndvcmtMb29wIiwicmVzb3VyY2UiLCJ0YXJnZXRQb2xpY3kiLCJNaXNzaW9uU2V0dGluZyIsIm1pc3Npb24iLCJfbWlzc2lvbiIsIk1pc3Npb25TZXR0aW5ncyIsInByb2dyYW0iLCJTcGFjZUJ1aWxkaW5nU2V0dGluZyIsIlNwYWNlU2V0dGluZ3MiLCJ1bmxvY2tNaXNzaW9ucyIsIlNwYWNlTWFuYWdlciIsIm1pc3Npb25zIiwibWlzc2lvbkxvb3AiLCJwYW5lbHMiLCJjaGlsZCIsIkxvZ0ZpbHRlckl0ZW1WYXJpYW50IiwiRmlsdGVySXRlbXMiLCJMb2dGaWx0ZXJTZXR0aW5nc0l0ZW0iLCJMb2dGaWx0ZXJTZXR0aW5ncyIsImRpc2FibGVLR0xvZyIsImZpbHRlciIsIlVwZ3JhZGVTZXR0aW5nc0l0ZW0iLCJVcGdyYWRlU2V0dGluZ3MiLCJDcmFmdFNldHRpbmdzSXRlbSIsIl9yZXNvdXJjZSIsIldvcmtzaG9wU2V0dGluZ3MiLCJ1bmxvY2tVcGdyYWRlcyIsInNoaXBPdmVycmlkZSIsImNyYWZ0IiwiV29ya3Nob3BNYW5hZ2VyIiwidXBncmFkZXMiLCJjcmFmdHMiLCJjcmFmdFJlcXVlc3RzIiwiY3VycmVudCIsIm1hdGVyaWFscyIsImJpbGxPZk1hdGVyaWFscyIsInJlcXVlc3QiLCJtYXRlcmlhbEFtb3VudCIsIm1hdGVyaWFsUmVzb3VyY2UiLCJhdmFpbGFibGVTb3VyY2UiLCJhdmFpbGFibGVUYXJnZXQiLCJyZWNpcGVSZXF1aXJlcyIsInJlY2lwZVByb2R1Y2VzIiwiY3JhZnRzUG9zc2libGUiLCJjcmFmdHNEb25lIiwib3JkZXJEb25lIiwiY3JhZnRzTWF4TGltaXQiLCJyZXNvdXJjZU5hbWUiLCJjYWNoZU1hbmFnZXIiLCJwcmVUcmFkZSIsInByb2R1Y3Rpb24iLCJtaW5Qcm9kIiwibWF0IiwicmF0IiwiYWRkUHJvZCIsIm91dHB1dCIsImh1bnRlclJhdGlvIiwic3RvY2siLCJyZXNQZXJUaWNrIiwiY29uc3VtZSIsIndvcnN0V2VhdGhlciIsInByb2R1Y3Rpb25GaWVsZCIsInJlc291cmNlUHJvZHVjdGlvbiIsInByb2R1Y3Rpb25WaWxsYWdlciIsImJhc2VQcm9kIiwiaHlkcm9wb25pY3MiLCJwYXJhZ29uQm9udXMiLCJiYXNlRGVtYW5kIiwidW5pY29yblBhc3R1cmVzIiwiaGFwcHlDb24iLCJjYXRuaXBEZW1hbmRXb3JrZXJSYXRpb0dsb2JhbCIsInJlc291cmNlQ2VsbHMiLCJyZXNvdXJjZUNlbGwiLCJpc0JlbG93IiwiUmVzb3VyY2VzU2V0dGluZ3NJdGVtIiwiUmVzb3VyY2VzU2V0dGluZ3MiLCJTdGF0ZVNldHRpbmdzIiwibm9Db25maXJtIiwiY29tcHJlc3MiLCJFbmdpbmVTZXR0aW5ncyIsImZpbHRlcnMiLCJzdGF0ZXMiLCJsYW5ndWFnZSIsImtzQ29sdW1uIiwicmV0YWluTWV0YUJlaGF2aW9yIiwiUmVzZXRCb25maXJlQnVpbGRpbmdTZXR0aW5nIiwiUmVzZXRCb25maXJlU2V0dGluZ3MiLCJSZXNldFJlbGlnaW9uQnVpbGRpbmdTZXR0aW5nIiwiUmVzZXRSZWxpZ2lvblNldHRpbmdzIiwiUmVzZXRSZXNvdXJjZXNTZXR0aW5nc0l0ZW0iLCJSZXNldFJlc291cmNlc1NldHRpbmdzIiwiUmVzZXRTcGFjZUJ1aWxkaW5nU2V0dGluZyIsIlJlc2V0U3BhY2VTZXR0aW5ncyIsIlJlc2V0VGltZUJ1aWxkaW5nU2V0dGluZyIsIlJlc2V0VGltZVNldHRpbmdzIiwiUmVzZXRVcGdyYWRlU2V0dGluZ3NJdGVtIiwiUmVzZXRVcGdyYWRlU2V0dGluZ3MiLCJSZXNldFNldHRpbmdzIiwiYm9uZmlyZSIsInJlbGlnaW9uIiwic3BhY2UiLCJ0aW1lIiwiVGltZVNraXBIZWF0U2V0dGluZ3MiLCJhY3RpdmVIZWF0VHJhbnNmZXJTdGF0dXMiLCJjeWNsZSIsIlRpbWVTa2lwU2V0dGluZ3MiLCJpZ25vcmVPdmVyaGVhdCIsImFjdGl2ZUhlYXRUcmFuc2ZlciIsInNlYXNvbiIsIlRpbWVDb250cm9sU2V0dGluZ3MiLCJhY2NlbGVyYXRlVGltZSIsInJlc2V0IiwidGltZVNraXAiLCJUaW1lU2V0dGluZ3NJdGVtIiwiVGltZVNldHRpbmdzIiwiZml4Q3J5b2NoYW1iZXJzIiwiRW1iYXNzeVNldHRpbmciLCJyYWNlIiwiX3JhY2UiLCJFbWJhc3N5U2V0dGluZ3MiLCJUcmFkZVNldHRpbmdzSXRlbSIsInN1bW1lciIsImF1dHVtbiIsIndpbnRlciIsInNwcmluZyIsInJlcXVpcmUiLCJfcmVxdWlyZSIsIlRyYWRlU2V0dGluZ3MiLCJidWlsZEVtYmFzc2llcyIsImZlZWRMZXZpYXRoYW5zIiwidHJhZGVCbGFja2NvaW4iLCJ1bmxvY2tSYWNlcyIsImRlZmF1bHRSZXF1aXJlIiwiRWxlY3RMZWFkZXJTZXR0aW5ncyIsImpvYiIsInRyYWl0IiwiVmlsbGFnZVNldHRpbmdzIiwiaG9sZEZlc3RpdmFscyIsImh1bnQiLCJwcm9tb3RlS2l0dGVucyIsInByb21vdGVMZWFkZXIiLCJlbGVjdExlYWRlciIsIlRpbWVDb250cm9sTWFuYWdlciIsInJlbGlnaW9uTWFuYWdlciIsInNwYWNlTWFuYWdlciIsImVuZ2luZSIsImNoZWNrZWRMaXN0IiwiY2hlY2tMaXN0IiwiY2hlY2siLCJibGQiLCJ1bmljb3JuUGFzdHVyZSIsInBhbmVsQnV0dG9uIiwicmVqZWN0IiwiY2hlY2tlZCIsImNoYWxsZW5nZUluZGV4IiwidGVtcG9yYWxGbHV4Iiwic2hhdHRlckNvc3RJbmNyZWFzZUNoYWxsZW5nZSIsInRpbWVDcnlzdGFsc0F2YWlsYWJsZSIsInNoYXR0ZXJWb2lkQ29zdCIsInZvaWRBdmFpbGFibGUiLCJoZWF0TWF4IiwiaGVhdE5vdyIsImZhY3RvciIsIm1heFNraXBzQWN0aXZlSGVhdFRyYW5zZmVyIiwiaGVhdFBlclRpY2siLCJ0aWNrc1BlclNlY29uZCIsInRlbXBvcmFsRmx1eFByb2R1Y3Rpb24iLCJkYXlzUGVyWWVhciIsInRpY2tzUGVyRGF5IiwiZGF5c1BlclRpY2tzIiwidGlja3NQZXJZZWFyIiwiZmx1eEVuYWJsZWQiLCJmbHV4IiwibWF4U2tpcHMiLCJjYW5Ta2lwIiwid2lsbFNraXAiLCJ5ZWFyc1BlckN5Y2xlIiwicmVtYWluaW5nWWVhcnNDdXJyZW50Q3ljbGUiLCJjeWNsZXNQZXJFcmEiLCJza2lwQ3ljbGVzIiwic2hhdHRlciIsIlRpbWVNYW5hZ2VyIiwiYnVpbGRNZXRhIiwiYnVpbGRCdXR0b24iLCJidWlsZGluZ01ldGFEYXRhIiwiYnRuIiwiZml4ZWQiLCJmaXhIYXBwZW5lZCIsIlRyYWRlTWFuYWdlciIsImNhdHBvd2VyIiwiZ29sZCIsInRyYWRlcyIsInRyYWRlIiwicHJvZml0YWJsZSIsIm1heFRyYWRlcyIsIm1heEJ5UmFjZSIsInRyYWRlSW5kZXgiLCJ0cmFkZVNldHRpbmdzIiwidHJpZ0NvbmRpdGlvbnMiLCJ0cmFkZVBvcyIsInRyYWRlc0RvbmUiLCJyYW5kb21SYWNlSW5kZXgiLCJtaW5UcmFkZXMiLCJtaW5UcmFkZUluZGV4IiwidHJhZGVOZXQiLCJtYXRBbW91bnQiLCJtZWFuT3V0cHV0Iiwib3V0Iiwib3V0VmFsdWUiLCJjb3VudCIsImN1bHR1cmUiLCJjdWx0dXJlVmFsIiwicmFjZVBhbmVscyIsImVtYmFzc3lCdWxrIiwiYnVsa1RyYWNrZXIiLCJwYW5lbEluZGV4IiwicmFjZUluZGV4IiwiZW1CdWxrIiwibmV4dFByaWNlIiwibGV2aWF0aGFuSW5mbyIsIm5lY3JvY29ybnMiLCJtYXhSYWNlcyIsIm1hbnBvd2VyIiwidW5sb2NrZWRSYWNlIiwiY29pblByaWNlIiwicmVsaWNzSW5pdGlhbCIsImNvaW5zSW5pdGlhbCIsImNvaW5zRXhjaGFuZ2VkIiwicmVsaWNzRXhjaGFuZ2VkIiwiY3VycmVudENvaW4iLCJyZWxpY3NDdXJyZW50IiwidGljayIsInByb2ZpdCIsInByb2QiLCJzdGFuZGluZ1JhdGlvIiwicmFjZVJhdGlvIiwidHJhZGVSYXRpbyIsImZhaWxlZFJhdGlvIiwic3VjY2Vzc1JhdGlvIiwiYm9udXNSYXRpbyIsIm1lYW4iLCJ0cmFkZUNoYW5jZSIsInNoaXBDb3VudCIsInRpdGFuaXVtUHJvYmFiaWxpdHkiLCJzZWFzaW9uUmF0aW8iLCJub3JtQm91Z2h0Iiwibm9ybUJvbnVzIiwic3BpY2VDaGFuY2UiLCJzcGljZVRyYWRlQW1vdW50IiwiX2xpbWl0ZWQiLCJfdHJpZ0NvbmRpdGlvbnMiLCJyZXF1aXJlZCIsIm1hbnBvd2VyQ29zdCIsImdvbGRDb3N0IiwiaGlnaGVzdENhcGFjaXR5IiwidHJhZGVPdXRwdXQiLCJjYXBhY2l0eSIsInJhY2VJbmZvIiwiTWF0ZXJpYWxzQ2FjaGUiLCJjYWNoZUluZGV4Iiwib2xkRGF0YSIsIm9sZE1hdGVyaWFscyIsImN1cnJlbnRUaWNrIiwic3RhcnRpbmdUaWNrIiwiVmlsbGFnZU1hbmFnZXIiLCJmcmVlS2l0dGVucyIsImFzc2lnbmVkS2l0dGVuIiwiam9ic05vdENhcHBlZCIsInVubG9ja2VkIiwibWF4S2l0dGVuc0luSm9iIiwibWF4S2l0dGVuc1RvQXNzaWduIiwia2l0dGVuc0luSm9iIiwibm9GYXJtZXJzQXNzaWduZWQiLCJqb2JOYW1lIiwia2l0dGVucyIsImxlYWRlciIsImxlYWRlckNhbmRpZGF0ZXMiLCJraXR0ZW4iLCJiZXN0TGVhZGVyIiwia2l0dGVuSW5kZXgiLCJ0aWVyIiwiZW5naW5lZXJTcGVjaWFsaXR5IiwicmFuayIsImdvbGRTdG9jayIsImh1bnRDb3VudCIsImF2ZXJhZ2VPdXRwdXQiLCJ0cnVlT3V0cHV0IiwiY3JhZnRNYW5hZ2VyIiwiY2F0cG93UHJvZml0YWJsZSIsImN1bHR1cmVQcm9maXRhYmxlIiwicGFyY2hQcm9maXRhYmxlIiwiYmVmb3JlRGF5cyIsImkxOG5EYXRhIiwiZGVERSIsImVuVVMiLCJoZUlMIiwiemhDTiIsImxvY2FsZSIsInJlYnVpbGRVSSIsInByZXZpb3VzTG9jYWxlIiwia3NWZXJzaW9uIiwiYXR0ZW1wdExvYWQiLCJsb2FkZXIiLCJtc2ciLCJsb29wIiwidGltZVRha2VuIiwiZmlsdGVyQ2hlY2tib3hlcyIsImNoZWNrYm94Iiwic3ltYm9sIiwicGxhbmV0IiwiY3ljbGVDYW5kaWRhdGUiLCJhcmdJbmRleCIsImkxOG5MaXRlcmFsIiwiaTE4bkFyZ3MiLCJsb2dTdHlsZSIsInRleHQiLCJhY3Rpdml0eUNsYXNzIiwic3VtbWFyeUxpbmUiLCJjc3NDbGFzc2VzIiwiY29sb3IiLCJmaWx0ZXJJdGVtIiwic3ViU2VjdGlvblRyaWdnZXIiLCJ0b1plcm9JZkluZmluaXR5IiwicGFyc2VOdW1iZXIiLCJtaWxsaXNlY29uZHMiLCJwYXJzZUJpZ2ludCIsInBhcnNlTWlsbGlzZWNvbmRzIiwiaXNaZXJvIiwicGx1cmFsaXplIiwid29yZCIsIlNFQ09ORF9ST1VORElOR19FUFNJTE9OIiwiT05FX0RBWV9JTl9NSUxMSVNFQ09ORFMiLCJmb3JtYXRNaWxsaXNlY29uZHMiLCJpc0JpZ0ludCIsIm9wdGlvbnNBZGp1c3RlZCIsImZsb29yRGVjaW1hbHMiLCJkZWNpbWFsRGlnaXRzIiwiZmxvb3JlZEludGVyaW1WYWx1ZSIsImFkZCIsImxvbmciLCJzaG9ydCIsInZhbHVlU3RyaW5nIiwid2hvbGVEaWdpdHMiLCJtaW5MZW5ndGgiLCJwYXJzZWQiLCJzZWNvbmRzIiwibWljcm9zZWNvbmRzIiwibmFub3NlY29uZHMiLCJtaWxsaXNlY29uZHNBbmRCZWxvdyIsIm1pbGxpc2Vjb25kc0RlY2ltYWxEaWdpdHMiLCJyb3VuZGVkTWlsbGlzZWNvbmRzIiwibWlsbGlzZWNvbmRzU3RyaW5nIiwic2Vjb25kc0RlY2ltYWxEaWdpdHMiLCJzZWNvbmRzRml4ZWQiLCJzZWNvbmRzU3RyaW5nIiwic2VwYXJhdG9yIiwiSWNvbnMiLCJfVWlDb21wb25lbnQiLCJwYXJlbnQiLCJ3aXRoQ2hpbGRyZW4iLCJkZXB0aCIsInRyYWNlIiwiZm9yY2UiLCJjaGlsZHJlbiIsIlVpQ29tcG9uZW50IiwiQ29udGFpbmVyIiwiY2xhc3NOYW1lIiwiTGlzdEl0ZW0iLCJzdHlsZXNEZWxpbWl0ZXIiLCJMYWJlbExpc3RJdGVtIiwic3R5bGVzTGlzdEl0ZW0iLCJzdHlsZXMiLCJpY29uRWxlbWVudCIsIlNldHRpbmdMaXN0SXRlbSIsInN0eWxlc1NldHRpbmdMaXN0SXRlbSIsIl9ldmVudCIsImlzQmF0Y2hQcm9jZXNzIiwiSWNvbkJ1dHRvbiIsInBhdGhEYXRhIiwidGl0bGUiLCJzdHlsZXNCdXR0b24iLCJTZXR0aW5nc0xpc3QiLCJ0b29sT3B0aW9ucyIsImhhc1Rvb2xzIiwidG9vbHMiLCJldmVudCIsIm9uUmVzZXQiLCJFeHBhbmRvQnV0dG9uIiwiQ29sbGFwc2libGVQYW5lbCIsImhlYWQiLCJleHBhbmRvIiwiZXhwYW5kIiwidG9nZ2xlTmVzdGVkIiwidmlzaWJsZSIsInRvZ2dsZUNoaWxkcmVuIiwiU2V0dGluZ3NQYW5lbCIsInNldHRpbmdJdGVtIiwiX3ZhbHVlIiwiQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3NVaSIsIl9sb2NhbGUiLCJzZWN0aW9uU2V0dGluZyIsIl9pc0JhdGNoUHJvY2VzcyIsInN0eWxlc0xhYmVsTGlzdEl0ZW0iLCJpdGVtc0xpc3QiLCJCdXR0b24iLCJEZWxpbWl0ZXIiLCJIZWFkZXJMaXN0SXRlbSIsIklucHV0IiwiUGFyYWdyYXBoIiwiRGlhbG9nIiwic3R5bGVzVG9vbGJhckxpc3RJdGVtIiwiaW5pdGlhbFZhbHVlIiwiZXhwbGFpbmVyIiwic3R5bGVzRXhwbGFpbmVyIiwiTWF4QnV0dG9uIiwiVHJpZ2dlckJ1dHRvbiIsInRyaWdnZXJWYWx1ZSIsIlNldHRpbmdNYXhUcmlnZ2VyTGlzdEl0ZW0iLCJCdWlsZFNlY3Rpb25Ub29scyIsInNlY3Rpb25MYWJlbCIsIm9uU2V0TWF4IiwiZWxlbWVudCIsIlNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0iLCJCb25maXJlU2V0dGluZ3NVaSIsIl8iLCJidWlsZGluZ0dyb3VwIiwiRW5naW5lU2V0dGluZ3NVaSIsIkJ1dHRvbkxpc3RJdGVtIiwiRmllbGRzZXQiLCJsZWdlbmQiLCJzdHlsZXNMYWJlbCIsIlJhZGlvSXRlbSIsImdyb3VwS2V5IiwiT3B0aW9uc0xpc3RJdGVtIiwiVGV4dEJ1dHRvbiIsIkludGVybmFsc1VpIiwiRXhwbGFpbmVyTGlzdEl0ZW0iLCJMb2dGaWx0ZXJzU2V0dGluZ3NVaSIsImxpc3RGaWx0ZXJzIiwiUmVsaWdpb25TZXR0aW5nc1VpIiwiYnVpbGRpbmdOYW1lIiwic3R5bGVzVGltZVNraXBIZWF0U2V0dGluZ3MiLCJ1bmljb3Juc0FycmF5IiwiemlnZ3VyYXRVcGdyYWRlIiwiZGVmYXVsdHMiLCJDb25zdW1lQnV0dG9uIiwiY29uc3VtZVZhbHVlIiwiU3RvY2tCdXR0b24iLCJzdG9ja1ZhbHVlIiwiUmVzb3VyY2VzU2V0dGluZ3NVaSIsImlnbm9yZWRSZXNvdXJjZXMiLCJzdG9ja0VsZW1lbnQiLCJjb25zdW1lRWxlbWVudCIsIlBvbGljeVNldHRpbmdzVWkiLCJsYXN0TGFiZWwiLCJUZWNoU2V0dGluZ3NVaSIsIlNjaWVuY2VTZXR0aW5nc1VpIiwiTWlzc2lvblNldHRpbmdzVWkiLCJTcGFjZVNldHRpbmdzVWkiLCJpbmRleFBsYW5ldCIsImFycmF5UGxhbnQiLCJpbmRleEJ1aWxkaW5nIiwiYXJyYXlCdWlsZGluZyIsImxpc3RBZGRpdGlvbiIsIkludmFsaWRBcmd1bWVudEVycm9yIiwibWludXRlc0luTW9udGgiLCJtaW51dGVzSW5EYXkiLCJjb25zdHJ1Y3RGcm9tU3ltYm9sIiwiY29uc3RydWN0RnJvbSIsImRhdGUiLCJjb25zdHJ1Y3ROb3ciLCJmb3JtYXREaXN0YW5jZUxvY2FsZSIsImZvcm1hdERpc3RhbmNlIiwidG9rZW5WYWx1ZSIsImJ1aWxkRm9ybWF0TG9uZ0ZuIiwid2lkdGgiLCJkYXRlRm9ybWF0cyIsInRpbWVGb3JtYXRzIiwiZGF0ZVRpbWVGb3JtYXRzIiwiZm9ybWF0TG9uZyIsImZvcm1hdFJlbGF0aXZlTG9jYWxlIiwiZm9ybWF0UmVsYXRpdmUiLCJfZGF0ZSIsIl9iYXNlRGF0ZSIsImJ1aWxkTG9jYWxpemVGbiIsInZhbHVlc0FycmF5IiwiZGVmYXVsdFdpZHRoIiwiZXJhVmFsdWVzIiwicXVhcnRlclZhbHVlcyIsIm1vbnRoVmFsdWVzIiwiZGF5VmFsdWVzIiwiZGF5UGVyaW9kVmFsdWVzIiwiZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyIsImxvY2FsaXplIiwiZGlydHlOdW1iZXIiLCJudW1iZXIiLCJyZW0xMDAiLCJxdWFydGVyIiwiYnVpbGRNYXRjaEZuIiwic3RyaW5nIiwibWF0Y2hQYXR0ZXJuIiwibWF0Y2hSZXN1bHQiLCJtYXRjaGVkU3RyaW5nIiwicGFyc2VQYXR0ZXJucyIsImZpbmRJbmRleCIsInBhdHRlcm4iLCJmaW5kS2V5IiwicmVzdCIsIm9iamVjdCIsInByZWRpY2F0ZSIsImFycmF5IiwiYnVpbGRNYXRjaFBhdHRlcm5GbiIsInBhcnNlUmVzdWx0IiwibWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybiIsInBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4iLCJtYXRjaEVyYVBhdHRlcm5zIiwicGFyc2VFcmFQYXR0ZXJucyIsIm1hdGNoUXVhcnRlclBhdHRlcm5zIiwicGFyc2VRdWFydGVyUGF0dGVybnMiLCJtYXRjaE1vbnRoUGF0dGVybnMiLCJwYXJzZU1vbnRoUGF0dGVybnMiLCJtYXRjaERheVBhdHRlcm5zIiwicGFyc2VEYXlQYXR0ZXJucyIsIm1hdGNoRGF5UGVyaW9kUGF0dGVybnMiLCJwYXJzZURheVBlcmlvZFBhdHRlcm5zIiwiZGVmYXVsdE9wdGlvbnMiLCJnZXREZWZhdWx0T3B0aW9ucyIsInRvRGF0ZSIsImFyZ3VtZW50IiwiZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyIsInV0Y0RhdGUiLCJub3JtYWxpemVEYXRlcyIsImRhdGVzIiwibm9ybWFsaXplIiwiY29tcGFyZUFzYyIsImRhdGVMZWZ0IiwiZGF0ZVJpZ2h0IiwiZGlmZiIsImRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzIiwibGF0ZXJEYXRlIiwiZWFybGllckRhdGUiLCJsYXRlckRhdGVfIiwiZWFybGllckRhdGVfIiwieWVhcnNEaWZmIiwibW9udGhzRGlmZiIsImVuZE9mRGF5IiwiZW5kT2ZNb250aCIsIm1vbnRoIiwiaXNMYXN0RGF5T2ZNb250aCIsImRpZmZlcmVuY2VJbk1vbnRocyIsIndvcmtpbmdMYXRlckRhdGUiLCJzaWduIiwiaXNMYXN0TW9udGhOb3RGdWxsIiwiZ2V0Um91bmRpbmdNZXRob2QiLCJtZXRob2QiLCJkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMiLCJkaWZmZXJlbmNlSW5TZWNvbmRzIiwiZGVmYXVsdExvY2FsZSIsIm1pbnV0ZXNJbkFsbW9zdFR3b0RheXMiLCJjb21wYXJpc29uIiwibG9jYWxpemVPcHRpb25zIiwib2Zmc2V0SW5TZWNvbmRzIiwibWludXRlcyIsIm1vbnRocyIsImhvdXJzIiwibmVhcmVzdE1vbnRoIiwibW9udGhzU2luY2VTdGFydE9mWWVhciIsImZvcm1hdERpc3RhbmNlVG9Ob3ciLCJzdGFydE9mV2VlayIsIndlZWtTdGFydHNPbiIsImRheSIsImlzU2FtZVdlZWsiLCJmb3JtYXR0aW5nTW9udGhWYWx1ZXMiLCJkZSIsInVuaXQiLCJpc0ZlbWFsZSIsIm1hbGUiLCJmZW1hbGUiLCJvcmRpbmFsTmFtZSIsImhlIiwiY2hlY2tXZWVrIiwiYmFzZURhdGUiLCJiYXNlRm9ybWF0IiwiZm9ybWF0IiwiU2F2ZWdhbWVMb2FkZXIiLCJjb21wcmVzc2VkIiwiVG9vbGJhckxpc3RJdGVtIiwiU3RhdGVNYW5hZ2VtZW50VWkiLCJnYW1lT2JqZWN0Iiwic3RhdGVJbmRleCIsInN0YXRlT2JqZWN0IiwiS2l0dGVuU2NpZW50aXN0cyIsImdhbWVTbG90Iiwic3RhdGVTbG90Iiwic2F2ZURhdGFTdHJpbmciLCJlbmNvZGVkRGF0YSIsInVzZXJJbnB1dCIsImltcG9ydElkIiwiaW1wb3J0U2VxdWVuY2UiLCJtYWtlSW1wb3J0TGFiZWwiLCJpbnRlcm5hbEltcG9ydCIsInN1YmplY3REYXRhIiwidW5jb21wcmVzc2VkIiwibGluZSIsInN0YXRlTGFiZWwiLCJnYW1lTGFiZWwiLCJleGlzdGluZyIsInN0YXRlc0pzb24iLCJibG9iIiwidXJsIiwibmV3R2FtZSIsIm5ld1N0YXRlIiwiSWNvblNldHRpbmdzUGFuZWwiLCJSZXNldEJvbmZpcmVTZXR0aW5nc1VpIiwibGlzdEJ1aWxkaW5ncyIsImRlbGltaXRlciIsInVwZ3JhZGVJbmRpY2F0b3IiLCJSZXNldFJlbGlnaW9uU2V0dGluZ3NVaSIsIlJlc2V0UmVzb3VyY2VzU2V0dGluZ3NVaSIsIlJlc2V0U3BhY2VTZXR0aW5nc1VpIiwicGxhbnQiLCJSZXNldFRpbWVTZXR0aW5nc1VpIiwiUmVzZXRVcGdyYWRlc1NldHRpbmdzVWkiLCJsYXN0RWxlbWVudCIsIlJlc2V0U2V0dGluZ3NVaSIsImxpc3QiLCJDeWNsZXNMaXN0IiwibWFrZUN5Y2xlIiwiY3ljbGVzIiwiU2Vhc29uc0xpc3QiLCJtYWtlU2Vhc29uIiwiVGltZVNraXBIZWF0U2V0dGluZ3NVaSIsInNlY3Rpb25QYXJlbnRTZXR0aW5nIiwiVGltZVNraXBTZXR0aW5nc1VpIiwiVGltZUNvbnRyb2xTZXR0aW5nc1VpIiwiYWNjZWxlcmF0ZUxhYmVsIiwiVGltZVNldHRpbmdzVWkiLCJCdXlCdXR0b24iLCJTZWxsQnV0dG9uIiwiTGltaXRlZEJ1dHRvbiIsIlNldHRpbmdMaW1pdGVkTGlzdEl0ZW0iLCJTZXR0aW5nTGltaXRlZFRyaWdnZXJMaXN0SXRlbSIsIlNldHRpbmdNYXhMaXN0SXRlbSIsIkVtYmFzc3lTZXR0aW5nc1VpIiwibGlzdFJhY2VzIiwiVHJhZGVTZXR0aW5nc1VpIiwibGFiZWxTZWFzb24iLCJWaWxsYWdlU2V0dGluZ3NVaSIsImxpc3RKb2JzIiwiV29ya3Nob3BDcmFmdExpc3RJdGVtIiwiVXBncmFkZVNldHRpbmdzVWkiLCJXb3Jrc2hvcFNldHRpbmdzVWkiLCJleGNsdWRlQ3JhZnRzQXJyYXkiLCJwcmVwYXJlZENyYWZ0cyIsImxpc3RDcmFmdHMiLCJVc2VySW50ZXJmYWNlIiwib3B0aW9uc0xpc3RFbGVtZW50Iiwic2VjdGlvbnNWaXNpYmxlIiwicGFuZWxzT3BlbiIsInVzaW5nS1NDb2x1bW4iLCJyaWdodCIsIm9wdGlvbnNQYWdlQ29udGVudCIsIl93aXRoQ2hpbGRyZW4iLCJfdHJhY2UiLCJwcmVmaXgiLCJlbmdpbmVTdGF0ZSIsIl9zYXZlRGF0YSIsIm1hbmFnZXJJbmRleCIsImhhc1N1ZmZpeCIsImJhc2VWYWx1ZSIsIm51bWVyaWNWYWx1ZSIsInN1ZmZpeCIsImZsb2F0VmFsdWUiLCJjbGVhbmVkVmFsdWUiLCJ3aXRoVW5pdCIsInNldHRpbmdzU3RyaW5nIiwiY29tcHJlc3NlZFNldHRpbmdzIiwibmFpdmVQYXJzZSIsInJlcXVpcmVzVWlSZWJ1aWxkIiwiZW5jb2RlZFNldHRpbmdzIiwidiIsIm1haW4iLCJ1c2VyU2NyaXB0Il0sIm1hcHBpbmdzIjoiaTNCQU1PLE1BQU1BLEVBQTJCQyxHQUNOQyxHQUFVLENBQ3BDRCxFQUFRLE1BQU1DLENBQUssQ0FDdEIsRUNGRSxTQUFTQyxFQUFNQyxFQUFTLENBQzNCLE9BQU9BLEdBQVksSUFDdkIsQ0FVTyxTQUFTQyxHQUFHRCxFQUFTRSxFQUFXLENBQ25DLE1BQU8sQ0FBQ0gsRUFBTUMsQ0FBTyxHQUFLQSxhQUFtQkUsQ0FDakQsQ0FJTyxNQUFNQyxXQUEyQixLQUFNLENBSzFDLFlBQVlDLEVBQVUsdUJBQXdCLENBQzFDLE1BQU1BLENBQU8sQ0FDckIsQ0FDQSxDQVNPLFNBQVNDLEVBQVVMLEVBQVNNLEVBQWMsQ0FDN0MsR0FBSVAsRUFBTUMsQ0FBTyxFQUNiLE1BQU0sSUFBSUcsR0FBbUJHLENBQVksRUFFN0MsT0FBT04sQ0FDWCxDQTJETyxTQUFTTyxHQUFjQyxFQUFVQyxFQUFJLENBQ3hDLE1BQU1DLEVBQVMsSUFBSSxNQUNuQixVQUFXQyxLQUFXSCxFQUNiVCxFQUFNWSxDQUFPLEVBR1JaLEVBQU1VLENBQUUsR0FDZEMsRUFBTyxLQUFLRCxDQUFFLEVBSGRDLEVBQU8sS0FBS0MsQ0FBTyxFQU0zQixPQUFPRCxDQUNYLENDbEhPLE1BQU1FLFdBQXNCLEtBQU0sQ0FlckMsWUFBWUMsRUFBTVQsRUFBU1UsRUFBUSxDQUMvQixNQUFNVixDQUFPLEVBWmpCVyxFQUFBLGVBSUFBLEVBQUEsYUFTSSxLQUFLLEtBQU9GLEVBQ1osS0FBSyxLQUFPLGdCQUNaLEtBQUssT0FBU0MsRUFDVixPQUFPLE1BQU0sa0JBQXNCLEtBR25DLE1BQU0sa0JBQWtCLEtBQU1GLEVBQWEsQ0FFdkQsQ0FTSSxPQUFPLGdCQUFnQmQsRUFBT2tCLEVBQXFCLEdBQU0sQ0FDckQsR0FBSWxCLGFBQWlCYyxHQUNqQixNQUFPLEdBS1gsR0FBSUksRUFBb0IsQ0FDcEIsTUFBTUMsRUFBY25CLEVBQ3BCLEdBQUksT0FB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QzFDLE1BQUE1MUIsRUFBV293QixHQUFpQixlQUFld0YsQ0FBZSxFQUNoRSxLQUFLLFlBQVk1MUIsQ0FBUSxDQUFBLENBVTNCLE1BQU0sYUFBYUEsRUFBVyxLQUFLLFlBQVksRUFBR21RLEVBQVcsR0FBTSxDQUNqRSxNQUFNeWxCLEVBQWtCeEYsR0FBaUIsZUFBZXB3QixFQUFVbVEsQ0FBUSxFQUMxRSxNQUFNL0YsRUFBaUIsT0FBTyxVQUFVLFVBQVUsVUFBVXdyQixDQUFlLENBQUEsQ0FXN0UsT0FBTyw0QkFBNEIxakMsRUFBZ0MsQ0FDakUsTUFBTTJqQyxFQUFLM2pDLEVBQTJCLEVBQ3RDLEdBQUksQ0FBQ0QsRUFBTTRqQyxDQUFDLEdBQUssT0FBT0EsR0FBTSxVQUN4QkEsRUFBRSxXQUFXLEdBQUcsRUFDWCxPQUFBM2pDLEVBR0wsTUFBQSxJQUFJLE1BQU0sMkJBQTJCLENBQUEsQ0FLN0Msb0JBQXFCLENBQ25CLFFBQVEsS0FBSyxHQUFHNkYsRUFBRyxpQ0FBaUMsQ0FBQyxFQUNyRCxLQUFLLEtBQUssU0FBUyxLQUFLLEtBQUssWUFBWSxDQUFBLENBMkI3QyxDQ3ZjYSxNQUFBKzlCLEdBQU8sU0FBWSxDQUM5QixNQUFNQyxFQUFhLE1BQU0sSUFBSTNyQixFQUFtQixFQUFBLFlBQVlnbUIsR0FBa0IsSUFBSSxFQUVsRmhtQixFQUFpQixPQUFPLGlCQUFtQjJyQixFQUUzQ0EsRUFBVyxhQUFhLEVBQ3hCQSxFQUFXLElBQUksQ0FDakIsRUFJSSxPQUFPLEdBQU8sS0FDaEJELEtBQU8sTUFBTWhrQyxFQUF3QixPQUFPLENBQUMiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwzNCw2OCwxMTEsMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTI0LDEyNSwxMjYsMTI3LDEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTldfQ==
|
|
23
|
+
(function(){"use strict";try{if(typeof document<"u"){var t=document.createElement("style");t.id="ks-styles",t.appendChild(document.createTextNode('._label_1nlev_1{align-content:center;display:inline-block;flex:0 1 fit-content;opacity:.8;white-space:nowrap;transition:.3s}._label_1nlev_1:hover{opacity:1}._splitter_1nlev_16 ._label_1nlev_1:first-letter{font-weight:700}._iconLabel_1nlev_20{display:inline-block;margin-right:4px;margin-left:2px;vertical-align:middle}._fillSpace_1nlev_26{flex:1}._delimiter_16hnh_1{margin-bottom:10px}._head_wr1pj_1{display:flex;align-items:stretch;flex-direction:row;justify-content:flex-start;width:100%;transition:.3s}._head_wr1pj_1>._headFlexItem_wr1pj_10{flex:1;margin-right:8px}._setting_1ndg5_1{border-bottom:1px solid transparent;transition:border-bottom .3s}._setting_1ndg5_1 ._checkbox_1ndg5_6{margin:1px 5px 2px 2px}._setting_1ndg5_1 ._panelContent_1ndg5_10{border-left:1px dashed grey;padding-left:16px;margin-left:8px;margin-top:1px;opacity:.5}._setting_1ndg5_1 ._panelContent_1ndg5_10._hidden_1ndg5_17{display:none}._setting_1ndg5_1._checked_1ndg5_22>._panelContent_1ndg5_10{opacity:1}._setting_1ndg5_1._expanded_1ndg5_26{margin-bottom:10px}._setting_1ndg5_1:not(._expanded_1ndg5_26):hover{border-bottom:1px dashed rgba(160,160,160,.2)}._setting_1ndg5_1._readonly_1ndg5_34{cursor:default;pointer-events:none}@keyframes _hail-rainbow_q7zpt_1{0%,to{color:red;text-shadow:0 0 10px red}33%{color:#888;text-shadow:0 0 10px yellow}66%{color:#fff;text-shadow:0 0 10px black}}._iconButton_q7zpt_17{cursor:pointer;display:block;padding-right:3px;line-height:0;opacity:.8;transition:.3s}._iconButton_q7zpt_17:hover{opacity:1}._iconButton_q7zpt_17._inactive_q7zpt_29{opacity:.4}._iconButton_q7zpt_17._inactive_q7zpt_29:hover{opacity:.6}._iconButton_q7zpt_17._ineffective_q7zpt_37{color:red;animation:_hail-rainbow_q7zpt_1 5s linear infinite}._button_q7zpt_43{align-items:end;cursor:pointer;display:flex;opacity:.8;transition:.3s}._button_q7zpt_43:hover{opacity:1}._button_q7zpt_43._inactive_q7zpt_29{opacity:.4}._button_q7zpt_43._inactive_q7zpt_29:hover{opacity:.6}._button_q7zpt_43._ineffective_q7zpt_37{color:red;animation:_hail-rainbow_q7zpt_1 5s linear infinite}._button_q7zpt_43._readonly_q7zpt_67{cursor:default;pointer-events:none}._button_q7zpt_43 ._buttonIcon_q7zpt_72{margin:0 2px 0 0;vertical-align:sub}._button_q7zpt_43._alignRight_q7zpt_77{justify-content:end}._button_q7zpt_43._large_q7zpt_81{padding:5px 10px}._button_q7zpt_43._bordered_q7zpt_85{border:1px solid rgba(180,180,180,.2)}._button_q7zpt_43._bordered_q7zpt_85:not(._large_q7zpt_81){padding:0 2px}._button_q7zpt_43._bordered_q7zpt_85:hover{border:1px solid rgba(180,180,180,1)}._button_q7zpt_43._headAction_q7zpt_97{min-width:50px}._button_q7zpt_43._lastHeadAction_q7zpt_100{padding-right:20px}._button_q7zpt_43._consumeButton_q7zpt_104,._button_q7zpt_43._stockButton_q7zpt_107{border:1px solid transparent}._button_q7zpt_43:not(._bordered_q7zpt_85)+._button_q7zpt_43:not(._bordered_q7zpt_85):before{content:"";display:inline-block;height:1em;border-left:1px solid transparent}._button_q7zpt_43:not(._bordered_q7zpt_85):not(._inactive_q7zpt_29)._alignRight_q7zpt_77+._button_q7zpt_43:not(._bordered_q7zpt_85):not(._inactive_q7zpt_29):before{content:"";display:inline-block;height:1em;border-left:1px solid rgba(180,180,180,.4)}._listContainer_1kxbq_1{margin-bottom:4px}._itemsList_1kxbq_5{-webkit-user-select:none;user-select:none}._list_1kxbq_1~._listTools_1kxbq_9{border-top:1px dotted rgba(128,128,128,.3);margin-left:0;padding-top:2px}._list_1kxbq_1~._listTools_1kxbq_9 *{display:inline-block}._expandoButton_l1ukp_1:not(._expanded_l1ukp_1) ._up_l1ukp_1{display:none}._expandoButton_l1ukp_1:not(._expanded_l1ukp_1) ._down_l1ukp_4{opacity:.6}._expandoButton_l1ukp_1:not(._expanded_l1ukp_1) ._down_l1ukp_4:hover{opacity:1}._expandoButton_l1ukp_1._expanded_l1ukp_1 ._down_l1ukp_4{display:none}#gamePageContainer .dialog.help ._dialog_1276o_1{display:flex;flex-direction:column;height:fit-content!important;box-shadow:none!important}#gamePageContainer .dialog.help ._dialog_1276o_1 ._close_1276o_7{position:absolute;top:10px;right:15px}._explainer_1idu3_1{color:#888;display:inline-block;min-width:100px;-webkit-user-select:none;user-select:none;padding:4px;white-space:break-spaces}._explainer_1idu3_1 p{margin:0}._header_19ql8_1{display:block;margin-bottom:3px;min-width:100px;border-bottom:1px dashed rgba(255,255,255,.1);font-weight:700;-webkit-user-select:none;user-select:none}._toolbar_1654f_1{display:flex;flex-direction:row;padding:0 0 2px;margin:0 0 3px}._toolbar_1654f_1>*{margin:0 3px 0 0}._maxButton_133h2_1{padding-right:5px;padding-top:2px}._fieldset_tfwil_1{border-bottom:none;border-right:none;border-top:none}._textButton_1mv97_1{display:inline-block;white-space:nowrap;opacity:.8;cursor:pointer;-webkit-user-select:none;user-select:none}._textButton_1mv97_1:hover{opacity:1}@keyframes _scale_6c09s_1{0%{scale:.5;opacity:0}50%{scale:1;opacity:1}to{scale:2;opacity:0}}._active_6c09s_16{text-shadow:rgba(128,128,128,.8) 0 0 15px;position:relative}._active_6c09s_16:after,._active_6c09s_16:before{display:inline-block;width:1em;height:100%;position:absolute;right:-1.5em;scale:0;text-align:center;transform-origin:center}._active_6c09s_16:after{content:attr(data-ks-active-from);animation:_scale_6c09s_1 8s linear infinite}._active_6c09s_16:before{content:attr(data-ks-active-to);animation:_scale_6c09s_1 8s linear infinite;animation-delay:4s}._buyButton_10eul_1,._sellButton_1tmvd_1{display:inline-block;padding-right:10px;min-width:86px}#ksColumn{min-width:250px;max-width:440px;vertical-align:top;padding-left:8px;top:20px;position:relative;overflow-y:auto}#footerLinks{display:flex;flex-direction:column;position:fixed;text-align:right;line-height:0;right:-5px!important;margin-bottom:1em}#footerLinks a{line-height:1;padding-right:10px;opacity:.5;transition:.3s;text-decoration:none;text-transform:lowercase}#footerLinks a:hover{opacity:1}#crowdjet-expand-container{position:fixed!important;bottom:10px!important;right:-10px!important;opacity:.5}#crowdjet-expand-container:hover{opacity:1}._spacer_auis8_44{display:block;margin-bottom:100px}._ui_auis8_49{margin:5px 0 10px;padding-right:10px}._ui_auis8_49 ul{list-style:none;margin:0;padding:0}._ui_auis8_49 #_toggle-list-resources_auis8_1 ._stockWarn_auis8_60 *,._ui_auis8_49 #_toggle-reset-list-resources_auis8_1 ._stockWarn_auis8_60 *{color:#dd1e00}._showActivity_auis8_66{cursor:pointer;display:inline-block;vertical-align:middle}#game #rightColumn{overflow-y:auto}#game #rightColumn #rightTabLog{overflow-y:visible}#game #rightColumn #rightTabLog #gameLog{height:auto;min-height:auto;overflow-y:visible}#game .res-row .res-cell.ks-stock-above{color:green}#game .res-row .res-cell.ks-stock-below{color:red}')),document.head.appendChild(t)}}catch(e){console.error("vite-plugin-css-injected-by-js",e)}})();
|