Jump to content

User:Eejit43/scripts/script-updater.js

From Wikipedia, the free encyclopedia
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/script-updater.ts

"use strict";mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],()=>{if(mw.config.get("wgUserName")!=="Eejit43"||mw.config.get("wgPageName")!=="User:Eejit43")return;const m=document.querySelector(".mw-editsection").cloneNode(!0),r=document.createElement("a");r.href="#",r.style.fontWeight="bold",r.textContent="Sync from GitHub",r.addEventListener("click",h=>{h.preventDefault();const e=new OO.ui.WindowManager;document.body.append(e.$element[0]);const t=new i;e.addWindows([t]),t.open()}),m.querySelector("a").replaceWith(r),document.querySelector("h2#My_user_scripts + .mw-editsection").after(m);class i extends OO.ui.ProcessDialog{repoOwner="Eejit43";repoName="wikipedia-scripts";content;checkboxElements=[];latestCommitHash;scripts;constructor(){super({size:"medium"}),i.static.name="ScriptUpdaterDialog",i.static.title="What scripts do you want to update?",i.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"save",label:"Run",flags:["primary","progressive"]}]}getSetupProcess=()=>i.super.prototype.getSetupProcess.call(this).next(()=>this.wrapAsyncMethod(this.loadScriptData).then(e=>{if(e){const t=new OO.ui.MessageWidget({type:"error",label:e});this.content=new OO.ui.PanelLayout({padded:!0,expanded:!1}),this.content.$element.append(t.$element),this.$body.append(this.content.$element),this.getActions().setAbilities({save:!1});return}this.content=new OO.ui.PanelLayout({padded:!0,expanded:!1});for(const t of this.scripts){const s=new OO.ui.CheckboxInputWidget;this.checkboxElements.push([t.name,s]);const a=new OO.ui.FieldLayout(s,{align:"inline",label:t.name});this.content.$element.append(a.$element)}this.$body.append(this.content.$element)}));getActionProcess=e=>e==="cancel"?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):e==="save"?new OO.ui.Process(()=>{const t=[];for(const[s,a]of this.checkboxElements)a.isSelected()&&t.push(this.scripts.find(o=>o.name===s));this.getManager().closeWindow(this),(async()=>(mw.notify("Syncing scripts...",{tag:"sync-scripts-notification"}),await Promise.all(t.map(s=>this.handleScript(s))),await this.editOrCreate("User:Eejit43/scripts-info",[this.mapScripts(this.scripts.filter(s=>!s.personal&&!s.fork)),"","=== Forks ===",this.mapScripts(this.scripts.filter(s=>s.fork)),"","=== Personal scripts ===",this.mapScripts(this.scripts.filter(s=>s.personal))].join(`
`),"Syncing script list from GitHub"),mw.notify(`Synced ${t.length} script${t.length===1?"":"s"} from GitHub!`,{type:"success",tag:"sync-scripts-notification"})))()}):i.super.prototype.getActionProcess.call(this,e);getTeardownProcess=()=>i.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});wrapAsyncMethod(e){const t=$.Deferred();return e().then(s=>t.resolve(s)),t.promise()}loadScriptData=async()=>{const e=await fetch(`https://api.github.com/repos/${this.repoOwner}/${this.repoName}/commits`);if(!e.ok)return`Failed to fetch latest commit hash from GitHub: ${e.statusText} (${e.status})`;this.latestCommitHash=(await e.json())[0].sha;const t=await fetch(`https://raw.githubusercontent.com/${this.repoOwner}/${this.repoName}/${this.latestCommitHash}/scripts.json`);if(!t.ok)return`Failed to fetch script data from GitHub: ${t.statusText} (${t.status})`;this.scripts=await t.json()};async handleScript(e){const t=`User:Eejit43/scripts/${e.name}`,s=`User talk:Eejit43/scripts/${e.name}`,a=`${t}.js`,o=`${t}.css`,u=["{{User:Eejit43/script-documentation",e.image===!1?`| image             = ${e.image}`:null,e["in-development"]?`| in-development    = ${e["in-development"]}`:null,e["use-instead"]?`| use-instead       = ${e["use-instead"].includes("User:")?e["use-instead"]:`[[User:Eejit43/scripts/${e["use-instead"]}|${e["use-instead"]}]]`}`:null,e["image-caption"]?`| image-caption     = ${e["image-caption"]}`:null,e["other-authors"]?`| other-authors     = ${e["other-authors"].map(n=>`[[User:${n}|${n}]]`).join(", ")}`:null,`| description-short = ${e["short-description"]}`,`| description       = ${e.description}`,e.usage?`| usage             = ${e.usage}`:null,e.changelog?`| changelog         = 
${Object.entries(e.changelog).map(([n,l])=>`* '''{{start date and age|${n}}}:'''${Array.isArray(l)?`
${l.map(g=>`** ${g}`).join(`
`)}`:` ${l}`}`).join(`
`)}`:null,`| skin-support      = {{User:Eejit43/skin-support|${Object.entries(e["skin-support"]).map(([n,l])=>`${n}=${l}`).join("|")}}}`,`| released          = {{start date and age|${e.released}}}`,`| updated           = {{start date and age|${e.updated}}}`,"}}"].filter(Boolean);let c=null;const p=await fetch(`https://raw.githubusercontent.com/${this.repoOwner}/${this.repoName}/${this.latestCommitHash}/dist/scripts/${e.name}.js`);if(p.ok)c=await p.text();else return mw.notify(`Failed to fetch "${e.name}.js" from GitHub: ${p.statusText} (${p.status})`,{type:"error",tag:"sync-scripts-notification"});let d=null;if(e.css){const n=await fetch(`https://raw.githubusercontent.com/${this.repoOwner}/${this.repoName}/${this.latestCommitHash}/dist/styles/${e.name}.css`);n.ok?d=await n.text():mw.notify(`Failed to fetch "${e.name}.css" from GitHub: ${n.statusText} (${n.status})`,{type:"error",tag:"sync-scripts-notification"})}e.personal||(await this.editOrCreate(t,u.join(`
`),"Syncing script documentation from GitHub"),await this.editOrCreate(s,"#REDIRECT [[User talk:Eejit43]]","Redirecting script documentation talk page to main user talk page")),c&&await this.editOrCreate(a,c,"Syncing script from GitHub"),e.css&&d&&await this.editOrCreate(o,d,"Syncing styles from GitHub")}mapScripts(e){return e.map(t=>`* [[User:Eejit43/scripts/${t.name}${t.personal?".js":""}|${t.name}]] - ${t["short-description"]||t.description}${t["in-development"]?' (<span style="color: #bd2828">in development</span>)':""}${t["use-instead"]?' (<span style="color: #bd2828">deprecated</span>)':""}`).join(`
`)}async editOrCreate(e,t,s){s+=" (via [[User:Eejit43/scripts/script-updater.js|script]])",await new mw.Api().edit(e,()=>({text:t,summary:s,watchlist:"watch"})).catch(async(a,o)=>{if(a==="nocreate-missing")await new mw.Api().create(e,{summary:s,watchlist:"watch"},t).catch((u,c)=>{mw.notify(`Error creating ${e}: ${c?.error.info??"Unknown error"} (${u})`,{type:"error"})});else{mw.notify(`Error editing or creating ${e}: ${o?.error.info??"Unknown error"} (${a})`,{type:"error"});return}})}}Object.assign(i.prototype,OO.ui.ProcessDialog.prototype)});

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9zY3JpcHQtdXBkYXRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgTWVkaWFXaWtpRGF0YUVycm9yIH0gZnJvbSAnLi4vZ2xvYmFsLXR5cGVzJztcblxuaW50ZXJmYWNlIFNjcmlwdCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgICdpbi1kZXZlbG9wbWVudCc/OiBib29sZWFuO1xuICAgICd1c2UtaW5zdGVhZCc/OiBzdHJpbmc7XG4gICAgaW1hZ2U/OiBmYWxzZTtcbiAgICAnaW1hZ2UtY2FwdGlvbic/OiBzdHJpbmc7XG4gICAgJ3Nob3J0LWRlc2NyaXB0aW9uJzogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgdXNhZ2U/OiBzdHJpbmc7XG4gICAgY2hhbmdlbG9nPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+O1xuICAgICdvdGhlci1hdXRob3JzJz86IHN0cmluZ1tdO1xuICAgIGZvcms/OiB0cnVlO1xuICAgIHBlcnNvbmFsPzogdHJ1ZTtcbiAgICAnc2tpbi1zdXBwb3J0JzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gICAgcmVsZWFzZWQ6IHN0cmluZztcbiAgICB1cGRhdGVkOiBzdHJpbmc7XG4gICAgY3NzPzogdHJ1ZTtcbn1cblxubXcubG9hZGVyLnVzaW5nKFsnbWVkaWF3aWtpLnV0aWwnLCAnb29qcy11aS1jb3JlJywgJ29vanMtdWktd2lkZ2V0cycsICdvb2pzLXVpLXdpbmRvd3MnXSwgKCkgPT4ge1xuICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykgIT09ICdFZWppdDQzJyB8fCBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykgIT09ICdVc2VyOkVlaml0NDMnKSByZXR1cm47XG5cbiAgICBjb25zdCBmdWxsTGlua0VsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubXctZWRpdHNlY3Rpb24nKSEuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxTcGFuRWxlbWVudDtcblxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgbGluay5ocmVmID0gJyMnO1xuICAgIGxpbmsuc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcbiAgICBsaW5rLnRleHRDb250ZW50ID0gJ1N5bmMgZnJvbSBHaXRIdWInO1xuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgY29uc3Qgc2NyaXB0VXBkYXRlckRpYWxvZyA9IG5ldyBTY3JpcHRVcGRhdGVyRGlhbG9nKCk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbc2NyaXB0VXBkYXRlckRpYWxvZ10pO1xuXG4gICAgICAgIHNjcmlwdFVwZGF0ZXJEaWFsb2cub3BlbigpO1xuICAgIH0pO1xuXG4gICAgZnVsbExpbmtFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EnKSEucmVwbGFjZVdpdGgobGluayk7XG5cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoMiNNeV91c2VyX3NjcmlwdHMgKyAubXctZWRpdHNlY3Rpb24nKSEuYWZ0ZXIoZnVsbExpbmtFbGVtZW50KTtcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdGhhdCBtYW5hZ2VzIHVwZGF0aW5nIHNjcmlwdHMuXG4gICAgICovXG4gICAgY2xhc3MgU2NyaXB0VXBkYXRlckRpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgICAgICBwcml2YXRlIHJlcG9Pd25lciA9ICdFZWppdDQzJztcbiAgICAgICAgcHJpdmF0ZSByZXBvTmFtZSA9ICd3aWtpcGVkaWEtc2NyaXB0cyc7XG5cbiAgICAgICAgcHJpdmF0ZSBjb250ZW50ITogT08udWkuUGFuZWxMYXlvdXQ7XG4gICAgICAgIHByaXZhdGUgY2hlY2tib3hFbGVtZW50czogW3N0cmluZywgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldF1bXSA9IFtdO1xuXG4gICAgICAgIHByaXZhdGUgbGF0ZXN0Q29tbWl0SGFzaCE6IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBzY3JpcHRzITogU2NyaXB0W107XG5cbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBzdXBlcih7IHNpemU6ICdtZWRpdW0nIH0pO1xuXG4gICAgICAgICAgICBTY3JpcHRVcGRhdGVyRGlhbG9nLnN0YXRpYy5uYW1lID0gJ1NjcmlwdFVwZGF0ZXJEaWFsb2cnO1xuICAgICAgICAgICAgU2NyaXB0VXBkYXRlckRpYWxvZy5zdGF0aWMudGl0bGUgPSAnV2hhdCBzY3JpcHRzIGRvIHlvdSB3YW50IHRvIHVwZGF0ZT8nO1xuICAgICAgICAgICAgU2NyaXB0VXBkYXRlckRpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICB7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfSxcbiAgICAgICAgICAgICAgICB7IGFjdGlvbjogJ3NhdmUnLCBsYWJlbDogJ1J1bicsIGZsYWdzOiBbJ3ByaW1hcnknLCAncHJvZ3Jlc3NpdmUnXSB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFNldHVwUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBTY3JpcHRVcGRhdGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRTZXR1cFByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwQXN5bmNNZXRob2QodGhpcy5sb2FkU2NyaXB0RGF0YSkudGhlbigoZXJyb3I/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlRWxlbWVudCA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHsgdHlwZTogJ2Vycm9yJywgbGFiZWw6IGVycm9yIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudC4kZWxlbWVudC5hcHBlbmQobWVzc2FnZUVsZW1lbnQuJGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQodGhpcy5jb250ZW50LiRlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY3Rpb25zKCkuc2V0QWJpbGl0aWVzKHsgc2F2ZTogZmFsc2UgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2NyaXB0IG9mIHRoaXMuc2NyaXB0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrYm94RWxlbWVudHMucHVzaChbc2NyaXB0Lm5hbWUsIGNoZWNrYm94XSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjaGVja2JveCwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiBzY3JpcHQubmFtZSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50LiRlbGVtZW50LmFwcGVuZChsYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnY2FuY2VsJylcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1hbmFnZXIoKS5jbG9zZVdpbmRvdyh0aGlzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3NhdmUnKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkU2NyaXB0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtzY3JpcHROYW1lLCBjaGVja2JveF0gb2YgdGhpcy5jaGVja2JveEVsZW1lbnRzKSBpZiAoY2hlY2tib3guaXNTZWxlY3RlZCgpKSBzZWxlY3RlZFNjcmlwdHMucHVzaCh0aGlzLnNjcmlwdHMuZmluZCgoc2NyaXB0KSA9PiBzY3JpcHQubmFtZSA9PT0gc2NyaXB0TmFtZSkhKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1hbmFnZXIoKS5jbG9zZVdpbmRvdyh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KCdTeW5jaW5nIHNjcmlwdHMuLi4nLCB7IHRhZzogJ3N5bmMtc2NyaXB0cy1ub3RpZmljYXRpb24nIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChzZWxlY3RlZFNjcmlwdHMubWFwKChzY3JpcHQpID0+IHRoaXMuaGFuZGxlU2NyaXB0KHNjcmlwdCkpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXI6RWVqaXQ0My9zY3JpcHRzLWluZm8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBTY3JpcHRzKHRoaXMuc2NyaXB0cy5maWx0ZXIoKHNjcmlwdCkgPT4gIXNjcmlwdC5wZXJzb25hbCAmJiAhc2NyaXB0LmZvcmspKSwgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9PT0gRm9ya3MgPT09JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBTY3JpcHRzKHRoaXMuc2NyaXB0cy5maWx0ZXIoKHNjcmlwdCkgPT4gc2NyaXB0LmZvcmspKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9PT0gUGVyc29uYWwgc2NyaXB0cyA9PT0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcFNjcmlwdHModGhpcy5zY3JpcHRzLmZpbHRlcigoc2NyaXB0KSA9PiBzY3JpcHQucGVyc29uYWwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTeW5jaW5nIHNjcmlwdCBsaXN0IGZyb20gR2l0SHViJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgU3luY2VkICR7c2VsZWN0ZWRTY3JpcHRzLmxlbmd0aH0gc2NyaXB0JHtzZWxlY3RlZFNjcmlwdHMubGVuZ3RoID09PSAxID8gJycgOiAncyd9IGZyb20gR2l0SHViIWAsIHsgdHlwZTogJ3N1Y2Nlc3MnLCB0YWc6ICdzeW5jLXNjcmlwdHMtbm90aWZpY2F0aW9uJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIFNjcmlwdFVwZGF0ZXJEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBTY3JpcHRVcGRhdGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdyYXBzIGFuIGFzeW5jIG1ldGhvZCBpbnRvIGEgalF1ZXJ5IERlZmVycmVkIG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIHdyYXAuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIHdyYXBBc3luY01ldGhvZChtZXRob2Q6ICgpID0+IFByb21pc2U8dW5rbm93bj4pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgICAgICBtZXRob2QoKS50aGVuKChyZXN1bHQpID0+IGRlZmVycmVkLnJlc29sdmUocmVzdWx0KSk7XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgZGF0YSBmb3IgYWxsIHNjcmlwdHMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGxvYWRTY3JpcHREYXRhID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGF0ZXN0Q29tbWl0SGFzaFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHt0aGlzLnJlcG9Pd25lcn0vJHt0aGlzLnJlcG9OYW1lfS9jb21taXRzYCk7XG4gICAgICAgICAgICBpZiAoIWxhdGVzdENvbW1pdEhhc2hSZXNwb25zZS5vaykgcmV0dXJuIGBGYWlsZWQgdG8gZmV0Y2ggbGF0ZXN0IGNvbW1pdCBoYXNoIGZyb20gR2l0SHViOiAke2xhdGVzdENvbW1pdEhhc2hSZXNwb25zZS5zdGF0dXNUZXh0fSAoJHtsYXRlc3RDb21taXRIYXNoUmVzcG9uc2Uuc3RhdHVzfSlgO1xuXG4gICAgICAgICAgICB0aGlzLmxhdGVzdENvbW1pdEhhc2ggPSAoKGF3YWl0IGxhdGVzdENvbW1pdEhhc2hSZXNwb25zZS5qc29uKCkpIGFzIHsgc2hhOiBzdHJpbmcgfVtdKVswXS5zaGE7XG5cbiAgICAgICAgICAgIGNvbnN0IHNjcmlwdERhdGFSZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vJHt0aGlzLnJlcG9Pd25lcn0vJHt0aGlzLnJlcG9OYW1lfS8ke3RoaXMubGF0ZXN0Q29tbWl0SGFzaH0vc2NyaXB0cy5qc29uYCk7XG4gICAgICAgICAgICBpZiAoIXNjcmlwdERhdGFSZXNwb25zZS5vaykgcmV0dXJuIGBGYWlsZWQgdG8gZmV0Y2ggc2NyaXB0IGRhdGEgZnJvbSBHaXRIdWI6ICR7c2NyaXB0RGF0YVJlc3BvbnNlLnN0YXR1c1RleHR9ICgke3NjcmlwdERhdGFSZXNwb25zZS5zdGF0dXN9KWA7XG5cbiAgICAgICAgICAgIHRoaXMuc2NyaXB0cyA9IChhd2FpdCBzY3JpcHREYXRhUmVzcG9uc2UuanNvbigpKSBhcyBTY3JpcHRbXTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSGFuZGxlcyBhbmQgZWRpdHMvY3JlYXRlcyBwYWdlcyBmb3IgYSBnaXZlbiBzY3JpcHQuXG4gICAgICAgICAqIEBwYXJhbSBzY3JpcHQgVGhlIHNjcmlwdCB0byBoYW5kbGUuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGhhbmRsZVNjcmlwdChzY3JpcHQ6IFNjcmlwdCkge1xuICAgICAgICAgICAgY29uc3Qgc3VicGFnZU5hbWUgPSBgVXNlcjpFZWppdDQzL3NjcmlwdHMvJHtzY3JpcHQubmFtZX1gO1xuICAgICAgICAgICAgY29uc3Qgc3VicGFnZVRhbGtOYW1lID0gYFVzZXIgdGFsazpFZWppdDQzL3NjcmlwdHMvJHtzY3JpcHQubmFtZX1gO1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0TmFtZSA9IGAke3N1YnBhZ2VOYW1lfS5qc2A7XG4gICAgICAgICAgICBjb25zdCBzdHlsZU5hbWUgPSBgJHtzdWJwYWdlTmFtZX0uY3NzYDtcblxuICAgICAgICAgICAgY29uc3QgZnVsbFN1YnBhZ2VJbmZvID0gW1xuICAgICAgICAgICAgICAgICd7e1VzZXI6RWVqaXQ0My9zY3JpcHQtZG9jdW1lbnRhdGlvbicsIC8vXG4gICAgICAgICAgICAgICAgc2NyaXB0LmltYWdlID09PSBmYWxzZSA/IGB8IGltYWdlICAgICAgICAgICAgID0gJHtzY3JpcHQuaW1hZ2V9YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NyaXB0Wydpbi1kZXZlbG9wbWVudCddID8gYHwgaW4tZGV2ZWxvcG1lbnQgICAgPSAke3NjcmlwdFsnaW4tZGV2ZWxvcG1lbnQnXX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHRbJ3VzZS1pbnN0ZWFkJ11cbiAgICAgICAgICAgICAgICAgICAgPyBgfCB1c2UtaW5zdGVhZCAgICAgICA9ICR7c2NyaXB0Wyd1c2UtaW5zdGVhZCddLmluY2x1ZGVzKCdVc2VyOicpID8gc2NyaXB0Wyd1c2UtaW5zdGVhZCddIDogYFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvJHtzY3JpcHRbJ3VzZS1pbnN0ZWFkJ119fCR7c2NyaXB0Wyd1c2UtaW5zdGVhZCddfV1dYH1gXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHRbJ2ltYWdlLWNhcHRpb24nXSA/IGB8IGltYWdlLWNhcHRpb24gICAgID0gJHtzY3JpcHRbJ2ltYWdlLWNhcHRpb24nXX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHRbJ290aGVyLWF1dGhvcnMnXSA/IGB8IG90aGVyLWF1dGhvcnMgICAgID0gJHtzY3JpcHRbJ290aGVyLWF1dGhvcnMnXS5tYXAoKGF1dGhvcikgPT4gYFtbVXNlcjoke2F1dGhvcn18JHthdXRob3J9XV1gKS5qb2luKCcsICcpfWAgOiBudWxsLFxuICAgICAgICAgICAgICAgIGB8IGRlc2NyaXB0aW9uLXNob3J0ID0gJHtzY3JpcHRbJ3Nob3J0LWRlc2NyaXB0aW9uJ119YCxcbiAgICAgICAgICAgICAgICBgfCBkZXNjcmlwdGlvbiAgICAgICA9ICR7c2NyaXB0LmRlc2NyaXB0aW9ufWAsXG4gICAgICAgICAgICAgICAgc2NyaXB0LnVzYWdlID8gYHwgdXNhZ2UgICAgICAgICAgICAgPSAke3NjcmlwdC51c2FnZX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHQuY2hhbmdlbG9nXG4gICAgICAgICAgICAgICAgICAgID8gYHwgY2hhbmdlbG9nICAgICAgICAgPSBcXG4ke09iamVjdC5lbnRyaWVzKHNjcmlwdC5jaGFuZ2Vsb2cpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoW2RhdGUsIGRlc2NyaXB0aW9uXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKiAnJyd7e3N0YXJ0IGRhdGUgYW5kIGFnZXwke2RhdGV9fX06JycnJHtBcnJheS5pc0FycmF5KGRlc2NyaXB0aW9uKSA/IGBcXG4ke2Rlc2NyaXB0aW9uLm1hcCgobGluZSkgPT4gYCoqICR7bGluZX1gKS5qb2luKCdcXG4nKX1gIDogYCAke2Rlc2NyaXB0aW9ufWB9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignXFxuJyl9YFxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgYHwgc2tpbi1zdXBwb3J0ICAgICAgPSB7e1VzZXI6RWVqaXQ0My9za2luLXN1cHBvcnR8JHtPYmplY3QuZW50cmllcyhzY3JpcHRbJ3NraW4tc3VwcG9ydCddKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChbc2tpbiwgc3RhdHVzXSkgPT4gYCR7c2tpbn09JHtzdGF0dXN9YClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJ3wnKX19fWAsXG4gICAgICAgICAgICAgICAgYHwgcmVsZWFzZWQgICAgICAgICAgPSB7e3N0YXJ0IGRhdGUgYW5kIGFnZXwke3NjcmlwdC5yZWxlYXNlZH19fWAsXG4gICAgICAgICAgICAgICAgYHwgdXBkYXRlZCAgICAgICAgICAgPSB7e3N0YXJ0IGRhdGUgYW5kIGFnZXwke3NjcmlwdC51cGRhdGVkfX19YCxcbiAgICAgICAgICAgICAgICAnfX0nLFxuICAgICAgICAgICAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgICAgIGxldCBzY3JpcHRDb250ZW50ID0gbnVsbDtcblxuICAgICAgICAgICAgY29uc3Qgc2NyaXB0Q29udGVudFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8ke3RoaXMucmVwb093bmVyfS8ke3RoaXMucmVwb05hbWV9LyR7dGhpcy5sYXRlc3RDb21taXRIYXNofS9kaXN0L3NjcmlwdHMvJHtzY3JpcHQubmFtZX0uanNgKTtcbiAgICAgICAgICAgIGlmIChzY3JpcHRDb250ZW50UmVzcG9uc2Uub2spIHNjcmlwdENvbnRlbnQgPSBhd2FpdCBzY3JpcHRDb250ZW50UmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBtdy5ub3RpZnkoYEZhaWxlZCB0byBmZXRjaCBcIiR7c2NyaXB0Lm5hbWV9LmpzXCIgZnJvbSBHaXRIdWI6ICR7c2NyaXB0Q29udGVudFJlc3BvbnNlLnN0YXR1c1RleHR9ICgke3NjcmlwdENvbnRlbnRSZXNwb25zZS5zdGF0dXN9KWAsIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgdGFnOiAnc3luYy1zY3JpcHRzLW5vdGlmaWNhdGlvbicsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCBzdHlsZUNvbnRlbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHNjcmlwdC5jc3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZUNvbnRlbnRSZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vJHt0aGlzLnJlcG9Pd25lcn0vJHt0aGlzLnJlcG9OYW1lfS8ke3RoaXMubGF0ZXN0Q29tbWl0SGFzaH0vZGlzdC9zdHlsZXMvJHtzY3JpcHQubmFtZX0uY3NzYCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3R5bGVDb250ZW50UmVzcG9uc2Uub2spIHN0eWxlQ29udGVudCA9IGF3YWl0IHN0eWxlQ29udGVudFJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgRmFpbGVkIHRvIGZldGNoIFwiJHtzY3JpcHQubmFtZX0uY3NzXCIgZnJvbSBHaXRIdWI6ICR7c3R5bGVDb250ZW50UmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7c3R5bGVDb250ZW50UmVzcG9uc2Uuc3RhdHVzfSlgLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiAnc3luYy1zY3JpcHRzLW5vdGlmaWNhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXNjcmlwdC5wZXJzb25hbCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKHN1YnBhZ2VOYW1lLCBmdWxsU3VicGFnZUluZm8uam9pbignXFxuJyksICdTeW5jaW5nIHNjcmlwdCBkb2N1bWVudGF0aW9uIGZyb20gR2l0SHViJyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoc3VicGFnZVRhbGtOYW1lLCAnI1JFRElSRUNUIFtbVXNlciB0YWxrOkVlaml0NDNdXScsICdSZWRpcmVjdGluZyBzY3JpcHQgZG9jdW1lbnRhdGlvbiB0YWxrIHBhZ2UgdG8gbWFpbiB1c2VyIHRhbGsgcGFnZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2NyaXB0Q29udGVudCkgYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoc2NyaXB0TmFtZSwgc2NyaXB0Q29udGVudCwgJ1N5bmNpbmcgc2NyaXB0IGZyb20gR2l0SHViJyk7XG5cbiAgICAgICAgICAgIGlmIChzY3JpcHQuY3NzICYmIHN0eWxlQ29udGVudCkgYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoc3R5bGVOYW1lLCBzdHlsZUNvbnRlbnQsICdTeW5jaW5nIHN0eWxlcyBmcm9tIEdpdEh1YicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1hcHMgc2NyaXB0cyB0byBhIGJ1bGxldGVkIGxpc3QuXG4gICAgICAgICAqIEBwYXJhbSBzY3JpcHRzIFRoZSBzY3JpcHRzIHRvIG1hcC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1hcHBlZCBzY3JpcHRzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBtYXBTY3JpcHRzKHNjcmlwdHM6IFNjcmlwdFtdKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NyaXB0c1xuICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgIChzY3JpcHQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBgKiBbW1VzZXI6RWVqaXQ0My9zY3JpcHRzLyR7c2NyaXB0Lm5hbWV9JHtzY3JpcHQucGVyc29uYWwgPyAnLmpzJyA6ICcnfXwke3NjcmlwdC5uYW1lfV1dIC0gJHtzY3JpcHRbJ3Nob3J0LWRlc2NyaXB0aW9uJ10gfHwgc2NyaXB0LmRlc2NyaXB0aW9ufSR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0Wydpbi1kZXZlbG9wbWVudCddID8gJyAoPHNwYW4gc3R5bGU9XCJjb2xvcjogI2JkMjgyOFwiPmluIGRldmVsb3BtZW50PC9zcGFuPiknIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgIH0ke3NjcmlwdFsndXNlLWluc3RlYWQnXSA/ICcgKDxzcGFuIHN0eWxlPVwiY29sb3I6ICNiZDI4MjhcIj5kZXByZWNhdGVkPC9zcGFuPiknIDogJyd9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVkaXRzIGEgcGFnZSwgb3IgY3JlYXRlcyBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBwYWdlIHRvIGVkaXQuXG4gICAgICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBwYWdlIGNvbnRlbnQgdG8gc2V0LlxuICAgICAgICAgKiBAcGFyYW0gc3VtbWFyeSBUaGUgZWRpdCBzdW1tYXJ5ICh3aWxsIGFwcGVuZCBzY3JpcHQgbm90aWNlKS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgZWRpdE9yQ3JlYXRlKHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgc3VtbWFyeTogc3RyaW5nKSB7XG4gICAgICAgICAgICBzdW1tYXJ5ICs9ICcgKHZpYSBbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL3NjcmlwdC11cGRhdGVyLmpzfHNjcmlwdF1dKSc7XG4gICAgICAgICAgICBhd2FpdCBuZXcgbXcuQXBpKClcbiAgICAgICAgICAgICAgICAuZWRpdCh0aXRsZSwgKCkgPT4gKHsgdGV4dCwgc3VtbWFyeSwgd2F0Y2hsaXN0OiAnd2F0Y2gnIH0pKVxuICAgICAgICAgICAgICAgIC5jYXRjaChhc3luYyAoZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9ySW5mbzogTWVkaWFXaWtpRGF0YUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdub2NyZWF0ZS1taXNzaW5nJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBtdy5BcGkoKS5jcmVhdGUodGl0bGUsIHsgc3VtbWFyeSwgd2F0Y2hsaXN0OiAnd2F0Y2gnIH0sIHRleHQpLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYEVycm9yIGNyZWF0aW5nICR7dGl0bGV9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCwgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgRXJyb3IgZWRpdGluZyBvciBjcmVhdGluZyAke3RpdGxlfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihTY3JpcHRVcGRhdGVyRGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7YUFxQkEsR0FBRyxPQUFPLE1BQU0sQ0FBQyxpQkFBa0IsZUFBZ0Isa0JBQW1CLGlCQUFpQixFQUFHLElBQU0sQ0FDNUYsR0FBSSxHQUFHLE9BQU8sSUFBSSxZQUFZLElBQU0sV0FBYSxHQUFHLE9BQU8sSUFBSSxZQUFZLElBQU0sZUFBZ0IsT0FFakcsTUFBTUEsRUFBa0IsU0FBUyxjQUFjLGlCQUFpQixFQUFHLFVBQVUsRUFBSSxFQUUzRUMsRUFBTyxTQUFTLGNBQWMsR0FBRyxFQUN2Q0EsRUFBSyxLQUFPLElBQ1pBLEVBQUssTUFBTSxXQUFhLE9BQ3hCQSxFQUFLLFlBQWMsbUJBQ25CQSxFQUFLLGlCQUFpQixRQUFVQyxHQUFVLENBQ3RDQSxFQUFNLGVBQWUsRUFFckIsTUFBTUMsRUFBZ0IsSUFBSSxHQUFHLEdBQUcsY0FD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VUFBVyxHQUFHLEdBQUcsY0FBYyxTQUFTLENBQzlFLENBQUMiLAogICJuYW1lcyI6IFsiZnVsbExpbmtFbGVtZW50IiwgImxpbmsiLCAiZXZlbnQiLCAid2luZG93TWFuYWdlciIsICJzY3JpcHRVcGRhdGVyRGlhbG9nIiwgIlNjcmlwdFVwZGF0ZXJEaWFsb2ciLCAiZXJyb3IiLCAibWVzc2FnZUVsZW1lbnQiLCAic2NyaXB0IiwgImNoZWNrYm94IiwgImxheW91dCIsICJhY3Rpb24iLCAic2VsZWN0ZWRTY3JpcHRzIiwgInNjcmlwdE5hbWUiLCAibWV0aG9kIiwgImRlZmVycmVkIiwgInJlc3VsdCIsICJsYXRlc3RDb21taXRIYXNoUmVzcG9uc2UiLCAic2NyaXB0RGF0YVJlc3BvbnNlIiwgInN1YnBhZ2VOYW1lIiwgInN1YnBhZ2VUYWxrTmFtZSIsICJzdHlsZU5hbWUiLCAiZnVsbFN1YnBhZ2VJbmZvIiwgImF1dGhvciIsICJkYXRlIiwgImRlc2NyaXB0aW9uIiwgImxpbmUiLCAic2tpbiIsICJzdGF0dXMiLCAic2NyaXB0Q29udGVudCIsICJzY3JpcHRDb250ZW50UmVzcG9uc2UiLCAic3R5bGVDb250ZW50IiwgInN0eWxlQ29udGVudFJlc3BvbnNlIiwgInNjcmlwdHMiLCAidGl0bGUiLCAidGV4dCIsICJzdW1tYXJ5IiwgImVycm9yQ29kZSIsICJlcnJvckluZm8iXQp9Cg==