Jump to content

User:Eejit43/scripts/redirect-helper.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Eejit43 (talk | contribs) at 00:35, 18 April 2024 (Syncing script from GitHub (via script)). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <nowiki>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/redirect-helper.ts

"use strict";mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows","oojs-ui.styles.icons-content","oojs-ui.styles.icons-editing-core"],()=>{class x 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 i=t.split("#")[0];this.api.get({action:"parse",page:i,prop:"sections",redirects:!0}).catch(()=>null).then(o=>{if(o){const s=o.parse.sections.filter(r=>r.line.toLowerCase().replaceAll(/<\/?i>/g,"").startsWith(t.split("#")[1].toLowerCase()));e.resolve(s.map(r=>({data:`${o.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`,label:`${o.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`})))}else e.resolve([])})}else{const i=mw.Title.newFromText(t);this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:i?.getNamespaceId()??0,gapprefix:i?.getMainText()??t,generator:"allpages",prop:["info","pageprops"]}).catch(()=>null).then(o=>{o?e.resolve(o.query?.pages?o.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:i})=>new OO.ui.MenuOptionWidget({data:e,label:i}));OO.ui.mixin.LookupElement.call(this,t),this.pageTitleParsed=e}}Object.assign(x.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 i=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:i?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(o=>{if(o?.query?.pages){const s=o.query.pages.filter(r=>!r.categories?.some(l=>l.title==="Category:Wikipedia soft redirected categories")).map(r=>{const l=r.title.split(":")[1];return{data:l,label:l}});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:i})=>new OO.ui.MenuOptionWidget({data:e,label:i}));OO.ui.mixin.LookupElement.call(this,t)}}Object.assign(O.prototype,OO.ui.mixin.LookupElement.prototype);class h extends OO.ui.ProcessDialog{constructor(t,e){super(t);this.api=new mw.Api;this.getSetupProcess=()=>h.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,i=t.parse.categorieshtml,o=new OO.ui.PanelLayout({padded:!0,expanded:!1});o.$element.append(e,i),this.$body.append(o.$element)}));this.getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):h.super.prototype.getActionProcess.call(this,t);this.getTeardownProcess=()=>h.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});this.pageTitleParsed=e,h.static.name="TemplatePreviewDialog",h.static.title="Redirect categorization templates preview",h.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}}Object.assign(h.prototype,OO.ui.ProcessDialog.prototype);class f extends OO.ui.ProcessDialog{constructor(t){super(t);this.api=new mw.Api;this.getSetupProcess=()=>f.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(i=>{const o=i.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(o?`
<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>
        ${o}
    </tbody>
