User:Eejit43/scripts/redirect-helper.js
Appearance
< User:Eejit43 | scripts
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
![]() | This user script seems to have a documentation page at User:Eejit43/scripts/redirect-helper. |
// <nowiki>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/redirect-helper.ts
"use strict";mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows","oojs-ui.styles.icons-content"],()=>{class T extends OO.ui.TextInputWidget{constructor(t,e){super(t);this.api=new mw.Api;this.getLookupRequest=()=>{const t=this.getValue(),e=$.Deferred();if(!t)e.resolve([]);else if(t.includes("#")){const a=t.split("#")[0];this.api.get({action:"parse",page:a,prop:"sections",redirects:!0}).catch(()=>null).then(n=>{if(n){const s=n.parse.sections.filter(r=>r.line.toLowerCase().replaceAll(/<\/?i>/g,"").startsWith(t.split("#")[1].toLowerCase()));e.resolve(s.map(r=>({data:`${n.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`,label:`${n.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`})))}else e.resolve([])})}else{const a=mw.Title.newFromText(t);this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:a?.getNamespaceId()??0,gapprefix:a?.getMainText()??t,generator:"allpages",prop:["info","pageprops"]}).catch(()=>null).then(n=>{n?e.resolve(n.query?.pages?n.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>":""}`)})):[]):e.resolve([])})}return e.promise({abort(){}})};this.getLookupCacheDataFromResponse=t=>t??[];this.getLookupMenuOptionsFromData=t=>t.map(({data:e,label:a})=>new OO.ui.MenuOptionWidget({data:e,label:a}));OO.ui.mixin.LookupElement.call(this,t),this.pageTitleParsed=e}}Object.assign(T.prototype,OO.ui.mixin.LookupElement.prototype);class O extends OO.ui.TextInputWidget{constructor(t){super(t);this.api=new mw.Api;this.getLookupRequest=()=>{const t=this.getValue(),e=$.Deferred();t||e.resolve([]);const a=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:a?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(n=>{if(n?.query?.pages){const s=n.query.pages.filter(r=>!(r.categories&&r.categories.some(o=>o.title==="Category:Wikipedia soft redirected categories"))).map(r=>{const o=r.title.split(":")[1];return{data:o,label:o}});this.emit("showing-values",s),e.resolve(s)}else e.resolve([])}),e.promise({abort(){}})};this.getLookupCacheDataFromResponse=t=>t??[];this.getLookupMenuOptionsFromData=t=>t.map(({data:e,label:a})=>new OO.ui.MenuOptionWidget({data:e,label:a}));OO.ui.mixin.LookupElement.call(this,t)}}Object.assign(O.prototype,OO.ui.mixin.LookupElement.prototype);class g extends OO.ui.ProcessDialog{constructor(t,e){super(t);this.api=new mw.Api;this.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=>{const e=t.parse.text,a=t.parse.categorieshtml,n=new OO.ui.PanelLayout({padded:!0,expanded:!1});n.$element.append(e,a),this.$body.append(n.$element)}));this.getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):g.super.prototype.getActionProcess.call(this,t);this.getTeardownProcess=()=>g.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});this.pageTitleParsed=e,g.static.name="TemplatePreviewDialog",g.static.title="Redirect categorization templates preview",g.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}}Object.assign(g.prototype,OO.ui.ProcessDialog.prototype);class d extends OO.ui.ProcessDialog{constructor(t){super(t);this.api=new mw.Api;this.getSetupProcess=()=>d.super.prototype.getSetupProcess.call(this).next(()=>{const[t,e]=this.getData();return this.api.post({action:"compare",formatversion:"2",prop:["diff"],fromslots:"main","fromtext-main":t,"fromcontentmodel-main":"wikitext",toslots:"main","totext-main":e,"tocontentmodel-main":"wikitext"}).then(a=>{const n=a.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(n?`
<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>
${n}
</tbody>
</table>`:s.$element[0]),this.$body.append(r.$element)})});this.getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):d.super.prototype.getActionProcess.call(this,t);this.getTeardownProcess=()=>d.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});d.static.name="ShowChangesDialog",d.static.title="Changes to be made",d.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}}Object.assign(d.prototype,OO.ui.ProcessDialog.prototype);class x{constructor(){this.api=new mw.Api}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(){const i=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitle}),t={redirectTemplates:this.redirectTemplates,contentText:this.contentText,pageTitle:this.pageTitle,pageTitleParsed:this.pageTitleParsed};if(i.query.pages[0].missing){mw.util.addCSS(`
#create-redirect-button {
margin-bottom: 20px;
}`);const e=new OO.ui.ButtonWidget({id:"create-redirect-button",label:"Create redirect",icon:"articleRedirect",flags:["progressive"]});e.on("click",()=>{e.$element[0].remove(),new y(t,!1).load()}),this.contentText.prepend(e.$element[0])}else if(i.query.pages[0].redirect)new y(t,!0).load();else{const e=mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Redirect page","redirect-helper");e.addEventListener("click",a=>{a.preventDefault(),new y(t,!1).load(),window.scrollTo({top:0,behavior:"smooth"}),e.remove()})}}}class y{constructor({redirectTemplates:i,contentText:t,pageTitle:e,pageTitleParsed:a},n){this.api=new mw.Api;this.redirectRegex=/^#redirect:?\s*\[\[\s*:?([^[\]{|}]+?)\s*(?:\|[^[\]{|}]+?)?]]\s*/i;this.scriptAdvert=" (via [[User:Eejit43/scripts/redirect-helper|redirect-helper]])";this.needsCheck=!0;this.templateEditorsInfo=[];this.pageContent="";this.redirectTemplates=i,this.contentText=t,this.pageTitle=e,this.pageTitleParsed=a,this.exists=n}async load(){mw.util.addCSS(`
#create-redirect-button {
margin-bottom: 20px;
}
#redirect-helper-box {
background-color: whitesmoke;
width: 700px;
max-width: calc(100% - 50px);
margin-left: auto;
margin-right: auto;
margin-bottom: 25px !important;
}
.redirect-input-layout label {
font-weight: bold;
}
.redirect-helper-template-parameters-container, .redirect-helper-template-parameters-container details {
background-color: #e2e2e2;
border-radius: 5px;
margin-block: 10px;
padding: 5px;
}
.redirect-helper-template-parameters-container summary {
cursor: pointer;
font-weight: bold;
}
.redirect-helper-template-parameters-container details {
background-color: #d1cece;
margin-block: 5px;
}
.redirect-helper-template-parameters-contained #redirect-helper-no-templates-message {
padding: 5px;
}
#redirect-helper-summary-layout {
padding-top: 10px;
margin-top: 15px;
border-top: 1px solid gray;
}
#redirect-helper-submit-layout {
margin-top: 10px;
}
#redirect-helper-submit-layout > * {
margin-bottom: 0;
}
.redirect-helper-warning {
margin-top: 8px;
}`),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(){const i=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",()=>{const t=this.redirectRegex.exec(i)?.[1];if(!t)return mw.notify("Failed to parse main page content!",{type:"error"});this.redirectInput.setValue(mw.Title.newFromText(t)?.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(i))&&this.tagSelect.setValue(["R from move"])})}loadInputElements(){this.redirectInput=new T({placeholder:"Target page name",required:!0},this.pageTitleParsed),this.redirectInput.on("change",()=>{let e=this.redirectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),e=e.replace(/^:/,""),e.length>0?(this.redirectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," ")),this.defaultSortSuggestButton.setDisabled(!1),this.submitButton.setDisabled(!1),this.showPreviewButton.setDisabled(!1),this.showChangesButton.setDisabled(!1)):(this.defaultSortSuggestButton.setDisabled(!0),this.submitButton.setDisabled(!0),this.showPreviewButton.setDisabled(!0),this.showChangesButton.setDisabled(!0)),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.redirectInputLayout=new OO.ui.FieldLayout(this.redirectInput,{label:"Redirect target:",classes:["redirect-input-layout"],align:"top"}),this.tagSelect=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.keys(this.redirectTemplates).map(e=>({data:e,label:e}))}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",()=>{const e=this.tagSelect.getValue().sort((n,s)=>n.toLowerCase().localeCompare(s.toLowerCase()));this.tagSelect.getValue().join(";")!==e.join(";")&&this.tagSelect.setValue(e),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0;for(const n of this.templateEditorsInfo)n.details.style.display="none";let a=0;for(const n of this.tagSelect.getValue()){const s=this.templateEditorsInfo.find(r=>r.name===n);s&&(s.details.style.display="block",a++)}t.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");const i=document.createElement("summary");i.textContent="Template parameters",this.templateParametersEditor.append(i);for(const[e,a]of Object.entries(this.redirectTemplates)){const n=Object.entries(a.parameters);if(n.length===0)continue;const s=document.createElement("details");s.style.display="none";const r=document.createElement("summary");r.textContent=e,s.append(r);const o={name:e,details:s,parameters:[]};for(const[u,l]of n){const p=new OO.ui.TextInputWidget({placeholder:l.default?.toString(),required:l.required});p.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});const c=new OO.ui.FieldLayout(p,{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"});s.append(c.$element[0]),o.parameters.push({name:u,aliases:l.aliases,editor:p})}this.templateParametersEditor.append(s),this.templateEditorsInfo.push(o)}const t=document.createElement("div");t.id="redirect-helper-no-templates-message",t.textContent="No templates with parameters to display!",t.style.display=this.exists?"none":"block",this.templateParametersEditor.append(t),this.defaultSortInput=new OO.ui.TextInputWidget,this.defaultSortInput.on("change",()=>{const 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(this.tagSelect.getValue().includes("R from person")){if(!e.includes(" "))return;let a="";if(/ (?:[JS]r.?|[IVX]+)$/.test(e)&&(a=e.slice(e.lastIndexOf(" ")),e=e.slice(0,e.lastIndexOf(" ")),!e.includes(" ")))return e+a;const n=e.slice(e.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),s=e.slice(0,e.lastIndexOf(" "));this.defaultSortInput.setValue(n+", "+s+a)}else{let a=e.replaceAll("Mr.","Mister").replaceAll("&","And");for(const n of["An","A","The"])if(a.startsWith(n+" ")){a=a.slice(n.length+1)+", "+n;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 O({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(const 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",()=>{const e=this.categorySelect.getValue().sort((a,n)=>a.toLowerCase().localeCompare(n.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(){const i=new OO.ui.WindowManager;document.body.append(i.$element[0]),this.submitButton=new OO.ui.ButtonWidget({label:"Submit",disabled:!0,flags:["progressive"]}),this.submitButton.on("click",()=>this.handleSubmitButtonClick());const t=new g({size:"large"},this.pageTitleParsed);i.addWindows([t]),this.showPreviewButton=new OO.ui.ButtonWidget({label:"Show preview",disabled:!0}),this.showPreviewButton.on("click",()=>{t.setData(this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())),t.open()});const e=new d({size:"large"});i.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(){const i=document.querySelector("#mwe-pt-mark .mwe-pt-tool-icon");if(i?.click(),i?.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 this.api.get({action:"query",meta:"userinfo",uiprop:"rights"})).query.userinfo.rights.includes("patrol"))return!1;const 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(){const i=this.redirectInput.getValue().trim();if(!i)this.summaryInput.$tabIndexed[0].placeholder="";else if(this.exists){const t=i!==this.oldRedirectTarget?.replaceAll("_"," "),e=this.tagSelect.getValue().some(o=>!this.oldRedirectTags.includes(o))||this.oldRedirectTags.some(o=>!this.tagSelect.getValue().includes(o)),a=this.oldRedirectTagData?this.tagSelect.getValue().some(o=>this.templateEditorsInfo.find(u=>u.name===o)?.parameters.some(u=>{const l=this.oldRedirectTagData[o]?.find(p=>p[0]===u.name)?.[1];return l?l!==u.editor.getValue().trim():!1})):!1,n=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),s=this.categorySelect.getValue().some(o=>!this.oldCategories.includes(o))||this.oldCategories.some(o=>!this.categorySelect.getValue().includes(o)),r=[];t&&r.push(`retarget to [[${i}]]`),e&&r.push("change categorization templates"),a&&r.push("change categorization template arguments"),n&&r.push("change default sort key"),s&&r.push("change categories"),r.length===0&&r.push("perform redirect cleanup"),r[0]=r[0][0].toUpperCase()+r[0].slice(1),r.length>1&&(r[r.length-1]=`and ${r.at(-1)}`),this.summaryInput.$tabIndexed[0].placeholder=r.join(r.length>2?", ":" ")}else this.summaryInput.$tabIndexed[0].placeholder=`Create redirect to [[${i}]]`}loadExistingData(){this.oldRedirectTarget=this.redirectRegex.exec(this.pageContent)?.[1],this.oldRedirectTags=Object.entries(this.redirectTemplates).map(([t,e])=>[t,...e.aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(this.pageContent))?t:null).filter(Boolean).sort((t,e)=>t.toLowerCase().localeCompare(e.toLowerCase()));const i=Object.entries(this.redirectTemplates).flatMap(([t,e])=>[t,...e.aliases]).map(t=>new RegExp(`{{\\s*[${t[0].toLowerCase()}${t[0]}]${t.slice(1)}\\s*(\\||}})`).test(this.pageContent)?t:null).filter(Boolean);this.oldRedirectTagData=Object.fromEntries(i.map(t=>{const e=new RegExp(`{{\\s*[${t[0].toLowerCase()}${t[0]}]${t.slice(1)}\\|?(.*?)\\s*}}`).exec(this.pageContent),a=Object.entries(this.redirectTemplates).find(([r,o])=>[r,...o.aliases].includes(t))?.[0];if(!e?.[1])return null;const s=e[1].split("|").map((r,o)=>{if(!r.includes("="))return[(o+1).toString(),r.trim()];const[u,l]=r.split("=");return[u.trim(),l.trim()]});return[a,s]}).filter(Boolean)),this.oldDefaultSort=this.pageContent.match(/{{DEFAULTSORT:.*?}}/g)?.at(-1)?.slice(14,-2)?.trim()??"",this.oldCategories=this.pageContent.match(/\[\[[Cc]ategory:.+?]]/g)?.map(t=>t.slice(11,-2))??[],this.oldStrayText=[this.pageContent.match(/{{short description\|.*?}}/i)?.[0],this.pageContent.match(/{{DISPLAYTITLE:.*?}}/)?.[0],this.pageContent.match(/{{italic title\|?.*?}}/i)?.[0],this.pageContent.match(/{{title language\|.*?}}/)?.[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(const[t,e]of Object.entries(this.oldRedirectTagData)){const a=this.templateEditorsInfo.find(n=>n.name===t);if(a)for(const[n,s]of e){const r=a.parameters.find(o=>[o.name,...o.aliases].includes(n));r&&r.editor.setValue(s)}}this.oldDefaultSort&&this.defaultSortInput.setValue(this.oldDefaultSort);for(const t of this.oldCategories)this.categorySelect.addAllowedValue(t);this.categorySelect.setValue(this.oldCategories.map(t=>({data:t,label:t}))),this.updateSummary()}async validateSubmission(){const i=[],t=this.redirectInput.getValue().trim(),e=this.tagSelect.getValue();/^\s*[^[\]{|}]+\s*$/.test(t)||i.push({title:t,message:"is not a valid page title!"});try{this.parsedDestination=mw.Title.newFromText(t)}catch{i.length===0&&i.push({title:t,message:"is not a valid page title!"})}!this.parsedDestination&&i.length===0&&i.push({title:t,message:"is not a valid page title!"}),this.parsedDestination?.toString()===this.pageTitleParsed.toString()&&i.push({message:"cannot redirect to itself!"});const a=await this.api.get({action:"query",formatversion:"2",prop:["pageprops","categories"],titles:t}).catch(c=>(c==="missingtitle"?i.push({title:t,message:"does not exist!"}):i.push({title:t,message:`was not able to be fetched from the API (${c})!`}),null)),n=await this.api.get({action:"parse",page:t,prop:"sections",redirects:!0});if(n.parse.redirects?.[0]){const c=n.parse.redirects[0].to+(n.parse.redirects[0].tofragment?`#${n.parse.redirects[0].tofragment}`:"");i.push({title:t,message:`is a redirect to <a href="${mw.util.getUrl(c)}" target="_blank">${c}</a>. Retarget to that page instead, as double redirects aren't allowed.`})}if(t.split("#").length>1)if(n.parse.sections.find(m=>m.line.replaceAll(/<\/?i>/g,"")===t.split("#")[1]))e.includes("R to anchor")&&i.push({message:"is tagged as a redirect to an anchor, but it is actually a redirect to a section!"}),e.includes("R to section")||i.push({message:"is a redirect to a section, but it is not tagged with <code>{{R to section}}</code>!"});else{const m=(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;[...m.match(/(?<={{\s*?[Aa](?:nchors?|nchor for redirect|nker|NCHOR|nc)\s*?\|).+?(?=}})/g)?.map(h=>h.split("|").map(f=>f.trim()))?.flat()??[],...m.match(/(?<={{\s*?(?:[Vv](?:isible anchors?|isanc|Anch|anchor|isibleanchor|a)|[Aa](?:nchord|chored|nchor\+)|[Tt]ext anchor)\s*?\|).+?(?=(?<!!|=)}})/g)?.map(h=>h.split("|").map(f=>f.trim()).filter(f=>!/^text\s*?=/.test(f)))?.flat()??[],...m.match(/(?<=id=)"?.+?(?="|>|\|)/g)?.map(h=>h.trim())??[]].includes(t.split("#")[1])?(e.includes("R to section")&&i.push({message:"is tagged as a redirect to a section, but it is actually a redirect to an anchor!"}),e.includes("R to anchor")||i.push({message:"is a redirect to an anchor, but it is not tagged with <code>{{R from anchor}}</code>!"})):i.push({message:`is a redirect to <a href="${mw.util.getUrl(t)}" target="_blank">${t}</a>, but that section or anchor does not exist!`})}t.split("#").length===1&&(e.includes("R to section")||e.includes("R to anchor"))&&i.push({message:"is not a redirect to a section/anchor, but it is tagged with <code>{{R from section}}</code> or <code>{{R from anchor}}</code>!"});const s=!!(a.query.pages[0].pageprops&&"disambiguation"in a.query.pages[0].pageprops),r=!!(a.query.pages[0].categories&&a.query.pages[0].categories.some(c=>c.title==="Category:Surnames")),o=["R to disambiguation page","R from incomplete disambiguation"],u=["R from ambiguous sort name","R from ambiguous term"],l=o.some(c=>e.includes(c)),p=u.some(c=>e.includes(c));s&&!l&&!p&&i.push({message:"is a redirect to a disambiguation page, but it is not tagged with a disambiguation categorization template!"}),a.query.pages[0].pageprops&&!s&&(l&&i.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!"}),r&&!p&&i.push({message:"is a redirect to a surname list, but it is not tagged with a correct disambiguation categorization template!"})),s&&e.includes("R to disambiguation page")&&!this.pageTitleParsed.getMainText().endsWith(" (disambiguation)")&&i.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!'});for(const c of["R semi-protected","R extended-protected","R template-protected","R fully protected"])e.includes(c)&&i.push({message:`is tagged with unnecessarily tagged with <code>{{${c}}}</code> which will be duplicated by the redirect category shell!`});return mw.config.get("wgWikibaseItemId")&&!e.includes("R with Wikidata item")&&i.push({message:"is linked to a Wikidata item but it isn't tagged with <code>{{R with Wikidata item}}</code>!"}),e.includes("R with Wikidata item")&&!mw.config.get("wgWikibaseItemId")&&i.push({message:"is tagged with <code>{{R with Wikidata item}}</code> but it is not actually linked to a Wikidata item!"}),this.syncTalkCheckbox?.isSelected()&&!this.talkData.query.pages[0].missing&&!this.talkData.query.pages[0].redirect&&i.push({title:this.pageTitleParsed.getTalkPage().getPrefixedText(),message:"exists, but is not a redirect!"}),i}async handleSubmitButtonClick(){const i=[this.redirectInput,this.tagSelect,...this.templateEditorsInfo.flatMap(s=>s.parameters.map(r=>r.editor)),this.defaultSortInput,this.defaultSortSuggestButton,this.categorySelect,this.summaryInput,this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckbox,this.patrolCheckbox].filter(Boolean);for(const s of i)s.setDisabled(!0);this.submitButton.setLabel("Checking target validity...");let t=[];if(this.needsCheck?t=await this.validateSubmission():this.parsedDestination=mw.Title.newFromText(this.redirectInput.getValue()),t.length>0){for(const s of document.querySelectorAll(".redirect-helper-warning"))s.remove();for(const{title:s,message:r}of t){const o=new OO.ui.HtmlSnippet(`${s?`<a href="${mw.util.getUrl(s)}" target="_blank">${s}</a>`:"This page"} ${r} Click again without making changes to submit anyway.`),u=new OO.ui.MessageWidget({type:"error",classes:["redirect-helper-warning"],inline:!0,label:o});this.editorBox.$element[0].append(u.$element[0])}for(const s of i)s.setDisabled(!1);this.submitButton.setLabel("Submit anyway"),this.needsCheck=!1;return}this.submitButton.setLabel(`${this.exists?"Editing":"Creating"} redirect...`);const 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...");const s=this.tagSelect.getValue().includes("R from move"),r=this.createOutput(this.parsedDestination.getTalkPage().getPrefixedText(),s?["R from move"]:[],void 0,void 0,[]);if(!await this.editOrCreate(this.pageTitleParsed.getTalkPage().getPrefixedText(),r,"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...");const s=document.querySelector(".patrollink a"),r=document.querySelector("#mwe-pt-mark-as-reviewed-button");s?await this.api.postWithToken("patrol",{action:"patrol",rcid:new URL(s.href).searchParams.get("rcid")}).catch((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"}):r?(r.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(i,t,e,a,n){const s=mw.Title.newFromText(i),r=s?`${s.getNamespaceId()===14?":":""}${s.getPrefixedText()}${s.getFragment()?`#${s.getFragment()}`:""}`:i.trim();this.pageTitleParsed.getMainText().toLocaleLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")===a?.toLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")&&(a=void 0);const o=t.map(u=>{const l=this.templateEditorsInfo.find(c=>c.name===u);if(!l)return`{{${u}}}`;const p=l.parameters.map((c,m)=>{const b=c.editor.getValue().trim();return b?`|${c.name===(m+1).toString()?"":`${c.name}=`}${b}`:null}).filter(Boolean).join("");return`{{${u}${p}}}`});return[`#REDIRECT [[${r}]]
`,t.length>0?`{{Redirect category shell|
${o.join(`
`)}
}}
`:null,e?e+`
`:null,a?`{{DEFAULTSORT:${a.trim()}}}`:null,n.length>0?n.map(u=>`[[Category:${u}]]`).join(`
`):null].filter(Boolean).join(`
`)}async getPageContent(i){return(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:i})).query.pages[0].revisions[0].slots.main.content.trim()}async editOrCreate(i,t,e){return await this.api.edit(i,()=>({text:t,summary:e})).catch((a,n)=>a==="nocreate-missing"?this.api.create(i,{summary:e},t).catch((s,r)=>{mw.notify(`Error creating ${i}: ${r?.error.info??"Unknown error"} (${s})`,{type:"error"})}):(mw.notify(`Error editing or creating ${i}: ${n?.error.info??"Unknown error"} (${a})`,{type:"error"}),null))}}new x().run()});
// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gICAgQXBpQ29tcGFyZVBhZ2VzUGFyYW1zLFxuICAgIEFwaVBhcnNlUGFyYW1zLFxuICAgIEFwaVF1ZXJ5SW5mb1BhcmFtcyxcbiAgICBBcGlRdWVyeVBhZ2VQcm9wc1BhcmFtcyxcbiAgICBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyxcbiAgICBBcGlRdWVyeVVzZXJJbmZvUGFyYW1zLFxuICAgIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcyxcbn0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHtcbiAgICBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1zLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vcHJldmVudC1hYmJyZXZpYXRpb25zXG4gICAgQ2F0ZWdvcmllc1Jlc3VsdCxcbiAgICBNZWRpYVdpa2lEYXRhRXJyb3IsXG4gICAgUGFnZUluZm9SZXN1bHQsXG4gICAgUGFnZVBhcnNlUmVzdWx0LFxuICAgIFBhZ2VSZXZpc2lvbnNSZXN1bHQsXG4gICAgUGFnZVRyaWFnZUxpc3RSZXNwb25zZSxcbiAgICBQYWdlcHJvcHNSZXN1bHQsXG4gICAgVXNlclBlcm1pc3Npb25zUmVzcG9uc2UsXG59IGZyb20gJy4uL2dsb2JhbC10eXBlcyc7XG5cbnR5cGUgUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnMgPSBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgICAgYWxpYXNlczogc3RyaW5nW107XG4gICAgICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgICByZXF1aXJlZDogYm9vbGVhbjtcbiAgICAgICAgc3VnZ2VzdGVkOiBib29sZWFuO1xuICAgICAgICBkZWZhdWx0OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgICAgZXhhbXBsZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgfVxuPjtcblxudHlwZSBSZWRpcmVjdFRlbXBsYXRlRGF0YSA9IFJlY29yZDxzdHJpbmcsIHsgcGFyYW1ldGVyczogUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM7IGFsaWFzZXM6IHN0cmluZ1tdIH0+O1xuXG5pbnRlcmZhY2UgVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICBwYXJhbWV0ZXJzOiB7IG5hbWU6IHN0cmluZzsgYWxpYXNlczogc3RyaW5nW107IGVkaXRvcjogT08udWkuVGV4dElucHV0V2lkZ2V0IH1bXTtcbn1cblxuaW50ZXJmYWNlIExvb2t1cEVsZW1lbnRDb25maWcgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQuQ29uZmlnT3B0aW9ucywgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5Db25maWdPcHRpb25zIHt9XG5cbm13LmxvYWRlci51c2luZyhbJ21lZGlhd2lraS51dGlsJywgJ29vanMtdWktY29yZScsICdvb2pzLXVpLXdpZGdldHMnLCAnb29qcy11aS13aW5kb3dzJywgJ29vanMtdWkuc3R5bGVzLmljb25zLWNvbnRlbnQnXSwgKCkgPT4ge1xuICAgIC8vIFNldHVwIFJlZGlyZWN0SW5wdXRXaWRnZXRcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSB0aXRsZSBsb29rdXAgZWxlbWVudC5cbiAgICAgKi9cbiAgICBjbGFzcyBSZWRpcmVjdElucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZywgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZSkge1xuICAgICAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5pbmNsdWRlcygnIycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB2YWx1ZS5zcGxpdCgnIycpWzBdO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgLmdldCh7IGFjdGlvbjogJ3BhcnNlJywgcGFnZTogdGl0bGUsIHByb3A6ICdzZWN0aW9ucycsIHJlZGlyZWN0czogdHJ1ZSB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IFBhZ2VQYXJzZVJlc3VsdCB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkU2VjdGlvbnMgPSByZXN1bHQucGFyc2Uuc2VjdGlvbnMuZmlsdGVyKChzZWN0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydHNXaXRoKHZhbHVlLnNwbGl0KCcjJylbMV0udG9Mb3dlckNhc2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkU2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogYCR7cmVzdWx0LnBhcnNlLnRpdGxlfSMke3NlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGAke3Jlc3VsdC5wYXJzZS50aXRsZX0jJHtzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiBwYXJzZWRUaXRsZT8uZ2V0TmFtZXNwYWNlSWQoKSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6IFsnaW5mbycsICdwYWdlcHJvcHMnXSxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IHsgcXVlcnk6IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZzsgcGFnZXByb3BzOiB7IGRpc2FtYmlndWF0aW9uPzogc3RyaW5nIH07IHJlZGlyZWN0Pzogc3RyaW5nIH1bXSB9IH0gfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5xdWVyeT8ucGFnZXMgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnF1ZXJ5LnBhZ2VzIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYWdlKSA9PiBwYWdlLnRpdGxlICE9PSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBwYWdlLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhZ2UudGl0bGV9JHtwYWdlLnBhZ2Vwcm9wcyAmJiAnZGlzYW1iaWd1YXRpb24nIGluIHBhZ2UucGFnZXByb3BzID8gJyA8aT4oZGlzYW1iaWd1YXRpb24pPC9pPicgOiAnJ30keydyZWRpcmVjdCcgaW4gcGFnZSA/ICcgPGk+KHJlZGlyZWN0KTwvaT4nIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgICAgICB9O1xuXG4gICAgICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICAgICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oUmVkaXJlY3RJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcblxuICAgIC8vIFNldHVwIENhdGVnb3J5SW5wdXRXaWRnZXRcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBjYXRlZ29yeSBsb29rdXAgZWxlbWVudC5cbiAgICAgKi9cbiAgICBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiAxNCxcbiAgICAgICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnYWxscGFnZXMnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtcylcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0OiB7IHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmc7IGNhdGVnb3JpZXM/OiB7IHRpdGxlOiBzdHJpbmcgfVtdIH1bXSB9IH0gfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQ/LnF1ZXJ5Py5wYWdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSByZXN1bHQucXVlcnkucGFnZXMgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYWdlKSA9PiAhKHBhZ2UuY2F0ZWdvcmllcyAmJiBwYWdlLmNhdGVnb3JpZXMuc29tZSgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6V2lraXBlZGlhIHNvZnQgcmVkaXJlY3RlZCBjYXRlZ29yaWVzJykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGVXaXRob3V0TmFtZXNwYWNlID0gcGFnZS50aXRsZS5zcGxpdCgnOicpWzFdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSwgbGFiZWw6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcGFnZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgICAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4gZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihDYXRlZ29yeUlucHV0V2lkZ2V0LnByb3RvdHlwZSwgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5wcm90b3R5cGUpO1xuXG4gICAgLy8gU2V0dXAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nXG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgZGlhbG9nIHVzZWQgZm9yIHByZXZpZXdpbmcgdGVtcGxhdGVzLlxuICAgICAqL1xuICAgIGNsYXNzIFRlbXBsYXRlUHJldmlld0RpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgICAgICAvLyBBc3NpZ25lZCBpbiBjb25zdHJ1Y3RvclxuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGU7XG5cbiAgICAgICAgY29uc3RydWN0b3IoY29uZmlnOiBPTy51aS5Qcm9jZXNzRGlhbG9nLkNvbmZpZ09wdGlvbnMsIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUpIHtcbiAgICAgICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuXG4gICAgICAgICAgICBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3RhdGljLm5hbWUgPSAnVGVtcGxhdGVQcmV2aWV3RGlhbG9nJztcbiAgICAgICAgICAgIFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzIHByZXZpZXcnO1xuICAgICAgICAgICAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nLnN0YXRpYy5hY3Rpb25zID0gW3sgYWN0aW9uOiAnY2FuY2VsJywgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFNldHVwUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgICAgICAgICAgICAgICAucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdwYXJzZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50bW9kZWw6ICd3aWtpdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiBbJ3RleHQnLCAnY2F0ZWdvcmllc2h0bWwnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRQcmVmaXhlZERiKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmdldERhdGEoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVBhcnNlUGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzQ29udGVudCA9IChyZXN1bHQgYXMgeyBwYXJzZTogeyB0ZXh0OiBzdHJpbmcgfSB9KS5wYXJzZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2F0ZWdvcmllc0NvbnRlbnQgPSAocmVzdWx0IGFzIHsgcGFyc2U6IHsgY2F0ZWdvcmllc2h0bWw6IHN0cmluZyB9IH0pLnBhcnNlLmNhdGVnb3JpZXNodG1sO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKHRhZ3NDb250ZW50LCBjYXRlZ29yaWVzQ29udGVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChwYW5lbExheW91dC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvblxuICAgICAgICAgICAgICAgID8gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWFuYWdlcigpLmNsb3NlV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oVGVtcGxhdGVQcmV2aWV3RGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuXG4gICAgLy8gU2V0dXAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nXG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgZGlhbG9nIHVzZWQgZm9yIHNob3dpbmcgY2hhbmdlcyB0byBiZSBtYWRlLlxuICAgICAqL1xuICAgIGNsYXNzIFNob3dDaGFuZ2VzRGlhbG9nIGV4dGVuZHMgT08udWkuUHJvY2Vzc0RpYWxvZyB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT08udWkuUHJvY2Vzc0RpYWxvZy5Db25maWdPcHRpb25zKSB7XG4gICAgICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgICAgICBTaG93Q2hhbmdlc0RpYWxvZy5zdGF0aWMubmFtZSA9ICdTaG93Q2hhbmdlc0RpYWxvZyc7XG4gICAgICAgICAgICBTaG93Q2hhbmdlc0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnQ2hhbmdlcyB0byBiZSBtYWRlJztcbiAgICAgICAgICAgIFNob3dDaGFuZ2VzRGlhbG9nLnN0YXRpYy5hY3Rpb25zID0gW3sgYWN0aW9uOiAnY2FuY2VsJywgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFNldHVwUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBTaG93Q2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW29sZFRleHQsIG5ld1RleHRdID0gdGhpcy5nZXREYXRhKCkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnY29tcGFyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiBbJ2RpZmYnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21zbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb210ZXh0LW1haW4nOiBvbGRUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb21jb250ZW50bW9kZWwtbWFpbic6ICd3aWtpdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3Nsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAndG90ZXh0LW1haW4nOiBuZXdUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RvY29udGVudG1vZGVsLW1haW4nOiAnd2lraXRleHQnLFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlDb21wYXJlUGFnZXNQYXJhbXMgJiB7ICdmcm9tdGV4dC1tYWluJzogc3RyaW5nOyAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nOyAndG90ZXh0LW1haW4nOiBzdHJpbmc7ICd0b2NvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBhcmlzb24gPSAocmVzdWx0IGFzIHsgY29tcGFyZTogeyBib2R5OiBzdHJpbmcgfSB9KS5jb21wYXJlLmJvZHk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vQ2hhbmdlc0VsZW1lbnQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICd3YXJuaW5nJywgbGFiZWw6ICdObyBjaGFuZ2VzIHRvIG1ha2UhJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZWxMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsTGF5b3V0LiRlbGVtZW50LmFwcGVuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYFxuPHRhYmxlIGNsYXNzPVwiZGlmZiBkaWZmLWVkaXRmb250LW1vbm9zcGFjZVwiPlxuICAgIDxjb2xncm91cD5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtbWFya2VyXCI+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLWNvbnRlbnRcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtbWFya2VyXCI+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLWNvbnRlbnRcIj5cbiAgICA8L2NvbGdyb3VwPlxuICAgIDx0Ym9keT5cbiAgICAgICAgJHtjb21wYXJpc29ufVxuICAgIDwvdGJvZHk+XG48L3RhYmxlPmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBub0NoYW5nZXNFbGVtZW50LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHBhbmVsTGF5b3V0LiRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICAgICAgPyBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYW5hZ2VyKCkuY2xvc2VXaW5kb3codGhpcyk7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogU2hvd0NoYW5nZXNEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBTaG93Q2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oU2hvd0NoYW5nZXNEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhhbmRsZXMgdGhlIGVudGlyZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSByZWRpcmVjdC1oZWxwZXIgc2NyaXB0LlxuICAgICAqL1xuICAgIGNsYXNzIFJlZGlyZWN0SGVscGVyIHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICAgICAgcHJpdmF0ZSByZWRpcmVjdFRlbXBsYXRlcyE6IFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuICAgICAgICBwcml2YXRlIGNvbnRlbnRUZXh0ITogSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlITogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZCE6IG13LlRpdGxlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSdW5zIHRoZSByZWRpcmVjdCBoZWxwZXIuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBydW4oKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFzc2VzUHJlQ2hlY2tzKCkpIHJldHVybjtcblxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyA9IGF3YWl0IHRoaXMuZmV0Y2hSZWRpcmVjdFRlbXBsYXRlcygpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213LWNvbnRlbnQtdGV4dCcpIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRUZXh0KSByZXR1cm4gbXcubm90aWZ5KCdyZWRpcmVjdC1oZWxwZXI6IEZhaWxlZCB0byBmaW5kIGNvbnRlbnQgdGV4dCBlbGVtZW50IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGhpcy5wYWdlVGl0bGUpITtcbiAgICAgICAgICAgIGlmICghdGhpcy5wYWdlVGl0bGVQYXJzZWQpIHJldHVybiBtdy5ub3RpZnkoJ3JlZGlyZWN0LWhlbHBlcjogRmFpbGVkIHRvIHBhcnNlIHBhZ2UgdGl0bGUhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrUGFnZUFuZExvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhlIHBhZ2UgcGFzc2VzIHByZSBjaGVja3MuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIHBhc3Nlc1ByZUNoZWNrcygpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA+PSAwLCAvLyBJcyBub3QgdmlydHVhbCBuYW1lc3BhY2VcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z0lzUHJvYmFibHlFZGl0YWJsZScpLCAvLyBQYWdlIGlzIGVkaXRhYmxlXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dJc0FydGljbGUnKSwgLy8gVmlld2luZyB0aGUgY29udGVudCBvZiBhIHBhZ2VcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z0FjdGlvbicpID09PSAndmlldycsIC8vIFZpZXdpbmcgdGhlIHBhZ2UgKG5vdCBlZGl0aW5nKVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnUmV2aXNpb25JZCcpID09PSBtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSwgLy8gVmlld2luZyB0aGUgY3VycmVudCByZXZpc2lvblxuICAgICAgICAgICAgICAgICFtdy5jb25maWcuZ2V0KCd3Z0RpZmZPbGRJZCcpLCAvLyBOb3Qgdmlld2luZyBhIGRpZmZcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25zLmV2ZXJ5KEJvb2xlYW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoZXMgdGhlIHJlZGlyZWN0IHRlbXBsYXRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgZmV0Y2hSZWRpcmVjdFRlbXBsYXRlcygpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiAnVXNlcjpFZWppdDQzL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyLmpzb24nLFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgICAgICAgICApLnF1ZXJ5LnBhZ2VzPy5bMF0/LnJldmlzaW9ucz8uWzBdPy5zbG90cz8ubWFpbj8uY29udGVudCB8fCAne30nLFxuICAgICAgICAgICAgKSBhcyBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgYSBwYWdlJ3Mgc3RhdHVzIGFuZCBsb2FkcyB0aGUgaGVscGVyIGFwcHJvcHJpYXRlbHkuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGNoZWNrUGFnZUFuZExvYWQoKSB7XG4gICAgICAgICAgICBjb25zdCBwYWdlSW5mbyA9IChhd2FpdCB0aGlzLmFwaS5nZXQoeyBhY3Rpb246ICdxdWVyeScsIGZvcm1hdHZlcnNpb246ICcyJywgcHJvcDogJ2luZm8nLCB0aXRsZXM6IHRoaXMucGFnZVRpdGxlIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuXG4gICAgICAgICAgICBjb25zdCBkaWFsb2dJbmZvID0geyByZWRpcmVjdFRlbXBsYXRlczogdGhpcy5yZWRpcmVjdFRlbXBsYXRlcywgY29udGVudFRleHQ6IHRoaXMuY29udGVudFRleHQsIHBhZ2VUaXRsZTogdGhpcy5wYWdlVGl0bGUsIHBhZ2VUaXRsZVBhcnNlZDogdGhpcy5wYWdlVGl0bGVQYXJzZWQgfTtcblxuICAgICAgICAgICAgaWYgKHBhZ2VJbmZvLnF1ZXJ5LnBhZ2VzWzBdLm1pc3NpbmcpIHtcbiAgICAgICAgICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4jY3JlYXRlLXJlZGlyZWN0LWJ1dHRvbiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1gKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBpZDogJ2NyZWF0ZS1yZWRpcmVjdC1idXR0b24nLCBsYWJlbDogJ0NyZWF0ZSByZWRpcmVjdCcsIGljb246ICdhcnRpY2xlUmVkaXJlY3QnLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICAgICAgICAgIGJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi4kZWxlbWVudFswXS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlKS5sb2FkKCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0LnByZXBlbmQoYnV0dG9uLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFnZUluZm8ucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QpIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCB0cnVlKS5sb2FkKCk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3J0bGV0TGluayA9IG13LnV0aWwuYWRkUG9ydGxldExpbmsobXcuY29uZmlnLmdldCgnc2tpbicpID09PSAnbWluZXJ2YScgPyAncC10YicgOiAncC1jYWN0aW9ucycsICcjJywgJ1JlZGlyZWN0IHBhZ2UnLCAncmVkaXJlY3QtaGVscGVyJykhO1xuICAgICAgICAgICAgICAgIHBvcnRsZXRMaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlKS5sb2FkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcG9ydGxldExpbmsucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhhbmRsZXMgdGhlIGRpYWxvZyBwb3J0aW9uIG9mIHJlZGlyZWN0LWhlbHBlciBzY3JpcHQuXG4gICAgICovXG4gICAgY2xhc3MgUmVkaXJlY3RIZWxwZXJEaWFsb2cge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcbiAgICAgICAgcHJpdmF0ZSByZWRpcmVjdFJlZ2V4ID0gL14jcmVkaXJlY3Q6P1xccypcXFtcXFtcXHMqOj8oW15bXFxde3x9XSs/KVxccyooPzpcXHxbXltcXF17fH1dKz8pP11dXFxzKi9pO1xuICAgICAgICBwcml2YXRlIHNjcmlwdEFkdmVydCA9ICcgKHZpYSBbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlcnxyZWRpcmVjdC1oZWxwZXJdXSknO1xuXG4gICAgICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RUZW1wbGF0ZXM6IFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuICAgICAgICBwcml2YXRlIGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGU6IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgICAgIHByaXZhdGUgZXhpc3RzOiBib29sZWFuO1xuXG4gICAgICAgIC8vIFVzZWQgZHVyaW5nIHJ1bigpXG4gICAgICAgIHByaXZhdGUgbmVlZHNDaGVjayA9IHRydWU7XG5cbiAgICAgICAgcHJpdmF0ZSBlZGl0b3JCb3ghOiBPTy51aS5QYW5lbExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBzeW5jV2l0aE1haW5CdXR0b24/OiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RJbnB1dCE6IFJlZGlyZWN0SW5wdXRXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RJbnB1dExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgICAgICBwcml2YXRlIHRhZ1NlbGVjdCE6IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSB0YWdTZWxlY3RMYXlvdXQhOiBPTy51aS5BY3Rpb25GaWVsZExheW91dDtcbiAgICAgICAgcHJpdmF0ZSB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IhOiBIVE1MRGV0YWlsc0VsZW1lbnQ7XG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVFZGl0b3JzSW5mbzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdID0gW107XG4gICAgICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3QhOiBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdElucHV0ITogQ2F0ZWdvcnlJbnB1dFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgICAgICBwcml2YXRlIGRlZmF1bHRTb3J0SW5wdXQhOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgICAgICBwcml2YXRlIGRlZmF1bHRTb3J0SW5wdXRMYXlvdXQhOiBPTy51aS5BY3Rpb25GaWVsZExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBzdW1tYXJ5SW5wdXQhOiBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHN1bW1hcnlJbnB1dExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgICAgICBwcml2YXRlIHN1Ym1pdEJ1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzaG93Q2hhbmdlc0J1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzaG93UHJldmlld0J1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzeW5jVGFsa0NoZWNrYm94PzogT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzeW5jVGFsa0NoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHBhdHJvbENoZWNrYm94PzogT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBwYXRyb2xDaGVja2JveExheW91dD86IE9PLnVpLldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzdWJtaXRMYXlvdXQhOiBPTy51aS5Ib3Jpem9udGFsTGF5b3V0O1xuXG4gICAgICAgIHByaXZhdGUgdGFsa0RhdGE/OiBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICBwcml2YXRlIHBhZ2VDb250ZW50ID0gJyc7XG5cbiAgICAgICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhcmdldD86IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhZ3M/OiBzdHJpbmdbXTtcbiAgICAgICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhZ0RhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXVtdPjtcbiAgICAgICAgcHJpdmF0ZSBvbGREZWZhdWx0U29ydD86IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBvbGRDYXRlZ29yaWVzPzogc3RyaW5nW107XG4gICAgICAgIHByaXZhdGUgb2xkU3RyYXlUZXh0Pzogc3RyaW5nO1xuXG4gICAgICAgIHByaXZhdGUgcGFyc2VkRGVzdGluYXRpb24hOiBtdy5UaXRsZSB8IG51bGw7XG5cbiAgICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgICAgICB7IHJlZGlyZWN0VGVtcGxhdGVzLCBjb250ZW50VGV4dCwgcGFnZVRpdGxlLCBwYWdlVGl0bGVQYXJzZWQgfTogeyByZWRpcmVjdFRlbXBsYXRlczogUmVkaXJlY3RUZW1wbGF0ZURhdGE7IGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDsgcGFnZVRpdGxlOiBzdHJpbmc7IHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUgfSxcbiAgICAgICAgICAgIGV4aXN0czogYm9vbGVhbixcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gcmVkaXJlY3RUZW1wbGF0ZXM7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0ID0gY29udGVudFRleHQ7XG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZSA9IHBhZ2VUaXRsZTtcbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuXG4gICAgICAgICAgICB0aGlzLmV4aXN0cyA9IGV4aXN0cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyB0aGUgcmVkaXJlY3QtaGVscGVyIGRpYWxvZyBpbnRvIHRoZSBwYWdlLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgICAgIG13LnV0aWwuYWRkQ1NTKGBcbiNjcmVhdGUtcmVkaXJlY3QtYnV0dG9uIHtcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLWJveCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGVzbW9rZTtcbiAgICB3aWR0aDogNzAwcHg7XG4gICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA1MHB4KTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gICAgbWFyZ2luLWJvdHRvbTogMjVweCAhaW1wb3J0YW50O1xufVxuXG4ucmVkaXJlY3QtaW5wdXQtbGF5b3V0IGxhYmVsIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciwgLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyO1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICBtYXJnaW4tYmxvY2s6IDEwcHg7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIHN1bW1hcnkge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDFjZWNlO1xuICAgIG1hcmdpbi1ibG9jazogNXB4O1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVkICNyZWRpcmVjdC1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2Uge1xuICAgIHBhZGRpbmc6IDVweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1zdW1tYXJ5LWxheW91dCB7XG4gICAgcGFkZGluZy10b3A6IDEwcHg7XG4gICAgbWFyZ2luLXRvcDogMTVweDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgZ3JheTtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1zdWJtaXQtbGF5b3V0IHtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXQgPiAqIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXdhcm5pbmcge1xuICAgIG1hcmdpbi10b3A6IDhweDtcbn1gKTtcblxuICAgICAgICAgICAgbXcubG9hZGVyLmFkZExpbmtUYWcoJ2h0dHBzOi8vd3d3Lm1lZGlhd2lraS5vcmcvdy9sb2FkLnBocD9tb2R1bGVzPW1lZGlhd2lraS5kaWZmLnN0eWxlcyZvbmx5PXN0eWxlcycpO1xuXG4gICAgICAgICAgICAvKiBMb2FkIGVsZW1lbnRzICovXG4gICAgICAgICAgICB0aGlzLmVkaXRvckJveCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IGlkOiAncmVkaXJlY3QtaGVscGVyLWJveCcsIHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlLCBmcmFtZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2VUaXRsZVBhcnNlZC5pc1RhbGtQYWdlKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYWluUGFnZURhdGEgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIHByb3A6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRTdWJqZWN0UGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgICAgIGlmIChtYWluUGFnZURhdGEucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QpIGF3YWl0IHRoaXMubG9hZFN5bmNXaXRoTWFpbkJ1dHRvbigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRJbnB1dEVsZW1lbnRzKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTdWJtaXRFbGVtZW50cygpO1xuXG4gICAgICAgICAgICAvKiBBZGQgZWxlbWVudHMgdG8gc2NyZWVuIGFuZCBsb2FkIGRhdGEgKGlmIGFwcGxpY2FibGUpICovXG4gICAgICAgICAgICB0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXS5hcHBlbmQoXG4gICAgICAgICAgICAgICAgLi4uKFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24/LiRlbGVtZW50Py5bMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICBdLmZpbHRlcihCb29sZWFuKSBhcyBIVE1MRWxlbWVudFtdKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudFRleHQucHJlcGVuZCh0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmV4aXN0cykgdGhpcy5sb2FkRXhpc3RpbmdEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIFwiU3luYyB3aXRoIG1haW4gcGFnZVwiIGJ1dHRvblwiIG9uIHRhbGsgcGFnZXMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGxvYWRTeW5jV2l0aE1haW5CdXR0b24oKSB7XG4gICAgICAgICAgICBjb25zdCBtYWluUGFnZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFN1YmplY3RQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpKTtcblxuICAgICAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTeW5jIHdpdGggbWFpbiBwYWdlJywgaWNvbjogJ2xpbmsnLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVkaXJlY3RSZWdleC5leGVjKG1haW5QYWdlQ29udGVudCk/LlsxXTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG13Lm5vdGlmeSgnRmFpbGVkIHRvIHBhcnNlIG1haW4gcGFnZSBjb250ZW50IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZShtdy5UaXRsZS5uZXdGcm9tVGV4dCh0YXJnZXQpPy5nZXRUYWxrUGFnZSgpPy50b1N0cmluZygpID8/ICcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tTW92ZSA9IFsnUiBmcm9tIG1vdmUnLCAuLi50aGlzLnJlZGlyZWN0VGVtcGxhdGVzWydSIGZyb20gbW92ZSddLmFsaWFzZXNdLnNvbWUoKHRhZ09yUmVkaXJlY3QpID0+XG4gICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KG1haW5QYWdlQ29udGVudCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbU1vdmUpIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKFsnUiBmcm9tIG1vdmUnXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyB0aGUgaW5wdXQgZWxlbWVudHMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICAgICAgLyogUmVkaXJlY3QgdGFyZ2V0IGlucHV0ICovXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQgPSBuZXcgUmVkaXJlY3RJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnVGFyZ2V0IHBhZ2UgbmFtZScsIHJlcXVpcmVkOiB0cnVlIH0sIHRoaXMucGFnZVRpdGxlUGFyc2VkKTtcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL146LywgJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnJlZGlyZWN0SW5wdXQsIHsgbGFiZWw6ICdSZWRpcmVjdCB0YXJnZXQ6JywgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSwgYWxpZ246ICd0b3AnIH0pO1xuXG4gICAgICAgICAgICAvKiBSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBzZWxlY3Rpb24gKi9cbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0ID0gbmV3IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgYWxsb3dBcmJpdHJhcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmtleXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykubWFwKCh0YWcpID0+ICh7IGRhdGE6IHRhZywgbGFiZWw6IHRhZyB9KSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICh0aGlzLnRhZ1NlbGVjdC5nZXRNZW51KCkgYXMgT08udWkuTWVudVNlbGVjdFdpZGdldC5Db25maWdPcHRpb25zKS5maWx0ZXJNb2RlID0gJ3N1YnN0cmluZyc7XG4gICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSAodGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKHNvcnRlZFRhZ3MpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVkaXRvckluZm8gb2YgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvKSBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgICAgIGxldCBzaG93blRlbXBsYXRlRWRpdG9ycyA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3JJbmZvID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdG9ySW5mbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd25UZW1wbGF0ZUVkaXRvcnMrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5zdHlsZS5kaXNwbGF5ID0gc2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gJ25vbmUnIDogJ2Jsb2NrJztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnRhZ1NlbGVjdCwge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzOicsXG4gICAgICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgcGFyYW1ldGVycyAqL1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5jbGFzc0xpc3QuYWRkKCdyZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXInKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9ICdUZW1wbGF0ZSBwYXJhbWV0ZXJzJztcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW3RlbXBsYXRlTmFtZSwgdGVtcGxhdGVEYXRhXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZURhdGEucGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICAgICAgZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgICAgICAgICBzdW1tYXJ5LnRleHRDb250ZW50ID0gdGVtcGxhdGVOYW1lO1xuICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKHN1bW1hcnkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudERhdGE6IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gPSB7IG5hbWU6IHRlbXBsYXRlTmFtZSwgZGV0YWlscywgcGFyYW1ldGVyczogW10gfTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIHBhcmFtZXRlckRhdGFdIG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6IHBhcmFtZXRlckRhdGEuZGVmYXVsdD8udG9TdHJpbmcoKSwgcmVxdWlyZWQ6IHBhcmFtZXRlckRhdGEucmVxdWlyZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhcmFtZXRlck5hbWV9JHshcGFyYW1ldGVyRGF0YS5sYWJlbCB8fCBwYXJhbWV0ZXJOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBhcmFtZXRlckRhdGEubGFiZWw/LnRvTG93ZXJDYXNlKCkgPyAnJyA6IGAgKCR7cGFyYW1ldGVyRGF0YS5sYWJlbH0pYH0ke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb24gPyBgICgke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb259KWAgOiAnJ30gKHR5cGU6ICR7cGFyYW1ldGVyRGF0YS50eXBlfSkgJHtwYXJhbWV0ZXJEYXRhLnN1Z2dlc3RlZCA/ICcgKHN1Z2dlc3RlZCknIDogJyd9JHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGUgPyBgIChleGFtcGxlOiBcIiR7cGFyYW1ldGVyRGF0YS5leGFtcGxlfVwiKWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKGlucHV0TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS5wYXJhbWV0ZXJzLnB1c2goeyBuYW1lOiBwYXJhbWV0ZXJOYW1lLCBhbGlhc2VzOiBwYXJhbWV0ZXJEYXRhLmFsaWFzZXMsIGVkaXRvcjogaW5wdXQgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKGRldGFpbHMpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLnB1c2goZWxlbWVudERhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBub1RlbXBsYXRlc01lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5pZCA9ICdyZWRpcmVjdC1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2UnO1xuICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnRleHRDb250ZW50ID0gJ05vIHRlbXBsYXRlcyB3aXRoIHBhcmFtZXRlcnMgdG8gZGlzcGxheSEnO1xuICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnN0eWxlLmRpc3BsYXkgPSB0aGlzLmV4aXN0cyA/ICdub25lJyA6ICdibG9jayc7XG5cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChub1RlbXBsYXRlc01lc3NhZ2UpO1xuXG4gICAgICAgICAgICAvKiBERUZBVUxUU09SVCBpbnB1dCAqL1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCgpO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKTtcblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUodmFsdWUucmVwbGFjZUFsbCgnXycsICcgJykpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgaWNvbjogJ3JvYm90JywgbGFiZWw6ICdTdWdnZXN0JywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRNYWluVGV4dCgpLnJlcGxhY2UoLyBcXCguKlxcKSQvLCAnJyk7IC8vIFJlbW92ZSBkaXNhbWJpZ3VhdGlvblxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXMoJ1IgZnJvbSBwZXJzb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGluZyBpcyBtb2RpZmllZCBmcm9tIGV2YWQzNydzIFwiUmF0ZXJcIlxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5pbmNsdWRlcygnICcpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGdlbmVyYXRpb25hbFN1ZmZpeCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoLyAoPzpbSlNdci4/fFtJVlhdKykkLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uYWxTdWZmaXggPSBuYW1lLnNsaWNlKG5hbWUubGFzdEluZGV4T2YoJyAnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCcgJykpIHJldHVybiBuYW1lICsgZ2VuZXJhdGlvbmFsU3VmZml4O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdE5hbWUgPSBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UobmFtZS5sYXN0SW5kZXhPZignICcpICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sJC8sICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL08nLywgJ08nKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJOYW1lcyA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZignICcpKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUobGFzdE5hbWUgKyAnLCAnICsgb3RoZXJOYW1lcyArIGdlbmVyYXRpb25hbFN1ZmZpeCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld05hbWUgPSBuYW1lLnJlcGxhY2VBbGwoJ01yLicsICdNaXN0ZXInKS5yZXBsYWNlQWxsKCcmJywgJ0FuZCcpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGVhZGluZ0FydGljbGUgb2YgWydBbicsICdBJywgJ1RoZSddKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05hbWUuc3RhcnRzV2l0aChsZWFkaW5nQXJ0aWNsZSArICcgJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOYW1lID0gbmV3TmFtZS5zbGljZShsZWFkaW5nQXJ0aWNsZS5sZW5ndGggKyAxKSArICcsICcgKyBsZWFkaW5nQXJ0aWNsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobmV3TmFtZSA9PT0gbmFtZSkgbXcubm90aWZ5KFwicmVkaXJlY3QtaGVscGVyIHdhc24ndCBhYmxlIHRvIGRldGVybWluZSBhIHNvcnQga2V5IGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHBhZ2UgdGl0bGUhXCIsIHsgdHlwZTogJ3dhcm4nIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZShuZXdOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0KHRoaXMuZGVmYXVsdFNvcnRJbnB1dCwgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24sIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGBEZWZhdWx0IHNvcnQga2V5IChERUZBVUxUU09SVCkgKHNlZSA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybCgnV2lraXBlZGlhOkNhdGVnb3JpemF0aW9uI1NvcnQga2V5cycpfVwiIHRhcmdldD1cIl9ibGFua1wiPmd1aWRlbGluZTwvYT4pOmApLFxuICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIENhdGVnb3JpZXMgc2VsZWN0aW9uICovXG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQgPSBuZXcgQ2F0ZWdvcnlJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIGNhdGVnb3JpZXMgaGVyZScgfSk7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eQ2F0ZWdvcnk6LywgJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ3Nob3dpbmctdmFsdWVzJywgKHBhZ2VzOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHRoaXMuY2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhZ2UuZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QgPSBuZXcgT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQoeyBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLCBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsIGlucHV0V2lkZ2V0OiB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQgfSk7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9ICh0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHRoaXMuY2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuY2F0ZWdvcnlTZWxlY3QsIHsgbGFiZWw6ICdDYXRlZ29yaWVzOicsIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sIGFsaWduOiAndG9wJyB9KTtcblxuICAgICAgICAgICAgLyogU3VtbWFyeSBpbnB1dCAqL1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXQgPSBuZXcgT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZXNvbHZlIGRvdWJsZSByZWRpcmVjdCcgfSwgLy9cbiAgICAgICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVzb2x2ZSBzZWxmIHJlZGlyZWN0JyB9LFxuICAgICAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZW1vdmUgaW5jb3JyZWN0IHJjYXRzJyB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5zdW1tYXJ5SW5wdXQsIHsgaWQ6ICdyZWRpcmVjdC1oZWxwZXItc3VtbWFyeS1sYXlvdXQnLCBsYWJlbDogJ1N1bW1hcnk6JywgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSwgYWxpZ246ICd0b3AnIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIHRoZSBlbGVtZW50cyBpbiB0aGUgc3VibWl0IGJ1dHRvbiByb3cuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGxvYWRTdWJtaXRFbGVtZW50cygpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgIC8qIFNldHVwIHN1Ym1pdCBidXR0b24gKi9cbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU3VibWl0JywgZGlzYWJsZWQ6IHRydWUsIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10gfSk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB0aGlzLmhhbmRsZVN1Ym1pdEJ1dHRvbkNsaWNrKCkpO1xuXG4gICAgICAgICAgICAvKiBTZXR1cCBzaG93IHByZXZpZXcgYnV0dG9uICovXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cgPSBuZXcgVGVtcGxhdGVQcmV2aWV3RGlhbG9nKHsgc2l6ZTogJ2xhcmdlJyB9LCB0aGlzLnBhZ2VUaXRsZVBhcnNlZCk7XG4gICAgICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3RlbXBsYXRlUHJldmlld0RpYWxvZ10pO1xuXG4gICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU2hvdyBwcmV2aWV3JywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cuc2V0RGF0YShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVQcmV2aWV3RGlhbG9nLm9wZW4oKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBTZXR1cCBzaG93IGNoYW5nZXMgYnV0dG9uICovXG4gICAgICAgICAgICBjb25zdCBzaG93Q2hhbmdlc0RpYWxvZyA9IG5ldyBTaG93Q2hhbmdlc0RpYWxvZyh7IHNpemU6ICdsYXJnZScgfSk7XG4gICAgICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3Nob3dDaGFuZ2VzRGlhbG9nXSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTaG93IGNoYW5nZXMnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24ub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4aXN0cykgdGhpcy5wYWdlQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGUpO1xuXG4gICAgICAgICAgICAgICAgc2hvd0NoYW5nZXNEaWFsb2cuc2V0RGF0YShbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBzaG93Q2hhbmdlc0RpYWxvZy5vcGVuKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogU2V0dXAgc3luYyB0YWxrIGNoZWNrYm94ICovXG4gICAgICAgICAgICBpZiAoIXRoaXMucGFnZVRpdGxlUGFyc2VkLmlzVGFsa1BhZ2UoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudGFsa0RhdGEgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIHByb3A6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCh7IHNlbGVjdGVkOiAhIXRoaXMudGFsa0RhdGEucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3hMYXlvdXQgPSBuZXcgT08udWkuV2lkZ2V0KHsgY29udGVudDogW25ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnN5bmNUYWxrQ2hlY2tib3gsIHsgbGFiZWw6ICdTeW5jIHRhbGsgcGFnZScsIGFsaWduOiAnaW5saW5lJyB9KV0gfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFNldHVwIHBhdHJvbCBjaGVja2JveCAqL1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tTaG91bGRQcm9tcHRQYXRyb2woKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCh7IHNlbGVjdGVkOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveExheW91dCA9IG5ldyBPTy51aS5XaWRnZXQoeyBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMucGF0cm9sQ2hlY2tib3gsIHsgbGFiZWw6ICdNYXJrIGFzIHBhdHJvbGxlZCcsIGFsaWduOiAnaW5saW5lJyB9KV0gfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFNldHVwIGxheW91dCAqL1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRMYXlvdXQgPSBuZXcgT08udWkuSG9yaXpvbnRhbExheW91dCh7XG4gICAgICAgICAgICAgICAgaWQ6ICdyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dCcsXG4gICAgICAgICAgICAgICAgaXRlbXM6IFt0aGlzLnN1Ym1pdEJ1dHRvbiwgdGhpcy5zaG93UHJldmlld0J1dHRvbiwgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbiwgdGhpcy5zeW5jVGFsa0NoZWNrYm94TGF5b3V0LCB0aGlzLnBhdHJvbENoZWNrYm94TGF5b3V0XS5maWx0ZXIoQm9vbGVhbikgYXMgT08udWkuV2lkZ2V0W10sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCB0byBwYXRyb2wgdGhlIHBhZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGNoZWNrU2hvdWxkUHJvbXB0UGF0cm9sKCkge1xuICAgICAgICAgICAgY29uc3QgcGFnZVRyaWFnZU1hcmtCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmsgLm13ZS1wdC10b29sLWljb24nKSBhcyBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgIHBhZ2VUcmlhZ2VNYXJrQnV0dG9uPy5jbGljaygpO1xuICAgICAgICAgICAgcGFnZVRyaWFnZU1hcmtCdXR0b24/LmNsaWNrKCk7XG5cbiAgICAgICAgICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpICE9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGF0cm9sbGluaycpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtd2UtcHQtbWFyay1hcy1yZXZpZXdlZC1idXR0b24nKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmstYXMtdW5yZXZpZXdlZC1idXR0b24nKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7IGFjdGlvbjogJ3F1ZXJ5JywgbWV0YTogJ3VzZXJpbmZvJywgdWlwcm9wOiAncmlnaHRzJyB9IHNhdGlzZmllcyBBcGlRdWVyeVVzZXJJbmZvUGFyYW1zKSkgYXMgVXNlclBlcm1pc3Npb25zUmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgaWYgKCF1c2VyUGVybWlzc2lvbnMucXVlcnkudXNlcmluZm8ucmlnaHRzLmluY2x1ZGVzKCdwYXRyb2wnKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0cm9sUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncGFnZXRyaWFnZWxpc3QnLFxuICAgICAgICAgICAgICAgICAgICBwYWdlX2lkOiBtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcykpIGFzIFBhZ2VUcmlhZ2VMaXN0UmVzcG9uc2U7XG5cbiAgICAgICAgICAgICAgICBpZiAocGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXNbMF0/LnVzZXJfbmFtZSA9PT0gbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucmVzdWx0ICE9PSAnc3VjY2VzcycgfHwgcGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gIU51bWJlci5wYXJzZUludChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlc1swXT8ucGF0cm9sX3N0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlcyB0aGUgc3VtbWFyeSBpbnB1dCBwbGFjZWhvbGRlci5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgdXBkYXRlU3VtbWFyeSgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0VmFsdWUgPSB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgICAgIGlmICghcmVkaXJlY3RWYWx1ZSkgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gJyc7XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmV4aXN0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldENoYW5nZWQgPSByZWRpcmVjdFZhbHVlICE9PSB0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0Py5yZXBsYWNlQWxsKCdfJywgJyAnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdzQ2hhbmdlZCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuc29tZSgodGFnKSA9PiAhdGhpcy5vbGRSZWRpcmVjdFRhZ3MhLmluY2x1ZGVzKHRhZyBhcyBzdHJpbmcpKSB8fCB0aGlzLm9sZFJlZGlyZWN0VGFncyEuc29tZSgodGFnKSA9PiAhdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyh0YWcpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdBcmd1bWVudHNDaGFuZ2VkID0gdGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGFcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLnNvbWUoKHRhZykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm5hbWUgPT09IHRhZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ucGFyYW1ldGVycy5zb21lKChwYXJhbWV0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZE9sZEFyZ3VtZW50ID0gdGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEhW3RhZyBhcyBzdHJpbmddPy5maW5kKChhcmd1bWVudCkgPT4gYXJndW1lbnRbMF0gPT09IHBhcmFtZXRlci5uYW1lKT8uWzFdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kT2xkQXJndW1lbnQgPyBmb3VuZE9sZEFyZ3VtZW50ICE9PSBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdFNvcnRDaGFuZ2VkID0gdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCkudHJpbSgpICE9PSB0aGlzLm9sZERlZmF1bHRTb3J0IS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzQ2hhbmdlZCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKChjYXRlZ29yeSkgPT4gIXRoaXMub2xkQ2F0ZWdvcmllcyEuaW5jbHVkZXMoY2F0ZWdvcnkgYXMgc3RyaW5nKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRDYXRlZ29yaWVzIS5zb21lKChjYXRlZ29yeSkgPT4gIXRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyhjYXRlZ29yeSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldENoYW5nZWQpIGNoYW5nZXMucHVzaChgcmV0YXJnZXQgdG8gW1ske3JlZGlyZWN0VmFsdWV9XV1gKTtcbiAgICAgICAgICAgICAgICBpZiAodGFnc0NoYW5nZWQpIGNoYW5nZXMucHVzaCgnY2hhbmdlIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlcycpO1xuICAgICAgICAgICAgICAgIGlmICh0YWdBcmd1bWVudHNDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goJ2NoYW5nZSBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBhcmd1bWVudHMnKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFNvcnRDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goJ2NoYW5nZSBkZWZhdWx0IHNvcnQga2V5Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGNhdGVnb3JpZXNDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goJ2NoYW5nZSBjYXRlZ29yaWVzJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIGNoYW5nZXMucHVzaCgncGVyZm9ybSByZWRpcmVjdCBjbGVhbnVwJyk7XG5cbiAgICAgICAgICAgICAgICBjaGFuZ2VzWzBdID0gY2hhbmdlc1swXVswXS50b1VwcGVyQ2FzZSgpICsgY2hhbmdlc1swXS5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPiAxKSBjaGFuZ2VzW2NoYW5nZXMubGVuZ3RoIC0gMV0gPSBgYW5kICR7Y2hhbmdlcy5hdCgtMSl9YDtcblxuICAgICAgICAgICAgICAgICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlciA9IGNoYW5nZXMuam9pbihjaGFuZ2VzLmxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgICAgICAgICAgIH0gZWxzZSAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSBgQ3JlYXRlIHJlZGlyZWN0IHRvIFtbJHtyZWRpcmVjdFZhbHVlfV1dYDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyBleGlzdGluZyBwYWdlIGRhdGEuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGxvYWRFeGlzdGluZ0RhdGEoKSB7XG4gICAgICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0ID0gdGhpcy5yZWRpcmVjdFJlZ2V4LmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlsxXTtcbiAgICAgICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdzID0gKFxuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKFt0YWcsIHRhZ0RhdGFdKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RhZywgLi4udGFnRGF0YS5hbGlhc2VzXS5zb21lKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KHRoaXMucGFnZUNvbnRlbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW11cbiAgICAgICAgICAgICkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUmVkaXJlY3RUYWdzID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcylcbiAgICAgICAgICAgICAgICAuZmxhdE1hcCgoW3RhZywgdGFnRGF0YV0pID0+IFt0YWcsIC4uLnRhZ0RhdGEuYWxpYXNlc10pXG4gICAgICAgICAgICAgICAgLm1hcCgodGFnT3JSZWRpcmVjdCkgPT4gKG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KHRoaXMucGFnZUNvbnRlbnQpID8gdGFnT3JSZWRpcmVjdCA6IG51bGwpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsUmVkaXJlY3RUYWdzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ1swXS50b0xvd2VyQ2FzZSgpfSR7dGFnWzBdfV0ke3RhZy5zbGljZSgxKX1cXFxcfD8oLio/KVxcXFxzKn19YCkuZXhlYyh0aGlzLnBhZ2VDb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VGFnID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykuZmluZCgoW3RlbXBsYXRlLCB0YWdEYXRhXSkgPT4gW3RlbXBsYXRlLCAuLi50YWdEYXRhLmFsaWFzZXNdLmluY2x1ZGVzKHRhZykpPy5bMF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQXJndW1lbnRzID0gbWF0Y2g/LlsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JpZ2luYWxBcmd1bWVudHMpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRBcmd1bWVudHMgPSBtYXRjaFsxXS5zcGxpdCgnfCcpLm1hcCgoYXJndW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmd1bWVudC5pbmNsdWRlcygnPScpKSByZXR1cm4gWyhpbmRleCArIDEpLnRvU3RyaW5nKCksIGFyZ3VtZW50LnRyaW0oKV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gYXJndW1lbnQuc3BsaXQoJz0nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbmFtZS50cmltKCksIHZhbHVlLnRyaW0oKV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuZXdUYWcsIGZvcm1hdHRlZEFyZ3VtZW50c107XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgW3N0cmluZywgc3RyaW5nW11bXV1bXSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMub2xkRGVmYXVsdFNvcnQgPVxuICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgLm1hdGNoKC97e0RFRkFVTFRTT1JUOi4qP319L2cpXG4gICAgICAgICAgICAgICAgICAgID8uYXQoLTEpXG4gICAgICAgICAgICAgICAgICAgID8uc2xpY2UoMTQsIC0yKVxuICAgICAgICAgICAgICAgICAgICA/LnRyaW0oKSA/PyAnJztcblxuICAgICAgICAgICAgdGhpcy5vbGRDYXRlZ29yaWVzID0gdGhpcy5wYWdlQ29udGVudC5tYXRjaCgvXFxbXFxbW0NjXWF0ZWdvcnk6Lis/XV0vZyk/Lm1hcCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnNsaWNlKDExLCAtMikpID8/IFtdO1xuXG4gICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCA9IFtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50Lm1hdGNoKC97e3Nob3J0IGRlc2NyaXB0aW9uXFx8Lio/fX0vaSk/LlswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50Lm1hdGNoKC97e0RJU1BMQVlUSVRMRTouKj99fS8pPy5bMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudC5tYXRjaCgve3tpdGFsaWMgdGl0bGVcXHw/Lio/fX0vaSk/LlswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50Lm1hdGNoKC97e3RpdGxlIGxhbmd1YWdlXFx8Lio/fX0vKT8uWzBdLFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0KSB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUodGhpcy5vbGRSZWRpcmVjdFRhcmdldC5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICBlbHNlIG13Lm5vdGlmeSgnQ291bGQgbm90IGZpbmQgcmVkaXJlY3QgdGFyZ2V0IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUodGhpcy5vbGRSZWRpcmVjdFRhZ3MpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kVGVtcGxhdGVFZGl0b3IgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0ZW1wbGF0ZU5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghZm91bmRUZW1wbGF0ZUVkaXRvcikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBhcmd1bWVudF0gb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFBhcmFtZXRlckVkaXRvciA9IGZvdW5kVGVtcGxhdGVFZGl0b3IucGFyYW1ldGVycy5maW5kKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgLi4ucGFyYW1ldGVyLmFsaWFzZXNdLmluY2x1ZGVzKHBhcmFtZXRlck5hbWUpKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRQYXJhbWV0ZXJFZGl0b3IpIGZvdW5kUGFyYW1ldGVyRWRpdG9yLmVkaXRvci5zZXRWYWx1ZShhcmd1bWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5vbGREZWZhdWx0U29ydCkgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKHRoaXMub2xkRGVmYXVsdFNvcnQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIHRoaXMub2xkQ2F0ZWdvcmllcykgdGhpcy5jYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUoY2F0ZWdvcnkpO1xuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZSh0aGlzLm9sZENhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gKHsgZGF0YTogY2F0ZWdvcnksIGxhYmVsOiBjYXRlZ29yeSB9KSkpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSdW5zIGNoZWNrcyBvbiB0aGUgcHJvdmlkZWQgZGF0YSBhbmQgcmV0dXJucyB0aGUgZXJyb3JzIChpZiBhbnkpLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVN1Ym1pc3Npb24oKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcblxuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICBjb25zdCB0YWdzID0gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKTtcblxuICAgICAgICAgICAgLyogSW52YWxpZCBjaGFyYWN0ZXJzICovXG4gICAgICAgICAgICBpZiAoIS9eXFxzKlteW1xcXXt8fV0rXFxzKiQvLnRlc3QoZGVzdGluYXRpb24pKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcblxuICAgICAgICAgICAgLyogRmFpbGVkIGR1cmluZyB0aXRsZSBwYXJzaW5nICovXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkRGVzdGluYXRpb24gPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChkZXN0aW5hdGlvbik7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyc2VkRGVzdGluYXRpb24gJiYgZXJyb3JzLmxlbmd0aCA9PT0gMCkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG5cbiAgICAgICAgICAgIC8qIFNlbGYgcmVkaXJlY3RzICovXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJzZWREZXN0aW5hdGlvbj8udG9TdHJpbmcoKSA9PT0gdGhpcy5wYWdlVGl0bGVQYXJzZWQudG9TdHJpbmcoKSkgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnY2Fubm90IHJlZGlyZWN0IHRvIGl0c2VsZiEnIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkRhdGEgPSAoYXdhaXQgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAuZ2V0KHsgYWN0aW9uOiAncXVlcnknLCBmb3JtYXR2ZXJzaW9uOiAnMicsIHByb3A6IFsncGFnZXByb3BzJywgJ2NhdGVnb3JpZXMnXSwgdGl0bGVzOiBkZXN0aW5hdGlvbiB9IHNhdGlzZmllcyBBcGlRdWVyeVBhZ2VQcm9wc1BhcmFtcylcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8qIE5vbmV4aXN0ZW50IGRlc3RpbmF0aW9uICovIGlmIChlcnJvckNvZGUgPT09ICdtaXNzaW5ndGl0bGUnKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2RvZXMgbm90IGV4aXN0IScgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8qIE90aGVyIEFQSSBlcnJvciAqLyBlbHNlIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiBgd2FzIG5vdCBhYmxlIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgQVBJICgke2Vycm9yQ29kZX0pIWAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH0pKSBhcyAoUGFnZXByb3BzUmVzdWx0ICYgQ2F0ZWdvcmllc1Jlc3VsdCkgfCBudWxsO1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25QYXJzZVJlc3VsdCA9IChhd2FpdCB0aGlzLmFwaS5nZXQoeyBhY3Rpb246ICdwYXJzZScsIHBhZ2U6IGRlc3RpbmF0aW9uLCBwcm9wOiAnc2VjdGlvbnMnLCByZWRpcmVjdHM6IHRydWUgfSBzYXRpc2ZpZXMgQXBpUGFyc2VQYXJhbXMpKSBhcyBQYWdlUGFyc2VSZXN1bHQ7XG5cbiAgICAgICAgICAgIC8qIERvdWJsZSByZWRpcmVjdHMgKi9cbiAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnJlZGlyZWN0cz8uWzBdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25SZWRpcmVjdCA9XG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzWzBdLnRvICsgKGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzWzBdLnRvZnJhZ21lbnQgPyBgIyR7ZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5yZWRpcmVjdHNbMF0udG9mcmFnbWVudH1gIDogJycpO1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgYSByZWRpcmVjdCB0byA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybChcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUmVkaXJlY3QsXG4gICAgICAgICAgICAgICAgICAgICl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHtkZXN0aW5hdGlvblJlZGlyZWN0fTwvYT4uIFJldGFyZ2V0IHRvIHRoYXQgcGFnZSBpbnN0ZWFkLCBhcyBkb3VibGUgcmVkaXJlY3RzIGFyZW4ndCBhbGxvd2VkLmAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIE5vbmV4aXN0ZW50IHNlY3Rpb24gKi9cbiAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbi5zcGxpdCgnIycpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZFNlY3Rpb24gPSBkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnNlY3Rpb25zLmZpbmQoKHNlY3Rpb24pID0+IHNlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKSA9PT0gZGVzdGluYXRpb24uc3BsaXQoJyMnKVsxXSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkU2VjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB0byBhbmNob3InKSkgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnaXMgdGFnZ2VkIGFzIGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yLCBidXQgaXQgaXMgYWN0dWFsbHkgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24hJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKCdSIHRvIHNlY3Rpb24nKSkgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24sIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHRvIHNlY3Rpb259fTwvY29kZT4hJyB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbnRlbnQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFyc2VkRGVzdGluYXRpb24hLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgKS5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvcnMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hdGNoKC8oPzw9e3tcXHMqP1tBYV0oPzpuY2hvcnM/fG5jaG9yIGZvciByZWRpcmVjdHxua2VyfE5DSE9SfG5jKVxccyo/XFx8KS4rPyg/PX19KS9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubWFwKChhbmNob3I6IHN0cmluZykgPT4gYW5jaG9yLnNwbGl0KCd8JykubWFwKChwYXJ0KSA9PiBwYXJ0LnRyaW0oKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5mbGF0KCkgPz8gW10pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaCgvKD88PXt7XFxzKj8oPzpbVnZdKD86aXNpYmxlIGFuY2hvcnM/fGlzYW5jfEFuY2h8YW5jaG9yfGlzaWJsZWFuY2hvcnxhKXxbQWFdKD86bmNob3JkfGNob3JlZHxuY2hvclxcKyl8W1R0XWV4dCBhbmNob3IpXFxzKj9cXHwpLis/KD89KD88ISF8PSl9fSkvZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCd8JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocGFydCkgPT4gIS9edGV4dFxccyo/PS8udGVzdChwYXJ0KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uZmxhdCgpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnQubWF0Y2goLyg/PD1pZD0pXCI/Lis/KD89XCJ8PnxcXHwpL2cpPy5tYXAoKGFuY2hvcjogc3RyaW5nKSA9PiBhbmNob3IudHJpbSgpKSA/PyBbXSksXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbmNob3JzLmluY2x1ZGVzKGRlc3RpbmF0aW9uLnNwbGl0KCcjJylbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykpIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIHRhZ2dlZCBhcyBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiwgYnV0IGl0IGlzIGFjdHVhbGx5IGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yIScgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhZ3MuaW5jbHVkZXMoJ1IgdG8gYW5jaG9yJykpIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiBmcm9tIGFuY2hvcn19PC9jb2RlPiEnIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiBgaXMgYSByZWRpcmVjdCB0byA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybChkZXN0aW5hdGlvbil9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHtkZXN0aW5hdGlvbn08L2E+LCBidXQgdGhhdCBzZWN0aW9uIG9yIGFuY2hvciBkb2VzIG5vdCBleGlzdCFgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogSW1wcm9wZXJseSB0YWdnZWQgYXMgcmVkaXJlY3QgdG8gc2VjdGlvbi9hbmNob3IgKi9cbiAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbi5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSAmJiAodGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykgfHwgdGFncy5pbmNsdWRlcygnUiB0byBhbmNob3InKSkpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnaXMgbm90IGEgcmVkaXJlY3QgdG8gYSBzZWN0aW9uL2FuY2hvciwgYnV0IGl0IGlzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiBmcm9tIHNlY3Rpb259fTwvY29kZT4gb3IgPGNvZGU+e3tSIGZyb20gYW5jaG9yfX08L2NvZGU+IScgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlID0gISEoZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5wYWdlcHJvcHMgJiYgJ2Rpc2FtYmlndWF0aW9uJyBpbiBkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnBhZ2Vwcm9wcyk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRJc1N1cm5hbWVMaXN0ID0gISEoZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5jYXRlZ29yaWVzICYmIGRlc3RpbmF0aW9uRGF0YSEucXVlcnkucGFnZXNbMF0uY2F0ZWdvcmllcy5zb21lKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkudGl0bGUgPT09ICdDYXRlZ29yeTpTdXJuYW1lcycpKTtcblxuICAgICAgICAgICAgY29uc3QgdG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzID0gWydSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2UnLCAnUiBmcm9tIGluY29tcGxldGUgZGlzYW1iaWd1YXRpb24nXTtcbiAgICAgICAgICAgIGNvbnN0IHRvU3VybmFtZUxpc3RUYWdzID0gWydSIGZyb20gYW1iaWd1b3VzIHNvcnQgbmFtZScsICdSIGZyb20gYW1iaWd1b3VzIHRlcm0nXTtcblxuICAgICAgICAgICAgY29uc3QgdGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlID0gdG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzLnNvbWUoKHRlbXBsYXRlKSA9PiB0YWdzLmluY2x1ZGVzKHRlbXBsYXRlKSk7XG4gICAgICAgICAgICBjb25zdCB0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdCA9IHRvU3VybmFtZUxpc3RUYWdzLnNvbWUoKHRlbXBsYXRlKSA9PiB0YWdzLmluY2x1ZGVzKHRlbXBsYXRlKSk7XG5cbiAgICAgICAgICAgIC8qIFJlZGlyZWN0IHRvIGRpc2FtYmlndWF0aW9uIHBhZ2Ugd2l0aG91dCB0ZW1wbGF0ZSAqL1xuICAgICAgICAgICAgaWYgKHRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlICYmICF0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgJiYgIXRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0KVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBkaXNhbWJpZ3VhdGlvbiBwYWdlLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIGEgZGlzYW1iaWd1YXRpb24gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUhJyB9KTtcblxuICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uRGF0YSEucXVlcnkucGFnZXNbMF0ucGFnZXByb3BzICYmICF0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSkge1xuICAgICAgICAgICAgICAgIC8qIEltcHJvcGVybHkgdGFnZ2VkIGFzIHJlZGlyZWN0IHRvIGRpc2FtYmlndWF0aW9uIHBhZ2UgKi9cbiAgICAgICAgICAgICAgICBpZiAodGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlKSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdpcyBub3QgYSByZWRpcmVjdCB0byBhIGRpc2FtYmlndWF0aW9uIHBhZ2UsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCBhIGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScgfSk7XG5cbiAgICAgICAgICAgICAgICAvKiBSZWRpcmVjdCB0byBzdXJuYW1lIGxpc3Qgd2l0aG91dCB0ZW1wbGF0ZSAqL1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRJc1N1cm5hbWVMaXN0ICYmICF0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdClcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhIHN1cm5hbWUgbGlzdCwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCBhIGNvcnJlY3QgZGlzYW1iaWd1YXRpb24gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUhJyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoge3tSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2V9fSB3aXRob3V0IFwiIChkaXNhbWJpZ3VhdGlvbilcIiBhdCBlbmQgb2YgdGl0bGUgKi9cbiAgICAgICAgICAgIGlmICh0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSAmJiB0YWdzLmluY2x1ZGVzKCdSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2UnKSAmJiAhdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0TWFpblRleHQoKS5lbmRzV2l0aCgnIChkaXNhbWJpZ3VhdGlvbiknKSlcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAnaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2V9fTwvY29kZT4sIGJ1dCB0aGlzIHRpdGxlIGRvZXMgbm90IGVuZCB3aXRoIFwiIChkaXNhbWJpZ3VhdGlvbilcIi4gVXNlIDxjb2RlPnt7UiBmcm9tIGFtYmlndW91cyB0ZXJtfX08L2NvZGU+IG9yIGEgc2ltaWxhciBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBpbnN0ZWFkIScsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIFRhZ2dlZCB3aXRoIGEgcHJvdGVjdGlvbiB0ZW1wbGF0ZSAqL1xuICAgICAgICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiBbJ1Igc2VtaS1wcm90ZWN0ZWQnLCAnUiBleHRlbmRlZC1wcm90ZWN0ZWQnLCAnUiB0ZW1wbGF0ZS1wcm90ZWN0ZWQnLCAnUiBmdWxseSBwcm90ZWN0ZWQnXSlcbiAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogYGlzIHRhZ2dlZCB3aXRoIHVubmVjZXNzYXJpbHkgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RlbXBsYXRlfX19PC9jb2RlPiB3aGljaCB3aWxsIGJlIGR1cGxpY2F0ZWQgYnkgdGhlIHJlZGlyZWN0IGNhdGVnb3J5IHNoZWxsIWAgfSk7XG5cbiAgICAgICAgICAgIC8qIExpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0gd2l0aG91dCBiZWluZyB0YWdnZWQgd2l0aCB7e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX0gKi9cbiAgICAgICAgICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z1dpa2liYXNlSXRlbUlkJykgJiYgIXRhZ3MuaW5jbHVkZXMoJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJykpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiBcImlzIGxpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0gYnV0IGl0IGlzbid0IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fTwvY29kZT4hXCIgfSk7XG5cbiAgICAgICAgICAgIC8qIFRhZ2dlZCB3aXRoIHt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fSB3aXRob3V0IGJlaW5nIGxpbmtlZCB0byBhbiBpdGVtICovXG4gICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nKSAmJiAhbXcuY29uZmlnLmdldCgnd2dXaWtpYmFzZUl0ZW1JZCcpKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fTwvY29kZT4gYnV0IGl0IGlzIG5vdCBhY3R1YWxseSBsaW5rZWQgdG8gYSBXaWtpZGF0YSBpdGVtIScgfSk7XG5cbiAgICAgICAgICAgIC8qIFN5bmNpbmcgdGFsayBwYWdlIGJ1dCB0YWxrIHBhZ2UgZXhpc3RzIGFuZCBpc24ndCBhIHJlZGlyZWN0ICovXG4gICAgICAgICAgICBpZiAodGhpcy5zeW5jVGFsa0NoZWNrYm94Py5pc1NlbGVjdGVkKCkgJiYgIXRoaXMudGFsa0RhdGEhLnF1ZXJ5LnBhZ2VzWzBdLm1pc3NpbmcgJiYgIXRoaXMudGFsa0RhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0KVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgdGl0bGU6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLCBtZXNzYWdlOiAnZXhpc3RzLCBidXQgaXMgbm90IGEgcmVkaXJlY3QhJyB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYW5kbGVzIHRoZSBldmVudCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgXCJTdWJtaXRcIiBidXR0b24uXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGhhbmRsZVN1Ym1pdEJ1dHRvbkNsaWNrKCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNUb0Rpc2FibGUgPSBbXG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LFxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LFxuICAgICAgICAgICAgICAgIC4uLnRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5mbGF0TWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyLmVkaXRvcikpLFxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dCxcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LFxuICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0LFxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3gsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCxcbiAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNUb0Rpc2FibGUpIChlbGVtZW50IGFzIE9PLnVpLldpZGdldCkuc2V0RGlzYWJsZWQodHJ1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdDaGVja2luZyB0YXJnZXQgdmFsaWRpdHkuLi4nKTtcblxuICAgICAgICAgICAgbGV0IGVycm9yczogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLnZhbGlkYXRlU3VibWlzc2lvbj4+ID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy5uZWVkc0NoZWNrKSBlcnJvcnMgPSBhd2FpdCB0aGlzLnZhbGlkYXRlU3VibWlzc2lvbigpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkpO1xuXG4gICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJlZGlyZWN0LWhlbHBlci13YXJuaW5nJykpIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB7IHRpdGxlLCBtZXNzYWdlIH0gb2YgZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGl0bGUgPyBgPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwodGl0bGUpfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7dGl0bGV9PC9hPmAgOiAnVGhpcyBwYWdlJ30gJHttZXNzYWdlfSBDbGljayBhZ2FpbiB3aXRob3V0IG1ha2luZyBjaGFuZ2VzIHRvIHN1Ym1pdCBhbnl3YXkuYCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FybmluZ01lc3NhZ2UgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICdlcnJvcicsIGNsYXNzZXM6IFsncmVkaXJlY3QtaGVscGVyLXdhcm5pbmcnXSwgaW5saW5lOiB0cnVlLCBsYWJlbCB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXS5hcHBlbmQod2FybmluZ01lc3NhZ2UuJGVsZW1lbnRbMF0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50c1RvRGlzYWJsZSkgKGVsZW1lbnQgYXMgT08udWkuV2lkZ2V0KS5zZXREaXNhYmxlZChmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0IGFueXdheScpO1xuICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBFZGl0L2NyZWF0ZSByZWRpcmVjdCAqL1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoYCR7dGhpcy5leGlzdHMgPyAnRWRpdGluZycgOiAnQ3JlYXRpbmcnfSByZWRpcmVjdC4uLmApO1xuXG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0LFxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSAodGhpcy5zdW1tYXJ5SW5wdXQuZ2V0VmFsdWUoKSB8fCAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIpICsgdGhpcy5zY3JpcHRBZHZlcnQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKHRoaXMucGFnZVRpdGxlLCBvdXRwdXQsIHN1bW1hcnkpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybjtcblxuICAgICAgICAgICAgbXcubm90aWZ5KGBSZWRpcmVjdCAke3RoaXMuZXhpc3RzID8gJ2VkaXRlZCcgOiAnY3JlYXRlZCd9IHN1Y2Nlc3NmdWxseSFgLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcblxuICAgICAgICAgICAgLyogU3luYyB0YWxrIHBhZ2UgY2hlY2tib3ggaGFuZGxlciAqL1xuICAgICAgICAgICAgaWYgKHRoaXMuc3luY1RhbGtDaGVja2JveD8uaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ0VkaXRpbmcgdGFsayBwYWdlLi4uJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tTW92ZSA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXMoJ1IgZnJvbSBtb3ZlJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmNyZWF0ZU91dHB1dCh0aGlzLnBhcnNlZERlc3RpbmF0aW9uIS5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSwgZnJvbU1vdmUgPyBbJ1IgZnJvbSBtb3ZlJ10gOiBbXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFtdKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRhbGtSZXN1bHQgPSBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZSh0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSwgb3V0cHV0LCAnU3luY2luZyByZWRpcmVjdCBmcm9tIG1haW4gcGFnZScgKyB0aGlzLnNjcmlwdEFkdmVydCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YWxrUmVzdWx0KSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBtdy5ub3RpZnkoJ1RhbGsgcGFnZSBzeW5jZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBQYXRyb2wgY2hlY2tib3ggaGFuZGxlciAqL1xuICAgICAgICAgICAgaWYgKHRoaXMucGF0cm9sQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdQYXRyb2xsaW5nIHJlZGlyZWN0Li4uJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXRyb2xMaW5rOiBIVE1MQW5jaG9yRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGF0cm9sbGluayBhJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFya1Jldmlld2VkQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrLWFzLXJldmlld2VkLWJ1dHRvbicpIGFzIEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChwYXRyb2xMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdHJvbFJlc3VsdCA9IGF3YWl0IHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgICAgICAucG9zdFdpdGhUb2tlbigncGF0cm9sJywgeyBhY3Rpb246ICdwYXRyb2wnLCByY2lkOiBuZXcgVVJMKHBhdHJvbExpbmsuaHJlZikuc2VhcmNoUGFyYW1zLmdldCgncmNpZCcpISB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYEVycm9yIHBhdHJvbGxpbmcgJHt0aGlzLnBhZ2VUaXRsZX0gdmlhIEFQSTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGF0cm9sUmVzdWx0KSBtdy5ub3RpZnkoJ1JlZGlyZWN0IHBhdHJvbGxlZCBzdWNjZXNzZnVsbHkhJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXJrUmV2aWV3ZWRCdXR0b24pIHtcbiAgICAgICAgICAgICAgICAgICAgbWFya1Jldmlld2VkQnV0dG9uLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeSgnUmVkaXJlY3QgcGF0cm9sbGVkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgbXcubm90aWZ5KCdQYWdlIGN1cmF0aW9uIHRvb2xiYXIgbm90IGZvdW5kLCByZWRpcmVjdCBjYW5ub3QgYmUgcGF0cm9sbGVkIScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ0NvbXBsZXRlLCByZWxvYWRpbmcuLi4nKTtcblxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBtdy51dGlsLmdldFVybCh0aGlzLnBhZ2VUaXRsZSwgeyByZWRpcmVjdDogJ25vJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFRha2VzIHByb3ZpZGVkIHZhbHVlcyB0byBjcmVhdGUgdGhlIHBhZ2Ugb3V0cHV0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBjcmVhdGVPdXRwdXQodGFyZ2V0OiBzdHJpbmcsIHRhZ3M6IHN0cmluZ1tdLCBzdHJheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGVmYXVsdFNvcnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2F0ZWdvcmllczogc3RyaW5nW10pIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRhcmdldCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFRpdGxlID0gcGFyc2VkVGFyZ2V0XG4gICAgICAgICAgICAgICAgPyBgJHtwYXJzZWRUYXJnZXQuZ2V0TmFtZXNwYWNlSWQoKSA9PT0gMTQgPyAnOicgOiAnJ30ke3BhcnNlZFRhcmdldC5nZXRQcmVmaXhlZFRleHQoKX0ke3BhcnNlZFRhcmdldC5nZXRGcmFnbWVudCgpID8gYCMke3BhcnNlZFRhcmdldC5nZXRGcmFnbWVudCgpfWAgOiAnJ31gXG4gICAgICAgICAgICAgICAgOiB0YXJnZXQudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWRcbiAgICAgICAgICAgICAgICAgICAgLmdldE1haW5UZXh0KClcbiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoL1tcXHUwMzAwLVxcdTAzNkZdL2csICcnKSA9PT1cbiAgICAgICAgICAgICAgICBkZWZhdWx0U29ydFxuICAgICAgICAgICAgICAgICAgICA/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoL1tcXHUwMzAwLVxcdTAzNkZdL2csICcnKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGRlZmF1bHRTb3J0ID0gdW5kZWZpbmVkOyAvLyBDaGVjayBpZiB0aXRsZXMgbm9ybWFsaXplIHRvIHRoZSBzYW1lIHRleHQsIGFuZCByZW1vdmVzIHRoZSBERUZBVUxUU09SVCBpZiBzb1xuXG4gICAgICAgICAgICBjb25zdCB0YWdzV2l0aEFyZ3VtZW50cyA9IHRhZ3MubWFwKCh0YWcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZEFyZ3VtZW50RWRpdG9yID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kQXJndW1lbnRFZGl0b3IpIHJldHVybiBge3ske3RhZ319fWA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRBcmd1bWVudHMgPSBmb3VuZEFyZ3VtZW50RWRpdG9yLnBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgfCR7cGFyYW1ldGVyLm5hbWUgPT09IChpbmRleCArIDEpLnRvU3RyaW5nKCkgPyAnJyA6IGAke3BhcmFtZXRlci5uYW1lfT1gfSR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYHt7JHt0YWd9JHttYXBwZWRBcmd1bWVudHN9fX1gO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgYCNSRURJUkVDVCBbWyR7Zm9ybWF0dGVkVGl0bGV9XV1cXG5gLCAvL1xuICAgICAgICAgICAgICAgIHRhZ3MubGVuZ3RoID4gMCA/IGB7e1JlZGlyZWN0IGNhdGVnb3J5IHNoZWxsfFxcbiR7dGFnc1dpdGhBcmd1bWVudHMuam9pbignXFxuJyl9XFxufX1cXG5gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzdHJheVRleHQgPyBzdHJheVRleHQgKyAnXFxuJyA6IG51bGwsXG4gICAgICAgICAgICAgICAgZGVmYXVsdFNvcnQgPyBge3tERUZBVUxUU09SVDoke2RlZmF1bHRTb3J0LnRyaW0oKX19fWAgOiBudWxsLFxuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXMubGVuZ3RoID4gMCA/IGNhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gYFtbQ2F0ZWdvcnk6JHtjYXRlZ29yeX1dXWApLmpvaW4oJ1xcbicpIDogbnVsbCxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoZXMgdGhlIGNvbnRlbnQgb2YgYSBnaXZlbiBwYWdlLlxuICAgICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIHRvIGZldGNoLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBnZXRQYWdlQ29udGVudCh0aXRsZTogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlczogdGl0bGUsXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVkaXRzIG9yIGNyZWF0ZXMgYSBwYWdlIHdpdGggZ2l2ZW4gdGV4dC5cbiAgICAgICAgICogQHBhcmFtIHRpdGxlIFRoZSBwYWdlIHRpdGxlLlxuICAgICAgICAgKiBAcGFyYW0gdGV4dCBUaGUgcGFnZSB0ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gc3VtbWFyeSBUaGUgZWRpdCBzdW1tYXJ5LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBlZGl0T3JDcmVhdGUodGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nLCBzdW1tYXJ5OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVxuICAgICAgICAgICAgICAgIC5lZGl0KHRpdGxlLCAoKSA9PiAoeyB0ZXh0LCBzdW1tYXJ5IH0pKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9ySW5mbzogTWVkaWFXaWtpRGF0YUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdub2NyZWF0ZS1taXNzaW5nJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaS5jcmVhdGUodGl0bGUsIHsgc3VtbWFyeSB9LCB0ZXh0KS5jYXRjaCgoZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9ySW5mbzogTWVkaWFXaWtpRGF0YUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBFcnJvciBjcmVhdGluZyAke3RpdGxlfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgRXJyb3IgZWRpdGluZyBvciBjcmVhdGluZyAke3RpdGxlfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXcgUmVkaXJlY3RIZWxwZXIoKS5ydW4oKTtcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O2FBNkNBLEdBQUcsT0FBTyxNQUFNLENBQUMsaUJBQWtCLGVBQWdCLGtCQUFtQixrQkFBbUIsOEJBQThCLEVBQUcsSUFBTSxDQU01SCxNQUFNQSxVQUE0QixHQUFHLEdBQUcsZUFBZ0IsQ0FPcEQsWUFBWUMsRUFBNkJDLEVBQTJCLENBQ2hFLE1BQU1ELENBQU0sRUFOaEIsS0FBUSxJQUFNLElBQUksR0FBRyxJQVlyQixzQkFBbUIsSUFBTSxDQUNyQixNQUFNRSxFQUFRLEtBQUssU0FBUyxFQUN0QkMsRUFBVyxFQUFFLFNBQVMsRUFFNUIsR0FBSSxDQUFDRCxFQUFPQyxFQUFTLFFBQVEsQ0FBQyxDQUFDLFVBQ3RCRCxFQUFNLFNBQVMsR0FBRyxFQUFHLENBQzFCLE1BQU1FLEVBQVFGLEVBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUVoQyxLQUFLLElBQ0EsSUFBSSxDQUFFLE9BQVEsUUFBUyxLQUFNRSxFQUFPLEtBQU0sV0FBWSxVQUFXLEVBQUssQ0FBMEIsRUFDaEcsTUFBTSxJQUFNLElBQUksRUFDaEIsS0FBTUMsR0FBbUMsQ0FDdEMsR0FBSUEsRUFBUSxDQUNSLE1BQU1DLEVBQWtCRCxFQUFPLE1BQU0sU0FBUyxPQUFRRSxHQUNsREEsRUFBUSxLQUNILFlBQVksRUFDWixXQUFXLFVBQVcsRUFBRSxFQUN4QixXQUFXTCxFQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FDckQsRUFDQUMsRUFBUyxRQUNMRyxFQUFnQixJQUFLQyxJQUFhLENBQzlCLEtBQU0sR0FBR0YsRUFBTyxNQUFNLEtBQUssSUFBSUUsRUFBUSxLQUFLLFdBQVcsVUFBVyxFQUFFLENBQUMsR0FDckUsTUFBTyxHQUFHRixFQUFPLE1BQU0s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bnB1dFdpZGdldCIsICJjb25maWciLCAicGFnZVRpdGxlUGFyc2VkIiwgInZhbHVlIiwgImRlZmVycmVkIiwgInRpdGxlIiwgInJlc3VsdCIsICJtYXRjaGVkU2VjdGlvbnMiLCAic2VjdGlvbiIsICJwYXJzZWRUaXRsZSIsICJwYWdlIiwgInJlc3BvbnNlIiwgImRhdGEiLCAibGFiZWwiLCAiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJwYWdlcyIsICJjYXRlZ29yeSIsICJ0aXRsZVdpdGhvdXROYW1lc3BhY2UiLCAiVGVtcGxhdGVQcmV2aWV3RGlhbG9nIiwgInRhZ3NDb250ZW50IiwgImNhdGVnb3JpZXNDb250ZW50IiwgInBhbmVsTGF5b3V0IiwgImFjdGlvbiIsICJTaG93Q2hhbmdlc0RpYWxvZyIsICJvbGRUZXh0IiwgIm5ld1RleHQiLCAiY29tcGFyaXNvbiIsICJub0NoYW5nZXNFbGVtZW50IiwgIlJlZGlyZWN0SGVscGVyIiwgInBhZ2VJbmZvIiwgImRpYWxvZ0luZm8iLCAiYnV0dG9uIiwgIlJlZGlyZWN0SGVscGVyRGlhbG9nIiwgInBvcnRsZXRMaW5rIiwgImV2ZW50IiwgInJlZGlyZWN0VGVtcGxhdGVzIiwgImNvbnRlbnRUZXh0IiwgInBhZ2VUaXRsZSIsICJleGlzdHMiLCAibWFpblBhZ2VDb250ZW50IiwgInRhcmdldCIsICJ0YWdPclJlZGlyZWN0IiwgInRhZyIsICJzb3J0ZWRUYWdzIiwgImEiLCAiYiIsICJlZGl0b3JJbmZvIiwgInNob3duVGVtcGxhdGVFZGl0b3JzIiwgIm5vVGVtcGxhdGVzTWVzc2FnZSIsICJzdW1tYXJ5RWxlbWVudCIsICJ0ZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVEYXRhIiwgInBhcmFtZXRlcnMiLCAiZGV0YWlscyIsICJzdW1tYXJ5IiwgImVsZW1lbnREYXRhIiwgInBhcmFtZXRlck5hbWUiLCAicGFyYW1ldGVyRGF0YSIsICJpbnB1dCIsICJpbnB1dExheW91dCIsICJuYW1lIiwgImdlbmVyYXRpb25hbFN1ZmZpeCIsICJsYXN0TmFtZSIsICJvdGhlck5hbWVzIiwgIm5ld05hbWUiLCAibGVhZGluZ0FydGljbGUiLCAid2luZG93TWFuYWdlciIsICJ0ZW1wbGF0ZVByZXZpZXdEaWFsb2ciLCAic2hvd0NoYW5nZXNEaWFsb2ciLCAicGFnZVRyaWFnZU1hcmtCdXR0b24iLCAicGF0cm9sUmVzcG9uc2UiLCAicmVkaXJlY3RWYWx1ZSIsICJ0YXJnZXRDaGFuZ2VkIiwgInRhZ3NDaGFuZ2VkIiwgInRhZ0FyZ3VtZW50c0NoYW5nZWQiLCAidGVtcGxhdGUiLCAicGFyYW1ldGVyIiwgImZvdW5kT2xkQXJndW1lbnQiLCAiYXJndW1lbnQiLCAiZGVmYXVsdFNvcnRDaGFuZ2VkIiwgImNhdGVnb3JpZXNDaGFuZ2VkIiwgImNoYW5nZXMiLCAidGFnRGF0YSIsICJvcmlnaW5hbFJlZGlyZWN0VGFncyIsICJtYXRjaCIsICJuZXdUYWciLCAiZm9ybWF0dGVkQXJndW1lbnRzIiwgImluZGV4IiwgImZvdW5kVGVtcGxhdGVFZGl0b3IiLCAiZm91bmRQYXJhbWV0ZXJFZGl0b3IiLCAiZXJyb3JzIiwgImRlc3RpbmF0aW9uIiwgInRhZ3MiLCAiZGVzdGluYXRpb25EYXRhIiwgImVycm9yQ29kZSIsICJkZXN0aW5hdGlvblBhcnNlUmVzdWx0IiwgImRlc3RpbmF0aW9uUmVkaXJlY3QiLCAiZGVzdGluYXRpb25Db250ZW50IiwgImFuY2hvciIsICJwYXJ0IiwgInRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlIiwgInRhcmdldElzU3VybmFtZUxpc3QiLCAidG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzIiwgInRvU3VybmFtZUxpc3RUYWdzIiwgInRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSIsICJ0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdCIsICJlbGVtZW50c1RvRGlzYWJsZSIsICJlbGVtZW50IiwgIm1lc3NhZ2UiLCAid2FybmluZ01lc3NhZ2UiLCAib3V0cHV0IiwgImZyb21Nb3ZlIiwgInBhdHJvbExpbmsiLCAibWFya1Jldmlld2VkQnV0dG9uIiwgImVycm9ySW5mbyIsICJzdHJheVRleHQiLCAiZGVmYXVsdFNvcnQiLCAiY2F0ZWdvcmllcyIsICJwYXJzZWRUYXJnZXQiLCAiZm9ybWF0dGVkVGl0bGUiLCAidGFnc1dpdGhBcmd1bWVudHMiLCAiZm91bmRBcmd1bWVudEVkaXRvciIsICJtYXBwZWRBcmd1bWVudHMiLCAidGV4dCJdCn0K