Jump to content

User:Eejit43/scripts/afcrc-helper.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <nowiki>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/afcrc-helper.ts

"use strict";mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],()=>{const z=mw.config.get("wgPageName")==="Wikipedia:Articles_for_creation/Redirects",Y=mw.config.get("wgPageName")==="Wikipedia:Articles_for_creation/Categories";if(!z&&!Y)return;const F=z?"redirect":"category";mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#",`Handle ${F} creation requests`,"afcrc-helper").addEventListener("click",B=>{B.preventDefault();const t=new OO.ui.WindowManager;document.body.append(t.$element[0]);const e=new I(F,mw.config.get("wgPageName").replaceAll("_"," "));t.addWindows([e]),e.open(),e.load()});class N extends OO.ui.Dialog{contentLayout;logOutput;closeButton;constructor(){super({size:"large"}),N.static.name="ShowActionsDialog",N.static.title="Actions"}initialize=()=>(OO.ui.Dialog.prototype.initialize.apply(this),mw.util.addCSS(`
.afcrc-helper-actions-container div {
    margin-block: 8px;
}`),this.contentLayout=new OO.ui.PanelLayout({padded:!0,expanded:!1}),this.$body.append(this.contentLayout.$element),this.logOutput=document.createElement("div"),this.logOutput.classList.add("afcrc-helper-actions-container"),this.closeButton=new OO.ui.ButtonWidget({label:"Close",flags:["safe","close"]}),this.closeButton.on("click",()=>this.close()),this.contentLayout.$element.append(this.logOutput,this.closeButton.$element),this);addLogEntry(t,e="notice"){const s=new OO.ui.MessageWidget({type:e,inline:!0,label:new OO.ui.HtmlSnippet(t)});this.logOutput.append(s.$element[0]),this.updateSize(),this.closeButton.scrollElementIntoView()}showReload(){this.closeButton.$element.remove();const t=new OO.ui.ButtonWidget({label:"Reload",flags:["primary"]});t.on("click",()=>window.location.reload()),this.contentLayout.$element.append(t.$element)}}Object.assign(N.prototype,OO.ui.Dialog.prototype);class _ extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{const t=this.getValue(),e=$.Deferred();t||e.resolve([]);const s=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:s?.getNamespaceId()??0,gapprefix:s?.getMainText()??t,generator:"allpages"}).catch(()=>null).then(r=>{if(r?.query?.pages){const i=r.query.pages.map(c=>({data:c.title,label:c.title}));this.emit("showing-values",i),e.resolve(i)}else e.resolve([])}),e.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:e,label:s})=>new OO.ui.MenuOptionWidget({data:e,label:s}))}Object.assign(_.prototype,OO.ui.mixin.LookupElement.prototype);class Q extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{const t=this.getValue(),e=$.Deferred();t||e.resolve([]);const s=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:s?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(r=>{if(r?.query?.pages){const i=r.query.pages.filter(c=>!c.categories?.some(a=>a.title==="Category:Wikipedia soft redirected categories")).map(c=>{const a=c.title.split(":")[1];return{data:a,label:a}});this.emit("showing-values",i),e.resolve(i)}else e.resolve([])}),e.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:e,label:s})=>new OO.ui.MenuOptionWidget({data:e,label:s}))}Object.assign(Q.prototype,OO.ui.mixin.LookupElement.prototype);class I extends OO.ui.ProcessDialog{api=new mw.Api;scriptMessage=" ([[User:Eejit43/scripts/afcrc-helper|afcrc-helper]])";requestPageType;pageTitle;redirectTemplates;beforeText;pageContent;parsedRequests=[];actionsToTake=[];editsCreationsToMake=[];constructor(t,e){super({size:"large"}),I.static.name="AfcrcHelperDialog",I.static.title="afcrc-helper",I.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"save",label:"Run",flags:["primary","progressive"]}],this.pageTitle=e,this.requestPageType=t,mw.util.addCSS(`
.afcrc-helper-request {
    background-color: #eee;
    border-radius: 5px;
    margin: 10px;
    padding: 5px;
}

.afcrc-helper-request summary {
    cursor: pointer;
}

.afcrc-helper-target-editor {
    font-family: monospace;
    min-width: 1ch;
    max-width: calc(100% - 4ch);
}

.afcrc-helper-external-link {
    text-decoration: none !important;
}

.afcrc-helper-external-link svg {
    display: inline-block;
    width: 1em;
    height: 1em;
    fill: currentColor;
}

.afcrc-helper-request-info, .afcrc-helper-request-responder {
    margin: 5px;
}

.afcrc-helper-request-info > div, .afcrc-helper-request-responder > div {
    margin-block: 8px;
}

.afcrc-helper-request-responder > div:last-of-type {
    margin-bottom: 0;
}

.afcrc-helper-request-responder .oo-ui-fieldLayout {
    margin-left: 8px;
}

.afcrc-helper-request-responder .oo-ui-fieldLayout-header {
    width: max-content;
}

.afcrc-helper-action-radio {
    margin-top: 8px;
}

.afcrc-helper-action-radio .oo-ui-radioOptionWidget {
    display: inline;
    padding: 8px;
}

.afcrc-closing-reason-input, .afcrc-comment-input {
    max-width: 50%;
}

.afcrc-helper-template-parameters-container, .afcrc-helper-template-parameters-container details {
    background-color: #fff;
    border: 1px solid #a2a9b1;
    border-radius: 2px;
    margin-block: 10px;
    padding: 5px;
}

.afcrc-helper-template-parameters-container {
    margin-left: 8px;
}

.afcrc-helper-template-parameters-container summary {
    cursor: pointer;
    font-weight: bold;
}

.afcrc-helper-template-parameters-container details {
    background-color: #e2e2e2;
    margin-block: 5px;
}

#afcrc-helper-no-templates-message {
    padding: 5px;
}`)}getActionProcess=t=>t==="cancel"?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):t==="save"?new OO.ui.Process(()=>{this.performActions()}):I.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>I.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});async load(){const t=await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:"User:Eejit43/scripts/redirect-helper.json"});this.redirectTemplates=JSON.parse(t.query.pages?.[0]?.revisions?.[0]?.slots?.main?.content||"{}");const e=await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.pageTitle});this.pageContent=e.query.pages[0].revisions[0].slots.main.content.trim(),this.parseRequests(),this.loadInputElements()}parseRequests(){this.beforeText=this.pageContent.match(/^(.*?)==/s)[1],this.pageContent=this.pageContent.replace(/^.*?==/s,"==");const t=[...this.pageContent.matchAll(/^==.*?==$(\s*(?!==[^=]).*)*/gim)].map(e=>e[0]);for(const e of t){if(/{{afc-c\|/i.test(e))continue;const r=e.match(/^==(.*?)==$/m)[1].trim();if(F==="redirect"){const i={},c=[...r.matchAll(/\[\[(.*?)]]/g)].map(u=>u[1]?.trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean);if(c.length===0)continue;i.pages=c;const a=e.match(/Target of redirect: ?\[\[(.*?)]]/)?.[1].trim().replace(/^:/,"").replaceAll("_"," ");if(!a)continue;i.target=a,i.reason=e.match(/reason: ?(.*?)\*source(?: \(if applicable\))?:/is)?.[1].trim()??"",i.source=e.match(/source(?: \(if applicable\))?: ?(.*?)(?:<references \/>|\n\n)/is)?.[1].trim()??"";const o=e.match(e.includes("<references />")?/<references \/>\n+(.*)/:new RegExp(`(?:<references \\/>${i.source?`|${i.source.replaceAll(/[\s#$()*+,.?[\\\]^{|}-]/g,"\\$&")}`:""})
+(.*)`))?.[1].trim(),h=o?o.match(/(?:Special:Contributions\/|User(?: talk)?:)(.*?)\|/)?.[1].trim():null;i.requester=o&&h?{type:/\[\[User( talk)?:/.test(o)?"user":"ip",name:h}:null,this.parsedRequests.push(i),this.actionsToTake.push({target:i.target,requests:Object.fromEntries(c.map(u=>[u,{originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"}]))})}else{const i={},c=r.match(/:?Category:(.*?)(]]|$)/)?.[1].trim();if(!c)continue;i.category=c.replaceAll("_"," "),i.examples=[...e.match(/example pages which belong to this category:(.*?)parent category\/categories:/is)[1].matchAll(/\*\s*(?:\[\[)?(.*?)(\||]]|\s*?\n)/g)].map(y=>y[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean)??[],i.parents=[...e.match(/parent category\/categories:(.*?)(\n\n|\n\[\[(special:contributions\/|user:))/is)[1].matchAll(/(?<!\|)#?:?Category:(.*?)(\||]]|\s*?\n)/g)].map(y=>y[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean)??[];const a=e.indexOf("[[User:"),o=e.indexOf("[[User talk:"),h=e.indexOf("[[Special:Contributions/"),u=Math.min(...[a,o,h].filter(y=>y!==-1));i.requester=u===Number.POSITIVE_INFINITY?null:u===h?{type:"ip",name:e.match(/\[\[Special:Contributions\/(.*?)(\||]])/)[1].trim()}:{type:"user",name:e.match(/\[\[User(?: talk)?:(.*?)(\||]])/)[1].trim()},i.requester?.name||(i.requester=null),this.parsedRequests.push(i),this.actionsToTake.push({category:i.category,examples:i.examples,parents:i.parents,originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"})}}}loadInputElements(){if(this.parsedRequests.length>0){let t=0;const e=()=>{const r=Math.min(t+5,this.parsedRequests.length);this.title.setLabel(`afcrc-helper (loading ${t+1}-${r}/${this.parsedRequests.length} requests)`);for(let i=t;i<r;i++)this.requestPageType==="redirect"?this.loadRedirectRequestElements(i):this.loadCategoryRequestElements(i);r<this.parsedRequests.length?(t=r,setTimeout(e,0)):this.title.setLabel(`afcrc-helper (${this.parsedRequests.length} requests loaded)`)};e()}else{const t=new OO.ui.MessageWidget({type:"notice",label:"No valid requests to handle!"}),e=new OO.ui.PanelLayout({padded:!0,expanded:!1});e.$element.append(t.$element),this.$body.append(e.$element),this.updateSize()}}loadRedirectRequestElements(t){const e=this.parsedRequests[t],s=document.createElement("details");s.classList.add("afcrc-helper-request"),s.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));const r=document.createElement("summary");r.innerHTML=e.pages.map(l=>`<b>${l}</b>`).join(", ")+" \u2192 ",r.addEventListener("keyup",l=>{document.activeElement?.tagName==="INPUT"&&l.key===" "&&l.preventDefault()});const i=document.createElement("input");i.classList.add("afcrc-helper-target-editor"),i.style.width=`${e.target.length}ch`,i.value=e.target,i.addEventListener("input",()=>{i.value=i.value.replaceAll("_"," "),i.style.width=`${i.value.length}ch`,this.actionsToTake[t].target=i.value,c.href=mw.util.getUrl(i.value)}),r.append(i);const c=document.createElement("a");c.classList.add("afcrc-helper-external-link"),c.target="_blank",c.href=mw.util.getUrl(e.target),c.innerHTML=`
<svg viewbox="0 0 48 48">
    <path d="M36 24c-1.2 0-2 0.8-2 2v12c0 1.2-0.8 2-2 2h-22c-1.2
        0-2-0.8-2-2v-22c0-1.2 0.8-2 2-2h12c1.2 0 2-0.8 2-2s-0.8-2-2-2h-12c-3.4
        0-6 2.6-6 6v22c0 3.4 2.6 6 6 6h22c3.4 0 6-2.6
        6-6v-12c0-1.2-0.8-2-2-2z"></path>
    <path d="M43.8 5.2c-0.2-0.4-0.6-0.8-1-1-0.2-0.2-0.6-0.2-0.8-0.2h-12c-1.2
        0-2 0.8-2 2s0.8 2 2 2h7.2l-18.6 18.6c-0.8 0.8-0.8 2 0 2.8 0.4 0.4 0.8
        0.6 1.4 0.6s1-0.2 1.4-0.6l18.6-18.6v7.2c0 1.2 0.8 2 2 2s2-0.8
        2-2v-12c0-0.2 0-0.6-0.2-0.8z"></path>