</table>`:s.$element[0]),this.$body.append(r.$element)})});this.getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):f.super.prototype.getActionProcess.call(this,t);this.getTeardownProcess=()=>f.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});f.static.name="ShowChangesDialog",f.static.title="Changes to be made",f.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}}Object.assign(f.prototype,OO.ui.ProcessDialog.prototype);class v{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 a=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(a.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 b(t,!1).load()}),this.contentText.prepend(e.$element[0])}else if(a.query.pages[0].redirect)new b(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",i=>{i.preventDefault(),new b(t,!1).load(),window.scrollTo({top:0,behavior:"smooth"}),e.remove()})}}}class b{constructor({redirectTemplates:a,contentText:t,pageTitle:e,pageTitleParsed:i},o){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=a,this.contentText=t,this.pageTitle=e,this.pageTitleParsed=i,this.exists=o}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-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;
}

.redirect-helper-autofix-button {
    margin-left: 5px;
    font-size: 12px;
}

.redirect-helper-autofix-button a {
    padding: 3px 4px !important;
    min-height: unset !important;
}`),mw.loader.addLinkTag("https://www.mediawiki.org/w/load.php?modules=mediawiki.diff.styles&only=styles"),this.editorBox=new OO.ui.PanelLayout({id:"redirect-helper-box",padded:!0,expanded:!1,framed:!0}),this.pageTitleParsed.isTalkPage()&&(await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getSubjectPage().getPrefixedText()})).query.pages[0].redirect&&await this.loadSyncWithMainButton(),this.loadInputElements(),await this.loadSubmitElements(),this.editorBox.$element[0].append(...[this.syncWithMainButton?.$element?.[0],this.redirectInputLayout.$element[0],this.tagSelectLayout.$element[0],this.templateParametersEditor,this.defaultSortInputLayout.$element[0],this.categorySelectLayout.$element[0],this.summaryInputLayout.$element[0],this.submitLayout.$element[0]].filter(Boolean)),this.contentText.prepend(this.editorBox.$element[0]),this.exists&&this.loadExistingData()}async loadSyncWithMainButton(){const a=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(a)?.[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(i=>new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\s*(\\||}})`).test(a))&&this.tagSelect.setValue(["R from move"])})}loadInputElements(){this.redirectInput=new x({placeholder:"Target page name",required:!0},this.pageTitleParsed),this.redirectInput.on("change",()=>{let e=this.redirectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),e=e.replace(/^:/,""),e.length>0?(this.redirectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," ")),this.defaultSortSuggestButton.setDisabled(!1),this.submitButton.setDisabled(!1),this.showPreviewButton.setDisabled(!1),this.showChangesButton.setDisabled(!1)):(this.defaultSortSuggestButton.setDisabled(!0),this.submitButton.setDisabled(!0),this.showPreviewButton.setDisabled(!0),this.showChangesButton.setDisabled(!0)),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.redirectInputLayout=new OO.ui.FieldLayout(this.redirectInput,{label:"Redirect target:",classes:["redirect-input-layout"],align:"top"}),this.tagSelect=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.keys(this.redirectTemplates).map(e=>({data:e,label:e}))}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",()=>{const e=this.tagSelect.getValue().sort((o,s)=>o.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 o of this.templateEditorsInfo)o.details.style.display="none";let i=0;for(const o of this.tagSelect.getValue()){const s=this.templateEditorsInfo.find(r=>r.name===o);s&&(s.details.style.display="block",i++)}a.textContent=`Template parameters (${i>0?`for ${i} template${i>1?"s":""}`:"none to show"})`,t.style.display=i>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 a=document.createElement("summary");a.textContent="Template parameters (none to show)",this.templateParametersEditor.append(a);for(const[e,i]of Object.entries(this.redirectTemplates)){const o=Object.entries(i.parameters);if(o.length===0)continue;const s=document.createElement("details");s.style.display="none";const r=document.createElement("summary");r.textContent=e,s.append(r);const l={name:e,details:s,parameters:[]};for(const[u,c]of o){const g=new OO.ui.TextInputWidget({placeholder:c.default?.toString(),required:c.required});g.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});const n=new OO.ui.FieldLayout(g,{label:new OO.ui.HtmlSnippet(`${u}${!c.label||u.toLowerCase()===c.label?.toLowerCase()?"":` (${c.label})`}${c.description?` (${c.description})`:""} (type: ${c.type}) ${c.suggested?" (suggested)":""}${c.example?` (example: "${c.example}")`:""}`),align:"inline"});s.append(n.$element[0]),l.parameters.push({name:u,aliases:c.aliases,editor:g})}this.templateParametersEditor.append(s),this.templateEditorsInfo.push(l)}const t=document.createElement("div");t.id="redirect-helper-no-templates-message",t.textContent="No templates with parameters to display!",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(["R from person","R from birth name","R from fictional character"].some(i=>this.tagSelect.getValue().includes(i))){if(!e.includes(" "))return;let i="";if(/ (?:[JS]r.?|[IVX]+)$/.test(e)&&(i=e.slice(e.lastIndexOf(" ")),e=e.slice(0,e.lastIndexOf(" ")),!e.includes(" ")))return e+i;const o=e.slice(e.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),s=e.slice(0,e.lastIndexOf(" "));this.defaultSortInput.setValue(o+", "+s+i)}else{let i=e.replaceAll("Mr.","Mister").replaceAll("&","And");for(const o of["An","A","The"])if(i.startsWith(o+" ")){i=i.slice(o.length+1)+", "+o;break}i===e?mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"}):this.defaultSortInput.setValue(i)}}),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 i of e)this.categorySelect.addAllowedValue(i.data)}),this.categorySelect=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:this.categorySelectInput}),this.categorySelect.on("change",()=>{const e=this.categorySelect.getValue().sort((i,o)=>i.toLowerCase().localeCompare(o.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 a=new OO.ui.WindowManager;document.body.append(a.$element[0]),this.submitButton=new OO.ui.ButtonWidget({label:"Submit",disabled:!0,flags:["progressive"]}),this.submitButton.on("click",()=>this.handleSubmitButtonClick());const t=new h({size:"large"},this.pageTitleParsed);a.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 f({size:"large"});a.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 a=document.querySelector("#mwe-pt-mark .mwe-pt-tool-icon");if(a?.click(),a?.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 a=this.redirectInput.getValue().trim();if(!a)this.summaryInput.$tabIndexed[0].placeholder="";else if(this.exists){const t=a!==this.oldRedirectTarget?.replaceAll("_"," "),e=this.tagSelect.getValue().some(l=>!this.oldRedirectTags.includes(l))||this.oldRedirectTags.some(l=>!this.tagSelect.getValue().includes(l));let i=!1;if(this.oldRedirectTagData){const l=Object.entries(this.redirectTemplates).filter(([,u])=>Object.entries(u.parameters).length>0);for(const[u,c]of l){if(!this.oldRedirectTags.includes(u)||!this.tagSelect.getValue().includes(u))continue;const n=this.oldRedirectTagData[u]??Object.entries(c.parameters).map(([d])=>[d,""]),p=this.templateEditorsInfo.find(d=>d.name===u);for(const d of p.parameters){const y=n.find(w=>w[0]===d.name)?.[1]??"",m=d.editor.getValue().trim();if(y!==m){i=!0;break}}if(i)break}}const o=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),s=this.categorySelect.getValue().some(l=>!this.oldCategories.includes(l))||this.oldCategories.some(l=>!this.categorySelect.getValue().includes(l)),r=[];t&&r.push(`retarget to [[${a}]]`),e&&r.push("change categorization templates"),i&&r.push("change categorization template arguments"),o&&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 [[${a}]]`}async loadExistingData(){this.exists&&(this.pageContent=await this.getPageContent(this.pageTitle)),this.oldRedirectTarget=this.redirectRegex.exec(this.pageContent)?.[1],this.oldRedirectTags=Object.entries(this.redirectTemplates).map(([t,e])=>[t,...e.aliases].some(i=>new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\s*(\\||}})`).test(this.pageContent))?t:null).filter(Boolean).sort((t,e)=>t.toLowerCase().localeCompare(e.toLowerCase()));const a=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(a.map(t=>{const e=new RegExp(`{{\\s*[${t[0].toLowerCase()}${t[0]}]${t.slice(1)}\\|?(.*?)\\s*}}`).exec(this.pageContent),i=Object.entries(this.redirectTemplates).find(([r,l])=>[r,...l.aliases].includes(t))?.[0];if(!e?.[1])return null;const s=e[1].split("|").map((r,l)=>{if(!r.includes("="))return[(l+1).toString(),r.trim()];const[u,c]=r.split("=");return[u.trim(),c.trim()]});return[i,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 i=this.templateEditorsInfo.find(o=>o.name===t);if(i)for(const[o,s]of e){const r=i.parameters.find(l=>[l.name,...l.aliases].includes(o));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 a=[],t=this.redirectInput.getValue().trim(),e=this.tagSelect.getValue();/^\s*[^[\]{|}]+\s*$/.test(t)||a.push({title:t,message:"is not a valid page title!"});try{this.parsedDestination=mw.Title.newFromText(t)}catch{a.length===0&&a.push({title:t,message:"is not a valid page title!"})}!this.parsedDestination&&a.length===0&&a.push({title:t,message:"is not a valid page title!"}),this.parsedDestination?.toString()===this.pageTitleParsed.toString()&&a.push({message:"cannot redirect to itself!"});const i=await this.api.get({action:"query",formatversion:"2",prop:["pageprops","categories"],titles:t}).catch(n=>(n==="missingtitle"?a.push({title:t,message:"does not exist!"}):a.push({title:t,message:`was not able to be fetched from the API (${n})!`}),null)),o=await this.api.get({action:"parse",page:t,prop:"sections",redirects:!0});if(o.parse.redirects?.[0]){const n=o.parse.redirects[0].to+(o.parse.redirects[0].tofragment?`#${o.parse.redirects[0].tofragment}`:"");a.push({title:t,message:`is a redirect to <a href="${mw.util.getUrl(n)}" target="_blank">${n}</a>. Retarget to that page instead, as double redirects aren't allowed.`,autoFixes:[{type:"change-target",target:n}]})}if(t.split("#").length>1)if(o.parse.sections.find(p=>p.line.replaceAll(/<\/?i>/g,"")===t.split("#")[1]))e.includes("R to anchor")&&a.push({message:"is tagged as a redirect to an anchor, but it is actually a redirect to a section!",autoFixes:[{type:"add",tag:"R to section"},{type:"remove",tag:"R to anchor"}]}),e.includes("R to section")||a.push({message:"is a redirect to a section, but it is not tagged with <code>{{R to section}}</code>!",autoFixes:[{type:"add",tag:"R to section"}]});else{const p=(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;[...p.match(/(?<={{\s*?[Aa](?:nchors?|nchor for redirect|nker|NCHOR|nc)\s*?\|).+?(?=}})/g)?.map(y=>y.split("|").map(m=>m.trim()))?.flat()??[],...p.match(/(?<={{\s*?(?:[Vv](?:isible anchors?|isanc|Anch|anchor|isibleanchor|a)|[Aa](?:nchord|chored|nchor\+)|[Tt]ext anchor)\s*?\|).+?(?=(?<!!|=)}})/g)?.map(y=>y.split("|").map(m=>m.trim()).filter(m=>!/^text\s*?=/.test(m)))?.flat()??[],...p.match(/(?<=id=)"?.+?(?="|>|\|)/g)?.map(y=>y.trim())??[]].includes(t.split("#")[1])?(e.includes("R to section")&&a.push({message:"is tagged as a redirect to a section, but it is actually a redirect to an anchor!",autoFixes:[{type:"add",tag:"R to anchor"},{type:"remove",tag:"R to section"}]}),e.includes("R to anchor")||a.push({message:"is a redirect to an anchor, but it is not tagged with <code>{{R from anchor}}</code>!",autoFixes:[{type:"add",tag:"R to anchor"}]})):a.push({message:`is a redirect to <a href="${mw.util.getUrl(t)}" target="_blank">${t}</a>, but that section or anchor does not exist!`,autoFixes:[{type:"change-target",target:t.split("#")[0]}]})}if(t.split("#").length===1)for(const n of["R to section","R to anchor"])e.includes(n)&&a.push({message:`is not a redirect to a section/anchor, but it is tagged with <code>{{${n}}}</code>!`,autoFixes:[{type:"remove",tag:n}]});const s=!!(i.query.pages[0].pageprops&&"disambiguation"in i.query.pages[0].pageprops),r=!!i.query.pages[0].categories?.some(n=>n.title==="Category:Surnames"),l=["R to disambiguation page","R from incomplete disambiguation"],u=["R from ambiguous sort name","R from ambiguous term"],c=l.some(n=>e.includes(n)),g=u.some(n=>e.includes(n));s&&!c&&!g&&a.push({message:"is a redirect to a disambiguation page, but it is not tagged with a disambiguation categorization template!"}),i.query.pages[0].pageprops&&!s&&((!r&&(c||g)||r&&c)&&a.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!",autoFixes:[...l,...u].map(n=>({type:"remove",tag:n}))}),r&&!g&&a.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)")&&a.push({message:'is tagged with <code>{{R to disambiguation page}}</code>, but this title does not end with " (disambiguation)". Use <code>{{R from ambiguous term}}</code> or a similar categorization template instead!',autoFixes:[{type:"remove",tag:"R to disambiguation page"}]});for(const n of["R semi-protected","R extended-protected","R template-protected","R fully protected"])e.includes(n)&&a.push({message:`is tagged with unnecessarily tagged with <code>{{${n}}}</code> which will be duplicated by the redirect category shell!`,autoFixes:[{type:"remove",tag:n}]});mw.config.get("wgWikibaseItemId")&&!e.includes("R with Wikidata item")&&a.push({message:"is linked to a Wikidata item but it isn't tagged with <code>{{R with Wikidata item}}</code>!",autoFixes:[{type:"add",tag:"R with Wikidata item"}]}),e.includes("R with Wikidata item")&&!mw.config.get("wgWikibaseItemId")&&a.push({message:"is tagged with <code>{{R with Wikidata item}}</code> but it is not actually linked to a Wikidata item!",autoFixes:[{type:"remove",tag:"R with Wikidata item"}]});for(const n of e){const p=this.redirectTemplates[n];if(p)for(const[d,y]of Object.entries(p.parameters)){const m=this.templateEditorsInfo.find(w=>w.name===n)?.parameters.find(w=>[w.name,...w.aliases].includes(d));m&&y.required&&!m.editor.getValue().trim()&&a.push({message:`is tagged with <code>{{${n}}}</code> but it is missing the required parameter <code>${d}</code>!`})}}return this.syncTalkCheckbox?.isSelected()&&!this.talkData.query.pages[0].missing&&!this.talkData.query.pages[0].redirect&&a.push({title:this.pageTitleParsed.getTalkPage().getPrefixedText(),message:"exists, but is not a redirect!"}),a}async handleSubmitButtonClick(){const a=[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 a)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,autoFixes:l}of t){const u=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.`),c=new OO.ui.MessageWidget({type:"error",classes:["redirect-helper-warning"],inline:!0,label:u});if(l){const g=new OO.ui.ButtonWidget({label:"Perform auto-fix",flags:["progressive"],classes:["redirect-helper-autofix-button"]});g.on("click",()=>{const n=this.tagSelect.getValue();for(const p of l)p.type==="add"&&!n.includes(p.tag)&&this.tagSelect.addTag(p.tag,p.tag),p.type==="remove"&&n.includes(p.tag)&&this.tagSelect.removeTagByData(p.tag),p.type==="change-target"&&this.redirectInput.setValue(p.target);c.$element[0].style.textDecoration="line-through 2px black",g.$element[0].remove()}),c.$element[0].querySelector(".oo-ui-labelElement-label").append(g.$element[0])}this.editorBox.$element[0].append(c.$element[0])}for(const s of a)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()),i=(this.summaryInput.getValue()||this.summaryInput.$tabIndexed[0].placeholder)+this.scriptAdvert;if(await this.editOrCreate(this.pageTitle,e,i)){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,c)=>(mw.notify(`Error patrolling ${this.pageTitle} via API: ${c?.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(a,t,e,i,o){const s=mw.Title.newFromText(a),r=s?`${s.getNamespaceId()===14?":":""}${s.getPrefixedText()}${s.getFragment()?`#${s.getFragment()}`:""}`:a.trim();this.pageTitleParsed.getMainText().toLocaleLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")===i?.toLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")&&(i=void 0);const l=t.map(u=>{const c=this.templateEditorsInfo.find(n=>n.name===u);if(!c)return`{{${u}}}`;const g=c.parameters.map((n,p)=>{const d=n.editor.getValue().trim();return d?`|${n.name===(p+1).toString()?"":`${n.name}=`}${d}`:null}).filter(Boolean).join("");return`{{${u}${g}}}`});return[`#REDIRECT [[${r}]]
`,t.length>0?`{{Redirect category shell|
${l.join(`
`)}
}}
`:null,e?e+`
`:null,i?`{{DEFAULTSORT:${i.trim()}}}`:null,o.length>0?o.map(u=>`[[Category:${u}]]`).join(`
`):null].filter(Boolean).join(`
`)}async getPageContent(a){return(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:a})).query.pages[0].revisions[0].slots.main.content.trim()}async editOrCreate(a,t,e){return await this.api.edit(a,()=>({text:t,summary:e})).catch((i,o)=>i==="nocreate-missing"?this.api.create(a,{summary:e},t).catch((s,r)=>{mw.notify(`Error creating ${a}: ${r?.error.info??"Unknown error"} (${s})`,{type:"error"})}):(mw.notify(`Error editing or creating ${a}: ${o?.error.info??"Unknown error"} (${i})`,{type:"error"}),null))}}new v().run()});

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gICAgQXBpQ29tcGFyZVBhZ2VzUGFyYW1zLFxuICAgIEFwaVBhcnNlUGFyYW1zLFxuICAgIEFwaVF1ZXJ5SW5mb1BhcmFtcyxcbiAgICBBcGlRdWVyeVBhZ2VQcm9wc1BhcmFtcyxcbiAgICBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyxcbiAgICBBcGlRdWVyeVVzZXJJbmZvUGFyYW1zLFxuICAgIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcyxcbn0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHtcbiAgICBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1zLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vcHJldmVudC1hYmJyZXZpYXRpb25zXG4gICAgQ2F0ZWdvcmllc1Jlc3VsdCxcbiAgICBNZWRpYVdpa2lEYXRhRXJyb3IsXG4gICAgUGFnZUluZm9SZXN1bHQsXG4gICAgUGFnZVBhcnNlUmVzdWx0LFxuICAgIFBhZ2VSZXZpc2lvbnNSZXN1bHQsXG4gICAgUGFnZVRyaWFnZUxpc3RSZXNwb25zZSxcbiAgICBQYWdlcHJvcHNSZXN1bHQsXG4gICAgVXNlclBlcm1pc3Npb25zUmVzcG9uc2UsXG59IGZyb20gJy4uL2dsb2JhbC10eXBlcyc7XG5cbnR5cGUgUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnMgPSBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgICAgYWxpYXNlczogc3RyaW5nW107XG4gICAgICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgICByZXF1aXJlZDogYm9vbGVhbjtcbiAgICAgICAgc3VnZ2VzdGVkOiBib29sZWFuO1xuICAgICAgICBkZWZhdWx0OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgICAgZXhhbXBsZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgfVxuPjtcblxuZXhwb3J0IHR5cGUgUmVkaXJlY3RUZW1wbGF0ZURhdGEgPSBSZWNvcmQ8c3RyaW5nLCB7IHBhcmFtZXRlcnM6IFJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzOyBhbGlhc2VzOiBzdHJpbmdbXSB9PjtcblxuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50O1xuICAgIHBhcmFtZXRlcnM6IHsgbmFtZTogc3RyaW5nOyBhbGlhc2VzOiBzdHJpbmdbXTsgZWRpdG9yOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQgfVtdO1xufVxuXG5pbnRlcmZhY2UgTG9va3VwRWxlbWVudENvbmZpZyBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldC5Db25maWdPcHRpb25zLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LkNvbmZpZ09wdGlvbnMge31cblxubXcubG9hZGVyLnVzaW5nKFsnbWVkaWF3aWtpLnV0aWwnLCAnb29qcy11aS1jb3JlJywgJ29vanMtdWktd2lkZ2V0cycsICdvb2pzLXVpLXdpbmRvd3MnLCAnb29qcy11aS5zdHlsZXMuaWNvbnMtY29udGVudCcsICdvb2pzLXVpLnN0eWxlcy5pY29ucy1lZGl0aW5nLWNvcmUnXSwgKCkgPT4ge1xuICAgIC8vIFNldHVwIFJlZGlyZWN0SW5wdXRXaWRnZXRcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSB0aXRsZSBsb29rdXAgZWxlbWVudC5cbiAgICAgKi9cbiAgICBjbGFzcyBSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZywgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZSkge1xuICAgICAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5pbmNsdWRlcygnIycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB2YWx1ZS5zcGxpdCgnIycpWzBdO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgLmdldCh7IGFjdGlvbjogJ3BhcnNlJywgcGFnZTogdGl0bGUsIHByb3A6ICdzZWN0aW9ucycsIHJlZGlyZWN0czogdHJ1ZSB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IFBhZ2VQYXJzZVJlc3VsdCB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkU2VjdGlvbnMgPSByZXN1bHQucGFyc2Uuc2VjdGlvbnMuZmlsdGVyKChzZWN0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydHNXaXRoKHZhbHVlLnNwbGl0KCcjJylbMV0udG9Mb3dlckNhc2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkU2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogYCR7cmVzdWx0LnBhcnNlLnRpdGxlfSMke3NlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGAke3Jlc3VsdC5wYXJzZS50aXRsZX0jJHtzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiBwYXJzZWRUaXRsZT8uZ2V0TmFtZXNwYWNlSWQoKSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6IFsnaW5mbycsICdwYWdlcHJvcHMnXSxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IHsgcXVlcnk6IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZzsgcGFnZXByb3BzOiB7IGRpc2FtYmlndWF0aW9uPzogc3RyaW5nIH07IHJlZGlyZWN0Pzogc3RyaW5nIH1bXSB9IH0gfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5xdWVyeT8ucGFnZXMgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnF1ZXJ5LnBhZ2VzIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYWdlKSA9PiBwYWdlLnRpdGxlICE9PSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBwYWdlLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhZ2UudGl0bGV9JHtwYWdlLnBhZ2Vwcm9wcyAmJiAnZGlzYW1iaWd1YXRpb24nIGluIHBhZ2UucGFnZXByb3BzID8gJyA8aT4oZGlzYW1iaWd1YXRpb24pPC9pPicgOiAnJ30keydyZWRpcmVjdCcgaW4gcGFnZSA/ICcgPGk+KHJlZGlyZWN0KTwvaT4nIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgICAgICB9O1xuXG4gICAgICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICAgICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcblxuICAgIC8vIFNldHVwIENhdGVnb3J5SW5wdXRXaWRnZXRcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBjYXRlZ29yeSBsb29rdXAgZWxlbWVudC5cbiAgICAgKi9cbiAgICBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiAxNCxcbiAgICAgICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnYWxscGFnZXMnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtcylcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0OiB7IHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmc7IGNhdGVnb3JpZXM/OiB7IHRpdGxlOiBzdHJpbmcgfVtdIH1bXSB9IH0gfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQ/LnF1ZXJ5Py5wYWdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSByZXN1bHQucXVlcnkucGFnZXMgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYWdlKSA9PiAhcGFnZS5jYXRlZ29yaWVzPy5zb21lKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkudGl0bGUgPT09ICdDYXRlZ29yeTpXaWtpcGVkaWEgc29mdCByZWRpcmVjdGVkIGNhdGVnb3JpZXMnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlV2l0aG91dE5hbWVzcGFjZSA9IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UsIGxhYmVsOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHBhZ2VzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgICAgICB9O1xuXG4gICAgICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICAgICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oQ2F0ZWdvcnlJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcblxuICAgIC8vIFNldHVwIFRlbXBsYXRlUHJldmlld0RpYWxvZ1xuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB1c2VkIGZvciBwcmV2aWV3aW5nIHRlbXBsYXRlcy5cbiAgICAgKi9cbiAgICBjbGFzcyBUZW1wbGF0ZVByZXZpZXdEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT08udWkuUHJvY2Vzc0RpYWxvZy5Db25maWdPcHRpb25zLCBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlKSB7XG4gICAgICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcblxuICAgICAgICAgICAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nLnN0YXRpYy5uYW1lID0gJ1RlbXBsYXRlUHJldmlld0RpYWxvZyc7XG4gICAgICAgICAgICBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3RhdGljLnRpdGxlID0gJ1JlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlcyBwcmV2aWV3JztcbiAgICAgICAgICAgIFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFt7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfV07XG4gICAgICAgIH1cblxuICAgICAgICBnZXRTZXR1cFByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVQcmV2aWV3RGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRTZXR1cFByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncGFyc2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudG1vZGVsOiAnd2lraXRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogWyd0ZXh0JywgJ2NhdGVnb3JpZXNodG1sJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0UHJlZml4ZWREYigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5nZXREYXRhKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnc0NvbnRlbnQgPSAocmVzdWx0IGFzIHsgcGFyc2U6IHsgdGV4dDogc3RyaW5nIH0gfSkucGFyc2UudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXNDb250ZW50ID0gKHJlc3VsdCBhcyB7IHBhcnNlOiB7IGNhdGVnb3JpZXNodG1sOiBzdHJpbmcgfSB9KS5wYXJzZS5jYXRlZ29yaWVzaHRtbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZWxMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsTGF5b3V0LiRlbGVtZW50LmFwcGVuZCh0YWdzQ29udGVudCwgY2F0ZWdvcmllc0NvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQocGFuZWxMYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldEFjdGlvblByb2Nlc3MgPSAoYWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb25cbiAgICAgICAgICAgICAgICA/IG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1hbmFnZXIoKS5jbG9zZVdpbmRvdyh0aGlzKTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKFRlbXBsYXRlUHJldmlld0RpYWxvZy5wcm90b3R5cGUsIE9PLnVpLlByb2Nlc3NEaWFsb2cucHJvdG90eXBlKTtcblxuICAgIC8vIFNldHVwIFRlbXBsYXRlUHJldmlld0RpYWxvZ1xuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB1c2VkIGZvciBzaG93aW5nIGNoYW5nZXMgdG8gYmUgbWFkZS5cbiAgICAgKi9cbiAgICBjbGFzcyBTaG93Q2hhbmdlc0RpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgICAgICBjb25zdHJ1Y3Rvcihjb25maWc6IE9PLnVpLlByb2Nlc3NEaWFsb2cuQ29uZmlnT3B0aW9ucykge1xuICAgICAgICAgICAgc3VwZXIoY29uZmlnKTtcblxuICAgICAgICAgICAgU2hvd0NoYW5nZXNEaWFsb2cuc3RhdGljLm5hbWUgPSAnU2hvd0NoYW5nZXNEaWFsb2cnO1xuICAgICAgICAgICAgU2hvd0NoYW5nZXNEaWFsb2cuc3RhdGljLnRpdGxlID0gJ0NoYW5nZXMgdG8gYmUgbWFkZSc7XG4gICAgICAgICAgICBTaG93Q2hhbmdlc0RpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFt7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfV07XG4gICAgICAgIH1cblxuICAgICAgICBnZXRTZXR1cFByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gU2hvd0NoYW5nZXNEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtvbGRUZXh0LCBuZXdUZXh0XSA9IHRoaXMuZ2V0RGF0YSgpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgIC5wb3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2NvbXBhcmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogWydkaWZmJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tc2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tdGV4dC1tYWluJzogb2xkVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tY29udGVudG1vZGVsLW1haW4nOiAnd2lraXRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9zbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RvdGV4dC1tYWluJzogbmV3VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b2NvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpQ29tcGFyZVBhZ2VzUGFyYW1zICYgeyAnZnJvbXRleHQtbWFpbic6IHN0cmluZzsgJ2Zyb21jb250ZW50bW9kZWwtbWFpbic6IHN0cmluZzsgJ3RvdGV4dC1tYWluJzogc3RyaW5nOyAndG9jb250ZW50bW9kZWwtbWFpbic6IHN0cmluZyB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wYXJpc29uID0gKHJlc3VsdCBhcyB7IGNvbXBhcmU6IHsgYm9keTogc3RyaW5nIH0gfSkuY29tcGFyZS5ib2R5O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub0NoYW5nZXNFbGVtZW50ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlOiAnd2FybmluZycsIGxhYmVsOiAnTm8gY2hhbmdlcyB0byBtYWtlIScgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsTGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbExheW91dC4kZWxlbWVudC5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGBcbjx0YWJsZSBjbGFzcz1cImRpZmYgZGlmZi1lZGl0Zm9udC1tb25vc3BhY2VcIj5cbiAgICA8Y29sZ3JvdXA+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLW1hcmtlclwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1jb250ZW50XCI+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLW1hcmtlclwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1jb250ZW50XCI+XG4gICAgPC9jb2xncm91cD5cbiAgICA8dGJvZHk+XG4gICAgICAgICR7Y29tcGFyaXNvbn1cbiAgICA8L3Rib2R5PlxuPC90YWJsZT5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbm9DaGFuZ2VzRWxlbWVudC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChwYW5lbExheW91dC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvblxuICAgICAgICAgICAgICAgID8gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWFuYWdlcigpLmNsb3NlV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IFNob3dDaGFuZ2VzRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwodGhpcywgYWN0aW9uKTtcbiAgICAgICAgfTtcblxuICAgICAgICBnZXRUZWFyZG93blByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gU2hvd0NoYW5nZXNEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKFNob3dDaGFuZ2VzRGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBlbnRpcmUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgcmVkaXJlY3QtaGVscGVyIHNjcmlwdC5cbiAgICAgKi9cbiAgICBjbGFzcyBSZWRpcmVjdEhlbHBlciB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RUZW1wbGF0ZXMhOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICAgICAgcHJpdmF0ZSBjb250ZW50VGV4dCE6IEhUTUxEaXZFbGVtZW50O1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZSE6IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQhOiBtdy5UaXRsZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgcmVkaXJlY3QgaGVscGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcnVuKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBhc3Nlc1ByZUNoZWNrcygpKSByZXR1cm47XG5cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLmZldGNoUmVkaXJlY3RUZW1wbGF0ZXMoKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZW50VGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtdy1jb250ZW50LXRleHQnKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb250ZW50VGV4dCkgcmV0dXJuIG13Lm5vdGlmeSgncmVkaXJlY3QtaGVscGVyOiBGYWlsZWQgdG8gZmluZCBjb250ZW50IHRleHQgZWxlbWVudCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRoaXMucGFnZVRpdGxlKSE7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFnZVRpdGxlUGFyc2VkKSByZXR1cm4gbXcubm90aWZ5KCdyZWRpcmVjdC1oZWxwZXI6IEZhaWxlZCB0byBwYXJzZSBwYWdlIHRpdGxlIScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1BhZ2VBbmRMb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoZSBwYWdlIHBhc3NlcyBwcmUgY2hlY2tzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBwYXNzZXNQcmVDaGVja3MoKSB7XG4gICAgICAgICAgICBjb25zdCBjb25kaXRpb25zID0gW1xuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPj0gMCwgLy8gSXMgbm90IHZpcnR1YWwgbmFtZXNwYWNlXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dJc1Byb2JhYmx5RWRpdGFibGUnKSwgLy8gUGFnZSBpcyBlZGl0YWJsZVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnSXNBcnRpY2xlJyksIC8vIFZpZXdpbmcgdGhlIGNvbnRlbnQgb2YgYSBwYWdlXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dBY3Rpb24nKSA9PT0gJ3ZpZXcnLCAvLyBWaWV3aW5nIHRoZSBwYWdlIChub3QgZWRpdGluZylcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z1JldmlzaW9uSWQnKSA9PT0gbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJyksIC8vIFZpZXdpbmcgdGhlIGN1cnJlbnQgcmV2aXNpb25cbiAgICAgICAgICAgICAgICAhbXcuY29uZmlnLmdldCgnd2dEaWZmT2xkSWQnKSwgLy8gTm90IHZpZXdpbmcgYSBkaWZmXG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICByZXR1cm4gY29uZGl0aW9ucy5ldmVyeShCb29sZWFuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaGVzIHRoZSByZWRpcmVjdCB0ZW1wbGF0ZXMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGZldGNoUmVkaXJlY3RUZW1wbGF0ZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlczogJ1VzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci5qc29uJyxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICAgICAgICAgKS5xdWVyeS5wYWdlcz8uWzBdPy5yZXZpc2lvbnM/LlswXT8uc2xvdHM/Lm1haW4/LmNvbnRlbnQgfHwgJ3t9JyxcbiAgICAgICAgICAgICkgYXMgUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGEgcGFnZSdzIHN0YXR1cyBhbmQgbG9hZHMgdGhlIGhlbHBlciBhcHByb3ByaWF0ZWx5LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBjaGVja1BhZ2VBbmRMb2FkKCkge1xuICAgICAgICAgICAgY29uc3QgcGFnZUluZm8gPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHsgYWN0aW9uOiAncXVlcnknLCBmb3JtYXR2ZXJzaW9uOiAnMicsIHByb3A6ICdpbmZvJywgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgY29uc3QgZGlhbG9nSW5mbyA9IHsgcmVkaXJlY3RUZW1wbGF0ZXM6IHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMsIGNvbnRlbnRUZXh0OiB0aGlzLmNvbnRlbnRUZXh0LCBwYWdlVGl0bGU6IHRoaXMucGFnZVRpdGxlLCBwYWdlVGl0bGVQYXJzZWQ6IHRoaXMucGFnZVRpdGxlUGFyc2VkIH07XG5cbiAgICAgICAgICAgIGlmIChwYWdlSW5mby5xdWVyeS5wYWdlc1swXS5taXNzaW5nKSB7XG4gICAgICAgICAgICAgICAgbXcudXRpbC5hZGRDU1MoYFxuI2NyZWF0ZS1yZWRpcmVjdC1idXR0b24ge1xuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG59YCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBidXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgaWQ6ICdjcmVhdGUtcmVkaXJlY3QtYnV0dG9uJywgbGFiZWw6ICdDcmVhdGUgcmVkaXJlY3QnLCBpY29uOiAnYXJ0aWNsZVJlZGlyZWN0JywgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSB9KTtcbiAgICAgICAgICAgICAgICBidXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBidXR0b24uJGVsZW1lbnRbMF0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCBmYWxzZSkubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50VGV4dC5wcmVwZW5kKGJ1dHRvbi4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhZ2VJbmZvLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0KSBuZXcgUmVkaXJlY3RIZWxwZXJEaWFsb2coZGlhbG9nSW5mbywgdHJ1ZSkubG9hZCgpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9ydGxldExpbmsgPSBtdy51dGlsLmFkZFBvcnRsZXRMaW5rKG13LmNvbmZpZy5nZXQoJ3NraW4nKSA9PT0gJ21pbmVydmEnID8gJ3AtdGInIDogJ3AtY2FjdGlvbnMnLCAnIycsICdSZWRpcmVjdCBwYWdlJywgJ3JlZGlyZWN0LWhlbHBlcicpITtcbiAgICAgICAgICAgICAgICBwb3J0bGV0TGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCBmYWxzZSkubG9hZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHBvcnRsZXRMaW5rLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBkaWFsb2cgcG9ydGlvbiBvZiByZWRpcmVjdC1oZWxwZXIgc2NyaXB0LlxuICAgICAqL1xuICAgIGNsYXNzIFJlZGlyZWN0SGVscGVyRGlhbG9nIHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RSZWdleCA9IC9eI3JlZGlyZWN0Oj9cXHMqXFxbXFxbXFxzKjo/KFteW1xcXXt8fV0rPylcXHMqKD86XFx8W15bXFxde3x9XSs/KT9dXVxccyovaTtcbiAgICAgICAgcHJpdmF0ZSBzY3JpcHRBZHZlcnQgPSAnICh2aWEgW1tVc2VyOkVlaml0NDMvc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXJ8cmVkaXJlY3QtaGVscGVyXV0pJztcblxuICAgICAgICAvLyBBc3NpZ25lZCBpbiBjb25zdHJ1Y3RvclxuICAgICAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICAgICAgcHJpdmF0ZSBjb250ZW50VGV4dDogSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlOiBzdHJpbmc7XG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgICAgICBwcml2YXRlIGV4aXN0czogYm9vbGVhbjtcblxuICAgICAgICAvLyBVc2VkIGR1cmluZyBydW4oKVxuICAgICAgICBwcml2YXRlIG5lZWRzQ2hlY2sgPSB0cnVlO1xuXG4gICAgICAgIHByaXZhdGUgZWRpdG9yQm94ITogT08udWkuUGFuZWxMYXlvdXQ7XG4gICAgICAgIHByaXZhdGUgc3luY1dpdGhNYWluQnV0dG9uPzogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHJlZGlyZWN0SW5wdXQhOiBSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHJlZGlyZWN0SW5wdXRMYXlvdXQhOiBPTy51aS5GaWVsZExheW91dDtcbiAgICAgICAgcHJpdmF0ZSB0YWdTZWxlY3QhOiBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgdGFnU2VsZWN0TGF5b3V0ITogT08udWkuQWN0aW9uRmllbGRMYXlvdXQ7XG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yITogSFRNTERldGFpbHNFbGVtZW50O1xuICAgICAgICBwcml2YXRlIHRlbXBsYXRlRWRpdG9yc0luZm86IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm9bXSA9IFtdO1xuICAgICAgICBwcml2YXRlIGNhdGVnb3J5U2VsZWN0ITogT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3RJbnB1dCE6IENhdGVnb3J5SW5wdXRXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3RMYXlvdXQhOiBPTy51aS5GaWVsZExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBkZWZhdWx0U29ydElucHV0ITogT08udWkuVGV4dElucHV0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIGRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBkZWZhdWx0U29ydElucHV0TGF5b3V0ITogT08udWkuQWN0aW9uRmllbGRMYXlvdXQ7XG4gICAgICAgIHByaXZhdGUgc3VtbWFyeUlucHV0ITogT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzdW1tYXJ5SW5wdXRMYXlvdXQhOiBPTy51aS5GaWVsZExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBzdWJtaXRCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgc2hvd0NoYW5nZXNCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgc2hvd1ByZXZpZXdCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgc3luY1RhbGtDaGVja2JveD86IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgc3luY1RhbGtDaGVja2JveExheW91dD86IE9PLnVpLldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBwYXRyb2xDaGVja2JveD86IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgcGF0cm9sQ2hlY2tib3hMYXlvdXQ/OiBPTy51aS5XaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgc3VibWl0TGF5b3V0ITogT08udWkuSG9yaXpvbnRhbExheW91dDtcblxuICAgICAgICBwcml2YXRlIHRhbGtEYXRhPzogUGFnZUluZm9SZXN1bHQ7XG5cbiAgICAgICAgcHJpdmF0ZSBwYWdlQ29udGVudCA9ICcnO1xuXG4gICAgICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYXJnZXQ/OiBzdHJpbmc7XG4gICAgICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYWdzPzogc3RyaW5nW107XG4gICAgICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYWdEYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW11bXT47XG4gICAgICAgIHByaXZhdGUgb2xkRGVmYXVsdFNvcnQ/OiBzdHJpbmc7XG4gICAgICAgIHByaXZhdGUgb2xkQ2F0ZWdvcmllcz86IHN0cmluZ1tdO1xuICAgICAgICBwcml2YXRlIG9sZFN0cmF5VGV4dD86IHN0cmluZztcblxuICAgICAgICBwcml2YXRlIHBhcnNlZERlc3RpbmF0aW9uITogbXcuVGl0bGUgfCBudWxsO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAgICAgeyByZWRpcmVjdFRlbXBsYXRlcywgY29udGVudFRleHQsIHBhZ2VUaXRsZSwgcGFnZVRpdGxlUGFyc2VkIH06IHsgcmVkaXJlY3RUZW1wbGF0ZXM6IFJlZGlyZWN0VGVtcGxhdGVEYXRhOyBjb250ZW50VGV4dDogSFRNTERpdkVsZW1lbnQ7IHBhZ2VUaXRsZTogc3RyaW5nOyBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlIH0sXG4gICAgICAgICAgICBleGlzdHM6IGJvb2xlYW4sXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyA9IHJlZGlyZWN0VGVtcGxhdGVzO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50VGV4dCA9IGNvbnRlbnRUZXh0O1xuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcblxuICAgICAgICAgICAgdGhpcy5leGlzdHMgPSBleGlzdHM7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIHJlZGlyZWN0LWhlbHBlciBkaWFsb2cgaW50byB0aGUgcGFnZS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4jY3JlYXRlLXJlZGlyZWN0LWJ1dHRvbiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1ib3gge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlc21va2U7XG4gICAgd2lkdGg6IDcwMHB4O1xuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gNTBweCk7XG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICAgIG1hcmdpbi1ib3R0b206IDI1cHggIWltcG9ydGFudDtcbn1cblxuLnJlZGlyZWN0LWlucHV0LWxheW91dCBsYWJlbCB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIsIC5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlscyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjtcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgbWFyZ2luLWJsb2NrOiAxMHB4O1xuICAgIHBhZGRpbmc6IDVweDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBzdW1tYXJ5IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlscyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QxY2VjZTtcbiAgICBtYXJnaW4tYmxvY2s6IDVweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSB7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLXN1bW1hcnktbGF5b3V0IHtcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcbiAgICBtYXJnaW4tdG9wOiAxNXB4O1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBncmF5O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXQge1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG59XG5cbiNyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dCA+ICoge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItd2FybmluZyB7XG4gICAgbWFyZ2luLXRvcDogOHB4O1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLWF1dG9maXgtYnV0dG9uIHtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci1hdXRvZml4LWJ1dHRvbiBhIHtcbiAgICBwYWRkaW5nOiAzcHggNHB4ICFpbXBvcnRhbnQ7XG4gICAgbWluLWhlaWdodDogdW5zZXQgIWltcG9ydGFudDtcbn1gKTtcblxuICAgICAgICAgICAgbXcubG9hZGVyLmFkZExpbmtUYWcoJ2h0dHBzOi8vd3d3Lm1lZGlhd2lraS5vcmcvdy9sb2FkLnBocD9tb2R1bGVzPW1lZGlhd2lraS5kaWZmLnN0eWxlcyZvbmx5PXN0eWxlcycpO1xuXG4gICAgICAgICAgICAvKiBMb2FkIGVsZW1lbnRzICovXG4gICAgICAgICAgICB0aGlzLmVkaXRvckJveCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IGlkOiAncmVkaXJlY3QtaGVscGVyLWJveCcsIHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlLCBmcmFtZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2VUaXRsZVBhcnNlZC5pc1RhbGtQYWdlKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYWluUGFnZURhdGEgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIHByb3A6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRTdWJqZWN0UGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgICAgIGlmIChtYWluUGFnZURhdGEucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QpIGF3YWl0IHRoaXMubG9hZFN5bmNXaXRoTWFpbkJ1dHRvbigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRJbnB1dEVsZW1lbnRzKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTdWJtaXRFbGVtZW50cygpO1xuXG4gICAgICAgICAgICAvKiBBZGQgZWxlbWVudHMgdG8gc2NyZWVuIGFuZCBsb2FkIGRhdGEgKGlmIGFwcGxpY2FibGUpICovXG4gICAgICAgICAgICB0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXS5hcHBlbmQoXG4gICAgICAgICAgICAgICAgLi4uKFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24/LiRlbGVtZW50Py5bMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICBdLmZpbHRlcihCb29sZWFuKSBhcyBIVE1MRWxlbWVudFtdKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudFRleHQucHJlcGVuZCh0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmV4aXN0cykgdGhpcy5sb2FkRXhpc3RpbmdEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIFwiU3luYyB3aXRoIG1haW4gcGFnZVwiIGJ1dHRvblwiIG9uIHRhbGsgcGFnZXMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGxvYWRTeW5jV2l0aE1haW5CdXR0b24oKSB7XG4gICAgICAgICAgICBjb25zdCBtYWluUGFnZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFN1YmplY3RQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpKTtcblxuICAgICAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTeW5jIHdpdGggbWFpbiBwYWdlJywgaWNvbjogJ2xpbmsnLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVkaXJlY3RSZWdleC5leGVjKG1haW5QYWdlQ29udGVudCk/LlsxXTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG13Lm5vdGlmeSgnRmFpbGVkIHRvIHBhcnNlIG1haW4gcGFnZSBjb250ZW50IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZShtdy5UaXRsZS5uZXdGcm9tVGV4dCh0YXJnZXQpPy5nZXRUYWxrUGFnZSgpPy50b1N0cmluZygpID8/ICcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tTW92ZSA9IFsnUiBmcm9tIG1vdmUnLCAuLi50aGlzLnJlZGlyZWN0VGVtcGxhdGVzWydSIGZyb20gbW92ZSddLmFsaWFzZXNdLnNvbWUoKHRhZ09yUmVkaXJlY3QpID0+XG4gICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KG1haW5QYWdlQ29udGVudCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbU1vdmUpIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKFsnUiBmcm9tIG1vdmUnXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyB0aGUgaW5wdXQgZWxlbWVudHMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICAgICAgLyogUmVkaXJlY3QgdGFyZ2V0IGlucHV0ICovXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQgPSBuZXcgUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnVGFyZ2V0IHBhZ2UgbmFtZScsIHJlcXVpcmVkOiB0cnVlIH0sIHRoaXMucGFnZVRpdGxlUGFyc2VkKTtcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL146LywgJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnJlZGlyZWN0SW5wdXQsIHsgbGFiZWw6ICdSZWRpcmVjdCB0YXJnZXQ6JywgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSwgYWxpZ246ICd0b3AnIH0pO1xuXG4gICAgICAgICAgICAvKiBSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBzZWxlY3Rpb24gKi9cbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0ID0gbmV3IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgYWxsb3dBcmJpdHJhcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmtleXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykubWFwKCh0YWcpID0+ICh7IGRhdGE6IHRhZywgbGFiZWw6IHRhZyB9KSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICh0aGlzLnRhZ1NlbGVjdC5nZXRNZW51KCkgYXMgT08udWkuTWVudVNlbGVjdFdpZGdldC5Db25maWdPcHRpb25zKS5maWx0ZXJNb2RlID0gJ3N1YnN0cmluZyc7XG4gICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSAodGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKHNvcnRlZFRhZ3MpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVkaXRvckluZm8gb2YgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvKSBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgICAgIGxldCBzaG93blRlbXBsYXRlRWRpdG9ycyA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3JJbmZvID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdG9ySW5mbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd25UZW1wbGF0ZUVkaXRvcnMrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gYFRlbXBsYXRlIHBhcmFtZXRlcnMgKCR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gYGZvciAke3Nob3duVGVtcGxhdGVFZGl0b3JzfSB0ZW1wbGF0ZSR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAxID8gJ3MnIDogJyd9YCA6ICdub25lIHRvIHNob3cnfSlgO1xuXG4gICAgICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnN0eWxlLmRpc3BsYXkgPSBzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyAnbm9uZScgOiAnYmxvY2snO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMudGFnU2VsZWN0LCB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXM6JyxcbiAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLFxuICAgICAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzICovXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmNsYXNzTGlzdC5hZGQoJ3JlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lcicpO1xuXG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gJ1RlbXBsYXRlIHBhcmFtZXRlcnMgKG5vbmUgdG8gc2hvdyknO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlRGF0YS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgICAgICBkZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgICAgIHN1bW1hcnkudGV4dENvbnRlbnQgPSB0ZW1wbGF0ZU5hbWU7XG4gICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoc3VtbWFyeSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50RGF0YTogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyA9IHsgbmFtZTogdGVtcGxhdGVOYW1lLCBkZXRhaWxzLCBwYXJhbWV0ZXJzOiBbXSB9O1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyRGF0YV0gb2YgcGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogcGFyYW1ldGVyRGF0YS5kZWZhdWx0Py50b1N0cmluZygpLCByZXF1aXJlZDogcGFyYW1ldGVyRGF0YS5yZXF1aXJlZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoaW5wdXQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGFyYW1ldGVyTmFtZX0keyFwYXJhbWV0ZXJEYXRhLmxhYmVsIHx8IHBhcmFtZXRlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFyYW1ldGVyRGF0YS5sYWJlbD8udG9Mb3dlckNhc2UoKSA/ICcnIDogYCAoJHtwYXJhbWV0ZXJEYXRhLmxhYmVsfSlgfSR7cGFyYW1ldGVyRGF0YS5kZXNjcmlwdGlvbiA/IGAgKCR7cGFyYW1ldGVyRGF0YS5kZXNjcmlwdGlvbn0pYCA6ICcnfSAodHlwZTogJHtwYXJhbWV0ZXJEYXRhLnR5cGV9KSAke3BhcmFtZXRlckRhdGEuc3VnZ2VzdGVkID8gJyAoc3VnZ2VzdGVkKScgOiAnJ30ke3BhcmFtZXRlckRhdGEuZXhhbXBsZSA/IGAgKGV4YW1wbGU6IFwiJHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGV9XCIpYCA6ICcnfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoaW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnBhcmFtZXRlcnMucHVzaCh7IG5hbWU6IHBhcmFtZXRlck5hbWUsIGFsaWFzZXM6IHBhcmFtZXRlckRhdGEuYWxpYXNlcywgZWRpdG9yOiBpbnB1dCB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoZGV0YWlscyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8ucHVzaChlbGVtZW50RGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5vVGVtcGxhdGVzTWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLmlkID0gJ3JlZGlyZWN0LWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSc7XG4gICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UudGV4dENvbnRlbnQgPSAnTm8gdGVtcGxhdGVzIHdpdGggcGFyYW1ldGVycyB0byBkaXNwbGF5ISc7XG5cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChub1RlbXBsYXRlc01lc3NhZ2UpO1xuXG4gICAgICAgICAgICAvKiBERUZBVUxUU09SVCBpbnB1dCAqL1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCgpO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKTtcblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUodmFsdWUucmVwbGFjZUFsbCgnXycsICcgJykpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgaWNvbjogJ3JvYm90JywgbGFiZWw6ICdTdWdnZXN0JywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRNYWluVGV4dCgpLnJlcGxhY2UoLyBcXCguKlxcKSQvLCAnJyk7IC8vIFJlbW92ZSBkaXNhbWJpZ3VhdGlvblxuXG4gICAgICAgICAgICAgICAgaWYgKFsnUiBmcm9tIHBlcnNvbicsICdSIGZyb20gYmlydGggbmFtZScsICdSIGZyb20gZmljdGlvbmFsIGNoYXJhY3RlciddLnNvbWUoKHRhZykgPT4gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyh0YWcpKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGluZyBpcyBtb2RpZmllZCBmcm9tIGV2YWQzNydzIFwiUmF0ZXJcIlxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5pbmNsdWRlcygnICcpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGdlbmVyYXRpb25hbFN1ZmZpeCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoLyAoPzpbSlNdci4/fFtJVlhdKykkLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uYWxTdWZmaXggPSBuYW1lLnNsaWNlKG5hbWUubGFzdEluZGV4T2YoJyAnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCcgJykpIHJldHVybiBuYW1lICsgZ2VuZXJhdGlvbmFsU3VmZml4O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdE5hbWUgPSBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UobmFtZS5sYXN0SW5kZXhPZignICcpICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sJC8sICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL08nLywgJ08nKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJOYW1lcyA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZignICcpKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUobGFzdE5hbWUgKyAnLCAnICsgb3RoZXJOYW1lcyArIGdlbmVyYXRpb25hbFN1ZmZpeCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld05hbWUgPSBuYW1lLnJlcGxhY2VBbGwoJ01yLicsICdNaXN0ZXInKS5yZXBsYWNlQWxsKCcmJywgJ0FuZCcpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGVhZGluZ0FydGljbGUgb2YgWydBbicsICdBJywgJ1RoZSddKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05hbWUuc3RhcnRzV2l0aChsZWFkaW5nQXJ0aWNsZSArICcgJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOYW1lID0gbmV3TmFtZS5zbGljZShsZWFkaW5nQXJ0aWNsZS5sZW5ndGggKyAxKSArICcsICcgKyBsZWFkaW5nQXJ0aWNsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobmV3TmFtZSA9PT0gbmFtZSkgbXcubm90aWZ5KFwicmVkaXJlY3QtaGVscGVyIHdhc24ndCBhYmxlIHRvIGRldGVybWluZSBhIHNvcnQga2V5IGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHBhZ2UgdGl0bGUhXCIsIHsgdHlwZTogJ3dhcm4nIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZShuZXdOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0KHRoaXMuZGVmYXVsdFNvcnRJbnB1dCwgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24sIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGBEZWZhdWx0IHNvcnQga2V5IChERUZBVUxUU09SVCkgKHNlZSA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybCgnV2lraXBlZGlhOkNhdGVnb3JpemF0aW9uI1NvcnQga2V5cycpfVwiIHRhcmdldD1cIl9ibGFua1wiPmd1aWRlbGluZTwvYT4pOmApLFxuICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIENhdGVnb3JpZXMgc2VsZWN0aW9uICovXG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQgPSBuZXcgQ2F0ZWdvcnlJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIGNhdGVnb3JpZXMgaGVyZScgfSk7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eQ2F0ZWdvcnk6LywgJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ3Nob3dpbmctdmFsdWVzJywgKHBhZ2VzOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHRoaXMuY2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhZ2UuZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QgPSBuZXcgT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQoeyBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLCBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsIGlucHV0V2lkZ2V0OiB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQgfSk7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9ICh0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHRoaXMuY2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuY2F0ZWdvcnlTZWxlY3QsIHsgbGFiZWw6ICdDYXRlZ29yaWVzOicsIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sIGFsaWduOiAndG9wJyB9KTtcblxuICAgICAgICAgICAgLyogU3VtbWFyeSBpbnB1dCAqL1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXQgPSBuZXcgT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZXNvbHZlIGRvdWJsZSByZWRpcmVjdCcgfSwgLy9cbiAgICAgICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVzb2x2ZSBzZWxmIHJlZGlyZWN0JyB9LFxuICAgICAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZW1vdmUgaW5jb3JyZWN0IHJjYXRzJyB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5zdW1tYXJ5SW5wdXQsIHsgaWQ6ICdyZWRpcmVjdC1oZWxwZXItc3VtbWFyeS1sYXlvdXQnLCBsYWJlbDogJ1N1bW1hcnk6JywgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSwgYWxpZ246ICd0b3AnIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIHRoZSBlbGVtZW50cyBpbiB0aGUgc3VibWl0IGJ1dHRvbiByb3cuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGxvYWRTdWJtaXRFbGVtZW50cygpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgIC8qIFNldHVwIHN1Ym1pdCBidXR0b24gKi9cbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU3VibWl0JywgZGlzYWJsZWQ6IHRydWUsIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10gfSk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB0aGlzLmhhbmRsZVN1Ym1pdEJ1dHRvbkNsaWNrKCkpO1xuXG4gICAgICAgICAgICAvKiBTZXR1cCBzaG93IHByZXZpZXcgYnV0dG9uICovXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cgPSBuZXcgVGVtcGxhdGVQcmV2aWV3RGlhbG9nKHsgc2l6ZTogJ2xhcmdlJyB9LCB0aGlzLnBhZ2VUaXRsZVBhcnNlZCk7XG4gICAgICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3RlbXBsYXRlUHJldmlld0RpYWxvZ10pO1xuXG4gICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU2hvdyBwcmV2aWV3JywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cuc2V0RGF0YShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVQcmV2aWV3RGlhbG9nLm9wZW4oKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBTZXR1cCBzaG93IGNoYW5nZXMgYnV0dG9uICovXG4gICAgICAgICAgICBjb25zdCBzaG93Q2hhbmdlc0RpYWxvZyA9IG5ldyBTaG93Q2hhbmdlc0RpYWxvZyh7IHNpemU6ICdsYXJnZScgfSk7XG4gICAgICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3Nob3dDaGFuZ2VzRGlhbG9nXSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTaG93IGNoYW5nZXMnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24ub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4aXN0cykgdGhpcy5wYWdlQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGUpO1xuXG4gICAgICAgICAgICAgICAgc2hvd0NoYW5nZXNEaWFsb2cuc2V0RGF0YShbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBzaG93Q2hhbmdlc0RpYWxvZy5vcGVuKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogU2V0dXAgc3luYyB0YWxrIGNoZWNrYm94ICovXG4gICAgICAgICAgICBpZiAoIXRoaXMucGFnZVRpdGxlUGFyc2VkLmlzVGFsa1BhZ2UoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudGFsa0RhdGEgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIHByb3A6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCh7IHNlbGVjdGVkOiAhIXRoaXMudGFsa0RhdGEucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3hMYXlvdXQgPSBuZXcgT08udWkuV2lkZ2V0KHsgY29udGVudDogW25ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnN5bmNUYWxrQ2hlY2tib3gsIHsgbGFiZWw6ICdTeW5jIHRhbGsgcGFnZScsIGFsaWduOiAnaW5saW5lJyB9KV0gfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFNldHVwIHBhdHJvbCBjaGVja2JveCAqL1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tTaG91bGRQcm9tcHRQYXRyb2woKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCh7IHNlbGVjdGVkOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveExheW91dCA9IG5ldyBPTy51aS5XaWRnZXQoeyBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMucGF0cm9sQ2hlY2tib3gsIHsgbGFiZWw6ICdNYXJrIGFzIHBhdHJvbGxlZCcsIGFsaWduOiAnaW5saW5lJyB9KV0gfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFNldHVwIGxheW91dCAqL1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRMYXlvdXQgPSBuZXcgT08udWkuSG9yaXpvbnRhbExheW91dCh7XG4gICAgICAgICAgICAgICAgaWQ6ICdyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dCcsXG4gICAgICAgICAgICAgICAgaXRlbXM6IFt0aGlzLnN1Ym1pdEJ1dHRvbiwgdGhpcy5zaG93UHJldmlld0J1dHRvbiwgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbiwgdGhpcy5zeW5jVGFsa0NoZWNrYm94TGF5b3V0LCB0aGlzLnBhdHJvbENoZWNrYm94TGF5b3V0XS5maWx0ZXIoQm9vbGVhbikgYXMgT08udWkuV2lkZ2V0W10sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCB0byBwYXRyb2wgdGhlIHBhZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGNoZWNrU2hvdWxkUHJvbXB0UGF0cm9sKCkge1xuICAgICAgICAgICAgY29uc3QgcGFnZVRyaWFnZU1hcmtCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmsgLm13ZS1wdC10b29sLWljb24nKSBhcyBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgIHBhZ2VUcmlhZ2VNYXJrQnV0dG9uPy5jbGljaygpO1xuICAgICAgICAgICAgcGFnZVRyaWFnZU1hcmtCdXR0b24/LmNsaWNrKCk7XG5cbiAgICAgICAgICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpICE9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGF0cm9sbGluaycpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtd2UtcHQtbWFyay1hcy1yZXZpZXdlZC1idXR0b24nKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmstYXMtdW5yZXZpZXdlZC1idXR0b24nKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7IGFjdGlvbjogJ3F1ZXJ5JywgbWV0YTogJ3VzZXJpbmZvJywgdWlwcm9wOiAncmlnaHRzJyB9IHNhdGlzZmllcyBBcGlRdWVyeVVzZXJJbmZvUGFyYW1zKSkgYXMgVXNlclBlcm1pc3Npb25zUmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgaWYgKCF1c2VyUGVybWlzc2lvbnMucXVlcnkudXNlcmluZm8ucmlnaHRzLmluY2x1ZGVzKCdwYXRyb2wnKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0cm9sUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncGFnZXRyaWFnZWxpc3QnLFxuICAgICAgICAgICAgICAgICAgICBwYWdlX2lkOiBtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcykpIGFzIFBhZ2VUcmlhZ2VMaXN0UmVzcG9uc2U7XG5cbiAgICAgICAgICAgICAgICBpZiAocGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXNbMF0/LnVzZXJfbmFtZSA9PT0gbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucmVzdWx0ICE9PSAnc3VjY2VzcycgfHwgcGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gIU51bWJlci5wYXJzZUludChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlc1swXT8ucGF0cm9sX3N0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlcyB0aGUgc3VtbWFyeSBpbnB1dCBwbGFjZWhvbGRlci5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgdXBkYXRlU3VtbWFyeSgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0VmFsdWUgPSB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgICAgIGlmICghcmVkaXJlY3RWYWx1ZSkgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gJyc7XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmV4aXN0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldENoYW5nZWQgPSByZWRpcmVjdFZhbHVlICE9PSB0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0Py5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3NDaGFuZ2VkID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKCh0YWcpID0+ICF0aGlzLm9sZFJlZGlyZWN0VGFncyEuaW5jbHVkZXModGFnIGFzIHN0cmluZykpIHx8IHRoaXMub2xkUmVkaXJlY3RUYWdzIS5zb21lKCh0YWcpID0+ICF0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZykpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHRhZ0FyZ3VtZW50c0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnc1dpdGhQYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykuZmlsdGVyKChbLCBkYXRhXSkgPT4gT2JqZWN0LmVudHJpZXMoZGF0YS5wYXJhbWV0ZXJzKS5sZW5ndGggPiAwKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFt0YWcsIGRhdGFdIG9mIHRhZ3NXaXRoUGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnV2FzU2VsZWN0ZWQgPSB0aGlzLm9sZFJlZGlyZWN0VGFncyEuaW5jbHVkZXModGFnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFnV2FzU2VsZWN0ZWQgfHwgIXRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXModGFnKSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFRhZ0RhdGEgPSB0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YVt0YWcgYXMgc3RyaW5nXSA/PyBPYmplY3QuZW50cmllcyhkYXRhLnBhcmFtZXRlcnMpLm1hcCgoW25hbWVdKSA9PiBbbmFtZSwgJyddKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRUYWdFZGl0b3JEYXRhID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5uYW1lID09PSB0YWcpITtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgZm91bmRUYWdFZGl0b3JEYXRhLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRBcmd1bWVudCA9IG9sZFRhZ0RhdGEuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50WzBdID09PSBwYXJhbWV0ZXIubmFtZSk/LlsxXSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdBcmd1bWVudCA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQXJndW1lbnQgIT09IG5ld0FyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0FyZ3VtZW50c0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdBcmd1bWVudHNDaGFuZ2VkKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTb3J0Q2hhbmdlZCA9IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKSAhPT0gdGhpcy5vbGREZWZhdWx0U29ydCEucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzQ2hhbmdlZCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKChjYXRlZ29yeSkgPT4gIXRoaXMub2xkQ2F0ZWdvcmllcyEuaW5jbHVkZXMoY2F0ZWdvcnkgYXMgc3RyaW5nKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRDYXRlZ29yaWVzIS5zb21lKChjYXRlZ29yeSkgPT4gIXRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyhjYXRlZ29yeSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldENoYW5nZWQpIGNoYW5nZXMucHVzaChgcmV0YXJnZXQgdG8gW1ske3JlZGlyZWN0VmFsdWV9XV1gKTtcbiAgICAgICAgICAgICAgICBpZiAodGFnc0NoYW5nZWQpIGNoYW5nZXMucHVzaCgnY2hhbmdlIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlcycpO1xuICAgICAgICAgICAgICAgIGlmICh0YWdBcmd1bWVudHNDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goJ2NoYW5nZSBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBhcmd1bWVudHMnKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFNvcnRDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goJ2NoYW5nZSBkZWZhdWx0IHNvcnQga2V5Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGNhdGVnb3JpZXNDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goJ2NoYW5nZSBjYXRlZ29yaWVzJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIGNoYW5nZXMucHVzaCgncGVyZm9ybSByZWRpcmVjdCBjbGVhbnVwJyk7XG5cbiAgICAgICAgICAgICAgICBjaGFuZ2VzWzBdID0gY2hhbmdlc1swXVswXS50b1VwcGVyQ2FzZSgpICsgY2hhbmdlc1swXS5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPiAxKSBjaGFuZ2VzW2NoYW5nZXMubGVuZ3RoIC0gMV0gPSBgYW5kICR7Y2hhbmdlcy5hdCgtMSl9YDtcblxuICAgICAgICAgICAgICAgICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlciA9IGNoYW5nZXMuam9pbihjaGFuZ2VzLmxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgICAgICAgICAgIH0gZWxzZSAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSBgQ3JlYXRlIHJlZGlyZWN0IHRvIFtbJHtyZWRpcmVjdFZhbHVlfV1dYDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyBleGlzdGluZyBwYWdlIGRhdGEuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGxvYWRFeGlzdGluZ0RhdGEoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5leGlzdHMpIHRoaXMucGFnZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlKTtcblxuICAgICAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhcmdldCA9IHRoaXMucmVkaXJlY3RSZWdleC5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMV07XG5cbiAgICAgICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdzID0gKFxuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKFt0YWcsIHRhZ0RhdGFdKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RhZywgLi4udGFnRGF0YS5hbGlhc2VzXS5zb21lKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KHRoaXMucGFnZUNvbnRlbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW11cbiAgICAgICAgICAgICkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUmVkaXJlY3RUYWdzID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcylcbiAgICAgICAgICAgICAgICAuZmxhdE1hcCgoW3RhZywgdGFnRGF0YV0pID0+IFt0YWcsIC4uLnRhZ0RhdGEuYWxpYXNlc10pXG4gICAgICAgICAgICAgICAgLm1hcCgodGFnT3JSZWRpcmVjdCkgPT4gKG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KHRoaXMucGFnZUNvbnRlbnQpID8gdGFnT3JSZWRpcmVjdCA6IG51bGwpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsUmVkaXJlY3RUYWdzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ1swXS50b0xvd2VyQ2FzZSgpfSR7dGFnWzBdfV0ke3RhZy5zbGljZSgxKX1cXFxcfD8oLio/KVxcXFxzKn19YCkuZXhlYyh0aGlzLnBhZ2VDb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VGFnID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykuZmluZCgoW3RlbXBsYXRlLCB0YWdEYXRhXSkgPT4gW3RlbXBsYXRlLCAuLi50YWdEYXRhLmFsaWFzZXNdLmluY2x1ZGVzKHRhZykpPy5bMF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQXJndW1lbnRzID0gbWF0Y2g/LlsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JpZ2luYWxBcmd1bWVudHMpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRBcmd1bWVudHMgPSBtYXRjaFsxXS5zcGxpdCgnfCcpLm1hcCgoYXJndW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmd1bWVudC5pbmNsdWRlcygnPScpKSByZXR1cm4gWyhpbmRleCArIDEpLnRvU3RyaW5nKCksIGFyZ3VtZW50LnRyaW0oKV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gYXJndW1lbnQuc3BsaXQoJz0nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbmFtZS50cmltKCksIHZhbHVlLnRyaW0oKV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuZXdUYWcsIGZvcm1hdHRlZEFyZ3VtZW50c107XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgW3N0cmluZywgc3RyaW5nW11bXV1bXSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMub2xkRGVmYXVsdFNvcnQgPVxuICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgLm1hdGNoKC97e0RFRkFVTFRTT1JUOi4qP319L2cpXG4gICAgICAgICAgICAgICAgICAgID8uYXQoLTEpXG4gICAgICAgICAgICAgICAgICAgID8uc2xpY2UoMTQsIC0yKVxuICAgICAgICAgICAgICAgICAgICA/LnRyaW0oKSA/PyAnJztcblxuICAgICAgICAgICAgdGhpcy5vbGRDYXRlZ29yaWVzID0gdGhpcy5wYWdlQ29udGVudC5tYXRjaCgvXFxbXFxbW0NjXWF0ZWdvcnk6Lis/XV0vZyk/Lm1hcCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnNsaWNlKDExLCAtMikpID8/IFtdO1xuXG4gICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCA9IFtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50Lm1hdGNoKC97e3Nob3J0IGRlc2NyaXB0aW9uXFx8Lio/fX0vaSk/LlswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50Lm1hdGNoKC97e0RJU1BMQVlUSVRMRTouKj99fS8pPy5bMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudC5tYXRjaCgve3tpdGFsaWMgdGl0bGVcXHw/Lio/fX0vaSk/LlswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50Lm1hdGNoKC97e3RpdGxlIGxhbmd1YWdlXFx8Lio/fX0vKT8uWzBdLFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0KSB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUodGhpcy5vbGRSZWRpcmVjdFRhcmdldC5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICBlbHNlIG13Lm5vdGlmeSgnQ291bGQgbm90IGZpbmQgcmVkaXJlY3QgdGFyZ2V0IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUodGhpcy5vbGRSZWRpcmVjdFRhZ3MpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kVGVtcGxhdGVFZGl0b3IgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0ZW1wbGF0ZU5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghZm91bmRUZW1wbGF0ZUVkaXRvcikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBhcmd1bWVudF0gb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFBhcmFtZXRlckVkaXRvciA9IGZvdW5kVGVtcGxhdGVFZGl0b3IucGFyYW1ldGVycy5maW5kKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgLi4ucGFyYW1ldGVyLmFsaWFzZXNdLmluY2x1ZGVzKHBhcmFtZXRlck5hbWUpKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRQYXJhbWV0ZXJFZGl0b3IpIGZvdW5kUGFyYW1ldGVyRWRpdG9yLmVkaXRvci5zZXRWYWx1ZShhcmd1bWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5vbGREZWZhdWx0U29ydCkgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKHRoaXMub2xkRGVmYXVsdFNvcnQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIHRoaXMub2xkQ2F0ZWdvcmllcykgdGhpcy5jYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUoY2F0ZWdvcnkpO1xuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZSh0aGlzLm9sZENhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gKHsgZGF0YTogY2F0ZWdvcnksIGxhYmVsOiBjYXRlZ29yeSB9KSkpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSdW5zIGNoZWNrcyBvbiB0aGUgcHJvdmlkZWQgZGF0YSBhbmQgcmV0dXJucyB0aGUgZXJyb3JzIChpZiBhbnkpLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVN1Ym1pc3Npb24oKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvcnM6IHsgdGl0bGU/OiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZzsgYXV0b0ZpeGVzPzogKHsgdHlwZTogJ2FkZCcgfCAncmVtb3ZlJzsgdGFnOiBzdHJpbmcgfSB8IHsgdHlwZTogJ2NoYW5nZS10YXJnZXQnOyB0YXJnZXQ6IHN0cmluZyB9KVtdIH1bXSA9IFtdO1xuXG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgICAgICAvKiBJbnZhbGlkIGNoYXJhY3RlcnMgKi9cbiAgICAgICAgICAgIGlmICghL15cXHMqW15bXFxde3x9XStcXHMqJC8udGVzdChkZXN0aW5hdGlvbikpIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgcGFnZSB0aXRsZSEnIH0pO1xuXG4gICAgICAgICAgICAvKiBGYWlsZWQgZHVyaW5nIHRpdGxlIHBhcnNpbmcgKi9cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZWREZXN0aW5hdGlvbiA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KGRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAwKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJzZWREZXN0aW5hdGlvbiAmJiBlcnJvcnMubGVuZ3RoID09PSAwKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcblxuICAgICAgICAgICAgLyogU2VsZiByZWRpcmVjdHMgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlZERlc3RpbmF0aW9uPy50b1N0cmluZygpID09PSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC50b1N0cmluZygpKSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdjYW5ub3QgcmVkaXJlY3QgdG8gaXRzZWxmIScgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uRGF0YSA9IChhd2FpdCB0aGlzLmFwaVxuICAgICAgICAgICAgICAgIC5nZXQoeyBhY3Rpb246ICdxdWVyeScsIGZvcm1hdHZlcnNpb246ICcyJywgcHJvcDogWydwYWdlcHJvcHMnLCAnY2F0ZWdvcmllcyddLCB0aXRsZXM6IGRlc3RpbmF0aW9uIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UGFnZVByb3BzUGFyYW1zKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3JDb2RlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLyogTm9uZXhpc3RlbnQgZGVzdGluYXRpb24gKi8gaWYgKGVycm9yQ29kZSA9PT0gJ21pc3Npbmd0aXRsZScpIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnZG9lcyBub3QgZXhpc3QhJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgLyogT3RoZXIgQVBJIGVycm9yICovIGVsc2UgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6IGB3YXMgbm90IGFibGUgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBBUEkgKCR7ZXJyb3JDb2RlfSkhYCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSkpIGFzIChQYWdlcHJvcHNSZXN1bHQgJiBDYXRlZ29yaWVzUmVzdWx0KSB8IG51bGw7XG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblBhcnNlUmVzdWx0ID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7IGFjdGlvbjogJ3BhcnNlJywgcGFnZTogZGVzdGluYXRpb24sIHByb3A6ICdzZWN0aW9ucycsIHJlZGlyZWN0czogdHJ1ZSB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcykpIGFzIFBhZ2VQYXJzZVJlc3VsdDtcblxuICAgICAgICAgICAgLyogRG91YmxlIHJlZGlyZWN0cyAqL1xuICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzPy5bMF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblJlZGlyZWN0ID1cbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5yZWRpcmVjdHNbMF0udG8gKyAoZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5yZWRpcmVjdHNbMF0udG9mcmFnbWVudCA/IGAjJHtkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnJlZGlyZWN0c1swXS50b2ZyYWdtZW50fWAgOiAnJyk7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogZGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25SZWRpcmVjdCxcbiAgICAgICAgICAgICAgICAgICAgKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2Rlc3RpbmF0aW9uUmVkaXJlY3R9PC9hPi4gUmV0YXJnZXQgdG8gdGhhdCBwYWdlIGluc3RlYWQsIGFzIGRvdWJsZSByZWRpcmVjdHMgYXJlbid0IGFsbG93ZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnY2hhbmdlLXRhcmdldCcsIHRhcmdldDogZGVzdGluYXRpb25SZWRpcmVjdCB9XSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogTm9uZXhpc3RlbnQgc2VjdGlvbiAqL1xuICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uLnNwbGl0KCcjJykubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkU2VjdGlvbiA9IGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2Uuc2VjdGlvbnMuZmluZCgoc2VjdGlvbikgPT4gc2VjdGlvbi5saW5lLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpID09PSBkZXN0aW5hdGlvbi5zcGxpdCgnIycpWzFdKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRTZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHRvIGFuY2hvcicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyB0YWdnZWQgYXMgYSByZWRpcmVjdCB0byBhbiBhbmNob3IsIGJ1dCBpdCBpcyBhY3R1YWxseSBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdhZGQnLCB0YWc6ICdSIHRvIHNlY3Rpb24nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1IgdG8gYW5jaG9yJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKCdSIHRvIHNlY3Rpb24nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBzZWN0aW9uLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB0byBzZWN0aW9ufX08L2NvZGU+IScsIGF1dG9GaXhlczogW3sgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gc2VjdGlvbicgfV0gfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Db250ZW50ID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhcnNlZERlc3RpbmF0aW9uIS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICkucXVlcnkucGFnZXNbMF0ucmV2aXNpb25zWzBdLnNsb3RzLm1haW4uY29udGVudDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNob3JzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaCgvKD88PXt7XFxzKj9bQWFdKD86bmNob3JzP3xuY2hvciBmb3IgcmVkaXJlY3R8bmtlcnxOQ0hPUnxuYylcXHMqP1xcfCkuKz8oPz19fSkvZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGFuY2hvci5zcGxpdCgnfCcpLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uZmxhdCgpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goLyg/PD17e1xccyo/KD86W1Z2XSg/OmlzaWJsZSBhbmNob3JzP3xpc2FuY3xBbmNofGFuY2hvcnxpc2libGVhbmNob3J8YSl8W0FhXSg/Om5jaG9yZHxjaG9yZWR8bmNob3JcXCspfFtUdF1leHQgYW5jaG9yKVxccyo/XFx8KS4rPyg/PSg/PCEhfD0pfX0pL2cpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5tYXAoKGFuY2hvcjogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnfCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBwYXJ0LnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhcnQpID0+ICEvXnRleHRcXHMqPz0vLnRlc3QocGFydCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmZsYXQoKSA/PyBbXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50Lm1hdGNoKC8oPzw9aWQ9KVwiPy4rPyg/PVwifD58XFx8KS9nKT8ubWFwKChhbmNob3I6IHN0cmluZykgPT4gYW5jaG9yLnRyaW0oKSkgPz8gW10pLFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYW5jaG9ycy5pbmNsdWRlcyhkZXN0aW5hdGlvbi5zcGxpdCgnIycpWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXMoJ1IgdG8gc2VjdGlvbicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIHRhZ2dlZCBhcyBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiwgYnV0IGl0IGlzIGFjdHVhbGx5IGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yIScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBhbmNob3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZW1vdmUnLCB0YWc6ICdSIHRvIHNlY3Rpb24nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhZ3MuaW5jbHVkZXMoJ1IgdG8gYW5jaG9yJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhbiBhbmNob3IsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIGZyb20gYW5jaG9yfX08L2NvZGU+IScsIGF1dG9GaXhlczogW3sgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gYW5jaG9yJyB9XSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIGEgcmVkaXJlY3QgdG8gPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwoZGVzdGluYXRpb24pfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7ZGVzdGluYXRpb259PC9hPiwgYnV0IHRoYXQgc2VjdGlvbiBvciBhbmNob3IgZG9lcyBub3QgZXhpc3QhYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdjaGFuZ2UtdGFyZ2V0JywgdGFyZ2V0OiBkZXN0aW5hdGlvbi5zcGxpdCgnIycpWzBdIH1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBJbXByb3Blcmx5IHRhZ2dlZCBhcyByZWRpcmVjdCB0byBzZWN0aW9uL2FuY2hvciAqL1xuICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uLnNwbGl0KCcjJykubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIFsnUiB0byBzZWN0aW9uJywgJ1IgdG8gYW5jaG9yJ10pXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKHRhZykpIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogYGlzIG5vdCBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbi9hbmNob3IsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCA8Y29kZT57eyR7dGFnfX19PC9jb2RlPiFgLCBhdXRvRml4ZXM6IFt7IHR5cGU6ICdyZW1vdmUnLCB0YWcgfV0gfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlID0gISEoZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5wYWdlcHJvcHMgJiYgJ2Rpc2FtYmlndWF0aW9uJyBpbiBkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnBhZ2Vwcm9wcyk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRJc1N1cm5hbWVMaXN0ID0gISFkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLmNhdGVnb3JpZXM/LnNvbWUoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50aXRsZSA9PT0gJ0NhdGVnb3J5OlN1cm5hbWVzJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRvRGlzYW1iaWd1YXRpb25QYWdlVGFncyA9IFsnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJywgJ1IgZnJvbSBpbmNvbXBsZXRlIGRpc2FtYmlndWF0aW9uJ107XG4gICAgICAgICAgICBjb25zdCB0b1N1cm5hbWVMaXN0VGFncyA9IFsnUiBmcm9tIGFtYmlndW91cyBzb3J0IG5hbWUnLCAnUiBmcm9tIGFtYmlndW91cyB0ZXJtJ107XG5cbiAgICAgICAgICAgIGNvbnN0IHRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSA9IHRvRGlzYW1iaWd1YXRpb25QYWdlVGFncy5zb21lKCh0ZW1wbGF0ZSkgPT4gdGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpO1xuICAgICAgICAgICAgY29uc3QgdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QgPSB0b1N1cm5hbWVMaXN0VGFncy5zb21lKCh0ZW1wbGF0ZSkgPT4gdGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpO1xuXG4gICAgICAgICAgICAvKiBSZWRpcmVjdCB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlIHdpdGhvdXQgdGVtcGxhdGUgKi9cbiAgICAgICAgICAgIGlmICh0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSAmJiAhdGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlICYmICF0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdClcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgZGlzYW1iaWd1YXRpb24gcGFnZSwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCBhIGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScgfSk7XG5cbiAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnBhZ2Vwcm9wcyAmJiAhdGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UpIHtcbiAgICAgICAgICAgICAgICAvKiBJbXByb3Blcmx5IHRhZ2dlZCBhcyByZWRpcmVjdCB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlICovXG4gICAgICAgICAgICAgICAgaWYgKCghdGFyZ2V0SXNTdXJuYW1lTGlzdCAmJiAodGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlIHx8IHRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0KSkgfHwgKHRhcmdldElzU3VybmFtZUxpc3QgJiYgdGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIG5vdCBhIHJlZGlyZWN0IHRvIGEgZGlzYW1iaWd1YXRpb24gcGFnZSwgYnV0IGl0IGlzIHRhZ2dlZCB3aXRoIGEgZGlzYW1iaWd1YXRpb24gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUhJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogWy4uLnRvRGlzYW1iaWd1YXRpb25QYWdlVGFncywgLi4udG9TdXJuYW1lTGlzdFRhZ3NdLm1hcCgodGFnKSA9PiAoeyB0eXBlOiAncmVtb3ZlJywgdGFnIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvKiBSZWRpcmVjdCB0byBzdXJuYW1lIGxpc3Qgd2l0aG91dCB0ZW1wbGF0ZSAqL1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRJc1N1cm5hbWVMaXN0ICYmICF0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdClcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhIHN1cm5hbWUgbGlzdCwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCBhIGNvcnJlY3QgZGlzYW1iaWd1YXRpb24gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUhJyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoge3tSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2V9fSB3aXRob3V0IFwiIChkaXNhbWJpZ3VhdGlvbilcIiBhdCBlbmQgb2YgdGl0bGUgKi9cbiAgICAgICAgICAgIGlmICh0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSAmJiB0YWdzLmluY2x1ZGVzKCdSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2UnKSAmJiAhdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0TWFpblRleHQoKS5lbmRzV2l0aCgnIChkaXNhbWJpZ3VhdGlvbiknKSlcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAnaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2V9fTwvY29kZT4sIGJ1dCB0aGlzIHRpdGxlIGRvZXMgbm90IGVuZCB3aXRoIFwiIChkaXNhbWJpZ3VhdGlvbilcIi4gVXNlIDxjb2RlPnt7UiBmcm9tIGFtYmlndW91cyB0ZXJtfX08L2NvZGU+IG9yIGEgc2ltaWxhciBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBpbnN0ZWFkIScsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZScgfV0sXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIFRhZ2dlZCB3aXRoIGEgcHJvdGVjdGlvbiB0ZW1wbGF0ZSAqL1xuICAgICAgICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiBbJ1Igc2VtaS1wcm90ZWN0ZWQnLCAnUiBleHRlbmRlZC1wcm90ZWN0ZWQnLCAnUiB0ZW1wbGF0ZS1wcm90ZWN0ZWQnLCAnUiBmdWxseSBwcm90ZWN0ZWQnXSlcbiAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyB0YWdnZWQgd2l0aCB1bm5lY2Vzc2FyaWx5IHRhZ2dlZCB3aXRoIDxjb2RlPnt7JHt0ZW1wbGF0ZX19fTwvY29kZT4gd2hpY2ggd2lsbCBiZSBkdXBsaWNhdGVkIGJ5IHRoZSByZWRpcmVjdCBjYXRlZ29yeSBzaGVsbCFgLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAncmVtb3ZlJywgdGFnOiB0ZW1wbGF0ZSB9XSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIExpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0gd2l0aG91dCBiZWluZyB0YWdnZWQgd2l0aCB7e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX0gKi9cbiAgICAgICAgICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z1dpa2liYXNlSXRlbUlkJykgJiYgIXRhZ3MuaW5jbHVkZXMoJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJykpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiBcImlzIGxpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0gYnV0IGl0IGlzbid0IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fTwvY29kZT4hXCIsIGF1dG9GaXhlczogW3sgdHlwZTogJ2FkZCcsIHRhZzogJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJyB9XSB9KTtcblxuICAgICAgICAgICAgLyogVGFnZ2VkIHdpdGgge3tSIHdpdGggV2lraWRhdGEgaXRlbX19IHdpdGhvdXQgYmVpbmcgbGlua2VkIHRvIGFuIGl0ZW0gKi9cbiAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHdpdGggV2lraWRhdGEgaXRlbScpICYmICFtdy5jb25maWcuZ2V0KCd3Z1dpa2liYXNlSXRlbUlkJykpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHdpdGggV2lraWRhdGEgaXRlbX19PC9jb2RlPiBidXQgaXQgaXMgbm90IGFjdHVhbGx5IGxpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0hJyxcbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAncmVtb3ZlJywgdGFnOiAnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nIH1dLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBNaXNzaW5nIHRhZyByZXF1aXJlZCBwYXJhbWV0ZXIgKi9cbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MgYXMgc3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5yZWRpcmVjdFRlbXBsYXRlc1t0YWddO1xuICAgICAgICAgICAgICAgIGlmICghdGFnRGF0YSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBPYmplY3QuZW50cmllcyh0YWdEYXRhLnBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kUGFyYW1ldGVyID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpXG4gICAgICAgICAgICAgICAgICAgICAgICA/LnBhcmFtZXRlcnMuZmluZCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIC4uLnBhcmFtZXRlci5hbGlhc2VzXS5pbmNsdWRlcyhwYXJhbWV0ZXJOYW1lKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZFBhcmFtZXRlcikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlckRhdGEucmVxdWlyZWQgJiYgIWZvdW5kUGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogYGlzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7JHt0YWd9fX08L2NvZGU+IGJ1dCBpdCBpcyBtaXNzaW5nIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXIgPGNvZGU+JHtwYXJhbWV0ZXJOYW1lfTwvY29kZT4hYCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFN5bmNpbmcgdGFsayBwYWdlIGJ1dCB0YWxrIHBhZ2UgZXhpc3RzIGFuZCBpc24ndCBhIHJlZGlyZWN0ICovXG4gICAgICAgICAgICBpZiAodGhpcy5zeW5jVGFsa0NoZWNrYm94Py5pc1NlbGVjdGVkKCkgJiYgIXRoaXMudGFsa0RhdGEhLnF1ZXJ5LnBhZ2VzWzBdLm1pc3NpbmcgJiYgIXRoaXMudGFsa0RhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0KVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgdGl0bGU6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLCBtZXNzYWdlOiAnZXhpc3RzLCBidXQgaXMgbm90IGEgcmVkaXJlY3QhJyB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYW5kbGVzIHRoZSBldmVudCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgXCJTdWJtaXRcIiBidXR0b24uXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGhhbmRsZVN1Ym1pdEJ1dHRvbkNsaWNrKCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNUb0Rpc2FibGUgPSBbXG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LFxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LFxuICAgICAgICAgICAgICAgIC4uLnRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5mbGF0TWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyLmVkaXRvcikpLFxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dCxcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LFxuICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0LFxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3gsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCxcbiAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNUb0Rpc2FibGUpIChlbGVtZW50IGFzIE9PLnVpLldpZGdldCkuc2V0RGlzYWJsZWQodHJ1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdDaGVja2luZyB0YXJnZXQgdmFsaWRpdHkuLi4nKTtcblxuICAgICAgICAgICAgbGV0IGVycm9yczogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLnZhbGlkYXRlU3VibWlzc2lvbj4+ID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy5uZWVkc0NoZWNrKSBlcnJvcnMgPSBhd2FpdCB0aGlzLnZhbGlkYXRlU3VibWlzc2lvbigpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkpO1xuXG4gICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJlZGlyZWN0LWhlbHBlci13YXJuaW5nJykpIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB7IHRpdGxlLCBtZXNzYWdlLCBhdXRvRml4ZXMgfSBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHt0aXRsZSA/IGA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybCh0aXRsZSl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHt0aXRsZX08L2E+YCA6ICdUaGlzIHBhZ2UnfSAke21lc3NhZ2V9IENsaWNrIGFnYWluIHdpdGhvdXQgbWFraW5nIGNoYW5nZXMgdG8gc3VibWl0IGFueXdheS5gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHsgdHlwZTogJ2Vycm9yJywgY2xhc3NlczogWydyZWRpcmVjdC1oZWxwZXItd2FybmluZyddLCBpbmxpbmU6IHRydWUsIGxhYmVsIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhdXRvRml4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG9GaXhCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdQZXJmb3JtIGF1dG8tZml4JywgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSwgY2xhc3NlczogWydyZWRpcmVjdC1oZWxwZXItYXV0b2ZpeC1idXR0b24nXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvRml4IG9mIGF1dG9GaXhlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeC50eXBlID09PSAnYWRkJyAmJiAhdGFncy5pbmNsdWRlcyhhdXRvRml4LnRhZykpIHRoaXMudGFnU2VsZWN0LmFkZFRhZyhhdXRvRml4LnRhZywgYXV0b0ZpeC50YWcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRvRml4LnR5cGUgPT09ICdyZW1vdmUnICYmIHRhZ3MuaW5jbHVkZXMoYXV0b0ZpeC50YWcpKSB0aGlzLnRhZ1NlbGVjdC5yZW1vdmVUYWdCeURhdGEoYXV0b0ZpeC50YWcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRvRml4LnR5cGUgPT09ICdjaGFuZ2UtdGFyZ2V0JykgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKGF1dG9GaXgudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXS5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdsaW5lLXRocm91Z2ggMnB4IGJsYWNrJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4QnV0dG9uLiRlbGVtZW50WzBdLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdNZXNzYWdlLiRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy5vby11aS1sYWJlbEVsZW1lbnQtbGFiZWwnKSEuYXBwZW5kKGF1dG9GaXhCdXR0b24uJGVsZW1lbnRbMF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JCb3guJGVsZW1lbnRbMF0uYXBwZW5kKHdhcm5pbmdNZXNzYWdlLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNUb0Rpc2FibGUpIChlbGVtZW50IGFzIE9PLnVpLldpZGdldCkuc2V0RGlzYWJsZWQoZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCBhbnl3YXknKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogRWRpdC9jcmVhdGUgcmVkaXJlY3QgKi9cbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKGAke3RoaXMuZXhpc3RzID8gJ0VkaXRpbmcnIDogJ0NyZWF0aW5nJ30gcmVkaXJlY3QuLi5gKTtcblxuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gKHRoaXMuc3VtbWFyeUlucHV0LmdldFZhbHVlKCkgfHwgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyKSArIHRoaXMuc2NyaXB0QWR2ZXJ0O1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZSh0aGlzLnBhZ2VUaXRsZSwgb3V0cHV0LCBzdW1tYXJ5KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm47XG5cbiAgICAgICAgICAgIG13Lm5vdGlmeShgUmVkaXJlY3QgJHt0aGlzLmV4aXN0cyA/ICdlZGl0ZWQnIDogJ2NyZWF0ZWQnfSBzdWNjZXNzZnVsbHkhYCwgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG5cbiAgICAgICAgICAgIC8qIFN5bmMgdGFsayBwYWdlIGNoZWNrYm94IGhhbmRsZXIgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLnN5bmNUYWxrQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdFZGl0aW5nIHRhbGsgcGFnZS4uLicpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbU1vdmUgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKCdSIGZyb20gbW92ZScpO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5jcmVhdGVPdXRwdXQodGhpcy5wYXJzZWREZXN0aW5hdGlvbiEuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksIGZyb21Nb3ZlID8gWydSIGZyb20gbW92ZSddIDogW10sIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBbXSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0YWxrUmVzdWx0ID0gYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUodGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksIG91dHB1dCwgJ1N5bmNpbmcgcmVkaXJlY3QgZnJvbSBtYWluIHBhZ2UnICsgdGhpcy5zY3JpcHRBZHZlcnQpO1xuICAgICAgICAgICAgICAgIGlmICghdGFsa1Jlc3VsdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgbXcubm90aWZ5KCdUYWxrIHBhZ2Ugc3luY2VkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogUGF0cm9sIGNoZWNrYm94IGhhbmRsZXIgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLnBhdHJvbENoZWNrYm94Py5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnUGF0cm9sbGluZyByZWRpcmVjdC4uLicpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0cm9sTGluazogSFRNTEFuY2hvckVsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhdHJvbGxpbmsgYScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtSZXZpZXdlZEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtd2UtcHQtbWFyay1hcy1yZXZpZXdlZC1idXR0b24nKSBhcyBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAocGF0cm9sTGluaykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRyb2xSZXN1bHQgPSBhd2FpdCB0aGlzLmFwaVxuICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3RXaXRoVG9rZW4oJ3BhdHJvbCcsIHsgYWN0aW9uOiAncGF0cm9sJywgcmNpZDogbmV3IFVSTChwYXRyb2xMaW5rLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoJ3JjaWQnKSEgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9ySW5mbzogTWVkaWFXaWtpRGF0YUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBFcnJvciBwYXRyb2xsaW5nICR7dGhpcy5wYWdlVGl0bGV9IHZpYSBBUEk6ICR7ZXJyb3JJbmZvPy5lcnJvci5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLCB7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHJvbFJlc3VsdCkgbXcubm90aWZ5KCdSZWRpcmVjdCBwYXRyb2xsZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWFya1Jldmlld2VkQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtSZXZpZXdlZEJ1dHRvbi5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoJ1JlZGlyZWN0IHBhdHJvbGxlZCBzdWNjZXNzZnVsbHkhJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIG13Lm5vdGlmeSgnUGFnZSBjdXJhdGlvbiB0b29sYmFyIG5vdCBmb3VuZCwgcmVkaXJlY3QgY2Fubm90IGJlIHBhdHJvbGxlZCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdDb21wbGV0ZSwgcmVsb2FkaW5nLi4uJyk7XG5cbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gbXcudXRpbC5nZXRVcmwodGhpcy5wYWdlVGl0bGUsIHsgcmVkaXJlY3Q6ICdubycgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgKiBUYWtlcyBwcm92aWRlZCB2YWx1ZXMgdG8gY3JlYXRlIHRoZSBwYWdlIG91dHB1dC5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgY3JlYXRlT3V0cHV0KHRhcmdldDogc3RyaW5nLCB0YWdzOiBzdHJpbmdbXSwgc3RyYXlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGRlZmF1bHRTb3J0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGNhdGVnb3JpZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRUYXJnZXQgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh0YXJnZXQpO1xuXG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRUaXRsZSA9IHBhcnNlZFRhcmdldFxuICAgICAgICAgICAgICAgID8gYCR7cGFyc2VkVGFyZ2V0LmdldE5hbWVzcGFjZUlkKCkgPT09IDE0ID8gJzonIDogJyd9JHtwYXJzZWRUYXJnZXQuZ2V0UHJlZml4ZWRUZXh0KCl9JHtwYXJzZWRUYXJnZXQuZ2V0RnJhZ21lbnQoKSA/IGAjJHtwYXJzZWRUYXJnZXQuZ2V0RnJhZ21lbnQoKX1gIDogJyd9YFxuICAgICAgICAgICAgICAgIDogdGFyZ2V0LnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkXG4gICAgICAgICAgICAgICAgICAgIC5nZXRNYWluVGV4dCgpXG4gICAgICAgICAgICAgICAgICAgIC50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgIC5ub3JtYWxpemUoJ05GRCcpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKC9bXFx1MDMwMC1cXHUwMzZGXS9nLCAnJykgPT09XG4gICAgICAgICAgICAgICAgZGVmYXVsdFNvcnRcbiAgICAgICAgICAgICAgICAgICAgPy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgIC5ub3JtYWxpemUoJ05GRCcpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKC9bXFx1MDMwMC1cXHUwMzZGXS9nLCAnJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBkZWZhdWx0U29ydCA9IHVuZGVmaW5lZDsgLy8gQ2hlY2sgaWYgdGl0bGVzIG5vcm1hbGl6ZSB0byB0aGUgc2FtZSB0ZXh0LCBhbmQgcmVtb3ZlcyB0aGUgREVGQVVMVFNPUlQgaWYgc29cblxuICAgICAgICAgICAgY29uc3QgdGFnc1dpdGhBcmd1bWVudHMgPSB0YWdzLm1hcCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRBcmd1bWVudEVkaXRvciA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZEFyZ3VtZW50RWRpdG9yKSByZXR1cm4gYHt7JHt0YWd9fX1gO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkQXJndW1lbnRzID0gZm91bmRBcmd1bWVudEVkaXRvci5wYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhcmFtZXRlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYHwke3BhcmFtZXRlci5uYW1lID09PSAoaW5kZXggKyAxKS50b1N0cmluZygpID8gJycgOiBgJHtwYXJhbWV0ZXIubmFtZX09YH0ke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGB7eyR7dGFnfSR7bWFwcGVkQXJndW1lbnRzfX19YDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIGAjUkVESVJFQ1QgW1ske2Zvcm1hdHRlZFRpdGxlfV1dXFxuYCwgLy9cbiAgICAgICAgICAgICAgICB0YWdzLmxlbmd0aCA+IDAgPyBge3tSZWRpcmVjdCBjYXRlZ29yeSBzaGVsbHxcXG4ke3RhZ3NXaXRoQXJndW1lbnRzLmpvaW4oJ1xcbicpfVxcbn19XFxuYCA6IG51bGwsXG4gICAgICAgICAgICAgICAgc3RyYXlUZXh0ID8gc3RyYXlUZXh0ICsgJ1xcbicgOiBudWxsLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRTb3J0ID8gYHt7REVGQVVMVFNPUlQ6JHtkZWZhdWx0U29ydC50cmltKCl9fX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzLmxlbmd0aCA+IDAgPyBjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IGBbW0NhdGVnb3J5OiR7Y2F0ZWdvcnl9XV1gKS5qb2luKCdcXG4nKSA6IG51bGwsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaGVzIHRoZSBjb250ZW50IG9mIGEgZ2l2ZW4gcGFnZS5cbiAgICAgICAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSB0byBmZXRjaC5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgZ2V0UGFnZUNvbnRlbnQodGl0bGU6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZXM6IHRpdGxlLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICAgICAgKS5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFZGl0cyBvciBjcmVhdGVzIGEgcGFnZSB3aXRoIGdpdmVuIHRleHQuXG4gICAgICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgcGFnZSB0aXRsZS5cbiAgICAgICAgICogQHBhcmFtIHRleHQgVGhlIHBhZ2UgdGV4dC5cbiAgICAgICAgICogQHBhcmFtIHN1bW1hcnkgVGhlIGVkaXQgc3VtbWFyeS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgZWRpdE9yQ3JlYXRlKHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgc3VtbWFyeTogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAuZWRpdCh0aXRsZSwgKCkgPT4gKHsgdGV4dCwgc3VtbWFyeSB9KSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb2RlID09PSAnbm9jcmVhdGUtbWlzc2luZycpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGkuY3JlYXRlKHRpdGxlLCB7IHN1bW1hcnkgfSwgdGV4dCkuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgRXJyb3IgY3JlYXRpbmcgJHt0aXRsZX06ICR7ZXJyb3JJbmZvPy5lcnJvci5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLCB7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYEVycm9yIGVkaXRpbmcgb3IgY3JlYXRpbmcgJHt0aXRsZX06ICR7ZXJyb3JJbmZvPy5lcnJvci5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLCB7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmV3IFJlZGlyZWN0SGVscGVyKCkucnVuKCk7XG59KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7OzthQTZDQSxHQUFHLE9BQU8sTUFBTSxDQUFDLGlCQUFrQixlQUFnQixrQkFBbUIsa0JBQW1CLCtCQUFnQyxtQ0FBbUMsRUFBRyxJQUFNLENBTWpLLE1BQU1BLFVBQWtDLEdBQUcsR0FBRyxlQUFnQixDQU8xRCxZQUFZQyxFQUE2QkMsRUFBMkIsQ0FDaEUsTUFBTUQsQ0FBTSxFQU5oQixLQUFRLElBQU0sSUFBSSxHQUFHLElBWXJCLHNCQUFtQixJQUFNLENBQ3JCLE1BQU1FLEVBQVEsS0FBSyxTQUFTLEVBQ3RCQyxFQUFXLEVBQUUsU0FBUyxFQUU1QixHQUFJLENBQUNELEVBQU9DLEVBQVMsUUFBUSxDQUFDLENBQUMsVUFDdEJELEVBQU0sU0FBUyxHQUFHLEVBQUcsQ0FDMUIsTUFBTUUsRUFBUUYsRUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBRWhDLEtBQUssSUFDQSxJQUFJLENBQUUsT0FBUSxRQUFTLEtBQU1FLEVBQU8sS0FBTSxXQUFZLFVBQVcsRUFBSyxDQUEwQixFQUNoRyxNQUFNLElBQU0sSUFBSSxFQUNoQixLQUFNQyxHQUFtQyxDQUN0QyxHQUFJQSxFQUFRLENBQ1IsTUFBTUMsRUFBa0JELEVBQU8sTUFBTSxTQUFTLE9BQVFFLEdBQ2xEQSxFQUFRLEtBQ0gsWUFBWSxFQUNaLFdBQVcsVUFBVyxFQUFFLEVBQ3hCLFdBQVdMLEVBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUNyRCxFQUNBQyxFQUFTLFFBQ0xHLEVBQWdCLElBQUtDLElBQWEsQ0FDOUIsS0FBTSxHQUFHRixFQUFPLE1BQU0sS0FBSyxJQUFJRSxFQUFRLEtBQUssV0FBVyxVQUFXLEVBQUUsQ0FBQyxHQUNyRSxNQUFPLEdBQUdGLEVBQU8sTUFBTSxLQUFLLElBQUlFLEVBQVEsS0FBSyxXQUFXLFVBQVcsRUFBRSxDQUFDLEVBQzFFLEVBQUUsQ0FDTixDQUNKLE1BQU9KLEVBQVMsUUFBUSxDQUFDLENBQUMsQ0FDOUIsQ0FBQyxDQUNULEtBQU8sQ0FDSCxNQUFNSyxFQUFjLEdBQUcsTUFBTSxZQUFZTixDQUFLLEVBRTlDLEtBQUssSUFDQSxJQUFJLENBQ0QsT0FBUSxRQUNSLGNBQWUsSUFDZixTQUFVLEdBQ1YsYUFBY00sR0FBYSxlQUFlLEdBQUssRUFDL0MsVUFBV0EsR0FBYSxZQUFZLEdBQUtOLEVBQ3pDLFVBQVcsV0FDWCxLQUFNLENBQUMsT0FBUSxXQUFXLENBQzlCLENBQTJDLEVBQzFDLE1BQU0sSUFBTSxJQUFJLEVBQ2hCLEtBQU1HLEdBQXdILENBQ3ZIQSxFQUNBRixFQUFTLFFBQ0xFLEVBQU8sT0FBTyxNQUNSQSxFQUFPLE1BQU0sTUFDUixPQUFRSSxHQUFTQSxFQUFLLFFBQVUsS0FBSyxnQkFBZ0IsU0FBUyxDQUFDLEVBQy9ELElBQUtBLElBQVUsQ0FDWixLQUFNQSxFQUFLLE1BQ1gsTUFBTyxJQUFJLEdBQUcsR0FBRyxZQUNiLEdBQUdBLEVBQUssS0FBSyxHQUFHQSxFQUFLLFdBQWEsbUJBQW9CQSxFQUFLLFVBQVksMkJBQTZCLEVBQUUsR0FBRyxhQUFjQSxFQUFPLHFCQUF1QixFQUFFLEVBQzNKLENBQ0osRUFBRSxFQUNOLENBQUMsQ0FDWCxFQUNDTixFQUFTLFFBQVEsQ0FBQyxDQUFDLENBQzVCLENBQUMsQ0FDVCxDQUVBLE9BQU9BLEVBQVMsUUFBUSxDQUFFLE9BQVEsQ0FBQyxDQUFFLENBQUMsQ0FDMUMsRUFFQSxvQ0FBcUNPLEdBQXFDQSxHQUFZLENBQUMsRUFFdkYsa0NBQWdDQyxHQUE0Q0EsRUFBSyxJQUFJLENBQUMsQ0FBRSxLQUFBQSxFQUFNLE1BQUFDLENBQU0sSUFBTSxJQUFJLEdBQUcsR0FBRyxpQkFBaUIsQ0FBRSxLQUFBRCxFQUFNLE1BQUFDLENBQU0sQ0FBQyxDQUFDLEVBckVqSixHQUFHLEdBQUcsTUFBTSxjQUFjLEtBQUssS0FBOENaLENBQU0sRUFFbkYsS0FBSyxnQkFBa0JDLENBQzNCLENBbUVKLENBRUEsT0FBTyxPQUFPRixFQUEwQixVQUFXLEdBQUcsR0FBRyxNQUFNLGNBQWMsU0FBUyxFQU90RixNQUFNYyxVQUE0QixHQUFHLEdBQUcsZUFBZ0IsQ0FJcEQsWUFBWWIsRUFBNkIsQ0FDckMsTUFBTUEsQ0FBTSxFQUhoQixLQUFRLElBQU0sSUFBSSxHQUFHLElBT3JCLHNCQUFtQixJQUFNLENBQ3JCLE1BQU1FLEVBQVEsS0FBSyxTQUFTLEVBQ3RCQyxFQUFXLEVBQUUsU0FBUyxFQUV2QkQsR0FBT0MsRUFBUyxRQUFRLENBQUMsQ0FBQyxFQUUvQixNQUFNSyxFQUFjLEdBQUcsTUFBTSxZQUFZTixDQUFLLEVBRTlDLFlBQUssSUFDQSxJQUFJLENBQ0QsT0FBUSxRQUNSLGNBQWUsSUFDZixTQUFVLEdBQ1YsYUFBYyxHQUNkLFVBQVdNLEdBQWEsWUFBWSxHQUFLTixFQUN6QyxVQUFXLFdBQ1gsS0FBTSxZQUNWLENBQTJDLEVBQzFDLE1BQU0sSUFBTSxJQUFJLEVBQ2hCLEtBQU1HLEdBQStGLENBQ2xHLEdBQUlBLEdBQVEsT0FBTyxNQUFPLENBQ3RCLE1BQU1TLEVBQVFULEVBQU8sTUFBTSxNQUN0QixPQUFRSSxHQUFTLENBQUNBLEVBQUssWUFBWSxLQUFNTSxHQUFhQSxFQUFTLFFBQVUsK0NBQStDLENBQUMsRUFDekgsSUFBS04sR0FBUyxDQUNYLE1BQU1PLEVBQXdCUCxFQUFLLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUVyRCxNQUFPLENBQUUsS0FBTU8sRUFBdUIsTUFBT0EsQ0FBc0IsQ0FDdkUsQ0FBQyxFQUVMLEtBQUssS0FBSyxpQkFBa0JGLENBQUssRUFFakNYLEVBQVMsUUFBUVcsQ0FBSyxDQUMxQixNQUFPWCxFQUFTLFFBQVEsQ0FBQyxDQUFDLENBQzlCLENBQUMsRUFFRUEsRUFBUyxRQUFRLENBQUUsT0FBUSxDQUFDLENBQUUsQ0FBQyxDQUMxQyxFQUVBLG9DQUFxQ08sR0FBcUNBLEdBQVksQ0FBQyxFQUV2RixrQ0FBZ0NDLEdBQTRDQSxFQUFLLElBQUksQ0FBQyxDQUFFLEtBQUFBLEVBQU0sTUFBQUMsQ0FBTSxJQUFNLElBQUksR0FBRyxHQUFHLGlCQUFpQixDQUFFLEtBQUFELEVBQU0sTUFBQUMsQ0FBTSxDQUFDLENBQUMsRUEzQ2pKLEdBQUcsR0FBRyxNQUFNLGNBQWMsS0FBSyxLQUE4Q1osQ0FBTSxDQUN2RixDQTJDSixDQUVBLE9BQU8sT0FBT2EsRUFBb0IsVUFBVyxHQUFHLEdBQUcsTUFBTSxjQUFjLFNBQVMsRUFPaEYsTUFBTUksVUFBOEIsR0FBRyxHQUFHLGFBQWMsQ0FPcEQsWUFBWWpCLEVBQTJDQyxFQUEyQixDQUM5RSxNQUFNRCxDQUFNLEVBTmhCLEtBQVEsSUFBTSxJQUFJLEdBQUcsSUFlckIscUJBQWtCLElBQ1BpQixFQUFzQixNQUFNLFVBQVUsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLEtBQUssSUFDbEUsS0FBSyxJQUNQLEtBQUssQ0FDRixPQUFRLFFBQ1IsY0FBZSxJQUNmLGFBQWMsV0FDZCxLQUFNLENBQUMsT0FBUSxnQkFBZ0IsRUFDL0IsTUFBTyxLQUFLLGdCQUFnQixjQUFjLEVBQzFDLEtBQU0sS0FBSyxRQUFRLENBQ3ZCLENBQTBCLEVBQ3pCLEtBQU1aLEdBQVcsQ0FDZCxNQUFNYSxFQUFlYixFQUF1QyxNQUFNLEtBQzVEYyxFQUFxQmQsRUFBaUQsTUFBTSxlQUU1RWUsRUFBYyxJQUFJLEdBQUcsR0FBRyxZQUFZLENBQUUsT0FBUSxHQUFNLFNBQVUsRUFBTSxDQUFDLEVBQzNFQSxFQUFZLFNBQVMsT0FBT0YsRUFBYUMsQ0FBaUIsRUFFekQsS0FBc0MsTUFBTSxPQUFPQyxFQUFZLFFBQVEsQ0FDNUUsQ0FBQyxDQUNSLEVBR0wsc0JBQW9CQyxHQUNUQSxFQUNELElBQUksR0FBRyxHQUFHLFFBQVEsSUFBTSxDQUNwQixLQUFLLFdBQVcsRUFBRSxZQUFZLElBQUksQ0FDdEMsQ0FBQyxFQUNESixFQUFzQixNQUFNLFVBQVUsaUJBQWlCLEtBQUssS0FBTUksQ0FBTSxFQUdsRix3QkFBcUIsSUFDVkosRUFBc0IsTUFBTSxVQUFVLG1CQUFtQixLQUFLLElBQUksRUFBRSxLQUFLLElBQU0sQ0FDakYsS0FBc0MsTUFBTSxNQUFNLENBQ3ZELENBQUMsRUF6Q0QsS0FBSyxnQkFBa0JoQixFQUV2QmdCLEVBQXNCLE9BQU8sS0FBTyx3QkFDcENBLEVBQXNCLE9BQU8sTUFBUSw0Q0FDckNBLEVBQXNCLE9BQU8sUUFBVSxDQUFDLENBQUUsT0FBUSxTQUFVLE1BQU8sUUFBUyxNQUFPLENBQUMsT0FBUSxPQUFPLENBQUUsQ0FBQyxDQUMxRyxDQXNDSixDQUVBLE9BQU8sT0FBT0EsRUFBc0IsVUFBVyxHQUFHLEdBQUcsY0FBYyxTQUFTLEVBTzVFLE1BQU1LLFVBQTBCLEdBQUcsR0FBRyxhQUFjLENBSWhELFlBQVl0QixFQUEyQyxDQUNuRCxNQUFNQSxDQUFNLEVBSGhCLEtBQVEsSUFBTSxJQUFJLEdBQUcsSUFVckIscUJBQWtCLElBQ1BzQixFQUFrQixNQUFNLFVBQVUsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLEtBQUssSUFBTSxDQUMzRSxLQUFNLENBQUNDLEVBQVNDLENBQU8sRUFBSSxLQUFLLFFBQVEsRUFFeEMsT0FBTyxLQUFLLElBQ1AsS0FBSyxDQUNGLE9BQVEsVUFDUixjQUFlLElBQ2YsS0FBTSxDQUFDLE1BQU0sRUFDYixVQUFXLE9BQ1gsZ0JBQWlCRCxFQUNqQix3QkFBeUIsV0FDekIsUUFBUyxPQUNULGNBQWVDLEVBQ2Ysc0JBQXVCLFVBQzNCLENBQXNKLEVBQ3JKLEtBQU1uQixHQUFXLENBQ2QsTUFBTW9CLEVBQWNwQixFQUF5QyxRQUFRLEtBRS9EcUIsRUFBbUIsSUFBSSxHQUFHLEdBQUcsY0FBYyxDQUFFLEtBQU0sVUFBVyxNQUFPLHFCQUFzQixDQUFDLEVBRTVGTixFQUFjLElBQUksR0FBRyxHQUFHLFlBQVksQ0FBRSxPQUFRLEdBQU0sU0FBVSxFQUFNLENBQUMsRUFDM0VBLEVBQVksU0FBUyxPQUNqQkssRUFDTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQVN4QkEsQ0FBVTtBQUFBO0FBQUEsVUFHY0MsRUFBaUIsU0FBUyxDQUFDLENBQ3JDLEVBRUMsS0FBc0MsTUFBTSxPQUFPTixFQUFZLFFBQVEsQ0FDNUUsQ0FBQyxDQUNULENBQUMsRUFHTCxzQkFBb0JDLEdBQ1RBLEVBQ0QsSUFBSSxHQUFHLEdBQUcsUUFBUSxJQUFNLENBQ3BCLEtBQUssV0FBVyxFQUFFLFlBQVksSUFBSSxDQUN0QyxDQUFDLEVBQ0RDLEVBQWtCLE1BQU0sVUFBVSxpQkFBaUIsS0FBSyxLQUFNRCxDQUFNLEVBRzlFLHdCQUFxQixJQUNWQyxFQUFrQixNQUFNLFVBQVUsbUJBQW1CLEtBQUssSUFBSSxFQUFFLEtBQUssSUFBTSxDQUM3RSxLQUFzQyxNQUFNLE1BQU0sQ0FDdkQsQ0FBQyxFQTVEREEsRUFBa0IsT0FBTyxLQUFPLG9CQUNoQ0EsRUFBa0IsT0FBTyxNQUFRLHFCQUNqQ0EsRUFBa0IsT0FBTyxRQUFVLENBQUMsQ0FBRSxPQUFRLFNBQVUsTUFBTyxRQUFTLE1BQU8sQ0FBQyxPQUFRLE9BQU8sQ0FBRSxDQUFDLENBQ3RHLENBMkRKLENBRUEsT0FBTyxPQUFPQSxFQUFrQixVQUFXLEdBQUcsR0FBRyxjQUFjLFNBQVMsRUFLeEUsTUFBTUssQ0FBZSxDQUFyQixjQUVJLEtBQVEsSUFBTSxJQUFJLEdBQUcsSUFXckIsTUFBTSxLQUFNLENBQ1IsR0FBSyxLQUFLLGdCQUFnQixFQUsxQixJQUhBLEtBQUssa0JBQW9CLE1BQU0sS0FBSyx1QkFBdUIsRUFFM0QsS0FBSyxZQUFjLFNBQVMsY0FBYyxrQkFBa0IsRUFDeEQsQ0FBQyxLQUFLLFlBQWEsT0FBTyxHQUFHLE9BQU8sd0RBQXlELENBQUUsS0FBTSxPQUFRLENBQUMsRUFLbEgsR0FIQSxLQUFLLFVBQVksR0FBRyxPQUFPLElBQUksWUFBWSxFQUUzQyxLQUFLLGdCQUFrQixHQUFHLE1BQU0sWUFBWSxLQUFLLFNBQVMsRUFDdEQsQ0FBQyxLQUFLLGdCQUFpQixPQUFPLEdBQUcsT0FBTywrQ0FBZ0QsQ0FBRSxLQUFNLE9BQVEsQ0FBQyxFQUU3RyxNQUFNLEtBQUssaUJBQWlCLEVBQ2hDLENBS1EsaUJBQWtCLENBVXRCLE1BVG1CLENBQ2YsR0FBRyxPQUFPLElBQUksbUJBQW1CLEdBQUssRUFDdEMsR0FBRyxPQUFPLElBQUksc0JBQXNCLEVBQ3BDLEdBQUcsT0FBTyxJQUFJLGFBQWEsRUFDM0IsR0FBRyxPQUFPLElBQUksVUFBVSxJQUFNLE9BQzlCLEdBQUcsT0FBTyxJQUFJLGNBQWMsSUFBTSxHQUFHLE9BQU8sSUFBSSxpQkFBaUIsRUFDakUsQ0FBQyxHQUFHLE9BQU8sSUFBSSxhQUFhLENBQ2hDLEVBRWtCLE1BQU0sT0FBTyxDQUNuQyxDQUtBLE1BQWMsd0JBQXlCLENBQ25DLE9BQU8sS0FBSyxPQUVILE1BQU0sS0FBSyxJQUFJLElBQUksQ0FDaEIsT0FBUSxRQUNSLGNBQWUsSUFDZixLQUFNLFlBQ04sT0FBUSxVQUNSLFFBQVMsT0FDVCxPQUFRLDJDQUNaLENBQW1DLEdBQ3JDLE1BQU0sUUFBUSxDQUFDLEdBQUcsWUFBWSxDQUFDLEdBQUcsT0FBTyxNQUFNLFNBQVcsSUFDaEUsQ0FDSixDQUtBLE1BQWMsa0JBQW1CLENBQzdCLE1BQU1DLEVBQVksTUFBTSxLQUFLLElBQUksSUFBSSxDQUFFLE9BQVEsUUFBUyxjQUFlLElBQUssS0FBTSxPQUFRLE9BQVEsS0FBSyxTQUFVLENBQThCLEVBRXpJQyxFQUFhLENBQUUsa0JBQW1CLEtBQUssa0JBQW1CLFlBQWEsS0FBSyxZQUFhLFVBQVcsS0FBSyxVQUFXLGdCQUFpQixLQUFLLGVBQWdCLEVBRWhLLEdBQUlELEVBQVMsTUFBTSxNQUFNLENBQUMsRUFBRSxRQUFTLENBQ2pDLEdBQUcsS0FBSyxPQUFPO0FBQUE7QUFBQTtBQUFBLEVBRzdCLEVBRWMsTUFBTUUsRUFBUyxJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUUsR0FBSSx5QkFBMEIsTUFBTyxrQkFBbUIsS0FBTSxrQkFBbUIsTUFBTyxDQUFDLGFBQWEsQ0FBRSxDQUFDLEVBQ2pKQSxFQUFPLEdBQUcsUUFBUyxJQUFNLENBQ3JCQSxFQUFPLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFDMUIsSUFBSUMsRUFBcUJGLEVBQVksRUFBSyxFQUFFLEtBQUssQ0FDckQsQ0FBQyxFQUVELEtBQUssWUFBWSxRQUFRQyxFQUFPLFNBQVMsQ0FBQyxDQUFDLENBQy9DLFNBQVdGLEVBQVMsTUFBTSxNQUFNLENBQUMsRUFBRSxTQUFVLElBQUlHLEVBQXFCRixFQUFZLEVBQUksRUFBRSxLQUFLLE1BQ3hGLENBQ0QsTUFBTUcsRUFBYyxHQUFHLEtBQUssZUFBZSxHQUFHLE9BQU8sSUFBSSxNQUFNLElBQU0sVUFBWSxPQUFTLGFBQWMsSUFBSyxnQkFBaUIsaUJBQWlCLEVBQy9JQSxFQUFZLGlCQUFpQixRQUFVQyxHQUFVLENBQzdDQSxFQUFNLGVBQWUsRUFFckIsSUFBSUYsRUFBcUJGLEVBQVksRUFBSyxFQUFFLEtBQUssRUFFakQsT0FBTyxTQUFTLENBQUUsSUFBSyxFQUFHLFNBQVUsUUFBUyxDQUFDLEVBRTlDRyxFQUFZLE9BQU8sQ0FDdkIsQ0FBQyxDQUNMLENBQ0osQ0FDSixDQUtBLE1BQU1ELENBQXFCLENBdUR2QixZQUNJLENBQUUsa0JBQUFHLEVBQW1CLFlBQUFDLEVBQWEsVUFBQUMsRUFBVyxnQkFBQW5DLENBQWdCLEVBQzdEb0MsRUFDRixDQXhERixLQUFRLElBQU0sSUFBSSxHQUFHLElBQ3JCLEtBQVEsY0FBZ0IsbUVBQ3hCLEtBQVEsYUFBZSxrRUFXdkIsS0FBUSxXQUFhLEdBU3JCLEtBQVEsb0JBQW1ELENBQUMsRUFvQjVELEtBQVEsWUFBYyxHQWVsQixLQUFLLGtCQUFvQkgsRUFDekIsS0FBSyxZQUFjQyxFQUNuQixLQUFLLFVBQVlDLEVBQ2pCLEtBQUssZ0JBQWtCbkMsRUFFdkIsS0FBSyxPQUFTb0MsQ0FDbEIsQ0FLQSxNQUFNLE1BQU8sQ0FDVCxHQUFHLEtBQUssT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFpRXpCLEVBRVUsR0FBRyxPQUFPLFdBQVcsZ0ZBQWdGLEVBR3JHLEtBQUssVUFBWSxJQUFJLEdBQUcsR0FBRyxZQUFZLENBQUUsR0FBSSxzQkFBdUIsT0FBUSxHQUFNLFNBQVUsR0FBTyxPQUFRLEVBQUssQ0FBQyxFQUU3RyxLQUFLLGdCQUFnQixXQUFXLElBQ1YsTUFBTSxLQUFLLElBQUksSUFBSSxDQUNyQyxPQUFRLFFBQ1IsY0FBZSxJQUNmLEtBQU0sT0FDTixPQUFRLEtBQUssZ0JBQWdCLGVBQWUsRUFBRyxnQkFBZ0IsQ0FDbkUsQ0FBOEIsR0FFYixNQUFNLE1BQU0sQ0FBQyxFQUFFLFVBQVUsTUFBTSxLQUFLLHVCQUF1QixFQUdoRixLQUFLLGtCQUFrQixFQUN2QixNQUFNLEtBQUssbUJBQW1CLEVBRzlCLEtBQUssVUFBVSxTQUFTLENBQUMsRUFBRSxPQUN2QixHQUFJLENBQ0EsS0FBSyxvQkFBb0IsV0FBVyxDQUFDLEVBQ3JDLEtBQUssb0JBQW9CLFNBQVMsQ0FBQyxFQUNuQyxLQUFLLGdCQUFnQixTQUFTLENBQUMsRUFDL0IsS0FBSyx5QkFDTCxLQUFLLHVCQUF1QixTQUFTLENBQUMsRUFDdEMsS0FBSyxxQkFBcUIsU0FBUyxDQUFDLEVBQ3BDLEtBQUssbUJBQW1CLFNBQVMsQ0FBQyxFQUNsQyxLQUFLLGFBQWEsU0FBUyxDQUFDLENBQ2hDLEVBQUUsT0FBTyxPQUFPLENBQ3BCLEVBRUEsS0FBSyxZQUFZLFFBQVEsS0FBSyxVQUFVLFNBQVMsQ0FBQyxDQUFDLEVBRS9DLEtBQUssUUFBUSxLQUFLLGlCQUFpQixDQUMzQyxDQUtBLE1BQWMsd0JBQXlCLENBQ25DLE1BQU1DLEVBQWtCLE1BQU0sS0FBSyxlQUFlLEtBQUssZ0JBQWdCLGVBQWUsRUFBRyxnQkFBZ0IsQ0FBQyxFQUUxRyxLQUFLLG1CQUFxQixJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUUsTUFBTyxzQkFBdUIsS0FBTSxPQUFRLE1BQU8sQ0FBQyxhQUFhLENBQUUsQ0FBQyxFQUN2SCxLQUFLLG1CQUFtQixHQUFHLFFBQVMsSUFBTSxDQUN0QyxNQUFNQyxFQUFTLEtBQUssY0FBYyxLQUFLRCxDQUFlLElBQUksQ0FBQyxFQUMzRCxHQUFJLENBQUNDLEVBQVEsT0FBTyxHQUFHLE9BQU8scUNBQXNDLENBQUUsS0FBTSxPQUFRLENBQUMsRUFFckYsS0FBSyxjQUFjLFNBQVMsR0FBRyxNQUFNLFlBQVlBLENBQU0sR0FBRyxZQUFZLEdBQUcsU0FBUyxHQUFLLEVBQUUsRUFDeEUsQ0FBQyxjQUFlLEdBQUcsS0FBSyxrQkFBa0IsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFNQyxHQUNyRixJQUFJLE9BQU8sVUFBVUEsRUFBYyxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUdBLEVBQWMsQ0FBQyxDQUFDLElBQUlBLEVBQWMsTUFBTSxDQUFDLENBQUMsY0FBYyxFQUFFLEtBQUtGLENBQWUsQ0FDeEksR0FDYyxLQUFLLFVBQVUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUN6RCxDQUFDLENBQ0wsQ0FLUSxtQkFBb0IsQ0FFeEIsS0FBSyxjQUFnQixJQUFJdkMsRUFBMEIsQ0FBRSxZQUFhLG1CQUFvQixTQUFVLEVBQUssRUFBRyxLQUFLLGVBQWUsRUFDNUgsS0FBSyxjQUFjLEdBQUcsU0FBVSxJQUFNLENBQ2xDLElBQUlHLEVBQVEsS0FBSyxjQUFjLFNBQVMsRUFDeENBLEVBQVFBLEVBQU0sUUFBUSxJQUFJLE9BQU8sbUJBQW1CLEdBQUcsT0FBTyxJQUFJLFVBQVUsRUFBRSxRQUFRLFNBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRyxFQUFFLEVBQ2hIQSxFQUFRQSxFQUFNLFFBQVEsS0FBTSxFQUFFLEVBRTFCQSxFQUFNLE9BQVMsR0FDZixLQUFLLGNBQWMsU0FBU0EsRUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFJQSxFQUFNLE1BQU0sQ0FBQyxFQUFFLFdBQVcsSUFBSyxHQUFHLENBQUMsRUFDeEYsS0FBSyx5QkFBeUIsWUFBWSxFQUFLLEVBQy9DLEtBQUssYUFBYSxZQUFZLEVBQUssRUFDbkMsS0FBSyxrQkFBa0IsWUFBWSxFQUFLLEVBQ3hDLEtBQUssa0JBQWtCLFlBQVksRUFBSyxJQUV4QyxLQUFLLHlCQUF5QixZQUFZLEVBQUksRUFDOUMsS0FBSyxhQUFhLFlBQVksRUFBSSxFQUNsQyxLQUFLLGtCQUFrQixZQUFZLEVBQUksRUFDdkMsS0FBSyxrQkFBa0IsWUFBWSxFQUFJLEdBRzNDLEtBQUssY0FBYyxFQUNuQixLQUFLLGFBQWEsU0FBUyxRQUFRLEVBQ25DLEtBQUssV0FBYSxFQUN0QixDQUFDLEVBRUQsS0FBSyxvQkFBc0IsSUFBSSxHQUFHLEdBQUcsWUFBWSxLQUFLLGNBQWUsQ0FBRSxNQUFPLG1CQUFvQixRQUFTLENBQUMsdUJBQXVCLEVBQUcsTUFBTyxLQUFNLENBQUMsRUFHcEosS0FBSyxVQUFZLElBQUksR0FBRyxHQUFHLHlCQUF5QixDQUNoRCxlQUFnQixHQUNoQixnQkFBaUIsR0FDakIsUUFBUyxPQUFPLEtBQUssS0FBSyxpQkFBaUIsRUFBRSxJQUFLdUMsSUFBUyxDQUFFLEtBQU1BLEVBQUssTUFBT0EsQ0FBSSxFQUFFLENBQ3pGLENBQUMsRUFDQSxLQUFLLFVBQVUsUUFBUSxFQUEyQyxXQUFhLFlBQ2hGLEtBQUssVUFBVSxHQUFHLFNBQVUsSUFBTSxDQUM5QixNQUFNQyxFQUFjLEtBQUssVUFBVSxTQUFTLEVBQWUsS0FBSyxDQUFDQyxFQUFHQyxJQUFNRCxFQUFFLFlBQVksRUFBRSxjQUFjQyxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBRW5ILEtBQUssVUFBVSxTQUFTLEVBQWUsS0FBSyxHQUFHLElBQU1GLEVBQVcsS0FBSyxHQUFHLEdBQUcsS0FBSyxVQUFVLFNBQVNBLENBQVUsRUFFbEgsS0FBSyxjQUFjLEVBQ25CLEtBQUssYUFBYSxTQUFTLFFBQVEsRUFDbkMsS0FBSyxXQUFhLEdBRWxCLFVBQVdHLEtBQWMsS0FBSyxvQkFBcUJBLEVBQVcsUUFBUSxNQUFNLFFBQVUsT0FFdEYsSUFBSUMsRUFBdUIsRUFDM0IsVUFBV0wsS0FBTyxLQUFLLFVBQVUsU0FBUyxFQUFlLENBQ3JELE1BQU1JLEVBQWEsS0FBSyxvQkFBb0IsS0FBTUEsR0FBZUEsRUFBVyxPQUFTSixDQUFHLEVBRXBGSSxJQUNBQSxFQUFXLFFBQVEsTUFBTSxRQUFVLFFBQ25DQyxJQUVSLENBRUFDLEVBQWUsWUFBYyx3QkFBd0JELEVBQXVCLEVBQUksT0FBT0EsQ0FBb0IsWUFBWUEsRUFBdUIsRUFBSSxJQUFNLEVBQUUsR0FBSyxjQUFjLElBRTdLRSxFQUFtQixNQUFNLFFBQVVGLEVBQXVCLEVBQUksT0FBUyxPQUMzRSxDQUFDLEVBRUQsS0FBSyxnQkFBa0IsSUFBSSxHQUFHLEdBQUcsWUFBWSxLQUFLLFVBQVcsQ0FDekQsTUFBTyxxQ0FDUCxRQUFTLENBQUMsdUJBQXVCLEVBQ2pDLE1BQU8sS0FDWCxDQUFDLEVBR0QsS0FBSyx5QkFBMkIsU0FBUyxjQUFjLFNBQVMsRUFDaEUsS0FBSyx5QkFBeUIsVUFBVSxJQUFJLCtDQUErQyxFQUUzRixNQUFNQyxFQUFpQixTQUFTLGNBQWMsU0FBUyxFQUN2REEsRUFBZSxZQUFjLHFDQUM3QixLQUFLLHlCQUF5QixPQUFPQSxDQUFjLEVBRW5ELFNBQVcsQ0FBQ0UsRUFBY0MsQ0FBWSxJQUFLLE9BQU8sUUFBUSxLQUFLLGlCQUFpQixFQUFHLENBQy9FLE1BQU1DLEVBQWEsT0FBTyxRQUFRRCxFQUFhLFVBQVUsRUFDekQsR0FBSUMsRUFBVyxTQUFXLEVBQUcsU0FFN0IsTUFBTUMsRUFBVSxTQUFTLGNBQWMsU0FBUyxFQUNoREEsRUFBUSxNQUFNLFFBQVUsT0FFeEIsTUFBTUMsRUFBVSxTQUFTLGNBQWMsU0FBUyxFQUNoREEsRUFBUSxZQUFjSixFQUN0QkcsRUFBUSxPQUFPQyxDQUFPLEVBRXRCLE1BQU1DLEVBQXlDLENBQUUsS0FBTUwsRUFBYyxRQUFBRyxFQUFTLFdBQVksQ0FBQyxDQUFFLEVBRTdGLFNBQVcsQ0FBQ0csRUFBZUMsQ0FBYSxJQUFLTCxFQUFZLENBQ3JELE1BQU1NLEVBQVEsSUFBSSxHQUFHLEdBQUcsZ0JBQWdCLENBQUUsWUFBYUQsRUFBYyxTQUFTLFNBQVMsRUFBRyxTQUFVQSxFQUFjLFFBQVMsQ0FBQyxFQUM1SEMsRUFBTSxHQUFHLFNBQVUsSUFBTSxDQUNyQixLQUFLLGNBQWMsRUFDbkIsS0FBSyxhQUFhLFNBQVMsUUFBUSxFQUNuQyxLQUFLLFdBQWEsRUFDdEIsQ0FBQyxFQUVELE1BQU1DLEVBQWMsSUFBSSxHQUFHLEdBQUcsWUFBWUQsRUFBTyxDQUM3QyxNQUFPLElBQUksR0FBRyxHQUFHLFlBQ2IsR0FBR0YsQ0FBYSxHQUFHLENBQUNDLEVBQWMsT0FBU0QsRUFBYyxZQUFZLElBQU1DLEVBQWMsT0FBTyxZQUFZLEVBQUksR0FBSyxLQUFLQSxFQUFjLEtBQUssR0FBRyxHQUFHQSxFQUFjLFlBQWMsS0FBS0EsRUFBYyxXQUFXLElBQU0sRUFBRSxXQUFXQSxFQUFjLElBQUksS0FBS0EsRUFBYyxVQUFZLGVBQWlCLEVBQUUsR0FBR0EsRUFBYyxRQUFVLGVBQWVBLEVBQWMsT0FBTyxLQUFPLEVBQUUsRUFDaFgsRUFDQSxNQUFPLFFBQ1gsQ0FBQyxFQUNESixFQUFRLE9BQU9NLEVBQVksU0FBUyxDQUFDLENBQUMsRUFFdENKLEVBQVksV0FBVyxLQUFLLENBQUUsS0FBTUMsRUFBZSxRQUFTQyxFQUFjLFFBQVMsT0FBUUMsQ0FBTSxDQUFDLENBQ3RHLENBRUEsS0FBSyx5QkFBeUIsT0FBT0wsQ0FBTyxFQUU1QyxLQUFLLG9CQUFvQixLQUFLRSxDQUFXLENBQzdDLENBRUEsTUFBTU4sRUFBcUIsU0FBUyxjQUFjLEtBQUssRUFDdkRBLEVBQW1CLEdBQUssdUNBQ3hCQSxFQUFtQixZQUFjLDJDQUVqQyxLQUFLLHlCQUF5QixPQUFPQSxDQUFrQixFQUd2RCxLQUFLLGlCQUFtQixJQUFJLEdBQUcsR0FBRyxnQkFDbEMsS0FBSyxpQkFBaUIsR0FBRyxTQUFVLElBQU0sQ0FDckMsTUFBTTlDLEVBQVEsS0FBSyxpQkFBaUIsU0FBUyxFQUV6Q0EsRUFBTSxPQUFTLEdBQUcsS0FBSyxpQkFBaUIsU0FBU0EsRUFBTSxXQUFXLElBQUssR0FBRyxDQUFDLEVBRS9FLEtBQUssY0FBYyxFQUNuQixLQUFLLGFBQWEsU0FBUyxRQUFRLEVBQ25DLEtBQUssV0FBYSxFQUN0QixDQUFDLEVBRUQsS0FBSyx5QkFBMkIsSUFBSSxHQUFHLEdBQUcsYUFBYSxDQUFFLEtBQU0sUUFBUyxNQUFPLFVBQVcsU0FBVSxFQUFLLENBQUMsRUFDMUcsS0FBSyx5QkFBeUIsR0FBRyxRQUFTLElBQU0sQ0FDNUMsSUFBSXlELEVBQU8sS0FBSyxnQkFBZ0IsWUFBWSxFQUFFLFFBQVEsV0FBWSxFQUFFLEVBRXBFLEdBQUksQ0FBQyxnQkFBaUIsb0JBQXFCLDRCQUE0QixFQUFFLEtBQU1sQixHQUFRLEtBQUssVUFBVSxTQUFTLEVBQUUsU0FBU0EsQ0FBRyxDQUFDLEVBQUcsQ0FHN0gsR0FBSSxDQUFDa0IsRUFBSyxTQUFTLEdBQUcsRUFBRyxPQUV6QixJQUFJQyxFQUFxQixHQUN6QixHQUFJLHVCQUF1QixLQUFLRCxDQUFJLElBQ2hDQyxFQUFxQkQsRUFBSyxNQUFNQSxFQUFLLFlBQVksR0FBRyxDQUFDLEVBQ3JEQSxFQUFPQSxFQUFLLE1BQU0sRUFBR0EsRUFBSyxZQUFZLEdBQUcsQ0FBQyxFQUN0QyxDQUFDQSxFQUFLLFNBQVMsR0FBRyxHQUFHLE9BQU9BLEVBQU9DLEVBRzNDLE1BQU1DLEVBQVdGLEVBQ1osTUFBTUEsRUFBSyxZQUFZLEdBQUcsRUFBSSxDQUFDLEVBQy9CLFFBQVEsS0FBTSxFQUFFLEVBQ2hCLFFBQVEsS0FBTSxHQUFHLEVBQ2hCRyxFQUFhSCxFQUFLLE1BQU0sRUFBR0EsRUFBSyxZQUFZLEdBQUcsQ0FBQyxFQUV0RCxLQUFLLGlCQUFpQixTQUFTRSxFQUFXLEtBQU9DLEVBQWFGLENBQWtCLENBQ3BGLEtBQU8sQ0FDSCxJQUFJRyxFQUFVSixFQUFLLFdBQVcsTUFBTyxRQUFRLEVBQUUsV0FBVyxJQUFLLEtBQUssRUFFcEUsVUFBV0ssSUFBa0IsQ0FBQyxLQUFNLElBQUssS0FBSyxFQUMxQyxHQUFJRCxFQUFRLFdBQVdDLEVBQWlCLEdBQUcsRUFBRyxDQUMxQ0QsRUFBVUEsRUFBUSxNQUFNQyxFQUFlLE9BQVMsQ0FBQyxFQUFJLEtBQU9BLEVBQzVELEtBQ0osQ0FFQUQsSUFBWUosRUFBTSxHQUFHLE9BQU8sNkZBQThGLENBQUUsS0FBTSxNQUFPLENBQUMsRUFDekksS0FBSyxpQkFBaUIsU0FBU0ksQ0FBTyxDQUMvQyxDQUNKLENBQUMsRUFFRCxLQUFLLHVCQUF5QixJQUFJLEdBQUcsR0FBRyxrQkFBa0IsS0FBSyxpQkFBa0IsS0FBSyx5QkFBMEIsQ0FDNUcsTUFBTyxJQUFJLEdBQUcsR0FBRyxZQUFZLGdEQUFnRCxHQUFHLEtBQUssT0FBTyxvQ0FBb0MsQ0FBQyxtQ0FBbUMsRUFDcEssUUFBUyxDQUFDLHVCQUF1QixFQUNqQyxNQUFPLEtBQ1gsQ0FBQyxFQUdELEtBQUssb0JBQXNCLElBQUlsRCxFQUFvQixDQUFFLFlBQWEscUJBQXNCLENBQUMsRUFDekYsS0FBSyxvQkFBb0IsR0FBRyxTQUFVLElBQU0sQ0FDeEMsSUFBSVgsRUFBUSxLQUFLLG9CQUFvQixTQUFTLEVBQzlDQSxFQUFRQSxFQUFNLFFBQVEsSUFBSSxPQUFPLG1CQUFtQixHQUFHLE9BQU8sSUFBSSxVQUFVLEVBQUUsUUFBUSxTQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUcsRUFBRSxFQUNoSEEsRUFBUUEsRUFBTSxRQUFRLGFBQWMsRUFBRSxFQUVsQ0EsRUFBTSxPQUFTLEdBQUcsS0FBSyxvQkFBb0IsU0FBU0EsRUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFJQSxFQUFNLE1BQU0sQ0FBQyxFQUFFLFdBQVcsSUFBSyxHQUFHLENBQUMsQ0FDeEgsQ0FBQyxFQUNELEtBQUssb0JBQW9CLEdBQUcsaUJBQW1CWSxHQUE2QyxDQUN4RixVQUFXTCxLQUFRSyxFQUFPLEtBQUssZUFBZSxnQkFBZ0JMLEVBQUssSUFBSSxDQUMzRSxDQUFDLEVBQ0QsS0FBSyxlQUFpQixJQUFJLEdBQUcsR0FBRyxxQkFBcUIsQ0FBRSxnQkFBaUIsR0FBTyxjQUFlLFVBQVcsWUFBYSxLQUFLLG1CQUFvQixDQUFDLEVBQ2hKLEtBQUssZUFBZSxHQUFHLFNBQVUsSUFBTSxDQUNuQyxNQUFNaUMsRUFBYyxLQUFLLGVBQWUsU0FBUyxFQUFlLEtBQUssQ0FBQ0MsRUFBR0MsSUFBTUQsRUFBRSxZQUFZLEVBQUUsY0FBY0MsRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUV4SCxLQUFLLGVBQWUsU0FBUyxFQUFlLEtBQUssR0FBRyxJQUFNRixFQUFXLEtBQUssR0FBRyxHQUFHLEtBQUssZUFBZSxTQUFTQSxDQUFVLEVBRTVILEtBQUssY0FBYyxFQUNuQixLQUFLLGFBQWEsU0FBUyxRQUFRLEVBQ25DLEtBQUssV0FBYSxFQUN0QixDQUFDLEVBRUQsS0FBSyxxQkFBdUIsSUFBSSxHQUFHLEdBQUcsWUFBWSxLQUFLLGVBQWdCLENBQUUsTUFBTyxjQUFlLFFBQVMsQ0FBQyx1QkFBdUIsRUFBRyxNQUFPLEtBQU0sQ0FBQyxFQUdqSixLQUFLLGFBQWUsSUFBSSxHQUFHLEdBQUcsb0JBQW9CLENBQzlDLFFBQVMsQ0FDTCxDQUFFLEtBQU0seUJBQTBCLEVBQ2xDLENBQUUsS0FBTSx1QkFBd0IsRUFDaEMsQ0FBRSxLQUFNLHdCQUF5QixDQUNyQyxDQUNKLENBQUMsRUFFRCxLQUFLLG1CQUFxQixJQUFJLEdBQUcsR0FBRyxZQUFZLEtBQUssYUFBYyxDQUFFLEdBQUksaUNBQWtDLE1BQU8sV0FBWSxRQUFTLENBQUMsdUJBQXVCLEVBQUcsTUFBTyxLQUFNLENBQUMsQ0FDcEwsQ0FLQSxNQUFjLG9CQUFxQixDQUMvQixNQUFNdUIsRUFBZ0IsSUFBSSxHQUFHLEdBQUcsY0FDaEMsU0FBUyxLQUFLLE9BQU9BLEVBQWMsU0FBUyxDQUFDLENBQUMsRUFHOUMsS0FBSyxhQUFlLElBQUksR0FBRyxHQUFHLGFBQWEsQ0FBRSxNQUFPLFNBQVUsU0FBVSxHQUFNLE1BQU8sQ0FBQyxhQUFhLENBQUUsQ0FBQyxFQUN0RyxLQUFLLGFBQWEsR0FBRyxRQUFTLElBQU0sS0FBSyx3QkFBd0IsQ0FBQyxFQUdsRSxNQUFNQyxFQUF3QixJQUFJakQsRUFBc0IsQ0FBRSxLQUFNLE9BQVEsRUFBRyxLQUFLLGVBQWUsRUFDL0ZnRCxFQUFjLFdBQVcsQ0FBQ0MsQ0FBcUIsQ0FBQyxFQUVoRCxLQUFLLGtCQUFvQixJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUUsTUFBTyxlQUFnQixTQUFVLEVBQUssQ0FBQyxFQUN6RixLQUFLLGtCQUFrQixHQUFHLFFBQVMsSUFBTSxDQUNyQ0EsRUFBc0IsUUFDbEIsS0FBSyxhQUNELEtBQUssY0FBYyxTQUFTLEVBQzVCLEtBQUssVUFBVSxTQUFTLEVBQ3hCLEtBQUssYUFDTCxLQUFLLGlCQUFpQixTQUFTLEVBQy9CLEtBQUssZUFBZSxTQUFTLENBQ2pDLENBQ0osRUFDQUEsRUFBc0IsS0FBSyxDQUMvQixDQUFDLEVBR0QsTUFBTUMsRUFBb0IsSUFBSTdDLEVBQWtCLENBQUUsS0FBTSxPQUFRLENBQUMsRUFDakUyQyxFQUFjLFdBQVcsQ0FBQ0UsQ0FBaUIsQ0FBQyxFQUU1QyxLQUFLLGtCQUFvQixJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUUsTUFBTyxlQUFnQixTQUFVLEVBQUssQ0FBQyxFQUN6RixLQUFLLGtCQUFrQixHQUFHLFFBQVMsU0FBWSxDQUN2QyxLQUFLLFNBQVEsS0FBSyxZQUFjLE1BQU0sS0FBSyxlQUFlLEtBQUssU0FBUyxHQUU1RUEsRUFBa0IsUUFBUSxDQUN0QixLQUFLLFlBQ0wsS0FBSyxhQUNELEtBQUssY0FBYyxTQUFTLEVBQzVCLEtBQUssVUFBVSxTQUFTLEVBQ3hCLEtBQUssYUFDTCxLQUFLLGlCQUFpQixTQUFTLEVBQy9CLEtBQUssZUFBZSxTQUFTLENBQ2pDLENBQ0osQ0FBQyxFQUNEQSxFQUFrQixLQUFLLENBQzNCLENBQUMsRUFHSSxLQUFLLGdCQUFnQixXQUFXLElBQ2pDLEtBQUssU0FBWSxNQUFNLEtBQUssSUFBSSxJQUFJLENBQ2hDLE9BQVEsUUFDUixjQUFlLElBQ2YsS0FBTSxPQUNOLE9BQVEsS0FBSyxnQkFBZ0IsWUFBWSxFQUFHLGdCQUFnQixDQUNoRSxDQUE4QixFQUM5QixLQUFLLGlCQUFtQixJQUFJLEdBQUcsR0FBRyxvQkFBb0IsQ0FBRSxTQUFVLENBQUMsQ0FBQyxLQUFLLFNBQVMsTUFBTSxNQUFNLENBQUMsRUFBRSxRQUFTLENBQUMsRUFFM0csS0FBSyx1QkFBeUIsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFFLFFBQVMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxZQUFZLEtBQUssaUJBQWtCLENBQUUsTUFBTyxpQkFBa0IsTUFBTyxRQUFTLENBQUMsQ0FBQyxDQUFFLENBQUMsR0FJeEosTUFBTSxLQUFLLHdCQUF3QixJQUNuQyxLQUFLLGVBQWlCLElBQUksR0FBRyxHQUFHLG9CQUFvQixDQUFFLFNBQVUsRUFBSyxDQUFDLEVBRXRFLEtBQUsscUJBQXVCLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBRSxRQUFTLENBQUMsSUFBSSxHQUFHLEdBQUcsWUFBWSxLQUFLLGVBQWdCLENBQUUsTUFBTyxvQkFBcUIsTUFBTyxRQUFTLENBQUMsQ0FBQyxDQUFFLENBQUMsR0FJM0osS0FBSyxhQUFlLElBQUksR0FBRyxHQUFHLGlCQUFpQixDQUMzQyxHQUFJLGdDQUNKLE1BQU8sQ0FBQyxLQUFLLGFBQWMsS0FBSyxrQkFBbUIsS0FBSyxrQkFBbUIsS0FBSyx1QkFBd0IsS0FBSyxvQkFBb0IsRUFBRSxPQUFPLE9BQU8sQ0FDckosQ0FBQyxDQUNMLENBS0EsTUFBYyx5QkFBMEIsQ0FDcEMsTUFBTUMsRUFBdUIsU0FBUyxjQUFjLGdDQUFnQyxFQUlwRixHQUhBQSxHQUFzQixNQUFNLEVBQzVCQSxHQUFzQixNQUFNLEVBRXhCLEdBQUcsT0FBTyxJQUFJLG1CQUFtQixJQUFNLEVBQUcsTUFBTyxHQUNoRCxHQUFJLFNBQVMsY0FBYyxhQUFhLEVBQUcsTUFBTyxHQUNsRCxHQUFJLFNBQVMsY0FBYyxpQ0FBaUMsRUFBRyxNQUFPLEdBQ3RFLEdBQUksU0FBUyxjQUFjLG1DQUFtQyxFQUFHLE1BQU8sR0FDeEUsQ0FHRCxHQUZJLENBQUMsR0FBRyxPQUFPLElBQUksYUFBYSxHQUU1QixFQURxQixNQUFNLEtBQUssSUFBSSxJQUFJLENBQUUsT0FBUSxRQUFTLEtBQU0sV0FBWSxPQUFRLFFBQVMsQ0FBa0MsR0FDL0csTUFBTSxTQUFTLE9BQU8sU0FBUyxRQUFRLEVBQUcsTUFBTyxHQUV0RSxNQUFNQyxFQUFrQixNQUFNLEtBQUssSUFBSSxJQUFJLENBQ3ZDLE9BQVEsaUJBQ1IsUUFBUyxHQUFHLE9BQU8sSUFBSSxhQUFhLENBQ3hDLENBQTZDLEVBRTdDLE9BQUlBLEVBQWUsZUFBZSxNQUFNLENBQUMsR0FBRyxZQUFjLEdBQUcsT0FBTyxJQUFJLFlBQVksR0FDM0VBLEVBQWUsZUFBZSxTQUFXLFdBQWFBLEVBQWUsZUFBZSxNQUFNLFNBQVcsRUFEaEIsR0FFbEYsQ0FBQyxPQUFPLFNBQVNBLEVBQWUsZUFBZSxNQUFNLENBQUMsR0FBRyxhQUFhLENBQ3RGLENBQ0osQ0FLUSxlQUFnQixDQUNwQixNQUFNQyxFQUFnQixLQUFLLGNBQWMsU0FBUyxFQUFFLEtBQUssRUFFekQsR0FBSSxDQUFDQSxFQUFnQixLQUFLLGFBQWEsWUFBWSxDQUFDLEVBQXVCLFlBQWMsV0FDaEYsS0FBSyxPQUFRLENBQ2xCLE1BQU1DLEVBQWdCRCxJQUFrQixLQUFLLG1CQUFtQixXQUFXLElBQUssR0FBRyxFQUU3RUUsRUFDRixLQUFLLFVBQVUsU0FBUyxFQUFFLEtBQU0vQixHQUFRLENBQUMsS0FBSyxnQkFBaUIsU0FBU0EsQ0FBYSxDQUFDLEdBQUssS0FBSyxnQkFBaUIsS0FBTUEsR0FBUSxDQUFDLEtBQUssVUFBVSxTQUFTLEVBQUUsU0FBU0EsQ0FBRyxDQUFDLEVBRTNLLElBQUlnQyxFQUFzQixHQUMxQixHQUFJLEtBQUssbUJBQW9CLENBQ3pCLE1BQU1DLEVBQXFCLE9BQU8sUUFBUSxLQUFLLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUUvRCxDQUFJLElBQU0sT0FBTyxRQUFRQSxFQUFLLFVBQVUsRUFBRSxPQUFTLENBQUMsRUFFakksU0FBVyxDQUFDOEIsRUFBSzlCLENBQUksSUFBSytELEVBQW9CLENBRTFDLEdBQUksQ0FEbUIsS0FBSyxnQkFBaUIsU0FBU2pDLENBQUcsR0FDbEMsQ0FBQyxLQUFLLFVBQVUsU0FBUyxFQUFFLFNBQVNBLENBQUcsRUFBRyxTQUVqRSxNQUFNa0MsRUFBYSxLQUFLLG1CQUFtQmxDLENBQWEsR0FBSyxPQUFPLFFBQVE5QixFQUFLLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQ2dELENBQUksSUFBTSxDQUFDQSxFQUFNLEVBQUUsQ0FBQyxFQUVqSGlCLEVBQXFCLEtBQUssb0JBQW9CLEtBQU1DLEdBQWFBLEVBQVMsT0FBU3BDLENBQUcsRUFFNUYsVUFBV3FDLEtBQWFGLEVBQW1CLFdBQVksQ0FDbkQsTUFBTUcsRUFBY0osRUFBVyxLQUFNSyxHQUFhQSxFQUFTLENBQUMsSUFBTUYsRUFBVSxJQUFJLElBQUksQ0FBQyxHQUFLLEdBQ3BGRyxFQUFjSCxFQUFVLE9BQU8sU0FBUyxFQUFFLEtBQUssRUFFckQsR0FBSUMsSUFBZ0JFLEVBQWEsQ0FDN0JSLEVBQXNCLEdBQ3RCLEtBQ0osQ0FDSixDQUVBLEdBQUlBLEVBQXFCLEtBQzdCLENBQ0osQ0FFQSxNQUFNUyxFQUFxQixLQUFLLGlCQUFpQixTQUFTLEVBQUUsS0FBSyxJQUFNLEtBQUssZUFBZ0IsV0FBVyxJQUFLLEdBQUcsRUFFekdDLEVBQ0YsS0FBSyxlQUFlLFNBQVMsRUFBRSxLQUFNcEUsR0FBYSxDQUFDLEtBQUssY0FBZSxTQUFTQSxDQUFrQixDQUFDLEdBQ25HLEtBQUssY0FBZSxLQUFNQSxHQUFhLENBQUMsS0FBSyxlQUFlLFNBQVMsRUFBRSxTQUFTQSxDQUFRLENBQUMsRUFFdkZxRSxFQUFVLENBQUMsRUFFYmIsR0FBZWEsRUFBUSxLQUFLLGlCQUFpQmQsQ0FBYSxJQUFJLEVBQzlERSxHQUFhWSxFQUFRLEtBQUssaUNBQWlDLEVBQzNEWCxHQUFxQlcsRUFBUSxLQUFLLDBDQUEwQyxFQUM1RUYsR0FBb0JFLEVBQVEsS0FBSyx5QkFBeUIsRUFDMURELEdBQW1CQyxFQUFRLEtBQUssbUJBQW1CLEVBRW5EQSxFQUFRLFNBQVcsR0FBR0EsRUFBUSxLQUFLLDBCQUEwQixFQUVqRUEsRUFBUSxDQUFDLEVBQUlBLEVBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUlBLEVBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUN6REEsRUFBUSxPQUFTLElBQUdBLEVBQVFBLEVBQVEsT0FBUyxDQUFDLEVBQUksT0FBT0EsRUFBUSxHQUFHLEVBQUUsQ0FBQyxJQUUxRSxLQUFLLGFBQWEsWUFBWSxDQUFDLEVBQXVCLFlBQWNBLEVBQVEsS0FBS0EsRUFBUSxPQUFTLEVBQUksS0FBTyxHQUFHLENBQ3JILE1BQVEsS0FBSyxhQUFhLFlBQVksQ0FBQyxFQUF1QixZQUFjLHdCQUF3QmQsQ0FBYSxJQUNySCxDQUtBLE1BQWMsa0JBQW1CLENBQ3pCLEtBQUssU0FBUSxLQUFLLFlBQWMsTUFBTSxLQUFLLGVBQWUsS0FBSyxTQUFTLEdBRTVFLEtBQUssa0JBQW9CLEtBQUssY0FBYyxLQUFLLEtBQUssV0FBVyxJQUFJLENBQUMsRUFFdEUsS0FBSyxnQkFDRCxPQUFPLFFBQVEsS0FBSyxpQkFBaUIsRUFDaEMsSUFBSSxDQUFDLENBQUM3QixFQUFLNEMsQ0FBTyxJQUNmLENBQUM1QyxFQUFLLEdBQUc0QyxFQUFRLE9BQU8sRUFBRSxLQUFNN0MsR0FDNUIsSUFBSSxPQUFPLFVBQVVBLEVBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHQSxFQUFjLENBQUMsQ0FBQyxJQUFJQSxFQUFjLE1BQU0sQ0FBQyxDQUFDLGNBQWMsRUFBRSxLQUFLLEtBQUssV0FBVyxDQUN6SSxFQUNNQyxFQUNBLElBQ1YsRUFDQyxPQUFPLE9BQU8sRUFDckIsS0FBSyxDQUFDRSxFQUFHQyxJQUFNRCxFQUFFLFlBQVksRUFBRSxjQUFjQyxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBRS9ELE1BQU0wQyxFQUF1QixPQUFPLFFBQVEsS0FBSyxpQkFBaUIsRUFDN0QsUUFBUSxDQUFDLENBQUM3QyxFQUFLNEMsQ0FBTyxJQUFNLENBQUM1QyxFQUFLLEdBQUc0QyxFQUFRLE9BQU8sQ0FBQyxFQUNyRCxJQUFLN0MsR0FBbUIsSUFBSSxPQUFPLFVBQVVBLEVBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHQSxFQUFjLENBQUMsQ0FBQyxJQUFJQSxFQUFjLE1BQU0sQ0FBQyxDQUFDLGNBQWMsRUFBRSxLQUFLLEtBQUssV0FBVyxFQUFJQSxFQUFnQixJQUFLLEVBQ3RMLE9BQU8sT0FBTyxFQUVuQixLQUFLLG1CQUFxQixPQUFPLFlBQzdCOEMsRUFDSyxJQUFLN0MsR0FBUSxDQUNWLE1BQU04QyxFQUFRLElBQUksT0FBTyxVQUFVOUMsRUFBSSxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUdBLEVBQUksQ0FBQyxDQUFDLElBQUlBLEVBQUksTUFBTSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxLQUFLLFdBQVcsRUFFbEgrQyxFQUFTLE9BQU8sUUFBUSxLQUFLLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDWCxFQUFVUSxDQUFPLElBQU0sQ0FBQ1IsRUFBVSxHQUFHUSxFQUFRLE9BQU8sRUFBRSxTQUFTNUMsQ0FBRyxDQUFDLElBQUksQ0FBQyxFQUdySSxHQUFJLENBRHNCOEMsSUFBUSxDQUFDLEVBQ1gsT0FBTyxLQUUvQixNQUFNRSxFQUFxQkYsRUFBTSxDQUFDLEVBQUUsTUFBTSxHQUFHLEVBQUUsSUFBSSxDQUFDUCxFQUFVVSxJQUFVLENBQ3BFLEdBQUksQ0FBQ1YsRUFBUyxTQUFTLEdBQUcsRUFBRyxNQUFPLEVBQUVVLEVBQVEsR0FBRyxTQUFTLEVBQUdWLEVBQVMsS0FBSyxDQUFDLEVBRTVFLEtBQU0sQ0FBQ3JCLEVBQU16RCxDQUFLLEVBQUk4RSxFQUFTLE1BQU0sR0FBRyxFQUV4QyxNQUFPLENBQUNyQixFQUFLLEtBQUssRUFBR3pELEVBQU0sS0FBSyxDQUFDLENBQ3JDLENBQUMsRUFFRCxNQUFPLENBQUNzRixFQUFRQyxDQUFrQixDQUN0QyxDQUFDLEVBQ0EsT0FBTyxPQUFPLENBQ3ZCLEVBRUEsS0FBSyxlQUNELEtBQUssWUFDQSxNQUFNLHNCQUFzQixHQUMzQixHQUFHLEVBQUUsR0FDTCxNQUFNLEdBQUksRUFBRSxHQUNaLEtBQUssR0FBSyxHQUVwQixLQUFLLGNBQWdCLEtBQUssWUFBWSxNQUFNLHdCQUF3QixHQUFHLElBQUsxRSxHQUFhQSxFQUFTLE1BQU0sR0FBSSxFQUFFLENBQUMsR0FBSyxDQUFDLEVBRXJILEtBQUssYUFBZSxDQUNoQixLQUFLLFlBQVksTUFBTSw2QkFBNkIsSUFBSSxDQUFDLEVBQ3pELEtBQUssWUFBWSxNQUFNLHNCQUFzQixJQUFJLENBQUMsRUFDbEQsS0FBSyxZQUFZLE1BQU0seUJBQXlCLElBQUksQ0FBQyxFQUNyRCxLQUFLLFlBQVksTUFBTSx5QkFBeUIsSUFBSSxDQUFDLENBQ3pELEVBQ0ssT0FBTyxPQUFPLEVBQ2QsS0FBSztBQUFBLENBQUksRUFFVixLQUFLLGtCQUFtQixLQUFLLGNBQWMsU0FBUyxLQUFLLGtCQUFrQixXQUFXLElBQUssR0FBRyxDQUFDLEVBQzlGLEdBQUcsT0FBTyxrQ0FBbUMsQ0FBRSxLQUFNLE9BQVEsQ0FBQyxFQUVuRSxLQUFLLFVBQVUsU0FBUyxLQUFLLGVBQWUsRUFFNUMsU0FBVyxDQUFDa0MsRUFBY3RDLENBQUksSUFBSyxPQUFPLFFBQVEsS0FBSyxrQkFBa0IsRUFBRyxDQUN4RSxNQUFNZ0YsRUFBc0IsS0FBSyxvQkFBb0IsS0FBTTlDLEdBQWVBLEVBQVcsT0FBU0ksQ0FBWSxFQUMxRyxHQUFLMEMsRUFFTCxTQUFXLENBQUNwQyxFQUFleUIsQ0FBUSxJQUFLckUsRUFBTSxDQUMxQyxNQUFNaUYsRUFBdUJELEVBQW9CLFdBQVcsS0FBTWIsR0FBYyxDQUFDQSxFQUFVLEtBQU0sR0FBR0EsRUFBVSxPQUFPLEVBQUUsU0FBU3ZCLENBQWEsQ0FBQyxFQUUxSXFDLEdBQXNCQSxFQUFxQixPQUFPLFNBQVNaLENBQVEsQ0FDM0UsQ0FDSixDQUVJLEtBQUssZ0JBQWdCLEtBQUssaUJBQWlCLFNBQVMsS0FBSyxjQUFjLEVBRTNFLFVBQVdqRSxLQUFZLEtBQUssY0FBZSxLQUFLLGVBQWUsZ0JBQWdCQSxDQUFRLEVBQ3ZGLEtBQUssZUFBZSxTQUFTLEtBQUssY0FBYyxJQUFLQSxJQUFjLENBQUUsS0FBTUEsRUFBVSxNQUFPQSxDQUFTLEVBQUUsQ0FBQyxFQUV4RyxLQUFLLGNBQWMsQ0FDdkIsQ0FLQSxNQUFjLG9CQUFxQixDQUMvQixNQUFNOEUsRUFBcUosQ0FBQyxFQUV0SkMsRUFBYyxLQUFLLGNBQWMsU0FBUyxFQUFFLEtBQUssRUFDakRDLEVBQU8sS0FBSyxVQUFVLFNBQVMsRUFHaEMscUJBQXFCLEtBQUtELENBQVcsR0FBR0QsRUFBTyxLQUFLLENBQUUsTUFBT0MsRUFBYSxRQUFTLDRCQUE2QixDQUFDLEVBR3RILEdBQUksQ0FDQSxLQUFLLGtCQUFvQixHQUFHLE1BQU0sWUFBWUEsQ0FBVyxDQUM3RCxNQUFRLENBQ0FELEVBQU8sU0FBVyxHQUFHQSxFQUFPLEtBQUssQ0FBRSxNQUFPQyxFQUFhLFFBQVMsNEJBQTZCLENBQUMsQ0FDdEcsQ0FDSSxDQUFDLEtBQUssbUJBQXFCRCxFQUFPLFNBQVcsR0FBR0EsRUFBTyxLQUFLLENBQUUsTUFBT0MsRUFBYSxRQUFTLDRCQUE2QixDQUFDLEVBR3pILEtBQUssbUJBQW1CLFNBQVMsSUFBTSxLQUFLLGdCQUFnQixTQUFTLEdBQUdELEVBQU8sS0FBSyxDQUFFLFFBQVMsNEJBQTZCLENBQUMsRUFFakksTUFBTUcsRUFBbUIsTUFBTSxLQUFLLElBQy9CLElBQUksQ0FBRSxPQUFRLFFBQVMsY0FBZSxJQUFLLEtBQU0sQ0FBQyxZQUFhLFlBQVksRUFBRyxPQUFRRixDQUFZLENBQW1DLEVBQ3JJLE1BQU9HLElBQzhCQSxJQUFjLGVBQWdCSixFQUFPLEtBQUssQ0FBRSxNQUFPQyxFQUFhLFFBQVMsaUJBQWtCLENBQUMsRUFDbkdELEVBQU8sS0FBSyxDQUFFLE1BQU9DLEVBQWEsUUFBUyw0Q0FBNENHLENBQVMsSUFBSyxDQUFDLEVBQzFILEtBQ1YsRUFDQ0MsRUFBMEIsTUFBTSxLQUFLLElBQUksSUFBSSxDQUFFLE9BQVEsUUFBUyxLQUFNSixFQUFhLEtBQU0sV0FBWSxVQUFXLEVBQUssQ0FBMEIsRUFHckosR0FBSUksRUFBdUIsTUFBTSxZQUFZLENBQUMsRUFBRyxDQUM3QyxNQUFNQyxFQUNGRCxFQUF1QixNQUFNLFVBQVUsQ0FBQyxFQUFFLElBQU1BLEVBQXVCLE1BQU0sVUFBVSxDQUFDLEVBQUUsV0FBYSxJQUFJQSxFQUF1QixNQUFNLFVBQVUsQ0FBQyxFQUFFLFVBQVUsR0FBSyxJQUN4S0wsRUFBTyxLQUFLLENBQ1IsTUFBT0MsRUFDUCxRQUFTLDZCQUE2QixHQUFHLEtBQUssT0FDMUNLLENBQ0osQ0FBQyxxQkFBcUJBLENBQW1CLDJFQUN6QyxVQUFXLENBQUMsQ0FBRSxLQUFNLGdCQUFpQixPQUFRQSxDQUFvQixDQUFDLENBQ3RFLENBQUMsQ0FDTCxDQUdBLEdBQUlMLEVBQVksTUFBTSxHQUFHLEVBQUUsT0FBUyxFQUVoQyxHQURxQkksRUFBdUIsTUFBTSxTQUFTLEtBQU0zRixHQUFZQSxFQUFRLEtBQUssV0FBVyxVQUFXLEVBQUUsSUFBTXVGLEVBQVksTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBRXpJQyxFQUFLLFNBQVMsYUFBYSxHQUMzQkYsRUFBTyxLQUFLLENBQ1IsUUFBUyxvRkFDVCxVQUFXLENBQ1AsQ0FBRSxLQUFNLE1BQU8sSUFBSyxjQUFlLEVBQ25DLENBQUUsS0FBTSxTQUFVLElBQUssYUFBYyxDQUN6QyxDQUNKLENBQUMsRUFDQUUsRUFBSyxTQUFTLGNBQWMsR0FDN0JGLEVBQU8sS0FBSyxDQUFFLFFBQVMsdUZBQXdGLFVBQVcsQ0FBQyxDQUFFLEtBQU0sTUFBTyxJQUFLLGNBQWUsQ0FBQyxDQUFFLENBQUMsTUFDbkssQ0FDSCxNQUFNTyxHQUNELE1BQU0sS0FBSyxJQUFJLElBQUksQ0FDaEIsT0FBUSxRQUNSLGNBQWUsSUFDZixLQUFNLFlBQ04sT0FBUSxVQUNSLFFBQVMsT0FDVCxPQUFRLEtBQUssa0JBQW1CLFNBQVMsQ0FDN0MsQ0FBbUMsR0FDckMsTUFBTSxNQUFNLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxNQUFNLEtBQUssUUFFekIsQ0FDWixHQUFJQSxFQUNDLE1BQU0sNkVBQTZFLEdBQ2xGLElBQUtDLEdBQW1CQSxFQUFPLE1BQU0sR0FBRyxFQUFFLElBQUtDLEdBQVNBLEVBQUssS0FBSyxDQUFDLENBQUMsR0FDcEUsS0FBSyxHQUFLLENBQUMsRUFDakIsR0FBSUYsRUFDQyxNQUFNLDhJQUE4SSxHQUNuSixJQUFLQyxHQUNIQSxFQUNLLE1BQU0sR0FBRyxFQUNULElBQUtDLEdBQVNBLEVBQUssS0FBSyxDQUFDLEVBQ3pCLE9BQVFBLEdBQVMsQ0FBQyxhQUFhLEtBQUtBLENBQUksQ0FBQyxDQUNsRCxHQUNFLEtBQUssR0FBSyxDQUFDLEVBQ2pCLEdBQUlGLEVBQW1CLE1BQU0sMEJBQTBCLEdBQUcsSUFBS0MsR0FBbUJBLEVBQU8sS0FBSyxDQUFDLEdBQUssQ0FBQyxDQUN6RyxFQUNZLFNBQVNQLEVBQVksTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQ3RDQyxFQUFLLFNBQVMsY0FBYyxHQUM1QkYsRUFBTyxLQUFLLENBQ1IsUUFBUyxvRkFDVCxVQUFXLENBQ1AsQ0FBRSxLQUFNLE1BQU8sSUFBSyxhQUFjLEVBQ2xDLENBQUUsS0FBTSxTQUFVLElBQUssY0FBZSxDQUMxQyxDQUNKLENBQUMsRUFDQUUsRUFBSyxTQUFTLGFBQWEsR0FDNUJGLEVBQU8sS0FBSyxDQUFFLFFBQVMsd0ZBQXlGLFVBQVcsQ0FBQyxDQUFFLEtBQU0sTUFBTyxJQUFLLGFBQWMsQ0FBQyxDQUFFLENBQUMsR0FFdEtBLEVBQU8sS0FBSyxDQUNSLFFBQVMsNkJBQTZCLEdBQUcsS0FBSyxPQUFPQyxDQUFXLENBQUMscUJBQXFCQSxDQUFXLG1EQUNqRyxVQUFXLENBQUMsQ0FBRSxLQUFNLGdCQUFpQixPQUFRQSxFQUFZLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBRSxDQUFDLENBQzVFLENBQUMsQ0FDVCxDQUlKLEdBQUlBLEVBQVksTUFBTSxHQUFHLEVBQUUsU0FBVyxFQUNsQyxVQUFXckQsSUFBTyxDQUFDLGVBQWdCLGFBQWEsRUFDeENzRCxFQUFLLFNBQVN0RCxDQUFHLEdBQUdvRCxFQUFPLEtBQUssQ0FBRSxRQUFTLHdFQUF3RXBELENBQUcsYUFBYyxVQUFXLENBQUMsQ0FBRSxLQUFNLFNBQVUsSUFBQUEsQ0FBSSxDQUFDLENBQUUsQ0FBQyxFQUV0TCxNQUFNOEQsRUFBNkIsQ0FBQyxFQUFFUCxFQUFpQixNQUFNLE1BQU0sQ0FBQyxFQUFFLFdBQWEsbUJBQW9CQSxFQUFpQixNQUFNLE1BQU0sQ0FBQyxFQUFFLFdBQ2pJUSxFQUFzQixDQUFDLENBQUNSLEVBQWlCLE1BQU0sTUFBTSxDQUFDLEVBQUUsWUFBWSxLQUFNakYsR0FBYUEsRUFBUyxRQUFVLG1CQUFtQixFQUU3SDBGLEVBQTJCLENBQUMsMkJBQTRCLGtDQUFrQyxFQUMxRkMsRUFBb0IsQ0FBQyw2QkFBOEIsdUJBQXVCLEVBRTFFQyxFQUF1Q0YsRUFBeUIsS0FBTTVCLEdBQWFrQixFQUFLLFNBQVNsQixDQUFRLENBQUMsRUFDMUcrQixFQUFnQ0YsRUFBa0IsS0FBTTdCLEdBQWFrQixFQUFLLFNBQVNsQixDQUFRLENBQUMsRUFHOUYwQixHQUE4QixDQUFDSSxHQUF3QyxDQUFDQyxHQUN4RWYsRUFBTyxLQUFLLENBQUUsUUFBUyw2R0FBOEcsQ0FBQyxFQUV0SUcsRUFBaUIsTUFBTSxNQUFNLENBQUMsRUFBRSxXQUFhLENBQUNPLEtBRXpDLENBQUNDLElBQXdCRyxHQUF3Q0MsSUFBb0NKLEdBQXVCRyxJQUM3SGQsRUFBTyxLQUFLLENBQ1IsUUFBUyw4R0FDVCxVQUFXLENBQUMsR0FBR1ksRUFBMEIsR0FBR0MsQ0FBaUIsRUFBRSxJQUFLakUsSUFBUyxDQUFFLEtBQU0sU0FBVSxJQUFBQSxDQUFJLEVBQUUsQ0FDekcsQ0FBQyxFQUdEK0QsR0FBdUIsQ0FBQ0ksR0FDeEJmLEVBQU8sS0FBSyxDQUFFLFFBQVMsOEdBQStHLENBQUMsR0FJM0lVLEdBQThCUixFQUFLLFNBQVMsMEJBQTBCLEdBQUssQ0FBQyxLQUFLLGdCQUFnQixZQUFZLEVBQUUsU0FBUyxtQkFBbUIsR0FDM0lGLEVBQU8sS0FBSyxDQUNSLFFBQ0ksMk1BQ0osVUFBVyxDQUFDLENBQUUsS0FBTSxTQUFVLElBQUssMEJBQTJCLENBQUMsQ0FDbkUsQ0FBQyxFQUdMLFVBQVdoQixJQUFZLENBQUMsbUJBQW9CLHVCQUF3Qix1QkFBd0IsbUJBQW1CLEVBQ3ZHa0IsRUFBSyxTQUFTbEIsQ0FBUSxHQUN0QmdCLEVBQU8sS0FBSyxDQUNSLFFBQVMsb0RBQW9EaEIsQ0FBUSxxRUFDckUsVUFBVyxDQUFDLENBQUUsS0FBTSxTQUFVLElBQUtBLENBQVMsQ0FBQyxDQUNqRCxDQUFDLEVBR0wsR0FBRyxPQUFPLElBQUksa0JBQWtCLEdBQUssQ0FBQ2tCLEVBQUssU0FBUyxzQkFBc0IsR0FDMUVGLEVBQU8sS0FBSyxDQUFFLFFBQVMsK0ZBQWdHLFVBQVcsQ0FBQyxDQUFFLEtBQU0sTUFBTyxJQUFLLHNCQUF1QixDQUFDLENBQUUsQ0FBQyxFQUdsTEUsRUFBSyxTQUFTLHNCQUFzQixHQUFLLENBQUMsR0FBRyxPQUFPLElBQUksa0JBQWtCLEdBQzFFRixFQUFPLEtBQUssQ0FDUixRQUFTLHlHQUNULFVBQVcsQ0FBQyxDQUFFLEtBQU0sU0FBVSxJQUFLLHNCQUF1QixDQUFDLENBQy9ELENBQUMsRUFHTCxVQUFXcEQsS0FBT3NELEVBQWtCLENBQ2hDLE1BQU1WLEVBQVUsS0FBSyxrQkFBa0I1QyxDQUFHLEVBQzFDLEdBQUs0QyxFQUVMLFNBQVcsQ0FBQzlCLEVBQWVDLENBQWEsSUFBSyxPQUFPLFFBQVE2QixFQUFRLFVBQVUsRUFBRyxDQUM3RSxNQUFNd0IsRUFBaUIsS0FBSyxvQkFDdkIsS0FBTWhFLEdBQWVBLEVBQVcsT0FBU0osQ0FBRyxHQUMzQyxXQUFXLEtBQU1xQyxHQUFjLENBQUNBLEVBQVUsS0FBTSxHQUFHQSxFQUFVLE9BQU8sRUFBRSxTQUFTdkIsQ0FBYSxDQUFDLEVBRTlGc0QsR0FFRHJELEVBQWMsVUFBWSxDQUFDcUQsRUFBZSxPQUFPLFNBQVMsRUFBRSxLQUFLLEdBQ2pFaEIsRUFBTyxLQUFLLENBQUUsUUFBUywwQkFBMEJwRCxDQUFHLDREQUE0RGMsQ0FBYSxVQUFXLENBQUMsQ0FDakosQ0FDSixDQUdBLE9BQUksS0FBSyxrQkFBa0IsV0FBVyxHQUFLLENBQUMsS0FBSyxTQUFVLE1BQU0sTUFBTSxDQUFDLEVBQUUsU0FBVyxDQUFDLEtBQUssU0FBVSxNQUFNLE1BQU0sQ0FBQyxFQUFFLFVBQ2hIc0MsRUFBTyxLQUFLLENBQUUsTUFBTyxLQUFLLGdCQUFnQixZQUFZLEVBQUcsZ0JBQWdCLEVBQUcsUUFBUyxnQ0FBaUMsQ0FBQyxFQUVwSEEsQ0FDWCxDQUtBLE1BQWMseUJBQTBCLENBQ3BDLE1BQU1pQixFQUFvQixDQUN0QixLQUFLLGNBQ0wsS0FBSyxVQUNMLEdBQUcsS0FBSyxvQkFBb0IsUUFBU2pDLEdBQWFBLEVBQVMsV0FBVyxJQUFLQyxHQUFjQSxFQUFVLE1BQU0sQ0FBQyxFQUMxRyxLQUFLLGlCQUNMLEtBQUsseUJBQ0wsS0FBSyxlQUNMLEtBQUssYUFDTCxLQUFLLGFBQ0wsS0FBSyxrQkFDTCxLQUFLLGtCQUNMLEtBQUssaUJBQ0wsS0FBSyxjQUNULEVBQUUsT0FBTyxPQUFPLEVBRWhCLFVBQVdpQyxLQUFXRCxFQUFvQkMsRUFBeUIsWUFBWSxFQUFJLEVBRW5GLEtBQUssYUFBYSxTQUFTLDZCQUE2QixFQUV4RCxJQUFJbEIsRUFBOEQsQ0FBQyxFQUluRSxHQUhJLEtBQUssV0FBWUEsRUFBUyxNQUFNLEtBQUssbUJBQW1CLEVBQ3ZELEtBQUssa0JBQW9CLEdBQUcsTUFBTSxZQUFZLEtBQUssY0FBYyxTQUFTLENBQUMsRUFFNUVBLEVBQU8sT0FBUyxFQUFHLENBQ25CLFVBQVdrQixLQUFXLFNBQVMsaUJBQWlCLDBCQUEwQixFQUFHQSxFQUFRLE9BQU8sRUFDNUYsU0FBVyxDQUFFLE1BQUEzRyxFQUFPLFFBQUE0RyxFQUFTLFVBQUFDLENBQVUsSUFBS3BCLEVBQVEsQ0FDaEQsTUFBTWpGLEVBQVEsSUFBSSxHQUFHLEdBQUcsWUFDcEIsR0FBR1IsRUFBUSxZQUFZLEdBQUcsS0FBSyxPQUFPQSxDQUFLLENBQUMscUJBQXFCQSxDQUFLLE9BQVMsV0FBVyxJQUFJNEcsQ0FBTyx1REFDekcsRUFDTUUsRUFBaUIsSUFBSSxHQUFHLEdBQUcsY0FBYyxDQUFFLEtBQU0sUUFBUyxRQUFTLENBQUMseUJBQXlCLEVBQUcsT0FBUSxHQUFNLE1BQUF0RyxDQUFNLENBQUMsRUFFM0gsR0FBSXFHLEVBQVcsQ0FDWCxNQUFNRSxFQUFnQixJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUUsTUFBTyxtQkFBb0IsTUFBTyxDQUFDLGFBQWEsRUFBRyxRQUFTLENBQUMsZ0NBQWdDLENBQUUsQ0FBQyxFQUMvSUEsRUFBYyxHQUFHLFFBQVMsSUFBTSxDQUM1QixNQUFNcEIsRUFBTyxLQUFLLFVBQVUsU0FBUyxFQUVyQyxVQUFXcUIsS0FBV0gsRUFDZEcsRUFBUSxPQUFTLE9BQVMsQ0FBQ3JCLEVBQUssU0FBU3FCLEVBQVEsR0FBRyxHQUFHLEtBQUssVUFBVSxPQUFPQSxFQUFRLElBQUtBLEVBQVEsR0FBRyxFQUVyR0EsRUFBUSxPQUFTLFVBQVlyQixFQUFLLFNBQVNxQixFQUFRLEdBQUcsR0FBRyxLQUFLLFVBQVUsZ0JBQWdCQSxFQUFRLEdBQUcsRUFFbkdBLEVBQVEsT0FBUyxpQkFBaUIsS0FBSyxjQUFjLFNBQVNBLEVBQVEsTUFBTSxFQUdwRkYsRUFBZSxTQUFTLENBQUMsRUFBRSxNQUFNLGVBQWlCLHlCQUNsREMsRUFBYyxTQUFTLENBQUMsRUFBRSxPQUFPLENBQ3JDLENBQUMsRUFFREQsRUFBZSxTQUFTLENBQUMsRUFBRSxjQUFjLDJCQUEyQixFQUFHLE9BQU9DLEVBQWMsU0FBUyxDQUFDLENBQUMsQ0FDM0csQ0FFQSxLQUFLLFVBQVUsU0FBUyxDQUFDLEVBQUUsT0FBT0QsRUFBZSxTQUFTLENBQUMsQ0FBQyxDQUNoRSxDQUVBLFVBQVdILEtBQVdELEVBQW9CQyxFQUF5QixZQUFZLEVBQUssRUFFcEYsS0FBSyxhQUFhLFNBQVMsZUFBZSxFQUMxQyxLQUFLLFdBQWEsR0FFbEIsTUFDSixDQUdBLEtBQUssYUFBYSxTQUFTLEdBQUcsS0FBSyxPQUFTLFVBQVksVUFBVSxjQUFjLEVBRWhGLE1BQU1NLEVBQVMsS0FBSyxhQUNoQixLQUFLLGNBQWMsU0FBUyxFQUM1QixLQUFLLFVBQVUsU0FBUyxFQUN4QixLQUFLLGFBQ0wsS0FBSyxpQkFBaUIsU0FBUyxFQUMvQixLQUFLLGVBQWUsU0FBUyxDQUNqQyxFQUVNaEUsR0FBVyxLQUFLLGFBQWEsU0FBUyxHQUFNLEtBQUssYUFBYSxZQUFZLENBQUMsRUFBdUIsYUFBZSxLQUFLLGFBRzVILEdBRGUsTUFBTSxLQUFLLGFBQWEsS0FBSyxVQUFXZ0UsRUFBUWhFLENBQU8sRUFNdEUsSUFIQSxHQUFHLE9BQU8sWUFBWSxLQUFLLE9BQVMsU0FBVyxTQUFTLGlCQUFrQixDQUFFLEtBQU0sU0FBVSxDQUFDLEVBR3pGLEtBQUssa0JBQWtCLFdBQVcsRUFBRyxDQUNyQyxLQUFLLGFBQWEsU0FBUyxzQkFBc0IsRUFFakQsTUFBTWlFLEVBQVcsS0FBSyxVQUFVLFNBQVMsRUFBRSxTQUFTLGFBQWEsRUFFM0RELEVBQVMsS0FBSyxhQUFhLEtBQUssa0JBQW1CLFlBQVksRUFBRyxnQkFBZ0IsRUFBR0MsRUFBVyxDQUFDLGFBQWEsRUFBSSxDQUFDLEVBQUcsT0FBVyxPQUFXLENBQUMsQ0FBQyxFQUdwSixHQUFJLENBRGUsTUFBTSxLQUFLLGFBQWEsS0FBSyxnQkFBZ0IsWUFBWSxFQUFHLGdCQUFnQixFQUFHRCxFQUFRLGtDQUFvQyxLQUFLLFlBQVksRUFDOUksT0FFakIsR0FBRyxPQUFPLGlDQUFrQyxDQUFFLEtBQU0sU0FBVSxDQUFDLENBQ25FLENBR0EsR0FBSSxLQUFLLGdCQUFnQixXQUFXLEVBQUcsQ0FDbkMsS0FBSyxhQUFhLFNBQVMsd0JBQXdCLEVBRW5ELE1BQU1FLEVBQXVDLFNBQVMsY0FBYyxlQUFlLEVBQzdFQyxFQUFxQixTQUFTLGNBQWMsaUNBQWlDLEVBRS9FRCxFQUNxQixNQUFNLEtBQUssSUFDM0IsY0FBYyxTQUFVLENBQUUsT0FBUSxTQUFVLEtBQU0sSUFBSSxJQUFJQSxFQUFXLElBQUksRUFBRSxhQUFhLElBQUksTUFBTSxDQUFHLENBQUMsRUFDdEcsTUFBTSxDQUFDdEIsRUFBbUJ3QixLQUN2QixHQUFHLE9BQU8sb0JBQW9CLEtBQUssU0FBUyxhQUFhQSxHQUFXLE1BQU0sTUFBUSxlQUFlLEtBQUt4QixDQUFTLElBQUssQ0FBRSxLQUFNLE9BQVEsQ0FBQyxFQUM5SCxLQUNWLEdBQ2EsR0FBRyxPQUFPLG1DQUFvQyxDQUFFLEtBQU0sU0FBVSxDQUFDLEVBQzVFdUIsR0FDUEEsRUFBbUIsTUFBTSxFQUN6QixHQUFHLE9BQU8sbUNBQW9DLENBQUUsS0FBTSxTQUFVLENBQUMsR0FDOUQsR0FBRyxPQUFPLGlFQUFrRSxDQUFFLEtBQU0sT0FBUSxDQUFDLENBQ3hHLENBRUEsS0FBSyxhQUFhLFNBQVMsd0JBQXdCLEVBRW5ELE9BQU8sU0FBUyxLQUFPLEdBQUcsS0FBSyxPQUFPLEtBQUssVUFBVyxDQUFFLFNBQVUsSUFBSyxDQUFDLEVBQzVFLENBS1EsYUFBYWpGLEVBQWdCd0QsRUFBZ0IyQixFQUErQkMsRUFBaUNDLEVBQXNCLENBQ3ZJLE1BQU1DLEVBQWUsR0FBRyxNQUFNLFlBQVl0RixDQUFNLEVBRTFDdUYsRUFBaUJELEVBQ2pCLEdBQUdBLEVBQWEsZUFBZSxJQUFNLEdBQUssSUFBTSxFQUFFLEdBQUdBLEVBQWEsZ0JBQWdCLENBQUMsR0FBR0EsRUFBYSxZQUFZLEVBQUksSUFBSUEsRUFBYSxZQUFZLENBQUMsR0FBSyxFQUFFLEdBQ3hKdEYsRUFBTyxLQUFLLEVBR2QsS0FBSyxnQkFDQSxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLFVBQVUsS0FBSyxFQUNmLFdBQVcsbUJBQW9CLEVBQUUsSUFDdENvRixHQUNNLFlBQVksRUFDYixVQUFVLEtBQUssRUFDZixXQUFXLG1CQUFvQixFQUFFLElBRXRDQSxFQUFjLFFBRWxCLE1BQU1JLEVBQW9CaEMsRUFBSyxJQUFLdEQsR0FBUSxDQUN4QyxNQUFNdUYsRUFBc0IsS0FBSyxvQkFBb0IsS0FBTW5GLEdBQWVBLEVBQVcsT0FBU0osQ0FBRyxFQUNqRyxHQUFJLENBQUN1RixFQUFxQixNQUFPLEtBQUt2RixDQUFHLEtBRXpDLE1BQU13RixFQUFrQkQsRUFBb0IsV0FDdkMsSUFBSSxDQUFDbEQsRUFBV1ksSUFBVSxDQUN2QixNQUFNeEYsRUFBUTRFLEVBQVUsT0FBTyxTQUFTLEVBQUUsS0FBSyxFQUMvQyxPQUFLNUUsRUFFRSxJQUFJNEUsRUFBVSxRQUFVWSxFQUFRLEdBQUcsU0FBUyxFQUFJLEdBQUssR0FBR1osRUFBVSxJQUFJLEdBQUcsR0FBRzVFLENBQUssR0FGckUsSUFHdkIsQ0FBQyxFQUNBLE9BQU8sT0FBTyxFQUNkLEtBQUssRUFBRSxFQUVaLE1BQU8sS0FBS3VDLENBQUcsR0FBR3dGLENBQWUsSUFDckMsQ0FBQyxFQUVELE1BQU8sQ0FDSCxlQUFlSCxDQUFjO0FBQUEsRUFDN0IvQixFQUFLLE9BQVMsRUFBSTtBQUFBLEVBQStCZ0MsRUFBa0IsS0FBSztBQUFBLENBQUksQ0FBQztBQUFBO0FBQUEsRUFBVyxLQUN4RkwsRUFBWUEsRUFBWTtBQUFBLEVBQU8sS0FDL0JDLEVBQWMsaUJBQWlCQSxFQUFZLEtBQUssQ0FBQyxLQUFPLEtBQ3hEQyxFQUFXLE9BQVMsRUFBSUEsRUFBVyxJQUFLN0csR0FBYSxjQUFjQSxDQUFRLElBQUksRUFBRSxLQUFLO0FBQUEsQ0FBSSxFQUFJLElBQ2xHLEVBQ0ssT0FBTyxPQUFPLEVBQ2QsS0FBSztBQUFBLENBQUksQ0FDbEIsQ0FNQSxNQUFjLGVBQWVYLEVBQWUsQ0FDeEMsT0FDSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQ2hCLE9BQVEsUUFDUixjQUFlLElBQ2YsS0FBTSxZQUNOLE9BQVEsVUFDUixRQUFTLE9BQ1QsT0FBUUEsQ0FDWixDQUFtQyxHQUNyQyxNQUFNLE1BQU0sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxRQUFRLEtBQUssQ0FDMUQsQ0FRQSxNQUFjLGFBQWFBLEVBQWU4SCxFQUFjN0UsRUFBaUIsQ0FDckUsT0FBTyxNQUFNLEtBQUssSUFDYixLQUFLakQsRUFBTyxLQUFPLENBQUUsS0FBQThILEVBQU0sUUFBQTdFLENBQVEsRUFBRSxFQUNyQyxNQUFNLENBQUM0QyxFQUFtQndCLElBQ25CeEIsSUFBYyxtQkFDUCxLQUFLLElBQUksT0FBTzdGLEVBQU8sQ0FBRSxRQUFBaUQsQ0FBUSxFQUFHNkUsQ0FBSSxFQUFFLE1BQU0sQ0FBQ2pDLEVBQW1Cd0IsSUFBa0MsQ0FDekcsR0FBRyxPQUFPLGtCQUFrQnJILENBQUssS0FBS3FILEdBQVcsTUFBTSxNQUFRLGVBQWUsS0FBS3hCLENBQVMsSUFBSyxDQUFFLEtBQU0sT0FBUSxDQUFDLENBQ3RILENBQUMsR0FFRCxHQUFHLE9BQU8sNkJBQTZCN0YsQ0FBSyxLQUFLcUgsR0FBVyxNQUFNLE1BQVEsZUFBZSxLQUFLeEIsQ0FBUyxJQUFLLENBQUUsS0FBTSxPQUFRLENBQUMsRUFDdEgsS0FFZCxDQUNULENBQ0osQ0FFQSxJQUFJdEUsRUFBZSxFQUFFLElBQUksQ0FDN0IsQ0FBQyIsCiAgIm5hbWVzIjogWyJSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0IiwgImNvbmZpZyIsICJwYWdlVGl0bGVQYXJzZWQiLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAidGl0bGUiLCAicmVzdWx0IiwgIm1hdGNoZWRTZWN0aW9ucyIsICJzZWN0aW9uIiwgInBhcnNlZFRpdGxlIiwgInBhZ2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgInBhZ2VzIiwgImNhdGVnb3J5IiwgInRpdGxlV2l0aG91dE5hbWVzcGFjZSIsICJUZW1wbGF0ZVByZXZpZXdEaWFsb2ciLCAidGFnc0NvbnRlbnQiLCAiY2F0ZWdvcmllc0NvbnRlbnQiLCAicGFuZWxMYXlvdXQiLCAiYWN0aW9uIiwgIlNob3dDaGFuZ2VzRGlhbG9nIiwgIm9sZFRleHQiLCAibmV3VGV4dCIsICJjb21wYXJpc29uIiwgIm5vQ2hhbmdlc0VsZW1lbnQiLCAiUmVkaXJlY3RIZWxwZXIiLCAicGFnZUluZm8iLCAiZGlhbG9nSW5mbyIsICJidXR0b24iLCAiUmVkaXJlY3RIZWxwZXJEaWFsb2ciLCAicG9ydGxldExpbmsiLCAiZXZlbnQiLCAicmVkaXJlY3RUZW1wbGF0ZXMiLCAiY29udGVudFRleHQiLCAicGFnZVRpdGxlIiwgImV4aXN0cyIsICJtYWluUGFnZUNvbnRlbnQiLCAidGFyZ2V0IiwgInRhZ09yUmVkaXJlY3QiLCAidGFnIiwgInNvcnRlZFRhZ3MiLCAiYSIsICJiIiwgImVkaXRvckluZm8iLCAic2hvd25UZW1wbGF0ZUVkaXRvcnMiLCAic3VtbWFyeUVsZW1lbnQiLCAibm9UZW1wbGF0ZXNNZXNzYWdlIiwgInRlbXBsYXRlTmFtZSIsICJ0ZW1wbGF0ZURhdGEiLCAicGFyYW1ldGVycyIsICJkZXRhaWxzIiwgInN1bW1hcnkiLCAiZWxlbWVudERhdGEiLCAicGFyYW1ldGVyTmFtZSIsICJwYXJhbWV0ZXJEYXRhIiwgImlucHV0IiwgImlucHV0TGF5b3V0IiwgIm5hbWUiLCAiZ2VuZXJhdGlvbmFsU3VmZml4IiwgImxhc3ROYW1lIiwgIm90aGVyTmFtZXMiLCAibmV3TmFtZSIsICJsZWFkaW5nQXJ0aWNsZSIsICJ3aW5kb3dNYW5hZ2VyIiwgInRlbXBsYXRlUHJldmlld0RpYWxvZyIsICJzaG93Q2hhbmdlc0RpYWxvZyIsICJwYWdlVHJpYWdlTWFya0J1dHRvbiIsICJwYXRyb2xSZXNwb25zZSIsICJyZWRpcmVjdFZhbHVlIiwgInRhcmdldENoYW5nZWQiLCAidGFnc0NoYW5nZWQiLCAidGFnQXJndW1lbnRzQ2hhbmdlZCIsICJ0YWdzV2l0aFBhcmFtZXRlcnMiLCAib2xkVGFnRGF0YSIsICJmb3VuZFRhZ0VkaXRvckRhdGEiLCAidGVtcGxhdGUiLCAicGFyYW1ldGVyIiwgIm9sZEFyZ3VtZW50IiwgImFyZ3VtZW50IiwgIm5ld0FyZ3VtZW50IiwgImRlZmF1bHRTb3J0Q2hhbmdlZCIsICJjYXRlZ29yaWVzQ2hhbmdlZCIsICJjaGFuZ2VzIiwgInRhZ0RhdGEiLCAib3JpZ2luYWxSZWRpcmVjdFRhZ3MiLCAibWF0Y2giLCAibmV3VGFnIiwgImZvcm1hdHRlZEFyZ3VtZW50cyIsICJpbmRleCIsICJmb3VuZFRlbXBsYXRlRWRpdG9yIiwgImZvdW5kUGFyYW1ldGVyRWRpdG9yIiwgImVycm9ycyIsICJkZXN0aW5hdGlvbiIsICJ0YWdzIiwgImRlc3RpbmF0aW9uRGF0YSIsICJlcnJvckNvZGUiLCAiZGVzdGluYXRpb25QYXJzZVJlc3VsdCIsICJkZXN0aW5hdGlvblJlZGlyZWN0IiwgImRlc3RpbmF0aW9uQ29udGVudCIsICJhbmNob3IiLCAicGFydCIsICJ0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSIsICJ0YXJnZXRJc1N1cm5hbWVMaXN0IiwgInRvRGlzYW1iaWd1YXRpb25QYWdlVGFncyIsICJ0b1N1cm5hbWVMaXN0VGFncyIsICJ0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UiLCAidGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QiLCAiZm91bmRQYXJhbWV0ZXIiLCAiZWxlbWVudHNUb0Rpc2FibGUiLCAiZWxlbWVudCIsICJtZXNzYWdlIiwgImF1dG9GaXhlcyIsICJ3YXJuaW5nTWVzc2FnZSIsICJhdXRvRml4QnV0dG9uIiwgImF1dG9GaXgiLCAib3V0cHV0IiwgImZyb21Nb3ZlIiwgInBhdHJvbExpbmsiLCAibWFya1Jldmlld2VkQnV0dG9uIiwgImVycm9ySW5mbyIsICJzdHJheVRleHQiLCAiZGVmYXVsdFNvcnQiLCAiY2F0ZWdvcmllcyIsICJwYXJzZWRUYXJnZXQiLCAiZm9ybWF0dGVkVGl0bGUiLCAidGFnc1dpdGhBcmd1bWVudHMiLCAiZm91bmRBcmd1bWVudEVkaXRvciIsICJtYXBwZWRBcmd1bWVudHMiLCAidGV4dCJdCn0K