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 from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/afcrc-helper.ts
"use strict";mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],()=>{const E=mw.config.get("wgPageName")==="Wikipedia:Articles_for_creation/Redirects",L=mw.config.get("wgPageName")==="Wikipedia:Articles_for_creation/Categories";if(!E&&!L)return;const x=E?"redirect":"category";mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#",`Handle ${x} creation requests`,"afcrc-helper").addEventListener("click",P=>{P.preventDefault();const k=new OO.ui.WindowManager;document.body.append(k.$element[0]);const e=new f(x,mw.config.get("wgPageName"));k.addWindows([e]),e.open()});class C extends OO.ui.Dialog{constructor(){super({size:"medium"});this.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");const e=new OO.ui.ButtonWidget({label:"Close",flags:["safe","close"]});return e.on("click",()=>this.close()),this.contentLayout.$element.append(this.logOutput,e.$element),this};this.getBodyHeight=()=>this.contentLayout.$element.outerHeight(!0);C.static.name="ShowActionsDialog",C.static.title="Actions"}addLogEntry(e){const n=document.createElement("div");n.textContent=e,this.logOutput.append(n)}}Object.assign(C.prototype,OO.ui.Dialog.prototype);class f extends OO.ui.ProcessDialog{constructor(e,n){super({size:"large"});this.api=new mw.Api;this.scriptMessage="[[User:Eejit43/scripts/afcrc-helper|afcrc-helper]]";this.parsedRequests=[];this.actionsToTake={};this.getSetupProcess=()=>(mw.util.addCSS(`
.afcrc-helper-request {
background-color: #eee;
border-radius: 5px;
margin: 10px;
padding: 5px;
}
.afcrc-helper-request summary {
cursor: pointer;
}
.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-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%;
}`),f.super.prototype.getSetupProcess.call(this).next(()=>this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.pageTitle}).then(e=>{this.pageContent=e.query.pages[0].revisions[0].slots.main.content.trim(),this.parseRequests(),this.loadInputElements()})));this.getActionProcess=e=>{switch(e){case"cancel":return new OO.ui.Process(()=>{this.getManager().closeWindow(this)});case"show-actions":return new OO.ui.Process(()=>{this.performActions(!0)});case"save":return new OO.ui.Process(()=>{this.performActions(!1)});default:return f.super.prototype.getActionProcess.call(this,e)}};this.getTeardownProcess=()=>f.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});f.static.name="AfcrcHelperDialog",f.static.title="afcrc-helper",f.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"show-actions",label:"Show actions to take"},{action:"save",label:"Run",flags:["primary","progressive"]}],this.pageTitle=n,this.requestPageType=e}parseRequests(){this.beforeText=this.pageContent.match(/^(.*?)==/s)[1],this.pageContent=this.pageContent.replace(/^.*?==/s,"==").replaceAll(new RegExp(`\\[https?:${mw.config.get("wgServer")}/(.*?)]`,"g"),"[[$1]]");const e=[...this.pageContent.matchAll(/^==.*?==$(\s*(?!==[^=]).*)*/gim)].map(n=>n[0]);for(const n of e){if(/{{afc-c\|/i.test(n))continue;const r=n.match(/^==(.*?)==$/m)[1].trim();if(x==="redirect"){const s={},a=[...r.matchAll(/\[\[(.*?)]]/g)].map(i=>i[1].trim().replace(/^:/,"").replaceAll("_"," "));s.pages=a;const R=n.match(/Target of redirect: ?\[\[(.*?)]]/)?.[1].trim().replace(/^:/,"").replaceAll("_"," ");if(!R)continue;s.target=R,s.reason=n.match(/reason: ?(.*?)\*source(?: \(if applicable\))?:/is)[1].trim(),s.source=n.match(/source(?: \(if applicable\))?: ?(.*?)(?:<references \/>|\n)/is)[1].trim();const y=n.match(n.includes("<references />")?/<references \/>\n(.*)/:new RegExp(`(?:<references \\/>${s.source?`|${s.source.replaceAll(/[\s#$()*+,.?[\\\]^{|}-]/g,"\\$&")}`:""})
+(.*)`))[1].trim();s.requester={type:y.includes("[[User:")?"user":"ip",name:y.match(/(?:Special:Contributions\/|User:)(.*?)\|/)[1].trim()},this.parsedRequests.push(s),this.actionsToTake[s.target]=Object.fromEntries(a.map(i=>[i,{originalText:n.replace(/^==.*?==$/m,"").trim(),action:"none"}]))}else{const s={}}}}loadInputElements(){if(this.requestPageType==="redirect")for(const e of this.parsedRequests){const n=document.createElement("details");n.classList.add("afcrc-helper-request");const h=document.createElement("summary");h.innerHTML=e.pages.map(o=>`<b>${o}</b>`).join(", ")+" \u2192 ";const r=document.createElement("a");r.target="_blank",r.href=mw.util.getUrl(e.target),r.textContent=e.target,h.append(r),n.append(h);const s=document.createElement("div");s.classList.add("afcrc-helper-request-info");const a=document.createElement("span");a.style.color="dimgray",a.textContent="None";const R=document.createElement("div"),y=document.createElement("b");y.textContent="Reason: ",R.append(y),e.reason?R.append(e.reason):R.append(a),s.append(R);const i=document.createElement("div"),u=document.createElement("b");u.textContent="Source: ",i.append(u),e.source?i.append(e.source):i.append(a),s.append(i);const $=document.createElement("div"),A=document.createElement("b");A.textContent="Requester: ",$.append(A);const q=document.createElement("a");q.target="_blank",q.href=e.requester.type==="user"?mw.util.getUrl(`User:${e.requester.name}`):mw.util.getUrl(`Special:Contributions/${e.requester.name}`),q.textContent=e.requester.name,$.append(q),s.append($),n.append(s),n.append(document.createElement("hr"));const T=document.createElement("div");T.classList.add("afcrc-helper-request-responder");for(const o of e.pages){const w=document.createElement("div"),v=document.createElement("b");v.textContent=o+" \u2192 "+e.target,w.append(v);const c=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(l=>new OO.ui.RadioOptionWidget({data:l,label:l}))});c.selectItemByLabel("None"),c.on("choose",()=>{const l=c.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[e.target][o].action=l,["comment","close"].includes(l)){O.$element.show();const b=m.getValue().trim();b?this.actionsToTake[e.target][o].comment=b:delete this.actionsToTake[e.target][o].comment}else O.$element.hide(),delete this.actionsToTake[e.target][o].comment;if(l==="deny")d.$element.show(),this.actionsToTake[e.target][o].denyReason=t.getValue();else if(l==="close"){g.$element.show();const b=p.getMenu().findSelectedItem();this.actionsToTake[e.target][o].closingReason={name:b.getLabel(),id:b.getData()},delete this.actionsToTake[e.target][o].denyReason}else d.$element.hide(),g.$element.hide(),delete this.actionsToTake[e.target][o].denyReason,delete this.actionsToTake[e.target][o].closingReason});const t=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"],["externallink","external link redirects"],["editrequest","edit requests"],["notenglish","requests not in English"]].map(([l,b])=>({data:`autofill:${l}`,label:`Autofilled text for ${b}`}))});t.getMenu().on("choose",()=>{this.actionsToTake[e.target][o].denyReason=t.getValue()}),t.setValue("autofill:unlikely"),t.getMenu().selectItemByData("autofill:unlikely");const d=new OO.ui.FieldLayout(t,{align:"inline",label:"Deny reason"});d.$element.hide();const p=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([l,b])=>new OO.ui.MenuOptionWidget({data:b,label:l}))}});p.getMenu().on("choose",()=>{const l=p.getMenu().findSelectedItem();this.actionsToTake[e.target][o].closingReason={name:l.getLabel(),id:l.getData()}}),p.getMenu().selectItemByLabel("No response");const g=new OO.ui.FieldLayout(p,{align:"inline",label:"Closing reason"});g.$element.hide();const m=new OO.ui.TextInputWidget;m.on("change",()=>{const l=m.getValue().trim();l?this.actionsToTake[e.target][o].comment=l:delete this.actionsToTake[e.target][o].comment});const O=new OO.ui.FieldLayout(m,{classes:["afcrc-comment-input"],align:"inline",label:"Comment"});O.$element.hide(),w.append(c.$element[0],d.$element[0],g.$element[0],O.$element[0]),T.append(w)}n.append(T),this.$body.append(n)}else for(const e of this.parsedRequests){const n=document.createElement("details");n.classList.add("afcrc-helper-request");const h=document.createElement("summary");h.textContent=e.name,n.append(h),this.$body.append(n)}}performActions(e){const n=e?"will be":"has been",h=new OO.ui.WindowManager;document.body.append(h.$element[0]);const r=new C;h.addWindows([r]),r.open();const s={accepted:0,denied:0,commented:0,closed:0};let a=this.beforeText+this.pageContent;if(this.requestPageType==="redirect")if(Object.values(this.actionsToTake).some(y=>Object.values(y).some(i=>i.action!=="none"))){for(const[i,u]of Object.entries(this.actionsToTake)){const $=Object.values(u).some(t=>t.action==="accept"||t.action==="deny"),A=Object.values(u).every(t=>t.action==="accept"||t.action==="deny"),q=Object.values(u).find(t=>t.action==="close")?.closingReason?.id,T=Object.values(u).every(t=>t.action==="close"&&t.closingReason?.id===q),o=[],w=[],v=[];for(const[t,d]of Object.entries(u)){const p=`The request to create "${t}" \u2192 "${i}" ${n} `,g=d.comment?" and commented on":"";switch(d.action){case"accept":{$&&!A?r.addLogEntry(`Not all requests to "${i}" were accepted or denied, the handling of "${t}" will be ignored.`):(r.addLogEntry(p+`accepted${g}.`),o.push(t),s.accepted++);break}case"deny":{$&&!A?r.addLogEntry(`Not all requests to "${i}" were accepted or denied, the handling of "${t}" is being ignored.`):(r.addLogEntry(p+"denied."),w.push([t,d.denyReason||"decline"]),s.denied++);break}case"comment":{d.comment?(r.addLogEntry(p+"commented on."),v.push(`[${t} \u2192 ${i}] ${d.comment}`),s.commented++):r.addLogEntry(p+"marked to be commented on, but no comment was provided.");break}case"close":{T?(r.addLogEntry(p+`closed as ${d.closingReason.name.toLowerCase()}${g}.`),s.closed++):r.addLogEntry(`Not all requests to "${i}" were closed with the same reason, the handling of "${t}" is being ignored.`);break}}}let c=Object.values(u)[0].originalText;if(v.length>0&&(c+=`
`+v.map(t=>`* {{AfC comment|1=${t}}} ~~~~`).join(`
`),a=a.replace(Object.values(u)[0].originalText,c)),$){let t;const d=c;if(o.length>0&&w.length>0){t="p";const p=o.map(m=>`* {{subst:AfC redirect}} [${m}] ~~~~`),g=w.map(([m,O])=>`* {{subst:AfC redirect|${O.startsWith("autofill:")?O.replace("autofill:",""):`decline|1=${O}`}}} [${m}] ~~~~`);c+=`
`+p.join(`
`)+`
`+g.join(`
`),a=a.replace(d,c)}else if(o.length>0)t="a",c+=`
* {{subst:AfC redirect${o.length>1?"|all":""}}} ~~~~`,a=a.replace(d,c);else{t="d";const p=w.map(([g,m])=>`* {{subst:AfC redirect|${m.startsWith("autofill:")?m.replace("autofill:",""):`decline|1=${m}`}}} [${g}] ~~~~`);c+=`
`+p.join(`
`),a=a.replace(d,c)}a=a.replace(c,`{{AfC-c|${t}}}
${c}
{{AfC-c|b}}`)}else T&&(a=a.replace(c,`{{AfC-c|${q}}}
${c}
{{AfC-c|b}}`))}if(this.beforeText+this.pageContent===a)return;const y=Object.entries(s).filter(([,i])=>i>0).map(([i,u])=>`${i} ${u}`).join(", ");this.api.edit(this.pageTitle,()=>({text:a,summary:`Handling AfC redirect requests (${y}) ${this.scriptMessage}`}))}else r.addLogEntry(`No requests ${e?"will be":"have been"} handled!`)}}Object.assign(f.prototype,OO.ui.ProcessDialog.prototype)});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHsgUGFnZVJldmlzaW9uc1Jlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC10eXBlcyc7XG5cbm13LmxvYWRlci51c2luZyhbJ21lZGlhd2lraS51dGlsJywgJ29vanMtdWktY29yZScsICdvb2pzLXVpLXdpZGdldHMnLCAnb29qcy11aS13aW5kb3dzJ10sICgpID0+IHtcbiAgICBjb25zdCBpc1JlZGlyZWN0UmVxdWVzdFBhZ2UgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykgPT09ICdXaWtpcGVkaWE6QXJ0aWNsZXNfZm9yX2NyZWF0aW9uL1JlZGlyZWN0cyc7XG4gICAgY29uc3QgaXNDYXRlZ29yeVJlcXVlc3RQYWdlID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpID09PSAnV2lraXBlZGlhOkFydGljbGVzX2Zvcl9jcmVhdGlvbi9DYXRlZ29yaWVzJztcblxuICAgIGlmICghaXNSZWRpcmVjdFJlcXVlc3RQYWdlICYmICFpc0NhdGVnb3J5UmVxdWVzdFBhZ2UpIHJldHVybjtcblxuICAgIGNvbnN0IHJlcXVlc3RQYWdlVHlwZSA9IGlzUmVkaXJlY3RSZXF1ZXN0UGFnZSA/ICdyZWRpcmVjdCcgOiAnY2F0ZWdvcnknO1xuXG4gICAgY29uc3QgbGluayA9IG13LnV0aWwuYWRkUG9ydGxldExpbmsobXcuY29uZmlnLmdldCgnc2tpbicpID09PSAnbWluZXJ2YScgPyAncC10YicgOiAncC1jYWN0aW9ucycsICcjJywgYEhhbmRsZSAke3JlcXVlc3RQYWdlVHlwZX0gY3JlYXRpb24gcmVxdWVzdHNgLCAnYWZjcmMtaGVscGVyJykhO1xuXG4gICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICBjb25zdCBhZmNyY0hlbHBlckRpYWxvZyA9IG5ldyBBZmNyY0hlbHBlckRpYWxvZyhyZXF1ZXN0UGFnZVR5cGUsIG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSk7XG5cbiAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFthZmNyY0hlbHBlckRpYWxvZ10pO1xuXG4gICAgICAgIGFmY3JjSGVscGVyRGlhbG9nLm9wZW4oKTtcbiAgICB9KTtcblxuICAgIGNsYXNzIFNob3dBY3Rpb25zRGlhbG9nIGV4dGVuZHMgT08udWkuRGlhbG9nIHtcbiAgICAgICAgcHJpdmF0ZSBjb250ZW50TGF5b3V0ITogT08udWkuUGFuZWxMYXlvdXQ7XG4gICAgICAgIHByaXZhdGUgbG9nT3V0cHV0ITogSFRNTERpdkVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBzdXBlcih7IHNpemU6ICdtZWRpdW0nIH0pO1xuXG4gICAgICAgICAgICBTaG93QWN0aW9uc0RpYWxvZy5zdGF0aWMubmFtZSA9ICdTaG93QWN0aW9uc0RpYWxvZyc7XG4gICAgICAgICAgICBTaG93QWN0aW9uc0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnQWN0aW9ucyc7XG4gICAgICAgIH1cblxuICAgICAgICBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgICAgICAgT08udWkuRGlhbG9nLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMpO1xuXG4gICAgICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4uYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyIGRpdiB7XG4gICAgbWFyZ2luLWJsb2NrOiA4cHg7XG59YCk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgIHRoaXMubG9nT3V0cHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLmxvZ091dHB1dC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItYWN0aW9ucy1jb250YWluZXInKTtcblxuICAgICAgICAgICAgY29uc3QgY2xvc2VCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9KTtcbiAgICAgICAgICAgIGNsb3NlQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoKSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudExheW91dC4kZWxlbWVudC5hcHBlbmQodGhpcy5sb2dPdXRwdXQsIGNsb3NlQnV0dG9uLiRlbGVtZW50KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0Qm9keUhlaWdodCA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRMYXlvdXQuJGVsZW1lbnQub3V0ZXJIZWlnaHQodHJ1ZSkhO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGRzIGEgbG9nIGVudHJ5IHRvIHRoZSBkaWFsb2cuXG4gICAgICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC5cbiAgICAgICAgICovXG4gICAgICAgIHB1YmxpYyBhZGRMb2dFbnRyeShtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvZ0VudHJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBsb2dFbnRyeS50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG5cbiAgICAgICAgICAgIHRoaXMubG9nT3V0cHV0LmFwcGVuZChsb2dFbnRyeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKFNob3dBY3Rpb25zRGlhbG9nLnByb3RvdHlwZSwgT08udWkuRGlhbG9nLnByb3RvdHlwZSk7XG5cbiAgICBpbnRlcmZhY2UgUmVkaXJlY3RSZXF1ZXN0RGF0YSB7XG4gICAgICAgIHBhZ2VzOiBzdHJpbmdbXTtcbiAgICAgICAgdGFyZ2V0OiBzdHJpbmc7XG4gICAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgICBzb3VyY2U6IHN0cmluZztcbiAgICAgICAgcmVxdWVzdGVyOiB7IHR5cGU6ICd1c2VyJyB8ICdpcCc7IG5hbWU6IHN0cmluZyB9O1xuICAgIH1cblxuICAgIGludGVyZmFjZSBDYXRlZ29yeVJlcXVlc3REYXRhIHt9XG5cbiAgICB0eXBlIEFjdGlvblR5cGUgPSAnYWNjZXB0JyB8ICdkZW55JyB8ICdjb21tZW50JyB8ICdjbG9zZScgfCAnbm9uZSc7XG5cbiAgICBpbnRlcmZhY2UgQWN0aW9uIHtcbiAgICAgICAgb3JpZ2luYWxUZXh0OiBzdHJpbmc7XG4gICAgICAgIGFjdGlvbjogQWN0aW9uVHlwZTtcbiAgICAgICAgY29tbWVudD86IHN0cmluZztcbiAgICB9XG5cbiAgICB0eXBlIFJlZGlyZWN0QWN0aW9uID0gQWN0aW9uICYgeyBkZW55UmVhc29uPzogc3RyaW5nOyBjbG9zaW5nUmVhc29uPzogeyBuYW1lOiBzdHJpbmc7IGlkOiBzdHJpbmcgfSB9O1xuXG4gICAgdHlwZSBSZWRpcmVjdEFjdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBSZWRpcmVjdEFjdGlvbj4+O1xuXG4gICAgdHlwZSBDYXRlZ29yeUFjdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBBY3Rpb24+PjtcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdGhhdCBoYW5kbGVzIHJlZGlyZWN0IGFuZCBjYXRlZ29yeSByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICBjbGFzcyBBZmNyY0hlbHBlckRpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgICAgICBwcml2YXRlIHNjcmlwdE1lc3NhZ2UgPSAnW1tVc2VyOkVlaml0NDMvc2NyaXB0cy9hZmNyYy1oZWxwZXJ8YWZjcmMtaGVscGVyXV0nO1xuXG4gICAgICAgIHByaXZhdGUgcmVxdWVzdFBhZ2VUeXBlOiAncmVkaXJlY3QnIHwgJ2NhdGVnb3J5JztcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGUhOiBzdHJpbmc7XG5cbiAgICAgICAgcHJpdmF0ZSBiZWZvcmVUZXh0ITogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIHBhZ2VDb250ZW50ITogc3RyaW5nO1xuXG4gICAgICAgIHByaXZhdGUgcGFyc2VkUmVxdWVzdHM6IFJlZGlyZWN0UmVxdWVzdERhdGFbXSB8IENhdGVnb3J5UmVxdWVzdERhdGFbXSA9IFtdO1xuICAgICAgICBwcml2YXRlIGFjdGlvbnNUb1Rha2U6IFJlZGlyZWN0QWN0aW9ucyB8IENhdGVnb3J5QWN0aW9ucyA9IHt9O1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKHJlcXVlc3RQYWdlVHlwZTogJ3JlZGlyZWN0JyB8ICdjYXRlZ29yeScsIHBhZ2VUaXRsZTogc3RyaW5nKSB7XG4gICAgICAgICAgICBzdXBlcih7IHNpemU6ICdsYXJnZScgfSk7XG5cbiAgICAgICAgICAgIEFmY3JjSGVscGVyRGlhbG9nLnN0YXRpYy5uYW1lID0gJ0FmY3JjSGVscGVyRGlhbG9nJztcbiAgICAgICAgICAgIEFmY3JjSGVscGVyRGlhbG9nLnN0YXRpYy50aXRsZSA9ICdhZmNyYy1oZWxwZXInO1xuICAgICAgICAgICAgQWZjcmNIZWxwZXJEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgeyBhY3Rpb246ICdjYW5jZWwnLCBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH0sXG4gICAgICAgICAgICAgICAgeyBhY3Rpb246ICdzaG93LWFjdGlvbnMnLCBsYWJlbDogJ1Nob3cgYWN0aW9ucyB0byB0YWtlJyB9LFxuICAgICAgICAgICAgICAgIHsgYWN0aW9uOiAnc2F2ZScsIGxhYmVsOiAnUnVuJywgZmxhZ3M6IFsncHJpbWFyeScsICdwcm9ncmVzc2l2ZSddIH0sXG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZSA9IHBhZ2VUaXRsZTtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdFBhZ2VUeXBlID0gcmVxdWVzdFBhZ2VUeXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0U2V0dXBQcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgbXcudXRpbC5hZGRDU1MoYFxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICBtYXJnaW46IDEwcHg7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3Qgc3VtbWFyeSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3QtaW5mbywgLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciB7XG4gICAgbWFyZ2luOiA1cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvID4gZGl2LCAuYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyID4gZGl2IHtcbiAgICBtYXJnaW4tYmxvY2s6IDhweDtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciA+IGRpdjpsYXN0LW9mLXR5cGUge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgLm9vLXVpLWZpZWxkTGF5b3V0IHtcbiAgICBtYXJnaW4tbGVmdDogOHB4O1xufVxuXG4uYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyB7XG4gICAgbWFyZ2luLXRvcDogOHB4O1xufVxuXG4uYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyAub28tdWktcmFkaW9PcHRpb25XaWRnZXQge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBwYWRkaW5nOiA4cHg7XG59XG5cbi5hZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCwgLmFmY3JjLWNvbW1lbnQtaW5wdXQge1xuICAgIG1heC13aWR0aDogNTAlO1xufWApO1xuXG4gICAgICAgICAgICByZXR1cm4gQWZjcmNIZWxwZXJEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgICAgICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50ID0gKHJlc3BvbnNlIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHQpLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlUmVxdWVzdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZElucHV0RWxlbWVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NhbmNlbCc6IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWFuYWdlcigpLmNsb3NlV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnc2hvdy1hY3Rpb25zJzoge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtQWN0aW9ucyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ3NhdmUnOiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1BY3Rpb25zKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFmY3JjSGVscGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwodGhpcywgYWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEFmY3JjSGVscGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhcnNlcyByZXF1ZXN0cyBmcm9tIHRoZSBwYWdlIGNvbnRlbnQuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIHBhcnNlUmVxdWVzdHMoKSB7XG4gICAgICAgICAgICB0aGlzLmJlZm9yZVRleHQgPSB0aGlzLnBhZ2VDb250ZW50Lm1hdGNoKC9eKC4qPyk9PS9zKSFbMV07XG5cbiAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQgPSB0aGlzLnBhZ2VDb250ZW50LnJlcGxhY2UoL14uKj89PS9zLCAnPT0nKS5yZXBsYWNlQWxsKG5ldyBSZWdFeHAoYFxcXFxbaHR0cHM/OiR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKX0vKC4qPyldYCwgJ2cnKSwgJ1tbJDFdXScpO1xuXG4gICAgICAgICAgICBjb25zdCBzZWN0aW9ucyA9IFsuLi50aGlzLnBhZ2VDb250ZW50Lm1hdGNoQWxsKC9ePT0uKj89PSQoXFxzKig/IT09W149XSkuKikqL2dpbSldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzBdKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uVGV4dCBvZiBzZWN0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ2xvc2VkID0gL3t7YWZjLWNcXHwvaS50ZXN0KHNlY3Rpb25UZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNDbG9zZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VjdGlvbkhlYWRlciA9IHNlY3Rpb25UZXh0Lm1hdGNoKC9ePT0oLio/KT09JC9tKSFbMV0udHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RQYWdlVHlwZSA9PT0gJ3JlZGlyZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWREYXRhID0ge30gYXMgUmVkaXJlY3RSZXF1ZXN0RGF0YTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ZWRQYWdlcyA9IFsuLi5zZWN0aW9uSGVhZGVyLm1hdGNoQWxsKC9cXFtcXFsoLio/KV1dL2cpXS5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXS50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJykpO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEucGFnZXMgPSByZXF1ZXN0ZWRQYWdlcztcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRUYXJnZXQgPSBzZWN0aW9uVGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hdGNoKC9UYXJnZXQgb2YgcmVkaXJlY3Q6ID9cXFtcXFsoLio/KV1dLyk/LlsxXVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL146LywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRUYXJnZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEudGFyZ2V0ID0gcGFyc2VkVGFyZ2V0O1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEucmVhc29uID0gc2VjdGlvblRleHQubWF0Y2goL3JlYXNvbjogPyguKj8pXFwqc291cmNlKD86IFxcKGlmIGFwcGxpY2FibGVcXCkpPzovaXMpIVsxXS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5zb3VyY2UgPSBzZWN0aW9uVGV4dC5tYXRjaCgvc291cmNlKD86IFxcKGlmIGFwcGxpY2FibGVcXCkpPzogPyguKj8pKD86PHJlZmVyZW5jZXMgXFwvPnxcXG4pL2lzKSFbMV0udHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlciA9IHNlY3Rpb25UZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvblRleHQuaW5jbHVkZXMoJzxyZWZlcmVuY2VzIC8+JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAvPHJlZmVyZW5jZXMgXFwvPlxcbiguKikvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFJlZ0V4cChgKD86PHJlZmVyZW5jZXMgXFxcXC8+JHtwYXJzZWREYXRhLnNvdXJjZSA/IGB8JHtwYXJzZWREYXRhLnNvdXJjZS5yZXBsYWNlQWxsKC9bXFxzIyQoKSorLC4/W1xcXFxcXF1ee3x9LV0vZywgJ1xcXFwkJicpfWAgOiAnJ30pXFxuKyguKilgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICkhWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICAudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEucmVxdWVzdGVyID0geyB0eXBlOiByZXF1ZXN0ZXIuaW5jbHVkZXMoJ1tbVXNlcjonKSA/ICd1c2VyJyA6ICdpcCcsIG5hbWU6IHJlcXVlc3Rlci5tYXRjaCgvKD86U3BlY2lhbDpDb250cmlidXRpb25zXFwvfFVzZXI6KSguKj8pXFx8LykhWzFdLnRyaW0oKSB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkUmVxdWVzdHMucHVzaChwYXJzZWREYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbcGFyc2VkRGF0YS50YXJnZXRdID0gT2JqZWN0LmZyb21FbnRyaWVzKHJlcXVlc3RlZFBhZ2VzLm1hcCgocGFnZSkgPT4gW3BhZ2UsIHsgb3JpZ2luYWxUZXh0OiBzZWN0aW9uVGV4dC5yZXBsYWNlKC9ePT0uKj89PSQvbSwgJycpLnRyaW0oKSwgYWN0aW9uOiAnbm9uZScgfV0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWREYXRhID0ge30gYXMgUmVkaXJlY3RSZXF1ZXN0RGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIGlucHV0IGVsZW1lbnRzIGluIHRoZSBkaWFsb2cuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVxdWVzdFBhZ2VUeXBlID09PSAncmVkaXJlY3QnKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiB0aGlzLnBhcnNlZFJlcXVlc3RzIGFzIFJlZGlyZWN0UmVxdWVzdERhdGFbXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QnKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQuaW5uZXJIVE1MID0gcmVxdWVzdC5wYWdlcy5tYXAoKHBhZ2UpID0+IGA8Yj4ke3BhZ2V9PC9iPmApLmpvaW4oJywgJykgKyAnIFx1MjE5MiAnO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKHJlcXVlc3QudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGV4dENvbnRlbnQgPSByZXF1ZXN0LnRhcmdldDtcblxuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC5hcHBlbmQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdEluZm9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9uZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICAgICAgICAgIG5vbmVFbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICAgICAgICAgICAgICBub25lRWxlbWVudC50ZXh0Q29udGVudCA9ICdOb25lJztcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFzb25EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFzb25MYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uTGFiZWwudGV4dENvbnRlbnQgPSAnUmVhc29uOiAnO1xuICAgICAgICAgICAgICAgICAgICByZWFzb25EaXYuYXBwZW5kKHJlYXNvbkxhYmVsKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5yZWFzb24pIHJlYXNvbkRpdi5hcHBlbmQocmVxdWVzdC5yZWFzb24pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHJlYXNvbkRpdi5hcHBlbmQobm9uZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocmVhc29uRGl2KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTGFiZWwudGV4dENvbnRlbnQgPSAnU291cmNlOiAnO1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VEaXYuYXBwZW5kKHNvdXJjZUxhYmVsKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5zb3VyY2UpIHNvdXJjZURpdi5hcHBlbmQocmVxdWVzdC5zb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHNvdXJjZURpdi5hcHBlbmQobm9uZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQoc291cmNlRGl2KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVyTGFiZWwudGV4dENvbnRlbnQgPSAnUmVxdWVzdGVyOiAnO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxhYmVsKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ZXJMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLmhyZWYgPSByZXF1ZXN0LnJlcXVlc3Rlci50eXBlID09PSAndXNlcicgPyBtdy51dGlsLmdldFVybChgVXNlcjoke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YCkgOiBtdy51dGlsLmdldFVybChgU3BlY2lhbDpDb250cmlidXRpb25zLyR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVyTGluay50ZXh0Q29udGVudCA9IHJlcXVlc3QucmVxdWVzdGVyLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGluayk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChyZXF1ZXN0ZXJEaXYpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0SW5mb0VsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdocicpKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXInKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3RlZFRpdGxlIG9mIHJlcXVlc3QucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlZFRpdGxlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSByZXF1ZXN0ZWRUaXRsZSArICcgXHUyMTkyICcgKyByZXF1ZXN0LnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFRpdGxlRGl2LmFwcGVuZChsYWJlbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvblJhZGlvSW5wdXQgPSBuZXcgT08udWkuUmFkaW9TZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbJ0FjY2VwdCcsICdEZW55JywgJ0NvbW1lbnQnLCAnQ2xvc2UnLCAnTm9uZSddLm1hcCgobGFiZWwpID0+IG5ldyBPTy51aS5SYWRpb09wdGlvbldpZGdldCh7IGRhdGE6IGxhYmVsLCBsYWJlbCB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvblJhZGlvSW5wdXQuc2VsZWN0SXRlbUJ5TGFiZWwoJ05vbmUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvblJhZGlvSW5wdXQub24oJ2Nob29zZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSAoKGFjdGlvblJhZGlvSW5wdXQuZmluZFNlbGVjdGVkSXRlbSgpIGFzIE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KS5nZXREYXRhKCkgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpIGFzIEFjdGlvblR5cGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbcmVxdWVzdC50YXJnZXRdW3JlcXVlc3RlZFRpdGxlXS5hY3Rpb24gPSBvcHRpb247XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWydjb21tZW50JywgJ2Nsb3NlJ10uaW5jbHVkZXMob3B0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50KSB0aGlzLmFjdGlvbnNUb1Rha2VbcmVxdWVzdC50YXJnZXRdW3JlcXVlc3RlZFRpdGxlXS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWxldGUgdGhpcy5hY3Rpb25zVG9UYWtlW3JlcXVlc3QudGFyZ2V0XVtyZXF1ZXN0ZWRUaXRsZV0uY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFjdGlvbnNUb1Rha2VbcmVxdWVzdC50YXJnZXRdW3JlcXVlc3RlZFRpdGxlXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24gPT09ICdkZW55Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbcmVxdWVzdC50YXJnZXRdW3JlcXVlc3RlZFRpdGxlXS5kZW55UmVhc29uID0gZGVueVJlYXNvbi5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uID09PSAnY2xvc2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpIGFzIE9PLnVpLk1lbnVPcHRpb25XaWRnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtyZXF1ZXN0LnRhcmdldF1bcmVxdWVzdGVkVGl0bGVdLmNsb3NpbmdSZWFzb24gPSB7IG5hbWU6IHNlbGVjdGVkLmdldExhYmVsKCkgYXMgc3RyaW5nLCBpZDogc2VsZWN0ZWQuZ2V0RGF0YSgpIGFzIHN0cmluZyB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbcmVxdWVzdC50YXJnZXRdW3JlcXVlc3RlZFRpdGxlXS5kZW55UmVhc29uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW3JlcXVlc3QudGFyZ2V0XVtyZXF1ZXN0ZWRUaXRsZV0uZGVueVJlYXNvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtyZXF1ZXN0LnRhcmdldF1bcmVxdWVzdGVkVGl0bGVdLmNsb3NpbmdSZWFzb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbnlSZWFzb24gPSBuZXcgT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnYXV0b2ZpbGw6dW5saWtlbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydleGlzdHMnLCAnZXhpc3RpbmcgcGFnZXMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydlbXB0eScsICdlbXB0eSBzdWJtaXNzaW9ucyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ25vdGFyZ2V0JywgJ25vbmV4aXN0ZW50IG9yIG5vIHByb3ZpZGVkIHRhcmdldCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ25vdGl0bGUnLCAnbm8gdGl0bGUgcHJvdmlkZWQnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyd1bmxpa2VseScsICd1bmxpa2VseSByZWRpcmVjdHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydleHRlcm5hbGxpbmsnLCAnZXh0ZXJuYWwgbGluayByZWRpcmVjdHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydlZGl0cmVxdWVzdCcsICdlZGl0IHJlcXVlc3RzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnbm90ZW5nbGlzaCcsICdyZXF1ZXN0cyBub3QgaW4gRW5nbGlzaCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0ubWFwKChbdmFsdWUsIGxhYmVsXSkgPT4gKHsgZGF0YTogYGF1dG9maWxsOiR7dmFsdWV9YCwgbGFiZWw6IGBBdXRvZmlsbGVkIHRleHQgZm9yICR7bGFiZWx9YCB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbnlSZWFzb24uZ2V0TWVudSgpLm9uKCdjaG9vc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW3JlcXVlc3QudGFyZ2V0XVtyZXF1ZXN0ZWRUaXRsZV0uZGVueVJlYXNvbiA9IGRlbnlSZWFzb24uZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVueVJlYXNvbi5zZXRWYWx1ZSgnYXV0b2ZpbGw6dW5saWtlbHknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbnlSZWFzb24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbnlSZWFzb25MYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoZGVueVJlYXNvbiwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnRGVueSByZWFzb24nIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb24gPSBuZXcgT08udWkuRHJvcGRvd25XaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ05vIHJlc3BvbnNlJywgJ3InXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnU3VjY2VlZGVkJywgJ3MnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnV2l0aGRyYXduJywgJ3cnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5tYXAoKFt0aXRsZSwgaWRdKSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGE6IGlkLCBsYWJlbDogdGl0bGUgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLm9uKCdjaG9vc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCkgYXMgT08udWkuTWVudU9wdGlvbldpZGdldDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtyZXF1ZXN0LnRhcmdldF1bcmVxdWVzdGVkVGl0bGVdLmNsb3NpbmdSZWFzb24gPSB7IG5hbWU6IHNlbGVjdGVkLmdldExhYmVsKCkgYXMgc3RyaW5nLCBpZDogc2VsZWN0ZWQuZ2V0RGF0YSgpIGFzIHN0cmluZyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlMYWJlbCgnTm8gcmVzcG9uc2UnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xvc2luZ1JlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjbG9zaW5nUmVhc29uLCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDbG9zaW5nIHJlYXNvbicgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWVudElucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50KSB0aGlzLmFjdGlvbnNUb1Rha2VbcmVxdWVzdC50YXJnZXRdW3JlcXVlc3RlZFRpdGxlXS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRlbGV0ZSB0aGlzLmFjdGlvbnNUb1Rha2VbcmVxdWVzdC50YXJnZXRdW3JlcXVlc3RlZFRpdGxlXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjb21tZW50SW5wdXQsIHsgY2xhc3NlczogWydhZmNyYy1jb21tZW50LWlucHV0J10sIGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDb21tZW50JyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFRpdGxlRGl2LmFwcGVuZChhY3Rpb25SYWRpb0lucHV0LiRlbGVtZW50WzBdLCBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50WzBdLCBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50WzBdLCBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5hcHBlbmQocmVxdWVzdGVkVGl0bGVEaXYpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RSZXNwb25kZXJFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQoZGV0YWlsc0VsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgdGhpcy5wYXJzZWRSZXF1ZXN0cyBhcyBDYXRlZ29yeVJlcXVlc3REYXRhW10pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV0YWlsc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gcmVxdWVzdC5uYW1lO1xuXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKGRldGFpbHNFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogUGVyZm9ybXMgYWxsIGFjdGlvbnMgYW5kIGxvZ3MgdGhlaXIgcmVzdWx0cy5cbiAgICAgICAgICogQHBhcmFtIGRyeVJ1biBJZiB0cnVlLCBubyBwYWdlcyB3aWxsIGJlIGVkaXRlZCBvciBjcmVhdGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBwZXJmb3JtQWN0aW9ucyhkcnlSdW46IGJvb2xlYW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbnNlID0gZHJ5UnVuID8gJ3dpbGwgYmUnIDogJ2hhcyBiZWVuJztcblxuICAgICAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgY29uc3Qgc2hvd0FjdGlvbnNEaWFsb2cgPSBuZXcgU2hvd0FjdGlvbnNEaWFsb2coKTtcbiAgICAgICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbc2hvd0FjdGlvbnNEaWFsb2ddKTtcbiAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLm9wZW4oKTtcblxuICAgICAgICAgICAgY29uc3QgY291bnRzID0geyBhY2NlcHRlZDogMCwgZGVuaWVkOiAwLCBjb21tZW50ZWQ6IDAsIGNsb3NlZDogMCB9O1xuICAgICAgICAgICAgbGV0IG5ld1BhZ2VUZXh0ID0gdGhpcy5iZWZvcmVUZXh0ICsgdGhpcy5wYWdlQ29udGVudDtcblxuICAgICAgICAgICAgaWYgKHRoaXMucmVxdWVzdFBhZ2VUeXBlID09PSAncmVkaXJlY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW55UmVxdWVzdEhhbmRsZWQgPSBPYmplY3QudmFsdWVzKHRoaXMuYWN0aW9uc1RvVGFrZSkuc29tZSgoYWN0aW9ucykgPT4gT2JqZWN0LnZhbHVlcyhhY3Rpb25zKS5zb21lKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gIT09ICdub25lJykpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFueVJlcXVlc3RIYW5kbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3RhcmdldCwgYWN0aW9uc10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5hY3Rpb25zVG9UYWtlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCA9IE9iamVjdC52YWx1ZXMoYWN0aW9ucykuc29tZSgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JyB8fCBhY3Rpb24uYWN0aW9uID09PSAnZGVueScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCA9IE9iamVjdC52YWx1ZXMoYWN0aW9ucykuZXZlcnkoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcgfHwgYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDbG9zZVJlYXNvbiA9IE9iamVjdC52YWx1ZXMoYWN0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCBSZWRpcmVjdEFjdGlvbj4pLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyk/LmNsb3NpbmdSZWFzb24/LmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNDbG9zZWQgPSBPYmplY3QudmFsdWVzKGFjdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgUmVkaXJlY3RBY3Rpb24+KS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnICYmIGFjdGlvbi5jbG9zaW5nUmVhc29uPy5pZCA9PT0gZmlyc3RDbG9zZVJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkUGFnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbmllZFBhZ2VzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhhY3Rpb25zKSBhcyBbc3RyaW5nLCBSZWRpcmVjdEFjdGlvbl1bXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQcmVmaXggPSBgVGhlIHJlcXVlc3QgdG8gY3JlYXRlIFwiJHtyZXF1ZXN0ZWRUaXRsZX1cIiBcdTIxOTIgXCIke3RhcmdldH1cIiAke3RlbnNlfSBgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRlZE1lc3NhZ2UgPSBhY3Rpb24uY29tbWVudCA/ICcgYW5kIGNvbW1lbnRlZCBvbicgOiAnJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCAmJiAhYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgYWNjZXB0ZWQgb3IgZGVuaWVkLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIHdpbGwgYmUgaWdub3JlZC5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KG1lc3NhZ2VQcmVmaXggKyBgYWNjZXB0ZWQke2NvbW1lbnRlZE1lc3NhZ2V9LmApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0ZWRQYWdlcy5wdXNoKHJlcXVlc3RlZFRpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuYWNjZXB0ZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkICYmICFhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KGBOb3QgYWxsIHJlcXVlc3RzIHRvIFwiJHt0YXJnZXR9XCIgd2VyZSBhY2NlcHRlZCBvciBkZW5pZWQsIHRoZSBoYW5kbGluZyBvZiBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgaXMgYmVpbmcgaWdub3JlZC5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KG1lc3NhZ2VQcmVmaXggKyAnZGVuaWVkLicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVuaWVkUGFnZXMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5kZW55UmVhc29uISB8fCAnZGVjbGluZSddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuZGVuaWVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShtZXNzYWdlUHJlZml4ICsgJ2NvbW1lbnRlZCBvbi4nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goYFske3JlcXVlc3RlZFRpdGxlfSBcdTIxOTIgJHt0YXJnZXR9XSAke2FjdGlvbi5jb21tZW50fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5jb21tZW50ZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShtZXNzYWdlUHJlZml4ICsgJ21hcmtlZCB0byBiZSBjb21tZW50ZWQgb24sIGJ1dCBubyBjb21tZW50IHdhcyBwcm92aWRlZC4nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsUmVxdWVzdHNDbG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShtZXNzYWdlUHJlZml4ICsgYGNsb3NlZCBhcyAke2FjdGlvbi5jbG9zaW5nUmVhc29uIS5uYW1lLnRvTG93ZXJDYXNlKCl9JHtjb21tZW50ZWRNZXNzYWdlfS5gKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5jbG9zZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgY2xvc2VkIHdpdGggdGhlIHNhbWUgcmVhc29uLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIGlzIGJlaW5nIGlnbm9yZWQuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlY3Rpb25SZXBsYWNlVGV4dCA9IE9iamVjdC52YWx1ZXMoYWN0aW9ucylbMF0ub3JpZ2luYWxUZXh0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25SZXBsYWNlVGV4dCArPSAnXFxuJyArIGNvbW1lbnRzLm1hcCgoY29tbWVudCkgPT4gYCoge3tBZkMgY29tbWVudHwxPSR7Y29tbWVudH19fSB+fn5+YCkuam9pbignXFxuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYWdlVGV4dCA9IG5ld1BhZ2VUZXh0LnJlcGxhY2UoT2JqZWN0LnZhbHVlcyhhY3Rpb25zKVswXS5vcmlnaW5hbFRleHQsIHNlY3Rpb25SZXBsYWNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsb3NpbmdJZDogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VjdGlvblRleHRCZWZvcmUgPSBzZWN0aW9uUmVwbGFjZVRleHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAwICYmIGRlbmllZFBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0lkID0gJ3AnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZEFjY2VwdGVkUGFnZXMgPSBhY2NlcHRlZFBhZ2VzLm1hcCgocGFnZSkgPT4gYCoge3tzdWJzdDpBZkMgcmVkaXJlY3R9fSBbJHtwYWdlfV0gfn5+fmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWREZW5pZWRQYWdlcyA9IGRlbmllZFBhZ2VzLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbcGFnZSwgcmVhc29uXSkgPT4gYCoge3tzdWJzdDpBZkMgcmVkaXJlY3R8JHtyZWFzb24uc3RhcnRzV2l0aCgnYXV0b2ZpbGw6JykgPyByZWFzb24ucmVwbGFjZSgnYXV0b2ZpbGw6JywgJycpIDogYGRlY2xpbmV8MT0ke3JlYXNvbn1gfX19IFske3BhZ2V9XSB+fn5+YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uUmVwbGFjZVRleHQgKz0gJ1xcbicgKyBtYXBwZWRBY2NlcHRlZFBhZ2VzLmpvaW4oJ1xcbicpICsgJ1xcbicgKyBtYXBwZWREZW5pZWRQYWdlcy5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFnZVRleHQgPSBuZXdQYWdlVGV4dC5yZXBsYWNlKHNlY3Rpb25UZXh0QmVmb3JlLCBzZWN0aW9uUmVwbGFjZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdhJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uUmVwbGFjZVRleHQgKz0gYFxcbiAqIHt7c3Vic3Q6QWZDIHJlZGlyZWN0JHthY2NlcHRlZFBhZ2VzLmxlbmd0aCA+IDEgPyAnfGFsbCcgOiAnJ319fSB+fn5+YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFnZVRleHQgPSBuZXdQYWdlVGV4dC5yZXBsYWNlKHNlY3Rpb25UZXh0QmVmb3JlLCBzZWN0aW9uUmVwbGFjZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdkJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRSZWFzb25zID0gZGVuaWVkUGFnZXMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFtwYWdlLCByZWFzb25dKSA9PiBgKiB7e3N1YnN0OkFmQyByZWRpcmVjdHwke3JlYXNvbi5zdGFydHNXaXRoKCdhdXRvZmlsbDonKSA/IHJlYXNvbi5yZXBsYWNlKCdhdXRvZmlsbDonLCAnJykgOiBgZGVjbGluZXwxPSR7cmVhc29ufWB9fX0gWyR7cGFnZX1dIH5+fn5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25SZXBsYWNlVGV4dCArPSAnXFxuJyArIG1hcHBlZFJlYXNvbnMuam9pbignXFxuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhZ2VUZXh0ID0gbmV3UGFnZVRleHQucmVwbGFjZShzZWN0aW9uVGV4dEJlZm9yZSwgc2VjdGlvblJlcGxhY2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYWdlVGV4dCA9IG5ld1BhZ2VUZXh0LnJlcGxhY2Uoc2VjdGlvblJlcGxhY2VUZXh0LCBge3tBZkMtY3wke2Nsb3NpbmdJZH19fVxcbiR7c2VjdGlvblJlcGxhY2VUZXh0fVxcbnt7QWZDLWN8Yn19YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFsbFJlcXVlc3RzQ2xvc2VkKSBuZXdQYWdlVGV4dCA9IG5ld1BhZ2VUZXh0LnJlcGxhY2Uoc2VjdGlvblJlcGxhY2VUZXh0LCBge3tBZkMtY3wke2ZpcnN0Q2xvc2VSZWFzb259fX1cXG4ke3NlY3Rpb25SZXBsYWNlVGV4dH1cXG57e0FmQy1jfGJ9fWApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYmVmb3JlVGV4dCArIHRoaXMucGFnZUNvbnRlbnQgPT09IG5ld1BhZ2VUZXh0KSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkQ291bnRzID0gT2JqZWN0LmVudHJpZXMoY291bnRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoWywgY291bnRdKSA9PiBjb3VudCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChbYWN0aW9uLCBjb3VudF0pID0+IGAke2FjdGlvbn0gJHtjb3VudH1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcGkuZWRpdCh0aGlzLnBhZ2VUaXRsZSwgKCkgPT4gKHsgdGV4dDogbmV3UGFnZVRleHQsIHN1bW1hcnk6IGBIYW5kbGluZyBBZkMgcmVkaXJlY3QgcmVxdWVzdHMgKCR7bWFwcGVkQ291bnRzfSkgJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCB9KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KGBObyByZXF1ZXN0cyAke2RyeVJ1biA/ICd3aWxsIGJlJyA6ICdoYXZlIGJlZW4nfSBoYW5kbGVkIWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihBZmNyY0hlbHBlckRpYWxvZy5wcm90b3R5cGUsIE9PLnVpLlByb2Nlc3NEaWFsb2cucHJvdG90eXBlKTtcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogImFBR0EsR0FBRyxPQUFPLE1BQU0sQ0FBQyxpQkFBa0IsZUFBZ0Isa0JBQW1CLGlCQUFpQixFQUFHLElBQU0sQ0FDNUYsTUFBTUEsRUFBd0IsR0FBRyxPQUFPLElBQUksWUFBWSxJQUFNLDRDQUN4REMsRUFBd0IsR0FBRyxPQUFPLElBQUksWUFBWSxJQUFNLDZDQUU5RCxHQUFJLENBQUNELEdBQXlCLENBQUNDLEVBQXVCLE9BRXRELE1BQU1DLEVBQWtCRixFQUF3QixXQUFhLFdBRWhELEdBQUcsS0FBSyxlQUFlLEdBQUcsT0FBTyxJQUFJLE1BQU0sSUFBTSxVQUFZLE9BQVMsYUFBYyxJQUFLLFVBQVVFLENBQWUscUJBQXNCLGNBQWMsRUFFOUosaUJBQWlCLFFBQVVDLEdBQVUsQ0FDdENBLEVBQU0sZUFBZSxFQUVyQixNQUFNQyxFQUFnQixJQUFJLEdBQUcsR0FBRyxjQUNoQyxTQUFTLEtBQUssT0FBT0EsRUFBYyxTQUFTLENBQUMsQ0FBQyxFQUU5QyxNQUFN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QUFhLEVBQUUsRUFBSSxhQUFhQSxDQUFNLEVBQUUsT0FBT3BELENBQUksUUFDckosRUFFQStDLEdBQXNCO0FBQUEsRUFBT00sRUFBYyxLQUFLO0FBQUEsQ0FBSSxFQUNwRGxCLEVBQWNBLEVBQVksUUFBUWMsRUFBbUJGLENBQWtCLENBQzNFLENBRUFaLEVBQWNBLEVBQVksUUFBUVksRUFBb0IsV0FBV0MsQ0FBUztBQUFBLEVBQU9ELENBQWtCO0FBQUEsWUFBZSxDQUN0SCxNQUFXTixJQUFtQk4sRUFBY0EsRUFBWSxRQUFRWSxFQUFvQixXQUFXUCxDQUFnQjtBQUFBLEVBQU9PLENBQWtCO0FBQUEsWUFBZSxFQUMzSixDQUVBLEdBQUksS0FBSyxXQUFhLEtBQUssY0FBZ0JaLEVBQWEsT0FFeEQsTUFBTW1CLEVBQWUsT0FBTyxRQUFRcEIsQ0FBTSxFQUNyQyxPQUFPLENBQUMsQ0FBQyxDQUFFcUIsQ0FBSyxJQUFNQSxFQUFRLENBQUMsRUFDL0IsSUFBSSxDQUFDLENBQUNoRSxFQUFRZ0UsQ0FBSyxJQUFNLEdBQUdoRSxDQUFNLElBQUlnRSxDQUFLLEVBQUUsRUFDN0MsS0FBSyxJQUFJLEVBRWQsS0FBSyxJQUFJLEtBQUssS0FBSyxVQUFXLEtBQU8sQ0FBRSxLQUFNcEIsRUFBYSxRQUFTLG1DQUFtQ21CLENBQVksS0FBSyxLQUFLLGFBQWEsRUFBRyxFQUFFLENBQ2xKLE1BQU9yQixFQUFrQixZQUFZLGVBQWVGLEVBQVMsVUFBWSxXQUFXLFdBQVcsQ0FFdkcsQ0FDSixDQUVBLE9BQU8sT0FBTy9DLEVBQWtCLFVBQVcsR0FBRyxHQUFHLGNBQWMsU0FBUyxDQUM1RSxDQUFDIiwKICAibmFtZXMiOiBbImlzUmVkaXJlY3RSZXF1ZXN0UGFnZSIsICJpc0NhdGVnb3J5UmVxdWVzdFBhZ2UiLCAicmVxdWVzdFBhZ2VUeXBlIiwgImV2ZW50IiwgIndpbmRvd01hbmFnZXIiLCAiYWZjcmNIZWxwZXJEaWFsb2ciLCAiQWZjcmNIZWxwZXJEaWFsb2ciLCAiU2hvd0FjdGlvbnNEaWFsb2ciLCAiY2xvc2VCdXR0b24iLCAibWVzc2FnZSIsICJsb2dFbnRyeSIsICJwYWdlVGl0bGUiLCAicmVzcG9uc2UiLCAiYWN0aW9uIiwgInNlY3Rpb25zIiwgIm1hdGNoIiwgInNlY3Rpb25UZXh0IiwgInNlY3Rpb25IZWFkZXIiLCAicGFyc2VkRGF0YSIsICJyZXF1ZXN0ZWRQYWdlcyIsICJwYXJzZWRUYXJnZXQiLCAicmVxdWVzdGVyIiwgInBhZ2UiLCAicmVxdWVzdCIsICJkZXRhaWxzRWxlbWVudCIsICJzdW1tYXJ5RWxlbWVudCIsICJsaW5rRWxlbWVudCIsICJyZXF1ZXN0SW5mb0VsZW1lbnQiLCAibm9uZUVsZW1lbnQiLCAicmVhc29uRGl2IiwgInJlYXNvbkxhYmVsIiwgInNvdXJjZURpdiIsICJzb3VyY2VMYWJlbCIsICJyZXF1ZXN0ZXJEaXYiLCAicmVxdWVzdGVyTGFiZWwiLCAicmVxdWVzdGVyTGluayIsICJyZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCIsICJyZXF1ZXN0ZWRUaXRsZSIsICJyZXF1ZXN0ZWRUaXRsZURpdiIsICJsYWJlbCIsICJhY3Rpb25SYWRpb0lucHV0IiwgIm9wdGlvbiIsICJjb21tZW50SW5wdXRMYXlvdXQiLCAiY29tbWVudCIsICJjb21tZW50SW5wdXQiLCAiZGVueVJlYXNvbkxheW91dCIsICJkZW55UmVhc29uIiwgImNsb3NpbmdSZWFzb25MYXlvdXQiLCAic2VsZWN0ZWQiLCAiY2xvc2luZ1JlYXNvbiIsICJ2YWx1ZSIsICJ0aXRsZSIsICJpZCIsICJkcnlSdW4iLCAidGVuc2UiLCAic2hvd0FjdGlvbnNEaWFsb2ciLCAiY291bnRzIiwgIm5ld1BhZ2VUZXh0IiwgImFjdGlvbnMiLCAidGFyZ2V0IiwgInNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQiLCAiYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCIsICJmaXJzdENsb3NlUmVhc29uIiwgImFsbFJlcXVlc3RzQ2xvc2VkIiwgImFjY2VwdGVkUGFnZXMiLCAiZGVuaWVkUGFnZXMiLCAiY29tbWVudHMiLCAibWVzc2FnZVByZWZpeCIsICJjb21tZW50ZWRNZXNzYWdlIiwgInNlY3Rpb25SZXBsYWNlVGV4dCIsICJjbG9zaW5nSWQiLCAic2VjdGlvblRleHRCZWZvcmUiLCAibWFwcGVkQWNjZXB0ZWRQYWdlcyIsICJtYXBwZWREZW5pZWRQYWdlcyIsICJyZWFzb24iLCAibWFwcGVkUmVhc29ucyIsICJtYXBwZWRDb3VudHMiLCAiY291bnQiXQp9Cg==
// </nowiki>