Files
dashcaddy/status/dist/core.js
Hermes 94ee76e9de [grade=A urn:ump:josd2g7kqv476vux6euigmygdkijya2s4tsbyivtobw5ftzuf6ba] fix(DC-170): revive 19 CSP-blocked inline handlers across the dashboard — audit P0-3
The meta CSP (no unsafe-inline/unsafe-hashes) blocks ALL inline event
handlers; 19 controls were silently dead in every modern browser.

Revived:
- Disk Safety: toolbar button, injected modal Close/Save/Clean Up, and
  the 5 settings sliders (oninput -> input listeners; value labels
  never updated)
- AI chat FAB click; hover scale moved to a #ai-chat-fab:hover rule
- TOTP/login logo broken-image fallbacks: capture-phase error
  delegation + WeakSet + complete/naturalWidth race guard in
  totp-auth.js; updateTotpLogo never resurrects a broken logo
  (6 onerror attrs stripped from index.html + auth-gate.js templates)
- favicon-preview data-URI fallback (same race guard)
- app-selector folder-chip remove buttons (data-remove-folder)
- premium upsells in backup-restore + workflows (data-upgrade-msg) —
  their old onclick also called scrollToSection('license'), a function
  that has never existed anywhere in the codebase; now opens the real
  license UI via window.openLicenseModal (license.js)
- health-check Edit/Delete dispatch the same CustomEvents via
  data-health-action/data-service-id
- smart-arr Test button via data-smart-test

Verified: zero inline handler attributes remain across index.html +
hand-written js (grep); node --check clean x12; status suite 68/68;
dist rebuilt (SW dashcaddy-shell-36d9aa3364, CSP hash unchanged).
r1 grade C (missed sliders + logo onerror) -> r2 grade A:
urn:ump:mptri3qhywc2e47f2ba4qjafhwm3olzvrvt5vphxoyhea3vgt32a /
urn:ump:josd2g7kqv476vux6euigmygdkijya2s4tsbyivtobw5ftzuf6ba
2026-10-28 00:48:32 -07:00

850 lines
753 KiB
JavaScript

(function(l){"use strict";class a{constructor(){this.errors=[],this.maxErrors=50}logError(h,b,g={}){const v={timestamp:new Date().toISOString(),context:h,message:b instanceof Error?b.message:b,stack:b instanceof Error?b.stack:null,metadata:g};this.errors.push(v),this.errors.length>this.maxErrors&&this.errors.shift(),console.error(`[Onboarding Error] ${h}:`,b,g)}recoverFromError(h,b){switch(this.classifyError(h)){case"ELEMENT_NOT_FOUND":return this.logError("Element Not Found",h,{currentStep:b}),{action:"SKIP_STEP",nextStep:b+1,message:"Target element not found, skipping to next step"};case"STORAGE_UNAVAILABLE":return this.logError("Storage Unavailable",h),{action:"USE_MEMORY_STORAGE",message:"Local storage unavailable, using in-memory storage"};case"DRIVER_NOT_LOADED":return this.logError("Driver.js Not Loaded",h),{action:"ABORT_TOUR",message:"Driver.js library not loaded, cannot start tour"};case"INVALID_TOOLTIP":return this.logError("Invalid Tooltip Configuration",h,{currentStep:b}),{action:"SKIP_STEP",nextStep:b+1,message:"Invalid tooltip configuration, skipping"};case"THEME_DETECTION_FAILED":return this.logError("Theme Detection Failed",h),{action:"USE_DEFAULT_THEME",message:"Using default dark theme"};default:return this.logError("Unknown Error",h,{currentStep:b}),{action:"ABORT_TOUR",message:"Unexpected error occurred, aborting tour"}}}classifyError(h){const b=h.message||h.toString();return b.includes("element")&&b.includes("not found")?"ELEMENT_NOT_FOUND":b.includes("storage")||b.includes("quota")?"STORAGE_UNAVAILABLE":b.includes("driver")||b.includes("undefined")?"DRIVER_NOT_LOADED":b.includes("invalid")||b.includes("validation")?"INVALID_TOOLTIP":b.includes("theme")?"THEME_DETECTION_FAILED":"UNKNOWN"}getErrors(){return[...this.errors]}clearErrors(){this.errors=[]}getStatistics(){const h={total:this.errors.length,byContext:{},byType:{},recent:this.errors.slice(-10)};return this.errors.forEach(b=>{h.byContext[b.context]=(h.byContext[b.context]||0)+1;const g=this.classifyError({message:b.message});h.byType[g]=(h.byType[g]||0)+1}),h}handleDriverLoadFailure(){this.logError("Driver.js Load Failure","Driver.js library failed to load");const h=document.createElement("div");return h.id="onboarding-fallback",h.style.cssText=`
position: fixed;
bottom: 20px;
right: 20px;
background: var(--card-base, #2a2a2a);
color: var(--fg, #ffffff);
padding: 15px 20px;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
z-index: 9999;
max-width: 300px;
font-size: 14px;
`,h.innerHTML=`
<strong>Welcome to DashCaddy!</strong><br>
<p style="margin: 10px 0 0 0; font-size: 12px;">
The interactive tour is unavailable, but you can explore the dashboard freely.
Check the documentation for help getting started.
</p>
`,document.body.appendChild(h),setTimeout(()=>{h.parentNode&&h.parentNode.removeChild(h)},1e4),!0}handleStorageUnavailable(){this.logError("Storage Unavailable","Local storage is not available");const h={data:{},getItem(b){return this.data[b]||null},setItem(b,g){this.data[b]=g},removeItem(b){delete this.data[b]},clear(){this.data={}}};return console.warn("[ErrorHandler] Using in-memory storage - progress will not persist"),h}sendToErrorTracking(h){}}l.ErrorHandler=a,console.log("[ErrorHandler] Module loaded")})(window),(function(){try{var a=typeof localStorage<"u"&&localStorage.getItem("dashcaddy-health-settings")||null;if(a){var p=JSON.parse(a);p.statsPollingInterval&&p.statsPollingInterval>=5&&p.statsPollingInterval<=3600&&(window.__DC_STATS_OVERRIDE=p.statsPollingInterval*1e3)}}catch{}})();const DC={NAME:"DashCaddy",POLL:{DASHBOARD:1e4,LOGS:3e3,STATS:typeof window<"u"&&window.__DC_STATS_OVERRIDE||5e3,WEATHER:6e5,CALENDAR:3e5,HEALTH:1e3,DEPLOY_SSL:5e3},DELAYS:{BTN_RESET:2e3,RELOAD:5e3,MODAL_CLOSE:500,PORT_CHECK:500,DEPLOY_INIT:3e3},DEFAULTS:{DNS_PORT:"5380",SERVICE_PORT:"8080",TTL:300,CADDYFILE:"C:\\caddy\\Caddyfile"}},errorHandler=new ErrorHandler,_cachedCfg=JSON.parse(localStorage.getItem("dashcaddy_site_config")||"null"),SITE={tld:_cachedCfg&&_cachedCfg.tld||".home",dnsIp:"",dnsPort:DC.DEFAULTS.DNS_PORT,dnsServers:{},configurationType:_cachedCfg&&_cachedCfg.configurationType||"homelab",domain:_cachedCfg&&_cachedCfg.domain||"",defaults:_cachedCfg&&_cachedCfg.defaults||{},routingMode:_cachedCfg&&_cachedCfg.routingMode||"subdomain",onboardingCompleted:!1};window.__dashcaddySiteConfigLoaded=(async function(){try{const h=await fetch("/api/v1/config");if(h.ok){const b=await h.json();if(b.tld&&(SITE.tld=b.tld.startsWith(".")?b.tld:"."+b.tld),b.dns&&(SITE.dnsIp=b.dns.ip||"",SITE.dnsPort=b.dns.port||DC.DEFAULTS.DNS_PORT),b.dnsServers&&typeof b.dnsServers=="object")for(const[v,f]of Object.entries(b.dnsServers))v!=="__proto__"&&v!=="constructor"&&v!=="prototype"&&(SITE.dnsServers[v]=f);b.configurationType&&(SITE.configurationType=b.configurationType),b.domain&&(SITE.domain=b.domain),b.defaults&&(SITE.defaults=b.defaults),b.routingMode&&(SITE.routingMode=b.routingMode),SITE.onboardingCompleted=b.onboardingCompleted===!0,localStorage.setItem("dashcaddy_site_config",JSON.stringify({tld:SITE.tld,configurationType:SITE.configurationType,domain:SITE.domain,routingMode:SITE.routingMode})),renderDnsCards();const g=document.getElementById("manage-tokens");g&&(g.style.display=Object.keys(SITE.dnsServers).length?"":"none")}}catch{}document.querySelectorAll("[data-tld]").forEach(h=>h.textContent=SITE.tld);const a=document.getElementById("edit-tld-suffix");a&&(a.textContent=SITE.tld);const p=document.getElementById("external-proxy-ip");p&&SITE.dnsIp&&(p.value=SITE.dnsIp,p.placeholder=SITE.dnsIp)})();function buildDomain(l){return l+SITE.tld}function buildServiceUrl(l){return SITE.routingMode==="subdirectory"&&SITE.domain?"https://"+SITE.domain+"/"+l:SITE.configurationType==="public"&&SITE.domain?"https://"+l+"."+SITE.domain:"https://"+buildDomain(l)}function getDnsServerAddr(l){const a=SITE.dnsServers[l];return a?`${a.ip}:${a.port}`:buildDomain(l)}function getPrimaryDnsId(){if(!SITE.dnsIp)return null;for(const[l,a]of Object.entries(SITE.dnsServers))if(a.ip===SITE.dnsIp)return l;return null}function renderDnsCards(){const l=document.querySelector(".top");if(!l)return;const a=Object.keys(SITE.dnsServers);if(!a.length)return;const p='<svg viewBox="0 0 24 24" class="service-icon"><rect x="3" y="4" width="18" height="16" rx="2" fill="#34495e"/><rect x="5" y="6" width="14" height="2" rx="1" fill="#3498db"/><rect x="5" y="9" width="10" height="1" fill="#ecf0f1"/><rect x="5" y="11" width="12" height="1" fill="#ecf0f1"/><rect x="5" y="13" width="8" height="1" fill="#ecf0f1"/><rect x="5" y="15" width="14" height="1" fill="#ecf0f1"/><circle cx="17" cy="11" r="2" fill="#e74c3c"/><path d="M17 9v4M15 11h4" stroke="white" stroke-width="1"/></svg>',h=l.firstElementChild;a.forEach(b=>{const g=escapeHtml(b),v=escapeHtml((SITE.dnsServers[b].name||b).toUpperCase()),f=document.createElement("div");f.className="card",f.setAttribute("data-app",b),f.setAttribute("data-status","off"),f.innerHTML=`<span id="${g}-dot" class="dot bad at-bl"></span><div class="row"><div class="logo-wrap">${p}</div><span class="name">${v}</span><span class="spacer"></span><span id="${g}-pill" class="badge off" data-i18n-live-status="binary">OFF</span></div><div class="response-row"><span id="${g}-time" class="response-time">--</span></div><div class="health-row" id="health-${g}"><span id="uptime-${g}" class="uptime-chip">--</span><div class="uptime-mini-bar"><div class="fill" id="uptime-bar-${g}" style="width: 0%"></div></div></div><div class="btn-row"><button id="${g}-restart" class="restart-btn" data-i18n="action.restart">Restart</button><button id="${g}-update" class="update-btn" title="Update DNS server">\u2B06\uFE0F</button><button id="${g}-open" data-i18n="action.open">Open</button><button id="${g}-logs" class="logs-btn" data-i18n="action.logs">Logs</button><button id="${g}-settings" class="settings-btn">\u2699\uFE0F</button></div>`,l.insertBefore(f,h)}),window.DCI18n&&window.DCI18n.isLoaded()&&window.DCI18n.applyTranslations()}window.renderDnsCards=renderDnsCards;let csrfToken=null;async function getCSRFToken(){if(csrfToken)return csrfToken;try{const l=await fetch("/api/v1/csrf-token");if(!l.ok)throw new Error("Failed to fetch CSRF token");return csrfToken=(await l.json()).token,csrfToken}catch(l){throw errorHandler.logError("[CSRF] Get Token",l,{function:"getCSRFToken"}),l}}async function secureFetch(l,a={}){const p=(a.method||"GET").toUpperCase(),h=!["GET","HEAD","OPTIONS"].includes(p);if(h)try{const g=await getCSRFToken();a.headers={...a.headers,"X-CSRF-Token":g}}catch(g){errorHandler.logError("[CSRF] Add to Request",g,{function:"secureFetch"})}a.signal||(a={...a,signal:AbortSignal.timeout(15e3)}),a.credentials=a.credentials||"same-origin";const b=await fetch(l,a);if(h&&b.status===403)try{const g=await b.clone().json();if(g.error&&(g.error.includes("DC-100")||g.error.includes("DC-101"))){csrfToken=null;const v=await getCSRFToken();return a.headers={...a.headers,"X-CSRF-Token":v},a.signal=AbortSignal.timeout(15e3),fetch(l,a)}}catch{}return b}async function postJSON(l,a){const p=await secureFetch(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}),h=await p.json();if(!p.ok||h.success===!1)throw new Error(h.error||`Request failed (${p.status})`);return h}async function getJSON(l){const a=await secureFetch(l);if(!a.ok){let p=`Request failed (${a.status})`;try{p=(await a.json()).error||p}catch{}throw new Error(p)}return a.json()}async function deleteAPI(l){const a=await secureFetch(l,{method:"DELETE"}),p=await a.json();if(!a.ok||p.success===!1)throw new Error(p.error||`Delete failed (${a.status})`);return p}async function withButton(l,a,p,h={}){const b=l.innerHTML,{successText:g="\u2705",resetDelay:v=DC.DELAYS.BTN_RESET}=h;l.disabled=!0,l.innerHTML=a;try{const f=await p();return l.innerHTML=g,setTimeout(()=>{l.innerHTML=b,l.disabled=!1},v),f}catch(f){throw l.innerHTML=b,l.disabled=!1,f}}function openModal(l){document.getElementById(l)?.classList.add("show")}function closeModal(l){document.getElementById(l)?.classList.remove("show")}function wireModal(l,...a){l&&(l.addEventListener("click",p=>{p.target===l&&l.classList.remove("show")}),a.forEach(p=>{p&&typeof p.addEventListener=="function"&&p.addEventListener("click",()=>l.classList.remove("show"))}))}function showNotification(l,a="info",p=3e3){const h=document.querySelector(".deploy-notification");h&&h.remove();const b={info:{bg:"#2196F3",fg:"#fff"},success:{bg:"var(--ok-bg)",fg:"var(--ok-fg)"},error:{bg:"#f44336",fg:"#fff"},warning:{bg:"#ff9800",fg:"#fff"}},g=b[a]||b.info,v=document.createElement("div");v.className="deploy-notification",v.textContent=l,v.style.cssText=`
position: fixed; top: 20px; right: 20px;
background: ${g.bg}; color: ${g.fg};
padding: 16px 24px; border-radius: 8px;
box-shadow: 0 4px 12px rgba(0,0,0,.3);
z-index: 10000; animation: slideIn 0.3s ease-out;
max-width: 400px; white-space: pre-line; font-size: 14px;
`,document.body.appendChild(v),p>0&&setTimeout(()=>v.remove(),p)}function timeAgo(l){const a=Date.now()-new Date(l).getTime();return a<6e4?"just now":a<36e5?Math.floor(a/6e4)+"m ago":a<864e5?Math.floor(a/36e5)+"h ago":Math.floor(a/864e5)+"d ago"}function safeGet(l,a=null){try{const p=localStorage.getItem(l);return p!==null?p:a}catch{return a}}function safeSet(l,a){try{localStorage.setItem(l,a)}catch{}}function safeRemove(l){try{localStorage.removeItem(l)}catch{}}function safeSessionGet(l,a=null){try{const p=sessionStorage.getItem(l);return p!==null?p:a}catch{return a}}function safeSessionSet(l,a){try{sessionStorage.setItem(l,a)}catch{}}function safeGetJSON(l,a=null){try{const p=localStorage.getItem(l);return p?JSON.parse(p):a}catch{return a}}function escapeHtml(l){return String(l??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function injectModal(l,a){document.getElementById(l)||document.body.insertAdjacentHTML("beforeend",a)}const DC_BUS={_handlers:{},on(l,a){var p;((p=this._handlers)[l]||(p[l]=[])).push(a)},off(l,a){this._handlers[l]=this._handlers[l]?.filter(p=>p!==a)},emit(l,a){this._handlers[l]?.forEach(p=>p(a))}},AppState={_apps:[],getApps(){return this._apps},setApps(l){this._apps=l,window.APPS=l,DC_BUS.emit("apps:changed",l)},findApp(l){return this._apps.find(a=>a.id===l)},addApp(l){this._apps.push(l),window.APPS=this._apps,DC_BUS.emit("apps:changed",this._apps)},removeApp(l){const a=this._apps.findIndex(p=>p.id===l);return a>-1&&(this._apps.splice(a,1),window.APPS=this._apps,DC_BUS.emit("apps:changed",this._apps)),a>-1},updateApp(l,a){const p=this._apps.find(h=>h.id===l);if(p){for(const[h,b]of Object.entries(a))h!=="__proto__"&&h!=="constructor"&&h!=="prototype"&&(p[h]=b);DC_BUS.emit("apps:changed",this._apps)}return p}};(function(){function l(){const h=document.createElement("div");return h.className="skeleton-card",h.innerHTML='<div style="display:flex;align-items:center;gap:12px;margin-bottom:12px"><div class="skeleton-bar" style="width:48px;height:48px;border-radius:8px;flex-shrink:0"></div><div style="flex:1"><div class="skeleton-bar" style="width:60%;height:14px;margin-bottom:6px"></div><div class="skeleton-bar" style="width:35%;height:10px"></div></div><div class="skeleton-bar" style="width:42px;height:22px;border-radius:11px"></div></div><div class="skeleton-bar" style="width:45%;height:12px;margin-bottom:10px"></div><div style="display:flex;gap:8px;margin-top:auto"><div class="skeleton-bar" style="width:64px;height:28px;border-radius:8px"></div><div class="skeleton-bar" style="width:64px;height:28px;border-radius:8px"></div></div>',h}function a(h){const b=document.getElementById("cards");if(!(!b||b.querySelector(".card"))){h=h||6;for(let g=0;g<h;g++){const v=l();b.appendChild(v),setTimeout(function(){v.classList.add("loaded")},g*60)}}}function p(){const h=document.getElementById("cards");if(h){var b=h.querySelectorAll(".skeleton-card");b.length&&(b.forEach(function(g,v){setTimeout(function(){g.style.opacity="0",g.style.transform="translateY(-10px)"},v*25)}),setTimeout(function(){b.forEach(function(g){g.parentNode&&g.remove()})},b.length*25+300))}}window.SkeletonLoader={show:a,hide:p}})(),(function(){var l="theme",a="user-themes",p="custom-theme",h=["dark","light","blue","black","nord","dracula","solarized-dark","solarized-light","taxi","ocean"],b=h.slice(),g=["bg","fg","muted","fg-muted","card-base","card-bg","border","hover","card-hover","base","ok-bg","ok-fg","bad-bg","bad-fg","dot-ok","dot-bad","uptime","success","error","warning","accent","accent-strong"],v=["bg","fg","muted","card-base","card-bg","border","ok-bg","ok-fg","bad-bg","bad-fg","dot-ok","dot-bad","uptime","accent","accent-strong"],f=["fg-muted","hover","card-hover","base","success","error","warning"],d={dark:{bg:"#0b0f1a",fg:"#e8ecf5",muted:"#9aa6bf","fg-muted":"#6b7a94","card-base":"#121826","card-bg":"#121826",border:"#263552",hover:"#1a2235","card-hover":"#161e2e",base:"#151c2b","ok-bg":"#0c2430","ok-fg":"#7ef2ff","bad-bg":"#2a121a","bad-fg":"#ff9aa3","dot-ok":"#35d1ff","dot-bad":"#ff5f7a",uptime:"#35d1ff",success:"#4caf50",error:"#e74c3c",warning:"#f39c12",accent:"#8FD6FF","accent-strong":"#1F7BFF"},light:{bg:"#f6f7fb",fg:"#0f1115",muted:"#5f6b7a","fg-muted":"#8993a4","card-base":"#ffffff","card-bg":"#ffffff",border:"#e2e7ef",hover:"#eef1f6","card-hover":"#f5f6fa",base:"#ebeef3","ok-bg":"#eafff1","ok-fg":"#0a7c3a","bad-bg":"#ffefef","bad-fg":"#b00020","dot-ok":"#0fb15a","dot-bad":"#d93b3b",uptime:"#0fb15a",success:"#0a7c3a",error:"#b00020",warning:"#d68a00",accent:"#4a90d9","accent-strong":"#2563eb",lightBg:!0},blue:{bg:"#1908AC",fg:"#e8f1ff",muted:"#d6e2ff","fg-muted":"#9eafdb","card-base":"#0d1533","card-bg":"#0d1533",border:"#1c2d6a",hover:"#141f4a","card-hover":"#111a3e",base:"#0f1840","ok-bg":"#162040","ok-fg":"#edffff","bad-bg":"#0a0e24","bad-fg":"#ffb3c0","dot-ok":"#c7e5ff","dot-bad":"#ffd6dc",uptime:"#7ec8ff",success:"#7ec8ff",error:"#ffb3c0",warning:"#ffd080",accent:"#9cd4ff","accent-strong":"#6fb2ff"},black:{bg:"#0e0e0e",fg:"#f5f5f5",muted:"#999999","fg-muted":"#666666","card-base":"#1a1a1a","card-bg":"#1a1a1a",border:"#2e2e2e",hover:"#242424","card-hover":"#202020",base:"#161616","ok-bg":"#0f2a12","ok-fg":"#66ff7a","bad-bg":"#2a0f0f","bad-fg":"#ff6b6b","dot-ok":"#4caf50","dot-bad":"#ff4444",uptime:"#e0e0e0",success:"#4caf50",error:"#ff4444",warning:"#ff9800",accent:"#E63946","accent-strong":"#C62828"},nord:{bg:"#2e3440",fg:"#eceff4",muted:"#81a1c1","fg-muted":"#6882a0","card-base":"#3b4252","card-bg":"#3b4252",border:"#4c566a",hover:"#434c5e","card-hover":"#3f4858",base:"#353c4a","ok-bg":"#2d4f3e","ok-fg":"#a3be8c","bad-bg":"#4a2c2a","bad-fg":"#bf616a","dot-ok":"#a3be8c","dot-bad":"#bf616a",uptime:"#a3be8c",success:"#a3be8c",error:"#bf616a",warning:"#ebcb8b",accent:"#88c0d0","accent-strong":"#5e81ac"},dracula:{bg:"#282a36",fg:"#f8f8f2",muted:"#6272a4","fg-muted":"#515d85","card-base":"#44475a","card-bg":"#44475a",border:"#6272a4",hover:"#4e5170","card-hover":"#494c63",base:"#363848","ok-bg":"#1e3a2e","ok-fg":"#50fa7b","bad-bg":"#3d1a1a","bad-fg":"#ff5555","dot-ok":"#50fa7b","dot-bad":"#ff5555",uptime:"#50fa7b",success:"#50fa7b",error:"#ff5555",warning:"#f1fa8c",accent:"#bd93f9","accent-strong":"#8be9fd"},"solarized-dark":{bg:"#002b36",fg:"#839496",muted:"#586e75","fg-muted":"#4a5f65","card-base":"#073642","card-bg":"#073642",border:"#586e75",hover:"#0d4050","card-hover":"#0a3a48",base:"#053340","ok-bg":"#0d3d2c","ok-fg":"#859900","bad-bg":"#3d1a1a","bad-fg":"#dc322f","dot-ok":"#859900","dot-bad":"#dc322f",uptime:"#b5bd68",success:"#859900",error:"#dc322f",warning:"#b58900",accent:"#268bd2","accent-strong":"#2aa198"},"solarized-light":{bg:"#fdf6e3",fg:"#657b83",muted:"#93a1a1","fg-muted":"#adb8b8","card-base":"#eee8d5","card-bg":"#eee8d5",border:"#93a1a1",hover:"#e6dfcb","card-hover":"#eae3cf",base:"#e8e1cd","ok-bg":"#e8f5e8","ok-fg":"#859900","bad-bg":"#fdf2f2","bad-fg":"#dc322f","dot-ok":"#859900","dot-bad":"#dc322f",uptime:"#859900",success:"#859900",error:"#dc322f",warning:"#b58900",accent:"#268bd2","accent-strong":"#2aa198",lightBg:!0},taxi:{bg:"#f3d321",fg:"#0e0e00",muted:"#4a4a10","fg-muted":"#6b6b30","card-base":"#ffd700","card-bg":"#ffd700",border:"#b8a840",hover:"#ffe84d","card-hover":"#ffe033",base:"#f0d000","ok-bg":"#d4ffd9","ok-fg":"#0f2a0f","bad-bg":"#ffd4d4","bad-fg":"#2a0f0f","dot-ok":"#4caf50","dot-bad":"#ff4444",uptime:"#0e0e00",success:"#2e7d32",error:"#c62828",warning:"#e65100",accent:"#7a4a00","accent-strong":"#5c3800",lightBg:!0},ocean:{bg:"#2060b0",fg:"#faf5eb",muted:"#dcd2c0","fg-muted":"#b0a890","card-base":"#7a94ed","card-bg":"#7a94ed",border:"#deb67a",hover:"#8aa0f0","card-hover":"#8298e8",base:"#6888e0","ok-bg":"#4f5bb0","ok-fg":"#c7d7eb","bad-bg":"#f41a3a","bad-fg":"#6a1818","dot-ok":"#30a050","dot-bad":"#d04040",uptime:"#2d32f2",success:"#30a050",error:"#d04040",warning:"#e6a030",accent:"#1860a0","accent-strong":"#104080"}};function i(x){return!x||typeof x!="string"?{r:0,g:0,b:0}:(x=x.replace("#",""),x.length===3&&(x=x[0]+x[0]+x[1]+x[1]+x[2]+x[2]),{r:parseInt(x.substr(0,2),16)||0,g:parseInt(x.substr(2,2),16)||0,b:parseInt(x.substr(4,2),16)||0})}function m(x,B,A){return"#"+[x,B,A].map(function(E){var C=Math.max(0,Math.min(255,Math.round(E))).toString(16);return C.length===1?"0"+C:C}).join("")}function w(x,B,A){var E=i(x),C=i(B);return m(E.r+(C.r-E.r)*A,E.g+(C.g-E.g)*A,E.b+(C.b-E.b)*A)}function s(x){x=x.replace("#",""),x.length===3&&(x=x[0]+x[0]+x[1]+x[1]+x[2]+x[2]);var B=parseInt(x.substr(0,2),16)/255,A=parseInt(x.substr(2,2),16)/255,E=parseInt(x.substr(4,2),16)/255;return B=B<=.03928?B/12.92:Math.pow((B+.055)/1.055,2.4),A=A<=.03928?A/12.92:Math.pow((A+.055)/1.055,2.4),E=E<=.03928?E/12.92:Math.pow((E+.055)/1.055,2.4),.2126*B+.7152*A+.0722*E}function t(x){var B=x.bg||"#0b0f1a",A=x.fg||"#e8ecf5",E=x.muted||"#9aa6bf",C=x["card-base"]||x.bg||"#121826",T=x["dot-ok"]||"#4caf50",$=x["dot-bad"]||"#e74c3c",I=x.lightBg||B&&s(B)>.4,P={};return P.hover=I?w(C,B,.35):w(C,A,.08),P["card-hover"]=w(C,P.hover,.5),P.base=w(B,C,.6),P["fg-muted"]=w(E,B,.35),P.success=T,P.error=$,P.warning=I?"#d68a00":"#f39c12",P}function e(x,B){var A=B.lightBg||B.bg&&s(B.bg)>.4,E=B.accent||B["accent-strong"]||"#888888",C=i(E);return A?":root."+x+` body {
background:
radial-gradient(1200px 800px at 10% -10%, rgba(`+C.r+","+C.g+","+C.b+`, .08), transparent 60%),
radial-gradient(1000px 700px at 110% 10%, rgba(`+C.r+","+C.g+","+C.b+`, .05), transparent 55%),
var(--bg);
}
`:":root."+x+` body {
background:
radial-gradient(1200px 900px at 8% -12%, rgba(`+C.r+","+C.g+","+C.b+`, .10), transparent 60%),
radial-gradient(1000px 700px at 110% -10%, rgba(`+C.r+","+C.g+","+C.b+`, .07), transparent 55%),
var(--bg);
}
`}function n(x,B){var A=B.lightBg||B.bg&&s(B.bg)>.4;return A?":root."+x+` button:hover {
background: color-mix(in srgb, var(--accent-strong) 12%, white 88%);
border-color: rgba(0, 0, 0, .15);
box-shadow: 0 1px 6px rgba(0, 0, 0, .08), inset 0 1px 0 rgba(255, 255, 255, .8);
}
`:":root."+x+` button:hover {
background: color-mix(in srgb, var(--accent) 18%, transparent);
border-color: color-mix(in srgb, var(--accent) 35%, var(--border));
}
`}function u(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function o(){g.forEach(function(x){document.documentElement.style.removeProperty("--"+x)})}function r(x,B){var A=x.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");A||(A="custom"),h.indexOf(A)!==-1&&(A=A+"-custom");for(var E=safeGetJSON(a,{}),C=A,T=2;E[A]&&A!==B;)A=C+"-"+T++;return A}function c(x){var B=document.getElementById("user-theme-styles");B&&B.remove(),b.length=h.length,Object.keys(d).forEach(function($){h.indexOf($)===-1&&delete d[$]});var A=x||safeGetJSON(a,{}),E=Object.keys(A);if(E=E.filter(function($){return h.indexOf($)===-1}),!!E.length){var C="";E.forEach(function($){var I=A[$];b.indexOf($)===-1&&b.push($);var P={};g.forEach(function(O){I[O]&&(P[O]=I[O])}),P["card-bg"]=I["card-base"]||I.bg,I.lightBg&&(P.lightBg=!0);var D=t(P);f.forEach(function(O){!P[O]&&D[O]&&(P[O]=D[O])}),d[$]=P,C+=":root."+$+` {
`,g.forEach(function(O){P[O]&&(C+=" --"+O+": "+P[O]+`;
`)}),C+=`}
`,C+=e($,P),C+=n($,P)});var T=document.createElement("style");T.id="user-theme-styles",T.textContent=C,document.head.appendChild(T)}}function y(){secureFetch("/api/v1/themes").then(function(x){return x.json()}).then(function(x){if(!(!x.success||!x.themes)){var B=x.themes,A=safeGetJSON(a,{});if(JSON.stringify(B)!==JSON.stringify(A)){safeSet(a,JSON.stringify(B)),c(B);var E=safeGet(l);E&&b.indexOf(E)!==-1&&k(E)}}}).catch(function(){})}function S(){var x=safeGetJSON(p);if(x){var B=x.name||"Custom",A=r(B),E={name:B};g.forEach(function($){x[$]&&(E[$]=x[$])});var C=safeGetJSON(a,{});C[A]=E,safeSet(a,JSON.stringify(C)),safeGet(l)==="custom"&&safeSet(l,A),safeRemove(p);var T={};g.forEach(function($){E[$]&&(T[$]=E[$])}),fetch("/api/v1/themes/"+A,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:B,colors:T})}).catch(function(){})}}function k(x){document.documentElement.classList.add("theme-transitioning"),b.forEach(function(C){C!=="dark"&&document.documentElement.classList.remove(C)}),o(),x!=="dark"&&document.documentElement.classList.add(x),safeSet(l,x);var B=d[x],A=document.querySelector('meta[name="theme-color"]');A&&B&&A.setAttribute("content",B.bg);var E=B&&B.lightBg;!E&&B&&B.bg&&(E=s(B.bg)>.4),E?document.documentElement.classList.add("light-bg"):document.documentElement.classList.remove("light-bg"),setTimeout(function(){document.documentElement.classList.remove("theme-transitioning")},300)}S(),c();var L=safeGet(l);L==="red"&&(L="black",safeSet(l,"black")),L&&L!=="dark"&&b.indexOf(L)===-1&&(L=null),k(L||u()),y(),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",function(x){safeGet(l)||k(x.matches?"dark":"light")}),window.THEMES=b,window.BUILTIN_THEMES=h,window.THEME_COLORS=d,window.THEME_PROPS=g,window.BASE_PROPS=v,window.DERIVED_PROPS=f,window.USER_THEMES_KEY=a,window.applyTheme=k,window.clearCustomProperties=o,window.injectUserThemeStyles=c,window.syncThemesFromServer=y,window.slugifyThemeName=r,window.getActiveTheme=function(){return safeGet(l)||u()},window.deriveExtendedColors=t,window.hexToRgb=i,window.rgbToHex=m,window.blendColors=w})(),(function(){let l=null;async function a(){if(l)return l;try{const w=await fetch("/api/v1/auth/login/methods",{cache:"no-store"});if(!w.ok)throw new Error(`methods HTTP ${w.status}`);const s=await w.json();return l=Array.isArray(s.providers)?s.providers:[],l}catch(w){return console.warn("[auth-gate] methods fetch failed; falling back to TOTP-only",w),[]}}function p(w){const s=document.getElementById("totp-overlay");if(!s)return;const t=s.querySelector(".totp-card");if(!t)return;const e=t.innerHTML;t.dataset.originalBody||(t.dataset.originalBody=e);const n=w.map(u=>{const o=u.config&&(u.config.label||u.name)||u.name;return`<button class="provider-btn" data-provider="${u.name}"
style="margin: 6px 4px; padding: 10px 16px; background: var(--accent); color: white; border: 0; border-radius: 6px; cursor: pointer; font-size: 0.95rem;">
Sign in with ${o}
</button>`}).join(`
`);t.innerHTML=`
<img class="totp-logo totp-logo-dark" src="/assets/dashcaddy-logo-dark.png" alt="DashCaddy">
<img class="totp-logo totp-logo-light" src="/assets/dashcaddy-logo-light.png" alt="DashCaddy">
<p class="subtitle">Choose how to sign in</p>
<div id="auth-gate-providers" style="margin: 14px 0 10px;">${n}</div>
<div id="auth-gate-message" style="margin-top: 8px; color: var(--muted); font-size: 0.8rem;"></div>
`,s.classList.add("show"),t.querySelectorAll(".provider-btn").forEach(u=>{u.addEventListener("click",()=>{const o=u.dataset.provider,r=w.find(c=>c.name===o);b(r)})})}function h(){const w=document.getElementById("totp-overlay");if(!w)return;const s=w.querySelector(".totp-card");!s||!s.dataset.originalBody||(s.innerHTML=s.dataset.originalBody,window.location.reload())}function b(w){const s=document.getElementById("totp-overlay");if(!s)return;const t=s.querySelector(".totp-card");if(t){if(w.name==="totp"){window.location.reload();return}if(w.name==="email"){t.innerHTML=`
<img class="totp-logo totp-logo-dark" src="/assets/dashcaddy-logo-dark.png" alt="DashCaddy">
<img class="totp-logo totp-logo-light" src="/assets/dashcaddy-logo-light.png" alt="DashCaddy">
<p class="subtitle">Sign in with email</p>
<p style="margin: 6px 0 14px; font-size: 0.85rem; color: var(--muted);">
We'll email you a one-time sign-in link.
</p>
<input id="auth-gate-email-input" type="email" inputmode="email" autocomplete="email"
placeholder="you@example.com"
style="width: 100%; padding: 10px 12px; font-size: 1rem; background: var(--input-bg); color: var(--text); border: 1px solid var(--border); border-radius: 6px; box-sizing: border-box;">
<button id="auth-gate-email-submit" class="provider-btn"
style="margin-top: 14px; padding: 10px 16px; background: var(--accent); color: white; border: 0; border-radius: 6px; cursor: pointer; font-size: 0.95rem; width: 100%;">
Send sign-in link
</button>
<div id="auth-gate-email-status" style="margin-top: 12px; font-size: 0.85rem; line-height: 1.4;"></div>
<div style="margin-top: 16px;">
<a href="#" id="auth-gate-back" style="color: var(--muted); font-size: 0.8rem;">\u2190 Back</a>
</div>
`,s.classList.add("show");const e=t.querySelector("#auth-gate-email-input"),n=t.querySelector("#auth-gate-email-submit"),u=t.querySelector("#auth-gate-email-status"),o=t.querySelector("#auth-gate-back");n.addEventListener("click",async()=>{const r=(e.value||"").trim();if(!r||!r.includes("@")){u.textContent="Enter a valid email address.",u.style.color="var(--error, #d33)";return}n.disabled=!0,u.textContent="Sending\u2026",u.style.color="";try{const y=await(await fetch("/api/v1/auth/login/email/initiate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:r})})).json();if(y.success){const S=y.deliveredVia||"email",k=y.maskedEmail||r;S==="dev-console"?u.innerHTML=`
Check the server logs for your one-time link.
(Dev mode: no SMTP configured. In production this would email <strong>${k}</strong>.)`:u.innerHTML=`Sign-in link sent to <strong>${k}</strong>.
Check your inbox (and spam folder).`,u.style.color="var(--success, #2a7)"}else u.textContent=y.error||"Could not send link.",u.style.color="var(--error, #d33)",n.disabled=!1}catch{u.textContent="Connection error. Try again.",u.style.color="var(--error, #d33)",n.disabled=!1}}),e.addEventListener("keydown",r=>{r.key==="Enter"&&n.click()}),o.addEventListener("click",r=>{r.preventDefault(),p(providers)});return}console.warn("[auth-gate] unknown provider",w.name),window.location.reload()}}async function g(){if(!document.getElementById("totp-overlay"))return;const s=await a();if(s.length===0){typeof window._showTotpOverlay=="function"&&window._showTotpOverlay();return}if(s.length===1&&s[0].name==="totp"){v(s[0]);return}p(s)}function v(w){const s=l&&l.find(u=>u.name==="email");if(!s){typeof window._showTotpOverlay=="function"&&window._showTotpOverlay();return}const t=document.getElementById("totp-overlay"),e=t.querySelector(".totp-card");if(!e)return;if(e.dataset.originalBody||(e.dataset.originalBody=e.innerHTML),!e.querySelector("#auth-gate-email-alt")){const u=document.createElement("div");u.id="auth-gate-email-alt",u.style.cssText="margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--border); font-size: 0.85rem;",u.innerHTML=`<a href="#" id="auth-gate-email-alt-link"
style="color: var(--accent); text-decoration: none;">
Or sign in with email instead \u2192
</a>`,e.appendChild(u),u.querySelector("#auth-gate-email-alt-link").addEventListener("click",o=>{o.preventDefault(),b(s)})}t.classList.add("show")}window.__dc_049_handled=!0;function f(w){try{const s=new URL(w,window.location.origin);if(!["http:","https:"].includes(s.protocol))return!1;if(s.origin===window.location.origin)return!0;if(s.protocol!=="https:")return!1;const t=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`;return s.hostname===t.slice(1)||s.hostname.endsWith(t)}catch{return!1}}function d(w,s){const t=new URL(w,window.location.origin);if(t.origin===window.location.origin)return t.toString();const e=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,n=t.hostname===e.slice(1)||t.hostname.endsWith(e);if(t.protocol!=="https:"||!n||!s)return null;const u=`${t.pathname}${t.search}${t.hash}`;return t.pathname="/dashcaddy-sso",t.search="",t.hash="",t.searchParams.set("token",s),t.searchParams.set("return",u),t.toString()}async function i(w){if(!w||!f(w))return!1;try{const s=new URL(w,window.location.origin),t=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,e=s.hostname.slice(0,-t.length);if(!/^[a-z0-9][a-z0-9-]*$/.test(e))return!1;const n=await fetch(`/api/v1/auth/sso-handoff?serviceId=${encodeURIComponent(e)}`,{credentials:"include",cache:"no-store"});if(!n.ok)return!1;const u=await n.json(),o=u.success&&d(w,u.ssoToken);if(!o)return!1;try{sessionStorage.removeItem("totp_redirect")}catch{}return window.location.replace(o),!0}catch{return!1}}const m=new URLSearchParams(window.location.search);if(m.get("auth")==="required"){const w=m.get("return");if(w&&f(w))try{sessionStorage.setItem("totp_redirect",w)}catch{}window.history.replaceState({},"",window.location.pathname),setTimeout(async()=>{await i(w)||await g()},0)}window._showAuthGate=g,window._authGateMethods=a})(),(function(){const l=new WeakSet;document.addEventListener("error",d=>{const i=d.target;i&&i.tagName==="IMG"&&i.classList.contains("totp-logo")&&(l.add(i),i.style.display="none")},!0),document.querySelectorAll(".totp-logo").forEach(d=>{d.complete&&d.naturalWidth===0&&(l.add(d),d.style.display="none")});function a(){const d=document.querySelector(".totp-card");if(!d)return;const m=getComputedStyle(d).backgroundColor.match(/\d+/g);if(!m)return;const w=(.299*+m[0]+.587*+m[1]+.114*+m[2])/255,s=d.querySelector(".totp-logo-dark"),t=d.querySelector(".totp-logo-light");s&&(s.style.display=w>.5||l.has(s)?"none":""),t&&(t.style.display=w<=.5||l.has(t)?"none":"")}function p(){const d=document.getElementById("totp-overlay");if(d){d.classList.add("show"),setTimeout(a,50);const i=d.querySelector(".totp-digits input");i&&setTimeout(()=>i.focus(),100)}typeof window._refreshRecoveryLink=="function"&&window._refreshRecoveryLink()}function h(){const d=document.getElementById("totp-overlay");d&&d.classList.remove("show")}function b(d,i){const m=new URL(d,window.location.origin);if(m.origin===window.location.origin)return m.toString();const w=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,s=m.hostname===w.slice(1)||m.hostname.endsWith(w);if(m.protocol!=="https:"||!s)return null;if(!i)return m.toString();const t=`${m.pathname}${m.search}${m.hash}`;return m.pathname="/dashcaddy-sso",m.search="",m.hash="",m.searchParams.set("token",i),m.searchParams.set("return",t),m.toString()}const g=document.getElementById("totp-digits");if(g){const d=g.querySelectorAll("input");d.forEach((i,m)=>{i.addEventListener("input",w=>{const s=w.target.value.replace(/\D/g,"");w.target.value=s.slice(0,1),s&&m<d.length-1&&d[m+1].focus();const t=Array.from(d).map(e=>e.value).join("");t.length===6&&v(t)}),i.addEventListener("keydown",w=>{w.key==="Backspace"&&!w.target.value&&m>0&&(d[m-1].focus(),d[m-1].value="")}),i.addEventListener("paste",w=>{w.preventDefault();const s=(w.clipboardData.getData("text")||"").replace(/\D/g,"");s.length>=6&&(d.forEach((t,e)=>{t.value=s[e]||""}),d[5].focus(),v(s.slice(0,6)))})})}async function v(d){const i=document.getElementById("totp-error");i.textContent="Verifying...",i.className="totp-error verifying";const m=safeSessionGet("totp_redirect");let w=null;if(m)try{const s=new URL(m,window.location.origin),t=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,e=s.hostname.slice(0,-t.length);s.hostname.endsWith(t)&&/^[a-z0-9][a-z0-9-]*$/.test(e)&&(w=e)}catch{}try{const t=await(await secureFetch("/api/v1/totp/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:d,serviceId:w})})).json();if(t.success){if(i.textContent="",t.csrfToken&&(csrfToken=t.csrfToken),h(),m){try{sessionStorage.removeItem("totp_redirect")}catch{}const e=b(m,t.ssoToken);if(!e)return;window.location.href=e;return}typeof window.initializeDashboard=="function"&&window.initializeDashboard(),window._dcAuthLost=!1,typeof window._sseResume=="function"?window._sseResume():typeof window._sseReconnect=="function"&&window._sseReconnect(),typeof window.refreshAll=="function"&&window.refreshAll()}else{i.textContent=t.error||"Invalid code",i.className="totp-error";const e=document.querySelectorAll("#totp-digits input");e.forEach(n=>{n.value=""}),e[0]?.focus()}}catch{i.textContent="Connection error",i.className="totp-error"}}if(!!!window.__dc_049_handled&&urlParams.get("auth")==="required"){const d=urlParams.get("return");if(d)try{const i=new URL(d,window.location.origin),m=i.hostname,w=i.origin===window.location.origin,s=SITE.tld.startsWith(".")?SITE.tld:"."+SITE.tld,t=m.endsWith(s)||m===s.substring(1);(w||t)&&safeSessionSet("totp_redirect",d)}catch{}window.history.replaceState({},"",window.location.pathname)}window._showTotpOverlay=p})(),(function(){"use strict";async function l(){try{return await(await fetch("/api/v1/totp/recovery-info",{cache:"no-store"})).json()}catch{return{success:!1,status:"unknown",hint:"Could not contact server"}}}function a(v){const f=document.getElementById("totp-recovery-link");f&&(f.style.display=v?"":"none")}function p(){const v=document.getElementById("totp-recovery-panel");v&&(v.style.display="");const f=document.getElementById("totp-recovery-status"),d=document.getElementById("totp-recovery-import"),i=document.getElementById("totp-recovery-verify");d&&(d.style.display=""),i&&(i.style.display="none"),document.getElementById("totp-recovery-error").textContent="",document.getElementById("totp-recovery-confirm-error").textContent="",document.getElementById("totp-recovery-secret").value="",document.getElementById("totp-recovery-code").value="",l().then(m=>{f.textContent=m.hint||"",m.status==="healthy"?f.style.borderColor="var(--ok-fg, #7ef2ff)":m.status==="unreadable"?(f.style.borderColor="var(--bad-fg, #ff9aa3)",f.style.background="color-mix(in srgb, var(--bad-fg) 6%, transparent)"):m.status==="not_configured"?f.style.borderColor="var(--muted)":f.style.borderColor="var(--border)"}),setTimeout(()=>{document.getElementById("totp-recovery-secret")?.focus()},100)}function h(){const v=document.getElementById("totp-recovery-panel");v&&(v.style.display="none")}async function b(){const v=document.getElementById("totp-recovery-secret").value.trim(),f=document.getElementById("totp-recovery-error");if(f.textContent="",!v){f.textContent="Paste your Base32 key first";return}if(!/^[A-Za-z2-7\s]+=*$/.test(v)){f.textContent="Invalid Base32 format \u2014 should be letters A-Z and digits 2-7 only";return}try{const d=await fetch("/api/v1/totp/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:v})}),i=await d.json();if(!d.ok||!i.success){f.textContent=i.error||i.message||"Restore failed";return}document.getElementById("totp-recovery-import").style.display="none",document.getElementById("totp-recovery-verify").style.display="",setTimeout(()=>document.getElementById("totp-recovery-code")?.focus(),100)}catch{f.textContent="Network error \u2014 try again"}}async function g(){const v=document.getElementById("totp-recovery-code").value.trim(),f=document.getElementById("totp-recovery-confirm-error");if(f.textContent="",!/^\d{6}$/.test(v)){f.textContent="Enter a 6-digit code";return}try{const d=await fetch("/api/v1/totp/verify-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:v})}),i=await d.json();if(!d.ok||!i.success){f.textContent=i.error||i.message||"Invalid code",document.getElementById("totp-recovery-code").value="",document.getElementById("totp-recovery-code")?.focus();return}h();const m=document.getElementById("totp-overlay");m&&m.classList.remove("show"),typeof window.initializeDashboard=="function"&&window.initializeDashboard()}catch{f.textContent="Network error \u2014 try again"}}document.getElementById("totp-show-recovery")?.addEventListener("click",v=>{v.preventDefault(),p()}),document.getElementById("totp-recovery-close")?.addEventListener("click",h),document.getElementById("totp-recovery-submit")?.addEventListener("click",b),document.getElementById("totp-recovery-confirm")?.addEventListener("click",g),document.getElementById("totp-recovery-secret")?.addEventListener("keydown",v=>{v.key==="Enter"&&(v.preventDefault(),b())}),document.getElementById("totp-recovery-code")?.addEventListener("keydown",v=>{v.key==="Enter"&&(v.preventDefault(),g())}),window._refreshRecoveryLink=async function(){const v=await l();return v&&v.success&&v.status&&v.status!=="healthy"?a(!0):a(!1),v}})(),(function(){function l(h,b){if(!h||!b||!/^[a-z0-9][a-z0-9-]*$/.test(b))return!1;try{const g=new URL(h,window.location.origin),v=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,f=`${b}${v}`;return g.protocol==="https:"&&g.hostname===f}catch{return!1}}function a(h,b,g){if(!l(h,g))return null;const v=new URL(h,window.location.origin);if(!b)return null;const f=`${v.pathname}${v.search}${v.hash}`;return v.pathname="/dashcaddy-sso",v.search="",v.hash="",v.searchParams.set("token",b),v.searchParams.set("return",f),v.toString()}async function p(h,b,g={}){if(!l(h,b))return!1;const v=g.fetch||window.fetch.bind(window),f=g.location||window.location;try{const d=await v(`/api/v1/auth/sso-handoff?serviceId=${encodeURIComponent(b)}`,{credentials:"include",cache:"no-store"});if(!d.ok)return!1;const i=await d.json(),m=i.success&&a(h,i.ssoToken,b);return m?(f.replace(m),!0):!1}catch{return!1}}window.DCCredentialVault={isAllowedReturnUrl:l,buildHandoffTarget:a,resume:p}})(),(function(){const l=new ErrorHandler;injectModal("folder-browser-modal",`<div id="folder-browser-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 500px; max-width: 700px; max-height: 80vh;">
<h3>\u{1F4C2} Browse for Media Folders</h3>
<div id="folder-browser-path" style="padding: 10px; background: var(--card-bg); border-radius: 6px; margin-bottom: 12px; font-family: monospace; font-size: 0.9rem; word-break: break-all;">
/
</div>
<div id="folder-browser-list" style="max-height: 400px; overflow-y: auto; border: 1px solid var(--border); border-radius: 6px;">
<div style="padding: 20px; text-align: center; color: var(--muted);">Loading...</div>
</div>
<div id="folder-browser-selected" style="margin-top: 12px; padding: 10px; background: color-mix(in srgb, var(--success) 10%, transparent); border: 1px solid var(--success); border-radius: 6px; display: none;">
<div style="font-size: 0.85rem; color: var(--success); margin-bottom: 6px;">Selected folders:</div>
<div id="folder-browser-selected-list" style="display: flex; flex-wrap: wrap; gap: 6px;"></div>
</div>
<div class="weather-modal-buttons" style="margin-top: 16px; display: flex; gap: 8px; justify-content: space-between;">
<button id="folder-browser-select-current" class="btn-accent">
+ Add Current Folder
</button>
<div class="flex-row-gap">
<button id="folder-browser-cancel">Cancel</button>
<button id="folder-browser-done" style="background: color-mix(in srgb, var(--success) 20%, transparent); border-color: var(--success); color: var(--success);">Done</button>
</div>
</div>
</div>
</div>`),injectModal("service-creds-modal",`<div id="service-creds-modal">
<div class="service-creds-content">
<h3 id="svc-creds-title" style="margin: 0 0 4px; font-size: 1.05rem;">Encrypted Credential Vault</h3>
<p id="svc-creds-desc" style="font-size: 0.75rem; color: var(--muted); margin: 0 0 14px;">Passwords are encrypted at rest and used automatically when you open this service.</p>
<!-- Status indicator -->
<div style="display: flex; align-items: center; gap: 6px; margin-bottom: 12px;">
<span id="svc-creds-dot" class="status-dot"></span>
<span id="svc-creds-status" class="text-muted-sm">No credentials stored</span>
</div>
<!-- Seedhost credentials (shown for external services) -->
<div id="svc-creds-seedhost" style="display: none; margin-bottom: 14px;">
<label class="label-bold">Seedhost Login</label>
<p class="hint-micro">Username shared across all services. Password is per-service.</p>
<input type="text" id="svc-seedhost-user" placeholder="Username (shared)" autocomplete="username"
style="width: 100%; padding: 8px 10px; margin-bottom: 6px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; box-sizing: border-box;" />
<input type="password" id="svc-seedhost-pass" placeholder="Password" autocomplete="current-password"
class="input-creds" />
</div>
<!-- API Key (shown for arr services or services with API key support) -->
<div id="svc-creds-apikey" style="display: none; margin-bottom: 14px;">
<label class="label-bold">API Key</label>
<p class="hint-micro">Bypasses the app's own login screen</p>
<input type="text" id="svc-apikey-input" placeholder="API key"
style="width: 100%; padding: 8px 10px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; font-family: monospace; box-sizing: border-box;" />
</div>
<!-- Quality Profile (shown for radarr/sonarr only) -->
<div id="svc-creds-quality" style="display: none; margin-bottom: 14px;">
<label class="label-bold">Quality Profile</label>
<p class="hint-micro">Used when requesting via Seerr</p>
<div style="display: flex; gap: 8px; align-items: center;">
<select id="svc-quality-select"
style="flex: 1; padding: 8px 10px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; box-sizing: border-box;">
<option value="">-- Enter API key first --</option>
</select>
<button id="svc-quality-fetch" type="button"
style="padding: 8px 12px; font-size: 0.75rem; cursor: pointer; white-space: nowrap;">
Fetch
</button>
</div>
<div id="svc-quality-status" style="font-size: 0.75rem; margin-top: 4px; min-height: 1em;"></div>
</div>
<!-- Per-service Basic Auth (shown for non-external services) -->
<div id="svc-creds-basic" style="display: none; margin-bottom: 14px;">
<label class="label-bold">Service Login</label>
<input type="text" id="svc-basic-user" placeholder="Username" autocomplete="username"
style="width: 100%; padding: 8px 10px; margin-top: 6px; margin-bottom: 6px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; box-sizing: border-box;" />
<input type="password" id="svc-basic-pass" placeholder="Password" autocomplete="current-password"
class="input-creds" />
</div>
<!-- Error message -->
<div id="svc-creds-error" style="display: none; padding: 8px 10px; margin-bottom: 10px; background: color-mix(in srgb, var(--error, #c62828) 12%, transparent); border: 1px solid var(--error, #c62828); border-radius: 6px; font-size: 0.8rem; color: var(--error, #c62828);"></div>
<!-- Buttons -->
<div style="display: flex; gap: 8px; margin-top: 14px;">
<button id="svc-creds-save" class="btn-accent-solid" style="flex: 1; padding: 9px; border: none; border-radius: 6px; cursor: pointer; font-weight: 600; font-size: 0.85rem;">
Save to encrypted vault
</button>
<button id="svc-creds-clear" style="padding: 9px 14px; background: transparent; color: var(--bad-fg, #ff9aa3); border: 1px solid var(--bad-fg, #ff9aa3); border-radius: 6px; cursor: pointer; font-size: 0.85rem; display: none;">
Clear
</button>
<button id="svc-creds-close" style="padding: 9px 16px; background: var(--card-base); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; font-size: 0.85rem;">
Cancel
</button>
</div>
</div>
</div>`);const a=document.getElementById("service-creds-modal");let p=null,h=null,b=!1;const g=["sonarr","radarr","prowlarr","overseerr"],v=["sonarr","radarr"];function f(e){return e.externalUrl||e.url||""}function d(e){const n=document.getElementById("svc-creds-error");n.textContent=e,n.style.display=""}function i(){const e=document.getElementById("svc-creds-error");e.textContent="",e.style.display="none"}async function m(e,n){if(!e)throw new Error(`${n} failed: no response`);let u;try{u=await e.json()}catch{throw new Error(`${n} failed: invalid server response`)}if(!e.ok||u?.success!==!0)throw new Error(u?.error||`${n} failed (${e.status||"unknown status"})`);return u}function w(e,n){return!!window.DCCredentialVault?.isAllowedReturnUrl(e,n)}window.openServiceCredsModal=async function(e,n={}){p=e,h=w(n.returnUrl,e.id)?n.returnUrl:null,b=!1,i();const u=document.getElementById("svc-creds-title"),o=document.getElementById("svc-creds-desc"),r=document.getElementById("svc-creds-seedhost"),c=document.getElementById("svc-creds-apikey"),y=document.getElementById("svc-creds-basic"),S=document.getElementById("svc-creds-quality");u.textContent=e.name+" \u2014 Encrypted Vault",document.getElementById("svc-creds-save").textContent=h?"Save to vault & open service":"Save to encrypted vault";const k=!!e.isExternal,L=g.includes(e.id)||g.includes(e.appTemplate),x=v.includes(e.id)||v.includes(e.appTemplate);r.style.display=k?"":"none",c.style.display=L?"":"none",S.style.display=x?"":"none",y.style.display=k?"none":"";const B=document.getElementById("svc-quality-select");B.innerHTML='<option value="">-- Enter API key first --</option>',document.getElementById("svc-quality-status").textContent="",k?(o.textContent="Seedhost credentials auto-login past the HTTP prompt. API key bypasses the app login.",document.getElementById("svc-seedhost-pass").placeholder=`Password for ${e.name}`):L?o.textContent="API key bypasses the app login screen automatically.":o.textContent="Credentials are injected automatically when accessing this service.",await s(e),a.classList.add("show")};async function s(e){const n=document.getElementById("svc-creds-dot"),u=document.getElementById("svc-creds-status"),o=document.getElementById("svc-creds-clear");let r=!1;if(e.isExternal){try{const S=await(await fetch(`/api/v1/seedhost-creds?serviceId=${e.id}`)).json();S.success?(document.getElementById("svc-seedhost-user").value=S.username||"",S.hasCredentials&&(r=!0)):document.getElementById("svc-seedhost-user").value=""}catch{}document.getElementById("svc-seedhost-pass").value=""}try{const S=await(await fetch(`/api/v1/services/${e.id}/credentials`)).json();S.success&&(S.hasApiKey?(document.getElementById("svc-apikey-input").value="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",r=!0):document.getElementById("svc-apikey-input").value="",S.hasBasicAuth&&!e.isExternal?(document.getElementById("svc-basic-user").value=S.username||"",r=!0):document.getElementById("svc-basic-user").value="")}catch{}document.getElementById("svc-basic-pass")&&(document.getElementById("svc-basic-pass").value="");const c=e.id||e.appTemplate;if(v.includes(c)&&await t(e),r){b=!0,n.style.background="var(--ok-fg, #74dfc4)",u.style.color="var(--ok-fg, #74dfc4)",u.textContent="Credentials stored",o.style.display="";const y=document.getElementById(`creds-btn-${e.id}`);y&&y.classList.add("has-creds")}else n.style.background="var(--muted)",u.style.color="var(--muted)",u.textContent="No credentials stored",o.style.display="none"}async function t(e){const n=document.getElementById("svc-quality-select"),u=document.getElementById("svc-quality-status"),o=e.id||e.appTemplate,r=f(e);if(!r){n.innerHTML='<option value="">-- No service URL --</option>';return}n.innerHTML='<option value="">Loading...</option>',u.textContent="";try{const c=new URLSearchParams({service:o,url:r}),S=await(await fetch(`/api/v1/arr/quality-profiles?${c}`)).json();if(!S.success||!S.profiles?.length){n.innerHTML='<option value="">-- No profiles found (enter API key and click Fetch) --</option>';return}n.innerHTML="";for(const k of S.profiles){const L=document.createElement("option");L.value=k.id,L.textContent=k.name,n.appendChild(L)}if(S.storedProfileId&&(n.value=String(S.storedProfileId)),!n.value){const k=S.profiles.find(L=>/720/i.test(L.name));k&&(n.value=String(k.id))}!n.value&&S.profiles.length&&(n.value=String(S.profiles[0].id)),u.innerHTML=`<span style="color: var(--ok-fg);">${S.profiles.length} profiles loaded</span>`}catch(c){n.innerHTML='<option value="">-- Failed to load --</option>',u.innerHTML=`<span style="color: var(--error, #c62828);">Error: ${c.message}</span>`}}document.getElementById("svc-quality-fetch")?.addEventListener("click",async()=>{if(!p)return;const e=p.id||p.appTemplate,n=f(p),o=document.getElementById("svc-apikey-input")?.value.trim(),r=document.getElementById("svc-quality-select"),c=document.getElementById("svc-quality-status");if(!n){c.innerHTML='<span style="color: var(--error, #c62828);">No service URL available</span>';return}if(!o||o==="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"){c.innerHTML='<span style="color: var(--error, #c62828);">Enter an API key first</span>';return}r.innerHTML='<option value="">Fetching...</option>',c.textContent="";try{const y=new URLSearchParams({service:e,url:n,apiKey:o}),k=await(await fetch(`/api/v1/arr/quality-profiles?${y}`)).json();if(!k.success){r.innerHTML='<option value="">-- Error --</option>',c.innerHTML=`<span style="color: var(--error, #c62828);">${k.error||"Failed to fetch profiles"}</span>`;return}if(!k.profiles?.length){r.innerHTML='<option value="">-- No profiles found --</option>';return}r.innerHTML="";for(const x of k.profiles){const B=document.createElement("option");B.value=x.id,B.textContent=x.name,r.appendChild(B)}const L=k.profiles.find(x=>/720/i.test(x.name));L?r.value=String(L.id):k.profiles.length&&(r.value=String(k.profiles[0].id)),c.innerHTML=`<span style="color: var(--ok-fg);">${k.profiles.length} profiles loaded</span>`}catch(y){r.innerHTML='<option value="">-- Error --</option>',c.innerHTML=`<span style="color: var(--error, #c62828);">${y.message}</span>`}}),document.getElementById("svc-creds-save")?.addEventListener("click",async()=>{if(!p)return;const e=document.getElementById("svc-creds-save");e.textContent="Saving...",e.disabled=!0,i();try{const n=g.includes(p.id)||g.includes(p.appTemplate),u=p.id||p.appTemplate;if(h&&!b){const c=document.getElementById("svc-seedhost-user").value.trim(),y=document.getElementById("svc-seedhost-pass").value,k=document.getElementById("svc-apikey-input")?.value.trim(),L=document.getElementById("svc-basic-user").value.trim(),x=document.getElementById("svc-basic-pass").value,B=p.isExternal&&c&&y,A=n&&k&&k!=="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",E=!p.isExternal&&L&&x;if(!B&&!A&&!E){d("Enter the login or API key DashCaddy should store for this service."),e.textContent="Save to vault & open service",e.disabled=!1;return}}if(p.isExternal){const c=document.getElementById("svc-seedhost-user").value.trim(),y=document.getElementById("svc-seedhost-pass").value;if(c){const S=await secureFetch("/api/v1/seedhost-creds",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:c,password:y||void 0,serviceId:p.id})});await m(S,"Seedhost credential save")}}const r=document.getElementById("svc-apikey-input")?.value.trim();if(r&&r!=="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022")if(n){const c=f(p),y=document.getElementById("svc-quality-select"),S=y?.value?parseInt(y.value):void 0,k=y?.selectedOptions?.[0]?.textContent||void 0,L=await secureFetch("/api/v1/arr/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:u,apiKey:r,url:c||void 0,qualityProfileId:S||void 0,qualityProfileName:k||void 0})}),x=await m(L,"ARR credential save");x.connectionTest&&!x.connectionTest.success&&d(`API key saved but connection test failed: ${x.connectionTest.error}`)}else{const c=await secureFetch(`/api/v1/services/${p.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:r})});await m(c,"API key save")}else if(n&&v.includes(u)){const c=document.getElementById("svc-quality-select"),y=c?.value?parseInt(c.value):void 0,S=c?.selectedOptions?.[0]?.textContent||void 0;if(y){const k=await secureFetch("/api/v1/arr/quality-profiles",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:u,qualityProfileId:y,qualityProfileName:S})});await m(k,"Quality profile save")}}if(!p.isExternal){const c=document.getElementById("svc-basic-user").value.trim(),y=document.getElementById("svc-basic-pass").value;if(c&&y){const S=await secureFetch(`/api/v1/services/${p.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:c,password:y})});await m(S,"Service credential save")}}if(await s(p),h){const c=h;if(!await window.DCCredentialVault?.resume(c,p.id))throw new Error("Credential saved, but the secure service handoff failed. Try opening the service again.");h=null;return}}catch(n){l.logError("[ServiceCredentials] Save",n,{function:"saveCredentials"}),d("Failed to save: "+(n.message||"Unknown error"))}e.textContent=h?"Save to vault & open service":"Save to encrypted vault",e.disabled=!1}),document.getElementById("svc-creds-clear")?.addEventListener("click",async()=>{if(p&&confirm(`Remove stored credentials for ${p.name}?`)){i();try{const e=p.id||p.appTemplate,n=g.includes(e);if(p.isExternal){const r=await secureFetch(`/api/v1/seedhost-creds?serviceId=${p.id}`,{method:"DELETE"});await m(r,"Seedhost credential removal")}const u=await secureFetch(`/api/v1/services/${p.id}/credentials`,{method:"DELETE"});if(await m(u,"Service credential removal"),n){const r=await secureFetch(`/api/v1/arr/credentials/${e}`,{method:"DELETE"});await m(r,"ARR credential removal")}const o=document.getElementById(`creds-btn-${p.id}`);o&&o.classList.remove("has-creds"),await s(p)}catch(e){l.logError("[ServiceCredentials] Clear",e,{function:"clearCredentials"}),d("Failed to clear: "+(e.message||"Unknown error"))}}}),document.getElementById("svc-creds-close")?.addEventListener("click",()=>{a.classList.remove("show"),p=null,h=null}),a?.addEventListener("click",e=>{e.target===a&&(a.classList.remove("show"),p=null,h=null)}),window.refreshCredsButtons=async function(){try{for(const e of window.APPS||[]){if(!e.isExternal&&!e.appTemplate&&!e.url)continue;let n=!1;if(e.isExternal)try{const r=await(await fetch(`/api/v1/seedhost-creds?serviceId=${e.id}`)).json();r.success&&r.hasCredentials&&(n=!0)}catch{}try{const r=await(await fetch(`/api/v1/services/${e.id}/credentials`)).json();r.success&&(r.hasApiKey||r.hasBasicAuth)&&(n=!0)}catch{}const u=document.getElementById(`creds-btn-${e.id}`);u&&u.classList.toggle("has-creds",n)}}catch{}},window.openRequestedCredentialForm=function(){const e=new URLSearchParams(window.location.search),n=e.get("credentials");if(!n)return!1;const u=(window.APPS||[]).find(r=>r.id===n||r.appTemplate===n);if(!u)return!1;const o=e.get("return");return window.history.replaceState({},"",window.location.pathname),window.openServiceCredsModal(u,{returnUrl:o}),!0}})(),(function(){const l=new ErrorHandler;injectModal("totp-settings-modal",`<div id="totp-settings-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 420px; max-width: 520px;">
<h3 style="margin: 0 0 16px; font-size: 1.1rem;">Authentication Settings</h3>
<!-- Status Banner -->
<div id="totp-status-banner" style="margin-bottom: 16px; padding: 12px 16px; border-radius: 8px; border: 1px solid var(--border); display: flex; align-items: center; gap: 8px;">
<span id="totp-status-dot" class="status-dot"></span>
<span id="totp-status-text" style="font-size: 0.9rem;">TOTP is not configured</span>
</div>
<!-- Setup Button (not configured state) -->
<div id="totp-setup-section">
<button id="totp-setup-btn" class="btn-accent-solid" style="width: 100%; padding: 12px; border: none; border-radius: 8px; cursor: pointer; font-weight: 600; font-size: 0.95rem;">
Generate New Secret
</button>
<div style="display: flex; align-items: center; gap: 8px; margin: 10px 0 0;">
<div class="divider-line"></div>
<span class="text-tiny-muted">or</span>
<div class="divider-line"></div>
</div>
<div style="margin-top: 10px;">
<label class="text-hint">Import an existing secret key:</label>
<div style="display: flex; gap: 8px; margin-top: 6px;">
<input type="text" id="totp-import-key" placeholder="Paste your Base32 key" autocomplete="off" spellcheck="false"
style="flex: 1; padding: 10px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.9rem; font-family: monospace; letter-spacing: 1px; text-transform: uppercase;" />
<button id="totp-import-btn" style="padding: 10px 16px; background: var(--card-base); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; font-weight: 600; font-size: 0.85rem; white-space: nowrap;">
Import
</button>
</div>
<div id="totp-import-error" style="color: var(--bad-fg, #ff9aa3); font-size: 0.8rem; min-height: 1.2em; margin-top: 6px;"></div>
</div>
</div>
<!-- Secret Display (setup flow) -->
<div id="totp-qr-section" style="display: none;">
<!-- Manual Key (primary - for WinAuth/desktop authenticators) -->
<p style="font-size: 0.85rem; color: var(--muted); margin: 0 0 8px;">Copy this key into your authenticator app:</p>
<div style="display: flex; align-items: center; gap: 8px; margin-bottom: 8px;">
<code id="totp-manual-key" style="flex: 1; display: block; padding: 12px; background: var(--bg, #0b0f1a); border: 1px solid var(--border); border-radius: 6px; font-size: 1rem; font-family: 'Sami Grotesk', monospace; letter-spacing: 2px; word-break: break-all; user-select: all; color: var(--fg);"></code>
<button id="totp-copy-key" style="padding: 10px 14px; background: var(--card-base); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; font-size: 1rem; white-space: nowrap; color: var(--fg);" title="Copy to clipboard">\u{1F4CB}</button>
</div>
<!-- Download backup file (recovery aid) -->
<div style="margin-bottom: 16px; padding: 10px 12px; background: var(--bg, #0b0f1a); border: 1px solid var(--border); border-radius: 6px;">
<div style="display: flex; align-items: center; gap: 8px;">
<span style="font-size: 0.8rem; color: var(--muted); flex: 1;">
<strong style="color: var(--fg);">Save a backup file</strong> \u2014 if you ever lose your authenticator,
this is the only way to recover without SSH access to the server.
</span>
<button id="totp-download-backup" type="button"
style="padding: 8px 14px; background: var(--card-base); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; font-weight: 600; font-size: 0.85rem; white-space: nowrap;">
\u2B07 Download
</button>
</div>
</div>
<!-- QR Code (secondary - for mobile apps) -->
<details class="mb-16">
<summary style="cursor: pointer; color: var(--muted); font-size: 0.8rem;">Show QR code (for mobile authenticator apps)</summary>
<div style="text-align: center; margin-top: 8px;">
<img id="totp-qr-image" style="width: 180px; height: 180px; border-radius: 8px;" />
</div>
</details>
<!-- Verify First Code -->
<div style="border-top: 1px solid var(--border); padding-top: 16px;">
<label class="font-bold-sm">Enter code to confirm setup:</label>
<div style="display: flex; gap: 8px; margin-top: 8px;">
<input type="text" id="totp-setup-code" maxlength="6" inputmode="numeric" pattern="[0-9]{6}" placeholder="000000"
style="flex: 1; text-align: center; font-size: 1.3rem; padding: 10px; font-family: 'Sami Grotesk', monospace; letter-spacing: 4px; background: var(--bg); color: var(--fg); border: 2px solid var(--border); border-radius: 8px; outline: none;" />
<button id="totp-confirm-setup" class="btn-accent-solid" style="padding: 10px 20px; border: none; border-radius: 8px; cursor: pointer; font-weight: 600;">
Confirm
</button>
</div>
<div id="totp-setup-error" style="color: var(--bad-fg, #ff9aa3); font-size: 0.8rem; min-height: 1.2em; margin-top: 6px;"></div>
</div>
</div>
<!-- Session Duration (active state) -->
<div id="totp-duration-section" style="display: none; margin-top: 12px;">
<label class="font-bold-sm">Session Duration:</label>
<select id="totp-duration-select" style="width: 100%; padding: 10px; margin-top: 6px; background: var(--bg, #0b0f1a); color: var(--fg); border: 1px solid var(--border); border-radius: 8px; font-size: 0.9rem; cursor: pointer;">
<option value="15m">15 minutes</option>
<option value="30m">30 minutes</option>
<option value="1h">1 hour</option>
<option value="2h">2 hours</option>
<option value="4h">4 hours</option>
<option value="8h">8 hours</option>
<option value="12h">12 hours</option>
<option value="24h">24 hours</option>
<option value="never">Never (disable TOTP)</option>
</select>
<p style="font-size: 0.75rem; color: var(--muted); margin: 4px 0 0;">How long before you need to re-enter your code</p>
</div>
<!-- Disable Button (active state) -->
<div id="totp-disable-section" style="display: none; margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--border);">
<button id="totp-disable-btn" style="width: 100%; padding: 10px; background: transparent; color: var(--bad-fg, #ff9aa3); border: 1px solid var(--bad-fg, #ff9aa3); border-radius: 8px; cursor: pointer; font-size: 0.9rem;">
Disable TOTP
</button>
</div>
<!-- Close -->
<div style="margin-top: 16px; text-align: right;">
<button id="totp-modal-close" style="padding: 8px 20px; background: var(--card-base); color: var(--fg); border: 1px solid var(--border); border-radius: 8px; cursor: pointer;">
Close
</button>
</div>
</div>
</div>`);async function a(){try{const v=await(await fetch("/api/v1/totp/config")).json();if(!v.success)return;const{enabled:f,sessionDuration:d,isSetUp:i}=v.config,m=document.getElementById("totp-status-dot"),w=document.getElementById("totp-status-text"),s=document.getElementById("totp-status-banner"),t=document.getElementById("totp-setup-section"),e=document.getElementById("totp-qr-section"),n=document.getElementById("totp-duration-section"),u=document.getElementById("totp-disable-section");if(f&&i){m.style.background="var(--ok-fg, #7ef2ff)",s.style.borderColor="var(--ok-fg, #7ef2ff)",s.style.background="color-mix(in srgb, var(--ok-fg) 8%, transparent)",w.textContent="TOTP is active",w.style.color="var(--ok-fg, #7ef2ff)",t.style.display="block";const o=document.getElementById("totp-setup-btn");o&&(o.textContent="Generate New Secret"),e.style.display="none",n.style.display="block",u.style.display="block",document.getElementById("totp-duration-select").value=d}else m.style.background="var(--muted)",s.style.borderColor="var(--border)",s.style.background="transparent",w.textContent="TOTP is not configured",w.style.color="var(--muted)",t.style.display="block",e.style.display="none",n.style.display="none",u.style.display="none";b(f&&i,d)}catch(g){console.warn("Failed to load TOTP settings:",g)}}const p={"15m":"15 min","30m":"30 min","1h":"1 hour","2h":"2 hours","4h":"4 hours","8h":"8 hours","12h":"12 hours","24h":"24 hours",never:"Disabled"};function h(g,v){const f=window.DCI18n;return f&&f.isLoaded()?f.t(g):v}function b(g,v){const f=document.getElementById("auth-card"),d=document.getElementById("auth-pill"),i=document.getElementById("auth-dot"),m=document.getElementById("auth-status-text");f&&(g?(f.setAttribute("data-status","on"),d.className="badge on",d.textContent=h("card.status.yes","YES"),i.className="dot ok at-bl",m.textContent="Session: "+(p[v]||v)):(f.setAttribute("data-status","off"),d.className="badge off",d.textContent=h("card.status.no","NO"),i.className="dot bad at-bl",m.textContent=h("card.auth.not_configured","Not configured")))}document.getElementById("totp-setup-btn")?.addEventListener("click",async()=>{try{const v=await(await secureFetch("/api/v1/totp/setup",{method:"POST"})).json();v.success&&(document.getElementById("totp-qr-image").src=v.qrCode,document.getElementById("totp-manual-key").textContent=v.manualKey,document.getElementById("totp-setup-section").style.display="none",document.getElementById("totp-qr-section").style.display="block",document.getElementById("totp-setup-code").value="",document.getElementById("totp-setup-error").textContent="",document.getElementById("totp-setup-code").focus())}catch(g){l.logError("[TOTP] Setup Failed",g,{function:"setupTOTP"})}}),document.getElementById("totp-import-btn")?.addEventListener("click",async()=>{const g=document.getElementById("totp-import-key").value.trim(),v=document.getElementById("totp-import-error");if(v.textContent="",!g){v.textContent="Paste a Base32 secret key first";return}try{const d=await(await secureFetch("/api/v1/totp/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:g})})).json();d.success?(v.textContent="",document.getElementById("totp-qr-image").src=d.qrCode,document.getElementById("totp-manual-key").textContent=d.manualKey,document.getElementById("totp-setup-section").style.display="none",document.getElementById("totp-qr-section").style.display="block",document.getElementById("totp-setup-code").value="",document.getElementById("totp-setup-error").textContent="",document.getElementById("totp-setup-code").focus()):v.textContent=d.error||d.message||"Import failed"}catch{v.textContent="Connection error \u2014 try refreshing the page"}}),document.getElementById("totp-copy-key")?.addEventListener("click",()=>{const g=document.getElementById("totp-manual-key").textContent;navigator.clipboard.writeText(g).then(()=>{const v=document.getElementById("totp-copy-key");v.textContent="\u2705",setTimeout(()=>{v.textContent="\u{1F4CB}"},2e3)})}),document.getElementById("totp-download-backup")?.addEventListener("click",()=>{const g=document.getElementById("totp-manual-key").textContent.trim();if(!g)return;const v={service:"DashCaddy",type:"totp-secret",secret:g,issuer:"DashCaddy",algorithm:"SHA1",digits:6,period:30,issued:new Date().toISOString(),recovery_url:`${window.location.origin}/ (login screen \u2192 "Lost access?")`,note:'Keep this file somewhere safe. Anyone with this secret can generate your login codes. Use it ONLY to recover TOTP access via the "Lost access?" link on the DashCaddy login screen.'},f=new Blob([JSON.stringify(v,null,2)],{type:"application/json"}),d=URL.createObjectURL(f),i=document.createElement("a");i.href=d,i.download=`dashcaddy-totp-backup-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(d);const m=document.getElementById("totp-download-backup");m.textContent="\u2705 Saved",setTimeout(()=>{m.textContent="\u2B07 Download"},2e3)}),document.getElementById("totp-confirm-setup")?.addEventListener("click",async()=>{const g=document.getElementById("totp-setup-code").value,v=document.getElementById("totp-setup-error");if(!/^\d{6}$/.test(g)){v.textContent="Enter a 6-digit code";return}try{const d=await(await secureFetch("/api/v1/totp/verify-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:g})})).json();d.success?(v.textContent="",a()):v.textContent=d.error||"Invalid code"}catch{v.textContent="Connection error"}}),document.getElementById("totp-setup-code")?.addEventListener("keydown",g=>{g.key==="Enter"&&document.getElementById("totp-confirm-setup")?.click()}),document.getElementById("totp-duration-select")?.addEventListener("change",async g=>{try{await secureFetch("/api/v1/totp/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionDuration:g.target.value})}),a()}catch(v){l.logError("[TOTP] Update Session Duration",v,{function:"updateSessionDuration"})}}),document.getElementById("totp-disable-btn")?.addEventListener("click",async()=>{if(confirm("Disable TOTP authentication? All services will be accessible without a code."))try{(await(await secureFetch("/api/v1/totp/disable",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"})).json()).success&&a()}catch(g){l.logError("[TOTP] Disable Failed",g,{function:"disableTOTP"})}}),document.getElementById("auth-settings-btn")?.addEventListener("click",()=>{a(),openModal("totp-settings-modal")}),document.getElementById("totp-modal-close")?.addEventListener("click",()=>{closeModal("totp-settings-modal")}),document.getElementById("totp-settings-modal")?.addEventListener("click",g=>{g.target.id==="totp-settings-modal"&&closeModal("totp-settings-modal")}),window._updateAuthCard=b,(async()=>{try{const v=await(await fetch("/api/v1/totp/config")).json();if(v.success){const f=v.config.enabled&&v.config.isSetUp;b(f,v.config.sessionDuration)}}catch(g){l.logError("[TOTP] AuthCard Update",g,{function:"authCardUpdate"})}})()})(),(function(){"use strict";const l={me:"/api/v1/auth/me",users:"/api/v1/auth/admin/users",allowlist:"/api/v1/auth/admin/allowlist",invites:"/api/v1/auth/admin/invites"};function a(s,t,...e){const n=document.createElement(s);if(t)for(const u of Object.keys(t)){const o=t[u];o==null||o===!1||(u==="class"?n.className=o:u==="text"?n.textContent=o:u==="html"?n.innerHTML=o:u.startsWith("on")&&typeof o=="function"?n.addEventListener(u.slice(2).toLowerCase(),o):n.setAttribute(u,o))}for(const u of e)u==null||u===!1||(typeof u=="string"?n.appendChild(document.createTextNode(u)):n.appendChild(u));return n}async function p(s,t){const e=window.SITE&&window.SITE.csrfToken||"";t=t||{},t.headers=Object.assign({"Content-Type":"application/json"},t.headers||{},e?{"X-CSRF-Token":e}:{}),t.body&&typeof t.body!="string"&&(t.body=JSON.stringify(t.body));const n=await fetch(s,t),u=await n.json().catch(()=>({}));if(!n.ok){const o=u&&(u.message||u.error)||"HTTP "+n.status,r=new Error(o);throw r.status=n.status,r}return u}function h(s){const t={admin:"background:#7c3aed;color:#fff",operator:"background:#2563eb;color:#fff",viewer:"background:#6b7280;color:#fff"};return a("span",{class:"role-badge",style:"display:inline-block;padding:2px 8px;border-radius:4px;font-size:0.75rem;font-weight:600;text-transform:uppercase;"+(t[s]||t.viewer),text:s})}function b(s,t,e){if(s.innerHTML="",!t||t.length===0){s.appendChild(a("p",{style:"color:var(--muted)",text:"No users yet."}));return}const n=a("table",{style:"width:100%;border-collapse:collapse;font-size:0.9rem"});n.appendChild(a("thead",null,a("tr",{style:"border-bottom:1px solid var(--border)"},a("th",{style:"text-align:left;padding:8px",text:"Email"}),a("th",{style:"text-align:left;padding:8px",text:"Role"}),a("th",{style:"text-align:left;padding:8px",text:"Created"}),a("th",{style:"text-align:left;padding:8px",text:"Last login"}),a("th",{style:"text-align:right;padding:8px",text:"Actions"}))));const u=a("tbody");for(const o of t){const r=a("tr",{style:"border-bottom:1px solid var(--border)"}),c=a("td",{style:"padding:8px"});c.appendChild(a("span",{text:o.email||"(no email)"})),o.displayName&&o.displayName!==(o.email||"").split("@")[0]&&(c.appendChild(a("br")),c.appendChild(a("small",{style:"color:var(--muted)",text:o.displayName}))),r.appendChild(c);const y=a("td",{style:"padding:8px"});y.appendChild(h(o.role)),r.appendChild(y),r.appendChild(a("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:o.createdAt?new Date(o.createdAt).toLocaleDateString():"\u2014"})),r.appendChild(a("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:o.lastLoginAt?new Date(o.lastLoginAt).toLocaleString():"\u2014"}));const S=a("td",{style:"padding:8px;text-align:right"}),k=a("select",{style:"padding:2px 6px;margin-right:6px",onchange:async x=>{try{await p(l.users+"/"+encodeURIComponent(o.id),{method:"PATCH",body:{role:x.target.value}}),e&&e()}catch(B){window.errorHandler&&window.errorHandler.show("Role update failed: "+B.message),x.target.value=o.role}}});for(const x of["admin","operator","viewer"]){const B=a("option",{value:x,text:x});x===o.role&&(B.selected=!0),k.appendChild(B)}S.appendChild(k);const L=a("button",{class:"btn-sm",style:"padding:2px 8px",text:"Delete",onclick:async()=>{if(confirm("Delete user "+(o.email||o.id)+"? This cannot be undone."))try{await p(l.users+"/"+encodeURIComponent(o.id),{method:"DELETE"}),e&&e()}catch(x){window.errorHandler&&window.errorHandler.show("Delete failed: "+x.message)}}});S.appendChild(L),r.appendChild(S),u.appendChild(r)}n.appendChild(u),s.appendChild(n)}function g(s,t){const e=a("form",{style:"display:flex;gap:8px;flex-wrap:wrap;align-items:end",onsubmit:async u=>{u.preventDefault();const o=new FormData(u.target),r={email:o.get("email"),role:o.get("role"),ttlHours:parseInt(o.get("ttlHours"),10)||24,sendEmail:o.get("sendEmail")==="on"};try{const c=await p(l.invites,{method:"POST",body:r});u.target.reset(),t&&t(c)}catch(c){window.errorHandler&&window.errorHandler.show("Invite failed: "+c.message)}}});e.appendChild(a("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},a("span",{text:"Email"}),a("input",{name:"email",type:"email",required:!0,placeholder:"user@example.com",style:"padding:6px"})));const n=a("select",{name:"role",style:"padding:6px"});for(const u of["operator","viewer","admin"])n.appendChild(a("option",{value:u,text:u}));e.appendChild(a("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},a("span",{text:"Role"}),n)),e.appendChild(a("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},a("span",{text:"TTL (hours)"}),a("input",{name:"ttlHours",type:"number",min:"1",max:"168",value:"24",style:"padding:6px;width:80px"}))),e.appendChild(a("label",{style:"display:flex;gap:4px;align-items:center;font-size:0.85rem"},a("input",{name:"sendEmail",type:"checkbox",checked:!1}),a("span",{text:"Also send via email (optional)"}))),e.appendChild(a("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Issue invite"})),s.appendChild(e)}function v(s,t,e){if(s.innerHTML="",!t||t.length===0){s.appendChild(a("p",{style:"color:var(--muted)",text:"No outstanding invites."}));return}const n=a("table",{style:"width:100%;border-collapse:collapse;font-size:0.9rem"});n.appendChild(a("thead",null,a("tr",{style:"border-bottom:1px solid var(--border)"},a("th",{style:"text-align:left;padding:8px",text:"Email"}),a("th",{style:"text-align:left;padding:8px",text:"Role"}),a("th",{style:"text-align:left;padding:8px",text:"Invited by"}),a("th",{style:"text-align:left;padding:8px",text:"Expires"}),a("th",{style:"text-align:right;padding:8px",text:"Actions"}))));const u=a("tbody");for(const o of t){const r=a("tr",{style:"border-bottom:1px solid var(--border)"});r.appendChild(a("td",{style:"padding:8px",text:o.email})),r.appendChild(a("td",{style:"padding:8px"},h(o.role))),r.appendChild(a("td",{style:"padding:8px;color:var(--muted)",text:o.invitedBy||"\u2014"})),r.appendChild(a("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:o.expiresAt?new Date(o.expiresAt).toLocaleString():"\u2014"}));const c=a("td",{style:"padding:8px;text-align:right"});c.appendChild(a("button",{class:"btn-sm",style:"padding:2px 8px",text:"Revoke",onclick:async()=>{if(confirm("Revoke invite for "+o.email+"?"))try{await p(l.invites+"/"+encodeURIComponent(o.id),{method:"DELETE"}),e&&e()}catch(y){window.errorHandler&&window.errorHandler.show("Revoke failed: "+y.message)}}})),r.appendChild(c),u.appendChild(r)}n.appendChild(u),s.appendChild(n)}function f(s,t){const e=a("div",{style:"margin-top:12px;padding:12px;border:1px solid #16a34a;border-radius:6px;background:#052e1a;color:#bbf7d0;font-size:0.85rem"});e.appendChild(a("strong",{text:"Invite issued \u2014 copy the link below. It will not be shown again."})),e.appendChild(a("br")),e.appendChild(a("code",{style:"display:block;margin-top:8px;padding:8px;background:#000;border-radius:4px;word-break:break-all;color:#d1fae5",text:s.acceptUrl}));const n=a("button",{class:"btn-sm",style:"margin-top:8px;padding:4px 10px",text:"Copy link",onclick:async()=>{try{await navigator.clipboard.writeText(s.acceptUrl),n.textContent="Copied!",setTimeout(()=>{n.textContent="Copy link"},2e3)}catch{window.errorHandler&&window.errorHandler.show("Clipboard blocked: select the link manually.")}}});if(e.appendChild(n),s.shareText){const u=a("div",{style:"margin-top:12px"});u.appendChild(a("div",{style:"font-size:0.8rem;color:#86efac;margin-bottom:4px",text:"Share this message:"})),u.appendChild(a("div",{style:"padding:8px;background:#000;border-radius:4px;color:#d1fae5;white-space:pre-wrap",text:s.shareText}));const o=a("div",{style:"margin-top:6px;display:flex;gap:6px;flex-wrap:wrap"}),r=a("button",{class:"btn-sm",style:"padding:4px 10px",text:"Copy message",onclick:async()=>{try{await navigator.clipboard.writeText(s.shareText),r.textContent="Copied!",setTimeout(()=>{r.textContent="Copy message"},2e3)}catch{window.errorHandler&&window.errorHandler.show("Clipboard blocked: select the text manually.")}}});if(o.appendChild(r),typeof navigator<"u"&&typeof navigator.share=="function"){const c=a("button",{class:"btn-sm",style:"padding:4px 10px",text:"Share via\u2026",onclick:async()=>{try{await navigator.share({title:"DashCaddy invite",text:s.shareText,url:s.acceptUrl})}catch(y){y&&y.name&&y.name!=="AbortError"&&window.errorHandler&&window.errorHandler.show("Share failed: "+y.message)}}});o.appendChild(c)}u.appendChild(o),e.appendChild(u)}s.deliveredVia==="failed"?e.appendChild(a("p",{style:"margin-top:8px;color:#fbbf24;font-size:0.8rem",text:"Email could not be sent (SMTP not configured). Share the link above instead \u2014 it works the same way."})):s.deliveredVia==="email"?e.appendChild(a("p",{style:"margin-top:8px;color:#86efac;font-size:0.8rem",text:"Email sent to "+s.email+"."})):s.deliveredVia==="manual"&&e.appendChild(a("p",{style:"margin-top:8px;color:#86efac;font-size:0.8rem",text:"Share the link above via text, chat, or any messenger."})),t.appendChild(e)}async function d(s){s.innerHTML="",s.appendChild(a("h2",{style:"margin:0 0 16px",text:"Admin \xB7 Users & Invites"}));const t=await p(l.me).catch(()=>({}));if(!t||!t.user||t.user.role!=="admin"){s.appendChild(a("p",{style:"color:var(--muted)",text:"Admin role required to view this panel. If multi-user mode is enabled and you should have access, check /api/v1/auth/me."}));return}const e=a("button",{class:"btn-sm",style:"float:right;padding:4px 10px",text:"Refresh",onclick:()=>d(s)});s.appendChild(e);const n=a("h3",{style:"margin:24px 0 8px;clear:both",text:"Users"});s.appendChild(n);const u=a("div",{id:"admin-users-list"});s.appendChild(u);const o=await p(l.users).catch(()=>({users:[]}));b(u,o.users,()=>d(s)),s.appendChild(a("h4",{style:"margin:24px 0 8px;font-size:0.95rem",text:"Pre-authorize email"}));const r=a("form",{style:"display:flex;gap:8px;align-items:end",onsubmit:async k=>{k.preventDefault();const L=k.target.email.value.trim();if(L)try{await p(l.users,{method:"POST",body:{email:L}}),k.target.reset(),d(s)}catch(x){window.errorHandler&&window.errorHandler.show("Add failed: "+x.message)}}});r.appendChild(a("input",{name:"email",type:"email",required:!0,placeholder:"user@example.com",style:"padding:6px"})),r.appendChild(a("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Add to allowlist"})),s.appendChild(r),s.appendChild(a("h3",{style:"margin:24px 0 8px",text:"Issue invite"}));const c=a("div");s.appendChild(c);const y=a("div",{id:"admin-invites-list",style:"margin-top:16px"});s.appendChild(y);const S=await p(l.invites).catch(()=>({invites:[]}));v(y,S.invites,()=>d(s)),g(c,k=>{f(k,c),d(s)})}async function i(){if(document.getElementById("admin-panel-root"))return;const t=a("div",{id:"admin-panel-root",style:"position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:1000;display:flex;align-items:center;justify-content:center;",onclick:u=>{u.target===t&&m()}}),e=a("div",{style:"background:var(--card-base,#1f2937);color:var(--text,#f3f4f6);border-radius:8px;padding:24px;max-width:900px;width:90%;max-height:85vh;overflow:auto;position:relative;box-shadow:0 10px 30px rgba(0,0,0,0.3)"});e.appendChild(a("button",{class:"btn-sm",style:"position:absolute;top:12px;right:12px;padding:4px 10px",text:"Close",onclick:m}));const n=a("div",{id:"admin-panel-body"});e.appendChild(n),t.appendChild(e),document.body.appendChild(t);try{await d(n)}catch(u){n.innerHTML='<p style="color:#f87171">Failed to load admin panel: '+(u.message||u)+"</p>"}}function m(){const s=document.getElementById("admin-panel-root");s&&s.remove()}async function w(s){async function t(){const e=await p(l.me).catch(()=>({})),n=document.getElementById("admin-trigger-btn");if(e&&e.user&&e.user.role==="admin"){if(n)return;const u=a("button",{id:"admin-trigger-btn",class:"btn-sm",style:"margin-left:8px;padding:6px 12px",text:"Admin",onclick:i});s?s.appendChild(u):document.body&&document.body.appendChild(u)}else n&&n.remove()}await t(),setInterval(t,6e4)}window.AdminPanel={open:i,close:m,attachTrigger:w}})(),(function(){injectModal("token-management-modal",`
<div id="token-management-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 500px; max-width: 600px;">
<h3>\u{1F511} DNS Credentials</h3>
<p style="font-size: 0.85rem; color: var(--muted); margin: 0 0 16px;">
Enter Technitium DNS login credentials. Read-only accounts are used for logs; admin accounts for restarts, records, and updates.
</p>
<div id="dns-cred-sections"></div>
<div class="weather-modal-buttons modal-footer-bar">
<button id="token-clear-all" style="margin-right: auto; background: color-mix(in srgb, var(--bad-fg) 15%, transparent); border-color: var(--bad-fg); color: var(--bad-fg);">Clear All</button>
<button id="token-cancel">Cancel</button>
<button id="token-save" class="btn-accent">Save</button>
</div>
</div>
</div>
`);function l(){return Object.keys(SITE.dnsServers||{})}function a(o){return(SITE.dnsServers||{})[o]?.name||o.toUpperCase()}async function p(o,r){if(!o)throw new Error(`${r} failed: no response`);let c;try{c=await o.json()}catch{throw new Error(`${r} failed: invalid server response`)}if(!o.ok||c?.success!==!0)throw new Error(c?.error||`${r} failed (${o.status||"unknown status"})`);return c}function h(){const o=document.getElementById("dns-cred-sections");if(!o)return;o.innerHTML="";const r=l();if(r.length===0){o.innerHTML='<p style="color: var(--muted); text-align: center; padding: 20px;">No DNS servers configured.</p>';return}for(const c of r)o.insertAdjacentHTML("beforeend",`
<div class="token-section">
<h4 class="token-section-title">${a(c)}</h4>
<div class="token-grid">
<div class="token-field">
<label for="${c}-readonly-username">\u{1F4D6} Read-Only (Logs):</label>
<input type="text" id="${c}-readonly-username" placeholder="Username" autocomplete="off" style="margin-bottom: 4px;" />
<div class="token-input-row">
<input type="password" id="${c}-readonly-token" placeholder="Password" autocomplete="off" />
<button type="button" class="token-toggle" data-target="${c}-readonly-token">\u{1F441}</button>
</div>
</div>
<div class="token-field">
<label for="${c}-admin-username">\u{1F527} Admin:</label>
<input type="text" id="${c}-admin-username" placeholder="Username" autocomplete="off" style="margin-bottom: 4px;" />
<div class="token-input-row">
<input type="password" id="${c}-admin-token" placeholder="Password" autocomplete="off" />
<button type="button" class="token-toggle" data-target="${c}-admin-token">\u{1F441}</button>
</div>
</div>
</div>
<div class="token-status" id="${c}-token-status"></div>
</div>
`)}function b(){let o=safeSessionGet("dashcaddy-encryption-key");if(o)return o;const r=safeGet("dashcaddy-encryption-key");if(r)return safeSessionSet("dashcaddy-encryption-key",r),safeRemove("dashcaddy-encryption-key"),r;const c=new Uint8Array(32);return crypto.getRandomValues(c),o=Array.from(c,y=>y.toString(16).padStart(2,"0")).join(""),safeSessionSet("dashcaddy-encryption-key",o),o}const g=b();function v(o,r){if(!o)return"";const c=crypto.getRandomValues(new Uint8Array(8)),y=Array.from(c,L=>L.toString(16).padStart(2,"0")).join(""),S=new TextEncoder().encode(r+y);let k="";for(let L=0;L<o.length;L++){const x=o.charCodeAt(L)^S[L%S.length]^c[L%c.length]^L*31+17&255;k+=String.fromCharCode(x)}return y+":"+btoa(k)}function f(o,r){if(!o)return"";try{if(o.indexOf(":")===16){const k=o.substring(0,16),L=new Uint8Array(k.match(/.{2}/g).map(E=>parseInt(E,16))),x=atob(o.substring(17)),B=new TextEncoder().encode(r+k);let A="";for(let E=0;E<x.length;E++){const C=x.charCodeAt(E)^B[E%B.length]^L[E%L.length]^E*31+17&255;A+=String.fromCharCode(C)}return A}const y=atob(o);let S="";for(let k=0;k<y.length;k++){const L=y.charCodeAt(k)^r.charCodeAt(k%r.length);S+=String.fromCharCode(L)}return S}catch{return""}}function d(o,r,c){const y=safeGet(`${o}-${r}-${c}-enc`);return f(y,g)}function i(o,r,c,y){const S=`${o}-${r}-${c}-enc`;y?safeSet(S,v(y,g)):safeRemove(S)}function m(o,r){return d(o,r,"token")}function w(o,r){return d(o,r,"username")}function s(o,r,c){i(o,r,"token",c)}function t(o,r,c){i(o,r,"username",c)}function e(){const o={};for(const r of l())o[r]={readonly:{username:w(r,"readonly"),token:m(r,"readonly")},admin:{username:w(r,"admin"),token:m(r,"admin")}};return o}function n(){l().forEach(o=>{["readonly","admin"].forEach(r=>{["token","username"].forEach(c=>{safeRemove(`${o}-${r}-${c}-enc`)})}),safeRemove(`${o}-token-enc`),safeRemove(`${o}-username-enc`)})}function u(o){const r=m(o,"readonly"),c=w(o,"readonly"),y=m(o,"admin"),S=w(o,"admin"),k=f(safeGet(`${o}-token-enc`),g),L=f(safeGet(`${o}-username-enc`),g);return{username:S||c||L,token:y||r||k,readonlyToken:r||k,readonlyUsername:c||L,adminToken:y||k,adminUsername:S||L}}document.getElementById("manage-tokens")?.addEventListener("click",()=>{h();const o=document.getElementById("token-management-modal"),r=e();l().forEach(c=>{const y=r[c];document.getElementById(`${c}-readonly-username`).value=y.readonly.username,document.getElementById(`${c}-readonly-token`).value=y.readonly.token,document.getElementById(`${c}-admin-username`).value=y.admin.username,document.getElementById(`${c}-admin-token`).value=y.admin.token,document.getElementById(`${c}-token-status`).textContent=""}),o.classList.add("show")}),document.getElementById("token-management-modal")?.addEventListener("click",o=>{const r=o.target.closest(".token-toggle");if(r){const c=r.dataset.target,y=document.getElementById(c);y.type==="password"?(y.type="text",r.textContent="\u{1F648}"):(y.type="password",r.textContent="\u{1F441}");return}o.target.id==="token-management-modal"&&o.target.classList.remove("show")}),document.getElementById("token-save")?.addEventListener("click",async()=>{const o=l(),r={};let c=!1;if(o.forEach(y=>{const S={},k=document.getElementById(`${y}-readonly-username`).value.trim(),L=document.getElementById(`${y}-readonly-token`).value.trim(),x=document.getElementById(`${y}-admin-username`).value.trim(),B=document.getElementById(`${y}-admin-token`).value.trim();k&&L&&(S.readonly={username:k,password:L},c=!0),x&&B&&(S.admin={username:x,password:B},c=!0),Object.keys(S).length>0&&(r[y]=S)}),c){o.forEach(y=>{r[y]&&(document.getElementById(`${y}-token-status`).textContent="Verifying...",document.getElementById(`${y}-token-status`).className="token-status")});try{const y=await secureFetch("/api/v1/dns/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({servers:r})}),S=await p(y,"DNS credential save");if(S.results){const k=Object.keys(r).filter(L=>S.results[L]?.success!==!0);if(k.length){const L=k.map(x=>S.results[x]?.error||`${x} failed`).join("; ");throw new Error(L)}}o.forEach(k=>{t(k,"readonly",document.getElementById(`${k}-readonly-username`).value.trim()),s(k,"readonly",document.getElementById(`${k}-readonly-token`).value.trim()),t(k,"admin",document.getElementById(`${k}-admin-username`).value.trim()),s(k,"admin",document.getElementById(`${k}-admin-token`).value.trim())}),o.forEach(k=>{const L=document.getElementById(`${k}-token-status`);if(!r[k]){L.textContent="";return}const x=S.results?.[k];L.textContent=x?.partial?"\u2713 "+x.partial:"\u2713 Verified & saved",L.className="token-status success"})}catch(y){console.error("Failed to sync DNS credentials to backend:",y),o.forEach(S=>{r[S]&&(document.getElementById(`${S}-token-status`).textContent="\u2717 "+(y.message||"Save failed"),document.getElementById(`${S}-token-status`).className="token-status error")})}}else o.forEach(y=>{document.getElementById(`${y}-token-status`).textContent=""});setTimeout(()=>{o.every(S=>{const k=document.getElementById(`${S}-token-status`)?.textContent;return!k||k.includes("\u2713")})&&closeModal("token-management-modal")},1500)}),document.getElementById("token-cancel")?.addEventListener("click",()=>{closeModal("token-management-modal")}),document.getElementById("token-clear-all")?.addEventListener("click",async()=>{if(confirm("Clear all stored DNS credentials? This cannot be undone."))try{const o=await secureFetch("/api/v1/dns/credentials",{method:"DELETE"});await p(o,"DNS credential removal"),n(),l().forEach(r=>{document.getElementById(`${r}-readonly-username`).value="",document.getElementById(`${r}-readonly-token`).value="",document.getElementById(`${r}-admin-username`).value="",document.getElementById(`${r}-admin-token`).value="",document.getElementById(`${r}-token-status`).textContent="\u2713 Cleared",document.getElementById(`${r}-token-status`).className="token-status success"})}catch(o){l().forEach(r=>{document.getElementById(`${r}-token-status`).textContent="\u2717 "+(o.message||"Clear failed"),document.getElementById(`${r}-token-status`).className="token-status error"})}}),window.getToken=m,window.getUsername=w,window.setToken=s,window.setUsername=t,window.getAllCredentials=e,window.getCredential=d,window.setCredential=i,window.getEncryptionKey=b,window.getDnsIds=l,window.getDnsDisplayName=a})(),(function(){function l(s){const t=window.DCI18n;return!t||!t.isLoaded()?s?"ON":"OFF":t.t(s?"card.status.on":"card.status.off")}function a(s,t,e=null){const n=document.getElementById(s+"-dot"),u=document.getElementById(s+"-pill"),o=document.getElementById(s+"-time"),r=document.querySelector(`[data-app="${s}"]`);n&&(n.classList.toggle("ok",t),n.classList.toggle("bad",!t)),u&&(u.textContent=l(t),u.classList.toggle("on",t),u.classList.toggle("off",!t)),o&&e!==null&&(o.textContent=t?`${e}ms`:"timeout",o.className=`response-time ${p(e,t)}`),r&&r.setAttribute("data-status",t?"on":"off")}function p(s,t){return t?s<200?"excellent":s<500?"good":s<1e3?"fair":"slow":"timeout"}async function h(s){const t=performance.now();try{const e=await fetch("/probe/"+s,{cache:"no-store"}),n=performance.now(),u=Math.round(n-t);return{isUp:e.status>=200&&e.status<400||e.status===401||e.status===403,responseTime:u}}catch{const e=performance.now();return{isUp:!1,responseTime:Math.round(e-t)}}}window.APPS=[];let b=null,g=!1;async function v(){try{window.SkeletonLoader&&window.SkeletonLoader.show(6);const s=await fetch("/api/v1/services",{cache:"no-store"});if(s.ok){const t=await s.json();window.APPS=t.services||[],window.SkeletonLoader&&window.SkeletonLoader.hide()}else console.error("Failed to load services:",s.status),window.SkeletonLoader&&window.SkeletonLoader.hide()}catch(s){console.error("Failed to load services:",s),window.SkeletonLoader&&window.SkeletonLoader.hide()}}function f(s){const t=window.APPS?.find(n=>n.id===s);if(t?.url)return t.url.startsWith("http")?t.url:"https://"+t.url;if(t?.isExternal&&t.externalUrl)return t.externalUrl;const e=SITE.dnsServers?.[s];return e?"http://"+e.ip+":"+(e.port||5380):buildServiceUrl(s)}function d(s,t,e){const n=document.createElement(s);return t&&(n.className=t),e&&(n.textContent=e),n}function i(){const s=document.getElementById("cards");s.innerHTML="";for(let t=0;t<window.APPS.length;t++){const e=window.APPS[t];if(e.id==="ca")continue;const n=d("div","card");n.setAttribute("data-app",e.id),n.setAttribute("data-status","off"),e.containerId&&n.setAttribute("data-container-id",e.containerId),e.category&&n.setAttribute("data-category",e.category),e.recipeId&&n.setAttribute("data-recipe-id",e.recipeId);const u=d("span","dot bad at-bl");u.id="dot-"+e.id+"-grid",n.appendChild(u);const o=d("div","row"),r=d("div","logo-wrap"),c=document.createElement("img");c.src=e.logo,c.alt=e.name,c.className="logo-img",c.onerror=function(){let I=e.id||e.appTemplate;if(!I&&e.name&&(I=e.name.toLowerCase().replace(/\s+/g,"-")),I){const P=[`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${I}.png`,`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${I.toLowerCase()}.png`,`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${I.replace(/-/g,"")}.png`,`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${e.name.toLowerCase().replace(/\s+/g,"-")}.png`],D=[...new Set(P)],N=D.indexOf(this.src)+1;N<D.length?this.src=D[N]:this.style.display="none"}else this.style.display="none"},r.appendChild(c),o.appendChild(r);const y=d("span","name",e.name);if(o.appendChild(y),e.tailscaleOnly){const I=d("span","ts-badge","\u{1F510}");I.title="Tailscale-only access",I.style.cssText="margin-left: 6px; font-size: 0.75rem; opacity: 0.8;",y.appendChild(I)}if(e.category){const P=(typeof DC<"u"&&DC.CATEGORIES||window.DC_CATEGORIES||{})[e.category]||{},D=d("span","cat-badge",`${P.icon||""} ${e.category}`.trim());D.title=`Category: ${e.category}`,D.style.cssText=`margin-left: 6px; font-size: 0.65rem; padding: 1px 6px; border-radius: 999px; background: color-mix(in srgb, ${P.color||"#7f8c8d"} 25%, transparent); color: ${P.color||"#7f8c8d"}; border: 1px solid color-mix(in srgb, ${P.color||"#7f8c8d"} 50%, transparent); white-space: nowrap; font-weight: 500;`,y.appendChild(D)}o.appendChild(d("span","spacer"));const S=d("span","badge off","OFF");S.id="badge-"+e.id,S.setAttribute("data-i18n-live-status","binary"),o.appendChild(S);const k=d("span","update-available-badge","UPDATE");k.id="update-badge-"+e.id,k.title="Update available",o.appendChild(k),n.appendChild(o);const L=d("div","response-row"),x=d("span","response-time","--");x.id="time-"+e.id,L.appendChild(x),n.appendChild(L);const B=d("div","health-row");B.id="health-"+e.id;const A=d("span","uptime-chip","--");A.id="uptime-"+e.id,B.appendChild(A);const E=document.createElement("div");E.className="uptime-mini-bar";const C=document.createElement("div");C.className="fill",C.id="uptime-bar-"+e.id,C.style.width="0%",E.appendChild(C),B.appendChild(E),n.appendChild(B);const T=d("div","btn-row");if(e.containerId){const I=d("button","logs-btn","\u{1F4CB}");I.title="View container logs",I.onclick=O=>{O.stopPropagation(),window.openContainerLogsModal(e.containerId,e.name)},T.appendChild(I);const P=d("button","update-btn","\u2B06\uFE0F");P.title="Update container to latest version",P.id=`update-btn-${e.id}`,P.onclick=O=>{O.stopPropagation(),window.updateContainer(e.containerId,e.name,e.id)},T.appendChild(P);const D=d("button","exec-btn",">_");D.title="Open terminal",D.onclick=O=>{O.stopPropagation(),window.openExecModal&&window.openExecModal(e.containerId,e.name)},T.appendChild(D)}if(e.logPath&&!e.containerId){const I=d("button","logs-btn","\u{1F4CB}");I.title="View application logs",I.onclick=P=>{P.stopPropagation(),window.openFileLogsModal(e.logPath,e.name)},T.appendChild(I)}if(e.isExternal||e.appTemplate||e.url){const I=d("button","creds-btn","\u{1F511}");I.title="Auto-login credentials",I.id=`creds-btn-${e.id}`,I.onclick=P=>{P.stopPropagation(),window.openServiceCredsModal(e)},T.appendChild(I)}if(e.id!=="internet"){const I=d("button","options-btn","\u2699\uFE0F");I.title="Edit service settings",I.onclick=P=>{P.stopPropagation(),window.openServiceEditModal(e)},T.appendChild(I)}if(e.id!=="internet"){const I=d("button","share-btn","\u{1F517}");I.title="Share this service (Pro)",I.onclick=P=>{P.stopPropagation(),typeof window.openShareModal=="function"?window.openShareModal(e):typeof window.showNotification=="function"&&window.showNotification("Share modal not loaded. Refresh the page.","error")},T.appendChild(I)}if(e.id!=="internet"){const I=d("button","delete-btn","\u{1F5D1}\uFE0F");I.title="Delete this service",I.onclick=P=>{P.stopPropagation(),window.deleteService(e.id,e.name)},T.appendChild(I)}const $=d("button",null,"Open");$.setAttribute("data-i18n","action.open"),$.onclick=()=>window.open(f(e.id),"_blank","noopener"),T.appendChild($),n.appendChild(T),n.style.transitionDelay=`${Math.min(t*45,270)}ms`,s.appendChild(n)}window.DCI18n&&window.DCI18n.isLoaded()&&window.DCI18n.applyTranslations(),requestAnimationFrame(()=>{s.querySelectorAll(".card").forEach(t=>t.classList.add("loaded"))}),window.groupRecipeCards&&requestAnimationFrame(()=>window.groupRecipeCards()),window.refreshServiceFilter&&window.refreshServiceFilter()}function m(s,t,e=null){const n=document.getElementById("dot-"+s+"-grid"),u=document.getElementById("badge-"+s),o=document.getElementById("time-"+s),r=document.querySelector(`[data-app="${s}"]`);n&&(n.classList.toggle("ok",t),n.classList.toggle("bad",!t)),u&&(u.textContent=l(t),u.classList.toggle("on",t),u.classList.toggle("off",!t)),o&&e!==null&&(o.textContent=t?`${e}ms`:"timeout",o.className=`response-time ${p(e,t)}`),r&&r.setAttribute("data-status",t?"on":"off")}async function w(){if(window._dcAuthLost)return;if(b)return g=!0,b;function s(n,u=new Date){const o=document.getElementById("stamp");o&&(o.textContent=`${n}: ${new Date(u).toLocaleTimeString()}`)}function t(n){Object.keys(SITE.dnsServers).forEach(o=>{const r=n[o];r&&a(o,r.isUp,r.responseTime)}),n.internet&&a("internet",n.internet.isUp,n.internet.responseTime),window.APPS.forEach(o=>{const r=n[o.id];r&&m(o.id,r.isUp,r.responseTime)})}async function e(){const n=Object.keys(SITE.dnsServers),u=n.map(y=>h(y));u.push(h("internet"));const o=await Promise.all(u);n.forEach((y,S)=>a(y,o[S].isUp,o[S].responseTime));const r=o[o.length-1];a("internet",r.isUp,r.responseTime),(await Promise.all(window.APPS.map(async y=>{const S=await h(y.id);return{id:y.id,...S}}))).forEach(y=>{m(y.id,y.isUp,y.responseTime)})}return b=(async()=>{try{const n=await fetch("/api/v1/services/status",{cache:"no-store"});if(n.status===401||n.status===403){window._dcAuthLost=!0,window._sseReconnect&&window._sseClose&&window._sseClose(),s("auth required");return}if(!n.ok)throw new Error(`Status refresh failed (${n.status})`);window._dcAuthLost=!1;const u=await n.json();t(u.statuses||{}),s("last check",u.checkedAt||new Date)}catch(n){console.warn("Batched status refresh failed, falling back to direct probes:",n);try{await e(),s("last check")}catch(u){console.error("Dashboard refresh failed:",u),s("last failed")}}finally{b=null,g&&!window._dcAuthLost?(g=!1,setTimeout(()=>{window.refreshAll()},0)):g=!1}})(),b}document.querySelector(".top")?.addEventListener("click",s=>{const t=s.target.closest('[id$="-open"]');if(!t)return;const e=t.id.replace("-open","");SITE.dnsServers[e]&&window.open(f(e),"_blank","noopener")}),document.getElementById("ca-open")?.addEventListener("click",()=>window.open(f("ca"),"_blank","noopener")),document.getElementById("creds-btn-ca")?.addEventListener("click",s=>{s.stopPropagation();const t=window.APPS.find(e=>e.id==="ca");t&&window.openServiceCredsModal&&window.openServiceCredsModal(t)}),document.getElementById("options-btn-ca")?.addEventListener("click",s=>{s.stopPropagation();const t=window.APPS.find(e=>e.id==="ca");t&&window.openServiceEditModal&&window.openServiceEditModal(t)}),document.getElementById("delete-btn-ca")?.addEventListener("click",s=>{s.stopPropagation(),window.deleteService&&window.deleteService("ca","DashCA")}),window.loadServices=v,window.buildGrid=i,window.refreshAll=w,window.setQuick=a,window.setBadge=m,window.getResponseTimeClass=p,window.checkServiceWithTiming=h,window.serviceUrl=f,window.el=d})(),(function(){async function l(f){const i=await(await secureFetch(`/api/v1/dns/restart/${f}`,{method:"POST"})).json();if(!i.success)throw new Error(i.error||"Restart failed");return i}document.querySelector(".top")?.addEventListener("click",async f=>{const d=f.target.closest('[id$="-restart"]');if(!d)return;const i=d.id.replace("-restart","");if(SITE.dnsServers[i]&&confirm(`Restart ${i.toUpperCase()} service?`))try{await withButton(d,"...",()=>l(i)),setTimeout(window.refreshAll,DC.DELAYS.RELOAD)}catch(m){showNotification("Restart failed: "+m.message,"error")}});async function a(f,d){const i=document.getElementById(`${f}-update`),m=i?.textContent||"\u2B06\uFE0F";try{i.textContent="\u{1F50D}",i.disabled=!0,i.title="Checking for updates...";const s=await(await fetch(`/api/v1/dns/check-update?server=${encodeURIComponent(d)}`)).json();if(!s.success)throw new Error(s.error||"Failed to check for updates");if(!s.updateAvailable){i.textContent="\u2705",i.title=`Already on latest version (${s.currentVersion})`,showNotification(`${f.toUpperCase()} is already up to date! Current version: ${s.currentVersion}`,"info"),setTimeout(()=>{i.textContent=m,i.disabled=!1,i.title="Update DNS server"},3e3);return}if(!confirm(`Update available for ${f.toUpperCase()}!
Current: ${s.currentVersion}
New: ${s.updateVersion}
`+(s.updateTitle?`${s.updateTitle}
`:"")+`The DNS server will restart during the update.
Proceed?`)){i.textContent=m,i.disabled=!1,i.title="Update DNS server";return}i.textContent="\u{1F504}",i.title="Updating...";const n=await(await secureFetch(`/api/v1/dns/update?server=${encodeURIComponent(d)}`,{method:"POST"})).json();if(!n.success)throw new Error(n.error||"Update failed");if(n.manualUpdateRequired){i.textContent="\u2B06\uFE0F",i.title=`Update available: ${n.newVersion}`;const u=n.downloadLink?`
Download: ${n.downloadLink}`:"",o=n.instructionsLink?`
Instructions: ${n.instructionsLink}`:"";showNotification(`${f.toUpperCase()} update requires manual installation. Current: ${n.previousVersion} \u2192 ${n.newVersion}. Please update manually on the host machine.`,"warning",8e3),i.disabled=!1;return}i.textContent="\u2705",i.title="Updated successfully!",showNotification(`${f.toUpperCase()} updated successfully! ${n.previousVersion} \u2192 ${n.newVersion}. Server is restarting...`,"success"),setTimeout(()=>{i.textContent=m,i.disabled=!1,i.title="Update DNS server",window.refreshAll()},1e4)}catch(w){console.error("DNS update error:",w),i.textContent="\u274C",i.title="Update failed",showNotification(`Failed to update ${f.toUpperCase()}: ${w.message}`,"error"),setTimeout(()=>{i.textContent=m,i.disabled=!1,i.title="Update DNS server"},3e3)}}document.querySelector(".top")?.addEventListener("click",f=>{const d=f.target.closest('[id$="-update"]');if(!d)return;const i=d.id.replace("-update","");SITE.dnsServers[i]&&a(i,SITE.dnsServers[i]?.ip)}),injectModal("dns-settings-modal",`
<div id="dns-settings-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 420px; max-width: 520px;">
<h3 id="dns-settings-title">DNS Settings</h3>
<div style="display: grid; gap: 16px; margin-top: 16px;">
<div>
<label for="dns-edit-ip" class="form-label-accent-sm">Server IP</label>
<input type="text" id="dns-edit-ip" class="form-input-md" placeholder="192.168.1.1" />
</div>
<div>
<label for="dns-edit-port" class="form-label-accent-sm">Port</label>
<input type="number" id="dns-edit-port" class="form-input-md" placeholder="5380" />
</div>
<div>
<label for="dns-edit-name" class="form-label-accent-sm">Display Name (optional)</label>
<input type="text" id="dns-edit-name" class="form-input-md" placeholder="e.g. Primary DNS" />
</div>
<div class="form-hint-sm">Manage credentials via Tokens in the toolbar</div>
</div>
<div class="weather-modal-buttons" style="margin-top: 24px;">
<button id="dns-settings-cancel">Cancel</button>
<button id="dns-settings-delete" style="background: color-mix(in srgb, #e74c3c 20%, transparent); border-color: #e74c3c; color: #e74c3c;">Remove</button>
<button id="dns-settings-save" class="btn-accent">Save</button>
</div>
</div>
</div>`);let p=null;function h(f){p=f;const d=SITE.dnsServers[f]||{},i=document.getElementById("dns-settings-modal");document.getElementById("dns-settings-title").textContent=`${(d.name||f).toUpperCase()} Settings`,document.getElementById("dns-edit-ip").value=d.ip||"",document.getElementById("dns-edit-port").value=d.port||DC.DEFAULTS.DNS_PORT,document.getElementById("dns-edit-name").value=d.name||"",i.classList.add("show")}async function b(){if(!p)return;const f=document.getElementById("dns-edit-ip").value.trim(),d=document.getElementById("dns-edit-port").value.trim()||DC.DEFAULTS.DNS_PORT,i=document.getElementById("dns-edit-name").value.trim();if(!f){showNotification("Server IP is required","warning");return}const m={dnsServers:{}};m.dnsServers[p]={ip:f,port:String(d)},i&&(m.dnsServers[p].name=i);try{const s=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)})).json();s.success?(SITE.dnsServers[p]=m.dnsServers[p],showNotification(`${p.toUpperCase()} settings saved`,"success"),v(),window.refreshAll()):showNotification(s.error||"Failed to save settings","error")}catch(w){showNotification("Failed to save: "+w.message,"error")}}async function g(){if(p&&confirm(`Remove ${p.toUpperCase()} from dashboard? This won't affect the actual DNS server.`))try{const d=await(await secureFetch("/api/v1/config")).json();d.dnsServers&&delete d.dnsServers[p];const m=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dnsServers:d.dnsServers||{}})})).json();if(m.success){delete SITE.dnsServers[p];const w=document.querySelector(`.top [data-app="${p}"]`);w&&w.remove(),showNotification(`${p.toUpperCase()} removed from dashboard`,"success"),v()}else showNotification(m.error||"Failed to remove","error")}catch(f){showNotification("Failed to remove: "+f.message,"error")}}function v(){closeModal("dns-settings-modal"),p=null}document.getElementById("dns-settings-cancel")?.addEventListener("click",v),document.getElementById("dns-settings-save")?.addEventListener("click",b),document.getElementById("dns-settings-delete")?.addEventListener("click",g),document.getElementById("dns-settings-modal")?.addEventListener("click",f=>{f.target.id==="dns-settings-modal"&&v()}),document.querySelector(".top")?.addEventListener("click",f=>{const d=f.target.closest('[id$="-settings"]');if(!d)return;const i=d.id.replace("-settings","");SITE.dnsServers[i]&&(f.stopPropagation(),h(i))}),document.getElementById("refresh")?.addEventListener("click",window.refreshAll)})(),(function(){injectModal("logs-modal",`
<div id="logs-modal" class="logs-modal">
<div class="logs-modal-content" style="min-width: 800px; max-width: 1000px;">
<div class="logs-header">
<h3 id="logs-title">DNS Logs</h3>
<div class="logs-controls">
<label for="log-lines">Show:</label>
<select id="log-lines">
<option value="25" selected>25</option>
<option value="50">50</option>
<option value="100">100</option>
<option value="200">200</option>
</select>
<button id="logs-stream" class="stream-btn" title="Enable real-time streaming">\u{1F4E1} Live</button>
<button id="logs-pause" class="pause-btn">\u23F8\uFE0F Pause</button>
<button id="logs-close" class="close-btn">\u2715</button>
</div>
</div>
<div class="logs-container scroll-container">
<div id="logs-content" class="logs-content">
<div class="logs-loading">Loading logs...</div>
</div>
</div>
</div>
</div>`);let l=null,a=null,p=!1,h=null,b=null,g=!1,v=null,f=null,d=!1,i=null,m=!1;async function w(E,C=25){try{const T=getDnsServerAddr(E),$=await fetch(`/api/v1/dns/logs?server=${T}&limit=${C}`,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if($.ok){const I=await $.json();return I.success&&I.logs?{logs:I.logs,count:I.count,server:I.server}:{error:I.error||"Failed to fetch logs"}}else return $.status===401?{error:"DNS auto-auth failed - check credentials in settings"}:{error:`HTTP ${$.status}`}}catch(T){return console.error("DNS logs fetch failed:",T),{error:T.message}}}function s(E){return{NoError:"var(--ok-fg)",NOERROR:"var(--ok-fg)",NxDomain:"var(--muted)",NXDOMAIN:"var(--muted)",Refused:"var(--bad-fg)",REFUSED:"var(--bad-fg)",ServerFailure:"#f39c12",SERVFAIL:"#f39c12"}[E]||"var(--fg)"}function t(E){const C=document.createElement("div");if(C.className="log-entry",C.style.cssText="display: grid; grid-template-columns: 140px 110px 1fr 70px 80px; gap: 8px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: center;",E.parsed===!1)return C.style.gridTemplateColumns="1fr",C.innerHTML=`<span style="color: var(--muted); font-family: monospace; font-size: 0.75rem;">${escapeHtml(E.raw)}</span>`,C;const T=s(E.rcode),$=E.rcode==="Refused"||E.rcode==="REFUSED";return C.innerHTML=`
<span style="color: var(--muted); font-size: 0.75rem;">${escapeHtml(E.timestamp)}</span>
<span style="color: var(--accent); font-size: 0.75rem;" title="${escapeHtml(E.client)}">${escapeHtml(E.client)}</span>
<span style="font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; ${$?"text-decoration: line-through; opacity: 0.6;":""}" title="${escapeHtml(E.domain)}">${escapeHtml(E.domain)}</span>
<span style="color: var(--muted); font-size: 0.75rem;">${escapeHtml(E.type)}</span>
<span style="color: ${T}; font-weight: 500; font-size: 0.75rem;">${escapeHtml(E.rcode)}</span>
`,C}async function e(){if(d){await B();return}if(g){await S();return}if(p||!l)return;const E=parseInt(document.getElementById("log-lines").value),C=document.getElementById("logs-content");try{const T=await w(l,E);if(T.error){C.innerHTML=`
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
<div style="font-size: 1.2rem; margin-bottom: 8px;">\u26A0\uFE0F Error</div>
<div>${escapeHtml(T.error)}</div>
</div>`;return}C.innerHTML=`
<div style="display: grid; grid-template-columns: 140px 110px 1fr 70px 80px; gap: 8px; padding: 8px 10px; background: var(--card-base); border-bottom: 2px solid var(--border); font-size: 0.75rem; font-weight: 600; color: var(--muted); position: sticky; top: 0;">
<span>Time</span>
<span>Client</span>
<span>Domain</span>
<span>Type</span>
<span>Status</span>
</div>`,T.logs&&T.logs.length>0?T.logs.forEach($=>{const I=t($);C.appendChild(I)}):C.innerHTML+=`
<div style="padding: 20px; text-align: center; color: var(--muted);">
No DNS queries logged yet
</div>`}catch(T){C.innerHTML=`
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
Failed to fetch logs: ${escapeHtml(T.message)}
</div>`}}function n(E){l=E,p=!1,g=!1;const C=document.getElementById("logs-modal"),T=document.getElementById("logs-title"),$=document.getElementById("logs-pause"),I=document.getElementById("logs-stream");T.textContent=`${E.toUpperCase()} DNS Logs`,$.textContent="\u23F8\uFE0F Pause",$.classList.remove("paused"),I&&(I.style.display="none"),C.classList.add("show"),e(),a=setInterval(e,DC.POLL.LOGS)}function u(){document.getElementById("logs-modal").classList.remove("show"),a&&(clearInterval(a),a=null),r(),l=null,g=!1,h=null,b=null,d=!1,v=null,f=null,p=!1}function o(E){i&&r();const C=document.getElementById("logs-stream"),T=document.getElementById("logs-pause"),$=document.getElementById("logs-content");a&&(clearInterval(a),a=null);try{i=new EventSource(`/api/v1/logs/stream/${E}`),m=!0,C.classList.add("active"),C.textContent="\u{1F534} Live",C.title="Streaming - click to stop",T.style.display="none";const I=document.getElementById("logs-title");I.textContent.includes("\u{1F534}")||(I.innerHTML=I.textContent.replace("\u{1F4CB}","\u{1F4CB} \u{1F534}")),i.onmessage=P=>{try{const D=JSON.parse(P.data);if(D.error){console.error("Stream error:",D.error),r();return}const O=document.createElement("div");O.className="log-entry",O.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const _=(D.stream||"stdout")==="stderr",R=_?"var(--bad-fg)":"var(--fg)",M=`<span style="background: ${_?"var(--bad-bg)":"var(--ok-bg)"}; color: ${R}; padding: 2px 6px; border-radius: 4px; font-size: 0.7rem; font-weight: 600; min-width: 50px; text-align: center;">${_?"STDERR":"STDOUT"}</span>`;for(O.innerHTML=`
<div style="flex-shrink: 0;">${M}</div>
<div style="flex: 1; color: ${R}; word-break: break-all; white-space: pre-wrap;">${escapeHtml(D.text)}</div>
`,$.appendChild(O),$.scrollTop=$.scrollHeight;$.children.length>500;)$.removeChild($.firstChild)}catch(D){console.error("Error parsing stream data:",D)}},i.onerror=P=>{console.error("EventSource error:",P),r()}}catch(I){console.error("Failed to start streaming:",I),r()}}function r(){i&&(i.close(),i=null),m=!1;const E=document.getElementById("logs-stream"),C=document.getElementById("logs-pause"),T=document.getElementById("logs-title");E&&(E.classList.remove("active"),E.textContent="\u{1F4E1} Live",E.title="Enable real-time streaming"),C&&(C.style.display=""),T&&(T.textContent=T.textContent.replace(" \u{1F534}","")),g&&h&&!a&&(a=setInterval(S,DC.POLL.LOGS))}async function c(E,C=100){try{const T=`/api/v1/logs/container/${E}?tail=${C}&timestamps=true`,$=await fetch(T,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if($.ok){const I=await $.json();return I.success&&I.logs?{logs:I.logs,count:I.count,containerName:I.containerName,containerId:I.containerId}:{error:I.error||"Failed to fetch container logs"}}else return{error:`HTTP ${$.status}: ${$.statusText}`}}catch(T){return console.error("Container logs fetch failed:",T),{error:T.message}}}function y(E){const C=document.createElement("div");C.className="log-entry",C.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const T=E.stream==="stderr"?"var(--bad-fg)":"var(--fg)",$=E.stream==="stderr"?'<span style="background: var(--bad-bg); color: var(--bad-fg); padding: 2px 6px; border-radius: 4px; font-size: 0.7rem; font-weight: 600;">STDERR</span>':'<span style="background: var(--ok-bg); color: var(--ok-fg); padding: 2px 6px; border-radius: 4px; font-size: 0.7rem; font-weight: 600;">STDOUT</span>';return C.innerHTML=`
<div style="flex-shrink: 0;">${$}</div>
<div style="flex: 1; color: ${T}; word-break: break-all; white-space: pre-wrap;">${escapeHtml(E.text)}</div>
`,C}async function S(){if(p||!h||!g)return;const E=parseInt(document.getElementById("log-lines").value),C=document.getElementById("logs-content");try{const T=await c(h,E);if(T.error){C.innerHTML=`
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
<div style="font-size: 1.2rem; margin-bottom: 8px;">\u26A0\uFE0F Error</div>
<div>${escapeHtml(T.error)}</div>
</div>`;return}C.innerHTML=`
<div style="display: flex; gap: 12px; padding: 8px 10px; background: var(--card-base); border-bottom: 2px solid var(--border); font-size: 0.75rem; font-weight: 600; color: var(--muted); position: sticky; top: 0;">
<span style="flex-shrink: 0; width: 80px;">Stream</span>
<span style="flex: 1;">Log Output</span>
</div>`,T.logs&&T.logs.length>0?(T.logs.forEach($=>{const I=y($);C.appendChild(I)}),C.scrollTop=C.scrollHeight):C.innerHTML+=`
<div style="padding: 20px; text-align: center; color: var(--muted);">
No logs available for this container
</div>`}catch(T){C.innerHTML=`
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
Failed to fetch logs: ${escapeHtml(T.message)}
</div>`}}function k(E,C){h=E,b=C,g=!0,d=!1,p=!1,r();const T=document.getElementById("logs-modal"),$=document.getElementById("logs-title"),I=document.getElementById("logs-pause"),P=document.getElementById("logs-stream");$.textContent=`\u{1F4CB} ${C} - Container Logs`,I.textContent="\u23F8\uFE0F Pause",I.classList.remove("paused"),P&&(P.style.display=""),T.classList.add("show"),S(),a=setInterval(S,DC.POLL.LOGS)}async function L(E,C=100){try{const T=`/api/v1/logs/file?path=${encodeURIComponent(E)}&tail=${C}`,$=await fetch(T,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if($.ok){const I=await $.json();return I.success&&I.logs?{logs:I.logs,count:I.count,logPath:I.logPath,totalLines:I.totalLines}:{error:I.error||"Failed to fetch file logs"}}else return{error:(await $.json().catch(()=>({}))).error||`HTTP ${$.status}`}}catch(T){return console.error("File logs fetch failed:",T),{error:T.message}}}function x(E){const C=document.createElement("div");C.className="log-entry",C.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const T=E.text;let $="INFO",I="var(--fg)";T.match(/ERROR|FATAL|CRITICAL/i)?($="ERROR",I="var(--bad-fg)"):T.match(/WARN|WARNING/i)?($="WARN",I="#f39c12"):T.match(/DEBUG/i)&&($="DEBUG",I="var(--muted)");const D=`<span style="background: ${I==="var(--bad-fg)"?"var(--bad-bg)":"var(--ok-bg)"}; color: ${I}; padding: 2px 6px; border-radius: 4px; font-size: 0.7rem; font-weight: 600; min-width: 50px; text-align: center;">${$}</span>`;return C.innerHTML=`
<div style="flex-shrink: 0;">${D}</div>
<div style="flex: 1; color: ${I}; word-break: break-all; white-space: pre-wrap;">${escapeHtml(T)}</div>
`,C}async function B(){if(p||!v||!d)return;const E=parseInt(document.getElementById("log-lines").value),C=document.getElementById("logs-content");try{const T=await L(v,E);if(T.error){C.innerHTML=`
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
<div style="font-size: 1.2rem; margin-bottom: 8px;">\u26A0\uFE0F Error</div>
<div>${escapeHtml(T.error)}</div>
</div>`;return}C.innerHTML=`
<div style="display: flex; gap: 12px; padding: 8px 10px; background: var(--card-base); border-bottom: 2px solid var(--border); font-size: 0.75rem; font-weight: 600; color: var(--muted); position: sticky; top: 0;">
<span style="flex: 1;">Log Output (${T.count} of ${T.totalLines} lines)</span>
</div>`,T.logs&&T.logs.length>0?(T.logs.forEach($=>{const I=x($);C.appendChild(I)}),C.scrollTop=C.scrollHeight):C.innerHTML+=`
<div style="padding: 20px; text-align: center; color: var(--muted);">
No logs available in this file
</div>`}catch(T){C.innerHTML=`
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
Failed to fetch logs: ${escapeHtml(T.message)}
</div>`}}function A(E,C){v=E,f=C,d=!0,g=!1,p=!1;const T=document.getElementById("logs-modal"),$=document.getElementById("logs-title"),I=document.getElementById("logs-pause"),P=document.getElementById("logs-stream");$.textContent=`\u{1F4CB} ${C} - Application Logs`,I.textContent="\u23F8\uFE0F Pause",I.classList.remove("paused"),P&&(P.style.display="none"),T.classList.add("show"),B(),a=setInterval(B,DC.POLL.LOGS)}document.querySelector(".top")?.addEventListener("click",E=>{const C=E.target.closest('[id$="-logs"]');if(!C)return;const T=C.id.replace("-logs","");SITE.dnsServers[T]&&n(T)}),document.getElementById("logs-close")?.addEventListener("click",u),document.getElementById("logs-pause")?.addEventListener("click",()=>{p=!p;const E=document.getElementById("logs-pause");p?(E.textContent="\u25B6\uFE0F Resume",E.classList.add("paused")):(E.textContent="\u23F8\uFE0F Pause",E.classList.remove("paused"),e())}),document.getElementById("log-lines")?.addEventListener("change",()=>{p||e()}),document.getElementById("logs-stream")?.addEventListener("click",()=>{!g||!h||(m?r():o(h))}),document.getElementById("logs-modal")?.addEventListener("click",E=>{E.target.id==="logs-modal"&&u()}),document.addEventListener("keydown",E=>{E.key==="Escape"&&document.getElementById("logs-modal")?.classList.contains("show")&&u()}),window.openContainerLogsModal=k,window.openFileLogsModal=A,window.openLogsModal=n})(),(function(){injectModal("service-edit-modal",`
<div id="service-edit-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 500px; max-width: 600px;">
<h3 id="service-edit-title">Edit Service</h3>
<div style="display: grid; gap: 16px; margin-top: 16px;">
<!-- Service Info -->
<div style="display: flex; align-items: center; gap: 12px; padding: 12px; background: var(--card-bg); border-radius: 8px;">
<img id="edit-service-logo-preview" src="" alt="" style="width: 48px; height: 48px; border-radius: 8px; object-fit: contain; background: var(--bg);" />
<div style="flex: 1;">
<div id="edit-service-url-display" class="text-muted-sm"></div>
</div>
</div>
<!-- Display Name -->
<div>
<label for="edit-service-name" class="form-label-accent-sm">
Display Name
</label>
<input type="text" id="edit-service-name" class="form-input-md" placeholder="Service name shown on dashboard" />
</div>
<!-- Subdomain -->
<div>
<label for="edit-subdomain" class="form-label-accent-sm">
Subdomain
</label>
<div class="flex-row-gap-center">
<input type="text" id="edit-subdomain" class="input-flex" />
<span id="edit-tld-suffix" style="color: var(--muted);">.home</span>
</div>
</div>
<!-- Port -->
<div>
<label for="edit-port" class="form-label-accent-sm">
Port
</label>
<input type="number" id="edit-port" class="form-input-md" />
<div class="form-hint-sm">
The port Caddy will proxy to (container's exposed port)
</div>
</div>
<!-- IP Address -->
<div>
<label for="edit-ip" class="form-label-accent-sm">
IP Address
</label>
<input type="text" id="edit-ip" class="form-input-md" />
</div>
<!-- Tailscale Protection -->
<div>
<label style="display: flex; align-items: center; gap: 10px; padding: 12px; background: var(--card-bg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer;">
<input type="checkbox" id="edit-tailscale-only" style="width: 18px; height: 18px;" />
<div>
<div class="fw-500">Tailscale-Only Access</div>
<div class="text-hint">Restrict this service to Tailscale users only</div>
</div>
</label>
</div>
<!-- Logo -->
<div>
<label class="form-label-accent-sm">
Service Logo
</label>
<div class="flex-row-gap-center">
<input type="text" id="edit-logo-url" placeholder="/assets/service.png or https://..." class="input-flex" />
<label style="padding: 10px 16px; background: var(--card-bg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; white-space: nowrap;">
<input type="file" id="edit-logo-file" accept="image/*" style="display: none;" />
Upload
</label>
</div>
<div class="form-hint-sm">
Enter a URL or upload an image file (PNG, JPG, SVG)
</div>
</div>
<!-- Category -->
<div>
<label for="edit-service-category" class="form-label-accent-sm">
Category
</label>
<select id="edit-service-category" data-role="service-category" class="form-input-md">
<option value="">\u2014 No category \u2014</option>
</select>
</div>
</div>
<div class="weather-modal-buttons" style="margin-top: 24px;">
<button id="service-edit-cancel">Cancel</button>
<button id="service-edit-save" class="btn-accent">
Save Changes
</button>
</div>
</div>
</div>`),injectModal("delete-service-modal",`
<div id="delete-service-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 400px; max-width: 500px;">
<h3 id="delete-modal-title" class="mb-16">Delete Service</h3>
<div id="delete-modal-message" style="margin-bottom: 20px; line-height: 1.5;">
<!-- Dynamic content -->
</div>
<div id="delete-modal-container-info" style="display: none; margin-bottom: 20px; padding: 12px; background: var(--card-bg); border-radius: 8px; border: 1px solid var(--border);">
<div style="font-weight: 500; margin-bottom: 8px;">Docker Container</div>
<div id="delete-modal-container-name" style="font-size: 0.9rem; color: var(--muted);"></div>
</div>
<div class="weather-modal-buttons" style="display: flex; gap: 8px; justify-content: flex-end;">
<button id="delete-modal-cancel" style="padding: 10px 20px;">Cancel</button>
<button id="delete-modal-remove" style="padding: 10px 20px; background: color-mix(in srgb, var(--accent) 20%, transparent); border-color: var(--accent); color: var(--accent);">
Remove
</button>
<button id="delete-modal-delete" style="display: none; padding: 10px 20px; background: color-mix(in srgb, #e74c3c 20%, transparent); border-color: #e74c3c; color: #e74c3c;">
Delete
</button>
</div>
<div id="delete-modal-help" style="display: none; margin-top: 16px; padding: 12px; background: color-mix(in srgb, var(--muted) 10%, transparent); border-radius: 8px; font-size: 0.85rem; color: var(--muted);">
<div><strong>Remove:</strong> Remove from dashboard only (container keeps running)</div>
<div style="margin-top: 6px;"><strong>Delete:</strong> Full removal - stops container, removes DNS & Caddy config</div>
</div>
</div>
</div>`),injectModal("add-service-modal",`
<div id="add-service-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 420px; max-width: 520px;">
<h3>Add Service</h3>
<!-- Service Type Tabs -->
<div style="display: flex; gap: 2px; margin-bottom: 16px; background: var(--card-bg); border-radius: 8px; padding: 3px; border: 1px solid var(--border);">
<label id="tab-local" style="flex: 1; text-align: center; padding: 8px; border-radius: 6px; cursor: pointer; font-size: 0.85rem; font-weight: 500; background: var(--accent); color: var(--bg); transition: all 0.15s;">
<input type="radio" name="service-type" value="local" id="service-type-local" checked style="display: none;" />
Local
</label>
<label id="tab-external" style="flex: 1; text-align: center; padding: 8px; border-radius: 6px; cursor: pointer; font-size: 0.85rem; font-weight: 500; color: var(--muted); transition: all 0.15s;">
<input type="radio" name="service-type" value="external" id="service-type-external" style="display: none;" />
External
</label>
</div>
<span id="service-type-description" style="display: none;"></span>
<!-- LOCAL SERVICE -->
<div id="local-service-config" style="display: grid; gap: 12px;">
<div>
<label for="service-name-input" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Name</label>
<input type="text" id="service-name-input" placeholder="e.g., Jellyfin" style="font-size: 1rem;" />
<div id="subdomain-preview" style="font-size: 0.75rem; color: var(--accent); margin-top: 4px; min-height: 1em;"></div>
</div>
<div class="grid-2col">
<div>
<label for="service-port-input" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Port</label>
<input type="number" id="service-port-input" placeholder="e.g., 8096" style="font-size: 1rem;" />
</div>
<div>
<label for="service-ip-input" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">IP Address</label>
<input type="text" id="service-ip-input" placeholder="Auto-detected" style="font-size: 1rem;" />
<div class="quick-ip-buttons" style="display: flex; gap: 4px; margin-top: 4px; flex-wrap: wrap;">
<button type="button" class="quick-ip-btn" data-ip="127.0.0.1" title="Localhost" style="font-size: 0.7rem; padding: 2px 6px;">localhost</button>
<button type="button" class="quick-ip-btn" data-ip="" id="quick-ip-lan" title="LAN IP" style="font-size: 0.7rem; padding: 2px 6px;">LAN</button>
<button type="button" class="quick-ip-btn" data-ip="" id="quick-ip-tailscale" title="Tailscale IP" style="font-size: 0.7rem; padding: 2px 6px;">Tailscale</button>
</div>
</div>
</div>
<!-- Options (collapsed by default) -->
<details id="local-advanced-options">
<summary style="cursor: pointer; color: var(--accent); font-size: 0.8rem; user-select: none;">Options</summary>
<div style="margin-top: 10px; display: grid; gap: 10px; font-size: 0.8rem;">
<div class="grid-2col">
<div>
<label for="service-subdomain-input">Subdomain:</label>
<input type="text" id="service-subdomain-input" placeholder="auto-derived from name" />
</div>
<div>
<label for="service-logo-input">Logo URL:</label>
<input type="text" id="service-logo-input" placeholder="/assets/name.png" />
</div>
</div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px; align-items: start;">
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
<input type="checkbox" id="create-dns-record" checked />
Create DNS Record
</label>
<div>
<label for="ssl-type-select">SSL:</label>
<select id="ssl-type-select" style="width: 100%;">
<option value="caddy-managed">Caddy Managed (Internal)</option>
<option value="letsencrypt">Let's Encrypt</option>
<option value="existing-ca">Existing CA</option>
<option value="custom-ca">Custom CA</option>
</select>
</div>
</div>
<div id="dns-config">
<div class="grid-2col">
<div>
<label for="dns-ttl-input">DNS TTL:</label>
<input type="number" id="dns-ttl-input" value="300" />
</div>
<div>
<label for="caddyfile-path-input">Caddyfile Path:</label>
<input type="text" id="caddyfile-path-input" value="C:\\caddy\\Caddyfile" />
</div>
</div>
</div>
<div id="existing-ca-config" style="display: none;">
<label for="existing-ca-select">Existing CA:</label>
<div class="flex-row-gap">
<select id="existing-ca-select" style="flex: 1;">
<option value="">Loading CAs...</option>
</select>
<button type="button" id="refresh-cas" style="padding: 4px 8px; font-size: 0.75rem;">\u{1F504}</button>
</div>
</div>
<div id="custom-ca-config" style="display: none;">
<label for="ca-name-input">CA Name:</label>
<input type="text" id="ca-name-input" placeholder="e.g., sami-ca" />
</div>
<div id="manual-tailscale-status" style="padding: 6px 10px; background: var(--card-bg); border-radius: 6px; font-size: 0.75rem;">
<span style="color: var(--muted);">Checking Tailscale...</span>
</div>
<label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
<input type="checkbox" id="manual-tailscale-only" />
Tailscale-Only Access
</label>
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
<input type="checkbox" id="reload-caddy" checked />
Reload Caddy after adding
</label>
<!-- Category -->
<div>
<label for="service-category-input" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Category</label>
<select id="service-category-input" data-role="service-category" style="width: 100%;">
<option value="">\u2014 No category \u2014</option>
</select>
<div style="font-size: 0.7rem; color: var(--muted); margin-top: 3px;">Group services on the dashboard by purpose (Media, Productivity, etc.)</div>
</div>
<hr style="border: none; border-top: 1px solid var(--border); margin: 4px 0;" />
<div class="grid-2col">
<div>
<label class="field-label-sm">
<input type="checkbox" id="enable-auth" />
Authentication
</label>
<label class="field-label-sm">
<input type="checkbox" id="enable-cors" />
CORS Headers
</label>
<label for="upstream-path-input">Upstream Path:</label>
<input type="text" id="upstream-path-input" value="/" />
</div>
<div>
<label for="health-check-input">Health Check:</label>
<input type="text" id="health-check-input" placeholder="/health" />
<label for="timeout-input">Timeout (s):</label>
<input type="number" id="timeout-input" value="30" />
<label for="custom-headers-input">Headers (JSON):</label>
<textarea id="custom-headers-input" placeholder='{"X-Custom": "value"}' rows="2" style="font-size: 0.7rem;"></textarea>
</div>
</div>
</div>
</details>
</div>
<!-- EXTERNAL SERVICE -->
<div id="external-service-config" style="display: none;">
<div style="display: grid; gap: 12px;">
<div>
<label for="external-service-name" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Name</label>
<input type="text" id="external-service-name" placeholder="e.g., Radarr (Seedhost)" style="font-size: 1rem;" />
<div id="external-subdomain-preview" style="font-size: 0.75rem; color: var(--accent); margin-top: 4px; min-height: 1em;"></div>
</div>
<div>
<label for="external-service-url" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">External URL</label>
<input type="url" id="external-service-url" placeholder="https://username.seedhost.eu/radarr" style="font-size: 1rem;" />
</div>
<!-- Options (collapsed by default) -->
<details id="external-advanced-options">
<summary style="cursor: pointer; color: var(--accent); font-size: 0.8rem; user-select: none;">Options</summary>
<div style="margin-top: 10px; display: grid; gap: 10px; font-size: 0.8rem;">
<div class="grid-2col">
<div>
<label for="external-service-subdomain">Subdomain:</label>
<input type="text" id="external-service-subdomain" placeholder="auto-derived from name" />
<span id="external-domain-preview" style="font-size: 0.7rem; color: var(--accent);"></span>
</div>
<div>
<label for="external-service-logo">Logo URL:</label>
<input type="text" id="external-service-logo" placeholder="/assets/name.png" />
</div>
</div>
<div>
<label for="external-service-icon">Icon Emoji:</label>
<input type="text" id="external-service-icon" placeholder="\u{1F3AC}" maxlength="2" style="width: 60px;" />
</div>
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
<input type="checkbox" id="external-create-dns" checked />
Create DNS Record
</label>
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
<input type="checkbox" id="external-create-caddy" checked />
Create Caddy Reverse Proxy
</label>
<div>
<label for="external-proxy-ip">Proxy Server IP:</label>
<input type="text" id="external-proxy-ip" placeholder="Auto-detected" />
</div>
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
<input type="checkbox" id="external-preserve-host" checked />
Preserve Host Header
</label>
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
<input type="checkbox" id="external-follow-redirects" checked />
Follow Redirects
</label>
<!-- Category (external) -->
<div>
<label for="external-service-category" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Category</label>
<select id="external-service-category" data-role="service-category" style="width: 100%;">
<option value="">\u2014 No category \u2014</option>
</select>
</div>
</div>
</details>
</div>
</div>
<div class="weather-modal-buttons" style="margin-top: 16px; display: flex; gap: 8px; justify-content: flex-end;">
<button id="add-service-cancel">Cancel</button>
<button id="add-service-create" class="btn-accent">Create Service</button>
</div>
</div>
</div>`)})(),(function(){async function l(g){try{const v=await fetch(`/api/v1/caddy/cas?caddyfilePath=${encodeURIComponent(g)}`);if(!v.ok)throw new Error(`Failed to load CAs: ${v.status}`);const f=await v.json();if(f.success){const d=document.getElementById("existing-ca-select");return d.innerHTML="",f.cas.length===0?d.innerHTML='<option value="">No CAs found in Caddyfile</option>':(d.innerHTML='<option value="">Select existing CA...</option>',f.cas.forEach(i=>{const m=document.createElement("option");typeof i=="object"?(m.value=i.id,m.textContent=i.displayName||i.name):(m.value=i,m.textContent=i),d.appendChild(m)})),f.data.cas}else throw new Error(f.message)}catch(v){console.error("Error loading CAs:",v);const f=document.getElementById("existing-ca-select");return f.innerHTML='<option value="">Error loading CAs</option>',[]}}function a(g){const{subdomain:v,port:f,ip:d,sslType:i,caName:m,existingCa:w,enableAuth:s,enableCors:t,customHeaders:e,upstreamPath:n,healthCheck:u,timeout:o,tailscaleOnly:r}=g;let c=`${buildDomain(v)} {
`;switch(r&&(c+=` @blocked not remote_ip 100.64.0.0/10
`,c+=` respond @blocked "Access denied. Tailscale connection required." 403
`),i){case"letsencrypt":break;case"caddy-managed":c+=` tls internal
`;break;case"existing-ca":w&&(c+=` tls {
ca ${w}
}
`);break;case"custom-ca":m&&(c+=` tls {
ca ${m}
}
`);break}if(s&&(c+=` basicauth {
admin $2a$14$hashed_password_here
}
`),t&&(c+=` header {
`,c+=` Access-Control-Allow-Origin "*"
`,c+=` Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
`,c+=` Access-Control-Allow-Headers "Content-Type, Authorization"
`,c+=` }
`),e)try{const y=JSON.parse(e);c+=` header {
`,Object.entries(y).forEach(([S,k])=>{c+=` ${S} "${k}"
`}),c+=` }
`}catch{console.warn("Invalid JSON in custom headers")}return u&&(c+=` health_uri ${u}
`),c+=` reverse_proxy ${d}:${f} {
`,n&&n!=="/"&&(c+=` rewrite ${n}
`),o&&o!==30&&(c+=` transport http {
`,c+=` dial_timeout ${o}s
`,c+=` response_header_timeout ${o}s
`,c+=` }
`),c+=` }
`,c+=`}
`,c}async function p(g,v,f=DC.DEFAULTS.TTL){const d=window.getToken(getPrimaryDnsId(),"admin");if(!d)throw new Error("DNS admin token not configured. Please set it in the Tokens menu.");const i=buildDomain(g),m=await secureFetch("/api/v1/dns/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:i,ip:v,ttl:f,token:d,server:SITE.dnsIp})});if(!m.ok){const s=await m.text();throw new Error(`DNS API Error: ${m.status} - ${s}`)}const w=await m.json();if(!w.success)throw new Error(`DNS Error: ${w.error||"Unknown error"}`);return w}async function h(g){const v={id:g.subdomain,name:g.name,logo:g.logo||`/assets/${g.subdomain}.png`};g.category&&(v.category=g.category),g.containerId&&(v.containerId=g.containerId);try{const f=await secureFetch("/api/v1/services",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(v)});if(!f.ok){const d=await f.json();throw new Error(d.error||"Failed to save service")}return await window.loadServices(),window.buildGrid(),v}catch(f){throw console.error("Failed to add service to config:",f),f}}async function b(g){const v=document.getElementById("service-subdomain-input").value.trim(),f=document.getElementById("service-ip-input").value.trim()||"localhost",d=document.getElementById("service-port-input").value.trim()||"80",i=await secureFetch("/api/v1/site",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:buildDomain(v),upstream:`${f}:${d}`,config:g})}),m=await i.json();if(!i.ok||!m.success)throw new Error(m.error||`Caddy API Error: ${i.status}`);return m}window.loadExistingCAs=l,window.generateCaddyConfig=a,window.createDnsRecord=p,window.addServiceToConfig=h,window.addToCaddyfile=b})(),(function(){let l=null;function a(f){l=f;const d=document.getElementById("service-edit-modal");document.getElementById("service-edit-title").textContent=`Edit ${f.name}`,document.getElementById("edit-service-name").value=f.name,document.getElementById("edit-service-url-display").textContent=f.url||buildServiceUrl(f.id),document.getElementById("edit-service-logo-preview").src=f.logo||`/assets/${f.id}.png`,document.getElementById("edit-subdomain").value=f.id,document.getElementById("edit-port").value=f.port||"",document.getElementById("edit-ip").value=f.ip||"localhost",document.getElementById("edit-tailscale-only").checked=f.tailscaleOnly||!1,document.getElementById("edit-logo-url").value=f.logo||"";const i=document.getElementById("edit-service-category");i&&(i.dataset.current=f.category||"",typeof window.populateCategorySelects=="function"&&window.populateCategorySelects()),d.classList.add("show")}function p(){closeModal("service-edit-modal"),l=null}async function h(){if(!l)return;const f=document.getElementById("edit-subdomain").value.trim().toLowerCase(),d=document.getElementById("edit-service-name").value.trim(),i=document.getElementById("edit-port").value.trim(),m=document.getElementById("edit-ip").value.trim()||"localhost",w=document.getElementById("edit-tailscale-only").checked,s=document.getElementById("edit-logo-url").value.trim(),t=document.getElementById("edit-service-category")?.value||"";if(!f){showNotification("Subdomain is required","warning");return}const e=l.id,n=[];if(f!==e&&n.push("subdomain"),d&&d!==l.name&&n.push("name"),i&&i!==String(l.port)&&n.push("port"),m!==l.ip&&n.push("ip"),w!==(l.tailscaleOnly||!1)&&n.push("tailscale"),s&&s!==l.logo&&n.push("logo"),t!==(l.category||"")&&n.push("category"),n.length===0){p();return}const u=document.getElementById("service-edit-save");u.textContent="Saving...",u.disabled=!0;try{const r=await(await secureFetch("/api/v1/services/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubdomain:e,newSubdomain:f,name:d||l.name,port:i||l.port,ip:m,tailscaleOnly:w,logo:s||void 0,category:t})})).json();if(!r.success)throw new Error(r.error||"Failed to update service");const c=window.APPS.findIndex(y=>y.id===e);c!==-1&&(window.APPS[c]={...window.APPS[c],id:f,name:d||window.APPS[c].name,port:i||window.APPS[c].port,ip:m,tailscaleOnly:w,logo:s||window.APPS[c].logo,category:t||void 0}),p(),window.buildGrid(),window.refreshAll()}catch(o){console.error("Error saving service changes:",o),showNotification(`Error saving changes: ${o.message}`,"error")}finally{u.textContent="Save Changes",u.disabled=!1}}document.getElementById("edit-logo-file")?.addEventListener("change",async f=>{const d=f.target.files[0];if(!d)return;if(!d.type.startsWith("image/")){showNotification("Please select an image file","warning");return}const i=new FileReader;i.onload=async m=>{const w=m.target.result;if(document.getElementById("edit-service-logo-preview").src=w,document.getElementById("edit-logo-url").value=w,l)try{const t=await(await secureFetch("/api/v1/assets/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filename:`${l.id}.png`,data:w})})).json();t.success&&t.path&&(document.getElementById("edit-logo-url").value=t.path)}catch{}},i.readAsDataURL(d)}),document.getElementById("service-edit-cancel")?.addEventListener("click",p),document.getElementById("service-edit-save")?.addEventListener("click",h),document.getElementById("service-edit-modal")?.addEventListener("click",f=>{f.target.id==="service-edit-modal"&&p()});function b(f,d,i){return new Promise(m=>{const w=document.getElementById("delete-service-modal"),s=document.getElementById("delete-modal-title"),t=document.getElementById("delete-modal-message"),e=document.getElementById("delete-modal-container-info"),n=document.getElementById("delete-modal-container-name"),u=document.getElementById("delete-modal-help"),o=document.getElementById("delete-modal-cancel"),r=document.getElementById("delete-modal-remove"),c=document.getElementById("delete-modal-delete");s.textContent=`Delete "${f}"`,d?(t.innerHTML="This service has an associated Docker container.<br>Choose how to proceed:",e.style.display="block",n.textContent=`Container ID: ${i?.slice(0,12)||"Unknown"}`,u.style.display="block",c.style.display="block"):(t.textContent="Remove this service from the dashboard?",e.style.display="none",u.style.display="none",c.style.display="none");const y=()=>{w.classList.remove("show"),o.removeEventListener("click",S),r.removeEventListener("click",k),c.removeEventListener("click",L),w.removeEventListener("click",x)},S=()=>{y(),m(null)},k=()=>{y(),m(!1)},L=()=>{y(),m(!0)},x=B=>{B.target===w&&(y(),m(null))};o.addEventListener("click",S),r.addEventListener("click",k),c.addEventListener("click",L),w.addEventListener("click",x),w.classList.add("show")})}async function g(f,d,i){const m=document.getElementById(`update-btn-${i}`),w=m?.textContent;if(confirm(`Update ${d} to the latest version?
This will:
1. Pull the latest image
2. Stop the container
3. Recreate with same settings
The service will be briefly unavailable.`))try{m&&(m.textContent="\u{1F504}",m.disabled=!0,m.title="Updating...");const t=await(await secureFetch(`/api/v1/containers/${f}/update`,{method:"POST"})).json();if(t.success){const e=window.APPS.find(n=>n.id===i);e&&t.newContainerId&&(e.containerId=t.newContainerId),m&&(m.textContent="\u2705",m.title="Updated successfully!",setTimeout(()=>{m.textContent=w,m.disabled=!1,m.title="Update container to latest version"},3e3)),setTimeout(()=>window.refreshAll(),2e3),showNotification(`${d} updated successfully!`,"success")}else throw new Error(t.error||"Update failed")}catch(s){console.error("Update error:",s),m&&(m.textContent="\u274C",m.title="Update failed",setTimeout(()=>{m.textContent=w,m.disabled=!1,m.title="Update container to latest version"},3e3)),showNotification(`Failed to update ${d}: ${s.message}`,"error")}}async function v(f,d){const i=window.APPS.find(c=>c.id===f),m=i?buildDomain(i.id):null,w=i?.containerId,s=await b(d||f,w,i?.containerId);if(s===null)return;let t={dashboard:!1,container:null,dns:null,caddy:null,service:null};if(s&&w)try{const c=new URLSearchParams({containerId:i.containerId,subdomain:i.id,ip:i.ip||"localhost",deleteContainer:"true"}),S=await(await secureFetch(`/api/v1/apps/${encodeURIComponent(i.id)}?${c.toString()}`,{method:"DELETE"})).json();S.success?t={...t,...S.results,dashboard:!1}:console.error("App removal failed:",S.error)}catch(c){console.error("App removal error:",c)}else if(s&&m){try{const c=i?.ip||"localhost",S=await(await secureFetch(`/api/v1/dns/record?domain=${encodeURIComponent(m)}&type=A&ipAddress=${encodeURIComponent(c)}&server=${SITE.dnsIp}`,{method:"DELETE"})).json();t.dns=S.success?"deleted":S.error||"failed"}catch(c){t.dns=c.message}try{const y=await(await secureFetch(`/api/v1/site/${encodeURIComponent(m)}`,{method:"DELETE"})).json();t.caddy=y.success||y.error&&y.error.includes("not found")?"removed":y.error||"failed"}catch(c){t.caddy=c.message}}const e=window.APPS.findIndex(c=>c.id===f);e>-1&&(window.APPS.splice(e,1),t.dashboard=!0);try{const c=safeGetJSON("custom-apps",[]),y=c.findIndex(S=>S.id===f);y>-1&&(c.splice(y,1),safeSet("custom-apps",JSON.stringify(c)))}catch{}try{const y=await(await secureFetch(`/api/v1/services/${encodeURIComponent(f)}`,{method:"DELETE"})).json();t.service=y.success?"removed":y.error||"failed"}catch(c){t.service=c.message}window.buildGrid(),window.refreshAll();let n=!1,u=[];t.dashboard||(n=!0,u.push("\u2717 Failed to remove from dashboard"));const o=["removed","already removed","not found","deleted","kept (user choice)","skipped","no such record","does not exist"],r=c=>!c||o.some(y=>c.toLowerCase().includes(y.toLowerCase()));t.container&&!r(t.container)&&(n=!0,u.push(`\u26A0 Container: ${t.container}`)),t.dns&&!r(t.dns)&&(n=!0,u.push(`\u26A0 DNS Record: ${t.dns}`)),t.caddy&&!r(t.caddy)&&(n=!0,u.push(`\u26A0 Caddy Config: ${t.caddy}`)),t.service&&!r(t.service)&&(n=!0,u.push(`\u26A0 Service File: ${t.service}`)),n&&showNotification(`Error deleting "${d||f}": ${u.join(", ")}`,"error",6e3)}window.openServiceEditModal=a,window.showDeleteModal=b,window.updateContainer=g,window.deleteService=v})(),(function(){function l(t){return t.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-|-$/g,"")}function a(){return SITE.defaults?.sslType||(SITE.configurationType==="public"?"letsencrypt":"caddy-managed")}function p(){const t=document.getElementById("service-subdomain-input").value||"subdomain",e=document.getElementById("service-ip-input").value||h.lan||"localhost",n=document.getElementById("service-port-input").value||DC.DEFAULTS.SERVICE_PORT,u=document.getElementById("ssl-type-select").value,o=document.getElementById("ca-name-input").value||"sami-ca",r=document.getElementById("existing-ca-select").value,c=document.getElementById("enable-auth").checked,y=document.getElementById("enable-cors").checked,S=document.getElementById("custom-headers-input").value,k=document.getElementById("upstream-path-input").value||"/",L=document.getElementById("health-check-input").value,x=document.getElementById("timeout-input").value||30,B=document.getElementById("dns-preview");B&&(B.textContent=`${buildDomain(t)} \u2192 ${e}`);const A=document.getElementById("url-preview");A&&(A.textContent=buildServiceUrl(t));const E={subdomain:t,port:n,ip:e,sslType:u,caName:o,existingCa:r,enableAuth:c,enableCors:y,customHeaders:S,upstreamPath:k,healthCheck:L,timeout:x},C=window.generateCaddyConfig(E),T=document.getElementById("caddy-config-preview");T&&(T.value=C)}const h={localhost:"127.0.0.1",lan:"",tailscale:""};async function b(){try{const u=await fetch("/api/v1/network/ips",{signal:AbortSignal.timeout(2e3)});if(u.ok){const o=await u.json();o.lan&&(h.lan=o.lan),o.tailscale&&(h.tailscale=o.tailscale)}}catch{}const t=document.getElementById("quick-ip-lan"),e=document.getElementById("quick-ip-tailscale");t&&(h.lan?(t.dataset.ip=h.lan,t.textContent=`LAN (${h.lan})`,t.title=`LAN IP: ${h.lan}`):t.style.display="none"),e&&(h.tailscale?(e.dataset.ip=h.tailscale,e.textContent=`Tailscale (${h.tailscale})`,e.title=`Tailscale IP: ${h.tailscale}`):e.style.display="none");const n=document.getElementById("service-ip-input");n&&!n.value&&h.lan&&(n.value=h.lan)}function g(){document.querySelectorAll(".quick-ip-btn").forEach(t=>{t.addEventListener("click",()=>{const e=t.dataset.ip;e&&(document.getElementById("service-ip-input").value=e,document.querySelectorAll(".quick-ip-btn").forEach(n=>n.classList.remove("active")),t.classList.add("active"),p())})}),document.getElementById("service-ip-input")?.addEventListener("input",t=>{const e=t.target.value;document.querySelectorAll(".quick-ip-btn").forEach(n=>{n.classList.toggle("active",n.dataset.ip===e)})})}async function v(){const t=document.getElementById("add-service-modal");t.classList.add("show");const e=t.querySelector(".weather-modal-content");e&&(e.scrollTop=0),document.body.style.overflow="hidden";const n=document.getElementById("ssl-type-select");n&&(n.value=a()),await b();const u=document.getElementById("caddyfile-path-input").value||DC.DEFAULTS.CADDYFILE;await window.loadExistingCAs(u);const o=document.getElementById("manual-tailscale-status"),r=document.getElementById("manual-tailscale-only");try{const y=await(await fetch("/api/v1/tailscale/status")).json();y.success&&y.installed&&y.connected?(o.innerHTML=`
<span style="color: #4caf50;">\u2713 Connected</span>
<span style="color: var(--muted); margin-left: 6px;">${y.self?.hostname} (${y.self?.ip})</span>
`,r.disabled=!1):y.installed?(o.innerHTML='<span style="color: #ff9800;">\u26A0 Not connected</span>',r.disabled=!0):(o.innerHTML='<span style="color: var(--muted);">Not available</span>',r.disabled=!0)}catch{o.innerHTML='<span style="color: var(--muted);">Could not check</span>',r.disabled=!0}r.checked=!1,p()}function f(){const t=document.getElementById("service-type-local"),e=document.getElementById("service-type-external"),n=document.getElementById("local-service-config"),u=document.getElementById("external-service-config"),o=document.getElementById("tab-local"),r=document.getElementById("tab-external");function c(){t.checked?(n.style.display="grid",u.style.display="none",o&&(o.style.background="var(--accent)",o.style.color="var(--bg)"),r&&(r.style.background="transparent",r.style.color="var(--muted)")):(n.style.display="none",u.style.display="block",r&&(r.style.background="var(--accent)",r.style.color="var(--bg)"),o&&(o.style.background="transparent",o.style.color="var(--muted)"))}t?.addEventListener("change",c),e?.addEventListener("change",c)}function d(){const t=document.getElementById("service-name-input"),e=document.getElementById("service-subdomain-input"),n=document.getElementById("subdomain-preview");let u=!1;t?.addEventListener("input",()=>{const k=l(t.value);!u&&e&&(e.value=k),n&&(n.textContent=k?`\u2192 ${buildDomain(k)}`:""),p()}),e?.addEventListener("input",()=>{u=e.value!==l(t?.value||"");const k=e.value.trim()||l(t?.value||"");n&&(n.textContent=k?`\u2192 ${buildDomain(k)}`:""),p()});const o=document.getElementById("external-service-name"),r=document.getElementById("external-service-subdomain"),c=document.getElementById("external-subdomain-preview"),y=document.getElementById("external-domain-preview");let S=!1;o?.addEventListener("input",()=>{const k=l(o.value);!S&&r&&(r.value=k);const L=r?.value||k;c&&(c.textContent=L?`\u2192 ${buildDomain(L)}`:""),y&&(y.textContent=L?buildDomain(L):"")}),r?.addEventListener("input",()=>{S=r.value!==l(o?.value||"");const k=r.value.trim()||l(o?.value||"");c&&(c.textContent=k?`\u2192 ${buildDomain(k)}`:""),y&&(y.textContent=k?buildDomain(k):"")})}async function i(){const t=document.getElementById("external-service-name").value.trim(),e=document.getElementById("external-service-url").value.trim(),n=(document.getElementById("external-service-subdomain").value.trim()||l(t)).toLowerCase(),u=document.getElementById("external-service-logo").value.trim(),o=document.getElementById("external-service-icon").value.trim(),r=document.getElementById("external-create-dns").checked,c=document.getElementById("external-create-caddy").checked,y=document.getElementById("external-proxy-ip").value.trim()||SITE.dnsIp||"localhost",S=document.getElementById("external-preserve-host").checked,k=document.getElementById("external-follow-redirects").checked,L=document.getElementById("external-service-category")?.value||"";if(!t||!e){showNotification("Please fill in Name and External URL","warning");return}if(!n){showNotification("Could not derive subdomain from name. Please set one in Options.","warning");return}if(!e.startsWith("http://")&&!e.startsWith("https://")){showNotification("External URL must start with http:// or https://","warning");return}const x=buildDomain(n);try{const B={dns:null,caddy:null,dashboard:!1};if(r)if(window.getToken(getPrimaryDnsId(),"admin"))try{const P=await(await secureFetch("/api/v1/dns/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:x,ip:y,ttl:DC.DEFAULTS.TTL,server:SITE.dnsIp})})).json();B.dns=P.success?"created":P.error||"failed"}catch(I){B.dns=I.message}else B.dns="no admin token (configure in \u{1F511} Tokens)";if(c)try{const $={subdomain:n,externalUrl:e,preserveHost:S,followRedirects:k,sslType:"caddy-managed",caddyfilePath:DC.DEFAULTS.CADDYFILE,reloadCaddy:!0},P=await(await secureFetch("/api/v1/site/external",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify($)})).json();B.caddy=P.success?"created":P.error||"failed"}catch($){B.caddy=$.message}const A={id:n,name:t,url:`https://${x}`,externalUrl:e,logo:u||o||"\u{1F310}",isExternal:!0,isCustom:!0};L&&(A.category=L),window.APPS.push(A),B.dashboard=!0;const E=["plex","router","chat","sync","torrent","radarr","sonarr","prowlarr","portainer","requests","jellyfin","emby"],C=window.APPS.filter($=>!E.includes($.id));safeSet("custom-services",JSON.stringify(C));try{await secureFetch("/api/v1/services",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(window.APPS)})}catch($){console.warn("Failed to save to services.json:",$)}window.buildGrid(),window.refreshAll(),m();const T=[`External service "${t}" added!`];r&&T.push(`DNS: ${B.dns==="created"?"\u2713":"\u26A0 "+B.dns}`),c&&T.push(`Caddy: ${B.caddy==="created"?"\u2713":"\u26A0 "+B.caddy}`),T.push(`Access at: https://${x}`),showNotification(T.join(" | "),"success",6e3)}catch(B){console.error("Failed to create external service:",B),showNotification(`Failed to create external service: ${B.message}`,"error")}}function m(){closeModal("add-service-modal"),document.body.style.overflow="",document.getElementById("service-name-input").value="",document.getElementById("service-subdomain-input").value="",document.getElementById("service-port-input").value="",document.getElementById("service-ip-input").value=h.lan||"",document.getElementById("service-logo-input").value="",document.getElementById("dns-ttl-input").value=DC.DEFAULTS.TTL,document.getElementById("ssl-type-select").value=a(),document.getElementById("ca-name-input").value="",document.getElementById("enable-auth").checked=!1,document.getElementById("enable-cors").checked=!1,document.getElementById("custom-headers-input").value="",document.getElementById("upstream-path-input").value="/",document.getElementById("health-check-input").value="",document.getElementById("timeout-input").value="30";const t=document.getElementById("subdomain-preview");t&&(t.textContent="");const e=document.getElementById("external-subdomain-preview");e&&(e.textContent="");const n=document.getElementById("external-service-name");n&&(n.value="");const u=document.getElementById("external-service-subdomain");u&&(u.value="");const o=document.getElementById("external-service-url");o&&(o.value="");const r=document.getElementById("external-service-logo");r&&(r.value="");const c=document.getElementById("external-service-icon");c&&(c.value="");const y=document.getElementById("local-advanced-options");y&&y.removeAttribute("open");const S=document.getElementById("external-advanced-options");S&&S.removeAttribute("open");const k=document.getElementById("service-type-local");k&&(k.checked=!0);const L=document.getElementById("local-service-config"),x=document.getElementById("external-service-config");L&&(L.style.display="grid"),x&&(x.style.display="none");const B=document.getElementById("tab-local"),A=document.getElementById("tab-external");B&&(B.style.background="var(--accent)",B.style.color="var(--bg)"),A&&(A.style.background="transparent",A.style.color="var(--muted)")}async function w(){const t=document.getElementById("service-name-input").value.trim(),e=(document.getElementById("service-subdomain-input").value.trim()||l(t)).toLowerCase(),n=document.getElementById("service-port-input").value.trim(),u=document.getElementById("service-ip-input").value.trim(),o=document.getElementById("service-logo-input").value.trim(),r=document.getElementById("create-dns-record").checked,c=parseInt(document.getElementById("dns-ttl-input").value)||DC.DEFAULTS.TTL,y=document.getElementById("manual-tailscale-only")?.checked||!1,S=document.getElementById("ssl-type-select")?.value||"caddy-managed",k=document.getElementById("ca-name-input")?.value||"",L=document.getElementById("existing-ca-select")?.value||"",x=document.getElementById("enable-auth")?.checked||!1,B=document.getElementById("enable-cors")?.checked||!1,A=document.getElementById("custom-headers-input")?.value||"",E=document.getElementById("upstream-path-input")?.value||"/",C=document.getElementById("health-check-input")?.value||"",T=document.getElementById("timeout-input")?.value||30,I=(document.getElementById("service-category-input")||document.getElementById("external-service-category"))?.value||"",P=window.getToken(getPrimaryDnsId(),"admin");if(!t||!n||!u){showNotification("Please fill in Name, Port, and IP Address","warning");return}if(!e){showNotification("Could not derive subdomain from name. Please set one in Options.","warning");return}if(r&&!P){showNotification("DNS Admin token required. Configure it in the Tokens menu first.","warning");return}const D={dns:null,caddy:null,dashboard:!1};try{if(r)try{await window.createDnsRecord(e,u,c),D.dns="created"}catch(R){throw console.error("DNS creation failed:",R),D.dns=R.message,new Error(`DNS creation failed: ${R.message}`)}else D.dns="skipped";const O=window.generateCaddyConfig({subdomain:e,port:n,ip:u,sslType:S,caName:k,existingCa:L,enableAuth:x,enableCors:B,customHeaders:A,upstreamPath:E,healthCheck:C,timeout:T,tailscaleOnly:y});try{const U=await(await secureFetch("/api/v1/site",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:buildDomain(e),upstream:`${u}:${n}`,config:O})})).json();if(U.success)D.caddy="added & reloaded";else throw console.error("Caddy configuration failed:",U.error),D.caddy=U.error||"failed",new Error(`Caddy configuration failed: ${U.error}`)}catch(R){throw console.error("Caddy API error:",R),D.caddy=R.message,new Error(`Caddy API error: ${R.message}`)}const N={name:t,subdomain:e,port:n,ip:u,logo:o||`/assets/${e}.png`,tailscaleOnly:y||!1};I&&(N.category=I),await window.addServiceToConfig(N),D.dashboard=!0;const _=[`DNS: ${D.dns==="created"?"\u2713":D.dns==="skipped"?"\u25CB":"\u2717"}`,`Caddy: ${D.caddy==="added & reloaded"?"\u2713":"\u2717"}`,`Dashboard: ${D.dashboard?"\u2713":"\u2717"}`];showNotification(`Service "${t}" created! ${_.join(" | ")} \u2014 ${buildServiceUrl(e)}${y?" (Tailscale)":""}`,"success",6e3),m(),window.buildGrid(),window.refreshAll()}catch(O){console.error("Error creating service:",O),showNotification(`Error creating "${t}": ${O.message}`,"error",6e3)}}document.getElementById("add-service")?.addEventListener("click",v),document.getElementById("add-service-cancel")?.addEventListener("click",m),document.getElementById("add-service-create")?.addEventListener("click",()=>{document.querySelector('input[name="service-type"]:checked')?.value==="external"?i():w()}),f(),d(),g(),document.getElementById("ssl-type-select")?.addEventListener("change",t=>{const e=document.getElementById("existing-ca-config"),n=document.getElementById("custom-ca-config");e.style.display="none",n.style.display="none",t.target.value==="existing-ca"?e.style.display="block":t.target.value==="custom-ca"&&(n.style.display="block"),p()}),document.getElementById("refresh-cas")?.addEventListener("click",async()=>{const t=document.getElementById("refresh-cas"),e=t.textContent;t.textContent="\u231B Loading...",t.disabled=!0;try{const n=document.getElementById("caddyfile-path-input").value||DC.DEFAULTS.CADDYFILE;await window.loadExistingCAs(n),t.textContent="\u2705 Refreshed"}catch(n){t.textContent="\u274C Failed",console.error("Failed to refresh CAs:",n)}setTimeout(()=>{t.textContent=e,t.disabled=!1},2e3)}),document.getElementById("create-dns-record")?.addEventListener("change",t=>{const e=document.getElementById("dns-config");e.style.display=t.target.checked?"block":"none"}),["service-subdomain-input","service-ip-input","service-port-input","ca-name-input","existing-ca-select","enable-auth","enable-cors","custom-headers-input","upstream-path-input","health-check-input","timeout-input"].forEach(t=>{const e=document.getElementById(t);e&&(e.addEventListener("input",p),e.addEventListener("change",p))});function s(){const t=safeGet("custom-services");if(t)try{JSON.parse(t).forEach(n=>{window.APPS.find(u=>u.id===n.id)||window.APPS.push(n)})}catch(e){console.warn("Failed to load custom services:",e)}}s(),window.openAddServiceModal=v,window.closeAddServiceModal=m})(),(function(){let l=null,a=1e3;const p=3e4;let h=0,b=!1;function g(){if(l)try{l.close()}catch{}b||(l=new EventSource("/api/v1/events/stream"),l.addEventListener("connected",()=>{a=1e3,h=0,debug("[SSE] Connected to event stream")}),l.addEventListener("status-change",d=>{try{const i=JSON.parse(d.data);if(i.serviceId&&typeof window.setBadge=="function"){const m=i.status==="up"||i.status==="healthy";window.setBadge(i.serviceId,m,i.responseTime||null)}}catch{}}),l.addEventListener("resource-alert",d=>{try{const i=JSON.parse(d.data),m=`${i.containerName||i.containerId}: ${i.metric} at ${i.value}% (threshold: ${i.threshold}%)`;typeof showNotification=="function"&&showNotification(m,"warning")}catch{}}),l.addEventListener("auto-restart",d=>{try{const i=JSON.parse(d.data);typeof showNotification=="function"&&showNotification(`Container "${i.containerName}" was auto-restarted`,"info")}catch{}}),l.addEventListener("update-available",d=>{try{const i=JSON.parse(d.data),m=document.getElementById("updates-btn");if(m&&!m.querySelector(".sse-dot")){const w=document.createElement("span");w.className="sse-dot",w.style.cssText="display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--accent);margin-left:6px;vertical-align:middle;",m.appendChild(w)}typeof showNotification=="function"&&showNotification(`Update available for ${i.containerName||i.containerId}`,"info")}catch{}}),l.addEventListener("update-complete",d=>{try{const i=JSON.parse(d.data);typeof showNotification=="function"&&showNotification(`Update completed: ${i.containerName||i.containerId}`,"success"),typeof window.refreshAll=="function"&&window.refreshAll()}catch{}}),l.addEventListener("update-failed",d=>{try{const i=JSON.parse(d.data);typeof showNotification=="function"&&showNotification(`Update failed: ${i.containerName||i.containerId} \u2014 ${i.error||"unknown error"}`,"error")}catch{}}),l.addEventListener("incident",d=>{try{const i=JSON.parse(d.data);typeof showNotification=="function"&&(i.type==="created"?showNotification(`Incident: ${i.message||i.serviceId}`,"error"):i.type==="resolved"&&showNotification(`Resolved: ${i.serviceId||"incident"}`,"success"))}catch{}}),l.onerror=()=>{if(l.close(),window._dcAuthLost||b){console.warn("[SSE] Auth lost \u2014 stopping reconnection");return}if(h++,h>5){console.warn("[SSE] Max reconnect attempts reached \u2014 stopping (server unreachable)");return}console.warn(`[SSE] Disconnected, reconnecting in ${a/1e3}s...`),setTimeout(g,a),a=Math.min(a*2,p)})}function v(){if(b=!0,l)try{l.close()}catch{}}function f(){b=!1,h=0,a=1e3,g()}g(),window._sseReconnect=g,window._sseClose=v,window._sseResume=f})(),(function(){const l=document.getElementById("service-filter-search"),a=document.getElementById("service-filter-status"),p=document.getElementById("service-filter-category"),h=document.getElementById("service-filter-count");function b(){const d=new Set,i=new Set;document.querySelectorAll("#cards .card[data-category]").forEach(s=>{const t=s.dataset.category.trim();t&&i.add(t)});const m=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES||{};return Object.keys(m).concat([...i].filter(s=>!m[s])).forEach(s=>d.add(s)),{list:[...d],apiCats:m}}function g(){if(!p)return;const{list:d,apiCats:i}=b(),m=p.value;p.innerHTML='<option value="all">All Categories</option>',d.sort().forEach(w=>{const s=i[w],t=document.createElement("option");t.value=w,t.textContent=s?`${s.icon||""} ${w}`.trim():w,p.appendChild(t)}),m&&[...p.options].some(w=>w.value===m)?p.value=m:p.value="all"}function v(){g();const d=l.value.toLowerCase().trim(),i=a.value,m=p?p.value:"all",w=document.querySelectorAll("#cards .card");let s=0;if(w.forEach(t=>{const e=t.querySelector(".name")?.textContent?.toLowerCase()||"",n=t.dataset.app?.toLowerCase()||"",u=t.dataset.status||"off",o=t.dataset.category||"";(!d||e.includes(d)||n.includes(d))&&(i==="all"||u===i)&&(m==="all"||o===m)?(t.style.display="",s++):t.style.display="none"}),h){const t=w.length;h.textContent=`${s} of ${t} services`}}function f(d,i){let m;return function(...w){clearTimeout(m),m=setTimeout(()=>d.apply(this,w),i)}}l?.addEventListener("input",f(v,200)),a?.addEventListener("change",v),p?.addEventListener("change",v),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>setTimeout(v,500)):setTimeout(v,500),window.refreshServiceFilter=v,window.refreshCategoryDropdown=g})(),(function(){const l=document.getElementById("batch-operations-btn"),a=document.getElementById("batch-action-bar"),p=document.getElementById("batch-selected-count"),h=document.getElementById("batch-start-btn"),b=document.getElementById("batch-stop-btn"),g=document.getElementById("batch-restart-btn"),v=document.getElementById("batch-cancel-btn");let f=!1,d=new Set;function i(){f=!0,d.clear(),a.style.display="",l.textContent="\u2713 Exit Batch Mode",w(),document.querySelectorAll("#cards .card[data-app]").forEach(e=>{const n=e.dataset.containerId;if(!n)return;const u=e.querySelector(".batch-checkbox");u&&u.remove();const o=document.createElement("input");o.type="checkbox",o.className="batch-checkbox",o.dataset.containerId=n,o.dataset.serviceName=e.querySelector(".name")?.textContent||n,o.style.cssText="position: absolute; top: 8px; left: 8px; z-index: 10; width: 18px; height: 18px; cursor: pointer;",o.addEventListener("change",r=>{r.stopPropagation(),o.checked?d.add(n):d.delete(n),w()}),e.style.position="relative",e.insertBefore(o,e.firstChild)})}function m(){f=!1,d.clear(),a.style.display="none",l.textContent="\u2630 Batch Operations",document.querySelectorAll(".batch-checkbox").forEach(t=>t.remove())}function w(){const t=d.size;p.textContent=`${t} selected`,h.disabled=t===0,b.disabled=t===0,g.disabled=t===0}async function s(t){if(d.size===0)return;const e=Array.from(d),n={start:"Starting",stop:"Stopping",restart:"Restarting"}[t];if(!confirm(`${n} ${e.length} container(s)? This cannot be undone.`))return;const u=[h,b,g];u.forEach(y=>{y.disabled=!0,y.textContent="..."});let o=0,r=0;const c=[];for(const y of e)try{const S=await fetch(`/api/v1/containers/${encodeURIComponent(y)}/${t}`,{method:"POST"});if(S.ok)o++;else{r++;const k=await S.json().catch(()=>({}));c.push(`${y}: ${k.error||S.statusText}`)}}catch(S){r++,c.push(`${y}: ${S.message}`)}u[0].textContent="\u25B6 Start All",u[1].textContent="\u2B1B Stop All",u[2].textContent="\u{1F504} Restart All",w(),r===0?typeof showNotification=="function"&&showNotification(`${n} completed: ${o} container(s)`,"success"):(typeof showNotification=="function"&&showNotification(`${n}: ${o} succeeded, ${r} failed`,"warning"),console.error("Batch operation errors:",c)),setTimeout(()=>{typeof refreshAll=="function"&&refreshAll()},1500)}l?.addEventListener("click",()=>{f?m():i()}),h?.addEventListener("click",()=>s("start")),b?.addEventListener("click",()=>s("stop")),g?.addEventListener("click",()=>s("restart")),v?.addEventListener("click",m)})();
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBFcnJvciBIYW5kbGVyXG4gKiBIYW5kbGVzIGVycm9ycyBncmFjZWZ1bGx5IHdpdGhvdXQgYnJlYWtpbmcgdGhlIG9uYm9hcmRpbmcgdG91clxuICovXG5cbihmdW5jdGlvbih3aW5kb3cpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIEVycm9ySGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgdGhpcy5tYXhFcnJvcnMgPSA1MDsgLy8gS2VlcCBsYXN0IDUwIGVycm9yc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhbiBlcnJvciB3aXRob3V0IGJyZWFraW5nIHRoZSB0b3VyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHQgLSBDb250ZXh0IHdoZXJlIGVycm9yIG9jY3VycmVkXG4gICAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1ldGFkYXRhIC0gQWRkaXRpb25hbCBtZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ0Vycm9yKGNvbnRleHQsIGVycm9yLCBtZXRhZGF0YSA9IHt9KSB7XG4gICAgICBjb25zdCBlcnJvckVudHJ5ID0ge1xuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IG51bGwsXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgdG8gZXJyb3JzIGFycmF5XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yRW50cnkpO1xuXG4gICAgICAvLyBLZWVwIG9ubHkgbGFzdCBtYXhFcnJvcnNcbiAgICAgIGlmICh0aGlzLmVycm9ycy5sZW5ndGggPiB0aGlzLm1heEVycm9ycykge1xuICAgICAgICB0aGlzLmVycm9ycy5zaGlmdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgdG8gY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihgW09uYm9hcmRpbmcgRXJyb3JdICR7Y29udGV4dH06YCwgZXJyb3IsIG1ldGFkYXRhKTtcblxuICAgICAgLy8gT3B0aW9uYWxseSBzZW5kIHRvIGVycm9yIHRyYWNraW5nIHNlcnZpY2VcbiAgICAgIC8vIHRoaXMuc2VuZFRvRXJyb3JUcmFja2luZyhlcnJvckVudHJ5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBhbiBlcnJvciBhbmQgY29udGludWUgdG91clxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RlcCAtIEN1cnJlbnQgc3RlcCBpbmRleFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJlY292ZXJ5IGFjdGlvblxuICAgICAqL1xuICAgIHJlY292ZXJGcm9tRXJyb3IoZXJyb3IsIGN1cnJlbnRTdGVwKSB7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSB0aGlzLmNsYXNzaWZ5RXJyb3IoZXJyb3IpO1xuXG4gICAgICBzd2l0Y2ggKGVycm9yVHlwZSkge1xuICAgICAgICBjYXNlICdFTEVNRU5UX05PVF9GT1VORCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignRWxlbWVudCBOb3QgRm91bmQnLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICAgIGFjdGlvbjogJ1NLSVBfU1RFUCcsIFxuICAgICAgICAgICAgbmV4dFN0ZXA6IGN1cnJlbnRTdGVwICsgMSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUYXJnZXQgZWxlbWVudCBub3QgZm91bmQsIHNraXBwaW5nIHRvIG5leHQgc3RlcCdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ1NUT1JBR0VfVU5BVkFJTEFCTEUnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICBhY3Rpb246ICdVU0VfTUVNT1JZX1NUT1JBR0UnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0xvY2FsIHN0b3JhZ2UgdW5hdmFpbGFibGUsIHVzaW5nIGluLW1lbW9yeSBzdG9yYWdlJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnRFJJVkVSX05PVF9MT0FERUQnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ0RyaXZlci5qcyBOb3QgTG9hZGVkJywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdEcml2ZXIuanMgbGlicmFyeSBub3QgbG9hZGVkLCBjYW5ub3Qgc3RhcnQgdG91cidcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ0lOVkFMSURfVE9PTFRJUCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignSW52YWxpZCBUb29sdGlwIENvbmZpZ3VyYXRpb24nLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnU0tJUF9TVEVQJyxcbiAgICAgICAgICAgIG5leHRTdGVwOiBjdXJyZW50U3RlcCArIDEsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB0b29sdGlwIGNvbmZpZ3VyYXRpb24sIHNraXBwaW5nJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVGhlbWUgRGV0ZWN0aW9uIEZhaWxlZCcsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnVVNFX0RFRkFVTFRfVEhFTUUnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1VzaW5nIGRlZmF1bHQgZGFyayB0aGVtZSdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVW5rbm93biBFcnJvcicsIGVycm9yLCB7IGN1cnJlbnRTdGVwIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLCBhYm9ydGluZyB0b3VyJ1xuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xhc3NpZnkgZXJyb3IgdHlwZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBUaGUgZXJyb3Igb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ30gRXJyb3IgdHlwZVxuICAgICAqL1xuICAgIGNsYXNzaWZ5RXJyb3IoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8IGVycm9yLnRvU3RyaW5nKCk7XG5cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdlbGVtZW50JykgJiYgbWVzc2FnZS5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgcmV0dXJuICdFTEVNRU5UX05PVF9GT1VORCc7XG4gICAgICB9XG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcygnc3RvcmFnZScpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ3F1b3RhJykpIHtcbiAgICAgICAgcmV0dXJuICdTVE9SQUdFX1VOQVZBSUxBQkxFJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdkcml2ZXInKSB8fCBtZXNzYWdlLmluY2x1ZGVzKCd1bmRlZmluZWQnKSkge1xuICAgICAgICByZXR1cm4gJ0RSSVZFUl9OT1RfTE9BREVEJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkJykgfHwgbWVzc2FnZS5pbmNsdWRlcygndmFsaWRhdGlvbicpKSB7XG4gICAgICAgIHJldHVybiAnSU5WQUxJRF9UT09MVElQJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCd0aGVtZScpKSB7XG4gICAgICAgIHJldHVybiAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnVU5LTk9XTic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBsb2dnZWQgZXJyb3JzXG4gICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvZiBlcnJvciBlbnRyaWVzXG4gICAgICovXG4gICAgZ2V0RXJyb3JzKCkge1xuICAgICAgcmV0dXJuIFsuLi50aGlzLmVycm9yc107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIGxvZ2dlZCBlcnJvcnNcbiAgICAgKi9cbiAgICBjbGVhckVycm9ycygpIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGVycm9yIHN0YXRpc3RpY3NcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBFcnJvciBzdGF0aXN0aWNzXG4gICAgICovXG4gICAgZ2V0U3RhdGlzdGljcygpIHtcbiAgICAgIGNvbnN0IHN0YXRzID0ge1xuICAgICAgICB0b3RhbDogdGhpcy5lcnJvcnMubGVuZ3RoLFxuICAgICAgICBieUNvbnRleHQ6IHt9LFxuICAgICAgICBieVR5cGU6IHt9LFxuICAgICAgICByZWNlbnQ6IHRoaXMuZXJyb3JzLnNsaWNlKC0xMClcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZXJyb3JzLmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICAvLyBDb3VudCBieSBjb250ZXh0XG4gICAgICAgIHN0YXRzLmJ5Q29udGV4dFtlcnJvci5jb250ZXh0XSA9IChzdGF0cy5ieUNvbnRleHRbZXJyb3IuY29udGV4dF0gfHwgMCkgKyAxO1xuXG4gICAgICAgIC8vIENvdW50IGJ5IHR5cGVcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY2xhc3NpZnlFcnJvcih7IG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICAgIHN0YXRzLmJ5VHlwZVt0eXBlXSA9IChzdGF0cy5ieVR5cGVbdHlwZV0gfHwgMCkgKyAxO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzdGF0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZ3JhY2VmdWwgZGVncmFkYXRpb24gd2hlbiBEcml2ZXIuanMgZmFpbHMgdG8gbG9hZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGZhbGxiYWNrIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgaGFuZGxlRHJpdmVyTG9hZEZhaWx1cmUoKSB7XG4gICAgICB0aGlzLmxvZ0Vycm9yKCdEcml2ZXIuanMgTG9hZCBGYWlsdXJlJywgJ0RyaXZlci5qcyBsaWJyYXJ5IGZhaWxlZCB0byBsb2FkJyk7XG5cbiAgICAgIC8vIFNob3cgZmFsbGJhY2sgbWVzc2FnZVxuICAgICAgY29uc3QgZmFsbGJhY2tNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaWQgPSAnb25ib2FyZGluZy1mYWxsYmFjayc7XG4gICAgICBmYWxsYmFja01lc3NhZ2Uuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBib3R0b206IDIwcHg7XG4gICAgICAgIHJpZ2h0OiAyMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMyYTJhMmEpO1xuICAgICAgICBjb2xvcjogdmFyKC0tZmcsICNmZmZmZmYpO1xuICAgICAgICBwYWRkaW5nOiAxNXB4IDIwcHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMyk7XG4gICAgICAgIHotaW5kZXg6IDk5OTk7XG4gICAgICAgIG1heC13aWR0aDogMzAwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIGA7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaW5uZXJIVE1MID0gYFxuICAgICAgICA8c3Ryb25nPldlbGNvbWUgdG8gRGFzaENhZGR5ITwvc3Ryb25nPjxicj5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDEwcHggMCAwIDA7IGZvbnQtc2l6ZTogMTJweDtcIj5cbiAgICAgICAgICBUaGUgaW50ZXJhY3RpdmUgdG91ciBpcyB1bmF2YWlsYWJsZSwgYnV0IHlvdSBjYW4gZXhwbG9yZSB0aGUgZGFzaGJvYXJkIGZyZWVseS5cbiAgICAgICAgICBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgaGVscCBnZXR0aW5nIHN0YXJ0ZWQuXG4gICAgICAgIDwvcD5cbiAgICAgIGA7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZmFsbGJhY2tNZXNzYWdlKTtcblxuICAgICAgLy8gQXV0by1yZW1vdmUgYWZ0ZXIgMTAgc2Vjb25kc1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChmYWxsYmFja01lc3NhZ2UucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGZhbGxiYWNrTWVzc2FnZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZhbGxiYWNrTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIDEwMDAwKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHN0b3JhZ2UgdW5hdmFpbGFibGUgc2NlbmFyaW9cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBJbi1tZW1vcnkgc3RvcmFnZSBmYWxsYmFja1xuICAgICAqL1xuICAgIGhhbmRsZVN0b3JhZ2VVbmF2YWlsYWJsZSgpIHtcbiAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCAnTG9jYWwgc3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlJyk7XG5cbiAgICAgIC8vIENyZWF0ZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgICAgY29uc3QgbWVtb3J5U3RvcmFnZSA9IHtcbiAgICAgICAgZGF0YToge30sXG4gICAgICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuZGF0YVtrZXldO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhcigpIHtcbiAgICAgICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc29sZS53YXJuKCdbRXJyb3JIYW5kbGVyXSBVc2luZyBpbi1tZW1vcnkgc3RvcmFnZSAtIHByb2dyZXNzIHdpbGwgbm90IHBlcnNpc3QnKTtcbiAgICAgIHJldHVybiBtZW1vcnlTdG9yYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgZXJyb3IgdG8gdHJhY2tpbmcgc2VydmljZSAocGxhY2Vob2xkZXIpXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JFbnRyeSAtIEVycm9yIGVudHJ5IHRvIHNlbmRcbiAgICAgKi9cbiAgICBzZW5kVG9FcnJvclRyYWNraW5nKGVycm9yRW50cnkpIHtcbiAgICAgIC8vIFBsYWNlaG9sZGVyIGZvciBlcnJvciB0cmFja2luZyBpbnRlZ3JhdGlvblxuICAgICAgLy8gQ291bGQgaW50ZWdyYXRlIHdpdGggU2VudHJ5LCBMb2dSb2NrZXQsIGV0Yy5cbiAgICAgIC8vIEV4YW1wbGU6XG4gICAgICAvLyBpZiAod2luZG93LlNlbnRyeSkge1xuICAgICAgLy8gICBTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihuZXcgRXJyb3IoZXJyb3JFbnRyeS5tZXNzYWdlKSwge1xuICAgICAgLy8gICAgIGV4dHJhOiBlcnJvckVudHJ5Lm1ldGFkYXRhXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIHdpbmRvdy5FcnJvckhhbmRsZXIgPSBFcnJvckhhbmRsZXI7XG4gIGNvbnNvbGUubG9nKCdbRXJyb3JIYW5kbGVyXSBNb2R1bGUgbG9hZGVkJyk7XG5cbn0pKHdpbmRvdyk7XG47XG4vLyA9PT09PSBEQVNIQk9BUkQgQ09OU1RBTlRTID09PT09XG4vLyBIb25vciBwZXJzaXN0ZWQgaGVhbHRoIHJldGVudGlvbiBzZXR0aW5ncyBmb3IgcG9sbGluZyBjYWRlbmNlcyBzbyB0aGVcbi8vIFNldHRpbmdzIFx1MjE5MiBIZWFsdGggXHUyMTkyIEdsb2JhbCBTZXR0aW5ncyBwYW5lbCBhY3R1YWxseSB0YWtlcyBlZmZlY3QuIFRoZVxuLy8gU1RBVFMgaW50ZXJ2YWwgKHJlc291cmNlL2NvbnRhaW5lciBzdGF0IHNhbXBsaW5nKSBpcyBkcml2ZW4gZnJvbSB0aGVcbi8vIHVzZXItY29uZmlndXJhYmxlIHN0YXRzUG9sbGluZ0ludGVydmFsLiBIRUFMVEggaXMgdGhlIGxpZ2h0d2VpZ2h0IGNhcmRcbi8vIGJhZGdlIHJlZnJlc2ggYW5kIHN0YXlzIGF0IGl0cyBmYXN0IGRlZmF1bHQgdW5sZXNzIG92ZXJyaWRkZW4uXG4oZnVuY3Rpb24gYXBwbHlIZWFsdGhQb2xsaW5nU2V0dGluZ3MoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHJhdyA9ICh0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJyAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaGNhZGR5LWhlYWx0aC1zZXR0aW5ncycpKSB8fCBudWxsO1xuICAgIGlmIChyYXcpIHtcbiAgICAgIHZhciBzID0gSlNPTi5wYXJzZShyYXcpO1xuICAgICAgLy8gdmFsdWVzIGFyZSBzdG9yZWQgaW4gc2Vjb25kczsgREMuUE9MTCBleHBlY3RzIG1pbGxpc2Vjb25kc1xuICAgICAgaWYgKHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgJiYgcy5zdGF0c1BvbGxpbmdJbnRlcnZhbCA+PSA1ICYmIHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgPD0gMzYwMCkge1xuICAgICAgICB3aW5kb3cuX19EQ19TVEFUU19PVkVSUklERSA9IHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgKiAxMDAwO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgXHUyMDE0IGZhbGwgYmFjayB0byBkZWZhdWx0cyBiZWxvdyAqLyB9XG59KSgpO1xuXG5jb25zdCBEQyA9IHtcbiAgTkFNRTogJ0Rhc2hDYWRkeScsXG4gIFBPTEw6IHtcbiAgICBEQVNIQk9BUkQ6ICAxMDAwMCwgICAvLyAxMHMgXHUyMDE0IG1haW4gcmVmcmVzaEFsbCBpbnRlcnZhbFxuICAgIExPR1M6ICAgICAgIDMwMDAsICAgIC8vIDNzICBcdTIwMTQgbG9nIHZpZXdlciB1cGRhdGVzXG4gICAgU1RBVFM6ICAgICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5fX0RDX1NUQVRTX09WRVJSSURFKSB8fCA1MDAwLCAgIC8vIDVzIGRlZmF1bHQgXHUyMDE0IHJlc291cmNlIG1vbml0b3IgcmVmcmVzaCAob3ZlcnJpZGFibGUgdmlhIFNldHRpbmdzIFx1MjE5MiBIZWFsdGgpXG4gICAgV0VBVEhFUjogICAgNjAwMDAwLCAgLy8gMTBtIFx1MjAxNCB3ZWF0aGVyIHdpZGdldCByZWZyZXNoXG4gICAgQ0FMRU5EQVI6ICAgMzAwMDAwLCAgLy8gNW0gXHUyMDE0IGNhbGVuZGFyIHdpZGdldCByZWZyZXNoIChEQy0xNjEpXG4gICAgSEVBTFRIOiAgICAgMTAwMCwgICAgLy8gMXMgIFx1MjAxNCBjYXJkIGhlYWx0aCBiYWRnZSByZWZyZXNoXG4gICAgREVQTE9ZX1NTTDogNTAwMCwgICAgLy8gNXMgIFx1MjAxNCBTU0wgY2VydCBjaGVjayBkdXJpbmcgZGVwbG95XG4gIH0sXG4gIERFTEFZUzoge1xuICAgIEJUTl9SRVNFVDogIDIwMDAsICAgIC8vIEJ1dHRvbiB0ZXh0IHJlc2V0IGFmdGVyIGFjdGlvblxuICAgIFJFTE9BRDogICAgIDUwMDAsICAgIC8vIFBhZ2UgcmVsb2FkIGFmdGVyIHJlc3RhcnRcbiAgICBNT0RBTF9DTE9TRTogNTAwLCAgICAvLyBNb2RhbCBjbG9zZSBhbmltYXRpb25cbiAgICBQT1JUX0NIRUNLOiA1MDAsICAgICAvLyBEZWJvdW5jZSBmb3IgcG9ydCBhdmFpbGFiaWxpdHkgY2hlY2tcbiAgICBERVBMT1lfSU5JVDogMzAwMCwgICAvLyBJbml0aWFsIGRlcGxveSBjZXJ0IGNoZWNrIGRlbGF5XG4gIH0sXG4gIERFRkFVTFRTOiB7XG4gICAgRE5TX1BPUlQ6ICAgICc1MzgwJyxcbiAgICBTRVJWSUNFX1BPUlQ6ICc4MDgwJyxcbiAgICBUVEw6ICAgICAgICAgMzAwLFxuICAgIENBRERZRklMRTogICAnQzpcXFxcY2FkZHlcXFxcQ2FkZHlmaWxlJyxcbiAgfSxcbn07XG5cbi8vIEVycm9yIGhhbmRsZXIgZm9yIHRyYWNraW5nIGlzc3Vlc1xuY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuXG4vLyA9PT09PSBHTE9CQUwgU0lURSBDT05GSUcgKGxvYWRlZCBmcm9tIHNlcnZlciwgY2FjaGVkIGluIGxvY2FsU3RvcmFnZSkgPT09PT1cbi8vIE9ubHkgbm9uLXNlbnNpdGl2ZSBkaXNwbGF5IHByZWZlcmVuY2VzIGFyZSBjYWNoZWQ7IEROUyBJUHMvdG9wb2xvZ3kgYXJlIGZldGNoZWQgZnJvbSBBUElcbmNvbnN0IF9jYWNoZWRDZmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkYXNoY2FkZHlfc2l0ZV9jb25maWcnKSB8fCAnbnVsbCcpO1xuY29uc3QgU0lURSA9IHtcbiAgdGxkOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLnRsZCkgfHwgJy5ob21lJyxcbiAgZG5zSXA6ICcnLFxuICBkbnNQb3J0OiBEQy5ERUZBVUxUUy5ETlNfUE9SVCxcbiAgZG5zU2VydmVyczoge30sXG4gIGNvbmZpZ3VyYXRpb25UeXBlOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLmNvbmZpZ3VyYXRpb25UeXBlKSB8fCAnaG9tZWxhYicsXG4gIGRvbWFpbjogKF9jYWNoZWRDZmcgJiYgX2NhY2hlZENmZy5kb21haW4pIHx8ICcnLFxuICBkZWZhdWx0czogKF9jYWNoZWRDZmcgJiYgX2NhY2hlZENmZy5kZWZhdWx0cykgfHwge30sXG4gIHJvdXRpbmdNb2RlOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLnJvdXRpbmdNb2RlKSB8fCAnc3ViZG9tYWluJyxcbiAgb25ib2FyZGluZ0NvbXBsZXRlZDogZmFsc2Vcbn07XG53aW5kb3cuX19kYXNoY2FkZHlTaXRlQ29uZmlnTG9hZGVkID0gKGFzeW5jIGZ1bmN0aW9uIGxvYWRTaXRlQ29uZmlnKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICBpZiAoci5vaykge1xuICAgICAgY29uc3QgYyA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKGMudGxkKSBTSVRFLnRsZCA9IGMudGxkLnN0YXJ0c1dpdGgoJy4nKSA/IGMudGxkIDogJy4nICsgYy50bGQ7XG4gICAgICBpZiAoYy5kbnMpIHtcbiAgICAgICAgU0lURS5kbnNJcCA9IGMuZG5zLmlwIHx8ICcnO1xuICAgICAgICBTSVRFLmRuc1BvcnQgPSBjLmRucy5wb3J0IHx8IERDLkRFRkFVTFRTLkROU19QT1JUO1xuICAgICAgfVxuICAgICAgaWYgKGMuZG5zU2VydmVycyAmJiB0eXBlb2YgYy5kbnNTZXJ2ZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhjLmRuc1NlcnZlcnMpKSB7XG4gICAgICAgICAgaWYgKGsgIT09ICdfX3Byb3RvX18nICYmIGsgIT09ICdjb25zdHJ1Y3RvcicgJiYgayAhPT0gJ3Byb3RvdHlwZScpIFNJVEUuZG5zU2VydmVyc1trXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjLmNvbmZpZ3VyYXRpb25UeXBlKSBTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID0gYy5jb25maWd1cmF0aW9uVHlwZTtcbiAgICAgIGlmIChjLmRvbWFpbikgU0lURS5kb21haW4gPSBjLmRvbWFpbjtcbiAgICAgIGlmIChjLmRlZmF1bHRzKSBTSVRFLmRlZmF1bHRzID0gYy5kZWZhdWx0cztcbiAgICAgIGlmIChjLnJvdXRpbmdNb2RlKSBTSVRFLnJvdXRpbmdNb2RlID0gYy5yb3V0aW5nTW9kZTtcbiAgICAgIFNJVEUub25ib2FyZGluZ0NvbXBsZXRlZCA9IGMub25ib2FyZGluZ0NvbXBsZXRlZCA9PT0gdHJ1ZTtcbiAgICAgIC8vIENhY2hlIG9ubHkgbm9uLXNlbnNpdGl2ZSBkaXNwbGF5IGNvbmZpZyAoVExELCBkb21haW4sIHJvdXRpbmcgbW9kZSlcbiAgICAgIC8vIEROUyBJUHMgYW5kIHNlcnZlciB0b3BvbG9neSBhcmUgTk9UIGNhY2hlZCBcdTIwMTQgZmV0Y2hlZCBmcm9tIEFQSSBlYWNoIGxvYWRcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdkYXNoY2FkZHlfc2l0ZV9jb25maWcnLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRsZDogU0lURS50bGQsIGNvbmZpZ3VyYXRpb25UeXBlOiBTSVRFLmNvbmZpZ3VyYXRpb25UeXBlLFxuICAgICAgICBkb21haW46IFNJVEUuZG9tYWluLCByb3V0aW5nTW9kZTogU0lURS5yb3V0aW5nTW9kZVxuICAgICAgfSkpO1xuICAgICAgLy8gUmVuZGVyIEROUyBjYXJkcyBkeW5hbWljYWxseSBiYXNlZCBvbiBjb25maWd1cmVkIHNlcnZlcnNcbiAgICAgIHJlbmRlckRuc0NhcmRzKCk7XG4gICAgICAvLyBIaWRlIFRva2VucyBidXR0b24gaWYgbm8gRE5TIHNlcnZlcnMgY29uZmlndXJlZFxuICAgICAgY29uc3QgdG9rZW5zQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS10b2tlbnMnKTtcbiAgICAgIGlmICh0b2tlbnNCdG4pIHRva2Vuc0J0bi5zdHlsZS5kaXNwbGF5ID0gT2JqZWN0LmtleXMoU0lURS5kbnNTZXJ2ZXJzKS5sZW5ndGggPyAnJyA6ICdub25lJztcbiAgICB9XG4gIH0gY2F0Y2ggKF8pIHt9XG4gIC8vIFVwZGF0ZSBzdGF0aWMgSFRNTCBlbGVtZW50cyB3aXRoIGNvbmZpZ3VyZWQgVExEXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRsZF0nKS5mb3JFYWNoKGVsID0+IGVsLnRleHRDb250ZW50ID0gU0lURS50bGQpO1xuICBjb25zdCB0bGRTdWZmaXggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC10bGQtc3VmZml4Jyk7XG4gIGlmICh0bGRTdWZmaXgpIHRsZFN1ZmZpeC50ZXh0Q29udGVudCA9IFNJVEUudGxkO1xuICBjb25zdCBwcm94eUlwSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtcHJveHktaXAnKTtcbiAgaWYgKHByb3h5SXBJbnB1dCAmJiBTSVRFLmRuc0lwKSB7IHByb3h5SXBJbnB1dC52YWx1ZSA9IFNJVEUuZG5zSXA7IHByb3h5SXBJbnB1dC5wbGFjZWhvbGRlciA9IFNJVEUuZG5zSXA7IH1cbn0pKCk7XG5mdW5jdGlvbiBidWlsZERvbWFpbihzdWIpIHsgcmV0dXJuIHN1YiArIFNJVEUudGxkOyB9XG5mdW5jdGlvbiBidWlsZFNlcnZpY2VVcmwoc3ViKSB7XG4gIGlmIChTSVRFLnJvdXRpbmdNb2RlID09PSAnc3ViZGlyZWN0b3J5JyAmJiBTSVRFLmRvbWFpbikgcmV0dXJuICdodHRwczovLycgKyBTSVRFLmRvbWFpbiArICcvJyArIHN1YjtcbiAgaWYgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnICYmIFNJVEUuZG9tYWluKSByZXR1cm4gJ2h0dHBzOi8vJyArIHN1YiArICcuJyArIFNJVEUuZG9tYWluO1xuICByZXR1cm4gJ2h0dHBzOi8vJyArIGJ1aWxkRG9tYWluKHN1Yik7XG59XG5mdW5jdGlvbiBnZXREbnNTZXJ2ZXJBZGRyKGRuc0lkKSB7XG4gIGNvbnN0IHMgPSBTSVRFLmRuc1NlcnZlcnNbZG5zSWRdO1xuICByZXR1cm4gcyA/IGAke3MuaXB9OiR7cy5wb3J0fWAgOiBidWlsZERvbWFpbihkbnNJZCk7XG59XG4vKiogR2V0IHRoZSBETlMgSUQgd2hvc2UgSVAgbWF0Y2hlcyB0aGUgcHJpbWFyeSBETlMgY29uZmlnIChkbnMuaXApICovXG5mdW5jdGlvbiBnZXRQcmltYXJ5RG5zSWQoKSB7XG4gIGlmICghU0lURS5kbnNJcCkgcmV0dXJuIG51bGw7XG4gIGZvciAoY29uc3QgW2lkLCBpbmZvXSBvZiBPYmplY3QuZW50cmllcyhTSVRFLmRuc1NlcnZlcnMpKSB7XG4gICAgaWYgKGluZm8uaXAgPT09IFNJVEUuZG5zSXApIHJldHVybiBpZDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gPT09PT0gRFlOQU1JQyBETlMgQ0FSRCBSRU5ERVJFUiA9PT09PVxuZnVuY3Rpb24gcmVuZGVyRG5zQ2FyZHMoKSB7XG4gIGNvbnN0IHRvcFJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKTtcbiAgaWYgKCF0b3BSb3cpIHJldHVybjtcbiAgY29uc3QgZG5zSWRzID0gT2JqZWN0LmtleXMoU0lURS5kbnNTZXJ2ZXJzKTtcbiAgaWYgKCFkbnNJZHMubGVuZ3RoKSByZXR1cm47IC8vIE5vIEROUyBzZXJ2ZXJzIGNvbmZpZ3VyZWQgXHUyMDE0IHNob3cgbm90aGluZ1xuXG4gIGNvbnN0IHN2Z0ljb24gPSAnPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3M9XCJzZXJ2aWNlLWljb25cIj4nXG4gICAgKyAnPHJlY3QgeD1cIjNcIiB5PVwiNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxNlwiIHJ4PVwiMlwiIGZpbGw9XCIjMzQ0OTVlXCIvPidcbiAgICArICc8cmVjdCB4PVwiNVwiIHk9XCI2XCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjJcIiByeD1cIjFcIiBmaWxsPVwiIzM0OThkYlwiLz4nXG4gICAgKyAnPHJlY3QgeD1cIjVcIiB5PVwiOVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxXCIgZmlsbD1cIiNlY2YwZjFcIi8+J1xuICAgICsgJzxyZWN0IHg9XCI1XCIgeT1cIjExXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjFcIiBmaWxsPVwiI2VjZjBmMVwiLz4nXG4gICAgKyAnPHJlY3QgeD1cIjVcIiB5PVwiMTNcIiB3aWR0aD1cIjhcIiBoZWlnaHQ9XCIxXCIgZmlsbD1cIiNlY2YwZjFcIi8+J1xuICAgICsgJzxyZWN0IHg9XCI1XCIgeT1cIjE1XCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjFcIiBmaWxsPVwiI2VjZjBmMVwiLz4nXG4gICAgKyAnPGNpcmNsZSBjeD1cIjE3XCIgY3k9XCIxMVwiIHI9XCIyXCIgZmlsbD1cIiNlNzRjM2NcIi8+J1xuICAgICsgJzxwYXRoIGQ9XCJNMTcgOXY0TTE1IDExaDRcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjFcIi8+PC9zdmc+JztcblxuICBjb25zdCBmaXJzdENoaWxkID0gdG9wUm93LmZpcnN0RWxlbWVudENoaWxkO1xuICBkbnNJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgY29uc3Qgc2FmZUlkID0gZXNjYXBlSHRtbChpZCk7XG4gICAgY29uc3QgbGFiZWwgPSBlc2NhcGVIdG1sKChTSVRFLmRuc1NlcnZlcnNbaWRdLm5hbWUgfHwgaWQpLnRvVXBwZXJDYXNlKCkpO1xuICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjYXJkLmNsYXNzTmFtZSA9ICdjYXJkJztcbiAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHAnLCBpZCk7XG4gICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgJ29mZicpO1xuICAgIGNhcmQuaW5uZXJIVE1MID1cbiAgICAgIGA8c3BhbiBpZD1cIiR7c2FmZUlkfS1kb3RcIiBjbGFzcz1cImRvdCBiYWQgYXQtYmxcIj48L3NwYW4+YFxuICAgICAgKyBgPGRpdiBjbGFzcz1cInJvd1wiPjxkaXYgY2xhc3M9XCJsb2dvLXdyYXBcIj4ke3N2Z0ljb259PC9kaXY+YFxuICAgICAgKyBgPHNwYW4gY2xhc3M9XCJuYW1lXCI+JHtsYWJlbH08L3NwYW4+PHNwYW4gY2xhc3M9XCJzcGFjZXJcIj48L3NwYW4+YFxuICAgICAgKyBgPHNwYW4gaWQ9XCIke3NhZmVJZH0tcGlsbFwiIGNsYXNzPVwiYmFkZ2Ugb2ZmXCIgZGF0YS1pMThuLWxpdmUtc3RhdHVzPVwiYmluYXJ5XCI+T0ZGPC9zcGFuPjwvZGl2PmBcbiAgICAgICsgYDxkaXYgY2xhc3M9XCJyZXNwb25zZS1yb3dcIj48c3BhbiBpZD1cIiR7c2FmZUlkfS10aW1lXCIgY2xhc3M9XCJyZXNwb25zZS10aW1lXCI+LS08L3NwYW4+PC9kaXY+YFxuICAgICAgKyBgPGRpdiBjbGFzcz1cImhlYWx0aC1yb3dcIiBpZD1cImhlYWx0aC0ke3NhZmVJZH1cIj48c3BhbiBpZD1cInVwdGltZS0ke3NhZmVJZH1cIiBjbGFzcz1cInVwdGltZS1jaGlwXCI+LS08L3NwYW4+PGRpdiBjbGFzcz1cInVwdGltZS1taW5pLWJhclwiPjxkaXYgY2xhc3M9XCJmaWxsXCIgaWQ9XCJ1cHRpbWUtYmFyLSR7c2FmZUlkfVwiIHN0eWxlPVwid2lkdGg6IDAlXCI+PC9kaXY+PC9kaXY+PC9kaXY+YFxuICAgICAgKyBgPGRpdiBjbGFzcz1cImJ0bi1yb3dcIj5gXG4gICAgICArIGA8YnV0dG9uIGlkPVwiJHtzYWZlSWR9LXJlc3RhcnRcIiBjbGFzcz1cInJlc3RhcnQtYnRuXCIgZGF0YS1pMThuPVwiYWN0aW9uLnJlc3RhcnRcIj5SZXN0YXJ0PC9idXR0b24+YFxuICAgICAgKyBgPGJ1dHRvbiBpZD1cIiR7c2FmZUlkfS11cGRhdGVcIiBjbGFzcz1cInVwZGF0ZS1idG5cIiB0aXRsZT1cIlVwZGF0ZSBETlMgc2VydmVyXCI+XHUyQjA2XHVGRTBGPC9idXR0b24+YFxuICAgICAgKyBgPGJ1dHRvbiBpZD1cIiR7c2FmZUlkfS1vcGVuXCIgZGF0YS1pMThuPVwiYWN0aW9uLm9wZW5cIj5PcGVuPC9idXR0b24+YFxuICAgICAgKyBgPGJ1dHRvbiBpZD1cIiR7c2FmZUlkfS1sb2dzXCIgY2xhc3M9XCJsb2dzLWJ0blwiIGRhdGEtaTE4bj1cImFjdGlvbi5sb2dzXCI+TG9nczwvYnV0dG9uPmBcbiAgICAgICsgYDxidXR0b24gaWQ9XCIke3NhZmVJZH0tc2V0dGluZ3NcIiBjbGFzcz1cInNldHRpbmdzLWJ0blwiPlx1MjY5OVx1RkUwRjwvYnV0dG9uPmBcbiAgICAgICsgYDwvZGl2PmA7XG4gICAgdG9wUm93Lmluc2VydEJlZm9yZShjYXJkLCBmaXJzdENoaWxkKTtcbiAgfSk7XG4gIGlmICh3aW5kb3cuRENJMThuICYmIHdpbmRvdy5EQ0kxOG4uaXNMb2FkZWQoKSkge1xuICAgIHdpbmRvdy5EQ0kxOG4uYXBwbHlUcmFuc2xhdGlvbnMoKTtcbiAgfVxufVxud2luZG93LnJlbmRlckRuc0NhcmRzID0gcmVuZGVyRG5zQ2FyZHM7XG5cbi8vID09PT09IENTUkYgUFJPVEVDVElPTiA9PT09PVxubGV0IGNzcmZUb2tlbiA9IG51bGw7XG5cbi8qKlxuICogR2V0IENTUkYgdG9rZW4gZnJvbSBzZXJ2ZXIgKGNhY2hlZClcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IENTUkYgdG9rZW5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q1NSRlRva2VuKCkge1xuICBpZiAoY3NyZlRva2VuKSByZXR1cm4gY3NyZlRva2VuO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jc3JmLXRva2VuJyk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggQ1NSRiB0b2tlbicpO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGNzcmZUb2tlbiA9IGRhdGEudG9rZW47XG4gICAgcmV0dXJuIGNzcmZUb2tlbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tDU1JGXSBHZXQgVG9rZW4nLCBlcnJvciwgeyBmdW5jdGlvbjogJ2dldENTUkZUb2tlbicgfSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWN1cmUgZmV0Y2ggd3JhcHBlciB0aGF0IGF1dG9tYXRpY2FsbHkgYWRkcyBDU1JGIHRva2VuIHRvIHN0YXRlLWNoYW5naW5nIHJlcXVlc3RzLlxuICogSWYgdGhlIHNlcnZlciByZXR1cm5zIGEgQ1NSRiBlcnJvciAoNDAzIHdpdGggREMtMTAwL0RDLTEwMSksIGF1dG9tYXRpY2FsbHlcbiAqIHJlZnJlc2hlcyB0aGUgdG9rZW4gYW5kIHJldHJpZXMgb25jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBVUkwgdG8gZmV0Y2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gRmV0Y2ggb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8UmVzcG9uc2U+fSBGZXRjaCByZXNwb25zZVxuICovXG5hc3luYyBmdW5jdGlvbiBzZWN1cmVGZXRjaCh1cmwsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBtZXRob2QgPSAob3B0aW9ucy5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gIGNvbnN0IG5lZWRzQ3NyZiA9ICFbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnXS5pbmNsdWRlcyhtZXRob2QpO1xuXG4gIGlmIChuZWVkc0NzcmYpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRDU1JGVG9rZW4oKTtcbiAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAnWC1DU1JGLVRva2VuJzogdG9rZW5cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW0NTUkZdIEFkZCB0byBSZXF1ZXN0JywgZXJyb3IsIHsgZnVuY3Rpb246ICdzZWN1cmVGZXRjaCcgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVmYXVsdCAxNXMgdGltZW91dCBpZiBubyBzaWduYWwgcHJvdmlkZWQgKHByZXZlbnRzIGhhbmdpbmcgcmVxdWVzdHMpXG4gIGlmICghb3B0aW9ucy5zaWduYWwpIHtcbiAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTUwMDApIH07XG4gIH1cblxuICBvcHRpb25zLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCAnc2FtZS1vcmlnaW4nO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG5cbiAgLy8gQXV0by1yZXRyeSBvbmNlIG9uIENTUkYgZmFpbHVyZSAodG9rZW4gbWF5IGhhdmUgYmVlbiByb3RhdGVkIGJ5IFRPVFAgcmUtYXV0aClcbiAgaWYgKG5lZWRzQ3NyZiAmJiByZXNwb25zZS5zdGF0dXMgPT09IDQwMykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UuY2xvbmUoKS5qc29uKCk7XG4gICAgICBpZiAoYm9keS5lcnJvciAmJiAoYm9keS5lcnJvci5pbmNsdWRlcygnREMtMTAwJykgfHwgYm9keS5lcnJvci5pbmNsdWRlcygnREMtMTAxJykpKSB7XG4gICAgICAgIGNzcmZUb2tlbiA9IG51bGw7IC8vIENsZWFyIGNhY2hlZCB0b2tlblxuICAgICAgICBjb25zdCBmcmVzaFRva2VuID0gYXdhaXQgZ2V0Q1NSRlRva2VuKCk7XG4gICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHsgLi4ub3B0aW9ucy5oZWFkZXJzLCAnWC1DU1JGLVRva2VuJzogZnJlc2hUb2tlbiB9O1xuICAgICAgICAvLyBOZXcgc2lnbmFsIGZvciByZXRyeSAob2xkIG9uZSBtYXkgaGF2ZSBiZWVuIGNvbnN1bWVkKVxuICAgICAgICBvcHRpb25zLnNpZ25hbCA9IEFib3J0U2lnbmFsLnRpbWVvdXQoMTUwMDApO1xuICAgICAgICByZXR1cm4gZmV0Y2godXJsLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAvLyBJZiBjbG9uZS9qc29uIGZhaWxzLCByZXR1cm4gb3JpZ2luYWwgcmVzcG9uc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8vID09PT09IEFQSSBDQUxMIEhFTFBFUlMgPT09PT1cblxuLyoqIFBPU1QgSlNPTiBhbmQgcmV0dXJuIHBhcnNlZCByZXNwb25zZS4gVGhyb3dzIG9uIEhUVFAgb3IgQVBJIGVycm9yLiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9zdEpTT04odXJsLCBkYXRhKSB7XG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3AuanNvbigpO1xuICBpZiAoIXJlc3Aub2sgfHwgcmVzdWx0LnN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvciB8fCBgUmVxdWVzdCBmYWlsZWQgKCR7cmVzcC5zdGF0dXN9KWApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBHRVQgSlNPTiBhbmQgcmV0dXJuIHBhcnNlZCByZXNwb25zZS4gVGhyb3dzIG9uIEhUVFAgZXJyb3Igd2l0aCBzZXJ2ZXIgbWVzc2FnZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwpO1xuICBpZiAoIXJlc3Aub2spIHtcbiAgICBsZXQgbXNnID0gYFJlcXVlc3QgZmFpbGVkICgke3Jlc3Auc3RhdHVzfSlgO1xuICAgIHRyeSB7IGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwLmpzb24oKTsgbXNnID0gYm9keS5lcnJvciB8fCBtc2c7IH0gY2F0Y2ggKF8pIHt9XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gIH1cbiAgcmV0dXJuIHJlc3AuanNvbigpO1xufVxuXG4vKiogREVMRVRFIHJlcXVlc3QuIFJldHVybnMgcGFyc2VkIEpTT04gcmVzcG9uc2UuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVBUEkodXJsKSB7XG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gIGlmICghcmVzcC5vayB8fCByZXN1bHQuc3VjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8IGBEZWxldGUgZmFpbGVkICgke3Jlc3Auc3RhdHVzfSlgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJ1biBhbiBhc3luYyBvcGVyYXRpb24gd2l0aCBidXR0b24gbG9hZGluZyBzdGF0ZS5cbiAqIERpc2FibGVzIHRoZSBidXR0b24sIHNob3dzIGxvYWRpbmcgdGV4dCwgcmVzdG9yZXMgb24gY29tcGxldGUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBidG4gLSBCdXR0b24gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IGxvYWRpbmdUZXh0IC0gVGV4dCB0byBzaG93IHdoaWxlIGxvYWRpbmcgKGUuZy4gJ1NhdmluZy4uLicpXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBhc3luY0ZuIC0gQXN5bmMgZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBPcHRpb25zOiB7IHN1Y2Nlc3NUZXh0LCByZXNldERlbGF5IH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aEJ1dHRvbihidG4sIGxvYWRpbmdUZXh0LCBhc3luY0ZuLCBvcHRzID0ge30pIHtcbiAgY29uc3Qgb3JpZ2luYWwgPSBidG4uaW5uZXJIVE1MO1xuICBjb25zdCB7IHN1Y2Nlc3NUZXh0ID0gJ1x1MjcwNScsIHJlc2V0RGVsYXkgPSBEQy5ERUxBWVMuQlROX1JFU0VUIH0gPSBvcHRzO1xuICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICBidG4uaW5uZXJIVE1MID0gbG9hZGluZ1RleHQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXN5bmNGbigpO1xuICAgIGJ0bi5pbm5lckhUTUwgPSBzdWNjZXNzVGV4dDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLmlubmVySFRNTCA9IG9yaWdpbmFsOyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgfSwgcmVzZXREZWxheSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGJ0bi5pbm5lckhUTUwgPSBvcmlnaW5hbDtcbiAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbi8qKiBTaG93L2hpZGUgYSBtb2RhbCBieSBJRCAqL1xuZnVuY3Rpb24gb3Blbk1vZGFsKGlkKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKT8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xufVxuZnVuY3Rpb24gY2xvc2VNb2RhbChpZCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk/LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbn1cblxuLyoqIFdpcmUgYmFja2Ryb3AtY2xpY2sgY2xvc2UgKyBvcHRpb25hbCBjbG9zZSBidXR0b25zIGZvciBhIG1vZGFsIGVsZW1lbnQgKi9cbmZ1bmN0aW9uIHdpcmVNb2RhbChtb2RhbCwgLi4uY2xvc2VCdG5zKSB7XG4gIGlmICghbW9kYWwpIHJldHVybjtcbiAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7IH0pO1xuICAvLyBTa2lwIGFueXRoaW5nIHRoYXQgaXNuJ3QgYSByZWFsIGxpc3RlbmVyIHRhcmdldC4gV2l0aG91dCB0aGlzIGd1YXJkLCBhXG4gIC8vIHNpbmdsZSB0eXBvIChlLmcuIHBhc3NpbmcgYSBmdW5jdGlvbiBvciBudWxsIGluc3RlYWQgb2YgYSBidXR0b24gZWxlbWVudClcbiAgLy8gdGhyb3dzIGFuZCBhYm9ydHMgdGhlIHJlc3Qgb2YgdGhlIGNhbGxpbmcgbW9kdWxlJ3MgaW5pdCBcdTIwMTQgd2hpY2ggY2FuIHRha2VcbiAgLy8gZG93biBsaWNlbnNlLmpzIChGUkVFIFRJRVIgYmFkZ2UpLCBUT1RQIHdpcmluZywgZXRjLlxuICBjbG9zZUJ0bnMuZm9yRWFjaChidG4gPT4ge1xuICAgIGlmIChidG4gJiYgdHlwZW9mIGJ0bi5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKiBUb2FzdC1zdHlsZSBub3RpZmljYXRpb24gKHJlcGxhY2VzIGFsbCBhbGVydCgpIHVzYWdlKSAqL1xuZnVuY3Rpb24gc2hvd05vdGlmaWNhdGlvbih0ZXh0LCB0eXBlID0gJ2luZm8nLCBkdXJhdGlvbiA9IDMwMDApIHtcbiAgY29uc3QgZXhpc3RpbmdOb3RpZiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kZXBsb3ktbm90aWZpY2F0aW9uJyk7XG4gIGlmIChleGlzdGluZ05vdGlmKSBleGlzdGluZ05vdGlmLnJlbW92ZSgpO1xuXG4gIGNvbnN0IGNvbG9ycyA9IHtcbiAgICBpbmZvOiAgICB7IGJnOiAnIzIxOTZGMycsICAgICAgIGZnOiAnI2ZmZicgfSxcbiAgICBzdWNjZXNzOiB7IGJnOiAndmFyKC0tb2stYmcpJywgIGZnOiAndmFyKC0tb2stZmcpJyB9LFxuICAgIGVycm9yOiAgIHsgYmc6ICcjZjQ0MzM2JywgICAgICAgZmc6ICcjZmZmJyB9LFxuICAgIHdhcm5pbmc6IHsgYmc6ICcjZmY5ODAwJywgICAgICAgZmc6ICcjZmZmJyB9XG4gIH07XG5cbiAgY29uc3QgYyA9IGNvbG9yc1t0eXBlXSB8fCBjb2xvcnMuaW5mbztcbiAgY29uc3QgbXNnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1zZy5jbGFzc05hbWUgPSAnZGVwbG95LW5vdGlmaWNhdGlvbic7XG4gIG1zZy50ZXh0Q29udGVudCA9IHRleHQ7XG4gIG1zZy5zdHlsZS5jc3NUZXh0ID0gYFxuICAgIHBvc2l0aW9uOiBmaXhlZDsgdG9wOiAyMHB4OyByaWdodDogMjBweDtcbiAgICBiYWNrZ3JvdW5kOiAke2MuYmd9OyBjb2xvcjogJHtjLmZnfTtcbiAgICBwYWRkaW5nOiAxNnB4IDI0cHg7IGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwwLDAsLjMpO1xuICAgIHotaW5kZXg6IDEwMDAwOyBhbmltYXRpb246IHNsaWRlSW4gMC4zcyBlYXNlLW91dDtcbiAgICBtYXgtd2lkdGg6IDQwMHB4OyB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7IGZvbnQtc2l6ZTogMTRweDtcbiAgYDtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtc2cpO1xuICBpZiAoZHVyYXRpb24gPiAwKSBzZXRUaW1lb3V0KCgpID0+IG1zZy5yZW1vdmUoKSwgZHVyYXRpb24pO1xufVxuXG4vKiogUmVsYXRpdmUgdGltZSBkaXNwbGF5IChlLmcuIFwiNW0gYWdvXCIsIFwiMmggYWdvXCIpICovXG5mdW5jdGlvbiB0aW1lQWdvKHRzKSB7XG4gIGNvbnN0IGRpZmYgPSBEYXRlLm5vdygpIC0gbmV3IERhdGUodHMpLmdldFRpbWUoKTtcbiAgaWYgKGRpZmYgPCA2MDAwMCkgcmV0dXJuICdqdXN0IG5vdyc7XG4gIGlmIChkaWZmIDwgMzYwMDAwMCkgcmV0dXJuIE1hdGguZmxvb3IoZGlmZiAvIDYwMDAwKSArICdtIGFnbyc7XG4gIGlmIChkaWZmIDwgODY0MDAwMDApIHJldHVybiBNYXRoLmZsb29yKGRpZmYgLyAzNjAwMDAwKSArICdoIGFnbyc7XG4gIHJldHVybiBNYXRoLmZsb29yKGRpZmYgLyA4NjQwMDAwMCkgKyAnZCBhZ28nO1xufVxuXG4vLyA9PT09PSBTQUZFIFNUT1JBR0UgV1JBUFBFUlMgPT09PT1cbi8vIFByZXZlbnRzIGNyYXNoZXMgaW4gU2FmYXJpIHByaXZhdGUgYnJvd3NpbmcsIHF1b3RhIGV4Y2VlZGVkLCBvciByZXN0cmljdGVkIGVudmlyb25tZW50c1xuZnVuY3Rpb24gc2FmZUdldChrZXksIGZhbGxiYWNrID0gbnVsbCkge1xuICB0cnkgeyBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTsgcmV0dXJuIHYgIT09IG51bGwgPyB2IDogZmFsbGJhY2s7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuIGZhbGxiYWNrOyB9XG59XG5mdW5jdGlvbiBzYWZlU2V0KGtleSwgdmFsdWUpIHtcbiAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7IH0gY2F0Y2ggKF8pIHsgLyogcXVvdGEgZXhjZWVkZWQgb3IgcHJpdmF0ZSBtb2RlICovIH1cbn1cbmZ1bmN0aW9uIHNhZmVSZW1vdmUoa2V5KSB7XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7IH0gY2F0Y2ggKF8pIHt9XG59XG5mdW5jdGlvbiBzYWZlU2Vzc2lvbkdldChrZXksIGZhbGxiYWNrID0gbnVsbCkge1xuICB0cnkgeyBjb25zdCB2ID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShrZXkpOyByZXR1cm4gdiAhPT0gbnVsbCA/IHYgOiBmYWxsYmFjazsgfSBjYXRjaCAoXykgeyByZXR1cm4gZmFsbGJhY2s7IH1cbn1cbmZ1bmN0aW9uIHNhZmVTZXNzaW9uU2V0KGtleSwgdmFsdWUpIHtcbiAgdHJ5IHsgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTsgfSBjYXRjaCAoXykge31cbn1cbi8qKiBQYXJzZSBKU09OIGZyb20gbG9jYWxTdG9yYWdlIHdpdGggZmFsbGJhY2sgXHUyMDE0IGF2b2lkcyB0cnkvY2F0Y2ggYXQgZXZlcnkgY2FsbCBzaXRlICovXG5mdW5jdGlvbiBzYWZlR2V0SlNPTihrZXksIGZhbGxiYWNrID0gbnVsbCkge1xuICB0cnkgeyBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTsgcmV0dXJuIHYgPyBKU09OLnBhcnNlKHYpIDogZmFsbGJhY2s7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuIGZhbGxiYWNrOyB9XG59XG5cbi8qKiBFc2NhcGUgSFRNTCBlbnRpdGllcyBmb3Igc2FmZSBpbm5lckhUTUwgaW5zZXJ0aW9uIChoYW5kbGVzIGJvdGggY29udGVudCBhbmQgYXR0cmlidXRlcykgKi9cbmZ1bmN0aW9uIGVzY2FwZUh0bWwodGV4dCkge1xuICByZXR1cm4gU3RyaW5nKHRleHQgPz8gJycpLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JykucmVwbGFjZSgvJy9nLCAnJiMzOTsnKTtcbn1cblxuLyoqIEluamVjdCBtb2RhbCBIVE1MIGludG8gRE9NIChpZGVtcG90ZW50IFx1MjAxNCBza2lwcyBpZiBlbGVtZW50IGFscmVhZHkgZXhpc3RzKSAqL1xuZnVuY3Rpb24gaW5qZWN0TW9kYWwoaWQsIGh0bWwpIHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSkgcmV0dXJuO1xuICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG59XG5cbi8vID09PT09IEVWRU5UIEJVUyA9PT09PVxuLy8gTGlnaHR3ZWlnaHQgcHViL3N1YiBmb3IgY3Jvc3MtbW9kdWxlIGNvbW11bmljYXRpb24gd2l0aG91dCB3aW5kb3cgZ2xvYmFscy5cbi8vIFVzYWdlOiBEQ19CVVMub24oJ3NlcnZpY2VzOmxvYWRlZCcsIGhhbmRsZXIpOyBEQ19CVVMuZW1pdCgnc2VydmljZXM6bG9hZGVkJywgZGF0YSk7XG5jb25zdCBEQ19CVVMgPSB7XG4gIF9oYW5kbGVyczoge30sXG4gIG9uKGV2ZW50LCBmbikgeyAodGhpcy5faGFuZGxlcnNbZXZlbnRdIHx8PSBbXSkucHVzaChmbik7IH0sXG4gIG9mZihldmVudCwgZm4pIHsgdGhpcy5faGFuZGxlcnNbZXZlbnRdID0gdGhpcy5faGFuZGxlcnNbZXZlbnRdPy5maWx0ZXIoaCA9PiBoICE9PSBmbik7IH0sXG4gIGVtaXQoZXZlbnQsIGRhdGEpIHsgdGhpcy5faGFuZGxlcnNbZXZlbnRdPy5mb3JFYWNoKGZuID0+IGZuKGRhdGEpKTsgfVxufTtcblxuLy8gPT09PT0gQ0VOVFJBTElaRUQgQVBQIFNUQVRFID09PT09XG4vLyBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgc2VydmljZXMgYXJyYXkuIE1vZHVsZXMgc2hvdWxkIHVzZSBBcHBTdGF0ZVxuLy8gaW5zdGVhZCBvZiBtdXRhdGluZyB3aW5kb3cuQVBQUyBkaXJlY3RseS4gRW1pdHMgJ2FwcHM6Y2hhbmdlZCcgb24gdXBkYXRlcy5cbmNvbnN0IEFwcFN0YXRlID0ge1xuICBfYXBwczogW10sXG4gIGdldEFwcHMoKSB7IHJldHVybiB0aGlzLl9hcHBzOyB9LFxuICBzZXRBcHBzKGFwcHMpIHsgdGhpcy5fYXBwcyA9IGFwcHM7IHdpbmRvdy5BUFBTID0gYXBwczsgRENfQlVTLmVtaXQoJ2FwcHM6Y2hhbmdlZCcsIGFwcHMpOyB9LFxuICBmaW5kQXBwKGlkKSB7IHJldHVybiB0aGlzLl9hcHBzLmZpbmQoYSA9PiBhLmlkID09PSBpZCk7IH0sXG4gIGFkZEFwcChhcHApIHsgdGhpcy5fYXBwcy5wdXNoKGFwcCk7IHdpbmRvdy5BUFBTID0gdGhpcy5fYXBwczsgRENfQlVTLmVtaXQoJ2FwcHM6Y2hhbmdlZCcsIHRoaXMuX2FwcHMpOyB9LFxuICByZW1vdmVBcHAoaWQpIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLl9hcHBzLmZpbmRJbmRleChhID0+IGEuaWQgPT09IGlkKTtcbiAgICBpZiAoaWR4ID4gLTEpIHsgdGhpcy5fYXBwcy5zcGxpY2UoaWR4LCAxKTsgd2luZG93LkFQUFMgPSB0aGlzLl9hcHBzOyBEQ19CVVMuZW1pdCgnYXBwczpjaGFuZ2VkJywgdGhpcy5fYXBwcyk7IH1cbiAgICByZXR1cm4gaWR4ID4gLTE7XG4gIH0sXG4gIHVwZGF0ZUFwcChpZCwgY2hhbmdlcykge1xuICAgIGNvbnN0IGFwcCA9IHRoaXMuX2FwcHMuZmluZChhID0+IGEuaWQgPT09IGlkKTtcbiAgICBpZiAoYXBwKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhjaGFuZ2VzKSkge1xuICAgICAgICBpZiAoayAhPT0gJ19fcHJvdG9fXycgJiYgayAhPT0gJ2NvbnN0cnVjdG9yJyAmJiBrICE9PSAncHJvdG90eXBlJykgYXBwW2tdID0gdjtcbiAgICAgIH1cbiAgICAgIERDX0JVUy5lbWl0KCdhcHBzOmNoYW5nZWQnLCB0aGlzLl9hcHBzKTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcDtcbiAgfVxufTtcbjtcbi8vID09PT09PT09PT0gU0tFTEVUT04gTE9BRElORyBQTEFDRUhPTERFUlMgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBjcmVhdGVTa2VsZXRvbkNhcmQoKSB7XG4gICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNhcmQuY2xhc3NOYW1lID0gJ3NrZWxldG9uLWNhcmQnO1xuICAgIGNhcmQuaW5uZXJIVE1MID1cbiAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjEycHhcIj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjQ4cHg7aGVpZ2h0OjQ4cHg7Ym9yZGVyLXJhZGl1czo4cHg7ZmxleC1zaHJpbms6MFwiPjwvZGl2PicgK1xuICAgICAgICAnPGRpdiBzdHlsZT1cImZsZXg6MVwiPicgK1xuICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2tlbGV0b24tYmFyXCIgc3R5bGU9XCJ3aWR0aDo2MCU7aGVpZ2h0OjE0cHg7bWFyZ2luLWJvdHRvbTo2cHhcIj48L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cInNrZWxldG9uLWJhclwiIHN0eWxlPVwid2lkdGg6MzUlO2hlaWdodDoxMHB4XCI+PC9kaXY+JyArXG4gICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjQycHg7aGVpZ2h0OjIycHg7Ym9yZGVyLXJhZGl1czoxMXB4XCI+PC9kaXY+JyArXG4gICAgICAnPC9kaXY+JyArXG4gICAgICAnPGRpdiBjbGFzcz1cInNrZWxldG9uLWJhclwiIHN0eWxlPVwid2lkdGg6NDUlO2hlaWdodDoxMnB4O21hcmdpbi1ib3R0b206MTBweFwiPjwvZGl2PicgK1xuICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOmF1dG9cIj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjY0cHg7aGVpZ2h0OjI4cHg7Ym9yZGVyLXJhZGl1czo4cHhcIj48L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjY0cHg7aGVpZ2h0OjI4cHg7Ym9yZGVyLXJhZGl1czo4cHhcIj48L2Rpdj4nICtcbiAgICAgICc8L2Rpdj4nO1xuICAgIHJldHVybiBjYXJkO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1NrZWxldG9ucyhjb3VudCkge1xuICAgIGNvbnN0IGdyaWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZHMnKTtcbiAgICBpZiAoIWdyaWQgfHwgZ3JpZC5xdWVyeVNlbGVjdG9yKCcuY2FyZCcpKSByZXR1cm47IC8vIERvbid0IHNob3cgaWYgcmVhbCBjYXJkcyBleGlzdFxuICAgIGNvdW50ID0gY291bnQgfHwgNjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgY29uc3Qgc2sgPSBjcmVhdGVTa2VsZXRvbkNhcmQoKTtcbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoc2spO1xuICAgICAgLy8gU3RhZ2dlciBmYWRlLWluXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgc2suY2xhc3NMaXN0LmFkZCgnbG9hZGVkJyk7IH0sIGkgKiA2MCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGlkZVNrZWxldG9ucygpIHtcbiAgICBjb25zdCBncmlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmRzJyk7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG4gICAgdmFyIHNrZWxldG9ucyA9IGdyaWQucXVlcnlTZWxlY3RvckFsbCgnLnNrZWxldG9uLWNhcmQnKTtcbiAgICBpZiAoIXNrZWxldG9ucy5sZW5ndGgpIHJldHVybjtcblxuICAgIHNrZWxldG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzaywgaSkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNrLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHNrLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKC0xMHB4KSc7XG4gICAgICB9LCBpICogMjUpO1xuICAgIH0pO1xuICAgIC8vIFJlbW92ZSBhZnRlciBhbmltYXRpb25cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNrZWxldG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzaykgeyBpZiAoc2sucGFyZW50Tm9kZSkgc2sucmVtb3ZlKCk7IH0pO1xuICAgIH0sIHNrZWxldG9ucy5sZW5ndGggKiAyNSArIDMwMCk7XG4gIH1cblxuICB3aW5kb3cuU2tlbGV0b25Mb2FkZXIgPSB7IHNob3c6IHNob3dTa2VsZXRvbnMsIGhpZGU6IGhpZGVTa2VsZXRvbnMgfTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFRIRU1FIENPTlRST0xMRVIgPT09PT09PT09PVxuLy8gVXNlci1jcmVhdGVkIHRoZW1lcyBhcmUgc3RvcmVkIHNlcnZlci1zaWRlIGFzIGluZGl2aWR1YWwgSlNPTiBmaWxlcy5cbi8vIGxvY2FsU3RvcmFnZSBjYWNoZXMgdGhlbSBmb3IgaW5zdGFudCBsb2FkOyBzZXJ2ZXIgaXMgc291cmNlIG9mIHRydXRoLlxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIFRIRU1FX0tFWSA9ICd0aGVtZSc7XG4gIHZhciBVU0VSX1RIRU1FU19LRVkgPSAndXNlci10aGVtZXMnO1xuICB2YXIgTEVHQUNZX0NVU1RPTV9LRVkgPSAnY3VzdG9tLXRoZW1lJztcblxuICB2YXIgQlVJTFRJTl9USEVNRVMgPSBbJ2RhcmsnLCAnbGlnaHQnLCAnYmx1ZScsICdibGFjaycsICdub3JkJywgJ2RyYWN1bGEnLCAnc29sYXJpemVkLWRhcmsnLCAnc29sYXJpemVkLWxpZ2h0JywgJ3RheGknLCAnb2NlYW4nXTtcbiAgdmFyIFRIRU1FUyA9IEJVSUxUSU5fVEhFTUVTLnNsaWNlKCk7XG5cbiAgdmFyIFRIRU1FX1BST1BTID0gW1xuICAgICdiZycsICdmZycsICdtdXRlZCcsICdmZy1tdXRlZCcsICdjYXJkLWJhc2UnLCAnY2FyZC1iZycsICdib3JkZXInLFxuICAgICdob3ZlcicsICdjYXJkLWhvdmVyJywgJ2Jhc2UnLFxuICAgICdvay1iZycsICdvay1mZycsICdiYWQtYmcnLCAnYmFkLWZnJywgJ2RvdC1vaycsICdkb3QtYmFkJywgJ3VwdGltZScsXG4gICAgJ3N1Y2Nlc3MnLCAnZXJyb3InLCAnd2FybmluZycsXG4gICAgJ2FjY2VudCcsICdhY2NlbnQtc3Ryb25nJ1xuICBdO1xuXG4gIC8vIEJhc2UgcHJvcHMgdGhlIHVzZXIgcGlja3MgaW4gdGhlIGJ1aWxkZXIgKHN1YnNldCBvZiBUSEVNRV9QUk9QUylcbiAgdmFyIEJBU0VfUFJPUFMgPSBbXG4gICAgJ2JnJywgJ2ZnJywgJ211dGVkJywgJ2NhcmQtYmFzZScsICdjYXJkLWJnJywgJ2JvcmRlcicsXG4gICAgJ29rLWJnJywgJ29rLWZnJywgJ2JhZC1iZycsICdiYWQtZmcnLCAnZG90LW9rJywgJ2RvdC1iYWQnLCAndXB0aW1lJyxcbiAgICAnYWNjZW50JywgJ2FjY2VudC1zdHJvbmcnXG4gIF07XG5cbiAgLy8gUHJvcHMgdGhhdCBhcmUgYXV0by1kZXJpdmVkIGlmIG5vdCBleHBsaWNpdGx5IHNldFxuICB2YXIgREVSSVZFRF9QUk9QUyA9IFsnZmctbXV0ZWQnLCAnaG92ZXInLCAnY2FyZC1ob3ZlcicsICdiYXNlJywgJ3N1Y2Nlc3MnLCAnZXJyb3InLCAnd2FybmluZyddO1xuXG4gIHZhciBUSEVNRV9DT0xPUlMgPSB7XG4gICAgZGFyazogICAgICAgICAgICAgeyBiZzogJyMwYjBmMWEnLCBmZzogJyNlOGVjZjUnLCBtdXRlZDogJyM5YWE2YmYnLCAnZmctbXV0ZWQnOiAnIzZiN2E5NCcsICdjYXJkLWJhc2UnOiAnIzEyMTgyNicsICdjYXJkLWJnJzogJyMxMjE4MjYnLCBib3JkZXI6ICcjMjYzNTUyJywgaG92ZXI6ICcjMWEyMjM1JywgJ2NhcmQtaG92ZXInOiAnIzE2MWUyZScsIGJhc2U6ICcjMTUxYzJiJywgJ29rLWJnJzogJyMwYzI0MzAnLCAnb2stZmcnOiAnIzdlZjJmZicsICdiYWQtYmcnOiAnIzJhMTIxYScsICdiYWQtZmcnOiAnI2ZmOWFhMycsICdkb3Qtb2snOiAnIzM1ZDFmZicsICdkb3QtYmFkJzogJyNmZjVmN2EnLCB1cHRpbWU6ICcjMzVkMWZmJywgc3VjY2VzczogJyM0Y2FmNTAnLCBlcnJvcjogJyNlNzRjM2MnLCB3YXJuaW5nOiAnI2YzOWMxMicsIGFjY2VudDogJyM4RkQ2RkYnLCAnYWNjZW50LXN0cm9uZyc6ICcjMUY3QkZGJyB9LFxuICAgIGxpZ2h0OiAgICAgICAgICAgIHsgYmc6ICcjZjZmN2ZiJywgZmc6ICcjMGYxMTE1JywgbXV0ZWQ6ICcjNWY2YjdhJywgJ2ZnLW11dGVkJzogJyM4OTkzYTQnLCAnY2FyZC1iYXNlJzogJyNmZmZmZmYnLCAnY2FyZC1iZyc6ICcjZmZmZmZmJywgYm9yZGVyOiAnI2UyZTdlZicsIGhvdmVyOiAnI2VlZjFmNicsICdjYXJkLWhvdmVyJzogJyNmNWY2ZmEnLCBiYXNlOiAnI2ViZWVmMycsICdvay1iZyc6ICcjZWFmZmYxJywgJ29rLWZnJzogJyMwYTdjM2EnLCAnYmFkLWJnJzogJyNmZmVmZWYnLCAnYmFkLWZnJzogJyNiMDAwMjAnLCAnZG90LW9rJzogJyMwZmIxNWEnLCAnZG90LWJhZCc6ICcjZDkzYjNiJywgdXB0aW1lOiAnIzBmYjE1YScsIHN1Y2Nlc3M6ICcjMGE3YzNhJywgZXJyb3I6ICcjYjAwMDIwJywgd2FybmluZzogJyNkNjhhMDAnLCBhY2NlbnQ6ICcjNGE5MGQ5JywgJ2FjY2VudC1zdHJvbmcnOiAnIzI1NjNlYicsIGxpZ2h0Qmc6IHRydWUgfSxcbiAgICBibHVlOiAgICAgICAgICAgICB7IGJnOiAnIzE5MDhBQycsIGZnOiAnI2U4ZjFmZicsIG11dGVkOiAnI2Q2ZTJmZicsICdmZy1tdXRlZCc6ICcjOWVhZmRiJywgJ2NhcmQtYmFzZSc6ICcjMGQxNTMzJywgJ2NhcmQtYmcnOiAnIzBkMTUzMycsIGJvcmRlcjogJyMxYzJkNmEnLCBob3ZlcjogJyMxNDFmNGEnLCAnY2FyZC1ob3Zlcic6ICcjMTExYTNlJywgYmFzZTogJyMwZjE4NDAnLCAnb2stYmcnOiAnIzE2MjA0MCcsICdvay1mZyc6ICcjZWRmZmZmJywgJ2JhZC1iZyc6ICcjMGEwZTI0JywgJ2JhZC1mZyc6ICcjZmZiM2MwJywgJ2RvdC1vayc6ICcjYzdlNWZmJywgJ2RvdC1iYWQnOiAnI2ZmZDZkYycsIHVwdGltZTogJyM3ZWM4ZmYnLCBzdWNjZXNzOiAnIzdlYzhmZicsIGVycm9yOiAnI2ZmYjNjMCcsIHdhcm5pbmc6ICcjZmZkMDgwJywgYWNjZW50OiAnIzljZDRmZicsICdhY2NlbnQtc3Ryb25nJzogJyM2ZmIyZmYnIH0sXG4gICAgYmxhY2s6ICAgICAgICAgICAgeyBiZzogJyMwZTBlMGUnLCBmZzogJyNmNWY1ZjUnLCBtdXRlZDogJyM5OTk5OTknLCAnZmctbXV0ZWQnOiAnIzY2NjY2NicsICdjYXJkLWJhc2UnOiAnIzFhMWExYScsICdjYXJkLWJnJzogJyMxYTFhMWEnLCBib3JkZXI6ICcjMmUyZTJlJywgaG92ZXI6ICcjMjQyNDI0JywgJ2NhcmQtaG92ZXInOiAnIzIwMjAyMCcsIGJhc2U6ICcjMTYxNjE2JywgJ29rLWJnJzogJyMwZjJhMTInLCAnb2stZmcnOiAnIzY2ZmY3YScsICdiYWQtYmcnOiAnIzJhMGYwZicsICdiYWQtZmcnOiAnI2ZmNmI2YicsICdkb3Qtb2snOiAnIzRjYWY1MCcsICdkb3QtYmFkJzogJyNmZjQ0NDQnLCB1cHRpbWU6ICcjZTBlMGUwJywgc3VjY2VzczogJyM0Y2FmNTAnLCBlcnJvcjogJyNmZjQ0NDQnLCB3YXJuaW5nOiAnI2ZmOTgwMCcsIGFjY2VudDogJyNFNjM5NDYnLCAnYWNjZW50LXN0cm9uZyc6ICcjQzYyODI4JyB9LFxuICAgIG5vcmQ6ICAgICAgICAgICAgIHsgYmc6ICcjMmUzNDQwJywgZmc6ICcjZWNlZmY0JywgbXV0ZWQ6ICcjODFhMWMxJywgJ2ZnLW11dGVkJzogJyM2ODgyYTAnLCAnY2FyZC1iYXNlJzogJyMzYjQyNTInLCAnY2FyZC1iZyc6ICcjM2I0MjUyJywgYm9yZGVyOiAnIzRjNTY2YScsIGhvdmVyOiAnIzQzNGM1ZScsICdjYXJkLWhvdmVyJzogJyMzZjQ4NTgnLCBiYXNlOiAnIzM1M2M0YScsICdvay1iZyc6ICcjMmQ0ZjNlJywgJ29rLWZnJzogJyNhM2JlOGMnLCAnYmFkLWJnJzogJyM0YTJjMmEnLCAnYmFkLWZnJzogJyNiZjYxNmEnLCAnZG90LW9rJzogJyNhM2JlOGMnLCAnZG90LWJhZCc6ICcjYmY2MTZhJywgdXB0aW1lOiAnI2EzYmU4YycsIHN1Y2Nlc3M6ICcjYTNiZThjJywgZXJyb3I6ICcjYmY2MTZhJywgd2FybmluZzogJyNlYmNiOGInLCBhY2NlbnQ6ICcjODhjMGQwJywgJ2FjY2VudC1zdHJvbmcnOiAnIzVlODFhYycgfSxcbiAgICBkcmFjdWxhOiAgICAgICAgICB7IGJnOiAnIzI4MmEzNicsIGZnOiAnI2Y4ZjhmMicsIG11dGVkOiAnIzYyNzJhNCcsICdmZy1tdXRlZCc6ICcjNTE1ZDg1JywgJ2NhcmQtYmFzZSc6ICcjNDQ0NzVhJywgJ2NhcmQtYmcnOiAnIzQ0NDc1YScsIGJvcmRlcjogJyM2MjcyYTQnLCBob3ZlcjogJyM0ZTUxNzAnLCAnY2FyZC1ob3Zlcic6ICcjNDk0YzYzJywgYmFzZTogJyMzNjM4NDgnLCAnb2stYmcnOiAnIzFlM2EyZScsICdvay1mZyc6ICcjNTBmYTdiJywgJ2JhZC1iZyc6ICcjM2QxYTFhJywgJ2JhZC1mZyc6ICcjZmY1NTU1JywgJ2RvdC1vayc6ICcjNTBmYTdiJywgJ2RvdC1iYWQnOiAnI2ZmNTU1NScsIHVwdGltZTogJyM1MGZhN2InLCBzdWNjZXNzOiAnIzUwZmE3YicsIGVycm9yOiAnI2ZmNTU1NScsIHdhcm5pbmc6ICcjZjFmYThjJywgYWNjZW50OiAnI2JkOTNmOScsICdhY2NlbnQtc3Ryb25nJzogJyM4YmU5ZmQnIH0sXG4gICAgJ3NvbGFyaXplZC1kYXJrJzogeyBiZzogJyMwMDJiMzYnLCBmZzogJyM4Mzk0OTYnLCBtdXRlZDogJyM1ODZlNzUnLCAnZmctbXV0ZWQnOiAnIzRhNWY2NScsICdjYXJkLWJhc2UnOiAnIzA3MzY0MicsICdjYXJkLWJnJzogJyMwNzM2NDInLCBib3JkZXI6ICcjNTg2ZTc1JywgaG92ZXI6ICcjMGQ0MDUwJywgJ2NhcmQtaG92ZXInOiAnIzBhM2E0OCcsIGJhc2U6ICcjMDUzMzQwJywgJ29rLWJnJzogJyMwZDNkMmMnLCAnb2stZmcnOiAnIzg1OTkwMCcsICdiYWQtYmcnOiAnIzNkMWExYScsICdiYWQtZmcnOiAnI2RjMzIyZicsICdkb3Qtb2snOiAnIzg1OTkwMCcsICdkb3QtYmFkJzogJyNkYzMyMmYnLCB1cHRpbWU6ICcjYjViZDY4Jywgc3VjY2VzczogJyM4NTk5MDAnLCBlcnJvcjogJyNkYzMyMmYnLCB3YXJuaW5nOiAnI2I1ODkwMCcsIGFjY2VudDogJyMyNjhiZDInLCAnYWNjZW50LXN0cm9uZyc6ICcjMmFhMTk4JyB9LFxuICAgICdzb2xhcml6ZWQtbGlnaHQnOnsgYmc6ICcjZmRmNmUzJywgZmc6ICcjNjU3YjgzJywgbXV0ZWQ6ICcjOTNhMWExJywgJ2ZnLW11dGVkJzogJyNhZGI4YjgnLCAnY2FyZC1iYXNlJzogJyNlZWU4ZDUnLCAnY2FyZC1iZyc6ICcjZWVlOGQ1JywgYm9yZGVyOiAnIzkzYTFhMScsIGhvdmVyOiAnI2U2ZGZjYicsICdjYXJkLWhvdmVyJzogJyNlYWUzY2YnLCBiYXNlOiAnI2U4ZTFjZCcsICdvay1iZyc6ICcjZThmNWU4JywgJ29rLWZnJzogJyM4NTk5MDAnLCAnYmFkLWJnJzogJyNmZGYyZjInLCAnYmFkLWZnJzogJyNkYzMyMmYnLCAnZG90LW9rJzogJyM4NTk5MDAnLCAnZG90LWJhZCc6ICcjZGMzMjJmJywgdXB0aW1lOiAnIzg1OTkwMCcsIHN1Y2Nlc3M6ICcjODU5OTAwJywgZXJyb3I6ICcjZGMzMjJmJywgd2FybmluZzogJyNiNTg5MDAnLCBhY2NlbnQ6ICcjMjY4YmQyJywgJ2FjY2VudC1zdHJvbmcnOiAnIzJhYTE5OCcsIGxpZ2h0Qmc6IHRydWUgfSxcbiAgICB0YXhpOiAgICAgICAgICAgICB7IGJnOiAnI2YzZDMyMScsIGZnOiAnIzBlMGUwMCcsIG11dGVkOiAnIzRhNGExMCcsICdmZy1tdXRlZCc6ICcjNmI2YjMwJywgJ2NhcmQtYmFzZSc6ICcjZmZkNzAwJywgJ2NhcmQtYmcnOiAnI2ZmZDcwMCcsIGJvcmRlcjogJyNiOGE4NDAnLCBob3ZlcjogJyNmZmU4NGQnLCAnY2FyZC1ob3Zlcic6ICcjZmZlMDMzJywgYmFzZTogJyNmMGQwMDAnLCAnb2stYmcnOiAnI2Q0ZmZkOScsICdvay1mZyc6ICcjMGYyYTBmJywgJ2JhZC1iZyc6ICcjZmZkNGQ0JywgJ2JhZC1mZyc6ICcjMmEwZjBmJywgJ2RvdC1vayc6ICcjNGNhZjUwJywgJ2RvdC1iYWQnOiAnI2ZmNDQ0NCcsIHVwdGltZTogJyMwZTBlMDAnLCBzdWNjZXNzOiAnIzJlN2QzMicsIGVycm9yOiAnI2M2MjgyOCcsIHdhcm5pbmc6ICcjZTY1MTAwJywgYWNjZW50OiAnIzdhNGEwMCcsICdhY2NlbnQtc3Ryb25nJzogJyM1YzM4MDAnLCBsaWdodEJnOiB0cnVlIH0sXG4gICAgb2NlYW46ICAgICAgICAgICAgeyBiZzogJyMyMDYwYjAnLCBmZzogJyNmYWY1ZWInLCBtdXRlZDogJyNkY2QyYzAnLCAnZmctbXV0ZWQnOiAnI2IwYTg5MCcsICdjYXJkLWJhc2UnOiAnIzdhOTRlZCcsICdjYXJkLWJnJzogJyM3YTk0ZWQnLCBib3JkZXI6ICcjZGViNjdhJywgaG92ZXI6ICcjOGFhMGYwJywgJ2NhcmQtaG92ZXInOiAnIzgyOThlOCcsIGJhc2U6ICcjNjg4OGUwJywgJ29rLWJnJzogJyM0ZjViYjAnLCAnb2stZmcnOiAnI2M3ZDdlYicsICdiYWQtYmcnOiAnI2Y0MWEzYScsICdiYWQtZmcnOiAnIzZhMTgxOCcsICdkb3Qtb2snOiAnIzMwYTA1MCcsICdkb3QtYmFkJzogJyNkMDQwNDAnLCB1cHRpbWU6ICcjMmQzMmYyJywgc3VjY2VzczogJyMzMGEwNTAnLCBlcnJvcjogJyNkMDQwNDAnLCB3YXJuaW5nOiAnI2U2YTAzMCcsIGFjY2VudDogJyMxODYwYTAnLCAnYWNjZW50LXN0cm9uZyc6ICcjMTA0MDgwJyB9LFxuICB9O1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDb2xvciBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGhleFRvUmdiKGhleCkge1xuICAgIGlmICghaGV4IHx8IHR5cGVvZiBoZXggIT09ICdzdHJpbmcnKSByZXR1cm4geyByOiAwLCBnOiAwLCBiOiAwIH07XG4gICAgaGV4ID0gaGV4LnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgaWYgKGhleC5sZW5ndGggPT09IDMpIGhleCA9IGhleFswXStoZXhbMF0raGV4WzFdK2hleFsxXStoZXhbMl0raGV4WzJdO1xuICAgIHJldHVybiB7XG4gICAgICByOiBwYXJzZUludChoZXguc3Vic3RyKDAsIDIpLCAxNikgfHwgMCxcbiAgICAgIGc6IHBhcnNlSW50KGhleC5zdWJzdHIoMiwgMiksIDE2KSB8fCAwLFxuICAgICAgYjogcGFyc2VJbnQoaGV4LnN1YnN0cig0LCAyKSwgMTYpIHx8IDBcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcmdiVG9IZXgociwgZywgYikge1xuICAgIHJldHVybiAnIycgKyBbciwgZywgYl0ubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICB2YXIgaCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh4KSkpLnRvU3RyaW5nKDE2KTtcbiAgICAgIHJldHVybiBoLmxlbmd0aCA9PT0gMSA/ICcwJyArIGggOiBoO1xuICAgIH0pLmpvaW4oJycpO1xuICB9XG5cbiAgZnVuY3Rpb24gYmxlbmRDb2xvcnMoaGV4MSwgaGV4MiwgcmF0aW8pIHtcbiAgICB2YXIgYzEgPSBoZXhUb1JnYihoZXgxKTtcbiAgICB2YXIgYzIgPSBoZXhUb1JnYihoZXgyKTtcbiAgICByZXR1cm4gcmdiVG9IZXgoXG4gICAgICBjMS5yICsgKGMyLnIgLSBjMS5yKSAqIHJhdGlvLFxuICAgICAgYzEuZyArIChjMi5nIC0gYzEuZykgKiByYXRpbyxcbiAgICAgIGMxLmIgKyAoYzIuYiAtIGMxLmIpICogcmF0aW9cbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gaGV4THVtaW5hbmNlKGhleCkge1xuICAgIGhleCA9IGhleC5yZXBsYWNlKCcjJywgJycpO1xuICAgIGlmIChoZXgubGVuZ3RoID09PSAzKSBoZXggPSBoZXhbMF0raGV4WzBdK2hleFsxXStoZXhbMV0raGV4WzJdK2hleFsyXTtcbiAgICB2YXIgciA9IHBhcnNlSW50KGhleC5zdWJzdHIoMCwgMiksIDE2KSAvIDI1NTtcbiAgICB2YXIgZyA9IHBhcnNlSW50KGhleC5zdWJzdHIoMiwgMiksIDE2KSAvIDI1NTtcbiAgICB2YXIgYiA9IHBhcnNlSW50KGhleC5zdWJzdHIoNCwgMiksIDE2KSAvIDI1NTtcbiAgICByID0gciA8PSAwLjAzOTI4ID8gciAvIDEyLjkyIDogTWF0aC5wb3coKHIgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICBnID0gZyA8PSAwLjAzOTI4ID8gZyAvIDEyLjkyIDogTWF0aC5wb3coKGcgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICBiID0gYiA8PSAwLjAzOTI4ID8gYiAvIDEyLjkyIDogTWF0aC5wb3coKGIgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICByZXR1cm4gMC4yMTI2ICogciArIDAuNzE1MiAqIGcgKyAwLjA3MjIgKiBiO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEF1dG8tZGVyaXZlIGV4dGVuZGVkIGNvbG9ycyBmcm9tIGJhc2UgcGFsZXR0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBkZXJpdmVFeHRlbmRlZENvbG9ycyhjb2xvcnMpIHtcbiAgICB2YXIgYmcgPSBjb2xvcnMuYmcgfHwgJyMwYjBmMWEnO1xuICAgIHZhciBmZyA9IGNvbG9ycy5mZyB8fCAnI2U4ZWNmNSc7XG4gICAgdmFyIG11dGVkID0gY29sb3JzLm11dGVkIHx8ICcjOWFhNmJmJztcbiAgICB2YXIgY2FyZEJhc2UgPSBjb2xvcnNbJ2NhcmQtYmFzZSddIHx8IGNvbG9ycy5iZyB8fCAnIzEyMTgyNic7XG4gICAgdmFyIGRvdE9rID0gY29sb3JzWydkb3Qtb2snXSB8fCAnIzRjYWY1MCc7XG4gICAgdmFyIGRvdEJhZCA9IGNvbG9yc1snZG90LWJhZCddIHx8ICcjZTc0YzNjJztcbiAgICB2YXIgaXNMaWdodCA9IGNvbG9ycy5saWdodEJnIHx8IChiZyAmJiBoZXhMdW1pbmFuY2UoYmcpID4gMC40KTtcblxuICAgIHZhciBkZXJpdmVkID0ge307XG5cbiAgICAvLyBob3Zlcjogc3VidGxlIHNoaWZ0IG9mIGNhcmQtYmFzZSB0b3dhcmQgZmcgKGRhcmspIG9yIHRvd2FyZCBiZyAobGlnaHQpXG4gICAgZGVyaXZlZC5ob3ZlciA9IGlzTGlnaHRcbiAgICAgID8gYmxlbmRDb2xvcnMoY2FyZEJhc2UsIGJnLCAwLjM1KVxuICAgICAgOiBibGVuZENvbG9ycyhjYXJkQmFzZSwgZmcsIDAuMDgpO1xuXG4gICAgLy8gY2FyZC1ob3ZlcjogbWlkcG9pbnQgYmV0d2VlbiBjYXJkLWJhc2UgYW5kIGhvdmVyXG4gICAgZGVyaXZlZFsnY2FyZC1ob3ZlciddID0gYmxlbmRDb2xvcnMoY2FyZEJhc2UsIGRlcml2ZWQuaG92ZXIsIDAuNSk7XG5cbiAgICAvLyBiYXNlOiBzdWJkdWVkIGJhY2tncm91bmQgYmV0d2VlbiBiZyBhbmQgY2FyZC1iYXNlXG4gICAgZGVyaXZlZC5iYXNlID0gYmxlbmRDb2xvcnMoYmcsIGNhcmRCYXNlLCAwLjYpO1xuXG4gICAgLy8gZmctbXV0ZWQ6IGRpbW1lciB0aGFuIG11dGVkLCBibGVuZCB0b3dhcmQgYmdcbiAgICBkZXJpdmVkWydmZy1tdXRlZCddID0gYmxlbmRDb2xvcnMobXV0ZWQsIGJnLCAwLjM1KTtcblxuICAgIC8vIHN1Y2Nlc3M6IHJldXNlIGRvdC1vayAodGhlIGdyZWVuIG9mIHRoaXMgdGhlbWUpXG4gICAgZGVyaXZlZC5zdWNjZXNzID0gZG90T2s7XG5cbiAgICAvLyBlcnJvcjogcmV1c2UgZG90LWJhZCAodGhlIHJlZCBvZiB0aGlzIHRoZW1lKVxuICAgIGRlcml2ZWQuZXJyb3IgPSBkb3RCYWQ7XG5cbiAgICAvLyB3YXJuaW5nOiB3YXJtIGFtYmVyLCBhZGp1c3RlZCBmb3IgY29udHJhc3RcbiAgICBkZXJpdmVkLndhcm5pbmcgPSBpc0xpZ2h0ID8gJyNkNjhhMDAnIDogJyNmMzljMTInO1xuXG4gICAgcmV0dXJuIGRlcml2ZWQ7XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgR2VuZXJhdGUgYm9keSBiYWNrZ3JvdW5kIENTUyBmb3IgdXNlciB0aGVtZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVCb2R5QmFja2dyb3VuZENTUyhzbHVnLCBjb2xvcnMpIHtcbiAgICB2YXIgaXNMaWdodCA9IGNvbG9ycy5saWdodEJnIHx8IChjb2xvcnMuYmcgJiYgaGV4THVtaW5hbmNlKGNvbG9ycy5iZykgPiAwLjQpO1xuICAgIHZhciBhY2NlbnQgPSBjb2xvcnMuYWNjZW50IHx8IGNvbG9yc1snYWNjZW50LXN0cm9uZyddIHx8ICcjODg4ODg4JztcbiAgICB2YXIgYWNjZW50UmdiID0gaGV4VG9SZ2IoYWNjZW50KTtcblxuICAgIGlmIChpc0xpZ2h0KSB7XG4gICAgICByZXR1cm4gJzpyb290LicgKyBzbHVnICsgJyBib2R5IHtcXG4nICtcbiAgICAgICAgJyAgYmFja2dyb3VuZDpcXG4nICtcbiAgICAgICAgJyAgICByYWRpYWwtZ3JhZGllbnQoMTIwMHB4IDgwMHB4IGF0IDEwJSAtMTAlLCByZ2JhKCcgKyBhY2NlbnRSZ2IuciArICcsJyArIGFjY2VudFJnYi5nICsgJywnICsgYWNjZW50UmdiLmIgKyAnLCAuMDgpLCB0cmFuc3BhcmVudCA2MCUpLFxcbicgK1xuICAgICAgICAnICAgIHJhZGlhbC1ncmFkaWVudCgxMDAwcHggNzAwcHggYXQgMTEwJSAxMCUsIHJnYmEoJyArIGFjY2VudFJnYi5yICsgJywnICsgYWNjZW50UmdiLmcgKyAnLCcgKyBhY2NlbnRSZ2IuYiArICcsIC4wNSksIHRyYW5zcGFyZW50IDU1JSksXFxuJyArXG4gICAgICAgICcgICAgdmFyKC0tYmcpO1xcbicgK1xuICAgICAgICAnfVxcbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnOnJvb3QuJyArIHNsdWcgKyAnIGJvZHkge1xcbicgK1xuICAgICAgICAnICBiYWNrZ3JvdW5kOlxcbicgK1xuICAgICAgICAnICAgIHJhZGlhbC1ncmFkaWVudCgxMjAwcHggOTAwcHggYXQgOCUgLTEyJSwgcmdiYSgnICsgYWNjZW50UmdiLnIgKyAnLCcgKyBhY2NlbnRSZ2IuZyArICcsJyArIGFjY2VudFJnYi5iICsgJywgLjEwKSwgdHJhbnNwYXJlbnQgNjAlKSxcXG4nICtcbiAgICAgICAgJyAgICByYWRpYWwtZ3JhZGllbnQoMTAwMHB4IDcwMHB4IGF0IDExMCUgLTEwJSwgcmdiYSgnICsgYWNjZW50UmdiLnIgKyAnLCcgKyBhY2NlbnRSZ2IuZyArICcsJyArIGFjY2VudFJnYi5iICsgJywgLjA3KSwgdHJhbnNwYXJlbnQgNTUlKSxcXG4nICtcbiAgICAgICAgJyAgICB2YXIoLS1iZyk7XFxuJyArXG4gICAgICAgICd9XFxuJztcbiAgICB9XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgR2VuZXJhdGUgYnV0dG9uIGhvdmVyIENTUyBmb3IgdXNlciB0aGVtZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVCdXR0b25Ib3ZlckNTUyhzbHVnLCBjb2xvcnMpIHtcbiAgICB2YXIgaXNMaWdodCA9IGNvbG9ycy5saWdodEJnIHx8IChjb2xvcnMuYmcgJiYgaGV4THVtaW5hbmNlKGNvbG9ycy5iZykgPiAwLjQpO1xuXG4gICAgaWYgKGlzTGlnaHQpIHtcbiAgICAgIHJldHVybiAnOnJvb3QuJyArIHNsdWcgKyAnIGJ1dHRvbjpob3ZlciB7XFxuJyArXG4gICAgICAgICcgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQtc3Ryb25nKSAxMiUsIHdoaXRlIDg4JSk7XFxuJyArXG4gICAgICAgICcgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAuMTUpO1xcbicgK1xuICAgICAgICAnICBib3gtc2hhZG93OiAwIDFweCA2cHggcmdiYSgwLCAwLCAwLCAuMDgpLCBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgLjgpO1xcbicgK1xuICAgICAgICAnfVxcbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnOnJvb3QuJyArIHNsdWcgKyAnIGJ1dHRvbjpob3ZlciB7XFxuJyArXG4gICAgICAgICcgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpO1xcbicgK1xuICAgICAgICAnICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDM1JSwgdmFyKC0tYm9yZGVyKSk7XFxuJyArXG4gICAgICAgICd9XFxuJztcbiAgICB9XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ29yZSB0aGVtZSBmdW5jdGlvbnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2V0U3lzdGVtVGhlbWUoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcyA/ICdkYXJrJyA6ICdsaWdodCc7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckN1c3RvbVByb3BlcnRpZXMoKSB7XG4gICAgVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCctLScgKyBwcm9wKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNsdWdpZnkobmFtZSwgY3VycmVudFNsdWcpIHtcbiAgICB2YXIgc2x1ZyA9IG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICAgIGlmICghc2x1Zykgc2x1ZyA9ICdjdXN0b20nO1xuICAgIGlmIChCVUlMVElOX1RIRU1FUy5pbmRleE9mKHNsdWcpICE9PSAtMSkgc2x1ZyA9IHNsdWcgKyAnLWN1c3RvbSc7XG4gICAgdmFyIGNhY2hlZCA9IHNhZmVHZXRKU09OKFVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIHZhciBiYXNlID0gc2x1ZztcbiAgICB2YXIgY291bnRlciA9IDI7XG4gICAgd2hpbGUgKGNhY2hlZFtzbHVnXSAmJiBzbHVnICE9PSBjdXJyZW50U2x1Zykge1xuICAgICAgc2x1ZyA9IGJhc2UgKyAnLScgKyBjb3VudGVyKys7XG4gICAgfVxuICAgIHJldHVybiBzbHVnO1xuICB9XG5cbiAgLy8gSW5qZWN0IHVzZXIgdGhlbWVzIGZyb20gYSB0aGVtZXMgb2JqZWN0IGludG8gRE9NICsgcnVudGltZVxuICBmdW5jdGlvbiBpbmplY3RVc2VyVGhlbWVTdHlsZXModGhlbWVzRGF0YSkge1xuICAgIHZhciBleGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1c2VyLXRoZW1lLXN0eWxlcycpO1xuICAgIGlmIChleGlzdGluZykgZXhpc3RpbmcucmVtb3ZlKCk7XG5cbiAgICBUSEVNRVMubGVuZ3RoID0gQlVJTFRJTl9USEVNRVMubGVuZ3RoO1xuICAgIE9iamVjdC5rZXlzKFRIRU1FX0NPTE9SUykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgaWYgKEJVSUxUSU5fVEhFTUVTLmluZGV4T2YoaykgPT09IC0xKSBkZWxldGUgVEhFTUVfQ09MT1JTW2tdO1xuICAgIH0pO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGRhdGEsIG9yIGZhbGwgYmFjayB0byBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICB2YXIgdXNlclRoZW1lcyA9IHRoZW1lc0RhdGEgfHwgc2FmZUdldEpTT04oVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgdmFyIHNsdWdzID0gT2JqZWN0LmtleXModXNlclRoZW1lcyk7XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFueSB1c2VyIHRoZW1lcyB0aGF0IGNvbGxpZGUgd2l0aCBidWlsdC1pbiBzbHVnc1xuICAgIHNsdWdzID0gc2x1Z3MuZmlsdGVyKGZ1bmN0aW9uIChzKSB7IHJldHVybiBCVUlMVElOX1RIRU1FUy5pbmRleE9mKHMpID09PSAtMTsgfSk7XG5cbiAgICBpZiAoIXNsdWdzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdmFyIGNzcyA9ICcnO1xuICAgIHNsdWdzLmZvckVhY2goZnVuY3Rpb24gKHNsdWcpIHtcbiAgICAgIHZhciB0aGVtZSA9IHVzZXJUaGVtZXNbc2x1Z107XG4gICAgICBpZiAoVEhFTUVTLmluZGV4T2Yoc2x1ZykgPT09IC0xKSBUSEVNRVMucHVzaChzbHVnKTtcblxuICAgICAgLy8gQnVpbGQgY29sb3IgbWFwIGZyb20gc2F2ZWQgZGF0YVxuICAgICAgdmFyIGNvbG9yTWFwID0ge307XG4gICAgICBUSEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IGlmICh0aGVtZVtwXSkgY29sb3JNYXBbcF0gPSB0aGVtZVtwXTsgfSk7XG4gICAgICBjb2xvck1hcFsnY2FyZC1iZyddID0gdGhlbWVbJ2NhcmQtYmFzZSddIHx8IHRoZW1lLmJnO1xuICAgICAgaWYgKHRoZW1lLmxpZ2h0QmcpIGNvbG9yTWFwLmxpZ2h0QmcgPSB0cnVlO1xuXG4gICAgICAvLyBBdXRvLWRlcml2ZSBhbnkgbWlzc2luZyBleHRlbmRlZCBjb2xvcnNcbiAgICAgIHZhciBkZXJpdmVkID0gZGVyaXZlRXh0ZW5kZWRDb2xvcnMoY29sb3JNYXApO1xuICAgICAgREVSSVZFRF9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIGlmICghY29sb3JNYXBbcF0gJiYgZGVyaXZlZFtwXSkgY29sb3JNYXBbcF0gPSBkZXJpdmVkW3BdO1xuICAgICAgfSk7XG5cbiAgICAgIFRIRU1FX0NPTE9SU1tzbHVnXSA9IGNvbG9yTWFwO1xuXG4gICAgICAvLyBFbWl0IG1haW4gdmFyaWFibGUgYmxvY2tcbiAgICAgIGNzcyArPSAnOnJvb3QuJyArIHNsdWcgKyAnIHtcXG4nO1xuICAgICAgVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgICBpZiAoY29sb3JNYXBbcF0pIGNzcyArPSAnICAtLScgKyBwICsgJzogJyArIGNvbG9yTWFwW3BdICsgJztcXG4nO1xuICAgICAgfSk7XG4gICAgICBjc3MgKz0gJ31cXG4nO1xuXG4gICAgICAvLyBFbWl0IGJvZHkgYmFja2dyb3VuZCBncmFkaWVudFxuICAgICAgY3NzICs9IGdlbmVyYXRlQm9keUJhY2tncm91bmRDU1Moc2x1ZywgY29sb3JNYXApO1xuXG4gICAgICAvLyBFbWl0IGJ1dHRvbiBob3ZlciBvdmVycmlkZVxuICAgICAgY3NzICs9IGdlbmVyYXRlQnV0dG9uSG92ZXJDU1Moc2x1ZywgY29sb3JNYXApO1xuICAgIH0pO1xuXG4gICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS5pZCA9ICd1c2VyLXRoZW1lLXN0eWxlcyc7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIH1cblxuICAvLyBGZXRjaCB0aGVtZXMgZnJvbSBzZXJ2ZXIsIHVwZGF0ZSBjYWNoZSwgcmUtaW5qZWN0IGlmIGNoYW5nZWRcbiAgZnVuY3Rpb24gc3luY1RoZW1lc0Zyb21TZXJ2ZXIoKSB7XG4gICAgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdGhlbWVzJykudGhlbihmdW5jdGlvbiAocikgeyByZXR1cm4gci5qc29uKCk7IH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFkYXRhLnRoZW1lcykgcmV0dXJuO1xuICAgICAgdmFyIHNlcnZlclRoZW1lcyA9IGRhdGEudGhlbWVzO1xuICAgICAgdmFyIGNhY2hlZCA9IHNhZmVHZXRKU09OKFVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgICAgLy8gT25seSB1cGRhdGUgaWYgZGlmZmVyZW50XG4gICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc2VydmVyVGhlbWVzKSAhPT0gSlNPTi5zdHJpbmdpZnkoY2FjaGVkKSkge1xuICAgICAgICBzYWZlU2V0KFVTRVJfVEhFTUVTX0tFWSwgSlNPTi5zdHJpbmdpZnkoc2VydmVyVGhlbWVzKSk7XG4gICAgICAgIGluamVjdFVzZXJUaGVtZVN0eWxlcyhzZXJ2ZXJUaGVtZXMpO1xuICAgICAgICAvLyBSZS1hcHBseSBjdXJyZW50IHRoZW1lIGluIGNhc2UgaXQgd2FzIGp1c3Qgc3luY2VkXG4gICAgICAgIHZhciBjdXJyZW50ID0gc2FmZUdldChUSEVNRV9LRVkpO1xuICAgICAgICBpZiAoY3VycmVudCAmJiBUSEVNRVMuaW5kZXhPZihjdXJyZW50KSAhPT0gLTEpIHtcbiAgICAgICAgICBhcHBseVRoZW1lKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuICB9XG5cbiAgLy8gTWlncmF0ZSBsZWdhY3kgY3VzdG9tLXRoZW1lIHRvIHNlcnZlclxuICBmdW5jdGlvbiBtaWdyYXRlTGVnYWN5Q3VzdG9tVGhlbWUoKSB7XG4gICAgdmFyIGxlZ2FjeSA9IHNhZmVHZXRKU09OKExFR0FDWV9DVVNUT01fS0VZKTtcbiAgICBpZiAoIWxlZ2FjeSkgcmV0dXJuO1xuXG4gICAgdmFyIG5hbWUgPSBsZWdhY3kubmFtZSB8fCAnQ3VzdG9tJztcbiAgICB2YXIgc2x1ZyA9IHNsdWdpZnkobmFtZSk7XG5cbiAgICB2YXIgdGhlbWVEYXRhID0geyBuYW1lOiBuYW1lIH07XG4gICAgVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKGxlZ2FjeVtwXSkgdGhlbWVEYXRhW3BdID0gbGVnYWN5W3BdO1xuICAgIH0pO1xuXG4gICAgLy8gU2F2ZSB0byBsb2NhbFN0b3JhZ2UgY2FjaGUgaW1tZWRpYXRlbHlcbiAgICB2YXIgY2FjaGVkID0gc2FmZUdldEpTT04oVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgY2FjaGVkW3NsdWddID0gdGhlbWVEYXRhO1xuICAgIHNhZmVTZXQoVVNFUl9USEVNRVNfS0VZLCBKU09OLnN0cmluZ2lmeShjYWNoZWQpKTtcblxuICAgIC8vIFVwZGF0ZSBhY3RpdmUgdGhlbWUgcmVmZXJlbmNlXG4gICAgaWYgKHNhZmVHZXQoVEhFTUVfS0VZKSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgIHNhZmVTZXQoVEhFTUVfS0VZLCBzbHVnKTtcbiAgICB9XG5cbiAgICBzYWZlUmVtb3ZlKExFR0FDWV9DVVNUT01fS0VZKTtcblxuICAgIC8vIEFsc28gcHVzaCB0byBzZXJ2ZXJcbiAgICB2YXIgY29sb3JzID0ge307XG4gICAgVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAodGhlbWVEYXRhW3BdKSBjb2xvcnNbcF0gPSB0aGVtZURhdGFbcF07IH0pO1xuICAgIGZldGNoKCcvYXBpL3YxL3RoZW1lcy8nICsgc2x1Zywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbmFtZTogbmFtZSwgY29sb3JzOiBjb2xvcnMgfSlcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseVRoZW1lKG1vZGUpIHtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGhlbWUtdHJhbnNpdGlvbmluZycpO1xuXG4gICAgVEhFTUVTLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICh0ICE9PSAnZGFyaycpIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHQpO1xuICAgIH0pO1xuXG4gICAgY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG5cbiAgICBpZiAobW9kZSAhPT0gJ2RhcmsnKSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChtb2RlKTtcbiAgICB9XG5cbiAgICBzYWZlU2V0KFRIRU1FX0tFWSwgbW9kZSk7XG5cbiAgICB2YXIgY29sb3JzID0gVEhFTUVfQ09MT1JTW21vZGVdO1xuICAgIHZhciBtZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidGhlbWUtY29sb3JcIl0nKTtcbiAgICBpZiAobWV0YSAmJiBjb2xvcnMpIG1ldGEuc2V0QXR0cmlidXRlKCdjb250ZW50JywgY29sb3JzLmJnKTtcblxuICAgIC8vIFRvZ2dsZSBsaWdodC1iZyBjbGFzczogZXhwbGljaXQgZmxhZyBmaXJzdCwgdGhlbiBhdXRvLWRldGVjdCBmcm9tIGx1bWluYW5jZVxuICAgIHZhciBpc0xpZ2h0ID0gY29sb3JzICYmIGNvbG9ycy5saWdodEJnO1xuICAgIGlmICghaXNMaWdodCAmJiBjb2xvcnMgJiYgY29sb3JzLmJnKSBpc0xpZ2h0ID0gaGV4THVtaW5hbmNlKGNvbG9ycy5iZykgPiAwLjQ7XG4gICAgaWYgKGlzTGlnaHQpIHtcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaWdodC1iZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbGlnaHQtYmcnKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd0aGVtZS10cmFuc2l0aW9uaW5nJyk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIC8vIC0tLSBJbml0aWFsaXphdGlvbiAtLS1cbiAgbWlncmF0ZUxlZ2FjeUN1c3RvbVRoZW1lKCk7XG4gIC8vIEluc3RhbnQgbG9hZCBmcm9tIGNhY2hlXG4gIGluamVjdFVzZXJUaGVtZVN0eWxlcygpO1xuXG4gIHZhciBzYXZlZFRoZW1lID0gc2FmZUdldChUSEVNRV9LRVkpO1xuICBpZiAoc2F2ZWRUaGVtZSA9PT0gJ3JlZCcpIHsgc2F2ZWRUaGVtZSA9ICdibGFjayc7IHNhZmVTZXQoVEhFTUVfS0VZLCAnYmxhY2snKTsgfVxuICBpZiAoc2F2ZWRUaGVtZSAmJiBzYXZlZFRoZW1lICE9PSAnZGFyaycgJiYgVEhFTUVTLmluZGV4T2Yoc2F2ZWRUaGVtZSkgPT09IC0xKSB7XG4gICAgc2F2ZWRUaGVtZSA9IG51bGw7XG4gIH1cbiAgYXBwbHlUaGVtZShzYXZlZFRoZW1lIHx8IGdldFN5c3RlbVRoZW1lKCkpO1xuXG4gIC8vIFN5bmMgZnJvbSBzZXJ2ZXIgaW4gYmFja2dyb3VuZCAodXBkYXRlcyBjYWNoZSBpZiBzZXJ2ZXIgaGFzIG5ld2VyIGRhdGEpXG4gIHN5bmNUaGVtZXNGcm9tU2VydmVyKCk7XG5cbiAgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghc2FmZUdldChUSEVNRV9LRVkpKSB7XG4gICAgICBhcHBseVRoZW1lKGUubWF0Y2hlcyA/ICdkYXJrJyA6ICdsaWdodCcpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gRXhwb3NlIEFQSVxuICB3aW5kb3cuVEhFTUVTID0gVEhFTUVTO1xuICB3aW5kb3cuQlVJTFRJTl9USEVNRVMgPSBCVUlMVElOX1RIRU1FUztcbiAgd2luZG93LlRIRU1FX0NPTE9SUyA9IFRIRU1FX0NPTE9SUztcbiAgd2luZG93LlRIRU1FX1BST1BTID0gVEhFTUVfUFJPUFM7XG4gIHdpbmRvdy5CQVNFX1BST1BTID0gQkFTRV9QUk9QUztcbiAgd2luZG93LkRFUklWRURfUFJPUFMgPSBERVJJVkVEX1BST1BTO1xuICB3aW5kb3cuVVNFUl9USEVNRVNfS0VZID0gVVNFUl9USEVNRVNfS0VZO1xuICB3aW5kb3cuYXBwbHlUaGVtZSA9IGFwcGx5VGhlbWU7XG4gIHdpbmRvdy5jbGVhckN1c3RvbVByb3BlcnRpZXMgPSBjbGVhckN1c3RvbVByb3BlcnRpZXM7XG4gIHdpbmRvdy5pbmplY3RVc2VyVGhlbWVTdHlsZXMgPSBpbmplY3RVc2VyVGhlbWVTdHlsZXM7XG4gIHdpbmRvdy5zeW5jVGhlbWVzRnJvbVNlcnZlciA9IHN5bmNUaGVtZXNGcm9tU2VydmVyO1xuICB3aW5kb3cuc2x1Z2lmeVRoZW1lTmFtZSA9IHNsdWdpZnk7XG4gIHdpbmRvdy5nZXRBY3RpdmVUaGVtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNhZmVHZXQoVEhFTUVfS0VZKSB8fCBnZXRTeXN0ZW1UaGVtZSgpOyB9O1xuICB3aW5kb3cuZGVyaXZlRXh0ZW5kZWRDb2xvcnMgPSBkZXJpdmVFeHRlbmRlZENvbG9ycztcbiAgd2luZG93LmhleFRvUmdiID0gaGV4VG9SZ2I7XG4gIHdpbmRvdy5yZ2JUb0hleCA9IHJnYlRvSGV4O1xuICB3aW5kb3cuYmxlbmRDb2xvcnMgPSBibGVuZENvbG9ycztcbn0pKCk7XG47XG4vLyA9PT09PSBQTFVHR0FCTEUgQVVUSCBHQVRFIChEQy0wNDkpID09PT09XG4vL1xuLy8gT24gQ2FkZHkgcmVkaXJlY3QgdG8gP2F1dGg9cmVxdWlyZWQsIHRoaXMgbW9kdWxlIHF1ZXJpZXNcbi8vIEdFVCAvYXBpL3YxL2F1dGgvbG9naW4vbWV0aG9kcyB0byBkaXNjb3ZlciB3aGljaCBBdXRoUHJvdmlkZXJzIGFyZSBlbmFibGVkLlxuLy8gSWYgb25seSBvbmUgcHJvdmlkZXIgaXMgZW5hYmxlZCwganVtcCBzdHJhaWdodCB0byBpdHMgY2hhbGxlbmdlIFVJXG4vLyAoVE9UUC1vbmx5IGluc3RhbGxhdGlvbnMgdG9kYXkpLiBJZiBtdWx0aXBsZSBwcm92aWRlcnMgZXhpc3QsIHJlbmRlciBhXG4vLyBzZWxlY3RvciBmaXJzdCBzbyB0aGUgdXNlciBwaWNrcyBob3cgdG8gc2lnbiBpbi5cbi8vXG4vLyBUb2RheTpcbi8vICAgLSB0b3RwOiAgICBjaGFsbGVuZ2UgaXMgNi1kaWdpdCBjb2RlIHZpYSB0aGUgZXhpc3RpbmcgVE9UUCBvdmVybGF5XG4vLyAgIC0gZW1haWw6ICAgY2hhbGxlbmdlIGlzIGVtYWlsIGFkZHJlc3MgXHUyMTkyIFBPU1QgL2FwaS92MS9hdXRoL2xvZ2luL2VtYWlsL2luaXRpYXRlXG4vLyAgICAgICAgICAgICAgXHUyMTkyIHNlcnZlciBlbWFpbHMgbWFnaWMgbGluayAob3IgbG9ncyBpdCB0byBjb25zb2xlIGluIGRldikgXHUyMTkyXG4vLyAgICAgICAgICAgICAgd2FpdGluZyBmb3IgdmVyaWZpY2F0aW9uIChubyBhdXRvLXByb21vdGlvbjsgdXNlciByZWxvYWRzIHZpYVxuLy8gICAgICAgICAgICAgIGVtYWlsIGxpbmssIHdoaWNoIHJvdXRlcyB0aHJvdWdoIC9hcGkvdjEvYXV0aC9sb2dpbi9lbWFpbC92ZXJpZnkpXG4vL1xuLy8gVGhpcyBtb2R1bGUgd2lyZXMgaW50byB0aGUgZXhpc3RpbmcgdG90cC1hdXRoLmpzIHN1Ym1pdFRvdHBDb2RlKCkgZmxvdyBzb1xuLy8gdGhlIGxlZ2FjeSBUT1RQIGhhcHB5LXBhdGggaXMgdW5jaGFuZ2VkOiB3aGVuIG1ldGhvZHMgcmV0dXJucyBvbmx5XG4vLyBgdG90cGAsIHRoaXMgbW9kdWxlIGp1c3Qgc2hvd3MgdGhlIFRPVFAgb3ZlcmxheSBhbmQgZXhpdHMuXG5cbihmdW5jdGlvbigpIHtcbiAgLy8gLS0tLSBET00gcmVmcyAoY3JlYXRlZCBsYXppbHkgYmVsb3c7IGV4aXN0aW5nIFRPVFAgbWFya3VwIHN1cHBsaWVzIHRoZW0pIC0tLS1cbiAgbGV0IG1ldGhvZHNDYWNoZSA9IG51bGw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNZXRob2RzKCkge1xuICAgIGlmIChtZXRob2RzQ2FjaGUpIHJldHVybiBtZXRob2RzQ2FjaGU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2F1dGgvbG9naW4vbWV0aG9kcycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKGBtZXRob2RzIEhUVFAgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBtZXRob2RzQ2FjaGUgPSBBcnJheS5pc0FycmF5KGRhdGEucHJvdmlkZXJzKSA/IGRhdGEucHJvdmlkZXJzIDogW107XG4gICAgICByZXR1cm4gbWV0aG9kc0NhY2hlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFB1YmxpYyBlbmRwb2ludCBcdTIwMTQgaWYgaXQgZmFpbHMsIGZhbGwgdGhyb3VnaCB0byBsZWdhY3kgVE9UUCBwYXRoLlxuICAgICAgY29uc29sZS53YXJuKCdbYXV0aC1nYXRlXSBtZXRob2RzIGZldGNoIGZhaWxlZDsgZmFsbGluZyBiYWNrIHRvIFRPVFAtb25seScsIGUpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dQcm92aWRlclNlbGVjdG9yKHByb3ZpZGVycykge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignLnRvdHAtY2FyZCcpO1xuICAgIGlmICghY2FyZCkgcmV0dXJuO1xuXG4gICAgLy8gU2F2ZSB0aGUgZXhpc3RpbmcgVE9UUC1jaGFsbGVuZ2UgYm9keSBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBvbiBjYW5jZWwuXG4gICAgY29uc3Qgb3JpZ2luYWxCb2R5ID0gY2FyZC5pbm5lckhUTUw7XG4gICAgaWYgKCFjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5KSBjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5ID0gb3JpZ2luYWxCb2R5O1xuXG4gICAgY29uc3QgcHJvdmlkZXJCdXR0b25zID0gcHJvdmlkZXJzLm1hcChwID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gKHAuY29uZmlnICYmIChwLmNvbmZpZy5sYWJlbCB8fCBwLm5hbWUpKSB8fCBwLm5hbWU7XG4gICAgICBjb25zdCBidG4gPSBgPGJ1dHRvbiBjbGFzcz1cInByb3ZpZGVyLWJ0blwiIGRhdGEtcHJvdmlkZXI9XCIke3AubmFtZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbjogNnB4IDRweDsgcGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogd2hpdGU7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cbiAgICAgICAgU2lnbiBpbiB3aXRoICR7bGFiZWx9XG4gICAgICA8L2J1dHRvbj5gO1xuICAgICAgcmV0dXJuIGJ0bjtcbiAgICB9KS5qb2luKCdcXG4nKTtcblxuICAgIGNhcmQuaW5uZXJIVE1MID0gYFxuICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tZGFya1wiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tZGFyay5wbmdcIiBhbHQ9XCJEYXNoQ2FkZHlcIj5cbiAgICAgIDxpbWcgY2xhc3M9XCJ0b3RwLWxvZ28gdG90cC1sb2dvLWxpZ2h0XCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1saWdodC5wbmdcIiBhbHQ9XCJEYXNoQ2FkZHlcIj5cbiAgICAgIDxwIGNsYXNzPVwic3VidGl0bGVcIj5DaG9vc2UgaG93IHRvIHNpZ24gaW48L3A+XG4gICAgICA8ZGl2IGlkPVwiYXV0aC1nYXRlLXByb3ZpZGVyc1wiIHN0eWxlPVwibWFyZ2luOiAxNHB4IDAgMTBweDtcIj4ke3Byb3ZpZGVyQnV0dG9uc308L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJhdXRoLWdhdGUtbWVzc2FnZVwiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuOHJlbTtcIj48L2Rpdj5cbiAgICBgO1xuXG4gICAgb3ZlcmxheS5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG5cbiAgICAvLyBXaXJlIGVhY2ggYnV0dG9uXG4gICAgY2FyZC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvdmlkZXItYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gYnRuLmRhdGFzZXQucHJvdmlkZXI7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gcHJvdmlkZXJzLmZpbmQocCA9PiBwLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICByZW5kZXJQcm92aWRlckNoYWxsZW5nZShwcm92aWRlcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3RvcmVPcmlnaW5hbEJvZHkoKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgICBjb25zdCBjYXJkID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcudG90cC1jYXJkJyk7XG4gICAgaWYgKCFjYXJkIHx8ICFjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5KSByZXR1cm47XG4gICAgY2FyZC5pbm5lckhUTUwgPSBjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5O1xuICAgIC8vIFJlLWJpbmQgdGhlIG9yaWdpbmFsIGRpZ2l0IGlucHV0IGhhbmRsZXJzIGJ5IHJlLXJ1bm5pbmcgdGhlIHRvdHAtYXV0aFxuICAgIC8vIGJvb3RzdHJhcC4gVGhlIHNpbXBsZXN0IHBhdGg6IHJlbG9hZCB0aGUgcGFnZSwgd2hpY2ggcmUtcnVucyBhbGwgSUlGRXMuXG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyUHJvdmlkZXJDaGFsbGVuZ2UocHJvdmlkZXIpIHtcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICAgIGNvbnN0IGNhcmQgPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWNhcmQnKTtcbiAgICBpZiAoIWNhcmQpIHJldHVybjtcblxuICAgIGlmIChwcm92aWRlci5uYW1lID09PSAndG90cCcpIHtcbiAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIFRPVFAgbWFya3VwIFx1MjE5MiBleGlzdGluZyB0b3RwLWF1dGguanMgc3VibWl0VG90cENvZGVcbiAgICAgIC8vIHBhdGggaGFuZGxlcyB0aGUgcmVzdC4gKFJlbG9hZCBpcyB0aGUgY2xlYW5lc3QgcGF0aCBiZWNhdXNlXG4gICAgICAvLyB0b3RwLWF1dGguanMgd2lyZXMgaXRzIGlucHV0IGhhbmRsZXJzIGF0IHRvcC1sZXZlbCBJSUZFIHRpbWUuKVxuICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm92aWRlci5uYW1lID09PSAnZW1haWwnKSB7XG4gICAgICBjYXJkLmlubmVySFRNTCA9IGBcbiAgICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tZGFya1wiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tZGFyay5wbmdcIiBhbHQ9XCJEYXNoQ2FkZHlcIj5cbiAgICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tbGlnaHRcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZ1wiIGFsdD1cIkRhc2hDYWRkeVwiPlxuICAgICAgICA8cCBjbGFzcz1cInN1YnRpdGxlXCI+U2lnbiBpbiB3aXRoIGVtYWlsPC9wPlxuICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjogNnB4IDAgMTRweDsgZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICAgIFdlJ2xsIGVtYWlsIHlvdSBhIG9uZS10aW1lIHNpZ24taW4gbGluay5cbiAgICAgICAgPC9wPlxuICAgICAgICA8aW5wdXQgaWQ9XCJhdXRoLWdhdGUtZW1haWwtaW5wdXRcIiB0eXBlPVwiZW1haWxcIiBpbnB1dG1vZGU9XCJlbWFpbFwiIGF1dG9jb21wbGV0ZT1cImVtYWlsXCJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwieW91QGV4YW1wbGUuY29tXCJcbiAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHggMTJweDsgZm9udC1zaXplOiAxcmVtOyBiYWNrZ3JvdW5kOiB2YXIoLS1pbnB1dC1iZyk7IGNvbG9yOiB2YXIoLS10ZXh0KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXV0aC1nYXRlLWVtYWlsLXN1Ym1pdFwiIGNsYXNzPVwicHJvdmlkZXItYnRuXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDE0cHg7IHBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuOTVyZW07IHdpZHRoOiAxMDAlO1wiPlxuICAgICAgICAgIFNlbmQgc2lnbi1pbiBsaW5rXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGlkPVwiYXV0aC1nYXRlLWVtYWlsLXN0YXR1c1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgZm9udC1zaXplOiAwLjg1cmVtOyBsaW5lLWhlaWdodDogMS40O1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8YSBocmVmPVwiI1wiIGlkPVwiYXV0aC1nYXRlLWJhY2tcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlx1MjE5MCBCYWNrPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcjYXV0aC1nYXRlLWVtYWlsLWlucHV0Jyk7XG4gICAgICBjb25zdCBzdWJtaXQgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtZW1haWwtc3VibWl0Jyk7XG4gICAgICBjb25zdCBzdGF0dXMgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtZW1haWwtc3RhdHVzJyk7XG4gICAgICBjb25zdCBiYWNrID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcjYXV0aC1nYXRlLWJhY2snKTtcblxuICAgICAgc3VibWl0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbWFpbCA9IChpbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgICAgICBpZiAoIWVtYWlsIHx8ICFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ0VudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcy4nO1xuICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1lcnJvciwgI2QzMyknO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzdWJtaXQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnU2VuZGluZ1x1MjAyNic7XG4gICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2F1dGgvbG9naW4vZW1haWwvaW5pdGlhdGUnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlbWFpbCB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgICBjb25zdCB2aWEgPSBkYXRhLmRlbGl2ZXJlZFZpYSB8fCAnZW1haWwnO1xuICAgICAgICAgICAgY29uc3QgbWFza2VkID0gZGF0YS5tYXNrZWRFbWFpbCB8fCBlbWFpbDtcbiAgICAgICAgICAgIGlmICh2aWEgPT09ICdkZXYtY29uc29sZScpIHtcbiAgICAgICAgICAgICAgc3RhdHVzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICBDaGVjayB0aGUgc2VydmVyIGxvZ3MgZm9yIHlvdXIgb25lLXRpbWUgbGluay5cbiAgICAgICAgICAgICAgICAoRGV2IG1vZGU6IG5vIFNNVFAgY29uZmlndXJlZC4gSW4gcHJvZHVjdGlvbiB0aGlzIHdvdWxkIGVtYWlsIDxzdHJvbmc+JHttYXNrZWR9PC9zdHJvbmc+LilgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhdHVzLmlubmVySFRNTCA9IGBTaWduLWluIGxpbmsgc2VudCB0byA8c3Ryb25nPiR7bWFza2VkfTwvc3Ryb25nPi5cbiAgICAgICAgICAgICAgICBDaGVjayB5b3VyIGluYm94IChhbmQgc3BhbSBmb2xkZXIpLmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tc3VjY2VzcywgIzJhNyknO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8ICdDb3VsZCBub3Qgc2VuZCBsaW5rLic7XG4gICAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tZXJyb3IsICNkMzMpJztcbiAgICAgICAgICAgIHN1Ym1pdC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdDb25uZWN0aW9uIGVycm9yLiBUcnkgYWdhaW4uJztcbiAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tZXJyb3IsICNkMzMpJztcbiAgICAgICAgICBzdWJtaXQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHtcbiAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBzdWJtaXQuY2xpY2soKTtcbiAgICAgIH0pO1xuXG4gICAgICBiYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2hvd1Byb3ZpZGVyU2VsZWN0b3IocHJvdmlkZXJzKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVua25vd24gcHJvdmlkZXIgXHUyMTkyIHJlc3RvcmUgVE9UUCBwYXRoIGFzIGEgbGFzdCByZXNvcnRcbiAgICBjb25zb2xlLndhcm4oJ1thdXRoLWdhdGVdIHVua25vd24gcHJvdmlkZXInLCBwcm92aWRlci5uYW1lKTtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzaG93KCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKCFvdmVybGF5KSByZXR1cm47IC8vIFRPVFAtb25seSBidWlsZCB3aXRob3V0IG91ciBvdmVybGF5IGNoYW5nZXNcblxuICAgIGNvbnN0IHByb3ZpZGVycyA9IGF3YWl0IGZldGNoTWV0aG9kcygpO1xuICAgIGlmIChwcm92aWRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBFaXRoZXIgdGhlIGVuZHBvaW50IGlzbid0IHJlYWNoYWJsZSBPUiBubyBwcm92aWRlciByZXBvcnRzIGVuYWJsZWQuXG4gICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGxlZ2FjeSBUT1RQIG92ZXJsYXkgXHUyMDE0IGV4aXN0aW5nIHRvdHAtYXV0aC5qcyBoYW5kbGVzIGl0LlxuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSA9PT0gJ2Z1bmN0aW9uJykgd2luZG93Ll9zaG93VG90cE92ZXJsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHByb3ZpZGVycy5sZW5ndGggPT09IDEgJiYgcHJvdmlkZXJzWzBdLm5hbWUgPT09ICd0b3RwJykge1xuICAgICAgLy8gU2luZ2xlIFRPVFAgcHJvdmlkZXIgXHUyMTkyIHNob3cgdGhlIG9yaWdpbmFsIFRPVFAgb3ZlcmxheSB1bmNoYW5nZWQsXG4gICAgICAvLyBidXQgd2l0aCBhbiBcIk9yIHNpZ24gaW4gd2l0aCBlbWFpbFwiIGxpbmsgYmVsb3cgc28gdGhlIGVtYWlsIHBhdGhcbiAgICAgIC8vIGlzIHJlYWNoYWJsZSBhcyB0aGUgcmVjb3ZlcnkgLyBwaG9uZS1mcmllbmRseSBhbHRlcm5hdGl2ZS4gTW9zdFxuICAgICAgLy8gdXNlcnMgc3RpbGwgd2FudCB0aGVpciBwcmltYXJ5IG1ldGhvZCAoVE9UUCkgZnJvbnQtYW5kLWNlbnRlci5cbiAgICAgIHNob3dUb3RwV2l0aEVtYWlsRmFsbGJhY2socHJvdmlkZXJzWzBdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2hvd1Byb3ZpZGVyU2VsZWN0b3IocHJvdmlkZXJzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dUb3RwV2l0aEVtYWlsRmFsbGJhY2sodG90cFByb3ZpZGVyKSB7XG4gICAgY29uc3QgZW1haWxFbmFibGVkID0gbWV0aG9kc0NhY2hlICYmIG1ldGhvZHNDYWNoZS5maW5kKHAgPT4gcC5uYW1lID09PSAnZW1haWwnKTtcbiAgICBpZiAoIWVtYWlsRW5hYmxlZCkge1xuICAgICAgLy8gVHJ1bHkgc2luZ2xlLXByb3ZpZGVyIHBhdGg6IGxlZ2FjeSBUT1RQIG92ZXJsYXksIG5vIGFsdCBsaW5rLlxuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSA9PT0gJ2Z1bmN0aW9uJykgd2luZG93Ll9zaG93VG90cE92ZXJsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBjb25zdCBjYXJkID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcudG90cC1jYXJkJyk7XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICAvLyBTYXZlIHRoZSBvcmlnaW5hbCBUT1RQIG1hcmt1cCBzbyB3ZSBjYW4gcmVzdG9yZSBvbiBhbHQtbGluayBjbGljayBvZmYuXG4gICAgaWYgKCFjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5KSBjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5ID0gY2FyZC5pbm5lckhUTUw7XG5cbiAgICAvLyBBZGQgYSBzbWFsbCBcIm9yXCIgbGluayBhdCB0aGUgYm90dG9tIG9mIHRoZSBleGlzdGluZyBjYXJkIFdJVEhPVVRcbiAgICAvLyB0b3VjaGluZyB0aGUgVE9UUCBpbnB1dCBtYXJrdXAgXHUyMDE0IGtlZXBzIHRvdHAtYXV0aC5qcydzIHN1Ym1pdFRvdHBDb2RlXG4gICAgLy8gYmluZGluZyBpbnRhY3QuXG4gICAgbGV0IGFsdCA9IGNhcmQucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1hbHQnKTtcbiAgICBpZiAoIWFsdCkge1xuICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBkaXYuaWQgPSAnYXV0aC1nYXRlLWVtYWlsLWFsdCc7XG4gICAgICBkaXYuc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tdG9wOiAxOHB4OyBwYWRkaW5nLXRvcDogMTRweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44NXJlbTsnO1xuICAgICAgZGl2LmlubmVySFRNTCA9IGA8YSBocmVmPVwiI1wiIGlkPVwiYXV0aC1nYXRlLWVtYWlsLWFsdC1saW5rXCJcbiAgICAgICAgc3R5bGU9XCJjb2xvcjogdmFyKC0tYWNjZW50KTsgdGV4dC1kZWNvcmF0aW9uOiBub25lO1wiPlxuICAgICAgICBPciBzaWduIGluIHdpdGggZW1haWwgaW5zdGVhZCBcdTIxOTJcbiAgICAgIDwvYT5gO1xuICAgICAgY2FyZC5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgZGl2LnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtZW1haWwtYWx0LWxpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJlbmRlclByb3ZpZGVyQ2hhbGxlbmdlKGVtYWlsRW5hYmxlZCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgb3ZlcmxheS5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH1cblxuICAvLyAtLS0tIFRyaWdnZXIgcG9pbnRzIC0tLS1cbiAgLy8gMS4gU1NPIHJlZGlyZWN0IGZyb20gQ2FkZHk6ID9hdXRoPXJlcXVpcmVkXG4gIC8vICAgIFdlIGNsYWltIG93bmVyc2hpcCBoZXJlIChzZXQgd2luZG93Ll9fZGNfMDQ5X2hhbmRsZWQgPSB0cnVlKVxuICAvLyAgICBCRUZPUkUgdG90cC1hdXRoLmpzJ3Mgb3duID9hdXRoPXJlcXVpcmVkIGNoZWNrIHJ1bnMsIHNvIHRoZSBsZWdhY3lcbiAgLy8gICAgVE9UUC1vbmx5IG92ZXJsYXkgZG9lc24ndCBmbGlja2VyIGluIGZvciBtdWx0aS1wcm92aWRlciBpbnN0YWxscy5cbiAgLy8gICAgU2luZ2xlLXByb3ZpZGVyIFRPVFAtb25seSBpbnN0YWxscyB3b3JrIGJlY2F1c2Ugd2Ugc3RpbGwgZGVsZWdhdGVcbiAgLy8gICAgYmFjayB0byB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpIGluIGBzaG93KClgIGJlbG93LlxuICB3aW5kb3cuX19kY18wNDlfaGFuZGxlZCA9IHRydWU7XG5cbiAgZnVuY3Rpb24gaXNBbGxvd2VkUmV0dXJuVXJsKHJldHVyblVybCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHJldHVyblVybCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgICBpZiAoIVsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXMocGFyc2VkLnByb3RvY29sKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHBhcnNlZC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHBhcnNlZC5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gZ2xvYmFscy5qcyBpcyBjb25jYXRlbmF0ZWQgYmVmb3JlIHRoaXMgbW9kdWxlIGluIGNvcmUuanMsIHNvIFNJVEUgaXNcbiAgICAgIC8vIGF2YWlsYWJsZSBoZXJlLiBQZXJtaXQgZXhhY3QgaG9zdHMgYW5kIHN1YmRvbWFpbnMgdW5kZXIgdGhlIGNvbmZpZ3VyZWRcbiAgICAgIC8vIHByaXZhdGUgVExEIChmb3IgZXhhbXBsZSBwbGV4LnNhbWkpLCB3aGlsZSByZWplY3RpbmcgbG9va2FsaWtlcyBzdWNoIGFzXG4gICAgICAvLyBwbGV4LnNhbWkuZXZpbC5leGFtcGxlLlxuICAgICAgY29uc3Qgc3VmZml4ID0gU0lURS50bGQuc3RhcnRzV2l0aCgnLicpID8gU0lURS50bGQgOiBgLiR7U0lURS50bGR9YDtcbiAgICAgIHJldHVybiBwYXJzZWQuaG9zdG5hbWUgPT09IHN1ZmZpeC5zbGljZSgxKSB8fCBwYXJzZWQuaG9zdG5hbWUuZW5kc1dpdGgoc3VmZml4KTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRTc29IYW5kb2ZmVGFyZ2V0KHJldHVyblVybCwgdG9rZW4pIHtcbiAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHJldHVyblVybCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgaWYgKHBhcnNlZC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHJldHVybiBwYXJzZWQudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IHN1ZmZpeCA9IFNJVEUudGxkLnN0YXJ0c1dpdGgoJy4nKSA/IFNJVEUudGxkIDogYC4ke1NJVEUudGxkfWA7XG4gICAgY29uc3QgaXNQcml2YXRlSG9zdCA9IHBhcnNlZC5ob3N0bmFtZSA9PT0gc3VmZml4LnNsaWNlKDEpIHx8IHBhcnNlZC5ob3N0bmFtZS5lbmRzV2l0aChzdWZmaXgpO1xuICAgIGlmIChwYXJzZWQucHJvdG9jb2wgIT09ICdodHRwczonIHx8ICFpc1ByaXZhdGVIb3N0IHx8ICF0b2tlbikgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCByZXR1cm5QYXRoID0gYCR7cGFyc2VkLnBhdGhuYW1lfSR7cGFyc2VkLnNlYXJjaH0ke3BhcnNlZC5oYXNofWA7XG4gICAgcGFyc2VkLnBhdGhuYW1lID0gJy9kYXNoY2FkZHktc3NvJztcbiAgICBwYXJzZWQuc2VhcmNoID0gJyc7XG4gICAgcGFyc2VkLmhhc2ggPSAnJztcbiAgICBwYXJzZWQuc2VhcmNoUGFyYW1zLnNldCgndG9rZW4nLCB0b2tlbik7XG4gICAgcGFyc2VkLnNlYXJjaFBhcmFtcy5zZXQoJ3JldHVybicsIHJldHVyblBhdGgpO1xuICAgIHJldHVybiBwYXJzZWQudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlc3VtZUV4aXN0aW5nU2Vzc2lvbihyZXR1cm5VcmwpIHtcbiAgICBpZiAoIXJldHVyblVybCB8fCAhaXNBbGxvd2VkUmV0dXJuVXJsKHJldHVyblVybCkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkUmV0dXJuID0gbmV3IFVSTChyZXR1cm5VcmwsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgICAgY29uc3Qgc3VmZml4ID0gU0lURS50bGQuc3RhcnRzV2l0aCgnLicpID8gU0lURS50bGQgOiBgLiR7U0lURS50bGR9YDtcbiAgICAgIGNvbnN0IHNlcnZpY2VJZCA9IHBhcnNlZFJldHVybi5ob3N0bmFtZS5zbGljZSgwLCAtc3VmZml4Lmxlbmd0aCk7XG4gICAgICBpZiAoIS9eW2EtejAtOV1bYS16MC05LV0qJC8udGVzdChzZXJ2aWNlSWQpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hdXRoL3Nzby1oYW5kb2ZmP3NlcnZpY2VJZD0ke2VuY29kZVVSSUNvbXBvbmVudChzZXJ2aWNlSWQpfWAsIHtcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgICAgY2FjaGU6ICduby1zdG9yZScsXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzLm9rKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGRhdGEuc3VjY2VzcyAmJiBidWlsZFNzb0hhbmRvZmZUYXJnZXQocmV0dXJuVXJsLCBkYXRhLnNzb1Rva2VuKTtcbiAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gZmFsc2U7XG4gICAgICB0cnkgeyBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCd0b3RwX3JlZGlyZWN0Jyk7IH0gY2F0Y2ggKF8pIHt9XG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gIGlmICh1cmxQYXJhbXMuZ2V0KCdhdXRoJykgPT09ICdyZXF1aXJlZCcpIHtcbiAgICAvLyBQcmVzZXJ2ZSB0aGUgZ2F0ZWQgc2VydmljZSBkZXN0aW5hdGlvbiBzbyBzdWJtaXRUb3RwQ29kZSgpIGNhbiBhcHBlbmRcbiAgICAvLyB0aGUgb25lLXRpbWUgU1NPIGhhbmRvZmYgdG9rZW4gYW5kIHJldHVybiB0aGUgYnJvd3NlciB0byB0aGF0IGhvc3QuXG4gICAgY29uc3QgcmV0dXJuVXJsID0gdXJsUGFyYW1zLmdldCgncmV0dXJuJyk7XG4gICAgaWYgKHJldHVyblVybCAmJiBpc0FsbG93ZWRSZXR1cm5VcmwocmV0dXJuVXJsKSkge1xuICAgICAgdHJ5IHsgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgndG90cF9yZWRpcmVjdCcsIHJldHVyblVybCk7IH0gY2F0Y2ggKF8pIHt9XG4gICAgfVxuICAgIC8vIENsZWFuIFVSTCBcdTIwMTQgaGFwcGVucyBhZnRlciB3ZSd2ZSBjYXB0dXJlZCB0aGUgcmVkaXJlY3RcbiAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICcnLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgIC8vIFJldXNlIHRoZSB2YWxpZCBzdGF0dXMuc2FtaSBzZXNzaW9uIGZpcnN0LiBPbmx5IHNob3cgdGhlIFRPVFAvcHJvdmlkZXJcbiAgICAvLyBjaGFsbGVuZ2Ugd2hlbiB0aGF0IHNlc3Npb24gaXMgZ2VudWluZWx5IGFic2VudCBvciBleHBpcmVkLlxuICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGF3YWl0IHJlc3VtZUV4aXN0aW5nU2Vzc2lvbihyZXR1cm5VcmwpKSByZXR1cm47XG4gICAgICBhd2FpdCBzaG93KCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyBFeHBvc2UgZm9yIGhvdC10cmlnZ2VyIGZyb20gb3RoZXIgbW9kdWxlcyAoZS5nLiBsb2dvdXQpXG4gIHdpbmRvdy5fc2hvd0F1dGhHYXRlID0gc2hvdztcbiAgd2luZG93Ll9hdXRoR2F0ZU1ldGhvZHMgPSBmZXRjaE1ldGhvZHM7XG59KSgpO1xuO1xuLy8gPT09PT0gVE9UUCBBVVRIRU5USUNBVElPTiBHQVRFID09PT09XG4oZnVuY3Rpb24oKSB7XG4gIC8vIEF1ZGl0IFAwLTMgKDIwMjYtMTAtMjcpOiBicm9rZW4tbG9nbyBoaWRpbmcgdXNlZCBpbmxpbmUgb25lcnJvciwgd2hpY2hcbiAgLy8gdGhlIG1ldGEgQ1NQIGJsb2NrcyAoZGVhZCBoYW5kbGVyKS4gVHJhY2sgZmFpbHVyZXMgdmlhIGNhcHR1cmUtcGhhc2VcbiAgLy8gZGVsZWdhdGlvbiAoY2F0Y2hlcyBpbmplY3RlZCA8aW1nPnMgYXQgYW55IHRpbWUpICsgYSBsb2FkLXN0YXRlIHN3ZWVwLFxuICAvLyBhbmQgbmV2ZXIgcmVzdXJyZWN0IGEgYnJva2VuIGxvZ28gaW4gdXBkYXRlVG90cExvZ28oKS5cbiAgY29uc3QgYnJva2VuTG9nb3MgPSBuZXcgV2Vha1NldCgpO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChlKSA9PiB7XG4gICAgY29uc3QgdCA9IGUudGFyZ2V0O1xuICAgIGlmICh0ICYmIHQudGFnTmFtZSA9PT0gJ0lNRycgJiYgdC5jbGFzc0xpc3QuY29udGFpbnMoJ3RvdHAtbG9nbycpKSB7XG4gICAgICBicm9rZW5Mb2dvcy5hZGQodCk7XG4gICAgICB0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9LCB0cnVlKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRvdHAtbG9nbycpLmZvckVhY2goKGltZykgPT4ge1xuICAgIGlmIChpbWcuY29tcGxldGUgJiYgaW1nLm5hdHVyYWxXaWR0aCA9PT0gMCkgeyBicm9rZW5Mb2dvcy5hZGQoaW1nKTsgaW1nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gdXBkYXRlVG90cExvZ28oKSB7XG4gICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWNhcmQnKTtcbiAgICBpZiAoIWNhcmQpIHJldHVybjtcbiAgICBjb25zdCBiZyA9IGdldENvbXB1dGVkU3R5bGUoY2FyZCkuYmFja2dyb3VuZENvbG9yO1xuICAgIGNvbnN0IG0gPSBiZy5tYXRjaCgvXFxkKy9nKTtcbiAgICBpZiAoIW0pIHJldHVybjtcbiAgICBjb25zdCBsdW0gPSAoMC4yOTkgKiArbVswXSArIDAuNTg3ICogK21bMV0gKyAwLjExNCAqICttWzJdKSAvIDI1NTtcbiAgICBjb25zdCBkYXJrID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcudG90cC1sb2dvLWRhcmsnKTtcbiAgICBjb25zdCBsaWdodCA9IGNhcmQucXVlcnlTZWxlY3RvcignLnRvdHAtbG9nby1saWdodCcpO1xuICAgIGlmIChkYXJrKSBkYXJrLnN0eWxlLmRpc3BsYXkgPSAobHVtID4gMC41IHx8IGJyb2tlbkxvZ29zLmhhcyhkYXJrKSkgPyAnbm9uZScgOiAnJztcbiAgICBpZiAobGlnaHQpIGxpZ2h0LnN0eWxlLmRpc3BsYXkgPSAobHVtIDw9IDAuNSB8fCBicm9rZW5Mb2dvcy5oYXMobGlnaHQpKSA/ICdub25lJyA6ICcnO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1RvdHBPdmVybGF5KCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgICAgc2V0VGltZW91dCh1cGRhdGVUb3RwTG9nbywgNTApO1xuICAgICAgY29uc3QgZmlyc3RJbnB1dCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignLnRvdHAtZGlnaXRzIGlucHV0Jyk7XG4gICAgICBpZiAoZmlyc3RJbnB1dCkgc2V0VGltZW91dCgoKSA9PiBmaXJzdElucHV0LmZvY3VzKCksIDEwMCk7XG4gICAgfVxuICAgIC8vIFJlZnJlc2ggdGhlIFwiTG9zdCBhY2Nlc3M/XCIgcmVjb3ZlcnkgbGluayB2aXNpYmlsaXR5IGJhc2VkIG9uIHNlcnZlciBzdGF0ZS5cbiAgICAvLyBIaWRlcyBpdHNlbGYgaWYgVE9UUCBpcyBoZWFsdGh5OyBzaG93cyBpZiB1bnJlYWRhYmxlL2NvcnJ1cHQuIFRoZSB1c2VyXG4gICAgLy8gY2FuIHN0aWxsIGNsaWNrIGl0IGV2ZW4gd2hlbiBoZWFsdGh5IFx1MjAxNCBidXQgdGhlIHBhbmVsIHdpbGwgZXhwbGFpbiB0aGVyZSdzXG4gICAgLy8gbm8gcmVjb3ZlcnkgbmVlZGVkLiBDaGVhcGVyIHRoYW4gZ2F0aW5nIGl0LlxuICAgIGlmICh0eXBlb2Ygd2luZG93Ll9yZWZyZXNoUmVjb3ZlcnlMaW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3aW5kb3cuX3JlZnJlc2hSZWNvdmVyeUxpbmsoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlVG90cE92ZXJsYXkoKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAob3ZlcmxheSkgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFNzb0hhbmRvZmZUYXJnZXQocmVkaXJlY3QsIHRva2VuKSB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTChyZWRpcmVjdCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgaWYgKHBhcnNlZC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHJldHVybiBwYXJzZWQudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IHN1ZmZpeCA9IFNJVEUudGxkLnN0YXJ0c1dpdGgoJy4nKSA/IFNJVEUudGxkIDogYC4ke1NJVEUudGxkfWA7XG4gICAgY29uc3QgaXNQcml2YXRlSG9zdCA9IHBhcnNlZC5ob3N0bmFtZSA9PT0gc3VmZml4LnNsaWNlKDEpIHx8IHBhcnNlZC5ob3N0bmFtZS5lbmRzV2l0aChzdWZmaXgpO1xuICAgIGlmIChwYXJzZWQucHJvdG9jb2wgIT09ICdodHRwczonIHx8ICFpc1ByaXZhdGVIb3N0KSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRva2VuKSByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCByZXR1cm5QYXRoID0gYCR7cGFyc2VkLnBhdGhuYW1lfSR7cGFyc2VkLnNlYXJjaH0ke3BhcnNlZC5oYXNofWA7XG4gICAgcGFyc2VkLnBhdGhuYW1lID0gJy9kYXNoY2FkZHktc3NvJztcbiAgICBwYXJzZWQuc2VhcmNoID0gJyc7XG4gICAgcGFyc2VkLmhhc2ggPSAnJztcbiAgICBwYXJzZWQuc2VhcmNoUGFyYW1zLnNldCgndG9rZW4nLCB0b2tlbik7XG4gICAgcGFyc2VkLnNlYXJjaFBhcmFtcy5zZXQoJ3JldHVybicsIHJldHVyblBhdGgpO1xuICAgIHJldHVybiBwYXJzZWQudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8vIFNldHVwIGRpZ2l0IGlucHV0IFVYXG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWRpZ2l0cycpO1xuICBpZiAoY29udGFpbmVyKSB7XG4gICAgY29uc3QgaW5wdXRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0Jyk7XG4gICAgaW5wdXRzLmZvckVhY2goKGlucHV0LCBpZHgpID0+IHtcbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHtcbiAgICAgICAgY29uc3QgdmFsID0gZS50YXJnZXQudmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICAgICAgZS50YXJnZXQudmFsdWUgPSB2YWwuc2xpY2UoMCwgMSk7XG4gICAgICAgIGlmICh2YWwgJiYgaWR4IDwgaW5wdXRzLmxlbmd0aCAtIDEpIGlucHV0c1tpZHggKyAxXS5mb2N1cygpO1xuICAgICAgICBjb25zdCBjb2RlID0gQXJyYXkuZnJvbShpbnB1dHMpLm1hcChpID0+IGkudmFsdWUpLmpvaW4oJycpO1xuICAgICAgICBpZiAoY29kZS5sZW5ndGggPT09IDYpIHN1Ym1pdFRvdHBDb2RlKGNvZGUpO1xuICAgICAgfSk7XG5cbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5rZXkgPT09ICdCYWNrc3BhY2UnICYmICFlLnRhcmdldC52YWx1ZSAmJiBpZHggPiAwKSB7XG4gICAgICAgICAgaW5wdXRzW2lkeCAtIDFdLmZvY3VzKCk7XG4gICAgICAgICAgaW5wdXRzW2lkeCAtIDFdLnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgcGFzdGVkID0gKGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0JykgfHwgJycpLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgICAgIGlmIChwYXN0ZWQubGVuZ3RoID49IDYpIHtcbiAgICAgICAgICBpbnB1dHMuZm9yRWFjaCgoaW5wLCBpKSA9PiB7IGlucC52YWx1ZSA9IHBhc3RlZFtpXSB8fCAnJzsgfSk7XG4gICAgICAgICAgaW5wdXRzWzVdLmZvY3VzKCk7XG4gICAgICAgICAgc3VibWl0VG90cENvZGUocGFzdGVkLnNsaWNlKDAsIDYpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzdWJtaXRUb3RwQ29kZShjb2RlKSB7XG4gICAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWVycm9yJyk7XG4gICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdWZXJpZnlpbmcuLi4nO1xuICAgIGVycm9yRWwuY2xhc3NOYW1lID0gJ3RvdHAtZXJyb3IgdmVyaWZ5aW5nJztcblxuICAgIGNvbnN0IHJlZGlyZWN0ID0gc2FmZVNlc3Npb25HZXQoJ3RvdHBfcmVkaXJlY3QnKTtcbiAgICBsZXQgc2VydmljZUlkID0gbnVsbDtcbiAgICBpZiAocmVkaXJlY3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmVkaXJlY3QsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgICAgICBjb25zdCBzdWZmaXggPSBTSVRFLnRsZC5zdGFydHNXaXRoKCcuJykgPyBTSVRFLnRsZCA6IGAuJHtTSVRFLnRsZH1gO1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXJzZWQuaG9zdG5hbWUuc2xpY2UoMCwgLXN1ZmZpeC5sZW5ndGgpO1xuICAgICAgICBpZiAocGFyc2VkLmhvc3RuYW1lLmVuZHNXaXRoKHN1ZmZpeCkgJiYgL15bYS16MC05XVthLXowLTktXSokLy50ZXN0KGNhbmRpZGF0ZSkpIHNlcnZpY2VJZCA9IGNhbmRpZGF0ZTtcbiAgICAgIH0gY2F0Y2ggKF8pIHsgLyogaW52YWxpZCByZWRpcmVjdCBpcyBoYW5kbGVkIGJ5IHRoZSBub3JtYWwgYXV0aCBmbG93ICovIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdG90cC92ZXJpZnknLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb2RlLCBzZXJ2aWNlSWQgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICAvLyBVcGRhdGUgY2FjaGVkIENTUkYgdG9rZW4gZnJvbSBUT1RQIHJlc3BvbnNlIChzZXJ2ZXIgcm90YXRlcyBpdCBvbiBsb2dpbilcbiAgICAgICAgaWYgKGRhdGEuY3NyZlRva2VuKSB7XG4gICAgICAgICAgY3NyZlRva2VuID0gZGF0YS5jc3JmVG9rZW47XG4gICAgICAgIH1cbiAgICAgICAgaGlkZVRvdHBPdmVybGF5KCk7XG4gICAgICAgIC8vIENoZWNrIGlmIHJlZGlyZWN0ZWQgaGVyZSBmcm9tIGFub3RoZXIgc2VydmljZVxuICAgICAgICBpZiAocmVkaXJlY3QpIHtcbiAgICAgICAgICB0cnkgeyBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCd0b3RwX3JlZGlyZWN0Jyk7IH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgICAgLy8gLnNhbWkgaXMgYW4gdW5yZWdpc3RlcmVkIFRMRCwgc28gYnJvd3NlcnMgc2lsZW50bHkgZHJvcCB0aGVcbiAgICAgICAgICAvLyBEb21haW49LnNhbWkgc2Vzc2lvbiBjb29raWUgb24gYW55IE9USEVSICouc2FtaSBzdWJkb21haW4gKHRoZXlcbiAgICAgICAgICAvLyB0cmVhdCBcInNhbWlcIiBhcyB0aGUgZWZmZWN0aXZlIHB1YmxpYyBzdWZmaXgsIHNhbWUgcHJvdGVjdGlvblxuICAgICAgICAgIC8vIHRoYXQgYmxvY2tzIGEgRG9tYWluPS5jb20gc3VwZXJjb29raWUpLiBUaGUgdGFyZ2V0IHNlcnZpY2UgY2FuJ3RcbiAgICAgICAgICAvLyBzZWUgb3VyIHNlc3Npb24gY29va2llIG5vIG1hdHRlciBob3cgaXQncyBidWlsdCwgc28gaW5zdGVhZCB3ZVxuICAgICAgICAgIC8vIGhhbmQgaXQgYSBvbmUtdGltZSB0b2tlbiBpbiB0aGUgVVJMOyBpdHMgbG9naW4gcGFnZSBleGNoYW5nZXNcbiAgICAgICAgICAvLyB0aGF0IGZvciBpdHMgb3duIGhvc3Qtb25seSBjb29raWUgdmlhIC9hdXRoL3Nzby1leGNoYW5nZS5cbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBidWlsZFNzb0hhbmRvZmZUYXJnZXQocmVkaXJlY3QsIGRhdGEuc3NvVG9rZW4pO1xuICAgICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0YXJnZXQ7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEluaXRpYWxpemUgZGFzaGJvYXJkXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmluaXRpYWxpemVEYXNoYm9hcmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3aW5kb3cuaW5pdGlhbGl6ZURhc2hib2FyZCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc3VtZSBsaXZlIHVwZGF0ZXMgYWZ0ZXIgbWlkLXNlc3Npb24gcmUtYXV0aC4gVGhlIGF1dGgtbG9zc1xuICAgICAgICAvLyBoYW5kbGVycyBsYXRjaGVkIHBvbGxpbmcgKyBTU0Ugb2ZmIHdoZW4gdGhlIHNlc3Npb24gZXhwaXJlZFxuICAgICAgICAvLyAoZ3JpZC5qcyBzZXRzIF9kY0F1dGhMb3N0LCBsaXZlLWV2ZW50cy5qcyBsYXRjaGVzIHRoZSBzdHJlYW1cbiAgICAgICAgLy8gY2xvc2VkKTsgYSBmcmVzaCBsb2dpbiBtdXN0IGNsZWFyIGJvdGggYW5kIHJlY29ubmVjdCwgb3IgdGhlXG4gICAgICAgIC8vIGRhc2hib2FyZCBzdGF5cyBmcm96ZW4gb24gc3RhbGUgZGF0YSB1bnRpbCBhIG1hbnVhbCBGNS5cbiAgICAgICAgd2luZG93Ll9kY0F1dGhMb3N0ID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93Ll9zc2VSZXN1bWUgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5fc3NlUmVzdW1lKCk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cuX3NzZVJlY29ubmVjdCA9PT0gJ2Z1bmN0aW9uJykgd2luZG93Ll9zc2VSZWNvbm5lY3QoKTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cucmVmcmVzaEFsbCA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LnJlZnJlc2hBbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8ICdJbnZhbGlkIGNvZGUnO1xuICAgICAgICBlcnJvckVsLmNsYXNzTmFtZSA9ICd0b3RwLWVycm9yJztcbiAgICAgICAgY29uc3QgaW5wdXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3RvdHAtZGlnaXRzIGlucHV0Jyk7XG4gICAgICAgIGlucHV0cy5mb3JFYWNoKGkgPT4geyBpLnZhbHVlID0gJyc7IH0pO1xuICAgICAgICBpbnB1dHNbMF0/LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdDb25uZWN0aW9uIGVycm9yJztcbiAgICAgIGVycm9yRWwuY2xhc3NOYW1lID0gJ3RvdHAtZXJyb3InO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSA/YXV0aD1yZXF1aXJlZCByZWRpcmVjdCBmcm9tIENhZGR5IFNTTy5cbiAgLy8gREMtMDQ5OiBpZiB0aGUgYXV0aC1nYXRlIG1vZHVsZSB3aWxsIGhhbmRsZSB0aGlzIChtdWx0aS1wcm92aWRlclxuICAvLyBpbnN0YWxscyksIHNraXAgb3VyIFRPVFAtb25seSBicmFuY2ggZW50aXJlbHkuIFNpbmdsZS1wcm92aWRlclxuICAvLyBUT1RQLW9ubHkgaW5zdGFsbHMgY29udGludWUgdG8gdXNlIHRoaXMgcGF0aCBiZWNhdXNlIGF1dGgtZ2F0ZS5qc1xuICAvLyBkZWxlZ2F0ZXMgYmFjayB0byB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpLlxuICBjb25zdCBfX2RjXzA0OV9za2lwID0gISEod2luZG93Ll9fZGNfMDQ5X2hhbmRsZWQpO1xuICBpZiAoIV9fZGNfMDQ5X3NraXAgJiYgdXJsUGFyYW1zLmdldCgnYXV0aCcpID09PSAncmVxdWlyZWQnKSB7XG4gICAgY29uc3QgcmV0dXJuVXJsID0gdXJsUGFyYW1zLmdldCgncmV0dXJuJyk7XG4gICAgaWYgKHJldHVyblVybCkge1xuICAgICAgLy8gVmFsaWRhdGUgcmVkaXJlY3QgVVJMOiBtdXN0IGJlIHNhbWUtb3JpZ2luIG9yIGhvc3RuYW1lIG11c3QgZW5kIHdpdGggb3VyIFRMRFxuICAgICAgLy8gKHByZXZlbnRzIG9wZW4gcmVkaXJlY3QgdmlhIGluY2x1ZGVzKCkgYnlwYXNzIGxpa2UgZXZpbC5jb20/cT0uc2FtaSlcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmV0dXJuVXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgICAgY29uc3QgaG9zdG5hbWUgPSBwYXJzZWQuaG9zdG5hbWU7XG4gICAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IHBhcnNlZC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgICAgIGNvbnN0IHRsZFN1ZmZpeCA9IFNJVEUudGxkLnN0YXJ0c1dpdGgoJy4nKSA/IFNJVEUudGxkIDogJy4nICsgU0lURS50bGQ7XG4gICAgICAgIGNvbnN0IGlzT3VyVGxkID0gaG9zdG5hbWUuZW5kc1dpdGgodGxkU3VmZml4KSB8fCBob3N0bmFtZSA9PT0gdGxkU3VmZml4LnN1YnN0cmluZygxKTtcbiAgICAgICAgaWYgKGlzU2FtZU9yaWdpbiB8fCBpc091clRsZCkge1xuICAgICAgICAgIHNhZmVTZXNzaW9uU2V0KCd0b3RwX3JlZGlyZWN0JywgcmV0dXJuVXJsKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAvLyBJbnZhbGlkIFVSTCBcdTIwMTQgcmVqZWN0IHJlZGlyZWN0XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENsZWFuIFVSTFxuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgJycsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gIH1cblxuICB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSA9IHNob3dUb3RwT3ZlcmxheTtcbn0pKCk7XG47XG4vLyA9PT09PSBUT1RQIFJFQ09WRVJZIEZMT1cgPT09PT1cbi8vIFB1YmxpYywgdW5hdXRoZW50aWNhdGVkIHJlY292ZXJ5IHBhdGggZm9yIHVzZXJzIHdobyBjYW4ndCBsb2cgaW4uXG4vLyBEZXNpZ25lZCBmb3IgdGhlIFwiZW5jcnlwdGlvbiBrZXkgcm90YXRlZCBhbmQgbG9zdCBteSBhdXRoZW50aWNhdG9yXCIgY2FzZS5cbi8vIFRoZSBmbG93IGlzOlxuLy9cbi8vICAxLiBPbiBUT1RQIG92ZXJsYXkgc2hvdywgY2FsbCAvYXBpL3YxL3RvdHAvcmVjb3ZlcnktaW5mbyAocHVibGljKS5cbi8vICAgICBJZiBzdGF0dXMgPT09ICd1bnJlYWRhYmxlJywgc2hvdyB0aGUgXCJMb3N0IGFjY2Vzcz9cIiBsaW5rIG9uIHRoZSBvdmVybGF5LlxuLy8gIDIuIFVzZXIgY2xpY2tzIGxpbmsgXHUyMTkyIG9wZW5zIHJlY292ZXJ5IHBhbmVsLlxuLy8gIDMuIFVzZXIgcGFzdGVzIEJhc2UzMiBzZWNyZXQgXHUyMTkyIFBPU1QgL2FwaS92MS90b3RwL3NldHVwIHdpdGgge3NlY3JldDogLi4ufS5cbi8vICAgICBCYWNrZW5kIHN0b3JlcyBhcyB0b3RwLnBlbmRpbmdfc2VjcmV0IChlbmNyeXB0ZWQgd2l0aCBjdXJyZW50IGtleSkuXG4vLyAgNC4gUGFuZWwgc3dpdGNoZXMgdG8gXCJ2ZXJpZnlcIiBtb2RlLiBVc2VyIGVudGVycyBhIGNvZGUgZnJvbSB0aGVcbi8vICAgICBuZXdseS1hZGRlZCBhdXRoZW50aWNhdG9yIGVudHJ5LiBQT1NUIC9hcGkvdjEvdG90cC92ZXJpZnktc2V0dXBcbi8vICAgICBwcm9tb3RlcyBwZW5kaW5nIFx1MjE5MiBhY3RpdmUgYW5kIHN0YXJ0cyBhIHNlc3Npb24uXG4vLyAgNS4gaGlkZVRvdHBPdmVybGF5KCkgYW5kIGluaXRpYWxpemVEYXNoYm9hcmQoKSBcdTIwMTQgc2FtZSBhcyBub3JtYWwgbG9naW4uXG4vL1xuLy8gVGhlIHJlY292ZXJ5IGZsb3cgbmV2ZXIgcmVxdWlyZXMgdGhlIHVzZXIgdG8gYmUgbG9nZ2VkIGluLiBJdCBkb2VzIHJlcXVpcmVcbi8vIHRoZW0gdG8gaGF2ZSB0aGVpciBCYXNlMzIgc2VjcmV0IHNhdmVkIChlLmcuIHBhc3N3b3JkIG1hbmFnZXIsIHNjcmVlbnNob3QsXG4vLyB0aGUgXCJEb3dubG9hZCBiYWNrdXAgZmlsZVwiIHdlIG9mZmVyIGF0IHNldHVwIHRpbWUgXHUyMDE0IHNlZSB0b3RwLXNldHRpbmdzLmpzKS5cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIEhlbHBlcnMgXHUyNTAwXHUyNTAwXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoUmVjb3ZlcnlJbmZvKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9yZWNvdmVyeS1pbmZvJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIHJldHVybiBhd2FpdCByLmpzb24oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgc3RhdHVzOiAndW5rbm93bicsIGhpbnQ6ICdDb3VsZCBub3QgY29udGFjdCBzZXJ2ZXInIH07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1JlY292ZXJ5TGluayhzaG93KSB7XG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWxpbmsnKTtcbiAgICBpZiAobGluaykgbGluay5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgZnVuY3Rpb24gb3BlblJlY292ZXJ5UGFuZWwoKSB7XG4gICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1wYW5lbCcpO1xuICAgIGlmIChwYW5lbCkgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc3RhdHVzJyk7XG4gICAgY29uc3QgaW1wb3J0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1pbXBvcnQnKTtcbiAgICBjb25zdCB2ZXJpZnlFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXZlcmlmeScpO1xuICAgIGlmIChpbXBvcnRFbCkgaW1wb3J0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGlmICh2ZXJpZnlFbCkgdmVyaWZ5RWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAvLyBSZXNldCBzdGF0ZVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWVycm9yJykudGV4dENvbnRlbnQgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb25maXJtLWVycm9yJykudGV4dENvbnRlbnQgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1zZWNyZXQnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvZGUnKS52YWx1ZSA9ICcnO1xuICAgIC8vIFNob3cgY3VycmVudCBzdGF0dXNcbiAgICBmZXRjaFJlY292ZXJ5SW5mbygpLnRoZW4oaW5mbyA9PiB7XG4gICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGluZm8uaGludCB8fCAnJztcbiAgICAgIC8vIENvbG9yLWNvZGUgdGhlIHN0YXR1cyBiYW5uZXJcbiAgICAgIGlmIChpbmZvLnN0YXR1cyA9PT0gJ2hlYWx0aHknKSB7XG4gICAgICAgIHN0YXR1c0VsLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLW9rLWZnLCAjN2VmMmZmKSc7XG4gICAgICB9IGVsc2UgaWYgKGluZm8uc3RhdHVzID09PSAndW5yZWFkYWJsZScpIHtcbiAgICAgICAgc3RhdHVzRWwuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tYmFkLWZnLCAjZmY5YWEzKSc7XG4gICAgICAgIHN0YXR1c0VsLnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWJhZC1mZykgNiUsIHRyYW5zcGFyZW50KSc7XG4gICAgICB9IGVsc2UgaWYgKGluZm8uc3RhdHVzID09PSAnbm90X2NvbmZpZ3VyZWQnKSB7XG4gICAgICAgIHN0YXR1c0VsLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXNFbC5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1ib3JkZXIpJztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXNlY3JldCcpPy5mb2N1cygpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVJlY292ZXJ5UGFuZWwoKSB7XG4gICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1wYW5lbCcpO1xuICAgIGlmIChwYW5lbCkgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFJlY292ZXJ5U2VjcmV0KCkge1xuICAgIGNvbnN0IHNlY3JldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXNlY3JldCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktZXJyb3InKTtcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJyc7XG5cbiAgICBpZiAoIXNlY3JldCkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdQYXN0ZSB5b3VyIEJhc2UzMiBrZXkgZmlyc3QnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIS9eW0EtWmEtejItN1xcc10rPSokLy50ZXN0KHNlY3JldCkpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnSW52YWxpZCBCYXNlMzIgZm9ybWF0IFx1MjAxNCBzaG91bGQgYmUgbGV0dGVycyBBLVogYW5kIGRpZ2l0cyAyLTcgb25seSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUE9TVCAvYXBpL3YxL3RvdHAvc2V0dXAgd2l0aCB7c2VjcmV0fSBcdTIwMTQgYmFja2VuZCBzdG9yZXMgYXMgcGVuZGluZ1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9zZXR1cCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlY3JldCB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgci5qc29uKCk7XG4gICAgICBpZiAoIXIub2sgfHwgIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gZGF0YS5lcnJvciB8fCBkYXRhLm1lc3NhZ2UgfHwgJ1Jlc3RvcmUgZmFpbGVkJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU3dpdGNoIHBhbmVsIHRvIHZlcmlmeSBtb2RlXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1pbXBvcnQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktdmVyaWZ5Jykuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJyk/LmZvY3VzKCksIDEwMCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdOZXR3b3JrIGVycm9yIFx1MjAxNCB0cnkgYWdhaW4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFJlY292ZXJ5Q29kZSgpIHtcbiAgICBjb25zdCBjb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29uZmlybS1lcnJvcicpO1xuICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmICghL15cXGR7Nn0kLy50ZXN0KGNvZGUpKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ0VudGVyIGEgNi1kaWdpdCBjb2RlJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQT1NUIC9hcGkvdjEvdG90cC92ZXJpZnktc2V0dXAgXHUyMDE0IHByb21vdGVzIHBlbmRpbmcgXHUyMTkyIGFjdGl2ZSArIHN0YXJ0cyBzZXNzaW9uXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL3ZlcmlmeS1zZXR1cCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvZGUgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKCFyLm9rIHx8ICFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgZGF0YS5tZXNzYWdlIHx8ICdJbnZhbGlkIGNvZGUnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJykudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpPy5mb2N1cygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTdWNjZXNzIFx1MjAxNCBoaWRlIGV2ZXJ5dGhpbmcgYW5kIGluaXRpYWxpemUgZGFzaGJvYXJkXG4gICAgICBjbG9zZVJlY292ZXJ5UGFuZWwoKTtcbiAgICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgICBpZiAob3ZlcmxheSkgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5pbml0aWFsaXplRGFzaGJvYXJkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdpbmRvdy5pbml0aWFsaXplRGFzaGJvYXJkKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdOZXR3b3JrIGVycm9yIFx1MjAxNCB0cnkgYWdhaW4nO1xuICAgIH1cbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBXaXJlIHVwIGhhbmRsZXJzIFx1MjUwMFx1MjUwMFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zaG93LXJlY292ZXJ5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgb3BlblJlY292ZXJ5UGFuZWwoKTtcbiAgfSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNsb3NlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VSZWNvdmVyeVBhbmVsKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc3VibWl0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VibWl0UmVjb3ZlcnlTZWNyZXQpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb25maXJtJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VibWl0UmVjb3ZlcnlDb2RlKTtcblxuICAvLyBFbnRlciBrZXkgc3VibWl0cyBpbiBzZWNyZXQgZmllbGRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc2VjcmV0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN1Ym1pdFJlY292ZXJ5U2VjcmV0KCk7IH1cbiAgfSk7XG4gIC8vIEVudGVyIGtleSBzdWJtaXRzIGluIGNvZGUgZmllbGRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpPy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzdWJtaXRSZWNvdmVyeUNvZGUoKTsgfVxuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUHVibGljIEFQSSBcdTI1MDBcdTI1MDBcbiAgLy8gQ2FsbGVkIGJ5IHRvdHAtYXV0aC5qcyBhZnRlciBzaG93aW5nIHRoZSBvdmVybGF5LCBzbyB3ZSBjYW4gZGVjaWRlIHdoZXRoZXJcbiAgLy8gdG8gc2hvdyB0aGUgcmVjb3ZlcnkgbGluay4gV2UgZG8gdGhpcyB3aXRoIGEgcHVibGljIGVuZHBvaW50IHRoYXQgZG9lc24ndFxuICAvLyByZXF1aXJlIGF1dGggXHUyMDE0IHBlcmZlY3QgZm9yIHRoZSBsb2NrZWQtb3V0IHN0YXRlLlxuICB3aW5kb3cuX3JlZnJlc2hSZWNvdmVyeUxpbmsgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgZmV0Y2hSZWNvdmVyeUluZm8oKTtcbiAgICAvLyBTaG93IHRoZSBsaW5rIGluIGFueSBub24taGVhbHRoeSBzdGF0ZSAodW5yZWFkYWJsZSAvIGNvcnJ1cHQgLyB1bmtub3duKS5cbiAgICAvLyBUaGUgaGludCBpbnNpZGUgdGhlIHBhbmVsIHRlbGxzIHRoZSB1c2VyIHdoYXQgdGhlIGFjdHVhbCBpc3N1ZSBpcy5cbiAgICBpZiAoaW5mbyAmJiBpbmZvLnN1Y2Nlc3MgJiYgaW5mby5zdGF0dXMgJiYgaW5mby5zdGF0dXMgIT09ICdoZWFsdGh5Jykge1xuICAgICAgc2hvd1JlY292ZXJ5TGluayh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd1JlY292ZXJ5TGluayhmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9O1xufSkoKTtcbjtcbi8vID09PT09IEVOQ1JZUFRFRCBWQVVMVCAtPiBTRVJWSUNFIFNTTyBIQU5ET0ZGID09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIGlzQWxsb3dlZFJldHVyblVybChyZXR1cm5VcmwsIGV4cGVjdGVkU2VydmljZUlkKSB7XG4gICAgaWYgKCFyZXR1cm5VcmwgfHwgIWV4cGVjdGVkU2VydmljZUlkIHx8ICEvXlthLXowLTldW2EtejAtOS1dKiQvLnRlc3QoZXhwZWN0ZWRTZXJ2aWNlSWQpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmV0dXJuVXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgIGNvbnN0IHN1ZmZpeCA9IFNJVEUudGxkLnN0YXJ0c1dpdGgoJy4nKSA/IFNJVEUudGxkIDogYC4ke1NJVEUudGxkfWA7XG4gICAgICBjb25zdCBleHBlY3RlZEhvc3QgPSBgJHtleHBlY3RlZFNlcnZpY2VJZH0ke3N1ZmZpeH1gO1xuICAgICAgcmV0dXJuIHBhcnNlZC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiYgcGFyc2VkLmhvc3RuYW1lID09PSBleHBlY3RlZEhvc3Q7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkSGFuZG9mZlRhcmdldChyZXR1cm5VcmwsIHRva2VuLCBleHBlY3RlZFNlcnZpY2VJZCkge1xuICAgIGlmICghaXNBbGxvd2VkUmV0dXJuVXJsKHJldHVyblVybCwgZXhwZWN0ZWRTZXJ2aWNlSWQpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHJldHVyblVybCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgaWYgKCF0b2tlbikgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCByZXR1cm5QYXRoID0gYCR7cGFyc2VkLnBhdGhuYW1lfSR7cGFyc2VkLnNlYXJjaH0ke3BhcnNlZC5oYXNofWA7XG4gICAgLy8gVGhlIHNoYXJlZCAoZGFzaGNhZGR5X2F1dGgpIENhZGR5IHNuaXBwZXQgaW5zdGFsbHMgdGhpcyBwdWJsaWMgbGFuZGluZ1xuICAgIC8vIHJvdXRlIG9uIGV2ZXJ5IHByb3RlY3RlZCBob3N0LiBJdCByZXdyaXRlcyB0byAvYXBpL3YxL2F1dGgvc3NvLWV4Y2hhbmdlLlxuICAgIHBhcnNlZC5wYXRobmFtZSA9ICcvZGFzaGNhZGR5LXNzbyc7XG4gICAgcGFyc2VkLnNlYXJjaCA9ICcnO1xuICAgIHBhcnNlZC5oYXNoID0gJyc7XG4gICAgcGFyc2VkLnNlYXJjaFBhcmFtcy5zZXQoJ3Rva2VuJywgdG9rZW4pO1xuICAgIHBhcnNlZC5zZWFyY2hQYXJhbXMuc2V0KCdyZXR1cm4nLCByZXR1cm5QYXRoKTtcbiAgICByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZXN1bWUocmV0dXJuVXJsLCBleHBlY3RlZFNlcnZpY2VJZCwgcnVudGltZSA9IHt9KSB7XG4gICAgaWYgKCFpc0FsbG93ZWRSZXR1cm5VcmwocmV0dXJuVXJsLCBleHBlY3RlZFNlcnZpY2VJZCkpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBmZXRjaEZuID0gcnVudGltZS5mZXRjaCB8fCB3aW5kb3cuZmV0Y2guYmluZCh3aW5kb3cpO1xuICAgIGNvbnN0IGxvY2F0aW9uT2JqID0gcnVudGltZS5sb2NhdGlvbiB8fCB3aW5kb3cubG9jYXRpb247XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hGbihgL2FwaS92MS9hdXRoL3Nzby1oYW5kb2ZmP3NlcnZpY2VJZD0ke2VuY29kZVVSSUNvbXBvbmVudChleHBlY3RlZFNlcnZpY2VJZCl9YCwge1xuICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgICBjYWNoZTogJ25vLXN0b3JlJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGRhdGEuc3VjY2VzcyAmJiBidWlsZEhhbmRvZmZUYXJnZXQocmV0dXJuVXJsLCBkYXRhLnNzb1Rva2VuLCBleHBlY3RlZFNlcnZpY2VJZCk7XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIGZhbHNlO1xuICAgICAgbG9jYXRpb25PYmoucmVwbGFjZSh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHdpbmRvdy5EQ0NyZWRlbnRpYWxWYXVsdCA9IHsgaXNBbGxvd2VkUmV0dXJuVXJsLCBidWlsZEhhbmRvZmZUYXJnZXQsIHJlc3VtZSB9O1xufSkoKTs7XG4vLyA9PT09PSBTRVJWSUNFIENSRURFTlRJQUxTID09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcbiAgaW5qZWN0TW9kYWwoJ2ZvbGRlci1icm93c2VyLW1vZGFsJywgYDxkaXYgaWQ9XCJmb2xkZXItYnJvd3Nlci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNTAwcHg7IG1heC13aWR0aDogNzAwcHg7IG1heC1oZWlnaHQ6IDgwdmg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0MyIEJyb3dzZSBmb3IgTWVkaWEgRm9sZGVyczwvaDM+XG5cbiAgICAgIDxkaXYgaWQ9XCJmb2xkZXItYnJvd3Nlci1wYXRoXCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuOXJlbTsgd29yZC1icmVhazogYnJlYWstYWxsO1wiPlxuICAgICAgICAvXG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImZvbGRlci1icm93c2VyLWxpc3RcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDQwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TG9hZGluZy4uLjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJmb2xkZXItYnJvd3Nlci1zZWxlY3RlZFwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXN1Y2Nlc3MpIDEwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zdWNjZXNzKTsgYm9yZGVyLXJhZGl1czogNnB4OyBkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7IG1hcmdpbi1ib3R0b206IDZweDtcIj5TZWxlY3RlZCBmb2xkZXJzOjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZm9sZGVyLWJyb3dzZXItc2VsZWN0ZWQtbGlzdFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDZweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZm9sZGVyLWJyb3dzZXItc2VsZWN0LWN1cnJlbnRcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5cbiAgICAgICAgICArIEFkZCBDdXJyZW50IEZvbGRlclxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJmb2xkZXItYnJvd3Nlci1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZm9sZGVyLWJyb3dzZXItZG9uZVwiIHN0eWxlPVwiYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXN1Y2Nlc3MpIDIwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7XCI+RG9uZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBpbmplY3RNb2RhbCgnc2VydmljZS1jcmVkcy1tb2RhbCcsIGA8ZGl2IGlkPVwic2VydmljZS1jcmVkcy1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNyZWRzLWNvbnRlbnRcIj5cbiAgICAgIDxoMyBpZD1cInN2Yy1jcmVkcy10aXRsZVwiIHN0eWxlPVwibWFyZ2luOiAwIDAgNHB4OyBmb250LXNpemU6IDEuMDVyZW07XCI+RW5jcnlwdGVkIENyZWRlbnRpYWwgVmF1bHQ8L2gzPlxuICAgICAgPHAgaWQ9XCJzdmMtY3JlZHMtZGVzY1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNHB4O1wiPlBhc3N3b3JkcyBhcmUgZW5jcnlwdGVkIGF0IHJlc3QgYW5kIHVzZWQgYXV0b21hdGljYWxseSB3aGVuIHlvdSBvcGVuIHRoaXMgc2VydmljZS48L3A+XG5cbiAgICAgIDwhLS0gU3RhdHVzIGluZGljYXRvciAtLT5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJzdmMtY3JlZHMtZG90XCIgY2xhc3M9XCJzdGF0dXMtZG90XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBpZD1cInN2Yy1jcmVkcy1zdGF0dXNcIiBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5ObyBjcmVkZW50aWFscyBzdG9yZWQ8L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZWVkaG9zdCBjcmVkZW50aWFscyAoc2hvd24gZm9yIGV4dGVybmFsIHNlcnZpY2VzKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdmMtY3JlZHMtc2VlZGhvc3RcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE0cHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLWJvbGRcIj5TZWVkaG9zdCBMb2dpbjwvbGFiZWw+XG4gICAgICAgIDxwIGNsYXNzPVwiaGludC1taWNyb1wiPlVzZXJuYW1lIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcnZpY2VzLiBQYXNzd29yZCBpcyBwZXItc2VydmljZS48L3A+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3ZjLXNlZWRob3N0LXVzZXJcIiBwbGFjZWhvbGRlcj1cIlVzZXJuYW1lIChzaGFyZWQpXCIgYXV0b2NvbXBsZXRlPVwidXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEwcHg7IG1hcmdpbi1ib3R0b206IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIiAvPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJzdmMtc2VlZGhvc3QtcGFzc1wiIHBsYWNlaG9sZGVyPVwiUGFzc3dvcmRcIiBhdXRvY29tcGxldGU9XCJjdXJyZW50LXBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtY3JlZHNcIiAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQVBJIEtleSAoc2hvd24gZm9yIGFyciBzZXJ2aWNlcyBvciBzZXJ2aWNlcyB3aXRoIEFQSSBrZXkgc3VwcG9ydCkgLS0+XG4gICAgICA8ZGl2IGlkPVwic3ZjLWNyZWRzLWFwaWtleVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTRweDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtYm9sZFwiPkFQSSBLZXk8L2xhYmVsPlxuICAgICAgICA8cCBjbGFzcz1cImhpbnQtbWljcm9cIj5CeXBhc3NlcyB0aGUgYXBwJ3Mgb3duIGxvZ2luIHNjcmVlbjwvcD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzdmMtYXBpa2V5LWlucHV0XCIgcGxhY2Vob2xkZXI9XCJBUEkga2V5XCJcbiAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBRdWFsaXR5IFByb2ZpbGUgKHNob3duIGZvciByYWRhcnIvc29uYXJyIG9ubHkpIC0tPlxuICAgICAgPGRpdiBpZD1cInN2Yy1jcmVkcy1xdWFsaXR5XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1ib2xkXCI+UXVhbGl0eSBQcm9maWxlPC9sYWJlbD5cbiAgICAgICAgPHAgY2xhc3M9XCJoaW50LW1pY3JvXCI+VXNlZCB3aGVuIHJlcXVlc3RpbmcgdmlhIFNlZXJyPC9wPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInN2Yy1xdWFsaXR5LXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDhweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIEVudGVyIEFQSSBrZXkgZmlyc3QgLS08L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic3ZjLXF1YWxpdHktZmV0Y2hcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDEycHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY3Vyc29yOiBwb2ludGVyOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgRmV0Y2hcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJzdmMtcXVhbGl0eS1zdGF0dXNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgbWFyZ2luLXRvcDogNHB4OyBtaW4taGVpZ2h0OiAxZW07XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQZXItc2VydmljZSBCYXNpYyBBdXRoIChzaG93biBmb3Igbm9uLWV4dGVybmFsIHNlcnZpY2VzKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdmMtY3JlZHMtYmFzaWNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE0cHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLWJvbGRcIj5TZXJ2aWNlIExvZ2luPC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzdmMtYmFzaWMtdXNlclwiIHBsYWNlaG9sZGVyPVwiVXNlcm5hbWVcIiBhdXRvY29tcGxldGU9XCJ1c2VybmFtZVwiXG4gICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTBweDsgbWFyZ2luLXRvcDogNnB4OyBtYXJnaW4tYm90dG9tOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCIgLz5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwic3ZjLWJhc2ljLXBhc3NcIiBwbGFjZWhvbGRlcj1cIlBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwiY3VycmVudC1wYXNzd29yZFwiXG4gICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWNyZWRzXCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVycm9yIG1lc3NhZ2UgLS0+XG4gICAgICA8ZGl2IGlkPVwic3ZjLWNyZWRzLWVycm9yXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBwYWRkaW5nOiA4cHggMTBweDsgbWFyZ2luLWJvdHRvbTogMTBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWVycm9yLCAjYzYyODI4KSAxMiUsIHRyYW5zcGFyZW50KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZXJyb3IsICNjNjI4MjgpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPjwvZGl2PlxuXG4gICAgICA8IS0tIEJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi10b3A6IDE0cHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzdmMtY3JlZHMtc2F2ZVwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogOXB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgU2F2ZSB0byBlbmNyeXB0ZWQgdmF1bHRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzdmMtY3JlZHMtY2xlYXJcIiBzdHlsZT1cInBhZGRpbmc6IDlweCAxNHB4OyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuODVyZW07IGRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgQ2xlYXJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzdmMtY3JlZHMtY2xvc2VcIiBzdHlsZT1cInBhZGRpbmc6IDlweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWNyZWRzLW1vZGFsJyk7XG4gIGxldCBjdXJyZW50U2VydmljZSA9IG51bGw7XG4gIGxldCBjcmVkZW50aWFsUmV0dXJuVXJsID0gbnVsbDtcbiAgbGV0IGN1cnJlbnRTZXJ2aWNlSGFkQ3JlZHMgPSBmYWxzZTtcbiAgY29uc3QgYXJyU2VydmljZXMgPSBbJ3NvbmFycicsICdyYWRhcnInLCAncHJvd2xhcnInLCAnb3ZlcnNlZXJyJ107XG4gIGNvbnN0IHF1YWxpdHlQcm9maWxlU2VydmljZXMgPSBbJ3NvbmFycicsICdyYWRhcnInXTtcblxuICBmdW5jdGlvbiBnZXRTZXJ2aWNlVXJsKHNlcnZpY2UpIHtcbiAgICByZXR1cm4gc2VydmljZS5leHRlcm5hbFVybCB8fCBzZXJ2aWNlLnVybCB8fCAnJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dFcnJvcihtc2cpIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtZXJyb3InKTtcbiAgICBlbC50ZXh0Q29udGVudCA9IG1zZztcbiAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlRXJyb3IoKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWVycm9yJyk7XG4gICAgZWwudGV4dENvbnRlbnQgPSAnJztcbiAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVxdWlyZVN1Y2Nlc3NmdWxXcml0ZShyZXNwb25zZSwgbGFiZWwpIHtcbiAgICBpZiAoIXJlc3BvbnNlKSB0aHJvdyBuZXcgRXJyb3IoYCR7bGFiZWx9IGZhaWxlZDogbm8gcmVzcG9uc2VgKTtcbiAgICBsZXQgZGF0YTtcbiAgICB0cnkge1xuICAgICAgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bGFiZWx9IGZhaWxlZDogaW52YWxpZCBzZXJ2ZXIgcmVzcG9uc2VgKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5vayB8fCBkYXRhPy5zdWNjZXNzICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGF0YT8uZXJyb3IgfHwgYCR7bGFiZWx9IGZhaWxlZCAoJHtyZXNwb25zZS5zdGF0dXMgfHwgJ3Vua25vd24gc3RhdHVzJ30pYCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNBbGxvd2VkQ3JlZGVudGlhbFJldHVyblVybChyZXR1cm5VcmwsIHNlcnZpY2VJZCkge1xuICAgIHJldHVybiAhIXdpbmRvdy5EQ0NyZWRlbnRpYWxWYXVsdD8uaXNBbGxvd2VkUmV0dXJuVXJsKHJldHVyblVybCwgc2VydmljZUlkKTtcbiAgfVxuXG4gIHdpbmRvdy5vcGVuU2VydmljZUNyZWRzTW9kYWwgPSBhc3luYyBmdW5jdGlvbihzZXJ2aWNlLCBvcHRpb25zID0ge30pIHtcbiAgICBjdXJyZW50U2VydmljZSA9IHNlcnZpY2U7XG4gICAgY3JlZGVudGlhbFJldHVyblVybCA9IGlzQWxsb3dlZENyZWRlbnRpYWxSZXR1cm5Vcmwob3B0aW9ucy5yZXR1cm5VcmwsIHNlcnZpY2UuaWQpID8gb3B0aW9ucy5yZXR1cm5VcmwgOiBudWxsO1xuICAgIGN1cnJlbnRTZXJ2aWNlSGFkQ3JlZHMgPSBmYWxzZTtcbiAgICBoaWRlRXJyb3IoKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtdGl0bGUnKTtcbiAgICBjb25zdCBkZXNjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1kZXNjJyk7XG4gICAgY29uc3Qgc2VlZGhvc3RTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1zZWVkaG9zdCcpO1xuICAgIGNvbnN0IGFwaWtleVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWFwaWtleScpO1xuICAgIGNvbnN0IGJhc2ljU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtYmFzaWMnKTtcbiAgICBjb25zdCBxdWFsaXR5U2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtcXVhbGl0eScpO1xuXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBzZXJ2aWNlLm5hbWUgKyAnIFx1MjAxNCBFbmNyeXB0ZWQgVmF1bHQnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtc2F2ZScpLnRleHRDb250ZW50ID0gY3JlZGVudGlhbFJldHVyblVybFxuICAgICAgPyAnU2F2ZSB0byB2YXVsdCAmIG9wZW4gc2VydmljZSdcbiAgICAgIDogJ1NhdmUgdG8gZW5jcnlwdGVkIHZhdWx0JztcbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggc2VjdGlvbnMgdG8gc2hvd1xuICAgIGNvbnN0IGlzRXh0ID0gISFzZXJ2aWNlLmlzRXh0ZXJuYWw7XG4gICAgY29uc3QgaXNBcnIgPSBhcnJTZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlLmlkKSB8fCBhcnJTZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlLmFwcFRlbXBsYXRlKTtcbiAgICBjb25zdCBoYXNRdWFsaXR5ID0gcXVhbGl0eVByb2ZpbGVTZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlLmlkKSB8fCBxdWFsaXR5UHJvZmlsZVNlcnZpY2VzLmluY2x1ZGVzKHNlcnZpY2UuYXBwVGVtcGxhdGUpO1xuXG4gICAgc2VlZGhvc3RTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBpc0V4dCA/ICcnIDogJ25vbmUnO1xuICAgIGFwaWtleVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9IGlzQXJyID8gJycgOiAnbm9uZSc7XG4gICAgcXVhbGl0eVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9IGhhc1F1YWxpdHkgPyAnJyA6ICdub25lJztcbiAgICBiYXNpY1NlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICFpc0V4dCA/ICcnIDogJ25vbmUnO1xuXG4gICAgLy8gUmVzZXQgcXVhbGl0eSBkcm9wZG93blxuICAgIGNvbnN0IHF1YWxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc2VsZWN0Jyk7XG4gICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIEVudGVyIEFQSSBrZXkgZmlyc3QgLS08L29wdGlvbj4nO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zdGF0dXMnKS50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgaWYgKGlzRXh0KSB7XG4gICAgICBkZXNjLnRleHRDb250ZW50ID0gJ1NlZWRob3N0IGNyZWRlbnRpYWxzIGF1dG8tbG9naW4gcGFzdCB0aGUgSFRUUCBwcm9tcHQuIEFQSSBrZXkgYnlwYXNzZXMgdGhlIGFwcCBsb2dpbi4nO1xuICAgICAgLy8gVXBkYXRlIHBhc3N3b3JkIHBsYWNlaG9sZGVyIHdpdGggc2VydmljZSBuYW1lXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXBhc3MnKS5wbGFjZWhvbGRlciA9IGBQYXNzd29yZCBmb3IgJHtzZXJ2aWNlLm5hbWV9YDtcbiAgICB9IGVsc2UgaWYgKGlzQXJyKSB7XG4gICAgICBkZXNjLnRleHRDb250ZW50ID0gJ0FQSSBrZXkgYnlwYXNzZXMgdGhlIGFwcCBsb2dpbiBzY3JlZW4gYXV0b21hdGljYWxseS4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXNjLnRleHRDb250ZW50ID0gJ0NyZWRlbnRpYWxzIGFyZSBpbmplY3RlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYWNjZXNzaW5nIHRoaXMgc2VydmljZS4nO1xuICAgIH1cblxuICAgIC8vIExvYWQgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAgICBhd2FpdCBsb2FkU2VydmljZUNyZWRzKHNlcnZpY2UpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfTtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkU2VydmljZUNyZWRzKHNlcnZpY2UpIHtcbiAgICBjb25zdCBkb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWRvdCcpO1xuICAgIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtc3RhdHVzJyk7XG4gICAgY29uc3QgY2xlYXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWNsZWFyJyk7XG4gICAgbGV0IGhhc0NyZWRzID0gZmFsc2U7XG5cbiAgICAvLyBMb2FkIHNlZWRob3N0IGNyZWRzIChzaGFyZWQgdXNlcm5hbWUgKyBwZXItc2VydmljZSBwYXNzd29yZClcbiAgICBpZiAoc2VydmljZS5pc0V4dGVybmFsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZWVkaG9zdC1jcmVkcz9zZXJ2aWNlSWQ9JHtzZXJ2aWNlLmlkfWApO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtdXNlcicpLnZhbHVlID0gZGF0YS51c2VybmFtZSB8fCAnJztcbiAgICAgICAgICBpZiAoZGF0YS5oYXNDcmVkZW50aWFscykgaGFzQ3JlZHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtdXNlcicpLnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtcGFzcycpLnZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgLy8gTG9hZCBwZXItc2VydmljZSBjcmVkc1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZXJ2aWNlcy8ke3NlcnZpY2UuaWR9L2NyZWRlbnRpYWxzYCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgaWYgKGRhdGEuaGFzQXBpS2V5KSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1hcGlrZXktaW5wdXQnKS52YWx1ZSA9ICdcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjInO1xuICAgICAgICAgIGhhc0NyZWRzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWFwaWtleS1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuaGFzQmFzaWNBdXRoICYmICFzZXJ2aWNlLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXVzZXInKS52YWx1ZSA9IGRhdGEudXNlcm5hbWUgfHwgJyc7XG4gICAgICAgICAgaGFzQ3JlZHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtdXNlcicpLnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtcGFzcycpKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXBhc3MnKS52YWx1ZSA9ICcnO1xuXG4gICAgLy8gTG9hZCBxdWFsaXR5IHByb2ZpbGUgZm9yIGFyciBzZXJ2aWNlc1xuICAgIGNvbnN0IHN2Y0lkID0gc2VydmljZS5pZCB8fCBzZXJ2aWNlLmFwcFRlbXBsYXRlO1xuICAgIGlmIChxdWFsaXR5UHJvZmlsZVNlcnZpY2VzLmluY2x1ZGVzKHN2Y0lkKSkge1xuICAgICAgYXdhaXQgbG9hZFF1YWxpdHlQcm9maWxlcyhzZXJ2aWNlKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzQ3JlZHMpIHtcbiAgICAgIGN1cnJlbnRTZXJ2aWNlSGFkQ3JlZHMgPSB0cnVlO1xuICAgICAgZG90LnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tb2stZmcsICM3NGRmYzQpJztcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZywgIzc0ZGZjNCknO1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ0NyZWRlbnRpYWxzIHN0b3JlZCc7XG4gICAgICBjbGVhckJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAvLyBVcGRhdGUgdGhlIGNhcmQgYnV0dG9uXG4gICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgY3JlZHMtYnRuLSR7c2VydmljZS5pZH1gKTtcbiAgICAgIGlmIChidG4pIGJ0bi5jbGFzc0xpc3QuYWRkKCdoYXMtY3JlZHMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG90LnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tbXV0ZWQpJztcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ05vIGNyZWRlbnRpYWxzIHN0b3JlZCc7XG4gICAgICBjbGVhckJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZldGNoIGFuZCBwb3B1bGF0ZSBxdWFsaXR5IHByb2ZpbGVzIGRyb3Bkb3duXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRRdWFsaXR5UHJvZmlsZXMoc2VydmljZSkge1xuICAgIGNvbnN0IHF1YWxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc2VsZWN0Jyk7XG4gICAgY29uc3QgcXVhbFN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zdGF0dXMnKTtcbiAgICBjb25zdCBzdmNJZCA9IHNlcnZpY2UuaWQgfHwgc2VydmljZS5hcHBUZW1wbGF0ZTtcbiAgICBjb25zdCBzdmNVcmwgPSBnZXRTZXJ2aWNlVXJsKHNlcnZpY2UpO1xuXG4gICAgaWYgKCFzdmNVcmwpIHtcbiAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBObyBzZXJ2aWNlIFVSTCAtLTwvb3B0aW9uPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPkxvYWRpbmcuLi48L29wdGlvbj4nO1xuICAgIHF1YWxTdGF0dXMudGV4dENvbnRlbnQgPSAnJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgc2VydmljZTogc3ZjSWQsIHVybDogc3ZjVXJsIH0pO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvYXJyL3F1YWxpdHktcHJvZmlsZXM/JHtwYXJhbXN9YCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEucHJvZmlsZXM/Lmxlbmd0aCkge1xuICAgICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gTm8gcHJvZmlsZXMgZm91bmQgKGVudGVyIEFQSSBrZXkgYW5kIGNsaWNrIEZldGNoKSAtLTwvb3B0aW9uPic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnJztcbiAgICAgIGZvciAoY29uc3QgcCBvZiBkYXRhLnByb2ZpbGVzKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQudmFsdWUgPSBwLmlkO1xuICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBwLm5hbWU7XG4gICAgICAgIHF1YWxTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJlLXNlbGVjdCBzdG9yZWQgcHJvZmlsZSBvciBiZXN0IG1hdGNoIGZvciBcIjcyMFwiXG4gICAgICBpZiAoZGF0YS5zdG9yZWRQcm9maWxlSWQpIHtcbiAgICAgICAgcXVhbFNlbGVjdC52YWx1ZSA9IFN0cmluZyhkYXRhLnN0b3JlZFByb2ZpbGVJZCk7XG4gICAgICB9XG4gICAgICBpZiAoIXF1YWxTZWxlY3QudmFsdWUpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSA3MjBwLWlzaCBwcm9maWxlXG4gICAgICAgIGNvbnN0IG1hdGNoNzIwID0gZGF0YS5wcm9maWxlcy5maW5kKHAgPT4gLzcyMC9pLnRlc3QocC5uYW1lKSk7XG4gICAgICAgIGlmIChtYXRjaDcyMCkgcXVhbFNlbGVjdC52YWx1ZSA9IFN0cmluZyhtYXRjaDcyMC5pZCk7XG4gICAgICB9XG4gICAgICBpZiAoIXF1YWxTZWxlY3QudmFsdWUgJiYgZGF0YS5wcm9maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgcXVhbFNlbGVjdC52YWx1ZSA9IFN0cmluZyhkYXRhLnByb2ZpbGVzWzBdLmlkKTtcbiAgICAgIH1cblxuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiR7ZGF0YS5wcm9maWxlcy5sZW5ndGh9IHByb2ZpbGVzIGxvYWRlZDwvc3Bhbj5gO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBGYWlsZWQgdG8gbG9hZCAtLTwvb3B0aW9uPic7XG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1lcnJvciwgI2M2MjgyOCk7XCI+RXJyb3I6ICR7ZS5tZXNzYWdlfTwvc3Bhbj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZldGNoIGJ1dHRvbiBmb3IgcXVhbGl0eSBwcm9maWxlc1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktZmV0Y2gnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjdXJyZW50U2VydmljZSkgcmV0dXJuO1xuICAgIGNvbnN0IHN2Y0lkID0gY3VycmVudFNlcnZpY2UuaWQgfHwgY3VycmVudFNlcnZpY2UuYXBwVGVtcGxhdGU7XG4gICAgY29uc3Qgc3ZjVXJsID0gZ2V0U2VydmljZVVybChjdXJyZW50U2VydmljZSk7XG4gICAgY29uc3QgYXBpS2V5SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWFwaWtleS1pbnB1dCcpO1xuICAgIGNvbnN0IGFwaUtleSA9IGFwaUtleUlucHV0Py52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgcXVhbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zZWxlY3QnKTtcbiAgICBjb25zdCBxdWFsU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXN0YXR1cycpO1xuXG4gICAgaWYgKCFzdmNVcmwpIHtcbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj5ObyBzZXJ2aWNlIFVSTCBhdmFpbGFibGU8L3NwYW4+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFhcGlLZXkgfHwgYXBpS2V5ID09PSAnXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyJykge1xuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPkVudGVyIGFuIEFQSSBrZXkgZmlyc3Q8L3NwYW4+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+RmV0Y2hpbmcuLi48L29wdGlvbj4nO1xuICAgIHF1YWxTdGF0dXMudGV4dENvbnRlbnQgPSAnJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgc2VydmljZTogc3ZjSWQsIHVybDogc3ZjVXJsLCBhcGlLZXkgfSk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcnIvcXVhbGl0eS1wcm9maWxlcz8ke3BhcmFtc31gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gRXJyb3IgLS08L29wdGlvbj4nO1xuICAgICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1lcnJvciwgI2M2MjgyOCk7XCI+JHtkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gZmV0Y2ggcHJvZmlsZXMnfTwvc3Bhbj5gO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghZGF0YS5wcm9maWxlcz8ubGVuZ3RoKSB7XG4gICAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBObyBwcm9maWxlcyBmb3VuZCAtLTwvb3B0aW9uPic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnJztcbiAgICAgIGZvciAoY29uc3QgcCBvZiBkYXRhLnByb2ZpbGVzKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQudmFsdWUgPSBwLmlkO1xuICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBwLm5hbWU7XG4gICAgICAgIHF1YWxTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJlLXNlbGVjdCA3MjBwIG1hdGNoXG4gICAgICBjb25zdCBtYXRjaDcyMCA9IGRhdGEucHJvZmlsZXMuZmluZChwID0+IC83MjAvaS50ZXN0KHAubmFtZSkpO1xuICAgICAgaWYgKG1hdGNoNzIwKSBxdWFsU2VsZWN0LnZhbHVlID0gU3RyaW5nKG1hdGNoNzIwLmlkKTtcbiAgICAgIGVsc2UgaWYgKGRhdGEucHJvZmlsZXMubGVuZ3RoKSBxdWFsU2VsZWN0LnZhbHVlID0gU3RyaW5nKGRhdGEucHJvZmlsZXNbMF0uaWQpO1xuXG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1vay1mZyk7XCI+JHtkYXRhLnByb2ZpbGVzLmxlbmd0aH0gcHJvZmlsZXMgbG9hZGVkPC9zcGFuPmA7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIEVycm9yIC0tPC9vcHRpb24+JztcbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj4ke2UubWVzc2FnZX08L3NwYW4+YDtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFNhdmUgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWN1cnJlbnRTZXJ2aWNlKSByZXR1cm47XG4gICAgY29uc3Qgc2F2ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtc2F2ZScpO1xuICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2aW5nLi4uJztcbiAgICBzYXZlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBoaWRlRXJyb3IoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpc0FyciA9IGFyclNlcnZpY2VzLmluY2x1ZGVzKGN1cnJlbnRTZXJ2aWNlLmlkKSB8fCBhcnJTZXJ2aWNlcy5pbmNsdWRlcyhjdXJyZW50U2VydmljZS5hcHBUZW1wbGF0ZSk7XG4gICAgICBjb25zdCBzdmNJZCA9IGN1cnJlbnRTZXJ2aWNlLmlkIHx8IGN1cnJlbnRTZXJ2aWNlLmFwcFRlbXBsYXRlO1xuXG4gICAgICBpZiAoY3JlZGVudGlhbFJldHVyblVybCAmJiAhY3VycmVudFNlcnZpY2VIYWRDcmVkcykge1xuICAgICAgICBjb25zdCBleHRlcm5hbFVzZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXVzZXInKS52YWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnN0IGV4dGVybmFsUGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtcGFzcycpLnZhbHVlO1xuICAgICAgICBjb25zdCBhcGlLZXlJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYXBpa2V5LWlucHV0Jyk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZEFwaUtleSA9IGFwaUtleUlucHV0Py52YWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnN0IGJhc2ljVXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtdXNlcicpLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgY29uc3QgYmFzaWNQYXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1iYXNpYy1wYXNzJykudmFsdWU7XG4gICAgICAgIGNvbnN0IGhhc0V4dGVybmFsTG9naW4gPSBjdXJyZW50U2VydmljZS5pc0V4dGVybmFsICYmIGV4dGVybmFsVXNlciAmJiBleHRlcm5hbFBhc3M7XG4gICAgICAgIGNvbnN0IGhhc0FwaUtleSA9IGlzQXJyICYmIHJlcXVlc3RlZEFwaUtleSAmJiByZXF1ZXN0ZWRBcGlLZXkgIT09ICdcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjInO1xuICAgICAgICBjb25zdCBoYXNCYXNpY0xvZ2luID0gIWN1cnJlbnRTZXJ2aWNlLmlzRXh0ZXJuYWwgJiYgYmFzaWNVc2VyICYmIGJhc2ljUGFzcztcbiAgICAgICAgaWYgKCFoYXNFeHRlcm5hbExvZ2luICYmICFoYXNBcGlLZXkgJiYgIWhhc0Jhc2ljTG9naW4pIHtcbiAgICAgICAgICBzaG93RXJyb3IoJ0VudGVyIHRoZSBsb2dpbiBvciBBUEkga2V5IERhc2hDYWRkeSBzaG91bGQgc3RvcmUgZm9yIHRoaXMgc2VydmljZS4nKTtcbiAgICAgICAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmUgdG8gdmF1bHQgJiBvcGVuIHNlcnZpY2UnO1xuICAgICAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2F2ZSBzZWVkaG9zdCBjcmVkcyAoc2hhcmVkIHVzZXJuYW1lICsgcGVyLXNlcnZpY2UgcGFzc3dvcmQpXG4gICAgICBpZiAoY3VycmVudFNlcnZpY2UuaXNFeHRlcm5hbCkge1xuICAgICAgICBjb25zdCB1c2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC11c2VyJykudmFsdWUudHJpbSgpO1xuICAgICAgICBjb25zdCBwYXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC1wYXNzJykudmFsdWU7XG4gICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zZWVkaG9zdC1jcmVkcycsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVzZXJuYW1lOiB1c2VyLCBwYXNzd29yZDogcGFzcyB8fCB1bmRlZmluZWQsIHNlcnZpY2VJZDogY3VycmVudFNlcnZpY2UuaWQgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhd2FpdCByZXF1aXJlU3VjY2Vzc2Z1bFdyaXRlKHJlc3BvbnNlLCAnU2VlZGhvc3QgY3JlZGVudGlhbCBzYXZlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2F2ZSBBUEkga2V5IFx1MjAxNCBmb3IgYXJyIHNlcnZpY2VzLCB1c2UgdGhlIGFyciBjcmVkZW50aWFscyBlbmRwb2ludCAoY29ycmVjdCBuYW1lc3BhY2UpXG4gICAgICBjb25zdCBhcGlLZXlJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYXBpa2V5LWlucHV0Jyk7XG4gICAgICBjb25zdCBhcGlLZXkgPSBhcGlLZXlJbnB1dD8udmFsdWUudHJpbSgpO1xuICAgICAgaWYgKGFwaUtleSAmJiBhcGlLZXkgIT09ICdcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjInKSB7XG4gICAgICAgIGlmIChpc0Fycikge1xuICAgICAgICAgIC8vIFVzZSBhcnIgY3JlZGVudGlhbHMgZW5kcG9pbnQgXHUyMDE0IHZhbGlkYXRlcyBrZXksIHRlc3RzIGNvbm5lY3Rpb24sIHN0b3JlcyBpbiBhcnIuKiBuYW1lc3BhY2VcbiAgICAgICAgICBjb25zdCBzdmNVcmwgPSBnZXRTZXJ2aWNlVXJsKGN1cnJlbnRTZXJ2aWNlKTtcbiAgICAgICAgICBjb25zdCBxdWFsU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXNlbGVjdCcpO1xuICAgICAgICAgIGNvbnN0IHF1YWxpdHlQcm9maWxlSWQgPSBxdWFsU2VsZWN0Py52YWx1ZSA/IHBhcnNlSW50KHF1YWxTZWxlY3QudmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IHF1YWxpdHlQcm9maWxlTmFtZSA9IHF1YWxTZWxlY3Q/LnNlbGVjdGVkT3B0aW9ucz8uWzBdPy50ZXh0Q29udGVudCB8fCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hcnIvY3JlZGVudGlhbHMnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBzZXJ2aWNlOiBzdmNJZCxcbiAgICAgICAgICAgICAgYXBpS2V5LFxuICAgICAgICAgICAgICB1cmw6IHN2Y1VybCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHF1YWxpdHlQcm9maWxlSWQ6IHF1YWxpdHlQcm9maWxlSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBxdWFsaXR5UHJvZmlsZU5hbWU6IHF1YWxpdHlQcm9maWxlTmFtZSB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVpcmVTdWNjZXNzZnVsV3JpdGUocmVzLCAnQVJSIGNyZWRlbnRpYWwgc2F2ZScpO1xuICAgICAgICAgIGlmIChkYXRhLmNvbm5lY3Rpb25UZXN0ICYmICFkYXRhLmNvbm5lY3Rpb25UZXN0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHNob3dFcnJvcihgQVBJIGtleSBzYXZlZCBidXQgY29ubmVjdGlvbiB0ZXN0IGZhaWxlZDogJHtkYXRhLmNvbm5lY3Rpb25UZXN0LmVycm9yfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOb24tYXJyIHNlcnZpY2VzIHVzZSB0aGUgZ2VuZXJpYyBlbmRwb2ludFxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHtjdXJyZW50U2VydmljZS5pZH0vY3JlZGVudGlhbHNgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhcGlLZXkgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhd2FpdCByZXF1aXJlU3VjY2Vzc2Z1bFdyaXRlKHJlc3BvbnNlLCAnQVBJIGtleSBzYXZlJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNBcnIgJiYgcXVhbGl0eVByb2ZpbGVTZXJ2aWNlcy5pbmNsdWRlcyhzdmNJZCkpIHtcbiAgICAgICAgLy8gQVBJIGtleSB1bmNoYW5nZWQgYnV0IHVzZXIgbWF5IGhhdmUgY2hhbmdlZCBxdWFsaXR5IHByb2ZpbGUgXHUyMDE0IHNhdmUgcHJvZmlsZSBvbmx5XG4gICAgICAgIGNvbnN0IHF1YWxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc2VsZWN0Jyk7XG4gICAgICAgIGNvbnN0IHF1YWxpdHlQcm9maWxlSWQgPSBxdWFsU2VsZWN0Py52YWx1ZSA/IHBhcnNlSW50KHF1YWxTZWxlY3QudmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBxdWFsaXR5UHJvZmlsZU5hbWUgPSBxdWFsU2VsZWN0Py5zZWxlY3RlZE9wdGlvbnM/LlswXT8udGV4dENvbnRlbnQgfHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAocXVhbGl0eVByb2ZpbGVJZCkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXJyL3F1YWxpdHktcHJvZmlsZXMnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXJ2aWNlOiBzdmNJZCwgcXVhbGl0eVByb2ZpbGVJZCwgcXVhbGl0eVByb2ZpbGVOYW1lIH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXdhaXQgcmVxdWlyZVN1Y2Nlc3NmdWxXcml0ZShyZXNwb25zZSwgJ1F1YWxpdHkgcHJvZmlsZSBzYXZlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2F2ZSBwZXItc2VydmljZSBiYXNpYyBhdXRoXG4gICAgICBpZiAoIWN1cnJlbnRTZXJ2aWNlLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgY29uc3QgdXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtdXNlcicpLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgY29uc3QgcGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtcGFzcycpLnZhbHVlO1xuICAgICAgICBpZiAodXNlciAmJiBwYXNzKSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9zZXJ2aWNlcy8ke2N1cnJlbnRTZXJ2aWNlLmlkfS9jcmVkZW50aWFsc2AsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVzZXJuYW1lOiB1c2VyLCBwYXNzd29yZDogcGFzcyB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGF3YWl0IHJlcXVpcmVTdWNjZXNzZnVsV3JpdGUocmVzcG9uc2UsICdTZXJ2aWNlIGNyZWRlbnRpYWwgc2F2ZScpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGxvYWRTZXJ2aWNlQ3JlZHMoY3VycmVudFNlcnZpY2UpO1xuICAgICAgaWYgKGNyZWRlbnRpYWxSZXR1cm5VcmwpIHtcbiAgICAgICAgY29uc3QgcmV0dXJuVXJsID0gY3JlZGVudGlhbFJldHVyblVybDtcbiAgICAgICAgY29uc3QgcmVzdW1lZCA9IGF3YWl0IHdpbmRvdy5EQ0NyZWRlbnRpYWxWYXVsdD8ucmVzdW1lKHJldHVyblVybCwgY3VycmVudFNlcnZpY2UuaWQpO1xuICAgICAgICBpZiAoIXJlc3VtZWQpIHRocm93IG5ldyBFcnJvcignQ3JlZGVudGlhbCBzYXZlZCwgYnV0IHRoZSBzZWN1cmUgc2VydmljZSBoYW5kb2ZmIGZhaWxlZC4gVHJ5IG9wZW5pbmcgdGhlIHNlcnZpY2UgYWdhaW4uJyk7XG4gICAgICAgIGNyZWRlbnRpYWxSZXR1cm5VcmwgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbU2VydmljZUNyZWRlbnRpYWxzXSBTYXZlJywgZSwgeyBmdW5jdGlvbjogJ3NhdmVDcmVkZW50aWFscycgfSk7XG4gICAgICBzaG93RXJyb3IoJ0ZhaWxlZCB0byBzYXZlOiAnICsgKGUubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcicpKTtcbiAgICB9XG4gICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9IGNyZWRlbnRpYWxSZXR1cm5VcmwgPyAnU2F2ZSB0byB2YXVsdCAmIG9wZW4gc2VydmljZScgOiAnU2F2ZSB0byBlbmNyeXB0ZWQgdmF1bHQnO1xuICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgfSk7XG5cbiAgLy8gQ2xlYXIgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtY2xlYXInKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjdXJyZW50U2VydmljZSkgcmV0dXJuO1xuICAgIGlmICghY29uZmlybShgUmVtb3ZlIHN0b3JlZCBjcmVkZW50aWFscyBmb3IgJHtjdXJyZW50U2VydmljZS5uYW1lfT9gKSkgcmV0dXJuO1xuICAgIGhpZGVFcnJvcigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdmNJZCA9IGN1cnJlbnRTZXJ2aWNlLmlkIHx8IGN1cnJlbnRTZXJ2aWNlLmFwcFRlbXBsYXRlO1xuICAgICAgY29uc3QgaXNBcnIgPSBhcnJTZXJ2aWNlcy5pbmNsdWRlcyhzdmNJZCk7XG4gICAgICBpZiAoY3VycmVudFNlcnZpY2UuaXNFeHRlcm5hbCkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NlZWRob3N0LWNyZWRzP3NlcnZpY2VJZD0ke2N1cnJlbnRTZXJ2aWNlLmlkfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgICAgYXdhaXQgcmVxdWlyZVN1Y2Nlc3NmdWxXcml0ZShyZXNwb25zZSwgJ1NlZWRob3N0IGNyZWRlbnRpYWwgcmVtb3ZhbCcpO1xuICAgICAgfVxuICAgICAgLy8gRGVsZXRlIGZyb20gYm90aCBuYW1lc3BhY2VzXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7Y3VycmVudFNlcnZpY2UuaWR9L2NyZWRlbnRpYWxzYCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgYXdhaXQgcmVxdWlyZVN1Y2Nlc3NmdWxXcml0ZShyZXNwb25zZSwgJ1NlcnZpY2UgY3JlZGVudGlhbCByZW1vdmFsJyk7XG4gICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgY29uc3QgYXJyUmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9hcnIvY3JlZGVudGlhbHMvJHtzdmNJZH1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICAgIGF3YWl0IHJlcXVpcmVTdWNjZXNzZnVsV3JpdGUoYXJyUmVzcG9uc2UsICdBUlIgY3JlZGVudGlhbCByZW1vdmFsJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgY3JlZHMtYnRuLSR7Y3VycmVudFNlcnZpY2UuaWR9YCk7XG4gICAgICBpZiAoYnRuKSBidG4uY2xhc3NMaXN0LnJlbW92ZSgnaGFzLWNyZWRzJyk7XG4gICAgICBhd2FpdCBsb2FkU2VydmljZUNyZWRzKGN1cnJlbnRTZXJ2aWNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tTZXJ2aWNlQ3JlZGVudGlhbHNdIENsZWFyJywgZSwgeyBmdW5jdGlvbjogJ2NsZWFyQ3JlZGVudGlhbHMnIH0pO1xuICAgICAgc2hvd0Vycm9yKCdGYWlsZWQgdG8gY2xlYXI6ICcgKyAoZS5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJykpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ2xvc2UgYnV0dG9uIC8gYmFja2Ryb3BcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1jbG9zZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgY3VycmVudFNlcnZpY2UgPSBudWxsO1xuICAgIGNyZWRlbnRpYWxSZXR1cm5VcmwgPSBudWxsO1xuICB9KTtcbiAgbW9kYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICBjdXJyZW50U2VydmljZSA9IG51bGw7XG4gICAgICBjcmVkZW50aWFsUmV0dXJuVXJsID0gbnVsbDtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENoZWNrIGNyZWRlbnRpYWwgc3RhdHVzIGZvciBhbGwgc2VydmljZXMgb24gcGFnZSBsb2FkICh1cGRhdGUga2V5IGJ1dHRvbiBoaWdobGlnaHRzKVxuICB3aW5kb3cucmVmcmVzaENyZWRzQnV0dG9ucyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGFwcCBvZiAod2luZG93LkFQUFMgfHwgW10pKSB7XG4gICAgICAgIGlmICghYXBwLmlzRXh0ZXJuYWwgJiYgIWFwcC5hcHBUZW1wbGF0ZSAmJiAhYXBwLnVybCkgY29udGludWU7XG4gICAgICAgIGxldCBoYXNDcmVkcyA9IGZhbHNlO1xuICAgICAgICBpZiAoYXBwLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc2VlZFJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL3NlZWRob3N0LWNyZWRzP3NlcnZpY2VJZD0ke2FwcC5pZH1gKTtcbiAgICAgICAgICAgIGNvbnN0IHNlZWREYXRhID0gYXdhaXQgc2VlZFJlcy5qc29uKCk7XG4gICAgICAgICAgICBpZiAoc2VlZERhdGEuc3VjY2VzcyAmJiBzZWVkRGF0YS5oYXNDcmVkZW50aWFscykgaGFzQ3JlZHMgPSB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZXJ2aWNlcy8ke2FwcC5pZH0vY3JlZGVudGlhbHNgKTtcbiAgICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgICAgaWYgKGQuc3VjY2VzcyAmJiAoZC5oYXNBcGlLZXkgfHwgZC5oYXNCYXNpY0F1dGgpKSBoYXNDcmVkcyA9IHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGNyZWRzLWJ0bi0ke2FwcC5pZH1gKTtcbiAgICAgICAgaWYgKGJ0bikgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2hhcy1jcmVkcycsIGhhc0NyZWRzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gIH07XG5cbiAgLy8gUHJvdGVjdGVkIHNlcnZpY2UgbG9naW4gcGFnZXMgc2VuZCBtaXNzaW5nIGNyZWRlbnRpYWxzIGhlcmUuIFJldXNlIHRoZVxuICAvLyBub3JtYWwgdmF1bHQgZm9ybSwgdGhlbiByZXN1bWUgdGhyb3VnaCB0aGUgZXhpc3Rpbmcgb25lLXRpbWUgU1NPIGhhbmRvZmYuXG4gIHdpbmRvdy5vcGVuUmVxdWVzdGVkQ3JlZGVudGlhbEZvcm0gPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgIGNvbnN0IHNlcnZpY2VJZCA9IHBhcmFtcy5nZXQoJ2NyZWRlbnRpYWxzJyk7XG4gICAgaWYgKCFzZXJ2aWNlSWQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzZXJ2aWNlID0gKHdpbmRvdy5BUFBTIHx8IFtdKS5maW5kKGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2VJZCB8fCBhcHAuYXBwVGVtcGxhdGUgPT09IHNlcnZpY2VJZCk7XG4gICAgaWYgKCFzZXJ2aWNlKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmV0dXJuVXJsID0gcGFyYW1zLmdldCgncmV0dXJuJyk7XG4gICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCAnJywgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICB3aW5kb3cub3BlblNlcnZpY2VDcmVkc01vZGFsKHNlcnZpY2UsIHsgcmV0dXJuVXJsIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xufSkoKTtcbjtcbi8vID09PT09IFRPVFAgU0VUVElOR1MgPT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuICBpbmplY3RNb2RhbCgndG90cC1zZXR0aW5ncy1tb2RhbCcsIGA8ZGl2IGlkPVwidG90cC1zZXR0aW5ncy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDIwcHg7IG1heC13aWR0aDogNTIwcHg7XCI+XG4gICAgICA8aDMgc3R5bGU9XCJtYXJnaW46IDAgMCAxNnB4OyBmb250LXNpemU6IDEuMXJlbTtcIj5BdXRoZW50aWNhdGlvbiBTZXR0aW5nczwvaDM+XG5cbiAgICAgIDwhLS0gU3RhdHVzIEJhbm5lciAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ0b3RwLXN0YXR1cy1iYW5uZXJcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEycHggMTZweDsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJ0b3RwLXN0YXR1cy1kb3RcIiBjbGFzcz1cInN0YXR1cy1kb3RcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGlkPVwidG90cC1zdGF0dXMtdGV4dFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjlyZW07XCI+VE9UUCBpcyBub3QgY29uZmlndXJlZDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNldHVwIEJ1dHRvbiAobm90IGNvbmZpZ3VyZWQgc3RhdGUpIC0tPlxuICAgICAgPGRpdiBpZD1cInRvdHAtc2V0dXAtc2VjdGlvblwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1zZXR1cC1idG5cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMnB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOTVyZW07XCI+XG4gICAgICAgICAgR2VuZXJhdGUgTmV3IFNlY3JldFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBtYXJnaW46IDEwcHggMCAwO1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyLWxpbmVcIj48L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdGlueS1tdXRlZFwiPm9yPC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyLWxpbmVcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtaGludFwiPkltcG9ydCBhbiBleGlzdGluZyBzZWNyZXQga2V5OjwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBtYXJnaW4tdG9wOiA2cHg7XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRvdHAtaW1wb3J0LWtleVwiIHBsYWNlaG9sZGVyPVwiUGFzdGUgeW91ciBCYXNlMzIga2V5XCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuOXJlbTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgbGV0dGVyLXNwYWNpbmc6IDFweDsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcIiAvPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtaW1wb3J0LWJ0blwiIHN0eWxlPVwicGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgICBJbXBvcnRcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJ0b3RwLWltcG9ydC1lcnJvclwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGZvbnQtc2l6ZTogMC44cmVtOyBtaW4taGVpZ2h0OiAxLjJlbTsgbWFyZ2luLXRvcDogNnB4O1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNlY3JldCBEaXNwbGF5IChzZXR1cCBmbG93KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ0b3RwLXFyLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDwhLS0gTWFudWFsIEtleSAocHJpbWFyeSAtIGZvciBXaW5BdXRoL2Rlc2t0b3AgYXV0aGVudGljYXRvcnMpIC0tPlxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgOHB4O1wiPkNvcHkgdGhpcyBrZXkgaW50byB5b3VyIGF1dGhlbnRpY2F0b3IgYXBwOjwvcD5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgPGNvZGUgaWQ9XCJ0b3RwLW1hbnVhbC1rZXlcIiBzdHlsZT1cImZsZXg6IDE7IGRpc3BsYXk6IGJsb2NrOyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZywgIzBiMGYxYSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAxcmVtOyBmb250LWZhbWlseTogJ1NhbWkgR3JvdGVzaycsIG1vbm9zcGFjZTsgbGV0dGVyLXNwYWNpbmc6IDJweDsgd29yZC1icmVhazogYnJlYWstYWxsOyB1c2VyLXNlbGVjdDogYWxsOyBjb2xvcjogdmFyKC0tZmcpO1wiPjwvY29kZT5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1jb3B5LWtleVwiIHN0eWxlPVwicGFkZGluZzogMTBweCAxNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAxcmVtOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBjb2xvcjogdmFyKC0tZmcpO1wiIHRpdGxlPVwiQ29weSB0byBjbGlwYm9hcmRcIj5cdUQ4M0RcdURDQ0I8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBEb3dubG9hZCBiYWNrdXAgZmlsZSAocmVjb3ZlcnkgYWlkKSAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEwcHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tYmcsICMwYjBmMWEpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgZmxleDogMTtcIj5cbiAgICAgICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiB2YXIoLS1mZyk7XCI+U2F2ZSBhIGJhY2t1cCBmaWxlPC9zdHJvbmc+IFx1MjAxNCBpZiB5b3UgZXZlciBsb3NlIHlvdXIgYXV0aGVudGljYXRvcixcbiAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gcmVjb3ZlciB3aXRob3V0IFNTSCBhY2Nlc3MgdG8gdGhlIHNlcnZlci5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLWRvd25sb2FkLWJhY2t1cFwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgICBcdTJCMDcgRG93bmxvYWRcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFFSIENvZGUgKHNlY29uZGFyeSAtIGZvciBtb2JpbGUgYXBwcykgLS0+XG4gICAgICAgIDxkZXRhaWxzIGNsYXNzPVwibWItMTZcIj5cbiAgICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+U2hvdyBRUiBjb2RlIChmb3IgbW9iaWxlIGF1dGhlbnRpY2F0b3IgYXBwcyk8L3N1bW1hcnk+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogOHB4O1wiPlxuICAgICAgICAgICAgPGltZyBpZD1cInRvdHAtcXItaW1hZ2VcIiBzdHlsZT1cIndpZHRoOiAxODBweDsgaGVpZ2h0OiAxODBweDsgYm9yZGVyLXJhZGl1czogOHB4O1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGV0YWlscz5cblxuICAgICAgICA8IS0tIFZlcmlmeSBGaXJzdCBDb2RlIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IHBhZGRpbmctdG9wOiAxNnB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvbnQtYm9sZC1zbVwiPkVudGVyIGNvZGUgdG8gY29uZmlybSBzZXR1cDo8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLXRvcDogOHB4O1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ0b3RwLXNldHVwLWNvZGVcIiBtYXhsZW5ndGg9XCI2XCIgaW5wdXRtb2RlPVwibnVtZXJpY1wiIHBhdHRlcm49XCJbMC05XXs2fVwiIHBsYWNlaG9sZGVyPVwiMDAwMDAwXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6IDE7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxLjNyZW07IHBhZGRpbmc6IDEwcHg7IGZvbnQtZmFtaWx5OiAnU2FtaSBHcm90ZXNrJywgbW9ub3NwYWNlOyBsZXR0ZXItc3BhY2luZzogNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDhweDsgb3V0bGluZTogbm9uZTtcIiAvPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtY29uZmlybS1zZXR1cFwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogMTBweCAyMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwO1wiPlxuICAgICAgICAgICAgICBDb25maXJtXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwidG90cC1zZXR1cC1lcnJvclwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGZvbnQtc2l6ZTogMC44cmVtOyBtaW4taGVpZ2h0OiAxLjJlbTsgbWFyZ2luLXRvcDogNnB4O1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNlc3Npb24gRHVyYXRpb24gKGFjdGl2ZSBzdGF0ZSkgLS0+XG4gICAgICA8ZGl2IGlkPVwidG90cC1kdXJhdGlvbi1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxMnB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb250LWJvbGQtc21cIj5TZXNzaW9uIER1cmF0aW9uOjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJ0b3RwLWR1cmF0aW9uLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbi10b3A6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcsICMwYjBmMWEpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMC45cmVtOyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjE1bVwiPjE1IG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMzBtXCI+MzAgbWludXRlczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxaFwiPjEgaG91cjwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIyaFwiPjIgaG91cnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiNGhcIj40IGhvdXJzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjhoXCI+OCBob3Vyczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMmhcIj4xMiBob3Vyczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIyNGhcIj4yNCBob3Vyczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJuZXZlclwiPk5ldmVyIChkaXNhYmxlIFRPVFApPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiA0cHggMCAwO1wiPkhvdyBsb25nIGJlZm9yZSB5b3UgbmVlZCB0byByZS1lbnRlciB5b3VyIGNvZGU8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBEaXNhYmxlIEJ1dHRvbiAoYWN0aXZlIHN0YXRlKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ0b3RwLWRpc2FibGUtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZy10b3A6IDE2cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1kaXNhYmxlLWJ0blwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogdmFyKC0tYmFkLWZnLCAjZmY5YWEzKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFkLWZnLCAjZmY5YWEzKTsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlxuICAgICAgICAgIERpc2FibGUgVE9UUFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIC0tPlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1tb2RhbC1jbG9zZVwiIHN0eWxlPVwicGFkZGluZzogOHB4IDIwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIENsb3NlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRUb3RwU2V0dGluZ3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvY29uZmlnJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHsgZW5hYmxlZCwgc2Vzc2lvbkR1cmF0aW9uLCBpc1NldFVwIH0gPSBkYXRhLmNvbmZpZztcbiAgICAgIGNvbnN0IHN0YXR1c0RvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXN0YXR1cy1kb3QnKTtcbiAgICAgIGNvbnN0IHN0YXR1c1RleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zdGF0dXMtdGV4dCcpO1xuICAgICAgY29uc3Qgc3RhdHVzQmFubmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc3RhdHVzLWJhbm5lcicpO1xuICAgICAgY29uc3Qgc2V0dXBTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtc2VjdGlvbicpO1xuICAgICAgY29uc3QgcXJTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcXItc2VjdGlvbicpO1xuICAgICAgY29uc3QgZHVyYXRpb25TZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZHVyYXRpb24tc2VjdGlvbicpO1xuICAgICAgY29uc3QgZGlzYWJsZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kaXNhYmxlLXNlY3Rpb24nKTtcblxuICAgICAgaWYgKGVuYWJsZWQgJiYgaXNTZXRVcCkge1xuICAgICAgICBzdGF0dXNEb3Quc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1vay1mZywgIzdlZjJmZiknO1xuICAgICAgICBzdGF0dXNCYW5uZXIuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tb2stZmcsICM3ZWYyZmYpJztcbiAgICAgICAgc3RhdHVzQmFubmVyLnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW9rLWZnKSA4JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgICAgc3RhdHVzVGV4dC50ZXh0Q29udGVudCA9ICdUT1RQIGlzIGFjdGl2ZSc7XG4gICAgICAgIHN0YXR1c1RleHQuc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcsICM3ZWYyZmYpJztcbiAgICAgICAgLy8gS2VlcCB0aGUgc2V0dXAgc2VjdGlvbiB2aXNpYmxlIChjb2xsYXBzZWQpIHNvIHRoZSBcIkltcG9ydCBleGlzdGluZ1xuICAgICAgICAvLyBzZWNyZXRcIiBvcHRpb24gaXMgYWx3YXlzIHJlYWNoYWJsZSBcdTIwMTQgdXNlcnMgbWF5IG5lZWQgdG8gcmUtZW5yb2xsXG4gICAgICAgIC8vIHRoZWlyIGF1dGhlbnRpY2F0b3Igd2l0aCB0aGUgc2FtZSBzZWNyZXQgZnJvbSBhIGJhY2t1cCBmaWxlLlxuICAgICAgICBzZXR1cFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGNvbnN0IHNldHVwQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtYnRuJyk7XG4gICAgICAgIGlmIChzZXR1cEJ0bikgc2V0dXBCdG4udGV4dENvbnRlbnQgPSAnR2VuZXJhdGUgTmV3IFNlY3JldCc7XG4gICAgICAgIC8vIEhpZGUgdGhlIFFSIHNlY3Rpb24gYnkgZGVmYXVsdCBpbiB0aGUgYWN0aXZlIHN0YXRlIFx1MjAxNCBzZXR1cEJ0biBjbGljayBzaG93cyBpdFxuICAgICAgICBxclNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZHVyYXRpb25TZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkaXNhYmxlU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZHVyYXRpb24tc2VsZWN0JykudmFsdWUgPSBzZXNzaW9uRHVyYXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXNEb3Quc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1tdXRlZCknO1xuICAgICAgICBzdGF0dXNCYW5uZXIuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tYm9yZGVyKSc7XG4gICAgICAgIHN0YXR1c0Jhbm5lci5zdHlsZS5iYWNrZ3JvdW5kID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgc3RhdHVzVGV4dC50ZXh0Q29udGVudCA9ICdUT1RQIGlzIG5vdCBjb25maWd1cmVkJztcbiAgICAgICAgc3RhdHVzVGV4dC5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICAgICAgICBzZXR1cFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIHFyU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkdXJhdGlvblNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZGlzYWJsZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHRoZSBBdXRoIGNhcmQgaW4gdGhlIHRvcCByb3dcbiAgICAgIHVwZGF0ZUF1dGhDYXJkKGVuYWJsZWQgJiYgaXNTZXRVcCwgc2Vzc2lvbkR1cmF0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBsb2FkIFRPVFAgc2V0dGluZ3M6JywgZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRHVyYXRpb24gbGFiZWwgaGVscGVyXG4gIGNvbnN0IERVUkFUSU9OX0xBQkVMUyA9IHtcbiAgICAnMTVtJzogJzE1IG1pbicsICczMG0nOiAnMzAgbWluJywgJzFoJzogJzEgaG91cicsICcyaCc6ICcyIGhvdXJzJyxcbiAgICAnNGgnOiAnNCBob3VycycsICc4aCc6ICc4IGhvdXJzJywgJzEyaCc6ICcxMiBob3VycycsICcyNGgnOiAnMjQgaG91cnMnLCAnbmV2ZXInOiAnRGlzYWJsZWQnXG4gIH07XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlZChrZXksIGZhbGxiYWNrKSB7XG4gICAgY29uc3QgaTE4biA9IHdpbmRvdy5EQ0kxOG47XG4gICAgcmV0dXJuIGkxOG4gJiYgaTE4bi5pc0xvYWRlZCgpID8gaTE4bi50KGtleSkgOiBmYWxsYmFjaztcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUF1dGhDYXJkKGFjdGl2ZSwgZHVyYXRpb24pIHtcbiAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtY2FyZCcpO1xuICAgIGNvbnN0IHBpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1waWxsJyk7XG4gICAgY29uc3QgZG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtZG90Jyk7XG4gICAgY29uc3Qgc3RhdHVzVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXN0YXR1cy10ZXh0Jyk7XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0dXMnLCAnb24nKTtcbiAgICAgIHBpbGwuY2xhc3NOYW1lID0gJ2JhZGdlIG9uJztcbiAgICAgIHBpbGwudGV4dENvbnRlbnQgPSB0cmFuc2xhdGVkKCdjYXJkLnN0YXR1cy55ZXMnLCAnWUVTJyk7XG4gICAgICBkb3QuY2xhc3NOYW1lID0gJ2RvdCBvayBhdC1ibCc7XG4gICAgICBzdGF0dXNUZXh0LnRleHRDb250ZW50ID0gJ1Nlc3Npb246ICcgKyAoRFVSQVRJT05fTEFCRUxTW2R1cmF0aW9uXSB8fCBkdXJhdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLXN0YXR1cycsICdvZmYnKTtcbiAgICAgIHBpbGwuY2xhc3NOYW1lID0gJ2JhZGdlIG9mZic7XG4gICAgICBwaWxsLnRleHRDb250ZW50ID0gdHJhbnNsYXRlZCgnY2FyZC5zdGF0dXMubm8nLCAnTk8nKTtcbiAgICAgIGRvdC5jbGFzc05hbWUgPSAnZG90IGJhZCBhdC1ibCc7XG4gICAgICBzdGF0dXNUZXh0LnRleHRDb250ZW50ID0gdHJhbnNsYXRlZCgnY2FyZC5hdXRoLm5vdF9jb25maWd1cmVkJywgJ05vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0dXAgYnV0dG9uIChnZW5lcmF0ZSBuZXcgc2VjcmV0KVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3RvdHAvc2V0dXAnLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXFyLWltYWdlJykuc3JjID0gZGF0YS5xckNvZGU7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW1hbnVhbC1rZXknKS50ZXh0Q29udGVudCA9IGRhdGEubWFudWFsS2V5O1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1zZWN0aW9uJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcXItc2VjdGlvbicpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1jb2RlJykudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtZXJyb3InKS50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1jb2RlJykuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tUT1RQXSBTZXR1cCBGYWlsZWQnLCBlLCB7IGZ1bmN0aW9uOiAnc2V0dXBUT1RQJyB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEltcG9ydCBleGlzdGluZyBzZWNyZXQgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWltcG9ydC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2VjcmV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtaW1wb3J0LWtleScpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtaW1wb3J0LWVycm9yJyk7XG4gICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICcnO1xuICAgIGlmICghc2VjcmV0KSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ1Bhc3RlIGEgQmFzZTMyIHNlY3JldCBrZXkgZmlyc3QnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdG90cC9zZXR1cCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlY3JldCB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1xci1pbWFnZScpLnNyYyA9IGRhdGEucXJDb2RlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1tYW51YWwta2V5JykudGV4dENvbnRlbnQgPSBkYXRhLm1hbnVhbEtleTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtc2VjdGlvbicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXFyLXNlY3Rpb24nKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtY29kZScpLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWVycm9yJykudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtY29kZScpLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gZGF0YS5lcnJvciB8fCBkYXRhLm1lc3NhZ2UgfHwgJ0ltcG9ydCBmYWlsZWQnO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnQ29ubmVjdGlvbiBlcnJvciBcdTIwMTQgdHJ5IHJlZnJlc2hpbmcgdGhlIHBhZ2UnO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ29weSBrZXkgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWNvcHkta2V5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW1hbnVhbC1rZXknKS50ZXh0Q29udGVudDtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChrZXkpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtY29weS1rZXknKTtcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUnO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQ0InOyB9LCAyMDAwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gRG93bmxvYWQgYmFja3VwIGZpbGUgXHUyMDE0IHBsYWluIEpTT04gc28gaXQgcm91bmQtdHJpcHMgdGhyb3VnaCBhbnkgcGFzc3dvcmRcbiAgLy8gbWFuYWdlciwgY2xvdWQgYmFja3VwLCBvciBwcmludGVkIHBhcGVyLiBUaGUgc2VjcmV0IElTIHJlY292ZXJhYmxlIHBsYWludGV4dFxuICAvLyAodGhhdCdzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgYmFja3VwKSwgc28gd2FybiB0aGUgdXNlciBhbmQgcmVseSBvblxuICAvLyB0aGVtIHRvIGtlZXAgaXQgc2FmZS5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZG93bmxvYWQtYmFja3VwJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHNlY3JldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW1hbnVhbC1rZXknKS50ZXh0Q29udGVudC50cmltKCk7XG4gICAgaWYgKCFzZWNyZXQpIHJldHVybjtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgc2VydmljZTogJ0Rhc2hDYWRkeScsXG4gICAgICB0eXBlOiAndG90cC1zZWNyZXQnLFxuICAgICAgc2VjcmV0OiBzZWNyZXQsXG4gICAgICBpc3N1ZXI6ICdEYXNoQ2FkZHknLFxuICAgICAgYWxnb3JpdGhtOiAnU0hBMScsXG4gICAgICBkaWdpdHM6IDYsXG4gICAgICBwZXJpb2Q6IDMwLFxuICAgICAgaXNzdWVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAvLyBSZWNvdmVyeSBpbnN0cnVjdGlvbnMgYmFrZWQgaW50byB0aGUgZmlsZSBzbyBhIHllYXIgZnJvbSBub3cgdGhlXG4gICAgICAvLyB1c2VyIChvciB0aGVpciBmdXR1cmUgc2VsZikga25vd3Mgd2hhdCB0aGlzIGZpbGUgaXMgYW5kIGhvdyB0byB1c2UgaXQuXG4gICAgICByZWNvdmVyeV91cmw6IGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59LyAgKGxvZ2luIHNjcmVlbiBcdTIxOTIgXCJMb3N0IGFjY2Vzcz9cIilgLFxuICAgICAgbm90ZTogJ0tlZXAgdGhpcyBmaWxlIHNvbWV3aGVyZSBzYWZlLiBBbnlvbmUgd2l0aCB0aGlzIHNlY3JldCBjYW4gZ2VuZXJhdGUgeW91ciBsb2dpbiBjb2Rlcy4gVXNlIGl0IE9OTFkgdG8gcmVjb3ZlciBUT1RQIGFjY2VzcyB2aWEgdGhlIFwiTG9zdCBhY2Nlc3M/XCIgbGluayBvbiB0aGUgRGFzaENhZGR5IGxvZ2luIHNjcmVlbi4nXG4gICAgfTtcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHBheWxvYWQsIG51bGwsIDIpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDtcbiAgICBhLmRvd25sb2FkID0gYGRhc2hjYWRkeS10b3RwLWJhY2t1cC0ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCl9Lmpzb25gO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgYS5jbGljaygpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWRvd25sb2FkLWJhY2t1cCcpO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgU2F2ZWQnO1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnXHUyQjA3IERvd25sb2FkJzsgfSwgMjAwMCk7XG4gIH0pO1xuXG4gIC8vIENvbmZpcm0gc2V0dXBcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtY29uZmlybS1zZXR1cCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtY29kZScpLnZhbHVlO1xuICAgIGNvbnN0IGVycm9yRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1lcnJvcicpO1xuICAgIGlmICghL15cXGR7Nn0kLy50ZXN0KGNvZGUpKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ0VudGVyIGEgNi1kaWdpdCBjb2RlJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdG90cC92ZXJpZnktc2V0dXAnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb2RlIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgIGxvYWRUb3RwU2V0dGluZ3MoKTsgLy8gVXBkYXRlcyBib3RoIG1vZGFsIGFuZCBjYXJkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gZGF0YS5lcnJvciB8fCAnSW52YWxpZCBjb2RlJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ0Nvbm5lY3Rpb24gZXJyb3InO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWxsb3cgRW50ZXIga2V5IG9uIHNldHVwIGNvZGUgaW5wdXRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtY29kZScpPy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWNvbmZpcm0tc2V0dXAnKT8uY2xpY2soKTtcbiAgfSk7XG5cbiAgLy8gRHVyYXRpb24gY2hhbmdlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWR1cmF0aW9uLXNlbGVjdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBhc3luYyAoZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS90b3RwL2NvbmZpZycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlc3Npb25EdXJhdGlvbjogZS50YXJnZXQudmFsdWUgfSlcbiAgICAgIH0pO1xuICAgICAgbG9hZFRvdHBTZXR0aW5ncygpOyAvLyBSZWZyZXNoIG1vZGFsICsgY2FyZCAoaGFuZGxlcyBcIm5ldmVyXCIgZGlzYWJsaW5nIFRPVFApXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tUT1RQXSBVcGRhdGUgU2Vzc2lvbiBEdXJhdGlvbicsIGVyciwgeyBmdW5jdGlvbjogJ3VwZGF0ZVNlc3Npb25EdXJhdGlvbicgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBEaXNhYmxlIFRPVFBcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZGlzYWJsZS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maXJtKCdEaXNhYmxlIFRPVFAgYXV0aGVudGljYXRpb24/IEFsbCBzZXJ2aWNlcyB3aWxsIGJlIGFjY2Vzc2libGUgd2l0aG91dCBhIGNvZGUuJykpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdG90cC9kaXNhYmxlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6ICd7fSdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSBsb2FkVG90cFNldHRpbmdzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbVE9UUF0gRGlzYWJsZSBGYWlsZWQnLCBlLCB7IGZ1bmN0aW9uOiAnZGlzYWJsZVRPVFAnIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gT3BlbiBzZXR0aW5ncyBtb2RhbCBmcm9tIEF1dGggY2FyZFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1zZXR0aW5ncy1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbG9hZFRvdHBTZXR0aW5ncygpO1xuICAgIG9wZW5Nb2RhbCgndG90cC1zZXR0aW5ncy1tb2RhbCcpO1xuICB9KTtcblxuICAvLyBDbG9zZSBzZXR0aW5ncyBtb2RhbFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1tb2RhbC1jbG9zZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjbG9zZU1vZGFsKCd0b3RwLXNldHRpbmdzLW1vZGFsJyk7XG4gIH0pO1xuXG4gIC8vIEJhY2tkcm9wIGNsaWNrIHRvIGNsb3NlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHRpbmdzLW1vZGFsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQuaWQgPT09ICd0b3RwLXNldHRpbmdzLW1vZGFsJykge1xuICAgICAgY2xvc2VNb2RhbCgndG90cC1zZXR0aW5ncy1tb2RhbCcpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gVXBkYXRlIGF1dGggY2FyZCBvbiBwYWdlIGxvYWRcbiAgd2luZG93Ll91cGRhdGVBdXRoQ2FyZCA9IHVwZGF0ZUF1dGhDYXJkO1xuICAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL2NvbmZpZycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IGRhdGEuY29uZmlnLmVuYWJsZWQgJiYgZGF0YS5jb25maWcuaXNTZXRVcDtcbiAgICAgICAgdXBkYXRlQXV0aENhcmQoYWN0aXZlLCBkYXRhLmNvbmZpZy5zZXNzaW9uRHVyYXRpb24pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbVE9UUF0gQXV0aENhcmQgVXBkYXRlJywgZSwgeyBmdW5jdGlvbjogJ2F1dGhDYXJkVXBkYXRlJyB9KTsgfVxuICB9KSgpO1xuXG59KSgpO1xuO1xuLyoqXG4gKiBBZG1pbiBwYW5lbCBcdTIwMTQgREMtMDQ4LlxuICpcbiAqIE1pbmltYWwgYWRtaW4gVUkgZm9yIG1hbmFnaW5nIHVzZXJzICsgaW52aXRlcy4gUmVuZGVyZWQgYXMgYSBtb2RhbCBvdmVybGF5XG4gKiB0cmlnZ2VyZWQgYnkgYW4gXCJBZG1pblwiIGJ1dHRvbiBpbiB0aGUgdG9wIGJhciB0aGF0IG9ubHkgYXBwZWFycyB3aGVuXG4gKiAvYXBpL3YxL2F1dGgvbWUgcmV0dXJucyBpc0FkbWluPXRydWUuIFRoZSBwYW5lbCByZW5kZXJzIHRocmVlIHNlY3Rpb25zOlxuICpcbiAqICAgMS4gVXNlcnMgXHUyMDE0IGxpc3Qgb2YgYXV0aG9yaXplZCB1c2VycyB3aXRoIHJvbGUgYmFkZ2VzLCByb2xlLWVkaXQsXG4gKiAgICAgIGRlbGV0ZSBhY3Rpb25zLlxuICogICAyLiBJbnZpdGUgYSB1c2VyIFx1MjAxNCBmb3JtIHRvIGlzc3VlIGEgc2luZ2xlLXVzZSBpbnZpdGUgKGVtYWlsLCByb2xlLFxuICogICAgICBUVEwpLiBUaGUgYWNjZXB0LWxpbmsgaXMgc2hvd24gcG9zdC1pc3N1ZSBzbyB0aGUgYWRtaW4gY2FuIGNvcHkgaXQuXG4gKiAgIDMuIE91dHN0YW5kaW5nIGludml0ZXMgXHUyMDE0IGxpc3Qgb2YgaXNzdWVkLW5vdC15ZXQtYWNjZXB0ZWQgaW52aXRlc1xuICogICAgICB3aXRoIGEgcmV2b2tlIGJ1dHRvbi5cbiAqXG4gKiBUaGUgcGFuZWwgZG9lcyBOT1QgYWRkIGEgdGFiIHRvIHRoZSBkYXNoYm9hcmQgbmF2IFx1MjAxNCBpdCBsaXZlcyBhcyBhIG1vZGFsXG4gKiB0byBrZWVwIERDLTA0OCBzdXJnaWNhbC4gRnV0dXJlIERDLTA0OSB3b3JrIGNhbiBwcm9tb3RlIGl0IHRvIGEgdGFiLlxuICpcbiAqIEJlaGF2aW91cjpcbiAqICAgLSBPbiBsb2FkOiBHRVQgL21lOyBpZiAhaXNBZG1pbiBcdTIxOTIgc2hvdyBcImFkbWluIG9ubHlcIiBwbGFjZWhvbGRlclxuICogICAtIFRoZW4gR0VUIC9hZG1pbi91c2VycyArIC9hZG1pbi9pbnZpdGVzIGluIHBhcmFsbGVsXG4gKiAgIC0gRm9ybXMgUE9TVCB0byB0aGUgYWRtaW4gZW5kcG9pbnRzLCByZWZyZXNoIGxpc3RzIG9uIHN1Y2Nlc3NcbiAqICAgLSBcIkNvcHkgbGlua1wiIGJ1dHRvbiB3cml0ZXMgdGhlIGFjY2VwdFVybCB0byB0aGUgY2xpcGJvYXJkXG4gKlxuICogV2lyZXMgaW50byB0aGUgZ2xvYmFsIGVycm9yLWhhbmRsZXIgKHdpbmRvdy5lcnJvckhhbmRsZXIpIGZvciBmYWlsdXJlXG4gKiBzdXJmYWNlcy4gVXNlcyB3aW5kb3cuU0lURSBmb3IgYW55IFVJIGNvbnN0YW50cyAobm9uZSBjdXJyZW50bHkpLlxuICovXG5cbihmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBBUEkgPSB7XG4gICAgbWU6ICcvYXBpL3YxL2F1dGgvbWUnLFxuICAgIHVzZXJzOiAnL2FwaS92MS9hdXRoL2FkbWluL3VzZXJzJyxcbiAgICBhbGxvd2xpc3Q6ICcvYXBpL3YxL2F1dGgvYWRtaW4vYWxsb3dsaXN0JyxcbiAgICBpbnZpdGVzOiAnL2FwaS92MS9hdXRoL2FkbWluL2ludml0ZXMnLFxuICB9O1xuXG4gIGZ1bmN0aW9uIF9lbCh0YWcsIGF0dHJzLCAuLi5jaGlsZHJlbikge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gICAgaWYgKGF0dHJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoYXR0cnMpKSB7XG4gICAgICAgIGNvbnN0IHYgPSBhdHRyc1trXTtcbiAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IGZhbHNlKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGsgPT09ICdjbGFzcycpIG5vZGUuY2xhc3NOYW1lID0gdjtcbiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ3RleHQnKSBub2RlLnRleHRDb250ZW50ID0gdjtcbiAgICAgICAgZWxzZSBpZiAoayA9PT0gJ2h0bWwnKSBub2RlLmlubmVySFRNTCA9IHY7XG4gICAgICAgIGVsc2UgaWYgKGsuc3RhcnRzV2l0aCgnb24nKSAmJiB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJykgbm9kZS5hZGRFdmVudExpc3RlbmVyKGsuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgdik7XG4gICAgICAgIGVsc2Ugbm9kZS5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgYyBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKGMgPT09IG51bGwgfHwgYyA9PT0gdW5kZWZpbmVkIHx8IGMgPT09IGZhbHNlKSBjb250aW51ZTtcbiAgICAgIGlmICh0eXBlb2YgYyA9PT0gJ3N0cmluZycpIG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYykpO1xuICAgICAgZWxzZSBub2RlLmFwcGVuZENoaWxkKGMpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIF9mZXRjaEpTT04odXJsLCBvcHRzKSB7XG4gICAgY29uc3QgY3NyZiA9ICh3aW5kb3cuU0lURSAmJiB3aW5kb3cuU0lURS5jc3JmVG9rZW4pIHx8ICcnO1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIG9wdHMuaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIG9wdHMuaGVhZGVycyB8fCB7fSxcbiAgICAgIGNzcmYgPyB7ICdYLUNTUkYtVG9rZW4nOiBjc3JmIH0gOiB7fVxuICAgICk7XG4gICAgaWYgKG9wdHMuYm9keSAmJiB0eXBlb2Ygb3B0cy5ib2R5ICE9PSAnc3RyaW5nJykgb3B0cy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0cy5ib2R5KTtcbiAgICBjb25zdCByID0gYXdhaXQgZmV0Y2godXJsLCBvcHRzKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgci5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgaWYgKCFyLm9rKSB7XG4gICAgICBjb25zdCBtc2cgPSAoZGF0YSAmJiAoZGF0YS5tZXNzYWdlIHx8IGRhdGEuZXJyb3IpKSB8fCAoJ0hUVFAgJyArIHIuc3RhdHVzKTtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtc2cpO1xuICAgICAgZXJyLnN0YXR1cyA9IHIuc3RhdHVzO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJCYWRnZShyb2xlKSB7XG4gICAgY29uc3QgY29sb3JzID0ge1xuICAgICAgYWRtaW46ICdiYWNrZ3JvdW5kOiM3YzNhZWQ7Y29sb3I6I2ZmZicsXG4gICAgICBvcGVyYXRvcjogJ2JhY2tncm91bmQ6IzI1NjNlYjtjb2xvcjojZmZmJyxcbiAgICAgIHZpZXdlcjogJ2JhY2tncm91bmQ6IzZiNzI4MDtjb2xvcjojZmZmJyxcbiAgICB9O1xuICAgIHJldHVybiBfZWwoJ3NwYW4nLCB7XG4gICAgICBjbGFzczogJ3JvbGUtYmFkZ2UnLFxuICAgICAgc3R5bGU6ICdkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjJweCA4cHg7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjAuNzVyZW07Zm9udC13ZWlnaHQ6NjAwO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsnICtcbiAgICAgICAgKGNvbG9yc1tyb2xlXSB8fCBjb2xvcnMudmlld2VyKSxcbiAgICAgIHRleHQ6IHJvbGUsXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBfcmVuZGVyVXNlcnNMaXN0KGNvbnRhaW5lciwgdXNlcnMsIG9uQ2hhbmdlKSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGlmICghdXNlcnMgfHwgdXNlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdwJywgeyBzdHlsZTogJ2NvbG9yOnZhcigtLW11dGVkKScsIHRleHQ6ICdObyB1c2VycyB5ZXQuJyB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gX2VsKCd0YWJsZScsIHtcbiAgICAgIHN0eWxlOiAnd2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Zm9udC1zaXplOjAuOXJlbScsXG4gICAgfSk7XG4gICAgdGFibGUuYXBwZW5kQ2hpbGQoX2VsKCd0aGVhZCcsIG51bGwsXG4gICAgICBfZWwoJ3RyJywgeyBzdHlsZTogJ2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlciknIH0sXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0VtYWlsJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnUm9sZScgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0NyZWF0ZWQnIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdMYXN0IGxvZ2luJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOnJpZ2h0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0FjdGlvbnMnIH0pLFxuICAgICAgKSxcbiAgICApKTtcbiAgICBjb25zdCB0Ym9keSA9IF9lbCgndGJvZHknKTtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdXNlcnMpIHtcbiAgICAgIGNvbnN0IHJvdyA9IF9lbCgndHInLCB7IHN0eWxlOiAnYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKScgfSk7XG5cbiAgICAgIGNvbnN0IGVtYWlsQ2VsbCA9IF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHgnIH0pO1xuICAgICAgZW1haWxDZWxsLmFwcGVuZENoaWxkKF9lbCgnc3BhbicsIHsgdGV4dDogdS5lbWFpbCB8fCAnKG5vIGVtYWlsKScgfSkpO1xuICAgICAgaWYgKHUuZGlzcGxheU5hbWUgJiYgdS5kaXNwbGF5TmFtZSAhPT0gKHUuZW1haWwgfHwgJycpLnNwbGl0KCdAJylbMF0pIHtcbiAgICAgICAgZW1haWxDZWxsLmFwcGVuZENoaWxkKF9lbCgnYnInKSk7XG4gICAgICAgIGVtYWlsQ2VsbC5hcHBlbmRDaGlsZChfZWwoJ3NtYWxsJywge1xuICAgICAgICAgIHN0eWxlOiAnY29sb3I6dmFyKC0tbXV0ZWQpJywgdGV4dDogdS5kaXNwbGF5TmFtZSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgcm93LmFwcGVuZENoaWxkKGVtYWlsQ2VsbCk7XG5cbiAgICAgIGNvbnN0IHJvbGVDZWxsID0gX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweCcgfSk7XG4gICAgICByb2xlQ2VsbC5hcHBlbmRDaGlsZChfcmVuZGVyQmFkZ2UodS5yb2xlKSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQocm9sZUNlbGwpO1xuXG4gICAgICByb3cuYXBwZW5kQ2hpbGQoX2VsKCd0ZCcsIHtcbiAgICAgICAgc3R5bGU6ICdwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuODVyZW0nLFxuICAgICAgICB0ZXh0OiB1LmNyZWF0ZWRBdCA/IG5ldyBEYXRlKHUuY3JlYXRlZEF0KS50b0xvY2FsZURhdGVTdHJpbmcoKSA6ICdcdTIwMTQnLFxuICAgICAgfSkpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKF9lbCgndGQnLCB7XG4gICAgICAgIHN0eWxlOiAncGFkZGluZzo4cHg7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTowLjg1cmVtJyxcbiAgICAgICAgdGV4dDogdS5sYXN0TG9naW5BdCA/IG5ldyBEYXRlKHUubGFzdExvZ2luQXQpLnRvTG9jYWxlU3RyaW5nKCkgOiAnXHUyMDE0JyxcbiAgICAgIH0pKTtcblxuICAgICAgY29uc3QgYWN0aW9uc0NlbGwgPSBfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4O3RleHQtYWxpZ246cmlnaHQnIH0pO1xuICAgICAgY29uc3Qgcm9sZVNlbGVjdCA9IF9lbCgnc2VsZWN0Jywge1xuICAgICAgICBzdHlsZTogJ3BhZGRpbmc6MnB4IDZweDttYXJnaW4tcmlnaHQ6NnB4JyxcbiAgICAgICAgb25jaGFuZ2U6IGFzeW5jIChldikgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBfZmV0Y2hKU09OKEFQSS51c2VycyArICcvJyArIGVuY29kZVVSSUNvbXBvbmVudCh1LmlkKSwge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdQQVRDSCcsIGJvZHk6IHsgcm9sZTogZXYudGFyZ2V0LnZhbHVlIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9uQ2hhbmdlICYmIG9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ1JvbGUgdXBkYXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgICAgICAgICBldi50YXJnZXQudmFsdWUgPSB1LnJvbGU7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgWydhZG1pbicsICdvcGVyYXRvcicsICd2aWV3ZXInXSkge1xuICAgICAgICBjb25zdCBvcHQgPSBfZWwoJ29wdGlvbicsIHsgdmFsdWU6IHIsIHRleHQ6IHIgfSk7XG4gICAgICAgIGlmIChyID09PSB1LnJvbGUpIG9wdC5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHJvbGVTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cbiAgICAgIGFjdGlvbnNDZWxsLmFwcGVuZENoaWxkKHJvbGVTZWxlY3QpO1xuXG4gICAgICBjb25zdCBkZWxCdG4gPSBfZWwoJ2J1dHRvbicsIHtcbiAgICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3BhZGRpbmc6MnB4IDhweCcsXG4gICAgICAgIHRleHQ6ICdEZWxldGUnLFxuICAgICAgICBvbmNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtKCdEZWxldGUgdXNlciAnICsgKHUuZW1haWwgfHwgdS5pZCkgKyAnPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJykpIHJldHVybjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgX2ZldGNoSlNPTihBUEkudXNlcnMgKyAnLycgKyBlbmNvZGVVUklDb21wb25lbnQodS5pZCksIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgICAgICAgIG9uQ2hhbmdlICYmIG9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ0RlbGV0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYWN0aW9uc0NlbGwuYXBwZW5kQ2hpbGQoZGVsQnRuKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChhY3Rpb25zQ2VsbCk7XG5cbiAgICAgIHRib2R5LmFwcGVuZENoaWxkKHJvdyk7XG4gICAgfVxuICAgIHRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlckludml0ZUZvcm0oY29udGFpbmVyLCBvbklzc3VlZCkge1xuICAgIGNvbnN0IGZvcm0gPSBfZWwoJ2Zvcm0nLCB7XG4gICAgICBzdHlsZTogJ2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmVuZCcsXG4gICAgICBvbnN1Ym1pdDogYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGZkID0gbmV3IEZvcm1EYXRhKGV2LnRhcmdldCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICAgICAgZW1haWw6IGZkLmdldCgnZW1haWwnKSxcbiAgICAgICAgICByb2xlOiBmZC5nZXQoJ3JvbGUnKSxcbiAgICAgICAgICB0dGxIb3VyczogcGFyc2VJbnQoZmQuZ2V0KCd0dGxIb3VycycpLCAxMCkgfHwgMjQsXG4gICAgICAgICAgc2VuZEVtYWlsOiBmZC5nZXQoJ3NlbmRFbWFpbCcpID09PSAnb24nLFxuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS5pbnZpdGVzLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5IH0pO1xuICAgICAgICAgIGV2LnRhcmdldC5yZXNldCgpO1xuICAgICAgICAgIG9uSXNzdWVkICYmIG9uSXNzdWVkKHIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ0ludml0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdsYWJlbCcsIHsgc3R5bGU6ICdkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoycHg7Zm9udC1zaXplOjAuODVyZW0nIH0sXG4gICAgICBfZWwoJ3NwYW4nLCB7IHRleHQ6ICdFbWFpbCcgfSksXG4gICAgICBfZWwoJ2lucHV0JywgeyBuYW1lOiAnZW1haWwnLCB0eXBlOiAnZW1haWwnLCByZXF1aXJlZDogdHJ1ZSwgcGxhY2Vob2xkZXI6ICd1c2VyQGV4YW1wbGUuY29tJywgc3R5bGU6ICdwYWRkaW5nOjZweCcgfSksXG4gICAgKSk7XG4gICAgY29uc3Qgcm9sZVNlbCA9IF9lbCgnc2VsZWN0JywgeyBuYW1lOiAncm9sZScsIHN0eWxlOiAncGFkZGluZzo2cHgnIH0pO1xuICAgIGZvciAoY29uc3QgciBvZiBbJ29wZXJhdG9yJywgJ3ZpZXdlcicsICdhZG1pbiddKSB7XG4gICAgICByb2xlU2VsLmFwcGVuZENoaWxkKF9lbCgnb3B0aW9uJywgeyB2YWx1ZTogciwgdGV4dDogciB9KSk7XG4gICAgfVxuICAgIGZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdsYWJlbCcsIHsgc3R5bGU6ICdkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoycHg7Zm9udC1zaXplOjAuODVyZW0nIH0sXG4gICAgICBfZWwoJ3NwYW4nLCB7IHRleHQ6ICdSb2xlJyB9KSwgcm9sZVNlbCxcbiAgICApKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKF9lbCgnbGFiZWwnLCB7IHN0eWxlOiAnZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O2ZvbnQtc2l6ZTowLjg1cmVtJyB9LFxuICAgICAgX2VsKCdzcGFuJywgeyB0ZXh0OiAnVFRMIChob3VycyknIH0pLFxuICAgICAgX2VsKCdpbnB1dCcsIHsgbmFtZTogJ3R0bEhvdXJzJywgdHlwZTogJ251bWJlcicsIG1pbjogJzEnLCBtYXg6ICcxNjgnLCB2YWx1ZTogJzI0Jywgc3R5bGU6ICdwYWRkaW5nOjZweDt3aWR0aDo4MHB4JyB9KSxcbiAgICApKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKF9lbCgnbGFiZWwnLCB7IHN0eWxlOiAnZGlzcGxheTpmbGV4O2dhcDo0cHg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTowLjg1cmVtJyB9LFxuICAgICAgX2VsKCdpbnB1dCcsIHsgbmFtZTogJ3NlbmRFbWFpbCcsIHR5cGU6ICdjaGVja2JveCcsIGNoZWNrZWQ6IGZhbHNlIH0pLFxuICAgICAgX2VsKCdzcGFuJywgeyB0ZXh0OiAnQWxzbyBzZW5kIHZpYSBlbWFpbCAob3B0aW9uYWwpJyB9KSxcbiAgICApKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKF9lbCgnYnV0dG9uJywgeyB0eXBlOiAnc3VibWl0JywgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3BhZGRpbmc6NnB4IDEycHgnLCB0ZXh0OiAnSXNzdWUgaW52aXRlJyB9KSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGZvcm0pO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlckludml0ZXNMaXN0KGNvbnRhaW5lciwgaW52aXRlcywgb25DaGFuZ2UpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgaWYgKCFpbnZpdGVzIHx8IGludml0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdwJywgeyBzdHlsZTogJ2NvbG9yOnZhcigtLW11dGVkKScsIHRleHQ6ICdObyBvdXRzdGFuZGluZyBpbnZpdGVzLicgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZSA9IF9lbCgndGFibGUnLCB7XG4gICAgICBzdHlsZTogJ3dpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjlyZW0nLFxuICAgIH0pO1xuICAgIHRhYmxlLmFwcGVuZENoaWxkKF9lbCgndGhlYWQnLCBudWxsLFxuICAgICAgX2VsKCd0cicsIHsgc3R5bGU6ICdib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpJyB9LFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdFbWFpbCcgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ1JvbGUnIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdJbnZpdGVkIGJ5JyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnRXhwaXJlcycgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpyaWdodDtwYWRkaW5nOjhweCcsIHRleHQ6ICdBY3Rpb25zJyB9KSxcbiAgICAgICksXG4gICAgKSk7XG4gICAgY29uc3QgdGJvZHkgPSBfZWwoJ3Rib2R5Jyk7XG4gICAgZm9yIChjb25zdCBpbnYgb2YgaW52aXRlcykge1xuICAgICAgY29uc3Qgcm93ID0gX2VsKCd0cicsIHsgc3R5bGU6ICdib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpJyB9KTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4JywgdGV4dDogaW52LmVtYWlsIH0pKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4JyB9LCBfcmVuZGVyQmFkZ2UoaW52LnJvbGUpKSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS1tdXRlZCknLCB0ZXh0OiBpbnYuaW52aXRlZEJ5IHx8ICdcdTIwMTQnIH0pKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywge1xuICAgICAgICBzdHlsZTogJ3BhZGRpbmc6OHB4O2NvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MC44NXJlbScsXG4gICAgICAgIHRleHQ6IGludi5leHBpcmVzQXQgPyBuZXcgRGF0ZShpbnYuZXhwaXJlc0F0KS50b0xvY2FsZVN0cmluZygpIDogJ1x1MjAxNCcsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBhY3Rpb25zQ2VsbCA9IF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHg7dGV4dC1hbGlnbjpyaWdodCcgfSk7XG4gICAgICBhY3Rpb25zQ2VsbC5hcHBlbmRDaGlsZChfZWwoJ2J1dHRvbicsIHtcbiAgICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3BhZGRpbmc6MnB4IDhweCcsXG4gICAgICAgIHRleHQ6ICdSZXZva2UnLFxuICAgICAgICBvbmNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtKCdSZXZva2UgaW52aXRlIGZvciAnICsgaW52LmVtYWlsICsgJz8nKSkgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBfZmV0Y2hKU09OKEFQSS5pbnZpdGVzICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGludi5pZCksIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgICAgICAgIG9uQ2hhbmdlICYmIG9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ1Jldm9rZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChhY3Rpb25zQ2VsbCk7XG4gICAgICB0Ym9keS5hcHBlbmRDaGlsZChyb3cpO1xuICAgIH1cbiAgICB0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYmxlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJJc3N1ZWRJbnZpdGVCYW5uZXIoaW52aXRlLCBwYXJlbnQpIHtcbiAgICBjb25zdCBiYW5uZXIgPSBfZWwoJ2RpdicsIHtcbiAgICAgIHN0eWxlOiAnbWFyZ2luLXRvcDoxMnB4O3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICMxNmEzNGE7Ym9yZGVyLXJhZGl1czo2cHg7YmFja2dyb3VuZDojMDUyZTFhO2NvbG9yOiNiYmY3ZDA7Zm9udC1zaXplOjAuODVyZW0nLFxuICAgIH0pO1xuICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ3N0cm9uZycsIHsgdGV4dDogJ0ludml0ZSBpc3N1ZWQgXHUyMDE0IGNvcHkgdGhlIGxpbmsgYmVsb3cuICcgK1xuICAgICAgJ0l0IHdpbGwgbm90IGJlIHNob3duIGFnYWluLicgfSkpO1xuICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ2JyJykpO1xuICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ2NvZGUnLCB7XG4gICAgICBzdHlsZTogJ2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDo4cHg7cGFkZGluZzo4cHg7YmFja2dyb3VuZDojMDAwO2JvcmRlci1yYWRpdXM6NHB4O3dvcmQtYnJlYWs6YnJlYWstYWxsO2NvbG9yOiNkMWZhZTUnLFxuICAgICAgdGV4dDogaW52aXRlLmFjY2VwdFVybCxcbiAgICB9KSk7XG4gICAgY29uc3QgY29weUJ0biA9IF9lbCgnYnV0dG9uJywge1xuICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ21hcmdpbi10b3A6OHB4O3BhZGRpbmc6NHB4IDEwcHgnLFxuICAgICAgdGV4dDogJ0NvcHkgbGluaycsXG4gICAgICBvbmNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoaW52aXRlLmFjY2VwdFVybCk7XG4gICAgICAgICAgY29weUJ0bi50ZXh0Q29udGVudCA9ICdDb3BpZWQhJztcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgY29weUJ0bi50ZXh0Q29udGVudCA9ICdDb3B5IGxpbmsnOyB9LCAyMDAwKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHdpbmRvdy5lcnJvckhhbmRsZXIgJiYgd2luZG93LmVycm9ySGFuZGxlci5zaG93KCdDbGlwYm9hcmQgYmxvY2tlZDogc2VsZWN0IHRoZSBsaW5rIG1hbnVhbGx5LicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGJhbm5lci5hcHBlbmRDaGlsZChjb3B5QnRuKTtcblxuICAgIC8vIERDLTA4NTogcHJlLWZvcm1hdHRlZCBtZXNzYWdlIGZvciBvbmUtdGFwIHBhc3RlIGludG8gaU1lc3NhZ2UgLyBXaGF0c0FwcCAvXG4gICAgLy8gVGVsZWdyYW0gLyBTTVMgLyBTaWduYWwgLyBEaXNjb3JkIC8gcGFzdGUtaW50by1lbWFpbC4gVGhlIG9wZXJhdG9yIGNhblxuICAgIC8vIGNvcHkgdGhpcyBhcyBhIHNlbnRlbmNlIGluc3RlYWQgb2YgZGVhbGluZyB3aXRoIHRoZSByYXcgVVJMLlxuICAgIGlmIChpbnZpdGUuc2hhcmVUZXh0KSB7XG4gICAgICBjb25zdCBzaGFyZUJsb2NrID0gX2VsKCdkaXYnLCB7IHN0eWxlOiAnbWFyZ2luLXRvcDoxMnB4JyB9KTtcbiAgICAgIHNoYXJlQmxvY2suYXBwZW5kQ2hpbGQoX2VsKCdkaXYnLCB7XG4gICAgICAgIHN0eWxlOiAnZm9udC1zaXplOjAuOHJlbTtjb2xvcjojODZlZmFjO21hcmdpbi1ib3R0b206NHB4JyxcbiAgICAgICAgdGV4dDogJ1NoYXJlIHRoaXMgbWVzc2FnZTonLFxuICAgICAgfSkpO1xuICAgICAgc2hhcmVCbG9jay5hcHBlbmRDaGlsZChfZWwoJ2RpdicsIHtcbiAgICAgICAgc3R5bGU6ICdwYWRkaW5nOjhweDtiYWNrZ3JvdW5kOiMwMDA7Ym9yZGVyLXJhZGl1czo0cHg7Y29sb3I6I2QxZmFlNTt3aGl0ZS1zcGFjZTpwcmUtd3JhcCcsXG4gICAgICAgIHRleHQ6IGludml0ZS5zaGFyZVRleHQsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBzaGFyZUFjdGlvbnMgPSBfZWwoJ2RpdicsIHsgc3R5bGU6ICdtYXJnaW4tdG9wOjZweDtkaXNwbGF5OmZsZXg7Z2FwOjZweDtmbGV4LXdyYXA6d3JhcCcgfSk7XG4gICAgICBjb25zdCBjb3B5VGV4dEJ0biA9IF9lbCgnYnV0dG9uJywge1xuICAgICAgICBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAncGFkZGluZzo0cHggMTBweCcsXG4gICAgICAgIHRleHQ6ICdDb3B5IG1lc3NhZ2UnLFxuICAgICAgICBvbmNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGludml0ZS5zaGFyZVRleHQpO1xuICAgICAgICAgICAgY29weVRleHRCdG4udGV4dENvbnRlbnQgPSAnQ29waWVkISc7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgY29weVRleHRCdG4udGV4dENvbnRlbnQgPSAnQ29weSBtZXNzYWdlJzsgfSwgMjAwMCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ0NsaXBib2FyZCBibG9ja2VkOiBzZWxlY3QgdGhlIHRleHQgbWFudWFsbHkuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBzaGFyZUFjdGlvbnMuYXBwZW5kQ2hpbGQoY29weVRleHRCdG4pO1xuICAgICAgLy8gTmF0aXZlIHNoYXJlIHNoZWV0IG9uIG1vYmlsZSAvIHN1cHBvcnRlZCBicm93c2Vycy4gRmFsbHMgYmFjayBzaWxlbnRseVxuICAgICAgLy8gKHRoZSBjb3B5IGJ1dHRvbnMgY292ZXIgdGhlIHNhbWUgaW50ZW50KS5cbiAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbmF2aWdhdG9yLnNoYXJlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IG5hdGl2ZVNoYXJlQnRuID0gX2VsKCdidXR0b24nLCB7XG4gICAgICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3BhZGRpbmc6NHB4IDEwcHgnLFxuICAgICAgICAgIHRleHQ6ICdTaGFyZSB2aWFcdTIwMjYnLFxuICAgICAgICAgIG9uY2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5zaGFyZSh7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdEYXNoQ2FkZHkgaW52aXRlJyxcbiAgICAgICAgICAgICAgICB0ZXh0OiBpbnZpdGUuc2hhcmVUZXh0LFxuICAgICAgICAgICAgICAgIHVybDogaW52aXRlLmFjY2VwdFVybCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIC8vIFVzZXItY2FuY2VsbGVkIHRocm93cyBBYm9ydEVycm9yIFx1MjAxNCB0aGF0J3MgZmluZSwganVzdCBzdGF5IHF1aWV0LlxuICAgICAgICAgICAgICBpZiAoZSAmJiBlLm5hbWUgJiYgZS5uYW1lICE9PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnU2hhcmUgZmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBzaGFyZUFjdGlvbnMuYXBwZW5kQ2hpbGQobmF0aXZlU2hhcmVCdG4pO1xuICAgICAgfVxuICAgICAgc2hhcmVCbG9jay5hcHBlbmRDaGlsZChzaGFyZUFjdGlvbnMpO1xuICAgICAgYmFubmVyLmFwcGVuZENoaWxkKHNoYXJlQmxvY2spO1xuICAgIH1cblxuICAgIGlmIChpbnZpdGUuZGVsaXZlcmVkVmlhID09PSAnZmFpbGVkJykge1xuICAgICAgYmFubmVyLmFwcGVuZENoaWxkKF9lbCgncCcsIHtcbiAgICAgICAgc3R5bGU6ICdtYXJnaW4tdG9wOjhweDtjb2xvcjojZmJiZjI0O2ZvbnQtc2l6ZTowLjhyZW0nLFxuICAgICAgICB0ZXh0OiAnRW1haWwgY291bGQgbm90IGJlIHNlbnQgKFNNVFAgbm90IGNvbmZpZ3VyZWQpLiBTaGFyZSB0aGUgbGluayBhYm92ZSBpbnN0ZWFkIFx1MjAxNCBpdCB3b3JrcyB0aGUgc2FtZSB3YXkuJyxcbiAgICAgIH0pKTtcbiAgICB9IGVsc2UgaWYgKGludml0ZS5kZWxpdmVyZWRWaWEgPT09ICdlbWFpbCcpIHtcbiAgICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ3AnLCB7XG4gICAgICAgIHN0eWxlOiAnbWFyZ2luLXRvcDo4cHg7Y29sb3I6Izg2ZWZhYztmb250LXNpemU6MC44cmVtJyxcbiAgICAgICAgdGV4dDogJ0VtYWlsIHNlbnQgdG8gJyArIGludml0ZS5lbWFpbCArICcuJyxcbiAgICAgIH0pKTtcbiAgICB9IGVsc2UgaWYgKGludml0ZS5kZWxpdmVyZWRWaWEgPT09ICdtYW51YWwnKSB7XG4gICAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoX2VsKCdwJywge1xuICAgICAgICBzdHlsZTogJ21hcmdpbi10b3A6OHB4O2NvbG9yOiM4NmVmYWM7Zm9udC1zaXplOjAuOHJlbScsXG4gICAgICAgIHRleHQ6ICdTaGFyZSB0aGUgbGluayBhYm92ZSB2aWEgdGV4dCwgY2hhdCwgb3IgYW55IG1lc3Nlbmdlci4nLFxuICAgICAgfSkpO1xuICAgIH1cbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoYmFubmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgYWRtaW4gcGFuZWwuIENhbGxlZCBieSB0aGUgb3BlbiB0cmlnZ2VyOyBzYWZlIHRvIGNhbGwgbXVsdGlwbGVcbiAgICogdGltZXMgKHJlLXJlbmRlcnMgaW50byB0aGUgc2FtZSBjb250YWluZXIpLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gbW91bnQoY29udGFpbmVyKSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ2gyJywgeyBzdHlsZTogJ21hcmdpbjowIDAgMTZweCcsIHRleHQ6ICdBZG1pbiBcdTAwQjcgVXNlcnMgJiBJbnZpdGVzJyB9KSk7XG5cbiAgICBjb25zdCBtZURhdGEgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS5tZSkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgaWYgKCFtZURhdGEgfHwgIW1lRGF0YS51c2VyIHx8IG1lRGF0YS51c2VyLnJvbGUgIT09ICdhZG1pbicpIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ3AnLCB7XG4gICAgICAgIHN0eWxlOiAnY29sb3I6dmFyKC0tbXV0ZWQpJyxcbiAgICAgICAgdGV4dDogJ0FkbWluIHJvbGUgcmVxdWlyZWQgdG8gdmlldyB0aGlzIHBhbmVsLiBJZiBtdWx0aS11c2VyIG1vZGUgaXMgZW5hYmxlZCBhbmQgeW91IHNob3VsZCBoYXZlIGFjY2VzcywgY2hlY2sgL2FwaS92MS9hdXRoL21lLicsXG4gICAgICB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVmcmVzaCBidXR0b25cbiAgICBjb25zdCByZWZyZXNoQnRuID0gX2VsKCdidXR0b24nLCB7XG4gICAgICBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAnZmxvYXQ6cmlnaHQ7cGFkZGluZzo0cHggMTBweCcsXG4gICAgICB0ZXh0OiAnUmVmcmVzaCcsXG4gICAgICBvbmNsaWNrOiAoKSA9PiBtb3VudChjb250YWluZXIpLFxuICAgIH0pO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChyZWZyZXNoQnRuKTtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBVc2VycyBzZWN0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IHVzZXJzSGVhZGVyID0gX2VsKCdoMycsIHsgc3R5bGU6ICdtYXJnaW46MjRweCAwIDhweDtjbGVhcjpib3RoJywgdGV4dDogJ1VzZXJzJyB9KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodXNlcnNIZWFkZXIpO1xuXG4gICAgY29uc3QgdXNlcnNMaXN0ID0gX2VsKCdkaXYnLCB7IGlkOiAnYWRtaW4tdXNlcnMtbGlzdCcgfSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJzTGlzdCk7XG5cbiAgICBjb25zdCB1c2Vyc0RhdGEgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS51c2VycykuY2F0Y2goKCkgPT4gKHsgdXNlcnM6IFtdIH0pKTtcbiAgICBfcmVuZGVyVXNlcnNMaXN0KHVzZXJzTGlzdCwgdXNlcnNEYXRhLnVzZXJzLCAoKSA9PiBtb3VudChjb250YWluZXIpKTtcblxuICAgIC8vIEFkZCB1c2VyIGZvcm0gKHByZS1hdXRob3JpemUgYW4gZW1haWwgd2l0aG91dCBpc3N1aW5nIGFuIGludml0ZSkuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKF9lbCgnaDQnLCB7IHN0eWxlOiAnbWFyZ2luOjI0cHggMCA4cHg7Zm9udC1zaXplOjAuOTVyZW0nLCB0ZXh0OiAnUHJlLWF1dGhvcml6ZSBlbWFpbCcgfSkpO1xuICAgIGNvbnN0IGFkZFVzZXJGb3JtID0gX2VsKCdmb3JtJywge1xuICAgICAgc3R5bGU6ICdkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczplbmQnLFxuICAgICAgb25zdWJtaXQ6IGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBlbWFpbCA9IGV2LnRhcmdldC5lbWFpbC52YWx1ZS50cmltKCk7XG4gICAgICAgIGlmICghZW1haWwpIHJldHVybjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBfZmV0Y2hKU09OKEFQSS51c2VycywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogeyBlbWFpbCB9IH0pO1xuICAgICAgICAgIGV2LnRhcmdldC5yZXNldCgpO1xuICAgICAgICAgIG1vdW50KGNvbnRhaW5lcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnQWRkIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgYWRkVXNlckZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdpbnB1dCcsIHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ2VtYWlsJywgcmVxdWlyZWQ6IHRydWUsIHBsYWNlaG9sZGVyOiAndXNlckBleGFtcGxlLmNvbScsIHN0eWxlOiAncGFkZGluZzo2cHgnIH0pKTtcbiAgICBhZGRVc2VyRm9ybS5hcHBlbmRDaGlsZChfZWwoJ2J1dHRvbicsIHsgdHlwZTogJ3N1Ym1pdCcsIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdwYWRkaW5nOjZweCAxMnB4JywgdGV4dDogJ0FkZCB0byBhbGxvd2xpc3QnIH0pKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYWRkVXNlckZvcm0pO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIEludml0ZXMgc2VjdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdoMycsIHsgc3R5bGU6ICdtYXJnaW46MjRweCAwIDhweCcsIHRleHQ6ICdJc3N1ZSBpbnZpdGUnIH0pKTtcbiAgICBjb25zdCBpbnZpdGVGb3JtQ29udGFpbmVyID0gX2VsKCdkaXYnKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaW52aXRlRm9ybUNvbnRhaW5lcik7XG5cbiAgICBjb25zdCBpbnZpdGVzTGlzdCA9IF9lbCgnZGl2JywgeyBpZDogJ2FkbWluLWludml0ZXMtbGlzdCcsIHN0eWxlOiAnbWFyZ2luLXRvcDoxNnB4JyB9KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaW52aXRlc0xpc3QpO1xuXG4gICAgY29uc3QgaW52aXRlc0RhdGEgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS5pbnZpdGVzKS5jYXRjaCgoKSA9PiAoeyBpbnZpdGVzOiBbXSB9KSk7XG4gICAgX3JlbmRlckludml0ZXNMaXN0KGludml0ZXNMaXN0LCBpbnZpdGVzRGF0YS5pbnZpdGVzLCAoKSA9PiBtb3VudChjb250YWluZXIpKTtcblxuICAgIF9yZW5kZXJJbnZpdGVGb3JtKGludml0ZUZvcm1Db250YWluZXIsIChpc3N1ZWQpID0+IHtcbiAgICAgIF9yZW5kZXJJc3N1ZWRJbnZpdGVCYW5uZXIoaXNzdWVkLCBpbnZpdGVGb3JtQ29udGFpbmVyKTtcbiAgICAgIG1vdW50KGNvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgUHVibGljIEFQSSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICAvKipcbiAgICogT3BlbiB0aGUgYWRtaW4gcGFuZWwgYXMgYSBtb2RhbCBvdmVybGF5LiBDbG9zZXMgb24gYmFja2Ryb3AgY2xpY2sgb3JcbiAgICogdGhlIGNsb3NlIGJ1dHRvbi4gUmVuZGVycyBpbnRvIGRvY3VtZW50LmJvZHkgc28gaXQgZmxvYXRzIGFib3ZlIHRoZVxuICAgKiBkYXNoYm9hcmQgY2hyb21lLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gb3BlbigpIHtcbiAgICAvLyBJZiBhbHJlYWR5IG9wZW4sIGp1c3QgZm9jdXMuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtaW4tcGFuZWwtcm9vdCcpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuO1xuXG4gICAgY29uc3QgYmFja2Ryb3AgPSBfZWwoJ2RpdicsIHtcbiAgICAgIGlkOiAnYWRtaW4tcGFuZWwtcm9vdCcsXG4gICAgICBzdHlsZTogJ3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNSk7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjsnLFxuICAgICAgb25jbGljazogKGV2KSA9PiB7XG4gICAgICAgIGlmIChldi50YXJnZXQgPT09IGJhY2tkcm9wKSBjbG9zZSgpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNhcmQgPSBfZWwoJ2RpdicsIHtcbiAgICAgIHN0eWxlOiAnYmFja2dyb3VuZDp2YXIoLS1jYXJkLWJhc2UsIzFmMjkzNyk7Y29sb3I6dmFyKC0tdGV4dCwjZjNmNGY2KTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjI0cHg7bWF4LXdpZHRoOjkwMHB4O3dpZHRoOjkwJTttYXgtaGVpZ2h0Ojg1dmg7b3ZlcmZsb3c6YXV0bztwb3NpdGlvbjpyZWxhdGl2ZTtib3gtc2hhZG93OjAgMTBweCAzMHB4IHJnYmEoMCwwLDAsMC4zKScsXG4gICAgfSk7XG4gICAgY2FyZC5hcHBlbmRDaGlsZChfZWwoJ2J1dHRvbicsIHtcbiAgICAgIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTJweDtyaWdodDoxMnB4O3BhZGRpbmc6NHB4IDEwcHgnLFxuICAgICAgdGV4dDogJ0Nsb3NlJywgb25jbGljazogY2xvc2UsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgYm9keSA9IF9lbCgnZGl2JywgeyBpZDogJ2FkbWluLXBhbmVsLWJvZHknIH0pO1xuICAgIGNhcmQuYXBwZW5kQ2hpbGQoYm9keSk7XG4gICAgYmFja2Ryb3AuYXBwZW5kQ2hpbGQoY2FyZCk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiYWNrZHJvcCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbW91bnQoYm9keSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYm9keS5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojZjg3MTcxXCI+RmFpbGVkIHRvIGxvYWQgYWRtaW4gcGFuZWw6ICcgKyAoZS5tZXNzYWdlIHx8IGUpICsgJzwvcD4nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluLXBhbmVsLXJvb3QnKTtcbiAgICBpZiAoZXhpc3RpbmcpIGV4aXN0aW5nLnJlbW92ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluamVjdCBhbiBcIkFkbWluXCIgYnV0dG9uIGludG8gdGhlIHRvcCBiYXIuIE9ubHkgcmVuZGVycyB3aGVuIHRoZVxuICAgKiBjdXJyZW50IC9tZSByZXNwb25zZSBzYXlzIGlzQWRtaW49dHJ1ZS4gUmUtY2hlY2tzIHBlcmlvZGljYWxseVxuICAgKiAoZXZlcnkgNjBzKSBzbyBhIHBlcm1pc3Npb24gZG93bmdyYWRlIHRha2VzIGVmZmVjdCB3aXRob3V0IGEgcmVsb2FkLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gYXR0YWNoVHJpZ2dlcihiYXJDb250YWluZXIpIHtcbiAgICBhc3luYyBmdW5jdGlvbiBfbWF5YmVTaG93KCkge1xuICAgICAgY29uc3QgbWUgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS5tZSkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbi10cmlnZ2VyLWJ0bicpO1xuICAgICAgaWYgKG1lICYmIG1lLnVzZXIgJiYgbWUudXNlci5yb2xlID09PSAnYWRtaW4nKSB7XG4gICAgICAgIGlmIChleGlzdGluZykgcmV0dXJuO1xuICAgICAgICBjb25zdCBidG4gPSBfZWwoJ2J1dHRvbicsIHtcbiAgICAgICAgICBpZDogJ2FkbWluLXRyaWdnZXItYnRuJyxcbiAgICAgICAgICBjbGFzczogJ2J0bi1zbScsXG4gICAgICAgICAgc3R5bGU6ICdtYXJnaW4tbGVmdDo4cHg7cGFkZGluZzo2cHggMTJweCcsXG4gICAgICAgICAgdGV4dDogJ0FkbWluJyxcbiAgICAgICAgICBvbmNsaWNrOiBvcGVuLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGJhckNvbnRhaW5lcikgYmFyQ29udGFpbmVyLmFwcGVuZENoaWxkKGJ0bik7XG4gICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LmJvZHkpIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYnRuKTtcbiAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgZXhpc3RpbmcucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IF9tYXliZVNob3coKTtcbiAgICBzZXRJbnRlcnZhbChfbWF5YmVTaG93LCA2MF8wMDApO1xuICB9XG5cbiAgd2luZG93LkFkbWluUGFuZWwgPSB7IG9wZW4sIGNsb3NlLCBhdHRhY2hUcmlnZ2VyIH07XG59KSgpOztcbi8vID09PT09PT09PT0gQ1JFREVOVElBTCBNQU5BR0VNRU5UID09PT09PT09PT1cbihmdW5jdGlvbiAoKSB7XG5cbiAgLy8gSW5qZWN0IHNrZWxldG9uIG1vZGFsIFx1MjAxNCBjcmVkZW50aWFsIHNlY3Rpb25zIGFyZSBidWlsdCBkeW5hbWljYWxseSB3aGVuIG9wZW5lZFxuICBpbmplY3RNb2RhbCgndG9rZW4tbWFuYWdlbWVudC1tb2RhbCcsIGBcbiAgPGRpdiBpZD1cInRva2VuLW1hbmFnZW1lbnQtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDUwMHB4OyBtYXgtd2lkdGg6IDYwMHB4O1wiPlxuICAgICAgPGgzPlxcdXsxRjUxMX0gRE5TIENyZWRlbnRpYWxzPC9oMz5cblxuICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDE2cHg7XCI+XG4gICAgICAgIEVudGVyIFRlY2huaXRpdW0gRE5TIGxvZ2luIGNyZWRlbnRpYWxzLiBSZWFkLW9ubHkgYWNjb3VudHMgYXJlIHVzZWQgZm9yIGxvZ3M7IGFkbWluIGFjY291bnRzIGZvciByZXN0YXJ0cywgcmVjb3JkcywgYW5kIHVwZGF0ZXMuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgaWQ9XCJkbnMtY3JlZC1zZWN0aW9uc1wiPjwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInRva2VuLWNsZWFyLWFsbFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiBhdXRvOyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYmFkLWZnKSAxNSUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1iYWQtZmcpOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5DbGVhciBBbGw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInRva2VuLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwidG9rZW4tc2F2ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiPlNhdmU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgYCk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIEhlbHBlcnMgXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2V0RG5zSWRzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhTSVRFLmRuc1NlcnZlcnMgfHwge30pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RG5zRGlzcGxheU5hbWUoZG5zSWQpIHtcbiAgICBjb25zdCBzZXJ2ZXIgPSAoU0lURS5kbnNTZXJ2ZXJzIHx8IHt9KVtkbnNJZF07XG4gICAgcmV0dXJuIHNlcnZlcj8ubmFtZSB8fCBkbnNJZC50b1VwcGVyQ2FzZSgpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVxdWlyZVN1Y2Nlc3NmdWxEbnNNdXRhdGlvbihyZXNwb25zZSwgbGFiZWwpIHtcbiAgICBpZiAoIXJlc3BvbnNlKSB0aHJvdyBuZXcgRXJyb3IoYCR7bGFiZWx9IGZhaWxlZDogbm8gcmVzcG9uc2VgKTtcbiAgICBsZXQgZGF0YTtcbiAgICB0cnkge1xuICAgICAgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bGFiZWx9IGZhaWxlZDogaW52YWxpZCBzZXJ2ZXIgcmVzcG9uc2VgKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5vayB8fCBkYXRhPy5zdWNjZXNzICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGF0YT8uZXJyb3IgfHwgYCR7bGFiZWx9IGZhaWxlZCAoJHtyZXNwb25zZS5zdGF0dXMgfHwgJ3Vua25vd24gc3RhdHVzJ30pYCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHBlci1zZXJ2ZXIgY3JlZGVudGlhbCBmb3JtIHNlY3Rpb25zIGZyb20gU0lURS5kbnNTZXJ2ZXJzICovXG4gIGZ1bmN0aW9uIGJ1aWxkQ3JlZGVudGlhbFNlY3Rpb25zKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtY3JlZC1zZWN0aW9ucycpO1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgY29uc3QgZG5zSWRzID0gZ2V0RG5zSWRzKCk7XG4gICAgaWYgKGRuc0lkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDIwcHg7XCI+Tm8gRE5TIHNlcnZlcnMgY29uZmlndXJlZC48L3A+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGlkIG9mIGRuc0lkcykge1xuICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgYFxuICAgICAgPGRpdiBjbGFzcz1cInRva2VuLXNlY3Rpb25cIj5cbiAgICAgICAgPGg0IGNsYXNzPVwidG9rZW4tc2VjdGlvbi10aXRsZVwiPiR7Z2V0RG5zRGlzcGxheU5hbWUoaWQpfTwvaDQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1ncmlkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRva2VuLWZpZWxkXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiJHtpZH0tcmVhZG9ubHktdXNlcm5hbWVcIj5cXHV7MUY0RDZ9IFJlYWQtT25seSAoTG9ncyk6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiJHtpZH0tcmVhZG9ubHktdXNlcm5hbWVcIiBwbGFjZWhvbGRlcj1cIlVzZXJuYW1lXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA0cHg7XCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1pbnB1dC1yb3dcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiJHtpZH0tcmVhZG9ubHktdG9rZW5cIiBwbGFjZWhvbGRlcj1cIlBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0b2tlbi10b2dnbGVcIiBkYXRhLXRhcmdldD1cIiR7aWR9LXJlYWRvbmx5LXRva2VuXCI+XFx1ezFGNDQxfTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRva2VuLWZpZWxkXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiJHtpZH0tYWRtaW4tdXNlcm5hbWVcIj5cXHV7MUY1Mjd9IEFkbWluOjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIiR7aWR9LWFkbWluLXVzZXJuYW1lXCIgcGxhY2Vob2xkZXI9XCJVc2VybmFtZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogNHB4O1wiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9rZW4taW5wdXQtcm93XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiR7aWR9LWFkbWluLXRva2VuXCIgcGxhY2Vob2xkZXI9XCJQYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidG9rZW4tdG9nZ2xlXCIgZGF0YS10YXJnZXQ9XCIke2lkfS1hZG1pbi10b2tlblwiPlxcdXsxRjQ0MX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRva2VuLXN0YXR1c1wiIGlkPVwiJHtpZH0tdG9rZW4tc3RhdHVzXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIGApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBDcmVkZW50aWFsIGVuY3J5cHRpb24gXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2V0RW5jcnlwdGlvbktleSgpIHtcbiAgICBsZXQga2V5ID0gc2FmZVNlc3Npb25HZXQoJ2Rhc2hjYWRkeS1lbmNyeXB0aW9uLWtleScpO1xuICAgIGlmIChrZXkpIHJldHVybiBrZXk7XG5cbiAgICBjb25zdCBvbGRLZXkgPSBzYWZlR2V0KCdkYXNoY2FkZHktZW5jcnlwdGlvbi1rZXknKTtcbiAgICBpZiAob2xkS2V5KSB7XG4gICAgICBzYWZlU2Vzc2lvblNldCgnZGFzaGNhZGR5LWVuY3J5cHRpb24ta2V5Jywgb2xkS2V5KTtcbiAgICAgIHNhZmVSZW1vdmUoJ2Rhc2hjYWRkeS1lbmNyeXB0aW9uLWtleScpO1xuICAgICAgcmV0dXJuIG9sZEtleTtcbiAgICB9XG5cbiAgICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcbiAgICBrZXkgPSBBcnJheS5mcm9tKGFycmF5LCBiID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHNhZmVTZXNzaW9uU2V0KCdkYXNoY2FkZHktZW5jcnlwdGlvbi1rZXknLCBrZXkpO1xuICAgIHJldHVybiBrZXk7XG4gIH1cbiAgY29uc3QgRU5DUllQVElPTl9LRVkgPSBnZXRFbmNyeXB0aW9uS2V5KCk7XG5cbiAgZnVuY3Rpb24gY3JlZGVudGlhbEVuY3J5cHQodGV4dCwga2V5KSB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG4gICAgY29uc3QgaXYgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDgpKTtcbiAgICBjb25zdCBpdkhleCA9IEFycmF5LmZyb20oaXYsIGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgY29uc3Qga2V5Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoa2V5ICsgaXZIZXgpO1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoYXJDb2RlID0gdGV4dC5jaGFyQ29kZUF0KGkpXG4gICAgICAgIF4ga2V5Qnl0ZXNbaSAlIGtleUJ5dGVzLmxlbmd0aF1cbiAgICAgICAgXiBpdltpICUgaXYubGVuZ3RoXVxuICAgICAgICBeICgoaSAqIDMxICsgMTcpICYgMHhGRik7XG4gICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgfVxuICAgIHJldHVybiBpdkhleCArICc6JyArIGJ0b2EocmVzdWx0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWRlbnRpYWxEZWNyeXB0KGVuY3J5cHRlZFRleHQsIGtleSkge1xuICAgIGlmICghZW5jcnlwdGVkVGV4dCkgcmV0dXJuICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb2xvbklkeCA9IGVuY3J5cHRlZFRleHQuaW5kZXhPZignOicpO1xuICAgICAgaWYgKGNvbG9uSWR4ID09PSAxNikge1xuICAgICAgICBjb25zdCBpdkhleCA9IGVuY3J5cHRlZFRleHQuc3Vic3RyaW5nKDAsIDE2KTtcbiAgICAgICAgY29uc3QgaXYgPSBuZXcgVWludDhBcnJheShpdkhleC5tYXRjaCgvLnsyfS9nKS5tYXAoaCA9PiBwYXJzZUludChoLCAxNikpKTtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGF0b2IoZW5jcnlwdGVkVGV4dC5zdWJzdHJpbmcoMTcpKTtcbiAgICAgICAgY29uc3Qga2V5Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoa2V5ICsgaXZIZXgpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVjb2RlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNoYXJDb2RlID0gZGVjb2RlZC5jaGFyQ29kZUF0KGkpXG4gICAgICAgICAgICBeIGtleUJ5dGVzW2kgJSBrZXlCeXRlcy5sZW5ndGhdXG4gICAgICAgICAgICBeIGl2W2kgJSBpdi5sZW5ndGhdXG4gICAgICAgICAgICBeICgoaSAqIDMxICsgMTcpICYgMHhGRik7XG4gICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWNvZGVkID0gYXRvYihlbmNyeXB0ZWRUZXh0KTtcbiAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVjb2RlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGRlY29kZWQuY2hhckNvZGVBdChpKSBeIGtleS5jaGFyQ29kZUF0KGkgJSBrZXkubGVuZ3RoKTtcbiAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIENyZWRlbnRpYWwgc3RvcmFnZSBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBnZXRDcmVkZW50aWFsKGRuc0lkLCB0b2tlblR5cGUsIGNyZWRUeXBlKSB7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gc2FmZUdldChgJHtkbnNJZH0tJHt0b2tlblR5cGV9LSR7Y3JlZFR5cGV9LWVuY2ApO1xuICAgIHJldHVybiBjcmVkZW50aWFsRGVjcnlwdChlbmNyeXB0ZWQsIEVOQ1JZUFRJT05fS0VZKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldENyZWRlbnRpYWwoZG5zSWQsIHRva2VuVHlwZSwgY3JlZFR5cGUsIHZhbHVlKSB7XG4gICAgY29uc3Qga2V5ID0gYCR7ZG5zSWR9LSR7dG9rZW5UeXBlfS0ke2NyZWRUeXBlfS1lbmNgO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgc2FmZVNldChrZXksIGNyZWRlbnRpYWxFbmNyeXB0KHZhbHVlLCBFTkNSWVBUSU9OX0tFWSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzYWZlUmVtb3ZlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VG9rZW4oZG5zSWQsIHRva2VuVHlwZSkge1xuICAgIHJldHVybiBnZXRDcmVkZW50aWFsKGRuc0lkLCB0b2tlblR5cGUsICd0b2tlbicpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VXNlcm5hbWUoZG5zSWQsIHRva2VuVHlwZSkge1xuICAgIHJldHVybiBnZXRDcmVkZW50aWFsKGRuc0lkLCB0b2tlblR5cGUsICd1c2VybmFtZScpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0VG9rZW4oZG5zSWQsIHRva2VuVHlwZSwgdG9rZW4pIHtcbiAgICBzZXRDcmVkZW50aWFsKGRuc0lkLCB0b2tlblR5cGUsICd0b2tlbicsIHRva2VuKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFVzZXJuYW1lKGRuc0lkLCB0b2tlblR5cGUsIHVzZXJuYW1lKSB7XG4gICAgc2V0Q3JlZGVudGlhbChkbnNJZCwgdG9rZW5UeXBlLCAndXNlcm5hbWUnLCB1c2VybmFtZSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRBbGxDcmVkZW50aWFscygpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGRuc0lkIG9mIGdldERuc0lkcygpKSB7XG4gICAgICByZXN1bHRbZG5zSWRdID0ge1xuICAgICAgICByZWFkb25seTogeyB1c2VybmFtZTogZ2V0VXNlcm5hbWUoZG5zSWQsICdyZWFkb25seScpLCB0b2tlbjogZ2V0VG9rZW4oZG5zSWQsICdyZWFkb25seScpIH0sXG4gICAgICAgIGFkbWluOiB7IHVzZXJuYW1lOiBnZXRVc2VybmFtZShkbnNJZCwgJ2FkbWluJyksIHRva2VuOiBnZXRUb2tlbihkbnNJZCwgJ2FkbWluJykgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyQWxsQ3JlZGVudGlhbHMoKSB7XG4gICAgZ2V0RG5zSWRzKCkuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICBbJ3JlYWRvbmx5JywgJ2FkbWluJ10uZm9yRWFjaCh0b2tlblR5cGUgPT4ge1xuICAgICAgICBbJ3Rva2VuJywgJ3VzZXJuYW1lJ10uZm9yRWFjaChjcmVkVHlwZSA9PiB7XG4gICAgICAgICAgc2FmZVJlbW92ZShgJHtkbnNJZH0tJHt0b2tlblR5cGV9LSR7Y3JlZFR5cGV9LWVuY2ApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgc2FmZVJlbW92ZShgJHtkbnNJZH0tdG9rZW4tZW5jYCk7XG4gICAgICBzYWZlUmVtb3ZlKGAke2Ruc0lkfS11c2VybmFtZS1lbmNgKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFN0b3JlZENyZWRlbnRpYWxzKGRuc0lkKSB7XG4gICAgY29uc3QgcmVhZG9ubHlUb2tlbiA9IGdldFRva2VuKGRuc0lkLCAncmVhZG9ubHknKTtcbiAgICBjb25zdCByZWFkb25seVVzZXJuYW1lID0gZ2V0VXNlcm5hbWUoZG5zSWQsICdyZWFkb25seScpO1xuICAgIGNvbnN0IGFkbWluVG9rZW4gPSBnZXRUb2tlbihkbnNJZCwgJ2FkbWluJyk7XG4gICAgY29uc3QgYWRtaW5Vc2VybmFtZSA9IGdldFVzZXJuYW1lKGRuc0lkLCAnYWRtaW4nKTtcbiAgICBjb25zdCBvbGRUb2tlbiA9IGNyZWRlbnRpYWxEZWNyeXB0KHNhZmVHZXQoYCR7ZG5zSWR9LXRva2VuLWVuY2ApLCBFTkNSWVBUSU9OX0tFWSk7XG4gICAgY29uc3Qgb2xkVXNlcm5hbWUgPSBjcmVkZW50aWFsRGVjcnlwdChzYWZlR2V0KGAke2Ruc0lkfS11c2VybmFtZS1lbmNgKSwgRU5DUllQVElPTl9LRVkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJuYW1lOiBhZG1pblVzZXJuYW1lIHx8IHJlYWRvbmx5VXNlcm5hbWUgfHwgb2xkVXNlcm5hbWUsXG4gICAgICB0b2tlbjogYWRtaW5Ub2tlbiB8fCByZWFkb25seVRva2VuIHx8IG9sZFRva2VuLFxuICAgICAgcmVhZG9ubHlUb2tlbjogcmVhZG9ubHlUb2tlbiB8fCBvbGRUb2tlbixcbiAgICAgIHJlYWRvbmx5VXNlcm5hbWU6IHJlYWRvbmx5VXNlcm5hbWUgfHwgb2xkVXNlcm5hbWUsXG4gICAgICBhZG1pblRva2VuOiBhZG1pblRva2VuIHx8IG9sZFRva2VuLFxuICAgICAgYWRtaW5Vc2VybmFtZTogYWRtaW5Vc2VybmFtZSB8fCBvbGRVc2VybmFtZVxuICAgIH07XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgTW9kYWwgaGFuZGxlcnMgXHUyNTAwXHUyNTAwXG5cbiAgLy8gT3BlbiBtb2RhbCBcdTIwMTQgYnVpbGQgc2VjdGlvbnMgZHluYW1pY2FsbHksIHBvcHVsYXRlIGZyb20gc3RvcmVkIGNyZWRzXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW5hZ2UtdG9rZW5zJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGJ1aWxkQ3JlZGVudGlhbFNlY3Rpb25zKCk7XG4gICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW4tbWFuYWdlbWVudC1tb2RhbCcpO1xuICAgIGNvbnN0IGNyZWRzID0gZ2V0QWxsQ3JlZGVudGlhbHMoKTtcblxuICAgIGdldERuc0lkcygpLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgY29uc3QgYyA9IGNyZWRzW2Ruc0lkXTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS11c2VybmFtZWApLnZhbHVlID0gYy5yZWFkb25seS51c2VybmFtZTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS10b2tlbmApLnZhbHVlID0gYy5yZWFkb25seS50b2tlbjtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi11c2VybmFtZWApLnZhbHVlID0gYy5hZG1pbi51c2VybmFtZTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi10b2tlbmApLnZhbHVlID0gYy5hZG1pbi50b2tlbjtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICcnO1xuICAgIH0pO1xuXG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICAvLyBUb2dnbGUgcGFzc3dvcmQgdmlzaWJpbGl0eSArIGJhY2tkcm9wIGNsb3NlIChldmVudCBkZWxlZ2F0aW9uIGZvciBkeW5hbWljIGVsZW1lbnRzKVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW4tbWFuYWdlbWVudC1tb2RhbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLnRva2VuLXRvZ2dsZScpO1xuICAgIGlmIChidG4pIHtcbiAgICAgIGNvbnN0IHRhcmdldElkID0gYnRuLmRhdGFzZXQudGFyZ2V0O1xuICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXRJZCk7XG4gICAgICBpZiAoaW5wdXQudHlwZSA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICBpbnB1dC50eXBlID0gJ3RleHQnO1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXFx1ezFGNjQ4fSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dC50eXBlID0gJ3Bhc3N3b3JkJztcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1xcdXsxRjQ0MX0nO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZS50YXJnZXQuaWQgPT09ICd0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJykge1xuICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gU2F2ZSBjcmVkZW50aWFsc1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW4tc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkbnNJZHMgPSBnZXREbnNJZHMoKTtcblxuICAgIC8vIEJ1aWxkIHBlci1zZXJ2ZXIgY3JlZGVudGlhbHMgcGF5bG9hZCBmb3IgYmFja2VuZCBzeW5jXG4gICAgY29uc3Qgc2VydmVycyA9IHt9O1xuICAgIGxldCBoYXNBbnlDcmVkcyA9IGZhbHNlO1xuXG4gICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSB7fTtcbiAgICAgIGNvbnN0IHJvVXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS11c2VybmFtZWApLnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IHJvUGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS10b2tlbmApLnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IGFkbWluVXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi11c2VybmFtZWApLnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IGFkbWluUGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi10b2tlbmApLnZhbHVlLnRyaW0oKTtcblxuICAgICAgaWYgKHJvVXNlciAmJiByb1Bhc3MpIHtcbiAgICAgICAgZW50cnkucmVhZG9ubHkgPSB7IHVzZXJuYW1lOiByb1VzZXIsIHBhc3N3b3JkOiByb1Bhc3MgfTtcbiAgICAgICAgaGFzQW55Q3JlZHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFkbWluVXNlciAmJiBhZG1pblBhc3MpIHtcbiAgICAgICAgZW50cnkuYWRtaW4gPSB7IHVzZXJuYW1lOiBhZG1pblVzZXIsIHBhc3N3b3JkOiBhZG1pblBhc3MgfTtcbiAgICAgICAgaGFzQW55Q3JlZHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKE9iamVjdC5rZXlzKGVudHJ5KS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNlcnZlcnNbZG5zSWRdID0gZW50cnk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoaGFzQW55Q3JlZHMpIHtcbiAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgaWYgKHNlcnZlcnNbZG5zSWRdKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJ1ZlcmlmeWluZy4uLic7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMnO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZG5zL2NyZWRlbnRpYWxzJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmVycyB9KVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVpcmVTdWNjZXNzZnVsRG5zTXV0YXRpb24ocmVzLCAnRE5TIGNyZWRlbnRpYWwgc2F2ZScpO1xuICAgICAgICBpZiAoZGF0YS5yZXN1bHRzKSB7XG4gICAgICAgICAgY29uc3QgZmFpbGVkID0gT2JqZWN0LmtleXMoc2VydmVycykuZmlsdGVyKGRuc0lkID0+IGRhdGEucmVzdWx0c1tkbnNJZF0/LnN1Y2Nlc3MgIT09IHRydWUpO1xuICAgICAgICAgIGlmIChmYWlsZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZmFpbGVkLm1hcChkbnNJZCA9PiBkYXRhLnJlc3VsdHNbZG5zSWRdPy5lcnJvciB8fCBgJHtkbnNJZH0gZmFpbGVkYCkuam9pbignOyAnKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkZXRhaWxzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSBsb2NhbGx5IG9ubHkgYWZ0ZXIgdGhlIGVuY3J5cHRlZCBzZXJ2ZXIgdmF1bHQgY29uZmlybXMgc3VjY2Vzcy5cbiAgICAgICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgICAgIHNldFVzZXJuYW1lKGRuc0lkLCAncmVhZG9ubHknLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdXNlcm5hbWVgKS52YWx1ZS50cmltKCkpO1xuICAgICAgICAgIHNldFRva2VuKGRuc0lkLCAncmVhZG9ubHknLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdG9rZW5gKS52YWx1ZS50cmltKCkpO1xuICAgICAgICAgIHNldFVzZXJuYW1lKGRuc0lkLCAnYWRtaW4nLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdXNlcm5hbWVgKS52YWx1ZS50cmltKCkpO1xuICAgICAgICAgIHNldFRva2VuKGRuc0lkLCAnYWRtaW4nLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdG9rZW5gKS52YWx1ZS50cmltKCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBkbnNJZHMuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCk7XG4gICAgICAgICAgaWYgKCFzZXJ2ZXJzW2Ruc0lkXSkgeyBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICcnOyByZXR1cm47IH1cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBkYXRhLnJlc3VsdHM/LltkbnNJZF07XG4gICAgICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSByZXN1bHQ/LnBhcnRpYWwgPyAnXFx1MjcxMyAnICsgcmVzdWx0LnBhcnRpYWwgOiAnXFx1MjcxMyBWZXJpZmllZCAmIHNhdmVkJztcbiAgICAgICAgICBzdGF0dXNFbC5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzIHN1Y2Nlc3MnO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN5bmMgRE5TIGNyZWRlbnRpYWxzIHRvIGJhY2tlbmQ6JywgZSk7XG4gICAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgICBpZiAoc2VydmVyc1tkbnNJZF0pIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICdcXHUyNzE3ICcgKyAoZS5tZXNzYWdlIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMgZXJyb3InO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJyc7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBdXRvLWNsb3NlIGFmdGVyIGRlbGF5IGlmIGFsbCBzdWNjZWVkZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGFsbEdvb2QgPSBkbnNJZHMuZXZlcnkoZG5zSWQgPT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCk/LnRleHRDb250ZW50O1xuICAgICAgICByZXR1cm4gIXN0YXR1cyB8fCBzdGF0dXMuaW5jbHVkZXMoJ1xcdTI3MTMnKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGFsbEdvb2QpIGNsb3NlTW9kYWwoJ3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnKTtcbiAgICB9LCAxNTAwKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuLWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjbG9zZU1vZGFsKCd0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJyk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbi1jbGVhci1hbGwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpcm0oJ0NsZWFyIGFsbCBzdG9yZWQgRE5TIGNyZWRlbnRpYWxzPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZG5zL2NyZWRlbnRpYWxzJywgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgICBhd2FpdCByZXF1aXJlU3VjY2Vzc2Z1bERuc011dGF0aW9uKHJlc3BvbnNlLCAnRE5TIGNyZWRlbnRpYWwgcmVtb3ZhbCcpO1xuICAgICAgICBjbGVhckFsbENyZWRlbnRpYWxzKCk7XG4gICAgICAgIGdldERuc0lkcygpLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS11c2VybmFtZWApLnZhbHVlID0gJyc7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXRva2VuYCkudmFsdWUgPSAnJztcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdXNlcm5hbWVgKS52YWx1ZSA9ICcnO1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi10b2tlbmApLnZhbHVlID0gJyc7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJ1xcdTI3MTMgQ2xlYXJlZCc7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMgc3VjY2Vzcyc7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBnZXREbnNJZHMoKS5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkudGV4dENvbnRlbnQgPSAnXFx1MjcxNyAnICsgKGUubWVzc2FnZSB8fCAnQ2xlYXIgZmFpbGVkJyk7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMgZXJyb3InO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBXaW5kb3cgZXhwb3J0cyBcdTI1MDBcdTI1MDBcbiAgd2luZG93LmdldFRva2VuID0gZ2V0VG9rZW47XG4gIHdpbmRvdy5nZXRVc2VybmFtZSA9IGdldFVzZXJuYW1lO1xuICB3aW5kb3cuc2V0VG9rZW4gPSBzZXRUb2tlbjtcbiAgd2luZG93LnNldFVzZXJuYW1lID0gc2V0VXNlcm5hbWU7XG4gIHdpbmRvdy5nZXRBbGxDcmVkZW50aWFscyA9IGdldEFsbENyZWRlbnRpYWxzO1xuICB3aW5kb3cuZ2V0Q3JlZGVudGlhbCA9IGdldENyZWRlbnRpYWw7XG4gIHdpbmRvdy5zZXRDcmVkZW50aWFsID0gc2V0Q3JlZGVudGlhbDtcbiAgd2luZG93LmdldEVuY3J5cHRpb25LZXkgPSBnZXRFbmNyeXB0aW9uS2V5O1xuICB3aW5kb3cuZ2V0RG5zSWRzID0gZ2V0RG5zSWRzO1xuICB3aW5kb3cuZ2V0RG5zRGlzcGxheU5hbWUgPSBnZXREbnNEaXNwbGF5TmFtZTtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gR1JJRCAmIFNUQVRVUyBIRUxQRVJTID09PT09PT09PT1cbihmdW5jdGlvbiAoKSB7XG5cbiAgZnVuY3Rpb24gc3RhdHVzTGFiZWwodXApIHtcbiAgICBjb25zdCBpMThuID0gd2luZG93LkRDSTE4bjtcbiAgICBpZiAoIWkxOG4gfHwgIWkxOG4uaXNMb2FkZWQoKSkgcmV0dXJuIHVwID8gJ09OJyA6ICdPRkYnO1xuICAgIHJldHVybiBpMThuLnQodXAgPyAnY2FyZC5zdGF0dXMub24nIDogJ2NhcmQuc3RhdHVzLm9mZicpO1xuICB9XG5cbiAgLyogRW5oYW5jZWQgc3RhdHVzIGhlbHBlcnMgd2l0aCByZXNwb25zZSB0aW1lIHRyYWNraW5nICovXG4gIGZ1bmN0aW9uIHNldFF1aWNrKGlkLCB1cCwgcmVzcG9uc2VUaW1lID0gbnVsbCkge1xuICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkICsgJy1kb3QnKTtcbiAgICBjb25zdCBwaWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQgKyAnLXBpbGwnKTtcbiAgICBjb25zdCB0aW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCArICctdGltZScpO1xuICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHA9XCIke2lkfVwiXWApO1xuXG4gICAgaWYgKGRvdCkge1xuICAgICAgZG90LmNsYXNzTGlzdC50b2dnbGUoJ29rJywgdXApO1xuICAgICAgZG90LmNsYXNzTGlzdC50b2dnbGUoJ2JhZCcsICF1cCk7XG4gICAgfVxuXG4gICAgaWYgKHBpbGwpIHtcbiAgICAgIHBpbGwudGV4dENvbnRlbnQgPSBzdGF0dXNMYWJlbCh1cCk7XG4gICAgICBwaWxsLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgdXApO1xuICAgICAgcGlsbC5jbGFzc0xpc3QudG9nZ2xlKCdvZmYnLCAhdXApO1xuICAgIH1cblxuICAgIGlmICh0aW1lRWwgJiYgcmVzcG9uc2VUaW1lICE9PSBudWxsKSB7XG4gICAgICB0aW1lRWwudGV4dENvbnRlbnQgPSB1cCA/IGAke3Jlc3BvbnNlVGltZX1tc2AgOiAndGltZW91dCc7XG4gICAgICB0aW1lRWwuY2xhc3NOYW1lID0gYHJlc3BvbnNlLXRpbWUgJHtnZXRSZXNwb25zZVRpbWVDbGFzcyhyZXNwb25zZVRpbWUsIHVwKX1gO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjYXJkIHN0YXR1cyBmb3IgaWNvbiBjb2xvcmluZ1xuICAgIGlmIChjYXJkKSB7XG4gICAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0dXMnLCB1cCA/ICdvbicgOiAnb2ZmJyk7XG4gICAgfVxuXG4gIH1cblxuICBmdW5jdGlvbiBnZXRSZXNwb25zZVRpbWVDbGFzcyh0aW1lLCBpc1VwKSB7XG4gICAgaWYgKCFpc1VwKSByZXR1cm4gJ3RpbWVvdXQnO1xuICAgIGlmICh0aW1lIDwgMjAwKSByZXR1cm4gJ2V4Y2VsbGVudCc7XG4gICAgaWYgKHRpbWUgPCA1MDApIHJldHVybiAnZ29vZCc7XG4gICAgaWYgKHRpbWUgPCAxMDAwKSByZXR1cm4gJ2ZhaXInO1xuICAgIHJldHVybiAnc2xvdyc7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjaGVja1NlcnZpY2VXaXRoVGltaW5nKGlkKSB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL3Byb2JlLycgKyBpZCwgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlVGltZSA9IE1hdGgucm91bmQoZW5kVGltZSAtIHN0YXJ0VGltZSk7XG4gICAgICBjb25zdCBpc1VwID0gKHIuc3RhdHVzID49IDIwMCAmJiByLnN0YXR1cyA8IDQwMCkgfHwgci5zdGF0dXMgPT09IDQwMSB8fCByLnN0YXR1cyA9PT0gNDAzO1xuICAgICAgcmV0dXJuIHsgaXNVcCwgcmVzcG9uc2VUaW1lIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zdCBlbmRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBjb25zdCByZXNwb25zZVRpbWUgPSBNYXRoLnJvdW5kKGVuZFRpbWUgLSBzdGFydFRpbWUpO1xuICAgICAgcmV0dXJuIHsgaXNVcDogZmFsc2UsIHJlc3BvbnNlVGltZSB9O1xuICAgIH1cbiAgfVxuXG4gIC8qIEFwcCBncmlkIC0gbG9hZGVkIGZyb20gQVBJICovXG4gIHdpbmRvdy5BUFBTID0gW107IC8vIFVzZSB3aW5kb3cuQVBQUyBhcyB0aGUgbWFpbiBhcnJheVxuICBsZXQgcmVmcmVzaEluRmxpZ2h0ID0gbnVsbDtcbiAgbGV0IHJlZnJlc2hRdWV1ZWQgPSBmYWxzZTtcblxuICAvLyBMb2FkIHNlcnZpY2VzIGZyb20gQVBJXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRTZXJ2aWNlcygpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHdpbmRvdy5Ta2VsZXRvbkxvYWRlcikgd2luZG93LlNrZWxldG9uTG9hZGVyLnNob3coNik7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlcnZpY2VzJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIC8vIFN0YW5kYXJkIGVudmVsb3BlOiB7IHN1Y2Nlc3M6IHRydWUsIHNlcnZpY2VzOiBbLi4uXSwgcGFnaW5hdGlvbj86IHsuLi59IH1cbiAgICAgICAgd2luZG93LkFQUFMgPSByZXN1bHQuc2VydmljZXMgfHwgW107XG4gICAgICAgIGlmICh3aW5kb3cuU2tlbGV0b25Mb2FkZXIpIHdpbmRvdy5Ta2VsZXRvbkxvYWRlci5oaWRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzZXJ2aWNlczonLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICBpZiAod2luZG93LlNrZWxldG9uTG9hZGVyKSB3aW5kb3cuU2tlbGV0b25Mb2FkZXIuaGlkZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzZXJ2aWNlczonLCBlcnJvcik7XG4gICAgICBpZiAod2luZG93LlNrZWxldG9uTG9hZGVyKSB3aW5kb3cuU2tlbGV0b25Mb2FkZXIuaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNlcnZpY2VVcmwoaWQpIHtcbiAgICBjb25zdCBzdmMgPSB3aW5kb3cuQVBQUz8uZmluZChhID0+IGEuaWQgPT09IGlkKTtcbiAgICBpZiAoc3ZjPy51cmwpIHJldHVybiBzdmMudXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSA/IHN2Yy51cmwgOiAnaHR0cHM6Ly8nICsgc3ZjLnVybDtcbiAgICBpZiAoc3ZjPy5pc0V4dGVybmFsICYmIHN2Yy5leHRlcm5hbFVybCkgcmV0dXJuIHN2Yy5leHRlcm5hbFVybDtcbiAgICBjb25zdCBkbnMgPSBTSVRFLmRuc1NlcnZlcnM/LltpZF07XG4gICAgaWYgKGRucykgcmV0dXJuICdodHRwOi8vJyArIGRucy5pcCArICc6JyArIChkbnMucG9ydCB8fCA1MzgwKTtcbiAgICByZXR1cm4gYnVpbGRTZXJ2aWNlVXJsKGlkKTtcbiAgfVxuICBmdW5jdGlvbiBlbCh0YWcsIGNscywgdHh0KSB7IGNvbnN0IG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7IGlmIChjbHMpIG4uY2xhc3NOYW1lID0gY2xzOyBpZiAodHh0KSBuLnRleHRDb250ZW50ID0gdHh0OyByZXR1cm4gbjsgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkR3JpZCgpIHtcbiAgICBjb25zdCByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmRzJyk7IHJvb3QuaW5uZXJIVE1MID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aW5kb3cuQVBQUy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcyA9IHdpbmRvdy5BUFBTW2ldO1xuICAgICAgaWYgKHMuaWQgPT09ICdjYScpIGNvbnRpbnVlOyAvLyBEYXNoQ0EgbGl2ZXMgaW4gdG9wIGFuY2hvciByb3dcbiAgICAgIGNvbnN0IGNhcmQgPSBlbCgnZGl2JywgJ2NhcmQnKTtcbiAgICAgIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWFwcCcsIHMuaWQpO1xuICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgJ29mZicpOyAvLyBJbml0aWFsIHN0YXR1c1xuICAgICAgaWYgKHMuY29udGFpbmVySWQpIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWNvbnRhaW5lci1pZCcsIHMuY29udGFpbmVySWQpO1xuICAgICAgaWYgKHMuY2F0ZWdvcnkpIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWNhdGVnb3J5Jywgcy5jYXRlZ29yeSk7XG4gICAgICBpZiAocy5yZWNpcGVJZCkgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVjaXBlLWlkJywgcy5yZWNpcGVJZCk7XG5cbiAgICAgIGNvbnN0IGRvdCA9IGVsKCdzcGFuJywgJ2RvdCBiYWQgYXQtYmwnKTsgZG90LmlkID0gJ2RvdC0nICsgcy5pZCArICctZ3JpZCc7IGNhcmQuYXBwZW5kQ2hpbGQoZG90KTtcblxuICAgICAgY29uc3Qgcm93ID0gZWwoJ2RpdicsICdyb3cnKTtcbiAgICAgIGNvbnN0IHdyYXAgPSBlbCgnZGl2JywgJ2xvZ28td3JhcCcpO1xuXG4gICAgICAvLyBVc2UgcmVsaWFibGUgUE5HIGltYWdlcyB3aXRoIGF1dG9tYXRpYyBDRE4gZmFsbGJhY2tcbiAgICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgaW1nLnNyYyA9IHMubG9nbztcbiAgICAgIGltZy5hbHQgPSBzLm5hbWU7XG4gICAgICBpbWcuY2xhc3NOYW1lID0gJ2xvZ28taW1nJztcbiAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFRyeSBDRE4gZmFsbGJhY2sgd2l0aCBtdWx0aXBsZSBuYW1pbmcgc3RyYXRlZ2llc1xuICAgICAgICAvLyBVc2UgaWQsIGFwcFRlbXBsYXRlLCBvciBkZXJpdmUgZnJvbSBuYW1lXG4gICAgICAgIGxldCBhcHBJZCA9IHMuaWQgfHwgcy5hcHBUZW1wbGF0ZTtcbiAgICAgICAgaWYgKCFhcHBJZCAmJiBzLm5hbWUpIHtcbiAgICAgICAgICAvLyBEZXJpdmUgSUQgZnJvbSBuYW1lIChsb3dlcmNhc2UsIHJlbW92ZSBzcGFjZXMpXG4gICAgICAgICAgYXBwSWQgPSBzLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXBwSWQpIHtcbiAgICAgICAgICAvLyBUcnkgZGlmZmVyZW50IENETiBVUkwgZm9ybWF0c1xuICAgICAgICAgIGNvbnN0IGNkblVybHMgPSBbXG4gICAgICAgICAgICBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL3dhbGt4Y29kZS9kYXNoYm9hcmQtaWNvbnMvcG5nLyR7YXBwSWR9LnBuZ2AsXG4gICAgICAgICAgICBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL3dhbGt4Y29kZS9kYXNoYm9hcmQtaWNvbnMvcG5nLyR7YXBwSWQudG9Mb3dlckNhc2UoKX0ucG5nYCxcbiAgICAgICAgICAgIGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvd2Fsa3hjb2RlL2Rhc2hib2FyZC1pY29ucy9wbmcvJHthcHBJZC5yZXBsYWNlKC8tL2csICcnKX0ucG5nYCxcbiAgICAgICAgICAgIGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvd2Fsa3hjb2RlL2Rhc2hib2FyZC1pY29ucy9wbmcvJHtzLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJyl9LnBuZ2BcbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZXNcbiAgICAgICAgICBjb25zdCB1bmlxdWVVcmxzID0gWy4uLm5ldyBTZXQoY2RuVXJscyldO1xuXG4gICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCBVUkwgdG8gdHJ5XG4gICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdW5pcXVlVXJscy5pbmRleE9mKHRoaXMuc3JjKTtcbiAgICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuXG4gICAgICAgICAgaWYgKG5leHRJbmRleCA8IHVuaXF1ZVVybHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNyYyA9IHVuaXF1ZVVybHNbbmV4dEluZGV4XTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoaW1nKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZCh3cmFwKTtcblxuICAgICAgY29uc3QgbmFtZVNwYW4gPSBlbCgnc3BhbicsICduYW1lJywgcy5uYW1lKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChuYW1lU3Bhbik7XG5cbiAgICAgIC8vIEFkZCBUYWlsc2NhbGUgYmFkZ2UgaWYgc2VydmljZSBpcyBwcm90ZWN0ZWRcbiAgICAgIGlmIChzLnRhaWxzY2FsZU9ubHkpIHtcbiAgICAgICAgY29uc3QgdHNCYWRnZSA9IGVsKCdzcGFuJywgJ3RzLWJhZGdlJywgJ1x1RDgzRFx1REQxMCcpO1xuICAgICAgICB0c0JhZGdlLnRpdGxlID0gJ1RhaWxzY2FsZS1vbmx5IGFjY2Vzcyc7XG4gICAgICAgIHRzQmFkZ2Uuc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tbGVmdDogNnB4OyBmb250LXNpemU6IDAuNzVyZW07IG9wYWNpdHk6IDAuODsnO1xuICAgICAgICBuYW1lU3Bhbi5hcHBlbmRDaGlsZCh0c0JhZGdlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIENhdGVnb3J5IGJhZGdlIGlmIHNlcnZpY2UgaGFzIG9uZSAoY29sb3JlZCBwaWxsIHdpdGggaWNvbilcbiAgICAgIGlmIChzLmNhdGVnb3J5KSB7XG4gICAgICAgIGNvbnN0IGNhdHMgPSAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5DQVRFR09SSUVTKSB8fCB3aW5kb3cuRENfQ0FURUdPUklFUyB8fCB7fTtcbiAgICAgICAgY29uc3QgY2F0SW5mbyA9IGNhdHNbcy5jYXRlZ29yeV0gfHwge307XG4gICAgICAgIGNvbnN0IGNhdEJhZGdlID0gZWwoJ3NwYW4nLCAnY2F0LWJhZGdlJywgYCR7Y2F0SW5mby5pY29uIHx8ICcnfSAke3MuY2F0ZWdvcnl9YC50cmltKCkpO1xuICAgICAgICBjYXRCYWRnZS50aXRsZSA9IGBDYXRlZ29yeTogJHtzLmNhdGVnb3J5fWA7XG4gICAgICAgIGNhdEJhZGdlLnN0eWxlLmNzc1RleHQgPSBgbWFyZ2luLWxlZnQ6IDZweDsgZm9udC1zaXplOiAwLjY1cmVtOyBwYWRkaW5nOiAxcHggNnB4OyBib3JkZXItcmFkaXVzOiA5OTlweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICR7Y2F0SW5mby5jb2xvciB8fCAnIzdmOGM4ZCd9IDI1JSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogJHtjYXRJbmZvLmNvbG9yIHx8ICcjN2Y4YzhkJ307IGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCAke2NhdEluZm8uY29sb3IgfHwgJyM3ZjhjOGQnfSA1MCUsIHRyYW5zcGFyZW50KTsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgZm9udC13ZWlnaHQ6IDUwMDtgO1xuICAgICAgICBuYW1lU3Bhbi5hcHBlbmRDaGlsZChjYXRCYWRnZSk7XG4gICAgICB9XG5cbiAgICAgIHJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsICdzcGFjZXInKSk7XG5cbiAgICAgIGNvbnN0IHBpbGwgPSBlbCgnc3BhbicsICdiYWRnZSBvZmYnLCAnT0ZGJyk7XG4gICAgICBwaWxsLmlkID0gJ2JhZGdlLScgKyBzLmlkO1xuICAgICAgcGlsbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaTE4bi1saXZlLXN0YXR1cycsICdiaW5hcnknKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChwaWxsKTtcblxuICAgICAgLy8gVXBkYXRlIGF2YWlsYWJsZSBiYWRnZSAoaGlkZGVuIGJ5IGRlZmF1bHQsIHNob3duIHdoZW4gdXBkYXRlIGRldGVjdGVkKVxuICAgICAgY29uc3QgdXBkYXRlQmFkZ2UgPSBlbCgnc3BhbicsICd1cGRhdGUtYXZhaWxhYmxlLWJhZGdlJywgJ1VQREFURScpO1xuICAgICAgdXBkYXRlQmFkZ2UuaWQgPSAndXBkYXRlLWJhZGdlLScgKyBzLmlkO1xuICAgICAgdXBkYXRlQmFkZ2UudGl0bGUgPSAnVXBkYXRlIGF2YWlsYWJsZSc7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQodXBkYXRlQmFkZ2UpO1xuXG4gICAgICBjYXJkLmFwcGVuZENoaWxkKHJvdyk7XG5cbiAgICAgIC8vIEFkZCByZXNwb25zZSB0aW1lIHJvd1xuICAgICAgY29uc3QgcmVzcG9uc2VSb3cgPSBlbCgnZGl2JywgJ3Jlc3BvbnNlLXJvdycpO1xuICAgICAgY29uc3QgdGltZVNwYW4gPSBlbCgnc3BhbicsICdyZXNwb25zZS10aW1lJywgJy0tJyk7IHRpbWVTcGFuLmlkID0gJ3RpbWUtJyArIHMuaWQ7XG4gICAgICByZXNwb25zZVJvdy5hcHBlbmRDaGlsZCh0aW1lU3Bhbik7XG4gICAgICBjYXJkLmFwcGVuZENoaWxkKHJlc3BvbnNlUm93KTtcblxuICAgICAgLy8gQWRkIGhlYWx0aC91cHRpbWUgcm93XG4gICAgICBjb25zdCBoZWFsdGhSb3cgPSBlbCgnZGl2JywgJ2hlYWx0aC1yb3cnKTtcbiAgICAgIGhlYWx0aFJvdy5pZCA9ICdoZWFsdGgtJyArIHMuaWQ7XG4gICAgICBjb25zdCB1cHRpbWVDaGlwID0gZWwoJ3NwYW4nLCAndXB0aW1lLWNoaXAnLCAnLS0nKTtcbiAgICAgIHVwdGltZUNoaXAuaWQgPSAndXB0aW1lLScgKyBzLmlkO1xuICAgICAgaGVhbHRoUm93LmFwcGVuZENoaWxkKHVwdGltZUNoaXApO1xuICAgICAgY29uc3QgdXB0aW1lTWluaUJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdXB0aW1lTWluaUJhci5jbGFzc05hbWUgPSAndXB0aW1lLW1pbmktYmFyJztcbiAgICAgIGNvbnN0IHVwdGltZUZpbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHVwdGltZUZpbGwuY2xhc3NOYW1lID0gJ2ZpbGwnO1xuICAgICAgdXB0aW1lRmlsbC5pZCA9ICd1cHRpbWUtYmFyLScgKyBzLmlkO1xuICAgICAgdXB0aW1lRmlsbC5zdHlsZS53aWR0aCA9ICcwJSc7XG4gICAgICB1cHRpbWVNaW5pQmFyLmFwcGVuZENoaWxkKHVwdGltZUZpbGwpO1xuICAgICAgaGVhbHRoUm93LmFwcGVuZENoaWxkKHVwdGltZU1pbmlCYXIpO1xuICAgICAgY2FyZC5hcHBlbmRDaGlsZChoZWFsdGhSb3cpO1xuXG4gICAgICBjb25zdCBidG5Sb3cgPSBlbCgnZGl2JywgJ2J0bi1yb3cnKTtcblxuICAgICAgLy8gQWRkIGxvZ3MgYnV0dG9uIGZvciBzZXJ2aWNlcyB3aXRoIGNvbnRhaW5lcklkc1xuICAgICAgaWYgKHMuY29udGFpbmVySWQpIHtcbiAgICAgICAgY29uc3QgbG9nc0J0biA9IGVsKCdidXR0b24nLCAnbG9ncy1idG4nLCAnXHVEODNEXHVEQ0NCJyk7XG4gICAgICAgIGxvZ3NCdG4udGl0bGUgPSAnVmlldyBjb250YWluZXIgbG9ncyc7XG4gICAgICAgIGxvZ3NCdG4ub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB3aW5kb3cub3BlbkNvbnRhaW5lckxvZ3NNb2RhbChzLmNvbnRhaW5lcklkLCBzLm5hbWUpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQobG9nc0J0bik7XG5cbiAgICAgICAgLy8gQWRkIHVwZGF0ZSBidXR0b24gZm9yIERvY2tlciBjb250YWluZXJzXG4gICAgICAgIGNvbnN0IHVwZGF0ZUJ0biA9IGVsKCdidXR0b24nLCAndXBkYXRlLWJ0bicsICdcdTJCMDZcdUZFMEYnKTtcbiAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0ZSBjb250YWluZXIgdG8gbGF0ZXN0IHZlcnNpb24nO1xuICAgICAgICB1cGRhdGVCdG4uaWQgPSBgdXBkYXRlLWJ0bi0ke3MuaWR9YDtcbiAgICAgICAgdXBkYXRlQnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgd2luZG93LnVwZGF0ZUNvbnRhaW5lcihzLmNvbnRhaW5lcklkLCBzLm5hbWUsIHMuaWQpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQodXBkYXRlQnRuKTtcblxuICAgICAgICAvLyBUZXJtaW5hbCBleGVjIGJ1dHRvbiAoc3VidGxlIFx1MjAxNCB2aXNpYmxlIG9uIGhvdmVyKVxuICAgICAgICBjb25zdCBleGVjQnRuID0gZWwoJ2J1dHRvbicsICdleGVjLWJ0bicsICc+XycpO1xuICAgICAgICBleGVjQnRuLnRpdGxlID0gJ09wZW4gdGVybWluYWwnO1xuICAgICAgICBleGVjQnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgaWYgKHdpbmRvdy5vcGVuRXhlY01vZGFsKSB3aW5kb3cub3BlbkV4ZWNNb2RhbChzLmNvbnRhaW5lcklkLCBzLm5hbWUpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQoZXhlY0J0bik7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBsb2dzIGJ1dHRvbiBmb3Igc2VydmljZXMgd2l0aCBsb2dQYXRoIChuYXRpdmUgYXBwcylcbiAgICAgIGlmIChzLmxvZ1BhdGggJiYgIXMuY29udGFpbmVySWQpIHtcbiAgICAgICAgY29uc3QgbG9nc0J0biA9IGVsKCdidXR0b24nLCAnbG9ncy1idG4nLCAnXHVEODNEXHVEQ0NCJyk7XG4gICAgICAgIGxvZ3NCdG4udGl0bGUgPSAnVmlldyBhcHBsaWNhdGlvbiBsb2dzJztcbiAgICAgICAgbG9nc0J0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHdpbmRvdy5vcGVuRmlsZUxvZ3NNb2RhbChzLmxvZ1BhdGgsIHMubmFtZSk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0blJvdy5hcHBlbmRDaGlsZChsb2dzQnRuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGNyZWRlbnRpYWxzIGJ1dHRvbiBmb3Igc2VydmljZXMgdGhhdCBzdXBwb3J0IGF1dG8tbG9naW5cbiAgICAgIGlmIChzLmlzRXh0ZXJuYWwgfHwgcy5hcHBUZW1wbGF0ZSB8fCBzLnVybCkge1xuICAgICAgICBjb25zdCBjcmVkc0J0biA9IGVsKCdidXR0b24nLCAnY3JlZHMtYnRuJywgJ1x1RDgzRFx1REQxMScpO1xuICAgICAgICBjcmVkc0J0bi50aXRsZSA9ICdBdXRvLWxvZ2luIGNyZWRlbnRpYWxzJztcbiAgICAgICAgY3JlZHNCdG4uaWQgPSBgY3JlZHMtYnRuLSR7cy5pZH1gO1xuICAgICAgICBjcmVkc0J0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHdpbmRvdy5vcGVuU2VydmljZUNyZWRzTW9kYWwocyk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0blJvdy5hcHBlbmRDaGlsZChjcmVkc0J0bik7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBvcHRpb25zIGJ1dHRvbiBmb3IgYWxsIHNlcnZpY2VzIGV4Y2VwdCAnaW50ZXJuZXQnXG4gICAgICBpZiAocy5pZCAhPT0gJ2ludGVybmV0Jykge1xuICAgICAgICBjb25zdCBvcHRCdG4gPSBlbCgnYnV0dG9uJywgJ29wdGlvbnMtYnRuJywgJ1x1MjY5OVx1RkUwRicpO1xuICAgICAgICBvcHRCdG4udGl0bGUgPSAnRWRpdCBzZXJ2aWNlIHNldHRpbmdzJztcbiAgICAgICAgb3B0QnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgd2luZG93Lm9wZW5TZXJ2aWNlRWRpdE1vZGFsKHMpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQob3B0QnRuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHNoYXJlIGJ1dHRvbiBmb3IgYWxsIHNlcnZpY2VzIGV4Y2VwdCAnaW50ZXJuZXQnIChEQy0wNTgpLlxuICAgICAgLy8gQ2FsbHMgaW50byB0aGUgc2hhcmUtbW9kYWwgbW9kdWxlIHJlZ2lzdGVyZWQgb24gd2luZG93LiBXZSBkb24ndFxuICAgICAgLy8gaGFyZC1yZXF1aXJlIHRoZSBtb2R1bGUgXHUyMDE0IGlmIHNoYXJlLW1vZGFsLmpzIHdhcyBleGNsdWRlZCBmcm9tIHRoZVxuICAgICAgLy8gYnVuZGxlLCB0aGUgYnV0dG9uIHN0aWxsIHJlbmRlcnMgYnV0IGNsaWNraW5nIGl0IHN1cmZhY2VzIGEgY2xlYXJcbiAgICAgIC8vIGVycm9yIHRvYXN0IGluc3RlYWQgb2YgYSBzaWxlbnQgbm8tb3AuXG4gICAgICBpZiAocy5pZCAhPT0gJ2ludGVybmV0Jykge1xuICAgICAgICBjb25zdCBzaGFyZUJ0biA9IGVsKCdidXR0b24nLCAnc2hhcmUtYnRuJywgJ1x1RDgzRFx1REQxNycpO1xuICAgICAgICBzaGFyZUJ0bi50aXRsZSA9ICdTaGFyZSB0aGlzIHNlcnZpY2UgKFBybyknO1xuICAgICAgICBzaGFyZUJ0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm9wZW5TaGFyZU1vZGFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB3aW5kb3cub3BlblNoYXJlTW9kYWwocyk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93LnNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHdpbmRvdy5zaG93Tm90aWZpY2F0aW9uKCdTaGFyZSBtb2RhbCBub3QgbG9hZGVkLiBSZWZyZXNoIHRoZSBwYWdlLicsICdlcnJvcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYnRuUm93LmFwcGVuZENoaWxkKHNoYXJlQnRuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGRlbGV0ZSBidXR0b24gZm9yIGFsbCBzZXJ2aWNlcyBleGNlcHQgSW50ZXJuZXRcbiAgICAgIGlmIChzLmlkICE9PSAnaW50ZXJuZXQnKSB7XG4gICAgICAgIGNvbnN0IGRlbEJ0biA9IGVsKCdidXR0b24nLCAnZGVsZXRlLWJ0bicsICdcdUQ4M0RcdURERDFcdUZFMEYnKTtcbiAgICAgICAgZGVsQnRuLnRpdGxlID0gJ0RlbGV0ZSB0aGlzIHNlcnZpY2UnO1xuICAgICAgICBkZWxCdG4ub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB3aW5kb3cuZGVsZXRlU2VydmljZShzLmlkLCBzLm5hbWUpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQoZGVsQnRuKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnRuID0gZWwoJ2J1dHRvbicsIG51bGwsICdPcGVuJyk7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLWkxOG4nLCAnYWN0aW9uLm9wZW4nKTtcbiAgICAgIGJ0bi5vbmNsaWNrID0gKCkgPT4gd2luZG93Lm9wZW4oc2VydmljZVVybChzLmlkKSwgJ19ibGFuaycsICdub29wZW5lcicpO1xuICAgICAgYnRuUm93LmFwcGVuZENoaWxkKGJ0bik7XG4gICAgICBjYXJkLmFwcGVuZENoaWxkKGJ0blJvdyk7XG4gICAgICBjYXJkLnN0eWxlLnRyYW5zaXRpb25EZWxheSA9IGAke01hdGgubWluKGkgKiA0NSwgMjcwKX1tc2A7XG5cbiAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoY2FyZCk7XG4gICAgfVxuXG4gICAgLy8gQ2FyZHMgY2FuIGJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIGluaXRpYWwgbGFuZ3VhZ2UgcGFzcy4gVHJhbnNsYXRlIHRoZWlyXG4gICAgLy8gaW5pdGlhbCBsaXZlIHN0YXRlIGFuZCBjb250cm9scyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHBvbGwuXG4gICAgaWYgKHdpbmRvdy5EQ0kxOG4gJiYgd2luZG93LkRDSTE4bi5pc0xvYWRlZCgpKSB7XG4gICAgICB3aW5kb3cuRENJMThuLmFwcGx5VHJhbnNsYXRpb25zKCk7XG4gICAgfVxuXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLmNhcmQnKS5mb3JFYWNoKGNhcmQgPT4gY2FyZC5jbGFzc0xpc3QuYWRkKCdsb2FkZWQnKSk7XG4gICAgfSk7XG5cbiAgICAvLyBHcm91cCByZWNpcGUgY2FyZHMgdmlzdWFsbHkgYWZ0ZXIgZ3JpZCBpcyBidWlsdFxuICAgIGlmICh3aW5kb3cuZ3JvdXBSZWNpcGVDYXJkcykgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHdpbmRvdy5ncm91cFJlY2lwZUNhcmRzKCkpO1xuXG4gICAgLy8gUmVmcmVzaCB0aGUgc2VydmljZSBmaWx0ZXIgc28gdGhlIGNhdGVnb3J5IGRyb3Bkb3duIHJlZmxlY3RzIG5ldyBzZXJ2aWNlc1xuICAgIGlmICh3aW5kb3cucmVmcmVzaFNlcnZpY2VGaWx0ZXIpIHdpbmRvdy5yZWZyZXNoU2VydmljZUZpbHRlcigpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0QmFkZ2UoaWQsIHVwLCByZXNwb25zZVRpbWUgPSBudWxsKSB7XG4gICAgY29uc3QgZG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvdC0nICsgaWQgKyAnLWdyaWQnKTtcbiAgICBjb25zdCBwaWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhZGdlLScgKyBpZCk7XG4gICAgY29uc3QgdGltZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpbWUtJyArIGlkKTtcbiAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXBwPVwiJHtpZH1cIl1gKTtcblxuICAgIGlmIChkb3QpIHtcbiAgICAgIGRvdC5jbGFzc0xpc3QudG9nZ2xlKCdvaycsIHVwKTtcbiAgICAgIGRvdC5jbGFzc0xpc3QudG9nZ2xlKCdiYWQnLCAhdXApO1xuICAgIH1cblxuICAgIGlmIChwaWxsKSB7XG4gICAgICBwaWxsLnRleHRDb250ZW50ID0gc3RhdHVzTGFiZWwodXApO1xuICAgICAgcGlsbC5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIHVwKTtcbiAgICAgIHBpbGwuY2xhc3NMaXN0LnRvZ2dsZSgnb2ZmJywgIXVwKTtcbiAgICB9XG5cbiAgICBpZiAodGltZUVsICYmIHJlc3BvbnNlVGltZSAhPT0gbnVsbCkge1xuICAgICAgdGltZUVsLnRleHRDb250ZW50ID0gdXAgPyBgJHtyZXNwb25zZVRpbWV9bXNgIDogJ3RpbWVvdXQnO1xuICAgICAgdGltZUVsLmNsYXNzTmFtZSA9IGByZXNwb25zZS10aW1lICR7Z2V0UmVzcG9uc2VUaW1lQ2xhc3MocmVzcG9uc2VUaW1lLCB1cCl9YDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY2FyZCBzdGF0dXMgZm9yIGljb24gY29sb3JpbmdcbiAgICBpZiAoY2FyZCkge1xuICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgdXAgPyAnb24nIDogJ29mZicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hBbGwoKSB7XG4gICAgLy8gU2tpcCBpZiBhdXRoIGhhcyBiZWVuIGxvc3QgKGUuZy4gVE9UUCBnYXRlIGFjdGl2YXRlZCBleHRlcm5hbGx5KS5cbiAgICAvLyBUaGUgcG9sbGluZyBpbnRlcnZhbCBpbiBpbml0LmpzIGFsc28gY2hlY2tzIHRoaXMgZmxhZy5cbiAgICBpZiAod2luZG93Ll9kY0F1dGhMb3N0KSByZXR1cm47XG4gICAgaWYgKHJlZnJlc2hJbkZsaWdodCkge1xuICAgICAgcmVmcmVzaFF1ZXVlZCA9IHRydWU7XG4gICAgICByZXR1cm4gcmVmcmVzaEluRmxpZ2h0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVN0YW1wKGxhYmVsLCBjaGVja2VkQXQgPSBuZXcgRGF0ZSgpKSB7XG4gICAgICBjb25zdCBzdGFtcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGFtcCcpO1xuICAgICAgaWYgKHN0YW1wKSBzdGFtcC50ZXh0Q29udGVudCA9IGAke2xhYmVsfTogJHtuZXcgRGF0ZShjaGVja2VkQXQpLnRvTG9jYWxlVGltZVN0cmluZygpfWA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXBwbHlCYXRjaFJlc3VsdHMoc3RhdHVzZXMpIHtcbiAgICAgIGNvbnN0IGRuc0lkcyA9IE9iamVjdC5rZXlzKFNJVEUuZG5zU2VydmVycyk7XG4gICAgICBkbnNJZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3RhdHVzZXNbaWRdO1xuICAgICAgICBpZiAocmVzdWx0KSBzZXRRdWljayhpZCwgcmVzdWx0LmlzVXAsIHJlc3VsdC5yZXNwb25zZVRpbWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChzdGF0dXNlcy5pbnRlcm5ldCkge1xuICAgICAgICBzZXRRdWljaygnaW50ZXJuZXQnLCBzdGF0dXNlcy5pbnRlcm5ldC5pc1VwLCBzdGF0dXNlcy5pbnRlcm5ldC5yZXNwb25zZVRpbWUpO1xuICAgICAgfVxuXG4gICAgICB3aW5kb3cuQVBQUy5mb3JFYWNoKChzZXJ2aWNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHN0YXR1c2VzW3NlcnZpY2UuaWRdO1xuICAgICAgICBpZiAocmVzdWx0KSBzZXRCYWRnZShzZXJ2aWNlLmlkLCByZXN1bHQuaXNVcCwgcmVzdWx0LnJlc3BvbnNlVGltZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiByZWZyZXNoRmFsbGJhY2soKSB7XG4gICAgICBjb25zdCBkbnNJZHMgPSBPYmplY3Qua2V5cyhTSVRFLmRuc1NlcnZlcnMpO1xuICAgICAgY29uc3QgdG9wQ2hlY2tzID0gZG5zSWRzLm1hcChpZCA9PiBjaGVja1NlcnZpY2VXaXRoVGltaW5nKGlkKSk7XG4gICAgICB0b3BDaGVja3MucHVzaChjaGVja1NlcnZpY2VXaXRoVGltaW5nKCdpbnRlcm5ldCcpKTtcbiAgICAgIGNvbnN0IHRvcFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbCh0b3BDaGVja3MpO1xuXG4gICAgICBkbnNJZHMuZm9yRWFjaCgoaWQsIGkpID0+IHNldFF1aWNrKGlkLCB0b3BSZXN1bHRzW2ldLmlzVXAsIHRvcFJlc3VsdHNbaV0ucmVzcG9uc2VUaW1lKSk7XG4gICAgICBjb25zdCBpbnRlcm5ldFJlc3VsdCA9IHRvcFJlc3VsdHNbdG9wUmVzdWx0cy5sZW5ndGggLSAxXTtcbiAgICAgIHNldFF1aWNrKCdpbnRlcm5ldCcsIGludGVybmV0UmVzdWx0LmlzVXAsIGludGVybmV0UmVzdWx0LnJlc3BvbnNlVGltZSk7XG5cbiAgICAgIGNvbnN0IGFwcFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgd2luZG93LkFQUFMubWFwKGFzeW5jIHMgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrU2VydmljZVdpdGhUaW1pbmcocy5pZCk7XG4gICAgICAgICAgcmV0dXJuIHsgaWQ6IHMuaWQsIC4uLnJlc3VsdCB9O1xuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgYXBwUmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgIHNldEJhZGdlKHJlc3VsdC5pZCwgcmVzdWx0LmlzVXAsIHJlc3VsdC5yZXNwb25zZVRpbWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVmcmVzaEluRmxpZ2h0ID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2VydmljZXMvc3RhdHVzJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgLy8gQXV0aCBsb3N0IFx1MjAxNCBzdG9wIHRoZSBwb2xsaW5nIGxvb3AgYW5kIGNsb3NlIFNTRTsgZG8gTk9UIGZhbGxcbiAgICAgICAgICAvLyB0aHJvdWdoIHRvIGRpcmVjdCBwcm9iZXMgKHRob3NlIHdvdWxkIG1pc2xlYWRpbmdseSBtYXJrXG4gICAgICAgICAgLy8gc2VydmljZXMgYXMgaGVhbHRoeSBzaW5jZSAvcHJvYmUvIHRyZWF0cyA0MDEvNDAzIGFzIFwidXBcIikuXG4gICAgICAgICAgd2luZG93Ll9kY0F1dGhMb3N0ID0gdHJ1ZTtcbiAgICAgICAgICBpZiAod2luZG93Ll9zc2VSZWNvbm5lY3QgJiYgd2luZG93Ll9zc2VDbG9zZSkge1xuICAgICAgICAgICAgd2luZG93Ll9zc2VDbG9zZSgpOyAvLyB0ZWxsIFNTRSB0byBzdG9wIHJlY29ubmVjdGluZ1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVTdGFtcCgnYXV0aCByZXF1aXJlZCcpO1xuICAgICAgICAgIHJldHVybjsgLy8gc2tpcCB0aGUgZmFsbGJhY2sgZW50aXJlbHlcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgcmVmcmVzaCBmYWlsZWQgKCR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB3aW5kb3cuX2RjQXV0aExvc3QgPSBmYWxzZTsgLy8gYXV0aCB3b3JraW5nIGFnYWluXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGFwcGx5QmF0Y2hSZXN1bHRzKGRhdGEuc3RhdHVzZXMgfHwge30pO1xuICAgICAgICB1cGRhdGVTdGFtcCgnbGFzdCBjaGVjaycsIGRhdGEuY2hlY2tlZEF0IHx8IG5ldyBEYXRlKCkpO1xuICAgICAgfSBjYXRjaCAoYmF0Y2hFcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0JhdGNoZWQgc3RhdHVzIHJlZnJlc2ggZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZGlyZWN0IHByb2JlczonLCBiYXRjaEVycm9yKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCByZWZyZXNoRmFsbGJhY2soKTtcbiAgICAgICAgICB1cGRhdGVTdGFtcCgnbGFzdCBjaGVjaycpO1xuICAgICAgICB9IGNhdGNoIChmYWxsYmFja0Vycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRGFzaGJvYXJkIHJlZnJlc2ggZmFpbGVkOicsIGZhbGxiYWNrRXJyb3IpO1xuICAgICAgICAgIHVwZGF0ZVN0YW1wKCdsYXN0IGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWZyZXNoSW5GbGlnaHQgPSBudWxsO1xuICAgICAgICBpZiAocmVmcmVzaFF1ZXVlZCAmJiAhd2luZG93Ll9kY0F1dGhMb3N0KSB7XG4gICAgICAgICAgcmVmcmVzaFF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB3aW5kb3cucmVmcmVzaEFsbCgpOyB9LCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWZyZXNoUXVldWVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgcmV0dXJuIHJlZnJlc2hJbkZsaWdodDtcbiAgfVxuXG4gIC8vIEROUyBvcGVuIGJ1dHRvbnMgXHUyMDE0IHVzZSBldmVudCBkZWxlZ2F0aW9uIG9uIC50b3AgY29udGFpbmVyXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IG9wZW5CdG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbaWQkPVwiLW9wZW5cIl0nKTtcbiAgICBpZiAoIW9wZW5CdG4pIHJldHVybjtcbiAgICBjb25zdCBpZCA9IG9wZW5CdG4uaWQucmVwbGFjZSgnLW9wZW4nLCAnJyk7XG4gICAgaWYgKFNJVEUuZG5zU2VydmVyc1tpZF0pIHdpbmRvdy5vcGVuKHNlcnZpY2VVcmwoaWQpLCAnX2JsYW5rJywgJ25vb3BlbmVyJyk7XG4gIH0pO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2Etb3BlbicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHdpbmRvdy5vcGVuKHNlcnZpY2VVcmwoJ2NhJyksICdfYmxhbmsnLCAnbm9vcGVuZXInKSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjcmVkcy1idG4tY2EnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBlLnN0b3BQcm9wYWdhdGlvbigpOyBjb25zdCBzID0gd2luZG93LkFQUFMuZmluZChhID0+IGEuaWQgPT09ICdjYScpOyBpZiAocyAmJiB3aW5kb3cub3BlblNlcnZpY2VDcmVkc01vZGFsKSB3aW5kb3cub3BlblNlcnZpY2VDcmVkc01vZGFsKHMpOyB9KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wdGlvbnMtYnRuLWNhJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgY29uc3QgcyA9IHdpbmRvdy5BUFBTLmZpbmQoYSA9PiBhLmlkID09PSAnY2EnKTsgaWYgKHMgJiYgd2luZG93Lm9wZW5TZXJ2aWNlRWRpdE1vZGFsKSB3aW5kb3cub3BlblNlcnZpY2VFZGl0TW9kYWwocyk7IH0pO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLWJ0bi1jYScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGlmICh3aW5kb3cuZGVsZXRlU2VydmljZSkgd2luZG93LmRlbGV0ZVNlcnZpY2UoJ2NhJywgJ0Rhc2hDQScpOyB9KTtcblxuICAvLyBXaW5kb3cgZXhwb3J0c1xuICB3aW5kb3cubG9hZFNlcnZpY2VzID0gbG9hZFNlcnZpY2VzO1xuICB3aW5kb3cuYnVpbGRHcmlkID0gYnVpbGRHcmlkO1xuICB3aW5kb3cucmVmcmVzaEFsbCA9IHJlZnJlc2hBbGw7XG4gIHdpbmRvdy5zZXRRdWljayA9IHNldFF1aWNrO1xuICB3aW5kb3cuc2V0QmFkZ2UgPSBzZXRCYWRnZTtcbiAgd2luZG93LmdldFJlc3BvbnNlVGltZUNsYXNzID0gZ2V0UmVzcG9uc2VUaW1lQ2xhc3M7XG4gIHdpbmRvdy5jaGVja1NlcnZpY2VXaXRoVGltaW5nID0gY2hlY2tTZXJ2aWNlV2l0aFRpbWluZztcbiAgd2luZG93LnNlcnZpY2VVcmwgPSBzZXJ2aWNlVXJsO1xuICB3aW5kb3cuZWwgPSBlbDtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gRE5TIE1BTkFHRU1FTlQgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcbiAgLy8gUmVzdGFydCBETlMgc2VydmljZSB2aWEgYmFja2VuZCBwcm94eSAoYmFja2VuZCBoYW5kbGVzIGF1dGggYXV0b21hdGljYWxseSlcbiAgYXN5bmMgZnVuY3Rpb24gcmVzdGFydERuc1NlcnZpY2UoZG5zSWQpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL2Rucy9yZXN0YXJ0LyR7ZG5zSWR9YCwgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvciB8fCAnUmVzdGFydCBmYWlsZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIEV2ZW50IGRlbGVnYXRpb24gZm9yIEROUyByZXN0YXJ0IGJ1dHRvbnMgKGR5bmFtaWMgY2FyZHMpXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoZSkgPT4ge1xuICAgIGNvbnN0IHJlc3RhcnRCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbaWQkPVwiLXJlc3RhcnRcIl0nKTtcbiAgICBpZiAoIXJlc3RhcnRCdG4pIHJldHVybjtcbiAgICBjb25zdCBkbnNJZCA9IHJlc3RhcnRCdG4uaWQucmVwbGFjZSgnLXJlc3RhcnQnLCAnJyk7XG4gICAgaWYgKCFTSVRFLmRuc1NlcnZlcnNbZG5zSWRdKSByZXR1cm47XG4gICAgaWYgKCFjb25maXJtKGBSZXN0YXJ0ICR7ZG5zSWQudG9VcHBlckNhc2UoKX0gc2VydmljZT9gKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3aXRoQnV0dG9uKHJlc3RhcnRCdG4sICcuLi4nLCAoKSA9PiByZXN0YXJ0RG5zU2VydmljZShkbnNJZCkpO1xuICAgICAgc2V0VGltZW91dCh3aW5kb3cucmVmcmVzaEFsbCwgREMuREVMQVlTLlJFTE9BRCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUmVzdGFydCBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gRE5TIFVwZGF0ZSBidXR0b25zXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURuc1NlcnZlcihkbnNJZCwgc2VydmVySXApIHtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdXBkYXRlYCk7XG4gICAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gYnRuPy50ZXh0Q29udGVudCB8fCAnXHUyQjA2XHVGRTBGJztcblxuICAgIHRyeSB7XG4gICAgICAvLyBGaXJzdCBjaGVjayBmb3IgdXBkYXRlc1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REQwRCc7XG4gICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgYnRuLnRpdGxlID0gJ0NoZWNraW5nIGZvciB1cGRhdGVzLi4uJztcblxuICAgICAgY29uc3QgY2hlY2tSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2Rucy9jaGVjay11cGRhdGU/c2VydmVyPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZlcklwKX1gKTtcbiAgICAgIGNvbnN0IGNoZWNrUmVzdWx0ID0gYXdhaXQgY2hlY2tSZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmICghY2hlY2tSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY2hlY2tSZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBjaGVjayBmb3IgdXBkYXRlcycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWNoZWNrUmVzdWx0LnVwZGF0ZUF2YWlsYWJsZSkge1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzA1JztcbiAgICAgICAgYnRuLnRpdGxlID0gYEFscmVhZHkgb24gbGF0ZXN0IHZlcnNpb24gKCR7Y2hlY2tSZXN1bHQuY3VycmVudFZlcnNpb259KWA7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYCR7ZG5zSWQudG9VcHBlckNhc2UoKX0gaXMgYWxyZWFkeSB1cCB0byBkYXRlISBDdXJyZW50IHZlcnNpb246ICR7Y2hlY2tSZXN1bHQuY3VycmVudFZlcnNpb259YCwgJ2luZm8nKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGUgRE5TIHNlcnZlcic7XG4gICAgICAgIH0sIDMwMDApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBhdmFpbGFibGUgLSBjb25maXJtIHdpdGggdXNlclxuICAgICAgY29uc3QgY29uZmlybVVwZGF0ZSA9IGNvbmZpcm0oXG4gICAgICAgIGBVcGRhdGUgYXZhaWxhYmxlIGZvciAke2Ruc0lkLnRvVXBwZXJDYXNlKCl9IVxcblxcbmAgK1xuICAgICAgICBgQ3VycmVudDogJHtjaGVja1Jlc3VsdC5jdXJyZW50VmVyc2lvbn1cXG5gICtcbiAgICAgICAgYE5ldzogJHtjaGVja1Jlc3VsdC51cGRhdGVWZXJzaW9ufVxcblxcbmAgK1xuICAgICAgICAoY2hlY2tSZXN1bHQudXBkYXRlVGl0bGUgPyBgJHtjaGVja1Jlc3VsdC51cGRhdGVUaXRsZX1cXG5cXG5gIDogJycpICtcbiAgICAgICAgYFRoZSBETlMgc2VydmVyIHdpbGwgcmVzdGFydCBkdXJpbmcgdGhlIHVwZGF0ZS5cXG5Qcm9jZWVkP2BcbiAgICAgICk7XG5cbiAgICAgIGlmICghY29uZmlybVVwZGF0ZSkge1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICBidG4udGl0bGUgPSAnVXBkYXRlIEROUyBzZXJ2ZXInO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIHVwZGF0ZVxuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REQwNCc7XG4gICAgICBidG4udGl0bGUgPSAnVXBkYXRpbmcuLi4nO1xuXG4gICAgICBjb25zdCB1cGRhdGVSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL2Rucy91cGRhdGU/c2VydmVyPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZlcklwKX1gLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHVwZGF0ZVJlc3VsdCA9IGF3YWl0IHVwZGF0ZVJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKCF1cGRhdGVSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodXBkYXRlUmVzdWx0LmVycm9yIHx8ICdVcGRhdGUgZmFpbGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh1cGRhdGVSZXN1bHQubWFudWFsVXBkYXRlUmVxdWlyZWQpIHtcbiAgICAgICAgLy8gVGVjaG5pdGl1bSB2MTQrIGRvZXNuJ3Qgc3VwcG9ydCBhdXRvLWluc3RhbGwgdmlhIEFQSVxuICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyQjA2XHVGRTBGJztcbiAgICAgICAgYnRuLnRpdGxlID0gYFVwZGF0ZSBhdmFpbGFibGU6ICR7dXBkYXRlUmVzdWx0Lm5ld1ZlcnNpb259YDtcbiAgICAgICAgY29uc3QgZG93bmxvYWRJbmZvID0gdXBkYXRlUmVzdWx0LmRvd25sb2FkTGlua1xuICAgICAgICAgID8gYFxcbkRvd25sb2FkOiAke3VwZGF0ZVJlc3VsdC5kb3dubG9hZExpbmt9YFxuICAgICAgICAgIDogJyc7XG4gICAgICAgIGNvbnN0IGluc3RydWN0aW9uc0luZm8gPSB1cGRhdGVSZXN1bHQuaW5zdHJ1Y3Rpb25zTGlua1xuICAgICAgICAgID8gYFxcbkluc3RydWN0aW9uczogJHt1cGRhdGVSZXN1bHQuaW5zdHJ1Y3Rpb25zTGlua31gXG4gICAgICAgICAgOiAnJztcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtkbnNJZC50b1VwcGVyQ2FzZSgpfSB1cGRhdGUgcmVxdWlyZXMgbWFudWFsIGluc3RhbGxhdGlvbi4gQ3VycmVudDogJHt1cGRhdGVSZXN1bHQucHJldmlvdXNWZXJzaW9ufSBcdTIxOTIgJHt1cGRhdGVSZXN1bHQubmV3VmVyc2lvbn0uIFBsZWFzZSB1cGRhdGUgbWFudWFsbHkgb24gdGhlIGhvc3QgbWFjaGluZS5gLCAnd2FybmluZycsIDgwMDApO1xuICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzA1JztcbiAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGVkIHN1Y2Nlc3NmdWxseSEnO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtkbnNJZC50b1VwcGVyQ2FzZSgpfSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEgJHt1cGRhdGVSZXN1bHQucHJldmlvdXNWZXJzaW9ufSBcdTIxOTIgJHt1cGRhdGVSZXN1bHQubmV3VmVyc2lvbn0uIFNlcnZlciBpcyByZXN0YXJ0aW5nLi4uYCwgJ3N1Y2Nlc3MnKTtcblxuICAgICAgLy8gUmVmcmVzaCBhZnRlciBkZWxheSBmb3Igc2VydmVyIHJlc3RhcnRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICBidG4udGl0bGUgPSAnVXBkYXRlIEROUyBzZXJ2ZXInO1xuICAgICAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgICAgfSwgMTAwMDApO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ROUyB1cGRhdGUgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1Mjc0Qyc7XG4gICAgICBidG4udGl0bGUgPSAnVXBkYXRlIGZhaWxlZCc7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBGYWlsZWQgdG8gdXBkYXRlICR7ZG5zSWQudG9VcHBlckNhc2UoKX06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICBidG4udGl0bGUgPSAnVXBkYXRlIEROUyBzZXJ2ZXInO1xuICAgICAgfSwgMzAwMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlbnQgZGVsZWdhdGlvbiBmb3IgRE5TIHVwZGF0ZSBidXR0b25zIChkeW5hbWljIGNhcmRzKVxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9wJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBjb25zdCB1cGRhdGVCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbaWQkPVwiLXVwZGF0ZVwiXScpO1xuICAgIGlmICghdXBkYXRlQnRuKSByZXR1cm47XG4gICAgY29uc3QgZG5zSWQgPSB1cGRhdGVCdG4uaWQucmVwbGFjZSgnLXVwZGF0ZScsICcnKTtcbiAgICBpZiAoIVNJVEUuZG5zU2VydmVyc1tkbnNJZF0pIHJldHVybjtcbiAgICB1cGRhdGVEbnNTZXJ2ZXIoZG5zSWQsIFNJVEUuZG5zU2VydmVyc1tkbnNJZF0/LmlwKTtcbiAgfSk7XG5cbiAgLy8gPT09PT0gRE5TIFNFVFRJTkdTIE1PREFMID09PT09XG5cbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2Rucy1zZXR0aW5ncy1tb2RhbCcsIGBcbiAgPGRpdiBpZD1cImRucy1zZXR0aW5ncy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDIwcHg7IG1heC13aWR0aDogNTIwcHg7XCI+XG4gICAgICA8aDMgaWQ9XCJkbnMtc2V0dGluZ3MtdGl0bGVcIj5ETlMgU2V0dGluZ3M8L2gzPlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxNnB4OyBtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJkbnMtZWRpdC1pcFwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5TZXJ2ZXIgSVA8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZG5zLWVkaXQtaXBcIiBjbGFzcz1cImZvcm0taW5wdXQtbWRcIiBwbGFjZWhvbGRlcj1cIjE5Mi4xNjguMS4xXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImRucy1lZGl0LXBvcnRcIiBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+UG9ydDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImRucy1lZGl0LXBvcnRcIiBjbGFzcz1cImZvcm0taW5wdXQtbWRcIiBwbGFjZWhvbGRlcj1cIjUzODBcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZG5zLWVkaXQtbmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5EaXNwbGF5IE5hbWUgKG9wdGlvbmFsKTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkbnMtZWRpdC1uYW1lXCIgY2xhc3M9XCJmb3JtLWlucHV0LW1kXCIgcGxhY2Vob2xkZXI9XCJlLmcuIFByaW1hcnkgRE5TXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWhpbnQtc21cIj5NYW5hZ2UgY3JlZGVudGlhbHMgdmlhIFRva2VucyBpbiB0aGUgdG9vbGJhcjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDI0cHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJkbnMtc2V0dGluZ3MtY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJkbnMtc2V0dGluZ3MtZGVsZXRlXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2U3NGMzYyAyMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWNvbG9yOiAjZTc0YzNjOyBjb2xvcjogI2U3NGMzYztcIj5SZW1vdmU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRucy1zZXR0aW5ncy1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGxldCBjdXJyZW50RG5zSWQgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIG9wZW5EbnNTZXR0aW5ncyhkbnNJZCkge1xuICAgIGN1cnJlbnREbnNJZCA9IGRuc0lkO1xuICAgIGNvbnN0IHNlcnZlciA9IFNJVEUuZG5zU2VydmVyc1tkbnNJZF0gfHwge307XG4gICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXNldHRpbmdzLW1vZGFsJyk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXNldHRpbmdzLXRpdGxlJykudGV4dENvbnRlbnQgPSBgJHsoc2VydmVyLm5hbWUgfHwgZG5zSWQpLnRvVXBwZXJDYXNlKCl9IFNldHRpbmdzYDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLWVkaXQtaXAnKS52YWx1ZSA9IHNlcnZlci5pcCB8fCAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLWVkaXQtcG9ydCcpLnZhbHVlID0gc2VydmVyLnBvcnQgfHwgREMuREVGQVVMVFMuRE5TX1BPUlQ7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1lZGl0LW5hbWUnKS52YWx1ZSA9IHNlcnZlci5uYW1lIHx8ICcnO1xuXG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2F2ZURuc1NldHRpbmdzKCkge1xuICAgIGlmICghY3VycmVudERuc0lkKSByZXR1cm47XG4gICAgY29uc3QgaXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLWVkaXQtaXAnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgcG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1wb3J0JykudmFsdWUudHJpbSgpIHx8IERDLkRFRkFVTFRTLkROU19QT1JUO1xuICAgIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLWVkaXQtbmFtZScpLnZhbHVlLnRyaW0oKTtcblxuICAgIGlmICghaXApIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1NlcnZlciBJUCBpcyByZXF1aXJlZCcsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdXBkYXRlID0geyBkbnNTZXJ2ZXJzOiB7fSB9O1xuICAgIHVwZGF0ZS5kbnNTZXJ2ZXJzW2N1cnJlbnREbnNJZF0gPSB7IGlwLCBwb3J0OiBTdHJpbmcocG9ydCkgfTtcbiAgICBpZiAobmFtZSkgdXBkYXRlLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXS5uYW1lID0gbmFtZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2NvbmZpZycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh1cGRhdGUpXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBTSVRFLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXSA9IHVwZGF0ZS5kbnNTZXJ2ZXJzW2N1cnJlbnREbnNJZF07XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYCR7Y3VycmVudERuc0lkLnRvVXBwZXJDYXNlKCl9IHNldHRpbmdzIHNhdmVkYCwgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgY2xvc2VEbnNTZXR0aW5ncygpO1xuICAgICAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihyZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHNldHRpbmdzJywgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdGYWlsZWQgdG8gc2F2ZTogJyArIGVyci5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZW1vdmVEbnNTZXJ2ZXIoKSB7XG4gICAgaWYgKCFjdXJyZW50RG5zSWQpIHJldHVybjtcbiAgICBpZiAoIWNvbmZpcm0oYFJlbW92ZSAke2N1cnJlbnREbnNJZC50b1VwcGVyQ2FzZSgpfSBmcm9tIGRhc2hib2FyZD8gVGhpcyB3b24ndCBhZmZlY3QgdGhlIGFjdHVhbCBETlMgc2VydmVyLmApKSByZXR1cm47XG5cbiAgICAvLyBSZW1vdmUgYnkgc2V0dGluZyB0byBudWxsIGluIGRuc1NlcnZlcnNcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2NvbmZpZycpO1xuICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBpZiAoY29uZmlnLmRuc1NlcnZlcnMpIHtcbiAgICAgICAgZGVsZXRlIGNvbmZpZy5kbnNTZXJ2ZXJzW2N1cnJlbnREbnNJZF07XG4gICAgICB9XG4gICAgICBjb25zdCBzYXZlUmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2NvbmZpZycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRuc1NlcnZlcnM6IGNvbmZpZy5kbnNTZXJ2ZXJzIHx8IHt9IH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhdmVSZXNwLmpzb24oKTtcbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBkZWxldGUgU0lURS5kbnNTZXJ2ZXJzW2N1cnJlbnREbnNJZF07XG4gICAgICAgIC8vIFJlbW92ZSBjYXJkIGZyb20gRE9NXG4gICAgICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAudG9wIFtkYXRhLWFwcD1cIiR7Y3VycmVudERuc0lkfVwiXWApO1xuICAgICAgICBpZiAoY2FyZCkgY2FyZC5yZW1vdmUoKTtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtjdXJyZW50RG5zSWQudG9VcHBlckNhc2UoKX0gcmVtb3ZlZCBmcm9tIGRhc2hib2FyZGAsICdzdWNjZXNzJyk7XG4gICAgICAgIGNsb3NlRG5zU2V0dGluZ3MoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24ocmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gcmVtb3ZlJywgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdGYWlsZWQgdG8gcmVtb3ZlOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlRG5zU2V0dGluZ3MoKSB7XG4gICAgY2xvc2VNb2RhbCgnZG5zLXNldHRpbmdzLW1vZGFsJyk7XG4gICAgY3VycmVudERuc0lkID0gbnVsbDtcbiAgfVxuXG4gIC8vIEV2ZW50IGxpc3RlbmVycyBmb3IgbW9kYWwgYnV0dG9uc1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXNldHRpbmdzLWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlRG5zU2V0dGluZ3MpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXNldHRpbmdzLXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzYXZlRG5zU2V0dGluZ3MpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXNldHRpbmdzLWRlbGV0ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZURuc1NlcnZlcik7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3MtbW9kYWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldC5pZCA9PT0gJ2Rucy1zZXR0aW5ncy1tb2RhbCcpIGNsb3NlRG5zU2V0dGluZ3MoKTtcbiAgfSk7XG4gIC8vIEV2ZW50IGRlbGVnYXRpb24gZm9yIEROUyBzZXR0aW5ncyBidXR0b25zIChkeW5hbWljIGNhcmRzKVxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9wJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBjb25zdCBzZXR0aW5nc0J0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJ1tpZCQ9XCItc2V0dGluZ3NcIl0nKTtcbiAgICBpZiAoIXNldHRpbmdzQnRuKSByZXR1cm47XG4gICAgY29uc3QgZG5zSWQgPSBzZXR0aW5nc0J0bi5pZC5yZXBsYWNlKCctc2V0dGluZ3MnLCAnJyk7XG4gICAgaWYgKCFTSVRFLmRuc1NlcnZlcnNbZG5zSWRdKSByZXR1cm47XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBvcGVuRG5zU2V0dGluZ3MoZG5zSWQpO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVmcmVzaCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHdpbmRvdy5yZWZyZXNoQWxsKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IExPRyBWSUVXRVJTID09PT09PT09PT1cbihmdW5jdGlvbiAoKSB7XG5cbiAgLy8gSW5qZWN0IGxvZ3MtbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnbG9ncy1tb2RhbCcsIGBcbiAgPGRpdiBpZD1cImxvZ3MtbW9kYWxcIiBjbGFzcz1cImxvZ3MtbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwibG9ncy1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDgwMHB4OyBtYXgtd2lkdGg6IDEwMDBweDtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWhlYWRlclwiPlxuICAgICAgICA8aDMgaWQ9XCJsb2dzLXRpdGxlXCI+RE5TIExvZ3M8L2gzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9ncy1jb250cm9sc1wiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJsb2ctbGluZXNcIj5TaG93OjwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImxvZy1saW5lc1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjI1XCIgc2VsZWN0ZWQ+MjU8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI1MFwiPjUwPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMTAwXCI+MTAwPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMjAwXCI+MjAwPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImxvZ3Mtc3RyZWFtXCIgY2xhc3M9XCJzdHJlYW0tYnRuXCIgdGl0bGU9XCJFbmFibGUgcmVhbC10aW1lIHN0cmVhbWluZ1wiPlx1RDgzRFx1RENFMSBMaXZlPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImxvZ3MtcGF1c2VcIiBjbGFzcz1cInBhdXNlLWJ0blwiPlx1MjNGOFx1RkUwRiBQYXVzZTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJsb2dzLWNsb3NlXCIgY2xhc3M9XCJjbG9zZS1idG5cIj5cdTI3MTU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWNvbnRhaW5lciBzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJsb2dzLWNvbnRlbnRcIiBjbGFzcz1cImxvZ3MtY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIj5Mb2FkaW5nIGxvZ3MuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgLy8gPT09PT0gU3RhdGUgPT09PT1cbiAgbGV0IGN1cnJlbnREbnNTZXJ2aWNlID0gbnVsbDtcbiAgbGV0IGxvZ3NJbnRlcnZhbCA9IG51bGw7XG4gIGxldCBsb2dzUGF1c2VkID0gZmFsc2U7XG5cbiAgbGV0IGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG4gIGxldCBjdXJyZW50Q29udGFpbmVyTmFtZSA9IG51bGw7XG4gIGxldCBjb250YWluZXJMb2dzTW9kZSA9IGZhbHNlO1xuXG4gIGxldCBjdXJyZW50TG9nUGF0aCA9IG51bGw7XG4gIGxldCBjdXJyZW50TG9nU2VydmljZU5hbWUgPSBudWxsO1xuICBsZXQgZmlsZUxvZ3NNb2RlID0gZmFsc2U7XG5cbiAgbGV0IGxvZ0V2ZW50U291cmNlID0gbnVsbDtcbiAgbGV0IGlzU3RyZWFtaW5nID0gZmFsc2U7XG5cbiAgLy8gPT09PT0gRE5TIExPR1MgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaERuc0xvZ3MoZG5zSWQsIGxpbmVzID0gMjUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VydmVySVAgPSBnZXREbnNTZXJ2ZXJBZGRyKGRuc0lkKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvZG5zL2xvZ3M/c2VydmVyPSR7c2VydmVySVB9JmxpbWl0PSR7bGluZXN9YCwge1xuICAgICAgICBjYWNoZTogJ25vLXN0b3JlJyxcbiAgICAgICAgaGVhZGVyczogeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQ2FjaGUtQ29udHJvbCc6ICduby1jYWNoZScgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQubG9ncykge1xuICAgICAgICAgIHJldHVybiB7IGxvZ3M6IHJlc3VsdC5sb2dzLCBjb3VudDogcmVzdWx0LmNvdW50LCBzZXJ2ZXI6IHJlc3VsdC5zZXJ2ZXIgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geyBlcnJvcjogcmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gZmV0Y2ggbG9ncycgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogJ0ROUyBhdXRvLWF1dGggZmFpbGVkIC0gY2hlY2sgY3JlZGVudGlhbHMgaW4gc2V0dGluZ3MnIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9YCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdETlMgbG9ncyBmZXRjaCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGVycm9yLm1lc3NhZ2UgfTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSY29kZUNvbG9yKHJjb2RlKSB7XG4gICAgY29uc3QgY29sb3JzID0ge1xuICAgICAgJ05vRXJyb3InOiAndmFyKC0tb2stZmcpJyxcbiAgICAgICdOT0VSUk9SJzogJ3ZhcigtLW9rLWZnKScsXG4gICAgICAnTnhEb21haW4nOiAndmFyKC0tbXV0ZWQpJyxcbiAgICAgICdOWERPTUFJTic6ICd2YXIoLS1tdXRlZCknLFxuICAgICAgJ1JlZnVzZWQnOiAndmFyKC0tYmFkLWZnKScsXG4gICAgICAnUkVGVVNFRCc6ICd2YXIoLS1iYWQtZmcpJyxcbiAgICAgICdTZXJ2ZXJGYWlsdXJlJzogJyNmMzljMTInLFxuICAgICAgJ1NFUlZGQUlMJzogJyNmMzljMTInXG4gICAgfTtcbiAgICByZXR1cm4gY29sb3JzW3Jjb2RlXSB8fCAndmFyKC0tZmcpJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckRuc0xvZ0VudHJ5KGxvZykge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5jbGFzc05hbWUgPSAnbG9nLWVudHJ5JztcbiAgICBkaXYuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDE0MHB4IDExMHB4IDFmciA3MHB4IDgwcHg7IGdhcDogOHB4OyBwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44cmVtOyBhbGlnbi1pdGVtczogY2VudGVyOyc7XG5cbiAgICAvLyBJZiB1bnBhcnNlZCByYXcgbG9nXG4gICAgaWYgKGxvZy5wYXJzZWQgPT09IGZhbHNlKSB7XG4gICAgICBkaXYuc3R5bGUuZ3JpZFRlbXBsYXRlQ29sdW1ucyA9ICcxZnInO1xuICAgICAgZGl2LmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj4ke2VzY2FwZUh0bWwobG9nLnJhdyl9PC9zcGFuPmA7XG4gICAgICByZXR1cm4gZGl2O1xuICAgIH1cblxuICAgIGNvbnN0IHJjb2RlQ29sb3IgPSBnZXRSY29kZUNvbG9yKGxvZy5yY29kZSk7XG4gICAgY29uc3QgaXNCbG9ja2VkID0gbG9nLnJjb2RlID09PSAnUmVmdXNlZCcgfHwgbG9nLnJjb2RlID09PSAnUkVGVVNFRCc7XG5cbiAgICBkaXYuaW5uZXJIVE1MID0gYFxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKGxvZy50aW1lc3RhbXApfTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtc2l6ZTogMC43NXJlbTtcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChsb2cuY2xpZW50KX1cIj4ke2VzY2FwZUh0bWwobG9nLmNsaWVudCl9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgJHtpc0Jsb2NrZWQgPyAndGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7IG9wYWNpdHk6IDAuNjsnIDogJyd9XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwobG9nLmRvbWFpbil9XCI+JHtlc2NhcGVIdG1sKGxvZy5kb21haW4pfTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjc1cmVtO1wiPiR7ZXNjYXBlSHRtbChsb2cudHlwZSl9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogJHtyY29kZUNvbG9yfTsgZm9udC13ZWlnaHQ6IDUwMDsgZm9udC1zaXplOiAwLjc1cmVtO1wiPiR7ZXNjYXBlSHRtbChsb2cucmNvZGUpfTwvc3Bhbj5cbiAgICBgO1xuXG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxvZ3NEaXNwbGF5KCkge1xuICAgIC8vIEhhbmRsZSBmaWxlIGxvZ3MgbW9kZVxuICAgIGlmIChmaWxlTG9nc01vZGUpIHtcbiAgICAgIGF3YWl0IHVwZGF0ZUZpbGVMb2dzRGlzcGxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBjb250YWluZXIgbG9ncyBtb2RlXG4gICAgaWYgKGNvbnRhaW5lckxvZ3NNb2RlKSB7XG4gICAgICBhd2FpdCB1cGRhdGVDb250YWluZXJMb2dzRGlzcGxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBETlMgbG9ncyBtb2RlXG4gICAgaWYgKGxvZ3NQYXVzZWQgfHwgIWN1cnJlbnREbnNTZXJ2aWNlKSByZXR1cm47XG5cbiAgICBjb25zdCBsaW5lcyA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2ctbGluZXMnKS52YWx1ZSk7XG4gICAgY29uc3QgbG9nc0NvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1jb250ZW50Jyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hEbnNMb2dzKGN1cnJlbnREbnNTZXJ2aWNlLCBsaW5lcyk7XG5cbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMS4ycmVtOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XHUyNkEwXHVGRTBGIEVycm9yPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PiR7ZXNjYXBlSHRtbChyZXN1bHQuZXJyb3IpfTwvZGl2PlxuICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGhlYWRlciByb3dcbiAgICAgIGxvZ3NDb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMTQwcHggMTEwcHggMWZyIDcwcHggODBweDsgZ2FwOiA4cHg7IHBhZGRpbmc6IDhweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjc1cmVtOyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBwb3NpdGlvbjogc3RpY2t5OyB0b3A6IDA7XCI+XG4gICAgICAgICAgPHNwYW4+VGltZTwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj5DbGllbnQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+RG9tYWluPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPlR5cGU8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+U3RhdHVzPC9zcGFuPlxuICAgICAgICA8L2Rpdj5gO1xuXG4gICAgICBpZiAocmVzdWx0LmxvZ3MgJiYgcmVzdWx0LmxvZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQubG9ncy5mb3JFYWNoKGxvZyA9PiB7XG4gICAgICAgICAgY29uc3QgbG9nRWxlbWVudCA9IHJlbmRlckRuc0xvZ0VudHJ5KGxvZyk7XG4gICAgICAgICAgbG9nc0NvbnRlbnQuYXBwZW5kQ2hpbGQobG9nRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MICs9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICAgICAgTm8gRE5TIHF1ZXJpZXMgbG9nZ2VkIHlldFxuICAgICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ3NDb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgRmFpbGVkIHRvIGZldGNoIGxvZ3M6ICR7ZXNjYXBlSHRtbChlcnJvci5tZXNzYWdlKX1cbiAgICAgICAgPC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuTG9nc01vZGFsKGRuc0lkKSB7XG4gICAgY3VycmVudERuc1NlcnZpY2UgPSBkbnNJZDtcbiAgICBsb2dzUGF1c2VkID0gZmFsc2U7XG4gICAgY29udGFpbmVyTG9nc01vZGUgPSBmYWxzZTtcblxuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtbW9kYWwnKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXRpdGxlJyk7XG4gICAgY29uc3QgcGF1c2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1wYXVzZScpO1xuICAgIGNvbnN0IHN0cmVhbUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXN0cmVhbScpO1xuXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBgJHtkbnNJZC50b1VwcGVyQ2FzZSgpfSBETlMgTG9nc2A7XG4gICAgcGF1c2VCdG4udGV4dENvbnRlbnQgPSAnXHUyM0Y4XHVGRTBGIFBhdXNlJztcbiAgICBwYXVzZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdwYXVzZWQnKTtcblxuICAgIC8vIEhpZGUgc3RyZWFtIGJ1dHRvbiBmb3IgRE5TIGxvZ3MgKG9ubHkgYXZhaWxhYmxlIGZvciBjb250YWluZXIgbG9ncylcbiAgICBpZiAoc3RyZWFtQnRuKSB7XG4gICAgICBzdHJlYW1CdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG5cbiAgICAvLyBJbml0aWFsIGxvYWRcbiAgICB1cGRhdGVMb2dzRGlzcGxheSgpO1xuXG4gICAgLy8gU3RhcnQgYXV0by1yZWZyZXNoIGV2ZXJ5IDMgc2Vjb25kc1xuICAgIGxvZ3NJbnRlcnZhbCA9IHNldEludGVydmFsKHVwZGF0ZUxvZ3NEaXNwbGF5LCBEQy5QT0xMLkxPR1MpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VMb2dzTW9kYWwoKSB7XG4gICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1tb2RhbCcpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcblxuICAgIGlmIChsb2dzSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwobG9nc0ludGVydmFsKTtcbiAgICAgIGxvZ3NJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBTU0Ugc3RyZWFtaW5nIGlmIGFjdGl2ZVxuICAgIHN0b3BMb2dTdHJlYW1pbmcoKTtcblxuICAgIC8vIFJlc2V0IGFsbCBsb2cgbW9kZXNcbiAgICBjdXJyZW50RG5zU2VydmljZSA9IG51bGw7XG4gICAgY29udGFpbmVyTG9nc01vZGUgPSBmYWxzZTtcbiAgICBjdXJyZW50Q29udGFpbmVySWQgPSBudWxsO1xuICAgIGN1cnJlbnRDb250YWluZXJOYW1lID0gbnVsbDtcbiAgICBmaWxlTG9nc01vZGUgPSBmYWxzZTtcbiAgICBjdXJyZW50TG9nUGF0aCA9IG51bGw7XG4gICAgY3VycmVudExvZ1NlcnZpY2VOYW1lID0gbnVsbDtcbiAgICBsb2dzUGF1c2VkID0gZmFsc2U7XG4gIH1cblxuICAvLyA9PT09PSBTU0UgTE9HIFNUUkVBTUlORyA9PT09PVxuXG4gIGZ1bmN0aW9uIHN0YXJ0TG9nU3RyZWFtaW5nKGNvbnRhaW5lcklkKSB7XG4gICAgaWYgKGxvZ0V2ZW50U291cmNlKSB7XG4gICAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyZWFtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3Mtc3RyZWFtJyk7XG4gICAgY29uc3QgcGF1c2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1wYXVzZScpO1xuICAgIGNvbnN0IGxvZ3NDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtY29udGVudCcpO1xuXG4gICAgLy8gU3RvcCBpbnRlcnZhbC1iYXNlZCByZWZyZXNoXG4gICAgaWYgKGxvZ3NJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChsb2dzSW50ZXJ2YWwpO1xuICAgICAgbG9nc0ludGVydmFsID0gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbG9nRXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoYC9hcGkvdjEvbG9ncy9zdHJlYW0vJHtjb250YWluZXJJZH1gKTtcbiAgICAgIGlzU3RyZWFtaW5nID0gdHJ1ZTtcblxuICAgICAgc3RyZWFtQnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REQzNCBMaXZlJztcbiAgICAgIHN0cmVhbUJ0bi50aXRsZSA9ICdTdHJlYW1pbmcgLSBjbGljayB0byBzdG9wJztcbiAgICAgIHBhdXNlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgIC8vIEFkZCBzdHJlYW1pbmcgaW5kaWNhdG9yIHRvIGhlYWRlclxuICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy10aXRsZScpO1xuICAgICAgaWYgKCF0aXRsZS50ZXh0Q29udGVudC5pbmNsdWRlcygnXHVEODNEXHVERDM0JykpIHtcbiAgICAgICAgdGl0bGUuaW5uZXJIVE1MID0gdGl0bGUudGV4dENvbnRlbnQucmVwbGFjZSgnXHVEODNEXHVEQ0NCJywgJ1x1RDgzRFx1RENDQiBcdUQ4M0RcdUREMzQnKTtcbiAgICAgIH1cblxuICAgICAgbG9nRXZlbnRTb3VyY2Uub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XG5cbiAgICAgICAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU3RyZWFtIGVycm9yOicsIGRhdGEuZXJyb3IpO1xuICAgICAgICAgICAgc3RvcExvZ1N0cmVhbWluZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFwcGVuZCBuZXcgbG9nIGVudHJ5XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBlbnRyeS5jbGFzc05hbWUgPSAnbG9nLWVudHJ5JztcbiAgICAgICAgICBlbnRyeS5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGZsZXg7IGdhcDogMTJweDsgcGFkZGluZzogNnB4IDEwcHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuOHJlbTsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7JztcblxuICAgICAgICAgIGNvbnN0IHN0cmVhbVR5cGUgPSBkYXRhLnN0cmVhbSB8fCAnc3Rkb3V0JztcbiAgICAgICAgICBjb25zdCBpc0Vycm9yID0gc3RyZWFtVHlwZSA9PT0gJ3N0ZGVycic7XG4gICAgICAgICAgY29uc3QgbGV2ZWxDb2xvciA9IGlzRXJyb3IgPyAndmFyKC0tYmFkLWZnKScgOiAndmFyKC0tZmcpJztcbiAgICAgICAgICBjb25zdCBiZ0NvbG9yID0gaXNFcnJvciA/ICd2YXIoLS1iYWQtYmcpJyA6ICd2YXIoLS1vay1iZyknO1xuICAgICAgICAgIGNvbnN0IGxldmVsQmFkZ2UgPSBgPHNwYW4gc3R5bGU9XCJiYWNrZ3JvdW5kOiAke2JnQ29sb3J9OyBjb2xvcjogJHtsZXZlbENvbG9yfTsgcGFkZGluZzogMnB4IDZweDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuN3JlbTsgZm9udC13ZWlnaHQ6IDYwMDsgbWluLXdpZHRoOiA1MHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+JHtpc0Vycm9yID8gJ1NUREVSUicgOiAnU1RET1VUJ308L3NwYW4+YDtcblxuICAgICAgICAgIGVudHJ5LmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj4ke2xldmVsQmFkZ2V9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgY29sb3I6ICR7bGV2ZWxDb2xvcn07IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgd2hpdGUtc3BhY2U6IHByZS13cmFwO1wiPiR7ZXNjYXBlSHRtbChkYXRhLnRleHQpfTwvZGl2PlxuICAgICAgICAgIGA7XG5cbiAgICAgICAgICBsb2dzQ29udGVudC5hcHBlbmRDaGlsZChlbnRyeSk7XG5cbiAgICAgICAgICAvLyBBdXRvLXNjcm9sbCB0byBib3R0b21cbiAgICAgICAgICBsb2dzQ29udGVudC5zY3JvbGxUb3AgPSBsb2dzQ29udGVudC5zY3JvbGxIZWlnaHQ7XG5cbiAgICAgICAgICAvLyBMaW1pdCBlbnRyaWVzIHRvIHByZXZlbnQgbWVtb3J5IGlzc3VlcyAoa2VlcCBsYXN0IDUwMClcbiAgICAgICAgICB3aGlsZSAobG9nc0NvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoID4gNTAwKSB7XG4gICAgICAgICAgICBsb2dzQ29udGVudC5yZW1vdmVDaGlsZChsb2dzQ29udGVudC5maXJzdENoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgc3RyZWFtIGRhdGE6JywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgbG9nRXZlbnRTb3VyY2Uub25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyKTtcbiAgICAgICAgc3RvcExvZ1N0cmVhbWluZygpO1xuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IHN0cmVhbWluZzonLCBlcnIpO1xuICAgICAgc3RvcExvZ1N0cmVhbWluZygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3BMb2dTdHJlYW1pbmcoKSB7XG4gICAgaWYgKGxvZ0V2ZW50U291cmNlKSB7XG4gICAgICBsb2dFdmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgbG9nRXZlbnRTb3VyY2UgPSBudWxsO1xuICAgIH1cbiAgICBpc1N0cmVhbWluZyA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3RyZWFtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3Mtc3RyZWFtJyk7XG4gICAgY29uc3QgcGF1c2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1wYXVzZScpO1xuICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtdGl0bGUnKTtcblxuICAgIGlmIChzdHJlYW1CdG4pIHtcbiAgICAgIHN0cmVhbUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIHN0cmVhbUJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDRTEgTGl2ZSc7XG4gICAgICBzdHJlYW1CdG4udGl0bGUgPSAnRW5hYmxlIHJlYWwtdGltZSBzdHJlYW1pbmcnO1xuICAgIH1cblxuICAgIGlmIChwYXVzZUJ0bikge1xuICAgICAgcGF1c2VCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0aXRsZSkge1xuICAgICAgdGl0bGUudGV4dENvbnRlbnQgPSB0aXRsZS50ZXh0Q29udGVudC5yZXBsYWNlKCcgXHVEODNEXHVERDM0JywgJycpO1xuICAgIH1cblxuICAgIC8vIFJlc3RhcnQgaW50ZXJ2YWwtYmFzZWQgcmVmcmVzaCBpZiBjb250YWluZXIgbG9ncyBtb2RhbCBpcyBvcGVuXG4gICAgaWYgKGNvbnRhaW5lckxvZ3NNb2RlICYmIGN1cnJlbnRDb250YWluZXJJZCAmJiAhbG9nc0ludGVydmFsKSB7XG4gICAgICBsb2dzSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh1cGRhdGVDb250YWluZXJMb2dzRGlzcGxheSwgREMuUE9MTC5MT0dTKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBDT05UQUlORVIgTE9HUyA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoQ29udGFpbmVyTG9ncyhjb250YWluZXJJZCwgbGluZXMgPSAxMDApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSBgL2FwaS92MS9sb2dzL2NvbnRhaW5lci8ke2NvbnRhaW5lcklkfT90YWlsPSR7bGluZXN9JnRpbWVzdGFtcHM9dHJ1ZWA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZW5kcG9pbnQsIHtcbiAgICAgICAgY2FjaGU6ICduby1zdG9yZScsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0NhY2hlLUNvbnRyb2wnOiAnbm8tY2FjaGUnIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmxvZ3MpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9nczogcmVzdWx0LmxvZ3MsXG4gICAgICAgICAgICBjb3VudDogcmVzdWx0LmNvdW50LFxuICAgICAgICAgICAgY29udGFpbmVyTmFtZTogcmVzdWx0LmNvbnRhaW5lck5hbWUsXG4gICAgICAgICAgICBjb250YWluZXJJZDogcmVzdWx0LmNvbnRhaW5lcklkXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geyBlcnJvcjogcmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gZmV0Y2ggY29udGFpbmVyIGxvZ3MnIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvbnRhaW5lciBsb2dzIGZldGNoIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4geyBlcnJvcjogZXJyb3IubWVzc2FnZSB9O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckNvbnRhaW5lckxvZ0VudHJ5KGxvZykge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5jbGFzc05hbWUgPSAnbG9nLWVudHJ5JztcbiAgICBkaXYuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBmbGV4OyBnYXA6IDEycHg7IHBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjhyZW07IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyc7XG5cbiAgICBjb25zdCBzdHJlYW1Db2xvciA9IGxvZy5zdHJlYW0gPT09ICdzdGRlcnInID8gJ3ZhcigtLWJhZC1mZyknIDogJ3ZhcigtLWZnKSc7XG4gICAgY29uc3Qgc3RyZWFtQmFkZ2UgPSBsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/XG4gICAgICAnPHNwYW4gc3R5bGU9XCJiYWNrZ3JvdW5kOiB2YXIoLS1iYWQtYmcpOyBjb2xvcjogdmFyKC0tYmFkLWZnKTsgcGFkZGluZzogMnB4IDZweDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuN3JlbTsgZm9udC13ZWlnaHQ6IDYwMDtcIj5TVERFUlI8L3NwYW4+JyA6XG4gICAgICAnPHNwYW4gc3R5bGU9XCJiYWNrZ3JvdW5kOiB2YXIoLS1vay1iZyk7IGNvbG9yOiB2YXIoLS1vay1mZyk7IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjdyZW07IGZvbnQtd2VpZ2h0OiA2MDA7XCI+U1RET1VUPC9zcGFuPic7XG5cbiAgICBkaXYuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPiR7c3RyZWFtQmFkZ2V9PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgY29sb3I6ICR7c3RyZWFtQ29sb3J9OyB3b3JkLWJyZWFrOiBicmVhay1hbGw7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcIj4ke2VzY2FwZUh0bWwobG9nLnRleHQpfTwvZGl2PlxuICAgIGA7XG5cbiAgICByZXR1cm4gZGl2O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ29udGFpbmVyTG9nc0Rpc3BsYXkoKSB7XG4gICAgaWYgKGxvZ3NQYXVzZWQgfHwgIWN1cnJlbnRDb250YWluZXJJZCB8fCAhY29udGFpbmVyTG9nc01vZGUpIHJldHVybjtcblxuICAgIGNvbnN0IGxpbmVzID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZy1saW5lcycpLnZhbHVlKTtcbiAgICBjb25zdCBsb2dzQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLWNvbnRlbnQnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaENvbnRhaW5lckxvZ3MoY3VycmVudENvbnRhaW5lcklkLCBsaW5lcyk7XG5cbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMS4ycmVtOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XHUyNkEwXHVGRTBGIEVycm9yPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PiR7ZXNjYXBlSHRtbChyZXN1bHQuZXJyb3IpfTwvZGl2PlxuICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGhlYWRlciByb3dcbiAgICAgIGxvZ3NDb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMTJweDsgcGFkZGluZzogOHB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuNzVyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBvc2l0aW9uOiBzdGlja3k7IHRvcDogMDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwOyB3aWR0aDogODBweDtcIj5TdHJlYW08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OiAxO1wiPkxvZyBPdXRwdXQ8L3NwYW4+XG4gICAgICAgIDwvZGl2PmA7XG5cbiAgICAgIGlmIChyZXN1bHQubG9ncyAmJiByZXN1bHQubG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5sb2dzLmZvckVhY2gobG9nID0+IHtcbiAgICAgICAgICBjb25zdCBsb2dFbGVtZW50ID0gcmVuZGVyQ29udGFpbmVyTG9nRW50cnkobG9nKTtcbiAgICAgICAgICBsb2dzQ29udGVudC5hcHBlbmRDaGlsZChsb2dFbGVtZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQXV0by1zY3JvbGwgdG8gYm90dG9tXG4gICAgICAgIGxvZ3NDb250ZW50LnNjcm9sbFRvcCA9IGxvZ3NDb250ZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ3NDb250ZW50LmlubmVySFRNTCArPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICAgIE5vIGxvZ3MgYXZhaWxhYmxlIGZvciB0aGlzIGNvbnRhaW5lclxuICAgICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ3NDb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgRmFpbGVkIHRvIGZldGNoIGxvZ3M6ICR7ZXNjYXBlSHRtbChlcnJvci5tZXNzYWdlKX1cbiAgICAgICAgPC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuQ29udGFpbmVyTG9nc01vZGFsKGNvbnRhaW5lcklkLCBjb250YWluZXJOYW1lKSB7XG4gICAgY3VycmVudENvbnRhaW5lcklkID0gY29udGFpbmVySWQ7XG4gICAgY3VycmVudENvbnRhaW5lck5hbWUgPSBjb250YWluZXJOYW1lO1xuICAgIGNvbnRhaW5lckxvZ3NNb2RlID0gdHJ1ZTtcbiAgICBmaWxlTG9nc01vZGUgPSBmYWxzZTtcbiAgICBsb2dzUGF1c2VkID0gZmFsc2U7XG5cbiAgICAvLyBTdG9wIGFueSBleGlzdGluZyBzdHJlYW1pbmdcbiAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG5cbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLW1vZGFsJyk7XG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy10aXRsZScpO1xuICAgIGNvbnN0IHBhdXNlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtcGF1c2UnKTtcbiAgICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1zdHJlYW0nKTtcblxuICAgIHRpdGxlLnRleHRDb250ZW50ID0gYFx1RDgzRFx1RENDQiAke2NvbnRhaW5lck5hbWV9IC0gQ29udGFpbmVyIExvZ3NgO1xuICAgIHBhdXNlQnRuLnRleHRDb250ZW50ID0gJ1x1MjNGOFx1RkUwRiBQYXVzZSc7XG4gICAgcGF1c2VCdG4uY2xhc3NMaXN0LnJlbW92ZSgncGF1c2VkJyk7XG5cbiAgICAvLyBTaG93IHN0cmVhbSBidXR0b24gZm9yIGNvbnRhaW5lciBsb2dzXG4gICAgaWYgKHN0cmVhbUJ0bikge1xuICAgICAgc3RyZWFtQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICB9XG5cbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG5cbiAgICAvLyBJbml0aWFsIGxvYWRcbiAgICB1cGRhdGVDb250YWluZXJMb2dzRGlzcGxheSgpO1xuXG4gICAgLy8gU3RhcnQgYXV0by1yZWZyZXNoIGV2ZXJ5IDMgc2Vjb25kc1xuICAgIGxvZ3NJbnRlcnZhbCA9IHNldEludGVydmFsKHVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5LCBEQy5QT0xMLkxPR1MpO1xuICB9XG5cbiAgLy8gPT09PT0gRklMRS1CQVNFRCBMT0dTIChmb3IgbmF0aXZlIGFwcHMpID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hGaWxlTG9ncyhsb2dQYXRoLCBsaW5lcyA9IDEwMCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IGAvYXBpL3YxL2xvZ3MvZmlsZT9wYXRoPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxvZ1BhdGgpfSZ0YWlsPSR7bGluZXN9YDtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChlbmRwb2ludCwge1xuICAgICAgICBjYWNoZTogJ25vLXN0b3JlJyxcbiAgICAgICAgaGVhZGVyczogeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQ2FjaGUtQ29udHJvbCc6ICduby1jYWNoZScgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQubG9ncykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2dzOiByZXN1bHQubG9ncyxcbiAgICAgICAgICAgIGNvdW50OiByZXN1bHQuY291bnQsXG4gICAgICAgICAgICBsb2dQYXRoOiByZXN1bHQubG9nUGF0aCxcbiAgICAgICAgICAgIHRvdGFsTGluZXM6IHJlc3VsdC50b3RhbExpbmVzXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geyBlcnJvcjogcmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gZmV0Y2ggZmlsZSBsb2dzJyB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiByZXN1bHQuZXJyb3IgfHwgYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9YCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGaWxlIGxvZ3MgZmV0Y2ggZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiB7IGVycm9yOiBlcnJvci5tZXNzYWdlIH07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyRmlsZUxvZ0VudHJ5KGxvZykge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5jbGFzc05hbWUgPSAnbG9nLWVudHJ5JztcbiAgICBkaXYuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBmbGV4OyBnYXA6IDEycHg7IHBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjhyZW07IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyc7XG5cbiAgICBjb25zdCB0ZXh0ID0gbG9nLnRleHQ7XG4gICAgbGV0IGxvZ0xldmVsID0gJ0lORk8nO1xuICAgIGxldCBsZXZlbENvbG9yID0gJ3ZhcigtLWZnKSc7XG5cbiAgICBpZiAodGV4dC5tYXRjaCgvRVJST1J8RkFUQUx8Q1JJVElDQUwvaSkpIHtcbiAgICAgIGxvZ0xldmVsID0gJ0VSUk9SJztcbiAgICAgIGxldmVsQ29sb3IgPSAndmFyKC0tYmFkLWZnKSc7XG4gICAgfSBlbHNlIGlmICh0ZXh0Lm1hdGNoKC9XQVJOfFdBUk5JTkcvaSkpIHtcbiAgICAgIGxvZ0xldmVsID0gJ1dBUk4nO1xuICAgICAgbGV2ZWxDb2xvciA9ICcjZjM5YzEyJztcbiAgICB9IGVsc2UgaWYgKHRleHQubWF0Y2goL0RFQlVHL2kpKSB7XG4gICAgICBsb2dMZXZlbCA9ICdERUJVRyc7XG4gICAgICBsZXZlbENvbG9yID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgfVxuXG4gICAgY29uc3QgYmdDb2xvciA9IGxldmVsQ29sb3IgPT09ICd2YXIoLS1iYWQtZmcpJyA/ICd2YXIoLS1iYWQtYmcpJyA6ICd2YXIoLS1vay1iZyknO1xuICAgIGNvbnN0IGxldmVsQmFkZ2UgPSBgPHNwYW4gc3R5bGU9XCJiYWNrZ3JvdW5kOiAke2JnQ29sb3J9OyBjb2xvcjogJHtsZXZlbENvbG9yfTsgcGFkZGluZzogMnB4IDZweDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuN3JlbTsgZm9udC13ZWlnaHQ6IDYwMDsgbWluLXdpZHRoOiA1MHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+JHtsb2dMZXZlbH08L3NwYW4+YDtcblxuICAgIGRpdi5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiZmxleC1zaHJpbms6IDA7XCI+JHtsZXZlbEJhZGdlfTwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7IGNvbG9yOiAke2xldmVsQ29sb3J9OyB3b3JkLWJyZWFrOiBicmVhay1hbGw7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcIj4ke2VzY2FwZUh0bWwodGV4dCl9PC9kaXY+XG4gICAgYDtcblxuICAgIHJldHVybiBkaXY7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVGaWxlTG9nc0Rpc3BsYXkoKSB7XG4gICAgaWYgKGxvZ3NQYXVzZWQgfHwgIWN1cnJlbnRMb2dQYXRoIHx8ICFmaWxlTG9nc01vZGUpIHJldHVybjtcblxuICAgIGNvbnN0IGxpbmVzID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZy1saW5lcycpLnZhbHVlKTtcbiAgICBjb25zdCBsb2dzQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLWNvbnRlbnQnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaEZpbGVMb2dzKGN1cnJlbnRMb2dQYXRoLCBsaW5lcyk7XG5cbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMS4ycmVtOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XHUyNkEwXHVGRTBGIEVycm9yPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PiR7ZXNjYXBlSHRtbChyZXN1bHQuZXJyb3IpfTwvZGl2PlxuICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC43NXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLW11dGVkKTsgcG9zaXRpb246IHN0aWNreTsgdG9wOiAwO1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj5Mb2cgT3V0cHV0ICgke3Jlc3VsdC5jb3VudH0gb2YgJHtyZXN1bHQudG90YWxMaW5lc30gbGluZXMpPC9zcGFuPlxuICAgICAgICA8L2Rpdj5gO1xuXG4gICAgICBpZiAocmVzdWx0LmxvZ3MgJiYgcmVzdWx0LmxvZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQubG9ncy5mb3JFYWNoKGxvZyA9PiB7XG4gICAgICAgICAgY29uc3QgbG9nRWxlbWVudCA9IHJlbmRlckZpbGVMb2dFbnRyeShsb2cpO1xuICAgICAgICAgIGxvZ3NDb250ZW50LmFwcGVuZENoaWxkKGxvZ0VsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgbG9nc0NvbnRlbnQuc2Nyb2xsVG9wID0gbG9nc0NvbnRlbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MICs9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICAgICAgTm8gbG9ncyBhdmFpbGFibGUgaW4gdGhpcyBmaWxlXG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cbiAgICAgICAgICBGYWlsZWQgdG8gZmV0Y2ggbG9nczogJHtlc2NhcGVIdG1sKGVycm9yLm1lc3NhZ2UpfVxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5GaWxlTG9nc01vZGFsKGxvZ1BhdGgsIHNlcnZpY2VOYW1lKSB7XG4gICAgY3VycmVudExvZ1BhdGggPSBsb2dQYXRoO1xuICAgIGN1cnJlbnRMb2dTZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lO1xuICAgIGZpbGVMb2dzTW9kZSA9IHRydWU7XG4gICAgY29udGFpbmVyTG9nc01vZGUgPSBmYWxzZTtcbiAgICBsb2dzUGF1c2VkID0gZmFsc2U7XG5cbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLW1vZGFsJyk7XG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy10aXRsZScpO1xuICAgIGNvbnN0IHBhdXNlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtcGF1c2UnKTtcbiAgICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1zdHJlYW0nKTtcblxuICAgIHRpdGxlLnRleHRDb250ZW50ID0gYFx1RDgzRFx1RENDQiAke3NlcnZpY2VOYW1lfSAtIEFwcGxpY2F0aW9uIExvZ3NgO1xuICAgIHBhdXNlQnRuLnRleHRDb250ZW50ID0gJ1x1MjNGOFx1RkUwRiBQYXVzZSc7XG4gICAgcGF1c2VCdG4uY2xhc3NMaXN0LnJlbW92ZSgncGF1c2VkJyk7XG5cbiAgICAvLyBIaWRlIHN0cmVhbSBidXR0b24gZm9yIGZpbGUgbG9ncyAob25seSBhdmFpbGFibGUgZm9yIGNvbnRhaW5lciBsb2dzKVxuICAgIGlmIChzdHJlYW1CdG4pIHtcbiAgICAgIHN0cmVhbUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIHVwZGF0ZUZpbGVMb2dzRGlzcGxheSgpO1xuICAgIGxvZ3NJbnRlcnZhbCA9IHNldEludGVydmFsKHVwZGF0ZUZpbGVMb2dzRGlzcGxheSwgREMuUE9MTC5MT0dTKTtcbiAgfVxuXG4gIC8vID09PT09IEVWRU5UIExJU1RFTkVSUyA9PT09PVxuXG4gIC8vIEROUyBsb2cgYnV0dG9ucyBcdTIwMTQgZXZlbnQgZGVsZWdhdGlvbiBmb3IgZHluYW1pYyBjYXJkc1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9wJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBjb25zdCBsb2dzQnRuID0gZS50YXJnZXQuY2xvc2VzdCgnW2lkJD1cIi1sb2dzXCJdJyk7XG4gICAgaWYgKCFsb2dzQnRuKSByZXR1cm47XG4gICAgY29uc3QgZG5zSWQgPSBsb2dzQnRuLmlkLnJlcGxhY2UoJy1sb2dzJywgJycpO1xuICAgIGlmICghU0lURS5kbnNTZXJ2ZXJzW2Ruc0lkXSkgcmV0dXJuO1xuICAgIG9wZW5Mb2dzTW9kYWwoZG5zSWQpO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1jbG9zZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTG9nc01vZGFsKTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1wYXVzZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBsb2dzUGF1c2VkID0gIWxvZ3NQYXVzZWQ7XG4gICAgY29uc3QgcGF1c2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1wYXVzZScpO1xuXG4gICAgaWYgKGxvZ3NQYXVzZWQpIHtcbiAgICAgIHBhdXNlQnRuLnRleHRDb250ZW50ID0gJ1x1MjVCNlx1RkUwRiBSZXN1bWUnO1xuICAgICAgcGF1c2VCdG4uY2xhc3NMaXN0LmFkZCgncGF1c2VkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdXNlQnRuLnRleHRDb250ZW50ID0gJ1x1MjNGOFx1RkUwRiBQYXVzZSc7XG4gICAgICBwYXVzZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdwYXVzZWQnKTtcbiAgICAgIHVwZGF0ZUxvZ3NEaXNwbGF5KCk7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nLWxpbmVzJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBpZiAoIWxvZ3NQYXVzZWQpIHtcbiAgICAgIHVwZGF0ZUxvZ3NEaXNwbGF5KCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBTdHJlYW0gYnV0dG9uIGZvciByZWFsLXRpbWUgU1NFIGxvZ3MgKG9ubHkgd29ya3Mgd2l0aCBjb250YWluZXIgbG9ncylcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3Mtc3RyZWFtJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGlmICghY29udGFpbmVyTG9nc01vZGUgfHwgIWN1cnJlbnRDb250YWluZXJJZCkge1xuICAgICAgLy8gU3RyZWFtaW5nIG9ubHkgYXZhaWxhYmxlIGZvciBjb250YWluZXIgbG9nc1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc1N0cmVhbWluZykge1xuICAgICAgc3RvcExvZ1N0cmVhbWluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGFydExvZ1N0cmVhbWluZyhjdXJyZW50Q29udGFpbmVySWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ2xvc2UgbW9kYWwgb24gb3V0c2lkZSBjbGlja1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1tb2RhbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0LmlkID09PSAnbG9ncy1tb2RhbCcpIHtcbiAgICAgIGNsb3NlTG9nc01vZGFsKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBDbG9zZSBsb2dzLW1vZGFsIG9uIEVzY2FwZSBrZXlcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLW1vZGFsJyk/LmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSB7XG4gICAgICAgIGNsb3NlTG9nc01vZGFsKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyA9PT09PSBFWFBPUlRTID09PT09XG4gIHdpbmRvdy5vcGVuQ29udGFpbmVyTG9nc01vZGFsID0gb3BlbkNvbnRhaW5lckxvZ3NNb2RhbDtcbiAgd2luZG93Lm9wZW5GaWxlTG9nc01vZGFsID0gb3BlbkZpbGVMb2dzTW9kYWw7XG4gIHdpbmRvdy5vcGVuTG9nc01vZGFsID0gb3BlbkxvZ3NNb2RhbDtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gU0VSVklDRSBNT0RBTCBURU1QTEFURVMgPT09PT09PT09PVxuLy8gSW5qZWN0cyB0aGUgSFRNTCBmb3Igc2VydmljZSBlZGl0LCBkZWxldGUsIGFuZCBhZGQgbW9kYWxzIGludG8gdGhlIERPTS5cbi8vIE11c3QgbG9hZCBiZWZvcmUgc2VydmljZS1jcnVkLmpzIGFuZCBzZXJ2aWNlLWNyZWF0ZS5qcy5cbihmdW5jdGlvbiAoKSB7XG5cbiAgaW5qZWN0TW9kYWwoJ3NlcnZpY2UtZWRpdC1tb2RhbCcsIGBcbiAgPGRpdiBpZD1cInNlcnZpY2UtZWRpdC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNTAwcHg7IG1heC13aWR0aDogNjAwcHg7XCI+XG4gICAgICA8aDMgaWQ9XCJzZXJ2aWNlLWVkaXQtdGl0bGVcIj5FZGl0IFNlcnZpY2U8L2gzPlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxNnB4OyBtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICA8IS0tIFNlcnZpY2UgSW5mbyAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTJweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlci1yYWRpdXM6IDhweDtcIj5cbiAgICAgICAgICA8aW1nIGlkPVwiZWRpdC1zZXJ2aWNlLWxvZ28tcHJldmlld1wiIHNyYz1cIlwiIGFsdD1cIlwiIHN0eWxlPVwid2lkdGg6IDQ4cHg7IGhlaWdodDogNDhweDsgYm9yZGVyLXJhZGl1czogOHB4OyBvYmplY3QtZml0OiBjb250YWluOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7XCIgLz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJlZGl0LXNlcnZpY2UtdXJsLWRpc3BsYXlcIiBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBEaXNwbGF5IE5hbWUgLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImVkaXQtc2VydmljZS1uYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlxuICAgICAgICAgICAgRGlzcGxheSBOYW1lXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkaXQtc2VydmljZS1uYW1lXCIgY2xhc3M9XCJmb3JtLWlucHV0LW1kXCIgcGxhY2Vob2xkZXI9XCJTZXJ2aWNlIG5hbWUgc2hvd24gb24gZGFzaGJvYXJkXCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBTdWJkb21haW4gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImVkaXQtc3ViZG9tYWluXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlxuICAgICAgICAgICAgU3ViZG9tYWluXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3ctZ2FwLWNlbnRlclwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZGl0LXN1YmRvbWFpblwiIGNsYXNzPVwiaW5wdXQtZmxleFwiIC8+XG4gICAgICAgICAgICA8c3BhbiBpZD1cImVkaXQtdGxkLXN1ZmZpeFwiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4uaG9tZTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBQb3J0IC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZGl0LXBvcnRcIiBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XG4gICAgICAgICAgICBQb3J0XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZWRpdC1wb3J0XCIgY2xhc3M9XCJmb3JtLWlucHV0LW1kXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+XG4gICAgICAgICAgICBUaGUgcG9ydCBDYWRkeSB3aWxsIHByb3h5IHRvIChjb250YWluZXIncyBleHBvc2VkIHBvcnQpXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gSVAgQWRkcmVzcyAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZWRpdC1pcFwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cbiAgICAgICAgICAgIElQIEFkZHJlc3NcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZWRpdC1pcFwiIGNsYXNzPVwiZm9ybS1pbnB1dC1tZFwiIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gVGFpbHNjYWxlIFByb3RlY3Rpb24gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJlZGl0LXRhaWxzY2FsZS1vbmx5XCIgc3R5bGU9XCJ3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4O1wiIC8+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+VGFpbHNjYWxlLU9ubHkgQWNjZXNzPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5SZXN0cmljdCB0aGlzIHNlcnZpY2UgdG8gVGFpbHNjYWxlIHVzZXJzIG9ubHk8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTG9nbyAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlxuICAgICAgICAgICAgU2VydmljZSBMb2dvXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3ctZ2FwLWNlbnRlclwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZGl0LWxvZ28tdXJsXCIgcGxhY2Vob2xkZXI9XCIvYXNzZXRzL3NlcnZpY2UucG5nIG9yIGh0dHBzOi8vLi4uXCIgY2xhc3M9XCJpbnB1dC1mbGV4XCIgLz5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImVkaXQtbG9nby1maWxlXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAvPlxuICAgICAgICAgICAgICBVcGxvYWRcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGludC1zbVwiPlxuICAgICAgICAgICAgRW50ZXIgYSBVUkwgb3IgdXBsb2FkIGFuIGltYWdlIGZpbGUgKFBORywgSlBHLCBTVkcpXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQ2F0ZWdvcnkgLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImVkaXQtc2VydmljZS1jYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cbiAgICAgICAgICAgIENhdGVnb3J5XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiZWRpdC1zZXJ2aWNlLWNhdGVnb3J5XCIgZGF0YS1yb2xlPVwic2VydmljZS1jYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1pbnB1dC1tZFwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlx1MjAxNCBObyBjYXRlZ29yeSBcdTIwMTQ8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNlcnZpY2UtZWRpdC1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNlcnZpY2UtZWRpdC1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+XG4gICAgICAgICAgU2F2ZSBDaGFuZ2VzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGluamVjdE1vZGFsKCdkZWxldGUtc2VydmljZS1tb2RhbCcsIGBcbiAgPGRpdiBpZD1cImRlbGV0ZS1zZXJ2aWNlLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0MDBweDsgbWF4LXdpZHRoOiA1MDBweDtcIj5cbiAgICAgIDxoMyBpZD1cImRlbGV0ZS1tb2RhbC10aXRsZVwiIGNsYXNzPVwibWItMTZcIj5EZWxldGUgU2VydmljZTwvaDM+XG5cbiAgICAgIDxkaXYgaWQ9XCJkZWxldGUtbW9kYWwtbWVzc2FnZVwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMjBweDsgbGluZS1oZWlnaHQ6IDEuNTtcIj5cbiAgICAgICAgPCEtLSBEeW5hbWljIGNvbnRlbnQgLS0+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImRlbGV0ZS1tb2RhbC1jb250YWluZXItaW5mb1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMjBweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IG1hcmdpbi1ib3R0b206IDhweDtcIj5Eb2NrZXIgQ29udGFpbmVyPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkZWxldGUtbW9kYWwtY29udGFpbmVyLW5hbWVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC45cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZGVsZXRlLW1vZGFsLWNhbmNlbFwiIHN0eWxlPVwicGFkZGluZzogMTBweCAyMHB4O1wiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZGVsZXRlLW1vZGFsLXJlbW92ZVwiIHN0eWxlPVwicGFkZGluZzogMTBweCAyMHB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSAyMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYWNjZW50KTtcIj5cbiAgICAgICAgICBSZW1vdmVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJkZWxldGUtbW9kYWwtZGVsZXRlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBwYWRkaW5nOiAxMHB4IDIwcHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZTc0YzNjIDIwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItY29sb3I6ICNlNzRjM2M7IGNvbG9yOiAjZTc0YzNjO1wiPlxuICAgICAgICAgIERlbGV0ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwiZGVsZXRlLW1vZGFsLWhlbHBcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tdXRlZCkgMTAlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1yYWRpdXM6IDhweDsgZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICA8ZGl2PjxzdHJvbmc+UmVtb3ZlOjwvc3Ryb25nPiBSZW1vdmUgZnJvbSBkYXNoYm9hcmQgb25seSAoY29udGFpbmVyIGtlZXBzIHJ1bm5pbmcpPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA2cHg7XCI+PHN0cm9uZz5EZWxldGU6PC9zdHJvbmc+IEZ1bGwgcmVtb3ZhbCAtIHN0b3BzIGNvbnRhaW5lciwgcmVtb3ZlcyBETlMgJiBDYWRkeSBjb25maWc8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBpbmplY3RNb2RhbCgnYWRkLXNlcnZpY2UtbW9kYWwnLCBgXG4gIDxkaXYgaWQ9XCJhZGQtc2VydmljZS1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDIwcHg7IG1heC13aWR0aDogNTIwcHg7XCI+XG4gICAgICA8aDM+QWRkIFNlcnZpY2U8L2gzPlxuXG4gICAgICA8IS0tIFNlcnZpY2UgVHlwZSBUYWJzIC0tPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMnB4OyBtYXJnaW4tYm90dG9tOiAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogOHB4OyBwYWRkaW5nOiAzcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxsYWJlbCBpZD1cInRhYi1sb2NhbFwiIHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuODVyZW07IGZvbnQtd2VpZ2h0OiA1MDA7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1iZyk7IHRyYW5zaXRpb246IGFsbCAwLjE1cztcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInNlcnZpY2UtdHlwZVwiIHZhbHVlPVwibG9jYWxcIiBpZD1cInNlcnZpY2UtdHlwZS1sb2NhbFwiIGNoZWNrZWQgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgTG9jYWxcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGlkPVwidGFiLWV4dGVybmFsXCIgc3R5bGU9XCJmbGV4OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC13ZWlnaHQ6IDUwMDsgY29sb3I6IHZhcigtLW11dGVkKTsgdHJhbnNpdGlvbjogYWxsIDAuMTVzO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic2VydmljZS10eXBlXCIgdmFsdWU9XCJleHRlcm5hbFwiIGlkPVwic2VydmljZS10eXBlLWV4dGVybmFsXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgRXh0ZXJuYWxcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gaWQ9XCJzZXJ2aWNlLXR5cGUtZGVzY3JpcHRpb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PC9zcGFuPlxuXG4gICAgICA8IS0tIExPQ0FMIFNFUlZJQ0UgLS0+XG4gICAgICA8ZGl2IGlkPVwibG9jYWwtc2VydmljZS1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTJweDtcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwic2VydmljZS1uYW1lLWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4OyBkaXNwbGF5OiBibG9jaztcIj5OYW1lPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNlcnZpY2UtbmFtZS1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiZS5nLiwgSmVsbHlmaW5cIiBzdHlsZT1cImZvbnQtc2l6ZTogMXJlbTtcIiAvPlxuICAgICAgICAgIDxkaXYgaWQ9XCJzdWJkb21haW4tcHJldmlld1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgbWFyZ2luLXRvcDogNHB4OyBtaW4taGVpZ2h0OiAxZW07XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLTJjb2xcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNlcnZpY2UtcG9ydC1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDsgZGlzcGxheTogYmxvY2s7XCI+UG9ydDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwic2VydmljZS1wb3J0LWlucHV0XCIgcGxhY2Vob2xkZXI9XCJlLmcuLCA4MDk2XCIgc3R5bGU9XCJmb250LXNpemU6IDFyZW07XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNlcnZpY2UtaXAtaW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7IGRpc3BsYXk6IGJsb2NrO1wiPklQIEFkZHJlc3M8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzZXJ2aWNlLWlwLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJBdXRvLWRldGVjdGVkXCIgc3R5bGU9XCJmb250LXNpemU6IDFyZW07XCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1pcC1idXR0b25zXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDRweDsgbWFyZ2luLXRvcDogNHB4OyBmbGV4LXdyYXA6IHdyYXA7XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicXVpY2staXAtYnRuXCIgZGF0YS1pcD1cIjEyNy4wLjAuMVwiIHRpdGxlPVwiTG9jYWxob3N0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgcGFkZGluZzogMnB4IDZweDtcIj5sb2NhbGhvc3Q8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJxdWljay1pcC1idG5cIiBkYXRhLWlwPVwiXCIgaWQ9XCJxdWljay1pcC1sYW5cIiB0aXRsZT1cIkxBTiBJUFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IHBhZGRpbmc6IDJweCA2cHg7XCI+TEFOPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicXVpY2staXAtYnRuXCIgZGF0YS1pcD1cIlwiIGlkPVwicXVpY2staXAtdGFpbHNjYWxlXCIgdGl0bGU9XCJUYWlsc2NhbGUgSVBcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBwYWRkaW5nOiAycHggNnB4O1wiPlRhaWxzY2FsZTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gT3B0aW9ucyAoY29sbGFwc2VkIGJ5IGRlZmF1bHQpIC0tPlxuICAgICAgICA8ZGV0YWlscyBpZD1cImxvY2FsLWFkdmFuY2VkLW9wdGlvbnNcIj5cbiAgICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtc2l6ZTogMC44cmVtOyB1c2VyLXNlbGVjdDogbm9uZTtcIj5PcHRpb25zPC9zdW1tYXJ5PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4OyBkaXNwbGF5OiBncmlkOyBnYXA6IDEwcHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC0yY29sXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNlcnZpY2Utc3ViZG9tYWluLWlucHV0XCI+U3ViZG9tYWluOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiYXV0by1kZXJpdmVkIGZyb20gbmFtZVwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzZXJ2aWNlLWxvZ28taW5wdXRcIj5Mb2dvIFVSTDo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic2VydmljZS1sb2dvLWlucHV0XCIgcGxhY2Vob2xkZXI9XCIvYXNzZXRzL25hbWUucG5nXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBzdGFydDtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJjcmVhdGUtZG5zLXJlY29yZFwiIGNoZWNrZWQgLz5cbiAgICAgICAgICAgICAgICBDcmVhdGUgRE5TIFJlY29yZFxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzc2wtdHlwZS1zZWxlY3RcIj5TU0w6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwic3NsLXR5cGUtc2VsZWN0XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjYWRkeS1tYW5hZ2VkXCI+Q2FkZHkgTWFuYWdlZCAoSW50ZXJuYWwpPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibGV0c2VuY3J5cHRcIj5MZXQncyBFbmNyeXB0PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZXhpc3RpbmctY2FcIj5FeGlzdGluZyBDQTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImN1c3RvbS1jYVwiPkN1c3RvbSBDQTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGlkPVwiZG5zLWNvbmZpZ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC0yY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJkbnMtdHRsLWlucHV0XCI+RE5TIFRUTDo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImRucy10dGwtaW5wdXRcIiB2YWx1ZT1cIjMwMFwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjYWRkeWZpbGUtcGF0aC1pbnB1dFwiPkNhZGR5ZmlsZSBQYXRoOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNhZGR5ZmlsZS1wYXRoLWlucHV0XCIgdmFsdWU9XCJDOlxcXFxjYWRkeVxcXFxDYWRkeWZpbGVcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGlkPVwiZXhpc3RpbmctY2EtY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhpc3RpbmctY2Etc2VsZWN0XCI+RXhpc3RpbmcgQ0E6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJleGlzdGluZy1jYS1zZWxlY3RcIiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+TG9hZGluZyBDQXMuLi48L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cInJlZnJlc2gtY2FzXCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07XCI+XFx1ezFGNTA0fTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGlkPVwiY3VzdG9tLWNhLWNvbmZpZ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNhLW5hbWUtaW5wdXRcIj5DQSBOYW1lOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2EtbmFtZS1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiZS5nLiwgc2FtaS1jYVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBpZD1cIm1hbnVhbC10YWlsc2NhbGUtc3RhdHVzXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjc1cmVtO1wiPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q2hlY2tpbmcgVGFpbHNjYWxlLi4uPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJtYW51YWwtdGFpbHNjYWxlLW9ubHlcIiAvPlxuICAgICAgICAgICAgICBUYWlsc2NhbGUtT25seSBBY2Nlc3NcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInJlbG9hZC1jYWRkeVwiIGNoZWNrZWQgLz5cbiAgICAgICAgICAgICAgUmVsb2FkIENhZGR5IGFmdGVyIGFkZGluZ1xuICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgPCEtLSBDYXRlZ29yeSAtLT5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzZXJ2aWNlLWNhdGVnb3J5LWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4OyBkaXNwbGF5OiBibG9jaztcIj5DYXRlZ29yeTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzZXJ2aWNlLWNhdGVnb3J5LWlucHV0XCIgZGF0YS1yb2xlPVwic2VydmljZS1jYXRlZ29yeVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlx1MjAxNCBObyBjYXRlZ29yeSBcdTIwMTQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogM3B4O1wiPkdyb3VwIHNlcnZpY2VzIG9uIHRoZSBkYXNoYm9hcmQgYnkgcHVycG9zZSAoTWVkaWEsIFByb2R1Y3Rpdml0eSwgZXRjLik8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8aHIgc3R5bGU9XCJib3JkZXI6IG5vbmU7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBtYXJnaW46IDRweCAwO1wiIC8+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLTJjb2xcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZW5hYmxlLWF1dGhcIiAvPlxuICAgICAgICAgICAgICAgICAgQXV0aGVudGljYXRpb25cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJlbmFibGUtY29yc1wiIC8+XG4gICAgICAgICAgICAgICAgICBDT1JTIEhlYWRlcnNcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ1cHN0cmVhbS1wYXRoLWlucHV0XCI+VXBzdHJlYW0gUGF0aDo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwidXBzdHJlYW0tcGF0aC1pbnB1dFwiIHZhbHVlPVwiL1wiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJoZWFsdGgtY2hlY2staW5wdXRcIj5IZWFsdGggQ2hlY2s6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImhlYWx0aC1jaGVjay1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiL2hlYWx0aFwiIC8+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRpbWVvdXQtaW5wdXRcIj5UaW1lb3V0IChzKTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJ0aW1lb3V0LWlucHV0XCIgdmFsdWU9XCIzMFwiIC8+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImN1c3RvbS1oZWFkZXJzLWlucHV0XCI+SGVhZGVycyAoSlNPTik6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJjdXN0b20taGVhZGVycy1pbnB1dFwiIHBsYWNlaG9sZGVyPSd7XCJYLUN1c3RvbVwiOiBcInZhbHVlXCJ9JyByb3dzPVwiMlwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07XCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2RldGFpbHM+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBFWFRFUk5BTCBTRVJWSUNFIC0tPlxuICAgICAgPGRpdiBpZD1cImV4dGVybmFsLXNlcnZpY2UtY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtc2VydmljZS1uYW1lXCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4OyBkaXNwbGF5OiBibG9jaztcIj5OYW1lPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXh0ZXJuYWwtc2VydmljZS1uYW1lXCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBSYWRhcnIgKFNlZWRob3N0KVwiIHN0eWxlPVwiZm9udC1zaXplOiAxcmVtO1wiIC8+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZXh0ZXJuYWwtc3ViZG9tYWluLXByZXZpZXdcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7IG1hcmdpbi10b3A6IDRweDsgbWluLWhlaWdodDogMWVtO1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHRlcm5hbC1zZXJ2aWNlLXVybFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDsgZGlzcGxheTogYmxvY2s7XCI+RXh0ZXJuYWwgVVJMPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidXJsXCIgaWQ9XCJleHRlcm5hbC1zZXJ2aWNlLXVybFwiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly91c2VybmFtZS5zZWVkaG9zdC5ldS9yYWRhcnJcIiBzdHlsZT1cImZvbnQtc2l6ZTogMXJlbTtcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBPcHRpb25zIChjb2xsYXBzZWQgYnkgZGVmYXVsdCkgLS0+XG4gICAgICAgICAgPGRldGFpbHMgaWQ9XCJleHRlcm5hbC1hZHZhbmNlZC1vcHRpb25zXCI+XG4gICAgICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtc2l6ZTogMC44cmVtOyB1c2VyLXNlbGVjdDogbm9uZTtcIj5PcHRpb25zPC9zdW1tYXJ5PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7IGRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgZm9udC1zaXplOiAwLjhyZW07XCI+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtMmNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtc2VydmljZS1zdWJkb21haW5cIj5TdWJkb21haW46PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXh0ZXJuYWwtc2VydmljZS1zdWJkb21haW5cIiBwbGFjZWhvbGRlcj1cImF1dG8tZGVyaXZlZCBmcm9tIG5hbWVcIiAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJleHRlcm5hbC1kb21haW4tcHJldmlld1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4dGVybmFsLXNlcnZpY2UtbG9nb1wiPkxvZ28gVVJMOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4dGVybmFsLXNlcnZpY2UtbG9nb1wiIHBsYWNlaG9sZGVyPVwiL2Fzc2V0cy9uYW1lLnBuZ1wiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4dGVybmFsLXNlcnZpY2UtaWNvblwiPkljb24gRW1vamk6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4dGVybmFsLXNlcnZpY2UtaWNvblwiIHBsYWNlaG9sZGVyPVwiXFx1ezFGM0FDfVwiIG1heGxlbmd0aD1cIjJcIiBzdHlsZT1cIndpZHRoOiA2MHB4O1wiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXh0ZXJuYWwtY3JlYXRlLWRuc1wiIGNoZWNrZWQgLz5cbiAgICAgICAgICAgICAgICBDcmVhdGUgRE5TIFJlY29yZFxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV4dGVybmFsLWNyZWF0ZS1jYWRkeVwiIGNoZWNrZWQgLz5cbiAgICAgICAgICAgICAgICBDcmVhdGUgQ2FkZHkgUmV2ZXJzZSBQcm94eVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4dGVybmFsLXByb3h5LWlwXCI+UHJveHkgU2VydmVyIElQOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHRlcm5hbC1wcm94eS1pcFwiIHBsYWNlaG9sZGVyPVwiQXV0by1kZXRlY3RlZFwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV4dGVybmFsLXByZXNlcnZlLWhvc3RcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICAgICAgUHJlc2VydmUgSG9zdCBIZWFkZXJcbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJleHRlcm5hbC1mb2xsb3ctcmVkaXJlY3RzXCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICAgIEZvbGxvdyBSZWRpcmVjdHNcbiAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICA8IS0tIENhdGVnb3J5IChleHRlcm5hbCkgLS0+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4dGVybmFsLXNlcnZpY2UtY2F0ZWdvcnlcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7IGRpc3BsYXk6IGJsb2NrO1wiPkNhdGVnb3J5PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiZXh0ZXJuYWwtc2VydmljZS1jYXRlZ29yeVwiIGRhdGEtcm9sZT1cInNlcnZpY2UtY2F0ZWdvcnlcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlx1MjAxNCBObyBjYXRlZ29yeSBcdTIwMTQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGV0YWlscz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhZGQtc2VydmljZS1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImFkZC1zZXJ2aWNlLWNyZWF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiPkNyZWF0ZSBTZXJ2aWNlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFNFUlZJQ0UgSU5GUkFTVFJVQ1RVUkUgPT09PT09PT09PVxuLy8gQ2FkZHkgY29uZmlnIGdlbmVyYXRpb24sIEROUyByZWNvcmQgY3JlYXRpb24sIGFuZCBzZXJ2aWNlIHJlZ2lzdHJhdGlvbi5cbihmdW5jdGlvbiAoKSB7XG5cbiAgLy8gPT09PT0gTE9BRCBFWElTVElORyBDQXMgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkRXhpc3RpbmdDQXMoY2FkZHlmaWxlUGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2NhZGR5L2Nhcz9jYWRkeWZpbGVQYXRoPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhZGR5ZmlsZVBhdGgpfWApO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgQ0FzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4aXN0aW5nLWNhLXNlbGVjdCcpO1xuICAgICAgICBzZWxlY3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5jYXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgc2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+Tm8gQ0FzIGZvdW5kIGluIENhZGR5ZmlsZTwvb3B0aW9uPic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IGV4aXN0aW5nIENBLi4uPC9vcHRpb24+JztcbiAgICAgICAgICByZXN1bHQuY2FzLmZvckVhY2goY2EgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICBvcHRpb24udmFsdWUgPSBjYS5pZDtcbiAgICAgICAgICAgICAgb3B0aW9uLnRleHRDb250ZW50ID0gY2EuZGlzcGxheU5hbWUgfHwgY2EubmFtZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9wdGlvbi52YWx1ZSA9IGNhO1xuICAgICAgICAgICAgICBvcHRpb24udGV4dENvbnRlbnQgPSBjYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGVjdC5hcHBlbmRDaGlsZChvcHRpb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuZGF0YS5jYXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIENBczonLCBlcnJvcik7XG4gICAgICBjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhpc3RpbmctY2Etc2VsZWN0Jyk7XG4gICAgICBzZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5FcnJvciBsb2FkaW5nIENBczwvb3B0aW9uPic7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gR0VORVJBVEUgQ0FERFkgQ09ORklHID09PT09XG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVDYWRkeUNvbmZpZyhjb25maWcpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdWJkb21haW4sXG4gICAgICBwb3J0LFxuICAgICAgaXAsXG4gICAgICBzc2xUeXBlLFxuICAgICAgY2FOYW1lLFxuICAgICAgZXhpc3RpbmdDYSxcbiAgICAgIGVuYWJsZUF1dGgsXG4gICAgICBlbmFibGVDb3JzLFxuICAgICAgY3VzdG9tSGVhZGVycyxcbiAgICAgIHVwc3RyZWFtUGF0aCxcbiAgICAgIGhlYWx0aENoZWNrLFxuICAgICAgdGltZW91dCxcbiAgICAgIHRhaWxzY2FsZU9ubHlcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgbGV0IGNhZGR5Q29uZmlnID0gYCR7YnVpbGREb21haW4oc3ViZG9tYWluKX0ge1xcbmA7XG5cbiAgICAvLyBUYWlsc2NhbGUtb25seSBhY2Nlc3MgcmVzdHJpY3Rpb25cbiAgICBpZiAodGFpbHNjYWxlT25seSkge1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgQGJsb2NrZWQgbm90IHJlbW90ZV9pcCAxMDAuNjQuMC4wLzEwXFxuYDtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgIHJlc3BvbmQgQGJsb2NrZWQgXCJBY2Nlc3MgZGVuaWVkLiBUYWlsc2NhbGUgY29ubmVjdGlvbiByZXF1aXJlZC5cIiA0MDNcXG5gO1xuICAgIH1cblxuICAgIC8vIFNTTCBDb25maWd1cmF0aW9uXG4gICAgc3dpdGNoIChzc2xUeXBlKSB7XG4gICAgICBjYXNlICdsZXRzZW5jcnlwdCc6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2FkZHktbWFuYWdlZCc6XG4gICAgICAgIGNhZGR5Q29uZmlnICs9IGAgIHRscyBpbnRlcm5hbFxcbmA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXhpc3RpbmctY2EnOlxuICAgICAgICBpZiAoZXhpc3RpbmdDYSkge1xuICAgICAgICAgIGNhZGR5Q29uZmlnICs9IGAgIHRscyB7XFxuICAgIGNhICR7ZXhpc3RpbmdDYX1cXG4gIH1cXG5gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY3VzdG9tLWNhJzpcbiAgICAgICAgaWYgKGNhTmFtZSkge1xuICAgICAgICAgIGNhZGR5Q29uZmlnICs9IGAgIHRscyB7XFxuICAgIGNhICR7Y2FOYW1lfVxcbiAgfVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gQXV0aGVudGljYXRpb25cbiAgICBpZiAoZW5hYmxlQXV0aCkge1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgYmFzaWNhdXRoIHtcXG4gICAgYWRtaW4gJDJhJDE0JGhhc2hlZF9wYXNzd29yZF9oZXJlXFxuICB9XFxuYDtcbiAgICB9XG5cbiAgICAvLyBDT1JTIEhlYWRlcnNcbiAgICBpZiAoZW5hYmxlQ29ycykge1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgaGVhZGVyIHtcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgICBBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4gXCIqXCJcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgICBBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzIFwiR0VULCBQT1NULCBQVVQsIERFTEVURSwgT1BUSU9OU1wiXFxuYDtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgICAgQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyBcIkNvbnRlbnQtVHlwZSwgQXV0aG9yaXphdGlvblwiXFxuYDtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgIH1cXG5gO1xuICAgIH1cblxuICAgIC8vIEN1c3RvbSBIZWFkZXJzXG4gICAgaWYgKGN1c3RvbUhlYWRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBKU09OLnBhcnNlKGN1c3RvbUhlYWRlcnMpO1xuICAgICAgICBjYWRkeUNvbmZpZyArPSBgICBoZWFkZXIge1xcbmA7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGNhZGR5Q29uZmlnICs9IGAgICAgJHtrZXl9IFwiJHt2YWx1ZX1cIlxcbmA7XG4gICAgICAgIH0pO1xuICAgICAgICBjYWRkeUNvbmZpZyArPSBgICB9XFxuYDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIEpTT04gaW4gY3VzdG9tIGhlYWRlcnMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIZWFsdGggQ2hlY2tcbiAgICBpZiAoaGVhbHRoQ2hlY2spIHtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgIGhlYWx0aF91cmkgJHtoZWFsdGhDaGVja31cXG5gO1xuICAgIH1cblxuICAgIC8vIFJldmVyc2UgUHJveHlcbiAgICBjYWRkeUNvbmZpZyArPSBgICByZXZlcnNlX3Byb3h5ICR7aXB9OiR7cG9ydH0ge1xcbmA7XG4gICAgaWYgKHVwc3RyZWFtUGF0aCAmJiB1cHN0cmVhbVBhdGggIT09ICcvJykge1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgICByZXdyaXRlICR7dXBzdHJlYW1QYXRofVxcbmA7XG4gICAgfVxuICAgIGlmICh0aW1lb3V0ICYmIHRpbWVvdXQgIT09IDMwKSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIHRyYW5zcG9ydCBodHRwIHtcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgICAgIGRpYWxfdGltZW91dCAke3RpbWVvdXR9c1xcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgICAgcmVzcG9uc2VfaGVhZGVyX3RpbWVvdXQgJHt0aW1lb3V0fXNcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgICB9XFxuYDtcbiAgICB9XG4gICAgY2FkZHlDb25maWcgKz0gYCAgfVxcbmA7XG5cbiAgICBjYWRkeUNvbmZpZyArPSBgfVxcbmA7XG5cbiAgICByZXR1cm4gY2FkZHlDb25maWc7XG4gIH1cblxuICAvLyA9PT09PSBDUkVBVEUgRE5TIFJFQ09SRCA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURuc1JlY29yZChzdWJkb21haW4sIGlwLCB0dGwgPSBEQy5ERUZBVUxUUy5UVEwpIHtcbiAgICBjb25zdCBkbnNUb2tlbiA9IHdpbmRvdy5nZXRUb2tlbihnZXRQcmltYXJ5RG5zSWQoKSwgJ2FkbWluJyk7XG5cbiAgICBpZiAoIWRuc1Rva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ROUyBhZG1pbiB0b2tlbiBub3QgY29uZmlndXJlZC4gUGxlYXNlIHNldCBpdCBpbiB0aGUgVG9rZW5zIG1lbnUuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZG9tYWluID0gYnVpbGREb21haW4oc3ViZG9tYWluKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZG5zL3JlY29yZCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGRvbWFpbjogZG9tYWluLFxuICAgICAgICBpcDogaXAsXG4gICAgICAgIHR0bDogdHRsLFxuICAgICAgICB0b2tlbjogZG5zVG9rZW4sXG4gICAgICAgIHNlcnZlcjogU0lURS5kbnNJcFxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRE5TIEFQSSBFcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9IC0gJHtlcnJvclRleHR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRE5TIEVycm9yOiAke3Jlc3VsdC5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vID09PT09IEFERCBTRVJWSUNFIFRPIENPTkZJRyA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFkZFNlcnZpY2VUb0NvbmZpZyhzZXJ2aWNlQ29uZmlnKSB7XG4gICAgY29uc3QgbmV3U2VydmljZSA9IHtcbiAgICAgIGlkOiBzZXJ2aWNlQ29uZmlnLnN1YmRvbWFpbixcbiAgICAgIG5hbWU6IHNlcnZpY2VDb25maWcubmFtZSxcbiAgICAgIGxvZ286IHNlcnZpY2VDb25maWcubG9nbyB8fCBgL2Fzc2V0cy8ke3NlcnZpY2VDb25maWcuc3ViZG9tYWlufS5wbmdgXG4gICAgfTtcbiAgICAvLyBGb3J3YXJkIG9wdGlvbmFsIG1ldGFkYXRhIGZpZWxkcyBpZiBwcm92aWRlZFxuICAgIGlmIChzZXJ2aWNlQ29uZmlnLmNhdGVnb3J5KSBuZXdTZXJ2aWNlLmNhdGVnb3J5ID0gc2VydmljZUNvbmZpZy5jYXRlZ29yeTtcbiAgICBpZiAoc2VydmljZUNvbmZpZy5jb250YWluZXJJZCkgbmV3U2VydmljZS5jb250YWluZXJJZCA9IHNlcnZpY2VDb25maWcuY29udGFpbmVySWQ7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zZXJ2aWNlcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShuZXdTZXJ2aWNlKVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgc2VydmljZScpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB3aW5kb3cubG9hZFNlcnZpY2VzKCk7XG4gICAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG5cbiAgICAgIHJldHVybiBuZXdTZXJ2aWNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYWRkIHNlcnZpY2UgdG8gY29uZmlnOicsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IEFERCBUTyBDQUREWUZJTEUgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBhZGRUb0NhZGR5ZmlsZShjb25maWcpIHtcbiAgICBjb25zdCBzdWJkb21haW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1zdWJkb21haW4taW5wdXQnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgaXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1pcC1pbnB1dCcpLnZhbHVlLnRyaW0oKSB8fCAnbG9jYWxob3N0JztcbiAgICBjb25zdCBwb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtcG9ydC1pbnB1dCcpLnZhbHVlLnRyaW0oKSB8fCAnODAnO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zaXRlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZG9tYWluOiBidWlsZERvbWFpbihzdWJkb21haW4pLFxuICAgICAgICB1cHN0cmVhbTogYCR7aXB9OiR7cG9ydH1gLFxuICAgICAgICBjb25maWc6IGNvbmZpZ1xuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvciB8fCBgQ2FkZHkgQVBJIEVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vID09PT09IFdJTkRPVyBFWFBPUlRTID09PT09XG5cbiAgd2luZG93LmxvYWRFeGlzdGluZ0NBcyA9IGxvYWRFeGlzdGluZ0NBcztcbiAgd2luZG93LmdlbmVyYXRlQ2FkZHlDb25maWcgPSBnZW5lcmF0ZUNhZGR5Q29uZmlnO1xuICB3aW5kb3cuY3JlYXRlRG5zUmVjb3JkID0gY3JlYXRlRG5zUmVjb3JkO1xuICB3aW5kb3cuYWRkU2VydmljZVRvQ29uZmlnID0gYWRkU2VydmljZVRvQ29uZmlnO1xuICB3aW5kb3cuYWRkVG9DYWRkeWZpbGUgPSBhZGRUb0NhZGR5ZmlsZTtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gU0VSVklDRSBDUlVEID09PT09PT09PT1cbi8vIEVkaXQsIGRlbGV0ZSwgYW5kIHVwZGF0ZSBvcGVyYXRpb25zIGZvciBleGlzdGluZyBzZXJ2aWNlcy5cbihmdW5jdGlvbiAoKSB7XG5cbiAgLy8gPT09PT0gU0VSVklDRSBFRElUIE1PREFMID09PT09XG4gIGxldCBjdXJyZW50RWRpdFNlcnZpY2UgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIG9wZW5TZXJ2aWNlRWRpdE1vZGFsKHNlcnZpY2UpIHtcbiAgICBjdXJyZW50RWRpdFNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZWRpdC1tb2RhbCcpO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZWRpdC10aXRsZScpLnRleHRDb250ZW50ID0gYEVkaXQgJHtzZXJ2aWNlLm5hbWV9YDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zZXJ2aWNlLW5hbWUnKS52YWx1ZSA9IHNlcnZpY2UubmFtZTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zZXJ2aWNlLXVybC1kaXNwbGF5JykudGV4dENvbnRlbnQgPSBzZXJ2aWNlLnVybCB8fCBidWlsZFNlcnZpY2VVcmwoc2VydmljZS5pZCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc2VydmljZS1sb2dvLXByZXZpZXcnKS5zcmMgPSBzZXJ2aWNlLmxvZ28gfHwgYC9hc3NldHMvJHtzZXJ2aWNlLmlkfS5wbmdgO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXN1YmRvbWFpbicpLnZhbHVlID0gc2VydmljZS5pZDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1wb3J0JykudmFsdWUgPSBzZXJ2aWNlLnBvcnQgfHwgJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtaXAnKS52YWx1ZSA9IHNlcnZpY2UuaXAgfHwgJ2xvY2FsaG9zdCc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtdGFpbHNjYWxlLW9ubHknKS5jaGVja2VkID0gc2VydmljZS50YWlsc2NhbGVPbmx5IHx8IGZhbHNlO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LWxvZ28tdXJsJykudmFsdWUgPSBzZXJ2aWNlLmxvZ28gfHwgJyc7XG5cbiAgICAvLyBQb3B1bGF0ZSB0aGUgY2F0ZWdvcnkgc2VsZWN0IGZvciB0aGlzIHNlcnZpY2UsIHRoZW4gc2V0IHRoZSBjdXJyZW50IHZhbHVlLlxuICAgIC8vIHBvcHVsYXRlQ2F0ZWdvcnlTZWxlY3RzKCkgdXNlcyBkYXRhLWN1cnJlbnQgc28gd2Ugc2V0IGl0IGZpcnN0LCB0aGVuIGNhbGwuXG4gICAgY29uc3QgY2F0ZWdvcnlTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zZXJ2aWNlLWNhdGVnb3J5Jyk7XG4gICAgaWYgKGNhdGVnb3J5U2VsZWN0KSB7XG4gICAgICBjYXRlZ29yeVNlbGVjdC5kYXRhc2V0LmN1cnJlbnQgPSBzZXJ2aWNlLmNhdGVnb3J5IHx8ICcnO1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cucG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2luZG93LnBvcHVsYXRlQ2F0ZWdvcnlTZWxlY3RzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VTZXJ2aWNlRWRpdE1vZGFsKCkge1xuICAgIGNsb3NlTW9kYWwoJ3NlcnZpY2UtZWRpdC1tb2RhbCcpO1xuICAgIGN1cnJlbnRFZGl0U2VydmljZSA9IG51bGw7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzYXZlU2VydmljZUNoYW5nZXMoKSB7XG4gICAgaWYgKCFjdXJyZW50RWRpdFNlcnZpY2UpIHJldHVybjtcblxuICAgIGNvbnN0IG5ld1N1YmRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXN1YmRvbWFpbicpLnZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG5ld05hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zZXJ2aWNlLW5hbWUnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgbmV3UG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXBvcnQnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgbmV3SXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1pcCcpLnZhbHVlLnRyaW0oKSB8fCAnbG9jYWxob3N0JztcbiAgICBjb25zdCB0YWlsc2NhbGVPbmx5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtdGFpbHNjYWxlLW9ubHknKS5jaGVja2VkO1xuICAgIGNvbnN0IG5ld0xvZ28gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1sb2dvLXVybCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBuZXdDYXRlZ29yeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtY2F0ZWdvcnknKT8udmFsdWUgfHwgJyc7XG5cbiAgICBpZiAoIW5ld1N1YmRvbWFpbikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignU3ViZG9tYWluIGlzIHJlcXVpcmVkJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRTdWJkb21haW4gPSBjdXJyZW50RWRpdFNlcnZpY2UuaWQ7XG4gICAgY29uc3QgY2hhbmdlcyA9IFtdO1xuXG4gICAgaWYgKG5ld1N1YmRvbWFpbiAhPT0gb2xkU3ViZG9tYWluKSBjaGFuZ2VzLnB1c2goJ3N1YmRvbWFpbicpO1xuICAgIGlmIChuZXdOYW1lICYmIG5ld05hbWUgIT09IGN1cnJlbnRFZGl0U2VydmljZS5uYW1lKSBjaGFuZ2VzLnB1c2goJ25hbWUnKTtcbiAgICBpZiAobmV3UG9ydCAmJiBuZXdQb3J0ICE9PSBTdHJpbmcoY3VycmVudEVkaXRTZXJ2aWNlLnBvcnQpKSBjaGFuZ2VzLnB1c2goJ3BvcnQnKTtcbiAgICBpZiAobmV3SXAgIT09IGN1cnJlbnRFZGl0U2VydmljZS5pcCkgY2hhbmdlcy5wdXNoKCdpcCcpO1xuICAgIGlmICh0YWlsc2NhbGVPbmx5ICE9PSAoY3VycmVudEVkaXRTZXJ2aWNlLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2UpKSBjaGFuZ2VzLnB1c2goJ3RhaWxzY2FsZScpO1xuICAgIGlmIChuZXdMb2dvICYmIG5ld0xvZ28gIT09IGN1cnJlbnRFZGl0U2VydmljZS5sb2dvKSBjaGFuZ2VzLnB1c2goJ2xvZ28nKTtcbiAgICBpZiAobmV3Q2F0ZWdvcnkgIT09IChjdXJyZW50RWRpdFNlcnZpY2UuY2F0ZWdvcnkgfHwgJycpKSBjaGFuZ2VzLnB1c2goJ2NhdGVnb3J5Jyk7XG5cbiAgICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNsb3NlU2VydmljZUVkaXRNb2RhbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNhdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LXNhdmUnKTtcbiAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmluZy4uLic7XG4gICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zZXJ2aWNlcy91cGRhdGUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIG9sZFN1YmRvbWFpbixcbiAgICAgICAgICBuZXdTdWJkb21haW4sXG4gICAgICAgICAgbmFtZTogbmV3TmFtZSB8fCBjdXJyZW50RWRpdFNlcnZpY2UubmFtZSxcbiAgICAgICAgICBwb3J0OiBuZXdQb3J0IHx8IGN1cnJlbnRFZGl0U2VydmljZS5wb3J0LFxuICAgICAgICAgIGlwOiBuZXdJcCxcbiAgICAgICAgICB0YWlsc2NhbGVPbmx5LFxuICAgICAgICAgIGxvZ286IG5ld0xvZ28gfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGNhdGVnb3J5OiBuZXdDYXRlZ29yeVxuICAgICAgICB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIHVwZGF0ZSBzZXJ2aWNlJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBsb2NhbCBBUFBTIGFycmF5IHRvIG1hdGNoXG4gICAgICBjb25zdCBhcHBJbmRleCA9IHdpbmRvdy5BUFBTLmZpbmRJbmRleChhID0+IGEuaWQgPT09IG9sZFN1YmRvbWFpbik7XG4gICAgICBpZiAoYXBwSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHdpbmRvdy5BUFBTW2FwcEluZGV4XSA9IHtcbiAgICAgICAgICAuLi53aW5kb3cuQVBQU1thcHBJbmRleF0sXG4gICAgICAgICAgaWQ6IG5ld1N1YmRvbWFpbixcbiAgICAgICAgICBuYW1lOiBuZXdOYW1lIHx8IHdpbmRvdy5BUFBTW2FwcEluZGV4XS5uYW1lLFxuICAgICAgICAgIHBvcnQ6IG5ld1BvcnQgfHwgd2luZG93LkFQUFNbYXBwSW5kZXhdLnBvcnQsXG4gICAgICAgICAgaXA6IG5ld0lwLFxuICAgICAgICAgIHRhaWxzY2FsZU9ubHksXG4gICAgICAgICAgbG9nbzogbmV3TG9nbyB8fCB3aW5kb3cuQVBQU1thcHBJbmRleF0ubG9nbyxcbiAgICAgICAgICBjYXRlZ29yeTogbmV3Q2F0ZWdvcnkgfHwgdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNsb3NlU2VydmljZUVkaXRNb2RhbCgpO1xuICAgICAgd2luZG93LmJ1aWxkR3JpZCgpO1xuICAgICAgd2luZG93LnJlZnJlc2hBbGwoKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzYXZpbmcgc2VydmljZSBjaGFuZ2VzOicsIGVycm9yKTtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yIHNhdmluZyBjaGFuZ2VzOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2ZSBDaGFuZ2VzJztcbiAgICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBMb2dvIGZpbGUgdXBsb2FkIGhhbmRsZXJcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtbG9nby1maWxlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jIChlKSA9PiB7XG4gICAgY29uc3QgZmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGlmICghZmlsZSkgcmV0dXJuO1xuXG4gICAgaWYgKCFmaWxlLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBzZWxlY3QgYW4gaW1hZ2UgZmlsZScsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBkYXRhVXJsID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcblxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc2VydmljZS1sb2dvLXByZXZpZXcnKS5zcmMgPSBkYXRhVXJsO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtbG9nby11cmwnKS52YWx1ZSA9IGRhdGFVcmw7XG5cbiAgICAgIGlmIChjdXJyZW50RWRpdFNlcnZpY2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Fzc2V0cy91cGxvYWQnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBmaWxlbmFtZTogYCR7Y3VycmVudEVkaXRTZXJ2aWNlLmlkfS5wbmdgLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhVXJsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LnBhdGgpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LWxvZ28tdXJsJykudmFsdWUgPSByZXN1bHQucGF0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGRhdGEgVVJMXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9KTtcblxuICAvLyBTZXJ2aWNlIGVkaXQgbW9kYWwgZXZlbnQgbGlzdGVuZXJzXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWVkaXQtY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VTZXJ2aWNlRWRpdE1vZGFsKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZWRpdC1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2F2ZVNlcnZpY2VDaGFuZ2VzKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZWRpdC1tb2RhbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0LmlkID09PSAnc2VydmljZS1lZGl0LW1vZGFsJykgY2xvc2VTZXJ2aWNlRWRpdE1vZGFsKCk7XG4gIH0pO1xuXG4gIC8vID09PT09IERFTEVURSBTRVJWSUNFIE1PREFMID09PT09XG5cbiAgZnVuY3Rpb24gc2hvd0RlbGV0ZU1vZGFsKHNlcnZpY2VOYW1lLCBoYXNDb250YWluZXIsIGNvbnRhaW5lcklkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtc2VydmljZS1tb2RhbCcpO1xuICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLXRpdGxlJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1tb2RhbC1tZXNzYWdlJyk7XG4gICAgICBjb25zdCBjb250YWluZXJJbmZvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1tb2RhbC1jb250YWluZXItaW5mbycpO1xuICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtY29udGFpbmVyLW5hbWUnKTtcbiAgICAgIGNvbnN0IGhlbHAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLWhlbHAnKTtcbiAgICAgIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtY2FuY2VsJyk7XG4gICAgICBjb25zdCByZW1vdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLXJlbW92ZScpO1xuICAgICAgY29uc3QgZGVsZXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1tb2RhbC1kZWxldGUnKTtcblxuICAgICAgdGl0bGUudGV4dENvbnRlbnQgPSBgRGVsZXRlIFwiJHtzZXJ2aWNlTmFtZX1cImA7XG5cbiAgICAgIGlmIChoYXNDb250YWluZXIpIHtcbiAgICAgICAgbWVzc2FnZS5pbm5lckhUTUwgPSAnVGhpcyBzZXJ2aWNlIGhhcyBhbiBhc3NvY2lhdGVkIERvY2tlciBjb250YWluZXIuPGJyPkNob29zZSBob3cgdG8gcHJvY2VlZDonO1xuICAgICAgICBjb250YWluZXJJbmZvLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBjb250YWluZXJOYW1lLnRleHRDb250ZW50ID0gYENvbnRhaW5lciBJRDogJHtjb250YWluZXJJZD8uc2xpY2UoMCwgMTIpIHx8ICdVbmtub3duJ31gO1xuICAgICAgICBoZWxwLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkZWxldGVCdG4uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXNzYWdlLnRleHRDb250ZW50ID0gJ1JlbW92ZSB0aGlzIHNlcnZpY2UgZnJvbSB0aGUgZGFzaGJvYXJkPyc7XG4gICAgICAgIGNvbnRhaW5lckluZm8uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgaGVscC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkZWxldGVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgICBjYW5jZWxCdG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVDYW5jZWwpO1xuICAgICAgICByZW1vdmVCdG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVSZW1vdmUpO1xuICAgICAgICBkZWxldGVCdG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVEZWxldGUpO1xuICAgICAgICBtb2RhbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUJhY2tkcm9wKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpID0+IHsgY2xlYW51cCgpOyByZXNvbHZlKG51bGwpOyB9O1xuICAgICAgY29uc3QgaGFuZGxlUmVtb3ZlID0gKCkgPT4geyBjbGVhbnVwKCk7IHJlc29sdmUoZmFsc2UpOyB9O1xuICAgICAgY29uc3QgaGFuZGxlRGVsZXRlID0gKCkgPT4geyBjbGVhbnVwKCk7IHJlc29sdmUodHJ1ZSk7IH07XG4gICAgICBjb25zdCBoYW5kbGVCYWNrZHJvcCA9IChlKSA9PiB7IGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIHsgY2xlYW51cCgpOyByZXNvbHZlKG51bGwpOyB9IH07XG5cbiAgICAgIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNhbmNlbCk7XG4gICAgICByZW1vdmVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVSZW1vdmUpO1xuICAgICAgZGVsZXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlRGVsZXRlKTtcbiAgICAgIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQmFja2Ryb3ApO1xuXG4gICAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PSBVUERBVEUgQ09OVEFJTkVSID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ29udGFpbmVyKGNvbnRhaW5lcklkLCBzZXJ2aWNlTmFtZSwgc2VydmljZUlkKSB7XG4gICAgY29uc3QgdXBkYXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHVwZGF0ZS1idG4tJHtzZXJ2aWNlSWR9YCk7XG4gICAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gdXBkYXRlQnRuPy50ZXh0Q29udGVudDtcblxuICAgIGlmICghY29uZmlybShgVXBkYXRlICR7c2VydmljZU5hbWV9IHRvIHRoZSBsYXRlc3QgdmVyc2lvbj9cXG5cXG5UaGlzIHdpbGw6XFxuMS4gUHVsbCB0aGUgbGF0ZXN0IGltYWdlXFxuMi4gU3RvcCB0aGUgY29udGFpbmVyXFxuMy4gUmVjcmVhdGUgd2l0aCBzYW1lIHNldHRpbmdzXFxuXFxuVGhlIHNlcnZpY2Ugd2lsbCBiZSBicmllZmx5IHVuYXZhaWxhYmxlLmApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh1cGRhdGVCdG4pIHtcbiAgICAgICAgdXBkYXRlQnRuLnRleHRDb250ZW50ID0gJ1xcdXsxRjUwNH0nO1xuICAgICAgICB1cGRhdGVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB1cGRhdGVCdG4udGl0bGUgPSAnVXBkYXRpbmcuLi4nO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL2NvbnRhaW5lcnMvJHtjb250YWluZXJJZH0vdXBkYXRlYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB3aW5kb3cuQVBQUy5maW5kKGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2VJZCk7XG4gICAgICAgIGlmIChzZXJ2aWNlICYmIHJlc3VsdC5uZXdDb250YWluZXJJZCkge1xuICAgICAgICAgIHNlcnZpY2UuY29udGFpbmVySWQgPSByZXN1bHQubmV3Q29udGFpbmVySWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlQnRuKSB7XG4gICAgICAgICAgdXBkYXRlQnRuLnRleHRDb250ZW50ID0gJ1xcdXsyNzA1fSc7XG4gICAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0ZWQgc3VjY2Vzc2Z1bGx5ISc7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB1cGRhdGVCdG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICAgICAgICB1cGRhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHVwZGF0ZUJ0bi50aXRsZSA9ICdVcGRhdGUgY29udGFpbmVyIHRvIGxhdGVzdCB2ZXJzaW9uJztcbiAgICAgICAgICB9LCAzMDAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gd2luZG93LnJlZnJlc2hBbGwoKSwgMjAwMCk7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYCR7c2VydmljZU5hbWV9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IWAsICdzdWNjZXNzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdVcGRhdGUgZmFpbGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1VwZGF0ZSBlcnJvcjonLCBlcnJvcik7XG5cbiAgICAgIGlmICh1cGRhdGVCdG4pIHtcbiAgICAgICAgdXBkYXRlQnRuLnRleHRDb250ZW50ID0gJ1xcdXsyNzRDfSc7XG4gICAgICAgIHVwZGF0ZUJ0bi50aXRsZSA9ICdVcGRhdGUgZmFpbGVkJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdXBkYXRlQnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgICAgIHVwZGF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHVwZGF0ZUJ0bi50aXRsZSA9ICdVcGRhdGUgY29udGFpbmVyIHRvIGxhdGVzdCB2ZXJzaW9uJztcbiAgICAgICAgfSwgMzAwMCk7XG4gICAgICB9XG5cbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEZhaWxlZCB0byB1cGRhdGUgJHtzZXJ2aWNlTmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBERUxFVEUgU0VSVklDRSA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVNlcnZpY2Uoc2VydmljZUlkLCBzZXJ2aWNlTmFtZSkge1xuICAgIGNvbnN0IHNlcnZpY2UgPSB3aW5kb3cuQVBQUy5maW5kKGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2VJZCk7XG4gICAgY29uc3QgZG9tYWluID0gc2VydmljZSA/IGJ1aWxkRG9tYWluKHNlcnZpY2UuaWQpIDogbnVsbDtcbiAgICBjb25zdCBoYXNDb250YWluZXIgPSBzZXJ2aWNlPy5jb250YWluZXJJZDtcblxuICAgIGNvbnN0IGRlbGV0ZUNvbnRhaW5lciA9IGF3YWl0IHNob3dEZWxldGVNb2RhbChzZXJ2aWNlTmFtZSB8fCBzZXJ2aWNlSWQsIGhhc0NvbnRhaW5lciwgc2VydmljZT8uY29udGFpbmVySWQpO1xuXG4gICAgaWYgKGRlbGV0ZUNvbnRhaW5lciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuOyAvLyBVc2VyIGNhbmNlbGxlZFxuICAgIH1cblxuICAgIGxldCByZXN1bHRzID0ge1xuICAgICAgZGFzaGJvYXJkOiBmYWxzZSxcbiAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgIGRuczogbnVsbCxcbiAgICAgIGNhZGR5OiBudWxsLFxuICAgICAgc2VydmljZTogbnVsbFxuICAgIH07XG5cbiAgICAvLyBGdWxsIHJlbW92YWwgd2l0aCBjb250YWluZXJcbiAgICBpZiAoZGVsZXRlQ29udGFpbmVyICYmIGhhc0NvbnRhaW5lcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgICAgY29udGFpbmVySWQ6IHNlcnZpY2UuY29udGFpbmVySWQsXG4gICAgICAgICAgc3ViZG9tYWluOiBzZXJ2aWNlLmlkLFxuICAgICAgICAgIGlwOiBzZXJ2aWNlLmlwIHx8ICdsb2NhbGhvc3QnLFxuICAgICAgICAgIGRlbGV0ZUNvbnRhaW5lcjogJ3RydWUnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvYXBwcy8ke2VuY29kZVVSSUNvbXBvbmVudChzZXJ2aWNlLmlkKX0/JHtwYXJhbXMudG9TdHJpbmcoKX1gLCB7XG4gICAgICAgICAgbWV0aG9kOiAnREVMRVRFJ1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc3VsdHMgPSB7IC4uLnJlc3VsdHMsIC4uLnJlc3VsdC5yZXN1bHRzLCBkYXNoYm9hcmQ6IGZhbHNlIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignQXBwIHJlbW92YWwgZmFpbGVkOicsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FwcCByZW1vdmFsIGVycm9yOicsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRlbGV0ZUNvbnRhaW5lciAmJiBkb21haW4pIHtcbiAgICAgIC8vIEZhbGxiYWNrIGZvciBtYW51YWxseSBhZGRlZCBzZXJ2aWNlc1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VydmljZUlQID0gc2VydmljZT8uaXAgfHwgJ2xvY2FsaG9zdCc7XG4gICAgICAgIGNvbnN0IGRuc1Jlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvZG5zL3JlY29yZD9kb21haW49JHtlbmNvZGVVUklDb21wb25lbnQoZG9tYWluKX0mdHlwZT1BJmlwQWRkcmVzcz0ke2VuY29kZVVSSUNvbXBvbmVudChzZXJ2aWNlSVApfSZzZXJ2ZXI9JHtTSVRFLmRuc0lwfWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkbnNSZXN1bHQgPSBhd2FpdCBkbnNSZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHJlc3VsdHMuZG5zID0gZG5zUmVzdWx0LnN1Y2Nlc3MgPyAnZGVsZXRlZCcgOiAoZG5zUmVzdWx0LmVycm9yIHx8ICdmYWlsZWQnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVzdWx0cy5kbnMgPSBlLm1lc3NhZ2U7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhZGR5UmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9zaXRlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGRvbWFpbil9YCwge1xuICAgICAgICAgIG1ldGhvZDogJ0RFTEVURSdcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNhZGR5UmVzdWx0ID0gYXdhaXQgY2FkZHlSZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHJlc3VsdHMuY2FkZHkgPSAoY2FkZHlSZXN1bHQuc3VjY2VzcyB8fCAoY2FkZHlSZXN1bHQuZXJyb3IgJiYgY2FkZHlSZXN1bHQuZXJyb3IuaW5jbHVkZXMoJ25vdCBmb3VuZCcpKSkgPyAncmVtb3ZlZCcgOiAoY2FkZHlSZXN1bHQuZXJyb3IgfHwgJ2ZhaWxlZCcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXN1bHRzLmNhZGR5ID0gZS5tZXNzYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBmcm9tIEFQUFMgYXJyYXlcbiAgICBjb25zdCBpbmRleCA9IHdpbmRvdy5BUFBTLmZpbmRJbmRleChhcHAgPT4gYXBwLmlkID09PSBzZXJ2aWNlSWQpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB3aW5kb3cuQVBQUy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgcmVzdWx0cy5kYXNoYm9hcmQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBmcm9tIGxvY2FsU3RvcmFnZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXN0b21BcHBzID0gc2FmZUdldEpTT04oJ2N1c3RvbS1hcHBzJywgW10pO1xuICAgICAgY29uc3QgbG9jYWxJbmRleCA9IGN1c3RvbUFwcHMuZmluZEluZGV4KGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2VJZCk7XG4gICAgICBpZiAobG9jYWxJbmRleCA+IC0xKSB7XG4gICAgICAgIGN1c3RvbUFwcHMuc3BsaWNlKGxvY2FsSW5kZXgsIDEpO1xuICAgICAgICBzYWZlU2V0KCdjdXN0b20tYXBwcycsIEpTT04uc3RyaW5naWZ5KGN1c3RvbUFwcHMpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZ25vcmUgbG9jYWxTdG9yYWdlIGVycm9yc1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBmcm9tIHNlcnZpY2VzLmpzb24gdmlhIEFQSVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXJ2aWNlUmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9zZXJ2aWNlcy8ke2VuY29kZVVSSUNvbXBvbmVudChzZXJ2aWNlSWQpfWAsIHtcbiAgICAgICAgbWV0aG9kOiAnREVMRVRFJ1xuICAgICAgfSk7XG4gICAgICBjb25zdCBzZXJ2aWNlUmVzdWx0ID0gYXdhaXQgc2VydmljZVJlc3BvbnNlLmpzb24oKTtcbiAgICAgIHJlc3VsdHMuc2VydmljZSA9IHNlcnZpY2VSZXN1bHQuc3VjY2VzcyA/ICdyZW1vdmVkJyA6IChzZXJ2aWNlUmVzdWx0LmVycm9yIHx8ICdmYWlsZWQnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXN1bHRzLnNlcnZpY2UgPSBlLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgd2luZG93LmJ1aWxkR3JpZCgpO1xuICAgIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG5cbiAgICAvLyBPbmx5IHNob3cgYWxlcnQgaWYgdGhlcmUgYXJlIGFjdHVhbCBlcnJvcnNcbiAgICBsZXQgaGFzRXJyb3JzID0gZmFsc2U7XG4gICAgbGV0IGVycm9yTWVzc2FnZXMgPSBbXTtcblxuICAgIGlmICghcmVzdWx0cy5kYXNoYm9hcmQpIHtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICBlcnJvck1lc3NhZ2VzLnB1c2goJ1xcdXsyNzE3fSBGYWlsZWQgdG8gcmVtb3ZlIGZyb20gZGFzaGJvYXJkJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VjY2Vzc1N0YXRlcyA9IFsncmVtb3ZlZCcsICdhbHJlYWR5IHJlbW92ZWQnLCAnbm90IGZvdW5kJywgJ2RlbGV0ZWQnLCAna2VwdCAodXNlciBjaG9pY2UpJywgJ3NraXBwZWQnLCAnbm8gc3VjaCByZWNvcmQnLCAnZG9lcyBub3QgZXhpc3QnXTtcbiAgICBjb25zdCBpc1N1Y2Nlc3MgPSAodmFsKSA9PiAhdmFsIHx8IHN1Y2Nlc3NTdGF0ZXMuc29tZShzID0+IHZhbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHMudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgaWYgKHJlc3VsdHMuY29udGFpbmVyICYmICFpc1N1Y2Nlc3MocmVzdWx0cy5jb250YWluZXIpKSB7XG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKGBcXHV7MjZBMH0gQ29udGFpbmVyOiAke3Jlc3VsdHMuY29udGFpbmVyfWApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0cy5kbnMgJiYgIWlzU3VjY2VzcyhyZXN1bHRzLmRucykpIHtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICBlcnJvck1lc3NhZ2VzLnB1c2goYFxcdXsyNkEwfSBETlMgUmVjb3JkOiAke3Jlc3VsdHMuZG5zfWApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0cy5jYWRkeSAmJiAhaXNTdWNjZXNzKHJlc3VsdHMuY2FkZHkpKSB7XG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKGBcXHV7MjZBMH0gQ2FkZHkgQ29uZmlnOiAke3Jlc3VsdHMuY2FkZHl9YCk7XG4gICAgfVxuICAgIGlmIChyZXN1bHRzLnNlcnZpY2UgJiYgIWlzU3VjY2VzcyhyZXN1bHRzLnNlcnZpY2UpKSB7XG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKGBcXHV7MjZBMH0gU2VydmljZSBGaWxlOiAke3Jlc3VsdHMuc2VydmljZX1gKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzRXJyb3JzKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBFcnJvciBkZWxldGluZyBcIiR7c2VydmljZU5hbWUgfHwgc2VydmljZUlkfVwiOiAke2Vycm9yTWVzc2FnZXMuam9pbignLCAnKX1gLCAnZXJyb3InLCA2MDAwKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBXSU5ET1cgRVhQT1JUUyA9PT09PVxuXG4gIHdpbmRvdy5vcGVuU2VydmljZUVkaXRNb2RhbCA9IG9wZW5TZXJ2aWNlRWRpdE1vZGFsO1xuICB3aW5kb3cuc2hvd0RlbGV0ZU1vZGFsID0gc2hvd0RlbGV0ZU1vZGFsO1xuICB3aW5kb3cudXBkYXRlQ29udGFpbmVyID0gdXBkYXRlQ29udGFpbmVyO1xuICB3aW5kb3cuZGVsZXRlU2VydmljZSA9IGRlbGV0ZVNlcnZpY2U7XG5cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFNFUlZJQ0UgQ1JFQVRJT04gPT09PT09PT09PVxuLy8gQWRkIHNlcnZpY2UgbW9kYWwsIGxvY2FsL2V4dGVybmFsIHNlcnZpY2UgY3JlYXRpb24gZmxvd3MsIGFuZCBldmVudCB3aXJpbmcuXG4oZnVuY3Rpb24gKCkge1xuXG4gIC8vID09PT09IFNVQkRPTUFJTiBBVVRPLURFUklWRSA9PT09PVxuXG4gIGZ1bmN0aW9uIGRlcml2ZVN1YmRvbWFpbihuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJykucmVwbGFjZSgvW15hLXowLTktXS9nLCAnJykucmVwbGFjZSgvLSsvZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTbWFydFNzbERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIFNJVEUuZGVmYXVsdHM/LnNzbFR5cGUgfHwgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnID8gJ2xldHNlbmNyeXB0JyA6ICdjYWRkeS1tYW5hZ2VkJyk7XG4gIH1cblxuICAvLyA9PT09PSBTRVJWSUNFIFBSRVZJRVcgPT09PT1cblxuICBmdW5jdGlvbiB1cGRhdGVTZXJ2aWNlUHJldmlldygpIHtcbiAgICBjb25zdCBzdWJkb21haW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1zdWJkb21haW4taW5wdXQnKS52YWx1ZSB8fCAnc3ViZG9tYWluJztcbiAgICBjb25zdCBpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWlwLWlucHV0JykudmFsdWUgfHwgUVVJQ0tfSVBTLmxhbiB8fCAnbG9jYWxob3N0JztcbiAgICBjb25zdCBwb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtcG9ydC1pbnB1dCcpLnZhbHVlIHx8IERDLkRFRkFVTFRTLlNFUlZJQ0VfUE9SVDtcbiAgICBjb25zdCBzc2xUeXBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NzbC10eXBlLXNlbGVjdCcpLnZhbHVlO1xuICAgIGNvbnN0IGNhTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYS1uYW1lLWlucHV0JykudmFsdWUgfHwgJ3NhbWktY2EnO1xuICAgIGNvbnN0IGV4aXN0aW5nQ2EgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhpc3RpbmctY2Etc2VsZWN0JykudmFsdWU7XG4gICAgY29uc3QgZW5hYmxlQXV0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbmFibGUtYXV0aCcpLmNoZWNrZWQ7XG4gICAgY29uc3QgZW5hYmxlQ29ycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbmFibGUtY29ycycpLmNoZWNrZWQ7XG4gICAgY29uc3QgY3VzdG9tSGVhZGVycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b20taGVhZGVycy1pbnB1dCcpLnZhbHVlO1xuICAgIGNvbnN0IHVwc3RyZWFtUGF0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cHN0cmVhbS1wYXRoLWlucHV0JykudmFsdWUgfHwgJy8nO1xuICAgIGNvbnN0IGhlYWx0aENoZWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1pbnB1dCcpLnZhbHVlO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGltZW91dC1pbnB1dCcpLnZhbHVlIHx8IDMwO1xuXG4gICAgY29uc3QgZG5zUHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtcHJldmlldycpO1xuICAgIGlmIChkbnNQcmV2aWV3KSBkbnNQcmV2aWV3LnRleHRDb250ZW50ID0gYCR7YnVpbGREb21haW4oc3ViZG9tYWluKX0gXFx1MjE5MiAke2lwfWA7XG5cbiAgICBjb25zdCB1cmxQcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VybC1wcmV2aWV3Jyk7XG4gICAgaWYgKHVybFByZXZpZXcpIHVybFByZXZpZXcudGV4dENvbnRlbnQgPSBidWlsZFNlcnZpY2VVcmwoc3ViZG9tYWluKTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHN1YmRvbWFpbiwgcG9ydCwgaXAsIHNzbFR5cGUsIGNhTmFtZSwgZXhpc3RpbmdDYSxcbiAgICAgIGVuYWJsZUF1dGgsIGVuYWJsZUNvcnMsIGN1c3RvbUhlYWRlcnMsIHVwc3RyZWFtUGF0aCwgaGVhbHRoQ2hlY2ssIHRpbWVvdXRcbiAgICB9O1xuXG4gICAgY29uc3QgY2FkZHlDb25maWcgPSB3aW5kb3cuZ2VuZXJhdGVDYWRkeUNvbmZpZyhjb25maWcpO1xuICAgIGNvbnN0IGNvbmZpZ1ByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FkZHktY29uZmlnLXByZXZpZXcnKTtcbiAgICBpZiAoY29uZmlnUHJldmlldykgY29uZmlnUHJldmlldy52YWx1ZSA9IGNhZGR5Q29uZmlnO1xuICB9XG5cbiAgLy8gPT09PT0gUVVJQ0sgSVAgQ09ORklHVVJBVElPTiA9PT09PVxuXG4gIGNvbnN0IFFVSUNLX0lQUyA9IHtcbiAgICBsb2NhbGhvc3Q6ICcxMjcuMC4wLjEnLFxuICAgIGxhbjogJycsXG4gICAgdGFpbHNjYWxlOiAnJ1xuICB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGRldGVjdE5ldHdvcmtJUHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbmV0d29yay9pcHMnLCB7XG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgyMDAwKVxuICAgICAgfSk7XG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEubGFuKSBRVUlDS19JUFMubGFuID0gZGF0YS5sYW47XG4gICAgICAgIGlmIChkYXRhLnRhaWxzY2FsZSkgUVVJQ0tfSVBTLnRhaWxzY2FsZSA9IGRhdGEudGFpbHNjYWxlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIEFQSSBub3QgYXZhaWxhYmxlXG4gICAgfVxuXG4gICAgY29uc3QgbGFuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1aWNrLWlwLWxhbicpO1xuICAgIGNvbnN0IHRzQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1aWNrLWlwLXRhaWxzY2FsZScpO1xuICAgIGlmIChsYW5CdG4pIHtcbiAgICAgIGlmIChRVUlDS19JUFMubGFuKSB7XG4gICAgICAgIGxhbkJ0bi5kYXRhc2V0LmlwID0gUVVJQ0tfSVBTLmxhbjtcbiAgICAgICAgbGFuQnRuLnRleHRDb250ZW50ID0gYExBTiAoJHtRVUlDS19JUFMubGFufSlgO1xuICAgICAgICBsYW5CdG4udGl0bGUgPSBgTEFOIElQOiAke1FVSUNLX0lQUy5sYW59YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxhbkJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHNCdG4pIHtcbiAgICAgIGlmIChRVUlDS19JUFMudGFpbHNjYWxlKSB7XG4gICAgICAgIHRzQnRuLmRhdGFzZXQuaXAgPSBRVUlDS19JUFMudGFpbHNjYWxlO1xuICAgICAgICB0c0J0bi50ZXh0Q29udGVudCA9IGBUYWlsc2NhbGUgKCR7UVVJQ0tfSVBTLnRhaWxzY2FsZX0pYDtcbiAgICAgICAgdHNCdG4udGl0bGUgPSBgVGFpbHNjYWxlIElQOiAke1FVSUNLX0lQUy50YWlsc2NhbGV9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRzQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlwSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1pcC1pbnB1dCcpO1xuICAgIGlmIChpcElucHV0ICYmICFpcElucHV0LnZhbHVlICYmIFFVSUNLX0lQUy5sYW4pIGlwSW5wdXQudmFsdWUgPSBRVUlDS19JUFMubGFuO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdFF1aWNrSVBCdXR0b25zKCkge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdWljay1pcC1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlwID0gYnRuLmRhdGFzZXQuaXA7XG4gICAgICAgIGlmIChpcCkge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWlwLWlucHV0JykudmFsdWUgPSBpcDtcbiAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucXVpY2staXAtYnRuJykuZm9yRWFjaChiID0+IGIuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgICAgICAgIGJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgICAgICB1cGRhdGVTZXJ2aWNlUHJldmlldygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWlwLWlucHV0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJUCA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnF1aWNrLWlwLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGJ0bi5kYXRhc2V0LmlwID09PSBjdXJyZW50SVApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PSBBREQgU0VSVklDRSBNT0RBTCA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG9wZW5BZGRTZXJ2aWNlTW9kYWwoKSB7XG4gICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLXNlcnZpY2UtbW9kYWwnKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG5cbiAgICBjb25zdCBtb2RhbENvbnRlbnQgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcud2VhdGhlci1tb2RhbC1jb250ZW50Jyk7XG4gICAgaWYgKG1vZGFsQ29udGVudCkgbW9kYWxDb250ZW50LnNjcm9sbFRvcCA9IDA7XG5cbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cbiAgICAvLyBTZXQgc21hcnQgU1NMIGRlZmF1bHRcbiAgICBjb25zdCBzc2xTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3NsLXR5cGUtc2VsZWN0Jyk7XG4gICAgaWYgKHNzbFNlbGVjdCkgc3NsU2VsZWN0LnZhbHVlID0gZ2V0U21hcnRTc2xEZWZhdWx0KCk7XG5cbiAgICBhd2FpdCBkZXRlY3ROZXR3b3JrSVBzKCk7XG5cbiAgICBjb25zdCBjYWRkeWZpbGVQYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhZGR5ZmlsZS1wYXRoLWlucHV0JykudmFsdWUgfHwgREMuREVGQVVMVFMuQ0FERFlGSUxFO1xuICAgIGF3YWl0IHdpbmRvdy5sb2FkRXhpc3RpbmdDQXMoY2FkZHlmaWxlUGF0aCk7XG5cbiAgICAvLyBDaGVjayBUYWlsc2NhbGUgc3RhdHVzXG4gICAgY29uc3QgdGFpbHNjYWxlU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbnVhbC10YWlsc2NhbGUtc3RhdHVzJyk7XG4gICAgY29uc3QgdGFpbHNjYWxlQ2hlY2tib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFudWFsLXRhaWxzY2FsZS1vbmx5Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdGFpbHNjYWxlL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5pbnN0YWxsZWQgJiYgZGF0YS5jb25uZWN0ZWQpIHtcbiAgICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNGNhZjUwO1wiPlxcdTI3MTMgQ29ubmVjdGVkPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWxlZnQ6IDZweDtcIj4ke2RhdGEuc2VsZj8uaG9zdG5hbWV9ICgke2RhdGEuc2VsZj8uaXB9KTwvc3Bhbj5cbiAgICAgICAgYDtcbiAgICAgICAgdGFpbHNjYWxlQ2hlY2tib3guZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5pbnN0YWxsZWQpIHtcbiAgICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiAjZmY5ODAwO1wiPlxcdTI2QTAgTm90IGNvbm5lY3RlZDwvc3Bhbj5gO1xuICAgICAgICB0YWlsc2NhbGVDaGVja2JveC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5Ob3QgYXZhaWxhYmxlPC9zcGFuPmA7XG4gICAgICAgIHRhaWxzY2FsZUNoZWNrYm94LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5Db3VsZCBub3QgY2hlY2s8L3NwYW4+YDtcbiAgICAgIHRhaWxzY2FsZUNoZWNrYm94LmRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGFpbHNjYWxlQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuXG4gICAgdXBkYXRlU2VydmljZVByZXZpZXcoKTtcbiAgfVxuXG4gIC8vID09PT09IFNFUlZJQ0UgVFlQRSBTV0lUQ0hJTkcgKFRBQiBTVFlMRSkgPT09PT1cblxuICBmdW5jdGlvbiBzZXR1cFNlcnZpY2VUeXBlU3dpdGNoaW5nKCkge1xuICAgIGNvbnN0IGxvY2FsUmFkaW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS10eXBlLWxvY2FsJyk7XG4gICAgY29uc3QgZXh0ZXJuYWxSYWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXR5cGUtZXh0ZXJuYWwnKTtcbiAgICBjb25zdCBsb2NhbENvbmZpZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2NhbC1zZXJ2aWNlLWNvbmZpZycpO1xuICAgIGNvbnN0IGV4dGVybmFsQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtY29uZmlnJyk7XG4gICAgY29uc3QgdGFiTG9jYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWxvY2FsJyk7XG4gICAgY29uc3QgdGFiRXh0ZXJuYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLWV4dGVybmFsJyk7XG5cbiAgICBmdW5jdGlvbiBzd2l0Y2hTZXJ2aWNlVHlwZSgpIHtcbiAgICAgIGlmIChsb2NhbFJhZGlvLmNoZWNrZWQpIHtcbiAgICAgICAgbG9jYWxDb25maWcuc3R5bGUuZGlzcGxheSA9ICdncmlkJztcbiAgICAgICAgZXh0ZXJuYWxDb25maWcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgaWYgKHRhYkxvY2FsKSB7IHRhYkxvY2FsLnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tYWNjZW50KSc7IHRhYkxvY2FsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJnKSc7IH1cbiAgICAgICAgaWYgKHRhYkV4dGVybmFsKSB7IHRhYkV4dGVybmFsLnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnOyB0YWJFeHRlcm5hbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknOyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2NhbENvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBleHRlcm5hbENvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgaWYgKHRhYkV4dGVybmFsKSB7IHRhYkV4dGVybmFsLnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tYWNjZW50KSc7IHRhYkV4dGVybmFsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJnKSc7IH1cbiAgICAgICAgaWYgKHRhYkxvY2FsKSB7IHRhYkxvY2FsLnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnOyB0YWJMb2NhbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknOyB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9jYWxSYWRpbz8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgc3dpdGNoU2VydmljZVR5cGUpO1xuICAgIGV4dGVybmFsUmFkaW8/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHN3aXRjaFNlcnZpY2VUeXBlKTtcbiAgfVxuXG4gIC8vID09PT09IEFVVE8tREVSSVZFIFNVQkRPTUFJTiBGUk9NIE5BTUUgPT09PT1cblxuICBmdW5jdGlvbiBzZXR1cEF1dG9TdWJkb21haW4oKSB7XG4gICAgLy8gTG9jYWwgc2VydmljZTogbmFtZSBcdTIxOTIgc3ViZG9tYWluICsgcHJldmlld1xuICAgIGNvbnN0IG5hbWVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLW5hbWUtaW5wdXQnKTtcbiAgICBjb25zdCBzdWJkb21haW5JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dCcpO1xuICAgIGNvbnN0IHN1YmRvbWFpblByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ViZG9tYWluLXByZXZpZXcnKTtcbiAgICBsZXQgdXNlckVkaXRlZFN1YmRvbWFpbiA9IGZhbHNlO1xuXG4gICAgbmFtZUlucHV0Py5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGRlcml2ZWQgPSBkZXJpdmVTdWJkb21haW4obmFtZUlucHV0LnZhbHVlKTtcbiAgICAgIGlmICghdXNlckVkaXRlZFN1YmRvbWFpbiAmJiBzdWJkb21haW5JbnB1dCkge1xuICAgICAgICBzdWJkb21haW5JbnB1dC52YWx1ZSA9IGRlcml2ZWQ7XG4gICAgICB9XG4gICAgICBpZiAoc3ViZG9tYWluUHJldmlldykge1xuICAgICAgICBzdWJkb21haW5QcmV2aWV3LnRleHRDb250ZW50ID0gZGVyaXZlZCA/IGBcXHUyMTkyICR7YnVpbGREb21haW4oZGVyaXZlZCl9YCA6ICcnO1xuICAgICAgfVxuICAgICAgdXBkYXRlU2VydmljZVByZXZpZXcoKTtcbiAgICB9KTtcblxuICAgIHN1YmRvbWFpbklucHV0Py5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcbiAgICAgIHVzZXJFZGl0ZWRTdWJkb21haW4gPSBzdWJkb21haW5JbnB1dC52YWx1ZSAhPT0gZGVyaXZlU3ViZG9tYWluKG5hbWVJbnB1dD8udmFsdWUgfHwgJycpO1xuICAgICAgY29uc3Qgc3ViID0gc3ViZG9tYWluSW5wdXQudmFsdWUudHJpbSgpIHx8IGRlcml2ZVN1YmRvbWFpbihuYW1lSW5wdXQ/LnZhbHVlIHx8ICcnKTtcbiAgICAgIGlmIChzdWJkb21haW5QcmV2aWV3KSB7XG4gICAgICAgIHN1YmRvbWFpblByZXZpZXcudGV4dENvbnRlbnQgPSBzdWIgPyBgXFx1MjE5MiAke2J1aWxkRG9tYWluKHN1Yil9YCA6ICcnO1xuICAgICAgfVxuICAgICAgdXBkYXRlU2VydmljZVByZXZpZXcoKTtcbiAgICB9KTtcblxuICAgIC8vIEV4dGVybmFsIHNlcnZpY2U6IG5hbWUgXHUyMTkyIHN1YmRvbWFpbiArIHByZXZpZXdcbiAgICBjb25zdCBleHROYW1lSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1uYW1lJyk7XG4gICAgY29uc3QgZXh0U3ViZG9tYWluSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1zdWJkb21haW4nKTtcbiAgICBjb25zdCBleHRTdWJkb21haW5QcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXN1YmRvbWFpbi1wcmV2aWV3Jyk7XG4gICAgY29uc3QgZXh0RG9tYWluUHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1kb21haW4tcHJldmlldycpO1xuICAgIGxldCB1c2VyRWRpdGVkRXh0U3ViZG9tYWluID0gZmFsc2U7XG5cbiAgICBleHROYW1lSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVyaXZlZCA9IGRlcml2ZVN1YmRvbWFpbihleHROYW1lSW5wdXQudmFsdWUpO1xuICAgICAgaWYgKCF1c2VyRWRpdGVkRXh0U3ViZG9tYWluICYmIGV4dFN1YmRvbWFpbklucHV0KSB7XG4gICAgICAgIGV4dFN1YmRvbWFpbklucHV0LnZhbHVlID0gZGVyaXZlZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN1YiA9IGV4dFN1YmRvbWFpbklucHV0Py52YWx1ZSB8fCBkZXJpdmVkO1xuICAgICAgaWYgKGV4dFN1YmRvbWFpblByZXZpZXcpIHtcbiAgICAgICAgZXh0U3ViZG9tYWluUHJldmlldy50ZXh0Q29udGVudCA9IHN1YiA/IGBcXHUyMTkyICR7YnVpbGREb21haW4oc3ViKX1gIDogJyc7XG4gICAgICB9XG4gICAgICBpZiAoZXh0RG9tYWluUHJldmlldykge1xuICAgICAgICBleHREb21haW5QcmV2aWV3LnRleHRDb250ZW50ID0gc3ViID8gYnVpbGREb21haW4oc3ViKSA6ICcnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXh0U3ViZG9tYWluSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgdXNlckVkaXRlZEV4dFN1YmRvbWFpbiA9IGV4dFN1YmRvbWFpbklucHV0LnZhbHVlICE9PSBkZXJpdmVTdWJkb21haW4oZXh0TmFtZUlucHV0Py52YWx1ZSB8fCAnJyk7XG4gICAgICBjb25zdCBzdWIgPSBleHRTdWJkb21haW5JbnB1dC52YWx1ZS50cmltKCkgfHwgZGVyaXZlU3ViZG9tYWluKGV4dE5hbWVJbnB1dD8udmFsdWUgfHwgJycpO1xuICAgICAgaWYgKGV4dFN1YmRvbWFpblByZXZpZXcpIHtcbiAgICAgICAgZXh0U3ViZG9tYWluUHJldmlldy50ZXh0Q29udGVudCA9IHN1YiA/IGBcXHUyMTkyICR7YnVpbGREb21haW4oc3ViKX1gIDogJyc7XG4gICAgICB9XG4gICAgICBpZiAoZXh0RG9tYWluUHJldmlldykge1xuICAgICAgICBleHREb21haW5QcmV2aWV3LnRleHRDb250ZW50ID0gc3ViID8gYnVpbGREb21haW4oc3ViKSA6ICcnO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT0gQ1JFQVRFIEVYVEVSTkFMIFNFUlZJQ0UgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVFeHRlcm5hbFNlcnZpY2UoKSB7XG4gICAgY29uc3QgbmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLW5hbWUnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgZXh0ZXJuYWxVcmwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS11cmwnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3Qgc3ViZG9tYWluID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLXN1YmRvbWFpbicpLnZhbHVlLnRyaW0oKSB8fCBkZXJpdmVTdWJkb21haW4obmFtZSkpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbG9nbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLWxvZ28nKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgaWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLWljb24nKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgY3JlYXRlRG5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLWNyZWF0ZS1kbnMnKS5jaGVja2VkO1xuICAgIGNvbnN0IGNyZWF0ZUNhZGR5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLWNyZWF0ZS1jYWRkeScpLmNoZWNrZWQ7XG4gICAgY29uc3QgcHJveHlJcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1wcm94eS1pcCcpLnZhbHVlLnRyaW0oKSB8fCBTSVRFLmRuc0lwIHx8ICdsb2NhbGhvc3QnO1xuICAgIGNvbnN0IHByZXNlcnZlSG9zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1wcmVzZXJ2ZS1ob3N0JykuY2hlY2tlZDtcbiAgICBjb25zdCBmb2xsb3dSZWRpcmVjdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtZm9sbG93LXJlZGlyZWN0cycpLmNoZWNrZWQ7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1jYXRlZ29yeScpPy52YWx1ZSB8fCAnJztcblxuICAgIGlmICghbmFtZSB8fCAhZXh0ZXJuYWxVcmwpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBmaWxsIGluIE5hbWUgYW5kIEV4dGVybmFsIFVSTCcsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFzdWJkb21haW4pIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0NvdWxkIG5vdCBkZXJpdmUgc3ViZG9tYWluIGZyb20gbmFtZS4gUGxlYXNlIHNldCBvbmUgaW4gT3B0aW9ucy4nLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZXh0ZXJuYWxVcmwuc3RhcnRzV2l0aCgnaHR0cDovLycpICYmICFleHRlcm5hbFVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFeHRlcm5hbCBVUkwgbXVzdCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8nLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRvbWFpbiA9IGJ1aWxkRG9tYWluKHN1YmRvbWFpbik7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IHsgZG5zOiBudWxsLCBjYWRkeTogbnVsbCwgZGFzaGJvYXJkOiBmYWxzZSB9O1xuXG4gICAgICBpZiAoY3JlYXRlRG5zKSB7XG4gICAgICAgIGNvbnN0IGFkbWluVG9rZW4gPSB3aW5kb3cuZ2V0VG9rZW4oZ2V0UHJpbWFyeURuc0lkKCksICdhZG1pbicpO1xuICAgICAgICBpZiAoYWRtaW5Ub2tlbikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkbnNSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Rucy9yZWNvcmQnLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGRvbWFpbjogZG9tYWluLFxuICAgICAgICAgICAgICAgIGlwOiBwcm94eUlwLFxuICAgICAgICAgICAgICAgIHR0bDogREMuREVGQVVMVFMuVFRMLFxuICAgICAgICAgICAgICAgIHNlcnZlcjogU0lURS5kbnNJcFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkbnNSZXN1bHQgPSBhd2FpdCBkbnNSZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICByZXN1bHRzLmRucyA9IGRuc1Jlc3VsdC5zdWNjZXNzID8gJ2NyZWF0ZWQnIDogKGRuc1Jlc3VsdC5lcnJvciB8fCAnZmFpbGVkJyk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVzdWx0cy5kbnMgPSBlLm1lc3NhZ2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdHMuZG5zID0gJ25vIGFkbWluIHRva2VuIChjb25maWd1cmUgaW4gXFx1RDgzRFxcdUREMTEgVG9rZW5zKSc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNyZWF0ZUNhZGR5KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY2FkZHlDb25maWcgPSB7XG4gICAgICAgICAgICBzdWJkb21haW46IHN1YmRvbWFpbixcbiAgICAgICAgICAgIGV4dGVybmFsVXJsOiBleHRlcm5hbFVybCxcbiAgICAgICAgICAgIHByZXNlcnZlSG9zdDogcHJlc2VydmVIb3N0LFxuICAgICAgICAgICAgZm9sbG93UmVkaXJlY3RzOiBmb2xsb3dSZWRpcmVjdHMsXG4gICAgICAgICAgICBzc2xUeXBlOiAnY2FkZHktbWFuYWdlZCcsXG4gICAgICAgICAgICBjYWRkeWZpbGVQYXRoOiBEQy5ERUZBVUxUUy5DQUREWUZJTEUsXG4gICAgICAgICAgICByZWxvYWRDYWRkeTogdHJ1ZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBjYWRkeVJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc2l0ZS9leHRlcm5hbCcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjYWRkeUNvbmZpZylcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGNhZGR5UmVzdWx0ID0gYXdhaXQgY2FkZHlSZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgcmVzdWx0cy5jYWRkeSA9IGNhZGR5UmVzdWx0LnN1Y2Nlc3MgPyAnY3JlYXRlZCcgOiAoY2FkZHlSZXN1bHQuZXJyb3IgfHwgJ2ZhaWxlZCcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVzdWx0cy5jYWRkeSA9IGUubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdTZXJ2aWNlID0ge1xuICAgICAgICBpZDogc3ViZG9tYWluLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICB1cmw6IGBodHRwczovLyR7ZG9tYWlufWAsXG4gICAgICAgIGV4dGVybmFsVXJsOiBleHRlcm5hbFVybCxcbiAgICAgICAgbG9nbzogbG9nbyB8fCBpY29uIHx8ICdcXHVEODNDXFx1REYxMCcsXG4gICAgICAgIGlzRXh0ZXJuYWw6IHRydWUsXG4gICAgICAgIGlzQ3VzdG9tOiB0cnVlXG4gICAgICB9O1xuICAgICAgLy8gT25seSBhdHRhY2ggY2F0ZWdvcnkgaWYgdXNlciBhY3R1YWxseSBwaWNrZWQgb25lXG4gICAgICBpZiAoY2F0ZWdvcnkpIG5ld1NlcnZpY2UuY2F0ZWdvcnkgPSBjYXRlZ29yeTtcblxuICAgICAgd2luZG93LkFQUFMucHVzaChuZXdTZXJ2aWNlKTtcbiAgICAgIHJlc3VsdHMuZGFzaGJvYXJkID0gdHJ1ZTtcblxuICAgICAgY29uc3QgZGVmYXVsdFNlcnZpY2VzID0gWydwbGV4JywgJ3JvdXRlcicsICdjaGF0JywgJ3N5bmMnLCAndG9ycmVudCcsICdyYWRhcnInLCAnc29uYXJyJywgJ3Byb3dsYXJyJywgJ3BvcnRhaW5lcicsICdyZXF1ZXN0cycsICdqZWxseWZpbicsICdlbWJ5J107XG4gICAgICBjb25zdCBjdXN0b21TZXJ2aWNlcyA9IHdpbmRvdy5BUFBTLmZpbHRlcihhcHAgPT4gIWRlZmF1bHRTZXJ2aWNlcy5pbmNsdWRlcyhhcHAuaWQpKTtcbiAgICAgIHNhZmVTZXQoJ2N1c3RvbS1zZXJ2aWNlcycsIEpTT04uc3RyaW5naWZ5KGN1c3RvbVNlcnZpY2VzKSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NlcnZpY2VzJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHdpbmRvdy5BUFBTKVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2F2ZSB0byBzZXJ2aWNlcy5qc29uOicsIGUpO1xuICAgICAgfVxuXG4gICAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuXG4gICAgICBjbG9zZUFkZFNlcnZpY2VNb2RhbCgpO1xuXG4gICAgICBjb25zdCBwYXJ0cyA9IFtgRXh0ZXJuYWwgc2VydmljZSBcIiR7bmFtZX1cIiBhZGRlZCFgXTtcbiAgICAgIGlmIChjcmVhdGVEbnMpIHBhcnRzLnB1c2goYEROUzogJHtyZXN1bHRzLmRucyA9PT0gJ2NyZWF0ZWQnID8gJ1xcdTI3MTMnIDogJ1xcdTI2QTAgJyArIHJlc3VsdHMuZG5zfWApO1xuICAgICAgaWYgKGNyZWF0ZUNhZGR5KSBwYXJ0cy5wdXNoKGBDYWRkeTogJHtyZXN1bHRzLmNhZGR5ID09PSAnY3JlYXRlZCcgPyAnXFx1MjcxMycgOiAnXFx1MjZBMCAnICsgcmVzdWx0cy5jYWRkeX1gKTtcbiAgICAgIHBhcnRzLnB1c2goYEFjY2VzcyBhdDogaHR0cHM6Ly8ke2RvbWFpbn1gKTtcbiAgICAgIHNob3dOb3RpZmljYXRpb24ocGFydHMuam9pbignIHwgJyksICdzdWNjZXNzJywgNjAwMCk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBleHRlcm5hbCBzZXJ2aWNlOicsIGVycm9yKTtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEZhaWxlZCB0byBjcmVhdGUgZXh0ZXJuYWwgc2VydmljZTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IENMT1NFIEFERCBTRVJWSUNFIE1PREFMID09PT09XG5cbiAgZnVuY3Rpb24gY2xvc2VBZGRTZXJ2aWNlTW9kYWwoKSB7XG4gICAgY2xvc2VNb2RhbCgnYWRkLXNlcnZpY2UtbW9kYWwnKTtcblxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLW5hbWUtaW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtcG9ydC1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKS52YWx1ZSA9IFFVSUNLX0lQUy5sYW4gfHwgJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtbG9nby1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy10dGwtaW5wdXQnKS52YWx1ZSA9IERDLkRFRkFVTFRTLlRUTDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3NsLXR5cGUtc2VsZWN0JykudmFsdWUgPSBnZXRTbWFydFNzbERlZmF1bHQoKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2EtbmFtZS1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1hdXRoJykuY2hlY2tlZCA9IGZhbHNlO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbmFibGUtY29ycycpLmNoZWNrZWQgPSBmYWxzZTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3VzdG9tLWhlYWRlcnMtaW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cHN0cmVhbS1wYXRoLWlucHV0JykudmFsdWUgPSAnLyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpbWVvdXQtaW5wdXQnKS52YWx1ZSA9ICczMCc7XG5cbiAgICAvLyBDbGVhciBzdWJkb21haW4gcHJldmlld3NcbiAgICBjb25zdCBzdWJQcmV2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1YmRvbWFpbi1wcmV2aWV3Jyk7XG4gICAgaWYgKHN1YlByZXYpIHN1YlByZXYudGV4dENvbnRlbnQgPSAnJztcbiAgICBjb25zdCBleHRTdWJQcmV2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXN1YmRvbWFpbi1wcmV2aWV3Jyk7XG4gICAgaWYgKGV4dFN1YlByZXYpIGV4dFN1YlByZXYudGV4dENvbnRlbnQgPSAnJztcblxuICAgIC8vIENsZWFyIGV4dGVybmFsIGZpZWxkc1xuICAgIGNvbnN0IGV4dE5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1uYW1lJyk7XG4gICAgaWYgKGV4dE5hbWUpIGV4dE5hbWUudmFsdWUgPSAnJztcbiAgICBjb25zdCBleHRTdWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1zdWJkb21haW4nKTtcbiAgICBpZiAoZXh0U3ViKSBleHRTdWIudmFsdWUgPSAnJztcbiAgICBjb25zdCBleHRVcmwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS11cmwnKTtcbiAgICBpZiAoZXh0VXJsKSBleHRVcmwudmFsdWUgPSAnJztcbiAgICBjb25zdCBleHRMb2dvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtbG9nbycpO1xuICAgIGlmIChleHRMb2dvKSBleHRMb2dvLnZhbHVlID0gJyc7XG4gICAgY29uc3QgZXh0SWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLWljb24nKTtcbiAgICBpZiAoZXh0SWNvbikgZXh0SWNvbi52YWx1ZSA9ICcnO1xuXG4gICAgLy8gQ29sbGFwc2Ugb3B0aW9uc1xuICAgIGNvbnN0IGxvY2FsT3B0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2NhbC1hZHZhbmNlZC1vcHRpb25zJyk7XG4gICAgaWYgKGxvY2FsT3B0cykgbG9jYWxPcHRzLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpO1xuICAgIGNvbnN0IGV4dE9wdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtYWR2YW5jZWQtb3B0aW9ucycpO1xuICAgIGlmIChleHRPcHRzKSBleHRPcHRzLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpO1xuXG4gICAgLy8gUmVzZXQgdG8gbG9jYWwgdGFiXG4gICAgY29uc3QgbG9jYWxSYWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXR5cGUtbG9jYWwnKTtcbiAgICBpZiAobG9jYWxSYWRpbykgbG9jYWxSYWRpby5jaGVja2VkID0gdHJ1ZTtcbiAgICBjb25zdCBsb2NhbENvbmZpZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2NhbC1zZXJ2aWNlLWNvbmZpZycpO1xuICAgIGNvbnN0IGV4dGVybmFsQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtY29uZmlnJyk7XG4gICAgaWYgKGxvY2FsQ29uZmlnKSBsb2NhbENvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ2dyaWQnO1xuICAgIGlmIChleHRlcm5hbENvbmZpZykgZXh0ZXJuYWxDb25maWcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBjb25zdCB0YWJMb2NhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItbG9jYWwnKTtcbiAgICBjb25zdCB0YWJFeHRlcm5hbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItZXh0ZXJuYWwnKTtcbiAgICBpZiAodGFiTG9jYWwpIHsgdGFiTG9jYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1hY2NlbnQpJzsgdGFiTG9jYWwuc3R5bGUuY29sb3IgPSAndmFyKC0tYmcpJzsgfVxuICAgIGlmICh0YWJFeHRlcm5hbCkgeyB0YWJFeHRlcm5hbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3RyYW5zcGFyZW50JzsgdGFiRXh0ZXJuYWwuc3R5bGUuY29sb3IgPSAndmFyKC0tbXV0ZWQpJzsgfVxuICB9XG5cbiAgLy8gPT09PT0gQ1JFQVRFIE5FVyBTRVJWSUNFID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTmV3U2VydmljZSgpIHtcbiAgICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtbmFtZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBzdWJkb21haW4gPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2Utc3ViZG9tYWluLWlucHV0JykudmFsdWUudHJpbSgpIHx8IGRlcml2ZVN1YmRvbWFpbihuYW1lKSkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBwb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtcG9ydC1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWlwLWlucHV0JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGxvZ28gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1sb2dvLWlucHV0JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGNyZWF0ZURucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjcmVhdGUtZG5zLXJlY29yZCcpLmNoZWNrZWQ7XG4gICAgY29uc3QgdHRsID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy10dGwtaW5wdXQnKS52YWx1ZSkgfHwgREMuREVGQVVMVFMuVFRMO1xuICAgIGNvbnN0IHRhaWxzY2FsZU9ubHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFudWFsLXRhaWxzY2FsZS1vbmx5Jyk/LmNoZWNrZWQgfHwgZmFsc2U7XG5cbiAgICBjb25zdCBzc2xUeXBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NzbC10eXBlLXNlbGVjdCcpPy52YWx1ZSB8fCAnY2FkZHktbWFuYWdlZCc7XG4gICAgY29uc3QgY2FOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhLW5hbWUtaW5wdXQnKT8udmFsdWUgfHwgJyc7XG4gICAgY29uc3QgZXhpc3RpbmdDYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGlzdGluZy1jYS1zZWxlY3QnKT8udmFsdWUgfHwgJyc7XG4gICAgY29uc3QgZW5hYmxlQXV0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbmFibGUtYXV0aCcpPy5jaGVja2VkIHx8IGZhbHNlO1xuICAgIGNvbnN0IGVuYWJsZUNvcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW5hYmxlLWNvcnMnKT8uY2hlY2tlZCB8fCBmYWxzZTtcbiAgICBjb25zdCBjdXN0b21IZWFkZXJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N1c3RvbS1oZWFkZXJzLWlucHV0Jyk/LnZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IHVwc3RyZWFtUGF0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cHN0cmVhbS1wYXRoLWlucHV0Jyk/LnZhbHVlIHx8ICcvJztcbiAgICBjb25zdCBoZWFsdGhDaGVjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2staW5wdXQnKT8udmFsdWUgfHwgJyc7XG4gICAgY29uc3QgdGltZW91dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aW1lb3V0LWlucHV0Jyk/LnZhbHVlIHx8IDMwO1xuXG4gICAgLy8gQ2F0ZWdvcnkgaXMgb3B0aW9uYWwgXHUyMDE0IHB1bGxlZCBmcm9tIGVpdGhlciBsb2NhbCBvciBleHRlcm5hbCBzZWxlY3QgYnkgdGhlXG4gICAgLy8gb3BlbkFkZFNlcnZpY2VNb2RhbCByZXNldC4gSWYgdXNlciBkb2Vzbid0IGNob29zZSBvbmUsIGl0IHN0YXlzIHVuZGVmaW5lZFxuICAgIC8vIGFuZCB3ZSBkb24ndCBzZW5kIGl0IChzbyB0aGUgYmFja2VuZCBrZWVwcyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IpLlxuICAgIGNvbnN0IGNhdGVnb3J5RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1jYXRlZ29yeS1pbnB1dCcpXG4gICAgICB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1jYXRlZ29yeScpO1xuICAgIGNvbnN0IGNhdGVnb3J5ID0gY2F0ZWdvcnlFbD8udmFsdWUgfHwgJyc7XG5cbiAgICBjb25zdCBkbnNUb2tlbiA9IHdpbmRvdy5nZXRUb2tlbihnZXRQcmltYXJ5RG5zSWQoKSwgJ2FkbWluJyk7XG5cbiAgICBpZiAoIW5hbWUgfHwgIXBvcnQgfHwgIWlwKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZmlsbCBpbiBOYW1lLCBQb3J0LCBhbmQgSVAgQWRkcmVzcycsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFzdWJkb21haW4pIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0NvdWxkIG5vdCBkZXJpdmUgc3ViZG9tYWluIGZyb20gbmFtZS4gUGxlYXNlIHNldCBvbmUgaW4gT3B0aW9ucy4nLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjcmVhdGVEbnMgJiYgIWRuc1Rva2VuKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdETlMgQWRtaW4gdG9rZW4gcmVxdWlyZWQuIENvbmZpZ3VyZSBpdCBpbiB0aGUgVG9rZW5zIG1lbnUgZmlyc3QuJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRzID0geyBkbnM6IG51bGwsIGNhZGR5OiBudWxsLCBkYXNoYm9hcmQ6IGZhbHNlIH07XG5cbiAgICB0cnkge1xuICAgICAgaWYgKGNyZWF0ZURucykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdpbmRvdy5jcmVhdGVEbnNSZWNvcmQoc3ViZG9tYWluLCBpcCwgdHRsKTtcbiAgICAgICAgICByZXN1bHRzLmRucyA9ICdjcmVhdGVkJztcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdETlMgY3JlYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgICByZXN1bHRzLmRucyA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBETlMgY3JlYXRpb24gZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdHMuZG5zID0gJ3NraXBwZWQnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYWRkeUNvbmZpZyA9IHdpbmRvdy5nZW5lcmF0ZUNhZGR5Q29uZmlnKHtcbiAgICAgICAgc3ViZG9tYWluLCBwb3J0LCBpcCwgc3NsVHlwZSwgY2FOYW1lLCBleGlzdGluZ0NhLFxuICAgICAgICBlbmFibGVBdXRoLCBlbmFibGVDb3JzLCBjdXN0b21IZWFkZXJzLCB1cHN0cmVhbVBhdGgsIGhlYWx0aENoZWNrLCB0aW1lb3V0LCB0YWlsc2NhbGVPbmx5XG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2FkZHlSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NpdGUnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZG9tYWluOiBidWlsZERvbWFpbihzdWJkb21haW4pLFxuICAgICAgICAgICAgdXBzdHJlYW06IGAke2lwfToke3BvcnR9YCxcbiAgICAgICAgICAgIGNvbmZpZzogY2FkZHlDb25maWdcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjYWRkeVJlc3VsdCA9IGF3YWl0IGNhZGR5UmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoY2FkZHlSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc3VsdHMuY2FkZHkgPSAnYWRkZWQgJiByZWxvYWRlZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignQ2FkZHkgY29uZmlndXJhdGlvbiBmYWlsZWQ6JywgY2FkZHlSZXN1bHQuZXJyb3IpO1xuICAgICAgICAgIHJlc3VsdHMuY2FkZHkgPSBjYWRkeVJlc3VsdC5lcnJvciB8fCAnZmFpbGVkJztcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhZGR5IGNvbmZpZ3VyYXRpb24gZmFpbGVkOiAke2NhZGR5UmVzdWx0LmVycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDYWRkeSBBUEkgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICByZXN1bHRzLmNhZGR5ID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYWRkeSBBUEkgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VydmljZUNvbmZpZyA9IHtcbiAgICAgICAgbmFtZSwgc3ViZG9tYWluLCBwb3J0LCBpcCxcbiAgICAgICAgbG9nbzogbG9nbyB8fCBgL2Fzc2V0cy8ke3N1YmRvbWFpbn0ucG5nYCxcbiAgICAgICAgdGFpbHNjYWxlT25seTogdGFpbHNjYWxlT25seSB8fCBmYWxzZVxuICAgICAgfTtcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSBjYXRlZ29yeSBpZiB1c2VyIGFjdHVhbGx5IHBpY2tlZCBvbmVcbiAgICAgIGlmIChjYXRlZ29yeSkgc2VydmljZUNvbmZpZy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuXG4gICAgICBhd2FpdCB3aW5kb3cuYWRkU2VydmljZVRvQ29uZmlnKHNlcnZpY2VDb25maWcpO1xuICAgICAgcmVzdWx0cy5kYXNoYm9hcmQgPSB0cnVlO1xuXG4gICAgICBjb25zdCBzdGF0dXNQYXJ0cyA9IFtcbiAgICAgICAgYEROUzogJHtyZXN1bHRzLmRucyA9PT0gJ2NyZWF0ZWQnID8gJ1xcdTI3MTMnIDogcmVzdWx0cy5kbnMgPT09ICdza2lwcGVkJyA/ICdcXHUyNUNCJyA6ICdcXHUyNzE3J31gLFxuICAgICAgICBgQ2FkZHk6ICR7cmVzdWx0cy5jYWRkeSA9PT0gJ2FkZGVkICYgcmVsb2FkZWQnID8gJ1xcdTI3MTMnIDogJ1xcdTI3MTcnfWAsXG4gICAgICAgIGBEYXNoYm9hcmQ6ICR7cmVzdWx0cy5kYXNoYm9hcmQgPyAnXFx1MjcxMycgOiAnXFx1MjcxNyd9YFxuICAgICAgXTtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYFNlcnZpY2UgXCIke25hbWV9XCIgY3JlYXRlZCEgJHtzdGF0dXNQYXJ0cy5qb2luKCcgfCAnKX0gXFx1MjAxNCAke2J1aWxkU2VydmljZVVybChzdWJkb21haW4pfSR7dGFpbHNjYWxlT25seSA/ICcgKFRhaWxzY2FsZSknIDogJyd9YCwgJ3N1Y2Nlc3MnLCA2MDAwKTtcblxuICAgICAgY2xvc2VBZGRTZXJ2aWNlTW9kYWwoKTtcblxuICAgICAgd2luZG93LmJ1aWxkR3JpZCgpO1xuICAgICAgd2luZG93LnJlZnJlc2hBbGwoKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjcmVhdGluZyBzZXJ2aWNlOicsIGVycm9yKTtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yIGNyZWF0aW5nIFwiJHtuYW1lfVwiOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgNjAwMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gRVZFTlQgTElTVEVORVJTID09PT09XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlbkFkZFNlcnZpY2VNb2RhbCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZS1jYW5jZWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZUFkZFNlcnZpY2VNb2RhbCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZS1jcmVhdGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY29uc3Qgc2VydmljZVR5cGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwic2VydmljZS10eXBlXCJdOmNoZWNrZWQnKT8udmFsdWU7XG4gICAgaWYgKHNlcnZpY2VUeXBlID09PSAnZXh0ZXJuYWwnKSB7XG4gICAgICBjcmVhdGVFeHRlcm5hbFNlcnZpY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3JlYXRlTmV3U2VydmljZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgc2V0dXBTZXJ2aWNlVHlwZVN3aXRjaGluZygpO1xuICBzZXR1cEF1dG9TdWJkb21haW4oKTtcbiAgaW5pdFF1aWNrSVBCdXR0b25zKCk7XG5cbiAgLy8gU1NMIHR5cGUgY2hhbmdlIGhhbmRsZXJcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NzbC10eXBlLXNlbGVjdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nQ2FDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhpc3RpbmctY2EtY29uZmlnJyk7XG4gICAgY29uc3QgY3VzdG9tQ2FDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3VzdG9tLWNhLWNvbmZpZycpO1xuXG4gICAgZXhpc3RpbmdDYUNvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGN1c3RvbUNhQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICBpZiAoZS50YXJnZXQudmFsdWUgPT09ICdleGlzdGluZy1jYScpIHtcbiAgICAgIGV4aXN0aW5nQ2FDb25maWcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfSBlbHNlIGlmIChlLnRhcmdldC52YWx1ZSA9PT0gJ2N1c3RvbS1jYScpIHtcbiAgICAgIGN1c3RvbUNhQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH1cblxuICAgIHVwZGF0ZVNlcnZpY2VQcmV2aWV3KCk7XG4gIH0pO1xuXG4gIC8vIFJlZnJlc2ggQ0FzIGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVmcmVzaC1jYXMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZnJlc2gtY2FzJyk7XG4gICAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gYnV0dG9uLnRleHRDb250ZW50O1xuICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcXHUyMzFCIExvYWRpbmcuLi4nO1xuICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FkZHlmaWxlUGF0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWRkeWZpbGUtcGF0aC1pbnB1dCcpLnZhbHVlIHx8IERDLkRFRkFVTFRTLkNBRERZRklMRTtcbiAgICAgIGF3YWl0IHdpbmRvdy5sb2FkRXhpc3RpbmdDQXMoY2FkZHlmaWxlUGF0aCk7XG4gICAgICBidXR0b24udGV4dENvbnRlbnQgPSAnXFx1MjcwNSBSZWZyZXNoZWQnO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBidXR0b24udGV4dENvbnRlbnQgPSAnXFx1Mjc0QyBGYWlsZWQnO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlZnJlc2ggQ0FzOicsIGVycm9yKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH0sIDIwMDApO1xuICB9KTtcblxuICAvLyBETlMgcmVjb3JkIGNoZWNrYm94IGhhbmRsZXJcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NyZWF0ZS1kbnMtcmVjb3JkJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgY29uc3QgZG5zQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1jb25maWcnKTtcbiAgICBkbnNDb25maWcuc3R5bGUuZGlzcGxheSA9IGUudGFyZ2V0LmNoZWNrZWQgPyAnYmxvY2snIDogJ25vbmUnO1xuICB9KTtcblxuICAvLyBSZWFsLXRpbWUgcHJldmlldyB1cGRhdGVzXG4gIFsnc2VydmljZS1zdWJkb21haW4taW5wdXQnLCAnc2VydmljZS1pcC1pbnB1dCcsICdzZXJ2aWNlLXBvcnQtaW5wdXQnLCAnY2EtbmFtZS1pbnB1dCcsXG4gICAnZXhpc3RpbmctY2Etc2VsZWN0JywgJ2VuYWJsZS1hdXRoJywgJ2VuYWJsZS1jb3JzJywgJ2N1c3RvbS1oZWFkZXJzLWlucHV0JywgJ3Vwc3RyZWFtLXBhdGgtaW5wdXQnLFxuICAgJ2hlYWx0aC1jaGVjay1pbnB1dCcsICd0aW1lb3V0LWlucHV0J10uZm9yRWFjaChpZCA9PiB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHVwZGF0ZVNlcnZpY2VQcmV2aWV3KTtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRlU2VydmljZVByZXZpZXcpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gPT09PT0gQ1VTVE9NIFNFUlZJQ0VTIEZST00gTE9DQUxTVE9SQUdFID09PT09XG5cbiAgZnVuY3Rpb24gbG9hZEN1c3RvbVNlcnZpY2VzKCkge1xuICAgIGNvbnN0IGN1c3RvbVNlcnZpY2VzID0gc2FmZUdldCgnY3VzdG9tLXNlcnZpY2VzJyk7XG4gICAgaWYgKGN1c3RvbVNlcnZpY2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlcyA9IEpTT04ucGFyc2UoY3VzdG9tU2VydmljZXMpO1xuICAgICAgICBzZXJ2aWNlcy5mb3JFYWNoKHNlcnZpY2UgPT4ge1xuICAgICAgICAgIGlmICghd2luZG93LkFQUFMuZmluZChhcHAgPT4gYXBwLmlkID09PSBzZXJ2aWNlLmlkKSkge1xuICAgICAgICAgICAgd2luZG93LkFQUFMucHVzaChzZXJ2aWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBsb2FkIGN1c3RvbSBzZXJ2aWNlczonLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2FkQ3VzdG9tU2VydmljZXMoKTtcblxuICAvLyA9PT09PSBXSU5ET1cgRVhQT1JUUyA9PT09PVxuXG4gIHdpbmRvdy5vcGVuQWRkU2VydmljZU1vZGFsID0gb3BlbkFkZFNlcnZpY2VNb2RhbDtcbiAgd2luZG93LmNsb3NlQWRkU2VydmljZU1vZGFsID0gY2xvc2VBZGRTZXJ2aWNlTW9kYWw7XG5cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IExJVkUgREFTSEJPQVJEIEVWRU5UUyAoU1NFKSA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGxldCBlcyA9IG51bGw7XG4gIGxldCByZWNvbm5lY3REZWxheSA9IDEwMDA7XG4gIGNvbnN0IE1BWF9SRUNPTk5FQ1QgPSAzMDAwMDtcbiAgbGV0IF9zc2VGYWlsQ291bnQgPSAwO1xuICBsZXQgX3NzZU1hbnVhbGx5Q2xvc2VkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gY29ubmVjdCgpIHtcbiAgICBpZiAoZXMpIHsgdHJ5IHsgZXMuY2xvc2UoKTsgfSBjYXRjaCAoXykge30gfVxuICAgIGlmIChfc3NlTWFudWFsbHlDbG9zZWQpIHJldHVybjsgLy8gYXV0aC1sb3N0OiBkb24ndCByZWNvbm5lY3RcblxuICAgIGVzID0gbmV3IEV2ZW50U291cmNlKCcvYXBpL3YxL2V2ZW50cy9zdHJlYW0nKTtcblxuICAgIGVzLmFkZEV2ZW50TGlzdGVuZXIoJ2Nvbm5lY3RlZCcsICgpID0+IHtcbiAgICAgIHJlY29ubmVjdERlbGF5ID0gMTAwMDsgLy8gcmVzZXQgYmFja29mZlxuICAgICAgX3NzZUZhaWxDb3VudCA9IDA7IC8vIHJlc2V0IGZhaWx1cmUgY291bnRlclxuICAgICAgZGVidWcoJ1tTU0VdIENvbm5lY3RlZCB0byBldmVudCBzdHJlYW0nKTtcbiAgICB9KTtcblxuICAgIC8vIEhlYWx0aCBzdGF0dXMgY2hhbmdlcyBcdTIxOTIgdXBkYXRlIGNhcmQgZG90cy9iYWRnZXMgaW4gcmVhbCB0aW1lXG4gICAgZXMuYWRkRXZlbnRMaXN0ZW5lcignc3RhdHVzLWNoYW5nZScsIChlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICBpZiAoZC5zZXJ2aWNlSWQgJiYgdHlwZW9mIHdpbmRvdy5zZXRCYWRnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnN0IHVwID0gZC5zdGF0dXMgPT09ICd1cCcgfHwgZC5zdGF0dXMgPT09ICdoZWFsdGh5JztcbiAgICAgICAgICB3aW5kb3cuc2V0QmFkZ2UoZC5zZXJ2aWNlSWQsIHVwLCBkLnJlc3BvbnNlVGltZSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIFJlc291cmNlIGFsZXJ0cyBcdTIxOTIgdG9hc3Qgbm90aWZpY2F0aW9uXG4gICAgZXMuYWRkRXZlbnRMaXN0ZW5lcigncmVzb3VyY2UtYWxlcnQnLCAoZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgY29uc3QgbXNnID0gYCR7ZC5jb250YWluZXJOYW1lIHx8IGQuY29udGFpbmVySWR9OiAke2QubWV0cmljfSBhdCAke2QudmFsdWV9JSAodGhyZXNob2xkOiAke2QudGhyZXNob2xkfSUpYDtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihtc2csICd3YXJuaW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfSk7XG5cbiAgICAvLyBDb250YWluZXIgYXV0by1yZXN0YXJ0XG4gICAgZXMuYWRkRXZlbnRMaXN0ZW5lcignYXV0by1yZXN0YXJ0JywgKGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGQgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oYENvbnRhaW5lciBcIiR7ZC5jb250YWluZXJOYW1lfVwiIHdhcyBhdXRvLXJlc3RhcnRlZGAsICdpbmZvJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgYXZhaWxhYmxlIFx1MjE5MiBzaG93IG5vdGlmaWNhdGlvbiBkb3Qgb24gVXBkYXRlcyBidXR0b25cbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCd1cGRhdGUtYXZhaWxhYmxlJywgKGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGQgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZXNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1idG4nKTtcbiAgICAgICAgaWYgKHVwZGF0ZXNCdG4gJiYgIXVwZGF0ZXNCdG4ucXVlcnlTZWxlY3RvcignLnNzZS1kb3QnKSkge1xuICAgICAgICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICBkb3QuY2xhc3NOYW1lID0gJ3NzZS1kb3QnO1xuICAgICAgICAgIGRvdC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjhweDtoZWlnaHQ6OHB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6dmFyKC0tYWNjZW50KTttYXJnaW4tbGVmdDo2cHg7dmVydGljYWwtYWxpZ246bWlkZGxlOyc7XG4gICAgICAgICAgdXBkYXRlc0J0bi5hcHBlbmRDaGlsZChkb3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oYFVwZGF0ZSBhdmFpbGFibGUgZm9yICR7ZC5jb250YWluZXJOYW1lIHx8IGQuY29udGFpbmVySWR9YCwgJ2luZm8nKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBzdGFydC9jb21wbGV0ZS9mYWlsZWRcbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCd1cGRhdGUtY29tcGxldGUnLCAoZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgVXBkYXRlIGNvbXBsZXRlZDogJHtkLmNvbnRhaW5lck5hbWUgfHwgZC5jb250YWluZXJJZH1gLCAnc3VjY2VzcycpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyaWdnZXIgYSBkYXNoYm9hcmQgcmVmcmVzaFxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5yZWZyZXNoQWxsID09PSAnZnVuY3Rpb24nKSB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIGVzLmFkZEV2ZW50TGlzdGVuZXIoJ3VwZGF0ZS1mYWlsZWQnLCAoZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgVXBkYXRlIGZhaWxlZDogJHtkLmNvbnRhaW5lck5hbWUgfHwgZC5jb250YWluZXJJZH0gXHUyMDE0ICR7ZC5lcnJvciB8fCAndW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfSk7XG5cbiAgICAvLyBJbmNpZGVudHNcbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCdpbmNpZGVudCcsIChlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpZiAoZC50eXBlID09PSAnY3JlYXRlZCcpIHtcbiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oYEluY2lkZW50OiAke2QubWVzc2FnZSB8fCBkLnNlcnZpY2VJZH1gLCAnZXJyb3InKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ3Jlc29sdmVkJykge1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVzb2x2ZWQ6ICR7ZC5zZXJ2aWNlSWQgfHwgJ2luY2lkZW50J31gLCAnc3VjY2VzcycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIFJlY29ubmVjdCBvbiBlcnJvclxuICAgIGVzLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICBlcy5jbG9zZSgpO1xuICAgICAgLy8gSWYgYXV0aCB3YXMgZXhwbGljaXRseSBsb3N0ICg0MDEvNDAzIGZyb20gdGhlIHBvbGxpbmcgbG9vcCksXG4gICAgICAvLyBkb24ndCBhdHRlbXB0IHJlY29ubmVjdGlvbiBhdCBhbGwuXG4gICAgICBpZiAod2luZG93Ll9kY0F1dGhMb3N0IHx8IF9zc2VNYW51YWxseUNsb3NlZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTU0VdIEF1dGggbG9zdCBcdTIwMTQgc3RvcHBpbmcgcmVjb25uZWN0aW9uJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFRyYW5zaWVudCBmYWlsdXJlczogcmV0cnkgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmLCBzdG9wIGFmdGVyIDVcbiAgICAgIF9zc2VGYWlsQ291bnQrKztcbiAgICAgIGlmIChfc3NlRmFpbENvdW50ID4gNSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTU0VdIE1heCByZWNvbm5lY3QgYXR0ZW1wdHMgcmVhY2hlZCBcdTIwMTQgc3RvcHBpbmcgKHNlcnZlciB1bnJlYWNoYWJsZSknKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKGBbU1NFXSBEaXNjb25uZWN0ZWQsIHJlY29ubmVjdGluZyBpbiAke3JlY29ubmVjdERlbGF5IC8gMTAwMH1zLi4uYCk7XG4gICAgICBzZXRUaW1lb3V0KGNvbm5lY3QsIHJlY29ubmVjdERlbGF5KTtcbiAgICAgIHJlY29ubmVjdERlbGF5ID0gTWF0aC5taW4ocmVjb25uZWN0RGVsYXkgKiAyLCBNQVhfUkVDT05ORUNUKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbGVkIGJ5IGdyaWQuanMgd2hlbiB0aGUgcG9sbGluZyBsb29wIGRldGVjdHMgYXV0aCBsb3NzICg0MDEvNDAzKVxuICBmdW5jdGlvbiBjbG9zZUFuZFN0b3AoKSB7XG4gICAgX3NzZU1hbnVhbGx5Q2xvc2VkID0gdHJ1ZTtcbiAgICBpZiAoZXMpIHsgdHJ5IHsgZXMuY2xvc2UoKTsgfSBjYXRjaCAoXykge30gfVxuICB9XG5cbiAgLy8gQ2FsbGVkIGJ5IHRvdHAtYXV0aC5qcyBhZnRlciBhIHN1Y2Nlc3NmdWwgbWlkLXNlc3Npb24gcmUtYXV0aDpcbiAgLy8gY2xlYXJzIHRoZSBsYXRjaCBzbyBjb25uZWN0KCkgY2FuIHByb2NlZWQgYWdhaW4gYW5kIHJlc2V0cyB0aGVcbiAgLy8gZmFpbHVyZSBiYWNrb2ZmLiAoUGxhaW4gX3NzZVJlY29ubmVjdC9jb25uZWN0KCkgd291bGQgZWFybHktcmV0dXJuXG4gIC8vIG9uIHRoZSBsYXRjaCBmb3JldmVyIFx1MjAxNCB0aGUgdXNlciB3b3VsZCBuZWVkIGEgbWFudWFsIEY1LilcbiAgZnVuY3Rpb24gcmVzdW1lQWZ0ZXJSZWF1dGgoKSB7XG4gICAgX3NzZU1hbnVhbGx5Q2xvc2VkID0gZmFsc2U7XG4gICAgX3NzZUZhaWxDb3VudCA9IDA7XG4gICAgcmVjb25uZWN0RGVsYXkgPSAxMDAwO1xuICAgIGNvbm5lY3QoKTtcbiAgfVxuXG4gIC8vIFN0YXJ0IG9uIHBhZ2UgbG9hZFxuICBjb25uZWN0KCk7XG5cbiAgLy8gRXhwb3NlIGZvciBkZWJ1Z2dpbmcgYW5kIGNyb3NzLW1vZHVsZSBjb29yZGluYXRpb25cbiAgd2luZG93Ll9zc2VSZWNvbm5lY3QgPSBjb25uZWN0O1xuICB3aW5kb3cuX3NzZUNsb3NlID0gY2xvc2VBbmRTdG9wO1xuICB3aW5kb3cuX3NzZVJlc3VtZSA9IHJlc3VtZUFmdGVyUmVhdXRoO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gU0VSVklDRSBGSUxURVIgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICBjb25zdCBzZWFyY2hJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWZpbHRlci1zZWFyY2gnKTtcbiAgY29uc3Qgc3RhdHVzU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZmlsdGVyLXN0YXR1cycpO1xuICBjb25zdCBjYXRlZ29yeVNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWZpbHRlci1jYXRlZ29yeScpO1xuICBjb25zdCBjb3VudFNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1maWx0ZXItY291bnQnKTtcblxuICAvLyBCdWlsZCBhIHNpbmdsZSBjYXRlZ29yeSBsaXN0IGZyb20gYm90aCB0aGUgQVBJIGNhdGVnb3JpZXMgYW5kIGFueVxuICAvLyBjYXRlZ29yaWVzIHByZXNlbnQgb24gdGhlIGFjdHVhbCByZW5kZXJlZCBjYXJkcyAoY292ZXJzIGN1c3RvbSBzZXJ2aWNlc1xuICAvLyB3aG9zZSBjYXRlZ29yeSBpc24ndCBpbiBURU1QTEFURV9DQVRFR09SSUVTKS5cbiAgZnVuY3Rpb24gZ2V0Q2F0ZWdvcnlMaXN0KCkge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgZnJvbUNhcmRzID0gbmV3IFNldCgpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjYXJkcyAuY2FyZFtkYXRhLWNhdGVnb3J5XScpLmZvckVhY2goYyA9PiB7XG4gICAgICBjb25zdCBjYXQgPSBjLmRhdGFzZXQuY2F0ZWdvcnkudHJpbSgpO1xuICAgICAgaWYgKGNhdCkgZnJvbUNhcmRzLmFkZChjYXQpO1xuICAgIH0pO1xuICAgIGNvbnN0IGFwaUNhdHMgPSAod2luZG93LkRDX0NBVEVHT1JJRVMgfHwgKHR5cGVvZiBEQyAhPT0gJ3VuZGVmaW5lZCcgJiYgREMuQ0FURUdPUklFUykpIHx8IHt9O1xuICAgIGNvbnN0IGFsbCA9IE9iamVjdC5rZXlzKGFwaUNhdHMpLmNvbmNhdChbLi4uZnJvbUNhcmRzXS5maWx0ZXIoYyA9PiAhYXBpQ2F0c1tjXSkpO1xuICAgIGFsbC5mb3JFYWNoKGMgPT4gc2Vlbi5hZGQoYykpO1xuICAgIHJldHVybiB7IGxpc3Q6IFsuLi5zZWVuXSwgYXBpQ2F0cyB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVmcmVzaENhdGVnb3J5RHJvcGRvd24oKSB7XG4gICAgaWYgKCFjYXRlZ29yeVNlbGVjdCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgbGlzdCwgYXBpQ2F0cyB9ID0gZ2V0Q2F0ZWdvcnlMaXN0KCk7XG4gICAgY29uc3QgY3VycmVudCA9IGNhdGVnb3J5U2VsZWN0LnZhbHVlO1xuICAgIGNhdGVnb3J5U2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiYWxsXCI+QWxsIENhdGVnb3JpZXM8L29wdGlvbj4nO1xuICAgIGxpc3Quc29ydCgpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICBjb25zdCBpbmZvID0gYXBpQ2F0c1tuYW1lXTtcbiAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgb3B0LnZhbHVlID0gbmFtZTtcbiAgICAgIG9wdC50ZXh0Q29udGVudCA9IGluZm8gPyBgJHtpbmZvLmljb24gfHwgJyd9ICR7bmFtZX1gLnRyaW0oKSA6IG5hbWU7XG4gICAgICBjYXRlZ29yeVNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgIH0pO1xuICAgIC8vIFJlc3RvcmUgc2VsZWN0aW9uIGlmIGl0IHN0aWxsIGV4aXN0c1xuICAgIGlmIChjdXJyZW50ICYmIFsuLi5jYXRlZ29yeVNlbGVjdC5vcHRpb25zXS5zb21lKG8gPT4gby52YWx1ZSA9PT0gY3VycmVudCkpIHtcbiAgICAgIGNhdGVnb3J5U2VsZWN0LnZhbHVlID0gY3VycmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgY2F0ZWdvcnlTZWxlY3QudmFsdWUgPSAnYWxsJztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGaWx0ZXIoKSB7XG4gICAgcmVmcmVzaENhdGVnb3J5RHJvcGRvd24oKTtcbiAgICBjb25zdCBxdWVyeSA9IHNlYXJjaElucHV0LnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IHN0YXR1c0ZpbHRlciA9IHN0YXR1c1NlbGVjdC52YWx1ZTsgLy8gJ2FsbCcsICdvbicsIG9yICdvZmYnXG4gICAgY29uc3QgY2F0ZWdvcnlGaWx0ZXIgPSBjYXRlZ29yeVNlbGVjdCA/IGNhdGVnb3J5U2VsZWN0LnZhbHVlIDogJ2FsbCc7XG5cbiAgICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjYXJkcyAuY2FyZCcpO1xuICAgIGxldCB2aXNpYmxlQ291bnQgPSAwO1xuXG4gICAgY2FyZHMuZm9yRWFjaChjYXJkID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5uYW1lJyk/LnRleHRDb250ZW50Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgY29uc3QgYXBwID0gY2FyZC5kYXRhc2V0LmFwcD8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGNhcmQuZGF0YXNldC5zdGF0dXMgfHwgJ29mZic7IC8vICdvbicgb3IgJ29mZidcbiAgICAgIGNvbnN0IGNhdGVnb3J5ID0gY2FyZC5kYXRhc2V0LmNhdGVnb3J5IHx8ICcnO1xuXG4gICAgICBjb25zdCBtYXRjaGVzU2VhcmNoID0gIXF1ZXJ5IHx8IG5hbWUuaW5jbHVkZXMocXVlcnkpIHx8IGFwcC5pbmNsdWRlcyhxdWVyeSk7XG4gICAgICBjb25zdCBtYXRjaGVzU3RhdHVzID0gc3RhdHVzRmlsdGVyID09PSAnYWxsJyB8fCBzdGF0dXMgPT09IHN0YXR1c0ZpbHRlcjtcbiAgICAgIGNvbnN0IG1hdGNoZXNDYXRlZ29yeSA9IGNhdGVnb3J5RmlsdGVyID09PSAnYWxsJyB8fCBjYXRlZ29yeSA9PT0gY2F0ZWdvcnlGaWx0ZXI7XG5cbiAgICAgIGlmIChtYXRjaGVzU2VhcmNoICYmIG1hdGNoZXNTdGF0dXMgJiYgbWF0Y2hlc0NhdGVnb3J5KSB7XG4gICAgICAgIGNhcmQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICB2aXNpYmxlQ291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhcmQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChjb3VudFNwYW4pIHtcbiAgICAgIGNvbnN0IHRvdGFsID0gY2FyZHMubGVuZ3RoO1xuICAgICAgY291bnRTcGFuLnRleHRDb250ZW50ID0gYCR7dmlzaWJsZUNvdW50fSBvZiAke3RvdGFsfSBzZXJ2aWNlc2A7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVib3VuY2UgaGVscGVyXG4gIGZ1bmN0aW9uIGRlYm91bmNlKGZuLCBkZWxheSkge1xuICAgIGxldCB0aW1lb3V0O1xuICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBmbi5hcHBseSh0aGlzLCBhcmdzKSwgZGVsYXkpO1xuICAgIH07XG4gIH1cblxuICBzZWFyY2hJbnB1dD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBkZWJvdW5jZSh1cGRhdGVGaWx0ZXIsIDIwMCkpO1xuICBzdGF0dXNTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZUZpbHRlcik7XG4gIGNhdGVnb3J5U2VsZWN0Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB1cGRhdGVGaWx0ZXIpO1xuXG4gIC8vIEluaXRpYWwgY291bnQgb24gcGFnZSBsb2FkXG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gc2V0VGltZW91dCh1cGRhdGVGaWx0ZXIsIDUwMCkpO1xuICB9IGVsc2Uge1xuICAgIHNldFRpbWVvdXQodXBkYXRlRmlsdGVyLCA1MDApO1xuICB9XG5cbiAgLy8gRXhwb3NlIGZvciBleHRlcm5hbCB0cmlnZ2VycyAoY2FsbGVkIGFmdGVyIGJ1aWxkR3JpZCB0byByZXBvcHVsYXRlIGNhdGVnb3JpZXMpXG4gIHdpbmRvdy5yZWZyZXNoU2VydmljZUZpbHRlciA9IHVwZGF0ZUZpbHRlcjtcbiAgd2luZG93LnJlZnJlc2hDYXRlZ29yeURyb3Bkb3duID0gcmVmcmVzaENhdGVnb3J5RHJvcGRvd247XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBCQVRDSCBDT05UQUlORVIgT1BFUkFUSU9OUyA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGJhdGNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLW9wZXJhdGlvbnMtYnRuJyk7XG4gIGNvbnN0IGJhdGNoQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLWFjdGlvbi1iYXInKTtcbiAgY29uc3QgYmF0Y2hDb3VudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXRjaC1zZWxlY3RlZC1jb3VudCcpO1xuICBjb25zdCBzdGFydEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXRjaC1zdGFydC1idG4nKTtcbiAgY29uc3Qgc3RvcEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXRjaC1zdG9wLWJ0bicpO1xuICBjb25zdCByZXN0YXJ0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLXJlc3RhcnQtYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYXRjaC1jYW5jZWwtYnRuJyk7XG5cbiAgbGV0IGJhdGNoTW9kZSA9IGZhbHNlO1xuICBsZXQgc2VsZWN0ZWRDb250YWluZXJzID0gbmV3IFNldCgpO1xuXG4gIGZ1bmN0aW9uIGVudGVyQmF0Y2hNb2RlKCkge1xuICAgIGJhdGNoTW9kZSA9IHRydWU7XG4gICAgc2VsZWN0ZWRDb250YWluZXJzLmNsZWFyKCk7XG4gICAgYmF0Y2hCYXIuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGJhdGNoQnRuLnRleHRDb250ZW50ID0gJ1x1MjcxMyBFeGl0IEJhdGNoIE1vZGUnO1xuICAgIHVwZGF0ZVNlbGVjdGVkQ291bnQoKTtcbiAgICBcbiAgICAvLyBBZGQgY2hlY2tib3hlcyB0byBhbGwgY2FyZHMgd2l0aCBjb250YWluZXJJZFxuICAgIGNvbnN0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NhcmRzIC5jYXJkW2RhdGEtYXBwXScpO1xuICAgIGNhcmRzLmZvckVhY2goY2FyZCA9PiB7XG4gICAgICBjb25zdCBjb250YWluZXJJZCA9IGNhcmQuZGF0YXNldC5jb250YWluZXJJZDtcbiAgICAgIGlmICghY29udGFpbmVySWQpIHJldHVybjtcbiAgICAgIFxuICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIGNoZWNrYm94IGlmIGFueVxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5iYXRjaC1jaGVja2JveCcpO1xuICAgICAgaWYgKGV4aXN0aW5nKSBleGlzdGluZy5yZW1vdmUoKTtcbiAgICAgIFxuICAgICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgY2hlY2tib3gudHlwZSA9ICdjaGVja2JveCc7XG4gICAgICBjaGVja2JveC5jbGFzc05hbWUgPSAnYmF0Y2gtY2hlY2tib3gnO1xuICAgICAgY2hlY2tib3guZGF0YXNldC5jb250YWluZXJJZCA9IGNvbnRhaW5lcklkO1xuICAgICAgY2hlY2tib3guZGF0YXNldC5zZXJ2aWNlTmFtZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLm5hbWUnKT8udGV4dENvbnRlbnQgfHwgY29udGFpbmVySWQ7XG4gICAgICBjaGVja2JveC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA4cHg7IGxlZnQ6IDhweDsgei1pbmRleDogMTA7IHdpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7IGN1cnNvcjogcG9pbnRlcjsnO1xuICAgICAgY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICAgICAgICBzZWxlY3RlZENvbnRhaW5lcnMuYWRkKGNvbnRhaW5lcklkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3RlZENvbnRhaW5lcnMuZGVsZXRlKGNvbnRhaW5lcklkKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVTZWxlY3RlZENvdW50KCk7XG4gICAgICB9KTtcbiAgICAgIGNhcmQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgY2FyZC5pbnNlcnRCZWZvcmUoY2hlY2tib3gsIGNhcmQuZmlyc3RDaGlsZCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBleGl0QmF0Y2hNb2RlKCkge1xuICAgIGJhdGNoTW9kZSA9IGZhbHNlO1xuICAgIHNlbGVjdGVkQ29udGFpbmVycy5jbGVhcigpO1xuICAgIGJhdGNoQmFyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgYmF0Y2hCdG4udGV4dENvbnRlbnQgPSAnXHUyNjMwIEJhdGNoIE9wZXJhdGlvbnMnO1xuICAgIFxuICAgIC8vIFJlbW92ZSBhbGwgY2hlY2tib3hlc1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5iYXRjaC1jaGVja2JveCcpLmZvckVhY2goY2IgPT4gY2IucmVtb3ZlKCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2VsZWN0ZWRDb3VudCgpIHtcbiAgICBjb25zdCBjb3VudCA9IHNlbGVjdGVkQ29udGFpbmVycy5zaXplO1xuICAgIGJhdGNoQ291bnQudGV4dENvbnRlbnQgPSBgJHtjb3VudH0gc2VsZWN0ZWRgO1xuICAgIHN0YXJ0QnRuLmRpc2FibGVkID0gY291bnQgPT09IDA7XG4gICAgc3RvcEJ0bi5kaXNhYmxlZCA9IGNvdW50ID09PSAwO1xuICAgIHJlc3RhcnRCdG4uZGlzYWJsZWQgPSBjb3VudCA9PT0gMDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGJhdGNoQWN0aW9uKGFjdGlvbikge1xuICAgIGlmIChzZWxlY3RlZENvbnRhaW5lcnMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBBcnJheS5mcm9tKHNlbGVjdGVkQ29udGFpbmVycyk7XG4gICAgY29uc3QgYWN0aW9uTGFiZWwgPSB7IHN0YXJ0OiAnU3RhcnRpbmcnLCBzdG9wOiAnU3RvcHBpbmcnLCByZXN0YXJ0OiAnUmVzdGFydGluZycgfVthY3Rpb25dO1xuICAgIFxuICAgIGlmICghY29uZmlybShgJHthY3Rpb25MYWJlbH0gJHtjb250YWluZXJzLmxlbmd0aH0gY29udGFpbmVyKHMpPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCkpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCBidG5zID0gW3N0YXJ0QnRuLCBzdG9wQnRuLCByZXN0YXJ0QnRuXTtcbiAgICBidG5zLmZvckVhY2goYiA9PiB7IGIuZGlzYWJsZWQgPSB0cnVlOyBiLnRleHRDb250ZW50ID0gJy4uLic7IH0pO1xuICAgIFxuICAgIGxldCBzdWNjZXNzID0gMDtcbiAgICBsZXQgZmFpbGVkID0gMDtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGNvbnRhaW5lcklkIG9mIGNvbnRhaW5lcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2NvbnRhaW5lcnMvJHtlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVySWQpfS8ke2FjdGlvbn1gLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXMub2spIHtcbiAgICAgICAgICBzdWNjZXNzKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmFpbGVkKys7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYCR7Y29udGFpbmVySWR9OiAke2RhdGEuZXJyb3IgfHwgcmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZmFpbGVkKys7XG4gICAgICAgIGVycm9ycy5wdXNoKGAke2NvbnRhaW5lcklkfTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc3RvcmUgYnV0dG9uc1xuICAgIGJ0bnNbMF0udGV4dENvbnRlbnQgPSAnXHUyNUI2IFN0YXJ0IEFsbCc7XG4gICAgYnRuc1sxXS50ZXh0Q29udGVudCA9ICdcdTJCMUIgU3RvcCBBbGwnO1xuICAgIGJ0bnNbMl0udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDA0IFJlc3RhcnQgQWxsJztcbiAgICB1cGRhdGVTZWxlY3RlZENvdW50KCk7XG4gICAgXG4gICAgLy8gU2hvdyByZXN1bHRzXG4gICAgaWYgKGZhaWxlZCA9PT0gMCkge1xuICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYCR7YWN0aW9uTGFiZWx9IGNvbXBsZXRlZDogJHtzdWNjZXNzfSBjb250YWluZXIocylgLCAnc3VjY2VzcycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHthY3Rpb25MYWJlbH06ICR7c3VjY2Vzc30gc3VjY2VlZGVkLCAke2ZhaWxlZH0gZmFpbGVkYCwgJ3dhcm5pbmcnKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0JhdGNoIG9wZXJhdGlvbiBlcnJvcnM6JywgZXJyb3JzKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUmVmcmVzaCBkYXNoYm9hcmQgYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiByZWZyZXNoQWxsID09PSAnZnVuY3Rpb24nKSByZWZyZXNoQWxsKCk7XG4gICAgfSwgMTUwMCk7XG4gIH1cblxuICBiYXRjaEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKGJhdGNoTW9kZSkge1xuICAgICAgZXhpdEJhdGNoTW9kZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlckJhdGNoTW9kZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgc3RhcnRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gYmF0Y2hBY3Rpb24oJ3N0YXJ0JykpO1xuICBzdG9wQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGJhdGNoQWN0aW9uKCdzdG9wJykpO1xuICByZXN0YXJ0QnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGJhdGNoQWN0aW9uKCdyZXN0YXJ0JykpO1xuICBjYW5jZWxCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXhpdEJhdGNoTW9kZSk7XG59KSgpO1xuIl0sCiAgIm1hcHBpbmdzIjogIkNBS0MsU0FBU0EsRUFBUSxDQUNoQixhQUVBLE1BQU1DLENBQWEsQ0FDakIsYUFBYyxDQUNaLEtBQUssT0FBUyxDQUFDLEVBQ2YsS0FBSyxVQUFZLEVBQ25CLENBUUEsU0FBU0MsRUFBU0MsRUFBT0MsRUFBVyxDQUFDLEVBQUcsQ0FDdEMsTUFBTUMsRUFBYSxDQUNqQixVQUFXLElBQUksS0FBSyxFQUFFLFlBQVksRUFDbEMsUUFBQUgsRUFDQSxRQUFTQyxhQUFpQixNQUFRQSxFQUFNLFFBQVVBLEVBQ2xELE1BQU9BLGFBQWlCLE1BQVFBLEVBQU0sTUFBUSxLQUM5QyxTQUFBQyxDQUNGLEVBR0EsS0FBSyxPQUFPLEtBQUtDLENBQVUsRUFHdkIsS0FBSyxPQUFPLE9BQVMsS0FBSyxXQUM1QixLQUFLLE9BQU8sTUFBTSxFQUlwQixRQUFRLE1BQU0sc0JBQXNCSCxDQUFPLElBQUtDLEVBQU9DLENBQVEsQ0FJakUsQ0FRQSxpQkFBaUJELEVBQU9HLEVBQWEsQ0FHbkMsT0FGa0IsS0FBSyxjQUFjSCxDQUFLLEVBRXZCLENBQ2pCLElBQUssb0JBQ0gsWUFBSyxTQUFTLG9CQUFxQkEsRUFBTyxDQUFFLFlBQUFHLENBQVksQ0FBQyxFQUNsRCxDQUNMLE9BQVEsWUFDUixTQUFVQSxFQUFjLEVBQ3hCLFFBQVMsaURBQ1gsRUFFRixJQUFLLHNCQUNILFlBQUssU0FBUyxzQkFBdUJILENBQUssRUFDbkMsQ0FDTCxPQUFRLHFCQUNSLFFBQVMsb0RBQ1gsRUFFRixJQUFLLG9CQUNILFlBQUssU0FBUyx1QkFBd0JBLENBQUssRUFDcEMsQ0FDTCxPQUFRLGFBQ1IsUUFBUyxpREFDWCxFQUVGLElBQUssa0JBQ0gsWUFBSyxTQUFTLGdDQUFpQ0EsRUFBTyxDQUFFLFlBQUFHLENBQVksQ0FBQyxFQUM5RCxDQUNMLE9BQVEsWUFDUixTQUFVQSxFQUFjLEVBQ3hCLFFBQVMseUNBQ1gsRUFFRixJQUFLLHlCQUNILFlBQUssU0FBUyx5QkFBMEJILENBQUssRUFDdEMsQ0FDTCxPQUFRLG9CQUNSLFFBQVMsMEJBQ1gsRUFFRixRQUNFLFlBQUssU0FBUyxnQkFBaUJBLEVBQU8sQ0FBRSxZQUFBRyxDQUFZLENBQUMsRUFDOUMsQ0FDTCxPQUFRLGFBQ1IsUUFBUywwQ0FDWCxDQUNKLENBQ0YsQ0FRQSxjQUFjSCxFQUFPLENBQ25CLE1BQU1JLEVBQVVKLEVBQU0sU0FBV0EsRUFBTSxTQUFTLEVBRWhELE9BQUlJLEVBQVEsU0FBUyxTQUFTLEdBQUtBLEVBQVEsU0FBUyxXQUFXLEVBQ3RELG9CQUVMQSxFQUFRLFNBQVMsU0FBUyxHQUFLQSxFQUFRLFNBQVMsT0FBTyxFQUNsRCxzQkFFTEEsRUFBUSxTQUFTLFFBQVEsR0FBS0EsRUFBUSxTQUFTLFdBQVcsRUFDckQsb0JBRUxBLEVBQVEsU0FBUyxTQUFTLEdBQUtBLEVBQVEsU0FBUyxZQUFZLEVBQ3ZELGtCQUVMQSxFQUFRLFNBQVMsT0FBTyxFQUNuQix5QkFHRixTQUNULENBTUEsV0FBWSxDQUNWLE1BQU8sQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUN4QixDQUtBLGFBQWMsQ0FDWixLQUFLLE9BQVMsQ0FBQyxDQUNqQixDQU1BLGVBQWdCLENBQ2QsTUFBTUMsRUFBUSxDQUNaLE1BQU8sS0FBSyxPQUFPLE9BQ25CLFVBQVcsQ0FBQyxFQUNaLE9BQVEsQ0FBQyxFQUNULE9BQVEsS0FBSyxPQUFPLE1BQU0sR0FBRyxDQUMvQixFQUVBLFlBQUssT0FBTyxRQUFRTCxHQUFTLENBRTNCSyxFQUFNLFVBQVVMLEVBQU0sT0FBTyxHQUFLSyxFQUFNLFVBQVVMLEVBQU0sT0FBTyxHQUFLLEdBQUssRUFHekUsTUFBTU0sRUFBTyxLQUFLLGNBQWMsQ0FBRSxRQUFTTixFQUFNLE9BQVEsQ0FBQyxFQUMxREssRUFBTSxPQUFPQyxDQUFJLEdBQUtELEVBQU0sT0FBT0MsQ0FBSSxHQUFLLEdBQUssQ0FDbkQsQ0FBQyxFQUVNRCxDQUNULENBTUEseUJBQTBCLENBQ3hCLEtBQUssU0FBUyx5QkFBMEIsa0NBQWtDLEVBRzFFLE1BQU1FLEVBQWtCLFNBQVMsY0FBYyxLQUFLLEVBQ3BELE9BQUFBLEVBQWdCLEdBQUssc0JBQ3JCQSxFQUFnQixNQUFNLFFBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFhaENBLEVBQWdCLFVBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFRNUIsU0FBUyxLQUFLLFlBQVlBLENBQWUsRUFHekMsV0FBVyxJQUFNLENBQ1hBLEVBQWdCLFlBQ2xCQSxFQUFnQixXQUFXLFlBQVlBLENBQWUsQ0FFMUQsRUFBRyxHQUFLLEVBRUQsRUFDVCxDQU1BLDBCQUEyQixDQUN6QixLQUFLLFNBQVMsc0JBQXVCLGdDQUFnQyxFQUdyRSxNQUFNQyxFQUFnQixDQUNwQixLQUFNLENBQUMsRUFDUCxRQUFRQyxFQUFLLENBQ1gsT0FBTyxLQUFLLEtBQUtBLENBQUcsR0FBSyxJQUMzQixFQUNBLFFBQVFBLEVBQUtDLEVBQU8sQ0FDbEIsS0FBSyxLQUFLRCxDQUFHLEVBQUlDLENBQ25CLEVBQ0EsV0FBV0QsRUFBSyxDQUNkLE9BQU8sS0FBSyxLQUFLQSxDQUFHLENBQ3RCLEVBQ0EsT0FBUSxDQUNOLEtBQUssS0FBTyxDQUFDLENBQ2YsQ0FDRixFQUVBLGVBQVEsS0FBSyxvRUFBb0UsRUFDMUVELENBQ1QsQ0FPQSxvQkFBb0JOLEVBQVksQ0FTaEMsQ0FDRixDQUVBTCxFQUFPLGFBQWVDLEVBQ3RCLFFBQVEsSUFBSSw4QkFBOEIsQ0FFNUMsR0FBRyxNQUFNLEdBUVIsVUFBc0MsQ0FDckMsR0FBSSxDQUNGLElBQUlhLEVBQU8sT0FBTyxhQUFpQixLQUFlLGFBQWEsUUFBUSwyQkFBMkIsR0FBTSxLQUN4RyxHQUFJQSxFQUFLLENBQ1AsSUFBSUMsRUFBSSxLQUFLLE1BQU1ELENBQUcsRUFFbEJDLEVBQUUsc0JBQXdCQSxFQUFFLHNCQUF3QixHQUFLQSxFQUFFLHNCQUF3QixPQUNyRixPQUFPLG9CQUFzQkEsRUFBRSxxQkFBdUIsSUFFMUQsQ0FDRixNQUFZLENBQTZDLENBQzNELEdBQUcsRUFFSCxNQUFNLEdBQUssQ0FDVCxLQUFNLFlBQ04sS0FBTSxDQUNKLFVBQVksSUFDWixLQUFZLElBQ1osTUFBYSxPQUFPLE9BQVcsS0FBZSxPQUFPLHFCQUF3QixJQUM3RSxRQUFZLElBQ1osU0FBWSxJQUNaLE9BQVksSUFDWixXQUFZLEdBQ2QsRUFDQSxPQUFRLENBQ04sVUFBWSxJQUNaLE9BQVksSUFDWixZQUFhLElBQ2IsV0FBWSxJQUNaLFlBQWEsR0FDZixFQUNBLFNBQVUsQ0FDUixTQUFhLE9BQ2IsYUFBYyxPQUNkLElBQWEsSUFDYixVQUFhLHNCQUNmLENBQ0YsRUFHTSxhQUFlLElBQUksYUFJbkIsV0FBYSxLQUFLLE1BQU0sYUFBYSxRQUFRLHVCQUF1QixHQUFLLE1BQU0sRUFDL0UsS0FBTyxDQUNYLElBQU0sWUFBYyxXQUFXLEtBQVEsUUFDdkMsTUFBTyxHQUNQLFFBQVMsR0FBRyxTQUFTLFNBQ3JCLFdBQVksQ0FBQyxFQUNiLGtCQUFvQixZQUFjLFdBQVcsbUJBQXNCLFVBQ25FLE9BQVMsWUFBYyxXQUFXLFFBQVcsR0FDN0MsU0FBVyxZQUFjLFdBQVcsVUFBYSxDQUFDLEVBQ2xELFlBQWMsWUFBYyxXQUFXLGFBQWdCLFlBQ3ZELG9CQUFxQixFQUN2QixFQUNBLE9BQU8sNkJBQStCLGdCQUFnQyxDQUNwRSxHQUFJLENBQ0YsTUFBTUMsRUFBSSxNQUFNLE1BQU0sZ0JBQWdCLEVBQ3RDLEdBQUlBLEVBQUUsR0FBSSxDQUNSLE1BQU1DLEVBQUksTUFBTUQsRUFBRSxLQUFLLEVBTXZCLEdBTElDLEVBQUUsTUFBSyxLQUFLLElBQU1BLEVBQUUsSUFBSSxXQUFXLEdBQUcsRUFBSUEsRUFBRSxJQUFNLElBQU1BLEVBQUUsS0FDMURBLEVBQUUsTUFDSixLQUFLLE1BQVFBLEVBQUUsSUFBSSxJQUFNLEdBQ3pCLEtBQUssUUFBVUEsRUFBRSxJQUFJLE1BQVEsR0FBRyxTQUFTLFVBRXZDQSxFQUFFLFlBQWMsT0FBT0EsRUFBRSxZQUFlLFNBQzFDLFNBQVcsQ0FBQ0MsRUFBR0MsQ0FBQyxJQUFLLE9BQU8sUUFBUUYsRUFBRSxVQUFVLEVBQzFDQyxJQUFNLGFBQWVBLElBQU0sZUFBaUJBLElBQU0sY0FBYSxLQUFLLFdBQVdBLENBQUMsRUFBSUMsR0FHeEZGLEVBQUUsb0JBQW1CLEtBQUssa0JBQW9CQSxFQUFFLG1CQUNoREEsRUFBRSxTQUFRLEtBQUssT0FBU0EsRUFBRSxRQUMxQkEsRUFBRSxXQUFVLEtBQUssU0FBV0EsRUFBRSxVQUM5QkEsRUFBRSxjQUFhLEtBQUssWUFBY0EsRUFBRSxhQUN4QyxLQUFLLG9CQUFzQkEsRUFBRSxzQkFBd0IsR0FHckQsYUFBYSxRQUFRLHdCQUF5QixLQUFLLFVBQVUsQ0FDM0QsSUFBSyxLQUFLLElBQUssa0JBQW1CLEtBQUssa0JBQ3ZDLE9BQVEsS0FBSyxPQUFRLFlBQWEsS0FBSyxXQUN6QyxDQUFDLENBQUMsRUFFRixlQUFlLEVBRWYsTUFBTUcsRUFBWSxTQUFTLGVBQWUsZUFBZSxFQUNyREEsSUFBV0EsRUFBVSxNQUFNLFFBQVUsT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFLE9BQVMsR0FBSyxPQUN0RixDQUNGLE1BQVksQ0FBQyxDQUViLFNBQVMsaUJBQWlCLFlBQVksRUFBRSxRQUFRQyxHQUFNQSxFQUFHLFlBQWMsS0FBSyxHQUFHLEVBQy9FLE1BQU1DLEVBQVksU0FBUyxlQUFlLGlCQUFpQixFQUN2REEsSUFBV0EsRUFBVSxZQUFjLEtBQUssS0FDNUMsTUFBTUMsRUFBZSxTQUFTLGVBQWUsbUJBQW1CLEVBQzVEQSxHQUFnQixLQUFLLFFBQVNBLEVBQWEsTUFBUSxLQUFLLE1BQU9BLEVBQWEsWUFBYyxLQUFLLE1BQ3JHLEdBQUcsRUFDSCxTQUFTLFlBQVlDLEVBQUssQ0FBRSxPQUFPQSxFQUFNLEtBQUssR0FBSyxDQUNuRCxTQUFTLGdCQUFnQkEsRUFBSyxDQUM1QixPQUFJLEtBQUssY0FBZ0IsZ0JBQWtCLEtBQUssT0FBZSxXQUFhLEtBQUssT0FBUyxJQUFNQSxFQUM1RixLQUFLLG9CQUFzQixVQUFZLEtBQUssT0FBZSxXQUFhQSxFQUFNLElBQU0sS0FBSyxPQUN0RixXQUFhLFlBQVlBLENBQUcsQ0FDckMsQ0FDQSxTQUFTLGlCQUFpQkMsRUFBTyxDQUMvQixNQUFNVixFQUFJLEtBQUssV0FBV1UsQ0FBSyxFQUMvQixPQUFPVixFQUFJLEdBQUdBLEVBQUUsRUFBRSxJQUFJQSxFQUFFLElBQUksR0FBSyxZQUFZVSxDQUFLLENBQ3BELENBRUEsU0FBUyxpQkFBa0IsQ0FDekIsR0FBSSxDQUFDLEtBQUssTUFBTyxPQUFPLEtBQ3hCLFNBQVcsQ0FBQ0MsRUFBSUMsQ0FBSSxJQUFLLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFDckQsR0FBSUEsRUFBSyxLQUFPLEtBQUssTUFBTyxPQUFPRCxFQUVyQyxPQUFPLElBQ1QsQ0FHQSxTQUFTLGdCQUFpQixDQUN4QixNQUFNRSxFQUFTLFNBQVMsY0FBYyxNQUFNLEVBQzVDLEdBQUksQ0FBQ0EsRUFBUSxPQUNiLE1BQU1DLEVBQVMsT0FBTyxLQUFLLEtBQUssVUFBVSxFQUMxQyxHQUFJLENBQUNBLEVBQU8sT0FBUSxPQUVwQixNQUFNQyxFQUFVLGlnQkFVVkMsRUFBYUgsRUFBTyxrQkFDMUJDLEVBQU8sUUFBUUgsR0FBTSxDQUNuQixNQUFNTSxFQUFTLFdBQVdOLENBQUUsRUFDdEJPLEVBQVEsWUFBWSxLQUFLLFdBQVdQLENBQUUsRUFBRSxNQUFRQSxHQUFJLFlBQVksQ0FBQyxFQUNqRVEsRUFBTyxTQUFTLGNBQWMsS0FBSyxFQUN6Q0EsRUFBSyxVQUFZLE9BQ2pCQSxFQUFLLGFBQWEsV0FBWVIsQ0FBRSxFQUNoQ1EsRUFBSyxhQUFhLGNBQWUsS0FBSyxFQUN0Q0EsRUFBSyxVQUNILGFBQWFGLENBQU0sOEVBQzBCRixDQUFPLDRCQUM1QkcsQ0FBSyxnREFDZEQsQ0FBTSwrR0FDb0JBLENBQU0sa0ZBQ1BBLENBQU0sc0JBQXNCQSxDQUFNLGdHQUFnR0EsQ0FBTSwwRUFFL0pBLENBQU0sd0ZBQ05BLENBQU0sMEZBQ05BLENBQU0sMkRBQ05BLENBQU0sNEVBQ05BLENBQU0sOERBRXpCSixFQUFPLGFBQWFNLEVBQU1ILENBQVUsQ0FDdEMsQ0FBQyxFQUNHLE9BQU8sUUFBVSxPQUFPLE9BQU8sU0FBUyxHQUMxQyxPQUFPLE9BQU8sa0JBQWtCLENBRXBDLENBQ0EsT0FBTyxlQUFpQixlQUd4QixJQUFJLFVBQVksS0FNaEIsZUFBZSxjQUFlLENBQzVCLEdBQUksVUFBVyxPQUFPLFVBRXRCLEdBQUksQ0FDRixNQUFNSSxFQUFXLE1BQU0sTUFBTSxvQkFBb0IsRUFDakQsR0FBSSxDQUFDQSxFQUFTLEdBQ1osTUFBTSxJQUFJLE1BQU0sNEJBQTRCLEVBRzlDLGtCQURhLE1BQU1BLEVBQVMsS0FBSyxHQUNoQixNQUNWLFNBQ1QsT0FBU2hDLEVBQU8sQ0FDZCxtQkFBYSxTQUFTLG1CQUFvQkEsRUFBTyxDQUFFLFNBQVUsY0FBZSxDQUFDLEVBQ3ZFQSxDQUNSLENBQ0YsQ0FVQSxlQUFlLFlBQVlpQyxFQUFLQyxFQUFVLENBQUMsRUFBRyxDQUM1QyxNQUFNQyxHQUFVRCxFQUFRLFFBQVUsT0FBTyxZQUFZLEVBQy9DRSxFQUFZLENBQUMsQ0FBQyxNQUFPLE9BQVEsU0FBUyxFQUFFLFNBQVNELENBQU0sRUFFN0QsR0FBSUMsRUFDRixHQUFJLENBQ0YsTUFBTUMsRUFBUSxNQUFNLGFBQWEsRUFDakNILEVBQVEsUUFBVSxDQUNoQixHQUFHQSxFQUFRLFFBQ1gsZUFBZ0JHLENBQ2xCLENBQ0YsT0FBU3JDLEVBQU8sQ0FDZCxhQUFhLFNBQVMsd0JBQXlCQSxFQUFPLENBQUUsU0FBVSxhQUFjLENBQUMsQ0FDbkYsQ0FJR2tDLEVBQVEsU0FDWEEsRUFBVSxDQUFFLEdBQUdBLEVBQVMsT0FBUSxZQUFZLFFBQVEsSUFBSyxDQUFFLEdBRzdEQSxFQUFRLFlBQWNBLEVBQVEsYUFBZSxjQUM3QyxNQUFNRixFQUFXLE1BQU0sTUFBTUMsRUFBS0MsQ0FBTyxFQUd6QyxHQUFJRSxHQUFhSixFQUFTLFNBQVcsSUFDbkMsR0FBSSxDQUNGLE1BQU1NLEVBQU8sTUFBTU4sRUFBUyxNQUFNLEVBQUUsS0FBSyxFQUN6QyxHQUFJTSxFQUFLLFFBQVVBLEVBQUssTUFBTSxTQUFTLFFBQVEsR0FBS0EsRUFBSyxNQUFNLFNBQVMsUUFBUSxHQUFJLENBQ2xGLFVBQVksS0FDWixNQUFNQyxFQUFhLE1BQU0sYUFBYSxFQUN0QyxPQUFBTCxFQUFRLFFBQVUsQ0FBRSxHQUFHQSxFQUFRLFFBQVMsZUFBZ0JLLENBQVcsRUFFbkVMLEVBQVEsT0FBUyxZQUFZLFFBQVEsSUFBSyxFQUNuQyxNQUFNRCxFQUFLQyxDQUFPLENBQzNCLENBQ0YsTUFBWSxDQUVaLENBR0YsT0FBT0YsQ0FDVCxDQUtBLGVBQWUsU0FBU0MsRUFBS08sRUFBTSxDQUNqQyxNQUFNQyxFQUFPLE1BQU0sWUFBWVIsRUFBSyxDQUNsQyxPQUFRLE9BQ1IsUUFBUyxDQUFFLGVBQWdCLGtCQUFtQixFQUM5QyxLQUFNLEtBQUssVUFBVU8sQ0FBSSxDQUMzQixDQUFDLEVBQ0tFLEVBQVMsTUFBTUQsRUFBSyxLQUFLLEVBQy9CLEdBQUksQ0FBQ0EsRUFBSyxJQUFNQyxFQUFPLFVBQVksR0FDakMsTUFBTSxJQUFJLE1BQU1BLEVBQU8sT0FBUyxtQkFBbUJELEVBQUssTUFBTSxHQUFHLEVBRW5FLE9BQU9DLENBQ1QsQ0FHQSxlQUFlLFFBQVFULEVBQUssQ0FDMUIsTUFBTVEsRUFBTyxNQUFNLFlBQVlSLENBQUcsRUFDbEMsR0FBSSxDQUFDUSxFQUFLLEdBQUksQ0FDWixJQUFJRSxFQUFNLG1CQUFtQkYsRUFBSyxNQUFNLElBQ3hDLEdBQUksQ0FBa0NFLEdBQW5CLE1BQU1GLEVBQUssS0FBSyxHQUFjLE9BQVNFLENBQUssTUFBWSxDQUFDLENBQzVFLE1BQU0sSUFBSSxNQUFNQSxDQUFHLENBQ3JCLENBQ0EsT0FBT0YsRUFBSyxLQUFLLENBQ25CLENBR0EsZUFBZSxVQUFVUixFQUFLLENBQzVCLE1BQU1RLEVBQU8sTUFBTSxZQUFZUixFQUFLLENBQUUsT0FBUSxRQUFTLENBQUMsRUFDbERTLEVBQVMsTUFBTUQsRUFBSyxLQUFLLEVBQy9CLEdBQUksQ0FBQ0EsRUFBSyxJQUFNQyxFQUFPLFVBQVksR0FDakMsTUFBTSxJQUFJLE1BQU1BLEVBQU8sT0FBUyxrQkFBa0JELEVBQUssTUFBTSxHQUFHLEVBRWxFLE9BQU9DLENBQ1QsQ0FVQSxlQUFlLFdBQVdFLEVBQUtDLEVBQWFDLEVBQVNDLEVBQU8sQ0FBQyxFQUFHLENBQzlELE1BQU1DLEVBQVdKLEVBQUksVUFDZixDQUFFLFlBQUFLLEVBQWMsU0FBSyxXQUFBQyxFQUFhLEdBQUcsT0FBTyxTQUFVLEVBQUlILEVBQ2hFSCxFQUFJLFNBQVcsR0FDZkEsRUFBSSxVQUFZQyxFQUNoQixHQUFJLENBQ0YsTUFBTUgsRUFBUyxNQUFNSSxFQUFRLEVBQzdCLE9BQUFGLEVBQUksVUFBWUssRUFDaEIsV0FBVyxJQUFNLENBQUVMLEVBQUksVUFBWUksRUFBVUosRUFBSSxTQUFXLEVBQU8sRUFBR00sQ0FBVSxFQUN6RVIsQ0FDVCxPQUFTUyxFQUFHLENBQ1YsTUFBQVAsRUFBSSxVQUFZSSxFQUNoQkosRUFBSSxTQUFXLEdBQ1RPLENBQ1IsQ0FDRixDQUdBLFNBQVMsVUFBVTVCLEVBQUksQ0FDckIsU0FBUyxlQUFlQSxDQUFFLEdBQUcsVUFBVSxJQUFJLE1BQU0sQ0FDbkQsQ0FDQSxTQUFTLFdBQVdBLEVBQUksQ0FDdEIsU0FBUyxlQUFlQSxDQUFFLEdBQUcsVUFBVSxPQUFPLE1BQU0sQ0FDdEQsQ0FHQSxTQUFTLFVBQVU2QixLQUFVQyxFQUFXLENBQ2pDRCxJQUNMQSxFQUFNLGlCQUFpQixRQUFVRCxHQUFNLENBQU1BLEVBQUUsU0FBV0MsR0FBT0EsRUFBTSxVQUFVLE9BQU8sTUFBTSxDQUFHLENBQUMsRUFLbEdDLEVBQVUsUUFBUVQsR0FBTyxDQUNuQkEsR0FBTyxPQUFPQSxFQUFJLGtCQUFxQixZQUN6Q0EsRUFBSSxpQkFBaUIsUUFBUyxJQUFNUSxFQUFNLFVBQVUsT0FBTyxNQUFNLENBQUMsQ0FFdEUsQ0FBQyxFQUNILENBR0EsU0FBUyxpQkFBaUJFLEVBQU1oRCxFQUFPLE9BQVFpRCxFQUFXLElBQU0sQ0FDOUQsTUFBTUMsRUFBZ0IsU0FBUyxjQUFjLHNCQUFzQixFQUMvREEsR0FBZUEsRUFBYyxPQUFPLEVBRXhDLE1BQU1DLEVBQVMsQ0FDYixLQUFTLENBQUUsR0FBSSxVQUFpQixHQUFJLE1BQU8sRUFDM0MsUUFBUyxDQUFFLEdBQUksZUFBaUIsR0FBSSxjQUFlLEVBQ25ELE1BQVMsQ0FBRSxHQUFJLFVBQWlCLEdBQUksTUFBTyxFQUMzQyxRQUFTLENBQUUsR0FBSSxVQUFpQixHQUFJLE1BQU8sQ0FDN0MsRUFFTTNDLEVBQUkyQyxFQUFPbkQsQ0FBSSxHQUFLbUQsRUFBTyxLQUMzQmQsRUFBTSxTQUFTLGNBQWMsS0FBSyxFQUN4Q0EsRUFBSSxVQUFZLHNCQUNoQkEsRUFBSSxZQUFjVyxFQUNsQlgsRUFBSSxNQUFNLFFBQVU7QUFBQTtBQUFBLGtCQUVKN0IsRUFBRSxFQUFFLFlBQVlBLEVBQUUsRUFBRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFNcEMsU0FBUyxLQUFLLFlBQVk2QixDQUFHLEVBQ3pCWSxFQUFXLEdBQUcsV0FBVyxJQUFNWixFQUFJLE9BQU8sRUFBR1ksQ0FBUSxDQUMzRCxDQUdBLFNBQVMsUUFBUUcsRUFBSSxDQUNuQixNQUFNQyxFQUFPLEtBQUssSUFBSSxFQUFJLElBQUksS0FBS0QsQ0FBRSxFQUFFLFFBQVEsRUFDL0MsT0FBSUMsRUFBTyxJQUFjLFdBQ3JCQSxFQUFPLEtBQWdCLEtBQUssTUFBTUEsRUFBTyxHQUFLLEVBQUksUUFDbERBLEVBQU8sTUFBaUIsS0FBSyxNQUFNQSxFQUFPLElBQU8sRUFBSSxRQUNsRCxLQUFLLE1BQU1BLEVBQU8sS0FBUSxFQUFJLE9BQ3ZDLENBSUEsU0FBUyxRQUFRbEQsRUFBS21ELEVBQVcsS0FBTSxDQUNyQyxHQUFJLENBQUUsTUFBTTVDLEVBQUksYUFBYSxRQUFRUCxDQUFHLEVBQUcsT0FBT08sSUFBTSxLQUFPQSxFQUFJNEMsQ0FBVSxNQUFZLENBQUUsT0FBT0EsQ0FBVSxDQUM5RyxDQUNBLFNBQVMsUUFBUW5ELEVBQUtDLEVBQU8sQ0FDM0IsR0FBSSxDQUFFLGFBQWEsUUFBUUQsRUFBS0MsQ0FBSyxDQUFHLE1BQVksQ0FBdUMsQ0FDN0YsQ0FDQSxTQUFTLFdBQVdELEVBQUssQ0FDdkIsR0FBSSxDQUFFLGFBQWEsV0FBV0EsQ0FBRyxDQUFHLE1BQVksQ0FBQyxDQUNuRCxDQUNBLFNBQVMsZUFBZUEsRUFBS21ELEVBQVcsS0FBTSxDQUM1QyxHQUFJLENBQUUsTUFBTTVDLEVBQUksZUFBZSxRQUFRUCxDQUFHLEVBQUcsT0FBT08sSUFBTSxLQUFPQSxFQUFJNEMsQ0FBVSxNQUFZLENBQUUsT0FBT0EsQ0FBVSxDQUNoSCxDQUNBLFNBQVMsZUFBZW5ELEVBQUtDLEVBQU8sQ0FDbEMsR0FBSSxDQUFFLGVBQWUsUUFBUUQsRUFBS0MsQ0FBSyxDQUFHLE1BQVksQ0FBQyxDQUN6RCxDQUVBLFNBQVMsWUFBWUQsRUFBS21ELEVBQVcsS0FBTSxDQUN6QyxHQUFJLENBQUUsTUFBTTVDLEVBQUksYUFBYSxRQUFRUCxDQUFHLEVBQUcsT0FBT08sRUFBSSxLQUFLLE1BQU1BLENBQUMsRUFBSTRDLENBQVUsTUFBWSxDQUFFLE9BQU9BLENBQVUsQ0FDakgsQ0FHQSxTQUFTLFdBQVdOLEVBQU0sQ0FDeEIsT0FBTyxPQUFPQSxHQUFRLEVBQUUsRUFBRSxRQUFRLEtBQU0sT0FBTyxFQUFFLFFBQVEsS0FBTSxNQUFNLEVBQUUsUUFBUSxLQUFNLE1BQU0sRUFBRSxRQUFRLEtBQU0sUUFBUSxFQUFFLFFBQVEsS0FBTSxPQUFPLENBQzVJLENBR0EsU0FBUyxZQUFZL0IsRUFBSXNDLEVBQU0sQ0FDekIsU0FBUyxlQUFldEMsQ0FBRSxHQUM5QixTQUFTLEtBQUssbUJBQW1CLFlBQWFzQyxDQUFJLENBQ3BELENBS0EsTUFBTSxPQUFTLENBQ2IsVUFBVyxDQUFDLEVBQ1osR0FBR0MsRUFBT0MsRUFBSSxDQXhwQmhCLElBQUFDLElBd3BCbUJBLEVBQUEsS0FBSyxXQUFMRixLQUFBRSxFQUFBRixHQUEwQixDQUFDLElBQUcsS0FBS0MsQ0FBRSxDQUFHLEVBQ3pELElBQUlELEVBQU9DLEVBQUksQ0FBRSxLQUFLLFVBQVVELENBQUssRUFBSSxLQUFLLFVBQVVBLENBQUssR0FBRyxPQUFPRyxHQUFLQSxJQUFNRixDQUFFLENBQUcsRUFDdkYsS0FBS0QsRUFBT3RCLEVBQU0sQ0FBRSxLQUFLLFVBQVVzQixDQUFLLEdBQUcsUUFBUUMsR0FBTUEsRUFBR3ZCLENBQUksQ0FBQyxDQUFHLENBQ3RFLEVBS00sU0FBVyxDQUNmLE1BQU8sQ0FBQyxFQUNSLFNBQVUsQ0FBRSxPQUFPLEtBQUssS0FBTyxFQUMvQixRQUFRMEIsRUFBTSxDQUFFLEtBQUssTUFBUUEsRUFBTSxPQUFPLEtBQU9BLEVBQU0sT0FBTyxLQUFLLGVBQWdCQSxDQUFJLENBQUcsRUFDMUYsUUFBUTNDLEVBQUksQ0FBRSxPQUFPLEtBQUssTUFBTSxLQUFLLEdBQUssRUFBRSxLQUFPQSxDQUFFLENBQUcsRUFDeEQsT0FBTzRDLEVBQUssQ0FBRSxLQUFLLE1BQU0sS0FBS0EsQ0FBRyxFQUFHLE9BQU8sS0FBTyxLQUFLLE1BQU8sT0FBTyxLQUFLLGVBQWdCLEtBQUssS0FBSyxDQUFHLEVBQ3ZHLFVBQVU1QyxFQUFJLENBQ1osTUFBTTZDLEVBQU0sS0FBSyxNQUFNLFVBQVVDLEdBQUtBLEVBQUUsS0FBTzlDLENBQUUsRUFDakQsT0FBSTZDLEVBQU0sS0FBTSxLQUFLLE1BQU0sT0FBT0EsRUFBSyxDQUFDLEVBQUcsT0FBTyxLQUFPLEtBQUssTUFBTyxPQUFPLEtBQUssZUFBZ0IsS0FBSyxLQUFLLEdBQ3BHQSxFQUFNLEVBQ2YsRUFDQSxVQUFVN0MsRUFBSStDLEVBQVMsQ0FDckIsTUFBTUgsRUFBTSxLQUFLLE1BQU0sS0FBS0UsR0FBS0EsRUFBRSxLQUFPOUMsQ0FBRSxFQUM1QyxHQUFJNEMsRUFBSyxDQUNQLFNBQVcsQ0FBQ3BELEVBQUdDLENBQUMsSUFBSyxPQUFPLFFBQVFzRCxDQUFPLEVBQ3JDdkQsSUFBTSxhQUFlQSxJQUFNLGVBQWlCQSxJQUFNLGNBQWFvRCxFQUFJcEQsQ0FBQyxFQUFJQyxHQUU5RSxPQUFPLEtBQUssZUFBZ0IsS0FBSyxLQUFLLENBQ3hDLENBQ0EsT0FBT21ELENBQ1QsQ0FDRixHQUdDLFVBQVksQ0FFWCxTQUFTSSxHQUFxQixDQUM1QixNQUFNeEMsRUFBTyxTQUFTLGNBQWMsS0FBSyxFQUN6QyxPQUFBQSxFQUFLLFVBQVksZ0JBQ2pCQSxFQUFLLFVBQ0gsc3RCQWFLQSxDQUNULENBRUEsU0FBU3lDLEVBQWNDLEVBQU8sQ0FDNUIsTUFBTUMsRUFBTyxTQUFTLGVBQWUsT0FBTyxFQUM1QyxHQUFJLEdBQUNBLEdBQVFBLEVBQUssY0FBYyxPQUFPLEdBQ3ZDLENBQUFELEVBQVFBLEdBQVMsRUFFakIsUUFBU0UsRUFBSSxFQUFHQSxFQUFJRixFQUFPRSxJQUFLLENBQzlCLE1BQU1DLEVBQUtMLEVBQW1CLEVBQzlCRyxFQUFLLFlBQVlFLENBQUUsRUFFbkIsV0FBVyxVQUFZLENBQUVBLEVBQUcsVUFBVSxJQUFJLFFBQVEsQ0FBRyxFQUFHRCxFQUFJLEVBQUUsQ0FDaEUsRUFDRixDQUVBLFNBQVNFLEdBQWdCLENBQ3ZCLE1BQU1ILEVBQU8sU0FBUyxlQUFlLE9BQU8sRUFDNUMsR0FBS0EsRUFDTCxLQUFJSSxFQUFZSixFQUFLLGlCQUFpQixnQkFBZ0IsRUFDakRJLEVBQVUsU0FFZkEsRUFBVSxRQUFRLFNBQVVGLEVBQUlELEVBQUcsQ0FDakMsV0FBVyxVQUFZLENBQ3JCQyxFQUFHLE1BQU0sUUFBVSxJQUNuQkEsRUFBRyxNQUFNLFVBQVksbUJBQ3ZCLEVBQUdELEVBQUksRUFBRSxDQUNYLENBQUMsRUFFRCxXQUFXLFVBQVksQ0FDckJHLEVBQVUsUUFBUSxTQUFVRixFQUFJLENBQU1BLEVBQUcsWUFBWUEsRUFBRyxPQUFPLENBQUcsQ0FBQyxDQUNyRSxFQUFHRSxFQUFVLE9BQVMsR0FBSyxHQUFHLEdBQ2hDLENBRUEsT0FBTyxlQUFpQixDQUFFLEtBQU1OLEVBQWUsS0FBTUssQ0FBYyxDQUNyRSxHQUFHLEdBS0YsVUFBWSxDQUNYLElBQUlFLEVBQVksUUFDWkMsRUFBa0IsY0FDbEJDLEVBQW9CLGVBRXBCQyxFQUFpQixDQUFDLE9BQVEsUUFBUyxPQUFRLFFBQVMsT0FBUSxVQUFXLGlCQUFrQixrQkFBbUIsT0FBUSxPQUFPLEVBQzNIQyxFQUFTRCxFQUFlLE1BQU0sRUFFOUJFLEVBQWMsQ0FDaEIsS0FBTSxLQUFNLFFBQVMsV0FBWSxZQUFhLFVBQVcsU0FDekQsUUFBUyxhQUFjLE9BQ3ZCLFFBQVMsUUFBUyxTQUFVLFNBQVUsU0FBVSxVQUFXLFNBQzNELFVBQVcsUUFBUyxVQUNwQixTQUFVLGVBQ1osRUFHSUMsRUFBYSxDQUNmLEtBQU0sS0FBTSxRQUFTLFlBQWEsVUFBVyxTQUM3QyxRQUFTLFFBQVMsU0FBVSxTQUFVLFNBQVUsVUFBVyxTQUMzRCxTQUFVLGVBQ1osRUFHSUMsRUFBZ0IsQ0FBQyxXQUFZLFFBQVMsYUFBYyxPQUFRLFVBQVcsUUFBUyxTQUFTLEVBRXpGQyxFQUFlLENBQ2pCLEtBQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFNBQVUsRUFDaGQsTUFBa0IsQ0FBRSxHQUFJLFVBQVcsR0FBSSxVQUFXLE1BQU8sVUFBVyxXQUFZLFVBQVcsWUFBYSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsTUFBTyxVQUFXLGFBQWMsVUFBVyxLQUFNLFVBQVcsUUFBUyxVQUFXLFFBQVMsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLFFBQVMsVUFBVyxNQUFPLFVBQVcsUUFBUyxVQUFXLE9BQVEsVUFBVyxnQkFBaUIsVUFBVyxRQUFTLEVBQUssRUFDL2QsS0FBa0IsQ0FBRSxHQUFJLFVBQVcsR0FBSSxVQUFXLE1BQU8sVUFBVyxXQUFZLFVBQVcsWUFBYSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsTUFBTyxVQUFXLGFBQWMsVUFBVyxLQUFNLFVBQVcsUUFBUyxVQUFXLFFBQVMsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLFFBQVMsVUFBVyxNQUFPLFVBQVcsUUFBUyxVQUFXLE9BQVEsVUFBVyxnQkFBaUIsU0FBVSxFQUNoZCxNQUFrQixDQUFFLEdBQUksVUFBVyxHQUFJLFVBQVcsTUFBTyxVQUFXLFdBQVksVUFBVyxZQUFhLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxNQUFPLFVBQVcsYUFBYyxVQUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixTQUFVLEVBQ2hkLEtBQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFNBQVUsRUFDaGQsUUFBa0IsQ0FBRSxHQUFJLFVBQVcsR0FBSSxVQUFXLE1BQU8sVUFBVyxXQUFZLFVBQVcsWUFBYSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsTUFBTyxVQUFXLGFBQWMsVUFBVyxLQUFNLFVBQVcsUUFBUyxVQUFXLFFBQVMsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLFFBQVMsVUFBVyxNQUFPLFVBQVcsUUFBUyxVQUFXLE9BQVEsVUFBVyxnQkFBaUIsU0FBVSxFQUNoZCxpQkFBa0IsQ0FBRSxHQUFJLFVBQVcsR0FBSSxVQUFXLE1BQU8sVUFBVyxXQUFZLFVBQVcsWUFBYSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsTUFBTyxVQUFXLGFBQWMsVUFBVyxLQUFNLFVBQVcsUUFBUyxVQUFXLFFBQVMsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLFFBQVMsVUFBVyxNQUFPLFVBQVcsUUFBUyxVQUFXLE9BQVEsVUFBVyxnQkFBaUIsU0FBVSxFQUNoZCxrQkFBa0IsQ0FBRSxHQUFJLFVBQVcsR0FBSSxVQUFXLE1BQU8sVUFBVyxXQUFZLFVBQVcsWUFBYSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsTUFBTyxVQUFXLGFBQWMsVUFBVyxLQUFNLFVBQVcsUUFBUyxVQUFXLFFBQVMsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLFFBQVMsVUFBVyxNQUFPLFVBQVcsUUFBUyxVQUFXLE9BQVEsVUFBVyxnQkFBaUIsVUFBVyxRQUFTLEVBQUssRUFDL2QsS0FBa0IsQ0FBRSxHQUFJLFVBQVcsR0FBSSxVQUFXLE1BQU8sVUFBVyxXQUFZLFVBQVcsWUFBYSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsTUFBTyxVQUFXLGFBQWMsVUFBVyxLQUFNLFVBQVcsUUFBUyxVQUFXLFFBQVMsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLFFBQVMsVUFBVyxNQUFPLFVBQVcsUUFBUyxVQUFXLE9BQVEsVUFBVyxnQkFBaUIsVUFBVyxRQUFTLEVBQUssRUFDL2QsTUFBa0IsQ0FBRSxHQUFJLFVBQVcsR0FBSSxVQUFXLE1BQU8sVUFBVyxXQUFZLFVBQVcsWUFBYSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsTUFBTyxVQUFXLGFBQWMsVUFBVyxLQUFNLFVBQVcsUUFBUyxVQUFXLFFBQVMsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLFFBQVMsVUFBVyxNQUFP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QUFBQSxTQTZCN0IsRUFFUCxZQUFZLG9CQUFxQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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QUFvQixFQUdoQmpULElBQVcsRUFDVCxPQUFPLGtCQUFxQixZQUM5QixpQkFBaUIsR0FBR3dULENBQVcsZUFBZUUsQ0FBTyxnQkFBaUIsU0FBUyxHQUc3RSxPQUFPLGtCQUFxQixZQUM5QixpQkFBaUIsR0FBR0YsQ0FBVyxLQUFLRSxDQUFPLGVBQWUxVCxDQUFNLFVBQVcsU0FBUyxFQUV0RixRQUFRLE1BQU0sMEJBQTJCMlQsQ0FBTSxHQUlqRCxXQUFXLElBQU0sQ0FDWCxPQUFPLFlBQWUsWUFBWSxXQUFXLENBQ25ELEVBQUcsSUFBSSxDQUNULENBRUFsQixHQUFVLGlCQUFpQixRQUFTLElBQU0sQ0FDcENLLEVBQ0ZLLEVBQWMsRUFFZEgsRUFBZSxDQUVuQixDQUFDLEVBRURKLEdBQVUsaUJBQWlCLFFBQVMsSUFBTVMsRUFBWSxPQUFPLENBQUMsRUFDOURSLEdBQVMsaUJBQWlCLFFBQVMsSUFBTVEsRUFBWSxNQUFNLENBQUMsRUFDNUR4UCxHQUFZLGlCQUFpQixRQUFTLElBQU13UCxFQUFZLFNBQVMsQ0FBQyxFQUNsRXBJLEdBQVcsaUJBQWlCLFFBQVNrSSxDQUFhLENBQ3BELEdBQUciLAogICJuYW1lcyI6IFsid2luZG93IiwgIkVycm9ySGFuZGxlciIsICJjb250ZXh0IiwgImVycm9yIiwgIm1ldGFkYXRhIiwgImVycm9yRW50cnkiLCAiY3VycmVudFN0ZXAiLCAibWVzc2FnZSIsICJzdGF0cyIsICJ0eXBlIiwgImZhbGxiYWNrTWVzc2FnZSIsICJtZW1vcnlTdG9yYWdlIiwgImtleSIsICJ2YWx1ZSIsICJyYXciLCAicyIsICJyIiwgImMiLCAiayIsICJ2IiwgInRva2Vuc0J0biIsICJlbCIsICJ0bGRTdWZmaXgiLCAicHJveHlJcElucHV0IiwgInN1YiIsICJkbnNJZCIsICJpZCIsICJpbmZvIiwgInRvcFJvdyIsICJkbnNJZHMiLCAic3ZnSWNvbiIsICJmaXJzdENoaWxkIiwgInNhZmVJZCIsICJsYWJlbCIsICJjYXJkIiwgInJlc3BvbnNlIiwgInVybCIsICJvcHRpb25zIiwgIm1ldGhvZCIsICJuZWVkc0NzcmYiLCAidG9rZW4iLCAiYm9keSIsICJmcmVzaFRva2VuIiwgImRhdGEiLCAicmVzcCIsICJyZXN1bHQiLCAibXNnIiwgImJ0biIsICJsb2FkaW5nVGV4dCIsICJhc3luY0ZuIiwgIm9wdHMiLCAib3JpZ2luYWwiLCAic3VjY2Vzc1RleHQiLCAicmVzZXREZWxheSIsICJlIiwgIm1vZGFsIiwgImNsb3NlQnRucyIsICJ0ZXh0IiwgImR1cmF0aW9uIiwgImV4aXN0aW5nTm90aWYiLCAiY29sb3JzIiwgInRzIiwgImRpZmYiLCAiZmFsbGJhY2siLCAiaHRtbCIsICJldmVudCIsICJmbiIsICJfYSIsICJoIiwgImFwcHMiLCAiYXBwIiwgImlkeCIsICJhIiwgImNoYW5nZXMiLCAiY3JlYXRlU2tlbGV0b25DYXJkIiwgInNob3dTa2VsZXRvbnMiLCAiY291bnQiLCAiZ3JpZCIsICJpIiwgInNrIiwgImhpZGVTa2VsZXRvbnMiLCAic2tlbGV0b25zIiwgIlRIRU1FX0tFWSIsICJVU0VSX1RIRU1FU19LRVkiLCAiTEVHQUNZX0NVU1RPTV9LRVkiLCAiQlVJTFRJTl9USEVNRVMiLCAiVEhFTUVTIiwgIlRIRU1FX1BST1BTIiwgIkJBU0VfUFJPUFMiLCAiREVSSVZFRF9QUk9QUyIsICJUSEVNRV9DT0xPUlMiLCAiaGV4VG9SZ2IiLCAiaGV4IiwgInJnYlRvSGV4IiwgImciLCAiYiIsICJ4IiwgImJsZW5kQ29sb3JzIiwgImhleDEiLCAiaGV4MiIsICJyYXRpbyIsICJjMSIsICJjMiIsICJoZXhMdW1pbmFuY2UiLCAiZGVyaXZlRXh0ZW5kZWRDb2xvcnMiLCAiYmciLCAiZmciLCAibXV0ZWQiLCAiY2FyZEJhc2UiLCAiZG90T2siLCAiZG90QmFkIiwgImlzTGlnaHQiLCAiZGVyaXZlZCIsICJnZW5lcmF0ZUJvZHlCYWNrZ3JvdW5kQ1NTIiwgInNsdWciLCAiYWNjZW50IiwgImFjY2VudFJnYiIsICJnZW5lcmF0ZUJ1dHRvbkhvdmVyQ1NTIiwgImdldFN5c3RlbVRoZW1lIiwgImNsZWFyQ3VzdG9tUHJvcGVydGllcyIsICJwcm9wIiwgInNsdWdpZnkiLCAibmFtZSIsICJjdXJyZW50U2x1ZyIsICJjYWNoZWQiLCAiYmFzZSIsICJjb3VudGVyIiwgImluamVjdFVzZXJUaGVtZVN0eWxlcyIsICJ0aGVtZXNEYXRhIiwgImV4aXN0aW5nIiwgInVzZXJUaGVtZXMiLCAic2x1Z3MiLCAiY3NzIiwgInRoZW1lIiwgImNvbG9yTWFwIiwgInAiLCAic3R5bGUiLCAic3luY1RoZW1lc0Zyb21TZXJ2ZXIiLCAic2VydmVyVGhlbWVzIiwgImN1cnJlbnQiLCAiYXBwbHlUaGVtZSIsICJtaWdyYXRlTGVnYWN5Q3VzdG9tVGhlbWUiLCAibGVnYWN5IiwgInRoZW1lRGF0YSIsICJtb2RlIiwgInQiLCAibWV0YSIsICJzYXZlZFRoZW1lIiwgIm1ldGhvZHNDYWNoZSIsICJmZXRjaE1ldGhvZHMiLCAicmVzIiwgInNob3dQcm92aWRlclNlbGVjdG9yIiwgInByb3ZpZGVycyIsICJvdmVybGF5IiwgIm9yaWdpbmFsQm9keSIsICJwcm92aWRlckJ1dHRvbnMiLCAicHJvdmlkZXIiLCAicmVuZGVyUHJvdmlkZXJDaGFsbGVuZ2UiLCAicmVzdG9yZU9yaWdpbmFsQm9keSIsICJpbnB1dCIsICJzdWJtaXQiLCAic3RhdHVzIiwgImJhY2siLCAiZW1haWwiLCAidmlhIiwgIm1hc2tlZCIsICJzaG93IiwgInNob3dUb3RwV2l0aEVtYWlsRmFsbGJhY2siLCAidG90cFByb3ZpZGVyIiwgImVtYWlsRW5hYmxlZCIsICJkaXYiLCAiaXNBbGxvd2VkUmV0dXJuVXJsIiwgInJldHVyblVybCIsICJwYXJzZWQiLCAic3VmZml4IiwgImJ1aWxkU3NvSGFuZG9mZlRhcmdldCIsICJpc1ByaXZhdGVIb3N0IiwgInJldHVyblBhdGgiLCAicmVzdW1lRXhpc3RpbmdTZXNzaW9uIiwgInBhcnNlZFJldHVybiIsICJzZXJ2aWNlSWQiLCAidGFyZ2V0IiwgInVybFBhcmFtcyIsICJicm9rZW5Mb2dvcyIsICJpbWciLCAidXBkYXRlVG90cExvZ28iLCAibHVtIiwgImRhcmsiLCAibGlnaHQiLCAic2hvd1RvdHBPdmVybGF5IiwgImZpcnN0SW5wdXQiLCAiaGlkZVRvdHBPdmVybGF5IiwgInJlZGlyZWN0IiwgImNvbnRhaW5lciIsICJpbnB1dHMiLCAidmFsIiwgImNvZGUiLCAic3VibWl0VG90cENvZGUiLCAicGFzdGVkIiwgImlucCIsICJlcnJvckVsIiwgImNhbmRpZGF0ZSIsICJob3N0bmFtZSIsICJpc1NhbWVPcmlnaW4iLCAiaXNPdXJUbGQiLCAiZmV0Y2hSZWNvdmVyeUluZm8iLCAic2hvd1JlY292ZXJ5TGluayIsICJsaW5rIiwgIm9wZW5SZWNvdmVyeVBhbmVsIiwgInBhbmVsIiwgInN0YXR1c0VsIiwgImltcG9ydEVsIiwgInZlcmlmeUVsIiwgImNsb3NlUmVjb3ZlcnlQYW5lbCIsICJzdWJtaXRSZWNvdmVyeVNlY3JldCIsICJzZWNyZXQiLCAic3VibWl0UmVjb3ZlcnlDb2RlIiwgImV4cGVjdGVkU2VydmljZUlkIiwgImV4cGVjdGVkSG9zdCIsICJidWlsZEhhbmRvZmZUYXJnZXQiLCAicmVzdW1lIiwgInJ1bnRpbWUiLCAiZmV0Y2hGbiIsICJsb2NhdGlvbk9iaiIsICJlcnJvckhhbmRsZXIiLCAiY3VycmVudFNlcnZpY2UiLCAiY3JlZGVudGlhbFJldHVyblVybCIsICJjdXJyZW50U2VydmljZUhhZENyZWRzIiwgImFyclNlcnZpY2VzIiwgInF1YWxpdHlQcm9maWxlU2VydmljZXMiLCAiZ2V0U2VydmljZVVybCIsICJzZXJ2aWNlIiwgInNob3dFcnJvciIsICJoaWRlRXJyb3IiLCAicmVxdWlyZVN1Y2Nlc3NmdWxXcml0ZSIsICJpc0FsbG93ZWRDcmVkZW50aWFsUmV0dXJuVXJsIiwgInRpdGxlIiwgImRlc2MiLCAic2VlZGhvc3RTZWN0aW9uIiwgImFwaWtleVNlY3Rpb24iLCAiYmFzaWNTZWN0aW9uIiwgInF1YWxpdHlTZWN0aW9uIiwgImlzRXh0IiwgImlzQXJyIiwgImhhc1F1YWxpdHkiLCAicXVhbFNlbGVjdCIsICJsb2FkU2VydmljZUNyZWRzIiwgImRvdCIsICJjbGVhckJ0biIsICJoYXNDcmVkcyIsICJzdmNJZCIsICJsb2FkUXVhbGl0eVByb2ZpbGVzIiwgInF1YWxTdGF0dXMiLCAic3ZjVXJsIiwgInBhcmFtcyIsICJvcHQiLCAibWF0Y2g3MjAiLCAiYXBpS2V5IiwgInNhdmVCdG4iLCAiZXh0ZXJuYWxVc2VyIiwgImV4dGVybmFsUGFzcyIsICJyZXF1ZXN0ZWRBcGlLZXkiLCAiYmFzaWNVc2VyIiwgImJhc2ljUGFzcyIsICJoYXNFeHRlcm5hbExvZ2luIiwgImhhc0FwaUtleSIsICJoYXNCYXNpY0xvZ2luIiwgInVzZXIiLCAicGFzcyIsICJxdWFsaXR5UHJvZmlsZUlkIiwgInF1YWxpdHlQcm9maWxlTmFtZSIsICJhcnJSZXNwb25zZSIsICJzZWVkRGF0YSIsICJkIiwgImxvYWRUb3RwU2V0dGluZ3MiLCAiZW5hYmxlZCIsICJzZXNzaW9uRHVyYXRpb24iLCAiaXNTZXRVcCIsICJzdGF0dXNEb3QiLCAic3RhdHVzVGV4dCIsICJzdGF0dXNCYW5uZXIiLCAic2V0dXBTZWN0aW9uIiwgInFyU2VjdGlvbiIsICJkdXJhdGlvblNlY3Rpb24iLCAiZGlzYWJsZVNlY3Rpb24iLCAic2V0dXBCdG4iLCAidXBkYXRlQXV0aENhcmQiLCAiRFVSQVRJT05fTEFCRUxTIiwgInRyYW5zbGF0ZWQiLCAiaTE4biIsICJhY3RpdmUiLCAicGlsbCIsICJwYXlsb2FkIiwgImJsb2IiLCAiZXJyIiwgIkFQSSIsICJfZWwiLCAidGFnIiwgImF0dHJzIiwgImNoaWxkcmVuIiwgIm5vZGUiLCAiX2ZldGNoSlNPTiIsICJjc3JmIiwgIl9yZW5kZXJCYWRnZSIsICJyb2xlIiwgIl9yZW5kZXJVc2Vyc0xpc3QiLCAidXNlcnMiLCAib25DaGFuZ2UiLCAidGFibGUiLCAidGJvZHkiLCAidSIsICJyb3ciLCAiZW1haWxDZWxsIiwgInJvbGVDZWxsIiwgImFjdGlvbnNDZWxsIiwgInJvbGVTZWxlY3QiLCAiZXYiLCAiZGVsQnRuIiwgIl9yZW5kZXJJbnZpdGVGb3JtIiwgIm9uSXNzdWVkIiwgImZvcm0iLCAiZmQiLCAicm9sZVNlbCIsICJfcmVuZGVySW52aXRlc0xpc3QiLCAiaW52aXRlcyIsICJpbnYiLCAiX3JlbmRlcklzc3VlZEludml0ZUJhbm5lciIsICJpbnZpdGUiLCAicGFyZW50IiwgImJhbm5lciIsICJjb3B5QnRuIiwgInNoYXJlQmxvY2siLCAic2hhcmVBY3Rpb25zIiwgImNvcHlUZXh0QnRuIiwgIm5hdGl2ZVNoYXJlQnRuIiwgIm1vdW50IiwgIm1lRGF0YSIsICJyZWZyZXNoQnRuIiwgInVzZXJzSGVhZGVyIiwgInVzZXJzTGlzdCIsICJ1c2Vyc0RhdGEiLCAiYWRkVXNlckZvcm0iLCAiaW52aXRlRm9ybUNvbnRhaW5lciIsICJpbnZpdGVzTGlzdCIsICJpbnZpdGVzRGF0YSIsICJpc3N1ZWQiLCAib3BlbiIsICJiYWNrZHJvcCIsICJjbG9zZSIsICJhdHRhY2hUcmlnZ2VyIiwgImJhckNvbnRhaW5lciIsICJfbWF5YmVTaG93IiwgIm1lIiwgImdldERuc0lkcyIsICJnZXREbnNEaXNwbGF5TmFtZSIsICJyZXF1aXJlU3VjY2Vzc2Z1bERuc011dGF0aW9uIiwgImJ1aWxkQ3JlZGVudGlhbFNlY3Rpb25zIiwgImdldEVuY3J5cHRpb25LZXkiLCAib2xkS2V5IiwgImFycmF5IiwgIkVOQ1JZUFRJT05fS0VZIiwgImNyZWRlbnRpYWxFbmNyeXB0IiwgIml2IiwgIml2SGV4IiwgImtleUJ5dGVzIiwgImNoYXJDb2RlIiwgImNyZWRlbnRpYWxEZWNyeXB0IiwgImVuY3J5cHRlZFRleHQiLCAiZGVjb2RlZCIsICJnZXRDcmVkZW50aWFsIiwgInRva2VuVHlwZSIsICJjcmVkVHlwZSIsICJlbmNyeXB0ZWQiLCAic2V0Q3JlZGVudGlhbCIsICJnZXRUb2tlbiIsICJnZXRVc2VybmFtZSIsICJzZXRUb2tlbiIsICJzZXRVc2VybmFtZSIsICJ1c2VybmFtZSIsICJnZXRBbGxDcmVkZW50aWFscyIsICJjbGVhckFsbENyZWRlbnRpYWxzIiwgImdldFN0b3JlZENyZWRlbnRpYWxzIiwgInJlYWRvbmx5VG9rZW4iLCAicmVhZG9ubHlVc2VybmFtZSIsICJhZG1pblRva2VuIiwgImFkbWluVXNlcm5hbWUiLCAib2xkVG9rZW4iLCAib2xkVXNlcm5hbWUiLCAiY3JlZHMiLCAidGFyZ2V0SWQiLCAic2VydmVycyIsICJoYXNBbnlDcmVkcyIsICJlbnRyeSIsICJyb1VzZXIiLCAicm9QYXNzIiwgImFkbWluVXNlciIsICJhZG1pblBhc3MiLCAiZmFpbGVkIiwgImRldGFpbHMiLCAic3RhdHVzTGFiZWwiLCAidXAiLCAic2V0UXVpY2siLCAicmVzcG9uc2VUaW1lIiwgInRpbWVFbCIsICJnZXRSZXNwb25zZVRpbWVDbGFzcyIsICJ0aW1lIiwgImlzVXAiLCAiY2hlY2tTZXJ2aWNlV2l0aFRpbWluZyIsICJzdGFydFRpbWUiLCAiZW5kVGltZSIsICJyZWZyZXNoSW5GbGlnaHQiLCAicmVmcmVzaFF1ZXVlZCIsICJsb2FkU2VydmljZXMiLCAic2VydmljZVVybCIsICJzdmMiLCAiZG5zIiwgImNscyIsICJ0eHQiLCAiYnVpbGRHcmlkIiwgInJvb3QiLCAid3JhcCIsICJhcHBJZCIsICJjZG5VcmxzIiwgInVuaXF1ZVVybHMiLCAibmV4dEluZGV4IiwgIm5hbWVTcGFuIiwgInRzQmFkZ2UiLCAiY2F0SW5mbyIsICJjYXRCYWRnZSIsICJ1cGRhdGVCYWRnZSIsICJyZXNwb25zZVJvdyIsICJ0aW1lU3BhbiIsICJoZWFsdGhSb3ciLCAidXB0aW1lQ2hpcCIsICJ1cHRpbWVNaW5pQmFyIiwgInVwdGltZUZpbGwiLCAiYnRuUm93IiwgImxvZ3NCdG4iLCAidXBkYXRlQnRuIiwgImV4ZWNCdG4iLCAiY3JlZHNCdG4iLCAib3B0QnRuIiwgInNoYXJlQnRuIiwgInNldEJhZGdlIiwgInJlZnJlc2hBbGwiLCAidXBkYXRlU3RhbXAiLCAiY2hlY2tlZEF0IiwgInN0YW1wIiwgImFwcGx5QmF0Y2hSZXN1bHRzIiwgInN0YXR1c2VzIiwgInJlZnJlc2hGYWxsYmFjayIsICJ0b3BDaGVja3MiLCAidG9wUmVzdWx0cyIsICJpbnRlcm5ldFJlc3VsdCIsICJiYXRjaEVycm9yIiwgImZhbGxiYWNrRXJyb3IiLCAib3BlbkJ0biIsICJyZXN0YXJ0RG5zU2VydmljZSIsICJyZXN0YXJ0QnRuIiwgInVwZGF0ZURuc1NlcnZlciIsICJzZXJ2ZXJJcCIsICJvcmlnaW5hbFRleHQiLCAiY2hlY2tSZXN1bHQiLCAidXBkYXRlUmVzdWx0IiwgImRvd25sb2FkSW5mbyIsICJpbnN0cnVjdGlvbnNJbmZvIiwgImN1cnJlbnREbnNJZCIsICJvcGVuRG5zU2V0dGluZ3MiLCAic2VydmVyIiwgInNhdmVEbnNTZXR0aW5ncyIsICJpcCIsICJwb3J0IiwgInVwZGF0ZSIsICJjbG9zZURuc1NldHRpbmdzIiwgInJlbW92ZURuc1NlcnZlciIsICJjb25maWciLCAic2V0dGluZ3NCdG4iLCAiY3VycmVudERuc1NlcnZpY2UiLCAibG9nc0ludGVydmFsIiwgImxvZ3NQYXVzZWQiLCAiY3VycmVudENvbnRhaW5lcklkIiwgImN1cnJlbnRDb250YWluZXJOYW1lIiwgImNvbnRhaW5lckxvZ3NNb2RlIiwgImN1cnJlbnRMb2dQYXRoIiwgImN1cnJlbnRMb2dTZXJ2aWNlTmFtZSIsICJmaWxlTG9nc01vZGUiLCAibG9nRXZlbnRTb3VyY2UiLCAiaXNTdHJlYW1pbmciLCAiZmV0Y2hEbnNMb2dzIiwgImxpbmVzIiwgInNlcnZlcklQIiwgImdldFJjb2RlQ29sb3IiLCAicmNvZGUiLCAicmVuZGVyRG5zTG9nRW50cnkiLCAibG9nIiwgInJjb2RlQ29sb3IiLCAiaXNCbG9ja2VkIiwgInVwZGF0ZUxvZ3NEaXNwbGF5IiwgInVwZGF0ZUZpbGVMb2dzRGlzcGxheSIsICJ1cGRhdGVDb250YWluZXJMb2dzRGlzcGxheSIsICJsb2dzQ29udGVudCIsICJsb2dFbGVtZW50IiwgIm9wZW5Mb2dzTW9kYWwiLCAicGF1c2VCdG4iLCAic3RyZWFtQnRuIiwgImNsb3NlTG9nc01vZGFsIiwgInN0b3BMb2dTdHJlYW1pbmciLCAic3RhcnRMb2dTdHJlYW1pbmciLCAiY29udGFpbmVySWQiLCAiaXNFcnJvciIsICJsZXZlbENvbG9yIiwgImxldmVsQmFkZ2UiLCAiZmV0Y2hDb250YWluZXJMb2dzIiwgImVuZHBvaW50IiwgInJlbmRlckNvbnRhaW5lckxvZ0VudHJ5IiwgInN0cmVhbUNvbG9yIiwgInN0cmVhbUJhZGdlIiwgIm9wZW5Db250YWluZXJMb2dzTW9kYWwiLCAiY29udGFpbmVyTmFtZSIsICJmZXRjaEZpbGVMb2dzIiwgImxvZ1BhdGgiLCAicmVuZGVyRmlsZUxvZ0VudHJ5IiwgImxvZ0xldmVsIiwgIm9wZW5GaWxlTG9nc01vZGFsIiwgInNlcnZpY2VOYW1lIiwgImxvYWRFeGlzdGluZ0NBcyIsICJjYWRkeWZpbGVQYXRoIiwgInNlbGVjdCIsICJjYSIsICJvcHRpb24iLCAiZ2VuZXJhdGVDYWRkeUNvbmZpZyIsICJzdWJkb21haW4iLCAic3NsVHlwZSIsICJjYU5hbWUiLCAiZXhpc3RpbmdDYSIsICJlbmFibGVBdXRoIiwgImVuYWJsZUNvcnMiLCAiY3VzdG9tSGVhZGVycyIsICJ1cHN0cmVhbVBhdGgiLCAiaGVhbHRoQ2hlY2siLCAidGltZW91dCIsICJ0YWlsc2NhbGVPbmx5IiwgImNhZGR5Q29uZmlnIiwgImhlYWRlcnMiLCAiY3JlYXRlRG5zUmVjb3JkIiwgInR0bCIsICJkbnNUb2tlbiIsICJkb21haW4iLCAiZXJyb3JUZXh0IiwgImFkZFNlcnZpY2VUb0NvbmZpZyIsICJzZXJ2aWNlQ29uZmlnIiwgIm5ld1NlcnZpY2UiLCAiYWRkVG9DYWRkeWZpbGUiLCAiY3VycmVudEVkaXRTZXJ2aWNlIiwgIm9wZW5TZXJ2aWNlRWRpdE1vZGFsIiwgImNhdGVnb3J5U2VsZWN0IiwgImNsb3NlU2VydmljZUVkaXRNb2RhbCIsICJzYXZlU2VydmljZUNoYW5nZXMiLCAibmV3U3ViZG9tYWluIiwgIm5ld05hbWUiLCAibmV3UG9ydCIsICJuZXdJcCIsICJuZXdMb2dvIiwgIm5ld0NhdGVnb3J5IiwgIm9sZFN1YmRvbWFpbiIsICJhcHBJbmRleCIsICJmaWxlIiwgInJlYWRlciIsICJkYXRhVXJsIiwgInNob3dEZWxldGVNb2RhbCIsICJoYXNDb250YWluZXIiLCAicmVzb2x2ZSIsICJjb250YWluZXJJbmZvIiwgImhlbHAiLCAiY2FuY2VsQnRuIiwgInJlbW92ZUJ0biIsICJkZWxldGVCdG4iLCAiY2xlYW51cCIsICJoYW5kbGVDYW5jZWwiLCAiaGFuZGxlUmVtb3ZlIiwgImhhbmRsZURlbGV0ZSIsICJoYW5kbGVCYWNrZHJvcCIsICJ1cGRhdGVDb250YWluZXIiLCAiZGVsZXRlU2VydmljZSIsICJkZWxldGVDb250YWluZXIiLCAicmVzdWx0cyIsICJzZXJ2aWNlSVAiLCAiZG5zUmVzdWx0IiwgImNhZGR5UmVzdWx0IiwgImluZGV4IiwgImN1c3RvbUFwcHMiLCAibG9jYWxJbmRleCIsICJzZXJ2aWNlUmVzdWx0IiwgImhhc0Vycm9ycyIsICJlcnJvck1lc3NhZ2VzIiwgInN1Y2Nlc3NTdGF0ZXMiLCAiaXNTdWNjZXNzIiwgImRlcml2ZVN1YmRvbWFpbiIsICJnZXRTbWFydFNzbERlZmF1bHQiLCAidXBkYXRlU2VydmljZVByZXZpZXciLCAiUVVJQ0tfSVBTIiwgImRuc1ByZXZpZXciLCAidXJsUHJldmlldyIsICJjb25maWdQcmV2aWV3IiwgImRldGVjdE5ldHdvcmtJUHMiLCAibGFuQnRuIiwgInRzQnRuIiwgImlwSW5wdXQiLCAiaW5pdFF1aWNrSVBCdXR0b25zIiwgImN1cnJlbnRJUCIsICJvcGVuQWRkU2VydmljZU1vZGFsIiwgIm1vZGFsQ29udGVudCIsICJzc2xTZWxlY3QiLCAidGFpbHNjYWxlU3RhdHVzIiwgInRhaWxzY2FsZUNoZWNrYm94IiwgInNldHVwU2VydmljZVR5cGVTd2l0Y2hpbmciLCAibG9jYWxSYWRpbyIsICJleHRlcm5hbFJhZGlvIiwgImxvY2FsQ29uZmlnIiwgImV4dGVybmFsQ29uZmlnIiwgInRhYkxvY2FsIiwgInRhYkV4dGVybmFsIiwgInN3aXRjaFNlcnZpY2VUeXBlIiwgInNldHVwQXV0b1N1YmRvbWFpbiIsICJuYW1lSW5wdXQiLCAic3ViZG9tYWluSW5wdXQiLCAic3ViZG9tYWluUHJldmlldyIsICJ1c2VyRWRpdGVkU3ViZG9tYWluIiwgImV4dE5hbWVJbnB1dCIsICJleHRTdWJkb21haW5JbnB1dCIsICJleHRTdWJkb21haW5QcmV2aWV3IiwgImV4dERvbWFpblByZXZpZXciLCAidXNlckVkaXRlZEV4dFN1YmRvbWFpbiIsICJjcmVhdGVFeHRlcm5hbFNlcnZpY2UiLCAiZXh0ZXJuYWxVcmwiLCAibG9nbyIsICJpY29uIiwgImNyZWF0ZURucyIsICJjcmVhdGVDYWRkeSIsICJwcm94eUlwIiwgInByZXNlcnZlSG9zdCIsICJmb2xsb3dSZWRpcmVjdHMiLCAiY2F0ZWdvcnkiLCAiZGVmYXVsdFNlcnZpY2VzIiwgImN1c3RvbVNlcnZpY2VzIiwgImNsb3NlQWRkU2VydmljZU1vZGFsIiwgInBhcnRzIiwgInN1YlByZXYiLCAiZXh0U3ViUHJldiIsICJleHROYW1lIiwgImV4dFN1YiIsICJleHRVcmwiLCAiZXh0TG9nbyIsICJleHRJY29uIiwgImxvY2FsT3B0cyIsICJleHRPcHRzIiwgImNyZWF0ZU5ld1NlcnZpY2UiLCAic3RhdHVzUGFydHMiLCAiZXhpc3RpbmdDYUNvbmZpZyIsICJjdXN0b21DYUNvbmZpZyIsICJidXR0b24iLCAiZG5zQ29uZmlnIiwgImVsZW1lbnQiLCAibG9hZEN1c3RvbVNlcnZpY2VzIiwgImVzIiwgInJlY29ubmVjdERlbGF5IiwgIk1BWF9SRUNPTk5FQ1QiLCAiX3NzZUZhaWxDb3VudCIsICJfc3NlTWFudWFsbHlDbG9zZWQiLCAiY29ubmVjdCIsICJ1cGRhdGVzQnRuIiwgImNsb3NlQW5kU3RvcCIsICJyZXN1bWVBZnRlclJlYXV0aCIsICJzZWFyY2hJbnB1dCIsICJzdGF0dXNTZWxlY3QiLCAiY291bnRTcGFuIiwgImdldENhdGVnb3J5TGlzdCIsICJzZWVuIiwgImZyb21DYXJkcyIsICJjYXQiLCAiYXBpQ2F0cyIsICJyZWZyZXNoQ2F0ZWdvcnlEcm9wZG93biIsICJsaXN0IiwgIm8iLCAidXBkYXRlRmlsdGVyIiwgInF1ZXJ5IiwgInN0YXR1c0ZpbHRlciIsICJjYXRlZ29yeUZpbHRlciIsICJjYXJkcyIsICJ2aXNpYmxlQ291bnQiLCAidG90YWwiLCAiZGVib3VuY2UiLCAiZGVsYXkiLCAiYXJncyIsICJiYXRjaEJ0biIsICJiYXRjaEJhciIsICJiYXRjaENvdW50IiwgInN0YXJ0QnRuIiwgInN0b3BCdG4iLCAiYmF0Y2hNb2RlIiwgInNlbGVjdGVkQ29udGFpbmVycyIsICJlbnRlckJhdGNoTW9kZSIsICJ1cGRhdGVTZWxlY3RlZENvdW50IiwgImNoZWNrYm94IiwgImV4aXRCYXRjaE1vZGUiLCAiY2IiLCAiYmF0Y2hBY3Rpb24iLCAiYWN0aW9uIiwgImNvbnRhaW5lcnMiLCAiYWN0aW9uTGFiZWwiLCAiYnRucyIsICJzdWNjZXNzIiwgImVycm9ycyJdCn0K