Jump to content

User:Eejit43/scripts/redirect-helper.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Eejit43 (talk | contribs) at 04:45, 3 November 2024 (Syncing script from GitHub (via script)). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
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 A=Object.defineProperty;var O=(g,t)=>()=>(g&&(t=g(g=0)),t);var D=(g,t)=>{for(var i in t)A(g,i,{get:t[i],enumerable:!0})};var w,P=O(()=>{"use strict";w=class extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{let t=this.getValue(),i=$.Deferred();t||i.resolve([]);let e=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:e?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(a=>{if(a?.query?.pages){let s=a.query.pages.filter(r=>!r.categories?.some(o=>o.title==="Category:Wikipedia soft redirected categories")).map(r=>{let o=r.title.split(":")[1];return{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;constructor(t){super(t),g.static.name="ShowChangesDialog",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(()=>{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,s=new OO.ui.MessageWidget({type:"warning",label:"No changes to make!"}),r=new OO.ui.PanelLayout({padded:!0,expanded:!1});r.$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>`:s.$element[0]),this.$body.append(r.$element)})});getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):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 T,k=O(()=>{"use strict";T=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.getManager().closeWindow(this)}):g.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>g.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};Object.assign(T.prototype,OO.ui.ProcessDialog.prototype)});var x,R=O(()=>{"use strict";x=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 s=a.parse.sections.filter(r=>r.line.toLowerCase().replaceAll(/<\/?i>/g,"").startsWith(t.split("#")[1].toLowerCase()));i.resolve(s.map(r=>({data:`${a.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`,label:`${a.parse.title}#${r.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?i.resolve(a.query?.pages?a.query.pages.filter(s=>s.title!==this.pageTitleParsed.toString()).map(s=>({data:s.title,label:new OO.ui.HtmlSnippet(`${s.title}${s.pageprops&&"disambiguation"in s.pageprops?" <i>(disambiguation)</i>":""}${"redirect"in s?" <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(x.prototype,OO.ui.mixin.LookupElement.prototype)});var C={};D(C,{default:()=>v});var v,I=O(()=>{"use strict";P();S();k();R();v=class{api=new mw.Api;redirectRegex=/^#redirect:?\s*\[\[\s*:?([^[\]{|}]+?)\s*(?:\|[^[\]{|}]+?)?]]\s*/i;scriptAdvert=" (via [[User:Eejit43/scripts/redirect-helper|redirect-helper]])";redirectTemplates;contentText;pageTitle;pageTitleParsed;exists;needsCheck=!0;editorBox;syncWithMainButton;redirectInput;redirectInputLayout;tagSelect;tagSelectLayout;templateParametersEditor;templateEditorsInfo=[];categorySelect;categorySelectInput;categorySelectLayout;defaultSortInput;defaultSortSuggestButton;defaultSortInputLayout;summaryInput;summaryInputLayout;submitButton;showChangesButton;showPreviewButton;syncTalkCheckbox;syncTalkCheckboxLayout;patrolCheckbox;patrolCheckboxLayout;submitLayout;talkData;pageContent="";oldRedirectTarget;oldRedirectTags;oldRedirectTagData;oldDefaultSort;oldCategories;oldStrayText;parsedDestination;constructor({redirectTemplates:t,contentText:i,pageTitle:e,pageTitleParsed:a},s){this.redirectTemplates=t,this.contentText=i,this.pageTitle=e,this.pageTitleParsed=a,this.exists=s}async load(){mw.util.addCSS(`
#create-redirect-button {
    margin-bottom: 20px;
}

#redirect-helper-box {
    margin-right: auto;
    margin-bottom: 25px !important;
    margin-left: auto;
    background-color: whitesmoke;
    width: 700px;
    max-width: calc(100% - 50px);
    color: #202122;
}

.redirect-input-layout label {
    font-weight: bold;
}

.redirect-helper-redirect-possibilities::after {
    content: " (redirect with possibilities)";
    font-style: italic;
}

.redirect-helper-template-parameters-container,
.redirect-helper-template-parameters-container details {
    margin-block: 10px;
    border-radius: 5px;
    background-color: #e2e2e2;
    padding: 5px;
}

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

.redirect-helper-template-parameters-container details {
    margin-block: 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: unset !important;
}`),mw.loader.addLinkTag("https://www.mediawiki.org/w/load.php?modules=mediawiki.diff.styles&only=styles"),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()?.toString()??""),["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 x({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 s=new OO.ui.HtmlSnippet(`<span class="redirect-helper-redirect-possibilities">${e}</span>`);return{data:e,label:s}})}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",()=>{let e=this.tagSelect.getValue().sort((s,r)=>s.toLowerCase().localeCompare(r.toLowerCase()));this.tagSelect.getValue().join(";")!==e.join(";")&&this.tagSelect.setValue(e),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0;for(let s of this.templateEditorsInfo)s.details.style.display="none";let a=0;for(let s of this.tagSelect.getValue()){let r=this.templateEditorsInfo.find(o=>o.name===s);r&&(r.details.style.display="block",a++)}t.textContent=`Template parameters (${a>0?`for ${a} template${a>1?"s":""}`:"none to show"})`,i.style.display=a>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 s=Object.entries(a.parameters);if(s.length===0)continue;let r=document.createElement("details");r.style.display="none";let o=document.createElement("summary");o.textContent=e,r.append(o);let n={name:e,details:r,parameters:[]};for(let[u,l]of s){let m=new OO.ui.TextInputWidget({placeholder:l.default?.toString(),required:l.required});m.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});let p=new OO.ui.FieldLayout(m,{label:new OO.ui.HtmlSnippet(`${u}${!l.label||u.toLowerCase()===l.label?.toLowerCase()?"":` (${l.label})`}${l.description?` (${l.description})`:""} (type: ${l.type}) ${l.suggested?" (suggested)":""}${l.example?` (example: "${l.example}")`:""}`),align:"inline"});r.append(p.$element[0]),n.parameters.push({name:u,aliases:l.aliases,editor:m})}this.templateParametersEditor.append(r),this.templateEditorsInfo.push(n)}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 s=e.slice(e.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),r=e.slice(0,e.lastIndexOf(" "));this.defaultSortInput.setValue(s+", "+r+a)}else{let a=e.replaceAll("Mr.","Mister").replaceAll("&","And");for(let s of["An","A","The"])if(a.startsWith(s+" ")){a=a.slice(s.length+1)+", "+s;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",()=>{let e=this.categorySelect.getValue().sort((a,s)=>a.toLowerCase().localeCompare(s.toLowerCase()));this.categorySelect.getValue().join(";")!==e.join(";")&&this.categorySelect.setValue(e),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 T({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"});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"})]})),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.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(u=>!this.oldRedirectTags.includes(u))||this.oldRedirectTags.some(u=>!this.tagSelect.getValue().includes(u)),s=!1;if(this.oldRedirectTagData){let u=Object.entries(this.redirectTemplates).filter(([,l])=>Object.entries(l.parameters).length>0);for(let[l,m]of u){if(!this.oldRedirectTags.includes(l)||!this.tagSelect.getValue().includes(l))continue;let c=this.oldRedirectTagData[l]??Object.entries(m.parameters).map(([d])=>[d,""]),h=this.templateEditorsInfo.find(d=>d.name===l);for(let d of h.parameters){let f=c.find(L=>L[0]===d.name)?.[1]??"",y=d.editor.getValue().trim();if(f!==y){s=!0;break}}if(s)break}}let r=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),o=this.categorySelect.getValue().some(u=>!this.oldCategories.includes(u))||this.oldCategories.some(u=>!this.categorySelect.getValue().includes(u)),n=[];e&&n.push(`retarget to [[${t}]]`),a&&n.push(`${this.tagSelect.getValue().length>0&&this.oldRedirectTags.length>0?"change":this.tagSelect.getValue().length>0?"add":"remove"} categorization templates`),s&&n.push("change categorization template arguments"),r&&n.push(`${this.defaultSortInput.getValue().trim().length>0&&this.oldDefaultSort.replaceAll("_"," ").length>0?"change":this.defaultSortInput.getValue().trim().length>0?"add":"remove"} default sort key`),o&&n.push(`${this.categorySelect.getValue().length>0&&this.oldCategories.length>0?"change":this.categorySelect.getValue().length>0?"add":"remove"} categories`),n.length===0&&n.push("perform redirect cleanup"),n[0]=n[0][0].toUpperCase()+n[0].slice(1),n.length>1&&(n[n.length-1]=`and ${n.at(-1)}`),this.summaryInput.$tabIndexed[0].placeholder=n.join(n.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(([o,n])=>[o,...n.aliases].includes(i))?.[0];if(!e?.[1])return null;let r=e[1].split("|").map((o,n)=>{if(!o.includes("="))return[(n+1).toString(),o.trim()];let[u,l]=o.split("=");return[u.trim(),l.trim()]});return[a,r]}).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))??[],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("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(s=>s.name===i);if(a)for(let[s,r]of e){let o=a.parameters.find(n=>[n.name,...n.aliases].includes(s));o&&o.editor.setValue(r)}}this.oldDefaultSort&&this.defaultSortInput.setValue(this.oldDefaultSort);for(let i of this.oldCategories)this.categorySelect.addAllowedValue(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?.toString()===this.pageTitleParsed.toString()&&t.push({message:"cannot redirect to itself!"});let a=await this.api.get({action:"query",formatversion:"2",prop:["pageprops","categories"],titles:i}).catch(p=>(p==="missingtitle"?t.push({title:i,message:"does not exist!"}):t.push({title:i,message:`was not able to be fetched from the API (${p})!`}),null)),s=await this.api.get({action:"parse",page:i,prop:"sections",redirects:!0});if(s.parse.redirects?.[0]){let p=s.parse.redirects[0].to+(s.parse.redirects[0].tofragment?`#${s.parse.redirects[0].tofragment}`:"");t.push({title:i,message:`is a redirect to <a href="${mw.util.getUrl(p)}" target="_blank">${p}</a>. Retarget to that page instead, as double redirects aren't allowed.`,autoFixes:[{type:"change-target",target:p}]})}if(i.split("#").length>1)if(s.parse.sections.find(c=>c.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 c=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.parsedDestination.toString()})).query.pages[0].revisions[0].slots.main.content;[...c.match(/(?<={{\s*?[Aa](?:nchors?|nchor for redirect|nker|NCHOR|nc)\s*?\|).+?(?=}})/g)?.map(d=>d.split("|").map(f=>f.trim()))?.flat()??[],...c.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()??[],...c.match(/(?<=id=)"?.+?(?="|>|\|)/g)?.map(d=>d.trim())??[],...c.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 p of["R to section","R to anchor"])e.includes(p)&&t.push({message:`is not a redirect to a section/anchor, but it is tagged with <code>{{${p}}}</code>!`,autoFixes:[{type:"remove",tag:p}]});let r=!!(a.query.pages[0].pageprops&&"disambiguation"in a.query.pages[0].pageprops),o=!!a.query.pages[0].categories?.some(p=>p.title==="Category:Surnames"),n=["R to disambiguation page","R from incomplete disambiguation"],u=["R from ambiguous sort name","R from ambiguous term"],l=n.some(p=>e.includes(p)),m=u.some(p=>e.includes(p));r&&!l&&!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&&!r&&((!o&&(l||m)||o&&l)&&t.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!",autoFixes:[...n,...u].map(p=>({type:"remove",tag:p}))}),o&&!m&&t.push({message:"is a redirect to a surname list, but it is not tagged with a correct disambiguation categorization template!"})),r&&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 p of["R protected","R semi-protected","R extended-protected","R template-protected","R fully protected"])e.includes(p)&&t.push({message:`is tagged with unnecessarily tagged with <code>{{${p}}}</code> which will be duplicated by the redirect category shell!`,autoFixes:[{type:"remove",tag:p}]});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 p of e){let c=this.redirectTemplates[p];if(c)for(let[h,d]of Object.entries(c.parameters)){let f=this.templateEditorsInfo.find(y=>y.name===p)?.parameters.find(y=>[y.name,...y.aliases].includes(h));f&&d.required&&!f.editor.getValue().trim()&&t.push({message:`is tagged with <code>{{${p}}}</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(r=>r.parameters.map(o=>o.editor)),this.defaultSortInput,this.defaultSortSuggestButton,this.categorySelect,this.summaryInput,this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckbox,this.patrolCheckbox].filter(Boolean);for(let r of t)r.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 r of document.querySelectorAll(".redirect-helper-warning"))r.remove();for(let{title:r,message:o,autoFixes:n}of i){let u=new OO.ui.HtmlSnippet(`${r?`<a href="${mw.util.getUrl(r)}" target="_blank">${r}</a>`:"This page"} ${o} Click again without making changes to submit anyway.`),l=new OO.ui.MessageWidget({type:"error",classes:["redirect-helper-warning"],inline:!0,label:u});if(n){let m=new OO.ui.ButtonWidget({label:"Perform auto-fix",flags:["progressive"],classes:["redirect-helper-autofix-button"]});m.on("click",()=>{let p=this.tagSelect.getValue();for(let c of n)c.type==="add"&&!p.includes(c.tag)&&this.tagSelect.addTag(c.tag,c.tag),c.type==="remove"&&p.includes(c.tag)&&this.tagSelect.removeTagByData(c.tag),c.type==="change-target"&&this.redirectInput.setValue(c.target);l.$element[0].style.textDecoration="line-through 2px black",m.$element[0].remove()}),l.$element[0].querySelector(".oo-ui-labelElement-label").append(m.$element[0])}this.editorBox.$element[0].append(l.$element[0])}for(let r of t)r.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.scriptAdvert;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 r=this.tagSelect.getValue().includes("R from move"),o=this.createOutput(this.parsedDestination.getTalkPage().getPrefixedText(),r?["R from move"]:[],void 0,void 0,[]);if(!await this.editOrCreate(this.pageTitleParsed.getTalkPage().getPrefixedText(),o,"Syncing redirect from main page"+this.scriptAdvert))return;mw.notify("Talk page synced successfully!",{type:"success"})}if(this.patrolCheckbox?.isSelected()){this.submitButton.setLabel("Patrolling redirect...");let r=document.querySelector(".patrollink a"),o=document.querySelector("#mwe-pt-mark-as-reviewed-button");r?await this.api.postWithToken("patrol",{action:"patrol",rcid:new URL(r.href).searchParams.get("rcid")}).catch((u,l)=>(mw.notify(`Error patrolling ${this.pageTitle} via API: ${l?.error.info??"Unknown error"} (${u})`,{type:"error"}),null))&&mw.notify("Redirect patrolled successfully!",{type:"success"}):o?(o.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,s){let r=mw.Title.newFromText(t),o=r?`${r.getNamespaceId()===14?":":""}${r.getPrefixedText()}${r.getFragment()?`#${r.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 n=i.map(u=>{let l=this.templateEditorsInfo.find(c=>c.name===u);if(!l)return`{{${u}}}`;let m=l.parameters.findLastIndex((c,h)=>c.name===(h+1).toString()&&c.editor.getValue().trim()),p=l.parameters.map((c,h)=>{let d=c.editor.getValue().trim();return!d&&h>m?null:`|${c.name===(h+1).toString()?"":`${c.name}=`}${d}`}).filter(Boolean).join("");return`{{${u}${p}}}`});return[`#REDIRECT [[${o}]]
`,i.length>0?`{{Redirect category shell|
${n.join(`
`)}
}}
`:null,e?e+`
`:null,a?`{{DEFAULTSORT:${a.trim()}}}`:null,s.length>0?s.map(u=>`[[Category:${u}]]`).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){return await this.api.edit(t,()=>({text:i,summary:e})).catch((a,s)=>a==="nocreate-missing"?this.api.create(t,{summary:e},i).catch((r,o)=>{mw.notify(`Error creating ${t}: ${o?.error.info??"Unknown error"} (${r})`,{type:"error"})}):(mw.notify(`Error editing or creating ${t}: ${s?.error.info??"Unknown error"} (${a})`,{type:"error"}),null))}}});var E=["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(E,async()=>{let{default:g}=await Promise.resolve().then(()=>(I(),C));class t{api=new mw.Api;redirectTemplates;contentText;pageTitle;pageTitleParsed;async run(){if(this.passesPreChecks()){if(this.redirectTemplates=await this.fetchRedirectTemplates(),this.contentText=document.querySelector("#mw-content-text"),!this.contentText)return mw.notify("redirect-helper: Failed to find content text element!",{type:"error"});if(this.pageTitle=mw.config.get("wgPageName"),this.pageTitleParsed=mw.Title.newFromText(this.pageTitle),!this.pageTitleParsed)return mw.notify("redirect-helper: Failed to parse page title!",{type:"error"});await this.checkPageAndLoad()}}passesPreChecks(){return[mw.config.get("wgNamespaceNumber")>=0,mw.config.get("wgIsProbablyEditable"),mw.config.get("wgIsArticle"),mw.config.get("wgAction")==="view",mw.config.get("wgRevisionId")===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(){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){mw.util.addCSS(`
#create-redirect-button {
    margin-bottom: 20px;
}`);let s=new OO.ui.ButtonWidget({id:"create-redirect-button",label:"Create redirect",icon:"articleRedirect",flags:["progressive"]});s.on("click",()=>{s.$element[0].remove(),new g(a,!1).load()}),this.contentText.prepend(s.$element[0])}else if(e.query.pages[0].redirect)new g(a,!0).load();else{let s=mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Redirect page","redirect-helper");s.addEventListener("click",r=>{r.preventDefault(),new g(a,!1).load(),window.scrollTo({top:0,behavior:"smooth"}),s.remove()})}}}new t().run()});})();

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvY2F0ZWdvcnktaW5wdXQtd2lkZ2V0LnRzIiwgIi4uLy4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL2NoYW5nZXMtZGlhbG9nLnRzIiwgIi4uLy4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL291dHB1dC1wcmV2aWV3LWRpYWxvZy50cyIsICIuLi8uLi9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC10YXJnZXQtaW5wdXQtd2lkZ2V0LnRzIiwgIi4uLy4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LWhlbHBlci1kaWFsb2cudHMiLCAiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtaGVscGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgTG9va3VwRWxlbWVudENvbmZpZyB9IGZyb20gJy4vcmVkaXJlY3QtdGFyZ2V0LWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGNhdGVnb3J5IGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuICAgIH1cblxuICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcblxuICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiAxNCxcbiAgICAgICAgICAgICAgICBnYXBwcmVmaXg6IHBhcnNlZFRpdGxlPy5nZXRNYWluVGV4dCgpID8/IHZhbHVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycylcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogeyBxdWVyeTogeyBwYWdlczogeyB0aXRsZTogc3RyaW5nOyBjYXRlZ29yaWVzPzogeyB0aXRsZTogc3RyaW5nIH1bXSB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQ/LnF1ZXJ5Py5wYWdlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IHJlc3VsdC5xdWVyeS5wYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXBhZ2UuY2F0ZWdvcmllcz8uc29tZSgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6V2lraXBlZGlhIHNvZnQgcmVkaXJlY3RlZCBjYXRlZ29yaWVzJyksXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGVXaXRob3V0TmFtZXNwYWNlID0gcGFnZS50aXRsZS5zcGxpdCgnOicpWzFdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdGl0bGVXaXRob3V0TmFtZXNwYWNlLCBsYWJlbDogdGl0bGVXaXRob3V0TmFtZXNwYWNlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcGFnZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocGFnZXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICB9O1xuXG4gICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PlxuICAgICAgICBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbn1cblxuT2JqZWN0LmFzc2lnbihDYXRlZ29yeUlucHV0V2lkZ2V0LnByb3RvdHlwZSwgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgQXBpQ29tcGFyZVBhZ2VzUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdXNlZCBmb3Igc2hvd2luZyBjaGFuZ2VzIHRvIGJlIG1hZGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoYW5nZXNEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBPTy51aS5Qcm9jZXNzRGlhbG9nLkNvbmZpZ09wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcblxuICAgICAgICBDaGFuZ2VzRGlhbG9nLnN0YXRpYy5uYW1lID0gJ1Nob3dDaGFuZ2VzRGlhbG9nJztcbiAgICAgICAgQ2hhbmdlc0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnQ2hhbmdlcyB0byBiZSBtYWRlJztcbiAgICAgICAgQ2hhbmdlc0RpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFt7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfV07XG4gICAgfVxuXG4gICAgZ2V0U2V0dXBQcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gQ2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbb2xkVGV4dCwgbmV3VGV4dF0gPSB0aGlzLmdldERhdGEoKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAnYWN0aW9uJzogJ2NvbXBhcmUnLFxuICAgICAgICAgICAgICAgICAgICAnZm9ybWF0dmVyc2lvbic6ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgJ3Byb3AnOiBbJ2RpZmYnXSxcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb21zbG90cyc6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb210ZXh0LW1haW4nOiBvbGRUZXh0LFxuICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgJ3Rvc2xvdHMnOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICd0b3RleHQtbWFpbic6IG5ld1RleHQsXG4gICAgICAgICAgICAgICAgICAgICd0b2NvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlDb21wYXJlUGFnZXNQYXJhbXMgJiB7XG4gICAgICAgICAgICAgICAgICAgICdmcm9tdGV4dC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAndG90ZXh0LW1haW4nOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICd0b2NvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wYXJpc29uID0gKHJlc3VsdCBhcyB7IGNvbXBhcmU6IHsgYm9keTogc3RyaW5nIH0gfSkuY29tcGFyZS5ib2R5O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vQ2hhbmdlc0VsZW1lbnQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICd3YXJuaW5nJywgbGFiZWw6ICdObyBjaGFuZ2VzIHRvIG1ha2UhJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICBwYW5lbExheW91dC4kZWxlbWVudC5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgXG48dGFibGUgY2xhc3M9XCJkaWZmIGRpZmYtZWRpdGZvbnQtbW9ub3NwYWNlXCI+XG4gICAgPGNvbGdyb3VwPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1tYXJrZXJcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtY29udGVudFwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1tYXJrZXJcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtY29udGVudFwiPlxuICAgIDwvY29sZ3JvdXA+XG4gICAgPHRib2R5PlxuICAgICAgICAke2NvbXBhcmlzb259XG4gICAgPC90Ym9keT5cbjwvdGFibGU+YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbm9DaGFuZ2VzRWxlbWVudC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQocGFuZWxMYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICA/IG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWFuYWdlcigpLmNsb3NlV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBDaGFuZ2VzRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwodGhpcywgYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gQ2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG5PYmplY3QuYXNzaWduKENoYW5nZXNEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlQYXJzZVBhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgZGlhbG9nIHVzZWQgZm9yIHByZXZpZXdpbmcgdGVtcGxhdGUgb3V0cHV0LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPdXRwdXRQcmV2aWV3RGlhbG9nIGV4dGVuZHMgT08udWkuUHJvY2Vzc0RpYWxvZyB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBPTy51aS5Qcm9jZXNzRGlhbG9nLkNvbmZpZ09wdGlvbnMsIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcblxuICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcblxuICAgICAgICBPdXRwdXRQcmV2aWV3RGlhbG9nLnN0YXRpYy5uYW1lID0gJ091dHB1dFByZXZpZXdEaWFsb2cnO1xuICAgICAgICBPdXRwdXRQcmV2aWV3RGlhbG9nLnN0YXRpYy50aXRsZSA9ICdSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXMgcHJldmlldyc7XG4gICAgICAgIE91dHB1dFByZXZpZXdEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbeyBhY3Rpb246ICdjYW5jZWwnLCBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH1dO1xuICAgIH1cblxuICAgIGdldFNldHVwUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIE91dHB1dFByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdwYXJzZScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudG1vZGVsOiAnd2lraXRleHQnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiBbJ3RleHQnLCAnY2F0ZWdvcmllc2h0bWwnXSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFByZWZpeGVkRGIoKSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5nZXREYXRhKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVBhcnNlUGFyYW1zKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnc0NvbnRlbnQgPSAocmVzdWx0IGFzIHsgcGFyc2U6IHsgdGV4dDogc3RyaW5nIH0gfSkucGFyc2UudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2F0ZWdvcmllc0NvbnRlbnQgPSAocmVzdWx0IGFzIHsgcGFyc2U6IHsgY2F0ZWdvcmllc2h0bWw6IHN0cmluZyB9IH0pLnBhcnNlLmNhdGVnb3JpZXNodG1sO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsTGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsTGF5b3V0LiRlbGVtZW50LmFwcGVuZCh0YWdzQ29udGVudCwgY2F0ZWdvcmllc0NvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChwYW5lbExheW91dC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBhY3Rpb25cbiAgICAgICAgICAgID8gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYW5hZ2VyKCkuY2xvc2VXaW5kb3codGhpcyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IE91dHB1dFByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgIH07XG5cbiAgICBnZXRUZWFyZG93blByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBPdXRwdXRQcmV2aWV3RGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbk9iamVjdC5hc3NpZ24oT3V0cHV0UHJldmlld0RpYWxvZy5wcm90b3R5cGUsIE9PLnVpLlByb2Nlc3NEaWFsb2cucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgdHlwZSB7IEFwaVBhcnNlUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycywgUGFnZVBhcnNlUmVzdWx0IH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBMb29rdXBFbGVtZW50Q29uZmlnIGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0LkNvbmZpZ09wdGlvbnMsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuQ29uZmlnT3B0aW9ucyB7fVxuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSB0aXRsZSBsb29rdXAgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnLCBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuXG4gICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuICAgIH1cblxuICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgZWxzZSBpZiAodmFsdWUuaW5jbHVkZXMoJyMnKSkge1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB2YWx1ZS5zcGxpdCgnIycpWzBdO1xuXG4gICAgICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgICAgIC5nZXQoeyBhY3Rpb246ICdwYXJzZScsIHBhZ2U6IHRpdGxlLCBwcm9wOiAnc2VjdGlvbnMnLCByZWRpcmVjdHM6IHRydWUgfSBzYXRpc2ZpZXMgQXBpUGFyc2VQYXJhbXMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogUGFnZVBhcnNlUmVzdWx0IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkU2VjdGlvbnMgPSByZXN1bHQucGFyc2Uuc2VjdGlvbnMuZmlsdGVyKChzZWN0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24ubGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0c1dpdGgodmFsdWUuc3BsaXQoJyMnKVsxXS50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGAke3Jlc3VsdC5wYXJzZS50aXRsZX0jJHtzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGAke3Jlc3VsdC5wYXJzZS50aXRsZX0jJHtzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiBwYXJzZWRUaXRsZT8uZ2V0TmFtZXNwYWNlSWQoKSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBnYXBwcmVmaXg6IHBhcnNlZFRpdGxlPy5nZXRNYWluVGV4dCgpID8/IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgICAgIHByb3A6IFsnaW5mbycsICdwYWdlcHJvcHMnXSxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycylcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZzsgcGFnZXByb3BzOiB7IGRpc2FtYmlndWF0aW9uPzogc3RyaW5nIH07IHJlZGlyZWN0Pzogc3RyaW5nIH1bXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSB8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucXVlcnk/LnBhZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC5xdWVyeS5wYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocGFnZSkgPT4gcGFnZS50aXRsZSAhPT0gdGhpcy5wYWdlVGl0bGVQYXJzZWQudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcGFnZS50aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtwYWdlLnRpdGxlfSR7cGFnZS5wYWdlcHJvcHMgJiYgJ2Rpc2FtYmlndWF0aW9uJyBpbiBwYWdlLnBhZ2Vwcm9wcyA/ICcgPGk+KGRpc2FtYmlndWF0aW9uKTwvaT4nIDogJyd9JHsncmVkaXJlY3QnIGluIHBhZ2UgPyAnIDxpPihyZWRpcmVjdCk8L2k+JyA6ICcnfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIH07XG5cbiAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+XG4gICAgICAgIGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xufVxuXG5PYmplY3QuYXNzaWduKFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUge1xuICAgIEFwaVBhcnNlUGFyYW1zLFxuICAgIEFwaVF1ZXJ5SW5mb1BhcmFtcyxcbiAgICBBcGlRdWVyeVBhZ2VQcm9wc1BhcmFtcyxcbiAgICBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyxcbiAgICBQYWdlVHJpYWdlQXBpUGFnZVRyaWFnZUxpc3RQYXJhbXMsXG59IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcbmltcG9ydCB0eXBlIHtcbiAgICBDYXRlZ29yaWVzUmVzdWx0LFxuICAgIE1lZGlhV2lraURhdGFFcnJvcixcbiAgICBQYWdlSW5mb1Jlc3VsdCxcbiAgICBQYWdlUGFyc2VSZXN1bHQsXG4gICAgUGFnZVJldmlzaW9uc1Jlc3VsdCxcbiAgICBQYWdlVHJpYWdlTGlzdFJlc3BvbnNlLFxuICAgIFBhZ2Vwcm9wc1Jlc3VsdCxcbn0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCBDYXRlZ29yeUlucHV0V2lkZ2V0IGZyb20gJy4vY2F0ZWdvcnktaW5wdXQtd2lkZ2V0JztcbmltcG9ydCBDaGFuZ2VzRGlhbG9nIGZyb20gJy4vY2hhbmdlcy1kaWFsb2cnO1xuaW1wb3J0IE91dHB1dFByZXZpZXdEaWFsb2cgZnJvbSAnLi9vdXRwdXQtcHJldmlldy1kaWFsb2cnO1xuaW1wb3J0IFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQgZnJvbSAnLi9yZWRpcmVjdC10YXJnZXQtaW5wdXQtd2lkZ2V0JztcblxuZXhwb3J0IHR5cGUgUmVkaXJlY3RUZW1wbGF0ZURhdGEgPSBSZWNvcmQ8c3RyaW5nLCB7IHJlZGlyZWN0PzogdHJ1ZTsgcGFyYW1ldGVyczogUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM7IGFsaWFzZXM6IHN0cmluZ1tdIH0+O1xuXG50eXBlIFJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzID0gUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICAgIGFsaWFzZXM6IHN0cmluZ1tdO1xuICAgICAgICBsYWJlbDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgICAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gICAgICAgIHN1Z2dlc3RlZDogYm9vbGVhbjtcbiAgICAgICAgZGVmYXVsdDogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgICAgIGV4YW1wbGU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgIH1cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICBwYXJhbWV0ZXJzOiB7IG5hbWU6IHN0cmluZzsgYWxpYXNlczogc3RyaW5nW107IGVkaXRvcjogT08udWkuVGV4dElucHV0V2lkZ2V0IH1bXTtcbn1cblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhhbmRsZXMgdGhlIGRpYWxvZyBwb3J0aW9uIG9mIHJlZGlyZWN0LWhlbHBlciBzY3JpcHQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZGlyZWN0SGVscGVyRGlhbG9nIHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuICAgIHByaXZhdGUgcmVkaXJlY3RSZWdleCA9IC9eI3JlZGlyZWN0Oj9cXHMqXFxbXFxbXFxzKjo/KFteW1xcXXt8fV0rPylcXHMqKD86XFx8W15bXFxde3x9XSs/KT9dXVxccyovaTtcbiAgICBwcml2YXRlIHNjcmlwdEFkdmVydCA9ICcgKHZpYSBbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlcnxyZWRpcmVjdC1oZWxwZXJdXSknO1xuXG4gICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICBwcml2YXRlIGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDtcbiAgICBwcml2YXRlIHBhZ2VUaXRsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgIHByaXZhdGUgZXhpc3RzOiBib29sZWFuO1xuXG4gICAgLy8gVXNlZCBkdXJpbmcgcnVuKClcbiAgICBwcml2YXRlIG5lZWRzQ2hlY2sgPSB0cnVlO1xuXG4gICAgcHJpdmF0ZSBlZGl0b3JCb3ghOiBPTy51aS5QYW5lbExheW91dDtcbiAgICBwcml2YXRlIHN5bmNXaXRoTWFpbkJ1dHRvbj86IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICBwcml2YXRlIHJlZGlyZWN0SW5wdXQhOiBSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgcmVkaXJlY3RJbnB1dExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgdGFnU2VsZWN0ITogT08udWkuTWVudVRhZ011bHRpc2VsZWN0V2lkZ2V0O1xuICAgIHByaXZhdGUgdGFnU2VsZWN0TGF5b3V0ITogT08udWkuQWN0aW9uRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IhOiBIVE1MRGV0YWlsc0VsZW1lbnQ7XG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZUVkaXRvcnNJbmZvOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvW10gPSBbXTtcbiAgICBwcml2YXRlIGNhdGVnb3J5U2VsZWN0ITogT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQ7XG4gICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdElucHV0ITogQ2F0ZWdvcnlJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIGNhdGVnb3J5U2VsZWN0TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBkZWZhdWx0U29ydElucHV0ITogT08udWkuVGV4dElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgIHByaXZhdGUgZGVmYXVsdFNvcnRJbnB1dExheW91dCE6IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgc3VtbWFyeUlucHV0ITogT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIHN1bW1hcnlJbnB1dExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgc3VibWl0QnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgIHByaXZhdGUgc2hvd0NoYW5nZXNCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgcHJpdmF0ZSBzaG93UHJldmlld0J1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICBwcml2YXRlIHN5bmNUYWxrQ2hlY2tib3g/OiBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgc3luY1RhbGtDaGVja2JveExheW91dD86IE9PLnVpLldpZGdldDtcbiAgICBwcml2YXRlIHBhdHJvbENoZWNrYm94PzogT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIHBhdHJvbENoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgIHByaXZhdGUgc3VibWl0TGF5b3V0ITogT08udWkuSG9yaXpvbnRhbExheW91dDtcblxuICAgIHByaXZhdGUgdGFsa0RhdGE/OiBQYWdlSW5mb1Jlc3VsdDtcblxuICAgIHByaXZhdGUgcGFnZUNvbnRlbnQgPSAnJztcblxuICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYXJnZXQ/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhZ3M/OiBzdHJpbmdbXTtcbiAgICBwcml2YXRlIG9sZFJlZGlyZWN0VGFnRGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdW10+O1xuICAgIHByaXZhdGUgb2xkRGVmYXVsdFNvcnQ/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvbGRDYXRlZ29yaWVzPzogc3RyaW5nW107XG4gICAgcHJpdmF0ZSBvbGRTdHJheVRleHQ/OiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIHBhcnNlZERlc3RpbmF0aW9uITogbXcuVGl0bGUgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VGVtcGxhdGVzLFxuICAgICAgICAgICAgY29udGVudFRleHQsXG4gICAgICAgICAgICBwYWdlVGl0bGUsXG4gICAgICAgICAgICBwYWdlVGl0bGVQYXJzZWQsXG4gICAgICAgIH06IHsgcmVkaXJlY3RUZW1wbGF0ZXM6IFJlZGlyZWN0VGVtcGxhdGVEYXRhOyBjb250ZW50VGV4dDogSFRNTERpdkVsZW1lbnQ7IHBhZ2VUaXRsZTogc3RyaW5nOyBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlIH0sXG4gICAgICAgIGV4aXN0czogYm9vbGVhbixcbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyA9IHJlZGlyZWN0VGVtcGxhdGVzO1xuICAgICAgICB0aGlzLmNvbnRlbnRUZXh0ID0gY29udGVudFRleHQ7XG4gICAgICAgIHRoaXMucGFnZVRpdGxlID0gcGFnZVRpdGxlO1xuICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcblxuICAgICAgICB0aGlzLmV4aXN0cyA9IGV4aXN0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgcmVkaXJlY3QtaGVscGVyIGRpYWxvZyBpbnRvIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIG13LnV0aWwuYWRkQ1NTKGBcbiNjcmVhdGUtcmVkaXJlY3QtYnV0dG9uIHtcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLWJveCB7XG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICAgIG1hcmdpbi1ib3R0b206IDI1cHggIWltcG9ydGFudDtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZXNtb2tlO1xuICAgIHdpZHRoOiA3MDBweDtcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDUwcHgpO1xuICAgIGNvbG9yOiAjMjAyMTIyO1xufVxuXG4ucmVkaXJlY3QtaW5wdXQtbGF5b3V0IGxhYmVsIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci1yZWRpcmVjdC1wb3NzaWJpbGl0aWVzOjphZnRlciB7XG4gICAgY29udGVudDogXCIgKHJlZGlyZWN0IHdpdGggcG9zc2liaWxpdGllcylcIjtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIsXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIGRldGFpbHMge1xuICAgIG1hcmdpbi1ibG9jazogMTBweDtcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjtcbiAgICBwYWRkaW5nOiA1cHg7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgc3VtbWFyeSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIGRldGFpbHMge1xuICAgIG1hcmdpbi1ibG9jazogNXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNkMWNlY2U7XG59XG5cbiNyZWRpcmVjdC1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2Uge1xuICAgIHBhZGRpbmc6IDVweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1zdW1tYXJ5LWxheW91dCB7XG4gICAgbWFyZ2luLXRvcDogMTVweDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgZ3JheTtcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1zdWJtaXQtbGF5b3V0IHtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXQgPiAqIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXdhcm5pbmcge1xuICAgIG1hcmdpbi10b3A6IDhweDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci1hdXRvZml4LWJ1dHRvbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBmb250LXNpemU6IDEycHg7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItYXV0b2ZpeC1idXR0b24gYSB7XG4gICAgcGFkZGluZzogM3B4IDRweCAhaW1wb3J0YW50O1xuICAgIG1pbi1oZWlnaHQ6IHVuc2V0ICFpbXBvcnRhbnQ7XG59YCk7XG5cbiAgICAgICAgbXcubG9hZGVyLmFkZExpbmtUYWcoJ2h0dHBzOi8vd3d3Lm1lZGlhd2lraS5vcmcvdy9sb2FkLnBocD9tb2R1bGVzPW1lZGlhd2lraS5kaWZmLnN0eWxlcyZvbmx5PXN0eWxlcycpO1xuXG4gICAgICAgIC8qIExvYWQgZWxlbWVudHMgKi9cbiAgICAgICAgdGhpcy5lZGl0b3JCb3ggPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBpZDogJ3JlZGlyZWN0LWhlbHBlci1ib3gnLCBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSwgZnJhbWVkOiB0cnVlIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnBhZ2VUaXRsZVBhcnNlZC5pc1RhbGtQYWdlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1haW5QYWdlRGF0YSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0U3ViamVjdFBhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgaWYgKG1haW5QYWdlRGF0YS5xdWVyeS5wYWdlc1swXS5yZWRpcmVjdCkgYXdhaXQgdGhpcy5sb2FkU3luY1dpdGhNYWluQnV0dG9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRJbnB1dEVsZW1lbnRzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFN1Ym1pdEVsZW1lbnRzKCk7XG5cbiAgICAgICAgLyogQWRkIGVsZW1lbnRzIHRvIHNjcmVlbiBhbmQgbG9hZCBkYXRhIChpZiBhcHBsaWNhYmxlKSAqL1xuICAgICAgICB0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXS5hcHBlbmQoXG4gICAgICAgICAgICAuLi4oW1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY1dpdGhNYWluQnV0dG9uPy4kZWxlbWVudD8uWzBdLFxuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcixcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pIGFzIEhUTUxFbGVtZW50W10pLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuY29udGVudFRleHQucHJlcGVuZCh0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLmxvYWRFeGlzdGluZ0RhdGEoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgXCJTeW5jIHdpdGggbWFpbiBwYWdlXCIgYnV0dG9uXCIgb24gdGFsayBwYWdlcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRTeW5jV2l0aE1haW5CdXR0b24oKSB7XG4gICAgICAgIGNvbnN0IG1haW5QYWdlQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0U3ViamVjdFBhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCkpO1xuXG4gICAgICAgIHRoaXMuc3luY1dpdGhNYWluQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU3luYyB3aXRoIG1haW4gcGFnZScsIGljb246ICdsaW5rJywgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSB9KTtcbiAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZWRpcmVjdFJlZ2V4LmV4ZWMobWFpblBhZ2VDb250ZW50KT8uWzFdO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBtdy5ub3RpZnkoJ0ZhaWxlZCB0byBwYXJzZSBtYWluIHBhZ2UgY29udGVudCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZShtdy5UaXRsZS5uZXdGcm9tVGV4dCh0YXJnZXQpPy5nZXRUYWxrUGFnZSgpPy50b1N0cmluZygpID8/ICcnKTtcbiAgICAgICAgICAgIGNvbnN0IGZyb21Nb3ZlID0gWydSIGZyb20gbW92ZScsIC4uLnRoaXMucmVkaXJlY3RUZW1wbGF0ZXNbJ1IgZnJvbSBtb3ZlJ10uYWxpYXNlc10uc29tZSgodGFnT3JSZWRpcmVjdCkgPT5cbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ09yUmVkaXJlY3RbMF0udG9Mb3dlckNhc2UoKX0ke3RhZ09yUmVkaXJlY3RbMF19XSR7dGFnT3JSZWRpcmVjdC5zbGljZSgxKX1cXFxccyooXFxcXHx8fX0pYCkudGVzdChcbiAgICAgICAgICAgICAgICAgICAgbWFpblBhZ2VDb250ZW50LFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGZyb21Nb3ZlKSB0aGlzLnRhZ1NlbGVjdC5zZXRWYWx1ZShbJ1IgZnJvbSBtb3ZlJ10pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgaW5wdXQgZWxlbWVudHMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkSW5wdXRFbGVtZW50cygpIHtcbiAgICAgICAgLyogUmVkaXJlY3QgdGFyZ2V0IGlucHV0ICovXG4gICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dCA9IG5ldyBSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdUYXJnZXQgcGFnZSBuYW1lJywgcmVxdWlyZWQ6IHRydWUgfSwgdGhpcy5wYWdlVGl0bGVQYXJzZWQpO1xuICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eOi8sICcnKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMucmVkaXJlY3RJbnB1dCwge1xuICAgICAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCB0YXJnZXQ6JyxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFJlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIHNlbGVjdGlvbiAqL1xuICAgICAgICB0aGlzLnRhZ1NlbGVjdCA9IG5ldyBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgYWxsb3dBcmJpdHJhcnk6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpLm1hcCgoW3RhZywgeyByZWRpcmVjdCB9XSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcmVkaXJlY3QpIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWw6IHRhZyB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQoYDxzcGFuIGNsYXNzPVwicmVkaXJlY3QtaGVscGVyLXJlZGlyZWN0LXBvc3NpYmlsaXRpZXNcIj4ke3RhZ308L3NwYW4+YCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB0YWcsIGxhYmVsIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgICh0aGlzLnRhZ1NlbGVjdC5nZXRNZW51KCkgYXMgT08udWkuTWVudVNlbGVjdFdpZGdldC5Db25maWdPcHRpb25zKS5maWx0ZXJNb2RlID0gJ3N1YnN0cmluZyc7XG4gICAgICAgIHRoaXMudGFnU2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoKHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKHNvcnRlZFRhZ3MpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZWRpdG9ySW5mbyBvZiB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8pIGVkaXRvckluZm8uZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICBsZXQgc2hvd25UZW1wbGF0ZUVkaXRvcnMgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvckluZm8gPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVkaXRvckluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICBzaG93blRlbXBsYXRlRWRpdG9ycysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSBgVGVtcGxhdGUgcGFyYW1ldGVycyAoJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyBgZm9yICR7c2hvd25UZW1wbGF0ZUVkaXRvcnN9IHRlbXBsYXRlJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDEgPyAncycgOiAnJ31gIDogJ25vbmUgdG8gc2hvdyd9KWA7XG5cbiAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5zdHlsZS5kaXNwbGF5ID0gc2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gJ25vbmUnIDogJ2Jsb2NrJztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50YWdTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy50YWdTZWxlY3QsIHtcbiAgICAgICAgICAgIGxhYmVsOiAnUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzOicsXG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLFxuICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvKiBSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzICovXG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5jbGFzc0xpc3QuYWRkKCdyZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXInKTtcblxuICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSAnVGVtcGxhdGUgcGFyYW1ldGVycyAobm9uZSB0byBzaG93KSc7XG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXModGVtcGxhdGVEYXRhLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgIGRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgICAgIHN1bW1hcnkudGV4dENvbnRlbnQgPSB0ZW1wbGF0ZU5hbWU7XG4gICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChzdW1tYXJ5KTtcblxuICAgICAgICAgICAgY29uc3QgZWxlbWVudERhdGE6IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gPSB7IG5hbWU6IHRlbXBsYXRlTmFtZSwgZGV0YWlscywgcGFyYW1ldGVyczogW10gfTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyRGF0YV0gb2YgcGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwYXJhbWV0ZXJEYXRhLmRlZmF1bHQ/LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBwYXJhbWV0ZXJEYXRhLnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChpbnB1dCwge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGFyYW1ldGVyTmFtZX0keyFwYXJhbWV0ZXJEYXRhLmxhYmVsIHx8IHBhcmFtZXRlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFyYW1ldGVyRGF0YS5sYWJlbD8udG9Mb3dlckNhc2UoKSA/ICcnIDogYCAoJHtwYXJhbWV0ZXJEYXRhLmxhYmVsfSlgfSR7cGFyYW1ldGVyRGF0YS5kZXNjcmlwdGlvbiA/IGAgKCR7cGFyYW1ldGVyRGF0YS5kZXNjcmlwdGlvbn0pYCA6ICcnfSAodHlwZTogJHtwYXJhbWV0ZXJEYXRhLnR5cGV9KSAke3BhcmFtZXRlckRhdGEuc3VnZ2VzdGVkID8gJyAoc3VnZ2VzdGVkKScgOiAnJ30ke3BhcmFtZXRlckRhdGEuZXhhbXBsZSA/IGAgKGV4YW1wbGU6IFwiJHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGV9XCIpYCA6ICcnfWAsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChpbnB1dExheW91dC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS5wYXJhbWV0ZXJzLnB1c2goeyBuYW1lOiBwYXJhbWV0ZXJOYW1lLCBhbGlhc2VzOiBwYXJhbWV0ZXJEYXRhLmFsaWFzZXMsIGVkaXRvcjogaW5wdXQgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChkZXRhaWxzKTtcblxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLnB1c2goZWxlbWVudERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9UZW1wbGF0ZXNNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5pZCA9ICdyZWRpcmVjdC1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2UnO1xuICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UudGV4dENvbnRlbnQgPSAnTm8gdGVtcGxhdGVzIHdpdGggcGFyYW1ldGVycyB0byBkaXNwbGF5ISc7XG5cbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKG5vVGVtcGxhdGVzTWVzc2FnZSk7XG5cbiAgICAgICAgLyogREVGQVVMVFNPUlQgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCgpO1xuICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUodmFsdWUucmVwbGFjZUFsbCgnXycsICcgJykpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGljb246ICdyb2JvdCcsIGxhYmVsOiAnU3VnZ2VzdCcsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldE1haW5UZXh0KCkucmVwbGFjZSgvIFxcKC4qXFwpJC8sICcnKTsgLy8gUmVtb3ZlIGRpc2FtYmlndWF0aW9uXG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gYmlydGggbmFtZScsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gZmljdGlvbmFsIGNoYXJhY3RlcicsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gYmFuZCBtZW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIG1lbWJlcicsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gcGVyc29uJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBwZXJzb25hbCBuYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSByZWxhdGl2ZScsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gc3BvdXNlJyxcbiAgICAgICAgICAgICAgICBdLnNvbWUoKHRhZykgPT4gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyh0YWcpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxpbmcgaXMgbW9kaWZpZWQgZnJvbSBldmFkMzcncyBcIlJhdGVyXCJcblxuICAgICAgICAgICAgICAgIGlmICghbmFtZS5pbmNsdWRlcygnICcpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXcubm90aWZ5KFwicmVkaXJlY3QtaGVscGVyIHdhc24ndCBhYmxlIHRvIGRldGVybWluZSBhIHNvcnQga2V5IGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHBhZ2UgdGl0bGUhXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZ2VuZXJhdGlvbmFsU3VmZml4ID0gJyc7XG4gICAgICAgICAgICAgICAgaWYgKC8gKD86W0pTXXIuP3xbSVZYXSspJC8udGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uYWxTdWZmaXggPSBuYW1lLnNsaWNlKG5hbWUubGFzdEluZGV4T2YoJyAnKSk7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoJyAnKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5pbmNsdWRlcygnICcpKSByZXR1cm4gbmFtZSArIGdlbmVyYXRpb25hbFN1ZmZpeDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0TmFtZSA9IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgLnNsaWNlKG5hbWUubGFzdEluZGV4T2YoJyAnKSArIDEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sJC8sICcnKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvTycvLCAnTycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyTmFtZXMgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoJyAnKSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUobGFzdE5hbWUgKyAnLCAnICsgb3RoZXJOYW1lcyArIGdlbmVyYXRpb25hbFN1ZmZpeCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBuZXdOYW1lID0gbmFtZS5yZXBsYWNlQWxsKCdNci4nLCAnTWlzdGVyJykucmVwbGFjZUFsbCgnJicsICdBbmQnKTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGVhZGluZ0FydGljbGUgb2YgWydBbicsICdBJywgJ1RoZSddKVxuICAgICAgICAgICAgICAgICAgICBpZiAobmV3TmFtZS5zdGFydHNXaXRoKGxlYWRpbmdBcnRpY2xlICsgJyAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSA9IG5ld05hbWUuc2xpY2UobGVhZGluZ0FydGljbGUubGVuZ3RoICsgMSkgKyAnLCAnICsgbGVhZGluZ0FydGljbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5ld05hbWUgPT09IG5hbWUpXG4gICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShcInJlZGlyZWN0LWhlbHBlciB3YXNuJ3QgYWJsZSB0byBkZXRlcm1pbmUgYSBzb3J0IGtleSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBwYWdlIHRpdGxlIVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybicsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKG5ld05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuQWN0aW9uRmllbGRMYXlvdXQodGhpcy5kZWZhdWx0U29ydElucHV0LCB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbiwge1xuICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICBgRGVmYXVsdCBzb3J0IGtleSAoREVGQVVMVFNPUlQpIChzZWUgPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwoJ1dpa2lwZWRpYTpDYXRlZ29yaXphdGlvbiNTb3J0IGtleXMnKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5ndWlkZWxpbmU8L2E+KTpgLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIENhdGVnb3JpZXMgc2VsZWN0aW9uICovXG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dCA9IG5ldyBDYXRlZ29yeUlucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdBZGQgY2F0ZWdvcmllcyBoZXJlJyB9KTtcbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXkNhdGVnb3J5Oi8sICcnKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdzaG93aW5nLXZhbHVlcycsIChwYWdlczogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHRoaXMuY2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhZ2UuZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0ID0gbmV3IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsXG4gICAgICAgICAgICBpbnB1dFdpZGdldDogdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9ICh0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoKHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgdGhpcy5jYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuY2F0ZWdvcnlTZWxlY3QsIHtcbiAgICAgICAgICAgIGxhYmVsOiAnQ2F0ZWdvcmllczonLFxuICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogU3VtbWFyeSBpbnB1dCAqL1xuICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dCA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZXNvbHZlIGRvdWJsZSByZWRpcmVjdCcgfSwgLy9cbiAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZXNvbHZlIHNlbGYgcmVkaXJlY3QnIH0sXG4gICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVtb3ZlIGluY29ycmVjdCByY2F0cycgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3VtbWFyeUlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc3VtbWFyeUlucHV0LCB7XG4gICAgICAgICAgICBpZDogJ3JlZGlyZWN0LWhlbHBlci1zdW1tYXJ5LWxheW91dCcsXG4gICAgICAgICAgICBsYWJlbDogJ1N1bW1hcnk6JyxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBlbGVtZW50cyBpbiB0aGUgc3VibWl0IGJ1dHRvbiByb3cuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkU3VibWl0RWxlbWVudHMoKSB7XG4gICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICAvKiBTZXR1cCBzdWJtaXQgYnV0dG9uICovXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU3VibWl0JywgZGlzYWJsZWQ6IHRydWUsIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10gfSk7XG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHRoaXMuaGFuZGxlU3VibWl0QnV0dG9uQ2xpY2soKSk7XG5cbiAgICAgICAgLyogU2V0dXAgc2hvdyBwcmV2aWV3IGJ1dHRvbiAqL1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cgPSBuZXcgT3V0cHV0UHJldmlld0RpYWxvZyh7IHNpemU6ICdsYXJnZScgfSwgdGhpcy5wYWdlVGl0bGVQYXJzZWQpO1xuICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3RlbXBsYXRlUHJldmlld0RpYWxvZ10pO1xuXG4gICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTaG93IHByZXZpZXcnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cuc2V0RGF0YShcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGVtcGxhdGVQcmV2aWV3RGlhbG9nLm9wZW4oKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogU2V0dXAgc2hvdyBjaGFuZ2VzIGJ1dHRvbiAqL1xuICAgICAgICBjb25zdCBzaG93Q2hhbmdlc0RpYWxvZyA9IG5ldyBDaGFuZ2VzRGlhbG9nKHsgc2l6ZTogJ2xhcmdlJyB9KTtcbiAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFtzaG93Q2hhbmdlc0RpYWxvZ10pO1xuXG4gICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTaG93IGNoYW5nZXMnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5leGlzdHMpIHRoaXMucGFnZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlKTtcblxuICAgICAgICAgICAgc2hvd0NoYW5nZXNEaWFsb2cuc2V0RGF0YShbXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHNob3dDaGFuZ2VzRGlhbG9nLm9wZW4oKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogU2V0dXAgc3luYyB0YWxrIGNoZWNrYm94ICovXG4gICAgICAgIGlmICghdGhpcy5wYWdlVGl0bGVQYXJzZWQuaXNUYWxrUGFnZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRhbGtEYXRhID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuICAgICAgICAgICAgdGhpcy5zeW5jVGFsa0NoZWNrYm94ID0gbmV3IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQoeyBzZWxlY3RlZDogISF0aGlzLnRhbGtEYXRhLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0IH0pO1xuXG4gICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3hMYXlvdXQgPSBuZXcgT08udWkuV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc3luY1RhbGtDaGVja2JveCwgeyBsYWJlbDogJ1N5bmMgdGFsayBwYWdlJywgYWxpZ246ICdpbmxpbmUnIH0pXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2V0dXAgcGF0cm9sIGNoZWNrYm94ICovXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmNoZWNrU2hvdWxkUHJvbXB0UGF0cm9sKCkpIHtcbiAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCh7IHNlbGVjdGVkOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94TGF5b3V0ID0gbmV3IE9PLnVpLldpZGdldCh7XG4gICAgICAgICAgICAgICAgY29udGVudDogW25ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnBhdHJvbENoZWNrYm94LCB7IGxhYmVsOiAnTWFyayBhcyBwYXRyb2xsZWQnLCBhbGlnbjogJ2lubGluZScgfSldLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTZXR1cCBsYXlvdXQgKi9cbiAgICAgICAgdGhpcy5zdWJtaXRMYXlvdXQgPSBuZXcgT08udWkuSG9yaXpvbnRhbExheW91dCh7XG4gICAgICAgICAgICBpZDogJ3JlZGlyZWN0LWhlbHBlci1zdWJtaXQtbGF5b3V0JyxcbiAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveExheW91dCxcbiAgICAgICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94TGF5b3V0LFxuICAgICAgICAgICAgXS5maWx0ZXIoQm9vbGVhbikgYXMgT08udWkuV2lkZ2V0W10sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIHRvIHBhdHJvbCB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGNoZWNrU2hvdWxkUHJvbXB0UGF0cm9sKCkge1xuICAgICAgICBjb25zdCBwYWdlVHJpYWdlTWFya0J1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEltYWdlRWxlbWVudD4oJyNtd2UtcHQtbWFyayAubXdlLXB0LXRvb2wtaWNvbicpO1xuICAgICAgICBwYWdlVHJpYWdlTWFya0J1dHRvbj8uY2xpY2soKTtcbiAgICAgICAgcGFnZVRyaWFnZU1hcmtCdXR0b24/LmNsaWNrKCk7XG5cbiAgICAgICAgaWYgKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgIT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhdHJvbGxpbmsnKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtd2UtcHQtbWFyay1hcy1yZXZpZXdlZC1idXR0b24nKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtd2UtcHQtbWFyay1hcy11bnJldmlld2VkLWJ1dHRvbicpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCB1c2VyUGVybWlzc2lvbnMgPSBhd2FpdCBtdy51c2VyLmdldFJpZ2h0cygpO1xuICAgICAgICAgICAgaWYgKCF1c2VyUGVybWlzc2lvbnMuaW5jbHVkZXMoJ3BhdHJvbCcpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhdHJvbFJlc3BvbnNlID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncGFnZXRyaWFnZWxpc3QnLFxuICAgICAgICAgICAgICAgIHBhZ2VfaWQ6IG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJyksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBQYWdlVHJpYWdlQXBpUGFnZVRyaWFnZUxpc3RQYXJhbXMpKSBhcyBQYWdlVHJpYWdlTGlzdFJlc3BvbnNlO1xuXG4gICAgICAgICAgICBpZiAocGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXNbMF0/LnVzZXJfbmFtZSA9PT0gbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlIGlmIChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5yZXN1bHQgIT09ICdzdWNjZXNzJyB8fCBwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuICFOdW1iZXIucGFyc2VJbnQocGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXNbMF0/LnBhdHJvbF9zdGF0dXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgc3VtbWFyeSBpbnB1dCBwbGFjZWhvbGRlci5cbiAgICAgKi9cbiAgICBwcml2YXRlIHVwZGF0ZVN1bW1hcnkoKSB7XG4gICAgICAgIGNvbnN0IHJlZGlyZWN0VmFsdWUgPSB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgaWYgKCFyZWRpcmVjdFZhbHVlKSAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSAnJztcbiAgICAgICAgZWxzZSBpZiAodGhpcy5leGlzdHMpIHtcbiAgICAgICAgICAgIGxldCBvbGRUYXJnZXQgPSB0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0Py5yZXBsYWNlQWxsKCdfJywgJyAnKTtcbiAgICAgICAgICAgIGlmIChvbGRUYXJnZXQpIG9sZFRhcmdldCA9IG9sZFRhcmdldFswXS50b1VwcGVyQ2FzZSgpICsgb2xkVGFyZ2V0LnNsaWNlKDEpO1xuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRDaGFuZ2VkID0gcmVkaXJlY3RWYWx1ZSAhPT0gb2xkVGFyZ2V0O1xuXG4gICAgICAgICAgICBjb25zdCB0YWdzQ2hhbmdlZCA9XG4gICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKCh0YWcpID0+ICF0aGlzLm9sZFJlZGlyZWN0VGFncyEuaW5jbHVkZXModGFnIGFzIHN0cmluZykpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhZ3MhLnNvbWUoKHRhZykgPT4gIXRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXModGFnKSk7XG5cbiAgICAgICAgICAgIGxldCB0YWdBcmd1bWVudHNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdzV2l0aFBhcmFtZXRlcnMgPSBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChbLCBkYXRhXSkgPT4gT2JqZWN0LmVudHJpZXMoZGF0YS5wYXJhbWV0ZXJzKS5sZW5ndGggPiAwLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFt0YWcsIGRhdGFdIG9mIHRhZ3NXaXRoUGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdXYXNTZWxlY3RlZCA9IHRoaXMub2xkUmVkaXJlY3RUYWdzIS5pbmNsdWRlcyh0YWcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhZ1dhc1NlbGVjdGVkIHx8ICF0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZykpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFRhZ0RhdGEgPSB0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YVt0YWddID8/IE9iamVjdC5lbnRyaWVzKGRhdGEucGFyYW1ldGVycykubWFwKChbbmFtZV0pID0+IFtuYW1lLCAnJ10pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kVGFnRWRpdG9yRGF0YSA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUubmFtZSA9PT0gdGFnKSE7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgZm91bmRUYWdFZGl0b3JEYXRhLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZEFyZ3VtZW50ID0gb2xkVGFnRGF0YS5maW5kKChhcmd1bWVudCkgPT4gYXJndW1lbnRbMF0gPT09IHBhcmFtZXRlci5uYW1lKT8uWzFdID8/ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QXJndW1lbnQgPSBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQXJndW1lbnQgIT09IG5ld0FyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnQXJndW1lbnRzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnQXJndW1lbnRzQ2hhbmdlZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0U29ydENoYW5nZWQgPSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCkgIT09IHRoaXMub2xkRGVmYXVsdFNvcnQhLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuXG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzQ2hhbmdlZCA9XG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLnNvbWUoKGNhdGVnb3J5KSA9PiAhdGhpcy5vbGRDYXRlZ29yaWVzIS5pbmNsdWRlcyhjYXRlZ29yeSBhcyBzdHJpbmcpKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMub2xkQ2F0ZWdvcmllcyEuc29tZSgoY2F0ZWdvcnkpID0+ICF0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXMoY2F0ZWdvcnkpKTtcblxuICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IFtdO1xuXG4gICAgICAgICAgICBpZiAodGFyZ2V0Q2hhbmdlZCkgY2hhbmdlcy5wdXNoKGByZXRhcmdldCB0byBbWyR7cmVkaXJlY3RWYWx1ZX1dXWApO1xuICAgICAgICAgICAgaWYgKHRhZ3NDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwICYmIHRoaXMub2xkUmVkaXJlY3RUYWdzIS5sZW5ndGggPiAwID8gJ2NoYW5nZScgOiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmxlbmd0aCA+IDAgPyAnYWRkJyA6ICdyZW1vdmUnfSBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXNgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGFnQXJndW1lbnRzQ2hhbmdlZCkgY2hhbmdlcy5wdXNoKCdjaGFuZ2UgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgYXJndW1lbnRzJyk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdFNvcnRDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCkudHJpbSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5vbGREZWZhdWx0U29ydCEucmVwbGFjZUFsbCgnXycsICcgJykubGVuZ3RoID4gMCA/ICdjaGFuZ2UnIDogdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCkudHJpbSgpLmxlbmd0aCA+IDAgPyAnYWRkJyA6ICdyZW1vdmUnfSBkZWZhdWx0IHNvcnQga2V5YCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGNhdGVnb3JpZXNDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5vbGRDYXRlZ29yaWVzIS5sZW5ndGggPiAwID8gJ2NoYW5nZScgOiB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkubGVuZ3RoID4gMCA/ICdhZGQnIDogJ3JlbW92ZSd9IGNhdGVnb3JpZXNgLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkgY2hhbmdlcy5wdXNoKCdwZXJmb3JtIHJlZGlyZWN0IGNsZWFudXAnKTtcblxuICAgICAgICAgICAgY2hhbmdlc1swXSA9IGNoYW5nZXNbMF1bMF0udG9VcHBlckNhc2UoKSArIGNoYW5nZXNbMF0uc2xpY2UoMSk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPiAxKSBjaGFuZ2VzW2NoYW5nZXMubGVuZ3RoIC0gMV0gPSBgYW5kICR7Y2hhbmdlcy5hdCgtMSl9YDtcblxuICAgICAgICAgICAgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gY2hhbmdlcy5qb2luKGNoYW5nZXMubGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgICB9IGVsc2UgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gYENyZWF0ZSByZWRpcmVjdCB0byBbWyR7cmVkaXJlY3RWYWx1ZX1dXWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgZXhpc3RpbmcgcGFnZSBkYXRhLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZEV4aXN0aW5nRGF0YSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLnBhZ2VDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRQYWdlQ29udGVudCh0aGlzLnBhZ2VUaXRsZSk7XG5cbiAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhcmdldCA9IHRoaXMucmVkaXJlY3RSZWdleC5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMV07XG5cbiAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhZ3MgPSAoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKVxuICAgICAgICAgICAgICAgIC5tYXAoKFt0YWcsIHRhZ0RhdGFdKSA9PlxuICAgICAgICAgICAgICAgICAgICBbdGFnLCAuLi50YWdEYXRhLmFsaWFzZXNdLnNvbWUoKHRhZ09yUmVkaXJlY3QpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB7e1xcXFxzKlske3RhZ09yUmVkaXJlY3RbMF0udG9Mb3dlckNhc2UoKX0ke3RhZ09yUmVkaXJlY3RbMF19XSR7dGFnT3JSZWRpcmVjdC5zbGljZSgxKX1cXFxccyooXFxcXHx8fX0pYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICkudGVzdCh0aGlzLnBhZ2VDb250ZW50KSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0YWdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXVxuICAgICAgICApLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVkaXJlY3RUYWdzID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcylcbiAgICAgICAgICAgIC5mbGF0TWFwKChbdGFnLCB0YWdEYXRhXSkgPT4gW3RhZywgLi4udGFnRGF0YS5hbGlhc2VzXSlcbiAgICAgICAgICAgIC5tYXAoKHRhZ09yUmVkaXJlY3QpID0+XG4gICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChge3tcXFxccypbJHt0YWdPclJlZGlyZWN0WzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdPclJlZGlyZWN0WzBdfV0ke3RhZ09yUmVkaXJlY3Quc2xpY2UoMSl9XFxcXHMqKFxcXFx8fH19KWApLnRlc3QoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA/IHRhZ09yUmVkaXJlY3RcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIG9yaWdpbmFsUmVkaXJlY3RUYWdzXG4gICAgICAgICAgICAgICAgLm1hcCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChge3tcXFxccypbJHt0YWdbMF0udG9Mb3dlckNhc2UoKX0ke3RhZ1swXX1dJHt0YWcuc2xpY2UoMSl9XFxcXHw/KC4qPylcXFxccyp9fWApLmV4ZWMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50LFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1RhZyA9IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpLmZpbmQoKFt0ZW1wbGF0ZSwgdGFnRGF0YV0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGUsIC4uLnRhZ0RhdGEuYWxpYXNlc10uaW5jbHVkZXModGFnKSxcbiAgICAgICAgICAgICAgICAgICAgKT8uWzBdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQXJndW1lbnRzID0gbWF0Y2g/LlsxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmlnaW5hbEFyZ3VtZW50cykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkQXJndW1lbnRzID0gbWF0Y2hbMV0uc3BsaXQoJ3wnKS5tYXAoKGFyZ3VtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmd1bWVudC5pbmNsdWRlcygnPScpKSByZXR1cm4gWyhpbmRleCArIDEpLnRvU3RyaW5nKCksIGFyZ3VtZW50LnRyaW0oKV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBhcmd1bWVudC5zcGxpdCgnPScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW25hbWUudHJpbSgpLCB2YWx1ZS50cmltKCldO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW25ld1RhZywgZm9ybWF0dGVkQXJndW1lbnRzXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgW3N0cmluZywgc3RyaW5nW11bXV1bXSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLm9sZERlZmF1bHRTb3J0ID1cbiAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnRcbiAgICAgICAgICAgICAgICAubWF0Y2goL3t7REVGQVVMVFNPUlQ6Lio/fX0vZylcbiAgICAgICAgICAgICAgICA/LmF0KC0xKVxuICAgICAgICAgICAgICAgID8uc2xpY2UoMTQsIC0yKVxuICAgICAgICAgICAgICAgID8udHJpbSgpID8/ICcnO1xuXG4gICAgICAgIHRoaXMub2xkQ2F0ZWdvcmllcyA9IHRoaXMucGFnZUNvbnRlbnQubWF0Y2goL1xcW1xcW1tDY11hdGVnb3J5Oi4rP11dL2cpPy5tYXAoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS5zbGljZSgxMSwgLTIpKSA/PyBbXTtcblxuICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCA9IFtcbiAgICAgICAgICAgIC97e3Nob3J0IGRlc2NyaXB0aW9uXFx8Lio/fX0vaS5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAve3tESVNQTEFZVElUTEU6Lio/fX0vLmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlswXSxcbiAgICAgICAgICAgIC97e2l0YWxpYyB0aXRsZVxcfD8uKj99fS9pLmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlswXSxcbiAgICAgICAgICAgIC97e3RpdGxlIGxhbmd1YWdlXFx8Lio/fX0vLmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlswXSxcbiAgICAgICAgICAgIC97e2F1dGhvcml0eSBjb250cm9sKFxcfC4qPyk/fX0vaS5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgIF1cbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgICAgICBpZiAodGhpcy5vbGRSZWRpcmVjdFRhcmdldCkgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKHRoaXMub2xkUmVkaXJlY3RUYXJnZXQucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICBlbHNlIG13Lm5vdGlmeSgnQ291bGQgbm90IGZpbmQgcmVkaXJlY3QgdGFyZ2V0IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICB0aGlzLnRhZ1NlbGVjdC5zZXRWYWx1ZSh0aGlzLm9sZFJlZGlyZWN0VGFncyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCBkYXRhXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kVGVtcGxhdGVFZGl0b3IgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0ZW1wbGF0ZU5hbWUpO1xuICAgICAgICAgICAgaWYgKCFmb3VuZFRlbXBsYXRlRWRpdG9yKSBjb250aW51ZTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgYXJndW1lbnRdIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFBhcmFtZXRlckVkaXRvciA9IGZvdW5kVGVtcGxhdGVFZGl0b3IucGFyYW1ldGVycy5maW5kKChwYXJhbWV0ZXIpID0+XG4gICAgICAgICAgICAgICAgICAgIFtwYXJhbWV0ZXIubmFtZSwgLi4ucGFyYW1ldGVyLmFsaWFzZXNdLmluY2x1ZGVzKHBhcmFtZXRlck5hbWUpLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZm91bmRQYXJhbWV0ZXJFZGl0b3IpIGZvdW5kUGFyYW1ldGVyRWRpdG9yLmVkaXRvci5zZXRWYWx1ZShhcmd1bWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vbGREZWZhdWx0U29ydCkgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKHRoaXMub2xkRGVmYXVsdFNvcnQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgdGhpcy5vbGRDYXRlZ29yaWVzKSB0aGlzLmNhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShjYXRlZ29yeSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUodGhpcy5vbGRDYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+ICh7IGRhdGE6IGNhdGVnb3J5LCBsYWJlbDogY2F0ZWdvcnkgfSkpKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW5zIGNoZWNrcyBvbiB0aGUgcHJvdmlkZWQgZGF0YSBhbmQgcmV0dXJucyB0aGUgZXJyb3JzIChpZiBhbnkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVTdWJtaXNzaW9uKCkge1xuICAgICAgICBjb25zdCBlcnJvcnM6IHtcbiAgICAgICAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgICAgICAgbWVzc2FnZTogc3RyaW5nO1xuICAgICAgICAgICAgYXV0b0ZpeGVzPzogKHsgdHlwZTogJ2FkZCcgfCAncmVtb3ZlJzsgdGFnOiBzdHJpbmcgfSB8IHsgdHlwZTogJ2NoYW5nZS10YXJnZXQnOyB0YXJnZXQ6IHN0cmluZyB9KVtdO1xuICAgICAgICB9W10gPSBbXTtcblxuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdGFncyA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgLyogSW52YWxpZCBjaGFyYWN0ZXJzICovXG4gICAgICAgIGlmICghL15cXHMqW15bXFxde3x9XStcXHMqJC8udGVzdChkZXN0aW5hdGlvbikpIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgcGFnZSB0aXRsZSEnIH0pO1xuXG4gICAgICAgIC8qIEZhaWxlZCBkdXJpbmcgdGl0bGUgcGFyc2luZyAqL1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wYXJzZWREZXN0aW5hdGlvbiA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KGRlc3RpbmF0aW9uKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnBhcnNlZERlc3RpbmF0aW9uICYmIGVycm9ycy5sZW5ndGggPT09IDApIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgcGFnZSB0aXRsZSEnIH0pO1xuXG4gICAgICAgIC8qIFNlbGYgcmVkaXJlY3RzICovXG4gICAgICAgIGlmICh0aGlzLnBhcnNlZERlc3RpbmF0aW9uPy50b1N0cmluZygpID09PSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC50b1N0cmluZygpKSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdjYW5ub3QgcmVkaXJlY3QgdG8gaXRzZWxmIScgfSk7XG5cbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25EYXRhID0gKGF3YWl0IHRoaXMuYXBpXG4gICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIHByb3A6IFsncGFnZXByb3BzJywgJ2NhdGVnb3JpZXMnXSxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlQYWdlUHJvcHNQYXJhbXMpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgLyogTm9uZXhpc3RlbnQgZGVzdGluYXRpb24gKi8gaWYgKGVycm9yQ29kZSA9PT0gJ21pc3Npbmd0aXRsZScpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnZG9lcyBub3QgZXhpc3QhJyB9KTtcbiAgICAgICAgICAgICAgICAvKiBPdGhlciBBUEkgZXJyb3IgKi8gZWxzZVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogYHdhcyBub3QgYWJsZSB0byBiZSBmZXRjaGVkIGZyb20gdGhlIEFQSSAoJHtlcnJvckNvZGV9KSFgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSkpIGFzIChQYWdlcHJvcHNSZXN1bHQgJiBDYXRlZ29yaWVzUmVzdWx0KSB8IG51bGw7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3BhcnNlJyxcbiAgICAgICAgICAgIHBhZ2U6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgcHJvcDogJ3NlY3Rpb25zJyxcbiAgICAgICAgICAgIHJlZGlyZWN0czogdHJ1ZSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUGFyc2VQYXJhbXMpKSBhcyBQYWdlUGFyc2VSZXN1bHQ7XG5cbiAgICAgICAgLyogRG91YmxlIHJlZGlyZWN0cyAqL1xuICAgICAgICBpZiAoZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5yZWRpcmVjdHM/LlswXSkge1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25SZWRpcmVjdCA9XG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5yZWRpcmVjdHNbMF0udG8gK1xuICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnJlZGlyZWN0c1swXS50b2ZyYWdtZW50ID8gYCMke2Rlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzWzBdLnRvZnJhZ21lbnR9YCA6ICcnKTtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogZGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIGEgcmVkaXJlY3QgdG8gPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwoXG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUmVkaXJlY3QsXG4gICAgICAgICAgICAgICAgKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2Rlc3RpbmF0aW9uUmVkaXJlY3R9PC9hPi4gUmV0YXJnZXQgdG8gdGhhdCBwYWdlIGluc3RlYWQsIGFzIGRvdWJsZSByZWRpcmVjdHMgYXJlbid0IGFsbG93ZWQuYCxcbiAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdjaGFuZ2UtdGFyZ2V0JywgdGFyZ2V0OiBkZXN0aW5hdGlvblJlZGlyZWN0IH1dLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBOb25leGlzdGVudCBzZWN0aW9uICovXG4gICAgICAgIGlmIChkZXN0aW5hdGlvbi5zcGxpdCgnIycpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkU2VjdGlvbiA9IGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2Uuc2VjdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAoc2VjdGlvbikgPT4gc2VjdGlvbi5saW5lLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpID09PSBkZXN0aW5hdGlvbi5zcGxpdCgnIycpWzFdLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh2YWxpZFNlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB0byBhbmNob3InKSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIHRhZ2dlZCBhcyBhIHJlZGlyZWN0IHRvIGFuIGFuY2hvciwgYnV0IGl0IGlzIGFjdHVhbGx5IGEgcmVkaXJlY3QgdG8gYSBzZWN0aW9uIScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdhZGQnLCB0YWc6ICdSIHRvIHNlY3Rpb24nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVtb3ZlJywgdGFnOiAnUiB0byBhbmNob3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhZ3MuaW5jbHVkZXMoJ1IgdG8gc2VjdGlvbicpKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24sIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHRvIHNlY3Rpb259fTwvY29kZT4hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gc2VjdGlvbicgfV0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbnRlbnQgPSAoXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYXJzZWREZXN0aW5hdGlvbiEudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICAgICAgICAgKS5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYW5jaG9ycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hdGNoKC8oPzw9e3tcXHMqP1tBYV0oPzpuY2hvcnM/fG5jaG9yIGZvciByZWRpcmVjdHxua2VyfE5DSE9SfG5jKVxccyo/XFx8KS4rPyg/PX19KS9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgPy5tYXAoKGFuY2hvcjogc3RyaW5nKSA9PiBhbmNob3Iuc3BsaXQoJ3wnKS5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8uZmxhdCgpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8oPzw9e3tcXHMqPyg/OltWdl0oPzppc2libGUgYW5jaG9ycz98aXNhbmN8QW5jaHxhbmNob3J8aXNpYmxlYW5jaG9yfGEpfFtBYV0oPzpuY2hvcmR8Y2hvcmVkfG5jaG9yXFwrKXxbVHRdZXh0IGFuY2hvcilcXHMqP1xcfCkuKz8oPz0oPzwhIXw9KX19KS9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgPy5tYXAoKGFuY2hvcjogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ3wnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBwYXJ0LnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocGFydCkgPT4gIS9edGV4dFxccyo/PS8udGVzdChwYXJ0KSksXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA/LmZsYXQoKSA/PyBbXSksXG4gICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnQubWF0Y2goLyg/PD1pZD0pXCI/Lis/KD89XCJ8PnxcXHwpL2cpPy5tYXAoKGFuY2hvcjogc3RyaW5nKSA9PiBhbmNob3IudHJpbSgpKSA/PyBbXSksXG4gICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnQubWF0Y2goL0VwaXNvZGVOdW1iZXIgKz0gK1xcZCsvZyk/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGBlcCR7YW5jaG9yLnNwbGl0KCc9JylbMV0udHJpbSgpfWApID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBbXSksXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9ycy5pbmNsdWRlcyhkZXN0aW5hdGlvbi5zcGxpdCgnIycpWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIHRhZ2dlZCBhcyBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiwgYnV0IGl0IGlzIGFjdHVhbGx5IGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yIScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gYW5jaG9yJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZW1vdmUnLCB0YWc6ICdSIHRvIHNlY3Rpb24nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhZ3MuaW5jbHVkZXMoJ1IgdG8gYW5jaG9yJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiBmcm9tIGFuY2hvcn19PC9jb2RlPiEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gYW5jaG9yJyB9XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgYSByZWRpcmVjdCB0byA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybChkZXN0aW5hdGlvbil9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHtkZXN0aW5hdGlvbn08L2E+LCBidXQgdGhhdCBzZWN0aW9uIG9yIGFuY2hvciBkb2VzIG5vdCBleGlzdCFgLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnY2hhbmdlLXRhcmdldCcsIHRhcmdldDogZGVzdGluYXRpb24uc3BsaXQoJyMnKVswXSB9XSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBJbXByb3Blcmx5IHRhZ2dlZCBhcyByZWRpcmVjdCB0byBzZWN0aW9uL2FuY2hvciAqL1xuICAgICAgICBpZiAoZGVzdGluYXRpb24uc3BsaXQoJyMnKS5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBbJ1IgdG8gc2VjdGlvbicsICdSIHRvIGFuY2hvciddKVxuICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKHRhZykpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBub3QgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24vYW5jaG9yLCBidXQgaXQgaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RhZ319fTwvY29kZT4hYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZyB9XSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgPSAhIShcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uRGF0YSEucXVlcnkucGFnZXNbMF0ucGFnZXByb3BzICYmICdkaXNhbWJpZ3VhdGlvbicgaW4gZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5wYWdlcHJvcHNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0SXNTdXJuYW1lTGlzdCA9ICEhZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5jYXRlZ29yaWVzPy5zb21lKFxuICAgICAgICAgICAgKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50aXRsZSA9PT0gJ0NhdGVnb3J5OlN1cm5hbWVzJyxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3MgPSBbJ1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZScsICdSIGZyb20gaW5jb21wbGV0ZSBkaXNhbWJpZ3VhdGlvbiddO1xuICAgICAgICBjb25zdCB0b1N1cm5hbWVMaXN0VGFncyA9IFsnUiBmcm9tIGFtYmlndW91cyBzb3J0IG5hbWUnLCAnUiBmcm9tIGFtYmlndW91cyB0ZXJtJ107XG5cbiAgICAgICAgY29uc3QgdGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlID0gdG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzLnNvbWUoKHRlbXBsYXRlKSA9PiB0YWdzLmluY2x1ZGVzKHRlbXBsYXRlKSk7XG4gICAgICAgIGNvbnN0IHRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0ID0gdG9TdXJuYW1lTGlzdFRhZ3Muc29tZSgodGVtcGxhdGUpID0+IHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKTtcblxuICAgICAgICAvKiBSZWRpcmVjdCB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlIHdpdGhvdXQgdGVtcGxhdGUgKi9cbiAgICAgICAgaWYgKHRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlICYmICF0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgJiYgIXRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0KVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgZGlzYW1iaWd1YXRpb24gcGFnZSwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCBhIGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5wYWdlcHJvcHMgJiYgIXRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlKSB7XG4gICAgICAgICAgICAvKiBJbXByb3Blcmx5IHRhZ2dlZCBhcyByZWRpcmVjdCB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlICovXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKCF0YXJnZXRJc1N1cm5hbWVMaXN0ICYmICh0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgfHwgdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpKSB8fFxuICAgICAgICAgICAgICAgICh0YXJnZXRJc1N1cm5hbWVMaXN0ICYmIHRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBub3QgYSByZWRpcmVjdCB0byBhIGRpc2FtYmlndWF0aW9uIHBhZ2UsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCBhIGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogWy4uLnRvRGlzYW1iaWd1YXRpb25QYWdlVGFncywgLi4udG9TdXJuYW1lTGlzdFRhZ3NdLm1hcCgodGFnKSA9PiAoeyB0eXBlOiAncmVtb3ZlJywgdGFnIH0pKSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogUmVkaXJlY3QgdG8gc3VybmFtZSBsaXN0IHdpdGhvdXQgdGVtcGxhdGUgKi9cbiAgICAgICAgICAgIGlmICh0YXJnZXRJc1N1cm5hbWVMaXN0ICYmICF0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdClcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgc3VybmFtZSBsaXN0LCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIGEgY29ycmVjdCBkaXNhbWJpZ3VhdGlvbiBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSEnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoge3tSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2V9fSB3aXRob3V0IFwiIChkaXNhbWJpZ3VhdGlvbilcIiBhdCBlbmQgb2YgdGl0bGUgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgJiZcbiAgICAgICAgICAgIHRhZ3MuaW5jbHVkZXMoJ1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZScpICYmXG4gICAgICAgICAgICAhdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0TWFpblRleHQoKS5lbmRzV2l0aCgnIChkaXNhbWJpZ3VhdGlvbiknKVxuICAgICAgICApXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgJ2lzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlfX08L2NvZGU+LCBidXQgdGhpcyB0aXRsZSBkb2VzIG5vdCBlbmQgd2l0aCBcIiAoZGlzYW1iaWd1YXRpb24pXCIuIFVzZSA8Y29kZT57e1IgZnJvbSBhbWJpZ3VvdXMgdGVybX19PC9jb2RlPiBvciBhIHNpbWlsYXIgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgaW5zdGVhZCEnLFxuICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZScgfV0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKiBUYWdnZWQgd2l0aCBhIHByb3RlY3Rpb24gdGVtcGxhdGUgKi9cbiAgICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiBbJ1IgcHJvdGVjdGVkJywgJ1Igc2VtaS1wcm90ZWN0ZWQnLCAnUiBleHRlbmRlZC1wcm90ZWN0ZWQnLCAnUiB0ZW1wbGF0ZS1wcm90ZWN0ZWQnLCAnUiBmdWxseSBwcm90ZWN0ZWQnXSlcbiAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKHRlbXBsYXRlKSlcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyB0YWdnZWQgd2l0aCB1bm5lY2Vzc2FyaWx5IHRhZ2dlZCB3aXRoIDxjb2RlPnt7JHt0ZW1wbGF0ZX19fTwvY29kZT4gd2hpY2ggd2lsbCBiZSBkdXBsaWNhdGVkIGJ5IHRoZSByZWRpcmVjdCBjYXRlZ29yeSBzaGVsbCFgLFxuICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdyZW1vdmUnLCB0YWc6IHRlbXBsYXRlIH1dLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8qIExpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0gd2l0aG91dCBiZWluZyB0YWdnZWQgd2l0aCB7e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX0gKi9cbiAgICAgICAgaWYgKG13LmNvbmZpZy5nZXQoJ3dnV2lraWJhc2VJdGVtSWQnKSAmJiAhdGFncy5pbmNsdWRlcygnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nKSlcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcImlzIGxpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0gYnV0IGl0IGlzbid0IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fTwvY29kZT4hXCIsXG4gICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nIH1dLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLyogVGFnZ2VkIHdpdGgge3tSIHdpdGggV2lraWRhdGEgaXRlbX19IHdpdGhvdXQgYmVpbmcgbGlua2VkIHRvIGFuIGl0ZW0gKi9cbiAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXMoJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJykgJiYgIW13LmNvbmZpZy5nZXQoJ3dnV2lraWJhc2VJdGVtSWQnKSlcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHdpdGggV2lraWRhdGEgaXRlbX19PC9jb2RlPiBidXQgaXQgaXMgbm90IGFjdHVhbGx5IGxpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0hJyxcbiAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdyZW1vdmUnLCB0YWc6ICdSIHdpdGggV2lraWRhdGEgaXRlbScgfV0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKiBNaXNzaW5nIHRhZyByZXF1aXJlZCBwYXJhbWV0ZXIgKi9cbiAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgICAgICAgY29uc3QgdGFnRGF0YSA9IHRoaXMucmVkaXJlY3RUZW1wbGF0ZXNbdGFnXTtcbiAgICAgICAgICAgIGlmICghdGFnRGF0YSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIHBhcmFtZXRlckRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ0RhdGEucGFyYW1ldGVycykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFBhcmFtZXRlciA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mb1xuICAgICAgICAgICAgICAgICAgICAuZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpXG4gICAgICAgICAgICAgICAgICAgID8ucGFyYW1ldGVycy5maW5kKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgLi4ucGFyYW1ldGVyLmFsaWFzZXNdLmluY2x1ZGVzKHBhcmFtZXRlck5hbWUpKTtcblxuICAgICAgICAgICAgICAgIGlmICghZm91bmRQYXJhbWV0ZXIpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlckRhdGEucmVxdWlyZWQgJiYgIWZvdW5kUGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7JHt0YWd9fX08L2NvZGU+IGJ1dCBpdCBpcyBtaXNzaW5nIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXIgPGNvZGU+JHtwYXJhbWV0ZXJOYW1lfTwvY29kZT4hYCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTeW5jaW5nIHRhbGsgcGFnZSBidXQgdGFsayBwYWdlIGV4aXN0cyBhbmQgaXNuJ3QgYSByZWRpcmVjdCAqL1xuICAgICAgICBpZiAodGhpcy5zeW5jVGFsa0NoZWNrYm94Py5pc1NlbGVjdGVkKCkgJiYgIXRoaXMudGFsa0RhdGEhLnF1ZXJ5LnBhZ2VzWzBdLm1pc3NpbmcgJiYgIXRoaXMudGFsa0RhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0KVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnZXhpc3RzLCBidXQgaXMgbm90IGEgcmVkaXJlY3QhJyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB0aGUgZXZlbnQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIFwiU3VibWl0XCIgYnV0dG9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlU3VibWl0QnV0dG9uQ2xpY2soKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzVG9EaXNhYmxlID0gW1xuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LFxuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QsXG4gICAgICAgICAgICAuLi50aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmxhdE1hcCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+IHBhcmFtZXRlci5lZGl0b3IpKSxcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dCxcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdCxcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0LFxuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24sXG4gICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbixcbiAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveCxcbiAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3gsXG4gICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50c1RvRGlzYWJsZSkgKGVsZW1lbnQgYXMgT08udWkuV2lkZ2V0KS5zZXREaXNhYmxlZCh0cnVlKTtcblxuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnQ2hlY2tpbmcgdGFyZ2V0IHZhbGlkaXR5Li4uJyk7XG5cbiAgICAgICAgbGV0IGVycm9yczogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLnZhbGlkYXRlU3VibWlzc2lvbj4+ID0gW107XG4gICAgICAgIGlmICh0aGlzLm5lZWRzQ2hlY2spIGVycm9ycyA9IGF3YWl0IHRoaXMudmFsaWRhdGVTdWJtaXNzaW9uKCk7XG4gICAgICAgIGVsc2UgdGhpcy5wYXJzZWREZXN0aW5hdGlvbiA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpKTtcblxuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmVkaXJlY3QtaGVscGVyLXdhcm5pbmcnKSkgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyB0aXRsZSwgbWVzc2FnZSwgYXV0b0ZpeGVzIH0gb2YgZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgIGAke3RpdGxlID8gYDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKHRpdGxlKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke3RpdGxlfTwvYT5gIDogJ1RoaXMgcGFnZSd9ICR7bWVzc2FnZX0gQ2xpY2sgYWdhaW4gd2l0aG91dCBtYWtpbmcgY2hhbmdlcyB0byBzdWJtaXQgYW55d2F5LmAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1oZWxwZXItd2FybmluZyddLFxuICAgICAgICAgICAgICAgICAgICBpbmxpbmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGF1dG9GaXhlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvRml4QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1BlcmZvcm0gYXV0by1maXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaGVscGVyLWF1dG9maXgtYnV0dG9uJ10sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhdXRvRml4QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG9GaXggb2YgYXV0b0ZpeGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9GaXgudHlwZSA9PT0gJ2FkZCcgJiYgIXRhZ3MuaW5jbHVkZXMoYXV0b0ZpeC50YWcpKSB0aGlzLnRhZ1NlbGVjdC5hZGRUYWcoYXV0b0ZpeC50YWcsIGF1dG9GaXgudGFnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRvRml4LnR5cGUgPT09ICdyZW1vdmUnICYmIHRhZ3MuaW5jbHVkZXMoYXV0b0ZpeC50YWcpKSB0aGlzLnRhZ1NlbGVjdC5yZW1vdmVUYWdCeURhdGEoYXV0b0ZpeC50YWcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9GaXgudHlwZSA9PT0gJ2NoYW5nZS10YXJnZXQnKSB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUoYXV0b0ZpeC50YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXS5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdsaW5lLXRocm91Z2ggMnB4IGJsYWNrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhCdXR0b24uJGVsZW1lbnRbMF0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdNZXNzYWdlLiRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy5vby11aS1sYWJlbEVsZW1lbnQtbGFiZWwnKSEuYXBwZW5kKGF1dG9GaXhCdXR0b24uJGVsZW1lbnRbMF0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdLmFwcGVuZCh3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50c1RvRGlzYWJsZSkgKGVsZW1lbnQgYXMgT08udWkuV2lkZ2V0KS5zZXREaXNhYmxlZChmYWxzZSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQgYW55d2F5Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogRWRpdC9jcmVhdGUgcmVkaXJlY3QgKi9cbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoYCR7dGhpcy5leGlzdHMgPyAnRWRpdGluZycgOiAnQ3JlYXRpbmcnfSByZWRpcmVjdC4uLmApO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBzdW1tYXJ5ID1cbiAgICAgICAgICAgICh0aGlzLnN1bW1hcnlJbnB1dC5nZXRWYWx1ZSgpIHx8ICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlcikgKyB0aGlzLnNjcmlwdEFkdmVydDtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZSh0aGlzLnBhZ2VUaXRsZSwgb3V0cHV0LCBzdW1tYXJ5KTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybjtcblxuICAgICAgICBtdy5ub3RpZnkoYFJlZGlyZWN0ICR7dGhpcy5leGlzdHMgPyAnZWRpdGVkJyA6ICdjcmVhdGVkJ30gc3VjY2Vzc2Z1bGx5IWAsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuXG4gICAgICAgIC8qIFN5bmMgdGFsayBwYWdlIGNoZWNrYm94IGhhbmRsZXIgKi9cbiAgICAgICAgaWYgKHRoaXMuc3luY1RhbGtDaGVja2JveD8uaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnRWRpdGluZyB0YWxrIHBhZ2UuLi4nKTtcblxuICAgICAgICAgICAgY29uc3QgZnJvbU1vdmUgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKCdSIGZyb20gbW92ZScpO1xuXG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZERlc3RpbmF0aW9uIS5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICBmcm9tTW92ZSA/IFsnUiBmcm9tIG1vdmUnXSA6IFtdLFxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCB0YWxrUmVzdWx0ID0gYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgICAgICdTeW5jaW5nIHJlZGlyZWN0IGZyb20gbWFpbiBwYWdlJyArIHRoaXMuc2NyaXB0QWR2ZXJ0LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghdGFsa1Jlc3VsdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBtdy5ub3RpZnkoJ1RhbGsgcGFnZSBzeW5jZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogUGF0cm9sIGNoZWNrYm94IGhhbmRsZXIgKi9cbiAgICAgICAgaWYgKHRoaXMucGF0cm9sQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1BhdHJvbGxpbmcgcmVkaXJlY3QuLi4nKTtcblxuICAgICAgICAgICAgY29uc3QgcGF0cm9sTGluazogSFRNTEFuY2hvckVsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhdHJvbGxpbmsgYScpO1xuICAgICAgICAgICAgY29uc3QgbWFya1Jldmlld2VkQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oJyNtd2UtcHQtbWFyay1hcy1yZXZpZXdlZC1idXR0b24nKTtcblxuICAgICAgICAgICAgaWYgKHBhdHJvbExpbmspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRyb2xSZXN1bHQgPSBhd2FpdCB0aGlzLmFwaVxuICAgICAgICAgICAgICAgICAgICAucG9zdFdpdGhUb2tlbigncGF0cm9sJywgeyBhY3Rpb246ICdwYXRyb2wnLCByY2lkOiBuZXcgVVJMKHBhdHJvbExpbmsuaHJlZikuc2VhcmNoUGFyYW1zLmdldCgncmNpZCcpISB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciBwYXRyb2xsaW5nICR7dGhpcy5wYWdlVGl0bGV9IHZpYSBBUEk6ICR7ZXJyb3JJbmZvPy5lcnJvci5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Vycm9yJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocGF0cm9sUmVzdWx0KSBtdy5ub3RpZnkoJ1JlZGlyZWN0IHBhdHJvbGxlZCBzdWNjZXNzZnVsbHkhJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1hcmtSZXZpZXdlZEJ1dHRvbikge1xuICAgICAgICAgICAgICAgIG1hcmtSZXZpZXdlZEJ1dHRvbi5jbGljaygpO1xuICAgICAgICAgICAgICAgIG13Lm5vdGlmeSgnUmVkaXJlY3QgcGF0cm9sbGVkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBtdy5ub3RpZnkoJ1BhZ2UgY3VyYXRpb24gdG9vbGJhciBub3QgZm91bmQsIHJlZGlyZWN0IGNhbm5vdCBiZSBwYXRyb2xsZWQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ0NvbXBsZXRlLCByZWxvYWRpbmcuLi4nKTtcblxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IG13LnV0aWwuZ2V0VXJsKHRoaXMucGFnZVRpdGxlLCB7IHJlZGlyZWN0OiAnbm8nIH0pO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVGFrZXMgcHJvdmlkZWQgdmFsdWVzIHRvIGNyZWF0ZSB0aGUgcGFnZSBvdXRwdXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVPdXRwdXQoXG4gICAgICAgIHRhcmdldDogc3RyaW5nLFxuICAgICAgICB0YWdzOiBzdHJpbmdbXSxcbiAgICAgICAgc3RyYXlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIGRlZmF1bHRTb3J0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIGNhdGVnb3JpZXM6IHN0cmluZ1tdLFxuICAgICkge1xuICAgICAgICBjb25zdCBwYXJzZWRUYXJnZXQgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh0YXJnZXQpO1xuXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFRpdGxlID0gcGFyc2VkVGFyZ2V0XG4gICAgICAgICAgICA/IGAke3BhcnNlZFRhcmdldC5nZXROYW1lc3BhY2VJZCgpID09PSAxNCA/ICc6JyA6ICcnfSR7cGFyc2VkVGFyZ2V0LmdldFByZWZpeGVkVGV4dCgpfSR7cGFyc2VkVGFyZ2V0LmdldEZyYWdtZW50KCkgPyBgIyR7cGFyc2VkVGFyZ2V0LmdldEZyYWdtZW50KCl9YCA6ICcnfWBcbiAgICAgICAgICAgIDogdGFyZ2V0LnRyaW0oKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZFxuICAgICAgICAgICAgICAgIC5nZXRNYWluVGV4dCgpXG4gICAgICAgICAgICAgICAgLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKC9bXFx1MDMwMC1cXHUwMzZGXS9nLCAnJykgPT09XG4gICAgICAgICAgICBkZWZhdWx0U29ydFxuICAgICAgICAgICAgICAgID8udG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIC5ub3JtYWxpemUoJ05GRCcpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoL1tcXHUwMzAwLVxcdTAzNkZdL2csICcnKVxuICAgICAgICApXG4gICAgICAgICAgICBkZWZhdWx0U29ydCA9IHVuZGVmaW5lZDsgLy8gQ2hlY2sgaWYgdGl0bGVzIG5vcm1hbGl6ZSB0byB0aGUgc2FtZSB0ZXh0LCBhbmQgcmVtb3ZlcyB0aGUgREVGQVVMVFNPUlQgaWYgc29cblxuICAgICAgICBjb25zdCB0YWdzV2l0aEFyZ3VtZW50cyA9IHRhZ3MubWFwKCh0YWcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kQXJndW1lbnRFZGl0b3IgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpO1xuICAgICAgICAgICAgaWYgKCFmb3VuZEFyZ3VtZW50RWRpdG9yKSByZXR1cm4gYHt7JHt0YWd9fX1gO1xuXG4gICAgICAgICAgICBjb25zdCBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXggPSBmb3VuZEFyZ3VtZW50RWRpdG9yLnBhcmFtZXRlcnMuZmluZExhc3RJbmRleChcbiAgICAgICAgICAgICAgICAocGFyYW1ldGVyLCBpbmRleCkgPT4gcGFyYW1ldGVyLm5hbWUgPT09IChpbmRleCArIDEpLnRvU3RyaW5nKCkgJiYgcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZEFyZ3VtZW50cyA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgIC5tYXAoKHBhcmFtZXRlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlICYmIGluZGV4ID4gbGFzdE51bWJlclBhcmFtZXRlckluZGV4KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYHwke3BhcmFtZXRlci5uYW1lID09PSAoaW5kZXggKyAxKS50b1N0cmluZygpID8gJycgOiBgJHtwYXJhbWV0ZXIubmFtZX09YH0ke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgICAgICByZXR1cm4gYHt7JHt0YWd9JHttYXBwZWRBcmd1bWVudHN9fX1gO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgYCNSRURJUkVDVCBbWyR7Zm9ybWF0dGVkVGl0bGV9XV1cXG5gLFxuICAgICAgICAgICAgdGFncy5sZW5ndGggPiAwID8gYHt7UmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGx8XFxuJHt0YWdzV2l0aEFyZ3VtZW50cy5qb2luKCdcXG4nKX1cXG59fVxcbmAgOiBudWxsLFxuICAgICAgICAgICAgc3RyYXlUZXh0ID8gc3RyYXlUZXh0ICsgJ1xcbicgOiBudWxsLFxuICAgICAgICAgICAgZGVmYXVsdFNvcnQgPyBge3tERUZBVUxUU09SVDoke2RlZmF1bHRTb3J0LnRyaW0oKX19fWAgOiBudWxsLFxuICAgICAgICAgICAgY2F0ZWdvcmllcy5sZW5ndGggPiAwID8gY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBgW1tDYXRlZ29yeToke2NhdGVnb3J5fV1dYCkuam9pbignXFxuJykgOiBudWxsLFxuICAgICAgICBdXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyB0aGUgY29udGVudCBvZiBhIGdpdmVuIHBhZ2UuXG4gICAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSB0byBmZXRjaC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGdldFBhZ2VDb250ZW50KHRpdGxlOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGl0bGUsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgKS5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFZGl0cyBvciBjcmVhdGVzIGEgcGFnZSB3aXRoIGdpdmVuIHRleHQuXG4gICAgICogQHBhcmFtIHRpdGxlIFRoZSBwYWdlIHRpdGxlLlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBwYWdlIHRleHQuXG4gICAgICogQHBhcmFtIHN1bW1hcnkgVGhlIGVkaXQgc3VtbWFyeS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGVkaXRPckNyZWF0ZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHN1bW1hcnk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlcbiAgICAgICAgICAgIC5lZGl0KHRpdGxlLCAoKSA9PiAoeyB0ZXh0LCBzdW1tYXJ5IH0pKVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb2RlID09PSAnbm9jcmVhdGUtbWlzc2luZycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaS5jcmVhdGUodGl0bGUsIHsgc3VtbWFyeSB9LCB0ZXh0KS5jYXRjaCgoZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9ySW5mbzogTWVkaWFXaWtpRGF0YUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYEVycm9yIGNyZWF0aW5nICR7dGl0bGV9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgRXJyb3IgZWRpdGluZyBvciBjcmVhdGluZyAke3RpdGxlfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUluZm9QYXJhbXMsIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlSW5mb1Jlc3VsdCwgUGFnZVJldmlzaW9uc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGlyZWN0VGVtcGxhdGVEYXRhIH0gZnJvbSAnLi9yZWRpcmVjdC1oZWxwZXItZGlhbG9nJztcblxuY29uc3QgZGVwZW5kZW5jaWVzID0gW1xuICAgICdtZWRpYXdpa2kudXRpbCcsXG4gICAgJ29vanMtdWktY29yZScsXG4gICAgJ29vanMtdWktd2lkZ2V0cycsXG4gICAgJ29vanMtdWktd2luZG93cycsXG4gICAgJ29vanMtdWkuc3R5bGVzLmljb25zLWNvbnRlbnQnLFxuICAgICdvb2pzLXVpLnN0eWxlcy5pY29ucy1lZGl0aW5nLWNvcmUnLFxuXTtcblxubXcubG9hZGVyLnVzaW5nKGRlcGVuZGVuY2llcywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdDogUmVkaXJlY3RIZWxwZXJEaWFsb2cgfSA9IGF3YWl0IGltcG9ydCgnLi9yZWRpcmVjdC1oZWxwZXItZGlhbG9nJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhhbmRsZXMgdGhlIGVudGlyZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSByZWRpcmVjdC1oZWxwZXIgc2NyaXB0LlxuICAgICAqL1xuICAgIGNsYXNzIFJlZGlyZWN0SGVscGVyIHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICAgICAgcHJpdmF0ZSByZWRpcmVjdFRlbXBsYXRlcyE6IFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuICAgICAgICBwcml2YXRlIGNvbnRlbnRUZXh0ITogSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlITogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZCE6IG13LlRpdGxlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSdW5zIHRoZSByZWRpcmVjdCBoZWxwZXIuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBydW4oKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFzc2VzUHJlQ2hlY2tzKCkpIHJldHVybjtcblxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyA9IGF3YWl0IHRoaXMuZmV0Y2hSZWRpcmVjdFRlbXBsYXRlcygpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oJyNtdy1jb250ZW50LXRleHQnKSE7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFRleHQpIHJldHVybiBtdy5ub3RpZnkoJ3JlZGlyZWN0LWhlbHBlcjogRmFpbGVkIHRvIGZpbmQgY29udGVudCB0ZXh0IGVsZW1lbnQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZSA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh0aGlzLnBhZ2VUaXRsZSkhO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBhZ2VUaXRsZVBhcnNlZCkgcmV0dXJuIG13Lm5vdGlmeSgncmVkaXJlY3QtaGVscGVyOiBGYWlsZWQgdG8gcGFyc2UgcGFnZSB0aXRsZSEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWdlQW5kTG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGUgcGFnZSBwYXNzZXMgcHJlIGNoZWNrcy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgcGFzc2VzUHJlQ2hlY2tzKCkge1xuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID49IDAsIC8vIElzIG5vdCB2aXJ0dWFsIG5hbWVzcGFjZVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnSXNQcm9iYWJseUVkaXRhYmxlJyksIC8vIFBhZ2UgaXMgZWRpdGFibGVcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z0lzQXJ0aWNsZScpLCAvLyBWaWV3aW5nIHRoZSBjb250ZW50IG9mIGEgcGFnZVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnQWN0aW9uJykgPT09ICd2aWV3JywgLy8gVmlld2luZyB0aGUgcGFnZSAobm90IGVkaXRpbmcpXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dSZXZpc2lvbklkJykgPT09IG13LmNvbmZpZy5nZXQoJ3dnQ3VyUmV2aXNpb25JZCcpLCAvLyBWaWV3aW5nIHRoZSBjdXJyZW50IHJldmlzaW9uXG4gICAgICAgICAgICAgICAgIW13LmNvbmZpZy5nZXQoJ3dnRGlmZk9sZElkJyksIC8vIE5vdCB2aWV3aW5nIGEgZGlmZlxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbnMuZXZlcnkoQm9vbGVhbik7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2hlcyB0aGUgcmVkaXJlY3QgdGVtcGxhdGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlZGlyZWN0VGVtcGxhdGVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZXM6ICdVc2VyOkVlaml0NDMvc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIuanNvbicsXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICAgICAgICAgICkucXVlcnkucGFnZXM/LlswXT8ucmV2aXNpb25zPy5bMF0/LnNsb3RzPy5tYWluPy5jb250ZW50IHx8ICd7fScsXG4gICAgICAgICAgICApIGFzIFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBhIHBhZ2UncyBzdGF0dXMgYW5kIGxvYWRzIHRoZSBoZWxwZXIgYXBwcm9wcmlhdGVseS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgY2hlY2tQYWdlQW5kTG9hZCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VJbmZvID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuXG4gICAgICAgICAgICBjb25zdCBkaWFsb2dJbmZvID0ge1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VGVtcGxhdGVzOiB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiB0aGlzLmNvbnRlbnRUZXh0LFxuICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICAgICAgcGFnZVRpdGxlUGFyc2VkOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChwYWdlSW5mby5xdWVyeS5wYWdlc1swXS5taXNzaW5nKSB7XG4gICAgICAgICAgICAgICAgbXcudXRpbC5hZGRDU1MoYFxuI2NyZWF0ZS1yZWRpcmVjdC1idXR0b24ge1xuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG59YCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBidXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdjcmVhdGUtcmVkaXJlY3QtYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDcmVhdGUgcmVkaXJlY3QnLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiAnYXJ0aWNsZVJlZGlyZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBidXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBidXR0b24uJGVsZW1lbnRbMF0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCBmYWxzZSkubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50VGV4dC5wcmVwZW5kKGJ1dHRvbi4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhZ2VJbmZvLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0KSBuZXcgUmVkaXJlY3RIZWxwZXJEaWFsb2coZGlhbG9nSW5mbywgdHJ1ZSkubG9hZCgpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9ydGxldExpbmsgPSBtdy51dGlsLmFkZFBvcnRsZXRMaW5rKFxuICAgICAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCdza2luJykgPT09ICdtaW5lcnZhJyA/ICdwLXRiJyA6ICdwLWNhY3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgJyMnLFxuICAgICAgICAgICAgICAgICAgICAnUmVkaXJlY3QgcGFnZScsXG4gICAgICAgICAgICAgICAgICAgICdyZWRpcmVjdC1oZWxwZXInLFxuICAgICAgICAgICAgICAgICkhO1xuICAgICAgICAgICAgICAgIHBvcnRsZXRMaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlKS5sb2FkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcG9ydGxldExpbmsucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXcgUmVkaXJlY3RIZWxwZXIoKS5ydW4oKTtcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O2dKQUFBLElBTXFCQSxFQU5yQkMsRUFBQUMsRUFBQSxrQkFNcUJGLEVBQXJCLGNBQWlELEdBQUcsR0FBRyxlQUFnQixDQUUzRCxJQUFNLElBQUksR0FBRyxJQUVyQixZQUFZRyxFQUE2QixDQUNyQyxNQUFNQSxDQUFNLEVBRVosR0FBRyxHQUFHLE1BQU0sY0FBYyxLQUFLLEtBQThDQSxDQUFNLENBQ3ZGLENBRUEsaUJBQW1CLElB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QU8sa0JBQ1AsS0FBTSxrQkFDTixNQUFPLENBQUMsYUFBYSxDQUN6QixDQUFDLEVBQ0RBLEVBQU8sR0FBRyxRQUFTLElBQU0sQ0FDckJBLEVBQU8sU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUMxQixJQUFJSixFQUFxQkcsRUFBWSxFQUFLLEVBQUUsS0FBSyxDQUNyRCxDQUFDLEVBRUQsS0FBSyxZQUFZLFFBQVFDLEVBQU8sU0FBUyxDQUFDLENBQUMsQ0FDL0MsU0FBV0YsRUFBUyxNQUFNLE1BQU0sQ0FBQyxFQUFFLFNBQVUsSUFBSUYsRUFBcUJHLEVBQVksRUFBSSxFQUFFLEtBQUssTUFDeEYsQ0FDRCxJQUFNRSxFQUFjLEdBQUcsS0FBSyxlQUN4QixHQUFHLE9BQU8sSUFBSSxNQUFNLElBQU0sVUFBWSxPQUFTLGFBQy9DLElBQ0EsZ0JBQ0EsaUJBQ0osRUFDQUEsRUFBWSxpQkFBaUIsUUFBVUMsR0FBVSxDQUM3Q0EsRUFBTSxlQUFlLEVBRXJCLElBQUlOLEVBQXFCRyxFQUFZLEVBQUssRUFBRSxLQUFLLEVBRWpELE9BQU8sU0FBUyxDQUFFLElBQUssRUFBRyxTQUFVLFFBQVMsQ0FBQyxFQUU5Q0UsRUFBWSxPQUFPLENBQ3ZCLENBQUMsQ0FDTCxDQUNKLENBQ0osQ0FFQSxJQUFJSixFQUFlLEVBQUUsSUFBSSxDQUM3QixDQUFDIiwKICAibmFtZXMiOiBbIkNhdGVnb3J5SW5wdXRXaWRnZXQiLCAiaW5pdF9jYXRlZ29yeV9pbnB1dF93aWRnZXQiLCAiX19lc21NaW4iLCAiY29uZmlnIiwgInZhbHVlIiwgImRlZmVycmVkIiwgInBhcnNlZFRpdGxlIiwgInJlc3VsdCIsICJwYWdlcyIsICJwYWdlIiwgImNhdGVnb3J5IiwgInRpdGxlV2l0aG91dE5hbWVzcGFjZSIsICJyZXNwb25zZSIsICJkYXRhIiwgImxhYmVsIiwgIkNoYW5nZXNEaWFsb2ciLCAiaW5pdF9jaGFuZ2VzX2RpYWxvZyIsICJfX2VzbU1pbiIsICJfQ2hhbmdlc0RpYWxvZyIsICJjb25maWciLCAib2xkVGV4dCIsICJuZXdUZXh0IiwgInJlc3VsdCIsICJjb21wYXJpc29uIiwgIm5vQ2hhbmdlc0VsZW1lbnQiLCAicGFuZWxMYXlvdXQiLCAiYWN0aW9uIiwgIk91dHB1dFByZXZpZXdEaWFsb2ciLCAiaW5pdF9vdXRwdXRfcHJldmlld19kaWFsb2ciLCAiX19lc21NaW4iLCAiX091dHB1dFByZXZpZXdEaWFsb2ciLCAiY29uZmlnIiwgInBhZ2VUaXRsZVBhcnNlZCIsICJyZXN1bHQiLCAidGFnc0NvbnRlbnQiLCAiY2F0ZWdvcmllc0NvbnRlbnQiLCAicGFuZWxMYXlvdXQiLCAiYWN0aW9uIiwgIlJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQiLCAiaW5pdF9yZWRpcmVjdF90YXJnZXRfaW5wdXRfd2lkZ2V0IiwgIl9fZXNtTWluIiwgImNvbmZpZyIsICJwYWdlVGl0bGVQYXJzZWQiLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAidGl0bGUiLCAicmVzdWx0IiwgIm1hdGNoZWRTZWN0aW9ucyIsICJzZWN0aW9uIiwgInBhcnNlZFRpdGxlIiwgInBhZ2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJyZWRpcmVjdF9oZWxwZXJfZGlhbG9nX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiUmVkaXJlY3RIZWxwZXJEaWFsb2ciLCAiaW5pdF9yZWRpcmVjdF9oZWxwZXJfZGlhbG9nIiwgIl9fZXNtTWluIiwgImluaXRfY2F0ZWdvcnlfaW5wdXRfd2lkZ2V0IiwgImluaXRfY2hhbmdlc19kaWFsb2ciLCAiaW5pdF9vdXRwdXRfcHJldmlld19kaWFsb2ciLCAiaW5pdF9yZWRpcmVjdF90YXJnZXRfaW5wdXRfd2lkZ2V0IiwgInJlZGlyZWN0VGVtcGxhdGVzIiwgImNvbnRlbnRUZXh0IiwgInBhZ2VUaXRsZSIsICJwYWdlVGl0bGVQYXJzZWQiLCAiZXhpc3RzIiwgIm1haW5QYWdlQ29udGVudCIsICJ0YXJnZXQiLCAidGFnT3JSZWRpcmVjdCIsICJSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0IiwgInZhbHVlIiwgInRhZyIsICJyZWRpcmVjdCIsICJsYWJlbCIsICJzb3J0ZWRUYWdzIiwgImEiLCAiYiIsICJlZGl0b3JJbmZvIiwgInNob3duVGVtcGxhdGVFZGl0b3JzIiwgInN1bW1hcnlFbGVtZW50IiwgIm5vVGVtcGxhdGVzTWVzc2FnZSIsICJ0ZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVEYXRhIiwgInBhcmFtZXRlcnMiLCAiZGV0YWlscyIsICJzdW1tYXJ5IiwgImVsZW1lbnREYXRhIiwgInBhcmFtZXRlck5hbWUiLCAicGFyYW1ldGVyRGF0YSIsICJpbnB1dCIsICJpbnB1dExheW91dCIsICJuYW1lIiwgImdlbmVyYXRpb25hbFN1ZmZpeCIsICJsYXN0TmFtZSIsICJvdGhlck5hbWVzIiwgIm5ld05hbWUiLCAibGVhZGluZ0FydGljbGUiLCAiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJwYWdlcyIsICJwYWdlIiwgIndpbmRvd01hbmFnZXIiLCAidGVtcGxhdGVQcmV2aWV3RGlhbG9nIiwgIk91dHB1dFByZXZpZXdEaWFsb2ciLCAic2hvd0NoYW5nZXNEaWFsb2ciLCAiQ2hhbmdlc0RpYWxvZyIsICJwYWdlVHJpYWdlTWFya0J1dHRvbiIsICJwYXRyb2xSZXNwb25zZSIsICJyZWRpcmVjdFZhbHVlIiwgIm9sZFRhcmdldCIsICJ0YXJnZXRDaGFuZ2VkIiwgInRhZ3NDaGFuZ2VkIiwgInRhZ0FyZ3VtZW50c0NoYW5nZWQiLCAidGFnc1dpdGhQYXJhbWV0ZXJzIiwgImRhdGEiLCAib2xkVGFnRGF0YSIsICJmb3VuZFRhZ0VkaXRvckRhdGEiLCAidGVtcGxhdGUiLCAicGFyYW1ldGVyIiwgIm9sZEFyZ3VtZW50IiwgImFyZ3VtZW50IiwgIm5ld0FyZ3VtZW50IiwgImRlZmF1bHRTb3J0Q2hhbmdlZCIsICJjYXRlZ29yaWVzQ2hhbmdlZCIsICJjYXRlZ29yeSIsICJjaGFuZ2VzIiwgInRhZ0RhdGEiLCAib3JpZ2luYWxSZWRpcmVjdFRhZ3MiLCAibWF0Y2giLCAibmV3VGFnIiwgImZvcm1hdHRlZEFyZ3VtZW50cyIsICJpbmRleCIsICJmb3VuZFRlbXBsYXRlRWRpdG9yIiwgImZvdW5kUGFyYW1ldGVyRWRpdG9yIiwgImVycm9ycyIsICJkZXN0aW5hdGlvbiIsICJ0YWdzIiwgImRlc3RpbmF0aW9uRGF0YSIsICJlcnJvckNvZGUiLCAiZGVzdGluYXRpb25QYXJzZVJlc3VsdCIsICJkZXN0aW5hdGlvblJlZGlyZWN0IiwgInNlY3Rpb24iLCAiZGVzdGluYXRpb25Db250ZW50IiwgImFuY2hvciIsICJwYXJ0IiwgInRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlIiwgInRhcmdldElzU3VybmFtZUxpc3QiLCAidG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzIiwgInRvU3VybmFtZUxpc3RUYWdzIiwgInRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSIsICJ0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdCIsICJmb3VuZFBhcmFtZXRlciIsICJlbGVtZW50c1RvRGlzYWJsZSIsICJlbGVtZW50IiwgInRpdGxlIiwgIm1lc3NhZ2UiLCAiYXV0b0ZpeGVzIiwgIndhcm5pbmdNZXNzYWdlIiwgImF1dG9GaXhCdXR0b24iLCAiYXV0b0ZpeCIsICJvdXRwdXQiLCAiZnJvbU1vdmUiLCAicGF0cm9sTGluayIsICJtYXJrUmV2aWV3ZWRCdXR0b24iLCAiZXJyb3JJbmZvIiwgInN0cmF5VGV4dCIsICJkZWZhdWx0U29ydCIsICJjYXRlZ29yaWVzIiwgInBhcnNlZFRhcmdldCIsICJmb3JtYXR0ZWRUaXRsZSIsICJ0YWdzV2l0aEFyZ3VtZW50cyIsICJmb3VuZEFyZ3VtZW50RWRpdG9yIiwgImxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCIsICJtYXBwZWRBcmd1bWVudHMiLCAidGV4dCIsICJkZXBlbmRlbmNpZXMiLCAiUmVkaXJlY3RIZWxwZXJEaWFsb2ciLCAiUmVkaXJlY3RIZWxwZXIiLCAicGFnZUluZm8iLCAiZGlhbG9nSW5mbyIsICJidXR0b24iLCAicG9ydGxldExpbmsiLCAiZXZlbnQiXQp9Cg==