Select Page

User:Eejit43/scripts/redirect-helper.js

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

"use strict";(()=>{var W=Object.defineProperty;var O=(g,t)=>()=>(g&&(t=g(g=0)),t);var E=(g,t)=>{for(var i in t)W(g,i,{get:t[i],enumerable:!0})};var w,k=O(()=>{"use strict";w=class extends OO.ui.TextInputWidget{api=new mw.Api;validCategories=new Set;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{let t=this.getValue().split("|")[0],i=$.Deferred();t||i.resolve([]);let e=this.getValue().split("|")[1];if(e&&this.validCategories.has(t)){let r=[{data:`${t}|${e}`,label:`${t} (with sort key "${e}")`}];i.resolve(r),this.emit("showing-values",r)}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(r=>{if(r?.query?.pages){let s=r.query.pages.filter(n=>!n.categories?.some(o=>o.title==="Category:Wikipedia soft redirected categories")).map(n=>{let o=n.title.split(":")[1];return this.validCategories.add(o),{data:o,label:o}});this.emit("showing-values",s),i.resolve(s)}else i.resolve([])}),i.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:i,label:e})=>new OO.ui.MenuOptionWidget({data:i,label:e}))};Object.assign(w.prototype,OO.ui.mixin.LookupElement.prototype)});var b,S=O(()=>{"use strict";b=class g extends OO.ui.ProcessDialog{api=new mw.Api;hasLoadedDiffStyles=!1;constructor(t){super(t),g.static.name="ChangesDialog",g.static.title="Changes to be made",g.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>g.super.prototype.getSetupProcess.call(this).next(()=>{this.hasLoadedDiffStyles||(mw.loader.addLinkTag("https://www.mediawiki.org/w/load.php?modules=mediawiki.diff.styles&only=styles"),this.hasLoadedDiffStyles=!0);let[t,i]=this.getData();return this.api.post({action:"compare",formatversion:"2",prop:["diff"],fromslots:"main","fromtext-main":t,"fromcontentmodel-main":"wikitext",toslots:"main","totext-main":i,"tocontentmodel-main":"wikitext"}).then(e=>{let a=e.compare.body,r=new OO.ui.MessageWidget({type:"warning",label:"No changes to make!"}),s=new OO.ui.PanelLayout({padded:!0,expanded:!1});s.$element.append(a?`
<table class="diff diff-editfont-monospace">
    <colgroup>
        <col class="diff-marker">
        <col class="diff-content">
        <col class="diff-marker">
        <col class="diff-content">
    </colgroup>
    <tbody>
        ${a}
    </tbody>
</table>`:r.$element[0]),this.$body.append(s.$element)})});getActionProcess=t=>t?new OO.ui.Process(()=>{this.close()}):g.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>g.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};Object.assign(b.prototype,OO.ui.ProcessDialog.prototype)});var x,C=O(()=>{"use strict";x=class g extends OO.ui.ProcessDialog{api=new mw.Api;pageTitleParsed;constructor(t,i){super(t),this.pageTitleParsed=i,g.static.name="OutputPreviewDialog",g.static.title="Redirect categorization templates preview",g.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>g.super.prototype.getSetupProcess.call(this).next(()=>this.api.post({action:"parse",formatversion:"2",contentmodel:"wikitext",prop:["text","categorieshtml"],title:this.pageTitleParsed.getPrefixedDb(),text:this.getData()}).then(t=>{let i=t.parse.text,e=t.parse.categorieshtml,a=new OO.ui.PanelLayout({padded:!0,expanded:!1});a.$element.append(i,e),this.$body.append(a.$element)}));getActionProcess=t=>t?new OO.ui.Process(()=>{this.close()}):g.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>g.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};Object.assign(x.prototype,OO.ui.ProcessDialog.prototype)});var T,R=O(()=>{"use strict";T=class extends OO.ui.TextInputWidget{api=new mw.Api;pageTitleParsed;constructor(t,i){super(t),OO.ui.mixin.LookupElement.call(this,t),this.pageTitleParsed=i}getLookupRequest=()=>{let t=this.getValue(),i=$.Deferred();if(!t)i.resolve([]);else if(t.includes("#")){let e=t.split("#")[0];this.api.get({action:"parse",page:e,prop:"sections",redirects:!0}).catch(()=>null).then(a=>{if(a){let r=a.parse.sections.filter(s=>s.line.toLowerCase().replaceAll(/<\/?i>/g,"").startsWith(t.split("#")[1].toLowerCase()));i.resolve(r.map(s=>({data:`${a.parse.title}#${s.line.replaceAll(/<\/?i>/g,"")}`,label:`${a.parse.title}#${s.line.replaceAll(/<\/?i>/g,"")}`})))}else i.resolve([])})}else{let e=mw.Title.newFromText(t);this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:e?.getNamespaceId()??0,gapprefix:e?.getMainText()??t,generator:"allpages",prop:["info","pageprops"]}).catch(()=>null).then(a=>{a?.query?i.resolve(a.query.pages.filter(r=>r.title!==this.pageTitleParsed.getPrefixedText()).map(r=>({data:r.title,label:new OO.ui.HtmlSnippet(`${r.title}${r.pageprops&&"disambiguation"in r.pageprops?" <i>(disambiguation)</i>":""}${"redirect"in r?" <i>(redirect)</i>":""}`)}))):i.resolve([])})}return i.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:i,label:e})=>new OO.ui.MenuOptionWidget({data:i,label:e}))};Object.assign(T.prototype,OO.ui.mixin.LookupElement.prototype)});var I={};E(I,{default:()=>v});var v,L=O(()=>{"use strict";k();S();C();R();v=class{api=new mw.Api;redirectRegex=/^#.*?:?\s*\[\[\s*:?([^[\]{|}]+?)\s*(?:\|[^[\]{|}]+?)?]]\s*/i;scriptMessage=" (via [[w:en:User:Eejit43/scripts/redirect-helper|redirect-helper]])";redirectTemplates;contentText;pageTitle;pageTitleParsed;exists;defaultCreatedWatchMethod;needsCheck=!0;editorBox;syncWithMainButton;redirectInput;redirectInputLayout;tagSelect;tagSelectLayout;templateParametersEditor;templateEditorsInfo=[];categorySelect;categorySelectInput;categorySelectLayout;defaultSortInput;defaultSortSuggestButton;defaultSortInputLayout;summaryInput;summaryInputLayout;submitButton;showChangesButton;showPreviewButton;syncTalkCheckbox;syncTalkCheckboxLayout;watchCheckbox;watchCheckboxLayout;patrolCheckbox;patrolCheckboxLayout;submitLayout;talkData;pageContent="";oldRedirectTarget;oldRedirectTags;oldRedirectTagData;oldDefaultSort;oldCategories;oldStrayText;parsedDestination;constructor({redirectTemplates:t,contentText:i,pageTitle:e,pageTitleParsed:a},r,s){this.redirectTemplates=t,this.contentText=i,this.pageTitle=e,this.pageTitleParsed=a,this.exists=r,this.defaultCreatedWatchMethod=s}async load(){this.editorBox=new OO.ui.PanelLayout({id:"redirect-helper-box",padded:!0,expanded:!1,framed:!0}),this.pageTitleParsed.isTalkPage()&&(await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getSubjectPage().getPrefixedText()})).query.pages[0].redirect&&await this.loadSyncWithMainButton(),this.loadInputElements(),await this.loadSubmitElements(),this.editorBox.$element[0].append(...[this.syncWithMainButton?.$element[0],this.redirectInputLayout.$element[0],this.tagSelectLayout.$element[0],this.templateParametersEditor,this.defaultSortInputLayout.$element[0],this.categorySelectLayout.$element[0],this.summaryInputLayout.$element[0],this.submitLayout.$element[0]].filter(Boolean)),this.contentText.prepend(this.editorBox.$element[0]),this.exists&&this.loadExistingData()}async loadSyncWithMainButton(){let t=await this.getPageContent(this.pageTitleParsed.getSubjectPage().getPrefixedText());this.syncWithMainButton=new OO.ui.ButtonWidget({label:"Sync with main page",icon:"link",flags:["progressive"]}),this.syncWithMainButton.on("click",()=>{let i=this.redirectRegex.exec(t)?.[1];if(!i)return mw.notify("Failed to parse main page content!",{type:"error"});this.redirectInput.setValue(mw.Title.newFromText(i)?.getTalkPage()?.getPrefixedText()??""),["R from move",...this.redirectTemplates["R from move"].aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(t))&&this.tagSelect.setValue(["R from move"])})}loadInputElements(){this.redirectInput=new T({placeholder:"Target page name",required:!0},this.pageTitleParsed),this.redirectInput.on("change",()=>{let e=this.redirectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),e=e.replace(/^:/,""),e.length>0?(this.redirectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," ")),this.defaultSortSuggestButton.setDisabled(!1),this.submitButton.setDisabled(!1),this.showPreviewButton.setDisabled(!1),this.showChangesButton.setDisabled(!1)):(this.defaultSortSuggestButton.setDisabled(!0),this.submitButton.setDisabled(!0),this.showPreviewButton.setDisabled(!0),this.showChangesButton.setDisabled(!0)),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.redirectInputLayout=new OO.ui.FieldLayout(this.redirectInput,{label:"Redirect target:",classes:["redirect-input-layout"],align:"top"}),this.tagSelect=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.redirectTemplates).map(([e,{redirect:a}])=>{if(!a)return{data:e,label:e};let r=new OO.ui.HtmlSnippet(`<span class="redirect-helper-redirect-possibilities">${e}</span>`);return{data:e,label:r}})}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",e=>{let a=e.map(n=>n.getData()),r=a.toSorted((n,o)=>n.toLowerCase().localeCompare(o.toLowerCase()));if(a.join(";")!==r.join(";")){let n=e.at(-1);this.tagSelect.reorder(n,r.indexOf(n.getData()))}this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0;for(let n of this.templateEditorsInfo)n.details.style.display="none";let s=0;for(let n of this.tagSelect.getValue()){let o=this.templateEditorsInfo.find(p=>p.name===n);o&&(o.details.style.display="block",s++)}t.textContent=`Template parameters (${s>0?`for ${s} template${s>1?"s":""}`:"none to show"})`,i.style.display=s>0?"none":"block"}),this.tagSelectLayout=new OO.ui.FieldLayout(this.tagSelect,{label:"Redirect categorization templates:",classes:["redirect-input-layout"],align:"top"}),this.templateParametersEditor=document.createElement("details"),this.templateParametersEditor.classList.add("redirect-helper-template-parameters-container");let t=document.createElement("summary");t.textContent="Template parameters (none to show)",this.templateParametersEditor.append(t);for(let[e,a]of Object.entries(this.redirectTemplates)){let r=Object.entries(a.parameters);if(r.length===0)continue;let s=document.createElement("details");s.style.display="none";let n=document.createElement("summary");n.textContent=e,s.append(n);let o={name:e,details:s,parameters:[]};for(let[p,c]of r){let m=new OO.ui.TextInputWidget({placeholder:c.default?.toString(),required:c.required});m.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});let l=new OO.ui.FieldLayout(m,{label:new OO.ui.HtmlSnippet(`${p}${!c.label||p.toLowerCase()===c.label.toLowerCase()?"":` (${c.label})`}${c.description?` (${c.description})`:""} (type: ${c.type}) ${c.suggested?" (suggested)":""}${c.example?` (example: "${c.example}")`:""}`),align:"inline"});s.append(l.$element[0]),o.parameters.push({name:p,aliases:c.aliases,editor:m})}this.templateParametersEditor.append(s),this.templateEditorsInfo.push(o)}let i=document.createElement("div");i.id="redirect-helper-no-templates-message",i.textContent="No templates with parameters to display!",this.templateParametersEditor.append(i),this.defaultSortInput=new OO.ui.TextInputWidget,this.defaultSortInput.on("change",()=>{let e=this.defaultSortInput.getValue();e.length>0&&this.defaultSortInput.setValue(e.replaceAll("_"," ")),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.defaultSortSuggestButton=new OO.ui.ButtonWidget({icon:"robot",label:"Suggest",disabled:!0}),this.defaultSortSuggestButton.on("click",()=>{let e=this.pageTitleParsed.getMainText().replace(/ \(.*\)$/,"");if(["R from birth name","R from fictional character","R from band member","R from member","R from person","R from personal name","R from relative","R from spouse"].some(a=>this.tagSelect.getValue().includes(a))){if(!e.includes(" "))return mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"});let a="";if(/ (?:[JS]r.?|[IVX]+)$/.test(e)&&(a=e.slice(e.lastIndexOf(" ")),e=e.slice(0,e.lastIndexOf(" ")),!e.includes(" ")))return e+a;let r=e.slice(e.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),s=e.slice(0,e.lastIndexOf(" "));this.defaultSortInput.setValue(r+", "+s+a)}else{let a=e.replaceAll("Mr.","Mister").replaceAll("&","And");for(let r of["An","A","The"])if(a.startsWith(r+" ")){a=a.slice(r.length+1)+", "+r;break}a===e?mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"}):this.defaultSortInput.setValue(a)}}),this.defaultSortInputLayout=new OO.ui.ActionFieldLayout(this.defaultSortInput,this.defaultSortSuggestButton,{label:new OO.ui.HtmlSnippet(`Default sort key (DEFAULTSORT) (see <a href="${mw.util.getUrl("Wikipedia:Categorization#Sort keys")}" target="_blank">guideline</a>):`),classes:["redirect-input-layout"],align:"top"}),this.categorySelectInput=new w({placeholder:"Add categories here"}),this.categorySelectInput.on("change",()=>{let e=this.categorySelectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),e=e.replace(/^Category:/,""),e.length>0&&this.categorySelectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," "))}),this.categorySelectInput.on("showing-values",e=>{for(let a of e)this.categorySelect.addAllowedValue(a.data)}),this.categorySelect=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:this.categorySelectInput}),this.categorySelect.on("change",e=>{let a=e.map(s=>s.getData()),r=a.toSorted((s,n)=>s.toLowerCase().localeCompare(n.toLowerCase()));if(a.join(";")!==r.join(";")){let s=e.at(-1);this.categorySelect.reorder(s,r.indexOf(s.getData()))}this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.categorySelectLayout=new OO.ui.FieldLayout(this.categorySelect,{label:"Categories:",classes:["redirect-input-layout"],align:"top"}),this.summaryInput=new OO.ui.ComboBoxInputWidget({options:[{data:"Resolve double redirect"},{data:"Resolve self redirect"},{data:"Remove incorrect rcats"}]}),this.summaryInputLayout=new OO.ui.FieldLayout(this.summaryInput,{id:"redirect-helper-summary-layout",label:"Summary:",classes:["redirect-input-layout"],align:"top"})}async loadSubmitElements(){let t=new OO.ui.WindowManager;document.body.append(t.$element[0]),this.submitButton=new OO.ui.ButtonWidget({label:"Submit",disabled:!0,flags:["progressive"]}),this.submitButton.on("click",()=>this.handleSubmitButtonClick());let i=new x({size:"large"},this.pageTitleParsed);t.addWindows([i]),this.showPreviewButton=new OO.ui.ButtonWidget({label:"Show preview",disabled:!0}),this.showPreviewButton.on("click",()=>{i.setData(this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())),i.open()});let e=new b({size:"large"});if(t.addWindows([e]),this.showChangesButton=new OO.ui.ButtonWidget({label:"Show changes",disabled:!0}),this.showChangesButton.on("click",async()=>{this.exists&&(this.pageContent=await this.getPageContent(this.pageTitle)),e.setData([this.pageContent,this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())]),e.open()}),this.pageTitleParsed.isTalkPage()||(this.talkData=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getTalkPage().getPrefixedText()}),this.syncTalkCheckbox=new OO.ui.CheckboxInputWidget({selected:!!this.talkData.query.pages[0].redirect}),this.syncTalkCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.syncTalkCheckbox,{label:"Sync talk page",align:"inline"})]})),!this.exists){let a={};["nochange","preferences"].includes(this.defaultCreatedWatchMethod)?a.indeterminate=!0:this.defaultCreatedWatchMethod==="watch"?a.selected=!0:a.selected=!1,this.watchCheckbox=new OO.ui.CheckboxInputWidget(a),this.watchCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.watchCheckbox,{label:"Watch page",align:"inline"})]})}await this.checkShouldPromptPatrol()&&(this.patrolCheckbox=new OO.ui.CheckboxInputWidget({selected:!0}),this.patrolCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.patrolCheckbox,{label:"Mark as patrolled",align:"inline"})]})),this.submitLayout=new OO.ui.HorizontalLayout({id:"redirect-helper-submit-layout",items:[this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckboxLayout,this.watchCheckboxLayout,this.patrolCheckboxLayout].filter(Boolean)})}async checkShouldPromptPatrol(){let t=document.querySelector("#mwe-pt-mark .mwe-pt-tool-icon");if(t?.click(),t?.click(),mw.config.get("wgNamespaceNumber")!==0)return!1;if(document.querySelector(".patrollink"))return!0;if(document.querySelector("#mwe-pt-mark-as-reviewed-button"))return!0;if(document.querySelector("#mwe-pt-mark-as-unreviewed-button"))return!1;{if(!mw.config.get("wgArticleId")||!(await mw.user.getRights()).includes("patrol"))return!1;let e=await this.api.get({action:"pagetriagelist",page_id:mw.config.get("wgArticleId")});return e.pagetriagelist.pages[0]?.user_name===mw.config.get("wgUserName")||e.pagetriagelist.result!=="success"||e.pagetriagelist.pages.length===0?!1:!Number.parseInt(e.pagetriagelist.pages[0]?.patrol_status)}}updateSummary(){let t=this.redirectInput.getValue().trim();if(!t)this.summaryInput.$tabIndexed[0].placeholder="";else if(this.exists){let i=this.oldRedirectTarget?.replaceAll("_"," ");i&&(i=i[0].toUpperCase()+i.slice(1));let e=t!==i,a=this.tagSelect.getValue().some(p=>!this.oldRedirectTags.includes(p))||this.oldRedirectTags.some(p=>!this.tagSelect.getValue().includes(p)),r=!1;if(this.oldRedirectTagData){let p=Object.entries(this.redirectTemplates).filter(([,c])=>Object.entries(c.parameters).length>0);for(let[c,m]of p){if(!this.oldRedirectTags.includes(c)||!this.tagSelect.getValue().includes(c))continue;let u=this.oldRedirectTagData[c]??Object.entries(m.parameters).map(([d])=>[d,""]),h=this.templateEditorsInfo.find(d=>d.name===c);for(let d of h.parameters){let f=u.find(D=>D[0]===d.name)?.[1]??"",y=d.editor.getValue().trim();if(f!==y){r=!0;break}}if(r)break}}let s=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),n=this.categorySelect.getValue().some(p=>!this.oldCategories.includes(p))||this.oldCategories.some(p=>!this.categorySelect.getValue().includes(p)),o=[];e&&o.push(`retarget to [[${t}]]`),a&&o.push(`${this.tagSelect.getValue().length>0&&this.oldRedirectTags.length>0?"change":this.tagSelect.getValue().length>0?"add":"remove"} categorization templates`),r&&o.push("change categorization template arguments"),s&&o.push(`${this.defaultSortInput.getValue().trim().length>0&&this.oldDefaultSort.replaceAll("_"," ").length>0?"change":this.defaultSortInput.getValue().trim().length>0?"add":"remove"} default sort key`),n&&o.push(`${this.categorySelect.getValue().length>0&&this.oldCategories.length>0?"change":this.categorySelect.getValue().length>0?"add":"remove"} categories`),o.length===0&&o.push("perform redirect cleanup"),o[0]=o[0][0].toUpperCase()+o[0].slice(1),o.length>1&&(o[o.length-1]=`and ${o.at(-1)}`),this.summaryInput.$tabIndexed[0].placeholder=o.join(o.length>2?", ":" ")}else this.summaryInput.$tabIndexed[0].placeholder=`Create redirect to [[${t}]]`}async loadExistingData(){this.exists&&(this.pageContent=await this.getPageContent(this.pageTitle)),this.oldRedirectTarget=this.redirectRegex.exec(this.pageContent)?.[1],this.oldRedirectTags=Object.entries(this.redirectTemplates).map(([i,e])=>[i,...e.aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(this.pageContent))?i:null).filter(Boolean).sort((i,e)=>i.toLowerCase().localeCompare(e.toLowerCase()));let t=Object.entries(this.redirectTemplates).flatMap(([i,e])=>[i,...e.aliases]).map(i=>new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\s*(\\||}})`).test(this.pageContent)?i:null).filter(Boolean);this.oldRedirectTagData=Object.fromEntries(t.map(i=>{let e=new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\|?(.*?)\\s*}}`).exec(this.pageContent),a=Object.entries(this.redirectTemplates).find(([n,o])=>[n,...o.aliases].includes(i))?.[0];if(!e?.[1])return null;let s=e[1].split("|").map((n,o)=>{if(!n.includes("="))return[(o+1).toString(),n.trim()];let[p,c]=n.split("=");return[p.trim(),c.trim()]});return[a,s]}).filter(Boolean)),this.oldDefaultSort=this.pageContent.match(/{{DEFAULTSORT:.*?}}/g)?.at(-1)?.slice(14,-2).trim()??"",this.oldCategories=this.pageContent.match(/\[\[[Cc]ategory:.+?]]/g)?.map(i=>i.slice(11,-2)).sort((i,e)=>i.toLowerCase().localeCompare(e.toLowerCase()))??[],this.oldStrayText=[/{{short description\|.*?}}/i.exec(this.pageContent)?.[0],/{{DISPLAYTITLE:.*?}}/.exec(this.pageContent)?.[0],/{{italic title\|?.*?}}/i.exec(this.pageContent)?.[0],/{{title language\|.*?}}/.exec(this.pageContent)?.[0],/{{authority control(\|.*?)?}}/i.exec(this.pageContent)?.[0]].filter(Boolean).join(`
`),this.oldRedirectTarget?this.redirectInput.setValue(this.oldRedirectTarget.replaceAll("_"," ")):mw.notify("redirect-helper: Could not find redirect target!",{type:"error"}),this.tagSelect.setValue(this.oldRedirectTags);for(let[i,e]of Object.entries(this.oldRedirectTagData)){let a=this.templateEditorsInfo.find(r=>r.name===i);if(a)for(let[r,s]of e){let n=a.parameters.find(o=>[o.name,...o.aliases].includes(r));n&&n.editor.setValue(s)}}this.oldDefaultSort&&this.defaultSortInput.setValue(this.oldDefaultSort);for(let i of this.oldCategories)this.categorySelect.addAllowedValue(i),this.categorySelectInput.validCategories.add(i);this.categorySelect.setValue(this.oldCategories.map(i=>({data:i,label:i}))),this.updateSummary()}async validateSubmission(){let t=[],i=this.redirectInput.getValue().trim(),e=this.tagSelect.getValue();/^\s*[^[\]{|}]+\s*$/.test(i)||t.push({title:i,message:"is not a valid page title!"});try{this.parsedDestination=mw.Title.newFromText(i)}catch{t.length===0&&t.push({title:i,message:"is not a valid page title!"})}!this.parsedDestination&&t.length===0&&t.push({title:i,message:"is not a valid page title!"}),this.parsedDestination?.getPrefixedText()===this.pageTitleParsed.getPrefixedText()&&t.push({message:"cannot redirect to itself!"});let a=await this.api.get({action:"query",formatversion:"2",prop:["pageprops","categories"],titles:i}).catch(l=>(l==="missingtitle"?t.push({title:i,message:"does not exist!"}):t.push({title:i,message:`was not able to be fetched from the API (${l})!`}),null)),r=await this.api.get({action:"parse",page:i,prop:"sections",redirects:!0});if(r.parse.redirects.length>0){let l=r.parse.redirects[0].to+(r.parse.redirects[0].tofragment?`#${r.parse.redirects[0].tofragment}`:"");t.push({title:i,message:`is a redirect to <a href="${mw.util.getUrl(l)}" target="_blank">${l}</a>. Retarget to that page instead, as double redirects aren't allowed.`,autoFixes:[{type:"change-target",target:l}]})}if(i.split("#").length>1)if(r.parse.sections.find(u=>u.line.replaceAll(/<\/?i>/g,"")===i.split("#")[1]))e.includes("R to anchor")&&t.push({message:"is tagged as a redirect to an anchor, but it is actually a redirect to a section!",autoFixes:[{type:"add",tag:"R to section"},{type:"remove",tag:"R to anchor"}]}),e.includes("R to section")||t.push({message:"is a redirect to a section, but it is not tagged with <code>{{R to section}}</code>!",autoFixes:[{type:"add",tag:"R to section"}]});else{let u=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.parsedDestination.getPrefixedText()})).query.pages[0].revisions[0].slots.main.content;[...u.match(/(?<={{\s*?[Aa](?:nchors?|nchor for redirect|nker|NCHOR|nc)\s*?\|).+?(?=}})/g)?.map(d=>d.split("|").map(f=>f.trim())).flat()??[],...u.match(/(?<={{\s*?(?:[Vv](?:isible anchors?|isanc|Anch|anchor|isibleanchor|a)|[Aa](?:nchord|chored|nchor\+)|[Tt]ext anchor)\s*?\|).+?(?=(?<!!|=)}})/g)?.map(d=>d.split("|").map(f=>f.trim()).filter(f=>!/^text\s*?=/.test(f))).flat()??[],...u.match(/(?<=id=)"?.+?(?="|>|\|)/g)?.map(d=>d.trim())??[],...u.match(/EpisodeNumber += +\d+/g)?.map(d=>`ep${d.split("=")[1].trim()}`)??[]].includes(i.split("#")[1])?(e.includes("R to section")&&t.push({message:"is tagged as a redirect to a section, but it is actually a redirect to an anchor!",autoFixes:[{type:"add",tag:"R to anchor"},{type:"remove",tag:"R to section"}]}),e.includes("R to anchor")||t.push({message:"is a redirect to an anchor, but it is not tagged with <code>{{R from anchor}}</code>!",autoFixes:[{type:"add",tag:"R to anchor"}]})):t.push({message:`is a redirect to <a href="${mw.util.getUrl(i)}" target="_blank">${i}</a>, but that section or anchor does not exist!`,autoFixes:[{type:"change-target",target:i.split("#")[0]}]})}if(i.split("#").length===1)for(let l of["R to section","R to anchor"])e.includes(l)&&t.push({message:`is not a redirect to a section/anchor, but it is tagged with <code>{{${l}}}</code>!`,autoFixes:[{type:"remove",tag:l}]});let s=!!(a.query.pages[0].pageprops&&"disambiguation"in a.query.pages[0].pageprops),n=!!a.query.pages[0].categories?.some(l=>l.title==="Category:Surnames"),o=["R to disambiguation page","R from incomplete disambiguation"],p=["R from ambiguous sort name","R from ambiguous term"],c=o.some(l=>e.includes(l)),m=p.some(l=>e.includes(l));s&&!c&&!m&&t.push({message:"is a redirect to a disambiguation page, but it is not tagged with a disambiguation categorization template!"}),a.query.pages[0].pageprops&&!s&&((!n&&(c||m)||n&&c)&&t.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!",autoFixes:[...o,...p].map(l=>({type:"remove",tag:l}))}),n&&!m&&t.push({message:"is a redirect to a surname list, but it is not tagged with a correct disambiguation categorization template!"})),s&&e.includes("R to disambiguation page")&&!this.pageTitleParsed.getMainText().endsWith(" (disambiguation)")&&t.push({message:'is tagged with <code>{{R to disambiguation page}}</code>, but this title does not end with " (disambiguation)". Use <code>{{R from ambiguous term}}</code> or a similar categorization template instead!',autoFixes:[{type:"remove",tag:"R to disambiguation page"}]});for(let l of["R protected","R semi-protected","R extended-protected","R template-protected","R fully protected"])e.includes(l)&&t.push({message:`is tagged with unnecessarily tagged with <code>{{${l}}}</code> which will be duplicated by the redirect category shell!`,autoFixes:[{type:"remove",tag:l}]});mw.config.get("wgWikibaseItemId")&&!e.includes("R with Wikidata item")&&t.push({message:"is linked to a Wikidata item but it isn't tagged with <code>{{R with Wikidata item}}</code>!",autoFixes:[{type:"add",tag:"R with Wikidata item"}]}),e.includes("R with Wikidata item")&&!mw.config.get("wgWikibaseItemId")&&t.push({message:"is tagged with <code>{{R with Wikidata item}}</code> but it is not actually linked to a Wikidata item!",autoFixes:[{type:"remove",tag:"R with Wikidata item"}]});for(let l of e){if(!(l in this.redirectTemplates))continue;let u=this.redirectTemplates[l];for(let[h,d]of Object.entries(u.parameters)){let f=this.templateEditorsInfo.find(y=>y.name===l)?.parameters.find(y=>[y.name,...y.aliases].includes(h));f&&d.required&&!f.editor.getValue().trim()&&t.push({message:`is tagged with <code>{{${l}}}</code> but it is missing the required parameter <code>${h}</code>!`})}}return this.syncTalkCheckbox?.isSelected()&&!this.talkData.query.pages[0].missing&&!this.talkData.query.pages[0].redirect&&t.push({title:this.pageTitleParsed.getTalkPage().getPrefixedText(),message:"exists, but is not a redirect!"}),t}async handleSubmitButtonClick(){let t=[this.redirectInput,this.tagSelect,...this.templateEditorsInfo.flatMap(s=>s.parameters.map(n=>n.editor)),this.defaultSortInput,this.defaultSortSuggestButton,this.categorySelect,this.summaryInput,this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckbox,this.watchCheckbox,this.patrolCheckbox].filter(Boolean);for(let s of t)s.setDisabled(!0);this.submitButton.setLabel("Checking target validity...");let i=[];if(this.needsCheck?i=await this.validateSubmission():this.parsedDestination=mw.Title.newFromText(this.redirectInput.getValue()),i.length>0){for(let s of document.querySelectorAll(".redirect-helper-warning"))s.remove();for(let{title:s,message:n,autoFixes:o}of i){let p=new OO.ui.HtmlSnippet(`${s?`<a href="${mw.util.getUrl(s)}" target="_blank">${s}</a>`:"This page"} ${n} Click again without making changes to submit anyway.`),c=new OO.ui.MessageWidget({type:"error",classes:["redirect-helper-warning"],inline:!0,label:p});if(o){let m=new OO.ui.ButtonWidget({label:"Perform auto-fix",flags:["progressive"],classes:["redirect-helper-autofix-button"]});m.on("click",()=>{let l=this.tagSelect.getValue();for(let u of o)u.type==="add"&&!l.includes(u.tag)&&this.tagSelect.addTag(u.tag,u.tag),u.type==="remove"&&l.includes(u.tag)&&this.tagSelect.removeTagByData(u.tag),u.type==="change-target"&&this.redirectInput.setValue(u.target);c.$element[0].style.textDecoration="line-through 2px black",m.$element[0].remove()}),c.$element[0].querySelector(".oo-ui-labelElement-label").append(m.$element[0])}this.editorBox.$element[0].append(c.$element[0])}for(let s of t)s.setDisabled(!1);this.submitButton.setLabel("Submit anyway"),this.needsCheck=!1;return}this.submitButton.setLabel(`${this.exists?"Editing":"Creating"} redirect...`);let e=this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue()),a=(this.summaryInput.getValue()||this.summaryInput.$tabIndexed[0].placeholder)+this.scriptMessage;if(await this.editOrCreate(this.pageTitle,e,a)){if(mw.notify(`Redirect ${this.exists?"edited":"created"} successfully!`,{type:"success"}),this.syncTalkCheckbox?.isSelected()){this.submitButton.setLabel("Editing talk page...");let s=this.tagSelect.getValue().includes("R from move"),n=this.createOutput(this.parsedDestination.getTalkPage().getPrefixedText(),s?["R from move"]:[],void 0,void 0,[]);if(!await this.editOrCreate(this.pageTitleParsed.getTalkPage().getPrefixedText(),n,"Syncing redirect from main page"+this.scriptMessage))return;mw.notify("Talk page synced successfully!",{type:"success"})}if(this.patrolCheckbox?.isSelected()){this.submitButton.setLabel("Patrolling redirect...");let s=document.querySelector(".patrollink a"),n=document.querySelector("#mwe-pt-mark-as-reviewed-button");s?await this.api.postWithToken("patrol",{action:"patrol",rcid:new URL(s.href).searchParams.get("rcid")}).catch((p,c)=>(mw.notify(`Error patrolling ${this.pageTitle} via API: ${c?.error?.info??"Unknown error"} (${p})`,{type:"error"}),null))&&mw.notify("Redirect patrolled successfully!",{type:"success"}):n?(n.click(),mw.notify("Redirect patrolled successfully!",{type:"success"})):mw.notify("Page curation toolbar not found, redirect cannot be patrolled!",{type:"error"})}this.submitButton.setLabel("Complete, reloading..."),window.location.href=mw.util.getUrl(this.pageTitle,{redirect:"no"})}}createOutput(t,i,e,a,r){let s=mw.Title.newFromText(t),n=s?`${s.getNamespaceId()===14?":":""}${s.getPrefixedText()}${s.getFragment()?`#${s.getFragment()}`:""}`:t.trim();this.pageTitleParsed.getMainText().toLocaleLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")===a?.toLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")&&(a=void 0);let o=i.map(p=>{let c=this.templateEditorsInfo.find(u=>u.name===p);if(!c)return`{{${p}}}`;let m=c.parameters.findLastIndex((u,h)=>u.name===(h+1).toString()&&u.editor.getValue().trim()),l=c.parameters.map((u,h)=>{let d=u.editor.getValue().trim();return!d&&h>m?null:`|${u.name===(h+1).toString()?"":`${u.name}=`}${d}`}).filter(Boolean).join("");return`{{${p}${l}}}`});return[`#REDIRECT [[${n}]]
`,i.length>0?`{{Redirect category shell|
${o.join(`
`)}
}}
`:null,e?e+`
`:null,a?`{{DEFAULTSORT:${a.trim()}}}`:null,r.length>0?r.map(p=>`[[Category:${p}]]`).join(`
`):null].filter(Boolean).join(`
`)}async getPageContent(t){return(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:t})).query.pages[0].revisions[0].slots.main.content.trim()}async editOrCreate(t,i,e){let a="preferences";return this.watchCheckbox&&(this.watchCheckbox.isIndeterminate()?a=this.defaultCreatedWatchMethod:this.watchCheckbox.isSelected()?a="watch":a="unwatch"),await this.api.edit(t,()=>({text:i,summary:e})).catch((r,s)=>r==="nocreate-missing"?this.api.create(t,{summary:e,watchlist:a},i).catch((n,o)=>(mw.notify(`Error creating ${t}: ${o?.error?.info??"Unknown error"} (${n})`,{type:"error"}),null)):(mw.notify(`Error editing or creating ${t}: ${s?.error?.info??"Unknown error"} (${r})`,{type:"error"}),null))}}});var P=`#create-redirect-button{margin-bottom:20px}#redirect-helper-box{margin-right:auto;margin-bottom:25px!important;margin-left:auto;background-color:#f5f5f5;width:700px;max-width:calc(100% - 50px);color:#202122}.redirect-input-layout label{font-weight:700}.redirect-helper-redirect-possibilities:after{content:" (redirect with possibilities)";font-style:italic}.redirect-helper-template-parameters-container,.redirect-helper-template-parameters-container details{margin-top:10px;margin-bottom:10px;border-radius:5px;background-color:#e2e2e2;padding:5px}.redirect-helper-template-parameters-container summary{cursor:pointer;font-weight:700}.redirect-helper-template-parameters-container details{margin-top:5px;margin-bottom:5px;background-color:#d1cece}#redirect-helper-no-templates-message{padding:5px}#redirect-helper-summary-layout{margin-top:15px;border-top:1px solid gray;padding-top:10px}#redirect-helper-submit-layout{margin-top:10px}#redirect-helper-submit-layout>*{margin-bottom:0}.redirect-helper-warning{margin-top:8px}.redirect-helper-autofix-button{margin-left:5px;font-size:12px}.redirect-helper-autofix-button a{padding:3px 4px!important;min-height:0!important;min-height:initial!important}
`;var B=["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows","oojs-ui.styles.icons-content","oojs-ui.styles.icons-editing-core"];mw.loader.using(B,async()=>{let{default:g}=await Promise.resolve().then(()=>(L(),I));class t{api=new mw.Api;redirectTemplates;contentText;pageTitle;pageTitleParsed;createdWatchMethod;async run(){if(!this.passesPreChecks())return;this.redirectTemplates=await this.fetchRedirectTemplates();let e=document.querySelector("#mw-content-text");if(!e)return mw.notify("redirect-helper: Failed to find content text element!",{type:"error"});this.contentText=e,this.pageTitle=mw.config.get("wgPageName");let a=mw.Title.newFromText(this.pageTitle);if(!a)return mw.notify("redirect-helper: Failed to parse page title!",{type:"error"});this.pageTitleParsed=a;let r=window.redirectHelperConfiguration?.createdWatchMethod;this.createdWatchMethod=r&&["nochange","preferences","unwatch","watch"].includes(r)?r:"preferences",await this.checkPageAndLoad()}passesPreChecks(){return[mw.config.get("wgNamespaceNumber")>=0,mw.config.get("wgIsProbablyEditable"),mw.config.get("wgAction")==="view"||mw.config.get("wgAction")==="edit",(mw.config.get("wgRevisionId")||mw.config.get("wgCurRevisionId"))===mw.config.get("wgCurRevisionId"),!mw.config.get("wgDiffOldId")].every(Boolean)}async fetchRedirectTemplates(){return JSON.parse((await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:"User:Eejit43/scripts/redirect-helper.json"})).query.pages[0]?.revisions?.[0]?.slots?.main?.content||"{}")}async checkPageAndLoad(){mw.util.addCSS(P);let e=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitle}),a={redirectTemplates:this.redirectTemplates,contentText:this.contentText,pageTitle:this.pageTitle,pageTitleParsed:this.pageTitleParsed};if(e.query.pages[0].missing){let r=new OO.ui.ButtonWidget({id:"create-redirect-button",label:"Create redirect",icon:"articleRedirect",flags:["progressive"]});r.on("click",()=>{r.$element[0].remove(),new g(a,!1,this.createdWatchMethod).load()}),this.contentText.prepend(r.$element[0])}else if(e.query.pages[0].redirect)new g(a,!0,this.createdWatchMethod).load();else{let r=mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Redirect page","redirect-helper");r.addEventListener("click",s=>{s.preventDefault(),new g(a,!1,this.createdWatchMethod).load(),window.scrollTo({top:0,behavior:"smooth"}),r.remove()})}}}new t().run()});})();

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvY2F0ZWdvcnktaW5wdXQtd2lkZ2V0LnRzIiwgIi4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL2NoYW5nZXMtZGlhbG9nLnRzIiwgIi4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL291dHB1dC1wcmV2aWV3LWRpYWxvZy50cyIsICIuLi9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC10YXJnZXQtaW5wdXQtd2lkZ2V0LnRzIiwgIi4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LWhlbHBlci1kaWFsb2cudHMiLCAiLi4vc3R5bGVzL3JlZGlyZWN0LWhlbHBlci5jc3MiLCAiLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtaGVscGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzLCBDYXRlZ29yaWVzUmVzdWx0IH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgTG9va3VwRWxlbWVudENvbmZpZyB9IGZyb20gJy4vcmVkaXJlY3QtdGFyZ2V0LWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGNhdGVnb3J5IGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgcHVibGljIHZhbGlkQ2F0ZWdvcmllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuICAgIH1cblxuICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpLnNwbGl0KCd8JylbMF07XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuXG4gICAgICAgIGNvbnN0IHNvcnRLZXkgPSB0aGlzLmdldFZhbHVlKCkuc3BsaXQoJ3wnKVsxXTtcblxuICAgICAgICBpZiAoc29ydEtleSAmJiB0aGlzLnZhbGlkQ2F0ZWdvcmllcy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IFt7IGRhdGE6IGAke3ZhbHVlfXwke3NvcnRLZXl9YCwgbGFiZWw6IGAke3ZhbHVlfSAod2l0aCBzb3J0IGtleSBcIiR7c29ydEtleX1cIilgIH1dO1xuXG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IDE0LFxuICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnYWxscGFnZXMnLFxuICAgICAgICAgICAgICAgIHByb3A6ICdjYXRlZ29yaWVzJyxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAudGhlbigocmVzdWx0OiBDYXRlZ29yaWVzUmVzdWx0IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQ/LnF1ZXJ5Py5wYWdlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IHJlc3VsdC5xdWVyeS5wYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXBhZ2UuY2F0ZWdvcmllcz8uc29tZSgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6V2lraXBlZGlhIHNvZnQgcmVkaXJlY3RlZCBjYXRlZ29yaWVzJyksXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGVXaXRob3V0TmFtZXNwYWNlID0gcGFnZS50aXRsZS5zcGxpdCgnOicpWzFdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZENhdGVnb3JpZXMuYWRkKHRpdGxlV2l0aG91dE5hbWVzcGFjZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UsIGxhYmVsOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCBwYWdlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwYWdlcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIH07XG5cbiAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+XG4gICAgICAgIGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xufVxuXG5PYmplY3QuYXNzaWduKENhdGVnb3J5SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlDb21wYXJlUGFnZXNQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB1c2VkIGZvciBzaG93aW5nIGNoYW5nZXMgdG8gYmUgbWFkZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2hhbmdlc0RpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAvLyBUcmFja2luZyB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGhhc0xvYWRlZERpZmZTdHlsZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT08udWkuUHJvY2Vzc0RpYWxvZy5Db25maWdPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgQ2hhbmdlc0RpYWxvZy5zdGF0aWMubmFtZSA9ICdDaGFuZ2VzRGlhbG9nJztcbiAgICAgICAgQ2hhbmdlc0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnQ2hhbmdlcyB0byBiZSBtYWRlJztcbiAgICAgICAgQ2hhbmdlc0RpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFt7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfV07XG4gICAgfVxuXG4gICAgZ2V0U2V0dXBQcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gQ2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzTG9hZGVkRGlmZlN0eWxlcykge1xuICAgICAgICAgICAgICAgIG13LmxvYWRlci5hZGRMaW5rVGFnKCdodHRwczovL3d3dy5tZWRpYXdpa2kub3JnL3cvbG9hZC5waHA/bW9kdWxlcz1tZWRpYXdpa2kuZGlmZi5zdHlsZXMmb25seT1zdHlsZXMnKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaGFzTG9hZGVkRGlmZlN0eWxlcyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtvbGRUZXh0LCBuZXdUZXh0XSA9IHRoaXMuZ2V0RGF0YSgpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICdhY3Rpb24nOiAnY29tcGFyZScsXG4gICAgICAgICAgICAgICAgICAgICdmb3JtYXR2ZXJzaW9uJzogJzInLFxuICAgICAgICAgICAgICAgICAgICAncHJvcCc6IFsnZGlmZiddLFxuICAgICAgICAgICAgICAgICAgICAnZnJvbXNsb3RzJzogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAnZnJvbXRleHQtbWFpbic6IG9sZFRleHQsXG4gICAgICAgICAgICAgICAgICAgICdmcm9tY29udGVudG1vZGVsLW1haW4nOiAnd2lraXRleHQnLFxuICAgICAgICAgICAgICAgICAgICAndG9zbG90cyc6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgJ3RvdGV4dC1tYWluJzogbmV3VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgJ3RvY29udGVudG1vZGVsLW1haW4nOiAnd2lraXRleHQnLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaUNvbXBhcmVQYWdlc1BhcmFtcyAmIHtcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb210ZXh0LW1haW4nOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICdmcm9tY29udGVudG1vZGVsLW1haW4nOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICd0b3RleHQtbWFpbic6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgJ3RvY29udGVudG1vZGVsLW1haW4nOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBhcmlzb24gPSAocmVzdWx0IGFzIHsgY29tcGFyZTogeyBib2R5OiBzdHJpbmcgfSB9KS5jb21wYXJlLmJvZHk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9DaGFuZ2VzRWxlbWVudCA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHsgdHlwZTogJ3dhcm5pbmcnLCBsYWJlbDogJ05vIGNoYW5nZXMgdG8gbWFrZSEnIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsTGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsTGF5b3V0LiRlbGVtZW50LmFwcGVuZChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGBcbjx0YWJsZSBjbGFzcz1cImRpZmYgZGlmZi1lZGl0Zm9udC1tb25vc3BhY2VcIj5cbiAgICA8Y29sZ3JvdXA+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLW1hcmtlclwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1jb250ZW50XCI+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLW1hcmtlclwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1jb250ZW50XCI+XG4gICAgPC9jb2xncm91cD5cbiAgICA8dGJvZHk+XG4gICAgICAgICR7Y29tcGFyaXNvbn1cbiAgICA8L3Rib2R5PlxuPC90YWJsZT5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBub0NoYW5nZXNFbGVtZW50LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChwYW5lbExheW91dC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBhY3Rpb25cbiAgICAgICAgICAgID8gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBDaGFuZ2VzRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwodGhpcywgYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gQ2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG5PYmplY3QuYXNzaWduKENoYW5nZXNEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlQYXJzZVBhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgZGlhbG9nIHVzZWQgZm9yIHByZXZpZXdpbmcgdGVtcGxhdGUgb3V0cHV0LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPdXRwdXRQcmV2aWV3RGlhbG9nIGV4dGVuZHMgT08udWkuUHJvY2Vzc0RpYWxvZyB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBPTy51aS5Qcm9jZXNzRGlhbG9nLkNvbmZpZ09wdGlvbnMsIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcblxuICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcblxuICAgICAgICBPdXRwdXRQcmV2aWV3RGlhbG9nLnN0YXRpYy5uYW1lID0gJ091dHB1dFByZXZpZXdEaWFsb2cnO1xuICAgICAgICBPdXRwdXRQcmV2aWV3RGlhbG9nLnN0YXRpYy50aXRsZSA9ICdSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXMgcHJldmlldyc7XG4gICAgICAgIE91dHB1dFByZXZpZXdEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbeyBhY3Rpb246ICdjYW5jZWwnLCBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH1dO1xuICAgIH1cblxuICAgIGdldFNldHVwUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIE91dHB1dFByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdwYXJzZScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudG1vZGVsOiAnd2lraXRleHQnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiBbJ3RleHQnLCAnY2F0ZWdvcmllc2h0bWwnXSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFByZWZpeGVkRGIoKSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5nZXREYXRhKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVBhcnNlUGFyYW1zKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnc0NvbnRlbnQgPSAocmVzdWx0IGFzIHsgcGFyc2U6IHsgdGV4dDogc3RyaW5nIH0gfSkucGFyc2UudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2F0ZWdvcmllc0NvbnRlbnQgPSAocmVzdWx0IGFzIHsgcGFyc2U6IHsgY2F0ZWdvcmllc2h0bWw6IHN0cmluZyB9IH0pLnBhcnNlLmNhdGVnb3JpZXNodG1sO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsTGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsTGF5b3V0LiRlbGVtZW50LmFwcGVuZCh0YWdzQ29udGVudCwgY2F0ZWdvcmllc0NvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChwYW5lbExheW91dC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBhY3Rpb25cbiAgICAgICAgICAgID8gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBPdXRwdXRQcmV2aWV3RGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwodGhpcywgYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gT3V0cHV0UHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG5PYmplY3QuYXNzaWduKE91dHB1dFByZXZpZXdEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlQYXJzZVBhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcbmltcG9ydCB0eXBlIHsgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMsIFBhZ2VQYXJzZVJlc3VsdCB9IGZyb20gJy4uLy4uL2dsb2JhbC10eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwRWxlbWVudENvbmZpZyBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldC5Db25maWdPcHRpb25zLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LkNvbmZpZ09wdGlvbnMge31cblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgdGl0bGUgbG9va3VwIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQge1xuICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAvLyBBc3NpZ25lZCBpbiBjb25zdHJ1Y3RvclxuICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZywgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZSkge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcblxuICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcbiAgICB9XG5cbiAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlLmluY2x1ZGVzKCcjJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gdmFsdWUuc3BsaXQoJyMnKVswXTtcblxuICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAuZ2V0KHsgYWN0aW9uOiAncGFyc2UnLCBwYWdlOiB0aXRsZSwgcHJvcDogJ3NlY3Rpb25zJywgcmVkaXJlY3RzOiB0cnVlIH0gc2F0aXNmaWVzIEFwaVBhcnNlUGFyYW1zKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IFBhZ2VQYXJzZVJlc3VsdCB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFNlY3Rpb25zID0gcmVzdWx0LnBhcnNlIS5zZWN0aW9ucy5maWx0ZXIoKHNlY3Rpb24pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnRzV2l0aCh2YWx1ZS5zcGxpdCgnIycpWzFdLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFNlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogYCR7cmVzdWx0LnBhcnNlIS50aXRsZX0jJHtzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGAke3Jlc3VsdC5wYXJzZSEudGl0bGV9IyR7c2VjdGlvbi5saW5lLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogcGFyc2VkVGl0bGU/LmdldE5hbWVzcGFjZUlkKCkgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnYWxscGFnZXMnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiBbJ2luZm8nLCAncGFnZXByb3BzJ10sXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmc7IHBhZ2Vwcm9wcz86IHsgZGlzYW1iaWd1YXRpb24/OiBzdHJpbmcgfTsgcmVkaXJlY3Q/OiBzdHJpbmcgfVtdIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucXVlcnkucGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UudGl0bGUgIT09IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFByZWZpeGVkVGV4dCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBwYWdlLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhZ2UudGl0bGV9JHtwYWdlLnBhZ2Vwcm9wcyAmJiAnZGlzYW1iaWd1YXRpb24nIGluIHBhZ2UucGFnZXByb3BzID8gJyA8aT4oZGlzYW1iaWd1YXRpb24pPC9pPicgOiAnJ30keydyZWRpcmVjdCcgaW4gcGFnZSA/ICcgPGk+KHJlZGlyZWN0KTwvaT4nIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfTtcblxuICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG59XG5cbk9iamVjdC5hc3NpZ24oUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gICAgQXBpUGFyc2VQYXJhbXMsXG4gICAgQXBpUXVlcnlJbmZvUGFyYW1zLFxuICAgIEFwaVF1ZXJ5UGFnZVByb3BzUGFyYW1zLFxuICAgIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zLFxuICAgIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcyxcbn0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUge1xuICAgIENhdGVnb3JpZXNSZXN1bHQsXG4gICAgTWVkaWFXaWtpRGF0YUVycm9yLFxuICAgIFBhZ2VJbmZvUmVzdWx0LFxuICAgIFBhZ2VQYXJzZVJlc3VsdCxcbiAgICBQYWdlUmV2aXNpb25zUmVzdWx0LFxuICAgIFBhZ2VUcmlhZ2VMaXN0UmVzcG9uc2UsXG4gICAgUGFnZXByb3BzUmVzdWx0LFxufSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBXYXRjaE1ldGhvZCB9IGZyb20gJy4uL2FmY3JjLWhlbHBlci9hZmNyYy1oZWxwZXInO1xuaW1wb3J0IENhdGVnb3J5SW5wdXRXaWRnZXQgZnJvbSAnLi9jYXRlZ29yeS1pbnB1dC13aWRnZXQnO1xuaW1wb3J0IENoYW5nZXNEaWFsb2cgZnJvbSAnLi9jaGFuZ2VzLWRpYWxvZyc7XG5pbXBvcnQgT3V0cHV0UHJldmlld0RpYWxvZyBmcm9tICcuL291dHB1dC1wcmV2aWV3LWRpYWxvZyc7XG5pbXBvcnQgUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCBmcm9tICcuL3JlZGlyZWN0LXRhcmdldC1pbnB1dC13aWRnZXQnO1xuXG5leHBvcnQgdHlwZSBSZWRpcmVjdFRlbXBsYXRlRGF0YSA9IFJlY29yZDxzdHJpbmcsIHsgcmVkaXJlY3Q/OiB0cnVlOyBwYXJhbWV0ZXJzOiBSZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVyczsgYWxpYXNlczogc3RyaW5nW10gfT47XG5cbnR5cGUgUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnMgPSBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgICAgYWxpYXNlczogc3RyaW5nW107XG4gICAgICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgICByZXF1aXJlZDogYm9vbGVhbjtcbiAgICAgICAgc3VnZ2VzdGVkOiBib29sZWFuO1xuICAgICAgICBkZWZhdWx0OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgICAgZXhhbXBsZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgfVxuPjtcblxuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50O1xuICAgIHBhcmFtZXRlcnM6IHsgbmFtZTogc3RyaW5nOyBhbGlhc2VzOiBzdHJpbmdbXTsgZWRpdG9yOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQgfVtdO1xufVxuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZGlhbG9nIHBvcnRpb24gb2YgcmVkaXJlY3QtaGVscGVyIHNjcmlwdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3RIZWxwZXJEaWFsb2cge1xuICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG4gICAgcHJpdmF0ZSByZWRpcmVjdFJlZ2V4ID0gL14jLio/Oj9cXHMqXFxbXFxbXFxzKjo/KFteW1xcXXt8fV0rPylcXHMqKD86XFx8W15bXFxde3x9XSs/KT9dXVxccyovaTtcbiAgICBwcml2YXRlIHNjcmlwdE1lc3NhZ2UgPSAnICh2aWEgW1t3OmVuOlVzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlcnxyZWRpcmVjdC1oZWxwZXJdXSknO1xuXG4gICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICBwcml2YXRlIGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDtcbiAgICBwcml2YXRlIHBhZ2VUaXRsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgIHByaXZhdGUgZXhpc3RzOiBib29sZWFuO1xuICAgIHByaXZhdGUgZGVmYXVsdENyZWF0ZWRXYXRjaE1ldGhvZDogV2F0Y2hNZXRob2Q7XG5cbiAgICAvLyBVc2VkIGR1cmluZyBydW4oKVxuICAgIHByaXZhdGUgbmVlZHNDaGVjayA9IHRydWU7XG5cbiAgICBwcml2YXRlIGVkaXRvckJveCE6IE9PLnVpLlBhbmVsTGF5b3V0O1xuICAgIHByaXZhdGUgc3luY1dpdGhNYWluQnV0dG9uPzogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgIHByaXZhdGUgcmVkaXJlY3RJbnB1dCE6IFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSByZWRpcmVjdElucHV0TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSB0YWdTZWxlY3QhOiBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQ7XG4gICAgcHJpdmF0ZSB0YWdTZWxlY3RMYXlvdXQhOiBPTy51aS5BY3Rpb25GaWVsZExheW91dDtcbiAgICBwcml2YXRlIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciE6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICBwcml2YXRlIHRlbXBsYXRlRWRpdG9yc0luZm86IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm9bXSA9IFtdO1xuICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3QhOiBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldDtcbiAgICBwcml2YXRlIGNhdGVnb3J5U2VsZWN0SW5wdXQhOiBDYXRlZ29yeUlucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3RMYXlvdXQhOiBPTy51aS5GaWVsZExheW91dDtcbiAgICBwcml2YXRlIGRlZmF1bHRTb3J0SW5wdXQhOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSBkZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgcHJpdmF0ZSBkZWZhdWx0U29ydElucHV0TGF5b3V0ITogT08udWkuQWN0aW9uRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBzdW1tYXJ5SW5wdXQhOiBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgc3VtbWFyeUlucHV0TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBzdWJtaXRCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgcHJpdmF0ZSBzaG93Q2hhbmdlc0J1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICBwcml2YXRlIHNob3dQcmV2aWV3QnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgIHByaXZhdGUgc3luY1RhbGtDaGVja2JveD86IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSBzeW5jVGFsa0NoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgIHByaXZhdGUgd2F0Y2hDaGVja2JveD86IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSB3YXRjaENoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgIHByaXZhdGUgcGF0cm9sQ2hlY2tib3g/OiBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgcGF0cm9sQ2hlY2tib3hMYXlvdXQ/OiBPTy51aS5XaWRnZXQ7XG4gICAgcHJpdmF0ZSBzdWJtaXRMYXlvdXQhOiBPTy51aS5Ib3Jpem9udGFsTGF5b3V0O1xuXG4gICAgcHJpdmF0ZSB0YWxrRGF0YT86IFBhZ2VJbmZvUmVzdWx0O1xuXG4gICAgcHJpdmF0ZSBwYWdlQ29udGVudCA9ICcnO1xuXG4gICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhcmdldD86IHN0cmluZztcbiAgICBwcml2YXRlIG9sZFJlZGlyZWN0VGFncz86IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYWdEYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW11bXT47XG4gICAgcHJpdmF0ZSBvbGREZWZhdWx0U29ydD86IHN0cmluZztcbiAgICBwcml2YXRlIG9sZENhdGVnb3JpZXM/OiBzdHJpbmdbXTtcbiAgICBwcml2YXRlIG9sZFN0cmF5VGV4dD86IHN0cmluZztcblxuICAgIHByaXZhdGUgcGFyc2VkRGVzdGluYXRpb24hOiBtdy5UaXRsZSB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkaXJlY3RUZW1wbGF0ZXMsXG4gICAgICAgICAgICBjb250ZW50VGV4dCxcbiAgICAgICAgICAgIHBhZ2VUaXRsZSxcbiAgICAgICAgICAgIHBhZ2VUaXRsZVBhcnNlZCxcbiAgICAgICAgfTogeyByZWRpcmVjdFRlbXBsYXRlczogUmVkaXJlY3RUZW1wbGF0ZURhdGE7IGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDsgcGFnZVRpdGxlOiBzdHJpbmc7IHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUgfSxcbiAgICAgICAgZXhpc3RzOiBib29sZWFuLFxuICAgICAgICBjcmVhdGVkV2F0Y2hNZXRob2Q6IFdhdGNoTWV0aG9kLFxuICAgICkge1xuICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gcmVkaXJlY3RUZW1wbGF0ZXM7XG4gICAgICAgIHRoaXMuY29udGVudFRleHQgPSBjb250ZW50VGV4dDtcbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuXG4gICAgICAgIHRoaXMuZXhpc3RzID0gZXhpc3RzO1xuXG4gICAgICAgIHRoaXMuZGVmYXVsdENyZWF0ZWRXYXRjaE1ldGhvZCA9IGNyZWF0ZWRXYXRjaE1ldGhvZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgcmVkaXJlY3QtaGVscGVyIGRpYWxvZyBpbnRvIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIC8qIExvYWQgZWxlbWVudHMgKi9cbiAgICAgICAgdGhpcy5lZGl0b3JCb3ggPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBpZDogJ3JlZGlyZWN0LWhlbHBlci1ib3gnLCBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSwgZnJhbWVkOiB0cnVlIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnBhZ2VUaXRsZVBhcnNlZC5pc1RhbGtQYWdlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1haW5QYWdlRGF0YSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0U3ViamVjdFBhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgaWYgKG1haW5QYWdlRGF0YS5xdWVyeSEucGFnZXNbMF0ucmVkaXJlY3QpIGF3YWl0IHRoaXMubG9hZFN5bmNXaXRoTWFpbkJ1dHRvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkSW5wdXRFbGVtZW50cygpO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTdWJtaXRFbGVtZW50cygpO1xuXG4gICAgICAgIC8qIEFkZCBlbGVtZW50cyB0byBzY3JlZW4gYW5kIGxvYWQgZGF0YSAoaWYgYXBwbGljYWJsZSkgKi9cbiAgICAgICAgdGhpcy5lZGl0b3JCb3guJGVsZW1lbnRbMF0uYXBwZW5kKFxuICAgICAgICAgICAgLi4uKFtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNXaXRoTWFpbkJ1dHRvbj8uJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLFxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgXS5maWx0ZXIoQm9vbGVhbikgYXMgSFRNTEVsZW1lbnRbXSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50VGV4dC5wcmVwZW5kKHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdKTtcblxuICAgICAgICBpZiAodGhpcy5leGlzdHMpIHZvaWQgdGhpcy5sb2FkRXhpc3RpbmdEYXRhKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIFwiU3luYyB3aXRoIG1haW4gcGFnZVwiIGJ1dHRvblwiIG9uIHRhbGsgcGFnZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkU3luY1dpdGhNYWluQnV0dG9uKCkge1xuICAgICAgICBjb25zdCBtYWluUGFnZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFN1YmplY3RQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpKTtcblxuICAgICAgICB0aGlzLnN5bmNXaXRoTWFpbkJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1N5bmMgd2l0aCBtYWluIHBhZ2UnLCBpY29uOiAnbGluaycsIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10gfSk7XG4gICAgICAgIHRoaXMuc3luY1dpdGhNYWluQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVkaXJlY3RSZWdleC5leGVjKG1haW5QYWdlQ29udGVudCk/LlsxXTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbXcubm90aWZ5KCdGYWlsZWQgdG8gcGFyc2UgbWFpbiBwYWdlIGNvbnRlbnQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUobXcuVGl0bGUubmV3RnJvbVRleHQodGFyZ2V0KT8uZ2V0VGFsa1BhZ2UoKT8uZ2V0UHJlZml4ZWRUZXh0KCkgPz8gJycpO1xuICAgICAgICAgICAgY29uc3QgZnJvbU1vdmUgPSBbJ1IgZnJvbSBtb3ZlJywgLi4udGhpcy5yZWRpcmVjdFRlbXBsYXRlc1snUiBmcm9tIG1vdmUnXS5hbGlhc2VzXS5zb21lKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KFxuICAgICAgICAgICAgICAgICAgICBtYWluUGFnZUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoZnJvbU1vdmUpIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKFsnUiBmcm9tIG1vdmUnXSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBpbnB1dCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICAvKiBSZWRpcmVjdCB0YXJnZXQgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0ID0gbmV3IFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ1RhcmdldCBwYWdlIG5hbWUnLCByZXF1aXJlZDogdHJ1ZSB9LCB0aGlzLnBhZ2VUaXRsZVBhcnNlZCk7XG4gICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL146LywgJycpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5yZWRpcmVjdElucHV0LCB7XG4gICAgICAgICAgICBsYWJlbDogJ1JlZGlyZWN0IHRhcmdldDonLFxuICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgc2VsZWN0aW9uICovXG4gICAgICAgIHRoaXMudGFnU2VsZWN0ID0gbmV3IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd0FyYml0cmFyeTogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykubWFwKChbdGFnLCB7IHJlZGlyZWN0IH1dKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWRpcmVjdCkgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbDogdGFnIH07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChgPHNwYW4gY2xhc3M9XCJyZWRpcmVjdC1oZWxwZXItcmVkaXJlY3QtcG9zc2liaWxpdGllc1wiPiR7dGFnfTwvc3Bhbj5gKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWwgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgKHRoaXMudGFnU2VsZWN0LmdldE1lbnUoKSBhcyBPTy51aS5NZW51U2VsZWN0V2lkZ2V0LkNvbmZpZ09wdGlvbnMpLmZpbHRlck1vZGUgPSAnc3Vic3RyaW5nJztcbiAgICAgICAgdGhpcy50YWdTZWxlY3Qub24oJ2NoYW5nZScsIChzZWxlY3RlZEVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFRhZ3MgPSBzZWxlY3RlZEVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9IHNlbGVjdGVkVGFncy50b1NvcnRlZCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFRhZ3Muam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5hdCgtMSkgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5EcmFnZ2FibGVFbGVtZW50ICYgT08udWkuRWxlbWVudDtcblxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LnJlb3JkZXIobGFzdEVsZW1lbnQsIHNvcnRlZFRhZ3MuaW5kZXhPZihsYXN0RWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBlZGl0b3JJbmZvIG9mIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mbykgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIGxldCBzaG93blRlbXBsYXRlRWRpdG9ycyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdG9ySW5mbyA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWRpdG9ySW5mbykge1xuICAgICAgICAgICAgICAgICAgICBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgIHNob3duVGVtcGxhdGVFZGl0b3JzKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9IGBUZW1wbGF0ZSBwYXJhbWV0ZXJzICgke3Nob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/IGBmb3IgJHtzaG93blRlbXBsYXRlRWRpdG9yc30gdGVtcGxhdGUke3Nob3duVGVtcGxhdGVFZGl0b3JzID4gMSA/ICdzJyA6ICcnfWAgOiAnbm9uZSB0byBzaG93J30pYDtcblxuICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnN0eWxlLmRpc3BsYXkgPSBzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyAnbm9uZScgOiAnYmxvY2snO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnRhZ1NlbGVjdCwge1xuICAgICAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXM6JyxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFJlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi9cbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmNsYXNzTGlzdC5hZGQoJ3JlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lcicpO1xuXG4gICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9ICdUZW1wbGF0ZSBwYXJhbWV0ZXJzIChub25lIHRvIHNob3cpJztcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZURhdGEucGFyYW1ldGVycyk7XG4gICAgICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgc3VtbWFyeS50ZXh0Q29udGVudCA9IHRlbXBsYXRlTmFtZTtcbiAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKHN1bW1hcnkpO1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50RGF0YTogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyA9IHsgbmFtZTogdGVtcGxhdGVOYW1lLCBkZXRhaWxzLCBwYXJhbWV0ZXJzOiBbXSB9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHBhcmFtZXRlckRhdGEuZGVmYXVsdD8udG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHBhcmFtZXRlckRhdGEucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtwYXJhbWV0ZXJOYW1lfSR7IXBhcmFtZXRlckRhdGEubGFiZWwgfHwgcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJhbWV0ZXJEYXRhLmxhYmVsLnRvTG93ZXJDYXNlKCkgPyAnJyA6IGAgKCR7cGFyYW1ldGVyRGF0YS5sYWJlbH0pYH0ke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb24gPyBgICgke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb259KWAgOiAnJ30gKHR5cGU6ICR7cGFyYW1ldGVyRGF0YS50eXBlfSkgJHtwYXJhbWV0ZXJEYXRhLnN1Z2dlc3RlZCA/ICcgKHN1Z2dlc3RlZCknIDogJyd9JHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGUgPyBgIChleGFtcGxlOiBcIiR7cGFyYW1ldGVyRGF0YS5leGFtcGxlfVwiKWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoaW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEucGFyYW1ldGVycy5wdXNoKHsgbmFtZTogcGFyYW1ldGVyTmFtZSwgYWxpYXNlczogcGFyYW1ldGVyRGF0YS5hbGlhc2VzLCBlZGl0b3I6IGlucHV0IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoZGV0YWlscyk7XG5cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5wdXNoKGVsZW1lbnREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vVGVtcGxhdGVzTWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UuaWQgPSAncmVkaXJlY3QtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlJztcbiAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnRleHRDb250ZW50ID0gJ05vIHRlbXBsYXRlcyB3aXRoIHBhcmFtZXRlcnMgdG8gZGlzcGxheSEnO1xuXG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChub1RlbXBsYXRlc01lc3NhZ2UpO1xuXG4gICAgICAgIC8qIERFRkFVTFRTT1JUIGlucHV0ICovXG4gICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKHZhbHVlLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBpY29uOiAncm9ib3QnLCBsYWJlbDogJ1N1Z2dlc3QnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG5hbWUgPSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRNYWluVGV4dCgpLnJlcGxhY2UoLyBcXCguKlxcKSQvLCAnJyk7IC8vIFJlbW92ZSBkaXNhbWJpZ3VhdGlvblxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIGJpcnRoIG5hbWUnLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIGZpY3Rpb25hbCBjaGFyYWN0ZXInLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIGJhbmQgbWVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBtZW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIHBlcnNvbicsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gcGVyc29uYWwgbmFtZScsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gcmVsYXRpdmUnLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIHNwb3VzZScsXG4gICAgICAgICAgICAgICAgXS5zb21lKCh0YWcpID0+IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXModGFnKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEhhbmRsaW5nIGlzIG1vZGlmaWVkIGZyb20gZXZhZDM3J3MgXCJSYXRlclwiXG5cbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG13Lm5vdGlmeShcInJlZGlyZWN0LWhlbHBlciB3YXNuJ3QgYWJsZSB0byBkZXRlcm1pbmUgYSBzb3J0IGtleSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBwYWdlIHRpdGxlIVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybicsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IGdlbmVyYXRpb25hbFN1ZmZpeCA9ICcnO1xuICAgICAgICAgICAgICAgIGlmICgvICg/OltKU11yLj98W0lWWF0rKSQvLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbmFsU3VmZml4ID0gbmFtZS5zbGljZShuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSkgcmV0dXJuIG5hbWUgKyBnZW5lcmF0aW9uYWxTdWZmaXg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdE5hbWUgPSBuYW1lXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZShuYW1lLmxhc3RJbmRleE9mKCcgJykgKyAxKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvLCQvLCAnJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL08nLywgJ08nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdGhlck5hbWVzID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKGxhc3ROYW1lICsgJywgJyArIG90aGVyTmFtZXMgKyBnZW5lcmF0aW9uYWxTdWZmaXgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3TmFtZSA9IG5hbWUucmVwbGFjZUFsbCgnTXIuJywgJ01pc3RlcicpLnJlcGxhY2VBbGwoJyYnLCAnQW5kJyk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxlYWRpbmdBcnRpY2xlIG9mIFsnQW4nLCAnQScsICdUaGUnXSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05hbWUuc3RhcnRzV2l0aChsZWFkaW5nQXJ0aWNsZSArICcgJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBuZXdOYW1lLnNsaWNlKGxlYWRpbmdBcnRpY2xlLmxlbmd0aCArIDEpICsgJywgJyArIGxlYWRpbmdBcnRpY2xlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lID09PSBuYW1lKVxuICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXCJyZWRpcmVjdC1oZWxwZXIgd2Fzbid0IGFibGUgdG8gZGV0ZXJtaW5lIGEgc29ydCBrZXkgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgcGFnZSB0aXRsZSFcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZShuZXdOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0KHRoaXMuZGVmYXVsdFNvcnRJbnB1dCwgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24sIHtcbiAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgYERlZmF1bHQgc29ydCBrZXkgKERFRkFVTFRTT1JUKSAoc2VlIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKCdXaWtpcGVkaWE6Q2F0ZWdvcml6YXRpb24jU29ydCBrZXlzJyl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+Z3VpZGVsaW5lPC9hPik6YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLFxuICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvKiBDYXRlZ29yaWVzIHNlbGVjdGlvbiAqL1xuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQgPSBuZXcgQ2F0ZWdvcnlJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIGNhdGVnb3JpZXMgaGVyZScgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15DYXRlZ29yeTovLCAnJyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSB0aGlzLmNhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQb3NpdGlvbjogJ291dGxpbmUnLFxuICAgICAgICAgICAgaW5wdXRXaWRnZXQ6IHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3Qub24oJ2NoYW5nZScsIChzZWxlY3RlZEVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENhdGVnb3JpZXMgPSBzZWxlY3RlZEVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgY29uc3Qgc29ydGVkQ2F0ZWdvcmllcyA9IHNlbGVjdGVkQ2F0ZWdvcmllcy50b1NvcnRlZCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENhdGVnb3JpZXMuam9pbignOycpICE9PSBzb3J0ZWRDYXRlZ29yaWVzLmpvaW4oJzsnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5hdCgtMSkgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5EcmFnZ2FibGVFbGVtZW50ICYgT08udWkuRWxlbWVudDtcblxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QucmVvcmRlcihsYXN0RWxlbWVudCwgc29ydGVkQ2F0ZWdvcmllcy5pbmRleE9mKGxhc3RFbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuY2F0ZWdvcnlTZWxlY3QsIHtcbiAgICAgICAgICAgIGxhYmVsOiAnQ2F0ZWdvcmllczonLFxuICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogU3VtbWFyeSBpbnB1dCAqL1xuICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dCA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZXNvbHZlIGRvdWJsZSByZWRpcmVjdCcgfSwgLy9cbiAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZXNvbHZlIHNlbGYgcmVkaXJlY3QnIH0sXG4gICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVtb3ZlIGluY29ycmVjdCByY2F0cycgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3VtbWFyeUlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc3VtbWFyeUlucHV0LCB7XG4gICAgICAgICAgICBpZDogJ3JlZGlyZWN0LWhlbHBlci1zdW1tYXJ5LWxheW91dCcsXG4gICAgICAgICAgICBsYWJlbDogJ1N1bW1hcnk6JyxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBlbGVtZW50cyBpbiB0aGUgc3VibWl0IGJ1dHRvbiByb3cuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkU3VibWl0RWxlbWVudHMoKSB7XG4gICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICAvKiBTZXQgdXAgc3VibWl0IGJ1dHRvbiAqL1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1N1Ym1pdCcsIGRpc2FibGVkOiB0cnVlLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB0aGlzLmhhbmRsZVN1Ym1pdEJ1dHRvbkNsaWNrKCkpO1xuXG4gICAgICAgIC8qIFNldCB1cCBzaG93IHByZXZpZXcgYnV0dG9uICovXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUHJldmlld0RpYWxvZyA9IG5ldyBPdXRwdXRQcmV2aWV3RGlhbG9nKHsgc2l6ZTogJ2xhcmdlJyB9LCB0aGlzLnBhZ2VUaXRsZVBhcnNlZCk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbdGVtcGxhdGVQcmV2aWV3RGlhbG9nXSk7XG5cbiAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1Nob3cgcHJldmlldycsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRlbXBsYXRlUHJldmlld0RpYWxvZy5zZXREYXRhKFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cub3BlbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvKiBTZXQgdXAgc2hvdyBjaGFuZ2VzIGJ1dHRvbiAqL1xuICAgICAgICBjb25zdCBzaG93Q2hhbmdlc0RpYWxvZyA9IG5ldyBDaGFuZ2VzRGlhbG9nKHsgc2l6ZTogJ2xhcmdlJyB9KTtcbiAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFtzaG93Q2hhbmdlc0RpYWxvZ10pO1xuXG4gICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTaG93IGNoYW5nZXMnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5leGlzdHMpIHRoaXMucGFnZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlKTtcblxuICAgICAgICAgICAgc2hvd0NoYW5nZXNEaWFsb2cuc2V0RGF0YShbXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHNob3dDaGFuZ2VzRGlhbG9nLm9wZW4oKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogU2V0IHVwIHN5bmMgdGFsayBjaGVja2JveCAqL1xuICAgICAgICBpZiAoIXRoaXMucGFnZVRpdGxlUGFyc2VkLmlzVGFsa1BhZ2UoKSkge1xuICAgICAgICAgICAgdGhpcy50YWxrRGF0YSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcbiAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KHsgc2VsZWN0ZWQ6ICEhdGhpcy50YWxrRGF0YS5xdWVyeSEucGFnZXNbMF0ucmVkaXJlY3QgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveExheW91dCA9IG5ldyBPTy51aS5XaWRnZXQoe1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFtuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5zeW5jVGFsa0NoZWNrYm94LCB7IGxhYmVsOiAnU3luYyB0YWxrIHBhZ2UnLCBhbGlnbjogJ2lubGluZScgfSldLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTZXQgdXAgd2F0Y2ggcGFnZSBjaGVja2JveCAqL1xuICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWc6IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQuQ29uZmlnT3B0aW9ucyA9IHt9O1xuXG4gICAgICAgICAgICBpZiAoWydub2NoYW5nZScsICdwcmVmZXJlbmNlcyddLmluY2x1ZGVzKHRoaXMuZGVmYXVsdENyZWF0ZWRXYXRjaE1ldGhvZCkpIGNvbmZpZy5pbmRldGVybWluYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZGVmYXVsdENyZWF0ZWRXYXRjaE1ldGhvZCA9PT0gJ3dhdGNoJykgY29uZmlnLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgY29uZmlnLnNlbGVjdGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMud2F0Y2hDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KGNvbmZpZyk7XG5cbiAgICAgICAgICAgIHRoaXMud2F0Y2hDaGVja2JveExheW91dCA9IG5ldyBPTy51aS5XaWRnZXQoe1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFtuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy53YXRjaENoZWNrYm94LCB7IGxhYmVsOiAnV2F0Y2ggcGFnZScsIGFsaWduOiAnaW5saW5lJyB9KV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFNldCB1cCBwYXRyb2wgY2hlY2tib3ggKi9cbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tTaG91bGRQcm9tcHRQYXRyb2woKSkge1xuICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KHsgc2VsZWN0ZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3hMYXlvdXQgPSBuZXcgT08udWkuV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMucGF0cm9sQ2hlY2tib3gsIHsgbGFiZWw6ICdNYXJrIGFzIHBhdHJvbGxlZCcsIGFsaWduOiAnaW5saW5lJyB9KV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFNldCB1cCBsYXlvdXQgKi9cbiAgICAgICAgdGhpcy5zdWJtaXRMYXlvdXQgPSBuZXcgT08udWkuSG9yaXpvbnRhbExheW91dCh7XG4gICAgICAgICAgICBpZDogJ3JlZGlyZWN0LWhlbHBlci1zdWJtaXQtbGF5b3V0JyxcbiAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveExheW91dCxcbiAgICAgICAgICAgICAgICB0aGlzLndhdGNoQ2hlY2tib3hMYXlvdXQsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveExheW91dCxcbiAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pIGFzIE9PLnVpLldpZGdldFtdLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCB0byBwYXRyb2wgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja1Nob3VsZFByb21wdFBhdHJvbCgpIHtcbiAgICAgICAgY29uc3QgcGFnZVRyaWFnZU1hcmtCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbWFnZUVsZW1lbnQ+KCcjbXdlLXB0LW1hcmsgLm13ZS1wdC10b29sLWljb24nKTtcbiAgICAgICAgcGFnZVRyaWFnZU1hcmtCdXR0b24/LmNsaWNrKCk7XG4gICAgICAgIHBhZ2VUcmlhZ2VNYXJrQnV0dG9uPy5jbGljaygpO1xuXG4gICAgICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpICE9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYXRyb2xsaW5rJykpIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmstYXMtcmV2aWV3ZWQtYnV0dG9uJykpIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmstYXMtdW5yZXZpZXdlZC1idXR0b24nKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gYXdhaXQgbXcudXNlci5nZXRSaWdodHMoKTtcbiAgICAgICAgICAgIGlmICghdXNlclBlcm1pc3Npb25zLmluY2x1ZGVzKCdwYXRyb2wnKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICBjb25zdCBwYXRyb2xSZXNwb25zZSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3BhZ2V0cmlhZ2VsaXN0JyxcbiAgICAgICAgICAgICAgICBwYWdlX2lkOiBtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgUGFnZVRyaWFnZUFwaVBhZ2VUcmlhZ2VMaXN0UGFyYW1zKSkgYXMgUGFnZVRyaWFnZUxpc3RSZXNwb25zZTtcblxuICAgICAgICAgICAgaWYgKHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnBhZ2VzWzBdPy51c2VyX25hbWUgPT09IG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZWxzZSBpZiAocGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucmVzdWx0ICE9PSAnc3VjY2VzcycgfHwgcGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlIHJldHVybiAhTnVtYmVyLnBhcnNlSW50KHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnBhZ2VzWzBdPy5wYXRyb2xfc3RhdHVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHN1bW1hcnkgaW5wdXQgcGxhY2Vob2xkZXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVTdW1tYXJ5KCkge1xuICAgICAgICBjb25zdCByZWRpcmVjdFZhbHVlID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgIGlmICghcmVkaXJlY3RWYWx1ZSkgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gJyc7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZXhpc3RzKSB7XG4gICAgICAgICAgICBsZXQgb2xkVGFyZ2V0ID0gdGhpcy5vbGRSZWRpcmVjdFRhcmdldD8ucmVwbGFjZUFsbCgnXycsICcgJyk7XG4gICAgICAgICAgICBpZiAob2xkVGFyZ2V0KSBvbGRUYXJnZXQgPSBvbGRUYXJnZXRbMF0udG9VcHBlckNhc2UoKSArIG9sZFRhcmdldC5zbGljZSgxKTtcblxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0Q2hhbmdlZCA9IHJlZGlyZWN0VmFsdWUgIT09IG9sZFRhcmdldDtcblxuICAgICAgICAgICAgY29uc3QgdGFnc0NoYW5nZWQgPVxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuc29tZSgodGFnKSA9PiAhdGhpcy5vbGRSZWRpcmVjdFRhZ3MhLmluY2x1ZGVzKHRhZyBhcyBzdHJpbmcpKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdzIS5zb21lKCh0YWcpID0+ICF0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZykpO1xuXG4gICAgICAgICAgICBsZXQgdGFnQXJndW1lbnRzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnc1dpdGhQYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAoWywgZGF0YV0pID0+IE9iamVjdC5lbnRyaWVzKGRhdGEucGFyYW1ldGVycykubGVuZ3RoID4gMCxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbdGFnLCBkYXRhXSBvZiB0YWdzV2l0aFBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnV2FzU2VsZWN0ZWQgPSB0aGlzLm9sZFJlZGlyZWN0VGFncyEuaW5jbHVkZXModGFnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdXYXNTZWxlY3RlZCB8fCAhdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyh0YWcpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRUYWdEYXRhID0gdGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGFbdGFnXSA/PyBPYmplY3QuZW50cmllcyhkYXRhLnBhcmFtZXRlcnMpLm1hcCgoW25hbWVdKSA9PiBbbmFtZSwgJyddKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFRhZ0VkaXRvckRhdGEgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm5hbWUgPT09IHRhZykhO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIGZvdW5kVGFnRWRpdG9yRGF0YS5wYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRBcmd1bWVudCA9IG9sZFRhZ0RhdGEuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50WzBdID09PSBwYXJhbWV0ZXIubmFtZSk/LlsxXSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FyZ3VtZW50ID0gcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZEFyZ3VtZW50ICE9PSBuZXdBcmd1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0FyZ3VtZW50c0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ0FyZ3VtZW50c0NoYW5nZWQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFNvcnRDaGFuZ2VkID0gdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCkudHJpbSgpICE9PSB0aGlzLm9sZERlZmF1bHRTb3J0IS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcmllc0NoYW5nZWQgPVxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKChjYXRlZ29yeSkgPT4gIXRoaXMub2xkQ2F0ZWdvcmllcyEuaW5jbHVkZXMoY2F0ZWdvcnkgYXMgc3RyaW5nKSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLm9sZENhdGVnb3JpZXMhLnNvbWUoKGNhdGVnb3J5KSA9PiAhdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKGNhdGVnb3J5KSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSBbXTtcblxuICAgICAgICAgICAgaWYgKHRhcmdldENoYW5nZWQpIGNoYW5nZXMucHVzaChgcmV0YXJnZXQgdG8gW1ske3JlZGlyZWN0VmFsdWV9XV1gKTtcbiAgICAgICAgICAgIGlmICh0YWdzQ2hhbmdlZClcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGAke3RoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkubGVuZ3RoID4gMCAmJiB0aGlzLm9sZFJlZGlyZWN0VGFncyEubGVuZ3RoID4gMCA/ICdjaGFuZ2UnIDogdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwID8gJ2FkZCcgOiAncmVtb3ZlJ30gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHRhZ0FyZ3VtZW50c0NoYW5nZWQpIGNoYW5nZXMucHVzaCgnY2hhbmdlIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIGFyZ3VtZW50cycpO1xuICAgICAgICAgICAgaWYgKGRlZmF1bHRTb3J0Q2hhbmdlZClcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGAke3RoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKS5sZW5ndGggPiAwICYmIHRoaXMub2xkRGVmYXVsdFNvcnQhLnJlcGxhY2VBbGwoJ18nLCAnICcpLmxlbmd0aCA+IDAgPyAnY2hhbmdlJyA6IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKS5sZW5ndGggPiAwID8gJ2FkZCcgOiAncmVtb3ZlJ30gZGVmYXVsdCBzb3J0IGtleWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChjYXRlZ29yaWVzQ2hhbmdlZClcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGAke3RoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwICYmIHRoaXMub2xkQ2F0ZWdvcmllcyEubGVuZ3RoID4gMCA/ICdjaGFuZ2UnIDogdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLmxlbmd0aCA+IDAgPyAnYWRkJyA6ICdyZW1vdmUnfSBjYXRlZ29yaWVzYCxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIGNoYW5nZXMucHVzaCgncGVyZm9ybSByZWRpcmVjdCBjbGVhbnVwJyk7XG5cbiAgICAgICAgICAgIGNoYW5nZXNbMF0gPSBjaGFuZ2VzWzBdWzBdLnRvVXBwZXJDYXNlKCkgKyBjaGFuZ2VzWzBdLnNsaWNlKDEpO1xuICAgICAgICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoID4gMSkgY2hhbmdlc1tjaGFuZ2VzLmxlbmd0aCAtIDFdID0gYGFuZCAke2NoYW5nZXMuYXQoLTEpfWA7XG5cbiAgICAgICAgICAgICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlciA9IGNoYW5nZXMuam9pbihjaGFuZ2VzLmxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgICAgICAgfSBlbHNlICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlciA9IGBDcmVhdGUgcmVkaXJlY3QgdG8gW1ske3JlZGlyZWN0VmFsdWV9XV1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGV4aXN0aW5nIHBhZ2UgZGF0YS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRFeGlzdGluZ0RhdGEoKSB7XG4gICAgICAgIGlmICh0aGlzLmV4aXN0cykgdGhpcy5wYWdlQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGUpO1xuXG4gICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYXJnZXQgPSB0aGlzLnJlZGlyZWN0UmVnZXguZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzFdO1xuXG4gICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdzID0gKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcylcbiAgICAgICAgICAgICAgICAubWFwKChbdGFnLCB0YWdEYXRhXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgW3RhZywgLi4udGFnRGF0YS5hbGlhc2VzXS5zb21lKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBge3tcXFxccypbJHt0YWdPclJlZGlyZWN0WzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdPclJlZGlyZWN0WzBdfV0ke3RhZ09yUmVkaXJlY3Quc2xpY2UoMSl9XFxcXHMqKFxcXFx8fH19KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRlc3QodGhpcy5wYWdlQ29udGVudCksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGFnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW11cbiAgICAgICAgKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlZGlyZWN0VGFncyA9IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpXG4gICAgICAgICAgICAuZmxhdE1hcCgoW3RhZywgdGFnRGF0YV0pID0+IFt0YWcsIC4uLnRhZ0RhdGEuYWxpYXNlc10pXG4gICAgICAgICAgICAubWFwKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgPyB0YWdPclJlZGlyZWN0XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW107XG5cbiAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBvcmlnaW5hbFJlZGlyZWN0VGFnc1xuICAgICAgICAgICAgICAgIC5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnWzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdbMF19XSR7dGFnLnNsaWNlKDEpfVxcXFx8PyguKj8pXFxcXHMqfX1gKS5leGVjKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdUYWcgPSBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5maW5kKChbdGVtcGxhdGUsIHRhZ0RhdGFdKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlLCAuLi50YWdEYXRhLmFsaWFzZXNdLmluY2x1ZGVzKHRhZyksXG4gICAgICAgICAgICAgICAgICAgICk/LlswXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbEFyZ3VtZW50cyA9IG1hdGNoPy5bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3JpZ2luYWxBcmd1bWVudHMpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEFyZ3VtZW50cyA9IG1hdGNoWzFdLnNwbGl0KCd8JykubWFwKChhcmd1bWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJndW1lbnQuaW5jbHVkZXMoJz0nKSkgcmV0dXJuIFsoaW5kZXggKyAxKS50b1N0cmluZygpLCBhcmd1bWVudC50cmltKCldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gYXJndW1lbnQuc3BsaXQoJz0nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuYW1lLnRyaW0oKSwgdmFsdWUudHJpbSgpXTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuZXdUYWcsIGZvcm1hdHRlZEFyZ3VtZW50c107XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFtzdHJpbmcsIHN0cmluZ1tdW11dW10sXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vbGREZWZhdWx0U29ydCA9XG4gICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50XG4gICAgICAgICAgICAgICAgLm1hdGNoKC97e0RFRkFVTFRTT1JUOi4qP319L2cpXG4gICAgICAgICAgICAgICAgPy5hdCgtMSlcbiAgICAgICAgICAgICAgICA/LnNsaWNlKDE0LCAtMilcbiAgICAgICAgICAgICAgICAudHJpbSgpID8/ICcnO1xuXG4gICAgICAgIHRoaXMub2xkQ2F0ZWdvcmllcyA9XG4gICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50XG4gICAgICAgICAgICAgICAgLm1hdGNoKC9cXFtcXFtbQ2NdYXRlZ29yeTouKz9dXS9nKVxuICAgICAgICAgICAgICAgID8ubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuc2xpY2UoMTEsIC0yKSlcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSkgPz8gW107XG5cbiAgICAgICAgdGhpcy5vbGRTdHJheVRleHQgPSBbXG4gICAgICAgICAgICAve3tzaG9ydCBkZXNjcmlwdGlvblxcfC4qP319L2kuZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICAgICAgL3t7RElTUExBWVRJVExFOi4qP319Ly5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAve3tpdGFsaWMgdGl0bGVcXHw/Lio/fX0vaS5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAve3t0aXRsZSBsYW5ndWFnZVxcfC4qP319Ly5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAve3thdXRob3JpdHkgY29udHJvbChcXHwuKj8pP319L2kuZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICBdXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAgICAgaWYgKHRoaXMub2xkUmVkaXJlY3RUYXJnZXQpIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZSh0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0LnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgZWxzZSBtdy5ub3RpZnkoJ3JlZGlyZWN0LWhlbHBlcjogQ291bGQgbm90IGZpbmQgcmVkaXJlY3QgdGFyZ2V0IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICB0aGlzLnRhZ1NlbGVjdC5zZXRWYWx1ZSh0aGlzLm9sZFJlZGlyZWN0VGFncyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCBkYXRhXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kVGVtcGxhdGVFZGl0b3IgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0ZW1wbGF0ZU5hbWUpO1xuICAgICAgICAgICAgaWYgKCFmb3VuZFRlbXBsYXRlRWRpdG9yKSBjb250aW51ZTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgYXJndW1lbnRdIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFBhcmFtZXRlckVkaXRvciA9IGZvdW5kVGVtcGxhdGVFZGl0b3IucGFyYW1ldGVycy5maW5kKChwYXJhbWV0ZXIpID0+XG4gICAgICAgICAgICAgICAgICAgIFtwYXJhbWV0ZXIubmFtZSwgLi4ucGFyYW1ldGVyLmFsaWFzZXNdLmluY2x1ZGVzKHBhcmFtZXRlck5hbWUpLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZm91bmRQYXJhbWV0ZXJFZGl0b3IpIGZvdW5kUGFyYW1ldGVyRWRpdG9yLmVkaXRvci5zZXRWYWx1ZShhcmd1bWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vbGREZWZhdWx0U29ydCkgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKHRoaXMub2xkRGVmYXVsdFNvcnQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgdGhpcy5vbGRDYXRlZ29yaWVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShjYXRlZ29yeSk7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQudmFsaWRDYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZSh0aGlzLm9sZENhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gKHsgZGF0YTogY2F0ZWdvcnksIGxhYmVsOiBjYXRlZ29yeSB9KSkpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgY2hlY2tzIG9uIHRoZSBwcm92aWRlZCBkYXRhIGFuZCByZXR1cm5zIHRoZSBlcnJvcnMgKGlmIGFueSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVN1Ym1pc3Npb24oKSB7XG4gICAgICAgIGNvbnN0IGVycm9yczoge1xuICAgICAgICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICAgICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICAgICAgICBhdXRvRml4ZXM/OiAoeyB0eXBlOiAnYWRkJyB8ICdyZW1vdmUnOyB0YWc6IHN0cmluZyB9IHwgeyB0eXBlOiAnY2hhbmdlLXRhcmdldCc7IHRhcmdldDogc3RyaW5nIH0pW107XG4gICAgICAgIH1bXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICBjb25zdCB0YWdzID0gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAvKiBJbnZhbGlkIGNoYXJhY3RlcnMgKi9cbiAgICAgICAgaWYgKCEvXlxccypbXltcXF17fH1dK1xccyokLy50ZXN0KGRlc3RpbmF0aW9uKSkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG5cbiAgICAgICAgLyogRmFpbGVkIGR1cmluZyB0aXRsZSBwYXJzaW5nICovXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQoZGVzdGluYXRpb24pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAwKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucGFyc2VkRGVzdGluYXRpb24gJiYgZXJyb3JzLmxlbmd0aCA9PT0gMCkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG5cbiAgICAgICAgLyogU2VsZiByZWRpcmVjdHMgKi9cbiAgICAgICAgaWYgKHRoaXMucGFyc2VkRGVzdGluYXRpb24/LmdldFByZWZpeGVkVGV4dCgpID09PSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRQcmVmaXhlZFRleHQoKSlcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2Nhbm5vdCByZWRpcmVjdCB0byBpdHNlbGYhJyB9KTtcblxuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkRhdGEgPSAoYXdhaXQgdGhpcy5hcGlcbiAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogWydwYWdlcHJvcHMnLCAnY2F0ZWdvcmllcyddLFxuICAgICAgICAgICAgICAgIHRpdGxlczogZGVzdGluYXRpb24sXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVBhZ2VQcm9wc1BhcmFtcylcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3JDb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gJ21pc3Npbmd0aXRsZScpIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnZG9lcyBub3QgZXhpc3QhJyB9KTtcbiAgICAgICAgICAgICAgICBlbHNlIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiBgd2FzIG5vdCBhYmxlIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgQVBJICgke2Vycm9yQ29kZX0pIWAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0pKSBhcyAoUGFnZXByb3BzUmVzdWx0ICYgQ2F0ZWdvcmllc1Jlc3VsdCkgfCBudWxsO1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvblBhcnNlUmVzdWx0ID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdwYXJzZScsXG4gICAgICAgICAgICBwYWdlOiBkZXN0aW5hdGlvbixcbiAgICAgICAgICAgIHByb3A6ICdzZWN0aW9ucycsXG4gICAgICAgICAgICByZWRpcmVjdHM6IHRydWUsXG4gICAgICAgIH0gc2F0aXNmaWVzIEFwaVBhcnNlUGFyYW1zKSkgYXMgUGFnZVBhcnNlUmVzdWx0O1xuXG4gICAgICAgIC8qIERvdWJsZSByZWRpcmVjdHMgKi9cbiAgICAgICAgaWYgKGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UhLnJlZGlyZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblJlZGlyZWN0ID1cbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlIS5yZWRpcmVjdHNbMF0udG8gK1xuICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlIS5yZWRpcmVjdHNbMF0udG9mcmFnbWVudCA/IGAjJHtkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlIS5yZWRpcmVjdHNbMF0udG9mcmFnbWVudH1gIDogJycpO1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBkZXN0aW5hdGlvbixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgYSByZWRpcmVjdCB0byA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybChcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25SZWRpcmVjdCxcbiAgICAgICAgICAgICAgICApfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7ZGVzdGluYXRpb25SZWRpcmVjdH08L2E+LiBSZXRhcmdldCB0byB0aGF0IHBhZ2UgaW5zdGVhZCwgYXMgZG91YmxlIHJlZGlyZWN0cyBhcmVuJ3QgYWxsb3dlZC5gLFxuICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ2NoYW5nZS10YXJnZXQnLCB0YXJnZXQ6IGRlc3RpbmF0aW9uUmVkaXJlY3QgfV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIE5vbmV4aXN0ZW50IHNlY3Rpb24gKi9cbiAgICAgICAgaWYgKGRlc3RpbmF0aW9uLnNwbGl0KCcjJykubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRTZWN0aW9uID0gZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZSEuc2VjdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAoc2VjdGlvbikgPT4gc2VjdGlvbi5saW5lLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpID09PSBkZXN0aW5hdGlvbi5zcGxpdCgnIycpWzFdLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh2YWxpZFNlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB0byBhbmNob3InKSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIHRhZ2dlZCBhcyBhIHJlZGlyZWN0IHRvIGFuIGFuY2hvciwgYnV0IGl0IGlzIGFjdHVhbGx5IGEgcmVkaXJlY3QgdG8gYSBzZWN0aW9uIScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdhZGQnLCB0YWc6ICdSIHRvIHNlY3Rpb24nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVtb3ZlJywgdGFnOiAnUiB0byBhbmNob3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhZ3MuaW5jbHVkZXMoJ1IgdG8gc2VjdGlvbicpKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24sIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHRvIHNlY3Rpb259fTwvY29kZT4hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gc2VjdGlvbicgfV0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbnRlbnQgPSAoXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYXJzZWREZXN0aW5hdGlvbiEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICAgICAgICAgICkucXVlcnkhLnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQ7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhbmNob3JzID0gW1xuICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goLyg/PD17e1xccyo/W0FhXSg/Om5jaG9ycz98bmNob3IgZm9yIHJlZGlyZWN0fG5rZXJ8TkNIT1J8bmMpXFxzKj9cXHwpLis/KD89fX0pL2cpXG4gICAgICAgICAgICAgICAgICAgICAgICA/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGFuY2hvci5zcGxpdCgnfCcpLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZsYXQoKSA/PyBbXSksXG4gICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKD88PXt7XFxzKj8oPzpbVnZdKD86aXNpYmxlIGFuY2hvcnM/fGlzYW5jfEFuY2h8YW5jaG9yfGlzaWJsZWFuY2hvcnxhKXxbQWFdKD86bmNob3JkfGNob3JlZHxuY2hvclxcKyl8W1R0XWV4dCBhbmNob3IpXFxzKj9cXHwpLis/KD89KD88ISF8PSl9fSkvZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgID8ubWFwKChhbmNob3I6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCd8JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhcnQpID0+ICEvXnRleHRcXHMqPz0vLnRlc3QocGFydCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZsYXQoKSA/PyBbXSksXG4gICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnQubWF0Y2goLyg/PD1pZD0pXCI/Lis/KD89XCJ8PnxcXHwpL2cpPy5tYXAoKGFuY2hvcjogc3RyaW5nKSA9PiBhbmNob3IudHJpbSgpKSA/PyBbXSksXG4gICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnQubWF0Y2goL0VwaXNvZGVOdW1iZXIgKz0gK1xcZCsvZyk/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGBlcCR7YW5jaG9yLnNwbGl0KCc9JylbMV0udHJpbSgpfWApID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBbXSksXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9ycy5pbmNsdWRlcyhkZXN0aW5hdGlvbi5zcGxpdCgnIycpWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIHRhZ2dlZCBhcyBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiwgYnV0IGl0IGlzIGFjdHVhbGx5IGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yIScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gYW5jaG9yJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZW1vdmUnLCB0YWc6ICdSIHRvIHNlY3Rpb24nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhZ3MuaW5jbHVkZXMoJ1IgdG8gYW5jaG9yJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiBmcm9tIGFuY2hvcn19PC9jb2RlPiEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gYW5jaG9yJyB9XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgYSByZWRpcmVjdCB0byA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybChkZXN0aW5hdGlvbil9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHtkZXN0aW5hdGlvbn08L2E+LCBidXQgdGhhdCBzZWN0aW9uIG9yIGFuY2hvciBkb2VzIG5vdCBleGlzdCFgLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnY2hhbmdlLXRhcmdldCcsIHRhcmdldDogZGVzdGluYXRpb24uc3BsaXQoJyMnKVswXSB9XSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBJbXByb3Blcmx5IHRhZ2dlZCBhcyByZWRpcmVjdCB0byBzZWN0aW9uL2FuY2hvciAqL1xuICAgICAgICBpZiAoZGVzdGluYXRpb24uc3BsaXQoJyMnKS5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBbJ1IgdG8gc2VjdGlvbicsICdSIHRvIGFuY2hvciddKVxuICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKHRhZykpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBub3QgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24vYW5jaG9yLCBidXQgaXQgaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RhZ319fTwvY29kZT4hYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZyB9XSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgPSAhIShcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uRGF0YSEucXVlcnkhLnBhZ2VzWzBdLnBhZ2Vwcm9wcyAmJiAnZGlzYW1iaWd1YXRpb24nIGluIGRlc3RpbmF0aW9uRGF0YSEucXVlcnkhLnBhZ2VzWzBdLnBhZ2Vwcm9wc1xuICAgICAgICApO1xuICAgICAgICBjb25zdCB0YXJnZXRJc1N1cm5hbWVMaXN0ID0gISFkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5IS5wYWdlc1swXS5jYXRlZ29yaWVzPy5zb21lKFxuICAgICAgICAgICAgKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50aXRsZSA9PT0gJ0NhdGVnb3J5OlN1cm5hbWVzJyxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3MgPSBbJ1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZScsICdSIGZyb20gaW5jb21wbGV0ZSBkaXNhbWJpZ3VhdGlvbiddO1xuICAgICAgICBjb25zdCB0b1N1cm5hbWVMaXN0VGFncyA9IFsnUiBmcm9tIGFtYmlndW91cyBzb3J0IG5hbWUnLCAnUiBmcm9tIGFtYmlndW91cyB0ZXJtJ107XG5cbiAgICAgICAgY29uc3QgdGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlID0gdG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzLnNvbWUoKHRlbXBsYXRlKSA9PiB0YWdzLmluY2x1ZGVzKHRlbXBsYXRlKSk7XG4gICAgICAgIGNvbnN0IHRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0ID0gdG9TdXJuYW1lTGlzdFRhZ3Muc29tZSgodGVtcGxhdGUpID0+IHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKTtcblxuICAgICAgICAvKiBSZWRpcmVjdCB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlIHdpdGhvdXQgdGVtcGxhdGUgKi9cbiAgICAgICAgaWYgKHRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlICYmICF0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgJiYgIXRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0KVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgZGlzYW1iaWd1YXRpb24gcGFnZSwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCBhIGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZGVzdGluYXRpb25EYXRhIS5xdWVyeSEucGFnZXNbMF0ucGFnZXByb3BzICYmICF0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSkge1xuICAgICAgICAgICAgLyogSW1wcm9wZXJseSB0YWdnZWQgYXMgcmVkaXJlY3QgdG8gZGlzYW1iaWd1YXRpb24gcGFnZSAqL1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICghdGFyZ2V0SXNTdXJuYW1lTGlzdCAmJiAodGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlIHx8IHRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0KSkgfHxcbiAgICAgICAgICAgICAgICAodGFyZ2V0SXNTdXJuYW1lTGlzdCAmJiB0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgbm90IGEgcmVkaXJlY3QgdG8gYSBkaXNhbWJpZ3VhdGlvbiBwYWdlLCBidXQgaXQgaXMgdGFnZ2VkIHdpdGggYSBkaXNhbWJpZ3VhdGlvbiBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSEnLFxuICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFsuLi50b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3MsIC4uLnRvU3VybmFtZUxpc3RUYWdzXS5tYXAoKHRhZykgPT4gKHsgdHlwZTogJ3JlbW92ZScsIHRhZyB9KSksXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIFJlZGlyZWN0IHRvIHN1cm5hbWUgbGlzdCB3aXRob3V0IHRlbXBsYXRlICovXG4gICAgICAgICAgICBpZiAodGFyZ2V0SXNTdXJuYW1lTGlzdCAmJiAhdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhIHN1cm5hbWUgbGlzdCwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCBhIGNvcnJlY3QgZGlzYW1iaWd1YXRpb24gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUhJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIHt7UiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlfX0gd2l0aG91dCBcIiAoZGlzYW1iaWd1YXRpb24pXCIgYXQgZW5kIG9mIHRpdGxlICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlICYmXG4gICAgICAgICAgICB0YWdzLmluY2x1ZGVzKCdSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2UnKSAmJlxuICAgICAgICAgICAgIXRoaXMucGFnZVRpdGxlUGFyc2VkLmdldE1haW5UZXh0KCkuZW5kc1dpdGgoJyAoZGlzYW1iaWd1YXRpb24pJylcbiAgICAgICAgKVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICdpcyB0YWdnZWQgd2l0aCA8Y29kZT57e1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZX19PC9jb2RlPiwgYnV0IHRoaXMgdGl0bGUgZG9lcyBub3QgZW5kIHdpdGggXCIgKGRpc2FtYmlndWF0aW9uKVwiLiBVc2UgPGNvZGU+e3tSIGZyb20gYW1iaWd1b3VzIHRlcm19fTwvY29kZT4gb3IgYSBzaW1pbGFyIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIGluc3RlYWQhJyxcbiAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdyZW1vdmUnLCB0YWc6ICdSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2UnIH1dLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLyogVGFnZ2VkIHdpdGggYSBwcm90ZWN0aW9uIHRlbXBsYXRlICovXG4gICAgICAgIGZvciAoY29uc3QgdGVtcGxhdGUgb2YgWydSIHByb3RlY3RlZCcsICdSIHNlbWktcHJvdGVjdGVkJywgJ1IgZXh0ZW5kZWQtcHJvdGVjdGVkJywgJ1IgdGVtcGxhdGUtcHJvdGVjdGVkJywgJ1IgZnVsbHkgcHJvdGVjdGVkJ10pXG4gICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgdGFnZ2VkIHdpdGggdW5uZWNlc3NhcmlseSB0YWdnZWQgd2l0aCA8Y29kZT57eyR7dGVtcGxhdGV9fX08L2NvZGU+IHdoaWNoIHdpbGwgYmUgZHVwbGljYXRlZCBieSB0aGUgcmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGwhYCxcbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAncmVtb3ZlJywgdGFnOiB0ZW1wbGF0ZSB9XSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAvKiBMaW5rZWQgdG8gYSBXaWtpZGF0YSBpdGVtIHdpdGhvdXQgYmVpbmcgdGFnZ2VkIHdpdGgge3tSIHdpdGggV2lraWRhdGEgaXRlbX19ICovXG4gICAgICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z1dpa2liYXNlSXRlbUlkJykgJiYgIXRhZ3MuaW5jbHVkZXMoJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJykpXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJpcyBsaW5rZWQgdG8gYSBXaWtpZGF0YSBpdGVtIGJ1dCBpdCBpc24ndCB0YWdnZWQgd2l0aCA8Y29kZT57e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX08L2NvZGU+IVwiLFxuICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ2FkZCcsIHRhZzogJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJyB9XSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFRhZ2dlZCB3aXRoIHt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fSB3aXRob3V0IGJlaW5nIGxpbmtlZCB0byBhbiBpdGVtICovXG4gICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHdpdGggV2lraWRhdGEgaXRlbScpICYmICFtdy5jb25maWcuZ2V0KCd3Z1dpa2liYXNlSXRlbUlkJykpXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fTwvY29kZT4gYnV0IGl0IGlzIG5vdCBhY3R1YWxseSBsaW5rZWQgdG8gYSBXaWtpZGF0YSBpdGVtIScsXG4gICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAncmVtb3ZlJywgdGFnOiAnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nIH1dLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLyogTWlzc2luZyB0YWcgcmVxdWlyZWQgcGFyYW1ldGVyICovXG4gICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgICAgICAgIGlmICghKHRhZyBpbiB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzW3RhZ107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIHBhcmFtZXRlckRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ0RhdGEucGFyYW1ldGVycykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFBhcmFtZXRlciA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mb1xuICAgICAgICAgICAgICAgICAgICAuZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpXG4gICAgICAgICAgICAgICAgICAgID8ucGFyYW1ldGVycy5maW5kKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgLi4ucGFyYW1ldGVyLmFsaWFzZXNdLmluY2x1ZGVzKHBhcmFtZXRlck5hbWUpKTtcblxuICAgICAgICAgICAgICAgIGlmICghZm91bmRQYXJhbWV0ZXIpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlckRhdGEucmVxdWlyZWQgJiYgIWZvdW5kUGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7JHt0YWd9fX08L2NvZGU+IGJ1dCBpdCBpcyBtaXNzaW5nIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXIgPGNvZGU+JHtwYXJhbWV0ZXJOYW1lfTwvY29kZT4hYCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTeW5jaW5nIHRhbGsgcGFnZSBidXQgdGFsayBwYWdlIGV4aXN0cyBhbmQgaXNuJ3QgYSByZWRpcmVjdCAqL1xuICAgICAgICBpZiAodGhpcy5zeW5jVGFsa0NoZWNrYm94Py5pc1NlbGVjdGVkKCkgJiYgIXRoaXMudGFsa0RhdGEhLnF1ZXJ5IS5wYWdlc1swXS5taXNzaW5nICYmICF0aGlzLnRhbGtEYXRhIS5xdWVyeSEucGFnZXNbMF0ucmVkaXJlY3QpXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdleGlzdHMsIGJ1dCBpcyBub3QgYSByZWRpcmVjdCEnLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHRoZSBldmVudCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgXCJTdWJtaXRcIiBidXR0b24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTdWJtaXRCdXR0b25DbGljaygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHNUb0Rpc2FibGUgPSBbXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQsXG4gICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdCxcbiAgICAgICAgICAgIC4uLnRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5mbGF0TWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyLmVkaXRvcikpLFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LFxuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXQsXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbixcbiAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24sXG4gICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5zeW5jVGFsa0NoZWNrYm94LFxuICAgICAgICAgICAgdGhpcy53YXRjaENoZWNrYm94LFxuICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCxcbiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzVG9EaXNhYmxlKSAoZWxlbWVudCBhcyBPTy51aS5XaWRnZXQpLnNldERpc2FibGVkKHRydWUpO1xuXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdDaGVja2luZyB0YXJnZXQgdmFsaWRpdHkuLi4nKTtcblxuICAgICAgICBsZXQgZXJyb3JzOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHRoaXMudmFsaWRhdGVTdWJtaXNzaW9uPj4gPSBbXTtcbiAgICAgICAgaWYgKHRoaXMubmVlZHNDaGVjaykgZXJyb3JzID0gYXdhaXQgdGhpcy52YWxpZGF0ZVN1Ym1pc3Npb24oKTtcbiAgICAgICAgZWxzZSB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkpO1xuXG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZWRpcmVjdC1oZWxwZXItd2FybmluZycpKSBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB7IHRpdGxlLCBtZXNzYWdlLCBhdXRvRml4ZXMgfSBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICAgICAgYCR7dGl0bGUgPyBgPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwodGl0bGUpfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7dGl0bGV9PC9hPmAgOiAnVGhpcyBwYWdlJ30gJHttZXNzYWdlfSBDbGljayBhZ2FpbiB3aXRob3V0IG1ha2luZyBjaGFuZ2VzIHRvIHN1Ym1pdCBhbnl3YXkuYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdhcm5pbmdNZXNzYWdlID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWhlbHBlci13YXJuaW5nJ10sXG4gICAgICAgICAgICAgICAgICAgIGlubGluZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG9GaXhCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUGVyZm9ybSBhdXRvLWZpeCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnczogWydwcm9ncmVzc2l2ZSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1oZWxwZXItYXV0b2ZpeC1idXR0b24nXSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFncyA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0b0ZpeCBvZiBhdXRvRml4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeC50eXBlID09PSAnYWRkJyAmJiAhdGFncy5pbmNsdWRlcyhhdXRvRml4LnRhZykpIHRoaXMudGFnU2VsZWN0LmFkZFRhZyhhdXRvRml4LnRhZywgYXV0b0ZpeC50YWcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9GaXgudHlwZSA9PT0gJ3JlbW92ZScgJiYgdGFncy5pbmNsdWRlcyhhdXRvRml4LnRhZykpIHRoaXMudGFnU2VsZWN0LnJlbW92ZVRhZ0J5RGF0YShhdXRvRml4LnRhZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeC50eXBlID09PSAnY2hhbmdlLXRhcmdldCcpIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZShhdXRvRml4LnRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdNZXNzYWdlLiRlbGVtZW50WzBdLnN0eWxlLnRleHREZWNvcmF0aW9uID0gJ2xpbmUtdGhyb3VnaCAycHggYmxhY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeEJ1dHRvbi4kZWxlbWVudFswXS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ01lc3NhZ2UuJGVsZW1lbnRbMF0ucXVlcnlTZWxlY3RvcignLm9vLXVpLWxhYmVsRWxlbWVudC1sYWJlbCcpIS5hcHBlbmQoYXV0b0ZpeEJ1dHRvbi4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JCb3guJGVsZW1lbnRbMF0uYXBwZW5kKHdhcm5pbmdNZXNzYWdlLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzVG9EaXNhYmxlKSAoZWxlbWVudCBhcyBPTy51aS5XaWRnZXQpLnNldERpc2FibGVkKGZhbHNlKTtcblxuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCBhbnl3YXknKTtcbiAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvKiBFZGl0L2NyZWF0ZSByZWRpcmVjdCAqL1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbChgJHt0aGlzLmV4aXN0cyA/ICdFZGl0aW5nJyA6ICdDcmVhdGluZyd9IHJlZGlyZWN0Li4uYCk7XG5cbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPVxuICAgICAgICAgICAgKHRoaXMuc3VtbWFyeUlucHV0LmdldFZhbHVlKCkgfHwgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyKSArIHRoaXMuc2NyaXB0TWVzc2FnZTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZSh0aGlzLnBhZ2VUaXRsZSwgb3V0cHV0LCBzdW1tYXJ5KTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybjtcblxuICAgICAgICBtdy5ub3RpZnkoYFJlZGlyZWN0ICR7dGhpcy5leGlzdHMgPyAnZWRpdGVkJyA6ICdjcmVhdGVkJ30gc3VjY2Vzc2Z1bGx5IWAsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuXG4gICAgICAgIC8qIFN5bmMgdGFsayBwYWdlIGNoZWNrYm94IGhhbmRsZXIgKi9cbiAgICAgICAgaWYgKHRoaXMuc3luY1RhbGtDaGVja2JveD8uaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnRWRpdGluZyB0YWxrIHBhZ2UuLi4nKTtcblxuICAgICAgICAgICAgY29uc3QgZnJvbU1vdmUgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKCdSIGZyb20gbW92ZScpO1xuXG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZERlc3RpbmF0aW9uIS5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICBmcm9tTW92ZSA/IFsnUiBmcm9tIG1vdmUnXSA6IFtdLFxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCB0YWxrUmVzdWx0ID0gYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgICAgICdTeW5jaW5nIHJlZGlyZWN0IGZyb20gbWFpbiBwYWdlJyArIHRoaXMuc2NyaXB0TWVzc2FnZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIXRhbGtSZXN1bHQpIHJldHVybjtcblxuICAgICAgICAgICAgbXcubm90aWZ5KCdUYWxrIHBhZ2Ugc3luY2VkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFBhdHJvbCBjaGVja2JveCBoYW5kbGVyICovXG4gICAgICAgIGlmICh0aGlzLnBhdHJvbENoZWNrYm94Py5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdQYXRyb2xsaW5nIHJlZGlyZWN0Li4uJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhdHJvbExpbms6IEhUTUxBbmNob3JFbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYXRyb2xsaW5rIGEnKTtcbiAgICAgICAgICAgIGNvbnN0IG1hcmtSZXZpZXdlZEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcjbXdlLXB0LW1hcmstYXMtcmV2aWV3ZWQtYnV0dG9uJyk7XG5cbiAgICAgICAgICAgIGlmIChwYXRyb2xMaW5rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0cm9sUmVzdWx0ID0gKGF3YWl0IHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgIC5wb3N0V2l0aFRva2VuKCdwYXRyb2wnLCB7IGFjdGlvbjogJ3BhdHJvbCcsIHJjaWQ6IG5ldyBVUkwocGF0cm9sTGluay5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCdyY2lkJykhIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3JDb2RlLCBlcnJvckluZm8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgcGF0cm9sbGluZyAke3RoaXMucGFnZVRpdGxlfSB2aWEgQVBJOiAkeyhlcnJvckluZm8gYXMgTWVkaWFXaWtpRGF0YUVycm9yKT8uZXJyb3I/LmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZXJyb3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfSkpIGFzIG9iamVjdCB8IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHBhdHJvbFJlc3VsdCkgbXcubm90aWZ5KCdSZWRpcmVjdCBwYXRyb2xsZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXJrUmV2aWV3ZWRCdXR0b24pIHtcbiAgICAgICAgICAgICAgICBtYXJrUmV2aWV3ZWRCdXR0b24uY2xpY2soKTtcbiAgICAgICAgICAgICAgICBtdy5ub3RpZnkoJ1JlZGlyZWN0IHBhdHJvbGxlZCBzdWNjZXNzZnVsbHkhJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICB9IGVsc2UgbXcubm90aWZ5KCdQYWdlIGN1cmF0aW9uIHRvb2xiYXIgbm90IGZvdW5kLCByZWRpcmVjdCBjYW5ub3QgYmUgcGF0cm9sbGVkIScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdDb21wbGV0ZSwgcmVsb2FkaW5nLi4uJyk7XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBtdy51dGlsLmdldFVybCh0aGlzLnBhZ2VUaXRsZSwgeyByZWRpcmVjdDogJ25vJyB9KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFRha2VzIHByb3ZpZGVkIHZhbHVlcyB0byBjcmVhdGUgdGhlIHBhZ2Ugb3V0cHV0LlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlT3V0cHV0KFxuICAgICAgICB0YXJnZXQ6IHN0cmluZyxcbiAgICAgICAgdGFnczogc3RyaW5nW10sXG4gICAgICAgIHN0cmF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICBkZWZhdWx0U29ydDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICBjYXRlZ29yaWVzOiBzdHJpbmdbXSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVGFyZ2V0ID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGFyZ2V0KTtcblxuICAgICAgICBjb25zdCBmb3JtYXR0ZWRUaXRsZSA9IHBhcnNlZFRhcmdldFxuICAgICAgICAgICAgPyBgJHtwYXJzZWRUYXJnZXQuZ2V0TmFtZXNwYWNlSWQoKSA9PT0gMTQgPyAnOicgOiAnJ30ke3BhcnNlZFRhcmdldC5nZXRQcmVmaXhlZFRleHQoKX0ke3BhcnNlZFRhcmdldC5nZXRGcmFnbWVudCgpID8gYCMke3BhcnNlZFRhcmdldC5nZXRGcmFnbWVudCgpfWAgOiAnJ31gXG4gICAgICAgICAgICA6IHRhcmdldC50cmltKCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWRcbiAgICAgICAgICAgICAgICAuZ2V0TWFpblRleHQoKVxuICAgICAgICAgICAgICAgIC50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvW1xcdTAzMDAtXFx1MDM2Rl0vZywgJycpID09PVxuICAgICAgICAgICAgZGVmYXVsdFNvcnRcbiAgICAgICAgICAgICAgICA/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKC9bXFx1MDMwMC1cXHUwMzZGXS9nLCAnJylcbiAgICAgICAgKVxuICAgICAgICAgICAgZGVmYXVsdFNvcnQgPSB1bmRlZmluZWQ7IC8vIENoZWNrIGlmIHRpdGxlcyBub3JtYWxpemUgdG8gdGhlIHNhbWUgdGV4dCwgYW5kIHJlbW92ZXMgdGhlIERFRkFVTFRTT1JUIGlmIHNvXG5cbiAgICAgICAgY29uc3QgdGFnc1dpdGhBcmd1bWVudHMgPSB0YWdzLm1hcCgodGFnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZEFyZ3VtZW50RWRpdG9yID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcbiAgICAgICAgICAgIGlmICghZm91bmRBcmd1bWVudEVkaXRvcikgcmV0dXJuIGB7eyR7dGFnfX19YDtcblxuICAgICAgICAgICAgY29uc3QgbGFzdE51bWJlclBhcmFtZXRlckluZGV4ID0gZm91bmRBcmd1bWVudEVkaXRvci5wYXJhbWV0ZXJzLmZpbmRMYXN0SW5kZXgoXG4gICAgICAgICAgICAgICAgKHBhcmFtZXRlciwgaW5kZXgpID0+IHBhcmFtZXRlci5uYW1lID09PSAoaW5kZXggKyAxKS50b1N0cmluZygpICYmIHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBtYXBwZWRBcmd1bWVudHMgPSBmb3VuZEFyZ3VtZW50RWRpdG9yLnBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICAubWFwKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSAmJiBpbmRleCA+IGxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB8JHtwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSA/ICcnIDogYCR7cGFyYW1ldGVyLm5hbWV9PWB9JHt2YWx1ZX1gO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICAgICAgcmV0dXJuIGB7eyR7dGFnfSR7bWFwcGVkQXJndW1lbnRzfX19YDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGAjUkVESVJFQ1QgW1ske2Zvcm1hdHRlZFRpdGxlfV1dXFxuYCxcbiAgICAgICAgICAgIHRhZ3MubGVuZ3RoID4gMCA/IGB7e1JlZGlyZWN0IGNhdGVnb3J5IHNoZWxsfFxcbiR7dGFnc1dpdGhBcmd1bWVudHMuam9pbignXFxuJyl9XFxufX1cXG5gIDogbnVsbCxcbiAgICAgICAgICAgIHN0cmF5VGV4dCA/IHN0cmF5VGV4dCArICdcXG4nIDogbnVsbCxcbiAgICAgICAgICAgIGRlZmF1bHRTb3J0ID8gYHt7REVGQVVMVFNPUlQ6JHtkZWZhdWx0U29ydC50cmltKCl9fX1gIDogbnVsbCxcbiAgICAgICAgICAgIGNhdGVnb3JpZXMubGVuZ3RoID4gMCA/IGNhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gYFtbQ2F0ZWdvcnk6JHtjYXRlZ29yeX1dXWApLmpvaW4oJ1xcbicpIDogbnVsbCxcbiAgICAgICAgXVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgdGhlIGNvbnRlbnQgb2YgYSBnaXZlbiBwYWdlLlxuICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgdG8gZmV0Y2guXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRQYWdlQ29udGVudCh0aXRsZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IHRpdGxlLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICkucXVlcnkhLnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVkaXRzIG9yIGNyZWF0ZXMgYSBwYWdlIHdpdGggZ2l2ZW4gdGV4dC5cbiAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHBhZ2UgdGl0bGUuXG4gICAgICogQHBhcmFtIHRleHQgVGhlIHBhZ2UgdGV4dC5cbiAgICAgKiBAcGFyYW0gc3VtbWFyeSBUaGUgZWRpdCBzdW1tYXJ5LlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgZWRpdE9yQ3JlYXRlKHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgc3VtbWFyeTogc3RyaW5nKSB7XG4gICAgICAgIGxldCB3YXRjaGxpc3Q6IFdhdGNoTWV0aG9kID0gJ3ByZWZlcmVuY2VzJztcblxuICAgICAgICBpZiAodGhpcy53YXRjaENoZWNrYm94KVxuICAgICAgICAgICAgaWYgKHRoaXMud2F0Y2hDaGVja2JveC5pc0luZGV0ZXJtaW5hdGUoKSkgd2F0Y2hsaXN0ID0gdGhpcy5kZWZhdWx0Q3JlYXRlZFdhdGNoTWV0aG9kO1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy53YXRjaENoZWNrYm94LmlzU2VsZWN0ZWQoKSkgd2F0Y2hsaXN0ID0gJ3dhdGNoJztcbiAgICAgICAgICAgIGVsc2Ugd2F0Y2hsaXN0ID0gJ3Vud2F0Y2gnO1xuXG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5hcGlcbiAgICAgICAgICAgIC5lZGl0KHRpdGxlLCAoKSA9PiAoeyB0ZXh0LCBzdW1tYXJ5IH0pKVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvckNvZGUsIGVycm9ySW5mbykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdub2NyZWF0ZS1taXNzaW5nJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpLmNyZWF0ZSh0aXRsZSwgeyBzdW1tYXJ5LCB3YXRjaGxpc3QgfSwgdGV4dCkuY2F0Y2goKGVycm9yQ29kZSwgZXJyb3JJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIGNyZWF0aW5nICR7dGl0bGV9OiAkeyhlcnJvckluZm8gYXMgTWVkaWFXaWtpRGF0YUVycm9yKT8uZXJyb3I/LmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgZWRpdGluZyBvciBjcmVhdGluZyAke3RpdGxlfTogJHsoZXJyb3JJbmZvIGFzIE1lZGlhV2lraURhdGFFcnJvcik/LmVycm9yPy5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSkgYXMgUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5hcGkuZWRpdD4gfCBudWxsO1xuICAgIH1cbn1cbiIsICIjY3JlYXRlLXJlZGlyZWN0LWJ1dHRvbnttYXJnaW4tYm90dG9tOjIwcHh9I3JlZGlyZWN0LWhlbHBlci1ib3h7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWJvdHRvbToyNXB4IWltcG9ydGFudDttYXJnaW4tbGVmdDphdXRvO2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTt3aWR0aDo3MDBweDttYXgtd2lkdGg6Y2FsYygxMDAlIC0gNTBweCk7Y29sb3I6IzIwMjEyMn0ucmVkaXJlY3QtaW5wdXQtbGF5b3V0IGxhYmVse2ZvbnQtd2VpZ2h0OjcwMH0ucmVkaXJlY3QtaGVscGVyLXJlZGlyZWN0LXBvc3NpYmlsaXRpZXM6YWZ0ZXJ7Y29udGVudDpcIiAocmVkaXJlY3Qgd2l0aCBwb3NzaWJpbGl0aWVzKVwiO2ZvbnQtc3R5bGU6aXRhbGljfS5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIsLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxze21hcmdpbi10b3A6MTBweDttYXJnaW4tYm90dG9tOjEwcHg7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZC1jb2xvcjojZTJlMmUyO3BhZGRpbmc6NXB4fS5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgc3VtbWFyeXtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo3MDB9LnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxze21hcmdpbi10b3A6NXB4O21hcmdpbi1ib3R0b206NXB4O2JhY2tncm91bmQtY29sb3I6I2QxY2VjZX0jcmVkaXJlY3QtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdle3BhZGRpbmc6NXB4fSNyZWRpcmVjdC1oZWxwZXItc3VtbWFyeS1sYXlvdXR7bWFyZ2luLXRvcDoxNXB4O2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7cGFkZGluZy10b3A6MTBweH0jcmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXR7bWFyZ2luLXRvcDoxMHB4fSNyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dD4qe21hcmdpbi1ib3R0b206MH0ucmVkaXJlY3QtaGVscGVyLXdhcm5pbmd7bWFyZ2luLXRvcDo4cHh9LnJlZGlyZWN0LWhlbHBlci1hdXRvZml4LWJ1dHRvbnttYXJnaW4tbGVmdDo1cHg7Zm9udC1zaXplOjEycHh9LnJlZGlyZWN0LWhlbHBlci1hdXRvZml4LWJ1dHRvbiBhe3BhZGRpbmc6M3B4IDRweCFpbXBvcnRhbnQ7bWluLWhlaWdodDowIWltcG9ydGFudDttaW4taGVpZ2h0OmluaXRpYWwhaW1wb3J0YW50fVxuIiwgImltcG9ydCB0eXBlIHsgQXBpUXVlcnlJbmZvUGFyYW1zLCBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcbmltcG9ydCB0eXBlIHsgUGFnZUluZm9SZXN1bHQsIFBhZ2VSZXZpc2lvbnNSZXN1bHQgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IGNzc0NvbnRlbnQgZnJvbSAnLi4vLi4vc3R5bGVzL3JlZGlyZWN0LWhlbHBlci5jc3MnIHdpdGggeyB0eXBlOiAnY3NzJyB9O1xuaW1wb3J0IHR5cGUgeyBXYXRjaE1ldGhvZCB9IGZyb20gJy4uL2FmY3JjLWhlbHBlci9hZmNyYy1oZWxwZXInO1xuaW1wb3J0IHR5cGUgeyBSZWRpcmVjdFRlbXBsYXRlRGF0YSB9IGZyb20gJy4vcmVkaXJlY3QtaGVscGVyLWRpYWxvZyc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAgICAgcmVkaXJlY3RIZWxwZXJDb25maWd1cmF0aW9uPzogeyBjcmVhdGVkV2F0Y2hNZXRob2Q/OiBXYXRjaE1ldGhvZCB9O1xuICAgIH1cbn1cblxuY29uc3QgZGVwZW5kZW5jaWVzID0gW1xuICAgICdtZWRpYXdpa2kudXRpbCcsXG4gICAgJ29vanMtdWktY29yZScsXG4gICAgJ29vanMtdWktd2lkZ2V0cycsXG4gICAgJ29vanMtdWktd2luZG93cycsXG4gICAgJ29vanMtdWkuc3R5bGVzLmljb25zLWNvbnRlbnQnLFxuICAgICdvb2pzLXVpLnN0eWxlcy5pY29ucy1lZGl0aW5nLWNvcmUnLFxuXTtcblxubXcubG9hZGVyLnVzaW5nKGRlcGVuZGVuY2llcywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdDogUmVkaXJlY3RIZWxwZXJEaWFsb2cgfSA9IGF3YWl0IGltcG9ydCgnLi9yZWRpcmVjdC1oZWxwZXItZGlhbG9nJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhhbmRsZXMgdGhlIGVudGlyZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSByZWRpcmVjdC1oZWxwZXIgc2NyaXB0LlxuICAgICAqL1xuICAgIGNsYXNzIFJlZGlyZWN0SGVscGVyIHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgLy8gQXNzaWduZWQgZHVyaW5nIHJ1bigpXG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RUZW1wbGF0ZXMhOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICAgICAgcHJpdmF0ZSBjb250ZW50VGV4dCE6IEhUTUxEaXZFbGVtZW50O1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZSE6IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQhOiBtdy5UaXRsZTtcbiAgICAgICAgcHJpdmF0ZSBjcmVhdGVkV2F0Y2hNZXRob2QhOiBXYXRjaE1ldGhvZDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgcmVkaXJlY3QgaGVscGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcnVuKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBhc3Nlc1ByZUNoZWNrcygpKSByZXR1cm47XG5cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLmZldGNoUmVkaXJlY3RUZW1wbGF0ZXMoKTtcblxuICAgICAgICAgICAgY29uc3QgY29udGVudFRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PignI213LWNvbnRlbnQtdGV4dCcpO1xuICAgICAgICAgICAgaWYgKCFjb250ZW50VGV4dCkgcmV0dXJuIG13Lm5vdGlmeSgncmVkaXJlY3QtaGVscGVyOiBGYWlsZWQgdG8gZmluZCBjb250ZW50IHRleHQgZWxlbWVudCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudFRleHQgPSBjb250ZW50VGV4dDtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhZ2VUaXRsZVBhcnNlZCA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRoaXMucGFnZVRpdGxlKTtcbiAgICAgICAgICAgIGlmICghcGFnZVRpdGxlUGFyc2VkKSByZXR1cm4gbXcubm90aWZ5KCdyZWRpcmVjdC1oZWxwZXI6IEZhaWxlZCB0byBwYXJzZSBwYWdlIHRpdGxlIScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ0NyZWF0ZWRXYXRjaE1ldGhvZCA9IHdpbmRvdy5yZWRpcmVjdEhlbHBlckNvbmZpZ3VyYXRpb24/LmNyZWF0ZWRXYXRjaE1ldGhvZDtcblxuICAgICAgICAgICAgdGhpcy5jcmVhdGVkV2F0Y2hNZXRob2QgPVxuICAgICAgICAgICAgICAgIGNvbmZpZ0NyZWF0ZWRXYXRjaE1ldGhvZCAmJiBbJ25vY2hhbmdlJywgJ3ByZWZlcmVuY2VzJywgJ3Vud2F0Y2gnLCAnd2F0Y2gnXS5pbmNsdWRlcyhjb25maWdDcmVhdGVkV2F0Y2hNZXRob2QpXG4gICAgICAgICAgICAgICAgICAgID8gY29uZmlnQ3JlYXRlZFdhdGNoTWV0aG9kXG4gICAgICAgICAgICAgICAgICAgIDogJ3ByZWZlcmVuY2VzJztcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1BhZ2VBbmRMb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoZSBwYWdlIHBhc3NlcyBwcmUgY2hlY2tzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBwYXNzZXNQcmVDaGVja3MoKSB7XG4gICAgICAgICAgICBjb25zdCBjb25kaXRpb25zID0gW1xuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPj0gMCwgLy8gSXMgbm90IHZpcnR1YWwgbmFtZXNwYWNlXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dJc1Byb2JhYmx5RWRpdGFibGUnKSwgLy8gUGFnZSBpcyBlZGl0YWJsZVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnQWN0aW9uJykgPT09ICd2aWV3JyB8fCBtdy5jb25maWcuZ2V0KCd3Z0FjdGlvbicpID09PSAnZWRpdCcsIC8vIFZpZXdpbmcgb3IgZWRpdGluZyB0aGUgcGFnZVxuICAgICAgICAgICAgICAgIChtdy5jb25maWcuZ2V0KCd3Z1JldmlzaW9uSWQnKSB8fCBtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSkgPT09IG13LmNvbmZpZy5nZXQoJ3dnQ3VyUmV2aXNpb25JZCcpLCAvLyBWaWV3aW5nIHRoZSBjdXJyZW50IHJldmlzaW9uXG4gICAgICAgICAgICAgICAgIW13LmNvbmZpZy5nZXQoJ3dnRGlmZk9sZElkJyksIC8vIE5vdCB2aWV3aW5nIGEgZGlmZlxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbnMuZXZlcnkoQm9vbGVhbik7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2hlcyB0aGUgcmVkaXJlY3QgdGVtcGxhdGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlZGlyZWN0VGVtcGxhdGVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZXM6ICdVc2VyOkVlaml0NDMvc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIuanNvbicsXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICAgICAgICAgICkucXVlcnkhLnBhZ2VzWzBdPy5yZXZpc2lvbnM/LlswXT8uc2xvdHM/Lm1haW4/LmNvbnRlbnQgfHwgJ3t9JyxcbiAgICAgICAgICAgICkgYXMgUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGEgcGFnZSdzIHN0YXR1cyBhbmQgbG9hZHMgdGhlIGhlbHBlciBhcHByb3ByaWF0ZWx5LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBjaGVja1BhZ2VBbmRMb2FkKCkge1xuICAgICAgICAgICAgbXcudXRpbC5hZGRDU1MoY3NzQ29udGVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhZ2VJbmZvID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuXG4gICAgICAgICAgICBjb25zdCBkaWFsb2dJbmZvID0ge1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VGVtcGxhdGVzOiB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiB0aGlzLmNvbnRlbnRUZXh0LFxuICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICAgICAgcGFnZVRpdGxlUGFyc2VkOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChwYWdlSW5mby5xdWVyeSEucGFnZXNbMF0ubWlzc2luZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2NyZWF0ZS1yZWRpcmVjdC1idXR0b24nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0NyZWF0ZSByZWRpcmVjdCcsXG4gICAgICAgICAgICAgICAgICAgIGljb246ICdhcnRpY2xlUmVkaXJlY3QnLFxuICAgICAgICAgICAgICAgICAgICBmbGFnczogWydwcm9ncmVzc2l2ZSddLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi4kZWxlbWVudFswXS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgdm9pZCBuZXcgUmVkaXJlY3RIZWxwZXJEaWFsb2coZGlhbG9nSW5mbywgZmFsc2UsIHRoaXMuY3JlYXRlZFdhdGNoTWV0aG9kKS5sb2FkKCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0LnByZXBlbmQoYnV0dG9uLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFnZUluZm8ucXVlcnkhLnBhZ2VzWzBdLnJlZGlyZWN0KSB2b2lkIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCB0cnVlLCB0aGlzLmNyZWF0ZWRXYXRjaE1ldGhvZCkubG9hZCgpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9ydGxldExpbmsgPSBtdy51dGlsLmFkZFBvcnRsZXRMaW5rKFxuICAgICAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCdza2luJykgPT09ICdtaW5lcnZhJyA/ICdwLXRiJyA6ICdwLWNhY3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgJyMnLFxuICAgICAgICAgICAgICAgICAgICAnUmVkaXJlY3QgcGFnZScsXG4gICAgICAgICAgICAgICAgICAgICdyZWRpcmVjdC1oZWxwZXInLFxuICAgICAgICAgICAgICAgICkhO1xuICAgICAgICAgICAgICAgIHBvcnRsZXRMaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdm9pZCBuZXcgUmVkaXJlY3RIZWxwZXJEaWFsb2coZGlhbG9nSW5mbywgZmFsc2UsIHRoaXMuY3JlYXRlZFdhdGNoTWV0aG9kKS5sb2FkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcG9ydGxldExpbmsucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2b2lkIG5ldyBSZWRpcmVjdEhlbHBlcigpLnJ1bigpO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Z0pBQUEsSUFNcUJBLEVBTnJCQyxFQUFBQyxFQUFBLGtCQU1xQkYsRUFBckIsY0FBaUQsR0FBRyxHQUFHLGVBQWdCLENBRTNELElBQU0sSUFBSSxHQUFHLElBRWQsZ0JBQWtCLElBQUksSUFFN0IsWUFBWUcsRUFBNkIsQ0FDckMsTUFBTUEsQ0FBTSxFQUVaLEdBQUcsR0FBRyxNQUFNLGNBQWMsS0FBSyxLQUE4Q0EsQ0FBTSxDQUN2RixDQUVBLGlCQUFtQixJQUFNLENBQ3JCLElBQU1DLEVBQVEsS0FBSyxTQUFTLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUNwQ0MsRUFBVyxFQUFFLFNBQVMsRUFFdkJELEdBQU9DLEVBQVMsUUFBUSxDQUFD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LGFBQWEsQ0FDekIsQ0FBQyxFQUNEQSxFQUFPLEdBQUcsUUFBUyxJQUFNLENBQ3JCQSxFQUFPLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFDckIsSUFBSVIsRUFBcUJPLEVBQVksR0FBTyxLQUFLLGtCQUFrQixFQUFFLEtBQUssQ0FDbkYsQ0FBQyxFQUVELEtBQUssWUFBWSxRQUFRQyxFQUFPLFNBQVMsQ0FBQyxDQUFDLENBQy9DLFNBQVdGLEVBQVMsTUFBTyxNQUFNLENBQUMsRUFBRSxTQUFlLElBQUlOLEVBQXFCTyxFQUFZLEdBQU0sS0FBSyxrQkFBa0IsRUFBRSxLQUFLLE1BQ3ZILENBQ0QsSUFBTUUsRUFBYyxHQUFHLEtBQUssZUFDeEIsR0FBRyxPQUFPLElBQUksTUFBTSxJQUFNLFVBQVksT0FBUyxhQUMvQyxJQUNBLGdCQUNBLGlCQUNKLEVBQ0FBLEVBQVksaUJBQWlCLFFBQVVDLEdBQVUsQ0FDN0NBLEVBQU0sZUFBZSxFQUVoQixJQUFJVixFQUFxQk8sRUFBWSxHQUFPLEtBQUssa0JBQWtCLEVBQUUsS0FBSyxFQUUvRSxPQUFPLFNBQVMsQ0FBRSxJQUFLLEVBQUcsU0FBVSxRQUFTLENBQUMsRUFFOUNFLEVBQVksT0FBTyxDQUN2QixDQUFDLENBQ0wsQ0FDSixDQUNKLENBRUssSUFBSVIsRUFBZSxFQUFFLElBQUksQ0FDbEMsQ0FBQyIsCiAgIm5hbWVzIjogWyJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgImluaXRfY2F0ZWdvcnlfaW5wdXRfd2lkZ2V0IiwgIl9fZXNtTWluIiwgImNvbmZpZyIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJzb3J0S2V5IiwgInJlc3BvbnNlIiwgInBhcnNlZFRpdGxlIiwgInJlc3VsdCIsICJwYWdlcyIsICJwYWdlIiwgImNhdGVnb3J5IiwgInRpdGxlV2l0aG91dE5hbWVzcGFjZSIsICJkYXRhIiwgImxhYmVsIiwgIkNoYW5nZXNEaWFsb2ciLCAiaW5pdF9jaGFuZ2VzX2RpYWxvZyIsICJfX2VzbU1pbiIsICJfQ2hhbmdlc0RpYWxvZyIsICJjb25maWciLCAib2xkVGV4dCIsICJuZXdUZXh0IiwgInJlc3VsdCIsICJjb21wYXJpc29uIiwgIm5vQ2hhbmdlc0VsZW1lbnQiLCAicGFuZWxMYXlvdXQiLCAiYWN0aW9uIiwgIk91dHB1dFByZXZpZXdEaWFsb2ciLCAiaW5pdF9vdXRwdXRfcHJldmlld19kaWFsb2ciLCAiX19lc21NaW4iLCAiX091dHB1dFByZXZpZXdEaWFsb2ciLCAiY29uZmlnIiwgInBhZ2VUaXRsZVBhcnNlZCIsICJyZXN1bHQiLCAidGFnc0NvbnRlbnQiLCAiY2F0ZWdvcmllc0NvbnRlbnQiLCAicGFuZWxMYXlvdXQiLCAiYWN0aW9uIiwgIlJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQiLCAiaW5pdF9yZWRpcmVjdF90YXJnZXRfaW5wdXRfd2lkZ2V0IiwgIl9fZXNtTWluIiwgImNvbmZpZyIsICJwYWdlVGl0bGVQYXJzZWQiLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAidGl0bGUiLCAicmVzdWx0IiwgIm1hdGNoZWRTZWN0aW9ucyIsICJzZWN0aW9uIiwgInBhcnNlZFRpdGxlIiwgInBhZ2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJyZWRpcmVjdF9oZWxwZXJfZGlhbG9nX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiUmVkaXJlY3RIZWxwZXJEaWFsb2ciLCAiaW5pdF9yZWRpcmVjdF9oZWxwZXJfZGlhbG9nIiwgIl9fZXNtTWluIiwgImluaXRfY2F0ZWdvcnlfaW5wdXRfd2lkZ2V0IiwgImluaXRfY2hhbmdlc19kaWFsb2ciLCAiaW5pdF9vdXRwdXRfcHJldmlld19kaWFsb2ciLCAiaW5pdF9yZWRpcmVjdF90YXJnZXRfaW5wdXRfd2lkZ2V0IiwgInJlZGlyZWN0VGVtcGxhdGVzIiwgImNvbnRlbnRUZXh0IiwgInBhZ2VUaXRsZSIsICJwYWdlVGl0bGVQYXJzZWQiLCAiZXhpc3RzIiwgImNyZWF0ZWRXYXRjaE1ldGhvZCIsICJtYWluUGFnZUNvbnRlbnQiLCAidGFyZ2V0IiwgInRhZ09yUmVkaXJlY3QiLCAiUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCIsICJ2YWx1ZSIsICJ0YWciLCAicmVkaXJlY3QiLCAibGFiZWwiLCAic2VsZWN0ZWRFbGVtZW50cyIsICJzZWxlY3RlZFRhZ3MiLCAiZWxlbWVudCIsICJzb3J0ZWRUYWdzIiwgImEiLCAiYiIsICJsYXN0RWxlbWVudCIsICJlZGl0b3JJbmZvIiwgInNob3duVGVtcGxhdGVFZGl0b3JzIiwgInN1bW1hcnlFbGVtZW50IiwgIm5vVGVtcGxhdGVzTWVzc2FnZSIsICJ0ZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVEYXRhIiwgInBhcmFtZXRlcnMiLCAiZGV0YWlscyIsICJzdW1tYXJ5IiwgImVsZW1lbnREYXRhIiwgInBhcmFtZXRlck5hbWUiLCAicGFyYW1ldGVyRGF0YSIsICJpbnB1dCIsICJpbnB1dExheW91dCIsICJuYW1lIiwgImdlbmVyYXRpb25hbFN1ZmZpeCIsICJsYXN0TmFtZSIsICJvdGhlck5hbWVzIiwgIm5ld05hbWUiLCAibGVhZGluZ0FydGljbGUiLCAiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJwYWdlcyIsICJwYWdlIiwgInNlbGVjdGVkQ2F0ZWdvcmllcyIsICJzb3J0ZWRDYXRlZ29yaWVzIiwgIndpbmRvd01hbmFnZXIiLCAidGVtcGxhdGVQcmV2aWV3RGlhbG9nIiwgIk91dHB1dFByZXZpZXdEaWFsb2ciLCAic2hvd0NoYW5nZXNEaWFsb2ciLCAiQ2hhbmdlc0RpYWxvZyIsICJjb25maWciLCAicGFnZVRyaWFnZU1hcmtCdXR0b24iLCAicGF0cm9sUmVzcG9uc2UiLCAicmVkaXJlY3RWYWx1ZSIsICJvbGRUYXJnZXQiLCAidGFyZ2V0Q2hhbmdlZCIsICJ0YWdzQ2hhbmdlZCIsICJ0YWdBcmd1bWVudHNDaGFuZ2VkIiwgInRhZ3NXaXRoUGFyYW1ldGVycyIsICJkYXRhIiwgIm9sZFRhZ0RhdGEiLCAiZm91bmRUYWdFZGl0b3JEYXRhIiwgInRlbXBsYXRlIiwgInBhcmFtZXRlciIsICJvbGRBcmd1bWVudCIsICJhcmd1bWVudCIsICJuZXdBcmd1bWVudCIsICJkZWZhdWx0U29ydENoYW5nZWQiLCAiY2F0ZWdvcmllc0NoYW5nZWQiLCAiY2F0ZWdvcnkiLCAiY2hhbmdlcyIsICJ0YWdEYXRhIiwgIm9yaWdpbmFsUmVkaXJlY3RUYWdzIiwgIm1hdGNoIiwgIm5ld1RhZyIsICJmb3JtYXR0ZWRBcmd1bWVudHMiLCAiaW5kZXgiLCAiZm91bmRUZW1wbGF0ZUVkaXRvciIsICJmb3VuZFBhcmFtZXRlckVkaXRvciIsICJlcnJvcnMiLCAiZGVzdGluYXRpb24iLCAidGFncyIsICJkZXN0aW5hdGlvbkRhdGEiLCAiZXJyb3JDb2RlIiwgImRlc3RpbmF0aW9uUGFyc2VSZXN1bHQiLCAiZGVzdGluYXRpb25SZWRpcmVjdCIsICJzZWN0aW9uIiwgImRlc3RpbmF0aW9uQ29udGVudCIsICJhbmNob3IiLCAicGFydCIsICJ0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSIsICJ0YXJnZXRJc1N1cm5hbWVMaXN0IiwgInRvRGlzYW1iaWd1YXRpb25QYWdlVGFncyIsICJ0b1N1cm5hbWVMaXN0VGFncyIsICJ0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UiLCAidGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QiLCAiZm91bmRQYXJhbWV0ZXIiLCAiZWxlbWVudHNUb0Rpc2FibGUiLCAidGl0bGUiLCAibWVzc2FnZSIsICJhdXRvRml4ZXMiLCAid2FybmluZ01lc3NhZ2UiLCAiYXV0b0ZpeEJ1dHRvbiIsICJhdXRvRml4IiwgIm91dHB1dCIsICJmcm9tTW92ZSIsICJwYXRyb2xMaW5rIiwgIm1hcmtSZXZpZXdlZEJ1dHRvbiIsICJlcnJvckluZm8iLCAic3RyYXlUZXh0IiwgImRlZmF1bHRTb3J0IiwgImNhdGVnb3JpZXMiLCAicGFyc2VkVGFyZ2V0IiwgImZvcm1hdHRlZFRpdGxlIiwgInRhZ3NXaXRoQXJndW1lbnRzIiwgImZvdW5kQXJndW1lbnRFZGl0b3IiLCAibGFzdE51bWJlclBhcmFtZXRlckluZGV4IiwgIm1hcHBlZEFyZ3VtZW50cyIsICJ0ZXh0IiwgIndhdGNobGlzdCIsICJyZWRpcmVjdF9oZWxwZXJfZGVmYXVsdCIsICJkZXBlbmRlbmNpZXMiLCAiUmVkaXJlY3RIZWxwZXJEaWFsb2ciLCAiUmVkaXJlY3RIZWxwZXIiLCAiY29udGVudFRleHQiLCAicGFnZVRpdGxlUGFyc2VkIiwgImNvbmZpZ0NyZWF0ZWRXYXRjaE1ldGhvZCIsICJyZWRpcmVjdF9oZWxwZXJfZGVmYXVsdCIsICJwYWdlSW5mbyIsICJkaWFsb2dJbmZvIiwgImJ1dHRvbiIsICJwb3J0bGV0TGluayIsICJldmVudCJdCn0K