</svg>`,r.append(c),s.append(r);const a=document.createElement("div");a.classList.add("afcrc-helper-request-info");const o=document.createElement("span");o.style.color="dimgray",o.textContent="None";const h=document.createElement("span");h.style.color="dimgray",h.textContent="Unknown";const u=document.createElement("div"),y=document.createElement("b");y.textContent="Reason: ",u.append(y),e.reason?u.append(e.reason):u.append(o.cloneNode(!0)),a.append(u);const k=document.createElement("div"),w=document.createElement("b");w.textContent="Source: ",k.append(w),e.source?k.append(e.source):k.append(o.cloneNode(!0)),a.append(k);const b=document.createElement("div"),T=document.createElement("b");if(T.textContent="Requester: ",b.append(T),e.requester){const l=document.createElement("a");l.target="_blank",l.href=e.requester.type==="user"?mw.util.getUrl(`User:${e.requester.name}`):mw.util.getUrl(`Special:Contributions/${e.requester.name}`),l.textContent=e.requester.name,b.append(l)}else b.append(h.cloneNode(!0));a.append(b),s.append(a),s.append(document.createElement("hr"));const O=document.createElement("div");O.classList.add("afcrc-helper-request-responder");for(const l of e.pages){const d=document.createElement("div"),g=document.createElement("b");g.textContent=l,d.append(g);let C,m;const j=[],L=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(n=>new OO.ui.RadioOptionWidget({data:n,label:n}))});L.selectItemByLabel("None"),L.on("choose",()=>{setTimeout(()=>this.updateSize(),0);const n=L.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[t].requests[l].action=n,!C||!m){const p=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.redirectTemplates).map(([v,{redirect:D}])=>{if(!D)return{data:v,label:v};const E=new OO.ui.HtmlSnippet(`${v} <i>(redirect with possibilities)</i>`);return{data:v,label:E}})});p.getMenu().filterMode="substring",p.on("change",()=>{const v=p.getValue().sort((E,x)=>E.toLowerCase().localeCompare(x.toLowerCase()));p.getValue().join(";")!==v.join(";")&&p.setValue(v),this.actionsToTake[t].requests[l].redirectTemplates=v;for(const E of j)E.details.style.display="none";let D=0;for(const E of p.getValue()){const x=j.find(U=>U.name===E);x&&(x.details.style.display="block",D++)}f.textContent=`Template parameters (${D>0?`for ${D} template${D>1?"s":""}`:"none to show"})`,V.style.display=D>0?"none":"block"}),C=new OO.ui.FieldLayout(p,{classes:["afcrc-helper-tag-select-layout"],align:"inline",label:"Redirect templates:"}),A.$element[0].before(C.$element[0]),m=document.createElement("details"),m.classList.add("afcrc-helper-template-parameters-container");const f=document.createElement("summary");f.textContent="Template parameters (none to show)",m.append(f);for(const[v,D]of Object.entries(this.redirectTemplates)){const E=Object.entries(D.parameters);if(E.length===0)continue;const x=document.createElement("details");x.style.display="none";const U=document.createElement("summary");U.textContent=v,x.append(U);const J={name:v,details:x,parameters:[]};for(const[H,R]of E){const G=new OO.ui.TextInputWidget({placeholder:R.default?.toString(),required:R.required}),K=new OO.ui.FieldLayout(G,{label:new OO.ui.HtmlSnippet(`${H}${!R.label||H.toLowerCase()===R.label?.toLowerCase()?"":` (${R.label})`}${R.description?` (${R.description})`:""} (type: ${R.type}) ${R.suggested?" (suggested)":""}${R.example?` (example: "${R.example}")`:""}`),align:"inline"});x.append(K.$element[0]),J.parameters.push({name:H,aliases:R.aliases,editor:G})}m.append(x),j.push(J)}this.actionsToTake[t].requests[l].redirectTemplateParameters=j;const V=document.createElement("div");V.id="afcrc-helper-no-templates-message",V.textContent="No templates with parameters to display!",m.append(V),A.$element[0].before(m)}if(["accept","comment","close"].includes(n)){A.$element.show();const p=W.getValue().trim();p?this.actionsToTake[t].requests[l].comment=p:delete this.actionsToTake[t].requests[l].comment}else A.$element.hide(),delete this.actionsToTake[t].requests[l].comment;switch(this.updateRequestColor(s,t),C.$element.hide(),m.style.display="none",P.$element.hide(),M.$element.hide(),n){case"accept":{C.$element.show(),m.style.display="block";break}case"deny":{P.$element.show();break}case"close":{M.$element.show();break}}});const q=new OO.ui.ComboBoxInputWidget({classes:["afcrc-closing-reason-input"],placeholder:"autofill:unlikely",options:[["exists","existing pages"],["empty","empty submissions"],["notarget","nonexistent or no provided target"],["notitle","no title provided"],["unlikely","unlikely redirects"],["notredirect","article creation requests"],["externallink","external link redirects"],["editrequest","edit requests"],["notenglish","requests not in English"]].map(([n,p])=>({data:`autofill:${n}`,label:`Autofilled text for ${p}`}))});q.on("change",()=>{this.actionsToTake[t].requests[l].denyReason=q.getValue()||"autofill:unlikely"}),q.setValue("autofill:unlikely"),q.getMenu().selectItemByData("autofill:unlikely");const P=new OO.ui.FieldLayout(q,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'});P.$element.hide();const S=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([n,p])=>new OO.ui.MenuOptionWidget({data:p,label:n}))}});S.getMenu().on("choose",()=>{const n=S.getMenu().findSelectedItem();this.actionsToTake[t].requests[l].closingReason={name:n.getLabel(),id:n.getData()},this.updateRequestColor(s,t)}),S.getMenu().selectItemByData("r"),this.actionsToTake[t].requests[l].closingReason={name:"No response",id:"r"};const M=new OO.ui.FieldLayout(S,{align:"inline",label:"Closing reason:"});M.$element.hide();const W=new OO.ui.TextInputWidget;W.on("change",()=>{const n=W.getValue().trim();n?this.actionsToTake[t].requests[l].comment=n:delete this.actionsToTake[t].requests[l].comment});const A=new OO.ui.FieldLayout(W,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});A.$element.hide(),d.append(L.$element[0],P.$element[0],M.$element[0],A.$element[0]),O.append(d)}s.append(O),this.$body.append(s),this.updateSize()}loadCategoryRequestElements(t){const e=this.parsedRequests[t],s=document.createElement("details");s.classList.add("afcrc-helper-request"),s.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));const r=document.createElement("summary");r.innerHTML=`<b>Category:${e.category}</b>`,s.append(r);const i=document.createElement("div");i.classList.add("afcrc-helper-request-info");const c=document.createElement("span");c.style.color="dimgray",c.textContent="None";const a=document.createElement("span");a.style.color="dimgray",a.textContent="Unknown";const o=document.createElement("div"),h=document.createElement("b");if(h.textContent="Examples: ",o.append(h),e.examples.length>0)for(const[n,p]of e.examples.entries()){const f=document.createElement("a");f.target="_blank",f.href=mw.util.getUrl(p),f.textContent=p,o.append(f),n!==e.examples.length-1&&o.append(", ")}else o.append(c.cloneNode(!0));i.append(o);const u=document.createElement("div"),y=document.createElement("b");if(y.textContent="Parents: ",u.append(y),e.parents.length>0)for(const[n,p]of e.parents.entries()){const f=document.createElement("a");f.target="_blank",f.href=mw.util.getUrl(`Category:${p}`),f.textContent=p,u.append(f),n!==e.parents.length-1&&u.append(", ")}else u.append(c.cloneNode(!0));i.append(u);const k=document.createElement("div"),w=document.createElement("b");if(w.textContent="Requester: ",k.append(w),e.requester){const n=document.createElement("a");n.target="_blank",n.href=e.requester.type==="user"?mw.util.getUrl(`User:${e.requester.name}`):mw.util.getUrl(`Special:Contributions/${e.requester.name}`),n.textContent=e.requester.name,k.append(n)}else k.append(a.cloneNode(!0));i.append(k),s.append(i),s.append(document.createElement("hr"));const b=document.createElement("div");b.classList.add("afcrc-helper-request-responder");const T=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(n=>new OO.ui.RadioOptionWidget({data:n,label:n}))});T.selectItemByLabel("None"),T.on("choose",()=>{setTimeout(()=>this.updateSize(),0);const n=T.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[t].action=n,["comment","close"].includes(n)){A.$element.show();const p=W.getValue().trim();p?this.actionsToTake[t].comment=p:delete this.actionsToTake[t].comment}else A.$element.hide(),delete this.actionsToTake[t].comment;switch(this.updateRequestColor(s,t),g.$element.hide(),L.$element.hide(),P.$element.hide(),M.$element.hide(),n){case"accept":{g.$element.show(),L.$element.show();break}case"deny":{P.$element.show();break}case"close":{M.$element.show();break}}});const O=new _({placeholder:"Add pages here"});O.on("change",()=>{let n=O.getValue();n=n.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),n=n.replace(/^:/,""),n.length>0&&O.setValue(n[0].toUpperCase()+n.slice(1).replaceAll("_"," "))}),O.on("showing-values",n=>{for(const p of n)l.addAllowedValue(p.data)});const l=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:O});l.on("change",()=>{const n=l.getValue().sort((p,f)=>p.toLowerCase().localeCompare(f.toLowerCase()));l.getValue().join(";")!==n.join(";")&&l.setValue(n),this.actionsToTake[t].examples=n});const{examples:d}=this.actionsToTake[t];for(const n of d)l.addAllowedValue(n);l.setValue(d);const g=new OO.ui.FieldLayout(l,{align:"inline",label:"Pages to categorize:"});g.$element.hide();const C=new Q({placeholder:"Add categories here"});C.on("change",()=>{let n=C.getValue();n=n.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),n=n.replace(/^Category:/,""),n.length>0&&C.setValue(n[0].toUpperCase()+n.slice(1).replaceAll("_"," "))}),C.on("showing-values",n=>{for(const p of n)m.addAllowedValue(p.data)});const m=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:C});m.on("change",()=>{const n=m.getValue().sort((p,f)=>p.toLowerCase().localeCompare(f.toLowerCase()));m.getValue().join(";")!==n.join(";")&&m.setValue(n),this.actionsToTake[t].parents=n});const{parents:j}=this.actionsToTake[t];for(const n of j)m.addAllowedValue(n);m.setValue(j);const L=new OO.ui.FieldLayout(m,{align:"inline",label:"Categories:"});L.$element.hide();const q=new OO.ui.ComboBoxInputWidget({classes:["afcrc-closing-reason-input"],placeholder:"autofill:unlikely",options:[["exists","existing categories"],["empty","empty submissions"],["unlikely","categories that are unlikely to have enough pages"],["notcategory","page creation requests"],["notenglish","requests not in English"]].map(([n,p])=>({data:`autofill:${n}`,label:`Autofilled text for ${p}`}))});q.on("change",()=>{this.actionsToTake[t].denyReason=q.getValue()||"autofill:unlikely"}),q.setValue("autofill:unlikely"),q.getMenu().selectItemByData("autofill:unlikely");const P=new OO.ui.FieldLayout(q,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'});P.$element.hide();const S=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([n,p])=>new OO.ui.MenuOptionWidget({data:p,label:n}))}});S.getMenu().on("choose",()=>{const n=S.getMenu().findSelectedItem();this.actionsToTake[t].closingReason={name:n.getLabel(),id:n.getData()},this.updateRequestColor(s,t)}),S.getMenu().selectItemByData("r"),this.actionsToTake[t].closingReason={name:"No response",id:"r"};const M=new OO.ui.FieldLayout(S,{align:"inline",label:"Closing reason:"});M.$element.hide();const W=new OO.ui.TextInputWidget;W.on("change",()=>{const n=W.getValue().trim();n?this.actionsToTake[t].comment=n:delete this.actionsToTake[t].comment});const A=new OO.ui.FieldLayout(W,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});A.$element.hide(),b.append(T.$element[0],g.$element[0],L.$element[0],P.$element[0],M.$element[0],A.$element[0]),s.append(b),this.$body.append(s),this.updateSize()}updateRequestColor(t,e){if(this.requestPageType==="redirect"){const s=Object.values(this.actionsToTake[e].requests),r=s.every(o=>o.action==="accept"||o.action==="deny"),i=s.find(o=>o.action==="close")?.closingReason?.id,c=s.every(o=>o.action==="close"&&o.closingReason?.id===i);let a="";if(r){const o=s.filter(u=>u.action==="accept").length,h=s.filter(u=>u.action==="deny").length;o>0&&h>0?a="#fff17e":o>0?a="#a0ffa0":a="#ffcece"}else c&&(i==="r"?a="#ffcece":i==="s"?a="#90c090":a="#b8b8b8");t.style.backgroundColor=a}else{const{action:s}=this.actionsToTake[e];let r="";s==="accept"?r="#a0ffa0":s==="deny"?r="#ffcece":s==="close"&&(this.actionsToTake[e].closingReason?.id==="r"?r="#ffcece":this.actionsToTake[e].closingReason?.id==="s"?r="#90c090":r="#b8b8b8"),t.style.backgroundColor=r}}async performActions(){const t=new OO.ui.WindowManager;document.body.append(t.$element[0]);const e=new N;t.addWindows([e]),e.open();const s={accepted:0,denied:0,"commented on":0,closed:0};let r=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.pageTitle})).query.pages[0].revisions[0].slots.main.content.trim();if(this.requestPageType==="redirect")if(this.actionsToTake.some(c=>Object.values(c.requests).some(a=>a.action!=="none"))){for(const{target:a,requests:o}of this.actionsToTake){const h=Object.values(o).some(d=>d.action==="accept"||d.action==="deny"),u=Object.values(o).every(d=>d.action==="accept"||d.action==="deny"),y=Object.values(o).find(d=>d.action==="close")?.closingReason?.id,k=Object.values(o).every(d=>d.action==="close"&&d.closingReason?.id===y),w=[],b=[],T=[],O=Object.keys(o).length;for(const[d,g]of Object.entries(o))switch(g.action){case"accept":{h&&!u?e.addLogEntry(`Not all requests to "${a}" were accepted or denied, the handling of "${d}" will be ignored.`,"warning"):(w.push(d),g.comment&&T.push([d,g.comment]),s.accepted++);break}case"deny":{h&&!u?e.addLogEntry(`Not all requests to "${a}" were accepted or denied, the handling of "${d}" is being ignored.`,"warning"):(b.push([d,g.denyReason]),s.denied++);break}case"comment":{g.comment?(T.push([d,g.comment]),s["commented on"]++):e.addLogEntry(`The request to create "${d}" \u2192 "${a}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{k?(g.comment&&T.push([d,g.comment]),s.closed++):e.addLogEntry(`Not all requests to "${a}" were closed with the same reason, the handling of "${d}" is being ignored.`,"warning");break}}let l={pageText:r,...Object.values(o)[0].originalText};if(T.length>0&&(l=this.modifySectionData(l,{append:this.mapComments(T,O===1,T.length===O)})),u){let d;if(w.length>0&&b.length>0){d="p";const g=`* {{subst:AfC redirect}} (${w.map(m=>`[[${m}]]`).join(", ")}) ~~~~`,C=this.mapDeniedReasons(b,!1,!1);for(const m of w)this.handleAcceptedRedirect(m,o[m],a);l=this.modifySectionData(l,{append:`${g}
${C}`})}else if(w.length>0){d="a";for(const g of w)this.handleAcceptedRedirect(g,o[g],a);l=this.modifySectionData(l,{append:`* {{subst:AfC redirect${w.length>1?"|all":""}}} ~~~~`})}else d="d",l=this.modifySectionData(l,{append:this.mapDeniedReasons(b,O===1,!0)});l=this.modifySectionData(l,{prepend:`{{AfC-c|${d}}}`,append:"{{AfC-c|b}}"})}else k&&(l=this.modifySectionData(l,{prepend:`{{AfC-c|${y}}}`,append:"{{AfC-c|b}}"}));r=l.pageText}if(this.beforeText+this.pageContent===r)return e.addLogEntry("No requests have been handled (page content identical)!");const c=Object.entries(s).filter(([,a])=>a>0).map(([a,o])=>`${a} ${o}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:r,summary:`Handling AfC redirect requests (${c})${this.scriptMessage}`})}),await this.makeAllEditsCreations(e),e.addLogEntry("All changes made, click below to reload!","success"),e.showReload()}else e.addLogEntry("No requests have been handled!");else if(this.actionsToTake.some(c=>c.action!=="none")){for(const a of this.actionsToTake){let o={pageText:r,...a.originalText};switch(a.action){case"accept":{o=this.modifySectionData(o,{prepend:"{{AfC-c|a}}",append:`* {{subst:AfC category}} ~~~~
{{AfC-c|b}}`}),this.handleAcceptedCategory(a),s.accepted++;break}case"deny":{o=this.modifySectionData(o,{prepend:"{{AfC-c|d}}",append:`* ${this.formatDeniedReason(a.denyReason)} ~~~~
{{AfC-c|b}}`}),s.denied++;break}case"comment":{a.comment?(o=this.modifySectionData(o,{append:`* {{AfC comment|1=${a.comment}}} ~~~~`}),s["commented on"]++):e.addLogEntry(`The request to create "${a.category}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{o=this.modifySectionData(o,{prepend:`{{AfC-c|${a.closingReason.id}}}`,append:(a.comment?`* {{AfC comment|1=${a.comment}}} ~~~~`:"")+`
{{AfC-c|b}`}),s.closed++;break}}r=o.pageText}if(this.beforeText+this.pageContent===r)return e.addLogEntry("No requests have been handled (page content identical)!");const c=Object.entries(s).filter(([,a])=>a>0).map(([a,o])=>`${a} ${o}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:r,summary:`Handling AfC category requests (${c})${this.scriptMessage}`})}),await this.makeAllEditsCreations(e),e.addLogEntry("All changes made, click below to reload!","success"),e.showReload()}else e.addLogEntry("No requests have been handled!")}formatDeniedReason(t){const e=t.startsWith("autofill:")?t.match(/autofill:(\w+)/)[1]:`decline|2=${t}`,s=t.includes(",")?" "+t.slice(t.indexOf(",")+1).trim():"";return`{{subst:AfC ${this.requestPageType}|${e}}}${s}`}mapDeniedReasons(t,e,s){if(e)return`* ${this.formatDeniedReason(t[0][1])} ~~~~`;const r={};for(const[c,a]of t)r[a]||(r[a]=[]),r[a].push(c);const i=Object.entries(r);return i.map(([c,a])=>`* ${this.formatDeniedReason(c)}${i.length>1||!s?` (${a.map(o=>`[[${o}]]`).join(", ")})`:""} ~~~~`).join(`
`)}mapComments(t,e,s){if(e)return`* {{AfC comment|1=${t[0][1]}}} ~~~~`;const r={};for(const[c,a]of t)r[a]||(r[a]=[]),r[a].push(c);const i=Object.entries(r);return i.map(([c,a])=>`* {{AfC comment|1=${c}}}${i.length>1||!s?` (${a.map(o=>`[[${o}]]`).join(", ")})`:""} ~~~~`).join(`
`)}modifySectionData(t,{prepend:e,append:s}){const{fullSectionText:r,sectionText:i}=t;return e&&(t.sectionText=e+`
`+t.sectionText),s&&(t.sectionText+=`
`+s),t.fullSectionText=t.fullSectionText.replace(i,t.sectionText),t.pageText=t.pageText.replace(r,t.fullSectionText),t}handleAcceptedRedirect(t,e,s){const r=e.redirectTemplates&&e.redirectTemplates.length>0?e.redirectTemplates.map(i=>{const c=e.redirectTemplateParameters?.find(o=>o.name===i);if(!c)return`{{${i}}}`;const a=c.parameters.map((o,h)=>{const u=o.editor.getValue().trim();return u?`|${o.name===(h+1).toString()?"":`${o.name}=`}${u}`:null}).filter(Boolean).join("");return`{{${i}${a}}}`}):null;this.editsCreationsToMake.push({type:"create",isRedirect:!0,title:t,text:`#REDIRECT [[${s}]]${r?`

{{Redirect category shell|
${r.join(`
`)}
}}`:""}`,summary:`Creating redirect to [[${s}]] as requested at [[WP:AFC/R]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:mw.Title.newFromText(t).getTalkPage().getPrefixedText(),text:`{{WikiProject banner shell|
{{WikiProject Articles for creation|ts={{subst:LOCALTIMESTAMP}}|reviewer=${mw.config.get("wgUserName")}}}
}}`,summary:`Adding [[Wikipedia:WikiProject Articles for creation|WikiProject Articles for creation]] banner${this.scriptMessage}`})}handleAcceptedCategory(t){this.editsCreationsToMake.push({type:"create",isRedirect:!1,title:`Category:${t.category}`,text:t.parents.map(e=>`[[Category:${e}]]`).join(`
`),summary:`Creating category as requested at [[WP:AFC/C]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:`Category talk:${t.category}`,text:`{{WikiProject banner shell|
{{WikiProject Articles for creation|ts={{subst:LOCALTIMESTAMP}}|reviewer=${mw.config.get("wgUserName")}}}
}}`,summary:`Adding [[Wikipedia:WikiProject Articles for creation|WikiProject Articles for creation]] banner${this.scriptMessage}`},...t.examples.map(e=>({type:"edit",title:e,transform:({content:s})=>({text:`${s}
[[Category:${t.category}]]`,summary:`Adding page to [[:Category:${t.category}]] as requested at [[WP:AFC/C]]${this.scriptMessage}`})})))}async makeAllEditsCreations(t){for(const e of this.editsCreationsToMake){const s=e.type==="edit"?this.api.edit(e.title,e.transform):this.api.create(e.title,{summary:e.summary},e.text),r=document.createElement("a");r.target="_blank",r.href=mw.util.getUrl(e.title,"isRedirect"in e&&e.isRedirect?{redirect:"no"}:void 0),r.textContent=e.title,t.addLogEntry(`${e.type==="edit"?"Editing":"Creating"} ${r.outerHTML}...`),await s.catch(async(i,c)=>{i==="ratelimited"?(t.addLogEntry(`Rate limited. Waiting for 70 seconds... (resuming at ${new Date(Date.now()+7e4).toLocaleTimeString()})`,"warning"),await new Promise(a=>setTimeout(a,7e4)),t.addLogEntry("Continuing...","success"),await s.catch((a,o)=>{t.addLogEntry(`Error ${e.type==="edit"?"editing":"creating"} ${r.outerHTML}: ${o?.error.info??"Unknown error"} (${a}).`,"error")})):t.addLogEntry(`Error ${e.type==="edit"?"editing":"creating"} ${r.outerHTML}: ${c?.error.info??"Unknown error"} (${i}).`,"error")})}}}Object.assign(I.prototype,OO.ui.ProcessDialog.prototype)});

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEFwaUVkaXRQYWdlUGFyYW1zLCBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcbmltcG9ydCB7IEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbXMsIE1lZGlhV2lraURhdGFFcnJvciwgUGFnZVJldmlzaW9uc1Jlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC10eXBlcyc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdW5pY29ybi9wcmV2ZW50LWFiYnJldmlhdGlvbnNcbmltcG9ydCB7IFJlZGlyZWN0VGVtcGxhdGVEYXRhLCBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvIH0gZnJvbSAnLi9yZWRpcmVjdC1oZWxwZXInO1xuXG5tdy5sb2FkZXIudXNpbmcoWydtZWRpYXdpa2kudXRpbCcsICdvb2pzLXVpLWNvcmUnLCAnb29qcy11aS13aWRnZXRzJywgJ29vanMtdWktd2luZG93cyddLCAoKSA9PiB7XG4gICAgY29uc3QgaXNSZWRpcmVjdFJlcXVlc3RQYWdlID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpID09PSAnV2lraXBlZGlhOkFydGljbGVzX2Zvcl9jcmVhdGlvbi9SZWRpcmVjdHMnO1xuICAgIGNvbnN0IGlzQ2F0ZWdvcnlSZXF1ZXN0UGFnZSA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSA9PT0gJ1dpa2lwZWRpYTpBcnRpY2xlc19mb3JfY3JlYXRpb24vQ2F0ZWdvcmllcyc7XG5cbiAgICBpZiAoIWlzUmVkaXJlY3RSZXF1ZXN0UGFnZSAmJiAhaXNDYXRlZ29yeVJlcXVlc3RQYWdlKSByZXR1cm47XG5cbiAgICBjb25zdCByZXF1ZXN0UGFnZVR5cGUgPSBpc1JlZGlyZWN0UmVxdWVzdFBhZ2UgPyAncmVkaXJlY3QnIDogJ2NhdGVnb3J5JztcblxuICAgIGNvbnN0IGxpbmsgPSBtdy51dGlsLmFkZFBvcnRsZXRMaW5rKG13LmNvbmZpZy5nZXQoJ3NraW4nKSA9PT0gJ21pbmVydmEnID8gJ3AtdGInIDogJ3AtY2FjdGlvbnMnLCAnIycsIGBIYW5kbGUgJHtyZXF1ZXN0UGFnZVR5cGV9IGNyZWF0aW9uIHJlcXVlc3RzYCwgJ2FmY3JjLWhlbHBlcicpITtcblxuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgY29uc3QgYWZjcmNIZWxwZXJEaWFsb2cgPSBuZXcgQWZjcmNIZWxwZXJEaWFsb2cocmVxdWVzdFBhZ2VUeXBlLCBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykucmVwbGFjZUFsbCgnXycsICcgJykpO1xuXG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbYWZjcmNIZWxwZXJEaWFsb2ddKTtcblxuICAgICAgICBhZmNyY0hlbHBlckRpYWxvZy5vcGVuKCk7XG4gICAgICAgIGFmY3JjSGVscGVyRGlhbG9nLmxvYWQoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYW4gYWN0aW9uIGRpYWxvZy5cbiAgICAgKi9cbiAgICBjbGFzcyBTaG93QWN0aW9uc0RpYWxvZyBleHRlbmRzIE9PLnVpLkRpYWxvZyB7XG4gICAgICAgIHByaXZhdGUgY29udGVudExheW91dCE6IE9PLnVpLlBhbmVsTGF5b3V0O1xuICAgICAgICBwcml2YXRlIGxvZ091dHB1dCE6IEhUTUxEaXZFbGVtZW50O1xuICAgICAgICBwcml2YXRlIGNsb3NlQnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoeyBzaXplOiAnbGFyZ2UnIH0pO1xuXG4gICAgICAgICAgICBTaG93QWN0aW9uc0RpYWxvZy5zdGF0aWMubmFtZSA9ICdTaG93QWN0aW9uc0RpYWxvZyc7XG4gICAgICAgICAgICBTaG93QWN0aW9uc0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnQWN0aW9ucyc7XG4gICAgICAgIH1cblxuICAgICAgICBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgICAgICAgT08udWkuRGlhbG9nLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMpO1xuXG4gICAgICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4uYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyIGRpdiB7XG4gICAgbWFyZ2luLWJsb2NrOiA4cHg7XG59YCk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgIHRoaXMubG9nT3V0cHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLmxvZ091dHB1dC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItYWN0aW9ucy1jb250YWluZXInKTtcblxuICAgICAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH0pO1xuICAgICAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlKCkpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKHRoaXMubG9nT3V0cHV0LCB0aGlzLmNsb3NlQnV0dG9uLiRlbGVtZW50KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgYSBsb2cgZW50cnkgdG8gdGhlIGRpYWxvZy5cbiAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLlxuICAgICAgICAgKiBAcGFyYW0gdHlwZSBUaGUgbWVzc2FnZSB0eXBlLlxuICAgICAgICAgKi9cbiAgICAgICAgcHVibGljIGFkZExvZ0VudHJ5KG1lc3NhZ2U6IHN0cmluZywgdHlwZTogT08udWkuTWVzc2FnZVdpZGdldC5UeXBlID0gJ25vdGljZScpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VXaWRnZXQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGUsIGlubGluZTogdHJ1ZSwgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChtZXNzYWdlKSB9KTtcblxuICAgICAgICAgICAgdGhpcy5sb2dPdXRwdXQuYXBwZW5kKG1lc3NhZ2VXaWRnZXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcblxuICAgICAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbi5zY3JvbGxFbGVtZW50SW50b1ZpZXcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZW1vdmVzIHRoZSBjbG9zZSBidXR0b24gYW5kIGFkZHMgYSByZWxvYWQgYnV0dG9uLlxuICAgICAgICAgKi9cbiAgICAgICAgcHVibGljIHNob3dSZWxvYWQoKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLiRlbGVtZW50LnJlbW92ZSgpO1xuXG4gICAgICAgICAgICBjb25zdCByZWxvYWRCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdSZWxvYWQnLCBmbGFnczogWydwcmltYXJ5J10gfSk7XG4gICAgICAgICAgICByZWxvYWRCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZW50TGF5b3V0LiRlbGVtZW50LmFwcGVuZChyZWxvYWRCdXR0b24uJGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihTaG93QWN0aW9uc0RpYWxvZy5wcm90b3R5cGUsIE9PLnVpLkRpYWxvZy5wcm90b3R5cGUpO1xuXG4gICAgaW50ZXJmYWNlIExvb2t1cEVsZW1lbnRDb25maWcgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQuQ29uZmlnT3B0aW9ucywgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5Db25maWdPcHRpb25zIHt9XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgcGFnZSBsb29rdXAgZWxlbWVudC5cbiAgICAgKi9cbiAgICBjbGFzcyBQYWdlSW5wdXRXaWRnZXQgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgICAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExvb2t1cEVsZW1lbnRDb25maWcpIHtcbiAgICAgICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IHBhcnNlZFRpdGxlPy5nZXROYW1lc3BhY2VJZCgpID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1zKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IHsgcXVlcnk6IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZyB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzLm1hcCgocGFnZSkgPT4gKHsgZGF0YTogcGFnZS50aXRsZSwgbGFiZWw6IHBhZ2UudGl0bGUgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcGFnZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgICAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4gZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihQYWdlSW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgY2F0ZWdvcnkgbG9va3VwIGVsZW1lbnQuXG4gICAgICovXG4gICAgY2xhc3MgQ2F0ZWdvcnlJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZykge1xuICAgICAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogMTQsXG4gICAgICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogJ2NhdGVnb3JpZXMnLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbXMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogeyBxdWVyeTogeyBwYWdlczogeyB0aXRsZTogc3RyaW5nOyBjYXRlZ29yaWVzPzogeyB0aXRsZTogc3RyaW5nIH1bXSB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocGFnZSkgPT4gIXBhZ2UuY2F0ZWdvcmllcz8uc29tZSgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6V2lraXBlZGlhIHNvZnQgcmVkaXJlY3RlZCBjYXRlZ29yaWVzJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVdpdGhvdXROYW1lc3BhY2UgPSBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdGl0bGVXaXRob3V0TmFtZXNwYWNlLCBsYWJlbDogdGl0bGVXaXRob3V0TmFtZXNwYWNlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCBwYWdlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocGFnZXMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICAgICAgfTtcblxuICAgICAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKENhdGVnb3J5SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG5cbiAgICBpbnRlcmZhY2UgUmVkaXJlY3RSZXF1ZXN0RGF0YSB7XG4gICAgICAgIHBhZ2VzOiBzdHJpbmdbXTtcbiAgICAgICAgdGFyZ2V0OiBzdHJpbmc7XG4gICAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgICBzb3VyY2U6IHN0cmluZztcbiAgICAgICAgcmVxdWVzdGVyOiB7IHR5cGU6ICd1c2VyJyB8ICdpcCc7IG5hbWU6IHN0cmluZyB9IHwgbnVsbDtcbiAgICB9XG5cbiAgICBpbnRlcmZhY2UgQ2F0ZWdvcnlSZXF1ZXN0RGF0YSB7XG4gICAgICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgICAgIGV4YW1wbGVzOiBzdHJpbmdbXTtcbiAgICAgICAgcGFyZW50czogc3RyaW5nW107XG4gICAgICAgIHJlcXVlc3RlcjogeyB0eXBlOiAndXNlcicgfCAnaXAnOyBuYW1lOiBzdHJpbmcgfSB8IG51bGw7XG4gICAgfVxuXG4gICAgdHlwZSBBY3Rpb25UeXBlID0gJ2FjY2VwdCcgfCAnZGVueScgfCAnY29tbWVudCcgfCAnY2xvc2UnIHwgJ25vbmUnO1xuXG4gICAgaW50ZXJmYWNlIEFjdGlvbiB7XG4gICAgICAgIG9yaWdpbmFsVGV4dDogeyBmdWxsU2VjdGlvblRleHQ6IHN0cmluZzsgc2VjdGlvblRleHQ6IHN0cmluZyB9O1xuICAgICAgICBhY3Rpb246IEFjdGlvblR5cGU7XG4gICAgICAgIGNvbW1lbnQ/OiBzdHJpbmc7XG4gICAgICAgIGRlbnlSZWFzb24/OiBzdHJpbmc7XG4gICAgICAgIGNsb3NpbmdSZWFzb24/OiB7IG5hbWU6IHN0cmluZzsgaWQ6IHN0cmluZyB9O1xuICAgIH1cblxuICAgIHR5cGUgUmVkaXJlY3RBY3Rpb24gPSBBY3Rpb24gJiB7IHJlZGlyZWN0VGVtcGxhdGVzPzogc3RyaW5nW107IHJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzPzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdIH07XG5cbiAgICB0eXBlIENhdGVnb3J5QWN0aW9uID0gQWN0aW9uICYgeyBjYXRlZ29yeTogc3RyaW5nOyBleGFtcGxlczogc3RyaW5nW107IHBhcmVudHM6IHN0cmluZ1tdIH07XG5cbiAgICB0eXBlIFJlZGlyZWN0QWN0aW9ucyA9IHsgdGFyZ2V0OiBzdHJpbmc7IHJlcXVlc3RzOiBSZWNvcmQ8c3RyaW5nLCBSZWRpcmVjdEFjdGlvbj4gfVtdO1xuXG4gICAgdHlwZSBDYXRlZ29yeUFjdGlvbnMgPSBDYXRlZ29yeUFjdGlvbltdO1xuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB0aGF0IGhhbmRsZXMgcmVkaXJlY3QgYW5kIGNhdGVnb3J5IHJlcXVlc3RzLlxuICAgICAqL1xuICAgIGNsYXNzIEFmY3JjSGVscGVyRGlhbG9nIGV4dGVuZHMgT08udWkuUHJvY2Vzc0RpYWxvZyB7XG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIHByaXZhdGUgc2NyaXB0TWVzc2FnZSA9ICcgKFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvYWZjcmMtaGVscGVyfGFmY3JjLWhlbHBlcl1dKSc7XG5cbiAgICAgICAgcHJpdmF0ZSByZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknO1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZSE6IHN0cmluZztcblxuICAgICAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzITogUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG5cbiAgICAgICAgcHJpdmF0ZSBiZWZvcmVUZXh0ITogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIHBhZ2VDb250ZW50ITogc3RyaW5nO1xuXG4gICAgICAgIHByaXZhdGUgcGFyc2VkUmVxdWVzdHM6IFJlZGlyZWN0UmVxdWVzdERhdGFbXSB8IENhdGVnb3J5UmVxdWVzdERhdGFbXSA9IFtdO1xuICAgICAgICBwcml2YXRlIGFjdGlvbnNUb1Rha2U6IFJlZGlyZWN0QWN0aW9ucyB8IENhdGVnb3J5QWN0aW9ucyA9IFtdO1xuICAgICAgICBwcml2YXRlIGVkaXRzQ3JlYXRpb25zVG9NYWtlOiAoXG4gICAgICAgICAgICB8IHsgdHlwZTogJ2VkaXQnOyB0aXRsZTogc3RyaW5nOyB0cmFuc2Zvcm06IChkYXRhOiB7IGNvbnRlbnQ6IHN0cmluZyB9KSA9PiBBcGlFZGl0UGFnZVBhcmFtcyB9XG4gICAgICAgICAgICB8IHsgdHlwZTogJ2NyZWF0ZSc7IGlzUmVkaXJlY3Q6IGJvb2xlYW47IHRpdGxlOiBzdHJpbmc7IHRleHQ6IHN0cmluZzsgc3VtbWFyeTogc3RyaW5nIH1cbiAgICAgICAgKVtdID0gW107XG5cbiAgICAgICAgY29uc3RydWN0b3IocmVxdWVzdFBhZ2VUeXBlOiAncmVkaXJlY3QnIHwgJ2NhdGVnb3J5JywgcGFnZVRpdGxlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHN1cGVyKHsgc2l6ZTogJ2xhcmdlJyB9KTtcblxuICAgICAgICAgICAgQWZjcmNIZWxwZXJEaWFsb2cuc3RhdGljLm5hbWUgPSAnQWZjcmNIZWxwZXJEaWFsb2cnO1xuICAgICAgICAgICAgQWZjcmNIZWxwZXJEaWFsb2cuc3RhdGljLnRpdGxlID0gJ2FmY3JjLWhlbHBlcic7XG4gICAgICAgICAgICBBZmNyY0hlbHBlckRpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICB7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfSxcbiAgICAgICAgICAgICAgICB7IGFjdGlvbjogJ3NhdmUnLCBsYWJlbDogJ1J1bicsIGZsYWdzOiBbJ3ByaW1hcnknLCAncHJvZ3Jlc3NpdmUnXSB9LFxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RQYWdlVHlwZSA9IHJlcXVlc3RQYWdlVHlwZTtcblxuICAgICAgICAgICAgbXcudXRpbC5hZGRDU1MoYFxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICBtYXJnaW46IDEwcHg7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3Qgc3VtbWFyeSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uYWZjcmMtaGVscGVyLXRhcmdldC1lZGl0b3Ige1xuICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgbWluLXdpZHRoOiAxY2g7XG4gICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA0Y2gpO1xufVxuXG4uYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4uYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsgc3ZnIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDFlbTtcbiAgICBoZWlnaHQ6IDFlbTtcbiAgICBmaWxsOiBjdXJyZW50Q29sb3I7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvLCAuYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyIHtcbiAgICBtYXJnaW46IDVweDtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LWluZm8gPiBkaXYsIC5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgPiBkaXYge1xuICAgIG1hcmdpbi1ibG9jazogOHB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyID4gZGl2Omxhc3Qtb2YtdHlwZSB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciAub28tdWktZmllbGRMYXlvdXQge1xuICAgIG1hcmdpbi1sZWZ0OiA4cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgLm9vLXVpLWZpZWxkTGF5b3V0LWhlYWRlciB7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xufVxuXG4uYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyB7XG4gICAgbWFyZ2luLXRvcDogOHB4O1xufVxuXG4uYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyAub28tdWktcmFkaW9PcHRpb25XaWRnZXQge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBwYWRkaW5nOiA4cHg7XG59XG5cbi5hZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCwgLmFmY3JjLWNvbW1lbnQtaW5wdXQge1xuICAgIG1heC13aWR0aDogNTAlO1xufVxuXG4uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyLCAuYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIGRldGFpbHMge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2EyYTliMTtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgbWFyZ2luLWJsb2NrOiAxMHB4O1xuICAgIHBhZGRpbmc6IDVweDtcbn1cblxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciB7XG4gICAgbWFyZ2luLWxlZnQ6IDhweDtcbn1cblxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBzdW1tYXJ5IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5hZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlscyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjtcbiAgICBtYXJnaW4tYmxvY2s6IDVweDtcbn1cblxuI2FmY3JjLWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSB7XG4gICAgcGFkZGluZzogNXB4O1xufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2NhbmNlbCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYW5hZ2VyKCkuY2xvc2VXaW5kb3codGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdzYXZlJylcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1BY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbHNlIHJldHVybiBBZmNyY0hlbHBlckRpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEFmY3JjSGVscGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWQgZWxlbWVudHMgaW4gdGhlIHdpbmRvdy5cbiAgICAgICAgICovXG4gICAgICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RUZW1wbGF0ZVJlc3BvbnNlID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiAnVXNlcjpFZWppdDQzL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyLmpzb24nLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0O1xuXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gSlNPTi5wYXJzZShyZWRpcmVjdFRlbXBsYXRlUmVzcG9uc2UucXVlcnkucGFnZXM/LlswXT8ucmV2aXNpb25zPy5bMF0/LnNsb3RzPy5tYWluPy5jb250ZW50IHx8ICd7fScpIGFzIFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuXG4gICAgICAgICAgICBjb25zdCBwYWdlUmV2aXNpb24gPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0O1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50ID0gcGFnZVJldmlzaW9uLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgICAgICB0aGlzLnBhcnNlUmVxdWVzdHMoKTtcbiAgICAgICAgICAgIHRoaXMubG9hZElucHV0RWxlbWVudHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYXJzZXMgcmVxdWVzdHMgZnJvbSB0aGUgcGFnZSBjb250ZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBwYXJzZVJlcXVlc3RzKCkge1xuICAgICAgICAgICAgdGhpcy5iZWZvcmVUZXh0ID0gdGhpcy5wYWdlQ29udGVudC5tYXRjaCgvXiguKj8pPT0vcykhWzFdO1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50ID0gdGhpcy5wYWdlQ29udGVudC5yZXBsYWNlKC9eLio/PT0vcywgJz09Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25zID0gWy4uLnRoaXMucGFnZUNvbnRlbnQubWF0Y2hBbGwoL149PS4qPz09JChcXHMqKD8hPT1bXj1dKS4qKSovZ2ltKV0ubWFwKChtYXRjaCkgPT4gbWF0Y2hbMF0pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb25UZXh0IG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNDbG9zZWQgPSAve3thZmMtY1xcfC9pLnRlc3Qoc2VjdGlvblRleHQpO1xuICAgICAgICAgICAgICAgIGlmIChpc0Nsb3NlZCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzZWN0aW9uSGVhZGVyID0gc2VjdGlvblRleHQubWF0Y2goL149PSguKj8pPT0kL20pIVsxXS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFBhZ2VUeXBlID09PSAncmVkaXJlY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB7fSBhcyBSZWRpcmVjdFJlcXVlc3REYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlZFBhZ2VzID0gWy4uLnNlY3Rpb25IZWFkZXIubWF0Y2hBbGwoL1xcW1xcWyguKj8pXV0vZyldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdPy50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJykpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RlZFBhZ2VzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5wYWdlcyA9IHJlcXVlc3RlZFBhZ2VzO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IHNlY3Rpb25UZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goL1RhcmdldCBvZiByZWRpcmVjdDogP1xcW1xcWyguKj8pXV0vKT8uWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXjovLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCdfJywgJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRUYXJnZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEudGFyZ2V0ID0gcGFyc2VkVGFyZ2V0O1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEucmVhc29uID0gc2VjdGlvblRleHQubWF0Y2goL3JlYXNvbjogPyguKj8pXFwqc291cmNlKD86IFxcKGlmIGFwcGxpY2FibGVcXCkpPzovaXMpPy5bMV0udHJpbSgpID8/ICcnO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEuc291cmNlID0gc2VjdGlvblRleHQubWF0Y2goL3NvdXJjZSg/OiBcXChpZiBhcHBsaWNhYmxlXFwpKT86ID8oLio/KSg/OjxyZWZlcmVuY2VzIFxcLz58XFxuXFxuKS9pcyk/LlsxXS50cmltKCkgPz8gJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVyID0gc2VjdGlvblRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uVGV4dC5pbmNsdWRlcygnPHJlZmVyZW5jZXMgLz4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IC88cmVmZXJlbmNlcyBcXC8+XFxuKyguKikvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFJlZ0V4cChgKD86PHJlZmVyZW5jZXMgXFxcXC8+JHtwYXJzZWREYXRhLnNvdXJjZSA/IGB8JHtwYXJzZWREYXRhLnNvdXJjZS5yZXBsYWNlQWxsKC9bXFxzIyQoKSorLC4/W1xcXFxcXF1ee3x9LV0vZywgJ1xcXFwkJicpfWAgOiAnJ30pXFxuKyguKilgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk/LlsxXVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gcmVxdWVzdGVyID8gcmVxdWVzdGVyLm1hdGNoKC8oPzpTcGVjaWFsOkNvbnRyaWJ1dGlvbnNcXC98VXNlcig/OiB0YWxrKT86KSguKj8pXFx8Lyk/LlsxXS50cmltKCkgOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEucmVxdWVzdGVyID0gcmVxdWVzdGVyICYmIG5hbWUgPyB7IHR5cGU6IC9cXFtcXFtVc2VyKCB0YWxrKT86Ly50ZXN0KHJlcXVlc3RlcikgPyAndXNlcicgOiAnaXAnLCBuYW1lIH0gOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnBhcnNlZFJlcXVlc3RzIGFzIFJlZGlyZWN0UmVxdWVzdERhdGFbXSkucHVzaChwYXJzZWREYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucykucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHBhcnNlZERhdGEudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQYWdlcy5tYXAoKHBhZ2UpID0+IFtwYWdlLCB7IG9yaWdpbmFsVGV4dDogeyBmdWxsU2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LCBzZWN0aW9uVGV4dDogc2VjdGlvblRleHQucmVwbGFjZSgvXj09Lio/PT0kL20sICcnKS50cmltKCkgfSwgYWN0aW9uOiAnbm9uZScgfV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IHt9IGFzIENhdGVnb3J5UmVxdWVzdERhdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRDYXRlZ29yeSA9IHNlY3Rpb25IZWFkZXIubWF0Y2goLzo/Q2F0ZWdvcnk6KC4qPykoXV18JCkvKT8uWzFdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZENhdGVnb3J5KSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICBwYXJzZWREYXRhLmNhdGVnb3J5ID0gZm91bmRDYXRlZ29yeS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgICAgICAgICBwYXJzZWREYXRhLmV4YW1wbGVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIFsuLi5zZWN0aW9uVGV4dC5tYXRjaCgvZXhhbXBsZSBwYWdlcyB3aGljaCBiZWxvbmcgdG8gdGhpcyBjYXRlZ29yeTooLio/KXBhcmVudCBjYXRlZ29yeVxcL2NhdGVnb3JpZXM6L2lzKSFbMV0ubWF0Y2hBbGwoL1xcKlxccyooPzpcXFtcXFspPyguKj8pKFxcfHxdXXxcXHMqP1xcbikvZyldXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdLnRyaW0oKS5yZXBsYWNlKC9eOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pID8/IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEucGFyZW50cyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBbLi4uc2VjdGlvblRleHQubWF0Y2goL3BhcmVudCBjYXRlZ29yeVxcL2NhdGVnb3JpZXM6KC4qPykoXFxuXFxufFxcblxcW1xcWyhzcGVjaWFsOmNvbnRyaWJ1dGlvbnNcXC98dXNlcjopKS9pcykhWzFdLm1hdGNoQWxsKC8oPzwhXFx8KSM/Oj9DYXRlZ29yeTooLio/KShcXHx8XV18XFxzKj9cXG4pL2cpXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0udHJpbSgpLnJlcGxhY2UoL146LywgJycpLnJlcGxhY2VBbGwoJ18nLCAnICcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgPz8gW107XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RVc2VySW5kZXggPSBzZWN0aW9uVGV4dC5pbmRleE9mKCdbW1VzZXI6Jyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0VXNlclRhbGtJbmRleCA9IHNlY3Rpb25UZXh0LmluZGV4T2YoJ1tbVXNlciB0YWxrOicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdElwSW5kZXggPSBzZWN0aW9uVGV4dC5pbmRleE9mKCdbW1NwZWNpYWw6Q29udHJpYnV0aW9ucy8nKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEluZGV4ID0gTWF0aC5taW4oLi4uW2ZpcnN0VXNlckluZGV4LCBmaXJzdFVzZXJUYWxrSW5kZXgsIGZpcnN0SXBJbmRleF0uZmlsdGVyKChpbmRleCkgPT4gaW5kZXggIT09IC0xKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5yZXF1ZXN0ZXIgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbmRleCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmaXJzdEluZGV4ID09PSBmaXJzdElwSW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyB0eXBlOiAnaXAnLCBuYW1lOiBzZWN0aW9uVGV4dC5tYXRjaCgvXFxbXFxbU3BlY2lhbDpDb250cmlidXRpb25zXFwvKC4qPykoXFx8fF1dKS8pIVsxXS50cmltKCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IHR5cGU6ICd1c2VyJywgbmFtZTogc2VjdGlvblRleHQubWF0Y2goL1xcW1xcW1VzZXIoPzogdGFsayk/OiguKj8pKFxcfHxdXSkvKSFbMV0udHJpbSgpIH07XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VkRGF0YS5yZXF1ZXN0ZXI/Lm5hbWUpIHBhcnNlZERhdGEucmVxdWVzdGVyID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcy5wYXJzZWRSZXF1ZXN0cyBhcyBDYXRlZ29yeVJlcXVlc3REYXRhW10pLnB1c2gocGFyc2VkRGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6IHBhcnNlZERhdGEuY2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlczogcGFyc2VkRGF0YS5leGFtcGxlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudHM6IHBhcnNlZERhdGEucGFyZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVGV4dDogeyBmdWxsU2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LCBzZWN0aW9uVGV4dDogc2VjdGlvblRleHQucmVwbGFjZSgvXj09Lio/PT0kL20sICcnKS50cmltKCkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIGlucHV0IGVsZW1lbnRzIGluIHRoZSBkaWFsb2cuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gTWF0aC5taW4oaW5kZXggKyBiYXRjaFNpemUsIHRoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7IHRpdGxlOiBPTy51aS5MYWJlbFdpZGdldCB9KS50aXRsZS5zZXRMYWJlbChgYWZjcmMtaGVscGVyIChsb2FkaW5nICR7aW5kZXggKyAxfS0ke2VuZEluZGV4fS8ke3RoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RofSByZXF1ZXN0cylgKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdWJJbmRleCA9IGluZGV4OyBzdWJJbmRleCA8IGVuZEluZGV4OyBzdWJJbmRleCsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVxdWVzdFBhZ2VUeXBlID09PSAncmVkaXJlY3QnKSB0aGlzLmxvYWRSZWRpcmVjdFJlcXVlc3RFbGVtZW50cyhzdWJJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRoaXMubG9hZENhdGVnb3J5UmVxdWVzdEVsZW1lbnRzKHN1YkluZGV4KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggPCB0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBlbmRJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoaGFuZGxlLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlICh0aGlzIGFzIHVua25vd24gYXMgeyB0aXRsZTogT08udWkuTGFiZWxXaWRnZXQgfSkudGl0bGUuc2V0TGFiZWwoYGFmY3JjLWhlbHBlciAoJHt0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aH0gcmVxdWVzdHMgbG9hZGVkKWApO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBoYW5kbGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVdpZGdldCA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHsgdHlwZTogJ25vdGljZScsIGxhYmVsOiAnTm8gdmFsaWQgcmVxdWVzdHMgdG8gaGFuZGxlIScgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0TGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVdpZGdldExheW91dC4kZWxlbWVudC5hcHBlbmQobWVzc2FnZVdpZGdldC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQobWVzc2FnZVdpZGdldExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyBhIGdpdmVuIHJlZGlyZWN0IHJlcXVlc3QgaW50byB0aGUgZGlhbG9nLlxuICAgICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0IHRvIGxvYWQuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGxvYWRSZWRpcmVjdFJlcXVlc3RFbGVtZW50cyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wYXJzZWRSZXF1ZXN0c1tpbmRleF0gYXMgUmVkaXJlY3RSZXF1ZXN0RGF0YTtcblxuICAgICAgICAgICAgY29uc3QgZGV0YWlsc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdCcpO1xuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlU2l6ZSgpLCAwKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQuaW5uZXJIVE1MID0gcmVxdWVzdC5wYWdlcy5tYXAoKHBhZ2UpID0+IGA8Yj4ke3BhZ2V9PC9iPmApLmpvaW4oJywgJykgKyAnIFx1MjE5MiAnO1xuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8udGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBldmVudC5rZXkgPT09ICcgJykgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRFZGl0b3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXRhcmdldC1lZGl0b3InKTtcbiAgICAgICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXF1ZXN0LnRhcmdldC5sZW5ndGh9Y2hgO1xuICAgICAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZSA9IHJlcXVlc3QudGFyZ2V0O1xuICAgICAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlID0gdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlLmxlbmd0aH1jaGA7XG5cbiAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnRhcmdldCA9IHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWU7XG5cbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwodGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQuYXBwZW5kKHRhcmdldEVkaXRvckVsZW1lbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIGxpbmtFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1leHRlcm5hbC1saW5rJyk7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChyZXF1ZXN0LnRhcmdldCk7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC5pbm5lckhUTUwgPSBgXG48c3ZnIHZpZXdib3g9XCIwIDAgNDggNDhcIj5cbiAgICA8cGF0aCBkPVwiTTM2IDI0Yy0xLjIgMC0yIDAuOC0yIDJ2MTJjMCAxLjItMC44IDItMiAyaC0yMmMtMS4yXG4gICAgICAgIDAtMi0wLjgtMi0ydi0yMmMwLTEuMiAwLjgtMiAyLTJoMTJjMS4yIDAgMi0wLjggMi0ycy0wLjgtMi0yLTJoLTEyYy0zLjRcbiAgICAgICAgMC02IDIuNi02IDZ2MjJjMCAzLjQgMi42IDYgNiA2aDIyYzMuNCAwIDYtMi42XG4gICAgICAgIDYtNnYtMTJjMC0xLjItMC44LTItMi0yelwiPjwvcGF0aD5cbiAgICA8cGF0aCBkPVwiTTQzLjggNS4yYy0wLjItMC40LTAuNi0wLjgtMS0xLTAuMi0wLjItMC42LTAuMi0wLjgtMC4yaC0xMmMtMS4yXG4gICAgICAgIDAtMiAwLjgtMiAyczAuOCAyIDIgMmg3LjJsLTE4LjYgMTguNmMtMC44IDAuOC0wLjggMiAwIDIuOCAwLjQgMC40IDAuOFxuICAgICAgICAwLjYgMS40IDAuNnMxLTAuMiAxLjQtMC42bDE4LjYtMTguNnY3LjJjMCAxLjIgMC44IDIgMiAyczItMC44XG4gICAgICAgIDItMnYtMTJjMC0wLjIgMC0wLjYtMC4yLTAuOHpcIj48L3BhdGg+XG48L3N2Zz5gO1xuXG4gICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC5hcHBlbmQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0SW5mb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vbmVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgbm9uZUVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgICAgICBub25lRWxlbWVudC50ZXh0Q29udGVudCA9ICdOb25lJztcblxuICAgICAgICAgICAgY29uc3QgdW5rbm93bkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICB1bmtub3duRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgICAgIHVua25vd25FbGVtZW50LnRleHRDb250ZW50ID0gJ1Vua25vd24nO1xuXG4gICAgICAgICAgICBjb25zdCByZWFzb25EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgY29uc3QgcmVhc29uTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgICAgICByZWFzb25MYWJlbC50ZXh0Q29udGVudCA9ICdSZWFzb246ICc7XG4gICAgICAgICAgICByZWFzb25EaXYuYXBwZW5kKHJlYXNvbkxhYmVsKTtcblxuICAgICAgICAgICAgaWYgKHJlcXVlc3QucmVhc29uKSByZWFzb25EaXYuYXBwZW5kKHJlcXVlc3QucmVhc29uKTtcbiAgICAgICAgICAgIGVsc2UgcmVhc29uRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHJlYXNvbkRpdik7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgICAgIHNvdXJjZUxhYmVsLnRleHRDb250ZW50ID0gJ1NvdXJjZTogJztcbiAgICAgICAgICAgIHNvdXJjZURpdi5hcHBlbmQoc291cmNlTGFiZWwpO1xuXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5zb3VyY2UpIHNvdXJjZURpdi5hcHBlbmQocmVxdWVzdC5zb3VyY2UpO1xuICAgICAgICAgICAgZWxzZSBzb3VyY2VEaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQoc291cmNlRGl2KTtcblxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGFiZWwudGV4dENvbnRlbnQgPSAnUmVxdWVzdGVyOiAnO1xuICAgICAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMYWJlbCk7XG5cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3Rlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdGVyTGluay50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLmhyZWYgPSByZXF1ZXN0LnJlcXVlc3Rlci50eXBlID09PSAndXNlcicgPyBtdy51dGlsLmdldFVybChgVXNlcjoke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YCkgOiBtdy51dGlsLmdldFVybChgU3BlY2lhbDpDb250cmlidXRpb25zLyR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRleHRDb250ZW50ID0gcmVxdWVzdC5yZXF1ZXN0ZXIubmFtZTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxpbmspO1xuICAgICAgICAgICAgfSBlbHNlIHJlcXVlc3RlckRpdi5hcHBlbmQodW5rbm93bkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChyZXF1ZXN0ZXJEaXYpO1xuXG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQocmVxdWVzdEluZm9FbGVtZW50KTtcblxuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2hyJykpO1xuXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyJyk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVxdWVzdGVkVGl0bGUgb2YgcmVxdWVzdC5wYWdlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlZFRpdGxlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgICAgICAgICBsYWJlbC50ZXh0Q29udGVudCA9IHJlcXVlc3RlZFRpdGxlO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RlZFRpdGxlRGl2LmFwcGVuZChsYWJlbCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgdGFnU2VsZWN0TGF5b3V0OiBPTy51aS5GaWVsZExheW91dCwgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yOiBIVE1MRGV0YWlsc0VsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUVkaXRvcnNJbmZvOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvW10gPSBbXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvblJhZGlvSW5wdXQgPSBuZXcgT08udWkuUmFkaW9TZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci1hY3Rpb24tcmFkaW8nXSxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFsnQWNjZXB0JywgJ0RlbnknLCAnQ29tbWVudCcsICdDbG9zZScsICdOb25lJ10ubWFwKChsYWJlbCkgPT4gbmV3IE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KHsgZGF0YTogbGFiZWwsIGxhYmVsIH0pKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhY3Rpb25SYWRpb0lucHV0LnNlbGVjdEl0ZW1CeUxhYmVsKCdOb25lJyk7XG4gICAgICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5vbignY2hvb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlU2l6ZSgpLCAwKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSAoKGFjdGlvblJhZGlvSW5wdXQuZmluZFNlbGVjdGVkSXRlbSgpIGFzIE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KS5nZXREYXRhKCkgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpIGFzIEFjdGlvblR5cGU7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uYWN0aW9uID0gb3B0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFnU2VsZWN0TGF5b3V0IHx8ICF0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ1NlbGVjdCA9IG5ldyBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93QXJiaXRyYXJ5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpLm1hcCgoW3RhZywgeyByZWRpcmVjdCB9XSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0KSByZXR1cm4geyBkYXRhOiB0YWcsIGxhYmVsOiB0YWcgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChgJHt0YWd9IDxpPihyZWRpcmVjdCB3aXRoIHBvc3NpYmlsaXRpZXMpPC9pPmApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWwgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRhZ1NlbGVjdC5nZXRNZW51KCkgYXMgT08udWkuTWVudVNlbGVjdFdpZGdldC5Db25maWdPcHRpb25zKS5maWx0ZXJNb2RlID0gJ3N1YnN0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKHRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHRhZ1NlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLnJlZGlyZWN0VGVtcGxhdGVzID0gc29ydGVkVGFncztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWRpdG9ySW5mbyBvZiB0ZW1wbGF0ZUVkaXRvcnNJbmZvKSBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaG93blRlbXBsYXRlRWRpdG9ycyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRpdG9ySW5mbyA9IHRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3JJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93blRlbXBsYXRlRWRpdG9ycysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSBgVGVtcGxhdGUgcGFyYW1ldGVycyAoJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyBgZm9yICR7c2hvd25UZW1wbGF0ZUVkaXRvcnN9IHRlbXBsYXRlJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDEgPyAncycgOiAnJ31gIDogJ25vbmUgdG8gc2hvdyd9KWA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2Uuc3R5bGUuZGlzcGxheSA9IHNob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/ICdub25lJyA6ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGFnU2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRhZ1NlbGVjdCwgeyBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci10YWctc2VsZWN0LWxheW91dCddLCBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnUmVkaXJlY3QgdGVtcGxhdGVzOicgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0uYmVmb3JlKHRhZ1NlbGVjdExheW91dC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXInKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9ICdUZW1wbGF0ZSBwYXJhbWV0ZXJzIChub25lIHRvIHNob3cpJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXModGVtcGxhdGVEYXRhLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeS50ZXh0Q29udGVudCA9IHRlbXBsYXRlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChzdW1tYXJ5KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREYXRhOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvID0geyBuYW1lOiB0ZW1wbGF0ZU5hbWUsIGRldGFpbHMsIHBhcmFtZXRlcnM6IFtdIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiBwYXJhbWV0ZXJEYXRhLmRlZmF1bHQ/LnRvU3RyaW5nKCksIHJlcXVpcmVkOiBwYXJhbWV0ZXJEYXRhLnJlcXVpcmVkIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhcmFtZXRlck5hbWV9JHshcGFyYW1ldGVyRGF0YS5sYWJlbCB8fCBwYXJhbWV0ZXJOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBhcmFtZXRlckRhdGEubGFiZWw/LnRvTG93ZXJDYXNlKCkgPyAnJyA6IGAgKCR7cGFyYW1ldGVyRGF0YS5sYWJlbH0pYH0ke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb24gPyBgICgke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb259KWAgOiAnJ30gKHR5cGU6ICR7cGFyYW1ldGVyRGF0YS50eXBlfSkgJHtwYXJhbWV0ZXJEYXRhLnN1Z2dlc3RlZCA/ICcgKHN1Z2dlc3RlZCknIDogJyd9JHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGUgPyBgIChleGFtcGxlOiBcIiR7cGFyYW1ldGVyRGF0YS5leGFtcGxlfVwiKWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKGlucHV0TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS5wYXJhbWV0ZXJzLnB1c2goeyBuYW1lOiBwYXJhbWV0ZXJOYW1lLCBhbGlhc2VzOiBwYXJhbWV0ZXJEYXRhLmFsaWFzZXMsIGVkaXRvcjogaW5wdXQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChkZXRhaWxzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRWRpdG9yc0luZm8ucHVzaChlbGVtZW50RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLnJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzID0gdGVtcGxhdGVFZGl0b3JzSW5mbztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9UZW1wbGF0ZXNNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UuaWQgPSAnYWZjcmMtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS50ZXh0Q29udGVudCA9ICdObyB0ZW1wbGF0ZXMgd2l0aCBwYXJhbWV0ZXJzIHRvIGRpc3BsYXkhJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChub1RlbXBsYXRlc01lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0uYmVmb3JlKHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoWydhY2NlcHQnLCAnY29tbWVudCcsICdjbG9zZSddLmluY2x1ZGVzKG9wdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWVudCkgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRlbGV0ZSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudCwgaW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRhZ1NlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZGVueVJlYXNvbiA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ2F1dG9maWxsOnVubGlrZWx5JyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgWydleGlzdHMnLCAnZXhpc3RpbmcgcGFnZXMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnZW1wdHknLCAnZW1wdHkgc3VibWlzc2lvbnMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnbm90YXJnZXQnLCAnbm9uZXhpc3RlbnQgb3Igbm8gcHJvdmlkZWQgdGFyZ2V0J10sXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ25vdGl0bGUnLCAnbm8gdGl0bGUgcHJvdmlkZWQnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsndW5saWtlbHknLCAndW5saWtlbHkgcmVkaXJlY3RzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ25vdHJlZGlyZWN0JywgJ2FydGljbGUgY3JlYXRpb24gcmVxdWVzdHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnZXh0ZXJuYWxsaW5rJywgJ2V4dGVybmFsIGxpbmsgcmVkaXJlY3RzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ2VkaXRyZXF1ZXN0JywgJ2VkaXQgcmVxdWVzdHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnbm90ZW5nbGlzaCcsICdyZXF1ZXN0cyBub3QgaW4gRW5nbGlzaCddLFxuICAgICAgICAgICAgICAgICAgICBdLm1hcCgoW3ZhbHVlLCBsYWJlbF0pID0+ICh7IGRhdGE6IGBhdXRvZmlsbDoke3ZhbHVlfWAsIGxhYmVsOiBgQXV0b2ZpbGxlZCB0ZXh0IGZvciAke2xhYmVsfWAgfSkpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlbnlSZWFzb24ub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uZGVueVJlYXNvbiA9IGRlbnlSZWFzb24uZ2V0VmFsdWUoKSB8fCAnYXV0b2ZpbGw6dW5saWtlbHknO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlbnlSZWFzb24uc2V0VmFsdWUoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG4gICAgICAgICAgICAgICAgZGVueVJlYXNvbi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgnYXV0b2ZpbGw6dW5saWtlbHknKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRlbnlSZWFzb25MYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoZGVueVJlYXNvbiwge1xuICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRGVueSByZWFzb246JyxcbiAgICAgICAgICAgICAgICAgICAgaGVscDogJ1N1cHBvcnRzIGF1dG9tYXRpYyByZWFzb25pbmcsIGN1c3RvbSByZWFzb25pbmcsIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIHR3byB3aXRoIFwiYXV0b2ZpbGw6UkVBU09OLCBDVVNUT01cIiBmb3JtYXQnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2xvc2luZ1JlYXNvbiA9IG5ldyBPTy51aS5Ecm9wZG93bldpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgICAgICAgICAgbWVudToge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ05vIHJlc3BvbnNlJywgJ3InXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ1N1Y2NlZWRlZCcsICdzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydXaXRoZHJhd24nLCAndyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgXS5tYXAoKFt0aXRsZSwgaWRdKSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGE6IGlkLCBsYWJlbDogdGl0bGUgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLm9uKCdjaG9vc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpIGFzIE9PLnVpLk1lbnVPcHRpb25XaWRnZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY2xvc2luZ1JlYXNvbiA9IHsgbmFtZTogc2VsZWN0ZWQuZ2V0TGFiZWwoKSBhcyBzdHJpbmcsIGlkOiBzZWxlY3RlZC5nZXREYXRhKCkgYXMgc3RyaW5nIH07XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdyJyk7XG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY2xvc2luZ1JlYXNvbiA9IHsgbmFtZTogJ05vIHJlc3BvbnNlJywgaWQ6ICdyJyB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2xvc2luZ1JlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjbG9zaW5nUmVhc29uLCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDbG9zaW5nIHJlYXNvbjonIH0pO1xuICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWVudElucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCgpO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50KSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWxldGUgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY29tbWVudDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjb21tZW50SW5wdXQsIHsgY2xhc3NlczogWydhZmNyYy1jb21tZW50LWlucHV0J10sIGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDb21tZW50OicgfSk7XG4gICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZFRpdGxlRGl2LmFwcGVuZChhY3Rpb25SYWRpb0lucHV0LiRlbGVtZW50WzBdLCBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50WzBdLCBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50WzBdLCBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQuYXBwZW5kKHJlcXVlc3RlZFRpdGxlRGl2KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RSZXNwb25kZXJFbGVtZW50KTtcblxuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKGRldGFpbHNFbGVtZW50KTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgYSBnaXZlbiBjYXRlZ29yeSByZXF1ZXN0IGludG8gdGhlIGRpYWxvZy5cbiAgICAgICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdCB0byBsb2FkLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBsb2FkQ2F0ZWdvcnlSZXF1ZXN0RWxlbWVudHMoaW5kZXg6IG51bWJlcikge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucGFyc2VkUmVxdWVzdHNbaW5kZXhdIGFzIENhdGVnb3J5UmVxdWVzdERhdGE7XG5cbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QnKTtcbiAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoKSwgMCkpO1xuXG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LmlubmVySFRNTCA9IGA8Yj5DYXRlZ29yeToke3JlcXVlc3QuY2F0ZWdvcnl9PC9iPmA7XG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0SW5mb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vbmVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgbm9uZUVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgICAgICBub25lRWxlbWVudC50ZXh0Q29udGVudCA9ICdOb25lJztcblxuICAgICAgICAgICAgY29uc3QgdW5rbm93bkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICB1bmtub3duRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgICAgIHVua25vd25FbGVtZW50LnRleHRDb250ZW50ID0gJ1Vua25vd24nO1xuXG4gICAgICAgICAgICBjb25zdCBleGFtcGxlc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBjb25zdCBleGFtcGxlc0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICAgICAgZXhhbXBsZXNMYWJlbC50ZXh0Q29udGVudCA9ICdFeGFtcGxlczogJztcbiAgICAgICAgICAgIGV4YW1wbGVzRGl2LmFwcGVuZChleGFtcGxlc0xhYmVsKTtcblxuICAgICAgICAgICAgaWYgKHJlcXVlc3QuZXhhbXBsZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgZXhhbXBsZV0gb2YgcmVxdWVzdC5leGFtcGxlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoZXhhbXBsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gZXhhbXBsZTtcblxuICAgICAgICAgICAgICAgICAgICBleGFtcGxlc0Rpdi5hcHBlbmQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gcmVxdWVzdC5leGFtcGxlcy5sZW5ndGggLSAxKSBleGFtcGxlc0Rpdi5hcHBlbmQoJywgJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBleGFtcGxlc0Rpdi5hcHBlbmQobm9uZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChleGFtcGxlc0Rpdik7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmVudHNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyZW50c0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICAgICAgcGFyZW50c0xhYmVsLnRleHRDb250ZW50ID0gJ1BhcmVudHM6ICc7XG4gICAgICAgICAgICBwYXJlbnRzRGl2LmFwcGVuZChwYXJlbnRzTGFiZWwpO1xuXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5wYXJlbnRzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHBhcmVudF0gb2YgcmVxdWVzdC5wYXJlbnRzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChgQ2F0ZWdvcnk6JHtwYXJlbnR9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gcGFyZW50O1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudHNEaXYuYXBwZW5kKGxpbmtFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IHJlcXVlc3QucGFyZW50cy5sZW5ndGggLSAxKSBwYXJlbnRzRGl2LmFwcGVuZCgnLCAnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHBhcmVudHNEaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocGFyZW50c0Rpdik7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgICAgIHJlcXVlc3RlckxhYmVsLnRleHRDb250ZW50ID0gJ1JlcXVlc3RlcjogJztcbiAgICAgICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGFiZWwpO1xuXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ZXJMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICAgICAgcmVxdWVzdGVyTGluay5ocmVmID0gcmVxdWVzdC5yZXF1ZXN0ZXIudHlwZSA9PT0gJ3VzZXInID8gbXcudXRpbC5nZXRVcmwoYFVzZXI6JHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApIDogbXcudXRpbC5nZXRVcmwoYFNwZWNpYWw6Q29udHJpYnV0aW9ucy8ke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YCk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdGVyTGluay50ZXh0Q29udGVudCA9IHJlcXVlc3QucmVxdWVzdGVyLm5hbWU7XG4gICAgICAgICAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMaW5rKTtcbiAgICAgICAgICAgIH0gZWxzZSByZXF1ZXN0ZXJEaXYuYXBwZW5kKHVua25vd25FbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocmVxdWVzdGVyRGl2KTtcblxuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RJbmZvRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdocicpKTtcblxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlcicpO1xuXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25SYWRpb0lucHV0ID0gbmV3IE9PLnVpLlJhZGlvU2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci1hY3Rpb24tcmFkaW8nXSxcbiAgICAgICAgICAgICAgICBpdGVtczogWydBY2NlcHQnLCAnRGVueScsICdDb21tZW50JywgJ0Nsb3NlJywgJ05vbmUnXS5tYXAoKGxhYmVsKSA9PiBuZXcgT08udWkuUmFkaW9PcHRpb25XaWRnZXQoeyBkYXRhOiBsYWJlbCwgbGFiZWwgfSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhY3Rpb25SYWRpb0lucHV0LnNlbGVjdEl0ZW1CeUxhYmVsKCdOb25lJyk7XG4gICAgICAgICAgICBhY3Rpb25SYWRpb0lucHV0Lm9uKCdjaG9vc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoKSwgMCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSAoKGFjdGlvblJhZGlvSW5wdXQuZmluZFNlbGVjdGVkSXRlbSgpIGFzIE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KS5nZXREYXRhKCkgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpIGFzIEFjdGlvblR5cGU7XG5cbiAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmFjdGlvbiA9IG9wdGlvbjtcblxuICAgICAgICAgICAgICAgIGlmIChbJ2NvbW1lbnQnLCAnY2xvc2UnXS5pbmNsdWRlcyhvcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgZGVsZXRlICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY29tbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQsIGluZGV4KTtcblxuICAgICAgICAgICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgICAgIGNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhZ2VTZWxlY3RJbnB1dCA9IG5ldyBQYWdlSW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ0FkZCBwYWdlcyBoZXJlJyB9KTtcbiAgICAgICAgICAgIHBhZ2VTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHBhZ2VTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL146LywgJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHBhZ2VTZWxlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYWdlU2VsZWN0SW5wdXQub24oJ3Nob3dpbmctdmFsdWVzJywgKHBhZ2VzOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHBhZ2VTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhZ2UuZGF0YSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgcGFnZVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7IGFsbG93UmVvcmRlcmluZzogZmFsc2UsIGlucHV0UG9zaXRpb246ICdvdXRsaW5lJywgaW5wdXRXaWRnZXQ6IHBhZ2VTZWxlY3RJbnB1dCB9KTtcbiAgICAgICAgICAgIHBhZ2VTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKHBhZ2VTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKHBhZ2VTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgcGFnZVNlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uZXhhbXBsZXMgPSBzb3J0ZWRUYWdzO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHsgZXhhbXBsZXMgfSA9ICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF07XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZXhhbXBsZSBvZiBleGFtcGxlcykgcGFnZVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUoZXhhbXBsZSk7XG4gICAgICAgICAgICBwYWdlU2VsZWN0LnNldFZhbHVlKGV4YW1wbGVzKTtcblxuICAgICAgICAgICAgY29uc3QgcGFnZVNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChwYWdlU2VsZWN0LCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdQYWdlcyB0byBjYXRlZ29yaXplOicgfSk7XG4gICAgICAgICAgICBwYWdlU2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcnlTZWxlY3RJbnB1dCA9IG5ldyBDYXRlZ29yeUlucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdBZGQgY2F0ZWdvcmllcyBoZXJlJyB9KTtcbiAgICAgICAgICAgIGNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBjYXRlZ29yeVNlbGVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXkNhdGVnb3J5Oi8sICcnKTtcblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSBjYXRlZ29yeVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ3Nob3dpbmctdmFsdWVzJywgKHBhZ2VzOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIGNhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNhdGVnb3J5U2VsZWN0ID0gbmV3IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0KHsgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSwgaW5wdXRQb3NpdGlvbjogJ291dGxpbmUnLCBpbnB1dFdpZGdldDogY2F0ZWdvcnlTZWxlY3RJbnB1dCB9KTtcbiAgICAgICAgICAgIGNhdGVnb3J5U2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9IChjYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgICAgIGlmICgoY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgY2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLnBhcmVudHMgPSBzb3J0ZWRUYWdzO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHsgcGFyZW50cyB9ID0gKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwYXJlbnQgb2YgcGFyZW50cykgY2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhcmVudCk7XG4gICAgICAgICAgICBjYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZShwYXJlbnRzKTtcblxuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcnlTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoY2F0ZWdvcnlTZWxlY3QsIHsgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ0NhdGVnb3JpZXM6JyB9KTtcbiAgICAgICAgICAgIGNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgY29uc3QgZGVueVJlYXNvbiA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdhdXRvZmlsbDp1bmxpa2VseScsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICBbJ2V4aXN0cycsICdleGlzdGluZyBjYXRlZ29yaWVzJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnZW1wdHknLCAnZW1wdHkgc3VibWlzc2lvbnMnXSxcbiAgICAgICAgICAgICAgICAgICAgWyd1bmxpa2VseScsICdjYXRlZ29yaWVzIHRoYXQgYXJlIHVubGlrZWx5IHRvIGhhdmUgZW5vdWdoIHBhZ2VzJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnbm90Y2F0ZWdvcnknLCAncGFnZSBjcmVhdGlvbiByZXF1ZXN0cyddLFxuICAgICAgICAgICAgICAgICAgICBbJ25vdGVuZ2xpc2gnLCAncmVxdWVzdHMgbm90IGluIEVuZ2xpc2gnXSxcbiAgICAgICAgICAgICAgICBdLm1hcCgoW3ZhbHVlLCBsYWJlbF0pID0+ICh7IGRhdGE6IGBhdXRvZmlsbDoke3ZhbHVlfWAsIGxhYmVsOiBgQXV0b2ZpbGxlZCB0ZXh0IGZvciAke2xhYmVsfWAgfSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZW55UmVhc29uLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5kZW55UmVhc29uID0gZGVueVJlYXNvbi5nZXRWYWx1ZSgpIHx8ICdhdXRvZmlsbDp1bmxpa2VseSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlbnlSZWFzb24uc2V0VmFsdWUoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG4gICAgICAgICAgICBkZW55UmVhc29uLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdhdXRvZmlsbDp1bmxpa2VseScpO1xuXG4gICAgICAgICAgICBjb25zdCBkZW55UmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGRlbnlSZWFzb24sIHtcbiAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdEZW55IHJlYXNvbjonLFxuICAgICAgICAgICAgICAgIGhlbHA6ICdTdXBwb3J0cyBhdXRvbWF0aWMgcmVhc29uaW5nLCBjdXN0b20gcmVhc29uaW5nLCBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gd2l0aCBcImF1dG9maWxsOlJFQVNPTiwgQ1VTVE9NXCIgZm9ybWF0JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb24gPSBuZXcgT08udWkuRHJvcGRvd25XaWRnZXQoe1xuICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgICAgICBtZW51OiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ05vIHJlc3BvbnNlJywgJ3InXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnU3VjY2VlZGVkJywgJ3MnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnV2l0aGRyYXduJywgJ3cnXSxcbiAgICAgICAgICAgICAgICAgICAgXS5tYXAoKFt0aXRsZSwgaWRdKSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGE6IGlkLCBsYWJlbDogdGl0bGUgfSkpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLm9uKCdjaG9vc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCkgYXMgT08udWkuTWVudU9wdGlvbldpZGdldDtcblxuICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY2xvc2luZ1JlYXNvbiA9IHsgbmFtZTogc2VsZWN0ZWQuZ2V0TGFiZWwoKSBhcyBzdHJpbmcsIGlkOiBzZWxlY3RlZC5nZXREYXRhKCkgYXMgc3RyaW5nIH07XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudCwgaW5kZXgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdyJyk7XG4gICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNsb3NpbmdSZWFzb24gPSB7IG5hbWU6ICdObyByZXNwb25zZScsIGlkOiAncicgfTtcblxuICAgICAgICAgICAgY29uc3QgY2xvc2luZ1JlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjbG9zaW5nUmVhc29uLCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDbG9zaW5nIHJlYXNvbjonIH0pO1xuICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgICAgIGNvbW1lbnRJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29tbWVudCkgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgICAgICBlbHNlIGRlbGV0ZSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNvbW1lbnQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgY29tbWVudElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNvbW1lbnRJbnB1dCwgeyBjbGFzc2VzOiBbJ2FmY3JjLWNvbW1lbnQtaW5wdXQnXSwgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ0NvbW1lbnQ6JyB9KTtcbiAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmFwcGVuZChcbiAgICAgICAgICAgICAgICBhY3Rpb25SYWRpb0lucHV0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCk7XG5cbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChkZXRhaWxzRWxlbWVudCk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZXMgdGhlIGNvbG9yIG9mIGEgZGV0YWlscyBlbGVtZW50IGJhc2VkIG9uIHRoZSBoYW5kbGluZyBvZiB0aGUgcmVxdWVzdHMgaW5zaWRlLlxuICAgICAgICAgKiBAcGFyYW0gZGV0YWlsc0VsZW1lbnQgVGhlIGRldGFpbHMgZWxlbWVudCB0byB1cGRhdGUuXG4gICAgICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHJlZGlyZWN0IHRhcmdldC5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgdXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlcXVlc3RQYWdlVHlwZSA9PT0gJ3JlZGlyZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbnNUb1Rha2UgPSBPYmplY3QudmFsdWVzKCh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHMpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCA9IGFjdGlvbnNUb1Rha2UuZXZlcnkoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcgfHwgYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q2xvc2VSZWFzb24gPSBhY3Rpb25zVG9UYWtlLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyk/LmNsb3NpbmdSZWFzb24/LmlkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQ2xvc2VkID0gYWN0aW9uc1RvVGFrZS5ldmVyeSgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnICYmIGFjdGlvbi5jbG9zaW5nUmVhc29uPy5pZCA9PT0gZmlyc3RDbG9zZVJlYXNvbik7XG5cbiAgICAgICAgICAgICAgICBsZXQgYmFja2dyb3VuZENvbG9yID0gJyc7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2NlcHRlZENvdW50ID0gYWN0aW9uc1RvVGFrZS5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVuaWVkQ291bnQgPSBhY3Rpb25zVG9UYWtlLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnZGVueScpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXB0ZWRDb3VudCA+IDAgJiYgZGVuaWVkQ291bnQgPiAwKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZjE3ZSc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFjY2VwdGVkQ291bnQgPiAwKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2EwZmZhMCc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWxsUmVxdWVzdHNDbG9zZWQpXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENsb3NlUmVhc29uID09PSAncicpIGJhY2tncm91bmRDb2xvciA9ICcjZmZjZWNlJztcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZmlyc3RDbG9zZVJlYXNvbiA9PT0gJ3MnKSBiYWNrZ3JvdW5kQ29sb3IgPSAnIzkwYzA5MCc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgYmFja2dyb3VuZENvbG9yID0gJyNiOGI4YjgnO1xuXG4gICAgICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGFjdGlvbiB9ID0gKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XTtcblxuICAgICAgICAgICAgICAgIGxldCBiYWNrZ3JvdW5kQ29sb3IgPSAnJztcblxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1zd2l0Y2hcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnYWNjZXB0JykgYmFja2dyb3VuZENvbG9yID0gJyNhMGZmYTAnO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2RlbnknKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2xvc2UnKVxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5jbG9zaW5nUmVhc29uPy5pZCA9PT0gJ3InKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY2xvc2luZ1JlYXNvbj8uaWQgPT09ICdzJykgYmFja2dyb3VuZENvbG9yID0gJyM5MGMwOTAnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGJhY2tncm91bmRDb2xvciA9ICcjYjhiOGI4JztcblxuICAgICAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhbGwgYWN0aW9ucyBhbmQgbG9ncyB0aGVpciByZXN1bHRzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBwZXJmb3JtQWN0aW9ucygpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNob3dBY3Rpb25zRGlhbG9nID0gbmV3IFNob3dBY3Rpb25zRGlhbG9nKCk7XG4gICAgICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3Nob3dBY3Rpb25zRGlhbG9nXSk7XG4gICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5vcGVuKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvdW50cyA9IHsgYWNjZXB0ZWQ6IDAsIGRlbmllZDogMCwgJ2NvbW1lbnRlZCBvbic6IDAsIGNsb3NlZDogMCB9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuXG4gICAgICAgICAgICBsZXQgbmV3UGFnZVRleHQgPSAoXG4gICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgICAgICkucXVlcnkucGFnZXNbMF0ucmV2aXNpb25zWzBdLnNsb3RzLm1haW4uY29udGVudC50cmltKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlcXVlc3RQYWdlVHlwZSA9PT0gJ3JlZGlyZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFueVJlcXVlc3RIYW5kbGVkID0gKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpLnNvbWUoKGFjdGlvbkRhdGEpID0+IE9iamVjdC52YWx1ZXMoYWN0aW9uRGF0YS5yZXF1ZXN0cykuc29tZSgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uICE9PSAnbm9uZScpKTtcblxuICAgICAgICAgICAgICAgIGlmIChhbnlSZXF1ZXN0SGFuZGxlZCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHsgdGFyZ2V0LCByZXF1ZXN0cyB9IG9mIHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQgPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzKS5zb21lKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnIHx8IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuZXZlcnkoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcgfHwgYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDbG9zZVJlYXNvbiA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMgYXMgUmVjb3JkPHN0cmluZywgUmVkaXJlY3RBY3Rpb24+KS5maW5kKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScpPy5jbG9zaW5nUmVhc29uPy5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQ2xvc2VkID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cyBhcyBSZWNvcmQ8c3RyaW5nLCBSZWRpcmVjdEFjdGlvbj4pLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScgJiYgYWN0aW9uLmNsb3NpbmdSZWFzb24/LmlkID09PSBmaXJzdENsb3NlUmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRQYWdlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVuaWVkUGFnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFtb3VudE9mUGFnZXMgPSBPYmplY3Qua2V5cyhyZXF1ZXN0cykubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhyZXF1ZXN0cykgYXMgW3N0cmluZywgUmVkaXJlY3RBY3Rpb25dW10pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24uYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkICYmICFhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KGBOb3QgYWxsIHJlcXVlc3RzIHRvIFwiJHt0YXJnZXR9XCIgd2VyZSBhY2NlcHRlZCBvciBkZW5pZWQsIHRoZSBoYW5kbGluZyBvZiBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgd2lsbCBiZSBpZ25vcmVkLmAsICd3YXJuaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZFBhZ2VzLnB1c2gocmVxdWVzdGVkVGl0bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uY29tbWVudCkgY29tbWVudHMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5jb21tZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmFjY2VwdGVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbnknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCAmJiAhYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgYWNjZXB0ZWQgb3IgZGVuaWVkLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIGlzIGJlaW5nIGlnbm9yZWQuYCwgJ3dhcm5pbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbmllZFBhZ2VzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uZGVueVJlYXNvbiFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuZGVuaWVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5wdXNoKFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uLmNvbW1lbnRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbJ2NvbW1lbnRlZCBvbiddKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSByZXF1ZXN0IHRvIGNyZWF0ZSBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgXHUyMTkyIFwiJHt0YXJnZXR9XCIgd2FzIG1hcmtlZCB0byBiZSBjb21tZW50ZWQgb24sIGJ1dCBubyBjb21tZW50IHdhcyBwcm92aWRlZCBzbyBpdCB3aWxsIGJlIHNraXBwZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbFJlcXVlc3RzQ2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5jb21tZW50KSBjb21tZW50cy5wdXNoKFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uLmNvbW1lbnRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuY2xvc2VkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE5vdCBhbGwgcmVxdWVzdHMgdG8gXCIke3RhcmdldH1cIiB3ZXJlIGNsb3NlZCB3aXRoIHRoZSBzYW1lIHJlYXNvbiwgdGhlIGhhbmRsaW5nIG9mIFwiJHtyZXF1ZXN0ZWRUaXRsZX1cIiBpcyBiZWluZyBpZ25vcmVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWN0aW9uRGF0YSA9IHsgcGFnZVRleHQ6IG5ld1BhZ2VUZXh0LCAuLi5PYmplY3QudmFsdWVzKHJlcXVlc3RzKVswXS5vcmlnaW5hbFRleHQgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzLmxlbmd0aCA+IDApIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwgeyBhcHBlbmQ6IHRoaXMubWFwQ29tbWVudHMoY29tbWVudHMsIGFtb3VudE9mUGFnZXMgPT09IDEsIGNvbW1lbnRzLmxlbmd0aCA9PT0gYW1vdW50T2ZQYWdlcykgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsb3NpbmdJZDogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkUGFnZXMubGVuZ3RoID4gMCAmJiBkZW5pZWRQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdwJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2NlcHRlZFBhZ2VzTWVzc2FnZSA9IGAqIHt7c3Vic3Q6QWZDIHJlZGlyZWN0fX0gKCR7YWNjZXB0ZWRQYWdlcy5tYXAoKHBhZ2UpID0+IGBbWyR7cGFnZX1dXWApLmpvaW4oJywgJyl9KSB+fn5+YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVuaWVkUGFnZXNNZXNzYWdlID0gdGhpcy5tYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBhY2NlcHRlZFBhZ2VzKSB0aGlzLmhhbmRsZUFjY2VwdGVkUmVkaXJlY3QocGFnZSwgcmVxdWVzdHNbcGFnZV0sIHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7IGFwcGVuZDogYCR7YWNjZXB0ZWRQYWdlc01lc3NhZ2V9XFxuJHtkZW5pZWRQYWdlc01lc3NhZ2V9YCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjY2VwdGVkUGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nSWQgPSAnYSc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIGFjY2VwdGVkUGFnZXMpIHRoaXMuaGFuZGxlQWNjZXB0ZWRSZWRpcmVjdChwYWdlLCByZXF1ZXN0c1twYWdlXSwgdGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHsgYXBwZW5kOiBgKiB7e3N1YnN0OkFmQyByZWRpcmVjdCR7YWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAxID8gJ3xhbGwnIDogJyd9fX0gfn5+fmAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0lkID0gJ2QnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwgeyBhcHBlbmQ6IHRoaXMubWFwRGVuaWVkUmVhc29ucyhkZW5pZWRQYWdlcywgYW1vdW50T2ZQYWdlcyA9PT0gMSwgdHJ1ZSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7IHByZXBlbmQ6IGB7e0FmQy1jfCR7Y2xvc2luZ0lkfX19YCwgYXBwZW5kOiAne3tBZkMtY3xifX0nIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZCkgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7IHByZXBlbmQ6IGB7e0FmQy1jfCR7Zmlyc3RDbG9zZVJlYXNvbn19fWAsIGFwcGVuZDogJ3t7QWZDLWN8Yn19JyB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFnZVRleHQgPSBzZWN0aW9uRGF0YS5wYWdlVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJlZm9yZVRleHQgKyB0aGlzLnBhZ2VDb250ZW50ID09PSBuZXdQYWdlVGV4dCkgcmV0dXJuIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCAocGFnZSBjb250ZW50IGlkZW50aWNhbCkhJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkQ291bnRzID0gT2JqZWN0LmVudHJpZXMoY291bnRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoWywgY291bnRdKSA9PiBjb3VudCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChbYWN0aW9uLCBjb3VudF0pID0+IGAke2FjdGlvbn0gJHtjb3VudH1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogKCkgPT4gKHsgdGV4dDogbmV3UGFnZVRleHQsIHN1bW1hcnk6IGBIYW5kbGluZyBBZkMgcmVkaXJlY3QgcmVxdWVzdHMgKCR7bWFwcGVkQ291bnRzfSkke3RoaXMuc2NyaXB0TWVzc2FnZX1gIH0pLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VBbGxFZGl0c0NyZWF0aW9ucyhzaG93QWN0aW9uc0RpYWxvZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ0FsbCBjaGFuZ2VzIG1hZGUsIGNsaWNrIGJlbG93IHRvIHJlbG9hZCEnLCAnc3VjY2VzcycpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLnNob3dSZWxvYWQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Ugc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ05vIHJlcXVlc3RzIGhhdmUgYmVlbiBoYW5kbGVkIScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbnlSZXF1ZXN0SGFuZGxlZCA9ICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKS5zb21lKChhY3Rpb25EYXRhKSA9PiBhY3Rpb25EYXRhLmFjdGlvbiAhPT0gJ25vbmUnKTtcblxuICAgICAgICAgICAgICAgIGlmIChhbnlSZXF1ZXN0SGFuZGxlZCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbkRhdGEgb2YgdGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlY3Rpb25EYXRhID0geyBwYWdlVGV4dDogbmV3UGFnZVRleHQsIC4uLmFjdGlvbkRhdGEub3JpZ2luYWxUZXh0IH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uRGF0YS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwgeyBwcmVwZW5kOiAne3tBZkMtY3xhfX0nLCBhcHBlbmQ6ICcqIHt7c3Vic3Q6QWZDIGNhdGVnb3J5fX0gfn5+flxcbnt7QWZDLWN8Yn19JyB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFjY2VwdGVkQ2F0ZWdvcnkoYWN0aW9uRGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmFjY2VwdGVkKys7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbnknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogJ3t7QWZDLWN8ZH19JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogYCogJHt0aGlzLmZvcm1hdERlbmllZFJlYXNvbihhY3Rpb25EYXRhLmRlbnlSZWFzb24hKX0gfn5+flxcbnt7QWZDLWN8Yn19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmRlbmllZCsrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uRGF0YS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHsgYXBwZW5kOiBgKiB7e0FmQyBjb21tZW50fDE9JHthY3Rpb25EYXRhLmNvbW1lbnR9fX0gfn5+fmAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1snY29tbWVudGVkIG9uJ10rKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlIHJlcXVlc3QgdG8gY3JlYXRlIFwiJHthY3Rpb25EYXRhLmNhdGVnb3J5fVwiIHdhcyBtYXJrZWQgdG8gYmUgY29tbWVudGVkIG9uLCBidXQgbm8gY29tbWVudCB3YXMgcHJvdmlkZWQgc28gaXQgd2lsbCBiZSBza2lwcGVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogYHt7QWZDLWN8JHthY3Rpb25EYXRhLmNsb3NpbmdSZWFzb24hLmlkfX19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogKGFjdGlvbkRhdGEuY29tbWVudCA/IGAqIHt7QWZDIGNvbW1lbnR8MT0ke2FjdGlvbkRhdGEuY29tbWVudH19fSB+fn5+YCA6ICcnKSArICdcXG57e0FmQy1jfGJ9JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmNsb3NlZCsrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFnZVRleHQgPSBzZWN0aW9uRGF0YS5wYWdlVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJlZm9yZVRleHQgKyB0aGlzLnBhZ2VDb250ZW50ID09PSBuZXdQYWdlVGV4dCkgcmV0dXJuIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCAocGFnZSBjb250ZW50IGlkZW50aWNhbCkhJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkQ291bnRzID0gT2JqZWN0LmVudHJpZXMoY291bnRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoWywgY291bnRdKSA9PiBjb3VudCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChbYWN0aW9uLCBjb3VudF0pID0+IGAke2FjdGlvbn0gJHtjb3VudH1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogKCkgPT4gKHsgdGV4dDogbmV3UGFnZVRleHQsIHN1bW1hcnk6IGBIYW5kbGluZyBBZkMgY2F0ZWdvcnkgcmVxdWVzdHMgKCR7bWFwcGVkQ291bnRzfSkke3RoaXMuc2NyaXB0TWVzc2FnZX1gIH0pLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VBbGxFZGl0c0NyZWF0aW9ucyhzaG93QWN0aW9uc0RpYWxvZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ0FsbCBjaGFuZ2VzIG1hZGUsIGNsaWNrIGJlbG93IHRvIHJlbG9hZCEnLCAnc3VjY2VzcycpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLnNob3dSZWxvYWQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Ugc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ05vIHJlcXVlc3RzIGhhdmUgYmVlbiBoYW5kbGVkIScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvcm1hdHMgYSByZXF1ZXN0IGRlbmlhbCByZWFzb24gdG8gYSB7e3N1YnN0OkFmQyByZWRpcmVjdH19IGNhbGwuXG4gICAgICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiB0byBmb3JtYXQuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGZvcm1hdERlbmllZFJlYXNvbihyZWFzb246IHN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVQYXJhbWV0ZXJzID0gcmVhc29uLnN0YXJ0c1dpdGgoJ2F1dG9maWxsOicpID8gcmVhc29uLm1hdGNoKC9hdXRvZmlsbDooXFx3KykvKSFbMV0gOiBgZGVjbGluZXwyPSR7cmVhc29ufWA7XG5cbiAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZWFzb25pbmcgPSByZWFzb24uaW5jbHVkZXMoJywnKSA/ICcgJyArIHJlYXNvbi5zbGljZShyZWFzb24uaW5kZXhPZignLCcpICsgMSkudHJpbSgpIDogJyc7XG5cbiAgICAgICAgICAgIHJldHVybiBge3tzdWJzdDpBZkMgJHt0aGlzLnJlcXVlc3RQYWdlVHlwZX18JHt0ZW1wbGF0ZVBhcmFtZXRlcnN9fX0ke2FkZGl0aW9uYWxSZWFzb25pbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXBzIGEgZ3JvdXAgb2YgZGVuaWVkIHJlYXNvbnMuXG4gICAgICAgICAqIEBwYXJhbSBkZW5pZWRQYWdlcyBUaGUgcGFnZXMgdG8gbWFwLlxuICAgICAgICAgKiBAcGFyYW0gc2luZ3VsYXJSZXF1ZXN0IFdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgdGhlIG9ubHkgcmVxdWVzdC5cbiAgICAgICAgICogQHBhcmFtIGFsbFJlcXVlc3RzIFdoZXRoZXIgYWxsIHJlcXVlc3RzIGFyZSBiZWluZyBtYXBwZWQuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIG1hcERlbmllZFJlYXNvbnMoZGVuaWVkUGFnZXM6IHN0cmluZ1tdW10sIHNpbmd1bGFyUmVxdWVzdDogYm9vbGVhbiwgYWxsUmVxdWVzdHM6IGJvb2xlYW4pIHtcbiAgICAgICAgICAgIGlmIChzaW5ndWxhclJlcXVlc3QpIHJldHVybiBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKGRlbmllZFBhZ2VzWzBdWzFdKX0gfn5+fmA7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlYXNvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtwYWdlLCByZWFzb25dIG9mIGRlbmllZFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWFzb25zW3JlYXNvbl0pIHJlYXNvbnNbcmVhc29uXSA9IFtdO1xuICAgICAgICAgICAgICAgIHJlYXNvbnNbcmVhc29uXS5wdXNoKHBhZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZWFzb25zQXJyYXkgPSBPYmplY3QuZW50cmllcyhyZWFzb25zKTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlYXNvbnNBcnJheVxuICAgICAgICAgICAgICAgIC5tYXAoKFtyZWFzb24sIHBhZ2VzXSkgPT4gYCogJHt0aGlzLmZvcm1hdERlbmllZFJlYXNvbihyZWFzb24pfSR7cmVhc29uc0FycmF5Lmxlbmd0aCA+IDEgfHwgIWFsbFJlcXVlc3RzID8gYCAoJHtwYWdlcy5tYXAoKHBhZ2UpID0+IGBbWyR7cGFnZX1dXWApLmpvaW4oJywgJyl9KWAgOiAnJ30gfn5+fmApXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1hcHMgYSBncm91cCBvZiBjb21tZW50cy5cbiAgICAgICAgICogQHBhcmFtIGNvbW1lbnRzIFRoZSBjb21tZW50cyB0byBtYXAuXG4gICAgICAgICAqIEBwYXJhbSBzaW5ndWxhclJlcXVlc3QgV2hldGhlciB0aGUgcmVxdWVzdCBpcyB0aGUgb25seSByZXF1ZXN0LlxuICAgICAgICAgKiBAcGFyYW0gYWxsUmVxdWVzdHMgV2hldGhlciBhbGwgcmVxdWVzdHMgYXJlIGJlaW5nIG1hcHBlZC5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgbWFwQ29tbWVudHMoY29tbWVudHM6IHN0cmluZ1tdW10sIHNpbmd1bGFyUmVxdWVzdDogYm9vbGVhbiwgYWxsUmVxdWVzdHM6IGJvb2xlYW4pIHtcbiAgICAgICAgICAgIGlmIChzaW5ndWxhclJlcXVlc3QpIHJldHVybiBgKiB7e0FmQyBjb21tZW50fDE9JHtjb21tZW50c1swXVsxXX19fSB+fn5+YDtcblxuICAgICAgICAgICAgY29uc3QgY29tbWVudE1lc3NhZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFnZSwgY29tbWVudF0gb2YgY29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbW1lbnRNZXNzYWdlc1tjb21tZW50XSkgY29tbWVudE1lc3NhZ2VzW2NvbW1lbnRdID0gW107XG4gICAgICAgICAgICAgICAgY29tbWVudE1lc3NhZ2VzW2NvbW1lbnRdLnB1c2gocGFnZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRzQXJyYXkgPSBPYmplY3QuZW50cmllcyhjb21tZW50TWVzc2FnZXMpO1xuXG4gICAgICAgICAgICByZXR1cm4gY29tbWVudHNBcnJheVxuICAgICAgICAgICAgICAgIC5tYXAoKFtjb21tZW50LCBwYWdlc10pID0+IGAqIHt7QWZDIGNvbW1lbnR8MT0ke2NvbW1lbnR9fX0ke2NvbW1lbnRzQXJyYXkubGVuZ3RoID4gMSB8fCAhYWxsUmVxdWVzdHMgPyBgICgke3BhZ2VzLm1hcCgocGFnZSkgPT4gYFtbJHtwYWdlfV1dYCkuam9pbignLCAnKX0pYCA6ICcnfSB+fn5+YClcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTW9kaWZpZXMgYSBnaXZlbiBzZWN0aW9uIHRleHQgd2l0aCBwcmVwZW5kZWQgYW5kIGFwcGVuZGVkIHRleHQuXG4gICAgICAgICAqIEBwYXJhbSBzZWN0aW9uRGF0YSBUaGUgc2VjdGlvbiBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gY2hhbmdlcyBUaGUgcHJlcGVuZGluZyBhbmQgYXBwZW5kaW5nIHRleHQuXG4gICAgICAgICAqIEBwYXJhbSBjaGFuZ2VzLnByZXBlbmQgVGhlIHRleHQgdG8gcHJlcGVuZCB0byB0aGUgc2VjdGlvbiB0ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gY2hhbmdlcy5hcHBlbmQgVGhlIHRleHQgdG8gYXBwZW5kIHRvIHRoZSBzZWN0aW9uIHRleHQuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIG1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhOiB7IHBhZ2VUZXh0OiBzdHJpbmcgfSAmIEFjdGlvblsnb3JpZ2luYWxUZXh0J10sIHsgcHJlcGVuZCwgYXBwZW5kIH06IHsgcHJlcGVuZD86IHN0cmluZzsgYXBwZW5kPzogc3RyaW5nIH0pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZnVsbFNlY3Rpb25UZXh0OiBvbGRGdWxsU2VjdGlvblRleHQsIHNlY3Rpb25UZXh0OiBvbGRTZWN0aW9uVGV4dCB9ID0gc2VjdGlvbkRhdGE7XG5cbiAgICAgICAgICAgIGlmIChwcmVwZW5kKSBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dCA9IHByZXBlbmQgKyAnXFxuJyArIHNlY3Rpb25EYXRhLnNlY3Rpb25UZXh0O1xuICAgICAgICAgICAgaWYgKGFwcGVuZCkgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQgKz0gJ1xcbicgKyBhcHBlbmQ7XG5cbiAgICAgICAgICAgIHNlY3Rpb25EYXRhLmZ1bGxTZWN0aW9uVGV4dCA9IHNlY3Rpb25EYXRhLmZ1bGxTZWN0aW9uVGV4dC5yZXBsYWNlKG9sZFNlY3Rpb25UZXh0LCBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dCk7XG5cbiAgICAgICAgICAgIHNlY3Rpb25EYXRhLnBhZ2VUZXh0ID0gc2VjdGlvbkRhdGEucGFnZVRleHQucmVwbGFjZShvbGRGdWxsU2VjdGlvblRleHQsIHNlY3Rpb25EYXRhLmZ1bGxTZWN0aW9uVGV4dCk7XG5cbiAgICAgICAgICAgIHJldHVybiBzZWN0aW9uRGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBwYWdlcyByZWxhdGVkIHRvIGFuIGFjY2VwdGVkIHJlZGlyZWN0IHJlcXVlc3QuXG4gICAgICAgICAqIEBwYXJhbSBwYWdlIFRoZSByZXF1ZXN0ZWQgcGFnZS5cbiAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2YgdGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBoYW5kbGVBY2NlcHRlZFJlZGlyZWN0KHBhZ2U6IHN0cmluZywgZGF0YTogUmVkaXJlY3RBY3Rpb24sIHRhcmdldDogc3RyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdzV2l0aEFyZ3VtZW50cyA9XG4gICAgICAgICAgICAgICAgZGF0YS5yZWRpcmVjdFRlbXBsYXRlcyAmJiBkYXRhLnJlZGlyZWN0VGVtcGxhdGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyBkYXRhLnJlZGlyZWN0VGVtcGxhdGVzLm1hcCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQXJndW1lbnRFZGl0b3IgPSBkYXRhLnJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzPy5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRBcmd1bWVudEVkaXRvcikgcmV0dXJuIGB7eyR7dGFnfX19YDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRBcmd1bWVudHMgPSBmb3VuZEFyZ3VtZW50RWRpdG9yLnBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhcmFtZXRlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYHwke3BhcmFtZXRlci5uYW1lID09PSAoaW5kZXggKyAxKS50b1N0cmluZygpID8gJycgOiBgJHtwYXJhbWV0ZXIubmFtZX09YH0ke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBge3ske3RhZ30ke21hcHBlZEFyZ3VtZW50c319fWA7XG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHBhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGAjUkVESVJFQ1QgW1ske3RhcmdldH1dXSR7dGFnc1dpdGhBcmd1bWVudHMgPyBgXFxuXFxue3tSZWRpcmVjdCBjYXRlZ29yeSBzaGVsbHxcXG4ke3RhZ3NXaXRoQXJndW1lbnRzLmpvaW4oJ1xcbicpfVxcbn19YCA6ICcnfWAsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBDcmVhdGluZyByZWRpcmVjdCB0byBbWyR7dGFyZ2V0fV1dIGFzIHJlcXVlc3RlZCBhdCBbW1dQOkFGQy9SXV0ke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBtdy5UaXRsZS5uZXdGcm9tVGV4dChwYWdlKSEuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGB7e1dpa2lQcm9qZWN0IGJhbm5lciBzaGVsbHxcXG57e1dpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnx0cz17e3N1YnN0OkxPQ0FMVElNRVNUQU1QfX18cmV2aWV3ZXI9JHttdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJyl9fX1cXG59fWAsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZGRpbmcgW1tXaWtpcGVkaWE6V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufFdpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbl1dIGJhbm5lciR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogSGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgcGFnZXMgcmVsYXRlZCB0byBhbiBhY2NlcHRlZCBjYXRlZ29yeSByZXF1ZXN0LlxuICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIGNhdGVnb3J5LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBoYW5kbGVBY2NlcHRlZENhdGVnb3J5KGRhdGE6IENhdGVnb3J5QWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgQ2F0ZWdvcnk6JHtkYXRhLmNhdGVnb3J5fWAsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGRhdGEucGFyZW50cy5tYXAoKHBhcmVudCkgPT4gYFtbQ2F0ZWdvcnk6JHtwYXJlbnR9XV1gKS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYENyZWF0aW5nIGNhdGVnb3J5IGFzIHJlcXVlc3RlZCBhdCBbW1dQOkFGQy9DXV0ke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgQ2F0ZWdvcnkgdGFsazoke2RhdGEuY2F0ZWdvcnl9YCxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogYHt7V2lraVByb2plY3QgYmFubmVyIHNoZWxsfFxcbnt7V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufHRzPXt7c3Vic3Q6TE9DQUxUSU1FU1RBTVB9fXxyZXZpZXdlcj0ke213LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKX19fVxcbn19YCxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEFkZGluZyBbW1dpa2lwZWRpYTpXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb258V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9uXV0gYmFubmVyJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLmRhdGEuZXhhbXBsZXMubWFwKChleGFtcGxlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZWRpdCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBleGFtcGxlLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICh7IGNvbnRlbnQgfTogeyBjb250ZW50OiBzdHJpbmcgfSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGAke2NvbnRlbnR9XFxuW1tDYXRlZ29yeToke2RhdGEuY2F0ZWdvcnl9XV1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEFkZGluZyBwYWdlIHRvIFtbOkNhdGVnb3J5OiR7ZGF0YS5jYXRlZ29yeX1dXSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvQ11dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYWtlcyBhbGwgZWRpdHMgYW5kIGNyZWF0aW9ucyB0aGF0IG5lZWQgdG8gYmUgbWFkZS5cbiAgICAgICAgICogQHBhcmFtIHNob3dBY3Rpb25zRGlhbG9nIFRoZSBkaWFsb2cgdG8gbG9nIHRoZSByZXN1bHRzIHRvLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBtYWtlQWxsRWRpdHNDcmVhdGlvbnMoc2hvd0FjdGlvbnNEaWFsb2c6IFNob3dBY3Rpb25zRGlhbG9nKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXBpRnVuY3Rpb24gPSBhY3Rpb24udHlwZSA9PT0gJ2VkaXQnID8gdGhpcy5hcGkuZWRpdChhY3Rpb24udGl0bGUsIGFjdGlvbi50cmFuc2Zvcm0pIDogdGhpcy5hcGkuY3JlYXRlKGFjdGlvbi50aXRsZSwgeyBzdW1tYXJ5OiBhY3Rpb24uc3VtbWFyeSB9LCBhY3Rpb24udGV4dCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoYWN0aW9uLnRpdGxlLCAnaXNSZWRpcmVjdCcgaW4gYWN0aW9uICYmIGFjdGlvbi5pc1JlZGlyZWN0ID8geyByZWRpcmVjdDogJ25vJyB9IDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50ZXh0Q29udGVudCA9IGFjdGlvbi50aXRsZTtcblxuICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KGAke2FjdGlvbi50eXBlID09PSAnZWRpdCcgPyAnRWRpdGluZycgOiAnQ3JlYXRpbmcnfSAke2xpbmtFbGVtZW50Lm91dGVySFRNTH0uLi5gKTtcblxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpRnVuY3Rpb24uY2F0Y2goYXN5bmMgKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb2RlID09PSAncmF0ZWxpbWl0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShgUmF0ZSBsaW1pdGVkLiBXYWl0aW5nIGZvciA3MCBzZWNvbmRzLi4uIChyZXN1bWluZyBhdCAke25ldyBEYXRlKERhdGUubm93KCkgKyA3MF8wMDApLnRvTG9jYWxlVGltZVN0cmluZygpfSlgLCAnd2FybmluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNzBfMDAwKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdDb250aW51aW5nLi4uJywgJ3N1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpRnVuY3Rpb24uY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgJHthY3Rpb24udHlwZSA9PT0gJ2VkaXQnID8gJ2VkaXRpbmcnIDogJ2NyZWF0aW5nJ30gJHtsaW5rRWxlbWVudC5vdXRlckhUTUx9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciAke2FjdGlvbi50eXBlID09PSAnZWRpdCcgPyAnZWRpdGluZycgOiAnY3JlYXRpbmcnfSAke2xpbmtFbGVtZW50Lm91dGVySFRNTH06ICR7ZXJyb3JJbmZvPy5lcnJvci5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSkuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oQWZjcmNIZWxwZXJEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG59KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7OzthQUlBLEdBQUcsT0FBTyxNQUFNLENBQUMsaUJBQWtCLGVBQWdCLGtCQUFtQixpQkFBaUIsRUFBRyxJQUFNLENBQzVGLE1BQU1BLEVBQXdCLEdBQUcsT0FBTyxJQUFJLFlBQVksSUFBTSw0Q0FDeERDLEVBQXdCLEdBQUcsT0FBTyxJQUFJLFlBQVksSUFBTSw2Q0FFOUQsR0FBSSxDQUFDRCxHQUF5QixDQUFDQyxFQUF1QixPQUV0RCxNQUFNQyxFQUFrQkYsRUFBd0IsV0FBYSxXQUVoRCxHQUFHLEtBQUssZUFBZSxHQUFHLE9BQU8sSUFBSSxNQUFNLElBQU0sVUFBWSxPQUFTLGFBQWMsSUFBSyxVQUFVRSxDQUFlLHFCQUFzQixjQUFjLEVBRTlKLGlCQUFpQixRQUFVQyxHQUFVLENBQ3RDQSxFQUFNLGVBQWUsRUFFckIsTUFBTUMsRUFB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QU8sT0FBT3hKLEVBQWtCLFVBQVcsR0FBRyxHQUFHLGNBQWMsU0FBUyxDQUM1RSxDQUFDIiwKICAibmFtZXMiOiBbImlzUmVkaXJlY3RSZXF1ZXN0UGFnZSIsICJpc0NhdGVnb3J5UmVxdWVzdFBhZ2UiLCAicmVxdWVzdFBhZ2VUeXBlIiwgImV2ZW50IiwgIndpbmRvd01hbmFnZXIiLCAiYWZjcmNIZWxwZXJEaWFsb2ciLCAiQWZjcmNIZWxwZXJEaWFsb2ciLCAiU2hvd0FjdGlvbnNEaWFsb2ciLCAibWVzc2FnZSIsICJ0eXBlIiwgIm1lc3NhZ2VXaWRnZXQiLCAicmVsb2FkQnV0dG9uIiwgIlBhZ2VJbnB1dFdpZGdldCIsICJjb25maWciLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAicGFyc2VkVGl0bGUiLCAicmVzdWx0IiwgInBhZ2VzIiwgInBhZ2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgImNhdGVnb3J5IiwgInRpdGxlV2l0aG91dE5hbWVzcGFjZSIsICJwYWdlVGl0bGUiLCAiYWN0aW9uIiwgInJlZGlyZWN0VGVtcGxhdGVSZXNwb25zZSIsICJwYWdlUmV2aXNpb24iLCAic2VjdGlvbnMiLCAibWF0Y2giLCAic2VjdGlvblRleHQiLCAic2VjdGlvbkhlYWRlciIsICJwYXJzZWREYXRhIiwgInJlcXVlc3RlZFBhZ2VzIiwgInBhcnNlZFRhcmdldCIsICJyZXF1ZXN0ZXIiLCAibmFtZSIsICJmb3VuZENhdGVnb3J5IiwgImZpcnN0VXNlckluZGV4IiwgImZpcnN0VXNlclRhbGtJbmRleCIsICJmaXJzdElwSW5kZXgiLCAiZmlyc3RJbmRleCIsICJpbmRleCIsICJoYW5kbGUiLCAiZW5kSW5kZXgiLCAic3ViSW5kZXgiLCAibWVzc2FnZVdpZGdldExheW91dCIsICJyZXF1ZXN0IiwgImRldGFpbHNFbGVtZW50IiwgInN1bW1hcnlFbGVtZW50IiwgInRhcmdldEVkaXRvckVsZW1lbnQiLCAibGlua0VsZW1lbnQiLCAicmVxdWVzdEluZm9FbGVtZW50IiwgIm5vbmVFbGVtZW50IiwgInVua25vd25FbGVtZW50IiwgInJlYXNvbkRpdiIsICJyZWFzb25MYWJlbCIsICJzb3VyY2VEaXYiLCAic291cmNlTGFiZWwiLCAicmVxdWVzdGVyRGl2IiwgInJlcXVlc3RlckxhYmVsIiwgInJlcXVlc3RlckxpbmsiLCAicmVxdWVzdFJlc3BvbmRlckVsZW1lbnQiLCAicmVxdWVzdGVkVGl0bGUiLCAicmVxdWVzdGVkVGl0bGVEaXYiLCAidGFnU2VsZWN0TGF5b3V0IiwgInRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciIsICJ0ZW1wbGF0ZUVkaXRvcnNJbmZvIiwgImFjdGlvblJhZGlvSW5wdXQiLCAib3B0aW9uIiwgInRhZ1NlbGVjdCIsICJ0YWciLCAicmVkaXJlY3QiLCAic29ydGVkVGFncyIsICJhIiwgImIiLCAiZWRpdG9ySW5mbyIsICJzaG93blRlbXBsYXRlRWRpdG9ycyIsICJub1RlbXBsYXRlc01lc3NhZ2UiLCAiY29tbWVudElucHV0TGF5b3V0IiwgInRlbXBsYXRlTmFtZSIsICJ0ZW1wbGF0ZURhdGEiLCAicGFyYW1ldGVycyIsICJkZXRhaWxzIiwgInN1bW1hcnkiLCAiZWxlbWVudERhdGEiLCAicGFyYW1ldGVyTmFtZSIsICJwYXJhbWV0ZXJEYXRhIiwgImlucHV0IiwgImlucHV0TGF5b3V0IiwgImNvbW1lbnQiLCAiY29tbWVudElucHV0IiwgImRlbnlSZWFzb25MYXlvdXQiLCAiY2xvc2luZ1JlYXNvbkxheW91dCIsICJkZW55UmVhc29uIiwgImNsb3NpbmdSZWFzb24iLCAidGl0bGUiLCAiaWQiLCAic2VsZWN0ZWQiLCAiZXhhbXBsZXNEaXYiLCAiZXhhbXBsZXNMYWJlbCIsICJleGFtcGxlIiwgInBhcmVudHNEaXYiLCAicGFyZW50c0xhYmVsIiwgInBhcmVudCIsICJwYWdlU2VsZWN0TGF5b3V0IiwgImNhdGVnb3J5U2VsZWN0TGF5b3V0IiwgInBhZ2VTZWxlY3RJbnB1dCIsICJwYWdlU2VsZWN0IiwgImV4YW1wbGVzIiwgImNhdGVnb3J5U2VsZWN0SW5wdXQiLCAiY2F0ZWdvcnlTZWxlY3QiLCAicGFyZW50cyIsICJhY3Rpb25zVG9UYWtlIiwgImFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQiLCAiZmlyc3RDbG9zZVJlYXNvbiIsICJhbGxSZXF1ZXN0c0Nsb3NlZCIsICJiYWNrZ3JvdW5kQ29sb3IiLCAiYWNjZXB0ZWRDb3VudCIsICJkZW5pZWRDb3VudCIsICJzaG93QWN0aW9uc0RpYWxvZyIsICJjb3VudHMiLCAibmV3UGFnZVRleHQiLCAiYWN0aW9uRGF0YSIsICJ0YXJnZXQiLCAicmVxdWVzdHMiLCAic29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCIsICJhY2NlcHRlZFBhZ2VzIiwgImRlbmllZFBhZ2VzIiwgImNvbW1lbnRzIiwgImFtb3VudE9mUGFnZXMiLCAic2VjdGlvbkRhdGEiLCAiY2xvc2luZ0lkIiwgImFjY2VwdGVkUGFnZXNNZXNzYWdlIiwgImRlbmllZFBhZ2VzTWVzc2FnZSIsICJtYXBwZWRDb3VudHMiLCAiY291bnQiLCAicmVhc29uIiwgInRlbXBsYXRlUGFyYW1ldGVycyIsICJhZGRpdGlvbmFsUmVhc29uaW5nIiwgInNpbmd1bGFyUmVxdWVzdCIsICJhbGxSZXF1ZXN0cyIsICJyZWFzb25zIiwgInJlYXNvbnNBcnJheSIsICJjb21tZW50TWVzc2FnZXMiLCAiY29tbWVudHNBcnJheSIsICJwcmVwZW5kIiwgImFwcGVuZCIsICJvbGRGdWxsU2VjdGlvblRleHQiLCAib2xkU2VjdGlvblRleHQiLCAidGFnc1dpdGhBcmd1bWVudHMiLCAiZm91bmRBcmd1bWVudEVkaXRvciIsICJtYXBwZWRBcmd1bWVudHMiLCAicGFyYW1ldGVyIiwgImNvbnRlbnQiLCAiYXBpRnVuY3Rpb24iLCAiZXJyb3JDb2RlIiwgImVycm9ySW5mbyIsICJyZXNvbHZlIl0KfQo=