User:Eejit43/scripts/afcrc-helper.js
Appearance
< User:Eejit43 | scripts
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
![]() | This user script seems to have a documentation page at User:Eejit43/scripts/afcrc-helper. |
// <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/afcrc-helper.ts
"use strict";(()=>{var N=class y extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){Object.assign(y.prototype,OO.ui.mixin.LookupElement.prototype),super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{let t=this.getValue(),e=$.Deferred();t||e.resolve([]);let a=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:a?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(o=>{if(o?.query?.pages){let i=o.query.pages.filter(c=>!c.categories?.some(n=>n.title==="Category:Wikipedia soft redirected categories")).map(c=>{let n=c.title.split(":")[1];return{data:n,label:n}});this.emit("showing-values",i),e.resolve(i)}else e.resolve([])}),e.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:e,label:a})=>new OO.ui.MenuOptionWidget({data:e,label:a}))};var V=class y extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){Object.assign(y.prototype,OO.ui.mixin.LookupElement.prototype),super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{let t=this.getValue(),e=$.Deferred();t||e.resolve([]);let a=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:a?.getNamespaceId()??0,gapprefix:a?.getMainText()??t,generator:"allpages"}).catch(()=>null).then(o=>{if(o?.query?.pages){let i=o.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:a})=>new OO.ui.MenuOptionWidget({data:e,label:a}))};var U=class y extends OO.ui.Dialog{contentLayout;logOutput;closeButton;constructor(){Object.assign(y.prototype,OO.ui.Dialog.prototype),super({size:"large"}),y.static.name="ShowActionsDialog",y.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"){let a=new OO.ui.MessageWidget({type:e,inline:!0,label:new OO.ui.HtmlSnippet(t)});this.logOutput.append(a.$element[0]),this.updateSize(),this.closeButton.scrollElementIntoView()}showReload(){this.closeButton.$element.remove();let t=new OO.ui.ButtonWidget({label:"Reload",flags:["primary"]});t.on("click",()=>window.location.reload()),this.contentLayout.$element.append(t.$element)}};var F=class y extends OO.ui.ProcessDialog{api=new mw.Api;scriptMessage=" ([[User:Eejit43/scripts/afcrc-helper|afcrc-helper]])";requestPageType;pageTitle;createdPageWatchMethod;redirectTemplates;beforeText;pageContent;parsedRequests=[];actionsToTake=[];editsCreationsToMake=[];constructor(t,e,a){Object.assign(y.prototype,OO.ui.ProcessDialog.prototype),super({size:"large"}),y.static.name="AfcrcHelperDialog",y.static.title="afcrc-helper",y.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"save",label:"Run",flags:["primary","progressive"]}],this.pageTitle=e,this.requestPageType=t,this.createdPageWatchMethod=a&&["nochange","preferences","unwatch","watch"].includes(a)?a:"preferences",mw.util.addCSS(`
.afcrc-helper-request {
margin: 10px;
border-radius: 5px;
background-color: #eee;
padding: 5px;
color: #202122;
}
.afcrc-helper-request summary {
cursor: pointer;
}
.afcrc-helper-target-editor {
min-width: 1ch;
max-width: calc(100% - 4ch);
font-family: monospace;
}
.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 {
margin-block: 10px;
border: 1px solid #a2a9b1;
border-radius: 2px;
background-color: white;
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 {
margin-block: 5px;
background-color: #e2e2e2;
}
#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()}):y.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>y.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});async load(){let 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||"{}");let 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=/^(.*?)==/s.exec(this.pageContent)[1],this.pageContent=this.pageContent.replace(/^.*?==/s,"==");let t=[...this.pageContent.matchAll(/^==.*?==$(\s*(?!==[^=]).*)*/gim)].map(e=>e[0]);for(let e of t){if(/{{afc-c\|/i.test(e))continue;let o=/^==(.*?)==$/m.exec(e)[1].trim();if(this.requestPageType==="redirect"){let i={},c=[...o.matchAll(/\[\[(.*?)]]/g)].map(d=>d[1]?.trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean);if(c.length===0)continue;i.pages=c;let n=/Target of redirect: ?\[\[(.*?)]]/.exec(e)?.[1].trim().replace(/^:/,"").replaceAll("_"," ");if(!n)continue;i.target=n,i.reason=/reason: ?(.*?)\*source(?: \(if applicable\))?:/is.exec(e)?.[1].trim()??"",i.source=/source(?: \(if applicable\))?: ?(.*?)(?:<references \/>|\n\n)/is.exec(e)?.[1].trim()??"";let r=e.match(e.includes("<references />")?/<references \/>\n+(.*)/:new RegExp(`(?:<references \\/>${i.source?`|${i.source.replaceAll(/[\s#$()*+,.?[\\\]^{|}-]/g,"\\$&")}`:""})
+(.*)`))?.[1].trim(),h=r?/(?:Special:Contributions\/|User(?: talk)?:)(.*?)\|/.exec(r)?.[1].trim():null;i.requester=r&&h?{type:/\[\[User( talk)?:/.test(r)?"user":"ip",name:h}:null,this.parsedRequests.push(i),this.actionsToTake.push({target:i.target,requests:Object.fromEntries(c.map(d=>[d,{originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"}]))})}else{let i={},c=/:?Category:(.*?)(]]|$)/.exec(o)?.[1].trim();if(!c)continue;i.category=c.replaceAll("_"," "),i.examples=[...(/example pages which belong to this category:(.*?)(parent category\/categories:|\n\[\[(special:contributions\/|user:))/is.exec(e)?.[1]??"").matchAll(/\*\s*(?:\[\[)?(.*?)(\||]]|\s*?\n)/g)].map(f=>f[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean)??[],i.parents=[...(/parent category\/categories:(.*?)(\n\n|\n\[\[(special:contributions\/|user:))/is.exec(e)?.[1]??"").matchAll(/(?<!\|)#?:?Category:(.*?)(\||]]|\s*?\n)/g)].map(f=>f[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean)??[];let n=e.indexOf("[[User:"),r=e.indexOf("[[User talk:"),h=e.indexOf("[[Special:Contributions/"),d=Math.min(...[n,r,h].filter(f=>f!==-1));i.requester=d===Number.POSITIVE_INFINITY?null:d===h?{type:"ip",name:/\[\[Special:Contributions\/(.*?)(\||]])/.exec(e)[1].trim()}:{type:"user",name:/\[\[User(?: talk)?:(.*?)(\||]])/.exec(e)[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,e=()=>{let o=Math.min(t+5,this.parsedRequests.length);this.title.setLabel(`afcrc-helper (loading ${t+1}-${o}/${this.parsedRequests.length} requests)`);for(let i=t;i<o;i++)this.requestPageType==="redirect"?this.loadRedirectRequestElements(i):this.loadCategoryRequestElements(i);o<this.parsedRequests.length?(t=o,setTimeout(e,0)):this.title.setLabel(`afcrc-helper (${this.parsedRequests.length} requests loaded)`)};e()}else{let 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){let e=this.parsedRequests[t],a=document.createElement("details");a.classList.add("afcrc-helper-request"),a.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));let o=document.createElement("summary");o.innerHTML=e.pages.map(l=>`<b>${l}</b>`).join(", ")+" \u2192 ",o.addEventListener("keyup",l=>{document.activeElement?.tagName==="INPUT"&&l.key===" "&&l.preventDefault()});let 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)}),o.append(i);let 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>`,o.append(c),a.append(o);let n=document.createElement("div");n.classList.add("afcrc-helper-request-info");let r=document.createElement("span");r.style.color="dimgray",r.textContent="None";let h=document.createElement("span");h.style.color="dimgray",h.textContent="Unknown";let d=document.createElement("div"),f=document.createElement("b");f.textContent="Reason: ",d.append(f),e.reason?d.append(e.reason):d.append(r.cloneNode(!0)),n.append(d);let T=document.createElement("div"),O=document.createElement("b");O.textContent="Source: ",T.append(O),e.source?T.append(e.source):T.append(r.cloneNode(!0)),n.append(T);let C=document.createElement("div"),b=document.createElement("b");if(b.textContent="Requester: ",C.append(b),e.requester){let 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,C.append(l)}else C.append(h.cloneNode(!0));n.append(C),a.append(n),a.append(document.createElement("hr"));let k=document.createElement("div");k.classList.add("afcrc-helper-request-responder");for(let l of e.pages){let u=document.createElement("div"),g=document.createElement("b");g.textContent=l,u.append(g);let R,m,j=[],P=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(s=>new OO.ui.RadioOptionWidget({data:s,label:s}))});P.selectItemByLabel("None"),P.on("choose",()=>{setTimeout(()=>this.updateSize(),0);let s=P.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[t].requests[l].action=s,!R||!m){let p=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.redirectTemplates).map(([v,{redirect:I}])=>{if(!I)return{data:v,label:v};let E=new OO.ui.HtmlSnippet(`${v} <i>(redirect with possibilities)</i>`);return{data:v,label:E}})});p.getMenu().filterMode="substring",p.on("change",()=>{let v=p.getValue().sort((E,L)=>E.toLowerCase().localeCompare(L.toLowerCase()));p.getValue().join(";")!==v.join(";")&&p.setValue(v),this.actionsToTake[t].requests[l].redirectTemplates=v;for(let E of j)E.details.style.display="none";let I=0;for(let E of p.getValue()){let L=j.find(H=>H.name===E);L&&(L.details.style.display="block",I++)}w.textContent=`Template parameters (${I>0?`for ${I} template${I>1?"s":""}`:"none to show"})`,B.style.display=I>0?"none":"block"}),R=new OO.ui.FieldLayout(p,{classes:["afcrc-helper-tag-select-layout"],align:"inline",label:"Redirect templates:"}),x.$element[0].before(R.$element[0]),m=document.createElement("details"),m.classList.add("afcrc-helper-template-parameters-container");let w=document.createElement("summary");w.textContent="Template parameters (none to show)",m.append(w);for(let[v,I]of Object.entries(this.redirectTemplates)){let E=Object.entries(I.parameters);if(E.length===0)continue;let L=document.createElement("details");L.style.display="none";let H=document.createElement("summary");H.textContent=v,L.append(H);let Q={name:v,details:L,parameters:[]};for(let[z,q]of E){let _=new OO.ui.TextInputWidget({placeholder:q.default?.toString(),required:q.required}),J=new OO.ui.FieldLayout(_,{label:new OO.ui.HtmlSnippet(`${z}${!q.label||z.toLowerCase()===q.label?.toLowerCase()?"":` (${q.label})`}${q.description?` (${q.description})`:""} (type: ${q.type}) ${q.suggested?" (suggested)":""}${q.example?` (example: "${q.example}")`:""}`),align:"inline"});L.append(J.$element[0]),Q.parameters.push({name:z,aliases:q.aliases,editor:_})}m.append(L),j.push(Q)}this.actionsToTake[t].requests[l].redirectTemplateParameters=j;let B=document.createElement("div");B.id="afcrc-helper-no-templates-message",B.textContent="No templates with parameters to display!",m.append(B),x.$element[0].before(m)}if(["accept","comment","close"].includes(s)){x.$element.show();let p=D.getValue().trim();p?this.actionsToTake[t].requests[l].comment=p:delete this.actionsToTake[t].requests[l].comment}else x.$element.hide(),delete this.actionsToTake[t].requests[l].comment;switch(this.updateRequestColor(a,t),R.$element.hide(),m.style.display="none",M.$element.hide(),S.$element.hide(),s){case"accept":{R.$element.show(),m.style.display="block";break}case"deny":{M.$element.show();break}case"close":{S.$element.show();break}}});let A=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(([s,p])=>({data:`autofill:${s}`,label:`Autofilled text for ${p}`}))});A.on("change",()=>{this.actionsToTake[t].requests[l].denyReason=A.getValue()||"autofill:unlikely"}),A.setValue("autofill:unlikely"),A.getMenu().selectItemByData("autofill:unlikely");let M=new OO.ui.FieldLayout(A,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'});M.$element.hide();let W=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([s,p])=>new OO.ui.MenuOptionWidget({data:p,label:s}))}});W.getMenu().on("choose",()=>{let s=W.getMenu().findSelectedItem();this.actionsToTake[t].requests[l].closingReason={name:s.getLabel(),id:s.getData()},this.updateRequestColor(a,t)}),W.getMenu().selectItemByData("r"),this.actionsToTake[t].requests[l].closingReason={name:"No response",id:"r"};let S=new OO.ui.FieldLayout(W,{align:"inline",label:"Closing reason:"});S.$element.hide();let D=new OO.ui.TextInputWidget;D.on("change",()=>{let s=D.getValue().trim();s?this.actionsToTake[t].requests[l].comment=s:delete this.actionsToTake[t].requests[l].comment});let x=new OO.ui.FieldLayout(D,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});x.$element.hide(),u.append(P.$element[0],M.$element[0],S.$element[0],x.$element[0]),k.append(u)}a.append(k),this.$body.append(a),this.updateSize()}loadCategoryRequestElements(t){let e=this.parsedRequests[t],a=document.createElement("details");a.classList.add("afcrc-helper-request"),a.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));let o=document.createElement("summary");o.innerHTML=`<b>Category:${e.category}</b>`,a.append(o);let i=document.createElement("div");i.classList.add("afcrc-helper-request-info");let c=document.createElement("span");c.style.color="dimgray",c.textContent="None";let n=document.createElement("span");n.style.color="dimgray",n.textContent="Unknown";let r=document.createElement("div"),h=document.createElement("b");if(h.textContent="Examples: ",r.append(h),e.examples.length>0)for(let[s,p]of e.examples.entries()){let w=document.createElement("a");w.target="_blank",w.href=mw.util.getUrl(p),w.textContent=p,r.append(w),s!==e.examples.length-1&&r.append(", ")}else r.append(c.cloneNode(!0));i.append(r);let d=document.createElement("div"),f=document.createElement("b");if(f.textContent="Parents: ",d.append(f),e.parents.length>0)for(let[s,p]of e.parents.entries()){let w=document.createElement("a");w.target="_blank",w.href=mw.util.getUrl(`Category:${p}`),w.textContent=p,d.append(w),s!==e.parents.length-1&&d.append(", ")}else d.append(c.cloneNode(!0));i.append(d);let T=document.createElement("div"),O=document.createElement("b");if(O.textContent="Requester: ",T.append(O),e.requester){let s=document.createElement("a");s.target="_blank",s.href=e.requester.type==="user"?mw.util.getUrl(`User:${e.requester.name}`):mw.util.getUrl(`Special:Contributions/${e.requester.name}`),s.textContent=e.requester.name,T.append(s)}else T.append(n.cloneNode(!0));i.append(T),a.append(i),a.append(document.createElement("hr"));let C=document.createElement("div");C.classList.add("afcrc-helper-request-responder");let b=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(s=>new OO.ui.RadioOptionWidget({data:s,label:s}))});b.selectItemByLabel("None"),b.on("choose",()=>{setTimeout(()=>this.updateSize(),0);let s=b.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[t].action=s,["comment","close"].includes(s)){x.$element.show();let p=D.getValue().trim();p?this.actionsToTake[t].comment=p:delete this.actionsToTake[t].comment}else x.$element.hide(),delete this.actionsToTake[t].comment;switch(this.updateRequestColor(a,t),g.$element.hide(),P.$element.hide(),M.$element.hide(),S.$element.hide(),s){case"accept":{g.$element.show(),P.$element.show();break}case"deny":{M.$element.show();break}case"close":{S.$element.show();break}}});let k=new V({placeholder:"Add pages here"});k.on("change",()=>{let s=k.getValue();s=s.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),s=s.replace(/^:/,""),s.length>0&&k.setValue(s[0].toUpperCase()+s.slice(1).replaceAll("_"," "))}),k.on("showing-values",s=>{for(let p of s)l.addAllowedValue(p.data)});let l=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:k});l.on("change",()=>{let s=l.getValue().sort((p,w)=>p.toLowerCase().localeCompare(w.toLowerCase()));l.getValue().join(";")!==s.join(";")&&l.setValue(s),this.actionsToTake[t].examples=s});let{examples:u}=this.actionsToTake[t];for(let s of u)l.addAllowedValue(s);l.setValue(u);let g=new OO.ui.FieldLayout(l,{align:"inline",label:"Pages to categorize:"});g.$element.hide();let R=new N({placeholder:"Add categories here"});R.on("change",()=>{let s=R.getValue();s=s.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),s=s.replace(/^Category:/,""),s.length>0&&R.setValue(s[0].toUpperCase()+s.slice(1).replaceAll("_"," "))}),R.on("showing-values",s=>{for(let p of s)m.addAllowedValue(p.data)});let m=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:R});m.on("change",()=>{let s=m.getValue().sort((p,w)=>p.toLowerCase().localeCompare(w.toLowerCase()));m.getValue().join(";")!==s.join(";")&&m.setValue(s),this.actionsToTake[t].parents=s});let{parents:j}=this.actionsToTake[t];for(let s of j)m.addAllowedValue(s);m.setValue(j);let P=new OO.ui.FieldLayout(m,{align:"inline",label:"Categories:"});P.$element.hide();let A=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(([s,p])=>({data:`autofill:${s}`,label:`Autofilled text for ${p}`}))});A.on("change",()=>{this.actionsToTake[t].denyReason=A.getValue()||"autofill:unlikely"}),A.setValue("autofill:unlikely"),A.getMenu().selectItemByData("autofill:unlikely");let M=new OO.ui.FieldLayout(A,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'});M.$element.hide();let W=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([s,p])=>new OO.ui.MenuOptionWidget({data:p,label:s}))}});W.getMenu().on("choose",()=>{let s=W.getMenu().findSelectedItem();this.actionsToTake[t].closingReason={name:s.getLabel(),id:s.getData()},this.updateRequestColor(a,t)}),W.getMenu().selectItemByData("r"),this.actionsToTake[t].closingReason={name:"No response",id:"r"};let S=new OO.ui.FieldLayout(W,{align:"inline",label:"Closing reason:"});S.$element.hide();let D=new OO.ui.TextInputWidget;D.on("change",()=>{let s=D.getValue().trim();s?this.actionsToTake[t].comment=s:delete this.actionsToTake[t].comment});let x=new OO.ui.FieldLayout(D,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});x.$element.hide(),C.append(b.$element[0],g.$element[0],P.$element[0],M.$element[0],S.$element[0],x.$element[0]),a.append(C),this.$body.append(a),this.updateSize()}updateRequestColor(t,e){if(this.requestPageType==="redirect"){let a=Object.values(this.actionsToTake[e].requests),o=a.every(r=>r.action==="accept"||r.action==="deny"),i=a.find(r=>r.action==="close")?.closingReason?.id,c=a.every(r=>r.action==="close"&&r.closingReason?.id===i),n="";if(o){let r=a.filter(d=>d.action==="accept").length,h=a.filter(d=>d.action==="deny").length;r>0&&h>0?n="#fff17e":r>0?n="#a0ffa0":n="#ffcece"}else c&&(i==="r"?n="#ffcece":i==="s"?n="#90c090":n="#b8b8b8");t.style.backgroundColor=n}else{let{action:a}=this.actionsToTake[e],o="";a==="accept"?o="#a0ffa0":a==="deny"?o="#ffcece":a==="close"&&(this.actionsToTake[e].closingReason?.id==="r"?o="#ffcece":this.actionsToTake[e].closingReason?.id==="s"?o="#90c090":o="#b8b8b8"),t.style.backgroundColor=o}}async performActions(){let t=new OO.ui.WindowManager;document.body.append(t.$element[0]);let e=new U;t.addWindows([e]),e.open();let a={accepted:0,denied:0,"commented on":0,closed:0},o=(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(n=>n.action!=="none"))){for(let{target:n,requests:r}of this.actionsToTake){let h=Object.values(r).some(u=>u.action==="accept"||u.action==="deny"),d=Object.values(r).every(u=>u.action==="accept"||u.action==="deny"),f=Object.values(r).find(u=>u.action==="close")?.closingReason?.id,T=Object.values(r).every(u=>u.action==="close"&&u.closingReason?.id===f),O=[],C=[],b=[],k=Object.keys(r).length;for(let[u,g]of Object.entries(r))switch(g.action){case"accept":{h&&!d?e.addLogEntry(`Not all requests to "${n}" were accepted or denied, the handling of "${u}" will be ignored.`,"warning"):(O.push(u),g.comment&&b.push([u,g.comment]),a.accepted++);break}case"deny":{h&&!d?e.addLogEntry(`Not all requests to "${n}" were accepted or denied, the handling of "${u}" is being ignored.`,"warning"):(C.push([u,g.denyReason]),a.denied++);break}case"comment":{g.comment?(b.push([u,g.comment]),a["commented on"]++):e.addLogEntry(`The request to create "${u}" \u2192 "${n}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{T?(g.comment&&b.push([u,g.comment]),a.closed++):e.addLogEntry(`Not all requests to "${n}" were closed with the same reason, the handling of "${u}" is being ignored.`,"warning");break}}let l={pageText:o,...Object.values(r)[0].originalText};if(b.length>0&&(l=this.modifySectionData(l,{append:this.mapComments(b,k===1,b.length===k)})),d){let u;if(O.length>0&&C.length>0){u="p";let g=`* {{subst:AfC redirect}} (${O.map(m=>`[[${m}]]`).join(", ")}) ~~~~`,R=this.mapDeniedReasons(C,!1,!1);for(let m of O)this.handleAcceptedRedirect(m,r[m],n);l=this.modifySectionData(l,{append:`${g}
${R}`})}else if(O.length>0){u="a";for(let g of O)this.handleAcceptedRedirect(g,r[g],n);l=this.modifySectionData(l,{append:`* {{subst:AfC redirect${O.length>1?"|all":""}}} ~~~~`})}else u="d",l=this.modifySectionData(l,{append:this.mapDeniedReasons(C,k===1,!0)});l=this.modifySectionData(l,{prepend:`{{AfC-c|${u}}}`,append:"{{AfC-c|b}}"})}else T&&(l=this.modifySectionData(l,{prepend:`{{AfC-c|${f}}}`,append:"{{AfC-c|b}}"}));o=l.pageText}if(this.beforeText+this.pageContent===o)return e.addLogEntry("No requests have been handled (page content identical)!");let c=Object.entries(a).filter(([,n])=>n>0).map(([n,r])=>`${n} ${r}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:o,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(let n of this.actionsToTake){let r={pageText:o,...n.originalText};switch(n.action){case"accept":{r=this.modifySectionData(r,{prepend:"{{AfC-c|a}}",append:`* {{subst:AfC category}} ~~~~
{{AfC-c|b}}`}),this.handleAcceptedCategory(n),a.accepted++;break}case"deny":{r=this.modifySectionData(r,{prepend:"{{AfC-c|d}}",append:`* ${this.formatDeniedReason(n.denyReason)} ~~~~
{{AfC-c|b}}`}),a.denied++;break}case"comment":{n.comment?(r=this.modifySectionData(r,{append:`* {{AfC comment|1=${n.comment}}} ~~~~`}),a["commented on"]++):e.addLogEntry(`The request to create "${n.category}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{r=this.modifySectionData(r,{prepend:`{{AfC-c|${n.closingReason.id}}}`,append:(n.comment?`* {{AfC comment|1=${n.comment}}} ~~~~`:"")+`
{{AfC-c|b}`}),a.closed++;break}}o=r.pageText}if(this.beforeText+this.pageContent===o)return e.addLogEntry("No requests have been handled (page content identical)!");let c=Object.entries(a).filter(([,n])=>n>0).map(([n,r])=>`${n} ${r}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:o,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){let e=t.startsWith("autofill:")?/autofill:(\w+)/.exec(t)[1]:`decline|2=${t}`,a=t.includes(",")?" "+t.slice(t.indexOf(",")+1).trim():"";return`{{subst:AfC ${this.requestPageType}|${e}}}${a}`}mapDeniedReasons(t,e,a){if(e)return`* ${this.formatDeniedReason(t[0][1])} ~~~~`;let o={};for(let[c,n]of t)o[n]||(o[n]=[]),o[n].push(c);let i=Object.entries(o);return i.map(([c,n])=>`* ${this.formatDeniedReason(c)}${i.length>1||!a?` (${n.map(r=>`[[${r}]]`).join(", ")})`:""} ~~~~`).join(`
`)}mapComments(t,e,a){if(e)return`* {{AfC comment|1=${t[0][1]}}} ~~~~`;let o={};for(let[c,n]of t)o[n]||(o[n]=[]),o[n].push(c);let i=Object.entries(o);return i.map(([c,n])=>`* {{AfC comment|1=${c}}}${i.length>1||!a?` (${n.map(r=>`[[${r}]]`).join(", ")})`:""} ~~~~`).join(`
`)}modifySectionData(t,{prepend:e,append:a}){let{fullSectionText:o,sectionText:i}=t;return e&&(t.sectionText=e+`
`+t.sectionText),a&&(t.sectionText+=`
`+a),t.fullSectionText=t.fullSectionText.replace(i,t.sectionText),t.pageText=t.pageText.replace(o,t.fullSectionText),t}handleAcceptedRedirect(t,e,a){let o=e.redirectTemplates&&e.redirectTemplates.length>0?e.redirectTemplates.map(c=>{let n=e.redirectTemplateParameters?.find(d=>d.name===c);if(!n)return`{{${c}}}`;let r=n.parameters.findLastIndex((d,f)=>d.name===(f+1).toString()&&d.editor.getValue().trim()),h=n.parameters.map((d,f)=>{let T=d.editor.getValue().trim();return!T&&f>r?null:`|${d.name===(f+1).toString()?"":`${d.name}=`}${T}`}).filter(Boolean).join("");return`{{${c}${h}}}`}):null,i=mw.Title.newFromText(t);this.editsCreationsToMake.push({type:"create",isRedirect:!0,title:i.getPrefixedText(),text:`#REDIRECT [[${a}]]${o?`
{{Redirect category shell|
${o.join(`
`)}
}}`:""}`,summary:`Creating redirect to [[${a}]] as requested at [[WP:AFC/R]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:i.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:a})=>({text:`${a}
[[Category:${t.category}]]`,summary:`Adding page to [[:Category:${t.category}]] as requested at [[WP:AFC/C]]${this.scriptMessage}`})})))}async makeAllEditsCreations(t){for(let e of this.editsCreationsToMake){let a=e.type==="edit"?this.api.edit(e.title,e.transform):this.api.create(e.title,{summary:e.summary,watchlist:this.createdPageWatchMethod},e.text),o=document.createElement("a");o.target="_blank",o.href=mw.util.getUrl(e.title,"isRedirect"in e&&e.isRedirect?{redirect:"no"}:void 0),o.textContent=e.title,t.addLogEntry(`${e.type==="edit"?"Editing":"Creating"} ${o.outerHTML}...`),await a.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(n=>setTimeout(n,7e4)),t.addLogEntry("Continuing...","success"),await a.catch((n,r)=>{t.addLogEntry(`Error ${e.type==="edit"?"editing":"creating"} ${o.outerHTML}: ${r?.error.info??"Unknown error"} (${n}).`,"error")})):t.addLogEntry(`Error ${e.type==="edit"?"editing":"creating"} ${o.outerHTML}: ${c?.error.info??"Unknown error"} (${i}).`,"error")})}}};mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],()=>{let y=mw.config.get("wgPageName").replaceAll("_"," "),t=y==="Wikipedia:Articles for creation/Redirects";if(!t&&!(y==="Wikipedia:Articles for creation/Categories"))return;let a=t?"redirect":"category";mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#",`Handle ${a} creation requests`,"afcrc-helper").addEventListener("click",i=>{i.preventDefault();let c=new OO.ui.WindowManager;document.body.append(c.$element[0]);let n=new F(a,y,window.afcrcConfiguration?.createdPageWatchMethod);c.addWindows([n]),n.open(),n.load()})});})();
// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvY2F0ZWdvcnktaW5wdXQtd2lkZ2V0LnRzIiwgIi4uLy4uL3NjcmlwdHMvYWZjcmMtaGVscGVyL3BhZ2UtaW5wdXQtd2lkZ2V0LnRzIiwgIi4uLy4uL3NjcmlwdHMvYWZjcmMtaGVscGVyL3Nob3ctYWN0aW9ucy1kaWFsb2cudHMiLCAiLi4vLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvYWZjcmMtaGVscGVyLWRpYWxvZy50cyIsICIuLi8uLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9hZmNyYy1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBMb29rdXBFbGVtZW50Q29uZmlnIH0gZnJvbSAnLi9wYWdlLWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGNhdGVnb3J5IGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oQ2F0ZWdvcnlJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcblxuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IDE0LFxuICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnYWxscGFnZXMnLFxuICAgICAgICAgICAgICAgIHByb3A6ICdjYXRlZ29yaWVzJyxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAudGhlbigocmVzdWx0OiB7IHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmc7IGNhdGVnb3JpZXM/OiB7IHRpdGxlOiBzdHJpbmcgfVtdIH1bXSB9IH0gfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8ucXVlcnk/LnBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcGFnZS5jYXRlZ29yaWVzPy5zb21lKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkudGl0bGUgPT09ICdDYXRlZ29yeTpXaWtpcGVkaWEgc29mdCByZWRpcmVjdGVkIGNhdGVnb3JpZXMnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVdpdGhvdXROYW1lc3BhY2UgPSBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UsIGxhYmVsOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCBwYWdlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwYWdlcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIH07XG5cbiAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+XG4gICAgICAgIGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvb2t1cEVsZW1lbnRDb25maWcgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQuQ29uZmlnT3B0aW9ucywgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5Db25maWdPcHRpb25zIHt9XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIHBhZ2UgbG9va3VwIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2VJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZykge1xuICAgICAgICBPYmplY3QuYXNzaWduKFBhZ2VJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcblxuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IHBhcnNlZFRpdGxlPy5nZXROYW1lc3BhY2VJZCgpID8/IDAsXG4gICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycylcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogeyBxdWVyeTogeyBwYWdlczogeyB0aXRsZTogc3RyaW5nIH1bXSB9IH0gfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8ucXVlcnk/LnBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzLm1hcCgocGFnZSkgPT4gKHsgZGF0YTogcGFnZS50aXRsZSwgbGFiZWw6IHBhZ2UudGl0bGUgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCBwYWdlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwYWdlcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIH07XG5cbiAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+XG4gICAgICAgIGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xufVxuIiwgIi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhbiBhY3Rpb24gZGlhbG9nLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaG93QWN0aW9uc0RpYWxvZyBleHRlbmRzIE9PLnVpLkRpYWxvZyB7XG4gICAgcHJpdmF0ZSBjb250ZW50TGF5b3V0ITogT08udWkuUGFuZWxMYXlvdXQ7XG4gICAgcHJpdmF0ZSBsb2dPdXRwdXQhOiBIVE1MRGl2RWxlbWVudDtcbiAgICBwcml2YXRlIGNsb3NlQnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oU2hvd0FjdGlvbnNEaWFsb2cucHJvdG90eXBlLCBPTy51aS5EaWFsb2cucHJvdG90eXBlKTtcblxuICAgICAgICBzdXBlcih7IHNpemU6ICdsYXJnZScgfSk7XG5cbiAgICAgICAgU2hvd0FjdGlvbnNEaWFsb2cuc3RhdGljLm5hbWUgPSAnU2hvd0FjdGlvbnNEaWFsb2cnO1xuICAgICAgICBTaG93QWN0aW9uc0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnQWN0aW9ucyc7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgICAgT08udWkuRGlhbG9nLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMpO1xuXG4gICAgICAgIG13LnV0aWwuYWRkQ1NTKGBcbi5hZmNyYy1oZWxwZXItYWN0aW9ucy1jb250YWluZXIgZGl2IHtcbm1hcmdpbi1ibG9jazogOHB4O1xufWApO1xuXG4gICAgICAgIHRoaXMuY29udGVudExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQodGhpcy5jb250ZW50TGF5b3V0LiRlbGVtZW50KTtcblxuICAgICAgICB0aGlzLmxvZ091dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLmxvZ091dHB1dC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItYWN0aW9ucy1jb250YWluZXInKTtcblxuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfSk7XG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZSgpKTtcblxuICAgICAgICB0aGlzLmNvbnRlbnRMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKHRoaXMubG9nT3V0cHV0LCB0aGlzLmNsb3NlQnV0dG9uLiRlbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxvZyBlbnRyeSB0byB0aGUgZGlhbG9nLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgbWVzc2FnZSB0eXBlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRMb2dFbnRyeShtZXNzYWdlOiBzdHJpbmcsIHR5cGU6IE9PLnVpLk1lc3NhZ2VXaWRnZXQuVHlwZSA9ICdub3RpY2UnKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VXaWRnZXQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGUsIGlubGluZTogdHJ1ZSwgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChtZXNzYWdlKSB9KTtcblxuICAgICAgICB0aGlzLmxvZ091dHB1dC5hcHBlbmQobWVzc2FnZVdpZGdldC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG5cbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbi5zY3JvbGxFbGVtZW50SW50b1ZpZXcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBjbG9zZSBidXR0b24gYW5kIGFkZHMgYSByZWxvYWQgYnV0dG9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93UmVsb2FkKCkge1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLiRlbGVtZW50LnJlbW92ZSgpO1xuXG4gICAgICAgIGNvbnN0IHJlbG9hZEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1JlbG9hZCcsIGZsYWdzOiBbJ3ByaW1hcnknXSB9KTtcbiAgICAgICAgcmVsb2FkQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50TGF5b3V0LiRlbGVtZW50LmFwcGVuZChyZWxvYWRCdXR0b24uJGVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFwaUVkaXRQYWdlUGFyYW1zLCBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcbmltcG9ydCB0eXBlIHsgTWVkaWFXaWtpRGF0YUVycm9yLCBQYWdlUmV2aXNpb25zUmVzdWx0IH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUmVkaXJlY3RUZW1wbGF0ZURhdGEsIFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gfSBmcm9tICcuLi9yZWRpcmVjdC1oZWxwZXInO1xuaW1wb3J0IHR5cGUgeyBXYXRjaE1ldGhvZCB9IGZyb20gJy4vYWZjcmMtaGVscGVyJztcbmltcG9ydCBDYXRlZ29yeUlucHV0V2lkZ2V0IGZyb20gJy4vY2F0ZWdvcnktaW5wdXQtd2lkZ2V0JztcbmltcG9ydCBQYWdlSW5wdXRXaWRnZXQgZnJvbSAnLi9wYWdlLWlucHV0LXdpZGdldCc7XG5pbXBvcnQgU2hvd0FjdGlvbnNEaWFsb2cgZnJvbSAnLi9zaG93LWFjdGlvbnMtZGlhbG9nJztcblxudHlwZSBSZXF1ZXN0ZXIgPSB7IHR5cGU6ICd1c2VyJyB8ICdpcCc7IG5hbWU6IHN0cmluZyB9IHwgbnVsbDtcblxuaW50ZXJmYWNlIFJlZGlyZWN0UmVxdWVzdERhdGEge1xuICAgIHBhZ2VzOiBzdHJpbmdbXTtcbiAgICB0YXJnZXQ6IHN0cmluZztcbiAgICByZWFzb246IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZztcbiAgICByZXF1ZXN0ZXI6IFJlcXVlc3Rlcjtcbn1cblxuaW50ZXJmYWNlIENhdGVnb3J5UmVxdWVzdERhdGEge1xuICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgZXhhbXBsZXM6IHN0cmluZ1tdO1xuICAgIHBhcmVudHM6IHN0cmluZ1tdO1xuICAgIHJlcXVlc3RlcjogUmVxdWVzdGVyO1xufVxuXG50eXBlIEFjdGlvblR5cGUgPSAnYWNjZXB0JyB8ICdkZW55JyB8ICdjb21tZW50JyB8ICdjbG9zZScgfCAnbm9uZSc7XG5cbmludGVyZmFjZSBBY3Rpb24ge1xuICAgIG9yaWdpbmFsVGV4dDogeyBmdWxsU2VjdGlvblRleHQ6IHN0cmluZzsgc2VjdGlvblRleHQ6IHN0cmluZyB9O1xuICAgIGFjdGlvbjogQWN0aW9uVHlwZTtcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGRlbnlSZWFzb24/OiBzdHJpbmc7XG4gICAgY2xvc2luZ1JlYXNvbj86IHsgbmFtZTogc3RyaW5nOyBpZDogc3RyaW5nIH07XG59XG5cbnR5cGUgUmVkaXJlY3RBY3Rpb24gPSBBY3Rpb24gJiB7IHJlZGlyZWN0VGVtcGxhdGVzPzogc3RyaW5nW107IHJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzPzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdIH07XG5cbnR5cGUgQ2F0ZWdvcnlBY3Rpb24gPSBBY3Rpb24gJiB7IGNhdGVnb3J5OiBzdHJpbmc7IGV4YW1wbGVzOiBzdHJpbmdbXTsgcGFyZW50czogc3RyaW5nW10gfTtcblxudHlwZSBSZWRpcmVjdEFjdGlvbnMgPSB7IHRhcmdldDogc3RyaW5nOyByZXF1ZXN0czogUmVjb3JkPHN0cmluZywgUmVkaXJlY3RBY3Rpb24+IH1bXTtcblxudHlwZSBDYXRlZ29yeUFjdGlvbnMgPSBDYXRlZ29yeUFjdGlvbltdO1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdGhhdCBoYW5kbGVzIHJlZGlyZWN0IGFuZCBjYXRlZ29yeSByZXF1ZXN0cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWZjcmNIZWxwZXJEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIHByaXZhdGUgc2NyaXB0TWVzc2FnZSA9ICcgKFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvYWZjcmMtaGVscGVyfGFmY3JjLWhlbHBlcl1dKSc7XG5cbiAgICBwcml2YXRlIHJlcXVlc3RQYWdlVHlwZTogJ3JlZGlyZWN0JyB8ICdjYXRlZ29yeSc7XG4gICAgcHJpdmF0ZSBwYWdlVGl0bGUhOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIGNyZWF0ZWRQYWdlV2F0Y2hNZXRob2Q6IFdhdGNoTWV0aG9kO1xuXG4gICAgcHJpdmF0ZSByZWRpcmVjdFRlbXBsYXRlcyE6IFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuXG4gICAgcHJpdmF0ZSBiZWZvcmVUZXh0ITogc3RyaW5nO1xuICAgIHByaXZhdGUgcGFnZUNvbnRlbnQhOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIHBhcnNlZFJlcXVlc3RzOiBSZWRpcmVjdFJlcXVlc3REYXRhW10gfCBDYXRlZ29yeVJlcXVlc3REYXRhW10gPSBbXTtcbiAgICBwcml2YXRlIGFjdGlvbnNUb1Rha2U6IFJlZGlyZWN0QWN0aW9ucyB8IENhdGVnb3J5QWN0aW9ucyA9IFtdO1xuICAgIHByaXZhdGUgZWRpdHNDcmVhdGlvbnNUb01ha2U6IChcbiAgICAgICAgfCB7IHR5cGU6ICdlZGl0JzsgdGl0bGU6IHN0cmluZzsgdHJhbnNmb3JtOiAoZGF0YTogeyBjb250ZW50OiBzdHJpbmcgfSkgPT4gQXBpRWRpdFBhZ2VQYXJhbXMgfVxuICAgICAgICB8IHsgdHlwZTogJ2NyZWF0ZSc7IGlzUmVkaXJlY3Q6IGJvb2xlYW47IHRpdGxlOiBzdHJpbmc7IHRleHQ6IHN0cmluZzsgc3VtbWFyeTogc3RyaW5nIH1cbiAgICApW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHJlcXVlc3RQYWdlVHlwZTogJ3JlZGlyZWN0JyB8ICdjYXRlZ29yeScsIHBhZ2VUaXRsZTogc3RyaW5nLCBjcmVhdGVkV2F0Y2hNZXRob2Q/OiBXYXRjaE1ldGhvZCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKEFmY3JjSGVscGVyRGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuXG4gICAgICAgIHN1cGVyKHsgc2l6ZTogJ2xhcmdlJyB9KTtcblxuICAgICAgICBBZmNyY0hlbHBlckRpYWxvZy5zdGF0aWMubmFtZSA9ICdBZmNyY0hlbHBlckRpYWxvZyc7XG4gICAgICAgIEFmY3JjSGVscGVyRGlhbG9nLnN0YXRpYy50aXRsZSA9ICdhZmNyYy1oZWxwZXInO1xuICAgICAgICBBZmNyY0hlbHBlckRpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFtcbiAgICAgICAgICAgIHsgYWN0aW9uOiAnY2FuY2VsJywgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9LFxuICAgICAgICAgICAgeyBhY3Rpb246ICdzYXZlJywgbGFiZWw6ICdSdW4nLCBmbGFnczogWydwcmltYXJ5JywgJ3Byb2dyZXNzaXZlJ10gfSxcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLnBhZ2VUaXRsZSA9IHBhZ2VUaXRsZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0UGFnZVR5cGUgPSByZXF1ZXN0UGFnZVR5cGU7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVkUGFnZVdhdGNoTWV0aG9kID1cbiAgICAgICAgICAgIGNyZWF0ZWRXYXRjaE1ldGhvZCAmJiBbJ25vY2hhbmdlJywgJ3ByZWZlcmVuY2VzJywgJ3Vud2F0Y2gnLCAnd2F0Y2gnXS5pbmNsdWRlcyhjcmVhdGVkV2F0Y2hNZXRob2QpXG4gICAgICAgICAgICAgICAgPyBjcmVhdGVkV2F0Y2hNZXRob2RcbiAgICAgICAgICAgICAgICA6ICdwcmVmZXJlbmNlcyc7XG5cbiAgICAgICAgbXcudXRpbC5hZGRDU1MoYFxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0IHtcbiAgICBtYXJnaW46IDEwcHg7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIGNvbG9yOiAjMjAyMTIyO1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3Qgc3VtbWFyeSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uYWZjcmMtaGVscGVyLXRhcmdldC1lZGl0b3Ige1xuICAgIG1pbi13aWR0aDogMWNoO1xuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gNGNoKTtcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xufVxuXG4uYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4uYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsgc3ZnIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDFlbTtcbiAgICBoZWlnaHQ6IDFlbTtcbiAgICBmaWxsOiBjdXJyZW50Q29sb3I7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvLFxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciB7XG4gICAgbWFyZ2luOiA1cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvID4gZGl2LFxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciA+IGRpdiB7XG4gICAgbWFyZ2luLWJsb2NrOiA4cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgPiBkaXY6bGFzdC1vZi10eXBlIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyIC5vby11aS1maWVsZExheW91dCB7XG4gICAgbWFyZ2luLWxlZnQ6IDhweDtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciAub28tdWktZmllbGRMYXlvdXQtaGVhZGVyIHtcbiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XG59XG5cbi5hZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvIHtcbiAgICBtYXJnaW4tdG9wOiA4cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvIC5vby11aS1yYWRpb09wdGlvbldpZGdldCB7XG4gICAgZGlzcGxheTogaW5saW5lO1xuICAgIHBhZGRpbmc6IDhweDtcbn1cblxuLmFmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0LFxuLmFmY3JjLWNvbW1lbnQtaW5wdXQge1xuICAgIG1heC13aWR0aDogNTAlO1xufVxuXG4uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyLFxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIHtcbiAgICBtYXJnaW4tYmxvY2s6IDEwcHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2EyYTliMTtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIHtcbiAgICBtYXJnaW4tbGVmdDogOHB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIHN1bW1hcnkge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIHtcbiAgICBtYXJnaW4tYmxvY2s6IDVweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyO1xufVxuXG4jYWZjcmMtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlIHtcbiAgICBwYWRkaW5nOiA1cHg7XG59YCk7XG4gICAgfVxuXG4gICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoYWN0aW9uID09PSAnY2FuY2VsJylcbiAgICAgICAgICAgIHJldHVybiBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRNYW5hZ2VyKCkuY2xvc2VXaW5kb3codGhpcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAnc2F2ZScpXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybUFjdGlvbnMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBlbHNlIHJldHVybiBBZmNyY0hlbHBlckRpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgfTtcblxuICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIEFmY3JjSGVscGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGVsZW1lbnRzIGluIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIGNvbnN0IHJlZGlyZWN0VGVtcGxhdGVSZXNwb25zZSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgIHRpdGxlczogJ1VzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci5qc29uJyxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0O1xuXG4gICAgICAgIHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgcmVkaXJlY3RUZW1wbGF0ZVJlc3BvbnNlLnF1ZXJ5LnBhZ2VzPy5bMF0/LnJldmlzaW9ucz8uWzBdPy5zbG90cz8ubWFpbj8uY29udGVudCB8fCAne30nLFxuICAgICAgICApIGFzIFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuXG4gICAgICAgIGNvbnN0IHBhZ2VSZXZpc2lvbiA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdDtcblxuICAgICAgICB0aGlzLnBhZ2VDb250ZW50ID0gcGFnZVJldmlzaW9uLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgIHRoaXMucGFyc2VSZXF1ZXN0cygpO1xuICAgICAgICB0aGlzLmxvYWRJbnB1dEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHJlcXVlc3RzIGZyb20gdGhlIHBhZ2UgY29udGVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlUmVxdWVzdHMoKSB7XG4gICAgICAgIHRoaXMuYmVmb3JlVGV4dCA9IC9eKC4qPyk9PS9zLmV4ZWModGhpcy5wYWdlQ29udGVudCkhWzFdO1xuXG4gICAgICAgIHRoaXMucGFnZUNvbnRlbnQgPSB0aGlzLnBhZ2VDb250ZW50LnJlcGxhY2UoL14uKj89PS9zLCAnPT0nKTtcblxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IFsuLi50aGlzLnBhZ2VDb250ZW50Lm1hdGNoQWxsKC9ePT0uKj89PSQoXFxzKig/IT09W149XSkuKikqL2dpbSldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzBdKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb25UZXh0IG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBpc0Nsb3NlZCA9IC97e2FmYy1jXFx8L2kudGVzdChzZWN0aW9uVGV4dCk7XG4gICAgICAgICAgICBpZiAoaXNDbG9zZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uSGVhZGVyID0gL149PSguKj8pPT0kL20uZXhlYyhzZWN0aW9uVGV4dCkhWzFdLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucmVxdWVzdFBhZ2VUeXBlID09PSAncmVkaXJlY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IHt9IGFzIFJlZGlyZWN0UmVxdWVzdERhdGE7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ZWRQYWdlcyA9IFsuLi5zZWN0aW9uSGVhZGVyLm1hdGNoQWxsKC9cXFtcXFsoLio/KV1dL2cpXVxuICAgICAgICAgICAgICAgICAgICAubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0/LnRyaW0oKS5yZXBsYWNlKC9eOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdGVkUGFnZXMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIHBhcnNlZERhdGEucGFnZXMgPSByZXF1ZXN0ZWRQYWdlcztcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IC9UYXJnZXQgb2YgcmVkaXJlY3Q6ID9cXFtcXFsoLio/KV1dL1xuICAgICAgICAgICAgICAgICAgICAuZXhlYyhzZWN0aW9uVGV4dCk/LlsxXVxuICAgICAgICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9eOi8sICcnKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnXycsICcgJyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRUYXJnZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgcGFyc2VkRGF0YS50YXJnZXQgPSBwYXJzZWRUYXJnZXQ7XG5cbiAgICAgICAgICAgICAgICBwYXJzZWREYXRhLnJlYXNvbiA9IC9yZWFzb246ID8oLio/KVxcKnNvdXJjZSg/OiBcXChpZiBhcHBsaWNhYmxlXFwpKT86L2lzLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0udHJpbSgpID8/ICcnO1xuXG4gICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5zb3VyY2UgPSAvc291cmNlKD86IFxcKGlmIGFwcGxpY2FibGVcXCkpPzogPyguKj8pKD86PHJlZmVyZW5jZXMgXFwvPnxcXG5cXG4pL2lzLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0udHJpbSgpID8/ICcnO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVyID0gc2VjdGlvblRleHRcbiAgICAgICAgICAgICAgICAgICAgLm1hdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvblRleHQuaW5jbHVkZXMoJzxyZWZlcmVuY2VzIC8+JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IC88cmVmZXJlbmNlcyBcXC8+XFxuKyguKikvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoPzo8cmVmZXJlbmNlcyBcXFxcLz4ke3BhcnNlZERhdGEuc291cmNlID8gYHwke3BhcnNlZERhdGEuc291cmNlLnJlcGxhY2VBbGwoL1tcXHMjJCgpKissLj9bXFxcXFxcXV57fH0tXS9nLCAnXFxcXCQmJyl9YCA6ICcnfSlcXG4rKC4qKWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICApPy5bMV1cbiAgICAgICAgICAgICAgICAgICAgLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSByZXF1ZXN0ZXIgPyAvKD86U3BlY2lhbDpDb250cmlidXRpb25zXFwvfFVzZXIoPzogdGFsayk/OikoLio/KVxcfC8uZXhlYyhyZXF1ZXN0ZXIpPy5bMV0udHJpbSgpIDogbnVsbDtcblxuICAgICAgICAgICAgICAgIHBhcnNlZERhdGEucmVxdWVzdGVyID0gcmVxdWVzdGVyICYmIG5hbWUgPyB7IHR5cGU6IC9cXFtcXFtVc2VyKCB0YWxrKT86Ly50ZXN0KHJlcXVlc3RlcikgPyAndXNlcicgOiAnaXAnLCBuYW1lIH0gOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgKHRoaXMucGFyc2VkUmVxdWVzdHMgYXMgUmVkaXJlY3RSZXF1ZXN0RGF0YVtdKS5wdXNoKHBhcnNlZERhdGEpO1xuXG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHBhcnNlZERhdGEudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0czogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGFnZXMubWFwKChwYWdlKSA9PiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dC5yZXBsYWNlKC9ePT0uKj89PSQvbSwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWREYXRhID0ge30gYXMgQ2F0ZWdvcnlSZXF1ZXN0RGF0YTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ2F0ZWdvcnkgPSAvOj9DYXRlZ29yeTooLio/KShdXXwkKS8uZXhlYyhzZWN0aW9uSGVhZGVyKT8uWzFdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kQ2F0ZWdvcnkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5jYXRlZ29yeSA9IGZvdW5kQ2F0ZWdvcnkucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICAgICAgICAgICAgICBwYXJzZWREYXRhLmV4YW1wbGVzID1cbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9leGFtcGxlIHBhZ2VzIHdoaWNoIGJlbG9uZyB0byB0aGlzIGNhdGVnb3J5OiguKj8pKHBhcmVudCBjYXRlZ29yeVxcL2NhdGVnb3JpZXM6fFxcblxcW1xcWyhzcGVjaWFsOmNvbnRyaWJ1dGlvbnNcXC98dXNlcjopKS9pcy5leGVjKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApPy5bMV0gPz8gJydcbiAgICAgICAgICAgICAgICAgICAgICAgICkubWF0Y2hBbGwoL1xcKlxccyooPzpcXFtcXFspPyguKj8pKFxcfHxdXXxcXHMqP1xcbikvZyksXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXS50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pID8/IFtdO1xuXG4gICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5wYXJlbnRzID1cbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9wYXJlbnQgY2F0ZWdvcnlcXC9jYXRlZ29yaWVzOiguKj8pKFxcblxcbnxcXG5cXFtcXFsoc3BlY2lhbDpjb250cmlidXRpb25zXFwvfHVzZXI6KSkvaXMuZXhlYyhzZWN0aW9uVGV4dCk/LlsxXSA/PyAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKS5tYXRjaEFsbCgvKD88IVxcfCkjPzo/Q2F0ZWdvcnk6KC4qPykoXFx8fF1dfFxccyo/XFxuKS9nKSxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgPy5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXS50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pID8/IFtdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RVc2VySW5kZXggPSBzZWN0aW9uVGV4dC5pbmRleE9mKCdbW1VzZXI6Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RVc2VyVGFsa0luZGV4ID0gc2VjdGlvblRleHQuaW5kZXhPZignW1tVc2VyIHRhbGs6Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RJcEluZGV4ID0gc2VjdGlvblRleHQuaW5kZXhPZignW1tTcGVjaWFsOkNvbnRyaWJ1dGlvbnMvJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEluZGV4ID0gTWF0aC5taW4oLi4uW2ZpcnN0VXNlckluZGV4LCBmaXJzdFVzZXJUYWxrSW5kZXgsIGZpcnN0SXBJbmRleF0uZmlsdGVyKChpbmRleCkgPT4gaW5kZXggIT09IC0xKSk7XG5cbiAgICAgICAgICAgICAgICBwYXJzZWREYXRhLnJlcXVlc3RlciA9XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0SW5kZXggPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGZpcnN0SW5kZXggPT09IGZpcnN0SXBJbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgdHlwZTogJ2lwJywgbmFtZTogL1xcW1xcW1NwZWNpYWw6Q29udHJpYnV0aW9uc1xcLyguKj8pKFxcfHxdXSkvLmV4ZWMoc2VjdGlvblRleHQpIVsxXS50cmltKCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgdHlwZTogJ3VzZXInLCBuYW1lOiAvXFxbXFxbVXNlcig/OiB0YWxrKT86KC4qPykoXFx8fF1dKS8uZXhlYyhzZWN0aW9uVGV4dCkhWzFdLnRyaW0oKSB9O1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkRGF0YS5yZXF1ZXN0ZXI/Lm5hbWUpIHBhcnNlZERhdGEucmVxdWVzdGVyID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICh0aGlzLnBhcnNlZFJlcXVlc3RzIGFzIENhdGVnb3J5UmVxdWVzdERhdGFbXSkucHVzaChwYXJzZWREYXRhKTtcblxuICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6IHBhcnNlZERhdGEuY2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICAgIGV4YW1wbGVzOiBwYXJzZWREYXRhLmV4YW1wbGVzLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRzOiBwYXJzZWREYXRhLnBhcmVudHMsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVGV4dDogeyBmdWxsU2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LCBzZWN0aW9uVGV4dDogc2VjdGlvblRleHQucmVwbGFjZSgvXj09Lio/PT0kL20sICcnKS50cmltKCkgfSxcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgaW5wdXQgZWxlbWVudHMgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmF0Y2hTaXplID0gNTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IE1hdGgubWluKGluZGV4ICsgYmF0Y2hTaXplLCB0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7IHRpdGxlOiBPTy51aS5MYWJlbFdpZGdldCB9KS50aXRsZS5zZXRMYWJlbChcbiAgICAgICAgICAgICAgICAgICAgYGFmY3JjLWhlbHBlciAobG9hZGluZyAke2luZGV4ICsgMX0tJHtlbmRJbmRleH0vJHt0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aH0gcmVxdWVzdHMpYCxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3ViSW5kZXggPSBpbmRleDsgc3ViSW5kZXggPCBlbmRJbmRleDsgc3ViSW5kZXgrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVxdWVzdFBhZ2VUeXBlID09PSAncmVkaXJlY3QnKSB0aGlzLmxvYWRSZWRpcmVjdFJlcXVlc3RFbGVtZW50cyhzdWJJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5sb2FkQ2F0ZWdvcnlSZXF1ZXN0RWxlbWVudHMoc3ViSW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4IDwgdGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBlbmRJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChoYW5kbGUsIDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgdGl0bGU6IE9PLnVpLkxhYmVsV2lkZ2V0IH0pLnRpdGxlLnNldExhYmVsKFxuICAgICAgICAgICAgICAgICAgICAgICAgYGFmY3JjLWhlbHBlciAoJHt0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aH0gcmVxdWVzdHMgbG9hZGVkKWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBoYW5kbGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VXaWRnZXQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICdub3RpY2UnLCBsYWJlbDogJ05vIHZhbGlkIHJlcXVlc3RzIHRvIGhhbmRsZSEnIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0TGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICBtZXNzYWdlV2lkZ2V0TGF5b3V0LiRlbGVtZW50LmFwcGVuZChtZXNzYWdlV2lkZ2V0LiRlbGVtZW50KTtcblxuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKG1lc3NhZ2VXaWRnZXRMYXlvdXQuJGVsZW1lbnQpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGEgZ2l2ZW4gcmVkaXJlY3QgcmVxdWVzdCBpbnRvIHRoZSBkaWFsb2cuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdCB0byBsb2FkLlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZFJlZGlyZWN0UmVxdWVzdEVsZW1lbnRzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucGFyc2VkUmVxdWVzdHNbaW5kZXhdIGFzIFJlZGlyZWN0UmVxdWVzdERhdGE7XG5cbiAgICAgICAgY29uc3QgZGV0YWlsc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgIGRldGFpbHNFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0Jyk7XG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoKSwgMCkpO1xuXG4gICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC5pbm5lckhUTUwgPSByZXF1ZXN0LnBhZ2VzLm1hcCgocGFnZSkgPT4gYDxiPiR7cGFnZX08L2I+YCkuam9pbignLCAnKSArICcgXHUyMTkyICc7XG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8udGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBldmVudC5rZXkgPT09ICcgJykgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0RWRpdG9yRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXRhcmdldC1lZGl0b3InKTtcbiAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JlcXVlc3QudGFyZ2V0Lmxlbmd0aH1jaGA7XG4gICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWUgPSByZXF1ZXN0LnRhcmdldDtcbiAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcbiAgICAgICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWUgPSB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuXG4gICAgICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7dGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZS5sZW5ndGh9Y2hgO1xuXG4gICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnRhcmdldCA9IHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWU7XG5cbiAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybCh0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3VtbWFyeUVsZW1lbnQuYXBwZW5kKHRhcmdldEVkaXRvckVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBsaW5rRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItZXh0ZXJuYWwtbGluaycpO1xuICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKHJlcXVlc3QudGFyZ2V0KTtcbiAgICAgICAgbGlua0VsZW1lbnQuaW5uZXJIVE1MID0gYFxuPHN2ZyB2aWV3Ym94PVwiMCAwIDQ4IDQ4XCI+XG48cGF0aCBkPVwiTTM2IDI0Yy0xLjIgMC0yIDAuOC0yIDJ2MTJjMCAxLjItMC44IDItMiAyaC0yMmMtMS4yXG4gICAgMC0yLTAuOC0yLTJ2LTIyYzAtMS4yIDAuOC0yIDItMmgxMmMxLjIgMCAyLTAuOCAyLTJzLTAuOC0yLTItMmgtMTJjLTMuNFxuICAgIDAtNiAyLjYtNiA2djIyYzAgMy40IDIuNiA2IDYgNmgyMmMzLjQgMCA2LTIuNlxuICAgIDYtNnYtMTJjMC0xLjItMC44LTItMi0yelwiPjwvcGF0aD5cbjxwYXRoIGQ9XCJNNDMuOCA1LjJjLTAuMi0wLjQtMC42LTAuOC0xLTEtMC4yLTAuMi0wLjYtMC4yLTAuOC0wLjJoLTEyYy0xLjJcbiAgICAwLTIgMC44LTIgMnMwLjggMiAyIDJoNy4ybC0xOC42IDE4LjZjLTAuOCAwLjgtMC44IDIgMCAyLjggMC40IDAuNCAwLjhcbiAgICAwLjYgMS40IDAuNnMxLTAuMiAxLjQtMC42bDE4LjYtMTguNnY3LjJjMCAxLjIgMC44IDIgMiAyczItMC44XG4gICAgMi0ydi0xMmMwLTAuMiAwLTAuNi0wLjItMC44elwiPjwvcGF0aD5cbjwvc3ZnPmA7XG5cbiAgICAgICAgc3VtbWFyeUVsZW1lbnQuYXBwZW5kKGxpbmtFbGVtZW50KTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RJbmZvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QtaW5mbycpO1xuXG4gICAgICAgIGNvbnN0IG5vbmVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICBub25lRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgbm9uZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnTm9uZSc7XG5cbiAgICAgICAgY29uc3QgdW5rbm93bkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHVua25vd25FbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICB1bmtub3duRWxlbWVudC50ZXh0Q29udGVudCA9ICdVbmtub3duJztcblxuICAgICAgICBjb25zdCByZWFzb25EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCByZWFzb25MYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgcmVhc29uTGFiZWwudGV4dENvbnRlbnQgPSAnUmVhc29uOiAnO1xuICAgICAgICByZWFzb25EaXYuYXBwZW5kKHJlYXNvbkxhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5yZWFzb24pIHJlYXNvbkRpdi5hcHBlbmQocmVxdWVzdC5yZWFzb24pO1xuICAgICAgICBlbHNlIHJlYXNvbkRpdi5hcHBlbmQobm9uZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHJlYXNvbkRpdik7XG5cbiAgICAgICAgY29uc3Qgc291cmNlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3Qgc291cmNlTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHNvdXJjZUxhYmVsLnRleHRDb250ZW50ID0gJ1NvdXJjZTogJztcbiAgICAgICAgc291cmNlRGl2LmFwcGVuZChzb3VyY2VMYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3Quc291cmNlKSBzb3VyY2VEaXYuYXBwZW5kKHJlcXVlc3Quc291cmNlKTtcbiAgICAgICAgZWxzZSBzb3VyY2VEaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChzb3VyY2VEaXYpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlckxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICByZXF1ZXN0ZXJMYWJlbC50ZXh0Q29udGVudCA9ICdSZXF1ZXN0ZXI6ICc7XG4gICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3Rlcikge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVyTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLmhyZWYgPVxuICAgICAgICAgICAgICAgIHJlcXVlc3QucmVxdWVzdGVyLnR5cGUgPT09ICd1c2VyJ1xuICAgICAgICAgICAgICAgICAgICA/IG13LnV0aWwuZ2V0VXJsKGBVc2VyOiR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKVxuICAgICAgICAgICAgICAgICAgICA6IG13LnV0aWwuZ2V0VXJsKGBTcGVjaWFsOkNvbnRyaWJ1dGlvbnMvJHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay50ZXh0Q29udGVudCA9IHJlcXVlc3QucmVxdWVzdGVyLm5hbWU7XG4gICAgICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxpbmspO1xuICAgICAgICB9IGVsc2UgcmVxdWVzdGVyRGl2LmFwcGVuZCh1bmtub3duRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocmVxdWVzdGVyRGl2KTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQocmVxdWVzdEluZm9FbGVtZW50KTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHInKSk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyJyk7XG5cbiAgICAgICAgZm9yIChjb25zdCByZXF1ZXN0ZWRUaXRsZSBvZiByZXF1ZXN0LnBhZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ZWRUaXRsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gcmVxdWVzdGVkVGl0bGU7XG4gICAgICAgICAgICByZXF1ZXN0ZWRUaXRsZURpdi5hcHBlbmQobGFiZWwpO1xuXG4gICAgICAgICAgICBsZXQgdGFnU2VsZWN0TGF5b3V0OiBPTy51aS5GaWVsZExheW91dCwgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yOiBIVE1MRGV0YWlsc0VsZW1lbnQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlRWRpdG9yc0luZm86IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm9bXSA9IFtdO1xuXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25SYWRpb0lucHV0ID0gbmV3IE9PLnVpLlJhZGlvU2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci1hY3Rpb24tcmFkaW8nXSxcbiAgICAgICAgICAgICAgICBpdGVtczogWydBY2NlcHQnLCAnRGVueScsICdDb21tZW50JywgJ0Nsb3NlJywgJ05vbmUnXS5tYXAoKGxhYmVsKSA9PiBuZXcgT08udWkuUmFkaW9PcHRpb25XaWRnZXQoeyBkYXRhOiBsYWJlbCwgbGFiZWwgfSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhY3Rpb25SYWRpb0lucHV0LnNlbGVjdEl0ZW1CeUxhYmVsKCdOb25lJyk7XG4gICAgICAgICAgICBhY3Rpb25SYWRpb0lucHV0Lm9uKCdjaG9vc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoKSwgMCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSAoXG4gICAgICAgICAgICAgICAgICAgIChhY3Rpb25SYWRpb0lucHV0LmZpbmRTZWxlY3RlZEl0ZW0oKSBhcyBPTy51aS5SYWRpb09wdGlvbldpZGdldCkuZ2V0RGF0YSgpIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICkudG9Mb3dlckNhc2UoKSBhcyBBY3Rpb25UeXBlO1xuXG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uYWN0aW9uID0gb3B0aW9uO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0YWdTZWxlY3RMYXlvdXQgfHwgIXRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdTZWxlY3QgPSBuZXcgT08udWkuTWVudVRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93QXJiaXRyYXJ5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5tYXAoKFt0YWcsIHsgcmVkaXJlY3QgfV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0KSByZXR1cm4geyBkYXRhOiB0YWcsIGxhYmVsOiB0YWcgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGAke3RhZ30gPGk+KHJlZGlyZWN0IHdpdGggcG9zc2liaWxpdGllcyk8L2k+YCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB0YWcsIGxhYmVsIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICh0YWdTZWxlY3QuZ2V0TWVudSgpIGFzIE9PLnVpLk1lbnVTZWxlY3RXaWRnZXQuQ29uZmlnT3B0aW9ucykuZmlsdGVyTW9kZSA9ICdzdWJzdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICB0YWdTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSAodGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHRhZ1NlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0ucmVkaXJlY3RUZW1wbGF0ZXMgPSBzb3J0ZWRUYWdzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVkaXRvckluZm8gb2YgdGVtcGxhdGVFZGl0b3JzSW5mbykgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaG93blRlbXBsYXRlRWRpdG9ycyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvckluZm8gPSB0ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3JJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvckluZm8uZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd25UZW1wbGF0ZUVkaXRvcnMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gYFRlbXBsYXRlIHBhcmFtZXRlcnMgKCR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gYGZvciAke3Nob3duVGVtcGxhdGVFZGl0b3JzfSB0ZW1wbGF0ZSR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAxID8gJ3MnIDogJyd9YCA6ICdub25lIHRvIHNob3cnfSlgO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2Uuc3R5bGUuZGlzcGxheSA9IHNob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/ICdub25lJyA6ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRhZ1NlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0YWdTZWxlY3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtaGVscGVyLXRhZy1zZWxlY3QtbGF5b3V0J10sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1JlZGlyZWN0IHRlbXBsYXRlczonLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50WzBdLmJlZm9yZSh0YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lcicpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9ICdUZW1wbGF0ZSBwYXJhbWV0ZXJzIChub25lIHRvIHNob3cpJztcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXModGVtcGxhdGVEYXRhLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkudGV4dENvbnRlbnQgPSB0ZW1wbGF0ZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChzdW1tYXJ5KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudERhdGE6IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gPSB7IG5hbWU6IHRlbXBsYXRlTmFtZSwgZGV0YWlscywgcGFyYW1ldGVyczogW10gfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyRGF0YV0gb2YgcGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwYXJhbWV0ZXJEYXRhLmRlZmF1bHQ/LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBwYXJhbWV0ZXJEYXRhLnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoaW5wdXQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhcmFtZXRlck5hbWV9JHshcGFyYW1ldGVyRGF0YS5sYWJlbCB8fCBwYXJhbWV0ZXJOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBhcmFtZXRlckRhdGEubGFiZWw/LnRvTG93ZXJDYXNlKCkgPyAnJyA6IGAgKCR7cGFyYW1ldGVyRGF0YS5sYWJlbH0pYH0ke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb24gPyBgICgke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb259KWAgOiAnJ30gKHR5cGU6ICR7cGFyYW1ldGVyRGF0YS50eXBlfSkgJHtwYXJhbWV0ZXJEYXRhLnN1Z2dlc3RlZCA/ICcgKHN1Z2dlc3RlZCknIDogJyd9JHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGUgPyBgIChleGFtcGxlOiBcIiR7cGFyYW1ldGVyRGF0YS5leGFtcGxlfVwiKWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoaW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudERhdGEucGFyYW1ldGVycy5wdXNoKHsgbmFtZTogcGFyYW1ldGVyTmFtZSwgYWxpYXNlczogcGFyYW1ldGVyRGF0YS5hbGlhc2VzLCBlZGl0b3I6IGlucHV0IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKGRldGFpbHMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUVkaXRvcnNJbmZvLnB1c2goZWxlbWVudERhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0ucmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVFZGl0b3JzSW5mbztcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub1RlbXBsYXRlc01lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLmlkID0gJ2FmY3JjLWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSc7XG4gICAgICAgICAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS50ZXh0Q29udGVudCA9ICdObyB0ZW1wbGF0ZXMgd2l0aCBwYXJhbWV0ZXJzIHRvIGRpc3BsYXkhJztcblxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKG5vVGVtcGxhdGVzTWVzc2FnZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50WzBdLmJlZm9yZSh0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChbJ2FjY2VwdCcsICdjb21tZW50JywgJ2Nsb3NlJ10uaW5jbHVkZXMob3B0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50KSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWxldGUgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY29tbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50LCBpbmRleCk7XG5cbiAgICAgICAgICAgICAgICB0YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBkZW55UmVhc29uID0gbmV3IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ2F1dG9maWxsOnVubGlrZWx5JyxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIFsnZXhpc3RzJywgJ2V4aXN0aW5nIHBhZ2VzJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnZW1wdHknLCAnZW1wdHkgc3VibWlzc2lvbnMnXSxcbiAgICAgICAgICAgICAgICAgICAgWydub3RhcmdldCcsICdub25leGlzdGVudCBvciBubyBwcm92aWRlZCB0YXJnZXQnXSxcbiAgICAgICAgICAgICAgICAgICAgWydub3RpdGxlJywgJ25vIHRpdGxlIHByb3ZpZGVkJ10sXG4gICAgICAgICAgICAgICAgICAgIFsndW5saWtlbHknLCAndW5saWtlbHkgcmVkaXJlY3RzJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnbm90cmVkaXJlY3QnLCAnYXJ0aWNsZSBjcmVhdGlvbiByZXF1ZXN0cyddLFxuICAgICAgICAgICAgICAgICAgICBbJ2V4dGVybmFsbGluaycsICdleHRlcm5hbCBsaW5rIHJlZGlyZWN0cyddLFxuICAgICAgICAgICAgICAgICAgICBbJ2VkaXRyZXF1ZXN0JywgJ2VkaXQgcmVxdWVzdHMnXSxcbiAgICAgICAgICAgICAgICAgICAgWydub3RlbmdsaXNoJywgJ3JlcXVlc3RzIG5vdCBpbiBFbmdsaXNoJ10sXG4gICAgICAgICAgICAgICAgXS5tYXAoKFt2YWx1ZSwgbGFiZWxdKSA9PiAoeyBkYXRhOiBgYXV0b2ZpbGw6JHt2YWx1ZX1gLCBsYWJlbDogYEF1dG9maWxsZWQgdGV4dCBmb3IgJHtsYWJlbH1gIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVueVJlYXNvbi5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmRlbnlSZWFzb24gPVxuICAgICAgICAgICAgICAgICAgICBkZW55UmVhc29uLmdldFZhbHVlKCkgfHwgJ2F1dG9maWxsOnVubGlrZWx5JztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVueVJlYXNvbi5zZXRWYWx1ZSgnYXV0b2ZpbGw6dW5saWtlbHknKTtcbiAgICAgICAgICAgIGRlbnlSZWFzb24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRlbnlSZWFzb25MYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoZGVueVJlYXNvbiwge1xuICAgICAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0RlbnkgcmVhc29uOicsXG4gICAgICAgICAgICAgICAgaGVscDogJ1N1cHBvcnRzIGF1dG9tYXRpYyByZWFzb25pbmcsIGN1c3RvbSByZWFzb25pbmcsIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIHR3byB3aXRoIFwiYXV0b2ZpbGw6UkVBU09OLCBDVVNUT01cIiBmb3JtYXQnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgY29uc3QgY2xvc2luZ1JlYXNvbiA9IG5ldyBPTy51aS5Ecm9wZG93bldpZGdldCh7XG4gICAgICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgICAgIG1lbnU6IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnTm8gcmVzcG9uc2UnLCAnciddLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydTdWNjZWVkZWQnLCAncyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydXaXRoZHJhd24nLCAndyddLFxuICAgICAgICAgICAgICAgICAgICBdLm1hcCgoW3RpdGxlLCBpZF0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YTogaWQsIGxhYmVsOiB0aXRsZSB9KSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkub24oJ2Nob29zZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKSBhcyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0O1xuXG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY2xvc2luZ1JlYXNvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogc2VsZWN0ZWQuZ2V0TGFiZWwoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBzZWxlY3RlZC5nZXREYXRhKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudCwgaW5kZXgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdyJyk7XG4gICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5jbG9zaW5nUmVhc29uID0geyBuYW1lOiAnTm8gcmVzcG9uc2UnLCBpZDogJ3InIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb25MYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoY2xvc2luZ1JlYXNvbiwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnQ2xvc2luZyByZWFzb246JyB9KTtcbiAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBjb21tZW50SW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KCk7XG4gICAgICAgICAgICBjb21tZW50SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICAgICAgICAgIGVsc2UgZGVsZXRlICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmNvbW1lbnQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgY29tbWVudElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNvbW1lbnRJbnB1dCwge1xuICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY29tbWVudC1pbnB1dCddLFxuICAgICAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0NvbW1lbnQ6JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgcmVxdWVzdGVkVGl0bGVEaXYuYXBwZW5kKFxuICAgICAgICAgICAgICAgIGFjdGlvblJhZGlvSW5wdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmFwcGVuZChyZXF1ZXN0ZWRUaXRsZURpdik7XG4gICAgICAgIH1cblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQocmVxdWVzdFJlc3BvbmRlckVsZW1lbnQpO1xuXG4gICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChkZXRhaWxzRWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgYSBnaXZlbiBjYXRlZ29yeSByZXF1ZXN0IGludG8gdGhlIGRpYWxvZy5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0IHRvIGxvYWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkQ2F0ZWdvcnlSZXF1ZXN0RWxlbWVudHMoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wYXJzZWRSZXF1ZXN0c1tpbmRleF0gYXMgQ2F0ZWdvcnlSZXF1ZXN0RGF0YTtcblxuICAgICAgICBjb25zdCBkZXRhaWxzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QnKTtcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlU2l6ZSgpLCAwKSk7XG5cbiAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmlubmVySFRNTCA9IGA8Yj5DYXRlZ29yeToke3JlcXVlc3QuY2F0ZWdvcnl9PC9iPmA7XG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdEluZm9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvJyk7XG5cbiAgICAgICAgY29uc3Qgbm9uZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIG5vbmVFbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICBub25lRWxlbWVudC50ZXh0Q29udGVudCA9ICdOb25lJztcblxuICAgICAgICBjb25zdCB1bmtub3duRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdW5rbm93bkVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgIHVua25vd25FbGVtZW50LnRleHRDb250ZW50ID0gJ1Vua25vd24nO1xuXG4gICAgICAgIGNvbnN0IGV4YW1wbGVzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgZXhhbXBsZXNMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgZXhhbXBsZXNMYWJlbC50ZXh0Q29udGVudCA9ICdFeGFtcGxlczogJztcbiAgICAgICAgZXhhbXBsZXNEaXYuYXBwZW5kKGV4YW1wbGVzTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LmV4YW1wbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgZXhhbXBsZV0gb2YgcmVxdWVzdC5leGFtcGxlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoZXhhbXBsZSk7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGV4dENvbnRlbnQgPSBleGFtcGxlO1xuXG4gICAgICAgICAgICAgICAgZXhhbXBsZXNEaXYuYXBwZW5kKGxpbmtFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gcmVxdWVzdC5leGFtcGxlcy5sZW5ndGggLSAxKSBleGFtcGxlc0Rpdi5hcHBlbmQoJywgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2UgZXhhbXBsZXNEaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChleGFtcGxlc0Rpdik7XG5cbiAgICAgICAgY29uc3QgcGFyZW50c0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudHNMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgcGFyZW50c0xhYmVsLnRleHRDb250ZW50ID0gJ1BhcmVudHM6ICc7XG4gICAgICAgIHBhcmVudHNEaXYuYXBwZW5kKHBhcmVudHNMYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QucGFyZW50cy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHBhcmVudF0gb2YgcmVxdWVzdC5wYXJlbnRzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChgQ2F0ZWdvcnk6JHtwYXJlbnR9YCk7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGV4dENvbnRlbnQgPSBwYXJlbnQ7XG5cbiAgICAgICAgICAgICAgICBwYXJlbnRzRGl2LmFwcGVuZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IHJlcXVlc3QucGFyZW50cy5sZW5ndGggLSAxKSBwYXJlbnRzRGl2LmFwcGVuZCgnLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZWxzZSBwYXJlbnRzRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocGFyZW50c0Rpdik7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHJlcXVlc3RlckxhYmVsLnRleHRDb250ZW50ID0gJ1JlcXVlc3RlcjogJztcbiAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdGVyKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ZXJMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsuaHJlZiA9XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0ZXIudHlwZSA9PT0gJ3VzZXInXG4gICAgICAgICAgICAgICAgICAgID8gbXcudXRpbC5nZXRVcmwoYFVzZXI6JHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApXG4gICAgICAgICAgICAgICAgICAgIDogbXcudXRpbC5nZXRVcmwoYFNwZWNpYWw6Q29udHJpYnV0aW9ucy8ke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YCk7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRleHRDb250ZW50ID0gcmVxdWVzdC5yZXF1ZXN0ZXIubmFtZTtcbiAgICAgICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGluayk7XG4gICAgICAgIH0gZWxzZSByZXF1ZXN0ZXJEaXYuYXBwZW5kKHVua25vd25FbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChyZXF1ZXN0ZXJEaXYpO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0SW5mb0VsZW1lbnQpO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdocicpKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXInKTtcblxuICAgICAgICBjb25zdCBhY3Rpb25SYWRpb0lucHV0ID0gbmV3IE9PLnVpLlJhZGlvU2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyddLFxuICAgICAgICAgICAgaXRlbXM6IFsnQWNjZXB0JywgJ0RlbnknLCAnQ29tbWVudCcsICdDbG9zZScsICdOb25lJ10ubWFwKChsYWJlbCkgPT4gbmV3IE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KHsgZGF0YTogbGFiZWwsIGxhYmVsIH0pKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGlvblJhZGlvSW5wdXQuc2VsZWN0SXRlbUJ5TGFiZWwoJ05vbmUnKTtcbiAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5vbignY2hvb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoKSwgMCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IChcbiAgICAgICAgICAgICAgICAoYWN0aW9uUmFkaW9JbnB1dC5maW5kU2VsZWN0ZWRJdGVtKCkgYXMgT08udWkuUmFkaW9PcHRpb25XaWRnZXQpLmdldERhdGEoKSBhcyBzdHJpbmdcbiAgICAgICAgICAgICkudG9Mb3dlckNhc2UoKSBhcyBBY3Rpb25UeXBlO1xuXG4gICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmFjdGlvbiA9IG9wdGlvbjtcblxuICAgICAgICAgICAgaWYgKFsnY29tbWVudCcsICdjbG9zZSddLmluY2x1ZGVzKG9wdGlvbikpIHtcbiAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAoY29tbWVudCkgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgICAgICBlbHNlIGRlbGV0ZSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNvbW1lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgICBkZWxldGUgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5jb21tZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudCwgaW5kZXgpO1xuXG4gICAgICAgICAgICBwYWdlU2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgIGNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICBwYWdlU2VsZWN0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFnZVNlbGVjdElucHV0ID0gbmV3IFBhZ2VJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIHBhZ2VzIGhlcmUnIH0pO1xuICAgICAgICBwYWdlU2VsZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHBhZ2VTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eOi8sICcnKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHBhZ2VTZWxlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICB9KTtcbiAgICAgICAgcGFnZVNlbGVjdElucHV0Lm9uKCdzaG93aW5nLXZhbHVlcycsIChwYWdlczogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHBhZ2VTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhZ2UuZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBhZ2VTZWxlY3QgPSBuZXcgT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlucHV0UG9zaXRpb246ICdvdXRsaW5lJyxcbiAgICAgICAgICAgIGlucHV0V2lkZ2V0OiBwYWdlU2VsZWN0SW5wdXQsXG4gICAgICAgIH0pO1xuICAgICAgICBwYWdlU2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKHBhZ2VTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmICgocGFnZVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSBwYWdlU2VsZWN0LnNldFZhbHVlKHNvcnRlZFRhZ3MpO1xuXG4gICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmV4YW1wbGVzID0gc29ydGVkVGFncztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgeyBleGFtcGxlcyB9ID0gKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgZXhhbXBsZXMpIHBhZ2VTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKGV4YW1wbGUpO1xuICAgICAgICBwYWdlU2VsZWN0LnNldFZhbHVlKGV4YW1wbGVzKTtcblxuICAgICAgICBjb25zdCBwYWdlU2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHBhZ2VTZWxlY3QsIHsgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ1BhZ2VzIHRvIGNhdGVnb3JpemU6JyB9KTtcbiAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcnlTZWxlY3RJbnB1dCA9IG5ldyBDYXRlZ29yeUlucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdBZGQgY2F0ZWdvcmllcyBoZXJlJyB9KTtcbiAgICAgICAgY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gY2F0ZWdvcnlTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eQ2F0ZWdvcnk6LywgJycpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgY2F0ZWdvcnlTZWxlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSBjYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcnlTZWxlY3QgPSBuZXcgT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlucHV0UG9zaXRpb246ICdvdXRsaW5lJyxcbiAgICAgICAgICAgIGlucHV0V2lkZ2V0OiBjYXRlZ29yeVNlbGVjdElucHV0LFxuICAgICAgICB9KTtcbiAgICAgICAgY2F0ZWdvcnlTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSAoY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmICgoY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgY2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0ucGFyZW50cyA9IHNvcnRlZFRhZ3M7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHsgcGFyZW50cyB9ID0gKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRzKSBjYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFyZW50KTtcbiAgICAgICAgY2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUocGFyZW50cyk7XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcnlTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoY2F0ZWdvcnlTZWxlY3QsIHsgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ0NhdGVnb3JpZXM6JyB9KTtcbiAgICAgICAgY2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IGRlbnlSZWFzb24gPSBuZXcgT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogJ2F1dG9maWxsOnVubGlrZWx5JyxcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBbJ2V4aXN0cycsICdleGlzdGluZyBjYXRlZ29yaWVzJ10sXG4gICAgICAgICAgICAgICAgWydlbXB0eScsICdlbXB0eSBzdWJtaXNzaW9ucyddLFxuICAgICAgICAgICAgICAgIFsndW5saWtlbHknLCAnY2F0ZWdvcmllcyB0aGF0IGFyZSB1bmxpa2VseSB0byBoYXZlIGVub3VnaCBwYWdlcyddLFxuICAgICAgICAgICAgICAgIFsnbm90Y2F0ZWdvcnknLCAncGFnZSBjcmVhdGlvbiByZXF1ZXN0cyddLFxuICAgICAgICAgICAgICAgIFsnbm90ZW5nbGlzaCcsICdyZXF1ZXN0cyBub3QgaW4gRW5nbGlzaCddLFxuICAgICAgICAgICAgXS5tYXAoKFt2YWx1ZSwgbGFiZWxdKSA9PiAoeyBkYXRhOiBgYXV0b2ZpbGw6JHt2YWx1ZX1gLCBsYWJlbDogYEF1dG9maWxsZWQgdGV4dCBmb3IgJHtsYWJlbH1gIH0pKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbnlSZWFzb24ub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uZGVueVJlYXNvbiA9IGRlbnlSZWFzb24uZ2V0VmFsdWUoKSB8fCAnYXV0b2ZpbGw6dW5saWtlbHknO1xuICAgICAgICB9KTtcbiAgICAgICAgZGVueVJlYXNvbi5zZXRWYWx1ZSgnYXV0b2ZpbGw6dW5saWtlbHknKTtcbiAgICAgICAgZGVueVJlYXNvbi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgnYXV0b2ZpbGw6dW5saWtlbHknKTtcblxuICAgICAgICBjb25zdCBkZW55UmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGRlbnlSZWFzb24sIHtcbiAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgIGxhYmVsOiAnRGVueSByZWFzb246JyxcbiAgICAgICAgICAgIGhlbHA6ICdTdXBwb3J0cyBhdXRvbWF0aWMgcmVhc29uaW5nLCBjdXN0b20gcmVhc29uaW5nLCBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gd2l0aCBcImF1dG9maWxsOlJFQVNPTiwgQ1VTVE9NXCIgZm9ybWF0JyxcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb24gPSBuZXcgT08udWkuRHJvcGRvd25XaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgbWVudToge1xuICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgIFsnTm8gcmVzcG9uc2UnLCAnciddLFxuICAgICAgICAgICAgICAgICAgICBbJ1N1Y2NlZWRlZCcsICdzJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnV2l0aGRyYXduJywgJ3cnXSxcbiAgICAgICAgICAgICAgICBdLm1hcCgoW3RpdGxlLCBpZF0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YTogaWQsIGxhYmVsOiB0aXRsZSB9KSksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkub24oJ2Nob29zZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpIGFzIE9PLnVpLk1lbnVPcHRpb25XaWRnZXQ7XG5cbiAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY2xvc2luZ1JlYXNvbiA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBzZWxlY3RlZC5nZXRMYWJlbCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBpZDogc2VsZWN0ZWQuZ2V0RGF0YSgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50LCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdyJyk7XG4gICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY2xvc2luZ1JlYXNvbiA9IHsgbmFtZTogJ05vIHJlc3BvbnNlJywgaWQ6ICdyJyB9O1xuXG4gICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb25MYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoY2xvc2luZ1JlYXNvbiwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnQ2xvc2luZyByZWFzb246JyB9KTtcbiAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgY29uc3QgY29tbWVudElucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCgpO1xuICAgICAgICBjb21tZW50SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50KSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICAgICAgZWxzZSBkZWxldGUgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5jb21tZW50O1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjb21tZW50SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoY29tbWVudElucHV0LCB7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNvbW1lbnQtaW5wdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgIGxhYmVsOiAnQ29tbWVudDonLFxuICAgICAgICB9KTtcbiAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5hcHBlbmQoXG4gICAgICAgICAgICBhY3Rpb25SYWRpb0lucHV0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIGNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICk7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RSZXNwb25kZXJFbGVtZW50KTtcblxuICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQoZGV0YWlsc0VsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGNvbG9yIG9mIGEgZGV0YWlscyBlbGVtZW50IGJhc2VkIG9uIHRoZSBoYW5kbGluZyBvZiB0aGUgcmVxdWVzdHMgaW5zaWRlLlxuICAgICAqIEBwYXJhbSBkZXRhaWxzRWxlbWVudCBUaGUgZGV0YWlscyBlbGVtZW50IHRvIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZWRpcmVjdCB0YXJnZXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQ6IEhUTUxEZXRhaWxzRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0UGFnZVR5cGUgPT09ICdyZWRpcmVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbnNUb1Rha2UgPSBPYmplY3QudmFsdWVzKCh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHMpO1xuXG4gICAgICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkID0gYWN0aW9uc1RvVGFrZS5ldmVyeSgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JyB8fCBhY3Rpb24uYWN0aW9uID09PSAnZGVueScpO1xuXG4gICAgICAgICAgICBjb25zdCBmaXJzdENsb3NlUmVhc29uID0gYWN0aW9uc1RvVGFrZS5maW5kKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScpPy5jbG9zaW5nUmVhc29uPy5pZDtcbiAgICAgICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQ2xvc2VkID0gYWN0aW9uc1RvVGFrZS5ldmVyeShcbiAgICAgICAgICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnICYmIGFjdGlvbi5jbG9zaW5nUmVhc29uPy5pZCA9PT0gZmlyc3RDbG9zZVJlYXNvbixcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCBiYWNrZ3JvdW5kQ29sb3IgPSAnJztcblxuICAgICAgICAgICAgaWYgKGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY2NlcHRlZENvdW50ID0gYWN0aW9uc1RvVGFrZS5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBkZW5pZWRDb3VudCA9IGFjdGlvbnNUb1Rha2UuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55JykubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkQ291bnQgPiAwICYmIGRlbmllZENvdW50ID4gMCkgYmFja2dyb3VuZENvbG9yID0gJyNmZmYxN2UnO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFjY2VwdGVkQ291bnQgPiAwKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2EwZmZhMCc7XG4gICAgICAgICAgICAgICAgZWxzZSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFsbFJlcXVlc3RzQ2xvc2VkKVxuICAgICAgICAgICAgICAgIGlmIChmaXJzdENsb3NlUmVhc29uID09PSAncicpIGJhY2tncm91bmRDb2xvciA9ICcjZmZjZWNlJztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmaXJzdENsb3NlUmVhc29uID09PSAncycpIGJhY2tncm91bmRDb2xvciA9ICcjOTBjMDkwJztcbiAgICAgICAgICAgICAgICBlbHNlIGJhY2tncm91bmRDb2xvciA9ICcjYjhiOGI4JztcblxuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeyBhY3Rpb24gfSA9ICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF07XG5cbiAgICAgICAgICAgIGxldCBiYWNrZ3JvdW5kQ29sb3IgPSAnJztcblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLXN3aXRjaFxuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2FjY2VwdCcpIGJhY2tncm91bmRDb2xvciA9ICcjYTBmZmEwJztcbiAgICAgICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2RlbnknKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdjbG9zZScpXG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY2xvc2luZ1JlYXNvbj8uaWQgPT09ICdyJykgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY2xvc2luZ1JlYXNvbj8uaWQgPT09ICdzJykgYmFja2dyb3VuZENvbG9yID0gJyM5MGMwOTAnO1xuICAgICAgICAgICAgICAgIGVsc2UgYmFja2dyb3VuZENvbG9yID0gJyNiOGI4YjgnO1xuXG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhbGwgYWN0aW9ucyBhbmQgbG9ncyB0aGVpciByZXN1bHRzLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcGVyZm9ybUFjdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICBjb25zdCBzaG93QWN0aW9uc0RpYWxvZyA9IG5ldyBTaG93QWN0aW9uc0RpYWxvZygpO1xuICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3Nob3dBY3Rpb25zRGlhbG9nXSk7XG4gICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLm9wZW4oKTtcblxuICAgICAgICBjb25zdCBjb3VudHMgPSB7ICdhY2NlcHRlZCc6IDAsICdkZW5pZWQnOiAwLCAnY29tbWVudGVkIG9uJzogMCwgJ2Nsb3NlZCc6IDAgfTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cblxuICAgICAgICBsZXQgbmV3UGFnZVRleHQgPSAoXG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICkucXVlcnkucGFnZXNbMF0ucmV2aXNpb25zWzBdLnNsb3RzLm1haW4uY29udGVudC50cmltKCk7XG5cbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdFBhZ2VUeXBlID09PSAncmVkaXJlY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBhbnlSZXF1ZXN0SGFuZGxlZCA9ICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKS5zb21lKChhY3Rpb25EYXRhKSA9PlxuICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoYWN0aW9uRGF0YS5yZXF1ZXN0cykuc29tZSgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uICE9PSAnbm9uZScpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGFueVJlcXVlc3RIYW5kbGVkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB7IHRhcmdldCwgcmVxdWVzdHMgfSBvZiB0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQgPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzKS5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcgfHwgYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JyB8fCBhY3Rpb24uYWN0aW9uID09PSAnZGVueScsXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDbG9zZVJlYXNvbiA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMpLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyk/LmNsb3NpbmdSZWFzb24/LmlkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0Nsb3NlZCA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMpLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyAmJiBhY3Rpb24uY2xvc2luZ1JlYXNvbj8uaWQgPT09IGZpcnN0Q2xvc2VSZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRQYWdlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZW5pZWRQYWdlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFtb3VudE9mUGFnZXMgPSBPYmplY3Qua2V5cyhyZXF1ZXN0cykubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKHJlcXVlc3RzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQgJiYgIWFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgYWNjZXB0ZWQgb3IgZGVuaWVkLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIHdpbGwgYmUgaWdub3JlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0ZWRQYWdlcy5wdXNoKHJlcXVlc3RlZFRpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uY29tbWVudCkgY29tbWVudHMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5jb21tZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuYWNjZXB0ZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCAmJiAhYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBOb3QgYWxsIHJlcXVlc3RzIHRvIFwiJHt0YXJnZXR9XCIgd2VyZSBhY2NlcHRlZCBvciBkZW5pZWQsIHRoZSBoYW5kbGluZyBvZiBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgaXMgYmVpbmcgaWdub3JlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVuaWVkUGFnZXMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5kZW55UmVhc29uIV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmRlbmllZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5jb21tZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbJ2NvbW1lbnRlZCBvbiddKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSByZXF1ZXN0IHRvIGNyZWF0ZSBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgXHUyMTkyIFwiJHt0YXJnZXR9XCIgd2FzIG1hcmtlZCB0byBiZSBjb21tZW50ZWQgb24sIGJ1dCBubyBjb21tZW50IHdhcyBwcm92aWRlZCBzbyBpdCB3aWxsIGJlIHNraXBwZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbFJlcXVlc3RzQ2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNvbW1lbnQpIGNvbW1lbnRzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uY29tbWVudF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmNsb3NlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBOb3QgYWxsIHJlcXVlc3RzIHRvIFwiJHt0YXJnZXR9XCIgd2VyZSBjbG9zZWQgd2l0aCB0aGUgc2FtZSByZWFzb24sIHRoZSBoYW5kbGluZyBvZiBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgaXMgYmVpbmcgaWdub3JlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VjdGlvbkRhdGEgPSB7IHBhZ2VUZXh0OiBuZXdQYWdlVGV4dCwgLi4uT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cylbMF0ub3JpZ2luYWxUZXh0IH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IHRoaXMubWFwQ29tbWVudHMoY29tbWVudHMsIGFtb3VudE9mUGFnZXMgPT09IDEsIGNvbW1lbnRzLmxlbmd0aCA9PT0gYW1vdW50T2ZQYWdlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsb3NpbmdJZDogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAwICYmIGRlbmllZFBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nSWQgPSAncCc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2NlcHRlZFBhZ2VzTWVzc2FnZSA9IGAqIHt7c3Vic3Q6QWZDIHJlZGlyZWN0fX0gKCR7YWNjZXB0ZWRQYWdlcy5tYXAoKHBhZ2UpID0+IGBbWyR7cGFnZX1dXWApLmpvaW4oJywgJyl9KSB+fn5+YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZW5pZWRQYWdlc01lc3NhZ2UgPSB0aGlzLm1hcERlbmllZFJlYXNvbnMoZGVuaWVkUGFnZXMsIGZhbHNlLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgYWNjZXB0ZWRQYWdlcykgdGhpcy5oYW5kbGVBY2NlcHRlZFJlZGlyZWN0KHBhZ2UsIHJlcXVlc3RzW3BhZ2VdLCB0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogYCR7YWNjZXB0ZWRQYWdlc01lc3NhZ2V9XFxuJHtkZW5pZWRQYWdlc01lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0lkID0gJ2EnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIGFjY2VwdGVkUGFnZXMpIHRoaXMuaGFuZGxlQWNjZXB0ZWRSZWRpcmVjdChwYWdlLCByZXF1ZXN0c1twYWdlXSwgdGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAqIHt7c3Vic3Q6QWZDIHJlZGlyZWN0JHthY2NlcHRlZFBhZ2VzLmxlbmd0aCA+IDEgPyAnfGFsbCcgOiAnJ319fSB+fn5+YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0lkID0gJ2QnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogdGhpcy5tYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzLCBhbW91bnRPZlBhZ2VzID09PSAxLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7IHByZXBlbmQ6IGB7e0FmQy1jfCR7Y2xvc2luZ0lkfX19YCwgYXBwZW5kOiAne3tBZkMtY3xifX0nIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFsbFJlcXVlc3RzQ2xvc2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogYHt7QWZDLWN8JHtmaXJzdENsb3NlUmVhc29ufX19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6ICd7e0FmQy1jfGJ9fScsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBuZXdQYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJlZm9yZVRleHQgKyB0aGlzLnBhZ2VDb250ZW50ID09PSBuZXdQYWdlVGV4dClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCAocGFnZSBjb250ZW50IGlkZW50aWNhbCkhJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRDb3VudHMgPSBPYmplY3QuZW50cmllcyhjb3VudHMpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKFssIGNvdW50XSkgPT4gY291bnQgPiAwKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChbYWN0aW9uLCBjb3VudF0pID0+IGAke2FjdGlvbn0gJHtjb3VudH1gKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdHNDcmVhdGlvbnNUb01ha2UucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBuZXdQYWdlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBIYW5kbGluZyBBZkMgcmVkaXJlY3QgcmVxdWVzdHMgKCR7bWFwcGVkQ291bnRzfSkke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZUFsbEVkaXRzQ3JlYXRpb25zKHNob3dBY3Rpb25zRGlhbG9nKTtcblxuICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdBbGwgY2hhbmdlcyBtYWRlLCBjbGljayBiZWxvdyB0byByZWxvYWQhJywgJ3N1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLnNob3dSZWxvYWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIGhhbmRsZWQhJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBhbnlSZXF1ZXN0SGFuZGxlZCA9ICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKS5zb21lKChhY3Rpb25EYXRhKSA9PiBhY3Rpb25EYXRhLmFjdGlvbiAhPT0gJ25vbmUnKTtcblxuICAgICAgICAgICAgaWYgKGFueVJlcXVlc3RIYW5kbGVkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhY3Rpb25EYXRhIG9mIHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlY3Rpb25EYXRhID0geyBwYWdlVGV4dDogbmV3UGFnZVRleHQsIC4uLmFjdGlvbkRhdGEub3JpZ2luYWxUZXh0IH07XG5cbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb25EYXRhLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kOiAne3tBZkMtY3xhfX0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6ICcqIHt7c3Vic3Q6QWZDIGNhdGVnb3J5fX0gfn5+flxcbnt7QWZDLWN8Yn19JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQWNjZXB0ZWRDYXRlZ29yeShhY3Rpb25EYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5hY2NlcHRlZCsrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kOiAne3tBZkMtY3xkfX0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAqICR7dGhpcy5mb3JtYXREZW5pZWRSZWFzb24oYWN0aW9uRGF0YS5kZW55UmVhc29uISl9IH5+fn5cXG57e0FmQy1jfGJ9fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuZGVuaWVkKys7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkRhdGEuY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogYCoge3tBZkMgY29tbWVudHwxPSR7YWN0aW9uRGF0YS5jb21tZW50fX19IH5+fn5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbJ2NvbW1lbnRlZCBvbiddKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSByZXF1ZXN0IHRvIGNyZWF0ZSBcIiR7YWN0aW9uRGF0YS5jYXRlZ29yeX1cIiB3YXMgbWFya2VkIHRvIGJlIGNvbW1lbnRlZCBvbiwgYnV0IG5vIGNvbW1lbnQgd2FzIHByb3ZpZGVkIHNvIGl0IHdpbGwgYmUgc2tpcHBlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogYHt7QWZDLWN8JHthY3Rpb25EYXRhLmNsb3NpbmdSZWFzb24hLmlkfX19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiAoYWN0aW9uRGF0YS5jb21tZW50ID8gYCoge3tBZkMgY29tbWVudHwxPSR7YWN0aW9uRGF0YS5jb21tZW50fX19IH5+fn5gIDogJycpICsgJ1xcbnt7QWZDLWN8Yn0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmNsb3NlZCsrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBuZXdQYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJlZm9yZVRleHQgKyB0aGlzLnBhZ2VDb250ZW50ID09PSBuZXdQYWdlVGV4dClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCAocGFnZSBjb250ZW50IGlkZW50aWNhbCkhJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRDb3VudHMgPSBPYmplY3QuZW50cmllcyhjb3VudHMpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKFssIGNvdW50XSkgPT4gY291bnQgPiAwKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChbYWN0aW9uLCBjb3VudF0pID0+IGAke2FjdGlvbn0gJHtjb3VudH1gKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdHNDcmVhdGlvbnNUb01ha2UucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBuZXdQYWdlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBIYW5kbGluZyBBZkMgY2F0ZWdvcnkgcmVxdWVzdHMgKCR7bWFwcGVkQ291bnRzfSkke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZUFsbEVkaXRzQ3JlYXRpb25zKHNob3dBY3Rpb25zRGlhbG9nKTtcblxuICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdBbGwgY2hhbmdlcyBtYWRlLCBjbGljayBiZWxvdyB0byByZWxvYWQhJywgJ3N1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLnNob3dSZWxvYWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIGhhbmRsZWQhJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIGEgcmVxdWVzdCBkZW5pYWwgcmVhc29uIHRvIGEge3tzdWJzdDpBZkMgcmVkaXJlY3R9fSBjYWxsLlxuICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiB0byBmb3JtYXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmb3JtYXREZW5pZWRSZWFzb24ocmVhc29uOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVQYXJhbWV0ZXJzID0gcmVhc29uLnN0YXJ0c1dpdGgoJ2F1dG9maWxsOicpID8gL2F1dG9maWxsOihcXHcrKS8uZXhlYyhyZWFzb24pIVsxXSA6IGBkZWNsaW5lfDI9JHtyZWFzb259YDtcblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVhc29uaW5nID0gcmVhc29uLmluY2x1ZGVzKCcsJykgPyAnICcgKyByZWFzb24uc2xpY2UocmVhc29uLmluZGV4T2YoJywnKSArIDEpLnRyaW0oKSA6ICcnO1xuXG4gICAgICAgIHJldHVybiBge3tzdWJzdDpBZkMgJHt0aGlzLnJlcXVlc3RQYWdlVHlwZX18JHt0ZW1wbGF0ZVBhcmFtZXRlcnN9fX0ke2FkZGl0aW9uYWxSZWFzb25pbmd9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIGEgZ3JvdXAgb2YgZGVuaWVkIHJlYXNvbnMuXG4gICAgICogQHBhcmFtIGRlbmllZFBhZ2VzIFRoZSBwYWdlcyB0byBtYXAuXG4gICAgICogQHBhcmFtIHNpbmd1bGFyUmVxdWVzdCBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIHRoZSBvbmx5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGFsbFJlcXVlc3RzIFdoZXRoZXIgYWxsIHJlcXVlc3RzIGFyZSBiZWluZyBtYXBwZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBtYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzOiBzdHJpbmdbXVtdLCBzaW5ndWxhclJlcXVlc3Q6IGJvb2xlYW4sIGFsbFJlcXVlc3RzOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzaW5ndWxhclJlcXVlc3QpIHJldHVybiBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKGRlbmllZFBhZ2VzWzBdWzFdKX0gfn5+fmA7XG5cbiAgICAgICAgY29uc3QgcmVhc29uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBbcGFnZSwgcmVhc29uXSBvZiBkZW5pZWRQYWdlcykge1xuICAgICAgICAgICAgaWYgKCFyZWFzb25zW3JlYXNvbl0pIHJlYXNvbnNbcmVhc29uXSA9IFtdO1xuICAgICAgICAgICAgcmVhc29uc1tyZWFzb25dLnB1c2gocGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWFzb25zQXJyYXkgPSBPYmplY3QuZW50cmllcyhyZWFzb25zKTtcblxuICAgICAgICByZXR1cm4gcmVhc29uc0FycmF5XG4gICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgIChbcmVhc29uLCBwYWdlc10pID0+XG4gICAgICAgICAgICAgICAgICAgIGAqICR7dGhpcy5mb3JtYXREZW5pZWRSZWFzb24ocmVhc29uKX0ke3JlYXNvbnNBcnJheS5sZW5ndGggPiAxIHx8ICFhbGxSZXF1ZXN0cyA/IGAgKCR7cGFnZXMubWFwKChwYWdlKSA9PiBgW1ske3BhZ2V9XV1gKS5qb2luKCcsICcpfSlgIDogJyd9IH5+fn5gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcHMgYSBncm91cCBvZiBjb21tZW50cy5cbiAgICAgKiBAcGFyYW0gY29tbWVudHMgVGhlIGNvbW1lbnRzIHRvIG1hcC5cbiAgICAgKiBAcGFyYW0gc2luZ3VsYXJSZXF1ZXN0IFdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgdGhlIG9ubHkgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gYWxsUmVxdWVzdHMgV2hldGhlciBhbGwgcmVxdWVzdHMgYXJlIGJlaW5nIG1hcHBlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIG1hcENvbW1lbnRzKGNvbW1lbnRzOiBzdHJpbmdbXVtdLCBzaW5ndWxhclJlcXVlc3Q6IGJvb2xlYW4sIGFsbFJlcXVlc3RzOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzaW5ndWxhclJlcXVlc3QpIHJldHVybiBgKiB7e0FmQyBjb21tZW50fDE9JHtjb21tZW50c1swXVsxXX19fSB+fn5+YDtcblxuICAgICAgICBjb25zdCBjb21tZW50TWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgW3BhZ2UsIGNvbW1lbnRdIG9mIGNvbW1lbnRzKSB7XG4gICAgICAgICAgICBpZiAoIWNvbW1lbnRNZXNzYWdlc1tjb21tZW50XSkgY29tbWVudE1lc3NhZ2VzW2NvbW1lbnRdID0gW107XG4gICAgICAgICAgICBjb21tZW50TWVzc2FnZXNbY29tbWVudF0ucHVzaChwYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbW1lbnRzQXJyYXkgPSBPYmplY3QuZW50cmllcyhjb21tZW50TWVzc2FnZXMpO1xuXG4gICAgICAgIHJldHVybiBjb21tZW50c0FycmF5XG4gICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgIChbY29tbWVudCwgcGFnZXNdKSA9PlxuICAgICAgICAgICAgICAgICAgICBgKiB7e0FmQyBjb21tZW50fDE9JHtjb21tZW50fX19JHtjb21tZW50c0FycmF5Lmxlbmd0aCA+IDEgfHwgIWFsbFJlcXVlc3RzID8gYCAoJHtwYWdlcy5tYXAoKHBhZ2UpID0+IGBbWyR7cGFnZX1dXWApLmpvaW4oJywgJyl9KWAgOiAnJ30gfn5+fmAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW9kaWZpZXMgYSBnaXZlbiBzZWN0aW9uIHRleHQgd2l0aCBwcmVwZW5kZWQgYW5kIGFwcGVuZGVkIHRleHQuXG4gICAgICogQHBhcmFtIHNlY3Rpb25EYXRhIFRoZSBzZWN0aW9uIGRhdGEuXG4gICAgICogQHBhcmFtIGNoYW5nZXMgVGhlIHByZXBlbmRpbmcgYW5kIGFwcGVuZGluZyB0ZXh0LlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzLnByZXBlbmQgVGhlIHRleHQgdG8gcHJlcGVuZCB0byB0aGUgc2VjdGlvbiB0ZXh0LlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzLmFwcGVuZCBUaGUgdGV4dCB0byBhcHBlbmQgdG8gdGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKi9cbiAgICBwcml2YXRlIG1vZGlmeVNlY3Rpb25EYXRhKFxuICAgICAgICBzZWN0aW9uRGF0YTogeyBwYWdlVGV4dDogc3RyaW5nIH0gJiBBY3Rpb25bJ29yaWdpbmFsVGV4dCddLFxuICAgICAgICB7IHByZXBlbmQsIGFwcGVuZCB9OiB7IHByZXBlbmQ/OiBzdHJpbmc7IGFwcGVuZD86IHN0cmluZyB9LFxuICAgICkge1xuICAgICAgICBjb25zdCB7IGZ1bGxTZWN0aW9uVGV4dDogb2xkRnVsbFNlY3Rpb25UZXh0LCBzZWN0aW9uVGV4dDogb2xkU2VjdGlvblRleHQgfSA9IHNlY3Rpb25EYXRhO1xuXG4gICAgICAgIGlmIChwcmVwZW5kKSBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dCA9IHByZXBlbmQgKyAnXFxuJyArIHNlY3Rpb25EYXRhLnNlY3Rpb25UZXh0O1xuICAgICAgICBpZiAoYXBwZW5kKSBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dCArPSAnXFxuJyArIGFwcGVuZDtcblxuICAgICAgICBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQgPSBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQucmVwbGFjZShvbGRTZWN0aW9uVGV4dCwgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQpO1xuXG4gICAgICAgIHNlY3Rpb25EYXRhLnBhZ2VUZXh0ID0gc2VjdGlvbkRhdGEucGFnZVRleHQucmVwbGFjZShvbGRGdWxsU2VjdGlvblRleHQsIHNlY3Rpb25EYXRhLmZ1bGxTZWN0aW9uVGV4dCk7XG5cbiAgICAgICAgcmV0dXJuIHNlY3Rpb25EYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIHBhZ2VzIHJlbGF0ZWQgdG8gYW4gYWNjZXB0ZWQgcmVkaXJlY3QgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcmVxdWVzdGVkIHBhZ2UuXG4gICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvZiB0aGUgcmVxdWVzdGVkIHBhZ2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSBoYW5kbGVBY2NlcHRlZFJlZGlyZWN0KHBhZ2U6IHN0cmluZywgZGF0YTogUmVkaXJlY3RBY3Rpb24sIHRhcmdldDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRhZ3NXaXRoQXJndW1lbnRzID1cbiAgICAgICAgICAgIGRhdGEucmVkaXJlY3RUZW1wbGF0ZXMgJiYgZGF0YS5yZWRpcmVjdFRlbXBsYXRlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBkYXRhLnJlZGlyZWN0VGVtcGxhdGVzLm1hcCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRBcmd1bWVudEVkaXRvciA9IGRhdGEucmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM/LmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kQXJndW1lbnRFZGl0b3IpIHJldHVybiBge3ske3RhZ319fWA7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXggPSBmb3VuZEFyZ3VtZW50RWRpdG9yLnBhcmFtZXRlcnMuZmluZExhc3RJbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtZXRlciwgaW5kZXgpID0+IHBhcmFtZXRlci5uYW1lID09PSAoaW5kZXggKyAxKS50b1N0cmluZygpICYmIHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCksXG4gICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZEFyZ3VtZW50cyA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlICYmIGluZGV4ID4gbGFzdE51bWJlclBhcmFtZXRlckluZGV4KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB8JHtwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSA/ICcnIDogYCR7cGFyYW1ldGVyLm5hbWV9PWB9JHt2YWx1ZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBge3ske3RhZ30ke21hcHBlZEFyZ3VtZW50c319fWA7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICBjb25zdCB0aXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHBhZ2UpITtcblxuICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgdGV4dDogYCNSRURJUkVDVCBbWyR7dGFyZ2V0fV1dJHt0YWdzV2l0aEFyZ3VtZW50cyA/IGBcXG5cXG57e1JlZGlyZWN0IGNhdGVnb3J5IHNoZWxsfFxcbiR7dGFnc1dpdGhBcmd1bWVudHMuam9pbignXFxuJyl9XFxufX1gIDogJyd9YCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQ3JlYXRpbmcgcmVkaXJlY3QgdG8gW1ske3RhcmdldH1dXSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvUl1dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIHRleHQ6IGB7e1dpa2lQcm9qZWN0IGJhbm5lciBzaGVsbHxcXG57e1dpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnx0cz17e3N1YnN0OkxPQ0FMVElNRVNUQU1QfX18cmV2aWV3ZXI9JHttdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJyl9fX1cXG59fWAsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogYEFkZGluZyBbW1dpa2lwZWRpYTpXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb258V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9uXV0gYmFubmVyJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgcGFnZXMgcmVsYXRlZCB0byBhbiBhY2NlcHRlZCBjYXRlZ29yeSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIG9mIHRoZSByZXF1ZXN0ZWQgY2F0ZWdvcnkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBoYW5kbGVBY2NlcHRlZENhdGVnb3J5KGRhdGE6IENhdGVnb3J5QWN0aW9uKSB7XG4gICAgICAgIHRoaXMuZWRpdHNDcmVhdGlvbnNUb01ha2UucHVzaChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICBpc1JlZGlyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogYENhdGVnb3J5OiR7ZGF0YS5jYXRlZ29yeX1gLFxuICAgICAgICAgICAgICAgIHRleHQ6IGRhdGEucGFyZW50cy5tYXAoKHBhcmVudCkgPT4gYFtbQ2F0ZWdvcnk6JHtwYXJlbnR9XV1gKS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQ3JlYXRpbmcgY2F0ZWdvcnkgYXMgcmVxdWVzdGVkIGF0IFtbV1A6QUZDL0NdXSR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgICAgIGlzUmVkaXJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiBgQ2F0ZWdvcnkgdGFsazoke2RhdGEuY2F0ZWdvcnl9YCxcbiAgICAgICAgICAgICAgICB0ZXh0OiBge3tXaWtpUHJvamVjdCBiYW5uZXIgc2hlbGx8XFxue3tXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb258dHM9e3tzdWJzdDpMT0NBTFRJTUVTVEFNUH19fHJldmlld2VyPSR7bXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpfX19XFxufX1gLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZGRpbmcgW1tXaWtpcGVkaWE6V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufFdpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbl1dIGJhbm5lciR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uZGF0YS5leGFtcGxlcy5tYXAoKGV4YW1wbGUpID0+ICh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2VkaXQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgIHRpdGxlOiBleGFtcGxlLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogKHsgY29udGVudCB9OiB7IGNvbnRlbnQ6IHN0cmluZyB9KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgJHtjb250ZW50fVxcbltbQ2F0ZWdvcnk6JHtkYXRhLmNhdGVnb3J5fV1dYCxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEFkZGluZyBwYWdlIHRvIFtbOkNhdGVnb3J5OiR7ZGF0YS5jYXRlZ29yeX1dXSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvQ11dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhbGwgZWRpdHMgYW5kIGNyZWF0aW9ucyB0aGF0IG5lZWQgdG8gYmUgbWFkZS5cbiAgICAgKiBAcGFyYW0gc2hvd0FjdGlvbnNEaWFsb2cgVGhlIGRpYWxvZyB0byBsb2cgdGhlIHJlc3VsdHMgdG8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBtYWtlQWxsRWRpdHNDcmVhdGlvbnMoc2hvd0FjdGlvbnNEaWFsb2c6IFNob3dBY3Rpb25zRGlhbG9nKSB7XG4gICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHRoaXMuZWRpdHNDcmVhdGlvbnNUb01ha2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGFwaUZ1bmN0aW9uID1cbiAgICAgICAgICAgICAgICBhY3Rpb24udHlwZSA9PT0gJ2VkaXQnXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5hcGkuZWRpdChhY3Rpb24udGl0bGUsIGFjdGlvbi50cmFuc2Zvcm0pXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5hcGkuY3JlYXRlKGFjdGlvbi50aXRsZSwgeyBzdW1tYXJ5OiBhY3Rpb24uc3VtbWFyeSwgd2F0Y2hsaXN0OiB0aGlzLmNyZWF0ZWRQYWdlV2F0Y2hNZXRob2QgfSwgYWN0aW9uLnRleHQpO1xuXG4gICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKGFjdGlvbi50aXRsZSwgJ2lzUmVkaXJlY3QnIGluIGFjdGlvbiAmJiBhY3Rpb24uaXNSZWRpcmVjdCA/IHsgcmVkaXJlY3Q6ICdubycgfSA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC50ZXh0Q29udGVudCA9IGFjdGlvbi50aXRsZTtcblxuICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoYCR7YWN0aW9uLnR5cGUgPT09ICdlZGl0JyA/ICdFZGl0aW5nJyA6ICdDcmVhdGluZyd9ICR7bGlua0VsZW1lbnQub3V0ZXJIVE1MfS4uLmApO1xuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgICAgYXdhaXQgYXBpRnVuY3Rpb24uY2F0Y2goYXN5bmMgKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdyYXRlbGltaXRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICBgUmF0ZSBsaW1pdGVkLiBXYWl0aW5nIGZvciA3MCBzZWNvbmRzLi4uIChyZXN1bWluZyBhdCAke25ldyBEYXRlKERhdGUubm93KCkgKyA3MF8wMDApLnRvTG9jYWxlVGltZVN0cmluZygpfSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA3MF8wMDApKTtcblxuICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnQ29udGludWluZy4uLicsICdzdWNjZXNzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpRnVuY3Rpb24uY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yICR7YWN0aW9uLnR5cGUgPT09ICdlZGl0JyA/ICdlZGl0aW5nJyA6ICdjcmVhdGluZyd9ICR7bGlua0VsZW1lbnQub3V0ZXJIVE1MfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgJHthY3Rpb24udHlwZSA9PT0gJ2VkaXQnID8gJ2VkaXRpbmcnIDogJ2NyZWF0aW5nJ30gJHtsaW5rRWxlbWVudC5vdXRlckhUTUx9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IEFmY3JjSGVscGVyRGlhbG9nIGZyb20gJy4vYWZjcmMtaGVscGVyLWRpYWxvZyc7XG5cbmV4cG9ydCB0eXBlIFdhdGNoTWV0aG9kID0gJ25vY2hhbmdlJyB8ICdwcmVmZXJlbmNlcycgfCAndW53YXRjaCcgfCAnd2F0Y2gnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIGFmY3JjQ29uZmlndXJhdGlvbj86IHsgY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZD86IFdhdGNoTWV0aG9kIH07XG4gICAgfVxufVxuXG5tdy5sb2FkZXIudXNpbmcoWydtZWRpYXdpa2kudXRpbCcsICdvb2pzLXVpLWNvcmUnLCAnb29qcy11aS13aWRnZXRzJywgJ29vanMtdWktd2luZG93cyddLCAoKSA9PiB7XG4gICAgY29uc3QgcGFnZU5hbWUgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICBjb25zdCBpc1JlZGlyZWN0UmVxdWVzdFBhZ2UgPSBwYWdlTmFtZSA9PT0gJ1dpa2lwZWRpYTpBcnRpY2xlcyBmb3IgY3JlYXRpb24vUmVkaXJlY3RzJztcbiAgICBjb25zdCBpc0NhdGVnb3J5UmVxdWVzdFBhZ2UgPSBwYWdlTmFtZSA9PT0gJ1dpa2lwZWRpYTpBcnRpY2xlcyBmb3IgY3JlYXRpb24vQ2F0ZWdvcmllcyc7XG5cbiAgICBpZiAoIWlzUmVkaXJlY3RSZXF1ZXN0UGFnZSAmJiAhaXNDYXRlZ29yeVJlcXVlc3RQYWdlKSByZXR1cm47XG5cbiAgICBjb25zdCByZXF1ZXN0UGFnZVR5cGUgPSBpc1JlZGlyZWN0UmVxdWVzdFBhZ2UgPyAncmVkaXJlY3QnIDogJ2NhdGVnb3J5JztcblxuICAgIGNvbnN0IGxpbmsgPSBtdy51dGlsLmFkZFBvcnRsZXRMaW5rKFxuICAgICAgICBtdy5jb25maWcuZ2V0KCdza2luJykgPT09ICdtaW5lcnZhJyA/ICdwLXRiJyA6ICdwLWNhY3Rpb25zJyxcbiAgICAgICAgJyMnLFxuICAgICAgICBgSGFuZGxlICR7cmVxdWVzdFBhZ2VUeXBlfSBjcmVhdGlvbiByZXF1ZXN0c2AsXG4gICAgICAgICdhZmNyYy1oZWxwZXInLFxuICAgICkhO1xuXG4gICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICBjb25zdCBhZmNyY0hlbHBlckRpYWxvZyA9IG5ldyBBZmNyY0hlbHBlckRpYWxvZyhyZXF1ZXN0UGFnZVR5cGUsIHBhZ2VOYW1lLCB3aW5kb3cuYWZjcmNDb25maWd1cmF0aW9uPy5jcmVhdGVkUGFnZVdhdGNoTWV0aG9kKTtcblxuICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW2FmY3JjSGVscGVyRGlhbG9nXSk7XG5cbiAgICAgICAgYWZjcmNIZWxwZXJEaWFsb2cub3BlbigpO1xuICAgICAgICBhZmNyY0hlbHBlckRpYWxvZy5sb2FkKCk7XG4gICAgfSk7XG59KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7OzttQkFN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LENBQ0osQ0FBQyxHQUVEdkMsRUFBa0IsWUFDZCxTQUFTeEcsRUFBTyxPQUFTLE9BQVMsVUFBWSxVQUFVLElBQUk2QixFQUFZLFNBQVMsS0FBS21ILEdBQVcsTUFBTSxNQUFRLGVBQWUsS0FBS0QsQ0FBUyxLQUM1SSxPQUNKLENBQ1IsQ0FBQyxDQUNMLENBQ0osQ0FDSixFQzNoREEsR0FBRyxPQUFPLE1BQU0sQ0FBQyxpQkFBa0IsZUFBZ0Isa0JBQW1CLGlCQUFpQixFQUFHLElBQU0sQ0FDNUYsSUFBTUcsRUFBVyxHQUFHLE9BQU8sSUFBSSxZQUFZLEVBQUUsV0FBVyxJQUFLLEdBQUcsRUFFMURDLEVBQXdCRCxJQUFhLDRDQUczQyxHQUFJLENBQUNDLEdBQXlCLEVBRkFELElBQWEsOENBRVcsT0FFdEQsSUFBTUUsRUFBa0JELEVBQXdCLFdBQWEsV0FFaEQsR0FBRyxLQUFLLGVBQ2pCLEdBQUcsT0FBTyxJQUFJLE1BQU0sSUFBTSxVQUFZLE9BQVMsYUFDL0MsSUFDQSxVQUFVQyxDQUFlLHFCQUN6QixjQUNKLEVBRUssaUJBQWlCLFFBQVVDLEdBQVUsQ0FDdENBLEVBQU0sZUFBZSxFQUVyQixJQUFNQyxFQUFnQixJQUFJLEdBQUcsR0FBRyxjQUNoQyxTQUFTLEtBQUssT0FBT0EsRUFBYyxTQUFTLENBQUMsQ0FBQyxFQUU5QyxJQUFNQyxFQUFvQixJQUFJQyxFQUFrQkosRUFBaUJGLEVBQVUsT0FBTyxvQkFBb0Isc0JBQXNCLEVBRTVISSxFQUFjLFdBQVcsQ0FBQ0MsQ0FBaUIsQ0FBQyxFQUU1Q0EsRUFBa0IsS0FBSyxFQUN2QkEsRUFBa0IsS0FBSyxDQUMzQixDQUFDLENBQ0wsQ0FBQyIsCiAgIm5hbWVzIjogWyJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgIl9DYXRlZ29yeUlucHV0V2lkZ2V0IiwgImNvbmZpZyIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJwYXJzZWRUaXRsZSIsICJyZXN1bHQiLCAicGFnZXMiLCAicGFnZSIsICJjYXRlZ29yeSIsICJ0aXRsZVdpdGhvdXROYW1lc3BhY2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJQYWdlSW5wdXRXaWRnZXQiLCAiX1BhZ2VJbnB1dFdpZGdldCIsICJjb25maWciLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAicGFyc2VkVGl0bGUiLCAicmVzdWx0IiwgInBhZ2VzIiwgInBhZ2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJTaG93QWN0aW9uc0RpYWxvZyIsICJfU2hvd0FjdGlvbnNEaWFsb2ciLCAibWVzc2FnZSIsICJ0eXBlIiwgIm1lc3NhZ2VXaWRnZXQiLCAicmVsb2FkQnV0dG9uIiwgIkFmY3JjSGVscGVyRGlhbG9nIiwgIl9BZmNyY0hlbHBlckRpYWxvZyIsICJyZXF1ZXN0UGFnZVR5cGUiLCAicGFnZVRpdGxlIiwgImNyZWF0ZWRXYXRjaE1ldGhvZCIsICJhY3Rpb24iLCAicmVkaXJlY3RUZW1wbGF0ZVJlc3BvbnNlIiwgInBhZ2VSZXZpc2lvbiIsICJzZWN0aW9ucyIsICJtYXRjaCIsICJzZWN0aW9uVGV4dCIsICJzZWN0aW9uSGVhZGVyIiwgInBhcnNlZERhdGEiLCAicmVxdWVzdGVkUGFnZXMiLCAicGFyc2VkVGFyZ2V0IiwgInJlcXVlc3RlciIsICJuYW1lIiwgInBhZ2UiLCAiZm91bmRDYXRlZ29yeSIsICJmaXJzdFVzZXJJbmRleCIsICJmaXJzdFVzZXJUYWxrSW5kZXgiLCAiZmlyc3RJcEluZGV4IiwgImZpcnN0SW5kZXgiLCAiaW5kZXgiLCAiaGFuZGxlIiwgImVuZEluZGV4IiwgInN1YkluZGV4IiwgIm1lc3NhZ2VXaWRnZXQiLCAibWVzc2FnZVdpZGdldExheW91dCIsICJyZXF1ZXN0IiwgImRldGFpbHNFbGVtZW50IiwgInN1bW1hcnlFbGVtZW50IiwgImV2ZW50IiwgInRhcmdldEVkaXRvckVsZW1lbnQiLCAibGlua0VsZW1lbnQiLCAicmVxdWVzdEluZm9FbGVtZW50IiwgIm5vbmVFbGVtZW50IiwgInVua25vd25FbGVtZW50IiwgInJlYXNvbkRpdiIsICJyZWFzb25MYWJlbCIsICJzb3VyY2VEaXYiLCAic291cmNlTGFiZWwiLCAicmVxdWVzdGVyRGl2IiwgInJlcXVlc3RlckxhYmVsIiwgInJlcXVlc3RlckxpbmsiLCAicmVxdWVzdFJlc3BvbmRlckVsZW1lbnQiLCAicmVxdWVzdGVkVGl0bGUiLCAicmVxdWVzdGVkVGl0bGVEaXYiLCAibGFiZWwiLCAidGFnU2VsZWN0TGF5b3V0IiwgInRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciIsICJ0ZW1wbGF0ZUVkaXRvcnNJbmZvIiwgImFjdGlvblJhZGlvSW5wdXQiLCAib3B0aW9uIiwgInRhZ1NlbGVjdCIsICJ0YWciLCAicmVkaXJlY3QiLCAic29ydGVkVGFncyIsICJhIiwgImIiLCAiZWRpdG9ySW5mbyIsICJzaG93blRlbXBsYXRlRWRpdG9ycyIsICJub1RlbXBsYXRlc01lc3NhZ2UiLCAiY29tbWVudElucHV0TGF5b3V0IiwgInRlbXBsYXRlTmFtZSIsICJ0ZW1wbGF0ZURhdGEiLCAicGFyYW1ldGVycyIsICJkZXRhaWxzIiwgInN1bW1hcnkiLCAiZWxlbWVudERhdGEiLCAicGFyYW1ldGVyTmFtZSIsICJwYXJhbWV0ZXJEYXRhIiwgImlucHV0IiwgImlucHV0TGF5b3V0IiwgImNvbW1lbnQiLCAiY29tbWVudElucHV0IiwgImRlbnlSZWFzb25MYXlvdXQiLCAiY2xvc2luZ1JlYXNvbkxheW91dCIsICJkZW55UmVhc29uIiwgInZhbHVlIiwgImNsb3NpbmdSZWFzb24iLCAidGl0bGUiLCAiaWQiLCAic2VsZWN0ZWQiLCAiZXhhbXBsZXNEaXYiLCAiZXhhbXBsZXNMYWJlbCIsICJleGFtcGxlIiwgInBhcmVudHNEaXYiLCAicGFyZW50c0xhYmVsIiwgInBhcmVudCIsICJwYWdlU2VsZWN0TGF5b3V0IiwgImNhdGVnb3J5U2VsZWN0TGF5b3V0IiwgInBhZ2VTZWxlY3RJbnB1dCIsICJQYWdlSW5wdXRXaWRnZXQiLCAicGFnZXMiLCAicGFnZVNlbGVjdCIsICJleGFtcGxlcyIsICJjYXRlZ29yeVNlbGVjdElucHV0IiwgIkNhdGVnb3J5SW5wdXRXaWRnZXQiLCAiY2F0ZWdvcnlTZWxlY3QiLCAicGFyZW50cyIsICJhY3Rpb25zVG9UYWtlIiwgImFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQiLCAiZmlyc3RDbG9zZVJlYXNvbiIsICJhbGxSZXF1ZXN0c0Nsb3NlZCIsICJiYWNrZ3JvdW5kQ29sb3IiLCAiYWNjZXB0ZWRDb3VudCIsICJkZW5pZWRDb3VudCIsICJ3aW5kb3dNYW5hZ2VyIiwgInNob3dBY3Rpb25zRGlhbG9nIiwgIlNob3dBY3Rpb25zRGlhbG9nIiwgImNvdW50cyIsICJuZXdQYWdlVGV4dCIsICJhY3Rpb25EYXRhIiwgInRhcmdldCIsICJyZXF1ZXN0cyIsICJzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkIiwgImFjY2VwdGVkUGFnZXMiLCAiZGVuaWVkUGFnZXMiLCAiY29tbWVudHMiLCAiYW1vdW50T2ZQYWdlcyIsICJzZWN0aW9uRGF0YSIsICJjbG9zaW5nSWQiLCAiYWNjZXB0ZWRQYWdlc01lc3NhZ2UiLCAiZGVuaWVkUGFnZXNNZXNzYWdlIiwgIm1hcHBlZENvdW50cyIsICJjb3VudCIsICJyZWFzb24iLCAidGVtcGxhdGVQYXJhbWV0ZXJzIiwgImFkZGl0aW9uYWxSZWFzb25pbmciLCAic2luZ3VsYXJSZXF1ZXN0IiwgImFsbFJlcXVlc3RzIiwgInJlYXNvbnMiLCAicmVhc29uc0FycmF5IiwgImNvbW1lbnRNZXNzYWdlcyIsICJjb21tZW50c0FycmF5IiwgInByZXBlbmQiLCAiYXBwZW5kIiwgIm9sZEZ1bGxTZWN0aW9uVGV4dCIsICJvbGRTZWN0aW9uVGV4dCIsICJkYXRhIiwgInRhZ3NXaXRoQXJndW1lbnRzIiwgImZvdW5kQXJndW1lbnRFZGl0b3IiLCAibGFzdE51bWJlclBhcmFtZXRlckluZGV4IiwgInBhcmFtZXRlciIsICJtYXBwZWRBcmd1bWVudHMiLCAiY29udGVudCIsICJhcGlGdW5jdGlvbiIsICJlcnJvckNvZGUiLCAiZXJyb3JJbmZvIiwgInJlc29sdmUiLCAicGFnZU5hbWUiLCAiaXNSZWRpcmVjdFJlcXVlc3RQYWdlIiwgInJlcXVlc3RQYWdlVHlwZSIsICJldmVudCIsICJ3aW5kb3dNYW5hZ2VyIiwgImFmY3JjSGVscGVyRGlhbG9nIiwgIkFmY3JjSGVscGVyRGlhbG9nIl0KfQo=