From 84edb035e39c6d4d5acf3d8a95173e3b1fc4e73f Mon Sep 17 00:00:00 2001 From: Hermes Date: Sat, 22 Aug 2026 05:41:38 -0700 Subject: [PATCH] [grade=B] feat(auth): onboard missing credentials into encrypted vault --- .../__tests__/routes/auth.totp.routes.test.js | 26 +- .../__tests__/routes/services.routes.test.js | 15 + .../__tests__/session-cookie-scope.test.js | 11 + .../__tests__/sso-handoff-exchange.test.js | 86 ++++- dashcaddy-api/routes/auth/sso-gate.js | 71 ++-- dashcaddy-api/routes/auth/totp.js | 17 +- dashcaddy-api/routes/services.js | 3 +- dashcaddy-api/src/utilities/middleware.js | 13 +- dashcaddy-installer/install.sh | 7 +- .../src/main/caddyfile-generator.js | 7 +- .../src/main/caddyfile-generator.sso.test.js | 35 ++ status/build.js | 1 + status/dist/core.js | 216 ++++++------ status/dist/init.js | 14 +- status/js/auth-gate.js | 6 +- status/js/core/credentials.js | 107 +++--- status/js/core/init.js | 3 + status/js/credential-vault-handoff.js | 52 +++ status/js/service-credentials.js | 108 ++++-- status/js/totp-auth.js | 14 +- status/sw.js | 2 +- status/tests/auth-gate-return-url.test.js | 2 +- .../tests/credential-vault-onboarding.test.js | 311 ++++++++++++++++++ status/tests/dns-credential-vault.test.js | 67 ++++ 24 files changed, 959 insertions(+), 235 deletions(-) create mode 100644 dashcaddy-installer/src/main/caddyfile-generator.sso.test.js create mode 100644 status/js/credential-vault-handoff.js create mode 100644 status/tests/credential-vault-onboarding.test.js create mode 100644 status/tests/dns-credential-vault.test.js diff --git a/dashcaddy-api/__tests__/routes/auth.totp.routes.test.js b/dashcaddy-api/__tests__/routes/auth.totp.routes.test.js index d0f6643..84940af 100644 --- a/dashcaddy-api/__tests__/routes/auth.totp.routes.test.js +++ b/dashcaddy-api/__tests__/routes/auth.totp.routes.test.js @@ -112,6 +112,7 @@ function createApp(depsOverride = {}) { errorResponse: jest.fn(), log, renewCSRFToken, + siteConfig: { tld: '.sami', dashboardHost: 'status.sami' }, ...depsOverride, }; @@ -299,7 +300,7 @@ describe('TOTP Auth Routes — DC-006 Integration Test', () => { it('returns 200 + creates new session + rotates CSRF on valid code (BACKLOG: "valid TOTP → session token → authenticated request succeeds")', async () => { const secret = await setupTOTP(); const token = authenticator.generate(secret); - const res = await request(app).post('/api/totp/verify').send({ code: token }); + const res = await request(app).post('/api/totp/verify').send({ code: token, serviceId: 'plex' }); expect(res.status).toBe(200); expect(res.body.success).toBe(true); expect(res.body.message).toMatch(/Authenticated successfully/); @@ -308,8 +309,29 @@ describe('TOTP Auth Routes — DC-006 Integration Test', () => { expect(deps.session.create).toHaveBeenCalled(); expect(deps.session.setCookie).toHaveBeenCalled(); expect(deps.session.createHandoffToken).toHaveBeenCalledTimes(1); + expect(deps.session.createHandoffToken).toHaveBeenCalledWith('plex.sami'); expect(deps.renewCSRFToken).toHaveBeenCalled(); }); + + it('does not issue an unbound handoff token for a dashboard-only login', async () => { + const secret = await setupTOTP(); + const token = authenticator.generate(secret); + const res = await request(app).post('/api/totp/verify').send({ code: token }); + + expect(res.status).toBe(200); + expect(res.body.ssoToken).toBeNull(); + expect(deps.session.createHandoffToken).not.toHaveBeenCalled(); + }); + + it('rejects an invalid handoff service ID before issuing a token', async () => { + const secret = await setupTOTP(); + const token = authenticator.generate(secret); + const res = await request(app).post('/api/totp/verify').send({ code: token, serviceId: 'plex.sami' }); + + expect(res.status).toBe(400); + expect(res.body.error).toMatch(/Invalid service ID/); + expect(deps.session.createHandoffToken).not.toHaveBeenCalled(); + }); }); // ──────────────────────────────────────────────────────────────────── @@ -450,7 +472,7 @@ describe('TOTP Auth Routes — DC-006 Integration Test', () => { // 4. Re-login via /totp/verify (the "login" path) const loginCode = authenticator.generate(secret); - const loginRes = await request(app).post('/api/totp/verify').send({ code: loginCode }); + const loginRes = await request(app).post('/api/totp/verify').send({ code: loginCode, serviceId: 'plex' }); expect(loginRes.status).toBe(200); expect(loginRes.body.csrfToken).toBeDefined(); expect(loginRes.body.ssoToken).toBe('mock-sso-handoff-token'); diff --git a/dashcaddy-api/__tests__/routes/services.routes.test.js b/dashcaddy-api/__tests__/routes/services.routes.test.js index 9b88a77..f226253 100644 --- a/dashcaddy-api/__tests__/routes/services.routes.test.js +++ b/dashcaddy-api/__tests__/routes/services.routes.test.js @@ -288,6 +288,21 @@ describe('Services Routes', () => { expect(res.status).toBe(200); expect(res.body.hasApiKey).toBe(true); }); + + it('requires both username and password before reporting Basic Auth ready', async () => { + const credentialManager = { + store: jest.fn(), + retrieve: jest.fn().mockImplementation((key) => { + if (key === 'service.radarr.username') return Promise.resolve('admin'); + return Promise.resolve(null); + }), + delete: jest.fn(), + }; + const { app } = createApp({ credentialManager }); + const res = await request(app).get('/api/services/radarr/credentials'); + expect(res.status).toBe(200); + expect(res.body.hasBasicAuth).toBe(false); + }); }); // ===== SEEDHOST CREDENTIAL ENDPOINTS ===== diff --git a/dashcaddy-api/__tests__/session-cookie-scope.test.js b/dashcaddy-api/__tests__/session-cookie-scope.test.js index 0fbbfbe..4eac220 100644 --- a/dashcaddy-api/__tests__/session-cookie-scope.test.js +++ b/dashcaddy-api/__tests__/session-cookie-scope.test.js @@ -50,6 +50,17 @@ describe('TOTP session cookie scope', () => { expect(cookie).not.toMatch(/(?:^|;)\s*Domain=/i); }); + test('host-bound SSO token can only be redeemed on its intended service host', () => { + const session = buildSession(); + const wrongHostToken = session.createHandoffToken('plex.sami'); + expect(session.redeemHandoffToken(wrongHostToken, 'chat.sami')).toBe(false); + expect(session.redeemHandoffToken(wrongHostToken, 'plex.sami')).toBe(false); + + const correctHostToken = session.createHandoffToken('plex.sami'); + expect(session.redeemHandoffToken(correctHostToken, 'plex.sami')).toBe(true); + expect(session.redeemHandoffToken(correctHostToken, 'plex.sami')).toBe(false); + }); + test('logout clears the host-only secure cookie', () => { const session = buildSession(); const headers = {}; diff --git a/dashcaddy-api/__tests__/sso-handoff-exchange.test.js b/dashcaddy-api/__tests__/sso-handoff-exchange.test.js index 3a95a1d..365dc6d 100644 --- a/dashcaddy-api/__tests__/sso-handoff-exchange.test.js +++ b/dashcaddy-api/__tests__/sso-handoff-exchange.test.js @@ -1,8 +1,21 @@ const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const vm = require('vm'); const request = require('supertest'); const createSsoRouter = require('../routes/auth/sso-gate'); -function createApp({ redeem = true, valid = true } = {}) { +function loadCredentialVaultHandoff() { + const source = fs.readFileSync( + path.join(__dirname, '..', '..', 'status', 'js', 'credential-vault-handoff.js'), + 'utf8', + ); + const window = { location: { origin: 'https://status.sami' } }; + vm.runInNewContext(source, { window, SITE: { tld: '.sami' }, URL }); + return window.DCCredentialVault; +} + +function createApp({ redeem = true, valid = true, storedCredentials = {}, dashboardHost = 'status.sami' } = {}) { const app = express(); const session = { redeemHandoffToken: jest.fn((token) => (typeof redeem === 'function' ? redeem(token) : redeem)), @@ -22,14 +35,15 @@ function createApp({ redeem = true, valid = true } = {}) { log: { warn: jest.fn(), info: jest.fn(), debug: jest.fn(), error: jest.fn() }, getAppSession: jest.fn(), appSessionCache: new Map(), - credentialManager: { retrieve: jest.fn() }, + credentialManager: { retrieve: jest.fn((key) => Promise.resolve(storedCredentials[key] || null)) }, fetchT: jest.fn(), - getServiceById: jest.fn(), + getServiceById: jest.fn((id) => Promise.resolve({ id, url: `https://${id}.sami` })), licenseManager: { hasFeature: jest.fn().mockReturnValue(true), requirePremium: jest.fn(() => (_req, _res, next) => next()), }, servicesStateManager: { read: jest.fn().mockResolvedValue([]) }, + siteConfig: { dashboardHost }, }); app.use('/api/v1', router); return { app, session }; @@ -45,7 +59,7 @@ describe('cross-host SSO exchange redirect', () => { expect(res.status).toBe(303); expect(res.headers.location).toBe('/settings?tab=network#dns'); expect(res.headers['set-cookie'][0]).not.toMatch(/Domain=/i); - expect(session.redeemHandoffToken).toHaveBeenCalledWith('one-time'); + expect(session.redeemHandoffToken).toHaveBeenCalledWith('one-time', '127.0.0.1'); }); test.each([ @@ -88,17 +102,18 @@ describe('existing-session SSO handoff', () => { test('mints a handoff token without asking for TOTP again', async () => { const { app, session } = createApp(); const res = await request(app) - .get('/api/v1/auth/sso-handoff') + .get('/api/v1/auth/sso-handoff?serviceId=plex') .set('Cookie', 'dashcaddy_session=valid-session'); expect(res.status).toBe(200); expect(res.body).toMatchObject({ success: true, ssoToken: 'fresh-sso-handoff-token' }); expect(session.createHandoffToken).toHaveBeenCalledTimes(1); + expect(session.createHandoffToken).toHaveBeenCalledWith('plex.sami'); }); test('refuses to mint a handoff token without a valid session', async () => { const { app, session } = createApp({ valid: false }); - const res = await request(app).get('/api/v1/auth/sso-handoff'); + const res = await request(app).get('/api/v1/auth/sso-handoff?serviceId=plex'); expect(res.status).toBe(401); expect(session.createHandoffToken).not.toHaveBeenCalled(); @@ -110,7 +125,7 @@ describe('existing-session SSO handoff', () => { const { app } = createApp({ redeem: redeemOnce }); const mint = await request(app) - .get('/api/v1/auth/sso-handoff') + .get('/api/v1/auth/sso-handoff?serviceId=plex') .set('Cookie', 'dashcaddy_session=valid-session'); const exchange = await request(app) .get('/api/v1/auth/sso-exchange') @@ -127,3 +142,60 @@ describe('existing-session SSO handoff', () => { expect(replay.status).toBe(401); }); }); + +describe('encrypted-vault credential onboarding', () => { + test('app-token identifies missing credentials as a form requirement', async () => { + const { app } = createApp(); + const res = await request(app) + .get('/api/v1/auth/app-token/plex') + .set('Cookie', 'dashcaddy_session=valid-session'); + + expect(res.status).toBe(428); + expect(res.body).toMatchObject({ + success: false, + credentialsRequired: true, + serviceId: 'plex', + }); + }); + + test('service login page sends missing credentials to the encrypted vault form', async () => { + const { app } = createApp(); + const res = await request(app).get('/api/v1/auth/login-page?service=plex'); + + expect(res.status).toBe(200); + expect(res.text).toContain("if(j.credentialsRequired){vault('plex');return}"); + expect(res.text).toContain("dashboardOrigin+'?credentials='"); + }); + + test('service login page derives the vault origin from trusted dashboard config', async () => { + const { app } = createApp({ dashboardHost: 'dashboard.home' }); + const res = await request(app).get('/api/v1/auth/login-page?service=plex'); + + expect(res.status).toBe(200); + expect(res.text).toContain('dashboardOrigin="https://dashboard.home"'); + }); + + test('full vault-save handoff lifecycle reaches exchange, cookie, and final service path', async () => { + const issued = new Set(['fresh-sso-handoff-token']); + const { app } = createApp({ redeem: (token) => issued.delete(token) }); + const mint = await request(app) + .get('/api/v1/auth/sso-handoff?serviceId=plex') + .set('Cookie', 'dashcaddy_session=valid-session'); + + const vault = loadCredentialVaultHandoff(); + const target = new URL(vault.buildHandoffTarget( + 'https://plex.sami/web/?direct=1#home', + mint.body.ssoToken, + 'plex', + )); + // The shared Caddy snippet rewrites /dashcaddy-sso to the canonical API + // route while preserving the token and relative return query. + const exchange = await request(app).get('/api/v1/auth/sso-exchange' + target.search); + + expect(target.pathname).toBe('/dashcaddy-sso'); + expect(exchange.status).toBe(303); + expect(exchange.headers.location).toBe('/web/?direct=1#home'); + expect(exchange.headers['set-cookie'][0]).toContain('dashcaddy_session='); + expect(exchange.headers['set-cookie'][0]).not.toMatch(/Domain=/i); + }); +}); diff --git a/dashcaddy-api/routes/auth/sso-gate.js b/dashcaddy-api/routes/auth/sso-gate.js index 2f14a17..00c48b2 100644 --- a/dashcaddy-api/routes/auth/sso-gate.js +++ b/dashcaddy-api/routes/auth/sso-gate.js @@ -12,7 +12,7 @@ module.exports = function(deps) { const router = express.Router(); // Extract dependencies - const { authManager, totpConfig, session, asyncHandler, errorResponse, log, getAppSession, appSessionCache, credentialManager, fetchT, getServiceById, licenseManager, servicesStateManager } = deps; + const { authManager, totpConfig, session, asyncHandler, errorResponse, log, getAppSession, appSessionCache, credentialManager, fetchT, getServiceById, licenseManager, servicesStateManager, siteConfig } = deps; // Create ctx-like object for compatibility const ctx = { @@ -126,7 +126,12 @@ module.exports = function(deps) { try { const username = await ctx.credentialManager.retrieve(`service.${serviceId}.username`).catch(() => null); const password = await ctx.credentialManager.retrieve(`service.${serviceId}.password`).catch(() => null); - if (!username || !password) throw new NotFoundError('[DC-500] No credentials stored'); + if (!username || !password) { + return errorResponse(res, 428, '[DC-500] No credentials stored', { + credentialsRequired: true, + serviceId, + }); + } const service = await ctx.getServiceById(serviceId); const baseUrl = service?.url; if (!baseUrl) throw new NotFoundError('No service URL'); @@ -181,7 +186,12 @@ module.exports = function(deps) { password = await ctx.credentialManager.retrieve(`service.${serviceId}.password`).catch(() => null); } - if (!username || !password) throw new NotFoundError('[DC-500] No credentials stored'); + if (!username || !password) { + return errorResponse(res, 428, '[DC-500] No credentials stored', { + credentialsRequired: true, + serviceId, + }); + } const appCookies = await getAppSession(serviceId, baseUrl, username, password); if (appCookies) { @@ -213,7 +223,13 @@ module.exports = function(deps) { if (!session.isValid(req)) { return errorResponse(res, 401, 'Session expired or invalid'); } - ok(res, { ssoToken: session.createHandoffToken() }); + const serviceId = String(req.query.serviceId || ''); + if (!/^[a-z0-9][a-z0-9-]*$/.test(serviceId)) { + return errorResponse(res, 400, 'Valid serviceId is required'); + } + const suffix = String(siteConfig?.tld || '.sami'); + const expectedHost = `${serviceId}${suffix.startsWith('.') ? suffix : `.${suffix}`}`; + ok(res, { ssoToken: session.createHandoffToken(expectedHost) }); }); // Cross-subdomain SSO handoff: exchanges a short-lived single-use token @@ -229,7 +245,9 @@ module.exports = function(deps) { router.get('/auth/sso-exchange', (req, res) => { res.setHeader('Cache-Control', 'no-store'); const token = req.query.token; - if (!session.redeemHandoffToken(token)) { + const forwardedHost = String(req.headers['x-forwarded-host'] || req.headers.host || '') + .split(',')[0].trim().replace(/:\d+$/, '').toLowerCase(); + if (!session.redeemHandoffToken(token, forwardedHost)) { return errorResponse(res, 401, 'Invalid or expired handoff token'); } session.setCookieHostOnly(res, totpConfig.sessionDuration); @@ -251,7 +269,12 @@ module.exports = function(deps) { // Serve service-specific auto-login page (auth enforced by Caddy forward_auth upstream) router.get('/auth/login-page', (req, res) => { const service = (req.query.service || '').replace(/[^a-z]/g, ''); - const html = buildLoginPage(service); + const configuredHost = siteConfig?.dashboardHost; + const dashboardOrigin = typeof configuredHost === 'string' + && /^[a-zA-Z0-9][a-zA-Z0-9.-]*$/.test(configuredHost) + ? `https://${configuredHost}` + : 'https://status.sami'; + const html = buildLoginPage(service, dashboardOrigin); if (!html) return res.status(404).send('Unknown service'); res.setHeader('Content-Type', 'text/html; charset=utf-8'); res.setHeader('Cache-Control', 'no-store'); @@ -269,7 +292,7 @@ module.exports = function(deps) { return router; }; -function buildLoginPage(service) { +function buildLoginPage(service, dashboardOrigin = 'https://status.sami') { // Pre-auth check via so it fires even when JS is // disabled or blocked. The cookie is sent automatically because we hit the // same origin (plex.sami); if the API returns 200 the user has a valid @@ -280,7 +303,7 @@ function buildLoginPage(service) {

__TITLE__

`; const pages = { chat: { title: 'Signing in...', bg: '#0a0a0a', accent: '#60a5fa', - body: `if(ls.getItem('token')){go('/?direct=1');return} -d.textContent='Fetching token from DashCaddy...'; + body: `d.textContent='Fetching token from DashCaddy...'; ft('chat').then(function(r){return r.text()}).then(function(t){ - try{var j=JSON.parse(t);if(j.token){ls.setItem('token',j.token);go('/?direct=1');return} + try{var j=JSON.parse(t);if(j.credentialsRequired){vault('chat');return}if(j.token){ls.setItem('token',j.token);go('/?direct=1');return} // No token but chat is reachable — fall through to manual UI link below fail('Auto-login unavailable. Open Chat manually','No token field: '+t.substring(0,200))} catch(e){fail('Auto-login parse error. Open Chat manually','Error: '+e.message+' / body: '+t.substring(0,200))} @@ -338,30 +363,29 @@ ft('chat').then(function(r){return r.text()}).then(function(t){ }, plex: { title: 'Signing in to Plex...', bg: '#1f1f1f', accent: '#e5a00d', - body: `if(ls.getItem('myPlexAccessToken')){go('/web/?direct=1');return} -ft('plex').then(function(r){return r.json()}).then(function(j){ - if(j.token){ls.setItem('myPlexAccessToken',j.token);d.textContent='Token stored, redirecting...';go('/web/?direct=1');return} + body: `ft('plex').then(function(r){return r.json()}).then(function(j){ + if(j.credentialsRequired){vault('plex');return}if(j.token){ls.setItem('myPlexAccessToken',j.token);d.textContent='Token stored, redirecting...';go('/web/?direct=1');return} // No token returned. Three fallbacks in priority order: // 1. Stale token in localStorage — Plex may still accept it. if(ls.getItem('myPlexAccessToken')){go('/web/?direct=1');return} // 2. Manual link so the user is never trapped on this page. - fail('Auto-login unavailable. Open Plex manually or re-authenticate at DashCaddy','API: '+JSON.stringify(j)) + fail('Auto-login unavailable. Open Plex manually or '+authLink('re-authenticate at DashCaddy'),'API: '+JSON.stringify(j)) }).catch(function(e){fail('Could not reach DashCaddy. Open Plex manually','Error: '+(e&&e.message||'unknown'))})` }, jellyfin: { title: 'Signing in to Jellyfin...', bg: '#101014', accent: '#00a4dc', body: `ft('jellyfin').then(function(r){return r.json()}).then(function(j){ - if(j.token){merge('jellyfin_credentials',j,'Jellyfin');merge('_jellyfin_credentials',j,'Jellyfin');d.textContent='Token stored, redirecting...';go('/web/');return} + if(j.credentialsRequired){vault('jellyfin');return}if(j.token){merge('jellyfin_credentials',j,'Jellyfin');merge('_jellyfin_credentials',j,'Jellyfin');d.textContent='Token stored, redirecting...';go('/web/');return} if(ls.getItem('jellyfin_credentials')||ls.getItem('_jellyfin_credentials')){go('/web/');return} - fail('Auto-login unavailable. Open Jellyfin manually or re-authenticate at DashCaddy','API: '+JSON.stringify(j)) + fail('Auto-login unavailable. Open Jellyfin manually or '+authLink('re-authenticate at DashCaddy'),'API: '+JSON.stringify(j)) }).catch(function(e){fail('Could not reach DashCaddy. Open Jellyfin manually','Error: '+(e&&e.message||'unknown'))})` }, emby: { title: 'Signing in to Emby...', bg: '#101014', accent: '#52b54b', body: `ft('emby').then(function(r){return r.json()}).then(function(j){ - if(j.token){merge('emby_credentials',j,'Emby');merge('_emby_credentials',j,'Emby');d.textContent='Token stored, redirecting...';go('/web/');return} + if(j.credentialsRequired){vault('emby');return}if(j.token){merge('emby_credentials',j,'Emby');merge('_emby_credentials',j,'Emby');d.textContent='Token stored, redirecting...';go('/web/');return} if(ls.getItem('emby_credentials')||ls.getItem('_emby_credentials')){go('/web/');return} - fail('Auto-login unavailable. Open Emby manually or re-authenticate at DashCaddy','API: '+JSON.stringify(j)) + fail('Auto-login unavailable. Open Emby manually or '+authLink('re-authenticate at DashCaddy'),'API: '+JSON.stringify(j)) }).catch(function(e){fail('Could not reach DashCaddy. Open Emby manually','Error: '+(e&&e.message||'unknown'))})` }, }; @@ -371,5 +395,6 @@ ft('plex').then(function(r){return r.json()}).then(function(j){ return SHELL(cfg.body) .replace(/__TITLE__/g, cfg.title) .replace('__BG__', cfg.bg) - .replace('__ACCENT__', cfg.accent); + .replace('__ACCENT__', cfg.accent) + .replace('__DASHBOARD_ORIGIN__', JSON.stringify(dashboardOrigin)); } diff --git a/dashcaddy-api/routes/auth/totp.js b/dashcaddy-api/routes/auth/totp.js index 0a57241..cfda015 100644 --- a/dashcaddy-api/routes/auth/totp.js +++ b/dashcaddy-api/routes/auth/totp.js @@ -15,7 +15,7 @@ const { ok, successMessage } = require('../../src/utils/responses'); * @param {Object} deps.log - Logger instance * @returns {express.Router} */ -module.exports = function({ authManager, credentialManager, totpConfig, saveTotpConfig, session, asyncHandler, errorResponse, log, renewCSRFToken }) { +module.exports = function({ authManager, credentialManager, totpConfig, saveTotpConfig, session, asyncHandler, errorResponse, log, renewCSRFToken, siteConfig }) { const router = express.Router(); // Ctx shim for backward compatibility @@ -23,7 +23,8 @@ module.exports = function({ authManager, credentialManager, totpConfig, saveTotp credentialManager, totpConfig, saveTotpConfig, - session + session, + siteConfig }; // Get current TOTP config (public route) @@ -193,11 +194,14 @@ const SETUP_WINDOW_MS = 60 * 60 * 1000; // Login: verify TOTP code and set session cookie router.post('/totp/verify', asyncHandler(async (req, res) => { const { authenticator } = require('otplib'); - const { code } = req.body; + const { code, serviceId } = req.body; if (!code || !/^\d{6}$/.test(code)) { throw new ValidationError('Invalid code format', 'code'); } + if (serviceId != null && !/^[a-z0-9][a-z0-9-]*$/.test(String(serviceId))) { + throw new ValidationError('Invalid service ID', 'serviceId'); + } if (!ctx.totpConfig.enabled || !ctx.totpConfig.isSetUp) { throw new ValidationError('TOTP is not enabled'); @@ -227,7 +231,12 @@ const SETUP_WINDOW_MS = 60 * 60 * 1000; // URL when bouncing the user back to a gated service. That service's // login page exchanges it via /auth/sso-exchange for its own host-only // session cookie. Single-use, 60s TTL — see ctx.session.createHandoffToken. - const ssoToken = ctx.session.createHandoffToken(); + let ssoToken = null; + if (serviceId) { + const suffix = String(ctx.siteConfig?.tld || '.sami'); + const expectedHost = `${serviceId}${suffix.startsWith('.') ? suffix : `.${suffix}`}`; + ssoToken = ctx.session.createHandoffToken(expectedHost); + } log.debug('auth', 'Session created', { sessions: ctx.session.ipSessions.size }); ok(res, { message: 'Authenticated successfully', sessionDuration: ctx.totpConfig.sessionDuration, csrfToken: newCsrfToken, ssoToken }); diff --git a/dashcaddy-api/routes/services.js b/dashcaddy-api/routes/services.js index 540290d..4cef78e 100644 --- a/dashcaddy-api/routes/services.js +++ b/dashcaddy-api/routes/services.js @@ -263,9 +263,10 @@ module.exports = function({ const arrKey = await credentialManager.retrieve(`arr.${serviceId}.apikey`).catch(() => null); const svcKey = await credentialManager.retrieve(`service.${serviceId}.apikey`).catch(() => null); const username = await credentialManager.retrieve(`service.${serviceId}.username`).catch(() => null); + const password = await credentialManager.retrieve(`service.${serviceId}.password`).catch(() => null); success(res, { hasApiKey: !!(arrKey || svcKey), - hasBasicAuth: !!username, + hasBasicAuth: !!username && !!password, username: username || null }); }, 'service-creds')); diff --git a/dashcaddy-api/src/utilities/middleware.js b/dashcaddy-api/src/utilities/middleware.js index a2bb69e..5cbeda8 100644 --- a/dashcaddy-api/src/utilities/middleware.js +++ b/dashcaddy-api/src/utilities/middleware.js @@ -330,17 +330,22 @@ module.exports = function configureMiddleware(app, { const ssoHandoffTokens = new Map(); const SSO_HANDOFF_TTL_MS = 60 * 1000; - function createHandoffToken() { + function createHandoffToken(expectedHost = null) { const token = crypto.randomBytes(24).toString('base64url'); - ssoHandoffTokens.set(token, { exp: Date.now() + SSO_HANDOFF_TTL_MS }); + ssoHandoffTokens.set(token, { + exp: Date.now() + SSO_HANDOFF_TTL_MS, + expectedHost: expectedHost ? String(expectedHost).toLowerCase() : null, + }); return token; } - function redeemHandoffToken(token) { + function redeemHandoffToken(token, actualHost = null) { if (!token) return false; const entry = ssoHandoffTokens.get(token); ssoHandoffTokens.delete(token); // one-time use regardless of outcome - return !!entry && entry.exp > Date.now(); + if (!entry || entry.exp <= Date.now()) return false; + if (!entry.expectedHost) return true; + return !!actualHost && entry.expectedHost === String(actualHost).toLowerCase(); } function setHostOnlySessionCookie(res, durationKey) { diff --git a/dashcaddy-installer/install.sh b/dashcaddy-installer/install.sh index 0315033..fa39c71 100644 --- a/dashcaddy-installer/install.sh +++ b/dashcaddy-installer/install.sh @@ -630,10 +630,15 @@ generate_caddyfile() { SNIP local auth_snippet="(dashcaddy_auth) { - forward_auth localhost:${API_PORT} { + @needsAuth not path /dashcaddy-sso + forward_auth @needsAuth localhost:${API_PORT} { uri /api/v1/auth/gate/{args[0]} copy_headers Authorization X-Api-Key X-App-Cookie X-Emby-Token X-Plex-Token } + handle /dashcaddy-sso { + rewrite * /api/v1/auth/sso-exchange + reverse_proxy localhost:${API_PORT} + } }" local site_body=" root * ${DASHBOARD_DIR} diff --git a/dashcaddy-installer/src/main/caddyfile-generator.js b/dashcaddy-installer/src/main/caddyfile-generator.js index 70216ad..808a353 100644 --- a/dashcaddy-installer/src/main/caddyfile-generator.js +++ b/dashcaddy-installer/src/main/caddyfile-generator.js @@ -51,10 +51,15 @@ class CaddyfileGenerator { _authSnippet(apiPort) { return `# DashCaddy SSO auth snippet (dashcaddy_auth) { - forward_auth localhost:${apiPort} { + @needsAuth not path /dashcaddy-sso + forward_auth @needsAuth localhost:${apiPort} { uri /api/v1/auth/gate/{args[0]} copy_headers Authorization X-Api-Key X-App-Cookie X-Emby-Token X-Plex-Token } + handle /dashcaddy-sso { + rewrite * /api/v1/auth/sso-exchange + reverse_proxy localhost:${apiPort} + } } `; } diff --git a/dashcaddy-installer/src/main/caddyfile-generator.sso.test.js b/dashcaddy-installer/src/main/caddyfile-generator.sso.test.js new file mode 100644 index 0000000..6165fdf --- /dev/null +++ b/dashcaddy-installer/src/main/caddyfile-generator.sso.test.js @@ -0,0 +1,35 @@ +const fs = require('fs'); +const path = require('path'); +const { spawnSync } = require('child_process'); +const CaddyfileGenerator = require('./caddyfile-generator'); + +describe('cross-host SSO installer contract', () => { + test('generated auth snippet exposes the public one-time exchange landing route', () => { + const snippet = new CaddyfileGenerator()._authSnippet(3001); + expect(snippet).toContain('@needsAuth not path /dashcaddy-sso'); + expect(snippet).toContain('handle /dashcaddy-sso'); + expect(snippet).toContain('rewrite * /api/v1/auth/sso-exchange'); + expect(snippet).toContain('reverse_proxy localhost:3001'); + }); + + test('shell installer emits the same exchange landing contract', () => { + const installer = fs.readFileSync(path.join(__dirname, '..', '..', 'install.sh'), 'utf8'); + expect(installer).toContain('@needsAuth not path /dashcaddy-sso'); + expect(installer).toContain('handle /dashcaddy-sso'); + expect(installer).toContain('rewrite * /api/v1/auth/sso-exchange'); + }); + + test('Caddy parser accepts a complete service config using the generated snippet', () => { + const available = spawnSync('caddy', ['version'], { encoding: 'utf8' }); + if (available.status !== 0) return; + + const generator = new CaddyfileGenerator(); + const config = `${generator._authSnippet(3001)}\nexample.test {\n import dashcaddy_auth plex\n respond "ok" 200\n}\n`; + const result = spawnSync('caddy', ['validate', '--config', '-', '--adapter', 'caddyfile'], { + input: config, + encoding: 'utf8', + }); + expect(result.status).toBe(0); + expect(`${result.stdout}\n${result.stderr}`).toContain('Valid configuration'); + }); +}); \ No newline at end of file diff --git a/status/build.js b/status/build.js index 240a9d7..055c2cf 100644 --- a/status/build.js +++ b/status/build.js @@ -28,6 +28,7 @@ const bundles = { // totp-recovery.js registers window._refreshRecoveryLink which totp-auth.js // calls from showTotpOverlay(). Must come after totp-auth.js. JS('totp-recovery.js'), + JS('credential-vault-handoff.js'), JS('service-credentials.js'), JS('totp-settings.js'), // DC-048 admin panel — modal-overlay UI for user/invite management. diff --git a/status/dist/core.js b/status/dist/core.js index a6beaa8..1aaa2c7 100644 --- a/status/dist/core.js +++ b/status/dist/core.js @@ -1,4 +1,4 @@ -(function(c){"use strict";class a{constructor(){this.errors=[],this.maxErrors=50}logError(h,b,y={}){const v={timestamp:new Date().toISOString(),context:h,message:b instanceof Error?b.message:b,stack:b instanceof Error?b.stack:null,metadata:y};this.errors.push(v),this.errors.length>this.maxErrors&&this.errors.shift(),console.error(`[Onboarding Error] ${h}:`,b,y)}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 y=this.classifyError({message:b.message});h.byType[y]=(h.byType[y]||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=` +(function(l){"use strict";class a{constructor(){this.errors=[],this.maxErrors=50}logError(h,b,g={}){const y={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(y),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; @@ -16,48 +16,48 @@ The interactive tour is unavailable, but you can explore the dashboard freely. Check the documentation for help getting started.

- `,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,y){this.data[b]=y},removeItem(b){delete this.data[b]},clear(){this.data={}}};return console.warn("[ErrorHandler] Using in-memory storage - progress will not persist"),h}sendToErrorTracking(h){}}c.ErrorHandler=a,console.log("[ErrorHandler] Module loaded")})(window),(function(){try{var a=typeof localStorage<"u"&&localStorage.getItem("dashcaddy-health-settings")||null;if(a){var f=JSON.parse(a);f.statsPollingInterval&&f.statsPollingInterval>=5&&f.statsPollingInterval<=3600&&(window.__DC_STATS_OVERRIDE=f.statsPollingInterval*1e3)}}catch{}})();const DC={NAME:"DashCaddy",POLL:{DASHBOARD:1e4,LOGS:3e3,STATS:typeof window<"u"&&window.__DC_STATS_OVERRIDE||5e3,WEATHER:6e5,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,u]of Object.entries(b.dnsServers))v!=="__proto__"&&v!=="constructor"&&v!=="prototype"&&(SITE.dnsServers[v]=u);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 y=document.getElementById("manage-tokens");y&&(y.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 f=document.getElementById("external-proxy-ip");f&&SITE.dnsIp&&(f.value=SITE.dnsIp,f.placeholder=SITE.dnsIp)})();function buildDomain(c){return c+SITE.tld}function buildServiceUrl(c){return SITE.routingMode==="subdirectory"&&SITE.domain?"https://"+SITE.domain+"/"+c:SITE.configurationType==="public"&&SITE.domain?"https://"+c+"."+SITE.domain:"https://"+buildDomain(c)}function getDnsServerAddr(c){const a=SITE.dnsServers[c];return a?`${a.ip}:${a.port}`:buildDomain(c)}function getPrimaryDnsId(){if(!SITE.dnsIp)return null;for(const[c,a]of Object.entries(SITE.dnsServers))if(a.ip===SITE.dnsIp)return c;return null}function renderDnsCards(){const c=document.querySelector(".top");if(!c)return;const a=Object.keys(SITE.dnsServers);if(!a.length)return;const f='',h=c.firstElementChild;a.forEach(b=>{const y=escapeHtml(b),v=escapeHtml((SITE.dnsServers[b].name||b).toUpperCase()),u=document.createElement("div");u.className="card",u.setAttribute("data-app",b),u.setAttribute("data-status","off"),u.innerHTML=`
${f}
${v}OFF
--
--
`,c.insertBefore(u,h)}),window.DCI18n&&window.DCI18n.isLoaded()&&window.DCI18n.applyTranslations()}window.renderDnsCards=renderDnsCards;let csrfToken=null;async function getCSRFToken(){if(csrfToken)return csrfToken;try{const c=await fetch("/api/v1/csrf-token");if(!c.ok)throw new Error("Failed to fetch CSRF token");return csrfToken=(await c.json()).token,csrfToken}catch(c){throw errorHandler.logError("[CSRF] Get Token",c,{function:"getCSRFToken"}),c}}async function secureFetch(c,a={}){const f=(a.method||"GET").toUpperCase(),h=!["GET","HEAD","OPTIONS"].includes(f);if(h)try{const y=await getCSRFToken();a.headers={...a.headers,"X-CSRF-Token":y}}catch(y){errorHandler.logError("[CSRF] Add to Request",y,{function:"secureFetch"})}a.signal||(a={...a,signal:AbortSignal.timeout(15e3)}),a.credentials=a.credentials||"same-origin";const b=await fetch(c,a);if(h&&b.status===403)try{const y=await b.clone().json();if(y.error&&(y.error.includes("DC-100")||y.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(c,a)}}catch{}return b}async function postJSON(c,a){const f=await secureFetch(c,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}),h=await f.json();if(!f.ok||h.success===!1)throw new Error(h.error||`Request failed (${f.status})`);return h}async function getJSON(c){const a=await secureFetch(c);if(!a.ok){let f=`Request failed (${a.status})`;try{f=(await a.json()).error||f}catch{}throw new Error(f)}return a.json()}async function deleteAPI(c){const a=await secureFetch(c,{method:"DELETE"}),f=await a.json();if(!a.ok||f.success===!1)throw new Error(f.error||`Delete failed (${a.status})`);return f}async function withButton(c,a,f,h={}){const b=c.innerHTML,{successText:y="\u2705",resetDelay:v=DC.DELAYS.BTN_RESET}=h;c.disabled=!0,c.innerHTML=a;try{const u=await f();return c.innerHTML=y,setTimeout(()=>{c.innerHTML=b,c.disabled=!1},v),u}catch(u){throw c.innerHTML=b,c.disabled=!1,u}}function openModal(c){document.getElementById(c)?.classList.add("show")}function closeModal(c){document.getElementById(c)?.classList.remove("show")}function wireModal(c,...a){c&&(c.addEventListener("click",f=>{f.target===c&&c.classList.remove("show")}),a.forEach(f=>{f&&typeof f.addEventListener=="function"&&f.addEventListener("click",()=>c.classList.remove("show"))}))}function showNotification(c,a="info",f=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"}},y=b[a]||b.info,v=document.createElement("div");v.className="deploy-notification",v.textContent=c,v.style.cssText=` + `,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 m=JSON.parse(a);m.statsPollingInterval&&m.statsPollingInterval>=5&&m.statsPollingInterval<=3600&&(window.__DC_STATS_OVERRIDE=m.statsPollingInterval*1e3)}}catch{}})();const DC={NAME:"DashCaddy",POLL:{DASHBOARD:1e4,LOGS:3e3,STATS:typeof window<"u"&&window.__DC_STATS_OVERRIDE||5e3,WEATHER:6e5,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[y,u]of Object.entries(b.dnsServers))y!=="__proto__"&&y!=="constructor"&&y!=="prototype"&&(SITE.dnsServers[y]=u);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 m=document.getElementById("external-proxy-ip");m&&SITE.dnsIp&&(m.value=SITE.dnsIp,m.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 m='',h=l.firstElementChild;a.forEach(b=>{const g=escapeHtml(b),y=escapeHtml((SITE.dnsServers[b].name||b).toUpperCase()),u=document.createElement("div");u.className="card",u.setAttribute("data-app",b),u.setAttribute("data-status","off"),u.innerHTML=`
${m}
${y}OFF
--
--
`,l.insertBefore(u,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 m=(a.method||"GET").toUpperCase(),h=!["GET","HEAD","OPTIONS"].includes(m);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 y=await getCSRFToken();return a.headers={...a.headers,"X-CSRF-Token":y},a.signal=AbortSignal.timeout(15e3),fetch(l,a)}}catch{}return b}async function postJSON(l,a){const m=await secureFetch(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}),h=await m.json();if(!m.ok||h.success===!1)throw new Error(h.error||`Request failed (${m.status})`);return h}async function getJSON(l){const a=await secureFetch(l);if(!a.ok){let m=`Request failed (${a.status})`;try{m=(await a.json()).error||m}catch{}throw new Error(m)}return a.json()}async function deleteAPI(l){const a=await secureFetch(l,{method:"DELETE"}),m=await a.json();if(!a.ok||m.success===!1)throw new Error(m.error||`Delete failed (${a.status})`);return m}async function withButton(l,a,m,h={}){const b=l.innerHTML,{successText:g="\u2705",resetDelay:y=DC.DELAYS.BTN_RESET}=h;l.disabled=!0,l.innerHTML=a;try{const u=await m();return l.innerHTML=g,setTimeout(()=>{l.innerHTML=b,l.disabled=!1},y),u}catch(u){throw l.innerHTML=b,l.disabled=!1,u}}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",m=>{m.target===l&&l.classList.remove("show")}),a.forEach(m=>{m&&typeof m.addEventListener=="function"&&m.addEventListener("click",()=>l.classList.remove("show"))}))}function showNotification(l,a="info",m=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,y=document.createElement("div");y.className="deploy-notification",y.textContent=l,y.style.cssText=` position: fixed; top: 20px; right: 20px; - background: ${y.bg}; color: ${y.fg}; + 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),f>0&&setTimeout(()=>v.remove(),f)}function timeAgo(c){const a=Date.now()-new Date(c).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(c,a=null){try{const f=localStorage.getItem(c);return f!==null?f:a}catch{return a}}function safeSet(c,a){try{localStorage.setItem(c,a)}catch{}}function safeRemove(c){try{localStorage.removeItem(c)}catch{}}function safeSessionGet(c,a=null){try{const f=sessionStorage.getItem(c);return f!==null?f:a}catch{return a}}function safeSessionSet(c,a){try{sessionStorage.setItem(c,a)}catch{}}function safeGetJSON(c,a=null){try{const f=localStorage.getItem(c);return f?JSON.parse(f):a}catch{return a}}function escapeHtml(c){return String(c??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function injectModal(c,a){document.getElementById(c)||document.body.insertAdjacentHTML("beforeend",a)}const DC_BUS={_handlers:{},on(c,a){var f;((f=this._handlers)[c]||(f[c]=[])).push(a)},off(c,a){this._handlers[c]=this._handlers[c]?.filter(f=>f!==a)},emit(c,a){this._handlers[c]?.forEach(f=>f(a))}},AppState={_apps:[],getApps(){return this._apps},setApps(c){this._apps=c,window.APPS=c,DC_BUS.emit("apps:changed",c)},findApp(c){return this._apps.find(a=>a.id===c)},addApp(c){this._apps.push(c),window.APPS=this._apps,DC_BUS.emit("apps:changed",this._apps)},removeApp(c){const a=this._apps.findIndex(f=>f.id===c);return a>-1&&(this._apps.splice(a,1),window.APPS=this._apps,DC_BUS.emit("apps:changed",this._apps)),a>-1},updateApp(c,a){const f=this._apps.find(h=>h.id===c);if(f){for(const[h,b]of Object.entries(a))h!=="__proto__"&&h!=="constructor"&&h!=="prototype"&&(f[h]=b);DC_BUS.emit("apps:changed",this._apps)}return f}};(function(){function c(){const h=document.createElement("div");return h.className="skeleton-card",h.innerHTML='
',h}function a(h){const b=document.getElementById("cards");if(!(!b||b.querySelector(".card"))){h=h||6;for(let y=0;y.4,A={};return A.hover=k?g(x,B,.35):g(x,$,.08),A["card-hover"]=g(x,A.hover,.5),A.base=g(B,x,.6),A["fg-muted"]=g(E,B,.35),A.success=S,A.error=L,A.warning=k?"#d68a00":"#f39c12",A}function t(C,B){var $=B.lightBg||B.bg&&o(B.bg)>.4,E=B.accent||B["accent-strong"]||"#888888",x=i(E);return $?":root."+C+` body { + `,document.body.appendChild(y),m>0&&setTimeout(()=>y.remove(),m)}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 m=localStorage.getItem(l);return m!==null?m: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 m=sessionStorage.getItem(l);return m!==null?m:a}catch{return a}}function safeSessionSet(l,a){try{sessionStorage.setItem(l,a)}catch{}}function safeGetJSON(l,a=null){try{const m=localStorage.getItem(l);return m?JSON.parse(m):a}catch{return a}}function escapeHtml(l){return String(l??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function injectModal(l,a){document.getElementById(l)||document.body.insertAdjacentHTML("beforeend",a)}const DC_BUS={_handlers:{},on(l,a){var m;((m=this._handlers)[l]||(m[l]=[])).push(a)},off(l,a){this._handlers[l]=this._handlers[l]?.filter(m=>m!==a)},emit(l,a){this._handlers[l]?.forEach(m=>m(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(m=>m.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 m=this._apps.find(h=>h.id===l);if(m){for(const[h,b]of Object.entries(a))h!=="__proto__"&&h!=="constructor"&&h!=="prototype"&&(m[h]=b);DC_BUS.emit("apps:changed",this._apps)}return m}};(function(){function l(){const h=document.createElement("div");return h.className="skeleton-card",h.innerHTML='
',h}function a(h){const b=document.getElementById("cards");if(!(!b||b.querySelector(".card"))){h=h||6;for(let g=0;g.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&&r(B.bg)>.4,E=B.accent||B["accent-strong"]||"#888888",C=s(E);return A?":root."+x+` body { background: - radial-gradient(1200px 800px at 10% -10%, rgba(`+x.r+","+x.g+","+x.b+`, .08), transparent 60%), - radial-gradient(1000px 700px at 110% 10%, rgba(`+x.r+","+x.g+","+x.b+`, .05), transparent 55%), + 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."+C+` body { +`:":root."+x+` body { background: - radial-gradient(1200px 900px at 8% -12%, rgba(`+x.r+","+x.g+","+x.b+`, .10), transparent 60%), - radial-gradient(1000px 700px at 110% -10%, rgba(`+x.r+","+x.g+","+x.b+`, .07), transparent 55%), + 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 r(C,B){var $=B.lightBg||B.bg&&o(B.bg)>.4;return $?":root."+C+` button:hover { +`}function n(x,B){var A=B.lightBg||B.bg&&r(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."+C+` button:hover { +`:":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 n(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function s(){y.forEach(function(C){document.documentElement.style.removeProperty("--"+C)})}function p(C,B){var $=C.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");$||($="custom"),h.indexOf($)!==-1&&($=$+"-custom");for(var E=safeGetJSON(a,{}),x=$,S=2;E[$]&&$!==B;)$=x+"-"+S++;return $}function m(C){var B=document.getElementById("user-theme-styles");B&&B.remove(),b.length=h.length,Object.keys(l).forEach(function(L){h.indexOf(L)===-1&&delete l[L]});var $=C||safeGetJSON(a,{}),E=Object.keys($);if(E=E.filter(function(L){return h.indexOf(L)===-1}),!!E.length){var x="";E.forEach(function(L){var k=$[L];b.indexOf(L)===-1&&b.push(L);var A={};y.forEach(function(O){k[O]&&(A[O]=k[O])}),A["card-bg"]=k["card-base"]||k.bg,k.lightBg&&(A.lightBg=!0);var D=e(A);u.forEach(function(O){!A[O]&&D[O]&&(A[O]=D[O])}),l[L]=A,x+=":root."+L+` { -`,y.forEach(function(O){A[O]&&(x+=" --"+O+": "+A[O]+`; -`)}),x+=`} -`,x+=t(L,A),x+=r(L,A)});var S=document.createElement("style");S.id="user-theme-styles",S.textContent=x,document.head.appendChild(S)}}function w(){secureFetch("/api/v1/themes").then(function(C){return C.json()}).then(function(C){if(!(!C.success||!C.themes)){var B=C.themes,$=safeGetJSON(a,{});if(JSON.stringify(B)!==JSON.stringify($)){safeSet(a,JSON.stringify(B)),m(B);var E=safeGet(c);E&&b.indexOf(E)!==-1&&T(E)}}}).catch(function(){})}function I(){var C=safeGetJSON(f);if(C){var B=C.name||"Custom",$=p(B),E={name:B};y.forEach(function(L){C[L]&&(E[L]=C[L])});var x=safeGetJSON(a,{});x[$]=E,safeSet(a,JSON.stringify(x)),safeGet(c)==="custom"&&safeSet(c,$),safeRemove(f);var S={};y.forEach(function(L){E[L]&&(S[L]=E[L])}),fetch("/api/v1/themes/"+$,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:B,colors:S})}).catch(function(){})}}function T(C){document.documentElement.classList.add("theme-transitioning"),b.forEach(function(x){x!=="dark"&&document.documentElement.classList.remove(x)}),s(),C!=="dark"&&document.documentElement.classList.add(C),safeSet(c,C);var B=l[C],$=document.querySelector('meta[name="theme-color"]');$&&B&&$.setAttribute("content",B.bg);var E=B&&B.lightBg;!E&&B&&B.bg&&(E=o(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)}I(),m();var P=safeGet(c);P==="red"&&(P="black",safeSet(c,"black")),P&&P!=="dark"&&b.indexOf(P)===-1&&(P=null),T(P||n()),w(),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",function(C){safeGet(c)||T(C.matches?"dark":"light")}),window.THEMES=b,window.BUILTIN_THEMES=h,window.THEME_COLORS=l,window.THEME_PROPS=y,window.BASE_PROPS=v,window.DERIVED_PROPS=u,window.USER_THEMES_KEY=a,window.applyTheme=T,window.clearCustomProperties=s,window.injectUserThemeStyles=m,window.syncThemesFromServer=w,window.slugifyThemeName=p,window.getActiveTheme=function(){return safeGet(c)||n()},window.deriveExtendedColors=e,window.hexToRgb=i,window.rgbToHex=d,window.blendColors=g})(),(function(){let c=null;async function a(){if(c)return c;try{const g=await fetch("/api/v1/auth/login/methods",{cache:"no-store"});if(!g.ok)throw new Error(`methods HTTP ${g.status}`);const o=await g.json();return c=Array.isArray(o.providers)?o.providers:[],c}catch(g){return console.warn("[auth-gate] methods fetch failed; falling back to TOTP-only",g),[]}}function f(g){const o=document.getElementById("totp-overlay");if(!o)return;const e=o.querySelector(".totp-card");if(!e)return;const t=e.innerHTML;e.dataset.originalBody||(e.dataset.originalBody=t);const r=g.map(n=>{const s=n.config&&(n.config.label||n.name)||n.name;return``}).join(` -`);e.innerHTML=` +`);t.innerHTML=`

Choose how to sign in

-
${r}
+
${n}
- `,o.classList.add("show"),e.querySelectorAll(".provider-btn").forEach(n=>{n.addEventListener("click",()=>{const s=n.dataset.provider,p=g.find(m=>m.name===s);b(p)})})}function h(){const g=document.getElementById("totp-overlay");if(!g)return;const o=g.querySelector(".totp-card");!o||!o.dataset.originalBody||(o.innerHTML=o.dataset.originalBody,window.location.reload())}function b(g){const o=document.getElementById("totp-overlay");if(!o)return;const e=o.querySelector(".totp-card");if(e){if(g.name==="totp"){window.location.reload();return}if(g.name==="email"){e.innerHTML=` + `,r.classList.add("show"),t.querySelectorAll(".provider-btn").forEach(p=>{p.addEventListener("click",()=>{const o=p.dataset.provider,i=w.find(c=>c.name===o);b(i)})})}function h(){const w=document.getElementById("totp-overlay");if(!w)return;const r=w.querySelector(".totp-card");!r||!r.dataset.originalBody||(r.innerHTML=r.dataset.originalBody,window.location.reload())}function b(w){const r=document.getElementById("totp-overlay");if(!r)return;const t=r.querySelector(".totp-card");if(t){if(w.name==="totp"){window.location.reload();return}if(w.name==="email"){t.innerHTML=`

Sign in with email

@@ -75,13 +75,13 @@
\u2190 Back
- `,o.classList.add("show");const t=e.querySelector("#auth-gate-email-input"),r=e.querySelector("#auth-gate-email-submit"),n=e.querySelector("#auth-gate-email-status"),s=e.querySelector("#auth-gate-back");r.addEventListener("click",async()=>{const p=(t.value||"").trim();if(!p||!p.includes("@")){n.textContent="Enter a valid email address.",n.style.color="var(--error, #d33)";return}r.disabled=!0,n.textContent="Sending\u2026",n.style.color="";try{const w=await(await fetch("/api/v1/auth/login/email/initiate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:p})})).json();if(w.success){const I=w.deliveredVia||"email",T=w.maskedEmail||p;I==="dev-console"?n.innerHTML=` + `,r.classList.add("show");const e=t.querySelector("#auth-gate-email-input"),n=t.querySelector("#auth-gate-email-submit"),p=t.querySelector("#auth-gate-email-status"),o=t.querySelector("#auth-gate-back");n.addEventListener("click",async()=>{const i=(e.value||"").trim();if(!i||!i.includes("@")){p.textContent="Enter a valid email address.",p.style.color="var(--error, #d33)";return}n.disabled=!0,p.textContent="Sending\u2026",p.style.color="";try{const v=await(await fetch("/api/v1/auth/login/email/initiate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:i})})).json();if(v.success){const S=v.deliveredVia||"email",k=v.maskedEmail||i;S==="dev-console"?p.innerHTML=` Check the server logs for your one-time link. - (Dev mode: no SMTP configured. In production this would email ${T}.)`:n.innerHTML=`Sign-in link sent to ${T}. - Check your inbox (and spam folder).`,n.style.color="var(--success, #2a7)"}else n.textContent=w.error||"Could not send link.",n.style.color="var(--error, #d33)",r.disabled=!1}catch{n.textContent="Connection error. Try again.",n.style.color="var(--error, #d33)",r.disabled=!1}}),t.addEventListener("keydown",p=>{p.key==="Enter"&&r.click()}),s.addEventListener("click",p=>{p.preventDefault(),f(providers)});return}console.warn("[auth-gate] unknown provider",g.name),window.location.reload()}}async function y(){if(!document.getElementById("totp-overlay"))return;const o=await a();if(o.length===0){typeof window._showTotpOverlay=="function"&&window._showTotpOverlay();return}if(o.length===1&&o[0].name==="totp"){v(o[0]);return}f(o)}function v(g){const o=c&&c.find(n=>n.name==="email");if(!o){typeof window._showTotpOverlay=="function"&&window._showTotpOverlay();return}const e=document.getElementById("totp-overlay"),t=e.querySelector(".totp-card");if(!t)return;if(t.dataset.originalBody||(t.dataset.originalBody=t.innerHTML),!t.querySelector("#auth-gate-email-alt")){const n=document.createElement("div");n.id="auth-gate-email-alt",n.style.cssText="margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--border); font-size: 0.85rem;",n.innerHTML=`${k}.)`:p.innerHTML=`Sign-in link sent to ${k}. + Check your inbox (and spam folder).`,p.style.color="var(--success, #2a7)"}else p.textContent=v.error||"Could not send link.",p.style.color="var(--error, #d33)",n.disabled=!1}catch{p.textContent="Connection error. Try again.",p.style.color="var(--error, #d33)",n.disabled=!1}}),e.addEventListener("keydown",i=>{i.key==="Enter"&&n.click()}),o.addEventListener("click",i=>{i.preventDefault(),m(providers)});return}console.warn("[auth-gate] unknown provider",w.name),window.location.reload()}}async function g(){if(!document.getElementById("totp-overlay"))return;const r=await a();if(r.length===0){typeof window._showTotpOverlay=="function"&&window._showTotpOverlay();return}if(r.length===1&&r[0].name==="totp"){y(r[0]);return}m(r)}function y(w){const r=l&&l.find(p=>p.name==="email");if(!r){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 p=document.createElement("div");p.id="auth-gate-email-alt",p.style.cssText="margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--border); font-size: 0.85rem;",p.innerHTML=` Or sign in with email instead \u2192 - `,t.appendChild(n),n.querySelector("#auth-gate-email-alt-link").addEventListener("click",s=>{s.preventDefault(),b(o)})}e.classList.add("show")}window.__dc_049_handled=!0;function u(g){try{const o=new URL(g,window.location.origin);if(!["http:","https:"].includes(o.protocol))return!1;if(o.origin===window.location.origin)return!0;if(o.protocol!=="https:")return!1;const e=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`;return o.hostname===e.slice(1)||o.hostname.endsWith(e)}catch{return!1}}function l(g,o){const e=new URL(g,window.location.origin);if(e.origin===window.location.origin)return e.toString();const t=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,r=e.hostname===t.slice(1)||e.hostname.endsWith(t);if(e.protocol!=="https:"||!r||!o)return null;const n=`${e.pathname}${e.search}${e.hash}`;return e.pathname="/dashcaddy-sso",e.search="",e.hash="",e.searchParams.set("token",o),e.searchParams.set("return",n),e.toString()}async function i(g){if(!g||!u(g))return!1;try{const o=await fetch("/api/v1/auth/sso-handoff",{credentials:"include",cache:"no-store"});if(!o.ok)return!1;const e=await o.json(),t=e.success&&l(g,e.ssoToken);if(!t)return!1;try{sessionStorage.removeItem("totp_redirect")}catch{}return window.location.replace(t),!0}catch{return!1}}const d=new URLSearchParams(window.location.search);if(d.get("auth")==="required"){const g=d.get("return");if(g&&u(g))try{sessionStorage.setItem("totp_redirect",g)}catch{}window.history.replaceState({},"",window.location.pathname),setTimeout(async()=>{await i(g)||await y()},0)}window._showAuthGate=y,window._authGateMethods=a})(),(function(){function c(){const u=document.querySelector(".totp-card");if(!u)return;const i=getComputedStyle(u).backgroundColor.match(/\d+/g);if(!i)return;const d=(.299*+i[0]+.587*+i[1]+.114*+i[2])/255,g=u.querySelector(".totp-logo-dark"),o=u.querySelector(".totp-logo-light");g&&(g.style.display=d>.5?"none":""),o&&(o.style.display=d>.5?"":"none")}function a(){const u=document.getElementById("totp-overlay");if(u){u.classList.add("show"),setTimeout(c,50);const l=u.querySelector(".totp-digits input");l&&setTimeout(()=>l.focus(),100)}typeof window._refreshRecoveryLink=="function"&&window._refreshRecoveryLink()}function f(){const u=document.getElementById("totp-overlay");u&&u.classList.remove("show")}function h(u,l){const i=new URL(u,window.location.origin);if(i.origin===window.location.origin)return i.toString();const d=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,g=i.hostname===d.slice(1)||i.hostname.endsWith(d);if(i.protocol!=="https:"||!g)return null;if(!l)return i.toString();const o=`${i.pathname}${i.search}${i.hash}`;return i.pathname="/dashcaddy-sso",i.search="",i.hash="",i.searchParams.set("token",l),i.searchParams.set("return",o),i.toString()}const b=document.getElementById("totp-digits");if(b){const u=b.querySelectorAll("input");u.forEach((l,i)=>{l.addEventListener("input",d=>{const g=d.target.value.replace(/\D/g,"");d.target.value=g.slice(0,1),g&&ie.value).join("");o.length===6&&y(o)}),l.addEventListener("keydown",d=>{d.key==="Backspace"&&!d.target.value&&i>0&&(u[i-1].focus(),u[i-1].value="")}),l.addEventListener("paste",d=>{d.preventDefault();const g=(d.clipboardData.getData("text")||"").replace(/\D/g,"");g.length>=6&&(u.forEach((o,e)=>{o.value=g[e]||""}),u[5].focus(),y(g.slice(0,6)))})})}async function y(u){const l=document.getElementById("totp-error");l.textContent="Verifying...",l.className="totp-error verifying";try{const d=await(await secureFetch("/api/v1/totp/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:u})})).json();if(d.success){l.textContent="",d.csrfToken&&(csrfToken=d.csrfToken),f();const g=safeSessionGet("totp_redirect");if(g){try{sessionStorage.removeItem("totp_redirect")}catch{}const o=h(g,d.ssoToken);if(!o)return;window.location.href=o;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{l.textContent=d.error||"Invalid code",l.className="totp-error";const g=document.querySelectorAll("#totp-digits input");g.forEach(o=>{o.value=""}),g[0]?.focus()}}catch{l.textContent="Connection error",l.className="totp-error"}}if(!!!window.__dc_049_handled&&urlParams.get("auth")==="required"){const u=urlParams.get("return");if(u)try{const l=new URL(u,window.location.origin),i=l.hostname,d=l.origin===window.location.origin,g=SITE.tld.startsWith(".")?SITE.tld:"."+SITE.tld,o=i.endsWith(g)||i===g.substring(1);(d||o)&&safeSessionSet("totp_redirect",u)}catch{}window.history.replaceState({},"",window.location.pathname)}window._showTotpOverlay=a})(),(function(){"use strict";async function c(){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 u=document.getElementById("totp-recovery-link");u&&(u.style.display=v?"":"none")}function f(){const v=document.getElementById("totp-recovery-panel");v&&(v.style.display="");const u=document.getElementById("totp-recovery-status"),l=document.getElementById("totp-recovery-import"),i=document.getElementById("totp-recovery-verify");l&&(l.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="",c().then(d=>{u.textContent=d.hint||"",d.status==="healthy"?u.style.borderColor="var(--ok-fg, #7ef2ff)":d.status==="unreadable"?(u.style.borderColor="var(--bad-fg, #ff9aa3)",u.style.background="color-mix(in srgb, var(--bad-fg) 6%, transparent)"):d.status==="not_configured"?u.style.borderColor="var(--muted)":u.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(),u=document.getElementById("totp-recovery-error");if(u.textContent="",!v){u.textContent="Paste your Base32 key first";return}if(!/^[A-Za-z2-7\s]+=*$/.test(v)){u.textContent="Invalid Base32 format \u2014 should be letters A-Z and digits 2-7 only";return}try{const l=await fetch("/api/v1/totp/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:v})}),i=await l.json();if(!l.ok||!i.success){u.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{u.textContent="Network error \u2014 try again"}}async function y(){const v=document.getElementById("totp-recovery-code").value.trim(),u=document.getElementById("totp-recovery-confirm-error");if(u.textContent="",!/^\d{6}$/.test(v)){u.textContent="Enter a 6-digit code";return}try{const l=await fetch("/api/v1/totp/verify-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:v})}),i=await l.json();if(!l.ok||!i.success){u.textContent=i.error||i.message||"Invalid code",document.getElementById("totp-recovery-code").value="",document.getElementById("totp-recovery-code")?.focus();return}h();const d=document.getElementById("totp-overlay");d&&d.classList.remove("show"),typeof window.initializeDashboard=="function"&&window.initializeDashboard()}catch{u.textContent="Network error \u2014 try again"}}document.getElementById("totp-show-recovery")?.addEventListener("click",v=>{v.preventDefault(),f()}),document.getElementById("totp-recovery-close")?.addEventListener("click",h),document.getElementById("totp-recovery-submit")?.addEventListener("click",b),document.getElementById("totp-recovery-confirm")?.addEventListener("click",y),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(),y())}),window._refreshRecoveryLink=async function(){const v=await c();return v&&v.success&&v.status&&v.status!=="healthy"?a(!0):a(!1),v}})(),(function(){const c=new ErrorHandler;injectModal("folder-browser-modal",`
+ `,e.appendChild(p),p.querySelector("#auth-gate-email-alt-link").addEventListener("click",o=>{o.preventDefault(),b(r)})}t.classList.add("show")}window.__dc_049_handled=!0;function u(w){try{const r=new URL(w,window.location.origin);if(!["http:","https:"].includes(r.protocol))return!1;if(r.origin===window.location.origin)return!0;if(r.protocol!=="https:")return!1;const t=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`;return r.hostname===t.slice(1)||r.hostname.endsWith(t)}catch{return!1}}function d(w,r){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||!r)return null;const p=`${t.pathname}${t.search}${t.hash}`;return t.pathname="/dashcaddy-sso",t.search="",t.hash="",t.searchParams.set("token",r),t.searchParams.set("return",p),t.toString()}async function s(w){if(!w||!u(w))return!1;try{const r=new URL(w,window.location.origin),t=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,e=r.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 p=await n.json(),o=p.success&&d(w,p.ssoToken);if(!o)return!1;try{sessionStorage.removeItem("totp_redirect")}catch{}return window.location.replace(o),!0}catch{return!1}}const f=new URLSearchParams(window.location.search);if(f.get("auth")==="required"){const w=f.get("return");if(w&&u(w))try{sessionStorage.setItem("totp_redirect",w)}catch{}window.history.replaceState({},"",window.location.pathname),setTimeout(async()=>{await s(w)||await g()},0)}window._showAuthGate=g,window._authGateMethods=a})(),(function(){function l(){const u=document.querySelector(".totp-card");if(!u)return;const s=getComputedStyle(u).backgroundColor.match(/\d+/g);if(!s)return;const f=(.299*+s[0]+.587*+s[1]+.114*+s[2])/255,w=u.querySelector(".totp-logo-dark"),r=u.querySelector(".totp-logo-light");w&&(w.style.display=f>.5?"none":""),r&&(r.style.display=f>.5?"":"none")}function a(){const u=document.getElementById("totp-overlay");if(u){u.classList.add("show"),setTimeout(l,50);const d=u.querySelector(".totp-digits input");d&&setTimeout(()=>d.focus(),100)}typeof window._refreshRecoveryLink=="function"&&window._refreshRecoveryLink()}function m(){const u=document.getElementById("totp-overlay");u&&u.classList.remove("show")}function h(u,d){const s=new URL(u,window.location.origin);if(s.origin===window.location.origin)return s.toString();const f=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,w=s.hostname===f.slice(1)||s.hostname.endsWith(f);if(s.protocol!=="https:"||!w)return null;if(!d)return s.toString();const r=`${s.pathname}${s.search}${s.hash}`;return s.pathname="/dashcaddy-sso",s.search="",s.hash="",s.searchParams.set("token",d),s.searchParams.set("return",r),s.toString()}const b=document.getElementById("totp-digits");if(b){const u=b.querySelectorAll("input");u.forEach((d,s)=>{d.addEventListener("input",f=>{const w=f.target.value.replace(/\D/g,"");f.target.value=w.slice(0,1),w&&st.value).join("");r.length===6&&g(r)}),d.addEventListener("keydown",f=>{f.key==="Backspace"&&!f.target.value&&s>0&&(u[s-1].focus(),u[s-1].value="")}),d.addEventListener("paste",f=>{f.preventDefault();const w=(f.clipboardData.getData("text")||"").replace(/\D/g,"");w.length>=6&&(u.forEach((r,t)=>{r.value=w[t]||""}),u[5].focus(),g(w.slice(0,6)))})})}async function g(u){const d=document.getElementById("totp-error");d.textContent="Verifying...",d.className="totp-error verifying";const s=safeSessionGet("totp_redirect");let f=null;if(s)try{const w=new URL(s,window.location.origin),r=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,t=w.hostname.slice(0,-r.length);w.hostname.endsWith(r)&&/^[a-z0-9][a-z0-9-]*$/.test(t)&&(f=t)}catch{}try{const r=await(await secureFetch("/api/v1/totp/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:u,serviceId:f})})).json();if(r.success){if(d.textContent="",r.csrfToken&&(csrfToken=r.csrfToken),m(),s){try{sessionStorage.removeItem("totp_redirect")}catch{}const t=h(s,r.ssoToken);if(!t)return;window.location.href=t;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{d.textContent=r.error||"Invalid code",d.className="totp-error";const t=document.querySelectorAll("#totp-digits input");t.forEach(e=>{e.value=""}),t[0]?.focus()}}catch{d.textContent="Connection error",d.className="totp-error"}}if(!!!window.__dc_049_handled&&urlParams.get("auth")==="required"){const u=urlParams.get("return");if(u)try{const d=new URL(u,window.location.origin),s=d.hostname,f=d.origin===window.location.origin,w=SITE.tld.startsWith(".")?SITE.tld:"."+SITE.tld,r=s.endsWith(w)||s===w.substring(1);(f||r)&&safeSessionSet("totp_redirect",u)}catch{}window.history.replaceState({},"",window.location.pathname)}window._showTotpOverlay=a})(),(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(y){const u=document.getElementById("totp-recovery-link");u&&(u.style.display=y?"":"none")}function m(){const y=document.getElementById("totp-recovery-panel");y&&(y.style.display="");const u=document.getElementById("totp-recovery-status"),d=document.getElementById("totp-recovery-import"),s=document.getElementById("totp-recovery-verify");d&&(d.style.display=""),s&&(s.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(f=>{u.textContent=f.hint||"",f.status==="healthy"?u.style.borderColor="var(--ok-fg, #7ef2ff)":f.status==="unreadable"?(u.style.borderColor="var(--bad-fg, #ff9aa3)",u.style.background="color-mix(in srgb, var(--bad-fg) 6%, transparent)"):f.status==="not_configured"?u.style.borderColor="var(--muted)":u.style.borderColor="var(--border)"}),setTimeout(()=>{document.getElementById("totp-recovery-secret")?.focus()},100)}function h(){const y=document.getElementById("totp-recovery-panel");y&&(y.style.display="none")}async function b(){const y=document.getElementById("totp-recovery-secret").value.trim(),u=document.getElementById("totp-recovery-error");if(u.textContent="",!y){u.textContent="Paste your Base32 key first";return}if(!/^[A-Za-z2-7\s]+=*$/.test(y)){u.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:y})}),s=await d.json();if(!d.ok||!s.success){u.textContent=s.error||s.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{u.textContent="Network error \u2014 try again"}}async function g(){const y=document.getElementById("totp-recovery-code").value.trim(),u=document.getElementById("totp-recovery-confirm-error");if(u.textContent="",!/^\d{6}$/.test(y)){u.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:y})}),s=await d.json();if(!d.ok||!s.success){u.textContent=s.error||s.message||"Invalid code",document.getElementById("totp-recovery-code").value="",document.getElementById("totp-recovery-code")?.focus();return}h();const f=document.getElementById("totp-overlay");f&&f.classList.remove("show"),typeof window.initializeDashboard=="function"&&window.initializeDashboard()}catch{u.textContent="Network error \u2014 try again"}}document.getElementById("totp-show-recovery")?.addEventListener("click",y=>{y.preventDefault(),m()}),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",y=>{y.key==="Enter"&&(y.preventDefault(),b())}),document.getElementById("totp-recovery-code")?.addEventListener("keydown",y=>{y.key==="Enter"&&(y.preventDefault(),g())}),window._refreshRecoveryLink=async function(){const y=await l();return y&&y.success&&y.status&&y.status!=="healthy"?a(!0):a(!1),y}})(),(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),y=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,u=`${b}${y}`;return g.protocol==="https:"&&g.hostname===u}catch{return!1}}function a(h,b,g){if(!l(h,g))return null;const y=new URL(h,window.location.origin);if(!b)return null;const u=`${y.pathname}${y.search}${y.hash}`;return y.pathname="/dashcaddy-sso",y.search="",y.hash="",y.searchParams.set("token",b),y.searchParams.set("return",u),y.toString()}async function m(h,b,g={}){if(!l(h,b))return!1;const y=g.fetch||window.fetch.bind(window),u=g.location||window.location;try{const d=await y(`/api/v1/auth/sso-handoff?serviceId=${encodeURIComponent(b)}`,{credentials:"include",cache:"no-store"});if(!d.ok)return!1;const s=await d.json(),f=s.success&&a(h,s.ssoToken,b);return f?(u.replace(f),!0):!1}catch{return!1}}window.DCCredentialVault={isAllowedReturnUrl:l,buildHandoffTarget:a,resume:m}})(),(function(){const l=new ErrorHandler;injectModal("folder-browser-modal",`

\u{1F4C2} Browse for Media Folders

@@ -110,8 +110,8 @@
`),injectModal("service-creds-modal",`
-

Service Credentials

-

Credentials are injected automatically when accessing this service.

+

Encrypted Credential Vault

+

Passwords are encrypted at rest and used automatically when you open this service.

@@ -169,7 +169,7 @@
-
`);const a=document.getElementById("service-creds-modal");let f=null;const h=["sonarr","radarr","prowlarr","overseerr"],b=["sonarr","radarr"];function y(d){return d.externalUrl||d.url||""}function v(d){const g=document.getElementById("svc-creds-error");g.textContent=d,g.style.display=""}function u(){const d=document.getElementById("svc-creds-error");d.textContent="",d.style.display="none"}window.openServiceCredsModal=async function(d){f=d,u();const g=document.getElementById("svc-creds-title"),o=document.getElementById("svc-creds-desc"),e=document.getElementById("svc-creds-seedhost"),t=document.getElementById("svc-creds-apikey"),r=document.getElementById("svc-creds-basic"),n=document.getElementById("svc-creds-quality");g.textContent=d.name+" Credentials";const s=!!d.isExternal,p=h.includes(d.id)||h.includes(d.appTemplate),m=b.includes(d.id)||b.includes(d.appTemplate);e.style.display=s?"":"none",t.style.display=p?"":"none",n.style.display=m?"":"none",r.style.display=s?"none":"";const w=document.getElementById("svc-quality-select");w.innerHTML='',document.getElementById("svc-quality-status").textContent="",s?(o.textContent="Seedhost credentials auto-login past the HTTP prompt. API key bypasses the app login.",document.getElementById("svc-seedhost-pass").placeholder=`Password for ${d.name}`):p?o.textContent="API key bypasses the app login screen automatically.":o.textContent="Credentials are injected automatically when accessing this service.",await l(d),a.classList.add("show")};async function l(d){const g=document.getElementById("svc-creds-dot"),o=document.getElementById("svc-creds-status"),e=document.getElementById("svc-creds-clear");let t=!1;if(d.isExternal){try{const s=await(await fetch(`/api/v1/seedhost-creds?serviceId=${d.id}`)).json();s.success?(document.getElementById("svc-seedhost-user").value=s.username||"",s.hasCredentials&&(t=!0)):document.getElementById("svc-seedhost-user").value=""}catch{}document.getElementById("svc-seedhost-pass").value=""}try{const s=await(await fetch(`/api/v1/services/${d.id}/credentials`)).json();s.success&&(s.hasApiKey?(document.getElementById("svc-apikey-input").value="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",t=!0):document.getElementById("svc-apikey-input").value="",s.hasBasicAuth&&!d.isExternal?(document.getElementById("svc-basic-user").value=s.username||"",t=!0):document.getElementById("svc-basic-user").value="")}catch{}document.getElementById("svc-basic-pass")&&(document.getElementById("svc-basic-pass").value="");const r=d.id||d.appTemplate;if(b.includes(r)&&await i(d),t){g.style.background="var(--ok-fg, #74dfc4)",o.style.color="var(--ok-fg, #74dfc4)",o.textContent="Credentials stored",e.style.display="";const n=document.getElementById(`creds-btn-${d.id}`);n&&n.classList.add("has-creds")}else g.style.background="var(--muted)",o.style.color="var(--muted)",o.textContent="No credentials stored",e.style.display="none"}async function i(d){const g=document.getElementById("svc-quality-select"),o=document.getElementById("svc-quality-status"),e=d.id||d.appTemplate,t=y(d);if(!t){g.innerHTML='';return}g.innerHTML='',o.textContent="";try{const r=new URLSearchParams({service:e,url:t}),s=await(await fetch(`/api/v1/arr/quality-profiles?${r}`)).json();if(!s.success||!s.profiles?.length){g.innerHTML='';return}g.innerHTML="";for(const p of s.profiles){const m=document.createElement("option");m.value=p.id,m.textContent=p.name,g.appendChild(m)}if(s.storedProfileId&&(g.value=String(s.storedProfileId)),!g.value){const p=s.profiles.find(m=>/720/i.test(m.name));p&&(g.value=String(p.id))}!g.value&&s.profiles.length&&(g.value=String(s.profiles[0].id)),o.innerHTML=`${s.profiles.length} profiles loaded`}catch(r){g.innerHTML='',o.innerHTML=`Error: ${r.message}`}}document.getElementById("svc-quality-fetch")?.addEventListener("click",async()=>{if(!f)return;const d=f.id||f.appTemplate,g=y(f),e=document.getElementById("svc-apikey-input")?.value.trim(),t=document.getElementById("svc-quality-select"),r=document.getElementById("svc-quality-status");if(!g){r.innerHTML='No service URL available';return}if(!e||e==="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"){r.innerHTML='Enter an API key first';return}t.innerHTML='',r.textContent="";try{const n=new URLSearchParams({service:d,url:g,apiKey:e}),p=await(await fetch(`/api/v1/arr/quality-profiles?${n}`)).json();if(!p.success){t.innerHTML='',r.innerHTML=`${p.error||"Failed to fetch profiles"}`;return}if(!p.profiles?.length){t.innerHTML='';return}t.innerHTML="";for(const w of p.profiles){const I=document.createElement("option");I.value=w.id,I.textContent=w.name,t.appendChild(I)}const m=p.profiles.find(w=>/720/i.test(w.name));m?t.value=String(m.id):p.profiles.length&&(t.value=String(p.profiles[0].id)),r.innerHTML=`${p.profiles.length} profiles loaded`}catch(n){t.innerHTML='',r.innerHTML=`${n.message}`}}),document.getElementById("svc-creds-save")?.addEventListener("click",async()=>{if(!f)return;const d=document.getElementById("svc-creds-save");d.textContent="Saving...",d.disabled=!0,u();try{const g=h.includes(f.id)||h.includes(f.appTemplate),o=f.id||f.appTemplate;if(f.isExternal){const r=document.getElementById("svc-seedhost-user").value.trim(),n=document.getElementById("svc-seedhost-pass").value;r&&await secureFetch("/api/v1/seedhost-creds",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r,password:n||void 0,serviceId:f.id})})}const t=document.getElementById("svc-apikey-input")?.value.trim();if(t&&t!=="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022")if(g){const r=y(f),n=document.getElementById("svc-quality-select"),s=n?.value?parseInt(n.value):void 0,p=n?.selectedOptions?.[0]?.textContent||void 0,w=await(await secureFetch("/api/v1/arr/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:o,apiKey:t,url:r||void 0,qualityProfileId:s||void 0,qualityProfileName:p||void 0})})).json();if(!w.success){v(w.error||"Failed to save API key"),d.textContent="Save",d.disabled=!1;return}w.connectionTest&&!w.connectionTest.success&&v(`API key saved but connection test failed: ${w.connectionTest.error}`)}else await secureFetch(`/api/v1/services/${f.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:t})});else if(g&&b.includes(o)){const r=document.getElementById("svc-quality-select"),n=r?.value?parseInt(r.value):void 0,s=r?.selectedOptions?.[0]?.textContent||void 0;n&&await secureFetch("/api/v1/arr/quality-profiles",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:o,qualityProfileId:n,qualityProfileName:s})})}if(!f.isExternal){const r=document.getElementById("svc-basic-user").value.trim(),n=document.getElementById("svc-basic-pass").value;r&&n&&await secureFetch(`/api/v1/services/${f.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r,password:n})})}await l(f)}catch(g){c.logError("[ServiceCredentials] Save",g,{function:"saveCredentials"}),v("Failed to save: "+(g.message||"Unknown error"))}d.textContent="Save",d.disabled=!1}),document.getElementById("svc-creds-clear")?.addEventListener("click",async()=>{if(f&&confirm(`Remove stored credentials for ${f.name}?`)){u();try{const d=f.id||f.appTemplate,g=h.includes(d);f.isExternal&&await secureFetch(`/api/v1/seedhost-creds?serviceId=${f.id}`,{method:"DELETE"}),await secureFetch(`/api/v1/services/${f.id}/credentials`,{method:"DELETE"}),g&&await secureFetch(`/api/v1/arr/credentials/${d}`,{method:"DELETE"});const o=document.getElementById(`creds-btn-${f.id}`);o&&o.classList.remove("has-creds"),await l(f)}catch(d){c.logError("[ServiceCredentials] Clear",d,{function:"clearCredentials"}),v("Failed to clear: "+(d.message||"Unknown error"))}}}),document.getElementById("svc-creds-close")?.addEventListener("click",()=>{a.classList.remove("show"),f=null}),a?.addEventListener("click",d=>{d.target===a&&(a.classList.remove("show"),f=null)}),window.refreshCredsButtons=async function(){try{for(const d of window.APPS||[]){if(!d.isExternal&&!d.appTemplate&&!d.url)continue;let g=!1;if(d.isExternal)try{const t=await(await fetch(`/api/v1/seedhost-creds?serviceId=${d.id}`)).json();t.success&&t.hasCredentials&&(g=!0)}catch{}try{const t=await(await fetch(`/api/v1/services/${d.id}/credentials`)).json();t.success&&(t.hasApiKey||t.hasBasicAuth)&&(g=!0)}catch{}const o=document.getElementById(`creds-btn-${d.id}`);o&&o.classList.toggle("has-creds",g)}}catch{}}})(),(function(){const c=new ErrorHandler;injectModal("totp-settings-modal",`
+
`);const a=document.getElementById("service-creds-modal");let m=null,h=null,b=!1;const g=["sonarr","radarr","prowlarr","overseerr"],y=["sonarr","radarr"];function u(e){return e.externalUrl||e.url||""}function d(e){const n=document.getElementById("svc-creds-error");n.textContent=e,n.style.display=""}function s(){const e=document.getElementById("svc-creds-error");e.textContent="",e.style.display="none"}async function f(e,n){if(!e)throw new Error(`${n} failed: no response`);let p;try{p=await e.json()}catch{throw new Error(`${n} failed: invalid server response`)}if(!e.ok||p?.success!==!0)throw new Error(p?.error||`${n} failed (${e.status||"unknown status"})`);return p}function w(e,n){return!!window.DCCredentialVault?.isAllowedReturnUrl(e,n)}window.openServiceCredsModal=async function(e,n={}){m=e,h=w(n.returnUrl,e.id)?n.returnUrl:null,b=!1,s();const p=document.getElementById("svc-creds-title"),o=document.getElementById("svc-creds-desc"),i=document.getElementById("svc-creds-seedhost"),c=document.getElementById("svc-creds-apikey"),v=document.getElementById("svc-creds-basic"),S=document.getElementById("svc-creds-quality");p.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=y.includes(e.id)||y.includes(e.appTemplate);i.style.display=k?"":"none",c.style.display=L?"":"none",S.style.display=x?"":"none",v.style.display=k?"none":"";const B=document.getElementById("svc-quality-select");B.innerHTML='',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 r(e),a.classList.add("show")};async function r(e){const n=document.getElementById("svc-creds-dot"),p=document.getElementById("svc-creds-status"),o=document.getElementById("svc-creds-clear");let i=!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&&(i=!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",i=!0):document.getElementById("svc-apikey-input").value="",S.hasBasicAuth&&!e.isExternal?(document.getElementById("svc-basic-user").value=S.username||"",i=!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(y.includes(c)&&await t(e),i){b=!0,n.style.background="var(--ok-fg, #74dfc4)",p.style.color="var(--ok-fg, #74dfc4)",p.textContent="Credentials stored",o.style.display="";const v=document.getElementById(`creds-btn-${e.id}`);v&&v.classList.add("has-creds")}else n.style.background="var(--muted)",p.style.color="var(--muted)",p.textContent="No credentials stored",o.style.display="none"}async function t(e){const n=document.getElementById("svc-quality-select"),p=document.getElementById("svc-quality-status"),o=e.id||e.appTemplate,i=u(e);if(!i){n.innerHTML='';return}n.innerHTML='',p.textContent="";try{const c=new URLSearchParams({service:o,url:i}),S=await(await fetch(`/api/v1/arr/quality-profiles?${c}`)).json();if(!S.success||!S.profiles?.length){n.innerHTML='';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)),p.innerHTML=`${S.profiles.length} profiles loaded`}catch(c){n.innerHTML='',p.innerHTML=`Error: ${c.message}`}}document.getElementById("svc-quality-fetch")?.addEventListener("click",async()=>{if(!m)return;const e=m.id||m.appTemplate,n=u(m),o=document.getElementById("svc-apikey-input")?.value.trim(),i=document.getElementById("svc-quality-select"),c=document.getElementById("svc-quality-status");if(!n){c.innerHTML='No service URL available';return}if(!o||o==="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"){c.innerHTML='Enter an API key first';return}i.innerHTML='',c.textContent="";try{const v=new URLSearchParams({service:e,url:n,apiKey:o}),k=await(await fetch(`/api/v1/arr/quality-profiles?${v}`)).json();if(!k.success){i.innerHTML='',c.innerHTML=`${k.error||"Failed to fetch profiles"}`;return}if(!k.profiles?.length){i.innerHTML='';return}i.innerHTML="";for(const x of k.profiles){const B=document.createElement("option");B.value=x.id,B.textContent=x.name,i.appendChild(B)}const L=k.profiles.find(x=>/720/i.test(x.name));L?i.value=String(L.id):k.profiles.length&&(i.value=String(k.profiles[0].id)),c.innerHTML=`${k.profiles.length} profiles loaded`}catch(v){i.innerHTML='',c.innerHTML=`${v.message}`}}),document.getElementById("svc-creds-save")?.addEventListener("click",async()=>{if(!m)return;const e=document.getElementById("svc-creds-save");e.textContent="Saving...",e.disabled=!0,s();try{const n=g.includes(m.id)||g.includes(m.appTemplate),p=m.id||m.appTemplate;if(h&&!b){const c=document.getElementById("svc-seedhost-user").value.trim(),v=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=m.isExternal&&c&&v,A=n&&k&&k!=="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",E=!m.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(m.isExternal){const c=document.getElementById("svc-seedhost-user").value.trim(),v=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:v||void 0,serviceId:m.id})});await f(S,"Seedhost credential save")}}const i=document.getElementById("svc-apikey-input")?.value.trim();if(i&&i!=="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022")if(n){const c=u(m),v=document.getElementById("svc-quality-select"),S=v?.value?parseInt(v.value):void 0,k=v?.selectedOptions?.[0]?.textContent||void 0,L=await secureFetch("/api/v1/arr/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:p,apiKey:i,url:c||void 0,qualityProfileId:S||void 0,qualityProfileName:k||void 0})}),x=await f(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/${m.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:i})});await f(c,"API key save")}else if(n&&y.includes(p)){const c=document.getElementById("svc-quality-select"),v=c?.value?parseInt(c.value):void 0,S=c?.selectedOptions?.[0]?.textContent||void 0;if(v){const k=await secureFetch("/api/v1/arr/quality-profiles",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:p,qualityProfileId:v,qualityProfileName:S})});await f(k,"Quality profile save")}}if(!m.isExternal){const c=document.getElementById("svc-basic-user").value.trim(),v=document.getElementById("svc-basic-pass").value;if(c&&v){const S=await secureFetch(`/api/v1/services/${m.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:c,password:v})});await f(S,"Service credential save")}}if(await r(m),h){const c=h;if(!await window.DCCredentialVault?.resume(c,m.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(m&&confirm(`Remove stored credentials for ${m.name}?`)){s();try{const e=m.id||m.appTemplate,n=g.includes(e);if(m.isExternal){const i=await secureFetch(`/api/v1/seedhost-creds?serviceId=${m.id}`,{method:"DELETE"});await f(i,"Seedhost credential removal")}const p=await secureFetch(`/api/v1/services/${m.id}/credentials`,{method:"DELETE"});if(await f(p,"Service credential removal"),n){const i=await secureFetch(`/api/v1/arr/credentials/${e}`,{method:"DELETE"});await f(i,"ARR credential removal")}const o=document.getElementById(`creds-btn-${m.id}`);o&&o.classList.remove("has-creds"),await r(m)}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"),m=null,h=null}),a?.addEventListener("click",e=>{e.target===a&&(a.classList.remove("show"),m=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 i=await(await fetch(`/api/v1/seedhost-creds?serviceId=${e.id}`)).json();i.success&&i.hasCredentials&&(n=!0)}catch{}try{const i=await(await fetch(`/api/v1/services/${e.id}/credentials`)).json();i.success&&(i.hasApiKey||i.hasBasicAuth)&&(n=!0)}catch{}const p=document.getElementById(`creds-btn-${e.id}`);p&&p.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 p=(window.APPS||[]).find(i=>i.id===n||i.appTemplate===n);if(!p)return!1;const o=e.get("return");return window.history.replaceState({},"",window.location.pathname),window.openServiceCredsModal(p,{returnUrl:o}),!0}})(),(function(){const l=new ErrorHandler;injectModal("totp-settings-modal",`

Authentication Settings

@@ -288,7 +288,7 @@
-
`);async function a(){try{const v=await(await fetch("/api/v1/totp/config")).json();if(!v.success)return;const{enabled:u,sessionDuration:l,isSetUp:i}=v.config,d=document.getElementById("totp-status-dot"),g=document.getElementById("totp-status-text"),o=document.getElementById("totp-status-banner"),e=document.getElementById("totp-setup-section"),t=document.getElementById("totp-qr-section"),r=document.getElementById("totp-duration-section"),n=document.getElementById("totp-disable-section");if(u&&i){d.style.background="var(--ok-fg, #7ef2ff)",o.style.borderColor="var(--ok-fg, #7ef2ff)",o.style.background="color-mix(in srgb, var(--ok-fg) 8%, transparent)",g.textContent="TOTP is active",g.style.color="var(--ok-fg, #7ef2ff)",e.style.display="block";const s=document.getElementById("totp-setup-btn");s&&(s.textContent="Generate New Secret"),t.style.display="none",r.style.display="block",n.style.display="block",document.getElementById("totp-duration-select").value=l}else d.style.background="var(--muted)",o.style.borderColor="var(--border)",o.style.background="transparent",g.textContent="TOTP is not configured",g.style.color="var(--muted)",e.style.display="block",t.style.display="none",r.style.display="none",n.style.display="none";b(u&&i,l)}catch(y){console.warn("Failed to load TOTP settings:",y)}}const f={"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(y,v){const u=window.DCI18n;return u&&u.isLoaded()?u.t(y):v}function b(y,v){const u=document.getElementById("auth-card"),l=document.getElementById("auth-pill"),i=document.getElementById("auth-dot"),d=document.getElementById("auth-status-text");u&&(y?(u.setAttribute("data-status","on"),l.className="badge on",l.textContent=h("card.status.yes","YES"),i.className="dot ok at-bl",d.textContent="Session: "+(f[v]||v)):(u.setAttribute("data-status","off"),l.className="badge off",l.textContent=h("card.status.no","NO"),i.className="dot bad at-bl",d.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(y){c.logError("[TOTP] Setup Failed",y,{function:"setupTOTP"})}}),document.getElementById("totp-import-btn")?.addEventListener("click",async()=>{const y=document.getElementById("totp-import-key").value.trim(),v=document.getElementById("totp-import-error");if(v.textContent="",!y){v.textContent="Paste a Base32 secret key first";return}try{const l=await(await secureFetch("/api/v1/totp/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:y})})).json();l.success?(v.textContent="",document.getElementById("totp-qr-image").src=l.qrCode,document.getElementById("totp-manual-key").textContent=l.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=l.error||l.message||"Import failed"}catch{v.textContent="Connection error \u2014 try refreshing the page"}}),document.getElementById("totp-copy-key")?.addEventListener("click",()=>{const y=document.getElementById("totp-manual-key").textContent;navigator.clipboard.writeText(y).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 y=document.getElementById("totp-manual-key").textContent.trim();if(!y)return;const v={service:"DashCaddy",type:"totp-secret",secret:y,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.'},u=new Blob([JSON.stringify(v,null,2)],{type:"application/json"}),l=URL.createObjectURL(u),i=document.createElement("a");i.href=l,i.download=`dashcaddy-totp-backup-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(l);const d=document.getElementById("totp-download-backup");d.textContent="\u2705 Saved",setTimeout(()=>{d.textContent="\u2B07 Download"},2e3)}),document.getElementById("totp-confirm-setup")?.addEventListener("click",async()=>{const y=document.getElementById("totp-setup-code").value,v=document.getElementById("totp-setup-error");if(!/^\d{6}$/.test(y)){v.textContent="Enter a 6-digit code";return}try{const l=await(await secureFetch("/api/v1/totp/verify-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:y})})).json();l.success?(v.textContent="",a()):v.textContent=l.error||"Invalid code"}catch{v.textContent="Connection error"}}),document.getElementById("totp-setup-code")?.addEventListener("keydown",y=>{y.key==="Enter"&&document.getElementById("totp-confirm-setup")?.click()}),document.getElementById("totp-duration-select")?.addEventListener("change",async y=>{try{await secureFetch("/api/v1/totp/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionDuration:y.target.value})}),a()}catch(v){c.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(y){c.logError("[TOTP] Disable Failed",y,{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",y=>{y.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 u=v.config.enabled&&v.config.isSetUp;b(u,v.config.sessionDuration)}}catch(y){c.logError("[TOTP] AuthCard Update",y,{function:"authCardUpdate"})}})()})(),(function(){"use strict";const c={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(o,e,...t){const r=document.createElement(o);if(e)for(const n of Object.keys(e)){const s=e[n];s==null||s===!1||(n==="class"?r.className=s:n==="text"?r.textContent=s:n==="html"?r.innerHTML=s:n.startsWith("on")&&typeof s=="function"?r.addEventListener(n.slice(2).toLowerCase(),s):r.setAttribute(n,s))}for(const n of t)n==null||n===!1||(typeof n=="string"?r.appendChild(document.createTextNode(n)):r.appendChild(n));return r}async function f(o,e){const t=window.SITE&&window.SITE.csrfToken||"";e=e||{},e.headers=Object.assign({"Content-Type":"application/json"},e.headers||{},t?{"X-CSRF-Token":t}:{}),e.body&&typeof e.body!="string"&&(e.body=JSON.stringify(e.body));const r=await fetch(o,e),n=await r.json().catch(()=>({}));if(!r.ok){const s=n&&(n.message||n.error)||"HTTP "+r.status,p=new Error(s);throw p.status=r.status,p}return n}function h(o){const e={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;"+(e[o]||e.viewer),text:o})}function b(o,e,t){if(o.innerHTML="",!e||e.length===0){o.appendChild(a("p",{style:"color:var(--muted)",text:"No users yet."}));return}const r=a("table",{style:"width:100%;border-collapse:collapse;font-size:0.9rem"});r.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 n=a("tbody");for(const s of e){const p=a("tr",{style:"border-bottom:1px solid var(--border)"}),m=a("td",{style:"padding:8px"});m.appendChild(a("span",{text:s.email||"(no email)"})),s.displayName&&s.displayName!==(s.email||"").split("@")[0]&&(m.appendChild(a("br")),m.appendChild(a("small",{style:"color:var(--muted)",text:s.displayName}))),p.appendChild(m);const w=a("td",{style:"padding:8px"});w.appendChild(h(s.role)),p.appendChild(w),p.appendChild(a("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:s.createdAt?new Date(s.createdAt).toLocaleDateString():"\u2014"})),p.appendChild(a("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:s.lastLoginAt?new Date(s.lastLoginAt).toLocaleString():"\u2014"}));const I=a("td",{style:"padding:8px;text-align:right"}),T=a("select",{style:"padding:2px 6px;margin-right:6px",onchange:async C=>{try{await f(c.users+"/"+encodeURIComponent(s.id),{method:"PATCH",body:{role:C.target.value}}),t&&t()}catch(B){window.errorHandler&&window.errorHandler.show("Role update failed: "+B.message),C.target.value=s.role}}});for(const C of["admin","operator","viewer"]){const B=a("option",{value:C,text:C});C===s.role&&(B.selected=!0),T.appendChild(B)}I.appendChild(T);const P=a("button",{class:"btn-sm",style:"padding:2px 8px",text:"Delete",onclick:async()=>{if(confirm("Delete user "+(s.email||s.id)+"? This cannot be undone."))try{await f(c.users+"/"+encodeURIComponent(s.id),{method:"DELETE"}),t&&t()}catch(C){window.errorHandler&&window.errorHandler.show("Delete failed: "+C.message)}}});I.appendChild(P),p.appendChild(I),n.appendChild(p)}r.appendChild(n),o.appendChild(r)}function y(o,e){const t=a("form",{style:"display:flex;gap:8px;flex-wrap:wrap;align-items:end",onsubmit:async n=>{n.preventDefault();const s=new FormData(n.target),p={email:s.get("email"),role:s.get("role"),ttlHours:parseInt(s.get("ttlHours"),10)||24,sendEmail:s.get("sendEmail")==="on"};try{const m=await f(c.invites,{method:"POST",body:p});n.target.reset(),e&&e(m)}catch(m){window.errorHandler&&window.errorHandler.show("Invite failed: "+m.message)}}});t.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 r=a("select",{name:"role",style:"padding:6px"});for(const n of["operator","viewer","admin"])r.appendChild(a("option",{value:n,text:n}));t.appendChild(a("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},a("span",{text:"Role"}),r)),t.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"}))),t.appendChild(a("label",{style:"display:flex;gap:4px;align-items:center;font-size:0.85rem"},a("input",{name:"sendEmail",type:"checkbox",checked:!0}),a("span",{text:"Send email"}))),t.appendChild(a("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Issue invite"})),o.appendChild(t)}function v(o,e,t){if(o.innerHTML="",!e||e.length===0){o.appendChild(a("p",{style:"color:var(--muted)",text:"No outstanding invites."}));return}const r=a("table",{style:"width:100%;border-collapse:collapse;font-size:0.9rem"});r.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 n=a("tbody");for(const s of e){const p=a("tr",{style:"border-bottom:1px solid var(--border)"});p.appendChild(a("td",{style:"padding:8px",text:s.email})),p.appendChild(a("td",{style:"padding:8px"},h(s.role))),p.appendChild(a("td",{style:"padding:8px;color:var(--muted)",text:s.invitedBy||"\u2014"})),p.appendChild(a("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:s.expiresAt?new Date(s.expiresAt).toLocaleString():"\u2014"}));const m=a("td",{style:"padding:8px;text-align:right"});m.appendChild(a("button",{class:"btn-sm",style:"padding:2px 8px",text:"Revoke",onclick:async()=>{if(confirm("Revoke invite for "+s.email+"?"))try{await f(c.invites+"/"+encodeURIComponent(s.id),{method:"DELETE"}),t&&t()}catch(w){window.errorHandler&&window.errorHandler.show("Revoke failed: "+w.message)}}})),p.appendChild(m),n.appendChild(p)}r.appendChild(n),o.appendChild(r)}function u(o,e){const t=a("div",{style:"margin-top:12px;padding:12px;border:1px solid #16a34a;border-radius:6px;background:#052e1a;color:#bbf7d0;font-size:0.85rem"});t.appendChild(a("strong",{text:"Invite issued \u2014 copy the link below. It will not be shown again."})),t.appendChild(a("br")),t.appendChild(a("code",{style:"display:block;margin-top:8px;padding:8px;background:#000;border-radius:4px;word-break:break-all;color:#d1fae5",text:o.acceptUrl}));const r=a("button",{class:"btn-sm",style:"margin-top:8px;padding:4px 10px",text:"Copy link",onclick:async()=>{try{await navigator.clipboard.writeText(o.acceptUrl),r.textContent="Copied!",setTimeout(()=>{r.textContent="Copy link"},2e3)}catch{window.errorHandler&&window.errorHandler.show("Clipboard blocked: select the link manually.")}}});t.appendChild(r),o.deliveredVia==="dev-console"?t.appendChild(a("p",{style:"margin-top:8px;color:#fbbf24;font-size:0.8rem",text:"SMTP not configured \u2014 the invite was logged to the server console (search for [DC-048-DEV-INVITE-LINK])."})):o.deliveredVia==="email"&&t.appendChild(a("p",{style:"margin-top:8px;color:#86efac;font-size:0.8rem",text:"Email sent to "+o.email+"."})),e.appendChild(t)}async function l(o){o.innerHTML="",o.appendChild(a("h2",{style:"margin:0 0 16px",text:"Admin \xB7 Users & Invites"}));const e=await f(c.me).catch(()=>({}));if(!e||!e.user||e.user.role!=="admin"){o.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 t=a("button",{class:"btn-sm",style:"float:right;padding:4px 10px",text:"Refresh",onclick:()=>l(o)});o.appendChild(t);const r=a("h3",{style:"margin:24px 0 8px;clear:both",text:"Users"});o.appendChild(r);const n=a("div",{id:"admin-users-list"});o.appendChild(n);const s=await f(c.users).catch(()=>({users:[]}));b(n,s.users,()=>l(o)),o.appendChild(a("h4",{style:"margin:24px 0 8px;font-size:0.95rem",text:"Pre-authorize email"}));const p=a("form",{style:"display:flex;gap:8px;align-items:end",onsubmit:async T=>{T.preventDefault();const P=T.target.email.value.trim();if(P)try{await f(c.users,{method:"POST",body:{email:P}}),T.target.reset(),l(o)}catch(C){window.errorHandler&&window.errorHandler.show("Add failed: "+C.message)}}});p.appendChild(a("input",{name:"email",type:"email",required:!0,placeholder:"user@example.com",style:"padding:6px"})),p.appendChild(a("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Add to allowlist"})),o.appendChild(p),o.appendChild(a("h3",{style:"margin:24px 0 8px",text:"Issue invite"}));const m=a("div");o.appendChild(m);const w=a("div",{id:"admin-invites-list",style:"margin-top:16px"});o.appendChild(w);const I=await f(c.invites).catch(()=>({invites:[]}));v(w,I.invites,()=>l(o)),y(m,T=>{u(T,m),l(o)})}async function i(){if(document.getElementById("admin-panel-root"))return;const e=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:n=>{n.target===e&&d()}}),t=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)"});t.appendChild(a("button",{class:"btn-sm",style:"position:absolute;top:12px;right:12px;padding:4px 10px",text:"Close",onclick:d}));const r=a("div",{id:"admin-panel-body"});t.appendChild(r),e.appendChild(t),document.body.appendChild(e);try{await l(r)}catch(n){r.innerHTML='

Failed to load admin panel: '+(n.message||n)+"

"}}function d(){const o=document.getElementById("admin-panel-root");o&&o.remove()}async function g(o){async function e(){const t=await f(c.me).catch(()=>({})),r=document.getElementById("admin-trigger-btn");if(t&&t.user&&t.user.role==="admin"){if(r)return;const n=a("button",{id:"admin-trigger-btn",class:"btn-sm",style:"margin-left:8px;padding:6px 12px",text:"Admin",onclick:i});o?o.appendChild(n):document.body&&document.body.appendChild(n)}else r&&r.remove()}await e(),setInterval(e,6e4)}window.AdminPanel={open:i,close:d,attachTrigger:g}})(),(function(){injectModal("token-management-modal",` +
`);async function a(){try{const y=await(await fetch("/api/v1/totp/config")).json();if(!y.success)return;const{enabled:u,sessionDuration:d,isSetUp:s}=y.config,f=document.getElementById("totp-status-dot"),w=document.getElementById("totp-status-text"),r=document.getElementById("totp-status-banner"),t=document.getElementById("totp-setup-section"),e=document.getElementById("totp-qr-section"),n=document.getElementById("totp-duration-section"),p=document.getElementById("totp-disable-section");if(u&&s){f.style.background="var(--ok-fg, #7ef2ff)",r.style.borderColor="var(--ok-fg, #7ef2ff)",r.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",p.style.display="block",document.getElementById("totp-duration-select").value=d}else f.style.background="var(--muted)",r.style.borderColor="var(--border)",r.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",p.style.display="none";b(u&&s,d)}catch(g){console.warn("Failed to load TOTP settings:",g)}}const m={"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,y){const u=window.DCI18n;return u&&u.isLoaded()?u.t(g):y}function b(g,y){const u=document.getElementById("auth-card"),d=document.getElementById("auth-pill"),s=document.getElementById("auth-dot"),f=document.getElementById("auth-status-text");u&&(g?(u.setAttribute("data-status","on"),d.className="badge on",d.textContent=h("card.status.yes","YES"),s.className="dot ok at-bl",f.textContent="Session: "+(m[y]||y)):(u.setAttribute("data-status","off"),d.className="badge off",d.textContent=h("card.status.no","NO"),s.className="dot bad at-bl",f.textContent=h("card.auth.not_configured","Not configured")))}document.getElementById("totp-setup-btn")?.addEventListener("click",async()=>{try{const y=await(await secureFetch("/api/v1/totp/setup",{method:"POST"})).json();y.success&&(document.getElementById("totp-qr-image").src=y.qrCode,document.getElementById("totp-manual-key").textContent=y.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(),y=document.getElementById("totp-import-error");if(y.textContent="",!g){y.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?(y.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()):y.textContent=d.error||d.message||"Import failed"}catch{y.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 y=document.getElementById("totp-copy-key");y.textContent="\u2705",setTimeout(()=>{y.textContent="\u{1F4CB}"},2e3)})}),document.getElementById("totp-download-backup")?.addEventListener("click",()=>{const g=document.getElementById("totp-manual-key").textContent.trim();if(!g)return;const y={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.'},u=new Blob([JSON.stringify(y,null,2)],{type:"application/json"}),d=URL.createObjectURL(u),s=document.createElement("a");s.href=d,s.download=`dashcaddy-totp-backup-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(d);const f=document.getElementById("totp-download-backup");f.textContent="\u2705 Saved",setTimeout(()=>{f.textContent="\u2B07 Download"},2e3)}),document.getElementById("totp-confirm-setup")?.addEventListener("click",async()=>{const g=document.getElementById("totp-setup-code").value,y=document.getElementById("totp-setup-error");if(!/^\d{6}$/.test(g)){y.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?(y.textContent="",a()):y.textContent=d.error||"Invalid code"}catch{y.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(y){l.logError("[TOTP] Update Session Duration",y,{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 y=await(await fetch("/api/v1/totp/config")).json();if(y.success){const u=y.config.enabled&&y.config.isSetUp;b(u,y.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(r,t,...e){const n=document.createElement(r);if(t)for(const p of Object.keys(t)){const o=t[p];o==null||o===!1||(p==="class"?n.className=o:p==="text"?n.textContent=o:p==="html"?n.innerHTML=o:p.startsWith("on")&&typeof o=="function"?n.addEventListener(p.slice(2).toLowerCase(),o):n.setAttribute(p,o))}for(const p of e)p==null||p===!1||(typeof p=="string"?n.appendChild(document.createTextNode(p)):n.appendChild(p));return n}async function m(r,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(r,t),p=await n.json().catch(()=>({}));if(!n.ok){const o=p&&(p.message||p.error)||"HTTP "+n.status,i=new Error(o);throw i.status=n.status,i}return p}function h(r){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[r]||t.viewer),text:r})}function b(r,t,e){if(r.innerHTML="",!t||t.length===0){r.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 p=a("tbody");for(const o of t){const i=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}))),i.appendChild(c);const v=a("td",{style:"padding:8px"});v.appendChild(h(o.role)),i.appendChild(v),i.appendChild(a("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:o.createdAt?new Date(o.createdAt).toLocaleDateString():"\u2014"})),i.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 m(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 m(l.users+"/"+encodeURIComponent(o.id),{method:"DELETE"}),e&&e()}catch(x){window.errorHandler&&window.errorHandler.show("Delete failed: "+x.message)}}});S.appendChild(L),i.appendChild(S),p.appendChild(i)}n.appendChild(p),r.appendChild(n)}function g(r,t){const e=a("form",{style:"display:flex;gap:8px;flex-wrap:wrap;align-items:end",onsubmit:async p=>{p.preventDefault();const o=new FormData(p.target),i={email:o.get("email"),role:o.get("role"),ttlHours:parseInt(o.get("ttlHours"),10)||24,sendEmail:o.get("sendEmail")==="on"};try{const c=await m(l.invites,{method:"POST",body:i});p.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 p of["operator","viewer","admin"])n.appendChild(a("option",{value:p,text:p}));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:!0}),a("span",{text:"Send email"}))),e.appendChild(a("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Issue invite"})),r.appendChild(e)}function y(r,t,e){if(r.innerHTML="",!t||t.length===0){r.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 p=a("tbody");for(const o of t){const i=a("tr",{style:"border-bottom:1px solid var(--border)"});i.appendChild(a("td",{style:"padding:8px",text:o.email})),i.appendChild(a("td",{style:"padding:8px"},h(o.role))),i.appendChild(a("td",{style:"padding:8px;color:var(--muted)",text:o.invitedBy||"\u2014"})),i.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 m(l.invites+"/"+encodeURIComponent(o.id),{method:"DELETE"}),e&&e()}catch(v){window.errorHandler&&window.errorHandler.show("Revoke failed: "+v.message)}}})),i.appendChild(c),p.appendChild(i)}n.appendChild(p),r.appendChild(n)}function u(r,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:r.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(r.acceptUrl),n.textContent="Copied!",setTimeout(()=>{n.textContent="Copy link"},2e3)}catch{window.errorHandler&&window.errorHandler.show("Clipboard blocked: select the link manually.")}}});e.appendChild(n),r.deliveredVia==="dev-console"?e.appendChild(a("p",{style:"margin-top:8px;color:#fbbf24;font-size:0.8rem",text:"SMTP not configured \u2014 the invite was logged to the server console (search for [DC-048-DEV-INVITE-LINK])."})):r.deliveredVia==="email"&&e.appendChild(a("p",{style:"margin-top:8px;color:#86efac;font-size:0.8rem",text:"Email sent to "+r.email+"."})),t.appendChild(e)}async function d(r){r.innerHTML="",r.appendChild(a("h2",{style:"margin:0 0 16px",text:"Admin \xB7 Users & Invites"}));const t=await m(l.me).catch(()=>({}));if(!t||!t.user||t.user.role!=="admin"){r.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(r)});r.appendChild(e);const n=a("h3",{style:"margin:24px 0 8px;clear:both",text:"Users"});r.appendChild(n);const p=a("div",{id:"admin-users-list"});r.appendChild(p);const o=await m(l.users).catch(()=>({users:[]}));b(p,o.users,()=>d(r)),r.appendChild(a("h4",{style:"margin:24px 0 8px;font-size:0.95rem",text:"Pre-authorize email"}));const i=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 m(l.users,{method:"POST",body:{email:L}}),k.target.reset(),d(r)}catch(x){window.errorHandler&&window.errorHandler.show("Add failed: "+x.message)}}});i.appendChild(a("input",{name:"email",type:"email",required:!0,placeholder:"user@example.com",style:"padding:6px"})),i.appendChild(a("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Add to allowlist"})),r.appendChild(i),r.appendChild(a("h3",{style:"margin:24px 0 8px",text:"Issue invite"}));const c=a("div");r.appendChild(c);const v=a("div",{id:"admin-invites-list",style:"margin-top:16px"});r.appendChild(v);const S=await m(l.invites).catch(()=>({invites:[]}));y(v,S.invites,()=>d(r)),g(c,k=>{u(k,c),d(r)})}async function s(){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:p=>{p.target===t&&f()}}),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:f}));const n=a("div",{id:"admin-panel-body"});e.appendChild(n),t.appendChild(e),document.body.appendChild(t);try{await d(n)}catch(p){n.innerHTML='

Failed to load admin panel: '+(p.message||p)+"

"}}function f(){const r=document.getElementById("admin-panel-root");r&&r.remove()}async function w(r){async function t(){const e=await m(l.me).catch(()=>({})),n=document.getElementById("admin-trigger-btn");if(e&&e.user&&e.user.role==="admin"){if(n)return;const p=a("button",{id:"admin-trigger-btn",class:"btn-sm",style:"margin-left:8px;padding:6px 12px",text:"Admin",onclick:s});r?r.appendChild(p):document.body&&document.body.appendChild(p)}else n&&n.remove()}await t(),setInterval(t,6e4)}window.AdminPanel={open:s,close:f,attachTrigger:w}})(),(function(){injectModal("token-management-modal",`

\u{1F511} DNS Credentials

@@ -306,40 +306,40 @@
- `);function c(){return Object.keys(SITE.dnsServers||{})}function a(n){return(SITE.dnsServers||{})[n]?.name||n.toUpperCase()}function f(){const n=document.getElementById("dns-cred-sections");if(!n)return;n.innerHTML="";const s=c();if(s.length===0){n.innerHTML='

No DNS servers configured.

';return}for(const p of s)n.insertAdjacentHTML("beforeend",` + `);function l(){return Object.keys(SITE.dnsServers||{})}function a(o){return(SITE.dnsServers||{})[o]?.name||o.toUpperCase()}async function m(o,i){if(!o)throw new Error(`${i} failed: no response`);let c;try{c=await o.json()}catch{throw new Error(`${i} failed: invalid server response`)}if(!o.ok||c?.success!==!0)throw new Error(c?.error||`${i} failed (${o.status||"unknown status"})`);return c}function h(){const o=document.getElementById("dns-cred-sections");if(!o)return;o.innerHTML="";const i=l();if(i.length===0){o.innerHTML='

No DNS servers configured.

';return}for(const c of i)o.insertAdjacentHTML("beforeend",`
-

${a(p)}

+

${a(c)}

- - + +
- - + +
- - + +
- - + +
-
+
- `)}function h(){let n=safeSessionGet("dashcaddy-encryption-key");if(n)return n;const s=safeGet("dashcaddy-encryption-key");if(s)return safeSessionSet("dashcaddy-encryption-key",s),safeRemove("dashcaddy-encryption-key"),s;const p=new Uint8Array(32);return crypto.getRandomValues(p),n=Array.from(p,m=>m.toString(16).padStart(2,"0")).join(""),safeSessionSet("dashcaddy-encryption-key",n),n}const b=h();function y(n,s){if(!n)return"";const p=crypto.getRandomValues(new Uint8Array(8)),m=Array.from(p,T=>T.toString(16).padStart(2,"0")).join(""),w=new TextEncoder().encode(s+m);let I="";for(let T=0;TparseInt($,16))),P=atob(n.substring(17)),C=new TextEncoder().encode(s+I);let B="";for(let $=0;${["readonly","admin"].forEach(s=>{["token","username"].forEach(p=>{safeRemove(`${n}-${s}-${p}-enc`)})}),safeRemove(`${n}-token-enc`),safeRemove(`${n}-username-enc`)})}function r(n){const s=i(n,"readonly"),p=d(n,"readonly"),m=i(n,"admin"),w=d(n,"admin"),I=v(safeGet(`${n}-token-enc`),b),T=v(safeGet(`${n}-username-enc`),b);return{username:w||p||T,token:m||s||I,readonlyToken:s||I,readonlyUsername:p||T,adminToken:m||I,adminUsername:w||T}}document.getElementById("manage-tokens")?.addEventListener("click",()=>{f();const n=document.getElementById("token-management-modal"),s=e();c().forEach(p=>{const m=s[p];document.getElementById(`${p}-readonly-username`).value=m.readonly.username,document.getElementById(`${p}-readonly-token`).value=m.readonly.token,document.getElementById(`${p}-admin-username`).value=m.admin.username,document.getElementById(`${p}-admin-token`).value=m.admin.token,document.getElementById(`${p}-token-status`).textContent=""}),n.classList.add("show")}),document.getElementById("token-management-modal")?.addEventListener("click",n=>{const s=n.target.closest(".token-toggle");if(s){const p=s.dataset.target,m=document.getElementById(p);m.type==="password"?(m.type="text",s.textContent="\u{1F648}"):(m.type="password",s.textContent="\u{1F441}");return}n.target.id==="token-management-modal"&&n.target.classList.remove("show")}),document.getElementById("token-save")?.addEventListener("click",async()=>{const n=c();n.forEach(m=>{o(m,"readonly",document.getElementById(`${m}-readonly-username`).value.trim()),g(m,"readonly",document.getElementById(`${m}-readonly-token`).value.trim()),o(m,"admin",document.getElementById(`${m}-admin-username`).value.trim()),g(m,"admin",document.getElementById(`${m}-admin-token`).value.trim())});const s={};let p=!1;if(n.forEach(m=>{const w={},I=document.getElementById(`${m}-readonly-username`).value.trim(),T=document.getElementById(`${m}-readonly-token`).value.trim(),P=document.getElementById(`${m}-admin-username`).value.trim(),C=document.getElementById(`${m}-admin-token`).value.trim();I&&T&&(w.readonly={username:I,password:T},p=!0),P&&C&&(w.admin={username:P,password:C},p=!0),Object.keys(w).length>0&&(s[m]=w)}),p){n.forEach(m=>{s[m]&&(document.getElementById(`${m}-token-status`).textContent="Verifying...",document.getElementById(`${m}-token-status`).className="token-status")});try{const w=await(await secureFetch("/api/v1/dns/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({servers:s})})).json();w.results?n.forEach(I=>{const T=document.getElementById(`${I}-token-status`);if(!s[I]){T.textContent="";return}const P=w.results[I];P?.success?(T.textContent="\u2713 Verified & saved",T.className="token-status success"):P?.partial?(T.textContent="\u2713 "+P.partial,T.className="token-status success"):(T.textContent="\u2717 "+(P?.error||"Login failed"),T.className="token-status error")}):w.success?n.forEach(I=>{s[I]&&(document.getElementById(`${I}-token-status`).textContent="\u2713 Saved",document.getElementById(`${I}-token-status`).className="token-status success")}):n.forEach(I=>{s[I]&&(document.getElementById(`${I}-token-status`).textContent="\u2717 "+(w.error||"Failed"),document.getElementById(`${I}-token-status`).className="token-status error")})}catch(m){console.error("Failed to sync DNS credentials to backend:",m),n.forEach(w=>{s[w]&&(document.getElementById(`${w}-token-status`).textContent="\u2713 Saved locally (sync failed)",document.getElementById(`${w}-token-status`).className="token-status")})}}else n.forEach(m=>{document.getElementById(`${m}-token-status`).textContent=""});setTimeout(()=>{n.every(w=>{const I=document.getElementById(`${w}-token-status`)?.textContent;return!I||I.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.")){t(),c().forEach(n=>{document.getElementById(`${n}-readonly-username`).value="",document.getElementById(`${n}-readonly-token`).value="",document.getElementById(`${n}-admin-username`).value="",document.getElementById(`${n}-admin-token`).value="",document.getElementById(`${n}-token-status`).textContent="\u2713 Cleared",document.getElementById(`${n}-token-status`).className="token-status success"});try{await secureFetch("/api/v1/dns/credentials",{method:"DELETE"})}catch{}}}),window.getToken=i,window.getUsername=d,window.setToken=g,window.setUsername=o,window.getAllCredentials=e,window.getCredential=u,window.setCredential=l,window.getEncryptionKey=h,window.getDnsIds=c,window.getDnsDisplayName=a})(),(function(){function c(o){const e=window.DCI18n;return!e||!e.isLoaded()?o?"ON":"OFF":e.t(o?"card.status.on":"card.status.off")}function a(o,e,t=null){const r=document.getElementById(o+"-dot"),n=document.getElementById(o+"-pill"),s=document.getElementById(o+"-time"),p=document.querySelector(`[data-app="${o}"]`);r&&(r.classList.toggle("ok",e),r.classList.toggle("bad",!e)),n&&(n.textContent=c(e),n.classList.toggle("on",e),n.classList.toggle("off",!e)),s&&t!==null&&(s.textContent=e?`${t}ms`:"timeout",s.className=`response-time ${f(t,e)}`),p&&p.setAttribute("data-status",e?"on":"off")}function f(o,e){return e?o<200?"excellent":o<500?"good":o<1e3?"fair":"slow":"timeout"}async function h(o){const e=performance.now();try{const t=await fetch("/probe/"+o,{cache:"no-store"}),r=performance.now(),n=Math.round(r-e);return{isUp:t.status>=200&&t.status<400||t.status===401||t.status===403,responseTime:n}}catch{const t=performance.now();return{isUp:!1,responseTime:Math.round(t-e)}}}window.APPS=[];let b=null,y=!1;async function v(){try{window.SkeletonLoader&&window.SkeletonLoader.show(6);const o=await fetch("/api/v1/services",{cache:"no-store"});if(o.ok){const e=await o.json();window.APPS=e.services||[],window.SkeletonLoader&&window.SkeletonLoader.hide()}else console.error("Failed to load services:",o.status),window.SkeletonLoader&&window.SkeletonLoader.hide()}catch(o){console.error("Failed to load services:",o),window.SkeletonLoader&&window.SkeletonLoader.hide()}}function u(o){const e=window.APPS?.find(r=>r.id===o);if(e?.url)return e.url.startsWith("http")?e.url:"https://"+e.url;if(e?.isExternal&&e.externalUrl)return e.externalUrl;const t=SITE.dnsServers?.[o];return t?"http://"+t.ip+":"+(t.port||5380):buildServiceUrl(o)}function l(o,e,t){const r=document.createElement(o);return e&&(r.className=e),t&&(r.textContent=t),r}function i(){const o=document.getElementById("cards");o.innerHTML="";for(let e=0;e{O.stopPropagation(),window.openContainerLogsModal(t.containerId,t.name)},S.appendChild(k);const A=l("button","update-btn","\u2B06\uFE0F");A.title="Update container to latest version",A.id=`update-btn-${t.id}`,A.onclick=O=>{O.stopPropagation(),window.updateContainer(t.containerId,t.name,t.id)},S.appendChild(A);const D=l("button","exec-btn",">_");D.title="Open terminal",D.onclick=O=>{O.stopPropagation(),window.openExecModal&&window.openExecModal(t.containerId,t.name)},S.appendChild(D)}if(t.logPath&&!t.containerId){const k=l("button","logs-btn","\u{1F4CB}");k.title="View application logs",k.onclick=A=>{A.stopPropagation(),window.openFileLogsModal(t.logPath,t.name)},S.appendChild(k)}if(t.isExternal||t.appTemplate||t.url){const k=l("button","creds-btn","\u{1F511}");k.title="Auto-login credentials",k.id=`creds-btn-${t.id}`,k.onclick=A=>{A.stopPropagation(),window.openServiceCredsModal(t)},S.appendChild(k)}if(t.id!=="internet"){const k=l("button","options-btn","\u2699\uFE0F");k.title="Edit service settings",k.onclick=A=>{A.stopPropagation(),window.openServiceEditModal(t)},S.appendChild(k)}if(t.id!=="internet"){const k=l("button","share-btn","\u{1F517}");k.title="Share this service (Pro)",k.onclick=A=>{A.stopPropagation(),typeof window.openShareModal=="function"?window.openShareModal(t):typeof window.showNotification=="function"&&window.showNotification("Share modal not loaded. Refresh the page.","error")},S.appendChild(k)}if(t.id!=="internet"){const k=l("button","delete-btn","\u{1F5D1}\uFE0F");k.title="Delete this service",k.onclick=A=>{A.stopPropagation(),window.deleteService(t.id,t.name)},S.appendChild(k)}const L=l("button",null,"Open");L.setAttribute("data-i18n","action.open"),L.onclick=()=>window.open(u(t.id),"_blank","noopener"),S.appendChild(L),r.appendChild(S),r.style.transitionDelay=`${Math.min(e*45,270)}ms`,o.appendChild(r)}window.DCI18n&&window.DCI18n.isLoaded()&&window.DCI18n.applyTranslations(),requestAnimationFrame(()=>{o.querySelectorAll(".card").forEach(e=>e.classList.add("loaded"))}),window.groupRecipeCards&&requestAnimationFrame(()=>window.groupRecipeCards()),window.refreshServiceFilter&&window.refreshServiceFilter()}function d(o,e,t=null){const r=document.getElementById("dot-"+o+"-grid"),n=document.getElementById("badge-"+o),s=document.getElementById("time-"+o),p=document.querySelector(`[data-app="${o}"]`);r&&(r.classList.toggle("ok",e),r.classList.toggle("bad",!e)),n&&(n.textContent=c(e),n.classList.toggle("on",e),n.classList.toggle("off",!e)),s&&t!==null&&(s.textContent=e?`${t}ms`:"timeout",s.className=`response-time ${f(t,e)}`),p&&p.setAttribute("data-status",e?"on":"off")}async function g(){if(window._dcAuthLost)return;if(b)return y=!0,b;function o(r,n=new Date){const s=document.getElementById("stamp");s&&(s.textContent=`${r}: ${new Date(n).toLocaleTimeString()}`)}function e(r){Object.keys(SITE.dnsServers).forEach(s=>{const p=r[s];p&&a(s,p.isUp,p.responseTime)}),r.internet&&a("internet",r.internet.isUp,r.internet.responseTime),window.APPS.forEach(s=>{const p=r[s.id];p&&d(s.id,p.isUp,p.responseTime)})}async function t(){const r=Object.keys(SITE.dnsServers),n=r.map(w=>h(w));n.push(h("internet"));const s=await Promise.all(n);r.forEach((w,I)=>a(w,s[I].isUp,s[I].responseTime));const p=s[s.length-1];a("internet",p.isUp,p.responseTime),(await Promise.all(window.APPS.map(async w=>{const I=await h(w.id);return{id:w.id,...I}}))).forEach(w=>{d(w.id,w.isUp,w.responseTime)})}return b=(async()=>{try{const r=await fetch("/api/v1/services/status",{cache:"no-store"});if(r.status===401||r.status===403){window._dcAuthLost=!0,window._sseReconnect&&window._sseClose&&window._sseClose(),o("auth required");return}if(!r.ok)throw new Error(`Status refresh failed (${r.status})`);window._dcAuthLost=!1;const n=await r.json();e(n.statuses||{}),o("last check",n.checkedAt||new Date)}catch(r){console.warn("Batched status refresh failed, falling back to direct probes:",r);try{await t(),o("last check")}catch(n){console.error("Dashboard refresh failed:",n),o("last failed")}}finally{b=null,y&&!window._dcAuthLost?(y=!1,setTimeout(()=>{window.refreshAll()},0)):y=!1}})(),b}document.querySelector(".top")?.addEventListener("click",o=>{const e=o.target.closest('[id$="-open"]');if(!e)return;const t=e.id.replace("-open","");SITE.dnsServers[t]&&window.open(u(t),"_blank","noopener")}),document.getElementById("ca-open")?.addEventListener("click",()=>window.open(u("ca"),"_blank","noopener")),document.getElementById("creds-btn-ca")?.addEventListener("click",o=>{o.stopPropagation();const e=window.APPS.find(t=>t.id==="ca");e&&window.openServiceCredsModal&&window.openServiceCredsModal(e)}),document.getElementById("options-btn-ca")?.addEventListener("click",o=>{o.stopPropagation();const e=window.APPS.find(t=>t.id==="ca");e&&window.openServiceEditModal&&window.openServiceEditModal(e)}),document.getElementById("delete-btn-ca")?.addEventListener("click",o=>{o.stopPropagation(),window.deleteService&&window.deleteService("ca","DashCA")}),window.loadServices=v,window.buildGrid=i,window.refreshAll=g,window.setQuick=a,window.setBadge=d,window.getResponseTimeClass=f,window.checkServiceWithTiming=h,window.serviceUrl=u,window.el=l})(),(function(){async function c(u){const i=await(await secureFetch(`/api/v1/dns/restart/${u}`,{method:"POST"})).json();if(!i.success)throw new Error(i.error||"Restart failed");return i}document.querySelector(".top")?.addEventListener("click",async u=>{const l=u.target.closest('[id$="-restart"]');if(!l)return;const i=l.id.replace("-restart","");if(SITE.dnsServers[i]&&confirm(`Restart ${i.toUpperCase()} service?`))try{await withButton(l,"...",()=>c(i)),setTimeout(window.refreshAll,DC.DELAYS.RELOAD)}catch(d){showNotification("Restart failed: "+d.message,"error")}});async function a(u,l){const i=document.getElementById(`${u}-update`),d=i?.textContent||"\u2B06\uFE0F";try{i.textContent="\u{1F50D}",i.disabled=!0,i.title="Checking for updates...";const o=await(await fetch(`/api/v1/dns/check-update?server=${encodeURIComponent(l)}`)).json();if(!o.success)throw new Error(o.error||"Failed to check for updates");if(!o.updateAvailable){i.textContent="\u2705",i.title=`Already on latest version (${o.currentVersion})`,showNotification(`${u.toUpperCase()} is already up to date! Current version: ${o.currentVersion}`,"info"),setTimeout(()=>{i.textContent=d,i.disabled=!1,i.title="Update DNS server"},3e3);return}if(!confirm(`Update available for ${u.toUpperCase()}! + `)}function b(){let o=safeSessionGet("dashcaddy-encryption-key");if(o)return o;const i=safeGet("dashcaddy-encryption-key");if(i)return safeSessionSet("dashcaddy-encryption-key",i),safeRemove("dashcaddy-encryption-key"),i;const c=new Uint8Array(32);return crypto.getRandomValues(c),o=Array.from(c,v=>v.toString(16).padStart(2,"0")).join(""),safeSessionSet("dashcaddy-encryption-key",o),o}const g=b();function y(o,i){if(!o)return"";const c=crypto.getRandomValues(new Uint8Array(8)),v=Array.from(c,L=>L.toString(16).padStart(2,"0")).join(""),S=new TextEncoder().encode(i+v);let k="";for(let L=0;LparseInt(E,16))),x=atob(o.substring(17)),B=new TextEncoder().encode(i+k);let A="";for(let E=0;E{["readonly","admin"].forEach(i=>{["token","username"].forEach(c=>{safeRemove(`${o}-${i}-${c}-enc`)})}),safeRemove(`${o}-token-enc`),safeRemove(`${o}-username-enc`)})}function p(o){const i=f(o,"readonly"),c=w(o,"readonly"),v=f(o,"admin"),S=w(o,"admin"),k=u(safeGet(`${o}-token-enc`),g),L=u(safeGet(`${o}-username-enc`),g);return{username:S||c||L,token:v||i||k,readonlyToken:i||k,readonlyUsername:c||L,adminToken:v||k,adminUsername:S||L}}document.getElementById("manage-tokens")?.addEventListener("click",()=>{h();const o=document.getElementById("token-management-modal"),i=e();l().forEach(c=>{const v=i[c];document.getElementById(`${c}-readonly-username`).value=v.readonly.username,document.getElementById(`${c}-readonly-token`).value=v.readonly.token,document.getElementById(`${c}-admin-username`).value=v.admin.username,document.getElementById(`${c}-admin-token`).value=v.admin.token,document.getElementById(`${c}-token-status`).textContent=""}),o.classList.add("show")}),document.getElementById("token-management-modal")?.addEventListener("click",o=>{const i=o.target.closest(".token-toggle");if(i){const c=i.dataset.target,v=document.getElementById(c);v.type==="password"?(v.type="text",i.textContent="\u{1F648}"):(v.type="password",i.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(),i={};let c=!1;if(o.forEach(v=>{const S={},k=document.getElementById(`${v}-readonly-username`).value.trim(),L=document.getElementById(`${v}-readonly-token`).value.trim(),x=document.getElementById(`${v}-admin-username`).value.trim(),B=document.getElementById(`${v}-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&&(i[v]=S)}),c){o.forEach(v=>{i[v]&&(document.getElementById(`${v}-token-status`).textContent="Verifying...",document.getElementById(`${v}-token-status`).className="token-status")});try{const v=await secureFetch("/api/v1/dns/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({servers:i})}),S=await m(v,"DNS credential save");if(S.results){const k=Object.keys(i).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()),r(k,"readonly",document.getElementById(`${k}-readonly-token`).value.trim()),t(k,"admin",document.getElementById(`${k}-admin-username`).value.trim()),r(k,"admin",document.getElementById(`${k}-admin-token`).value.trim())}),o.forEach(k=>{const L=document.getElementById(`${k}-token-status`);if(!i[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(v){console.error("Failed to sync DNS credentials to backend:",v),o.forEach(S=>{i[S]&&(document.getElementById(`${S}-token-status`).textContent="\u2717 "+(v.message||"Save failed"),document.getElementById(`${S}-token-status`).className="token-status error")})}}else o.forEach(v=>{document.getElementById(`${v}-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 m(o,"DNS credential removal"),n(),l().forEach(i=>{document.getElementById(`${i}-readonly-username`).value="",document.getElementById(`${i}-readonly-token`).value="",document.getElementById(`${i}-admin-username`).value="",document.getElementById(`${i}-admin-token`).value="",document.getElementById(`${i}-token-status`).textContent="\u2713 Cleared",document.getElementById(`${i}-token-status`).className="token-status success"})}catch(o){l().forEach(i=>{document.getElementById(`${i}-token-status`).textContent="\u2717 "+(o.message||"Clear failed"),document.getElementById(`${i}-token-status`).className="token-status error"})}}),window.getToken=f,window.getUsername=w,window.setToken=r,window.setUsername=t,window.getAllCredentials=e,window.getCredential=d,window.setCredential=s,window.getEncryptionKey=b,window.getDnsIds=l,window.getDnsDisplayName=a})(),(function(){function l(r){const t=window.DCI18n;return!t||!t.isLoaded()?r?"ON":"OFF":t.t(r?"card.status.on":"card.status.off")}function a(r,t,e=null){const n=document.getElementById(r+"-dot"),p=document.getElementById(r+"-pill"),o=document.getElementById(r+"-time"),i=document.querySelector(`[data-app="${r}"]`);n&&(n.classList.toggle("ok",t),n.classList.toggle("bad",!t)),p&&(p.textContent=l(t),p.classList.toggle("on",t),p.classList.toggle("off",!t)),o&&e!==null&&(o.textContent=t?`${e}ms`:"timeout",o.className=`response-time ${m(e,t)}`),i&&i.setAttribute("data-status",t?"on":"off")}function m(r,t){return t?r<200?"excellent":r<500?"good":r<1e3?"fair":"slow":"timeout"}async function h(r){const t=performance.now();try{const e=await fetch("/probe/"+r,{cache:"no-store"}),n=performance.now(),p=Math.round(n-t);return{isUp:e.status>=200&&e.status<400||e.status===401||e.status===403,responseTime:p}}catch{const e=performance.now();return{isUp:!1,responseTime:Math.round(e-t)}}}window.APPS=[];let b=null,g=!1;async function y(){try{window.SkeletonLoader&&window.SkeletonLoader.show(6);const r=await fetch("/api/v1/services",{cache:"no-store"});if(r.ok){const t=await r.json();window.APPS=t.services||[],window.SkeletonLoader&&window.SkeletonLoader.hide()}else console.error("Failed to load services:",r.status),window.SkeletonLoader&&window.SkeletonLoader.hide()}catch(r){console.error("Failed to load services:",r),window.SkeletonLoader&&window.SkeletonLoader.hide()}}function u(r){const t=window.APPS?.find(n=>n.id===r);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?.[r];return e?"http://"+e.ip+":"+(e.port||5380):buildServiceUrl(r)}function d(r,t,e){const n=document.createElement(r);return t&&(n.className=t),e&&(n.textContent=e),n}function s(){const r=document.getElementById("cards");r.innerHTML="";for(let t=0;t{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(u(e.id),"_blank","noopener"),T.appendChild($),n.appendChild(T),n.style.transitionDelay=`${Math.min(t*45,270)}ms`,r.appendChild(n)}window.DCI18n&&window.DCI18n.isLoaded()&&window.DCI18n.applyTranslations(),requestAnimationFrame(()=>{r.querySelectorAll(".card").forEach(t=>t.classList.add("loaded"))}),window.groupRecipeCards&&requestAnimationFrame(()=>window.groupRecipeCards()),window.refreshServiceFilter&&window.refreshServiceFilter()}function f(r,t,e=null){const n=document.getElementById("dot-"+r+"-grid"),p=document.getElementById("badge-"+r),o=document.getElementById("time-"+r),i=document.querySelector(`[data-app="${r}"]`);n&&(n.classList.toggle("ok",t),n.classList.toggle("bad",!t)),p&&(p.textContent=l(t),p.classList.toggle("on",t),p.classList.toggle("off",!t)),o&&e!==null&&(o.textContent=t?`${e}ms`:"timeout",o.className=`response-time ${m(e,t)}`),i&&i.setAttribute("data-status",t?"on":"off")}async function w(){if(window._dcAuthLost)return;if(b)return g=!0,b;function r(n,p=new Date){const o=document.getElementById("stamp");o&&(o.textContent=`${n}: ${new Date(p).toLocaleTimeString()}`)}function t(n){Object.keys(SITE.dnsServers).forEach(o=>{const i=n[o];i&&a(o,i.isUp,i.responseTime)}),n.internet&&a("internet",n.internet.isUp,n.internet.responseTime),window.APPS.forEach(o=>{const i=n[o.id];i&&f(o.id,i.isUp,i.responseTime)})}async function e(){const n=Object.keys(SITE.dnsServers),p=n.map(v=>h(v));p.push(h("internet"));const o=await Promise.all(p);n.forEach((v,S)=>a(v,o[S].isUp,o[S].responseTime));const i=o[o.length-1];a("internet",i.isUp,i.responseTime),(await Promise.all(window.APPS.map(async v=>{const S=await h(v.id);return{id:v.id,...S}}))).forEach(v=>{f(v.id,v.isUp,v.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(),r("auth required");return}if(!n.ok)throw new Error(`Status refresh failed (${n.status})`);window._dcAuthLost=!1;const p=await n.json();t(p.statuses||{}),r("last check",p.checkedAt||new Date)}catch(n){console.warn("Batched status refresh failed, falling back to direct probes:",n);try{await e(),r("last check")}catch(p){console.error("Dashboard refresh failed:",p),r("last failed")}}finally{b=null,g&&!window._dcAuthLost?(g=!1,setTimeout(()=>{window.refreshAll()},0)):g=!1}})(),b}document.querySelector(".top")?.addEventListener("click",r=>{const t=r.target.closest('[id$="-open"]');if(!t)return;const e=t.id.replace("-open","");SITE.dnsServers[e]&&window.open(u(e),"_blank","noopener")}),document.getElementById("ca-open")?.addEventListener("click",()=>window.open(u("ca"),"_blank","noopener")),document.getElementById("creds-btn-ca")?.addEventListener("click",r=>{r.stopPropagation();const t=window.APPS.find(e=>e.id==="ca");t&&window.openServiceCredsModal&&window.openServiceCredsModal(t)}),document.getElementById("options-btn-ca")?.addEventListener("click",r=>{r.stopPropagation();const t=window.APPS.find(e=>e.id==="ca");t&&window.openServiceEditModal&&window.openServiceEditModal(t)}),document.getElementById("delete-btn-ca")?.addEventListener("click",r=>{r.stopPropagation(),window.deleteService&&window.deleteService("ca","DashCA")}),window.loadServices=y,window.buildGrid=s,window.refreshAll=w,window.setQuick=a,window.setBadge=f,window.getResponseTimeClass=m,window.checkServiceWithTiming=h,window.serviceUrl=u,window.el=d})(),(function(){async function l(u){const s=await(await secureFetch(`/api/v1/dns/restart/${u}`,{method:"POST"})).json();if(!s.success)throw new Error(s.error||"Restart failed");return s}document.querySelector(".top")?.addEventListener("click",async u=>{const d=u.target.closest('[id$="-restart"]');if(!d)return;const s=d.id.replace("-restart","");if(SITE.dnsServers[s]&&confirm(`Restart ${s.toUpperCase()} service?`))try{await withButton(d,"...",()=>l(s)),setTimeout(window.refreshAll,DC.DELAYS.RELOAD)}catch(f){showNotification("Restart failed: "+f.message,"error")}});async function a(u,d){const s=document.getElementById(`${u}-update`),f=s?.textContent||"\u2B06\uFE0F";try{s.textContent="\u{1F50D}",s.disabled=!0,s.title="Checking for updates...";const r=await(await fetch(`/api/v1/dns/check-update?server=${encodeURIComponent(d)}`)).json();if(!r.success)throw new Error(r.error||"Failed to check for updates");if(!r.updateAvailable){s.textContent="\u2705",s.title=`Already on latest version (${r.currentVersion})`,showNotification(`${u.toUpperCase()} is already up to date! Current version: ${r.currentVersion}`,"info"),setTimeout(()=>{s.textContent=f,s.disabled=!1,s.title="Update DNS server"},3e3);return}if(!confirm(`Update available for ${u.toUpperCase()}! -Current: ${o.currentVersion} -New: ${o.updateVersion} +Current: ${r.currentVersion} +New: ${r.updateVersion} -`+(o.updateTitle?`${o.updateTitle} +`+(r.updateTitle?`${r.updateTitle} `:"")+`The DNS server will restart during the update. -Proceed?`)){i.textContent=d,i.disabled=!1,i.title="Update DNS server";return}i.textContent="\u{1F504}",i.title="Updating...";const r=await(await secureFetch(`/api/v1/dns/update?server=${encodeURIComponent(l)}`,{method:"POST"})).json();if(!r.success)throw new Error(r.error||"Update failed");if(r.manualUpdateRequired){i.textContent="\u2B06\uFE0F",i.title=`Update available: ${r.newVersion}`;const n=r.downloadLink?` -Download: ${r.downloadLink}`:"",s=r.instructionsLink?` -Instructions: ${r.instructionsLink}`:"";showNotification(`${u.toUpperCase()} update requires manual installation. Current: ${r.previousVersion} \u2192 ${r.newVersion}. Please update manually on the host machine.`,"warning",8e3),i.disabled=!1;return}i.textContent="\u2705",i.title="Updated successfully!",showNotification(`${u.toUpperCase()} updated successfully! ${r.previousVersion} \u2192 ${r.newVersion}. Server is restarting...`,"success"),setTimeout(()=>{i.textContent=d,i.disabled=!1,i.title="Update DNS server",window.refreshAll()},1e4)}catch(g){console.error("DNS update error:",g),i.textContent="\u274C",i.title="Update failed",showNotification(`Failed to update ${u.toUpperCase()}: ${g.message}`,"error"),setTimeout(()=>{i.textContent=d,i.disabled=!1,i.title="Update DNS server"},3e3)}}document.querySelector(".top")?.addEventListener("click",u=>{const l=u.target.closest('[id$="-update"]');if(!l)return;const i=l.id.replace("-update","");SITE.dnsServers[i]&&a(i,SITE.dnsServers[i]?.ip)}),injectModal("dns-settings-modal",` +Proceed?`)){s.textContent=f,s.disabled=!1,s.title="Update DNS server";return}s.textContent="\u{1F504}",s.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){s.textContent="\u2B06\uFE0F",s.title=`Update available: ${n.newVersion}`;const p=n.downloadLink?` +Download: ${n.downloadLink}`:"",o=n.instructionsLink?` +Instructions: ${n.instructionsLink}`:"";showNotification(`${u.toUpperCase()} update requires manual installation. Current: ${n.previousVersion} \u2192 ${n.newVersion}. Please update manually on the host machine.`,"warning",8e3),s.disabled=!1;return}s.textContent="\u2705",s.title="Updated successfully!",showNotification(`${u.toUpperCase()} updated successfully! ${n.previousVersion} \u2192 ${n.newVersion}. Server is restarting...`,"success"),setTimeout(()=>{s.textContent=f,s.disabled=!1,s.title="Update DNS server",window.refreshAll()},1e4)}catch(w){console.error("DNS update error:",w),s.textContent="\u274C",s.title="Update failed",showNotification(`Failed to update ${u.toUpperCase()}: ${w.message}`,"error"),setTimeout(()=>{s.textContent=f,s.disabled=!1,s.title="Update DNS server"},3e3)}}document.querySelector(".top")?.addEventListener("click",u=>{const d=u.target.closest('[id$="-update"]');if(!d)return;const s=d.id.replace("-update","");SITE.dnsServers[s]&&a(s,SITE.dnsServers[s]?.ip)}),injectModal("dns-settings-modal",`

DNS Settings

@@ -366,7 +366,7 @@ Instructions: ${r.instructionsLink}`:"";showNotification(`${u.toUpperCase()} upd
- `);let f=null;function h(u){f=u;const l=SITE.dnsServers[u]||{},i=document.getElementById("dns-settings-modal");document.getElementById("dns-settings-title").textContent=`${(l.name||u).toUpperCase()} Settings`,document.getElementById("dns-edit-ip").value=l.ip||"",document.getElementById("dns-edit-port").value=l.port||DC.DEFAULTS.DNS_PORT,document.getElementById("dns-edit-name").value=l.name||"",i.classList.add("show")}async function b(){if(!f)return;const u=document.getElementById("dns-edit-ip").value.trim(),l=document.getElementById("dns-edit-port").value.trim()||DC.DEFAULTS.DNS_PORT,i=document.getElementById("dns-edit-name").value.trim();if(!u){showNotification("Server IP is required","warning");return}const d={dnsServers:{}};d.dnsServers[f]={ip:u,port:String(l)},i&&(d.dnsServers[f].name=i);try{const o=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)})).json();o.success?(SITE.dnsServers[f]=d.dnsServers[f],showNotification(`${f.toUpperCase()} settings saved`,"success"),v(),window.refreshAll()):showNotification(o.error||"Failed to save settings","error")}catch(g){showNotification("Failed to save: "+g.message,"error")}}async function y(){if(f&&confirm(`Remove ${f.toUpperCase()} from dashboard? This won't affect the actual DNS server.`))try{const l=await(await secureFetch("/api/v1/config")).json();l.dnsServers&&delete l.dnsServers[f];const d=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dnsServers:l.dnsServers||{}})})).json();if(d.success){delete SITE.dnsServers[f];const g=document.querySelector(`.top [data-app="${f}"]`);g&&g.remove(),showNotification(`${f.toUpperCase()} removed from dashboard`,"success"),v()}else showNotification(d.error||"Failed to remove","error")}catch(u){showNotification("Failed to remove: "+u.message,"error")}}function v(){closeModal("dns-settings-modal"),f=null}document.getElementById("dns-settings-cancel")?.addEventListener("click",v),document.getElementById("dns-settings-save")?.addEventListener("click",b),document.getElementById("dns-settings-delete")?.addEventListener("click",y),document.getElementById("dns-settings-modal")?.addEventListener("click",u=>{u.target.id==="dns-settings-modal"&&v()}),document.querySelector(".top")?.addEventListener("click",u=>{const l=u.target.closest('[id$="-settings"]');if(!l)return;const i=l.id.replace("-settings","");SITE.dnsServers[i]&&(u.stopPropagation(),h(i))}),document.getElementById("refresh")?.addEventListener("click",window.refreshAll)})(),(function(){injectModal("logs-modal",` + `);let m=null;function h(u){m=u;const d=SITE.dnsServers[u]||{},s=document.getElementById("dns-settings-modal");document.getElementById("dns-settings-title").textContent=`${(d.name||u).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||"",s.classList.add("show")}async function b(){if(!m)return;const u=document.getElementById("dns-edit-ip").value.trim(),d=document.getElementById("dns-edit-port").value.trim()||DC.DEFAULTS.DNS_PORT,s=document.getElementById("dns-edit-name").value.trim();if(!u){showNotification("Server IP is required","warning");return}const f={dnsServers:{}};f.dnsServers[m]={ip:u,port:String(d)},s&&(f.dnsServers[m].name=s);try{const r=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(f)})).json();r.success?(SITE.dnsServers[m]=f.dnsServers[m],showNotification(`${m.toUpperCase()} settings saved`,"success"),y(),window.refreshAll()):showNotification(r.error||"Failed to save settings","error")}catch(w){showNotification("Failed to save: "+w.message,"error")}}async function g(){if(m&&confirm(`Remove ${m.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[m];const f=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dnsServers:d.dnsServers||{}})})).json();if(f.success){delete SITE.dnsServers[m];const w=document.querySelector(`.top [data-app="${m}"]`);w&&w.remove(),showNotification(`${m.toUpperCase()} removed from dashboard`,"success"),y()}else showNotification(f.error||"Failed to remove","error")}catch(u){showNotification("Failed to remove: "+u.message,"error")}}function y(){closeModal("dns-settings-modal"),m=null}document.getElementById("dns-settings-cancel")?.addEventListener("click",y),document.getElementById("dns-settings-save")?.addEventListener("click",b),document.getElementById("dns-settings-delete")?.addEventListener("click",g),document.getElementById("dns-settings-modal")?.addEventListener("click",u=>{u.target.id==="dns-settings-modal"&&y()}),document.querySelector(".top")?.addEventListener("click",u=>{const d=u.target.closest('[id$="-settings"]');if(!d)return;const s=d.id.replace("-settings","");SITE.dnsServers[s]&&(u.stopPropagation(),h(s))}),document.getElementById("refresh")?.addEventListener("click",window.refreshAll)})(),(function(){injectModal("logs-modal",`
@@ -390,66 +390,66 @@ Instructions: ${r.instructionsLink}`:"";showNotification(`${u.toUpperCase()} upd
- `);let c=null,a=null,f=!1,h=null,b=null,y=!1,v=null,u=null,l=!1,i=null,d=!1;async function g(E,x=25){try{const S=getDnsServerAddr(E),L=await fetch(`/api/v1/dns/logs?server=${S}&limit=${x}`,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(L.ok){const k=await L.json();return k.success&&k.logs?{logs:k.logs,count:k.count,server:k.server}:{error:k.error||"Failed to fetch logs"}}else return L.status===401?{error:"DNS auto-auth failed - check credentials in settings"}:{error:`HTTP ${L.status}`}}catch(S){return console.error("DNS logs fetch failed:",S),{error:S.message}}}function o(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 e(E){const x=document.createElement("div");if(x.className="log-entry",x.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 x.style.gridTemplateColumns="1fr",x.innerHTML=`${escapeHtml(E.raw)}`,x;const S=o(E.rcode),L=E.rcode==="Refused"||E.rcode==="REFUSED";return x.innerHTML=` + `);let l=null,a=null,m=!1,h=null,b=null,g=!1,y=null,u=null,d=!1,s=null,f=!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 r(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=`${escapeHtml(E.raw)}`,C;const T=r(E.rcode),$=E.rcode==="Refused"||E.rcode==="REFUSED";return C.innerHTML=` ${escapeHtml(E.timestamp)} ${escapeHtml(E.client)} - ${escapeHtml(E.domain)} + ${escapeHtml(E.domain)} ${escapeHtml(E.type)} - ${escapeHtml(E.rcode)} - `,x}async function t(){if(l){await B();return}if(y){await I();return}if(f||!c)return;const E=parseInt(document.getElementById("log-lines").value),x=document.getElementById("logs-content");try{const S=await g(c,E);if(S.error){x.innerHTML=` + ${escapeHtml(E.rcode)} + `,C}async function e(){if(d){await B();return}if(g){await S();return}if(m||!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=`
\u26A0\uFE0F Error
-
${escapeHtml(S.error)}
-
`;return}x.innerHTML=` +
${escapeHtml(T.error)}
+ `;return}C.innerHTML=`
Time Client Domain Type Status -
`,S.logs&&S.logs.length>0?S.logs.forEach(L=>{const k=e(L);x.appendChild(k)}):x.innerHTML+=` + `,T.logs&&T.logs.length>0?T.logs.forEach($=>{const I=t($);C.appendChild(I)}):C.innerHTML+=`
No DNS queries logged yet -
`}catch(S){x.innerHTML=` + `}catch(T){C.innerHTML=`
- Failed to fetch logs: ${escapeHtml(S.message)} -
`}}function r(E){c=E,f=!1,y=!1;const x=document.getElementById("logs-modal"),S=document.getElementById("logs-title"),L=document.getElementById("logs-pause"),k=document.getElementById("logs-stream");S.textContent=`${E.toUpperCase()} DNS Logs`,L.textContent="\u23F8\uFE0F Pause",L.classList.remove("paused"),k&&(k.style.display="none"),x.classList.add("show"),t(),a=setInterval(t,DC.POLL.LOGS)}function n(){document.getElementById("logs-modal").classList.remove("show"),a&&(clearInterval(a),a=null),p(),c=null,y=!1,h=null,b=null,l=!1,v=null,u=null,f=!1}function s(E){i&&p();const x=document.getElementById("logs-stream"),S=document.getElementById("logs-pause"),L=document.getElementById("logs-content");a&&(clearInterval(a),a=null);try{i=new EventSource(`/api/v1/logs/stream/${E}`),d=!0,x.classList.add("active"),x.textContent="\u{1F534} Live",x.title="Streaming - click to stop",S.style.display="none";const k=document.getElementById("logs-title");k.textContent.includes("\u{1F534}")||(k.innerHTML=k.textContent.replace("\u{1F4CB}","\u{1F4CB} \u{1F534}")),i.onmessage=A=>{try{const D=JSON.parse(A.data);if(D.error){console.error("Stream error:",D.error),p();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",N=_?"var(--bad-fg)":"var(--fg)",M=`${_?"STDERR":"STDOUT"}`;for(O.innerHTML=` + Failed to fetch logs: ${escapeHtml(T.message)} + `}}function n(E){l=E,m=!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 p(){document.getElementById("logs-modal").classList.remove("show"),a&&(clearInterval(a),a=null),i(),l=null,g=!1,h=null,b=null,d=!1,y=null,u=null,m=!1}function o(E){s&&i();const C=document.getElementById("logs-stream"),T=document.getElementById("logs-pause"),$=document.getElementById("logs-content");a&&(clearInterval(a),a=null);try{s=new EventSource(`/api/v1/logs/stream/${E}`),f=!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}")),s.onmessage=P=>{try{const D=JSON.parse(P.data);if(D.error){console.error("Stream error:",D.error),i();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=`${_?"STDERR":"STDOUT"}`;for(O.innerHTML=`
${M}
-
${escapeHtml(D.text)}
- `,L.appendChild(O),L.scrollTop=L.scrollHeight;L.children.length>500;)L.removeChild(L.firstChild)}catch(D){console.error("Error parsing stream data:",D)}},i.onerror=A=>{console.error("EventSource error:",A),p()}}catch(k){console.error("Failed to start streaming:",k),p()}}function p(){i&&(i.close(),i=null),d=!1;const E=document.getElementById("logs-stream"),x=document.getElementById("logs-pause"),S=document.getElementById("logs-title");E&&(E.classList.remove("active"),E.textContent="\u{1F4E1} Live",E.title="Enable real-time streaming"),x&&(x.style.display=""),S&&(S.textContent=S.textContent.replace(" \u{1F534}","")),y&&h&&!a&&(a=setInterval(I,DC.POLL.LOGS))}async function m(E,x=100){try{const S=`/api/v1/logs/container/${E}?tail=${x}×tamps=true`,L=await fetch(S,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(L.ok){const k=await L.json();return k.success&&k.logs?{logs:k.logs,count:k.count,containerName:k.containerName,containerId:k.containerId}:{error:k.error||"Failed to fetch container logs"}}else return{error:`HTTP ${L.status}: ${L.statusText}`}}catch(S){return console.error("Container logs fetch failed:",S),{error:S.message}}}function w(E){const x=document.createElement("div");x.className="log-entry",x.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 S=E.stream==="stderr"?"var(--bad-fg)":"var(--fg)",L=E.stream==="stderr"?'STDERR':'STDOUT';return x.innerHTML=` -
${L}
-
${escapeHtml(E.text)}
- `,x}async function I(){if(f||!h||!y)return;const E=parseInt(document.getElementById("log-lines").value),x=document.getElementById("logs-content");try{const S=await m(h,E);if(S.error){x.innerHTML=` +
${escapeHtml(D.text)}
+ `,$.appendChild(O),$.scrollTop=$.scrollHeight;$.children.length>500;)$.removeChild($.firstChild)}catch(D){console.error("Error parsing stream data:",D)}},s.onerror=P=>{console.error("EventSource error:",P),i()}}catch(I){console.error("Failed to start streaming:",I),i()}}function i(){s&&(s.close(),s=null),f=!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}×tamps=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 v(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"?'STDERR':'STDOUT';return C.innerHTML=` +
${$}
+
${escapeHtml(E.text)}
+ `,C}async function S(){if(m||!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=`
\u26A0\uFE0F Error
-
${escapeHtml(S.error)}
-
`;return}x.innerHTML=` +
${escapeHtml(T.error)}
+ `;return}C.innerHTML=`
Stream Log Output -
`,S.logs&&S.logs.length>0?(S.logs.forEach(L=>{const k=w(L);x.appendChild(k)}),x.scrollTop=x.scrollHeight):x.innerHTML+=` + `,T.logs&&T.logs.length>0?(T.logs.forEach($=>{const I=v($);C.appendChild(I)}),C.scrollTop=C.scrollHeight):C.innerHTML+=`
No logs available for this container -
`}catch(S){x.innerHTML=` + `}catch(T){C.innerHTML=`
- Failed to fetch logs: ${escapeHtml(S.message)} -
`}}function T(E,x){h=E,b=x,y=!0,l=!1,f=!1,p();const S=document.getElementById("logs-modal"),L=document.getElementById("logs-title"),k=document.getElementById("logs-pause"),A=document.getElementById("logs-stream");L.textContent=`\u{1F4CB} ${x} - Container Logs`,k.textContent="\u23F8\uFE0F Pause",k.classList.remove("paused"),A&&(A.style.display=""),S.classList.add("show"),I(),a=setInterval(I,DC.POLL.LOGS)}async function P(E,x=100){try{const S=`/api/v1/logs/file?path=${encodeURIComponent(E)}&tail=${x}`,L=await fetch(S,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(L.ok){const k=await L.json();return k.success&&k.logs?{logs:k.logs,count:k.count,logPath:k.logPath,totalLines:k.totalLines}:{error:k.error||"Failed to fetch file logs"}}else return{error:(await L.json().catch(()=>({}))).error||`HTTP ${L.status}`}}catch(S){return console.error("File logs fetch failed:",S),{error:S.message}}}function C(E){const x=document.createElement("div");x.className="log-entry",x.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 S=E.text;let L="INFO",k="var(--fg)";S.match(/ERROR|FATAL|CRITICAL/i)?(L="ERROR",k="var(--bad-fg)"):S.match(/WARN|WARNING/i)?(L="WARN",k="#f39c12"):S.match(/DEBUG/i)&&(L="DEBUG",k="var(--muted)");const D=`${L}`;return x.innerHTML=` + Failed to fetch logs: ${escapeHtml(T.message)} + `}}function k(E,C){h=E,b=C,g=!0,d=!1,m=!1,i();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=`${$}`;return C.innerHTML=`
${D}
-
${escapeHtml(S)}
- `,x}async function B(){if(f||!v||!l)return;const E=parseInt(document.getElementById("log-lines").value),x=document.getElementById("logs-content");try{const S=await P(v,E);if(S.error){x.innerHTML=` +
${escapeHtml(T)}
+ `,C}async function B(){if(m||!y||!d)return;const E=parseInt(document.getElementById("log-lines").value),C=document.getElementById("logs-content");try{const T=await L(y,E);if(T.error){C.innerHTML=`
\u26A0\uFE0F Error
-
${escapeHtml(S.error)}
-
`;return}x.innerHTML=` +
${escapeHtml(T.error)}
+ `;return}C.innerHTML=`
- Log Output (${S.count} of ${S.totalLines} lines) -
`,S.logs&&S.logs.length>0?(S.logs.forEach(L=>{const k=C(L);x.appendChild(k)}),x.scrollTop=x.scrollHeight):x.innerHTML+=` + Log Output (${T.count} of ${T.totalLines} lines) + `,T.logs&&T.logs.length>0?(T.logs.forEach($=>{const I=x($);C.appendChild(I)}),C.scrollTop=C.scrollHeight):C.innerHTML+=`
No logs available in this file -
`}catch(S){x.innerHTML=` + `}catch(T){C.innerHTML=`
- Failed to fetch logs: ${escapeHtml(S.message)} -
`}}function $(E,x){v=E,u=x,l=!0,y=!1,f=!1;const S=document.getElementById("logs-modal"),L=document.getElementById("logs-title"),k=document.getElementById("logs-pause"),A=document.getElementById("logs-stream");L.textContent=`\u{1F4CB} ${x} - Application Logs`,k.textContent="\u23F8\uFE0F Pause",k.classList.remove("paused"),A&&(A.style.display="none"),S.classList.add("show"),B(),a=setInterval(B,DC.POLL.LOGS)}document.querySelector(".top")?.addEventListener("click",E=>{const x=E.target.closest('[id$="-logs"]');if(!x)return;const S=x.id.replace("-logs","");SITE.dnsServers[S]&&r(S)}),document.getElementById("logs-close")?.addEventListener("click",n),document.getElementById("logs-pause")?.addEventListener("click",()=>{f=!f;const E=document.getElementById("logs-pause");f?(E.textContent="\u25B6\uFE0F Resume",E.classList.add("paused")):(E.textContent="\u23F8\uFE0F Pause",E.classList.remove("paused"),t())}),document.getElementById("log-lines")?.addEventListener("change",()=>{f||t()}),document.getElementById("logs-stream")?.addEventListener("click",()=>{!y||!h||(d?p():s(h))}),document.getElementById("logs-modal")?.addEventListener("click",E=>{E.target.id==="logs-modal"&&n()}),document.addEventListener("keydown",E=>{E.key==="Escape"&&document.getElementById("logs-modal")?.classList.contains("show")&&n()}),window.openContainerLogsModal=T,window.openFileLogsModal=$,window.openLogsModal=r})(),(function(){injectModal("service-edit-modal",` + Failed to fetch logs: ${escapeHtml(T.message)} + `}}function A(E,C){y=E,u=C,d=!0,g=!1,m=!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",p),document.getElementById("logs-pause")?.addEventListener("click",()=>{m=!m;const E=document.getElementById("logs-pause");m?(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",()=>{m||e()}),document.getElementById("logs-stream")?.addEventListener("click",()=>{!g||!h||(f?i():o(h))}),document.getElementById("logs-modal")?.addEventListener("click",E=>{E.target.id==="logs-modal"&&p()}),document.addEventListener("keydown",E=>{E.key==="Escape"&&document.getElementById("logs-modal")?.classList.contains("show")&&p()}),window.openContainerLogsModal=k,window.openFileLogsModal=A,window.openLogsModal=n})(),(function(){injectModal("service-edit-modal",`

Edit Service

@@ -805,45 +805,45 @@ Instructions: ${r.instructionsLink}`:"";showNotification(`${u.toUpperCase()} upd
- `)})(),(function(){async function c(y){try{const v=await fetch(`/api/v1/caddy/cas?caddyfilePath=${encodeURIComponent(y)}`);if(!v.ok)throw new Error(`Failed to load CAs: ${v.status}`);const u=await v.json();if(u.success){const l=document.getElementById("existing-ca-select");return l.innerHTML="",u.cas.length===0?l.innerHTML='':(l.innerHTML='',u.cas.forEach(i=>{const d=document.createElement("option");typeof i=="object"?(d.value=i.id,d.textContent=i.displayName||i.name):(d.value=i,d.textContent=i),l.appendChild(d)})),u.data.cas}else throw new Error(u.message)}catch(v){console.error("Error loading CAs:",v);const u=document.getElementById("existing-ca-select");return u.innerHTML='',[]}}function a(y){const{subdomain:v,port:u,ip:l,sslType:i,caName:d,existingCa:g,enableAuth:o,enableCors:e,customHeaders:t,upstreamPath:r,healthCheck:n,timeout:s,tailscaleOnly:p}=y;let m=`${buildDomain(v)} { -`;switch(p&&(m+=` @blocked not remote_ip 100.64.0.0/10 -`,m+=` respond @blocked "Access denied. Tailscale connection required." 403 -`),i){case"letsencrypt":break;case"caddy-managed":m+=` tls internal -`;break;case"existing-ca":g&&(m+=` tls { - ca ${g} + `)})(),(function(){async function l(g){try{const y=await fetch(`/api/v1/caddy/cas?caddyfilePath=${encodeURIComponent(g)}`);if(!y.ok)throw new Error(`Failed to load CAs: ${y.status}`);const u=await y.json();if(u.success){const d=document.getElementById("existing-ca-select");return d.innerHTML="",u.cas.length===0?d.innerHTML='':(d.innerHTML='',u.cas.forEach(s=>{const f=document.createElement("option");typeof s=="object"?(f.value=s.id,f.textContent=s.displayName||s.name):(f.value=s,f.textContent=s),d.appendChild(f)})),u.data.cas}else throw new Error(u.message)}catch(y){console.error("Error loading CAs:",y);const u=document.getElementById("existing-ca-select");return u.innerHTML='',[]}}function a(g){const{subdomain:y,port:u,ip:d,sslType:s,caName:f,existingCa:w,enableAuth:r,enableCors:t,customHeaders:e,upstreamPath:n,healthCheck:p,timeout:o,tailscaleOnly:i}=g;let c=`${buildDomain(y)} { +`;switch(i&&(c+=` @blocked not remote_ip 100.64.0.0/10 +`,c+=` respond @blocked "Access denied. Tailscale connection required." 403 +`),s){case"letsencrypt":break;case"caddy-managed":c+=` tls internal +`;break;case"existing-ca":w&&(c+=` tls { + ca ${w} } -`);break;case"custom-ca":d&&(m+=` tls { - ca ${d} +`);break;case"custom-ca":f&&(c+=` tls { + ca ${f} } -`);break}if(o&&(m+=` basicauth { +`);break}if(r&&(c+=` basicauth { admin $2a$14$hashed_password_here } -`),e&&(m+=` header { -`,m+=` Access-Control-Allow-Origin "*" -`,m+=` Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" -`,m+=` Access-Control-Allow-Headers "Content-Type, Authorization" -`,m+=` } -`),t)try{const w=JSON.parse(t);m+=` header { -`,Object.entries(w).forEach(([I,T])=>{m+=` ${I} "${T}" -`}),m+=` } -`}catch{console.warn("Invalid JSON in custom headers")}return n&&(m+=` health_uri ${n} -`),m+=` reverse_proxy ${l}:${u} { -`,r&&r!=="/"&&(m+=` rewrite ${r} -`),s&&s!==30&&(m+=` transport http { -`,m+=` dial_timeout ${s}s -`,m+=` response_header_timeout ${s}s -`,m+=` } -`),m+=` } -`,m+=`} -`,m}async function f(y,v,u=DC.DEFAULTS.TTL){const l=window.getToken(getPrimaryDnsId(),"admin");if(!l)throw new Error("DNS admin token not configured. Please set it in the Tokens menu.");const i=buildDomain(y),d=await secureFetch("/api/v1/dns/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:i,ip:v,ttl:u,token:l,server:SITE.dnsIp})});if(!d.ok){const o=await d.text();throw new Error(`DNS API Error: ${d.status} - ${o}`)}const g=await d.json();if(!g.success)throw new Error(`DNS Error: ${g.error||"Unknown error"}`);return g}async function h(y){const v={id:y.subdomain,name:y.name,logo:y.logo||`/assets/${y.subdomain}.png`};y.category&&(v.category=y.category),y.containerId&&(v.containerId=y.containerId);try{const u=await secureFetch("/api/v1/services",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(v)});if(!u.ok){const l=await u.json();throw new Error(l.error||"Failed to save service")}return await window.loadServices(),window.buildGrid(),v}catch(u){throw console.error("Failed to add service to config:",u),u}}async function b(y){const v=document.getElementById("service-subdomain-input").value.trim(),u=document.getElementById("service-ip-input").value.trim()||"localhost",l=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:`${u}:${l}`,config:y})}),d=await i.json();if(!i.ok||!d.success)throw new Error(d.error||`Caddy API Error: ${i.status}`);return d}window.loadExistingCAs=c,window.generateCaddyConfig=a,window.createDnsRecord=f,window.addServiceToConfig=h,window.addToCaddyfile=b})(),(function(){let c=null;function a(u){c=u;const l=document.getElementById("service-edit-modal");document.getElementById("service-edit-title").textContent=`Edit ${u.name}`,document.getElementById("edit-service-name").value=u.name,document.getElementById("edit-service-url-display").textContent=u.url||buildServiceUrl(u.id),document.getElementById("edit-service-logo-preview").src=u.logo||`/assets/${u.id}.png`,document.getElementById("edit-subdomain").value=u.id,document.getElementById("edit-port").value=u.port||"",document.getElementById("edit-ip").value=u.ip||"localhost",document.getElementById("edit-tailscale-only").checked=u.tailscaleOnly||!1,document.getElementById("edit-logo-url").value=u.logo||"";const i=document.getElementById("edit-service-category");i&&(i.dataset.current=u.category||"",typeof window.populateCategorySelects=="function"&&window.populateCategorySelects()),l.classList.add("show")}function f(){closeModal("service-edit-modal"),c=null}async function h(){if(!c)return;const u=document.getElementById("edit-subdomain").value.trim().toLowerCase(),l=document.getElementById("edit-service-name").value.trim(),i=document.getElementById("edit-port").value.trim(),d=document.getElementById("edit-ip").value.trim()||"localhost",g=document.getElementById("edit-tailscale-only").checked,o=document.getElementById("edit-logo-url").value.trim(),e=document.getElementById("edit-service-category")?.value||"";if(!u){showNotification("Subdomain is required","warning");return}const t=c.id,r=[];if(u!==t&&r.push("subdomain"),l&&l!==c.name&&r.push("name"),i&&i!==String(c.port)&&r.push("port"),d!==c.ip&&r.push("ip"),g!==(c.tailscaleOnly||!1)&&r.push("tailscale"),o&&o!==c.logo&&r.push("logo"),e!==(c.category||"")&&r.push("category"),r.length===0){f();return}const n=document.getElementById("service-edit-save");n.textContent="Saving...",n.disabled=!0;try{const p=await(await secureFetch("/api/v1/services/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubdomain:t,newSubdomain:u,name:l||c.name,port:i||c.port,ip:d,tailscaleOnly:g,logo:o||void 0,category:e})})).json();if(!p.success)throw new Error(p.error||"Failed to update service");const m=window.APPS.findIndex(w=>w.id===t);m!==-1&&(window.APPS[m]={...window.APPS[m],id:u,name:l||window.APPS[m].name,port:i||window.APPS[m].port,ip:d,tailscaleOnly:g,logo:o||window.APPS[m].logo,category:e||void 0}),f(),window.buildGrid(),window.refreshAll()}catch(s){console.error("Error saving service changes:",s),showNotification(`Error saving changes: ${s.message}`,"error")}finally{n.textContent="Save Changes",n.disabled=!1}}document.getElementById("edit-logo-file")?.addEventListener("change",async u=>{const l=u.target.files[0];if(!l)return;if(!l.type.startsWith("image/")){showNotification("Please select an image file","warning");return}const i=new FileReader;i.onload=async d=>{const g=d.target.result;if(document.getElementById("edit-service-logo-preview").src=g,document.getElementById("edit-logo-url").value=g,c)try{const e=await(await secureFetch("/api/v1/assets/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filename:`${c.id}.png`,data:g})})).json();e.success&&e.path&&(document.getElementById("edit-logo-url").value=e.path)}catch{}},i.readAsDataURL(l)}),document.getElementById("service-edit-cancel")?.addEventListener("click",f),document.getElementById("service-edit-save")?.addEventListener("click",h),document.getElementById("service-edit-modal")?.addEventListener("click",u=>{u.target.id==="service-edit-modal"&&f()});function b(u,l,i){return new Promise(d=>{const g=document.getElementById("delete-service-modal"),o=document.getElementById("delete-modal-title"),e=document.getElementById("delete-modal-message"),t=document.getElementById("delete-modal-container-info"),r=document.getElementById("delete-modal-container-name"),n=document.getElementById("delete-modal-help"),s=document.getElementById("delete-modal-cancel"),p=document.getElementById("delete-modal-remove"),m=document.getElementById("delete-modal-delete");o.textContent=`Delete "${u}"`,l?(e.innerHTML="This service has an associated Docker container.
Choose how to proceed:",t.style.display="block",r.textContent=`Container ID: ${i?.slice(0,12)||"Unknown"}`,n.style.display="block",m.style.display="block"):(e.textContent="Remove this service from the dashboard?",t.style.display="none",n.style.display="none",m.style.display="none");const w=()=>{g.classList.remove("show"),s.removeEventListener("click",I),p.removeEventListener("click",T),m.removeEventListener("click",P),g.removeEventListener("click",C)},I=()=>{w(),d(null)},T=()=>{w(),d(!1)},P=()=>{w(),d(!0)},C=B=>{B.target===g&&(w(),d(null))};s.addEventListener("click",I),p.addEventListener("click",T),m.addEventListener("click",P),g.addEventListener("click",C),g.classList.add("show")})}async function y(u,l,i){const d=document.getElementById(`update-btn-${i}`),g=d?.textContent;if(confirm(`Update ${l} to the latest version? +`),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 v=JSON.parse(e);c+=` header { +`,Object.entries(v).forEach(([S,k])=>{c+=` ${S} "${k}" +`}),c+=` } +`}catch{console.warn("Invalid JSON in custom headers")}return p&&(c+=` health_uri ${p} +`),c+=` reverse_proxy ${d}:${u} { +`,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 m(g,y,u=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 s=buildDomain(g),f=await secureFetch("/api/v1/dns/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:s,ip:y,ttl:u,token:d,server:SITE.dnsIp})});if(!f.ok){const r=await f.text();throw new Error(`DNS API Error: ${f.status} - ${r}`)}const w=await f.json();if(!w.success)throw new Error(`DNS Error: ${w.error||"Unknown error"}`);return w}async function h(g){const y={id:g.subdomain,name:g.name,logo:g.logo||`/assets/${g.subdomain}.png`};g.category&&(y.category=g.category),g.containerId&&(y.containerId=g.containerId);try{const u=await secureFetch("/api/v1/services",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(y)});if(!u.ok){const d=await u.json();throw new Error(d.error||"Failed to save service")}return await window.loadServices(),window.buildGrid(),y}catch(u){throw console.error("Failed to add service to config:",u),u}}async function b(g){const y=document.getElementById("service-subdomain-input").value.trim(),u=document.getElementById("service-ip-input").value.trim()||"localhost",d=document.getElementById("service-port-input").value.trim()||"80",s=await secureFetch("/api/v1/site",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:buildDomain(y),upstream:`${u}:${d}`,config:g})}),f=await s.json();if(!s.ok||!f.success)throw new Error(f.error||`Caddy API Error: ${s.status}`);return f}window.loadExistingCAs=l,window.generateCaddyConfig=a,window.createDnsRecord=m,window.addServiceToConfig=h,window.addToCaddyfile=b})(),(function(){let l=null;function a(u){l=u;const d=document.getElementById("service-edit-modal");document.getElementById("service-edit-title").textContent=`Edit ${u.name}`,document.getElementById("edit-service-name").value=u.name,document.getElementById("edit-service-url-display").textContent=u.url||buildServiceUrl(u.id),document.getElementById("edit-service-logo-preview").src=u.logo||`/assets/${u.id}.png`,document.getElementById("edit-subdomain").value=u.id,document.getElementById("edit-port").value=u.port||"",document.getElementById("edit-ip").value=u.ip||"localhost",document.getElementById("edit-tailscale-only").checked=u.tailscaleOnly||!1,document.getElementById("edit-logo-url").value=u.logo||"";const s=document.getElementById("edit-service-category");s&&(s.dataset.current=u.category||"",typeof window.populateCategorySelects=="function"&&window.populateCategorySelects()),d.classList.add("show")}function m(){closeModal("service-edit-modal"),l=null}async function h(){if(!l)return;const u=document.getElementById("edit-subdomain").value.trim().toLowerCase(),d=document.getElementById("edit-service-name").value.trim(),s=document.getElementById("edit-port").value.trim(),f=document.getElementById("edit-ip").value.trim()||"localhost",w=document.getElementById("edit-tailscale-only").checked,r=document.getElementById("edit-logo-url").value.trim(),t=document.getElementById("edit-service-category")?.value||"";if(!u){showNotification("Subdomain is required","warning");return}const e=l.id,n=[];if(u!==e&&n.push("subdomain"),d&&d!==l.name&&n.push("name"),s&&s!==String(l.port)&&n.push("port"),f!==l.ip&&n.push("ip"),w!==(l.tailscaleOnly||!1)&&n.push("tailscale"),r&&r!==l.logo&&n.push("logo"),t!==(l.category||"")&&n.push("category"),n.length===0){m();return}const p=document.getElementById("service-edit-save");p.textContent="Saving...",p.disabled=!0;try{const i=await(await secureFetch("/api/v1/services/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubdomain:e,newSubdomain:u,name:d||l.name,port:s||l.port,ip:f,tailscaleOnly:w,logo:r||void 0,category:t})})).json();if(!i.success)throw new Error(i.error||"Failed to update service");const c=window.APPS.findIndex(v=>v.id===e);c!==-1&&(window.APPS[c]={...window.APPS[c],id:u,name:d||window.APPS[c].name,port:s||window.APPS[c].port,ip:f,tailscaleOnly:w,logo:r||window.APPS[c].logo,category:t||void 0}),m(),window.buildGrid(),window.refreshAll()}catch(o){console.error("Error saving service changes:",o),showNotification(`Error saving changes: ${o.message}`,"error")}finally{p.textContent="Save Changes",p.disabled=!1}}document.getElementById("edit-logo-file")?.addEventListener("change",async u=>{const d=u.target.files[0];if(!d)return;if(!d.type.startsWith("image/")){showNotification("Please select an image file","warning");return}const s=new FileReader;s.onload=async f=>{const w=f.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{}},s.readAsDataURL(d)}),document.getElementById("service-edit-cancel")?.addEventListener("click",m),document.getElementById("service-edit-save")?.addEventListener("click",h),document.getElementById("service-edit-modal")?.addEventListener("click",u=>{u.target.id==="service-edit-modal"&&m()});function b(u,d,s){return new Promise(f=>{const w=document.getElementById("delete-service-modal"),r=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"),p=document.getElementById("delete-modal-help"),o=document.getElementById("delete-modal-cancel"),i=document.getElementById("delete-modal-remove"),c=document.getElementById("delete-modal-delete");r.textContent=`Delete "${u}"`,d?(t.innerHTML="This service has an associated Docker container.
Choose how to proceed:",e.style.display="block",n.textContent=`Container ID: ${s?.slice(0,12)||"Unknown"}`,p.style.display="block",c.style.display="block"):(t.textContent="Remove this service from the dashboard?",e.style.display="none",p.style.display="none",c.style.display="none");const v=()=>{w.classList.remove("show"),o.removeEventListener("click",S),i.removeEventListener("click",k),c.removeEventListener("click",L),w.removeEventListener("click",x)},S=()=>{v(),f(null)},k=()=>{v(),f(!1)},L=()=>{v(),f(!0)},x=B=>{B.target===w&&(v(),f(null))};o.addEventListener("click",S),i.addEventListener("click",k),c.addEventListener("click",L),w.addEventListener("click",x),w.classList.add("show")})}async function g(u,d,s){const f=document.getElementById(`update-btn-${s}`),w=f?.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{d&&(d.textContent="\u{1F504}",d.disabled=!0,d.title="Updating...");const e=await(await secureFetch(`/api/v1/containers/${u}/update`,{method:"POST"})).json();if(e.success){const t=window.APPS.find(r=>r.id===i);t&&e.newContainerId&&(t.containerId=e.newContainerId),d&&(d.textContent="\u2705",d.title="Updated successfully!",setTimeout(()=>{d.textContent=g,d.disabled=!1,d.title="Update container to latest version"},3e3)),setTimeout(()=>window.refreshAll(),2e3),showNotification(`${l} updated successfully!`,"success")}else throw new Error(e.error||"Update failed")}catch(o){console.error("Update error:",o),d&&(d.textContent="\u274C",d.title="Update failed",setTimeout(()=>{d.textContent=g,d.disabled=!1,d.title="Update container to latest version"},3e3)),showNotification(`Failed to update ${l}: ${o.message}`,"error")}}async function v(u,l){const i=window.APPS.find(m=>m.id===u),d=i?buildDomain(i.id):null,g=i?.containerId,o=await b(l||u,g,i?.containerId);if(o===null)return;let e={dashboard:!1,container:null,dns:null,caddy:null,service:null};if(o&&g)try{const m=new URLSearchParams({containerId:i.containerId,subdomain:i.id,ip:i.ip||"localhost",deleteContainer:"true"}),I=await(await secureFetch(`/api/v1/apps/${encodeURIComponent(i.id)}?${m.toString()}`,{method:"DELETE"})).json();I.success?e={...e,...I.results,dashboard:!1}:console.error("App removal failed:",I.error)}catch(m){console.error("App removal error:",m)}else if(o&&d){try{const m=i?.ip||"localhost",I=await(await secureFetch(`/api/v1/dns/record?domain=${encodeURIComponent(d)}&type=A&ipAddress=${encodeURIComponent(m)}&server=${SITE.dnsIp}`,{method:"DELETE"})).json();e.dns=I.success?"deleted":I.error||"failed"}catch(m){e.dns=m.message}try{const w=await(await secureFetch(`/api/v1/site/${encodeURIComponent(d)}`,{method:"DELETE"})).json();e.caddy=w.success||w.error&&w.error.includes("not found")?"removed":w.error||"failed"}catch(m){e.caddy=m.message}}const t=window.APPS.findIndex(m=>m.id===u);t>-1&&(window.APPS.splice(t,1),e.dashboard=!0);try{const m=safeGetJSON("custom-apps",[]),w=m.findIndex(I=>I.id===u);w>-1&&(m.splice(w,1),safeSet("custom-apps",JSON.stringify(m)))}catch{}try{const w=await(await secureFetch(`/api/v1/services/${encodeURIComponent(u)}`,{method:"DELETE"})).json();e.service=w.success?"removed":w.error||"failed"}catch(m){e.service=m.message}window.buildGrid(),window.refreshAll();let r=!1,n=[];e.dashboard||(r=!0,n.push("\u2717 Failed to remove from dashboard"));const s=["removed","already removed","not found","deleted","kept (user choice)","skipped","no such record","does not exist"],p=m=>!m||s.some(w=>m.toLowerCase().includes(w.toLowerCase()));e.container&&!p(e.container)&&(r=!0,n.push(`\u26A0 Container: ${e.container}`)),e.dns&&!p(e.dns)&&(r=!0,n.push(`\u26A0 DNS Record: ${e.dns}`)),e.caddy&&!p(e.caddy)&&(r=!0,n.push(`\u26A0 Caddy Config: ${e.caddy}`)),e.service&&!p(e.service)&&(r=!0,n.push(`\u26A0 Service File: ${e.service}`)),r&&showNotification(`Error deleting "${l||u}": ${n.join(", ")}`,"error",6e3)}window.openServiceEditModal=a,window.showDeleteModal=b,window.updateContainer=y,window.deleteService=v})(),(function(){function c(e){return e.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 f(){const e=document.getElementById("service-subdomain-input").value||"subdomain",t=document.getElementById("service-ip-input").value||h.lan||"localhost",r=document.getElementById("service-port-input").value||DC.DEFAULTS.SERVICE_PORT,n=document.getElementById("ssl-type-select").value,s=document.getElementById("ca-name-input").value||"sami-ca",p=document.getElementById("existing-ca-select").value,m=document.getElementById("enable-auth").checked,w=document.getElementById("enable-cors").checked,I=document.getElementById("custom-headers-input").value,T=document.getElementById("upstream-path-input").value||"/",P=document.getElementById("health-check-input").value,C=document.getElementById("timeout-input").value||30,B=document.getElementById("dns-preview");B&&(B.textContent=`${buildDomain(e)} \u2192 ${t}`);const $=document.getElementById("url-preview");$&&($.textContent=buildServiceUrl(e));const E={subdomain:e,port:r,ip:t,sslType:n,caName:s,existingCa:p,enableAuth:m,enableCors:w,customHeaders:I,upstreamPath:T,healthCheck:P,timeout:C},x=window.generateCaddyConfig(E),S=document.getElementById("caddy-config-preview");S&&(S.value=x)}const h={localhost:"127.0.0.1",lan:"",tailscale:""};async function b(){try{const n=await fetch("/api/v1/network/ips",{signal:AbortSignal.timeout(2e3)});if(n.ok){const s=await n.json();s.lan&&(h.lan=s.lan),s.tailscale&&(h.tailscale=s.tailscale)}}catch{}const e=document.getElementById("quick-ip-lan"),t=document.getElementById("quick-ip-tailscale");e&&(h.lan?(e.dataset.ip=h.lan,e.textContent=`LAN (${h.lan})`,e.title=`LAN IP: ${h.lan}`):e.style.display="none"),t&&(h.tailscale?(t.dataset.ip=h.tailscale,t.textContent=`Tailscale (${h.tailscale})`,t.title=`Tailscale IP: ${h.tailscale}`):t.style.display="none");const r=document.getElementById("service-ip-input");r&&!r.value&&h.lan&&(r.value=h.lan)}function y(){document.querySelectorAll(".quick-ip-btn").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.ip;t&&(document.getElementById("service-ip-input").value=t,document.querySelectorAll(".quick-ip-btn").forEach(r=>r.classList.remove("active")),e.classList.add("active"),f())})}),document.getElementById("service-ip-input")?.addEventListener("input",e=>{const t=e.target.value;document.querySelectorAll(".quick-ip-btn").forEach(r=>{r.classList.toggle("active",r.dataset.ip===t)})})}async function v(){const e=document.getElementById("add-service-modal");e.classList.add("show");const t=e.querySelector(".weather-modal-content");t&&(t.scrollTop=0),document.body.style.overflow="hidden";const r=document.getElementById("ssl-type-select");r&&(r.value=a()),await b();const n=document.getElementById("caddyfile-path-input").value||DC.DEFAULTS.CADDYFILE;await window.loadExistingCAs(n);const s=document.getElementById("manual-tailscale-status"),p=document.getElementById("manual-tailscale-only");try{const w=await(await fetch("/api/v1/tailscale/status")).json();w.success&&w.installed&&w.connected?(s.innerHTML=` +The service will be briefly unavailable.`))try{f&&(f.textContent="\u{1F504}",f.disabled=!0,f.title="Updating...");const t=await(await secureFetch(`/api/v1/containers/${u}/update`,{method:"POST"})).json();if(t.success){const e=window.APPS.find(n=>n.id===s);e&&t.newContainerId&&(e.containerId=t.newContainerId),f&&(f.textContent="\u2705",f.title="Updated successfully!",setTimeout(()=>{f.textContent=w,f.disabled=!1,f.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(r){console.error("Update error:",r),f&&(f.textContent="\u274C",f.title="Update failed",setTimeout(()=>{f.textContent=w,f.disabled=!1,f.title="Update container to latest version"},3e3)),showNotification(`Failed to update ${d}: ${r.message}`,"error")}}async function y(u,d){const s=window.APPS.find(c=>c.id===u),f=s?buildDomain(s.id):null,w=s?.containerId,r=await b(d||u,w,s?.containerId);if(r===null)return;let t={dashboard:!1,container:null,dns:null,caddy:null,service:null};if(r&&w)try{const c=new URLSearchParams({containerId:s.containerId,subdomain:s.id,ip:s.ip||"localhost",deleteContainer:"true"}),S=await(await secureFetch(`/api/v1/apps/${encodeURIComponent(s.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(r&&f){try{const c=s?.ip||"localhost",S=await(await secureFetch(`/api/v1/dns/record?domain=${encodeURIComponent(f)}&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 v=await(await secureFetch(`/api/v1/site/${encodeURIComponent(f)}`,{method:"DELETE"})).json();t.caddy=v.success||v.error&&v.error.includes("not found")?"removed":v.error||"failed"}catch(c){t.caddy=c.message}}const e=window.APPS.findIndex(c=>c.id===u);e>-1&&(window.APPS.splice(e,1),t.dashboard=!0);try{const c=safeGetJSON("custom-apps",[]),v=c.findIndex(S=>S.id===u);v>-1&&(c.splice(v,1),safeSet("custom-apps",JSON.stringify(c)))}catch{}try{const v=await(await secureFetch(`/api/v1/services/${encodeURIComponent(u)}`,{method:"DELETE"})).json();t.service=v.success?"removed":v.error||"failed"}catch(c){t.service=c.message}window.buildGrid(),window.refreshAll();let n=!1,p=[];t.dashboard||(n=!0,p.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"],i=c=>!c||o.some(v=>c.toLowerCase().includes(v.toLowerCase()));t.container&&!i(t.container)&&(n=!0,p.push(`\u26A0 Container: ${t.container}`)),t.dns&&!i(t.dns)&&(n=!0,p.push(`\u26A0 DNS Record: ${t.dns}`)),t.caddy&&!i(t.caddy)&&(n=!0,p.push(`\u26A0 Caddy Config: ${t.caddy}`)),t.service&&!i(t.service)&&(n=!0,p.push(`\u26A0 Service File: ${t.service}`)),n&&showNotification(`Error deleting "${d||u}": ${p.join(", ")}`,"error",6e3)}window.openServiceEditModal=a,window.showDeleteModal=b,window.updateContainer=g,window.deleteService=y})(),(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 m(){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,p=document.getElementById("ssl-type-select").value,o=document.getElementById("ca-name-input").value||"sami-ca",i=document.getElementById("existing-ca-select").value,c=document.getElementById("enable-auth").checked,v=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:p,caName:o,existingCa:i,enableAuth:c,enableCors:v,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 p=await fetch("/api/v1/network/ips",{signal:AbortSignal.timeout(2e3)});if(p.ok){const o=await p.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"),m())})}),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 y(){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 p=document.getElementById("caddyfile-path-input").value||DC.DEFAULTS.CADDYFILE;await window.loadExistingCAs(p);const o=document.getElementById("manual-tailscale-status"),i=document.getElementById("manual-tailscale-only");try{const v=await(await fetch("/api/v1/tailscale/status")).json();v.success&&v.installed&&v.connected?(o.innerHTML=` \u2713 Connected - ${w.self?.hostname} (${w.self?.ip}) - `,p.disabled=!1):w.installed?(s.innerHTML='\u26A0 Not connected',p.disabled=!0):(s.innerHTML='Not available',p.disabled=!0)}catch{s.innerHTML='Could not check',p.disabled=!0}p.checked=!1,f()}function u(){const e=document.getElementById("service-type-local"),t=document.getElementById("service-type-external"),r=document.getElementById("local-service-config"),n=document.getElementById("external-service-config"),s=document.getElementById("tab-local"),p=document.getElementById("tab-external");function m(){e.checked?(r.style.display="grid",n.style.display="none",s&&(s.style.background="var(--accent)",s.style.color="var(--bg)"),p&&(p.style.background="transparent",p.style.color="var(--muted)")):(r.style.display="none",n.style.display="block",p&&(p.style.background="var(--accent)",p.style.color="var(--bg)"),s&&(s.style.background="transparent",s.style.color="var(--muted)"))}e?.addEventListener("change",m),t?.addEventListener("change",m)}function l(){const e=document.getElementById("service-name-input"),t=document.getElementById("service-subdomain-input"),r=document.getElementById("subdomain-preview");let n=!1;e?.addEventListener("input",()=>{const T=c(e.value);!n&&t&&(t.value=T),r&&(r.textContent=T?`\u2192 ${buildDomain(T)}`:""),f()}),t?.addEventListener("input",()=>{n=t.value!==c(e?.value||"");const T=t.value.trim()||c(e?.value||"");r&&(r.textContent=T?`\u2192 ${buildDomain(T)}`:""),f()});const s=document.getElementById("external-service-name"),p=document.getElementById("external-service-subdomain"),m=document.getElementById("external-subdomain-preview"),w=document.getElementById("external-domain-preview");let I=!1;s?.addEventListener("input",()=>{const T=c(s.value);!I&&p&&(p.value=T);const P=p?.value||T;m&&(m.textContent=P?`\u2192 ${buildDomain(P)}`:""),w&&(w.textContent=P?buildDomain(P):"")}),p?.addEventListener("input",()=>{I=p.value!==c(s?.value||"");const T=p.value.trim()||c(s?.value||"");m&&(m.textContent=T?`\u2192 ${buildDomain(T)}`:""),w&&(w.textContent=T?buildDomain(T):"")})}async function i(){const e=document.getElementById("external-service-name").value.trim(),t=document.getElementById("external-service-url").value.trim(),r=(document.getElementById("external-service-subdomain").value.trim()||c(e)).toLowerCase(),n=document.getElementById("external-service-logo").value.trim(),s=document.getElementById("external-service-icon").value.trim(),p=document.getElementById("external-create-dns").checked,m=document.getElementById("external-create-caddy").checked,w=document.getElementById("external-proxy-ip").value.trim()||SITE.dnsIp||"localhost",I=document.getElementById("external-preserve-host").checked,T=document.getElementById("external-follow-redirects").checked,P=document.getElementById("external-service-category")?.value||"";if(!e||!t){showNotification("Please fill in Name and External URL","warning");return}if(!r){showNotification("Could not derive subdomain from name. Please set one in Options.","warning");return}if(!t.startsWith("http://")&&!t.startsWith("https://")){showNotification("External URL must start with http:// or https://","warning");return}const C=buildDomain(r);try{const B={dns:null,caddy:null,dashboard:!1};if(p)if(window.getToken(getPrimaryDnsId(),"admin"))try{const A=await(await secureFetch("/api/v1/dns/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:C,ip:w,ttl:DC.DEFAULTS.TTL,server:SITE.dnsIp})})).json();B.dns=A.success?"created":A.error||"failed"}catch(k){B.dns=k.message}else B.dns="no admin token (configure in \u{1F511} Tokens)";if(m)try{const L={subdomain:r,externalUrl:t,preserveHost:I,followRedirects:T,sslType:"caddy-managed",caddyfilePath:DC.DEFAULTS.CADDYFILE,reloadCaddy:!0},A=await(await secureFetch("/api/v1/site/external",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(L)})).json();B.caddy=A.success?"created":A.error||"failed"}catch(L){B.caddy=L.message}const $={id:r,name:e,url:`https://${C}`,externalUrl:t,logo:n||s||"\u{1F310}",isExternal:!0,isCustom:!0};P&&($.category=P),window.APPS.push($),B.dashboard=!0;const E=["plex","router","chat","sync","torrent","radarr","sonarr","prowlarr","portainer","requests","jellyfin","emby"],x=window.APPS.filter(L=>!E.includes(L.id));safeSet("custom-services",JSON.stringify(x));try{await secureFetch("/api/v1/services",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(window.APPS)})}catch(L){console.warn("Failed to save to services.json:",L)}window.buildGrid(),window.refreshAll(),d();const S=[`External service "${e}" added!`];p&&S.push(`DNS: ${B.dns==="created"?"\u2713":"\u26A0 "+B.dns}`),m&&S.push(`Caddy: ${B.caddy==="created"?"\u2713":"\u26A0 "+B.caddy}`),S.push(`Access at: https://${C}`),showNotification(S.join(" | "),"success",6e3)}catch(B){console.error("Failed to create external service:",B),showNotification(`Failed to create external service: ${B.message}`,"error")}}function d(){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 e=document.getElementById("subdomain-preview");e&&(e.textContent="");const t=document.getElementById("external-subdomain-preview");t&&(t.textContent="");const r=document.getElementById("external-service-name");r&&(r.value="");const n=document.getElementById("external-service-subdomain");n&&(n.value="");const s=document.getElementById("external-service-url");s&&(s.value="");const p=document.getElementById("external-service-logo");p&&(p.value="");const m=document.getElementById("external-service-icon");m&&(m.value="");const w=document.getElementById("local-advanced-options");w&&w.removeAttribute("open");const I=document.getElementById("external-advanced-options");I&&I.removeAttribute("open");const T=document.getElementById("service-type-local");T&&(T.checked=!0);const P=document.getElementById("local-service-config"),C=document.getElementById("external-service-config");P&&(P.style.display="grid"),C&&(C.style.display="none");const B=document.getElementById("tab-local"),$=document.getElementById("tab-external");B&&(B.style.background="var(--accent)",B.style.color="var(--bg)"),$&&($.style.background="transparent",$.style.color="var(--muted)")}async function g(){const e=document.getElementById("service-name-input").value.trim(),t=(document.getElementById("service-subdomain-input").value.trim()||c(e)).toLowerCase(),r=document.getElementById("service-port-input").value.trim(),n=document.getElementById("service-ip-input").value.trim(),s=document.getElementById("service-logo-input").value.trim(),p=document.getElementById("create-dns-record").checked,m=parseInt(document.getElementById("dns-ttl-input").value)||DC.DEFAULTS.TTL,w=document.getElementById("manual-tailscale-only")?.checked||!1,I=document.getElementById("ssl-type-select")?.value||"caddy-managed",T=document.getElementById("ca-name-input")?.value||"",P=document.getElementById("existing-ca-select")?.value||"",C=document.getElementById("enable-auth")?.checked||!1,B=document.getElementById("enable-cors")?.checked||!1,$=document.getElementById("custom-headers-input")?.value||"",E=document.getElementById("upstream-path-input")?.value||"/",x=document.getElementById("health-check-input")?.value||"",S=document.getElementById("timeout-input")?.value||30,k=(document.getElementById("service-category-input")||document.getElementById("external-service-category"))?.value||"",A=window.getToken(getPrimaryDnsId(),"admin");if(!e||!r||!n){showNotification("Please fill in Name, Port, and IP Address","warning");return}if(!t){showNotification("Could not derive subdomain from name. Please set one in Options.","warning");return}if(p&&!A){showNotification("DNS Admin token required. Configure it in the Tokens menu first.","warning");return}const D={dns:null,caddy:null,dashboard:!1};try{if(p)try{await window.createDnsRecord(t,n,m),D.dns="created"}catch(N){throw console.error("DNS creation failed:",N),D.dns=N.message,new Error(`DNS creation failed: ${N.message}`)}else D.dns="skipped";const O=window.generateCaddyConfig({subdomain:t,port:r,ip:n,sslType:I,caName:T,existingCa:P,enableAuth:C,enableCors:B,customHeaders:$,upstreamPath:E,healthCheck:x,timeout:S,tailscaleOnly:w});try{const U=await(await secureFetch("/api/v1/site",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:buildDomain(t),upstream:`${n}:${r}`,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(N){throw console.error("Caddy API error:",N),D.caddy=N.message,new Error(`Caddy API error: ${N.message}`)}const R={name:e,subdomain:t,port:r,ip:n,logo:s||`/assets/${t}.png`,tailscaleOnly:w||!1};k&&(R.category=k),await window.addServiceToConfig(R),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 "${e}" created! ${_.join(" | ")} \u2014 ${buildServiceUrl(t)}${w?" (Tailscale)":""}`,"success",6e3),d(),window.buildGrid(),window.refreshAll()}catch(O){console.error("Error creating service:",O),showNotification(`Error creating "${e}": ${O.message}`,"error",6e3)}}document.getElementById("add-service")?.addEventListener("click",v),document.getElementById("add-service-cancel")?.addEventListener("click",d),document.getElementById("add-service-create")?.addEventListener("click",()=>{document.querySelector('input[name="service-type"]:checked')?.value==="external"?i():g()}),u(),l(),y(),document.getElementById("ssl-type-select")?.addEventListener("change",e=>{const t=document.getElementById("existing-ca-config"),r=document.getElementById("custom-ca-config");t.style.display="none",r.style.display="none",e.target.value==="existing-ca"?t.style.display="block":e.target.value==="custom-ca"&&(r.style.display="block"),f()}),document.getElementById("refresh-cas")?.addEventListener("click",async()=>{const e=document.getElementById("refresh-cas"),t=e.textContent;e.textContent="\u231B Loading...",e.disabled=!0;try{const r=document.getElementById("caddyfile-path-input").value||DC.DEFAULTS.CADDYFILE;await window.loadExistingCAs(r),e.textContent="\u2705 Refreshed"}catch(r){e.textContent="\u274C Failed",console.error("Failed to refresh CAs:",r)}setTimeout(()=>{e.textContent=t,e.disabled=!1},2e3)}),document.getElementById("create-dns-record")?.addEventListener("change",e=>{const t=document.getElementById("dns-config");t.style.display=e.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(e=>{const t=document.getElementById(e);t&&(t.addEventListener("input",f),t.addEventListener("change",f))});function o(){const e=safeGet("custom-services");if(e)try{JSON.parse(e).forEach(r=>{window.APPS.find(n=>n.id===r.id)||window.APPS.push(r)})}catch(t){console.warn("Failed to load custom services:",t)}}o(),window.openAddServiceModal=v,window.closeAddServiceModal=d})(),(function(){let c=null,a=1e3;const f=3e4;let h=0,b=!1;function y(){if(c)try{c.close()}catch{}b||(c=new EventSource("/api/v1/events/stream"),c.addEventListener("connected",()=>{a=1e3,h=0,debug("[SSE] Connected to event stream")}),c.addEventListener("status-change",l=>{try{const i=JSON.parse(l.data);if(i.serviceId&&typeof window.setBadge=="function"){const d=i.status==="up"||i.status==="healthy";window.setBadge(i.serviceId,d,i.responseTime||null)}}catch{}}),c.addEventListener("resource-alert",l=>{try{const i=JSON.parse(l.data),d=`${i.containerName||i.containerId}: ${i.metric} at ${i.value}% (threshold: ${i.threshold}%)`;typeof showNotification=="function"&&showNotification(d,"warning")}catch{}}),c.addEventListener("auto-restart",l=>{try{const i=JSON.parse(l.data);typeof showNotification=="function"&&showNotification(`Container "${i.containerName}" was auto-restarted`,"info")}catch{}}),c.addEventListener("update-available",l=>{try{const i=JSON.parse(l.data),d=document.getElementById("updates-btn");if(d&&!d.querySelector(".sse-dot")){const g=document.createElement("span");g.className="sse-dot",g.style.cssText="display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--accent);margin-left:6px;vertical-align:middle;",d.appendChild(g)}typeof showNotification=="function"&&showNotification(`Update available for ${i.containerName||i.containerId}`,"info")}catch{}}),c.addEventListener("update-complete",l=>{try{const i=JSON.parse(l.data);typeof showNotification=="function"&&showNotification(`Update completed: ${i.containerName||i.containerId}`,"success"),typeof window.refreshAll=="function"&&window.refreshAll()}catch{}}),c.addEventListener("update-failed",l=>{try{const i=JSON.parse(l.data);typeof showNotification=="function"&&showNotification(`Update failed: ${i.containerName||i.containerId} \u2014 ${i.error||"unknown error"}`,"error")}catch{}}),c.addEventListener("incident",l=>{try{const i=JSON.parse(l.data);typeof showNotification=="function"&&(i.type==="created"?showNotification(`Incident: ${i.message||i.serviceId}`,"error"):i.type==="resolved"&&showNotification(`Resolved: ${i.serviceId||"incident"}`,"success"))}catch{}}),c.onerror=()=>{if(c.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(y,a),a=Math.min(a*2,f)})}function v(){if(b=!0,c)try{c.close()}catch{}}function u(){b=!1,h=0,a=1e3,y()}y(),window._sseReconnect=y,window._sseClose=v,window._sseResume=u})(),(function(){const c=document.getElementById("service-filter-search"),a=document.getElementById("service-filter-status"),f=document.getElementById("service-filter-category"),h=document.getElementById("service-filter-count");function b(){const l=new Set,i=new Set;document.querySelectorAll("#cards .card[data-category]").forEach(o=>{const e=o.dataset.category.trim();e&&i.add(e)});const d=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES||{};return Object.keys(d).concat([...i].filter(o=>!d[o])).forEach(o=>l.add(o)),{list:[...l],apiCats:d}}function y(){if(!f)return;const{list:l,apiCats:i}=b(),d=f.value;f.innerHTML='',l.sort().forEach(g=>{const o=i[g],e=document.createElement("option");e.value=g,e.textContent=o?`${o.icon||""} ${g}`.trim():g,f.appendChild(e)}),d&&[...f.options].some(g=>g.value===d)?f.value=d:f.value="all"}function v(){y();const l=c.value.toLowerCase().trim(),i=a.value,d=f?f.value:"all",g=document.querySelectorAll("#cards .card");let o=0;if(g.forEach(e=>{const t=e.querySelector(".name")?.textContent?.toLowerCase()||"",r=e.dataset.app?.toLowerCase()||"",n=e.dataset.status||"off",s=e.dataset.category||"";(!l||t.includes(l)||r.includes(l))&&(i==="all"||n===i)&&(d==="all"||s===d)?(e.style.display="",o++):e.style.display="none"}),h){const e=g.length;h.textContent=`${o} of ${e} services`}}function u(l,i){let d;return function(...g){clearTimeout(d),d=setTimeout(()=>l.apply(this,g),i)}}c?.addEventListener("input",u(v,200)),a?.addEventListener("change",v),f?.addEventListener("change",v),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>setTimeout(v,500)):setTimeout(v,500),window.refreshServiceFilter=v,window.refreshCategoryDropdown=y})(),(function(){const c=document.getElementById("batch-operations-btn"),a=document.getElementById("batch-action-bar"),f=document.getElementById("batch-selected-count"),h=document.getElementById("batch-start-btn"),b=document.getElementById("batch-stop-btn"),y=document.getElementById("batch-restart-btn"),v=document.getElementById("batch-cancel-btn");let u=!1,l=new Set;function i(){u=!0,l.clear(),a.style.display="",c.textContent="\u2713 Exit Batch Mode",g(),document.querySelectorAll("#cards .card[data-app]").forEach(t=>{const r=t.dataset.containerId;if(!r)return;const n=t.querySelector(".batch-checkbox");n&&n.remove();const s=document.createElement("input");s.type="checkbox",s.className="batch-checkbox",s.dataset.containerId=r,s.dataset.serviceName=t.querySelector(".name")?.textContent||r,s.style.cssText="position: absolute; top: 8px; left: 8px; z-index: 10; width: 18px; height: 18px; cursor: pointer;",s.addEventListener("change",p=>{p.stopPropagation(),s.checked?l.add(r):l.delete(r),g()}),t.style.position="relative",t.insertBefore(s,t.firstChild)})}function d(){u=!1,l.clear(),a.style.display="none",c.textContent="\u2630 Batch Operations",document.querySelectorAll(".batch-checkbox").forEach(e=>e.remove())}function g(){const e=l.size;f.textContent=`${e} selected`,h.disabled=e===0,b.disabled=e===0,y.disabled=e===0}async function o(e){if(l.size===0)return;const t=Array.from(l),r={start:"Starting",stop:"Stopping",restart:"Restarting"}[e];if(!confirm(`${r} ${t.length} container(s)? This cannot be undone.`))return;const n=[h,b,y];n.forEach(w=>{w.disabled=!0,w.textContent="..."});let s=0,p=0;const m=[];for(const w of t)try{const I=await fetch(`/api/v1/containers/${encodeURIComponent(w)}/${e}`,{method:"POST"});if(I.ok)s++;else{p++;const T=await I.json().catch(()=>({}));m.push(`${w}: ${T.error||I.statusText}`)}}catch(I){p++,m.push(`${w}: ${I.message}`)}n[0].textContent="\u25B6 Start All",n[1].textContent="\u2B1B Stop All",n[2].textContent="\u{1F504} Restart All",g(),p===0?typeof showNotification=="function"&&showNotification(`${r} completed: ${s} container(s)`,"success"):(typeof showNotification=="function"&&showNotification(`${r}: ${s} succeeded, ${p} failed`,"warning"),console.error("Batch operation errors:",m)),setTimeout(()=>{typeof refreshAll=="function"&&refreshAll()},1500)}c?.addEventListener("click",()=>{u?d():i()}),h?.addEventListener("click",()=>o("start")),b?.addEventListener("click",()=>o("stop")),y?.addEventListener("click",()=>o("restart")),v?.addEventListener("click",d)})(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBFcnJvciBIYW5kbGVyXG4gKiBIYW5kbGVzIGVycm9ycyBncmFjZWZ1bGx5IHdpdGhvdXQgYnJlYWtpbmcgdGhlIG9uYm9hcmRpbmcgdG91clxuICovXG5cbihmdW5jdGlvbih3aW5kb3cpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIEVycm9ySGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgdGhpcy5tYXhFcnJvcnMgPSA1MDsgLy8gS2VlcCBsYXN0IDUwIGVycm9yc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhbiBlcnJvciB3aXRob3V0IGJyZWFraW5nIHRoZSB0b3VyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHQgLSBDb250ZXh0IHdoZXJlIGVycm9yIG9jY3VycmVkXG4gICAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1ldGFkYXRhIC0gQWRkaXRpb25hbCBtZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ0Vycm9yKGNvbnRleHQsIGVycm9yLCBtZXRhZGF0YSA9IHt9KSB7XG4gICAgICBjb25zdCBlcnJvckVudHJ5ID0ge1xuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IG51bGwsXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgdG8gZXJyb3JzIGFycmF5XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yRW50cnkpO1xuXG4gICAgICAvLyBLZWVwIG9ubHkgbGFzdCBtYXhFcnJvcnNcbiAgICAgIGlmICh0aGlzLmVycm9ycy5sZW5ndGggPiB0aGlzLm1heEVycm9ycykge1xuICAgICAgICB0aGlzLmVycm9ycy5zaGlmdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgdG8gY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihgW09uYm9hcmRpbmcgRXJyb3JdICR7Y29udGV4dH06YCwgZXJyb3IsIG1ldGFkYXRhKTtcblxuICAgICAgLy8gT3B0aW9uYWxseSBzZW5kIHRvIGVycm9yIHRyYWNraW5nIHNlcnZpY2VcbiAgICAgIC8vIHRoaXMuc2VuZFRvRXJyb3JUcmFja2luZyhlcnJvckVudHJ5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBhbiBlcnJvciBhbmQgY29udGludWUgdG91clxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RlcCAtIEN1cnJlbnQgc3RlcCBpbmRleFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJlY292ZXJ5IGFjdGlvblxuICAgICAqL1xuICAgIHJlY292ZXJGcm9tRXJyb3IoZXJyb3IsIGN1cnJlbnRTdGVwKSB7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSB0aGlzLmNsYXNzaWZ5RXJyb3IoZXJyb3IpO1xuXG4gICAgICBzd2l0Y2ggKGVycm9yVHlwZSkge1xuICAgICAgICBjYXNlICdFTEVNRU5UX05PVF9GT1VORCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignRWxlbWVudCBOb3QgRm91bmQnLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICAgIGFjdGlvbjogJ1NLSVBfU1RFUCcsIFxuICAgICAgICAgICAgbmV4dFN0ZXA6IGN1cnJlbnRTdGVwICsgMSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUYXJnZXQgZWxlbWVudCBub3QgZm91bmQsIHNraXBwaW5nIHRvIG5leHQgc3RlcCdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ1NUT1JBR0VfVU5BVkFJTEFCTEUnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICBhY3Rpb246ICdVU0VfTUVNT1JZX1NUT1JBR0UnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0xvY2FsIHN0b3JhZ2UgdW5hdmFpbGFibGUsIHVzaW5nIGluLW1lbW9yeSBzdG9yYWdlJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnRFJJVkVSX05PVF9MT0FERUQnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ0RyaXZlci5qcyBOb3QgTG9hZGVkJywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdEcml2ZXIuanMgbGlicmFyeSBub3QgbG9hZGVkLCBjYW5ub3Qgc3RhcnQgdG91cidcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ0lOVkFMSURfVE9PTFRJUCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignSW52YWxpZCBUb29sdGlwIENvbmZpZ3VyYXRpb24nLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnU0tJUF9TVEVQJyxcbiAgICAgICAgICAgIG5leHRTdGVwOiBjdXJyZW50U3RlcCArIDEsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB0b29sdGlwIGNvbmZpZ3VyYXRpb24sIHNraXBwaW5nJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVGhlbWUgRGV0ZWN0aW9uIEZhaWxlZCcsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnVVNFX0RFRkFVTFRfVEhFTUUnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1VzaW5nIGRlZmF1bHQgZGFyayB0aGVtZSdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVW5rbm93biBFcnJvcicsIGVycm9yLCB7IGN1cnJlbnRTdGVwIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLCBhYm9ydGluZyB0b3VyJ1xuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xhc3NpZnkgZXJyb3IgdHlwZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBUaGUgZXJyb3Igb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ30gRXJyb3IgdHlwZVxuICAgICAqL1xuICAgIGNsYXNzaWZ5RXJyb3IoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8IGVycm9yLnRvU3RyaW5nKCk7XG5cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdlbGVtZW50JykgJiYgbWVzc2FnZS5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgcmV0dXJuICdFTEVNRU5UX05PVF9GT1VORCc7XG4gICAgICB9XG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcygnc3RvcmFnZScpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ3F1b3RhJykpIHtcbiAgICAgICAgcmV0dXJuICdTVE9SQUdFX1VOQVZBSUxBQkxFJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdkcml2ZXInKSB8fCBtZXNzYWdlLmluY2x1ZGVzKCd1bmRlZmluZWQnKSkge1xuICAgICAgICByZXR1cm4gJ0RSSVZFUl9OT1RfTE9BREVEJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkJykgfHwgbWVzc2FnZS5pbmNsdWRlcygndmFsaWRhdGlvbicpKSB7XG4gICAgICAgIHJldHVybiAnSU5WQUxJRF9UT09MVElQJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCd0aGVtZScpKSB7XG4gICAgICAgIHJldHVybiAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnVU5LTk9XTic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBsb2dnZWQgZXJyb3JzXG4gICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvZiBlcnJvciBlbnRyaWVzXG4gICAgICovXG4gICAgZ2V0RXJyb3JzKCkge1xuICAgICAgcmV0dXJuIFsuLi50aGlzLmVycm9yc107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIGxvZ2dlZCBlcnJvcnNcbiAgICAgKi9cbiAgICBjbGVhckVycm9ycygpIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGVycm9yIHN0YXRpc3RpY3NcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBFcnJvciBzdGF0aXN0aWNzXG4gICAgICovXG4gICAgZ2V0U3RhdGlzdGljcygpIHtcbiAgICAgIGNvbnN0IHN0YXRzID0ge1xuICAgICAgICB0b3RhbDogdGhpcy5lcnJvcnMubGVuZ3RoLFxuICAgICAgICBieUNvbnRleHQ6IHt9LFxuICAgICAgICBieVR5cGU6IHt9LFxuICAgICAgICByZWNlbnQ6IHRoaXMuZXJyb3JzLnNsaWNlKC0xMClcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZXJyb3JzLmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICAvLyBDb3VudCBieSBjb250ZXh0XG4gICAgICAgIHN0YXRzLmJ5Q29udGV4dFtlcnJvci5jb250ZXh0XSA9IChzdGF0cy5ieUNvbnRleHRbZXJyb3IuY29udGV4dF0gfHwgMCkgKyAxO1xuXG4gICAgICAgIC8vIENvdW50IGJ5IHR5cGVcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY2xhc3NpZnlFcnJvcih7IG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICAgIHN0YXRzLmJ5VHlwZVt0eXBlXSA9IChzdGF0cy5ieVR5cGVbdHlwZV0gfHwgMCkgKyAxO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzdGF0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZ3JhY2VmdWwgZGVncmFkYXRpb24gd2hlbiBEcml2ZXIuanMgZmFpbHMgdG8gbG9hZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGZhbGxiYWNrIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgaGFuZGxlRHJpdmVyTG9hZEZhaWx1cmUoKSB7XG4gICAgICB0aGlzLmxvZ0Vycm9yKCdEcml2ZXIuanMgTG9hZCBGYWlsdXJlJywgJ0RyaXZlci5qcyBsaWJyYXJ5IGZhaWxlZCB0byBsb2FkJyk7XG5cbiAgICAgIC8vIFNob3cgZmFsbGJhY2sgbWVzc2FnZVxuICAgICAgY29uc3QgZmFsbGJhY2tNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaWQgPSAnb25ib2FyZGluZy1mYWxsYmFjayc7XG4gICAgICBmYWxsYmFja01lc3NhZ2Uuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBib3R0b206IDIwcHg7XG4gICAgICAgIHJpZ2h0OiAyMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMyYTJhMmEpO1xuICAgICAgICBjb2xvcjogdmFyKC0tZmcsICNmZmZmZmYpO1xuICAgICAgICBwYWRkaW5nOiAxNXB4IDIwcHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMyk7XG4gICAgICAgIHotaW5kZXg6IDk5OTk7XG4gICAgICAgIG1heC13aWR0aDogMzAwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIGA7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaW5uZXJIVE1MID0gYFxuICAgICAgICA8c3Ryb25nPldlbGNvbWUgdG8gRGFzaENhZGR5ITwvc3Ryb25nPjxicj5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDEwcHggMCAwIDA7IGZvbnQtc2l6ZTogMTJweDtcIj5cbiAgICAgICAgICBUaGUgaW50ZXJhY3RpdmUgdG91ciBpcyB1bmF2YWlsYWJsZSwgYnV0IHlvdSBjYW4gZXhwbG9yZSB0aGUgZGFzaGJvYXJkIGZyZWVseS5cbiAgICAgICAgICBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgaGVscCBnZXR0aW5nIHN0YXJ0ZWQuXG4gICAgICAgIDwvcD5cbiAgICAgIGA7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZmFsbGJhY2tNZXNzYWdlKTtcblxuICAgICAgLy8gQXV0by1yZW1vdmUgYWZ0ZXIgMTAgc2Vjb25kc1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChmYWxsYmFja01lc3NhZ2UucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGZhbGxiYWNrTWVzc2FnZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZhbGxiYWNrTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIDEwMDAwKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHN0b3JhZ2UgdW5hdmFpbGFibGUgc2NlbmFyaW9cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBJbi1tZW1vcnkgc3RvcmFnZSBmYWxsYmFja1xuICAgICAqL1xuICAgIGhhbmRsZVN0b3JhZ2VVbmF2YWlsYWJsZSgpIHtcbiAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCAnTG9jYWwgc3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlJyk7XG5cbiAgICAgIC8vIENyZWF0ZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgICAgY29uc3QgbWVtb3J5U3RvcmFnZSA9IHtcbiAgICAgICAgZGF0YToge30sXG4gICAgICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuZGF0YVtrZXldO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhcigpIHtcbiAgICAgICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc29sZS53YXJuKCdbRXJyb3JIYW5kbGVyXSBVc2luZyBpbi1tZW1vcnkgc3RvcmFnZSAtIHByb2dyZXNzIHdpbGwgbm90IHBlcnNpc3QnKTtcbiAgICAgIHJldHVybiBtZW1vcnlTdG9yYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgZXJyb3IgdG8gdHJhY2tpbmcgc2VydmljZSAocGxhY2Vob2xkZXIpXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JFbnRyeSAtIEVycm9yIGVudHJ5IHRvIHNlbmRcbiAgICAgKi9cbiAgICBzZW5kVG9FcnJvclRyYWNraW5nKGVycm9yRW50cnkpIHtcbiAgICAgIC8vIFBsYWNlaG9sZGVyIGZvciBlcnJvciB0cmFja2luZyBpbnRlZ3JhdGlvblxuICAgICAgLy8gQ291bGQgaW50ZWdyYXRlIHdpdGggU2VudHJ5LCBMb2dSb2NrZXQsIGV0Yy5cbiAgICAgIC8vIEV4YW1wbGU6XG4gICAgICAvLyBpZiAod2luZG93LlNlbnRyeSkge1xuICAgICAgLy8gICBTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihuZXcgRXJyb3IoZXJyb3JFbnRyeS5tZXNzYWdlKSwge1xuICAgICAgLy8gICAgIGV4dHJhOiBlcnJvckVudHJ5Lm1ldGFkYXRhXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIHdpbmRvdy5FcnJvckhhbmRsZXIgPSBFcnJvckhhbmRsZXI7XG4gIGNvbnNvbGUubG9nKCdbRXJyb3JIYW5kbGVyXSBNb2R1bGUgbG9hZGVkJyk7XG5cbn0pKHdpbmRvdyk7XG47XG4vLyA9PT09PSBEQVNIQk9BUkQgQ09OU1RBTlRTID09PT09XG4vLyBIb25vciBwZXJzaXN0ZWQgaGVhbHRoIHJldGVudGlvbiBzZXR0aW5ncyBmb3IgcG9sbGluZyBjYWRlbmNlcyBzbyB0aGVcbi8vIFNldHRpbmdzIFx1MjE5MiBIZWFsdGggXHUyMTkyIEdsb2JhbCBTZXR0aW5ncyBwYW5lbCBhY3R1YWxseSB0YWtlcyBlZmZlY3QuIFRoZVxuLy8gU1RBVFMgaW50ZXJ2YWwgKHJlc291cmNlL2NvbnRhaW5lciBzdGF0IHNhbXBsaW5nKSBpcyBkcml2ZW4gZnJvbSB0aGVcbi8vIHVzZXItY29uZmlndXJhYmxlIHN0YXRzUG9sbGluZ0ludGVydmFsLiBIRUFMVEggaXMgdGhlIGxpZ2h0d2VpZ2h0IGNhcmRcbi8vIGJhZGdlIHJlZnJlc2ggYW5kIHN0YXlzIGF0IGl0cyBmYXN0IGRlZmF1bHQgdW5sZXNzIG92ZXJyaWRkZW4uXG4oZnVuY3Rpb24gYXBwbHlIZWFsdGhQb2xsaW5nU2V0dGluZ3MoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHJhdyA9ICh0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJyAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaGNhZGR5LWhlYWx0aC1zZXR0aW5ncycpKSB8fCBudWxsO1xuICAgIGlmIChyYXcpIHtcbiAgICAgIHZhciBzID0gSlNPTi5wYXJzZShyYXcpO1xuICAgICAgLy8gdmFsdWVzIGFyZSBzdG9yZWQgaW4gc2Vjb25kczsgREMuUE9MTCBleHBlY3RzIG1pbGxpc2Vjb25kc1xuICAgICAgaWYgKHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgJiYgcy5zdGF0c1BvbGxpbmdJbnRlcnZhbCA+PSA1ICYmIHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgPD0gMzYwMCkge1xuICAgICAgICB3aW5kb3cuX19EQ19TVEFUU19PVkVSUklERSA9IHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgKiAxMDAwO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgXHUyMDE0IGZhbGwgYmFjayB0byBkZWZhdWx0cyBiZWxvdyAqLyB9XG59KSgpO1xuXG5jb25zdCBEQyA9IHtcbiAgTkFNRTogJ0Rhc2hDYWRkeScsXG4gIFBPTEw6IHtcbiAgICBEQVNIQk9BUkQ6ICAxMDAwMCwgICAvLyAxMHMgXHUyMDE0IG1haW4gcmVmcmVzaEFsbCBpbnRlcnZhbFxuICAgIExPR1M6ICAgICAgIDMwMDAsICAgIC8vIDNzICBcdTIwMTQgbG9nIHZpZXdlciB1cGRhdGVzXG4gICAgU1RBVFM6ICAgICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5fX0RDX1NUQVRTX09WRVJSSURFKSB8fCA1MDAwLCAgIC8vIDVzIGRlZmF1bHQgXHUyMDE0IHJlc291cmNlIG1vbml0b3IgcmVmcmVzaCAob3ZlcnJpZGFibGUgdmlhIFNldHRpbmdzIFx1MjE5MiBIZWFsdGgpXG4gICAgV0VBVEhFUjogICAgNjAwMDAwLCAgLy8gMTBtIFx1MjAxNCB3ZWF0aGVyIHdpZGdldCByZWZyZXNoXG4gICAgSEVBTFRIOiAgICAgMTAwMCwgICAgLy8gMXMgIFx1MjAxNCBjYXJkIGhlYWx0aCBiYWRnZSByZWZyZXNoXG4gICAgREVQTE9ZX1NTTDogNTAwMCwgICAgLy8gNXMgIFx1MjAxNCBTU0wgY2VydCBjaGVjayBkdXJpbmcgZGVwbG95XG4gIH0sXG4gIERFTEFZUzoge1xuICAgIEJUTl9SRVNFVDogIDIwMDAsICAgIC8vIEJ1dHRvbiB0ZXh0IHJlc2V0IGFmdGVyIGFjdGlvblxuICAgIFJFTE9BRDogICAgIDUwMDAsICAgIC8vIFBhZ2UgcmVsb2FkIGFmdGVyIHJlc3RhcnRcbiAgICBNT0RBTF9DTE9TRTogNTAwLCAgICAvLyBNb2RhbCBjbG9zZSBhbmltYXRpb25cbiAgICBQT1JUX0NIRUNLOiA1MDAsICAgICAvLyBEZWJvdW5jZSBmb3IgcG9ydCBhdmFpbGFiaWxpdHkgY2hlY2tcbiAgICBERVBMT1lfSU5JVDogMzAwMCwgICAvLyBJbml0aWFsIGRlcGxveSBjZXJ0IGNoZWNrIGRlbGF5XG4gIH0sXG4gIERFRkFVTFRTOiB7XG4gICAgRE5TX1BPUlQ6ICAgICc1MzgwJyxcbiAgICBTRVJWSUNFX1BPUlQ6ICc4MDgwJyxcbiAgICBUVEw6ICAgICAgICAgMzAwLFxuICAgIENBRERZRklMRTogICAnQzpcXFxcY2FkZHlcXFxcQ2FkZHlmaWxlJyxcbiAgfSxcbn07XG5cbi8vIEVycm9yIGhhbmRsZXIgZm9yIHRyYWNraW5nIGlzc3Vlc1xuY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuXG4vLyA9PT09PSBHTE9CQUwgU0lURSBDT05GSUcgKGxvYWRlZCBmcm9tIHNlcnZlciwgY2FjaGVkIGluIGxvY2FsU3RvcmFnZSkgPT09PT1cbi8vIE9ubHkgbm9uLXNlbnNpdGl2ZSBkaXNwbGF5IHByZWZlcmVuY2VzIGFyZSBjYWNoZWQ7IEROUyBJUHMvdG9wb2xvZ3kgYXJlIGZldGNoZWQgZnJvbSBBUElcbmNvbnN0IF9jYWNoZWRDZmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkYXNoY2FkZHlfc2l0ZV9jb25maWcnKSB8fCAnbnVsbCcpO1xuY29uc3QgU0lURSA9IHtcbiAgdGxkOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLnRsZCkgfHwgJy5ob21lJyxcbiAgZG5zSXA6ICcnLFxuICBkbnNQb3J0OiBEQy5ERUZBVUxUUy5ETlNfUE9SVCxcbiAgZG5zU2VydmVyczoge30sXG4gIGNvbmZpZ3VyYXRpb25UeXBlOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLmNvbmZpZ3VyYXRpb25UeXBlKSB8fCAnaG9tZWxhYicsXG4gIGRvbWFpbjogKF9jYWNoZWRDZmcgJiYgX2NhY2hlZENmZy5kb21haW4pIHx8ICcnLFxuICBkZWZhdWx0czogKF9jYWNoZWRDZmcgJiYgX2NhY2hlZENmZy5kZWZhdWx0cykgfHwge30sXG4gIHJvdXRpbmdNb2RlOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLnJvdXRpbmdNb2RlKSB8fCAnc3ViZG9tYWluJyxcbiAgb25ib2FyZGluZ0NvbXBsZXRlZDogZmFsc2Vcbn07XG53aW5kb3cuX19kYXNoY2FkZHlTaXRlQ29uZmlnTG9hZGVkID0gKGFzeW5jIGZ1bmN0aW9uIGxvYWRTaXRlQ29uZmlnKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICBpZiAoci5vaykge1xuICAgICAgY29uc3QgYyA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKGMudGxkKSBTSVRFLnRsZCA9IGMudGxkLnN0YXJ0c1dpdGgoJy4nKSA/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+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gKHAuY29uZmlnICYmIChwLmNvbmZpZy5sYWJlbCB8fCBwLm5hbWUpKSB8fCBwLm5hbWU7XG4gICAgICBjb25zdCBidG4gPSBgPGJ1dHRvbiBjbGFzcz1cInByb3ZpZGVyLWJ0blwiIGRhdGEtcHJvdmlkZXI9XCIke3AubmFtZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbjogNnB4IDRweDsgcGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogd2hpdGU7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cbiAgICAgICAgU2lnbiBpbiB3aXRoICR7bGFiZWx9XG4gICAgICA8L2J1dHRvbj5gO1xuICAgICAgcmV0dXJuIGJ0bjtcbiAgICB9KS5qb2luKCdcXG4nKTtcblxuICAgIGNhcmQuaW5uZXJIVE1MID0gYFxuICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tZGFya1wiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tZGFyay5wbmdcIiBhbHQ9XCJEYXNoQ2FkZHlcIiBvbmVycm9yPVwidGhpcy5zdHlsZS5kaXNwbGF5PSdub25lJ1wiPlxuICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tbGlnaHRcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZ1wiIGFsdD1cIkRhc2hDYWRkeVwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XG4gICAgICA8cCBjbGFzcz1cInN1YnRpdGxlXCI+Q2hvb3NlIGhvdyB0byBzaWduIGluPC9wPlxuICAgICAgPGRpdiBpZD1cImF1dGgtZ2F0ZS1wcm92aWRlcnNcIiBzdHlsZT1cIm1hcmdpbjogMTRweCAwIDEwcHg7XCI+JHtwcm92aWRlckJ1dHRvbnN9PC9kaXY+XG4gICAgICA8ZGl2IGlkPVwiYXV0aC1nYXRlLW1lc3NhZ2VcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+PC9kaXY+XG4gICAgYDtcblxuICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuXG4gICAgLy8gV2lyZSBlYWNoIGJ1dHRvblxuICAgIGNhcmQucXVlcnlTZWxlY3RvckFsbCgnLnByb3ZpZGVyLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGJ0bi5kYXRhc2V0LnByb3ZpZGVyO1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IHByb3ZpZGVycy5maW5kKHAgPT4gcC5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgcmVuZGVyUHJvdmlkZXJDaGFsbGVuZ2UocHJvdmlkZXIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXN0b3JlT3JpZ2luYWxCb2R5KCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignLnRvdHAtY2FyZCcpO1xuICAgIGlmICghY2FyZCB8fCAhY2FyZC5kYXRhc2V0Lm9yaWdpbmFsQm9keSkgcmV0dXJuO1xuICAgIGNhcmQuaW5uZXJIVE1MID0gY2FyZC5kYXRhc2V0Lm9yaWdpbmFsQm9keTtcbiAgICAvLyBSZS1iaW5kIHRoZSBvcmlnaW5hbCBkaWdpdCBpbnB1dCBoYW5kbGVycyBieSByZS1ydW5uaW5nIHRoZSB0b3RwLWF1dGhcbiAgICAvLyBib290c3RyYXAuIFRoZSBzaW1wbGVzdCBwYXRoOiByZWxvYWQgdGhlIHBhZ2UsIHdoaWNoIHJlLXJ1bnMgYWxsIElJRkVzLlxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlclByb3ZpZGVyQ2hhbGxlbmdlKHByb3ZpZGVyKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgICBjb25zdCBjYXJkID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcudG90cC1jYXJkJyk7XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICBpZiAocHJvdmlkZXIubmFtZSA9PT0gJ3RvdHAnKSB7XG4gICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBUT1RQIG1hcmt1cCBcdTIxOTIgZXhpc3RpbmcgdG90cC1hdXRoLmpzIHN1Ym1pdFRvdHBDb2RlXG4gICAgICAvLyBwYXRoIGhhbmRsZXMgdGhlIHJlc3QuIChSZWxvYWQgaXMgdGhlIGNsZWFuZXN0IHBhdGggYmVjYXVzZVxuICAgICAgLy8gdG90cC1hdXRoLmpzIHdpcmVzIGl0cyBpbnB1dCBoYW5kbGVycyBhdCB0b3AtbGV2ZWwgSUlGRSB0aW1lLilcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvdmlkZXIubmFtZSA9PT0gJ2VtYWlsJykge1xuICAgICAgY2FyZC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxpbWcgY2xhc3M9XCJ0b3RwLWxvZ28gdG90cC1sb2dvLWRhcmtcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWRhcmsucG5nXCIgYWx0PVwiRGFzaENhZGR5XCIgb25lcnJvcj1cInRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSdcIj5cbiAgICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tbGlnaHRcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZ1wiIGFsdD1cIkRhc2hDYWRkeVwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XG4gICAgICAgIDxwIGNsYXNzPVwic3VidGl0bGVcIj5TaWduIGluIHdpdGggZW1haWw8L3A+XG4gICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOiA2cHggMCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgV2UnbGwgZW1haWwgeW91IGEgb25lLXRpbWUgc2lnbi1pbiBsaW5rLlxuICAgICAgICA8L3A+XG4gICAgICAgIDxpbnB1dCBpZD1cImF1dGgtZ2F0ZS1lbWFpbC1pbnB1dFwiIHR5cGU9XCJlbWFpbFwiIGlucHV0bW9kZT1cImVtYWlsXCIgYXV0b2NvbXBsZXRlPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ5b3VAZXhhbXBsZS5jb21cIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBmb250LXNpemU6IDFyZW07IGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWJnKTsgY29sb3I6IHZhcigtLXRleHQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhdXRoLWdhdGUtZW1haWwtc3VibWl0XCIgY2xhc3M9XCJwcm92aWRlci1idG5cIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogMTRweDsgcGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogd2hpdGU7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC45NXJlbTsgd2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgU2VuZCBzaWduLWluIGxpbmtcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgaWQ9XCJhdXRoLWdhdGUtZW1haWwtc3RhdHVzXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBmb250LXNpemU6IDAuODVyZW07IGxpbmUtaGVpZ2h0OiAxLjQ7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgaWQ9XCJhdXRoLWdhdGUtYmFja1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+XHUyMTkwIEJhY2s8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgICAgY29uc3QgaW5wdXQgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtZW1haWwtaW5wdXQnKTtcbiAgICAgIGNvbnN0IHN1Ym1pdCA9IGNhcmQucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1zdWJtaXQnKTtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGNhcmQucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGJhY2sgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtYmFjaycpO1xuXG4gICAgICBzdWJtaXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVtYWlsID0gKGlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgICAgIGlmICghZW1haWwgfHwgIWVtYWlsLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnRW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLic7XG4gICAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWVycm9yLCAjZDMzKSc7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN1Ym1pdC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdTZW5kaW5nXHUyMDI2JztcbiAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYXV0aC9sb2dpbi9lbWFpbC9pbml0aWF0ZScsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVtYWlsIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpYSA9IGRhdGEuZGVsaXZlcmVkVmlhIHx8ICdlbWFpbCc7XG4gICAgICAgICAgICBjb25zdCBtYXNrZWQgPSBkYXRhLm1hc2tlZEVtYWlsIHx8IGVtYWlsO1xuICAgICAgICAgICAgaWYgKHZpYSA9PT0gJ2Rldi1jb25zb2xlJykge1xuICAgICAgICAgICAgICBzdGF0dXMuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgICAgIENoZWNrIHRoZSBzZXJ2ZXIgbG9ncyBmb3IgeW91ciBvbmUtdGltZSBsaW5rLlxuICAgICAgICAgICAgICAgIChEZXYgbW9kZTogbm8gU01UUCBjb25maWd1cmVkLiBJbiBwcm9kdWN0aW9uIHRoaXMgd291bGQgZW1haWwgPHN0cm9uZz4ke21hc2tlZH08L3N0cm9uZz4uKWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGF0dXMuaW5uZXJIVE1MID0gYFNpZ24taW4gbGluayBzZW50IHRvIDxzdHJvbmc+JHttYXNrZWR9PC9zdHJvbmc+LlxuICAgICAgICAgICAgICAgIENoZWNrIHlvdXIgaW5ib3ggKGFuZCBzcGFtIGZvbGRlcikuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1zdWNjZXNzLCAjMmE3KSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgJ0NvdWxkIG5vdCBzZW5kIGxpbmsuJztcbiAgICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1lcnJvciwgI2QzMyknO1xuICAgICAgICAgICAgc3VibWl0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ0Nvbm5lY3Rpb24gZXJyb3IuIFRyeSBhZ2Fpbi4nO1xuICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1lcnJvciwgI2QzMyknO1xuICAgICAgICAgIHN1Ym1pdC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4ge1xuICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHN1Ym1pdC5jbGljaygpO1xuICAgICAgfSk7XG5cbiAgICAgIGJhY2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzaG93UHJvdmlkZXJTZWxlY3Rvcihwcm92aWRlcnMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVW5rbm93biBwcm92aWRlciBcdTIxOTIgcmVzdG9yZSBUT1RQIHBhdGggYXMgYSBsYXN0IHJlc29ydFxuICAgIGNvbnNvbGUud2FybignW2F1dGgtZ2F0ZV0gdW5rbm93biBwcm92aWRlcicsIHByb3ZpZGVyLm5hbWUpO1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNob3coKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHJldHVybjsgLy8gVE9UUC1vbmx5IGJ1aWxkIHdpdGhvdXQgb3VyIG92ZXJsYXkgY2hhbmdlc1xuXG4gICAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgZmV0Y2hNZXRob2RzKCk7XG4gICAgaWYgKHByb3ZpZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIEVpdGhlciB0aGUgZW5kcG9pbnQgaXNuJ3QgcmVhY2hhYmxlIE9SIG5vIHByb3ZpZGVyIHJlcG9ydHMgZW5hYmxlZC5cbiAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgbGVnYWN5IFRPVFAgb3ZlcmxheSBcdTIwMTQgZXhpc3RpbmcgdG90cC1hdXRoLmpzIGhhbmRsZXMgaXQuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5ID09PSAnZnVuY3Rpb24nKSB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocHJvdmlkZXJzLmxlbmd0aCA9PT0gMSAmJiBwcm92aWRlcnNbMF0ubmFtZSA9PT0gJ3RvdHAnKSB7XG4gICAgICAvLyBTaW5nbGUgVE9UUCBwcm92aWRlciBcdTIxOTIgc2hvdyB0aGUgb3JpZ2luYWwgVE9UUCBvdmVybGF5IHVuY2hhbmdlZCxcbiAgICAgIC8vIGJ1dCB3aXRoIGFuIFwiT3Igc2lnbiBpbiB3aXRoIGVtYWlsXCIgbGluayBiZWxvdyBzbyB0aGUgZW1haWwgcGF0aFxuICAgICAgLy8gaXMgcmVhY2hhYmxlIGFzIHRoZSByZWNvdmVyeSAvIHBob25lLWZyaWVuZGx5IGFsdGVybmF0aXZlLiBNb3N0XG4gICAgICAvLyB1c2VycyBzdGlsbCB3YW50IHRoZWlyIHByaW1hcnkgbWV0aG9kIChUT1RQKSBmcm9udC1hbmQtY2VudGVyLlxuICAgICAgc2hvd1RvdHBXaXRoRW1haWxGYWxsYmFjayhwcm92aWRlcnNbMF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzaG93UHJvdmlkZXJTZWxlY3Rvcihwcm92aWRlcnMpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1RvdHBXaXRoRW1haWxGYWxsYmFjayh0b3RwUHJvdmlkZXIpIHtcbiAgICBjb25zdCBlbWFpbEVuYWJsZWQgPSBtZXRob2RzQ2FjaGUgJiYgbWV0aG9kc0NhY2hlLmZpbmQocCA9PiBwLm5hbWUgPT09ICdlbWFpbCcpO1xuICAgIGlmICghZW1haWxFbmFibGVkKSB7XG4gICAgICAvLyBUcnVseSBzaW5nbGUtcHJvdmlkZXIgcGF0aDogbGVnYWN5IFRPVFAgb3ZlcmxheSwgbm8gYWx0IGxpbmsuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5ID09PSAnZnVuY3Rpb24nKSB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgIGNvbnN0IGNhcmQgPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWNhcmQnKTtcbiAgICBpZiAoIWNhcmQpIHJldHVybjtcblxuICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIFRPVFAgbWFya3VwIHNvIHdlIGNhbiByZXN0b3JlIG9uIGFsdC1saW5rIGNsaWNrIG9mZi5cbiAgICBpZiAoIWNhcmQuZGF0YXNldC5vcmlnaW5hbEJvZHkpIGNhcmQuZGF0YXNldC5vcmlnaW5hbEJvZHkgPSBjYXJkLmlubmVySFRNTDtcblxuICAgIC8vIEFkZCBhIHNtYWxsIFwib3JcIiBsaW5rIGF0IHRoZSBib3R0b20gb2YgdGhlIGV4aXN0aW5nIGNhcmQgV0lUSE9VVFxuICAgIC8vIHRvdWNoaW5nIHRoZSBUT1RQIGlucHV0IG1hcmt1cCBcdTIwMTQga2VlcHMgdG90cC1hdXRoLmpzJ3Mgc3VibWl0VG90cENvZGVcbiAgICAvLyBiaW5kaW5nIGludGFjdC5cbiAgICBsZXQgYWx0ID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcjYXV0aC1nYXRlLWVtYWlsLWFsdCcpO1xuICAgIGlmICghYWx0KSB7XG4gICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpdi5pZCA9ICdhdXRoLWdhdGUtZW1haWwtYWx0JztcbiAgICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi10b3A6IDE4cHg7IHBhZGRpbmctdG9wOiAxNHB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtOyc7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gYDxhIGhyZWY9XCIjXCIgaWQ9XCJhdXRoLWdhdGUtZW1haWwtYWx0LWxpbmtcIlxuICAgICAgICBzdHlsZT1cImNvbG9yOiB2YXIoLS1hY2NlbnQpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7XCI+XG4gICAgICAgIE9yIHNpZ24gaW4gd2l0aCBlbWFpbCBpbnN0ZWFkIFx1MjE5MlxuICAgICAgPC9hPmA7XG4gICAgICBjYXJkLmFwcGVuZENoaWxkKGRpdik7XG4gICAgICBkaXYucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1hbHQtbGluaycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmVuZGVyUHJvdmlkZXJDaGFsbGVuZ2UoZW1haWxFbmFibGVkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfVxuXG4gIC8vIC0tLS0gVHJpZ2dlciBwb2ludHMgLS0tLVxuICAvLyAxLiBTU08gcmVkaXJlY3QgZnJvbSBDYWRkeTogP2F1dGg9cmVxdWlyZWRcbiAgLy8gICAgV2UgY2xhaW0gb3duZXJzaGlwIGhlcmUgKHNldCB3aW5kb3cuX19kY18wNDlfaGFuZGxlZCA9IHRydWUpXG4gIC8vICAgIEJFRk9SRSB0b3RwLWF1dGguanMncyBvd24gP2F1dGg9cmVxdWlyZWQgY2hlY2sgcnVucywgc28gdGhlIGxlZ2FjeVxuICAvLyAgICBUT1RQLW9ubHkgb3ZlcmxheSBkb2Vzbid0IGZsaWNrZXIgaW4gZm9yIG11bHRpLXByb3ZpZGVyIGluc3RhbGxzLlxuICAvLyAgICBTaW5nbGUtcHJvdmlkZXIgVE9UUC1vbmx5IGluc3RhbGxzIHdvcmsgYmVjYXVzZSB3ZSBzdGlsbCBkZWxlZ2F0ZVxuICAvLyAgICBiYWNrIHRvIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5KCkgaW4gYHNob3coKWAgYmVsb3cuXG4gIHdpbmRvdy5fX2RjXzA0OV9oYW5kbGVkID0gdHJ1ZTtcblxuICBmdW5jdGlvbiBpc0FsbG93ZWRSZXR1cm5VcmwocmV0dXJuVXJsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmV0dXJuVXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgIGlmICghWydodHRwOicsICdodHRwczonXS5pbmNsdWRlcyhwYXJzZWQucHJvdG9jb2wpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAocGFyc2VkLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAocGFyc2VkLnByb3RvY29sICE9PSAnaHR0cHM6JykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBnbG9iYWxzLmpzIGlzIGNvbmNhdGVuYXRlZCBiZWZvcmUgdGhpcyBtb2R1bGUgaW4gY29yZS5qcywgc28gU0lURSBpc1xuICAgICAgLy8gYXZhaWxhYmxlIGhlcmUuIFBlcm1pdCBleGFjdCBob3N0cyBhbmQgc3ViZG9tYWlucyB1bmRlciB0aGUgY29uZmlndXJlZFxuICAgICAgLy8gcHJpdmF0ZSBUTEQgKGZvciBleGFtcGxlIHBsZXguc2FtaSksIHdoaWxlIHJlamVjdGluZyBsb29rYWxpa2VzIHN1Y2ggYXNcbiAgICAgIC8vIHBsZXguc2FtaS5ldmlsLmV4YW1wbGUuXG4gICAgICBjb25zdCBzdWZmaXggPSBTSVRFLnRsZC5zdGFydHNXaXRoKCcuJykgPyBTSVRFLnRsZCA6IGAuJHtTSVRFLnRsZH1gO1xuICAgICAgcmV0dXJuIHBhcnNlZC5ob3N0bmFtZSA9PT0gc3VmZml4LnNsaWNlKDEpIHx8IHBhcnNlZC5ob3N0bmFtZS5lbmRzV2l0aChzdWZmaXgpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFNzb0hhbmRvZmZUYXJnZXQocmV0dXJuVXJsLCB0b2tlbikge1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmV0dXJuVXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICBpZiAocGFyc2VkLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xuXG4gICAgY29uc3Qgc3VmZml4ID0gU0lURS50bGQuc3RhcnRzV2l0aCgnLicpID8gU0lURS50bGQgOiBgLiR7U0lURS50bGR9YDtcbiAgICBjb25zdCBpc1ByaXZhdGVIb3N0ID0gcGFyc2VkLmhvc3RuYW1lID09PSBzdWZmaXguc2xpY2UoMSkgfHwgcGFyc2VkLmhvc3RuYW1lLmVuZHNXaXRoKHN1ZmZpeCk7XG4gICAgaWYgKHBhcnNlZC5wcm90b2NvbCAhPT0gJ2h0dHBzOicgfHwgIWlzUHJpdmF0ZUhvc3QgfHwgIXRva2VuKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJldHVyblBhdGggPSBgJHtwYXJzZWQucGF0aG5hbWV9JHtwYXJzZWQuc2VhcmNofSR7cGFyc2VkLmhhc2h9YDtcbiAgICBwYXJzZWQucGF0aG5hbWUgPSAnL2Rhc2hjYWRkeS1zc28nO1xuICAgIHBhcnNlZC5zZWFyY2ggPSAnJztcbiAgICBwYXJzZWQuaGFzaCA9ICcnO1xuICAgIHBhcnNlZC5zZWFyY2hQYXJhbXMuc2V0KCd0b2tlbicsIHRva2VuKTtcbiAgICBwYXJzZWQuc2VhcmNoUGFyYW1zLnNldCgncmV0dXJuJywgcmV0dXJuUGF0aCk7XG4gICAgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVzdW1lRXhpc3RpbmdTZXNzaW9uKHJldHVyblVybCkge1xuICAgIGlmICghcmV0dXJuVXJsIHx8ICFpc0FsbG93ZWRSZXR1cm5VcmwocmV0dXJuVXJsKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9hdXRoL3Nzby1oYW5kb2ZmJywge1xuICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgICBjYWNoZTogJ25vLXN0b3JlJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXMub2spIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZGF0YS5zdWNjZXNzICYmIGJ1aWxkU3NvSGFuZG9mZlRhcmdldChyZXR1cm5VcmwsIGRhdGEuc3NvVG9rZW4pO1xuICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBmYWxzZTtcbiAgICAgIHRyeSB7IHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ3RvdHBfcmVkaXJlY3QnKTsgfSBjYXRjaCAoXykge31cbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHRhcmdldCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgaWYgKHVybFBhcmFtcy5nZXQoJ2F1dGgnKSA9PT0gJ3JlcXVpcmVkJykge1xuICAgIC8vIFByZXNlcnZlIHRoZSBnYXRlZCBzZXJ2aWNlIGRlc3RpbmF0aW9uIHNvIHN1Ym1pdFRvdHBDb2RlKCkgY2FuIGFwcGVuZFxuICAgIC8vIHRoZSBvbmUtdGltZSBTU08gaGFuZG9mZiB0b2tlbiBhbmQgcmV0dXJuIHRoZSBicm93c2VyIHRvIHRoYXQgaG9zdC5cbiAgICBjb25zdCByZXR1cm5VcmwgPSB1cmxQYXJhbXMuZ2V0KCdyZXR1cm4nKTtcbiAgICBpZiAocmV0dXJuVXJsICYmIGlzQWxsb3dlZFJldHVyblVybChyZXR1cm5VcmwpKSB7XG4gICAgICB0cnkgeyBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCd0b3RwX3JlZGlyZWN0JywgcmV0dXJuVXJsKTsgfSBjYXRjaCAoXykge31cbiAgICB9XG4gICAgLy8gQ2xlYW4gVVJMIFx1MjAxNCBoYXBwZW5zIGFmdGVyIHdlJ3ZlIGNhcHR1cmVkIHRoZSByZWRpcmVjdFxuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgJycsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgLy8gUmV1c2UgdGhlIHZhbGlkIHN0YXR1cy5zYW1pIHNlc3Npb24gZmlyc3QuIE9ubHkgc2hvdyB0aGUgVE9UUC9wcm92aWRlclxuICAgIC8vIGNoYWxsZW5nZSB3aGVuIHRoYXQgc2Vzc2lvbiBpcyBnZW51aW5lbHkgYWJzZW50IG9yIGV4cGlyZWQuXG4gICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoYXdhaXQgcmVzdW1lRXhpc3RpbmdTZXNzaW9uKHJldHVyblVybCkpIHJldHVybjtcbiAgICAgIGF3YWl0IHNob3coKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIEV4cG9zZSBmb3IgaG90LXRyaWdnZXIgZnJvbSBvdGhlciBtb2R1bGVzIChlLmcuIGxvZ291dClcbiAgd2luZG93Ll9zaG93QXV0aEdhdGUgPSBzaG93O1xuICB3aW5kb3cuX2F1dGhHYXRlTWV0aG9kcyA9IGZldGNoTWV0aG9kcztcbn0pKCk7XG47XG4vLyA9PT09PSBUT1RQIEFVVEhFTlRJQ0FUSU9OIEdBVEUgPT09PT1cbihmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gdXBkYXRlVG90cExvZ28oKSB7XG4gICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWNhcmQnKTtcbiAgICBpZiAoIWNhcmQpIHJldHVybjtcbiAgICBjb25zdCBiZyA9IGdldENvbXB1dGVkU3R5bGUoY2FyZCkuYmFja2dyb3VuZENvbG9yO1xuICAgIGNvbnN0IG0gPSBiZy5tYXRjaCgvXFxkKy9nKTtcbiAgICBpZiAoIW0pIHJldHVybjtcbiAgICBjb25zdCBsdW0gPSAoMC4yOTkgKiArbVswXSArIDAuNTg3ICogK21bMV0gKyAwLjExNCAqICttWzJdKSAvIDI1NTtcbiAgICBjb25zdCBkYXJrID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcudG90cC1sb2dvLWRhcmsnKTtcbiAgICBjb25zdCBsaWdodCA9IGNhcmQucXVlcnlTZWxlY3RvcignLnRvdHAtbG9nby1saWdodCcpO1xuICAgIGlmIChkYXJrKSBkYXJrLnN0eWxlLmRpc3BsYXkgPSBsdW0gPiAwLjUgPyAnbm9uZScgOiAnJztcbiAgICBpZiAobGlnaHQpIGxpZ2h0LnN0eWxlLmRpc3BsYXkgPSBsdW0gPiAwLjUgPyAnJyA6ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dUb3RwT3ZlcmxheSgpIHtcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgIGlmIChvdmVybGF5KSB7XG4gICAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIHNldFRpbWVvdXQodXBkYXRlVG90cExvZ28sIDUwKTtcbiAgICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWRpZ2l0cyBpbnB1dCcpO1xuICAgICAgaWYgKGZpcnN0SW5wdXQpIHNldFRpbWVvdXQoKCkgPT4gZmlyc3RJbnB1dC5mb2N1cygpLCAxMDApO1xuICAgIH1cbiAgICAvLyBSZWZyZXNoIHRoZSBcIkxvc3QgYWNjZXNzP1wiIHJlY292ZXJ5IGxpbmsgdmlzaWJpbGl0eSBiYXNlZCBvbiBzZXJ2ZXIgc3RhdGUuXG4gICAgLy8gSGlkZXMgaXRzZWxmIGlmIFRPVFAgaXMgaGVhbHRoeTsgc2hvd3MgaWYgdW5yZWFkYWJsZS9jb3JydXB0LiBUaGUgdXNlclxuICAgIC8vIGNhbiBzdGlsbCBjbGljayBpdCBldmVuIHdoZW4gaGVhbHRoeSBcdTIwMTQgYnV0IHRoZSBwYW5lbCB3aWxsIGV4cGxhaW4gdGhlcmUnc1xuICAgIC8vIG5vIHJlY292ZXJ5IG5lZWRlZC4gQ2hlYXBlciB0aGFuIGdhdGluZyBpdC5cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5fcmVmcmVzaFJlY292ZXJ5TGluayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd2luZG93Ll9yZWZyZXNoUmVjb3ZlcnlMaW5rKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGlkZVRvdHBPdmVybGF5KCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRTc29IYW5kb2ZmVGFyZ2V0KHJlZGlyZWN0LCB0b2tlbikge1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmVkaXJlY3QsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgIGlmIChwYXJzZWQub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luKSByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCBzdWZmaXggPSBTSVRFLnRsZC5zdGFydHNXaXRoKCcuJykgPyBTSVRFLnRsZCA6IGAuJHtTSVRFLnRsZH1gO1xuICAgIGNvbnN0IGlzUHJpdmF0ZUhvc3QgPSBwYXJzZWQuaG9zdG5hbWUgPT09IHN1ZmZpeC5zbGljZSgxKSB8fCBwYXJzZWQuaG9zdG5hbWUuZW5kc1dpdGgoc3VmZml4KTtcbiAgICBpZiAocGFyc2VkLnByb3RvY29sICE9PSAnaHR0cHM6JyB8fCAhaXNQcml2YXRlSG9zdCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0b2tlbikgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xuXG4gICAgY29uc3QgcmV0dXJuUGF0aCA9IGAke3BhcnNlZC5wYXRobmFtZX0ke3BhcnNlZC5zZWFyY2h9JHtwYXJzZWQuaGFzaH1gO1xuICAgIHBhcnNlZC5wYXRobmFtZSA9ICcvZGFzaGNhZGR5LXNzbyc7XG4gICAgcGFyc2VkLnNlYXJjaCA9ICcnO1xuICAgIHBhcnNlZC5oYXNoID0gJyc7XG4gICAgcGFyc2VkLnNlYXJjaFBhcmFtcy5zZXQoJ3Rva2VuJywgdG9rZW4pO1xuICAgIHBhcnNlZC5zZWFyY2hQYXJhbXMuc2V0KCdyZXR1cm4nLCByZXR1cm5QYXRoKTtcbiAgICByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvLyBTZXR1cCBkaWdpdCBpbnB1dCBVWFxuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kaWdpdHMnKTtcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGlucHV0cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpO1xuICAgIGlucHV0cy5mb3JFYWNoKChpbnB1dCwgaWR4KSA9PiB7XG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGUudGFyZ2V0LnZhbHVlLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgICAgIGUudGFyZ2V0LnZhbHVlID0gdmFsLnNsaWNlKDAsIDEpO1xuICAgICAgICBpZiAodmFsICYmIGlkeCA8IGlucHV0cy5sZW5ndGggLSAxKSBpbnB1dHNbaWR4ICsgMV0uZm9jdXMoKTtcbiAgICAgICAgY29uc3QgY29kZSA9IEFycmF5LmZyb20oaW5wdXRzKS5tYXAoaSA9PiBpLnZhbHVlKS5qb2luKCcnKTtcbiAgICAgICAgaWYgKGNvZGUubGVuZ3RoID09PSA2KSBzdWJtaXRUb3RwQ29kZShjb2RlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgICAgaWYgKGUua2V5ID09PSAnQmFja3NwYWNlJyAmJiAhZS50YXJnZXQudmFsdWUgJiYgaWR4ID4gMCkge1xuICAgICAgICAgIGlucHV0c1tpZHggLSAxXS5mb2N1cygpO1xuICAgICAgICAgIGlucHV0c1tpZHggLSAxXS52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHBhc3RlZCA9IChlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpIHx8ICcnKS5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgICBpZiAocGFzdGVkLmxlbmd0aCA+PSA2KSB7XG4gICAgICAgICAgaW5wdXRzLmZvckVhY2goKGlucCwgaSkgPT4geyBpbnAudmFsdWUgPSBwYXN0ZWRbaV0gfHwgJyc7IH0pO1xuICAgICAgICAgIGlucHV0c1s1XS5mb2N1cygpO1xuICAgICAgICAgIHN1Ym1pdFRvdHBDb2RlKHBhc3RlZC5zbGljZSgwLCA2KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc3VibWl0VG90cENvZGUoY29kZSkge1xuICAgIGNvbnN0IGVycm9yRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1lcnJvcicpO1xuICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnVmVyaWZ5aW5nLi4uJztcbiAgICBlcnJvckVsLmNsYXNzTmFtZSA9ICd0b3RwLWVycm9yIHZlcmlmeWluZyc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdG90cC92ZXJpZnknLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb2RlIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgLy8gVXBkYXRlIGNhY2hlZCBDU1JGIHRva2VuIGZyb20gVE9UUCByZXNwb25zZSAoc2VydmVyIHJvdGF0ZXMgaXQgb24gbG9naW4pXG4gICAgICAgIGlmIChkYXRhLmNzcmZUb2tlbikge1xuICAgICAgICAgIGNzcmZUb2tlbiA9IGRhdGEuY3NyZlRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGhpZGVUb3RwT3ZlcmxheSgpO1xuICAgICAgICAvLyBDaGVjayBpZiByZWRpcmVjdGVkIGhlcmUgZnJvbSBhbm90aGVyIHNlcnZpY2VcbiAgICAgICAgY29uc3QgcmVkaXJlY3QgPSBzYWZlU2Vzc2lvbkdldCgndG90cF9yZWRpcmVjdCcpO1xuICAgICAgICBpZiAocmVkaXJlY3QpIHtcbiAgICAgICAgICB0cnkgeyBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCd0b3RwX3JlZGlyZWN0Jyk7IH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgICAgLy8gLnNhbWkgaXMgYW4gdW5yZWdpc3RlcmVkIFRMRCwgc28gYnJvd3NlcnMgc2lsZW50bHkgZHJvcCB0aGVcbiAgICAgICAgICAvLyBEb21haW49LnNhbWkgc2Vzc2lvbiBjb29raWUgb24gYW55IE9USEVSICouc2FtaSBzdWJkb21haW4gKHRoZXlcbiAgICAgICAgICAvLyB0cmVhdCBcInNhbWlcIiBhcyB0aGUgZWZmZWN0aXZlIHB1YmxpYyBzdWZmaXgsIHNhbWUgcHJvdGVjdGlvblxuICAgICAgICAgIC8vIHRoYXQgYmxvY2tzIGEgRG9tYWluPS5jb20gc3VwZXJjb29raWUpLiBUaGUgdGFyZ2V0IHNlcnZpY2UgY2FuJ3RcbiAgICAgICAgICAvLyBzZWUgb3VyIHNlc3Npb24gY29va2llIG5vIG1hdHRlciBob3cgaXQncyBidWlsdCwgc28gaW5zdGVhZCB3ZVxuICAgICAgICAgIC8vIGhhbmQgaXQgYSBvbmUtdGltZSB0b2tlbiBpbiB0aGUgVVJMOyBpdHMgbG9naW4gcGFnZSBleGNoYW5nZXNcbiAgICAgICAgICAvLyB0aGF0IGZvciBpdHMgb3duIGhvc3Qtb25seSBjb29raWUgdmlhIC9hdXRoL3Nzby1leGNoYW5nZS5cbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBidWlsZFNzb0hhbmRvZmZUYXJnZXQocmVkaXJlY3QsIGRhdGEuc3NvVG9rZW4pO1xuICAgICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0YXJnZXQ7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEluaXRpYWxpemUgZGFzaGJvYXJkXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmluaXRpYWxpemVEYXNoYm9hcmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3aW5kb3cuaW5pdGlhbGl6ZURhc2hib2FyZCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc3VtZSBsaXZlIHVwZGF0ZXMgYWZ0ZXIgbWlkLXNlc3Npb24gcmUtYXV0aC4gVGhlIGF1dGgtbG9zc1xuICAgICAgICAvLyBoYW5kbGVycyBsYXRjaGVkIHBvbGxpbmcgKyBTU0Ugb2ZmIHdoZW4gdGhlIHNlc3Npb24gZXhwaXJlZFxuICAgICAgICAvLyAoZ3JpZC5qcyBzZXRzIF9kY0F1dGhMb3N0LCBsaXZlLWV2ZW50cy5qcyBsYXRjaGVzIHRoZSBzdHJlYW1cbiAgICAgICAgLy8gY2xvc2VkKTsgYSBmcmVzaCBsb2dpbiBtdXN0IGNsZWFyIGJvdGggYW5kIHJlY29ubmVjdCwgb3IgdGhlXG4gICAgICAgIC8vIGRhc2hib2FyZCBzdGF5cyBmcm96ZW4gb24gc3RhbGUgZGF0YSB1bnRpbCBhIG1hbnVhbCBGNS5cbiAgICAgICAgd2luZG93Ll9kY0F1dGhMb3N0ID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93Ll9zc2VSZXN1bWUgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5fc3NlUmVzdW1lKCk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cuX3NzZVJlY29ubmVjdCA9PT0gJ2Z1bmN0aW9uJykgd2luZG93Ll9zc2VSZWNvbm5lY3QoKTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cucmVmcmVzaEFsbCA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LnJlZnJlc2hBbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8ICdJbnZhbGlkIGNvZGUnO1xuICAgICAgICBlcnJvckVsLmNsYXNzTmFtZSA9ICd0b3RwLWVycm9yJztcbiAgICAgICAgY29uc3QgaW5wdXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3RvdHAtZGlnaXRzIGlucHV0Jyk7XG4gICAgICAgIGlucHV0cy5mb3JFYWNoKGkgPT4geyBpLnZhbHVlID0gJyc7IH0pO1xuICAgICAgICBpbnB1dHNbMF0/LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdDb25uZWN0aW9uIGVycm9yJztcbiAgICAgIGVycm9yRWwuY2xhc3NOYW1lID0gJ3RvdHAtZXJyb3InO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSA/YXV0aD1yZXF1aXJlZCByZWRpcmVjdCBmcm9tIENhZGR5IFNTTy5cbiAgLy8gREMtMDQ5OiBpZiB0aGUgYXV0aC1nYXRlIG1vZHVsZSB3aWxsIGhhbmRsZSB0aGlzIChtdWx0aS1wcm92aWRlclxuICAvLyBpbnN0YWxscyksIHNraXAgb3VyIFRPVFAtb25seSBicmFuY2ggZW50aXJlbHkuIFNpbmdsZS1wcm92aWRlclxuICAvLyBUT1RQLW9ubHkgaW5zdGFsbHMgY29udGludWUgdG8gdXNlIHRoaXMgcGF0aCBiZWNhdXNlIGF1dGgtZ2F0ZS5qc1xuICAvLyBkZWxlZ2F0ZXMgYmFjayB0byB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpLlxuICBjb25zdCBfX2RjXzA0OV9za2lwID0gISEod2luZG93Ll9fZGNfMDQ5X2hhbmRsZWQpO1xuICBpZiAoIV9fZGNfMDQ5X3NraXAgJiYgdXJsUGFyYW1zLmdldCgnYXV0aCcpID09PSAncmVxdWlyZWQnKSB7XG4gICAgY29uc3QgcmV0dXJuVXJsID0gdXJsUGFyYW1zLmdldCgncmV0dXJuJyk7XG4gICAgaWYgKHJldHVyblVybCkge1xuICAgICAgLy8gVmFsaWRhdGUgcmVkaXJlY3QgVVJMOiBtdXN0IGJlIHNhbWUtb3JpZ2luIG9yIGhvc3RuYW1lIG11c3QgZW5kIHdpdGggb3VyIFRMRFxuICAgICAgLy8gKHByZXZlbnRzIG9wZW4gcmVkaXJlY3QgdmlhIGluY2x1ZGVzKCkgYnlwYXNzIGxpa2UgZXZpbC5jb20/cT0uc2FtaSlcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmV0dXJuVXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgICAgY29uc3QgaG9zdG5hbWUgPSBwYXJzZWQuaG9zdG5hbWU7XG4gICAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IHBhcnNlZC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgICAgIGNvbnN0IHRsZFN1ZmZpeCA9IFNJVEUudGxkLnN0YXJ0c1dpdGgoJy4nKSA/IFNJVEUudGxkIDogJy4nICsgU0lURS50bGQ7XG4gICAgICAgIGNvbnN0IGlzT3VyVGxkID0gaG9zdG5hbWUuZW5kc1dpdGgodGxkU3VmZml4KSB8fCBob3N0bmFtZSA9PT0gdGxkU3VmZml4LnN1YnN0cmluZygxKTtcbiAgICAgICAgaWYgKGlzU2FtZU9yaWdpbiB8fCBpc091clRsZCkge1xuICAgICAgICAgIHNhZmVTZXNzaW9uU2V0KCd0b3RwX3JlZGlyZWN0JywgcmV0dXJuVXJsKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAvLyBJbnZhbGlkIFVSTCBcdTIwMTQgcmVqZWN0IHJlZGlyZWN0XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENsZWFuIFVSTFxuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgJycsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gIH1cblxuICB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSA9IHNob3dUb3RwT3ZlcmxheTtcbn0pKCk7XG47XG4vLyA9PT09PSBUT1RQIFJFQ09WRVJZIEZMT1cgPT09PT1cbi8vIFB1YmxpYywgdW5hdXRoZW50aWNhdGVkIHJlY292ZXJ5IHBhdGggZm9yIHVzZXJzIHdobyBjYW4ndCBsb2cgaW4uXG4vLyBEZXNpZ25lZCBmb3IgdGhlIFwiZW5jcnlwdGlvbiBrZXkgcm90YXRlZCBhbmQgbG9zdCBteSBhdXRoZW50aWNhdG9yXCIgY2FzZS5cbi8vIFRoZSBmbG93IGlzOlxuLy9cbi8vICAxLiBPbiBUT1RQIG92ZXJsYXkgc2hvdywgY2FsbCAvYXBpL3YxL3RvdHAvcmVjb3ZlcnktaW5mbyAocHVibGljKS5cbi8vICAgICBJZiBzdGF0dXMgPT09ICd1bnJlYWRhYmxlJywgc2hvdyB0aGUgXCJMb3N0IGFjY2Vzcz9cIiBsaW5rIG9uIHRoZSBvdmVybGF5LlxuLy8gIDIuIFVzZXIgY2xpY2tzIGxpbmsgXHUyMTkyIG9wZW5zIHJlY292ZXJ5IHBhbmVsLlxuLy8gIDMuIFVzZXIgcGFzdGVzIEJhc2UzMiBzZWNyZXQgXHUyMTkyIFBPU1QgL2FwaS92MS90b3RwL3NldHVwIHdpdGgge3NlY3JldDogLi4ufS5cbi8vICAgICBCYWNrZW5kIHN0b3JlcyBhcyB0b3RwLnBlbmRpbmdfc2VjcmV0IChlbmNyeXB0ZWQgd2l0aCBjdXJyZW50IGtleSkuXG4vLyAgNC4gUGFuZWwgc3dpdGNoZXMgdG8gXCJ2ZXJpZnlcIiBtb2RlLiBVc2VyIGVudGVycyBhIGNvZGUgZnJvbSB0aGVcbi8vICAgICBuZXdseS1hZGRlZCBhdXRoZW50aWNhdG9yIGVudHJ5LiBQT1NUIC9hcGkvdjEvdG90cC92ZXJpZnktc2V0dXBcbi8vICAgICBwcm9tb3RlcyBwZW5kaW5nIFx1MjE5MiBhY3RpdmUgYW5kIHN0YXJ0cyBhIHNlc3Npb24uXG4vLyAgNS4gaGlkZVRvdHBPdmVybGF5KCkgYW5kIGluaXRpYWxpemVEYXNoYm9hcmQoKSBcdTIwMTQgc2FtZSBhcyBub3JtYWwgbG9naW4uXG4vL1xuLy8gVGhlIHJlY292ZXJ5IGZsb3cgbmV2ZXIgcmVxdWlyZXMgdGhlIHVzZXIgdG8gYmUgbG9nZ2VkIGluLiBJdCBkb2VzIHJlcXVpcmVcbi8vIHRoZW0gdG8gaGF2ZSB0aGVpciBCYXNlMzIgc2VjcmV0IHNhdmVkIChlLmcuIHBhc3N3b3JkIG1hbmFnZXIsIHNjcmVlbnNob3QsXG4vLyB0aGUgXCJEb3dubG9hZCBiYWNrdXAgZmlsZVwiIHdlIG9mZmVyIGF0IHNldHVwIHRpbWUgXHUyMDE0IHNlZSB0b3RwLXNldHRpbmdzLmpzKS5cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIEhlbHBlcnMgXHUyNTAwXHUyNTAwXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoUmVjb3ZlcnlJbmZvKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9yZWNvdmVyeS1pbmZvJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIHJldHVybiBhd2FpdCByLmpzb24oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgc3RhdHVzOiAndW5rbm93bicsIGhpbnQ6ICdDb3VsZCBub3QgY29udGFjdCBzZXJ2ZXInIH07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1JlY292ZXJ5TGluayhzaG93KSB7XG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWxpbmsnKTtcbiAgICBpZiAobGluaykgbGluay5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgZnVuY3Rpb24gb3BlblJlY292ZXJ5UGFuZWwoKSB7XG4gICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1wYW5lbCcpO1xuICAgIGlmIChwYW5lbCkgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc3RhdHVzJyk7XG4gICAgY29uc3QgaW1wb3J0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1pbXBvcnQnKTtcbiAgICBjb25zdCB2ZXJpZnlFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXZlcmlmeScpO1xuICAgIGlmIChpbXBvcnRFbCkgaW1wb3J0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGlmICh2ZXJpZnlFbCkgdmVyaWZ5RWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAvLyBSZXNldCBzdGF0ZVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWVycm9yJykudGV4dENvbnRlbnQgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb25maXJtLWVycm9yJykudGV4dENvbnRlbnQgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1zZWNyZXQnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvZGUnKS52YWx1ZSA9ICcnO1xuICAgIC8vIFNob3cgY3VycmVudCBzdGF0dXNcbiAgICBmZXRjaFJlY292ZXJ5SW5mbygpLnRoZW4oaW5mbyA9PiB7XG4gICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGluZm8uaGludCB8fCAnJztcbiAgICAgIC8vIENvbG9yLWNvZGUgdGhlIHN0YXR1cyBiYW5uZXJcbiAgICAgIGlmIChpbmZvLnN0YXR1cyA9PT0gJ2hlYWx0aHknKSB7XG4gICAgICAgIHN0YXR1c0VsLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLW9rLWZnLCAjN2VmMmZmKSc7XG4gICAgICB9IGVsc2UgaWYgKGluZm8uc3RhdHVzID09PSAndW5yZWFkYWJsZScpIHtcbiAgICAgICAgc3RhdHVzRWwuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tYmFkLWZnLCAjZmY5YWEzKSc7XG4gICAgICAgIHN0YXR1c0VsLnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWJhZC1mZykgNiUsIHRyYW5zcGFyZW50KSc7XG4gICAgICB9IGVsc2UgaWYgKGluZm8uc3RhdHVzID09PSAnbm90X2NvbmZpZ3VyZWQnKSB7XG4gICAgICAgIHN0YXR1c0VsLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXNFbC5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1ib3JkZXIpJztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXNlY3JldCcpPy5mb2N1cygpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVJlY292ZXJ5UGFuZWwoKSB7XG4gICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1wYW5lbCcpO1xuICAgIGlmIChwYW5lbCkgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFJlY292ZXJ5U2VjcmV0KCkge1xuICAgIGNvbnN0IHNlY3JldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXNlY3JldCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktZXJyb3InKTtcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJyc7XG5cbiAgICBpZiAoIXNlY3JldCkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdQYXN0ZSB5b3VyIEJhc2UzMiBrZXkgZmlyc3QnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIS9eW0EtWmEtejItN1xcc10rPSokLy50ZXN0KHNlY3JldCkpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnSW52YWxpZCBCYXNlMzIgZm9ybWF0IFx1MjAxNCBzaG91bGQgYmUgbGV0dGVycyBBLVogYW5kIGRpZ2l0cyAyLTcgb25seSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUE9TVCAvYXBpL3YxL3RvdHAvc2V0dXAgd2l0aCB7c2VjcmV0fSBcdTIwMTQgYmFja2VuZCBzdG9yZXMgYXMgcGVuZGluZ1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9zZXR1cCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlY3JldCB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgci5qc29uKCk7XG4gICAgICBpZiAoIXIub2sgfHwgIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gZGF0YS5lcnJvciB8fCBkYXRhLm1lc3NhZ2UgfHwgJ1Jlc3RvcmUgZmFpbGVkJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU3dpdGNoIHBhbmVsIHRvIHZlcmlmeSBtb2RlXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1pbXBvcnQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktdmVyaWZ5Jykuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJyk/LmZvY3VzKCksIDEwMCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdOZXR3b3JrIGVycm9yIFx1MjAxNCB0cnkgYWdhaW4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdFJlY292ZXJ5Q29kZSgpIHtcbiAgICBjb25zdCBjb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29uZmlybS1lcnJvcicpO1xuICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmICghL15cXGR7Nn0kLy50ZXN0KGNvZGUpKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ0VudGVyIGEgNi1kaWdpdCBjb2RlJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQT1NUIC9hcGkvdjEvdG90cC92ZXJpZnktc2V0dXAgXHUyMDE0IHByb21vdGVzIHBlbmRpbmcgXHUyMTkyIGFjdGl2ZSArIHN0YXJ0cyBzZXNzaW9uXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL3ZlcmlmeS1zZXR1cCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvZGUgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKCFyLm9rIHx8ICFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgZGF0YS5tZXNzYWdlIHx8ICdJbnZhbGlkIGNvZGUnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJykudmFsdWUgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpPy5mb2N1cygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTdWNjZXNzIFx1MjAxNCBoaWRlIGV2ZXJ5dGhpbmcgYW5kIGluaXRpYWxpemUgZGFzaGJvYXJkXG4gICAgICBjbG9zZVJlY292ZXJ5UGFuZWwoKTtcbiAgICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgICBpZiAob3ZlcmxheSkgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5pbml0aWFsaXplRGFzaGJvYXJkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdpbmRvdy5pbml0aWFsaXplRGFzaGJvYXJkKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdOZXR3b3JrIGVycm9yIFx1MjAxNCB0cnkgYWdhaW4nO1xuICAgIH1cbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBXaXJlIHVwIGhhbmRsZXJzIFx1MjUwMFx1MjUwMFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zaG93LXJlY292ZXJ5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgb3BlblJlY292ZXJ5UGFuZWwoKTtcbiAgfSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNsb3NlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VSZWNvdmVyeVBhbmVsKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc3VibWl0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VibWl0UmVjb3ZlcnlTZWNyZXQpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb25maXJtJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VibWl0UmVjb3ZlcnlDb2RlKTtcblxuICAvLyBFbnRlciBrZXkgc3VibWl0cyBpbiBzZWNyZXQgZmllbGRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc2VjcmV0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN1Ym1pdFJlY292ZXJ5U2VjcmV0KCk7IH1cbiAgfSk7XG4gIC8vIEVudGVyIGtleSBzdWJtaXRzIGluIGNvZGUgZmllbGRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpPy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzdWJtaXRSZWNvdmVyeUNvZGUoKTsgfVxuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDAgUHVibGljIEFQSSBcdTI1MDBcdTI1MDBcbiAgLy8gQ2FsbGVkIGJ5IHRvdHAtYXV0aC5qcyBhZnRlciBzaG93aW5nIHRoZSBvdmVybGF5LCBzbyB3ZSBjYW4gZGVjaWRlIHdoZXRoZXJcbiAgLy8gdG8gc2hvdyB0aGUgcmVjb3ZlcnkgbGluay4gV2UgZG8gdGhpcyB3aXRoIGEgcHVibGljIGVuZHBvaW50IHRoYXQgZG9lc24ndFxuICAvLyByZXF1aXJlIGF1dGggXHUyMDE0IHBlcmZlY3QgZm9yIHRoZSBsb2NrZWQtb3V0IHN0YXRlLlxuICB3aW5kb3cuX3JlZnJlc2hSZWNvdmVyeUxpbmsgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgZmV0Y2hSZWNvdmVyeUluZm8oKTtcbiAgICAvLyBTaG93IHRoZSBsaW5rIGluIGFueSBub24taGVhbHRoeSBzdGF0ZSAodW5yZWFkYWJsZSAvIGNvcnJ1cHQgLyB1bmtub3duKS5cbiAgICAvLyBUaGUgaGludCBpbnNpZGUgdGhlIHBhbmVsIHRlbGxzIHRoZSB1c2VyIHdoYXQgdGhlIGFjdHVhbCBpc3N1ZSBpcy5cbiAgICBpZiAoaW5mbyAmJiBpbmZvLnN1Y2Nlc3MgJiYgaW5mby5zdGF0dXMgJiYgaW5mby5zdGF0dXMgIT09ICdoZWFsdGh5Jykge1xuICAgICAgc2hvd1JlY292ZXJ5TGluayh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd1JlY292ZXJ5TGluayhmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9O1xufSkoKTtcbjtcbi8vID09PT09IFNFUlZJQ0UgQ1JFREVOVElBTFMgPT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuICBpbmplY3RNb2RhbCgnZm9sZGVyLWJyb3dzZXItbW9kYWwnLCBgPGRpdiBpZD1cImZvbGRlci1icm93c2VyLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA1MDBweDsgbWF4LXdpZHRoOiA3MDBweDsgbWF4LWhlaWdodDogODB2aDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQzIgQnJvd3NlIGZvciBNZWRpYSBGb2xkZXJzPC9oMz5cblxuICAgICAgPGRpdiBpZD1cImZvbGRlci1icm93c2VyLXBhdGhcIiBzdHlsZT1cInBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiA2cHg7IG1hcmdpbi1ib3R0b206IDEycHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC45cmVtOyB3b3JkLWJyZWFrOiBicmVhay1hbGw7XCI+XG4gICAgICAgIC9cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwiZm9sZGVyLWJyb3dzZXItbGlzdFwiIHN0eWxlPVwibWF4LWhlaWdodDogNDAwcHg7IG92ZXJmbG93LXk6IGF1dG87IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Mb2FkaW5nLi4uPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImZvbGRlci1icm93c2VyLXNlbGVjdGVkXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMTAlLCB0cmFuc3BhcmVudCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXN1Y2Nlc3MpOyBib3JkZXItcmFkaXVzOiA2cHg7IGRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPlNlbGVjdGVkIGZvbGRlcnM6PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJmb2xkZXItYnJvd3Nlci1zZWxlY3RlZC1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNnB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJmb2xkZXItYnJvd3Nlci1zZWxlY3QtY3VycmVudFwiIGNsYXNzPVwiYnRuLWFjY2VudFwiPlxuICAgICAgICAgICsgQWRkIEN1cnJlbnQgRm9sZGVyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3ctZ2FwXCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImZvbGRlci1icm93c2VyLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJmb2xkZXItYnJvd3Nlci1kb25lXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMjAlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1jb2xvcjogdmFyKC0tc3VjY2Vzcyk7IGNvbG9yOiB2YXIoLS1zdWNjZXNzKTtcIj5Eb25lPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGluamVjdE1vZGFsKCdzZXJ2aWNlLWNyZWRzLW1vZGFsJywgYDxkaXYgaWQ9XCJzZXJ2aWNlLWNyZWRzLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY3JlZHMtY29udGVudFwiPlxuICAgICAgPGgzIGlkPVwic3ZjLWNyZWRzLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46IDAgMCA0cHg7IGZvbnQtc2l6ZTogMS4wNXJlbTtcIj5TZXJ2aWNlIENyZWRlbnRpYWxzPC9oMz5cbiAgICAgIDxwIGlkPVwic3ZjLWNyZWRzLWRlc2NcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTRweDtcIj5DcmVkZW50aWFscyBhcmUgaW5qZWN0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFjY2Vzc2luZyB0aGlzIHNlcnZpY2UuPC9wPlxuXG4gICAgICA8IS0tIFN0YXR1cyBpbmRpY2F0b3IgLS0+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwic3ZjLWNyZWRzLWRvdFwiIGNsYXNzPVwic3RhdHVzLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gaWQ9XCJzdmMtY3JlZHMtc3RhdHVzXCIgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+Tm8gY3JlZGVudGlhbHMgc3RvcmVkPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2VlZGhvc3QgY3JlZGVudGlhbHMgKHNob3duIGZvciBleHRlcm5hbCBzZXJ2aWNlcykgLS0+XG4gICAgICA8ZGl2IGlkPVwic3ZjLWNyZWRzLXNlZWRob3N0XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1ib2xkXCI+U2VlZGhvc3QgTG9naW48L2xhYmVsPlxuICAgICAgICA8cCBjbGFzcz1cImhpbnQtbWljcm9cIj5Vc2VybmFtZSBzaGFyZWQgYWNyb3NzIGFsbCBzZXJ2aWNlcy4gUGFzc3dvcmQgaXMgcGVyLXNlcnZpY2UuPC9wPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInN2Yy1zZWVkaG9zdC11c2VyXCIgcGxhY2Vob2xkZXI9XCJVc2VybmFtZSAoc2hhcmVkKVwiIGF1dG9jb21wbGV0ZT1cInVzZXJuYW1lXCJcbiAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMHB4OyBtYXJnaW4tYm90dG9tOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCIgLz5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwic3ZjLXNlZWRob3N0LXBhc3NcIiBwbGFjZWhvbGRlcj1cIlBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwiY3VycmVudC1wYXNzd29yZFwiXG4gICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWNyZWRzXCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEFQSSBLZXkgKHNob3duIGZvciBhcnIgc2VydmljZXMgb3Igc2VydmljZXMgd2l0aCBBUEkga2V5IHN1cHBvcnQpIC0tPlxuICAgICAgPGRpdiBpZD1cInN2Yy1jcmVkcy1hcGlrZXlcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE0cHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLWJvbGRcIj5BUEkgS2V5PC9sYWJlbD5cbiAgICAgICAgPHAgY2xhc3M9XCJoaW50LW1pY3JvXCI+QnlwYXNzZXMgdGhlIGFwcCdzIG93biBsb2dpbiBzY3JlZW48L3A+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3ZjLWFwaWtleS1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiQVBJIGtleVwiXG4gICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIiAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUXVhbGl0eSBQcm9maWxlIChzaG93biBmb3IgcmFkYXJyL3NvbmFyciBvbmx5KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdmMtY3JlZHMtcXVhbGl0eVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTRweDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtYm9sZFwiPlF1YWxpdHkgUHJvZmlsZTwvbGFiZWw+XG4gICAgICAgIDxwIGNsYXNzPVwiaGludC1taWNyb1wiPlVzZWQgd2hlbiByZXF1ZXN0aW5nIHZpYSBTZWVycjwvcD5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzdmMtcXVhbGl0eS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBFbnRlciBBUEkga2V5IGZpcnN0IC0tPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInN2Yy1xdWFsaXR5LWZldGNoXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBmb250LXNpemU6IDAuNzVyZW07IGN1cnNvcjogcG9pbnRlcjsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbiAgICAgICAgICAgIEZldGNoXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic3ZjLXF1YWxpdHktc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IG1hcmdpbi10b3A6IDRweDsgbWluLWhlaWdodDogMWVtO1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUGVyLXNlcnZpY2UgQmFzaWMgQXV0aCAoc2hvd24gZm9yIG5vbi1leHRlcm5hbCBzZXJ2aWNlcykgLS0+XG4gICAgICA8ZGl2IGlkPVwic3ZjLWNyZWRzLWJhc2ljXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1ib2xkXCI+U2VydmljZSBMb2dpbjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3ZjLWJhc2ljLXVzZXJcIiBwbGFjZWhvbGRlcj1cIlVzZXJuYW1lXCIgYXV0b2NvbXBsZXRlPVwidXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEwcHg7IG1hcmdpbi10b3A6IDZweDsgbWFyZ2luLWJvdHRvbTogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiIC8+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cInN2Yy1iYXNpYy1wYXNzXCIgcGxhY2Vob2xkZXI9XCJQYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cImN1cnJlbnQtcGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1jcmVkc1wiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBFcnJvciBtZXNzYWdlIC0tPlxuICAgICAgPGRpdiBpZD1cInN2Yy1jcmVkcy1lcnJvclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogOHB4IDEwcHg7IG1hcmdpbi1ib3R0b206IDEwcHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1lcnJvciwgI2M2MjgyOCkgMTIlLCB0cmFuc3BhcmVudCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWVycm9yLCAjYzYyODI4KTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj48L2Rpdj5cblxuICAgICAgPCEtLSBCdXR0b25zIC0tPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBtYXJnaW4tdG9wOiAxNHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwic3ZjLWNyZWRzLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDlweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgIFNhdmVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzdmMtY3JlZHMtY2xlYXJcIiBzdHlsZT1cInBhZGRpbmc6IDlweCAxNHB4OyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuODVyZW07IGRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgQ2xlYXJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzdmMtY3JlZHMtY2xvc2VcIiBzdHlsZT1cInBhZGRpbmc6IDlweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWNyZWRzLW1vZGFsJyk7XG4gIGxldCBjdXJyZW50U2VydmljZSA9IG51bGw7XG4gIGNvbnN0IGFyclNlcnZpY2VzID0gWydzb25hcnInLCAncmFkYXJyJywgJ3Byb3dsYXJyJywgJ292ZXJzZWVyciddO1xuICBjb25zdCBxdWFsaXR5UHJvZmlsZVNlcnZpY2VzID0gWydzb25hcnInLCAncmFkYXJyJ107XG5cbiAgZnVuY3Rpb24gZ2V0U2VydmljZVVybChzZXJ2aWNlKSB7XG4gICAgcmV0dXJuIHNlcnZpY2UuZXh0ZXJuYWxVcmwgfHwgc2VydmljZS51cmwgfHwgJyc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93RXJyb3IobXNnKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWVycm9yJyk7XG4gICAgZWwudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlkZUVycm9yKCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1lcnJvcicpO1xuICAgIGVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIHdpbmRvdy5vcGVuU2VydmljZUNyZWRzTW9kYWwgPSBhc3luYyBmdW5jdGlvbihzZXJ2aWNlKSB7XG4gICAgY3VycmVudFNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIGhpZGVFcnJvcigpO1xuICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy10aXRsZScpO1xuICAgIGNvbnN0IGRlc2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWRlc2MnKTtcbiAgICBjb25zdCBzZWVkaG9zdFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXNlZWRob3N0Jyk7XG4gICAgY29uc3QgYXBpa2V5U2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtYXBpa2V5Jyk7XG4gICAgY29uc3QgYmFzaWNTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1iYXNpYycpO1xuICAgIGNvbnN0IHF1YWxpdHlTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1xdWFsaXR5Jyk7XG5cbiAgICB0aXRsZS50ZXh0Q29udGVudCA9IHNlcnZpY2UubmFtZSArICcgQ3JlZGVudGlhbHMnO1xuICAgIC8vIERldGVybWluZSB3aGljaCBzZWN0aW9ucyB0byBzaG93XG4gICAgY29uc3QgaXNFeHQgPSAhIXNlcnZpY2UuaXNFeHRlcm5hbDtcbiAgICBjb25zdCBpc0FyciA9IGFyclNlcnZpY2VzLmluY2x1ZGVzKHNlcnZpY2UuaWQpIHx8IGFyclNlcnZpY2VzLmluY2x1ZGVzKHNlcnZpY2UuYXBwVGVtcGxhdGUpO1xuICAgIGNvbnN0IGhhc1F1YWxpdHkgPSBxdWFsaXR5UHJvZmlsZVNlcnZpY2VzLmluY2x1ZGVzKHNlcnZpY2UuaWQpIHx8IHF1YWxpdHlQcm9maWxlU2VydmljZXMuaW5jbHVkZXMoc2VydmljZS5hcHBUZW1wbGF0ZSk7XG5cbiAgICBzZWVkaG9zdFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9IGlzRXh0ID8gJycgOiAnbm9uZSc7XG4gICAgYXBpa2V5U2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gaXNBcnIgPyAnJyA6ICdub25lJztcbiAgICBxdWFsaXR5U2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gaGFzUXVhbGl0eSA/ICcnIDogJ25vbmUnO1xuICAgIGJhc2ljU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gIWlzRXh0ID8gJycgOiAnbm9uZSc7XG5cbiAgICAvLyBSZXNldCBxdWFsaXR5IGRyb3Bkb3duXG4gICAgY29uc3QgcXVhbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zZWxlY3QnKTtcbiAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gRW50ZXIgQVBJIGtleSBmaXJzdCAtLTwvb3B0aW9uPic7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXN0YXR1cycpLnRleHRDb250ZW50ID0gJyc7XG5cbiAgICBpZiAoaXNFeHQpIHtcbiAgICAgIGRlc2MudGV4dENvbnRlbnQgPSAnU2VlZGhvc3QgY3JlZGVudGlhbHMgYXV0by1sb2dpbiBwYXN0IHRoZSBIVFRQIHByb21wdC4gQVBJIGtleSBieXBhc3NlcyB0aGUgYXBwIGxvZ2luLic7XG4gICAgICAvLyBVcGRhdGUgcGFzc3dvcmQgcGxhY2Vob2xkZXIgd2l0aCBzZXJ2aWNlIG5hbWVcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtcGFzcycpLnBsYWNlaG9sZGVyID0gYFBhc3N3b3JkIGZvciAke3NlcnZpY2UubmFtZX1gO1xuICAgIH0gZWxzZSBpZiAoaXNBcnIpIHtcbiAgICAgIGRlc2MudGV4dENvbnRlbnQgPSAnQVBJIGtleSBieXBhc3NlcyB0aGUgYXBwIGxvZ2luIHNjcmVlbiBhdXRvbWF0aWNhbGx5Lic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc2MudGV4dENvbnRlbnQgPSAnQ3JlZGVudGlhbHMgYXJlIGluamVjdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhY2Nlc3NpbmcgdGhpcyBzZXJ2aWNlLic7XG4gICAgfVxuXG4gICAgLy8gTG9hZCBleGlzdGluZyBjcmVkZW50aWFsc1xuICAgIGF3YWl0IGxvYWRTZXJ2aWNlQ3JlZHMoc2VydmljZSk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRTZXJ2aWNlQ3JlZHMoc2VydmljZSkge1xuICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtZG90Jyk7XG4gICAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1zdGF0dXMnKTtcbiAgICBjb25zdCBjbGVhckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtY2xlYXInKTtcbiAgICBsZXQgaGFzQ3JlZHMgPSBmYWxzZTtcblxuICAgIC8vIExvYWQgc2VlZGhvc3QgY3JlZHMgKHNoYXJlZCB1c2VybmFtZSArIHBlci1zZXJ2aWNlIHBhc3N3b3JkKVxuICAgIGlmIChzZXJ2aWNlLmlzRXh0ZXJuYWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL3NlZWRob3N0LWNyZWRzP3NlcnZpY2VJZD0ke3NlcnZpY2UuaWR9YCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC11c2VyJykudmFsdWUgPSBkYXRhLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgICAgIGlmIChkYXRhLmhhc0NyZWRlbnRpYWxzKSBoYXNDcmVkcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC11c2VyJykudmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC1wYXNzJykudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICAvLyBMb2FkIHBlci1zZXJ2aWNlIGNyZWRzXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7c2VydmljZS5pZH0vY3JlZGVudGlhbHNgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBpZiAoZGF0YS5oYXNBcGlLZXkpIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWFwaWtleS1pbnB1dCcpLnZhbHVlID0gJ1x1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMic7XG4gICAgICAgICAgaGFzQ3JlZHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYXBpa2V5LWlucHV0JykudmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5oYXNCYXNpY0F1dGggJiYgIXNlcnZpY2UuaXNFeHRlcm5hbCkge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtdXNlcicpLnZhbHVlID0gZGF0YS51c2VybmFtZSB8fCAnJztcbiAgICAgICAgICBoYXNDcmVkcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1iYXNpYy11c2VyJykudmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1iYXNpYy1wYXNzJykpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtcGFzcycpLnZhbHVlID0gJyc7XG5cbiAgICAvLyBMb2FkIHF1YWxpdHkgcHJvZmlsZSBmb3IgYXJyIHNlcnZpY2VzXG4gICAgY29uc3Qgc3ZjSWQgPSBzZXJ2aWNlLmlkIHx8IHNlcnZpY2UuYXBwVGVtcGxhdGU7XG4gICAgaWYgKHF1YWxpdHlQcm9maWxlU2VydmljZXMuaW5jbHVkZXMoc3ZjSWQpKSB7XG4gICAgICBhd2FpdCBsb2FkUXVhbGl0eVByb2ZpbGVzKHNlcnZpY2UpO1xuICAgIH1cblxuICAgIGlmIChoYXNDcmVkcykge1xuICAgICAgZG90LnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tb2stZmcsICM3NGRmYzQpJztcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZywgIzc0ZGZjNCknO1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ0NyZWRlbnRpYWxzIHN0b3JlZCc7XG4gICAgICBjbGVhckJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAvLyBVcGRhdGUgdGhlIGNhcmQgYnV0dG9uXG4gICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgY3JlZHMtYnRuLSR7c2VydmljZS5pZH1gKTtcbiAgICAgIGlmIChidG4pIGJ0bi5jbGFzc0xpc3QuYWRkKCdoYXMtY3JlZHMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG90LnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tbXV0ZWQpJztcbiAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ05vIGNyZWRlbnRpYWxzIHN0b3JlZCc7XG4gICAgICBjbGVhckJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZldGNoIGFuZCBwb3B1bGF0ZSBxdWFsaXR5IHByb2ZpbGVzIGRyb3Bkb3duXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRRdWFsaXR5UHJvZmlsZXMoc2VydmljZSkge1xuICAgIGNvbnN0IHF1YWxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc2VsZWN0Jyk7XG4gICAgY29uc3QgcXVhbFN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zdGF0dXMnKTtcbiAgICBjb25zdCBzdmNJZCA9IHNlcnZpY2UuaWQgfHwgc2VydmljZS5hcHBUZW1wbGF0ZTtcbiAgICBjb25zdCBzdmNVcmwgPSBnZXRTZXJ2aWNlVXJsKHNlcnZpY2UpO1xuXG4gICAgaWYgKCFzdmNVcmwpIHtcbiAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBObyBzZXJ2aWNlIFVSTCAtLTwvb3B0aW9uPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPkxvYWRpbmcuLi48L29wdGlvbj4nO1xuICAgIHF1YWxTdGF0dXMudGV4dENvbnRlbnQgPSAnJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgc2VydmljZTogc3ZjSWQsIHVybDogc3ZjVXJsIH0pO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvYXJyL3F1YWxpdHktcHJvZmlsZXM/JHtwYXJhbXN9YCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEucHJvZmlsZXM/Lmxlbmd0aCkge1xuICAgICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gTm8gcHJvZmlsZXMgZm91bmQgKGVudGVyIEFQSSBrZXkgYW5kIGNsaWNrIEZldGNoKSAtLTwvb3B0aW9uPic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnJztcbiAgICAgIGZvciAoY29uc3QgcCBvZiBkYXRhLnByb2ZpbGVzKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQudmFsdWUgPSBwLmlkO1xuICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBwLm5hbWU7XG4gICAgICAgIHF1YWxTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJlLXNlbGVjdCBzdG9yZWQgcHJvZmlsZSBvciBiZXN0IG1hdGNoIGZvciBcIjcyMFwiXG4gICAgICBpZiAoZGF0YS5zdG9yZWRQcm9maWxlSWQpIHtcbiAgICAgICAgcXVhbFNlbGVjdC52YWx1ZSA9IFN0cmluZyhkYXRhLnN0b3JlZFByb2ZpbGVJZCk7XG4gICAgICB9XG4gICAgICBpZiAoIXF1YWxTZWxlY3QudmFsdWUpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSA3MjBwLWlzaCBwcm9maWxlXG4gICAgICAgIGNvbnN0IG1hdGNoNzIwID0gZGF0YS5wcm9maWxlcy5maW5kKHAgPT4gLzcyMC9pLnRlc3QocC5uYW1lKSk7XG4gICAgICAgIGlmIChtYXRjaDcyMCkgcXVhbFNlbGVjdC52YWx1ZSA9IFN0cmluZyhtYXRjaDcyMC5pZCk7XG4gICAgICB9XG4gICAgICBpZiAoIXF1YWxTZWxlY3QudmFsdWUgJiYgZGF0YS5wcm9maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgcXVhbFNlbGVjdC52YWx1ZSA9IFN0cmluZyhkYXRhLnByb2ZpbGVzWzBdLmlkKTtcbiAgICAgIH1cblxuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiR7ZGF0YS5wcm9maWxlcy5sZW5ndGh9IHByb2ZpbGVzIGxvYWRlZDwvc3Bhbj5gO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBGYWlsZWQgdG8gbG9hZCAtLTwvb3B0aW9uPic7XG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1lcnJvciwgI2M2MjgyOCk7XCI+RXJyb3I6ICR7ZS5tZXNzYWdlfTwvc3Bhbj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZldGNoIGJ1dHRvbiBmb3IgcXVhbGl0eSBwcm9maWxlc1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktZmV0Y2gnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjdXJyZW50U2VydmljZSkgcmV0dXJuO1xuICAgIGNvbnN0IHN2Y0lkID0gY3VycmVudFNlcnZpY2UuaWQgfHwgY3VycmVudFNlcnZpY2UuYXBwVGVtcGxhdGU7XG4gICAgY29uc3Qgc3ZjVXJsID0gZ2V0U2VydmljZVVybChjdXJyZW50U2VydmljZSk7XG4gICAgY29uc3QgYXBpS2V5SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWFwaWtleS1pbnB1dCcpO1xuICAgIGNvbnN0IGFwaUtleSA9IGFwaUtleUlucHV0Py52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgcXVhbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zZWxlY3QnKTtcbiAgICBjb25zdCBxdWFsU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXN0YXR1cycpO1xuXG4gICAgaWYgKCFzdmNVcmwpIHtcbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj5ObyBzZXJ2aWNlIFVSTCBhdmFpbGFibGU8L3NwYW4+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFhcGlLZXkgfHwgYXBpS2V5ID09PSAnXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyJykge1xuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPkVudGVyIGFuIEFQSSBrZXkgZmlyc3Q8L3NwYW4+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+RmV0Y2hpbmcuLi48L29wdGlvbj4nO1xuICAgIHF1YWxTdGF0dXMudGV4dENvbnRlbnQgPSAnJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgc2VydmljZTogc3ZjSWQsIHVybDogc3ZjVXJsLCBhcGlLZXkgfSk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcnIvcXVhbGl0eS1wcm9maWxlcz8ke3BhcmFtc31gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gRXJyb3IgLS08L29wdGlvbj4nO1xuICAgICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1lcnJvciwgI2M2MjgyOCk7XCI+JHtkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gZmV0Y2ggcHJvZmlsZXMnfTwvc3Bhbj5gO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghZGF0YS5wcm9maWxlcz8ubGVuZ3RoKSB7XG4gICAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBObyBwcm9maWxlcyBmb3VuZCAtLTwvb3B0aW9uPic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnJztcbiAgICAgIGZvciAoY29uc3QgcCBvZiBkYXRhLnByb2ZpbGVzKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQudmFsdWUgPSBwLmlkO1xuICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBwLm5hbWU7XG4gICAgICAgIHF1YWxTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJlLXNlbGVjdCA3MjBwIG1hdGNoXG4gICAgICBjb25zdCBtYXRjaDcyMCA9IGRhdGEucHJvZmlsZXMuZmluZChwID0+IC83MjAvaS50ZXN0KHAubmFtZSkpO1xuICAgICAgaWYgKG1hdGNoNzIwKSBxdWFsU2VsZWN0LnZhbHVlID0gU3RyaW5nKG1hdGNoNzIwLmlkKTtcbiAgICAgIGVsc2UgaWYgKGRhdGEucHJvZmlsZXMubGVuZ3RoKSBxdWFsU2VsZWN0LnZhbHVlID0gU3RyaW5nKGRhdGEucHJvZmlsZXNbMF0uaWQpO1xuXG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1vay1mZyk7XCI+JHtkYXRhLnByb2ZpbGVzLmxlbmd0aH0gcHJvZmlsZXMgbG9hZGVkPC9zcGFuPmA7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIEVycm9yIC0tPC9vcHRpb24+JztcbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj4ke2UubWVzc2FnZX08L3NwYW4+YDtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFNhdmUgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWN1cnJlbnRTZXJ2aWNlKSByZXR1cm47XG4gICAgY29uc3Qgc2F2ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtc2F2ZScpO1xuICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2aW5nLi4uJztcbiAgICBzYXZlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBoaWRlRXJyb3IoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpc0FyciA9IGFyclNlcnZpY2VzLmluY2x1ZGVzKGN1cnJlbnRTZXJ2aWNlLmlkKSB8fCBhcnJTZXJ2aWNlcy5pbmNsdWRlcyhjdXJyZW50U2VydmljZS5hcHBUZW1wbGF0ZSk7XG4gICAgICBjb25zdCBzdmNJZCA9IGN1cnJlbnRTZXJ2aWNlLmlkIHx8IGN1cnJlbnRTZXJ2aWNlLmFwcFRlbXBsYXRlO1xuXG4gICAgICAvLyBTYXZlIHNlZWRob3N0IGNyZWRzIChzaGFyZWQgdXNlcm5hbWUgKyBwZXItc2VydmljZSBwYXNzd29yZClcbiAgICAgIGlmIChjdXJyZW50U2VydmljZS5pc0V4dGVybmFsKSB7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXVzZXInKS52YWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnN0IHBhc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXBhc3MnKS52YWx1ZTtcbiAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zZWVkaG9zdC1jcmVkcycsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVzZXJuYW1lOiB1c2VyLCBwYXNzd29yZDogcGFzcyB8fCB1bmRlZmluZWQsIHNlcnZpY2VJZDogY3VycmVudFNlcnZpY2UuaWQgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTYXZlIEFQSSBrZXkgXHUyMDE0IGZvciBhcnIgc2VydmljZXMsIHVzZSB0aGUgYXJyIGNyZWRlbnRpYWxzIGVuZHBvaW50IChjb3JyZWN0IG5hbWVzcGFjZSlcbiAgICAgIGNvbnN0IGFwaUtleUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1hcGlrZXktaW5wdXQnKTtcbiAgICAgIGNvbnN0IGFwaUtleSA9IGFwaUtleUlucHV0Py52YWx1ZS50cmltKCk7XG4gICAgICBpZiAoYXBpS2V5ICYmIGFwaUtleSAhPT0gJ1x1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMicpIHtcbiAgICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgICAgLy8gVXNlIGFyciBjcmVkZW50aWFscyBlbmRwb2ludCBcdTIwMTQgdmFsaWRhdGVzIGtleSwgdGVzdHMgY29ubmVjdGlvbiwgc3RvcmVzIGluIGFyci4qIG5hbWVzcGFjZVxuICAgICAgICAgIGNvbnN0IHN2Y1VybCA9IGdldFNlcnZpY2VVcmwoY3VycmVudFNlcnZpY2UpO1xuICAgICAgICAgIGNvbnN0IHF1YWxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc2VsZWN0Jyk7XG4gICAgICAgICAgY29uc3QgcXVhbGl0eVByb2ZpbGVJZCA9IHF1YWxTZWxlY3Q/LnZhbHVlID8gcGFyc2VJbnQocXVhbFNlbGVjdC52YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgcXVhbGl0eVByb2ZpbGVOYW1lID0gcXVhbFNlbGVjdD8uc2VsZWN0ZWRPcHRpb25zPy5bMF0/LnRleHRDb250ZW50IHx8IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Fyci9jcmVkZW50aWFscycsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHNlcnZpY2U6IHN2Y0lkLFxuICAgICAgICAgICAgICBhcGlLZXksXG4gICAgICAgICAgICAgIHVybDogc3ZjVXJsIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcXVhbGl0eVByb2ZpbGVJZDogcXVhbGl0eVByb2ZpbGVJZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHF1YWxpdHlQcm9maWxlTmFtZTogcXVhbGl0eVByb2ZpbGVOYW1lIHx8IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgc2hvd0Vycm9yKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIEFQSSBrZXknKTtcbiAgICAgICAgICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2ZSc7XG4gICAgICAgICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhLmNvbm5lY3Rpb25UZXN0ICYmICFkYXRhLmNvbm5lY3Rpb25UZXN0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHNob3dFcnJvcihgQVBJIGtleSBzYXZlZCBidXQgY29ubmVjdGlvbiB0ZXN0IGZhaWxlZDogJHtkYXRhLmNvbm5lY3Rpb25UZXN0LmVycm9yfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOb24tYXJyIHNlcnZpY2VzIHVzZSB0aGUgZ2VuZXJpYyBlbmRwb2ludFxuICAgICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7Y3VycmVudFNlcnZpY2UuaWR9L2NyZWRlbnRpYWxzYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYXBpS2V5IH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNBcnIgJiYgcXVhbGl0eVByb2ZpbGVTZXJ2aWNlcy5pbmNsdWRlcyhzdmNJZCkpIHtcbiAgICAgICAgLy8gQVBJIGtleSB1bmNoYW5nZWQgYnV0IHVzZXIgbWF5IGhhdmUgY2hhbmdlZCBxdWFsaXR5IHByb2ZpbGUgXHUyMDE0IHNhdmUgcHJvZmlsZSBvbmx5XG4gICAgICAgIGNvbnN0IHF1YWxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc2VsZWN0Jyk7XG4gICAgICAgIGNvbnN0IHF1YWxpdHlQcm9maWxlSWQgPSBxdWFsU2VsZWN0Py52YWx1ZSA/IHBhcnNlSW50KHF1YWxTZWxlY3QudmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBxdWFsaXR5UHJvZmlsZU5hbWUgPSBxdWFsU2VsZWN0Py5zZWxlY3RlZE9wdGlvbnM/LlswXT8udGV4dENvbnRlbnQgfHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAocXVhbGl0eVByb2ZpbGVJZCkge1xuICAgICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Fyci9xdWFsaXR5LXByb2ZpbGVzJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmljZTogc3ZjSWQsIHF1YWxpdHlQcm9maWxlSWQsIHF1YWxpdHlQcm9maWxlTmFtZSB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmUgcGVyLXNlcnZpY2UgYmFzaWMgYXV0aFxuICAgICAgaWYgKCFjdXJyZW50U2VydmljZS5pc0V4dGVybmFsKSB7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXVzZXInKS52YWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnN0IHBhc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXBhc3MnKS52YWx1ZTtcbiAgICAgICAgaWYgKHVzZXIgJiYgcGFzcykge1xuICAgICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7Y3VycmVudFNlcnZpY2UuaWR9L2NyZWRlbnRpYWxzYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdXNlcm5hbWU6IHVzZXIsIHBhc3N3b3JkOiBwYXNzIH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgbG9hZFNlcnZpY2VDcmVkcyhjdXJyZW50U2VydmljZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbU2VydmljZUNyZWRlbnRpYWxzXSBTYXZlJywgZSwgeyBmdW5jdGlvbjogJ3NhdmVDcmVkZW50aWFscycgfSk7XG4gICAgICBzaG93RXJyb3IoJ0ZhaWxlZCB0byBzYXZlOiAnICsgKGUubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcicpKTtcbiAgICB9XG4gICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZlJztcbiAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gIH0pO1xuXG4gIC8vIENsZWFyIGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWNsZWFyJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY3VycmVudFNlcnZpY2UpIHJldHVybjtcbiAgICBpZiAoIWNvbmZpcm0oYFJlbW92ZSBzdG9yZWQgY3JlZGVudGlhbHMgZm9yICR7Y3VycmVudFNlcnZpY2UubmFtZX0/YCkpIHJldHVybjtcbiAgICBoaWRlRXJyb3IoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3ZjSWQgPSBjdXJyZW50U2VydmljZS5pZCB8fCBjdXJyZW50U2VydmljZS5hcHBUZW1wbGF0ZTtcbiAgICAgIGNvbnN0IGlzQXJyID0gYXJyU2VydmljZXMuaW5jbHVkZXMoc3ZjSWQpO1xuICAgICAgaWYgKGN1cnJlbnRTZXJ2aWNlLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvc2VlZGhvc3QtY3JlZHM/c2VydmljZUlkPSR7Y3VycmVudFNlcnZpY2UuaWR9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgfVxuICAgICAgLy8gRGVsZXRlIGZyb20gYm90aCBuYW1lc3BhY2VzXG4gICAgICBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9zZXJ2aWNlcy8ke2N1cnJlbnRTZXJ2aWNlLmlkfS9jcmVkZW50aWFsc2AsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIGlmIChpc0Fycikge1xuICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9hcnIvY3JlZGVudGlhbHMvJHtzdmNJZH1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgY3JlZHMtYnRuLSR7Y3VycmVudFNlcnZpY2UuaWR9YCk7XG4gICAgICBpZiAoYnRuKSBidG4uY2xhc3NMaXN0LnJlbW92ZSgnaGFzLWNyZWRzJyk7XG4gICAgICBhd2FpdCBsb2FkU2VydmljZUNyZWRzKGN1cnJlbnRTZXJ2aWNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tTZXJ2aWNlQ3JlZGVudGlhbHNdIENsZWFyJywgZSwgeyBmdW5jdGlvbjogJ2NsZWFyQ3JlZGVudGlhbHMnIH0pO1xuICAgICAgc2hvd0Vycm9yKCdGYWlsZWQgdG8gY2xlYXI6ICcgKyAoZS5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJykpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ2xvc2UgYnV0dG9uIC8gYmFja2Ryb3BcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1jbG9zZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgY3VycmVudFNlcnZpY2UgPSBudWxsO1xuICB9KTtcbiAgbW9kYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICBjdXJyZW50U2VydmljZSA9IG51bGw7XG4gICAgfVxuICB9KTtcblxuICAvLyBDaGVjayBjcmVkZW50aWFsIHN0YXR1cyBmb3IgYWxsIHNlcnZpY2VzIG9uIHBhZ2UgbG9hZCAodXBkYXRlIGtleSBidXR0b24gaGlnaGxpZ2h0cylcbiAgd2luZG93LnJlZnJlc2hDcmVkc0J1dHRvbnMgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBhcHAgb2YgKHdpbmRvdy5BUFBTIHx8IFtdKSkge1xuICAgICAgICBpZiAoIWFwcC5pc0V4dGVybmFsICYmICFhcHAuYXBwVGVtcGxhdGUgJiYgIWFwcC51cmwpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgaGFzQ3JlZHMgPSBmYWxzZTtcbiAgICAgICAgaWYgKGFwcC5pc0V4dGVybmFsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNlZWRSZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZWVkaG9zdC1jcmVkcz9zZXJ2aWNlSWQ9JHthcHAuaWR9YCk7XG4gICAgICAgICAgICBjb25zdCBzZWVkRGF0YSA9IGF3YWl0IHNlZWRSZXMuanNvbigpO1xuICAgICAgICAgICAgaWYgKHNlZWREYXRhLnN1Y2Nlc3MgJiYgc2VlZERhdGEuaGFzQ3JlZGVudGlhbHMpIGhhc0NyZWRzID0gdHJ1ZTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHthcHAuaWR9L2NyZWRlbnRpYWxzYCk7XG4gICAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICAgIGlmIChkLnN1Y2Nlc3MgJiYgKGQuaGFzQXBpS2V5IHx8IGQuaGFzQmFzaWNBdXRoKSkgaGFzQ3JlZHMgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBjcmVkcy1idG4tJHthcHAuaWR9YCk7XG4gICAgICAgIGlmIChidG4pIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdoYXMtY3JlZHMnLCBoYXNDcmVkcyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICB9O1xufSkoKTtcbjtcbi8vID09PT09IFRPVFAgU0VUVElOR1MgPT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuICBpbmplY3RNb2RhbCgndG90cC1zZXR0aW5ncy1tb2RhbCcsIGA8ZGl2IGlkPVwidG90cC1zZXR0aW5ncy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDIwcHg7IG1heC13aWR0aDogNTIwcHg7XCI+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/IG5ldyBEYXRlKHUubGFzdExvZ2luQXQpLnRvTG9jYWxlU3RyaW5nKCkgOiAnXHUyMDE0JyxcbiAgICAgIH0pKTtcblxuICAgICAgY29uc3QgYWN0aW9uc0NlbGwgPSBfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4O3RleHQtYWxpZ246cmlnaHQnIH0pO1xuICAgICAgY29uc3Qgcm9sZVNlbGVjdCA9IF9lbCgnc2VsZWN0Jywge1xuICAgICAgICBzdHlsZTogJ3BhZGRpbmc6MnB4IDZweDttYXJnaW4tcmlnaHQ6NnB4JyxcbiAgICAgICAgb25jaGFuZ2U6IGFzeW5jIChldikgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBfZmV0Y2hKU09OKEFQSS51c2VycyArICcvJyArIGVuY29kZVVSSUNvbXBvbmVudCh1LmlkKSwge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdQQVRDSCcsIGJvZHk6IHsgcm9sZTogZXYudGFyZ2V0LnZhbHVlIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9uQ2hhbmdlICYmIG9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ1JvbGUgdXBkYXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgICAgICAgICBldi50YXJnZXQudmFsdWUgPSB1LnJvbGU7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgWydhZG1pbicsICdvcGVyYXRvcicsICd2aWV3ZXInXSkge1xuICAgICAgICBjb25zdCBvcHQgPSBfZWwoJ29wdGlvbicsIHsgdmFsdWU6IHIsIHRleHQ6IHIgfSk7XG4gICAgICAgIGlmIChyID09PSB1LnJvbGUpIG9wdC5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHJvbGVTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cbiAgICAgIGFjdGlvbnNDZWxsLmFwcGVuZENoaWxkKHJvbGVTZWxlY3QpO1xuXG4gICAgICBjb25zdCBkZWxCdG4gPSBfZWwoJ2J1dHRvbicsIHtcbiAgICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3BhZGRpbmc6MnB4IDhweCcsXG4gICAgICAgIHRleHQ6ICdEZWxldGUnLFxuICAgICAgICBvbmNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtKCdEZWxldGUgdXNlciAnICsgKHUuZW1haWwgfHwgdS5pZCkgKyAnPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJykpIHJldHVybjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgX2ZldGNoSlNPTihBUEkudXNlcnMgKyAnLycgKyBlbmNvZGVVUklDb21wb25lbnQodS5pZCksIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgICAgICAgIG9uQ2hhbmdlICYmIG9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ0RlbGV0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYWN0aW9uc0NlbGwuYXBwZW5kQ2hpbGQoZGVsQnRuKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChhY3Rpb25zQ2VsbCk7XG5cbiAgICAgIHRib2R5LmFwcGVuZENoaWxkKHJvdyk7XG4gICAgfVxuICAgIHRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlckludml0ZUZvcm0oY29udGFpbmVyLCBvbklzc3VlZCkge1xuICAgIGNvbnN0IGZvcm0gPSBfZWwoJ2Zvcm0nLCB7XG4gICAgICBzdHlsZTogJ2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmVuZCcsXG4gICAgICBvbnN1Ym1pdDogYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGZkID0gbmV3IEZvcm1EYXRhKGV2LnRhcmdldCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICAgICAgZW1haWw6IGZkLmdldCgnZW1haWwnKSxcbiAgICAgICAgICByb2xlOiBmZC5nZXQoJ3JvbGUnKSxcbiAgICAgICAgICB0dGxIb3VyczogcGFyc2VJbnQoZmQuZ2V0KCd0dGxIb3VycycpLCAxMCkgfHwgMjQsXG4gICAgICAgICAgc2VuZEVtYWlsOiBmZC5nZXQoJ3NlbmRFbWFpbCcpID09PSAnb24nLFxuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS5pbnZpdGVzLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5IH0pO1xuICAgICAgICAgIGV2LnRhcmdldC5yZXNldCgpO1xuICAgICAgICAgIG9uSXNzdWVkICYmIG9uSXNzdWVkKHIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ0ludml0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdsYWJlbCcsIHsgc3R5bGU6ICdkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoycHg7Zm9udC1zaXplOjAuODVyZW0nIH0sXG4gICAgICBfZWwoJ3NwYW4nLCB7IHRleHQ6ICdFbWFpbCcgfSksXG4gICAgICBfZWwoJ2lucHV0JywgeyBuYW1lOiAnZW1haWwnLCB0eXBlOiAnZW1haWwnLCByZXF1aXJlZDogdHJ1ZSwgcGxhY2Vob2xkZXI6ICd1c2VyQGV4YW1wbGUuY29tJywgc3R5bGU6ICdwYWRkaW5nOjZweCcgfSksXG4gICAgKSk7XG4gICAgY29uc3Qgcm9sZVNlbCA9IF9lbCgnc2VsZWN0JywgeyBuYW1lOiAncm9sZScsIHN0eWxlOiAncGFkZGluZzo2cHgnIH0pO1xuICAgIGZvciAoY29uc3QgciBvZiBbJ29wZXJhdG9yJywgJ3ZpZXdlcicsICdhZG1pbiddKSB7XG4gICAgICByb2xlU2VsLmFwcGVuZENoaWxkKF9lbCgnb3B0aW9uJywgeyB2YWx1ZTogciwgdGV4dDogciB9KSk7XG4gICAgfVxuICAgIGZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdsYWJlbCcsIHsgc3R5bGU6ICdkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoycHg7Zm9udC1zaXplOjAuODVyZW0nIH0sXG4gICAgICBfZWwoJ3NwYW4nLCB7IHRleHQ6ICdSb2xlJyB9KSwgcm9sZVNlbCxcbiAgICApKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKF9lbCgnbGFiZWwnLCB7IHN0eWxlOiAnZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O2ZvbnQtc2l6ZTowLjg1cmVtJyB9LFxuICAgICAgX2VsKCdzcGFuJywgeyB0ZXh0OiAnVFRMIChob3VycyknIH0pLFxuICAgICAgX2VsKCdpbnB1dCcsIHsgbmFtZTogJ3R0bEhvdXJzJywgdHlwZTogJ251bWJlcicsIG1pbjogJzEnLCBtYXg6ICcxNjgnLCB2YWx1ZTogJzI0Jywgc3R5bGU6ICdwYWRkaW5nOjZweDt3aWR0aDo4MHB4JyB9KSxcbiAgICApKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKF9lbCgnbGFiZWwnLCB7IHN0eWxlOiAnZGlzcGxheTpmbGV4O2dhcDo0cHg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTowLjg1cmVtJyB9LFxuICAgICAgX2VsKCdpbnB1dCcsIHsgbmFtZTogJ3NlbmRFbWFpbCcsIHR5cGU6ICdjaGVja2JveCcsIGNoZWNrZWQ6IHRydWUgfSksXG4gICAgICBfZWwoJ3NwYW4nLCB7IHRleHQ6ICdTZW5kIGVtYWlsJyB9KSxcbiAgICApKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKF9lbCgnYnV0dG9uJywgeyB0eXBlOiAnc3VibWl0JywgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3BhZGRpbmc6NnB4IDEycHgnLCB0ZXh0OiAnSXNzdWUgaW52aXRlJyB9KSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGZvcm0pO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlckludml0ZXNMaXN0KGNvbnRhaW5lciwgaW52aXRlcywgb25DaGFuZ2UpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgaWYgKCFpbnZpdGVzIHx8IGludml0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdwJywgeyBzdHlsZTogJ2NvbG9yOnZhcigtLW11dGVkKScsIHRleHQ6ICdObyBvdXRzdGFuZGluZyBpbnZpdGVzLicgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZSA9IF9lbCgndGFibGUnLCB7XG4gICAgICBzdHlsZTogJ3dpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjlyZW0nLFxuICAgIH0pO1xuICAgIHRhYmxlLmFwcGVuZENoaWxkKF9lbCgndGhlYWQnLCBudWxsLFxuICAgICAgX2VsKCd0cicsIHsgc3R5bGU6ICdib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpJyB9LFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdFbWFpbCcgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ1JvbGUnIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdJbnZpdGVkIGJ5JyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnRXhwaXJlcycgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpyaWdodDtwYWRkaW5nOjhweCcsIHRleHQ6ICdBY3Rpb25zJyB9KSxcbiAgICAgICksXG4gICAgKSk7XG4gICAgY29uc3QgdGJvZHkgPSBfZWwoJ3Rib2R5Jyk7XG4gICAgZm9yIChjb25zdCBpbnYgb2YgaW52aXRlcykge1xuICAgICAgY29uc3Qgcm93ID0gX2VsKCd0cicsIHsgc3R5bGU6ICdib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpJyB9KTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4JywgdGV4dDogaW52LmVtYWlsIH0pKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4JyB9LCBfcmVuZGVyQmFkZ2UoaW52LnJvbGUpKSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS1tdXRlZCknLCB0ZXh0OiBpbnYuaW52aXRlZEJ5IHx8ICdcdTIwMTQnIH0pKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywge1xuICAgICAgICBzdHlsZTogJ3BhZGRpbmc6OHB4O2NvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MC44NXJlbScsXG4gICAgICAgIHRleHQ6IGludi5leHBpcmVzQXQgPyBuZXcgRGF0ZShpbnYuZXhwaXJlc0F0KS50b0xvY2FsZVN0cmluZygpIDogJ1x1MjAxNCcsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBhY3Rpb25zQ2VsbCA9IF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHg7dGV4dC1hbGlnbjpyaWdodCcgfSk7XG4gICAgICBhY3Rpb25zQ2VsbC5hcHBlbmRDaGlsZChfZWwoJ2J1dHRvbicsIHtcbiAgICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3BhZGRpbmc6MnB4IDhweCcsXG4gICAgICAgIHRleHQ6ICdSZXZva2UnLFxuICAgICAgICBvbmNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtKCdSZXZva2UgaW52aXRlIGZvciAnICsgaW52LmVtYWlsICsgJz8nKSkgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBfZmV0Y2hKU09OKEFQSS5pbnZpdGVzICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGludi5pZCksIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgICAgICAgIG9uQ2hhbmdlICYmIG9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgd2luZG93LmVycm9ySGFuZGxlciAmJiB3aW5kb3cuZXJyb3JIYW5kbGVyLnNob3coJ1Jldm9rZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChhY3Rpb25zQ2VsbCk7XG4gICAgICB0Ym9keS5hcHBlbmRDaGlsZChyb3cpO1xuICAgIH1cbiAgICB0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYmxlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJJc3N1ZWRJbnZpdGVCYW5uZXIoaW52aXRlLCBwYXJlbnQpIHtcbiAgICBjb25zdCBiYW5uZXIgPSBfZWwoJ2RpdicsIHtcbiAgICAgIHN0eWxlOiAnbWFyZ2luLXRvcDoxMnB4O3BhZGRpbmc6MTJweDtib3JkZXI6MXB4IHNvbGlkICMxNmEzNGE7Ym9yZGVyLXJhZGl1czo2cHg7YmFja2dyb3VuZDojMDUyZTFhO2NvbG9yOiNiYmY3ZDA7Zm9udC1zaXplOjAuODVyZW0nLFxuICAgIH0pO1xuICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ3N0cm9uZycsIHsgdGV4dDogJ0ludml0ZSBpc3N1ZWQgXHUyMDE0IGNvcHkgdGhlIGxpbmsgYmVsb3cuICcgK1xuICAgICAgJ0l0IHdpbGwgbm90IGJlIHNob3duIGFnYWluLicgfSkpO1xuICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ2JyJykpO1xuICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ2NvZGUnLCB7XG4gICAgICBzdHlsZTogJ2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDo4cHg7cGFkZGluZzo4cHg7YmFja2dyb3VuZDojMDAwO2JvcmRlci1yYWRpdXM6NHB4O3dvcmQtYnJlYWs6YnJlYWstYWxsO2NvbG9yOiNkMWZhZTUnLFxuICAgICAgdGV4dDogaW52aXRlLmFjY2VwdFVybCxcbiAgICB9KSk7XG4gICAgY29uc3QgY29weUJ0biA9IF9lbCgnYnV0dG9uJywge1xuICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ21hcmdpbi10b3A6OHB4O3BhZGRpbmc6NHB4IDEwcHgnLFxuICAgICAgdGV4dDogJ0NvcHkgbGluaycsXG4gICAgICBvbmNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoaW52aXRlLmFjY2VwdFVybCk7XG4gICAgICAgICAgY29weUJ0bi50ZXh0Q29udGVudCA9ICdDb3BpZWQhJztcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgY29weUJ0bi50ZXh0Q29udGVudCA9ICdDb3B5IGxpbmsnOyB9LCAyMDAwKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHdpbmRvdy5lcnJvckhhbmRsZXIgJiYgd2luZG93LmVycm9ySGFuZGxlci5zaG93KCdDbGlwYm9hcmQgYmxvY2tlZDogc2VsZWN0IHRoZSBsaW5rIG1hbnVhbGx5LicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGJhbm5lci5hcHBlbmRDaGlsZChjb3B5QnRuKTtcbiAgICBpZiAoaW52aXRlLmRlbGl2ZXJlZFZpYSA9PT0gJ2Rldi1jb25zb2xlJykge1xuICAgICAgYmFubmVyLmFwcGVuZENoaWxkKF9lbCgncCcsIHtcbiAgICAgICAgc3R5bGU6ICdtYXJnaW4tdG9wOjhweDtjb2xvcjojZmJiZjI0O2ZvbnQtc2l6ZTowLjhyZW0nLFxuICAgICAgICB0ZXh0OiAnU01UUCBub3QgY29uZmlndXJlZCBcdTIwMTQgdGhlIGludml0ZSB3YXMgbG9nZ2VkIHRvIHRoZSBzZXJ2ZXIgY29uc29sZSAoc2VhcmNoIGZvciBbREMtMDQ4LURFVi1JTlZJVEUtTElOS10pLicsXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIGlmIChpbnZpdGUuZGVsaXZlcmVkVmlhID09PSAnZW1haWwnKSB7XG4gICAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoX2VsKCdwJywge1xuICAgICAgICBzdHlsZTogJ21hcmdpbi10b3A6OHB4O2NvbG9yOiM4NmVmYWM7Zm9udC1zaXplOjAuOHJlbScsXG4gICAgICAgIHRleHQ6ICdFbWFpbCBzZW50IHRvICcgKyBpbnZpdGUuZW1haWwgKyAnLicsXG4gICAgICB9KSk7XG4gICAgfVxuICAgIHBhcmVudC5hcHBlbmRDaGlsZChiYW5uZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBhZG1pbiBwYW5lbC4gQ2FsbGVkIGJ5IHRoZSBvcGVuIHRyaWdnZXI7IHNhZmUgdG8gY2FsbCBtdWx0aXBsZVxuICAgKiB0aW1lcyAocmUtcmVuZGVycyBpbnRvIHRoZSBzYW1lIGNvbnRhaW5lcikuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBtb3VudChjb250YWluZXIpIHtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKF9lbCgnaDInLCB7IHN0eWxlOiAnbWFyZ2luOjAgMCAxNnB4JywgdGV4dDogJ0FkbWluIFx1MDBCNyBVc2VycyAmIEludml0ZXMnIH0pKTtcblxuICAgIGNvbnN0IG1lRGF0YSA9IGF3YWl0IF9mZXRjaEpTT04oQVBJLm1lKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICBpZiAoIW1lRGF0YSB8fCAhbWVEYXRhLnVzZXIgfHwgbWVEYXRhLnVzZXIucm9sZSAhPT0gJ2FkbWluJykge1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKF9lbCgncCcsIHtcbiAgICAgICAgc3R5bGU6ICdjb2xvcjp2YXIoLS1tdXRlZCknLFxuICAgICAgICB0ZXh0OiAnQWRtaW4gcm9sZSByZXF1aXJlZCB0byB2aWV3IHRoaXMgcGFuZWwuIElmIG11bHRpLXVzZXIgbW9kZSBpcyBlbmFibGVkIGFuZCB5b3Ugc2hvdWxkIGhhdmUgYWNjZXNzLCBjaGVjayAvYXBpL3YxL2F1dGgvbWUuJyxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZWZyZXNoIGJ1dHRvblxuICAgIGNvbnN0IHJlZnJlc2hCdG4gPSBfZWwoJ2J1dHRvbicsIHtcbiAgICAgIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdmbG9hdDpyaWdodDtwYWRkaW5nOjRweCAxMHB4JyxcbiAgICAgIHRleHQ6ICdSZWZyZXNoJyxcbiAgICAgIG9uY2xpY2s6ICgpID0+IG1vdW50KGNvbnRhaW5lciksXG4gICAgfSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHJlZnJlc2hCdG4pO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFVzZXJzIHNlY3Rpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgY29uc3QgdXNlcnNIZWFkZXIgPSBfZWwoJ2gzJywgeyBzdHlsZTogJ21hcmdpbjoyNHB4IDAgOHB4O2NsZWFyOmJvdGgnLCB0ZXh0OiAnVXNlcnMnIH0pO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh1c2Vyc0hlYWRlcik7XG5cbiAgICBjb25zdCB1c2Vyc0xpc3QgPSBfZWwoJ2RpdicsIHsgaWQ6ICdhZG1pbi11c2Vycy1saXN0JyB9KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodXNlcnNMaXN0KTtcblxuICAgIGNvbnN0IHVzZXJzRGF0YSA9IGF3YWl0IF9mZXRjaEpTT04oQVBJLnVzZXJzKS5jYXRjaCgoKSA9PiAoeyB1c2VyczogW10gfSkpO1xuICAgIF9yZW5kZXJVc2Vyc0xpc3QodXNlcnNMaXN0LCB1c2Vyc0RhdGEudXNlcnMsICgpID0+IG1vdW50KGNvbnRhaW5lcikpO1xuXG4gICAgLy8gQWRkIHVzZXIgZm9ybSAocHJlLWF1dGhvcml6ZSBhbiBlbWFpbCB3aXRob3V0IGlzc3VpbmcgYW4gaW52aXRlKS5cbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdoNCcsIHsgc3R5bGU6ICdtYXJnaW46MjRweCAwIDhweDtmb250LXNpemU6MC45NXJlbScsIHRleHQ6ICdQcmUtYXV0aG9yaXplIGVtYWlsJyB9KSk7XG4gICAgY29uc3QgYWRkVXNlckZvcm0gPSBfZWwoJ2Zvcm0nLCB7XG4gICAgICBzdHlsZTogJ2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmVuZCcsXG4gICAgICBvbnN1Ym1pdDogYXN5bmMgKGV2KSA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGVtYWlsID0gZXYudGFyZ2V0LmVtYWlsLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgaWYgKCFlbWFpbCkgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IF9mZXRjaEpTT04oQVBJLnVzZXJzLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiB7IGVtYWlsIH0gfSk7XG4gICAgICAgICAgZXYudGFyZ2V0LnJlc2V0KCk7XG4gICAgICAgICAgbW91bnQoY29udGFpbmVyKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHdpbmRvdy5lcnJvckhhbmRsZXIgJiYgd2luZG93LmVycm9ySGFuZGxlci5zaG93KCdBZGQgZmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgICBhZGRVc2VyRm9ybS5hcHBlbmRDaGlsZChfZWwoJ2lucHV0JywgeyBuYW1lOiAnZW1haWwnLCB0eXBlOiAnZW1haWwnLCByZXF1aXJlZDogdHJ1ZSwgcGxhY2Vob2xkZXI6ICd1c2VyQGV4YW1wbGUuY29tJywgc3R5bGU6ICdwYWRkaW5nOjZweCcgfSkpO1xuICAgIGFkZFVzZXJGb3JtLmFwcGVuZENoaWxkKF9lbCgnYnV0dG9uJywgeyB0eXBlOiAnc3VibWl0JywgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3BhZGRpbmc6NnB4IDEycHgnLCB0ZXh0OiAnQWRkIHRvIGFsbG93bGlzdCcgfSkpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChhZGRVc2VyRm9ybSk7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgSW52aXRlcyBzZWN0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ2gzJywgeyBzdHlsZTogJ21hcmdpbjoyNHB4IDAgOHB4JywgdGV4dDogJ0lzc3VlIGludml0ZScgfSkpO1xuICAgIGNvbnN0IGludml0ZUZvcm1Db250YWluZXIgPSBfZWwoJ2RpdicpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpbnZpdGVGb3JtQ29udGFpbmVyKTtcblxuICAgIGNvbnN0IGludml0ZXNMaXN0ID0gX2VsKCdkaXYnLCB7IGlkOiAnYWRtaW4taW52aXRlcy1saXN0Jywgc3R5bGU6ICdtYXJnaW4tdG9wOjE2cHgnIH0pO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpbnZpdGVzTGlzdCk7XG5cbiAgICBjb25zdCBpbnZpdGVzRGF0YSA9IGF3YWl0IF9mZXRjaEpTT04oQVBJLmludml0ZXMpLmNhdGNoKCgpID0+ICh7IGludml0ZXM6IFtdIH0pKTtcbiAgICBfcmVuZGVySW52aXRlc0xpc3QoaW52aXRlc0xpc3QsIGludml0ZXNEYXRhLmludml0ZXMsICgpID0+IG1vdW50KGNvbnRhaW5lcikpO1xuXG4gICAgX3JlbmRlckludml0ZUZvcm0oaW52aXRlRm9ybUNvbnRhaW5lciwgKGlzc3VlZCkgPT4ge1xuICAgICAgX3JlbmRlcklzc3VlZEludml0ZUJhbm5lcihpc3N1ZWQsIGludml0ZUZvcm1Db250YWluZXIpO1xuICAgICAgbW91bnQoY29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBQdWJsaWMgQVBJIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBhZG1pbiBwYW5lbCBhcyBhIG1vZGFsIG92ZXJsYXkuIENsb3NlcyBvbiBiYWNrZHJvcCBjbGljayBvclxuICAgKiB0aGUgY2xvc2UgYnV0dG9uLiBSZW5kZXJzIGludG8gZG9jdW1lbnQuYm9keSBzbyBpdCBmbG9hdHMgYWJvdmUgdGhlXG4gICAqIGRhc2hib2FyZCBjaHJvbWUuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBvcGVuKCkge1xuICAgIC8vIElmIGFscmVhZHkgb3BlbiwganVzdCBmb2N1cy5cbiAgICBjb25zdCBleGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbi1wYW5lbC1yb290Jyk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm47XG5cbiAgICBjb25zdCBiYWNrZHJvcCA9IF9lbCgnZGl2Jywge1xuICAgICAgaWQ6ICdhZG1pbi1wYW5lbC1yb290JyxcbiAgICAgIHN0eWxlOiAncG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOycsXG4gICAgICBvbmNsaWNrOiAoZXYpID0+IHtcbiAgICAgICAgaWYgKGV2LnRhcmdldCA9PT0gYmFja2Ryb3ApIGNsb3NlKCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgY2FyZCA9IF9lbCgnZGl2Jywge1xuICAgICAgc3R5bGU6ICdiYWNrZ3JvdW5kOnZhcigtLWNhcmQtYmFzZSwjMWYyOTM3KTtjb2xvcjp2YXIoLS10ZXh0LCNmM2Y0ZjYpO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MjRweDttYXgtd2lkdGg6OTAwcHg7d2lkdGg6OTAlO21heC1oZWlnaHQ6ODV2aDtvdmVyZmxvdzphdXRvO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaGFkb3c6MCAxMHB4IDMwcHggcmdiYSgwLDAsMCwwLjMpJyxcbiAgICB9KTtcbiAgICBjYXJkLmFwcGVuZENoaWxkKF9lbCgnYnV0dG9uJywge1xuICAgICAgY2xhc3M6ICdidG4tc20nLCBzdHlsZTogJ3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxMnB4O3JpZ2h0OjEycHg7cGFkZGluZzo0cHggMTBweCcsXG4gICAgICB0ZXh0OiAnQ2xvc2UnLCBvbmNsaWNrOiBjbG9zZSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBib2R5ID0gX2VsKCdkaXYnLCB7IGlkOiAnYWRtaW4tcGFuZWwtYm9keScgfSk7XG4gICAgY2FyZC5hcHBlbmRDaGlsZChib2R5KTtcbiAgICBiYWNrZHJvcC5hcHBlbmRDaGlsZChjYXJkKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJhY2tkcm9wKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBtb3VudChib2R5KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBib2R5LmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiNmODcxNzFcIj5GYWlsZWQgdG8gbG9hZCBhZG1pbiBwYW5lbDogJyArIChlLm1lc3NhZ2UgfHwgZSkgKyAnPC9wPic7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtaW4tcGFuZWwtcm9vdCcpO1xuICAgIGlmIChleGlzdGluZykgZXhpc3RpbmcucmVtb3ZlKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0IGFuIFwiQWRtaW5cIiBidXR0b24gaW50byB0aGUgdG9wIGJhci4gT25seSByZW5kZXJzIHdoZW4gdGhlXG4gICAqIGN1cnJlbnQgL21lIHJlc3BvbnNlIHNheXMgaXNBZG1pbj10cnVlLiBSZS1jaGVja3MgcGVyaW9kaWNhbGx5XG4gICAqIChldmVyeSA2MHMpIHNvIGEgcGVybWlzc2lvbiBkb3duZ3JhZGUgdGFrZXMgZWZmZWN0IHdpdGhvdXQgYSByZWxvYWQuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBhdHRhY2hUcmlnZ2VyKGJhckNvbnRhaW5lcikge1xuICAgIGFzeW5jIGZ1bmN0aW9uIF9tYXliZVNob3coKSB7XG4gICAgICBjb25zdCBtZSA9IGF3YWl0IF9mZXRjaEpTT04oQVBJLm1lKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluLXRyaWdnZXItYnRuJyk7XG4gICAgICBpZiAobWUgJiYgbWUudXNlciAmJiBtZS51c2VyLnJvbGUgPT09ICdhZG1pbicpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGJ0biA9IF9lbCgnYnV0dG9uJywge1xuICAgICAgICAgIGlkOiAnYWRtaW4tdHJpZ2dlci1idG4nLFxuICAgICAgICAgIGNsYXNzOiAnYnRuLXNtJyxcbiAgICAgICAgICBzdHlsZTogJ21hcmdpbi1sZWZ0OjhweDtwYWRkaW5nOjZweCAxMnB4JyxcbiAgICAgICAgICB0ZXh0OiAnQWRtaW4nLFxuICAgICAgICAgIG9uY2xpY2s6IG9wZW4sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYmFyQ29udGFpbmVyKSBiYXJDb250YWluZXIuYXBwZW5kQ2hpbGQoYnRuKTtcbiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQuYm9keSkgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChidG4pO1xuICAgICAgfSBlbHNlIGlmIChleGlzdGluZykge1xuICAgICAgICBleGlzdGluZy5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgX21heWJlU2hvdygpO1xuICAgIHNldEludGVydmFsKF9tYXliZVNob3csIDYwXzAwMCk7XG4gIH1cblxuICB3aW5kb3cuQWRtaW5QYW5lbCA9IHsgb3BlbiwgY2xvc2UsIGF0dGFjaFRyaWdnZXIgfTtcbn0pKCk7O1xuLy8gPT09PT09PT09PSBDUkVERU5USUFMIE1BTkFHRU1FTlQgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyBJbmplY3Qgc2tlbGV0b24gbW9kYWwgXHUyMDE0IGNyZWRlbnRpYWwgc2VjdGlvbnMgYXJlIGJ1aWx0IGR5bmFtaWNhbGx5IHdoZW4gb3BlbmVkXG4gIGluamVjdE1vZGFsKCd0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJywgYFxuICA8ZGl2IGlkPVwidG9rZW4tbWFuYWdlbWVudC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNTAwcHg7IG1heC13aWR0aDogNjAwcHg7XCI+XG4gICAgICA8aDM+XFx1ezFGNTExfSBETlMgQ3JlZGVudGlhbHM8L2gzPlxuXG4gICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTZweDtcIj5cbiAgICAgICAgRW50ZXIgVGVjaG5pdGl1bSBETlMgbG9naW4gY3JlZGVudGlhbHMuIFJlYWQtb25seSBhY2NvdW50cyBhcmUgdXNlZCBmb3IgbG9nczsgYWRtaW4gYWNjb3VudHMgZm9yIHJlc3RhcnRzLCByZWNvcmRzLCBhbmQgdXBkYXRlcy5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBpZD1cImRucy1jcmVkLXNlY3Rpb25zXCI+PC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwidG9rZW4tY2xlYXItYWxsXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IGF1dG87IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1iYWQtZmcpIDE1JSwgdHJhbnNwYXJlbnQpOyBib3JkZXItY29sb3I6IHZhcigtLWJhZC1mZyk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkNsZWFyIEFsbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwidG9rZW4tY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ0b2tlbi1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICBgKTtcblxuICAvLyBcdTI1MDBcdTI1MDAgSGVscGVycyBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBnZXREbnNJZHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKFNJVEUuZG5zU2VydmVycyB8fCB7fSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREbnNEaXNwbGF5TmFtZShkbnNJZCkge1xuICAgIGNvbnN0IHNlcnZlciA9IChTSVRFLmRuc1NlcnZlcnMgfHwge30pW2Ruc0lkXTtcbiAgICByZXR1cm4gc2VydmVyPy5uYW1lIHx8IGRuc0lkLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICAvKiogQnVpbGQgcGVyLXNlcnZlciBjcmVkZW50aWFsIGZvcm0gc2VjdGlvbnMgZnJvbSBTSVRFLmRuc1NlcnZlcnMgKi9cbiAgZnVuY3Rpb24gYnVpbGRDcmVkZW50aWFsU2VjdGlvbnMoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1jcmVkLXNlY3Rpb25zJyk7XG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBjb25zdCBkbnNJZHMgPSBnZXREbnNJZHMoKTtcbiAgICBpZiAoZG5zSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj5ObyBETlMgc2VydmVycyBjb25maWd1cmVkLjwvcD4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaWQgb2YgZG5zSWRzKSB7XG4gICAgICBjb250YWluZXIuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBgXG4gICAgICA8ZGl2IGNsYXNzPVwidG9rZW4tc2VjdGlvblwiPlxuICAgICAgICA8aDQgY2xhc3M9XCJ0b2tlbi1zZWN0aW9uLXRpdGxlXCI+JHtnZXREbnNEaXNwbGF5TmFtZShpZCl9PC9oND5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRva2VuLWdyaWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9rZW4tZmllbGRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCIke2lkfS1yZWFkb25seS11c2VybmFtZVwiPlxcdXsxRjRENn0gUmVhZC1Pbmx5IChMb2dzKTo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCIke2lkfS1yZWFkb25seS11c2VybmFtZVwiIHBsYWNlaG9sZGVyPVwiVXNlcm5hbWVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDRweDtcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRva2VuLWlucHV0LXJvd1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCIke2lkfS1yZWFkb25seS10b2tlblwiIHBsYWNlaG9sZGVyPVwiUGFzc3dvcmRcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRva2VuLXRvZ2dsZVwiIGRhdGEtdGFyZ2V0PVwiJHtpZH0tcmVhZG9ubHktdG9rZW5cIj5cXHV7MUY0NDF9PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9rZW4tZmllbGRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCIke2lkfS1hZG1pbi11c2VybmFtZVwiPlxcdXsxRjUyN30gQWRtaW46PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiJHtpZH0tYWRtaW4tdXNlcm5hbWVcIiBwbGFjZWhvbGRlcj1cIlVzZXJuYW1lXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA0cHg7XCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1pbnB1dC1yb3dcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiJHtpZH0tYWRtaW4tdG9rZW5cIiBwbGFjZWhvbGRlcj1cIlBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0b2tlbi10b2dnbGVcIiBkYXRhLXRhcmdldD1cIiR7aWR9LWFkbWluLXRva2VuXCI+XFx1ezFGNDQxfTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9rZW4tc3RhdHVzXCIgaWQ9XCIke2lkfS10b2tlbi1zdGF0dXNcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIENyZWRlbnRpYWwgZW5jcnlwdGlvbiBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBnZXRFbmNyeXB0aW9uS2V5KCkge1xuICAgIGxldCBrZXkgPSBzYWZlU2Vzc2lvbkdldCgnZGFzaGNhZGR5LWVuY3J5cHRpb24ta2V5Jyk7XG4gICAgaWYgKGtleSkgcmV0dXJuIGtleTtcblxuICAgIGNvbnN0IG9sZEtleSA9IHNhZmVHZXQoJ2Rhc2hjYWRkeS1lbmNyeXB0aW9uLWtleScpO1xuICAgIGlmIChvbGRLZXkpIHtcbiAgICAgIHNhZmVTZXNzaW9uU2V0KCdkYXNoY2FkZHktZW5jcnlwdGlvbi1rZXknLCBvbGRLZXkpO1xuICAgICAgc2FmZVJlbW92ZSgnZGFzaGNhZGR5LWVuY3J5cHRpb24ta2V5Jyk7XG4gICAgICByZXR1cm4gb2xkS2V5O1xuICAgIH1cblxuICAgIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xuICAgIGtleSA9IEFycmF5LmZyb20oYXJyYXksIGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgc2FmZVNlc3Npb25TZXQoJ2Rhc2hjYWRkeS1lbmNyeXB0aW9uLWtleScsIGtleSk7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuICBjb25zdCBFTkNSWVBUSU9OX0tFWSA9IGdldEVuY3J5cHRpb25LZXkoKTtcblxuICBmdW5jdGlvbiBjcmVkZW50aWFsRW5jcnlwdCh0ZXh0LCBrZXkpIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiAnJztcbiAgICBjb25zdCBpdiA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoOCkpO1xuICAgIGNvbnN0IGl2SGV4ID0gQXJyYXkuZnJvbShpdiwgYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICBjb25zdCBrZXlCeXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShrZXkgKyBpdkhleCk7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hhckNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQoaSlcbiAgICAgICAgXiBrZXlCeXRlc1tpICUga2V5Qnl0ZXMubGVuZ3RoXVxuICAgICAgICBeIGl2W2kgJSBpdi5sZW5ndGhdXG4gICAgICAgIF4gKChpICogMzEgKyAxNykgJiAweEZGKTtcbiAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIGl2SGV4ICsgJzonICsgYnRvYShyZXN1bHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlZGVudGlhbERlY3J5cHQoZW5jcnlwdGVkVGV4dCwga2V5KSB7XG4gICAgaWYgKCFlbmNyeXB0ZWRUZXh0KSByZXR1cm4gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbG9uSWR4ID0gZW5jcnlwdGVkVGV4dC5pbmRleE9mKCc6Jyk7XG4gICAgICBpZiAoY29sb25JZHggPT09IDE2KSB7XG4gICAgICAgIGNvbnN0IGl2SGV4ID0gZW5jcnlwdGVkVGV4dC5zdWJzdHJpbmcoMCwgMTYpO1xuICAgICAgICBjb25zdCBpdiA9IG5ldyBVaW50OEFycmF5KGl2SGV4Lm1hdGNoKC8uezJ9L2cpLm1hcChoID0+IHBhcnNlSW50KGgsIDE2KSkpO1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gYXRvYihlbmNyeXB0ZWRUZXh0LnN1YnN0cmluZygxNykpO1xuICAgICAgICBjb25zdCBrZXlCeXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShrZXkgKyBpdkhleCk7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvZGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2hhckNvZGUgPSBkZWNvZGVkLmNoYXJDb2RlQXQoaSlcbiAgICAgICAgICAgIF4ga2V5Qnl0ZXNbaSAlIGtleUJ5dGVzLmxlbmd0aF1cbiAgICAgICAgICAgIF4gaXZbaSAlIGl2Lmxlbmd0aF1cbiAgICAgICAgICAgIF4gKChpICogMzEgKyAxNykgJiAweEZGKTtcbiAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY29kZWQgPSBhdG9iKGVuY3J5cHRlZFRleHQpO1xuICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvZGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoYXJDb2RlID0gZGVjb2RlZC5jaGFyQ29kZUF0KGkpIF4ga2V5LmNoYXJDb2RlQXQoaSAlIGtleS5sZW5ndGgpO1xuICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgQ3JlZGVudGlhbCBzdG9yYWdlIFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGdldENyZWRlbnRpYWwoZG5zSWQsIHRva2VuVHlwZSwgY3JlZFR5cGUpIHtcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSBzYWZlR2V0KGAke2Ruc0lkfS0ke3Rva2VuVHlwZX0tJHtjcmVkVHlwZX0tZW5jYCk7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxEZWNyeXB0KGVuY3J5cHRlZCwgRU5DUllQVElPTl9LRVkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0Q3JlZGVudGlhbChkbnNJZCwgdG9rZW5UeXBlLCBjcmVkVHlwZSwgdmFsdWUpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtkbnNJZH0tJHt0b2tlblR5cGV9LSR7Y3JlZFR5cGV9LWVuY2A7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzYWZlU2V0KGtleSwgY3JlZGVudGlhbEVuY3J5cHQodmFsdWUsIEVOQ1JZUFRJT05fS0VZKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNhZmVSZW1vdmUoa2V5KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRUb2tlbihkbnNJZCwgdG9rZW5UeXBlKSB7XG4gICAgcmV0dXJuIGdldENyZWRlbnRpYWwoZG5zSWQsIHRva2VuVHlwZSwgJ3Rva2VuJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRVc2VybmFtZShkbnNJZCwgdG9rZW5UeXBlKSB7XG4gICAgcmV0dXJuIGdldENyZWRlbnRpYWwoZG5zSWQsIHRva2VuVHlwZSwgJ3VzZXJuYW1lJyk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRUb2tlbihkbnNJZCwgdG9rZW5UeXBlLCB0b2tlbikge1xuICAgIHNldENyZWRlbnRpYWwoZG5zSWQsIHRva2VuVHlwZSwgJ3Rva2VuJywgdG9rZW4pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0VXNlcm5hbWUoZG5zSWQsIHRva2VuVHlwZSwgdXNlcm5hbWUpIHtcbiAgICBzZXRDcmVkZW50aWFsKGRuc0lkLCB0b2tlblR5cGUsICd1c2VybmFtZScsIHVzZXJuYW1lKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEFsbENyZWRlbnRpYWxzKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgZG5zSWQgb2YgZ2V0RG5zSWRzKCkpIHtcbiAgICAgIHJlc3VsdFtkbnNJZF0gPSB7XG4gICAgICAgIHJlYWRvbmx5OiB7IHVzZXJuYW1lOiBnZXRVc2VybmFtZShkbnNJZCwgJ3JlYWRvbmx5JyksIHRva2VuOiBnZXRUb2tlbihkbnNJZCwgJ3JlYWRvbmx5JykgfSxcbiAgICAgICAgYWRtaW46IHsgdXNlcm5hbWU6IGdldFVzZXJuYW1lKGRuc0lkLCAnYWRtaW4nKSwgdG9rZW46IGdldFRva2VuKGRuc0lkLCAnYWRtaW4nKSB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJBbGxDcmVkZW50aWFscygpIHtcbiAgICBnZXREbnNJZHMoKS5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgIFsncmVhZG9ubHknLCAnYWRtaW4nXS5mb3JFYWNoKHRva2VuVHlwZSA9PiB7XG4gICAgICAgIFsndG9rZW4nLCAndXNlcm5hbWUnXS5mb3JFYWNoKGNyZWRUeXBlID0+IHtcbiAgICAgICAgICBzYWZlUmVtb3ZlKGAke2Ruc0lkfS0ke3Rva2VuVHlwZX0tJHtjcmVkVHlwZX0tZW5jYCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBzYWZlUmVtb3ZlKGAke2Ruc0lkfS10b2tlbi1lbmNgKTtcbiAgICAgIHNhZmVSZW1vdmUoYCR7ZG5zSWR9LXVzZXJuYW1lLWVuY2ApO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3RvcmVkQ3JlZGVudGlhbHMoZG5zSWQpIHtcbiAgICBjb25zdCByZWFkb25seVRva2VuID0gZ2V0VG9rZW4oZG5zSWQsICdyZWFkb25seScpO1xuICAgIGNvbnN0IHJlYWRvbmx5VXNlcm5hbWUgPSBnZXRVc2VybmFtZShkbnNJZCwgJ3JlYWRvbmx5Jyk7XG4gICAgY29uc3QgYWRtaW5Ub2tlbiA9IGdldFRva2VuKGRuc0lkLCAnYWRtaW4nKTtcbiAgICBjb25zdCBhZG1pblVzZXJuYW1lID0gZ2V0VXNlcm5hbWUoZG5zSWQsICdhZG1pbicpO1xuICAgIGNvbnN0IG9sZFRva2VuID0gY3JlZGVudGlhbERlY3J5cHQoc2FmZUdldChgJHtkbnNJZH0tdG9rZW4tZW5jYCksIEVOQ1JZUFRJT05fS0VZKTtcbiAgICBjb25zdCBvbGRVc2VybmFtZSA9IGNyZWRlbnRpYWxEZWNyeXB0KHNhZmVHZXQoYCR7ZG5zSWR9LXVzZXJuYW1lLWVuY2ApLCBFTkNSWVBUSU9OX0tFWSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdXNlcm5hbWU6IGFkbWluVXNlcm5hbWUgfHwgcmVhZG9ubHlVc2VybmFtZSB8fCBvbGRVc2VybmFtZSxcbiAgICAgIHRva2VuOiBhZG1pblRva2VuIHx8IHJlYWRvbmx5VG9rZW4gfHwgb2xkVG9rZW4sXG4gICAgICByZWFkb25seVRva2VuOiByZWFkb25seVRva2VuIHx8IG9sZFRva2VuLFxuICAgICAgcmVhZG9ubHlVc2VybmFtZTogcmVhZG9ubHlVc2VybmFtZSB8fCBvbGRVc2VybmFtZSxcbiAgICAgIGFkbWluVG9rZW46IGFkbWluVG9rZW4gfHwgb2xkVG9rZW4sXG4gICAgICBhZG1pblVzZXJuYW1lOiBhZG1pblVzZXJuYW1lIHx8IG9sZFVzZXJuYW1lXG4gICAgfTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBNb2RhbCBoYW5kbGVycyBcdTI1MDBcdTI1MDBcblxuICAvLyBPcGVuIG1vZGFsIFx1MjAxNCBidWlsZCBzZWN0aW9ucyBkeW5hbWljYWxseSwgcG9wdWxhdGUgZnJvbSBzdG9yZWQgY3JlZHNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS10b2tlbnMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgYnVpbGRDcmVkZW50aWFsU2VjdGlvbnMoKTtcbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJyk7XG4gICAgY29uc3QgY3JlZHMgPSBnZXRBbGxDcmVkZW50aWFscygpO1xuXG4gICAgZ2V0RG5zSWRzKCkuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICBjb25zdCBjID0gY3JlZHNbZG5zSWRdO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXVzZXJuYW1lYCkudmFsdWUgPSBjLnJlYWRvbmx5LnVzZXJuYW1lO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXRva2VuYCkudmFsdWUgPSBjLnJlYWRvbmx5LnRva2VuO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LWFkbWluLXVzZXJuYW1lYCkudmFsdWUgPSBjLmFkbWluLnVzZXJuYW1lO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LWFkbWluLXRva2VuYCkudmFsdWUgPSBjLmFkbWluLnRva2VuO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJyc7XG4gICAgfSk7XG5cbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH0pO1xuXG4gIC8vIFRvZ2dsZSBwYXNzd29yZCB2aXNpYmlsaXR5ICsgYmFja2Ryb3AgY2xvc2UgKGV2ZW50IGRlbGVnYXRpb24gZm9yIGR5bmFtaWMgZWxlbWVudHMpXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcudG9rZW4tdG9nZ2xlJyk7XG4gICAgaWYgKGJ0bikge1xuICAgICAgY29uc3QgdGFyZ2V0SWQgPSBidG4uZGF0YXNldC50YXJnZXQ7XG4gICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldElkKTtcbiAgICAgIGlmIChpbnB1dC50eXBlID09PSAncGFzc3dvcmQnKSB7XG4gICAgICAgIGlucHV0LnR5cGUgPSAndGV4dCc7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcXHV7MUY2NDh9JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0LnR5cGUgPSAncGFzc3dvcmQnO1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXFx1ezFGNDQxfSc7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlLnRhcmdldC5pZCA9PT0gJ3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnKSB7XG4gICAgICBlLnRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBTYXZlIGNyZWRlbnRpYWxzXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbi1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRuc0lkcyA9IGdldERuc0lkcygpO1xuXG4gICAgLy8gU2F2ZSBhbGwgdG8gbG9jYWxTdG9yYWdlXG4gICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgc2V0VXNlcm5hbWUoZG5zSWQsICdyZWFkb25seScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS11c2VybmFtZWApLnZhbHVlLnRyaW0oKSk7XG4gICAgICBzZXRUb2tlbihkbnNJZCwgJ3JlYWRvbmx5JywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXRva2VuYCkudmFsdWUudHJpbSgpKTtcbiAgICAgIHNldFVzZXJuYW1lKGRuc0lkLCAnYWRtaW4nLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdXNlcm5hbWVgKS52YWx1ZS50cmltKCkpO1xuICAgICAgc2V0VG9rZW4oZG5zSWQsICdhZG1pbicsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi10b2tlbmApLnZhbHVlLnRyaW0oKSk7XG4gICAgfSk7XG5cbiAgICAvLyBCdWlsZCBwZXItc2VydmVyIGNyZWRlbnRpYWxzIHBheWxvYWQgZm9yIGJhY2tlbmQgc3luY1xuICAgIGNvbnN0IHNlcnZlcnMgPSB7fTtcbiAgICBsZXQgaGFzQW55Q3JlZHMgPSBmYWxzZTtcblxuICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0ge307XG4gICAgICBjb25zdCByb1VzZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdXNlcm5hbWVgKS52YWx1ZS50cmltKCk7XG4gICAgICBjb25zdCByb1Bhc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdG9rZW5gKS52YWx1ZS50cmltKCk7XG4gICAgICBjb25zdCBhZG1pblVzZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdXNlcm5hbWVgKS52YWx1ZS50cmltKCk7XG4gICAgICBjb25zdCBhZG1pblBhc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdG9rZW5gKS52YWx1ZS50cmltKCk7XG5cbiAgICAgIGlmIChyb1VzZXIgJiYgcm9QYXNzKSB7XG4gICAgICAgIGVudHJ5LnJlYWRvbmx5ID0geyB1c2VybmFtZTogcm9Vc2VyLCBwYXNzd29yZDogcm9QYXNzIH07XG4gICAgICAgIGhhc0FueUNyZWRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhZG1pblVzZXIgJiYgYWRtaW5QYXNzKSB7XG4gICAgICAgIGVudHJ5LmFkbWluID0geyB1c2VybmFtZTogYWRtaW5Vc2VyLCBwYXNzd29yZDogYWRtaW5QYXNzIH07XG4gICAgICAgIGhhc0FueUNyZWRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3Qua2V5cyhlbnRyeSkubGVuZ3RoID4gMCkge1xuICAgICAgICBzZXJ2ZXJzW2Ruc0lkXSA9IGVudHJ5O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGhhc0FueUNyZWRzKSB7XG4gICAgICBkbnNJZHMuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICAgIGlmIChzZXJ2ZXJzW2Ruc0lkXSkge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICdWZXJpZnlpbmcuLi4nO1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzJztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Rucy9jcmVkZW50aWFscycsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlcnZlcnMgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgIGlmIChkYXRhLnJlc3VsdHMpIHtcbiAgICAgICAgICBkbnNJZHMuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKTtcbiAgICAgICAgICAgIGlmICghc2VydmVyc1tkbnNJZF0pIHsgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgcmV0dXJuOyB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkYXRhLnJlc3VsdHNbZG5zSWRdO1xuICAgICAgICAgICAgaWYgKHJlc3VsdD8uc3VjY2Vzcykge1xuICAgICAgICAgICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdcXHUyNzEzIFZlcmlmaWVkICYgc2F2ZWQnO1xuICAgICAgICAgICAgICBzdGF0dXNFbC5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzIHN1Y2Nlc3MnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQ/LnBhcnRpYWwpIHtcbiAgICAgICAgICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXFx1MjcxMyAnICsgcmVzdWx0LnBhcnRpYWw7XG4gICAgICAgICAgICAgIHN0YXR1c0VsLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMgc3VjY2Vzcyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9ICdcXHUyNzE3ICcgKyAocmVzdWx0Py5lcnJvciB8fCAnTG9naW4gZmFpbGVkJyk7XG4gICAgICAgICAgICAgIHN0YXR1c0VsLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMgZXJyb3InO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgICAgIGlmIChzZXJ2ZXJzW2Ruc0lkXSkge1xuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkudGV4dENvbnRlbnQgPSAnXFx1MjcxMyBTYXZlZCc7XG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzIHN1Y2Nlc3MnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgICAgIGlmIChzZXJ2ZXJzW2Ruc0lkXSkge1xuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkudGV4dENvbnRlbnQgPSAnXFx1MjcxNyAnICsgKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCcpO1xuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkuY2xhc3NOYW1lID0gJ3Rva2VuLXN0YXR1cyBlcnJvcic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN5bmMgRE5TIGNyZWRlbnRpYWxzIHRvIGJhY2tlbmQ6JywgZSk7XG4gICAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgICBpZiAoc2VydmVyc1tkbnNJZF0pIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICdcXHUyNzEzIFNhdmVkIGxvY2FsbHkgKHN5bmMgZmFpbGVkKSc7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkuY2xhc3NOYW1lID0gJ3Rva2VuLXN0YXR1cyc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkudGV4dENvbnRlbnQgPSAnJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEF1dG8tY2xvc2UgYWZ0ZXIgZGVsYXkgaWYgYWxsIHN1Y2NlZWRlZFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgYWxsR29vZCA9IGRuc0lkcy5ldmVyeShkbnNJZCA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKT8udGV4dENvbnRlbnQ7XG4gICAgICAgIHJldHVybiAhc3RhdHVzIHx8IHN0YXR1cy5pbmNsdWRlcygnXFx1MjcxMycpO1xuICAgICAgfSk7XG4gICAgICBpZiAoYWxsR29vZCkgY2xvc2VNb2RhbCgndG9rZW4tbWFuYWdlbWVudC1tb2RhbCcpO1xuICAgIH0sIDE1MDApO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW4tY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNsb3NlTW9kYWwoJ3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuLWNsZWFyLWFsbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlybSgnQ2xlYXIgYWxsIHN0b3JlZCBETlMgY3JlZGVudGlhbHM/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKSkge1xuICAgICAgY2xlYXJBbGxDcmVkZW50aWFscygpO1xuICAgICAgZ2V0RG5zSWRzKCkuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS11c2VybmFtZWApLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS10b2tlbmApLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi11c2VybmFtZWApLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi10b2tlbmApLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICdcXHUyNzEzIENsZWFyZWQnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkuY2xhc3NOYW1lID0gJ3Rva2VuLXN0YXR1cyBzdWNjZXNzJztcbiAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZG5zL2NyZWRlbnRpYWxzJywgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBXaW5kb3cgZXhwb3J0cyBcdTI1MDBcdTI1MDBcbiAgd2luZG93LmdldFRva2VuID0gZ2V0VG9rZW47XG4gIHdpbmRvdy5nZXRVc2VybmFtZSA9IGdldFVzZXJuYW1lO1xuICB3aW5kb3cuc2V0VG9rZW4gPSBzZXRUb2tlbjtcbiAgd2luZG93LnNldFVzZXJuYW1lID0gc2V0VXNlcm5hbWU7XG4gIHdpbmRvdy5nZXRBbGxDcmVkZW50aWFscyA9IGdldEFsbENyZWRlbnRpYWxzO1xuICB3aW5kb3cuZ2V0Q3JlZGVudGlhbCA9IGdldENyZWRlbnRpYWw7XG4gIHdpbmRvdy5zZXRDcmVkZW50aWFsID0gc2V0Q3JlZGVudGlhbDtcbiAgd2luZG93LmdldEVuY3J5cHRpb25LZXkgPSBnZXRFbmNyeXB0aW9uS2V5O1xuICB3aW5kb3cuZ2V0RG5zSWRzID0gZ2V0RG5zSWRzO1xuICB3aW5kb3cuZ2V0RG5zRGlzcGxheU5hbWUgPSBnZXREbnNEaXNwbGF5TmFtZTtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gR1JJRCAmIFNUQVRVUyBIRUxQRVJTID09PT09PT09PT1cbihmdW5jdGlvbiAoKSB7XG5cbiAgZnVuY3Rpb24gc3RhdHVzTGFiZWwodXApIHtcbiAgICBjb25zdCBpMThuID0gd2luZG93LkRDSTE4bjtcbiAgICBpZiAoIWkxOG4gfHwgIWkxOG4uaXNMb2FkZWQoKSkgcmV0dXJuIHVwID8gJ09OJyA6ICdPRkYnO1xuICAgIHJldHVybiBpMThuLnQodXAgPyAnY2FyZC5zdGF0dXMub24nIDogJ2NhcmQuc3RhdHVzLm9mZicpO1xuICB9XG5cbiAgLyogRW5oYW5jZWQgc3RhdHVzIGhlbHBlcnMgd2l0aCByZXNwb25zZSB0aW1lIHRyYWNraW5nICovXG4gIGZ1bmN0aW9uIHNldFF1aWNrKGlkLCB1cCwgcmVzcG9uc2VUaW1lID0gbnVsbCkge1xuICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkICsgJy1kb3QnKTtcbiAgICBjb25zdCBwaWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQgKyAnLXBpbGwnKTtcbiAgICBjb25zdCB0aW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCArICctdGltZScpO1xuICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHA9XCIke2lkfVwiXWApO1xuXG4gICAgaWYgKGRvdCkge1xuICAgICAgZG90LmNsYXNzTGlzdC50b2dnbGUoJ29rJywgdXApO1xuICAgICAgZG90LmNsYXNzTGlzdC50b2dnbGUoJ2JhZCcsICF1cCk7XG4gICAgfVxuXG4gICAgaWYgKHBpbGwpIHtcbiAgICAgIHBpbGwudGV4dENvbnRlbnQgPSBzdGF0dXNMYWJlbCh1cCk7XG4gICAgICBwaWxsLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgdXApO1xuICAgICAgcGlsbC5jbGFzc0xpc3QudG9nZ2xlKCdvZmYnLCAhdXApO1xuICAgIH1cblxuICAgIGlmICh0aW1lRWwgJiYgcmVzcG9uc2VUaW1lICE9PSBudWxsKSB7XG4gICAgICB0aW1lRWwudGV4dENvbnRlbnQgPSB1cCA/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/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXhpdEJhdGNoTW9kZSk7XG59KSgpO1xuIl0sCiAgIm1hcHBpbmdzIjogIkNBS0MsU0FBU0EsRUFBUSxDQUNoQixhQUVBLE1BQU1DLENBQWEsQ0FDakIsYUFBYyxDQUNaLEtBQUssT0FBUyxDQUFDLEVBQ2YsS0FBSyxVQUFZLEVBQ25CLENBUUEsU0FBU0MsRUFBU0MsRUFBT0MsRUFBVyxDQUFDLEVBQUcsQ0FDdEMsTUFBTUMsRUFBYSxDQUNqQixVQUFXLElBQUksS0FBSyxFQUFFLFlBQVksRUFDbEMsUUFBQUgsRUFDQSxRQUFTQyxhQUFpQixNQUFRQSxFQUFNLFFBQVVBLEVBQ2xELE1BQU9BLGFBQWlCLE1BQVFBLEVBQU0sTUFBUSxLQUM5QyxTQUFBQyxDQUNGLEVBR0EsS0FBSyxPQUFPLEtBQUtDLENBQVUsRUFHdkIsS0FBSyxPQUFPLE9BQVMsS0FBSyxXQUM1QixLQUFLLE9BQU8sTUFBTSxFQUlwQixRQUFRLE1BQU0sc0JBQXNCSCxDQUFPLElBQUtDLEVBQU9DLENBQVEsQ0FJakUsQ0FRQSxpQkFBaUJELEVBQU9HLEVBQWEsQ0FHbkMsT0FGa0IsS0FBSyxjQUFjSCxDQUFLLEVBRXZCLENBQ2pCLElBQUssb0JBQ0gsWUFBSyxTQUFTLG9CQUFxQkEsRUFBTyxDQUFFLFlBQUFHLENBQVksQ0FBQyxFQUNsRCxDQUNMLE9BQVEsWUFDUixTQUFVQSxFQUFjLEVBQ3hCLFFBQVMsaURBQ1gsRUFFRixJQUFLLHNCQUNILFlBQUssU0FBUyxzQkFBdUJILENBQUssRUFDbkMsQ0FDTCxPQUFRLHFCQUNSLFFBQVMsb0RBQ1gsRUFFRixJQUFLLG9CQUNILFlBQUssU0FBUyx1QkFBd0JBLENBQUssRUFD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QUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixTQUFVLEVBQ2hkLGlCQUFrQixDQUFFLEdBQUksVUFBVyxHQUFJLFVBQVcsTUFBTyxVQUFXLFdBQVksVUFBVyxZQUFhLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxNQUFPLFVBQVcsYUFBYyxVQUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixTQUFVLEVBQ2hkLGtCQUFrQixDQUFFLEdBQUksVUFBVyxHQUFJLFVBQVcsTUFBTyxVQUFXLFdBQVksVUFBVyxZQUFhLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxNQUFPLFVBQVcsYUFBYyxVQUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixVQUFXLFFBQVMsRUFBSyxFQUMvZCxLQUFrQixDQUFFLEdBQUksVUFBVyxHQUFJLFVBQVcsTUFBTyxVQUFXLFdBQVksVUFBVyxZQUFhLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxNQUFPLFVBQVcsYUFBYyxVQUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixVQUFXLFFBQVMsRUFBSyxFQUMvZCxNQUFrQixDQUFFLEdBQUksVUFB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QTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQTZCN0IsRUFFUCxZQUFZLG9CQUFxQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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ZUUsQ0FBTyxnQkFBaUIsU0FBUyxHQUc3RSxPQUFPLGtCQUFxQixZQUM5QixpQkFBaUIsR0FBR0YsQ0FBVyxLQUFLRSxDQUFPLGVBQWVDLENBQU0sVUFBVyxTQUFTLEVBRXRGLFFBQVEsTUFBTSwwQkFBMkJDLENBQU0sR0FJakQsV0FBVyxJQUFNLENBQ1gsT0FBTyxZQUFlLFlBQVksV0FBVyxDQUNuRCxFQUFHLElBQUksQ0FDVCxDQUVBbkIsR0FBVSxpQkFBaUIsUUFBUyxJQUFNLENBQ3BDSyxFQUNGSyxFQUFjLEVBRWRILEVBQWUsQ0FFbkIsQ0FBQyxFQUVESixHQUFVLGlCQUFpQixRQUFTLElBQU1TLEVBQVksT0FBTyxDQUFDLEVBQzlEUixHQUFTLGlCQUFpQixRQUFTLElBQU1RLEVBQVksTUFBTSxDQUFDLEVBQzVEelAsR0FBWSxpQkFBaUIsUUFBUyxJQUFNeVAsRUFBWSxTQUFTLENBQUMsRUFDbEVySSxHQUFXLGlCQUFpQixRQUFTbUksQ0FBYSxDQUNwRCxHQUFHIiwKICAibmFtZXMiOiBbIndpbmRvdyIsICJFcnJvckhhbmRsZXIiLCAiY29udGV4dCIsICJlcnJvciIsICJtZXRhZGF0YSIsICJlcnJvckVudHJ5IiwgImN1cnJlbnRTdGVwIiwgIm1lc3NhZ2UiLCAic3RhdHMiLCAidHlwZSIsICJmYWxsYmFja01lc3NhZ2UiLCAibWVtb3J5U3RvcmFnZSIsICJrZXkiLCAidmFsdWUiLCAicmF3IiwgInMiLCAiciIsICJjIiwgImsiLCAidiIsICJ0b2tlbnNCdG4iLCAiZWwiLCAidGxkU3VmZml4IiwgInByb3h5SXBJbnB1dCIsICJzdWIiLCAiZG5zSWQiLCAiaWQiLCAiaW5mbyIsICJ0b3BSb3ciLCAiZG5zSWRzIiwgInN2Z0ljb24iLCAiZmlyc3RDaGlsZCIsICJzYWZlSWQiLCAibGFiZWwiLCAiY2FyZCIsICJyZXNwb25zZSIsICJ1cmwiLCAib3B0aW9ucyIsICJtZXRob2QiLCAibmVlZHNDc3JmIiwgInRva2VuIiwgImJvZHkiLCAiZnJlc2hUb2tlbiIsICJkYXRhIiwgInJlc3AiLCAicmVzdWx0IiwgIm1zZyIsICJidG4iLCAibG9hZGluZ1RleHQiLCAiYXN5bmNGbiIsICJvcHRzIiwgIm9yaWdpbmFsIiwgInN1Y2Nlc3NUZXh0IiwgInJlc2V0RGVsYXkiLCAiZSIsICJtb2RhbCIsICJjbG9zZUJ0bnMiLCAidGV4dCIsICJkdXJhdGlvbiIsICJleGlzdGluZ05vdGlmIiwgImNvbG9ycyIsICJ0cyIsICJkaWZmIiwgImZhbGxiYWNrIiwgImh0bWwiLCAiZXZlbnQiLCAiZm4iLCAiX2EiLCAiaCIsICJhcHBzIiwgImFwcCIsICJpZHgiLCAiYSIsICJjaGFuZ2VzIiwgImNyZWF0ZVNrZWxldG9uQ2FyZCIsICJzaG93U2tlbGV0b25zIiwgImNvdW50IiwgImdyaWQiLCAiaSIsICJzayIsICJoaWRlU2tlbGV0b25zIiwgInNrZWxldG9ucyIsICJUSEVNRV9LRVkiLCAiVVNFUl9USEVNRVNfS0VZIiwgIkxFR0FDWV9DVVNUT01fS0VZIiwgIkJVSUxUSU5fVEhFTUVTIiwgIlRIRU1FUyIsICJUSEVNRV9QUk9QUyIsICJCQVNFX1BST1BTIiwgIkRFUklWRURfUFJPUFMiLCAiVEhFTUVfQ09MT1JTIiwgImhleFRvUmdiIiwgImhleCIsICJyZ2JUb0hleCIsICJnIiwgImIiLCAieCIsICJibGVuZENvbG9ycyIsICJoZXgxIiwgImhleDIiLCAicmF0aW8iLCAiYzEiLCAiYzIiLCAiaGV4THVtaW5hbmNlIiwgImRlcml2ZUV4dGVuZGVkQ29sb3JzIiwgImJnIiwgImZnIiwgIm11dGVkIiwgImNhcmRCYXNlIiwgImRvdE9rIiwgImRvdEJhZCIsICJpc0xpZ2h0IiwgImRlcml2ZWQiLCAiZ2VuZXJhdGVCb2R5QmFja2dyb3VuZENTUyIsICJzbHVnIiwgImFjY2VudCIsICJhY2NlbnRSZ2IiLCAiZ2VuZXJhdGVCdXR0b25Ib3ZlckNTUyIsICJnZXRTeXN0ZW1UaGVtZSIsICJjbGVhckN1c3RvbVByb3BlcnRpZXMiLCAicHJvcCIsICJzbHVnaWZ5IiwgIm5hbWUiLCAiY3VycmVudFNsdWciLCAiY2FjaGVkIiwgImJhc2UiLCAiY291bnRlciIsICJpbmplY3RVc2VyVGhlbWVTdHlsZXMiLCAidGhlbWVzRGF0YSIsICJleGlzdGluZyIsICJ1c2VyVGhlbWVzIiwgInNsdWdzIiwgImNzcyIsICJ0aGVtZSIsICJjb2xvck1hcCIsICJwIiwgInN0eWxlIiwgInN5bmNUaGVtZXNGcm9tU2VydmVyIiwgInNlcnZlclRoZW1lcyIsICJjdXJyZW50IiwgImFwcGx5VGhlbWUiLCAibWlncmF0ZUxlZ2FjeUN1c3RvbVRoZW1lIiwgImxlZ2FjeSIsICJ0aGVtZURhdGEiLCAibW9kZSIsICJ0IiwgIm1ldGEiLCAic2F2ZWRUaGVtZSIsICJtZXRob2RzQ2FjaGUiLCAiZmV0Y2hNZXRob2RzIiwgInJlcyIsICJzaG93UHJvdmlkZXJTZWxlY3RvciIsICJwcm92aWRlcnMiLCAib3ZlcmxheSIsICJvcmlnaW5hbEJvZHkiLCAicHJvdmlkZXJCdXR0b25zIiwgInByb3ZpZGVyIiwgInJlbmRlclByb3ZpZGVyQ2hhbGxlbmdlIiwgInJlc3RvcmVPcmlnaW5hbEJvZHkiLCAiaW5wdXQiLCAic3VibWl0IiwgInN0YXR1cyIsICJiYWNrIiwgImVtYWlsIiwgInZpYSIsICJtYXNrZWQiLCAic2hvdyIsICJzaG93VG90cFdpdGhFbWFpbEZhbGxiYWNrIiwgInRvdHBQcm92aWRlciIsICJlbWFpbEVuYWJsZWQiLCAiZGl2IiwgImlzQWxsb3dlZFJldHVyblVybCIsICJyZXR1cm5VcmwiLCAicGFyc2VkIiwgInN1ZmZpeCIsICJidWlsZFNzb0hhbmRvZmZUYXJnZXQiLCAiaXNQcml2YXRlSG9zdCIsICJyZXR1cm5QYXRoIiwgInJlc3VtZUV4aXN0aW5nU2Vzc2lvbiIsICJ0YXJnZXQiLCAidXJsUGFyYW1zIiwgInVwZGF0ZVRvdHBMb2dvIiwgIm0iLCAibHVtIiwgImRhcmsiLCAibGlnaHQiLCAic2hvd1RvdHBPdmVybGF5IiwgImZpcnN0SW5wdXQiLCAiaGlkZVRvdHBPdmVybGF5IiwgInJlZGlyZWN0IiwgImNvbnRhaW5lciIsICJpbnB1dHMiLCAidmFsIiwgImNvZGUiLCAic3VibWl0VG90cENvZGUiLCAicGFzdGVkIiwgImlucCIsICJlcnJvckVsIiwgImhvc3RuYW1lIiwgImlzU2FtZU9yaWdpbiIsICJpc091clRsZCIsICJmZXRjaFJlY292ZXJ5SW5mbyIsICJzaG93UmVjb3ZlcnlMaW5rIiwgImxpbmsiLCAib3BlblJlY292ZXJ5UGFuZWwiLCAicGFuZWwiLCAic3RhdHVzRWwiLCAiaW1wb3J0RWwiLCAidmVyaWZ5RWwiLCAiY2xvc2VSZWNvdmVyeVBhbmVsIiwgInN1Ym1pdFJlY292ZXJ5U2VjcmV0IiwgInNlY3JldCIsICJzdWJtaXRSZWNvdmVyeUNvZGUiLCAiZXJyb3JIYW5kbGVyIiwgImN1cnJlbnRTZXJ2aWNlIiwgImFyclNlcnZpY2VzIiwgInF1YWxpdHlQcm9maWxlU2VydmljZXMiLCAiZ2V0U2VydmljZVVybCIsICJzZXJ2aWNlIiwgInNob3dFcnJvciIsICJoaWRlRXJyb3IiLCAidGl0bGUiLCAiZGVzYyIsICJzZWVkaG9zdFNlY3Rpb24iLCAiYXBpa2V5U2VjdGlvbiIsICJiYXNpY1NlY3Rpb24iLCAicXVhbGl0eVNlY3Rpb24iLCAiaXNFeHQiLCAiaXNBcnIiLCAiaGFzUXVhbGl0eSIsICJxdWFsU2VsZWN0IiwgImxvYWRTZXJ2aWNlQ3JlZHMiLCAiZG90IiwgImNsZWFyQnRuIiwgImhhc0NyZWRzIiwgInN2Y0lkIiwgImxvYWRRdWFsaXR5UHJvZmlsZXMiLCAicXVhbFN0YXR1cyIsICJzdmNVcmwiLCAicGFyYW1zIiwgIm9wdCIsICJtYXRjaDcyMCIsICJhcGlLZXkiLCAic2F2ZUJ0biIsICJ1c2VyIiwgInBhc3MiLCAicXVhbGl0eVByb2ZpbGVJZCIsICJxdWFsaXR5UHJvZmlsZU5hbWUiLCAic2VlZERhdGEiLCAiZCIsICJsb2FkVG90cFNldHRpbmdzIiwgImVuYWJsZWQiLCAic2Vzc2lvbkR1cmF0aW9uIiwgImlzU2V0VXAiLCAic3RhdHVzRG90IiwgInN0YXR1c1RleHQiLCAic3RhdHVzQmFubmVyIiwgInNldHVwU2VjdGlvbiIsICJxclNlY3Rpb24iLCAiZHVyYXRpb25TZWN0aW9uIiwgImRpc2FibGVTZWN0aW9uIiwgInNldHVwQnRuIiwgInVwZGF0ZUF1dGhDYXJkIiwgIkRVUkFUSU9OX0xBQkVMUyIsICJ0cmFuc2xhdGVkIiwgImkxOG4iLCAiYWN0aXZlIiwgInBpbGwiLCAicGF5bG9hZCIsICJibG9iIiwgImVyciIsICJBUEkiLCAiX2VsIiwgInRhZyIsICJhdHRycyIsICJjaGlsZHJlbiIsICJub2RlIiwgIl9mZXRjaEpTT04iLCAiY3NyZiIsICJfcmVuZGVyQmFkZ2UiLCAicm9sZSIsICJfcmVuZGVyVXNlcnNMaXN0IiwgInVzZXJzIiwgIm9uQ2hhbmdlIiwgInRhYmxlIiwgInRib2R5IiwgInUiLCAicm93IiwgImVtYWlsQ2VsbCIsICJyb2xlQ2VsbCIsICJhY3Rpb25zQ2VsbCIsICJyb2xlU2VsZWN0IiwgImV2IiwgImRlbEJ0biIsICJfcmVuZGVySW52aXRlRm9ybSIsICJvbklzc3VlZCIsICJmb3JtIiwgImZkIiwgInJvbGVTZWwiLCAiX3JlbmRlckludml0ZXNMaXN0IiwgImludml0ZXMiLCAiaW52IiwgIl9yZW5kZXJJc3N1ZWRJbnZpdGVCYW5uZXIiLCAiaW52aXRlIiwgInBhcmVudCIsICJiYW5uZXIiLCAiY29weUJ0biIsICJtb3VudCIsICJtZURhdGEiLCAicmVmcmVzaEJ0biIsICJ1c2Vyc0hlYWRlciIsICJ1c2Vyc0xpc3QiLCAidXNlcnNEYXRhIiwgImFkZFVzZXJGb3JtIiwgImludml0ZUZvcm1Db250YWluZXIiLCAiaW52aXRlc0xpc3QiLCAiaW52aXRlc0RhdGEiLCAiaXNzdWVkIiwgIm9wZW4iLCAiYmFja2Ryb3AiLCAiY2xvc2UiLCAiYXR0YWNoVHJpZ2dlciIsICJiYXJDb250YWluZXIiLCAiX21heWJlU2hvdyIsICJtZSIsICJnZXREbnNJZHMiLCAiZ2V0RG5zRGlzcGxheU5hbWUiLCAiYnVpbGRDcmVkZW50aWFsU2VjdGlvbnMiLCAiZ2V0RW5jcnlwdGlvbktleSIsICJvbGRLZXkiLCAiYXJyYXkiLCAiRU5DUllQVElPTl9LRVkiLCAiY3JlZGVudGlhbEVuY3J5cHQiLCAiaXYiLCAiaXZIZXgiLCAia2V5Qnl0ZXMiLCAiY2hhckNvZGUiLCAiY3JlZGVudGlhbERlY3J5cHQiLCAiZW5jcnlwdGVkVGV4dCIsICJkZWNvZGVkIiwgImdldENyZWRlbnRpYWwiLCAidG9rZW5UeXBlIiwgImNyZWRUeXBlIiwgImVuY3J5cHRlZCIsICJzZXRDcmVkZW50aWFsIiwgImdldFRva2VuIiwgImdldFVzZXJuYW1lIiwgInNldFRva2VuIiwgInNldFVzZXJuYW1lIiwgInVzZXJuYW1lIiwgImdldEFsbENyZWRlbnRpYWxzIiwgImNsZWFyQWxsQ3JlZGVudGlhbHMiLCAiZ2V0U3RvcmVkQ3JlZGVudGlhbHMiLCAicmVhZG9ubHlUb2tlbiIsICJyZWFkb25seVVzZXJuYW1lIiwgImFkbWluVG9rZW4iLCAiYWRtaW5Vc2VybmFtZSIsICJvbGRUb2tlbiIsICJvbGRVc2VybmFtZSIsICJjcmVkcyIsICJ0YXJnZXRJZCIsICJzZXJ2ZXJzIiwgImhhc0FueUNyZWRzIiwgImVudHJ5IiwgInJvVXNlciIsICJyb1Bhc3MiLCAiYWRtaW5Vc2VyIiwgImFkbWluUGFzcyIsICJzdGF0dXNMYWJlbCIsICJ1cCIsICJzZXRRdWljayIsICJyZXNwb25zZVRpbWUiLCAidGltZUVsIiwgImdldFJlc3BvbnNlVGltZUNsYXNzIiwgInRpbWUiLCAiaXNVcCIsICJjaGVja1NlcnZpY2VXaXRoVGltaW5nIiwgInN0YXJ0VGltZSIsICJlbmRUaW1lIiwgInJlZnJlc2hJbkZsaWdodCIsICJyZWZyZXNoUXVldWVkIiwgImxvYWRTZXJ2aWNlcyIsICJzZXJ2aWNlVXJsIiwgInN2YyIsICJkbnMiLCAiY2xzIiwgInR4dCIsICJuIiwgImJ1aWxkR3JpZCIsICJyb290IiwgIndyYXAiLCAiaW1nIiwgImFwcElkIiwgImNkblVybHMiLCAidW5pcXVlVXJscyIsICJuZXh0SW5kZXgiLCAibmFtZVNwYW4iLCAidHNCYWRnZSIsICJjYXRJbmZvIiwgImNhdEJhZGdlIiwgInVwZGF0ZUJhZGdlIiwgInJlc3BvbnNlUm93IiwgInRpbWVTcGFuIiwgImhlYWx0aFJvdyIsICJ1cHRpbWVDaGlwIiwgInVwdGltZU1pbmlCYXIiLCAidXB0aW1lRmlsbCIsICJidG5Sb3ciLCAibG9nc0J0biIsICJ1cGRhdGVCdG4iLCAiZXhlY0J0biIsICJjcmVkc0J0biIsICJvcHRCdG4iLCAic2hhcmVCdG4iLCAic2V0QmFkZ2UiLCAicmVmcmVzaEFsbCIsICJ1cGRhdGVTdGFtcCIsICJjaGVja2VkQXQiLCAic3RhbXAiLCAiYXBwbHlCYXRjaFJlc3VsdHMiLCAic3RhdHVzZXMiLCAicmVmcmVzaEZhbGxiYWNrIiwgInRvcENoZWNrcyIsICJ0b3BSZXN1bHRzIiwgImludGVybmV0UmVzdWx0IiwgImJhdGNoRXJyb3IiLCAiZmFsbGJhY2tFcnJvciIsICJvcGVuQnRuIiwgInJlc3RhcnREbnNTZXJ2aWNlIiwgInJlc3RhcnRCdG4iLCAidXBkYXRlRG5zU2VydmVyIiwgInNlcnZlcklwIiwgIm9yaWdpbmFsVGV4dCIsICJjaGVja1Jlc3VsdCIsICJ1cGRhdGVSZXN1bHQiLCAiZG93bmxvYWRJbmZvIiwgImluc3RydWN0aW9uc0luZm8iLCAiY3VycmVudERuc0lkIiwgIm9wZW5EbnNTZXR0aW5ncyIsICJzZXJ2ZXIiLCAic2F2ZURuc1NldHRpbmdzIiwgImlwIiwgInBvcnQiLCAidXBkYXRlIiwgImNsb3NlRG5zU2V0dGluZ3MiLCAicmVtb3ZlRG5zU2VydmVyIiwgImNvbmZpZyIsICJzZXR0aW5nc0J0biIsICJjdXJyZW50RG5zU2VydmljZSIsICJsb2dzSW50ZXJ2YWwiLCAibG9nc1BhdXNlZCIsICJjdXJyZW50Q29udGFpbmVySWQiLCAiY3VycmVudENvbnRhaW5lck5hbWUiLCAiY29udGFpbmVyTG9nc01vZGUiLCAiY3VycmVudExvZ1BhdGgiLCAiY3VycmVudExvZ1NlcnZpY2VOYW1lIiwgImZpbGVMb2dzTW9kZSIsICJsb2dFdmVudFNvdXJjZSIsICJpc1N0cmVhbWluZyIsICJmZXRjaERuc0xvZ3MiLCAibGluZXMiLCAic2VydmVySVAiLCAiZ2V0UmNvZGVDb2xvciIsICJyY29kZSIsICJyZW5kZXJEbnNMb2dFbnRyeSIsICJsb2ciLCAicmNvZGVDb2xvciIsICJpc0Jsb2NrZWQiLCAidXBkYXRlTG9nc0Rpc3BsYXkiLCAidXBkYXRlRmlsZUxvZ3NEaXNwbGF5IiwgInVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5IiwgImxvZ3NDb250ZW50IiwgImxvZ0VsZW1lbnQiLCAib3BlbkxvZ3NNb2RhbCIsICJwYXVzZUJ0biIsICJzdHJlYW1CdG4iLCAiY2xvc2VMb2dzTW9kYWwiLCAic3RvcExvZ1N0cmVhbWluZyIsICJzdGFydExvZ1N0cmVhbWluZyIsICJjb250YWluZXJJZCIsICJpc0Vycm9yIiwgImxldmVsQ29sb3IiLCAibGV2ZWxCYWRnZSIsICJmZXRjaENvbnRhaW5lckxvZ3MiLCAiZW5kcG9pbnQiLCAicmVuZGVyQ29udGFpbmVyTG9nRW50cnkiLCAic3RyZWFtQ29sb3IiLCAic3RyZWFtQmFkZ2UiLCAib3BlbkNvbnRhaW5lckxvZ3NNb2RhbCIsICJjb250YWluZXJOYW1lIiwgImZldGNoRmlsZUxvZ3MiLCAibG9nUGF0aCIsICJyZW5kZXJGaWxlTG9nRW50cnkiLCAibG9nTGV2ZWwiLCAib3BlbkZpbGVMb2dzTW9kYWwiLCAic2VydmljZU5hbWUiLCAibG9hZEV4aXN0aW5nQ0FzIiwgImNhZGR5ZmlsZVBhdGgiLCAic2VsZWN0IiwgImNhIiwgIm9wdGlvbiIsICJnZW5lcmF0ZUNhZGR5Q29uZmlnIiwgInN1YmRvbWFpbiIsICJzc2xUeXBlIiwgImNhTmFtZSIsICJleGlzdGluZ0NhIiwgImVuYWJsZUF1dGgiLCAiZW5hYmxlQ29ycyIsICJjdXN0b21IZWFkZXJzIiwgInVwc3RyZWFtUGF0aCIsICJoZWFsdGhDaGVjayIsICJ0aW1lb3V0IiwgInRhaWxzY2FsZU9ubHkiLCAiY2FkZHlDb25maWciLCAiaGVhZGVycyIsICJjcmVhdGVEbnNSZWNvcmQiLCAidHRsIiwgImRuc1Rva2VuIiwgImRvbWFpbiIsICJlcnJvclRleHQiLCAiYWRkU2VydmljZVRvQ29uZmlnIiwgInNlcnZpY2VDb25maWciLCAibmV3U2VydmljZSIsICJhZGRUb0NhZGR5ZmlsZSIsICJjdXJyZW50RWRpdFNlcnZpY2UiLCAib3BlblNlcnZpY2VFZGl0TW9kYWwiLCAiY2F0ZWdvcnlTZWxlY3QiLCAiY2xvc2VTZXJ2aWNlRWRpdE1vZGFsIiwgInNhdmVTZXJ2aWNlQ2hhbmdlcyIsICJuZXdTdWJkb21haW4iLCAibmV3TmFtZSIsICJuZXdQb3J0IiwgIm5ld0lwIiwgIm5ld0xvZ28iLCAibmV3Q2F0ZWdvcnkiLCAib2xkU3ViZG9tYWluIiwgImFwcEluZGV4IiwgImZpbGUiLCAicmVhZGVyIiwgImRhdGFVcmwiLCAic2hvd0RlbGV0ZU1vZGFsIiwgImhhc0NvbnRhaW5lciIsICJyZXNvbHZlIiwgImNvbnRhaW5lckluZm8iLCAiaGVscCIsICJjYW5jZWxCdG4iLCAicmVtb3ZlQnRuIiwgImRlbGV0ZUJ0biIsICJjbGVhbnVwIiwgImhhbmRsZUNhbmNlbCIsICJoYW5kbGVSZW1vdmUiLCAiaGFuZGxlRGVsZXRlIiwgImhhbmRsZUJhY2tkcm9wIiwgInVwZGF0ZUNvbnRhaW5lciIsICJzZXJ2aWNlSWQiLCAiZGVsZXRlU2VydmljZSIsICJkZWxldGVDb250YWluZXIiLCAicmVzdWx0cyIsICJzZXJ2aWNlSVAiLCAiZG5zUmVzdWx0IiwgImNhZGR5UmVzdWx0IiwgImluZGV4IiwgImN1c3RvbUFwcHMiLCAibG9jYWxJbmRleCIsICJzZXJ2aWNlUmVzdWx0IiwgImhhc0Vycm9ycyIsICJlcnJvck1lc3NhZ2VzIiwgInN1Y2Nlc3NTdGF0ZXMiLCAiaXNTdWNjZXNzIiwgImRlcml2ZVN1YmRvbWFpbiIsICJnZXRTbWFydFNzbERlZmF1bHQiLCAidXBkYXRlU2VydmljZVByZXZpZXciLCAiUVVJQ0tfSVBTIiwgImRuc1ByZXZpZXciLCAidXJsUHJldmlldyIsICJjb25maWdQcmV2aWV3IiwgImRldGVjdE5ldHdvcmtJUHMiLCAibGFuQnRuIiwgInRzQnRuIiwgImlwSW5wdXQiLCAiaW5pdFF1aWNrSVBCdXR0b25zIiwgImN1cnJlbnRJUCIsICJvcGVuQWRkU2VydmljZU1vZGFsIiwgIm1vZGFsQ29udGVudCIsICJzc2xTZWxlY3QiLCAidGFpbHNjYWxlU3RhdHVzIiwgInRhaWxzY2FsZUNoZWNrYm94IiwgInNldHVwU2VydmljZVR5cGVTd2l0Y2hpbmciLCAibG9jYWxSYWRpbyIsICJleHRlcm5hbFJhZGlvIiwgImxvY2FsQ29uZmlnIiwgImV4dGVybmFsQ29uZmlnIiwgInRhYkxvY2FsIiwgInRhYkV4dGVybmFsIiwgInN3aXRjaFNlcnZpY2VUeXBlIiwgInNldHVwQXV0b1N1YmRvbWFpbiIsICJuYW1lSW5wdXQiLCAic3ViZG9tYWluSW5wdXQiLCAic3ViZG9tYWluUHJldmlldyIsICJ1c2VyRWRpdGVkU3ViZG9tYWluIiwgImV4dE5hbWVJbnB1dCIsICJleHRTdWJkb21haW5JbnB1dCIsICJleHRTdWJkb21haW5QcmV2aWV3IiwgImV4dERvbWFpblByZXZpZXciLCAidXNlckVkaXRlZEV4dFN1YmRvbWFpbiIsICJjcmVhdGVFeHRlcm5hbFNlcnZpY2UiLCAiZXh0ZXJuYWxVcmwiLCAibG9nbyIsICJpY29uIiwgImNyZWF0ZURucyIsICJjcmVhdGVDYWRkeSIsICJwcm94eUlwIiwgInByZXNlcnZlSG9zdCIsICJmb2xsb3dSZWRpcmVjdHMiLCAiY2F0ZWdvcnkiLCAiZGVmYXVsdFNlcnZpY2VzIiwgImN1c3RvbVNlcnZpY2VzIiwgImNsb3NlQWRkU2VydmljZU1vZGFsIiwgInBhcnRzIiwgInN1YlByZXYiLCAiZXh0U3ViUHJldiIsICJleHROYW1lIiwgImV4dFN1YiIsICJleHRVcmwiLCAiZXh0TG9nbyIsICJleHRJY29uIiwgImxvY2FsT3B0cyIsICJleHRPcHRzIiwgImNyZWF0ZU5ld1NlcnZpY2UiLCAic3RhdHVzUGFydHMiLCAiZXhpc3RpbmdDYUNvbmZpZyIsICJjdXN0b21DYUNvbmZpZyIsICJidXR0b24iLCAiZG5zQ29uZmlnIiwgImVsZW1lbnQiLCAibG9hZEN1c3RvbVNlcnZpY2VzIiwgImVzIiwgInJlY29ubmVjdERlbGF5IiwgIk1BWF9SRUNPTk5FQ1QiLCAiX3NzZUZhaWxDb3VudCIsICJfc3NlTWFudWFsbHlDbG9zZWQiLCAiY29ubmVjdCIsICJ1cGRhdGVzQnRuIiwgImNsb3NlQW5kU3RvcCIsICJyZXN1bWVBZnRlclJlYXV0aCIsICJzZWFyY2hJbnB1dCIsICJzdGF0dXNTZWxlY3QiLCAiY291bnRTcGFuIiwgImdldENhdGVnb3J5TGlzdCIsICJzZWVuIiwgImZyb21DYXJkcyIsICJjYXQiLCAiYXBpQ2F0cyIsICJyZWZyZXNoQ2F0ZWdvcnlEcm9wZG93biIsICJsaXN0IiwgIm8iLCAidXBkYXRlRmlsdGVyIiwgInF1ZXJ5IiwgInN0YXR1c0ZpbHRlciIsICJjYXRlZ29yeUZpbHRlciIsICJjYXJkcyIsICJ2aXNpYmxlQ291bnQiLCAidG90YWwiLCAiZGVib3VuY2UiLCAiZGVsYXkiLCAiYXJncyIsICJiYXRjaEJ0biIsICJiYXRjaEJhciIsICJiYXRjaENvdW50IiwgInN0YXJ0QnRuIiwgInN0b3BCdG4iLCAiYmF0Y2hNb2RlIiwgInNlbGVjdGVkQ29udGFpbmVycyIsICJlbnRlckJhdGNoTW9kZSIsICJ1cGRhdGVTZWxlY3RlZENvdW50IiwgImNoZWNrYm94IiwgImV4aXRCYXRjaE1vZGUiLCAiY2IiLCAiYmF0Y2hBY3Rpb24iLCAiYWN0aW9uIiwgImNvbnRhaW5lcnMiLCAiYWN0aW9uTGFiZWwiLCAiYnRucyIsICJzdWNjZXNzIiwgImZhaWxlZCIsICJlcnJvcnMiXQp9Cg== + ${v.self?.hostname} (${v.self?.ip}) + `,i.disabled=!1):v.installed?(o.innerHTML='\u26A0 Not connected',i.disabled=!0):(o.innerHTML='Not available',i.disabled=!0)}catch{o.innerHTML='Could not check',i.disabled=!0}i.checked=!1,m()}function u(){const t=document.getElementById("service-type-local"),e=document.getElementById("service-type-external"),n=document.getElementById("local-service-config"),p=document.getElementById("external-service-config"),o=document.getElementById("tab-local"),i=document.getElementById("tab-external");function c(){t.checked?(n.style.display="grid",p.style.display="none",o&&(o.style.background="var(--accent)",o.style.color="var(--bg)"),i&&(i.style.background="transparent",i.style.color="var(--muted)")):(n.style.display="none",p.style.display="block",i&&(i.style.background="var(--accent)",i.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 p=!1;t?.addEventListener("input",()=>{const k=l(t.value);!p&&e&&(e.value=k),n&&(n.textContent=k?`\u2192 ${buildDomain(k)}`:""),m()}),e?.addEventListener("input",()=>{p=e.value!==l(t?.value||"");const k=e.value.trim()||l(t?.value||"");n&&(n.textContent=k?`\u2192 ${buildDomain(k)}`:""),m()});const o=document.getElementById("external-service-name"),i=document.getElementById("external-service-subdomain"),c=document.getElementById("external-subdomain-preview"),v=document.getElementById("external-domain-preview");let S=!1;o?.addEventListener("input",()=>{const k=l(o.value);!S&&i&&(i.value=k);const L=i?.value||k;c&&(c.textContent=L?`\u2192 ${buildDomain(L)}`:""),v&&(v.textContent=L?buildDomain(L):"")}),i?.addEventListener("input",()=>{S=i.value!==l(o?.value||"");const k=i.value.trim()||l(o?.value||"");c&&(c.textContent=k?`\u2192 ${buildDomain(k)}`:""),v&&(v.textContent=k?buildDomain(k):"")})}async function s(){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(),p=document.getElementById("external-service-logo").value.trim(),o=document.getElementById("external-service-icon").value.trim(),i=document.getElementById("external-create-dns").checked,c=document.getElementById("external-create-caddy").checked,v=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(i)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:v,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:p||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(),f();const T=[`External service "${t}" added!`];i&&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 f(){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 p=document.getElementById("external-service-subdomain");p&&(p.value="");const o=document.getElementById("external-service-url");o&&(o.value="");const i=document.getElementById("external-service-logo");i&&(i.value="");const c=document.getElementById("external-service-icon");c&&(c.value="");const v=document.getElementById("local-advanced-options");v&&v.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(),p=document.getElementById("service-ip-input").value.trim(),o=document.getElementById("service-logo-input").value.trim(),i=document.getElementById("create-dns-record").checked,c=parseInt(document.getElementById("dns-ttl-input").value)||DC.DEFAULTS.TTL,v=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||!p){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(i&&!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(i)try{await window.createDnsRecord(e,p,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:p,sslType:S,caName:k,existingCa:L,enableAuth:x,enableCors:B,customHeaders:A,upstreamPath:E,healthCheck:C,timeout:T,tailscaleOnly:v});try{const U=await(await secureFetch("/api/v1/site",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:buildDomain(e),upstream:`${p}:${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:p,logo:o||`/assets/${e}.png`,tailscaleOnly:v||!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)}${v?" (Tailscale)":""}`,"success",6e3),f(),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",y),document.getElementById("add-service-cancel")?.addEventListener("click",f),document.getElementById("add-service-create")?.addEventListener("click",()=>{document.querySelector('input[name="service-type"]:checked')?.value==="external"?s():w()}),u(),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"),m()}),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",m),e.addEventListener("change",m))});function r(){const t=safeGet("custom-services");if(t)try{JSON.parse(t).forEach(n=>{window.APPS.find(p=>p.id===n.id)||window.APPS.push(n)})}catch(e){console.warn("Failed to load custom services:",e)}}r(),window.openAddServiceModal=y,window.closeAddServiceModal=f})(),(function(){let l=null,a=1e3;const m=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 s=JSON.parse(d.data);if(s.serviceId&&typeof window.setBadge=="function"){const f=s.status==="up"||s.status==="healthy";window.setBadge(s.serviceId,f,s.responseTime||null)}}catch{}}),l.addEventListener("resource-alert",d=>{try{const s=JSON.parse(d.data),f=`${s.containerName||s.containerId}: ${s.metric} at ${s.value}% (threshold: ${s.threshold}%)`;typeof showNotification=="function"&&showNotification(f,"warning")}catch{}}),l.addEventListener("auto-restart",d=>{try{const s=JSON.parse(d.data);typeof showNotification=="function"&&showNotification(`Container "${s.containerName}" was auto-restarted`,"info")}catch{}}),l.addEventListener("update-available",d=>{try{const s=JSON.parse(d.data),f=document.getElementById("updates-btn");if(f&&!f.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;",f.appendChild(w)}typeof showNotification=="function"&&showNotification(`Update available for ${s.containerName||s.containerId}`,"info")}catch{}}),l.addEventListener("update-complete",d=>{try{const s=JSON.parse(d.data);typeof showNotification=="function"&&showNotification(`Update completed: ${s.containerName||s.containerId}`,"success"),typeof window.refreshAll=="function"&&window.refreshAll()}catch{}}),l.addEventListener("update-failed",d=>{try{const s=JSON.parse(d.data);typeof showNotification=="function"&&showNotification(`Update failed: ${s.containerName||s.containerId} \u2014 ${s.error||"unknown error"}`,"error")}catch{}}),l.addEventListener("incident",d=>{try{const s=JSON.parse(d.data);typeof showNotification=="function"&&(s.type==="created"?showNotification(`Incident: ${s.message||s.serviceId}`,"error"):s.type==="resolved"&&showNotification(`Resolved: ${s.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,m)})}function y(){if(b=!0,l)try{l.close()}catch{}}function u(){b=!1,h=0,a=1e3,g()}g(),window._sseReconnect=g,window._sseClose=y,window._sseResume=u})(),(function(){const l=document.getElementById("service-filter-search"),a=document.getElementById("service-filter-status"),m=document.getElementById("service-filter-category"),h=document.getElementById("service-filter-count");function b(){const d=new Set,s=new Set;document.querySelectorAll("#cards .card[data-category]").forEach(r=>{const t=r.dataset.category.trim();t&&s.add(t)});const f=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES||{};return Object.keys(f).concat([...s].filter(r=>!f[r])).forEach(r=>d.add(r)),{list:[...d],apiCats:f}}function g(){if(!m)return;const{list:d,apiCats:s}=b(),f=m.value;m.innerHTML='',d.sort().forEach(w=>{const r=s[w],t=document.createElement("option");t.value=w,t.textContent=r?`${r.icon||""} ${w}`.trim():w,m.appendChild(t)}),f&&[...m.options].some(w=>w.value===f)?m.value=f:m.value="all"}function y(){g();const d=l.value.toLowerCase().trim(),s=a.value,f=m?m.value:"all",w=document.querySelectorAll("#cards .card");let r=0;if(w.forEach(t=>{const e=t.querySelector(".name")?.textContent?.toLowerCase()||"",n=t.dataset.app?.toLowerCase()||"",p=t.dataset.status||"off",o=t.dataset.category||"";(!d||e.includes(d)||n.includes(d))&&(s==="all"||p===s)&&(f==="all"||o===f)?(t.style.display="",r++):t.style.display="none"}),h){const t=w.length;h.textContent=`${r} of ${t} services`}}function u(d,s){let f;return function(...w){clearTimeout(f),f=setTimeout(()=>d.apply(this,w),s)}}l?.addEventListener("input",u(y,200)),a?.addEventListener("change",y),m?.addEventListener("change",y),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>setTimeout(y,500)):setTimeout(y,500),window.refreshServiceFilter=y,window.refreshCategoryDropdown=g})(),(function(){const l=document.getElementById("batch-operations-btn"),a=document.getElementById("batch-action-bar"),m=document.getElementById("batch-selected-count"),h=document.getElementById("batch-start-btn"),b=document.getElementById("batch-stop-btn"),g=document.getElementById("batch-restart-btn"),y=document.getElementById("batch-cancel-btn");let u=!1,d=new Set;function s(){u=!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 p=e.querySelector(".batch-checkbox");p&&p.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",i=>{i.stopPropagation(),o.checked?d.add(n):d.delete(n),w()}),e.style.position="relative",e.insertBefore(o,e.firstChild)})}function f(){u=!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;m.textContent=`${t} selected`,h.disabled=t===0,b.disabled=t===0,g.disabled=t===0}async function r(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 p=[h,b,g];p.forEach(v=>{v.disabled=!0,v.textContent="..."});let o=0,i=0;const c=[];for(const v of e)try{const S=await fetch(`/api/v1/containers/${encodeURIComponent(v)}/${t}`,{method:"POST"});if(S.ok)o++;else{i++;const k=await S.json().catch(()=>({}));c.push(`${v}: ${k.error||S.statusText}`)}}catch(S){i++,c.push(`${v}: ${S.message}`)}p[0].textContent="\u25B6 Start All",p[1].textContent="\u2B1B Stop All",p[2].textContent="\u{1F504} Restart All",w(),i===0?typeof showNotification=="function"&&showNotification(`${n} completed: ${o} container(s)`,"success"):(typeof showNotification=="function"&&showNotification(`${n}: ${o} succeeded, ${i} failed`,"warning"),console.error("Batch operation errors:",c)),setTimeout(()=>{typeof refreshAll=="function"&&refreshAll()},1500)}l?.addEventListener("click",()=>{u?f():s()}),h?.addEventListener("click",()=>r("start")),b?.addEventListener("click",()=>r("stop")),g?.addEventListener("click",()=>r("restart")),y?.addEventListener("click",f)})(); +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBFcnJvciBIYW5kbGVyXG4gKiBIYW5kbGVzIGVycm9ycyBncmFjZWZ1bGx5IHdpdGhvdXQgYnJlYWtpbmcgdGhlIG9uYm9hcmRpbmcgdG91clxuICovXG5cbihmdW5jdGlvbih3aW5kb3cpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIEVycm9ySGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgdGhpcy5tYXhFcnJvcnMgPSA1MDsgLy8gS2VlcCBsYXN0IDUwIGVycm9yc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhbiBlcnJvciB3aXRob3V0IGJyZWFraW5nIHRoZSB0b3VyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHQgLSBDb250ZXh0IHdoZXJlIGVycm9yIG9jY3VycmVkXG4gICAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1ldGFkYXRhIC0gQWRkaXRpb25hbCBtZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ0Vycm9yKGNvbnRleHQsIGVycm9yLCBtZXRhZGF0YSA9IHt9KSB7XG4gICAgICBjb25zdCBlcnJvckVudHJ5ID0ge1xuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IG51bGwsXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgdG8gZXJyb3JzIGFycmF5XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yRW50cnkpO1xuXG4gICAgICAvLyBLZWVwIG9ubHkgbGFzdCBtYXhFcnJvcnNcbiAgICAgIGlmICh0aGlzLmVycm9ycy5sZW5ndGggPiB0aGlzLm1heEVycm9ycykge1xuICAgICAgICB0aGlzLmVycm9ycy5zaGlmdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgdG8gY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihgW09uYm9hcmRpbmcgRXJyb3JdICR7Y29udGV4dH06YCwgZXJyb3IsIG1ldGFkYXRhKTtcblxuICAgICAgLy8gT3B0aW9uYWxseSBzZW5kIHRvIGVycm9yIHRyYWNraW5nIHNlcnZpY2VcbiAgICAgIC8vIHRoaXMuc2VuZFRvRXJyb3JUcmFja2luZyhlcnJvckVudHJ5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBhbiBlcnJvciBhbmQgY29udGludWUgdG91clxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RlcCAtIEN1cnJlbnQgc3RlcCBpbmRleFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJlY292ZXJ5IGFjdGlvblxuICAgICAqL1xuICAgIHJlY292ZXJGcm9tRXJyb3IoZXJyb3IsIGN1cnJlbnRTdGVwKSB7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSB0aGlzLmNsYXNzaWZ5RXJyb3IoZXJyb3IpO1xuXG4gICAgICBzd2l0Y2ggKGVycm9yVHlwZSkge1xuICAgICAgICBjYXNlICdFTEVNRU5UX05PVF9GT1VORCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignRWxlbWVudCBOb3QgRm91bmQnLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICAgIGFjdGlvbjogJ1NLSVBfU1RFUCcsIFxuICAgICAgICAgICAgbmV4dFN0ZXA6IGN1cnJlbnRTdGVwICsgMSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUYXJnZXQgZWxlbWVudCBub3QgZm91bmQsIHNraXBwaW5nIHRvIG5leHQgc3RlcCdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ1NUT1JBR0VfVU5BVkFJTEFCTEUnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICBhY3Rpb246ICdVU0VfTUVNT1JZX1NUT1JBR0UnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0xvY2FsIHN0b3JhZ2UgdW5hdmFpbGFibGUsIHVzaW5nIGluLW1lbW9yeSBzdG9yYWdlJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnRFJJVkVSX05PVF9MT0FERUQnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ0RyaXZlci5qcyBOb3QgTG9hZGVkJywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdEcml2ZXIuanMgbGlicmFyeSBub3QgbG9hZGVkLCBjYW5ub3Qgc3RhcnQgdG91cidcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ0lOVkFMSURfVE9PTFRJUCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignSW52YWxpZCBUb29sdGlwIENvbmZpZ3VyYXRpb24nLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnU0tJUF9TVEVQJyxcbiAgICAgICAgICAgIG5leHRTdGVwOiBjdXJyZW50U3RlcCArIDEsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB0b29sdGlwIGNvbmZpZ3VyYXRpb24sIHNraXBwaW5nJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVGhlbWUgRGV0ZWN0aW9uIEZhaWxlZCcsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnVVNFX0RFRkFVTFRfVEhFTUUnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1VzaW5nIGRlZmF1bHQgZGFyayB0aGVtZSdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVW5rbm93biBFcnJvcicsIGVycm9yLCB7IGN1cnJlbnRTdGVwIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLCBhYm9ydGluZyB0b3VyJ1xuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xhc3NpZnkgZXJyb3IgdHlwZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBUaGUgZXJyb3Igb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ30gRXJyb3IgdHlwZVxuICAgICAqL1xuICAgIGNsYXNzaWZ5RXJyb3IoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8IGVycm9yLnRvU3RyaW5nKCk7XG5cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdlbGVtZW50JykgJiYgbWVzc2FnZS5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgcmV0dXJuICdFTEVNRU5UX05PVF9GT1VORCc7XG4gICAgICB9XG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcygnc3RvcmFnZScpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ3F1b3RhJykpIHtcbiAgICAgICAgcmV0dXJuICdTVE9SQUdFX1VOQVZBSUxBQkxFJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdkcml2ZXInKSB8fCBtZXNzYWdlLmluY2x1ZGVzKCd1bmRlZmluZWQnKSkge1xuICAgICAgICByZXR1cm4gJ0RSSVZFUl9OT1RfTE9BREVEJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkJykgfHwgbWVzc2FnZS5pbmNsdWRlcygndmFsaWRhdGlvbicpKSB7XG4gICAgICAgIHJldHVybiAnSU5WQUxJRF9UT09MVElQJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCd0aGVtZScpKSB7XG4gICAgICAgIHJldHVybiAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnVU5LTk9XTic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBsb2dnZWQgZXJyb3JzXG4gICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvZiBlcnJvciBlbnRyaWVzXG4gICAgICovXG4gICAgZ2V0RXJyb3JzKCkge1xuICAgICAgcmV0dXJuIFsuLi50aGlzLmVycm9yc107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIGxvZ2dlZCBlcnJvcnNcbiAgICAgKi9cbiAgICBjbGVhckVycm9ycygpIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGVycm9yIHN0YXRpc3RpY3NcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBFcnJvciBzdGF0aXN0aWNzXG4gICAgICovXG4gICAgZ2V0U3RhdGlzdGljcygpIHtcbiAgICAgIGNvbnN0IHN0YXRzID0ge1xuICAgICAgICB0b3RhbDogdGhpcy5lcnJvcnMubGVuZ3RoLFxuICAgICAgICBieUNvbnRleHQ6IHt9LFxuICAgICAgICBieVR5cGU6IHt9LFxuICAgICAgICByZWNlbnQ6IHRoaXMuZXJyb3JzLnNsaWNlKC0xMClcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZXJyb3JzLmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICAvLyBDb3VudCBieSBjb250ZXh0XG4gICAgICAgIHN0YXRzLmJ5Q29udGV4dFtlcnJvci5jb250ZXh0XSA9IChzdGF0cy5ieUNvbnRleHRbZXJyb3IuY29udGV4dF0gfHwgMCkgKyAxO1xuXG4gICAgICAgIC8vIENvdW50IGJ5IHR5cGVcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY2xhc3NpZnlFcnJvcih7IG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICAgIHN0YXRzLmJ5VHlwZVt0eXBlXSA9IChzdGF0cy5ieVR5cGVbdHlwZV0gfHwgMCkgKyAxO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzdGF0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZ3JhY2VmdWwgZGVncmFkYXRpb24gd2hlbiBEcml2ZXIuanMgZmFpbHMgdG8gbG9hZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGZhbGxiYWNrIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgaGFuZGxlRHJpdmVyTG9hZEZhaWx1cmUoKSB7XG4gICAgICB0aGlzLmxvZ0Vycm9yKCdEcml2ZXIuanMgTG9hZCBGYWlsdXJlJywgJ0RyaXZlci5qcyBsaWJyYXJ5IGZhaWxlZCB0byBsb2FkJyk7XG5cbiAgICAgIC8vIFNob3cgZmFsbGJhY2sgbWVzc2FnZVxuICAgICAgY29uc3QgZmFsbGJhY2tNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaWQgPSAnb25ib2FyZGluZy1mYWxsYmFjayc7XG4gICAgICBmYWxsYmFja01lc3NhZ2Uuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBib3R0b206IDIwcHg7XG4gICAgICAgIHJpZ2h0OiAyMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMyYTJhMmEpO1xuICAgICAgICBjb2xvcjogdmFyKC0tZmcsICNmZmZmZmYpO1xuICAgICAgICBwYWRkaW5nOiAxNXB4IDIwcHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMyk7XG4gICAgICAgIHotaW5kZXg6IDk5OTk7XG4gICAgICAgIG1heC13aWR0aDogMzAwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIGA7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaW5uZXJIVE1MID0gYFxuICAgICAgICA8c3Ryb25nPldlbGNvbWUgdG8gRGFzaENhZGR5ITwvc3Ryb25nPjxicj5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDEwcHggMCAwIDA7IGZvbnQtc2l6ZTogMTJweDtcIj5cbiAgICAgICAgICBUaGUgaW50ZXJhY3RpdmUgdG91ciBpcyB1bmF2YWlsYWJsZSwgYnV0IHlvdSBjYW4gZXhwbG9yZSB0aGUgZGFzaGJvYXJkIGZyZWVseS5cbiAgICAgICAgICBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgaGVscCBnZXR0aW5nIHN0YXJ0ZWQuXG4gICAgICAgIDwvcD5cbiAgICAgIGA7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZmFsbGJhY2tNZXNzYWdlKTtcblxuICAgICAgLy8gQXV0by1yZW1vdmUgYWZ0ZXIgMTAgc2Vjb25kc1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChmYWxsYmFja01lc3NhZ2UucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGZhbGxiYWNrTWVzc2FnZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZhbGxiYWNrTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIDEwMDAwKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHN0b3JhZ2UgdW5hdmFpbGFibGUgc2NlbmFyaW9cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBJbi1tZW1vcnkgc3RvcmFnZSBmYWxsYmFja1xuICAgICAqL1xuICAgIGhhbmRsZVN0b3JhZ2VVbmF2YWlsYWJsZSgpIHtcbiAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCAnTG9jYWwgc3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlJyk7XG5cbiAgICAgIC8vIENyZWF0ZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgICAgY29uc3QgbWVtb3J5U3RvcmFnZSA9IHtcbiAgICAgICAgZGF0YToge30sXG4gICAgICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuZGF0YVtrZXldO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhcigpIHtcbiAgICAgICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc29sZS53YXJuKCdbRXJyb3JIYW5kbGVyXSBVc2luZyBpbi1tZW1vcnkgc3RvcmFnZSAtIHByb2dyZXNzIHdpbGwgbm90IHBlcnNpc3QnKTtcbiAgICAgIHJldHVybiBtZW1vcnlTdG9yYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgZXJyb3IgdG8gdHJhY2tpbmcgc2VydmljZSAocGxhY2Vob2xkZXIpXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JFbnRyeSAtIEVycm9yIGVudHJ5IHRvIHNlbmRcbiAgICAgKi9cbiAgICBzZW5kVG9FcnJvclRyYWNraW5nKGVycm9yRW50cnkpIHtcbiAgICAgIC8vIFBsYWNlaG9sZGVyIGZvciBlcnJvciB0cmFja2luZyBpbnRlZ3JhdGlvblxuICAgICAgLy8gQ291bGQgaW50ZWdyYXRlIHdpdGggU2VudHJ5LCBMb2dSb2NrZXQsIGV0Yy5cbiAgICAgIC8vIEV4YW1wbGU6XG4gICAgICAvLyBpZiAod2luZG93LlNlbnRyeSkge1xuICAgICAgLy8gICBTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihuZXcgRXJyb3IoZXJyb3JFbnRyeS5tZXNzYWdlKSwge1xuICAgICAgLy8gICAgIGV4dHJhOiBlcnJvckVudHJ5Lm1ldGFkYXRhXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIHdpbmRvdy5FcnJvckhhbmRsZXIgPSBFcnJvckhhbmRsZXI7XG4gIGNvbnNvbGUubG9nKCdbRXJyb3JIYW5kbGVyXSBNb2R1bGUgbG9hZGVkJyk7XG5cbn0pKHdpbmRvdyk7XG47XG4vLyA9PT09PSBEQVNIQk9BUkQgQ09OU1RBTlRTID09PT09XG4vLyBIb25vciBwZXJzaXN0ZWQgaGVhbHRoIHJldGVudGlvbiBzZXR0aW5ncyBmb3IgcG9sbGluZyBjYWRlbmNlcyBzbyB0aGVcbi8vIFNldHRpbmdzIFx1MjE5MiBIZWFsdGggXHUyMTkyIEdsb2JhbCBTZXR0aW5ncyBwYW5lbCBhY3R1YWxseSB0YWtlcyBlZmZlY3QuIFRoZVxuLy8gU1RBVFMgaW50ZXJ2YWwgKHJlc291cmNlL2NvbnRhaW5lciBzdGF0IHNhbXBsaW5nKSBpcyBkcml2ZW4gZnJvbSB0aGVcbi8vIHVzZXItY29uZmlndXJhYmxlIHN0YXRzUG9sbGluZ0ludGVydmFsLiBIRUFMVEggaXMgdGhlIGxpZ2h0d2VpZ2h0IGNhcmRcbi8vIGJhZGdlIHJlZnJlc2ggYW5kIHN0YXlzIGF0IGl0cyBmYXN0IGRlZmF1bHQgdW5sZXNzIG92ZXJyaWRkZW4uXG4oZnVuY3Rpb24gYXBwbHlIZWFsdGhQb2xsaW5nU2V0dGluZ3MoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHJhdyA9ICh0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJyAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaGNhZGR5LWhlYWx0aC1zZXR0aW5ncycpKSB8fCBudWxsO1xuICAgIGlmIChyYXcpIHtcbiAgICAgIHZhciBzID0gSlNPTi5wYXJzZShyYXcpO1xuICAgICAgLy8gdmFsdWVzIGFyZSBzdG9yZWQgaW4gc2Vjb25kczsgREMuUE9MTCBleHBlY3RzIG1pbGxpc2Vjb25kc1xuICAgICAgaWYgKHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgJiYgcy5zdGF0c1BvbGxpbmdJbnRlcnZhbCA+PSA1ICYmIHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgPD0gMzYwMCkge1xuICAgICAgICB3aW5kb3cuX19EQ19TVEFUU19PVkVSUklERSA9IHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwgKiAxMDAwO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgXHUyMDE0IGZhbGwgYmFjayB0byBkZWZhdWx0cyBiZWxvdyAqLyB9XG59KSgpO1xuXG5jb25zdCBEQyA9IHtcbiAgTkFNRTogJ0Rhc2hDYWRkeScsXG4gIFBPTEw6IHtcbiAgICBEQVNIQk9BUkQ6ICAxMDAwMCwgICAvLyAxMHMgXHUyMDE0IG1haW4gcmVmcmVzaEFsbCBpbnRlcnZhbFxuICAgIExPR1M6ICAgICAgIDMwMDAsICAgIC8vIDNzICBcdTIwMTQgbG9nIHZpZXdlciB1cGRhdGVzXG4gICAgU1RBVFM6ICAgICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5fX0RDX1NUQVRTX09WRVJSSURFKSB8fCA1MDAwLCAgIC8vIDVzIGRlZmF1bHQgXHUyMDE0IHJlc291cmNlIG1vbml0b3IgcmVmcmVzaCAob3ZlcnJpZGFibGUgdmlhIFNldHRpbmdzIFx1MjE5MiBIZWFsdGgpXG4gICAgV0VBVEhFUjogICAgNjAwMDAwLCAgLy8gMTBtIFx1MjAxNCB3ZWF0aGVyIHdpZGdldCByZWZyZXNoXG4gICAgSEVBTFRIOiAgICAgMTAwMCwgICAgLy8gMXMgIFx1MjAxNCBjYXJkIGhlYWx0aCBiYWRnZSByZWZyZXNoXG4gICAgREVQTE9ZX1NTTDogNTAwMCwgICAgLy8gNXMgIFx1MjAxNCBTU0wgY2VydCBjaGVjayBkdXJpbmcgZGVwbG95XG4gIH0sXG4gIERFTEFZUzoge1xuICAgIEJUTl9SRVNFVDogIDIwMDAsICAgIC8vIEJ1dHRvbiB0ZXh0IHJlc2V0IGFmdGVyIGFjdGlvblxuICAgIFJFTE9BRDogICAgIDUwMDAsICAgIC8vIFBhZ2UgcmVsb2FkIGFmdGVyIHJlc3RhcnRcbiAgICBNT0RBTF9DTE9TRTogNTAwLCAgICAvLyBNb2RhbCBjbG9zZSBhbmltYXRpb25cbiAgICBQT1JUX0NIRUNLOiA1MDAsICAgICAvLyBEZWJvdW5jZSBmb3IgcG9ydCBhdmFpbGFiaWxpdHkgY2hlY2tcbiAgICBERVBMT1lfSU5JVDogMzAwMCwgICAvLyBJbml0aWFsIGRlcGxveSBjZXJ0IGNoZWNrIGRlbGF5XG4gIH0sXG4gIERFRkFVTFRTOiB7XG4gICAgRE5TX1BPUlQ6ICAgICc1MzgwJyxcbiAgICBTRVJWSUNFX1BPUlQ6ICc4MDgwJyxcbiAgICBUVEw6ICAgICAgICAgMzAwLFxuICAgIENBRERZRklMRTogICAnQzpcXFxcY2FkZHlcXFxcQ2FkZHlmaWxlJyxcbiAgfSxcbn07XG5cbi8vIEVycm9yIGhhbmRsZXIgZm9yIHRyYWNraW5nIGlzc3Vlc1xuY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuXG4vLyA9PT09PSBHTE9CQUwgU0lURSBDT05GSUcgKGxvYWRlZCBmcm9tIHNlcnZlciwgY2FjaGVkIGluIGxvY2FsU3RvcmFnZSkgPT09PT1cbi8vIE9ubHkgbm9uLXNlbnNpdGl2ZSBkaXNwbGF5IHByZWZlcmVuY2VzIGFyZSBjYWNoZWQ7IEROUyBJUHMvdG9wb2xvZ3kgYXJlIGZldGNoZWQgZnJvbSBBUElcbmNvbnN0IF9jYWNoZWRDZmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkYXNoY2FkZHlfc2l0ZV9jb25maWcnKSB8fCAnbnVsbCcpO1xuY29uc3QgU0lURSA9IHtcbiAgdGxkOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLnRsZCkgfHwgJy5ob21lJyxcbiAgZG5zSXA6ICcnLFxuICBkbnNQb3J0OiBEQy5ERUZBVUxUUy5ETlNfUE9SVCxcbiAgZG5zU2VydmVyczoge30sXG4gIGNvbmZpZ3VyYXRpb25UeXBlOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLmNvbmZpZ3VyYXRpb25UeXBlKSB8fCAnaG9tZWxhYicsXG4gIGRvbWFpbjogKF9jYWNoZWRDZmcgJiYgX2NhY2hlZENmZy5kb21haW4pIHx8ICcnLFxuICBkZWZhdWx0czogKF9jYWNoZWRDZmcgJiYgX2NhY2hlZENmZy5kZWZhdWx0cykgfHwge30sXG4gIHJvdXRpbmdNb2RlOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLnJvdXRpbmdNb2RlKSB8fCAnc3ViZG9tYWluJyxcbiAgb25ib2FyZGluZ0NvbXBsZXRlZDogZmFsc2Vcbn07XG53aW5kb3cuX19kYXNoY2FkZHlTaXRlQ29uZmlnTG9hZGVkID0gKGFzeW5jIGZ1bmN0aW9uIGxvYWRTaXRlQ29uZmlnKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICBpZiAoci5vaykge1xuICAgICAgY29uc3QgYyA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKGMudGxkKSBTSVRFLnRsZCA9IGMudGxkLnN0YXJ0c1dpdGgoJy4nKSA/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+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gKHAuY29uZmlnICYmIChwLmNvbmZpZy5sYWJlbCB8fCBwLm5hbWUpKSB8fCBwLm5hbWU7XG4gICAgICBjb25zdCBidG4gPSBgPGJ1dHRvbiBjbGFzcz1cInByb3ZpZGVyLWJ0blwiIGRhdGEtcHJvdmlkZXI9XCIke3AubmFtZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbjogNnB4IDRweDsgcGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogd2hpdGU7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cbiAgICAgICAgU2lnbiBpbiB3aXRoICR7bGFiZWx9XG4gICAgICA8L2J1dHRvbj5gO1xuICAgICAgcmV0dXJuIGJ0bjtcbiAgICB9KS5qb2luKCdcXG4nKTtcblxuICAgIGNhcmQuaW5uZXJIVE1MID0gYFxuICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tZGFya1wiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tZGFyay5wbmdcIiBhbHQ9XCJEYXNoQ2FkZHlcIiBvbmVycm9yPVwidGhpcy5zdHlsZS5kaXNwbGF5PSdub25lJ1wiPlxuICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tbGlnaHRcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZ1wiIGFsdD1cIkRhc2hDYWRkeVwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XG4gICAgICA8cCBjbGFzcz1cInN1YnRpdGxlXCI+Q2hvb3NlIGhvdyB0byBzaWduIGluPC9wPlxuICAgICAgPGRpdiBpZD1cImF1dGgtZ2F0ZS1wcm92aWRlcnNcIiBzdHlsZT1cIm1hcmdpbjogMTRweCAwIDEwcHg7XCI+JHtwcm92aWRlckJ1dHRvbnN9PC9kaXY+XG4gICAgICA8ZGl2IGlkPVwiYXV0aC1nYXRlLW1lc3NhZ2VcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+PC9kaXY+XG4gICAgYDtcblxuICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuXG4gICAgLy8gV2lyZSBlYWNoIGJ1dHRvblxuICAgIGNhcmQucXVlcnlTZWxlY3RvckFsbCgnLnByb3ZpZGVyLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGJ0bi5kYXRhc2V0LnByb3ZpZGVyO1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IHByb3ZpZGVycy5maW5kKHAgPT4gcC5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgcmVuZGVyUHJvdmlkZXJDaGFsbGVuZ2UocHJvdmlkZXIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXN0b3JlT3JpZ2luYWxCb2R5KCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignLnRvdHAtY2FyZCcpO1xuICAgIGlmICghY2FyZCB8fCAhY2FyZC5kYXRhc2V0Lm9yaWdpbmFsQm9keSkgcmV0dXJuO1xuICAgIGNhcmQuaW5uZXJIVE1MID0gY2FyZC5kYXRhc2V0Lm9yaWdpbmFsQm9keTtcbiAgICAvLyBSZS1iaW5kIHRoZSBvcmlnaW5hbCBkaWdpdCBpbnB1dCBoYW5kbGVycyBieSByZS1ydW5uaW5nIHRoZSB0b3RwLWF1dGhcbiAgICAvLyBib290c3RyYXAuIFRoZSBzaW1wbGVzdCBwYXRoOiByZWxvYWQgdGhlIHBhZ2UsIHdoaWNoIHJlLXJ1bnMgYWxsIElJRkVzLlxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlclByb3ZpZGVyQ2hhbGxlbmdlKHByb3ZpZGVyKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHJldHVybjtcbiAgICBjb25zdCBjYXJkID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcudG90cC1jYXJkJyk7XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICBpZiAocHJvdmlkZXIubmFtZSA9PT0gJ3RvdHAnKSB7XG4gICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBUT1RQIG1hcmt1cCBcdTIxOTIgZXhpc3RpbmcgdG90cC1hdXRoLmpzIHN1Ym1pdFRvdHBDb2RlXG4gICAgICAvLyBwYXRoIGhhbmRsZXMgdGhlIHJlc3QuIChSZWxvYWQgaXMgdGhlIGNsZWFuZXN0IHBhdGggYmVjYXVzZVxuICAgICAgLy8gdG90cC1hdXRoLmpzIHdpcmVzIGl0cyBpbnB1dCBoYW5kbGVycyBhdCB0b3AtbGV2ZWwgSUlGRSB0aW1lLilcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvdmlkZXIubmFtZSA9PT0gJ2VtYWlsJykge1xuICAgICAgY2FyZC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxpbWcgY2xhc3M9XCJ0b3RwLWxvZ28gdG90cC1sb2dvLWRhcmtcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWRhcmsucG5nXCIgYWx0PVwiRGFzaENhZGR5XCIgb25lcnJvcj1cInRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSdcIj5cbiAgICAgICAgPGltZyBjbGFzcz1cInRvdHAtbG9nbyB0b3RwLWxvZ28tbGlnaHRcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZ1wiIGFsdD1cIkRhc2hDYWRkeVwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XG4gICAgICAgIDxwIGNsYXNzPVwic3VidGl0bGVcIj5TaWduIGluIHdpdGggZW1haWw8L3A+XG4gICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOiA2cHggMCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgV2UnbGwgZW1haWwgeW91IGEgb25lLXRpbWUgc2lnbi1pbiBsaW5rLlxuICAgICAgICA8L3A+XG4gICAgICAgIDxpbnB1dCBpZD1cImF1dGgtZ2F0ZS1lbWFpbC1pbnB1dFwiIHR5cGU9XCJlbWFpbFwiIGlucHV0bW9kZT1cImVtYWlsXCIgYXV0b2NvbXBsZXRlPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ5b3VAZXhhbXBsZS5jb21cIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBmb250LXNpemU6IDFyZW07IGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWJnKTsgY29sb3I6IHZhcigtLXRleHQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhdXRoLWdhdGUtZW1haWwtc3VibWl0XCIgY2xhc3M9XCJwcm92aWRlci1idG5cIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogMTRweDsgcGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogd2hpdGU7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC45NXJlbTsgd2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgU2VuZCBzaWduLWluIGxpbmtcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgaWQ9XCJhdXRoLWdhdGUtZW1haWwtc3RhdHVzXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBmb250LXNpemU6IDAuODVyZW07IGxpbmUtaGVpZ2h0OiAxLjQ7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgaWQ9XCJhdXRoLWdhdGUtYmFja1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+XHUyMTkwIEJhY2s8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgICAgY29uc3QgaW5wdXQgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtZW1haWwtaW5wdXQnKTtcbiAgICAgIGNvbnN0IHN1Ym1pdCA9IGNhcmQucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1zdWJtaXQnKTtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGNhcmQucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGJhY2sgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtYmFjaycpO1xuXG4gICAgICBzdWJtaXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVtYWlsID0gKGlucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgICAgIGlmICghZW1haWwgfHwgIWVtYWlsLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnRW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLic7XG4gICAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWVycm9yLCAjZDMzKSc7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN1Ym1pdC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdTZW5kaW5nXHUyMDI2JztcbiAgICAgICAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJyc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYXV0aC9sb2dpbi9lbWFpbC9pbml0aWF0ZScsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVtYWlsIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpYSA9IGRhdGEuZGVsaXZlcmVkVmlhIHx8ICdlbWFpbCc7XG4gICAgICAgICAgICBjb25zdCBtYXNrZWQgPSBkYXRhLm1hc2tlZEVtYWlsIHx8IGVtYWlsO1xuICAgICAgICAgICAgaWYgKHZpYSA9PT0gJ2Rldi1jb25zb2xlJykge1xuICAgICAgICAgICAgICBzdGF0dXMuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgICAgIENoZWNrIHRoZSBzZXJ2ZXIgbG9ncyBmb3IgeW91ciBvbmUtdGltZSBsaW5rLlxuICAgICAgICAgICAgICAgIChEZXYgbW9kZTogbm8gU01UUCBjb25maWd1cmVkLiBJbiBwcm9kdWN0aW9uIHRoaXMgd291bGQgZW1haWwgPHN0cm9uZz4ke21hc2tlZH08L3N0cm9uZz4uKWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGF0dXMuaW5uZXJIVE1MID0gYFNpZ24taW4gbGluayBzZW50IHRvIDxzdHJvbmc+JHttYXNrZWR9PC9zdHJvbmc+LlxuICAgICAgICAgICAgICAgIENoZWNrIHlvdXIgaW5ib3ggKGFuZCBzcGFtIGZvbGRlcikuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1zdWNjZXNzLCAjMmE3KSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgJ0NvdWxkIG5vdCBzZW5kIGxpbmsuJztcbiAgICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1lcnJvciwgI2QzMyknO1xuICAgICAgICAgICAgc3VibWl0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ0Nvbm5lY3Rpb24gZXJyb3IuIFRyeSBhZ2Fpbi4nO1xuICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1lcnJvciwgI2QzMyknO1xuICAgICAgICAgIHN1Ym1pdC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4ge1xuICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHN1Ym1pdC5jbGljaygpO1xuICAgICAgfSk7XG5cbiAgICAgIGJhY2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzaG93UHJvdmlkZXJTZWxlY3Rvcihwcm92aWRlcnMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVW5rbm93biBwcm92aWRlciBcdTIxOTIgcmVzdG9yZSBUT1RQIHBhdGggYXMgYSBsYXN0IHJlc29ydFxuICAgIGNvbnNvbGUud2FybignW2F1dGgtZ2F0ZV0gdW5rbm93biBwcm92aWRlcicsIHByb3ZpZGVyLm5hbWUpO1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNob3coKSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBpZiAoIW92ZXJsYXkpIHJldHVybjsgLy8gVE9UUC1vbmx5IGJ1aWxkIHdpdGhvdXQgb3VyIG92ZXJsYXkgY2hhbmdlc1xuXG4gICAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgZmV0Y2hNZXRob2RzKCk7XG4gICAgaWYgKHByb3ZpZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIEVpdGhlciB0aGUgZW5kcG9pbnQgaXNuJ3QgcmVhY2hhYmxlIE9SIG5vIHByb3ZpZGVyIHJlcG9ydHMgZW5hYmxlZC5cbiAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgbGVnYWN5IFRPVFAgb3ZlcmxheSBcdTIwMTQgZXhpc3RpbmcgdG90cC1hdXRoLmpzIGhhbmRsZXMgaXQuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5ID09PSAnZnVuY3Rpb24nKSB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocHJvdmlkZXJzLmxlbmd0aCA9PT0gMSAmJiBwcm92aWRlcnNbMF0ubmFtZSA9PT0gJ3RvdHAnKSB7XG4gICAgICAvLyBTaW5nbGUgVE9UUCBwcm92aWRlciBcdTIxOTIgc2hvdyB0aGUgb3JpZ2luYWwgVE9UUCBvdmVybGF5IHVuY2hhbmdlZCxcbiAgICAgIC8vIGJ1dCB3aXRoIGFuIFwiT3Igc2lnbiBpbiB3aXRoIGVtYWlsXCIgbGluayBiZWxvdyBzbyB0aGUgZW1haWwgcGF0aFxuICAgICAgLy8gaXMgcmVhY2hhYmxlIGFzIHRoZSByZWNvdmVyeSAvIHBob25lLWZyaWVuZGx5IGFsdGVybmF0aXZlLiBNb3N0XG4gICAgICAvLyB1c2VycyBzdGlsbCB3YW50IHRoZWlyIHByaW1hcnkgbWV0aG9kIChUT1RQKSBmcm9udC1hbmQtY2VudGVyLlxuICAgICAgc2hvd1RvdHBXaXRoRW1haWxGYWxsYmFjayhwcm92aWRlcnNbMF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzaG93UHJvdmlkZXJTZWxlY3Rvcihwcm92aWRlcnMpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1RvdHBXaXRoRW1haWxGYWxsYmFjayh0b3RwUHJvdmlkZXIpIHtcbiAgICBjb25zdCBlbWFpbEVuYWJsZWQgPSBtZXRob2RzQ2FjaGUgJiYgbWV0aG9kc0NhY2hlLmZpbmQocCA9PiBwLm5hbWUgPT09ICdlbWFpbCcpO1xuICAgIGlmICghZW1haWxFbmFibGVkKSB7XG4gICAgICAvLyBUcnVseSBzaW5nbGUtcHJvdmlkZXIgcGF0aDogbGVnYWN5IFRPVFAgb3ZlcmxheSwgbm8gYWx0IGxpbmsuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5ID09PSAnZnVuY3Rpb24nKSB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgIGNvbnN0IGNhcmQgPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWNhcmQnKTtcbiAgICBpZiAoIWNhcmQpIHJldHVybjtcblxuICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIFRPVFAgbWFya3VwIHNvIHdlIGNhbiByZXN0b3JlIG9uIGFsdC1saW5rIGNsaWNrIG9mZi5cbiAgICBpZiAoIWNhcmQuZGF0YXNldC5vcmlnaW5hbEJvZHkpIGNhcmQuZGF0YXNldC5vcmlnaW5hbEJvZHkgPSBjYXJkLmlubmVySFRNTDtcblxuICAgIC8vIEFkZCBhIHNtYWxsIFwib3JcIiBsaW5rIGF0IHRoZSBib3R0b20gb2YgdGhlIGV4aXN0aW5nIGNhcmQgV0lUSE9VVFxuICAgIC8vIHRvdWNoaW5nIHRoZSBUT1RQIGlucHV0IG1hcmt1cCBcdTIwMTQga2VlcHMgdG90cC1hdXRoLmpzJ3Mgc3VibWl0VG90cENvZGVcbiAgICAvLyBiaW5kaW5nIGludGFjdC5cbiAgICBsZXQgYWx0ID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcjYXV0aC1nYXRlLWVtYWlsLWFsdCcpO1xuICAgIGlmICghYWx0KSB7XG4gICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpdi5pZCA9ICdhdXRoLWdhdGUtZW1haWwtYWx0JztcbiAgICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gJ21hcmdpbi10b3A6IDE4cHg7IHBhZGRpbmctdG9wOiAxNHB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtOyc7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gYDxhIGhyZWY9XCIjXCIgaWQ9XCJhdXRoLWdhdGUtZW1haWwtYWx0LWxpbmtcIlxuICAgICAgICBzdHlsZT1cImNvbG9yOiB2YXIoLS1hY2NlbnQpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7XCI+XG4gICAgICAgIE9yIHNpZ24gaW4gd2l0aCBlbWFpbCBpbnN0ZWFkIFx1MjE5MlxuICAgICAgPC9hPmA7XG4gICAgICBjYXJkLmFwcGVuZENoaWxkKGRpdik7XG4gICAgICBkaXYucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1hbHQtbGluaycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmVuZGVyUHJvdmlkZXJDaGFsbGVuZ2UoZW1haWxFbmFibGVkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfVxuXG4gIC8vIC0tLS0gVHJpZ2dlciBwb2ludHMgLS0tLVxuICAvLyAxLiBTU08gcmVkaXJlY3QgZnJvbSBDYWRkeTogP2F1dGg9cmVxdWlyZWRcbiAgLy8gICAgV2UgY2xhaW0gb3duZXJzaGlwIGhlcmUgKHNldCB3aW5kb3cuX19kY18wNDlfaGFuZGxlZCA9IHRydWUpXG4gIC8vICAgIEJFRk9SRSB0b3RwLWF1dGguanMncyBvd24gP2F1dGg9cmVxdWlyZWQgY2hlY2sgcnVucywgc28gdGhlIGxlZ2FjeVxuICAvLyAgICBUT1RQLW9ubHkgb3ZlcmxheSBkb2Vzbid0IGZsaWNrZXIgaW4gZm9yIG11bHRpLXByb3ZpZGVyIGluc3RhbGxzLlxuICAvLyAgICBTaW5nbGUtcHJvdmlkZXIgVE9UUC1vbmx5IGluc3RhbGxzIHdvcmsgYmVjYXVzZSB3ZSBzdGlsbCBkZWxlZ2F0ZVxuICAvLyAgICBiYWNrIHRvIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5KCkgaW4gYHNob3coKWAgYmVsb3cuXG4gIHdpbmRvdy5fX2RjXzA0OV9oYW5kbGVkID0gdHJ1ZTtcblxuICBmdW5jdGlvbiBpc0FsbG93ZWRSZXR1cm5VcmwocmV0dXJuVXJsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmV0dXJuVXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgIGlmICghWydodHRwOicsICdodHRwczonXS5pbmNsdWRlcyhwYXJzZWQucHJvdG9jb2wpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAocGFyc2VkLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAocGFyc2VkLnByb3RvY29sICE9PSAnaHR0cHM6JykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBnbG9iYWxzLmpzIGlzIGNvbmNhdGVuYXRlZCBiZWZvcmUgdGhpcyBtb2R1bGUgaW4gY29yZS5qcywgc28gU0lURSBpc1xuICAgICAgLy8gYXZhaWxhYmxlIGhlcmUuIFBlcm1pdCBleGFjdCBob3N0cyBhbmQgc3ViZG9tYWlucyB1bmRlciB0aGUgY29uZmlndXJlZFxuICAgICAgLy8gcHJpdmF0ZSBUTEQgKGZvciBleGFtcGxlIHBsZXguc2FtaSksIHdoaWxlIHJlamVjdGluZyBsb29rYWxpa2VzIHN1Y2ggYXNcbiAgICAgIC8vIHBsZXguc2FtaS5ldmlsLmV4YW1wbGUuXG4gICAgICBjb25zdCBzdWZmaXggPSBTSVRFLnRsZC5zdGFydHNXaXRoKCcuJykgPyBTSVRFLnRsZCA6IGAuJHtTSVRFLnRsZH1gO1xuICAgICAgcmV0dXJuIHBhcnNlZC5ob3N0bmFtZSA9PT0gc3VmZml4LnNsaWNlKDEpIHx8IHBhcnNlZC5ob3N0bmFtZS5lbmRzV2l0aChzdWZmaXgpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFNzb0hhbmRvZmZUYXJnZXQocmV0dXJuVXJsLCB0b2tlbikge1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmV0dXJuVXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICBpZiAocGFyc2VkLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xuXG4gICAgY29uc3Qgc3VmZml4ID0gU0lURS50bGQuc3RhcnRzV2l0aCgnLicpID8gU0lURS50bGQgOiBgLiR7U0lURS50bGR9YDtcbiAgICBjb25zdCBpc1ByaXZhdGVIb3N0ID0gcGFyc2VkLmhvc3RuYW1lID09PSBzdWZmaXguc2xpY2UoMSkgfHwgcGFyc2VkLmhvc3RuYW1lLmVuZHNXaXRoKHN1ZmZpeCk7XG4gICAgaWYgKHBhcnNlZC5wcm90b2NvbCAhPT0gJ2h0dHBzOicgfHwgIWlzUHJpdmF0ZUhvc3QgfHwgIXRva2VuKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJldHVyblBhdGggPSBgJHtwYXJzZWQucGF0aG5hbWV9JHtwYXJzZWQuc2VhcmNofSR7cGFyc2VkLmhhc2h9YDtcbiAgICBwYXJzZWQucGF0aG5hbWUgPSAnL2Rhc2hjYWRkeS1zc28nO1xuICAgIHBhcnNlZC5zZWFyY2ggPSAnJztcbiAgICBwYXJzZWQuaGFzaCA9ICcnO1xuICAgIHBhcnNlZC5zZWFyY2hQYXJhbXMuc2V0KCd0b2tlbicsIHRva2VuKTtcbiAgICBwYXJzZWQuc2VhcmNoUGFyYW1zLnNldCgncmV0dXJuJywgcmV0dXJuUGF0aCk7XG4gICAgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVzdW1lRXhpc3RpbmdTZXNzaW9uKHJldHVyblVybCkge1xuICAgIGlmICghcmV0dXJuVXJsIHx8ICFpc0FsbG93ZWRSZXR1cm5VcmwocmV0dXJuVXJsKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWRSZXR1cm4gPSBuZXcgVVJMKHJldHVyblVybCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgICBjb25zdCBzdWZmaXggPSBTSVRFLnRsZC5zdGFydHNXaXRoKCcuJykgPyBTSVRFLnRsZCA6IGAuJHtTSVRFLnRsZH1gO1xuICAgICAgY29uc3Qgc2VydmljZUlkID0gcGFyc2VkUmV0dXJuLmhvc3RuYW1lLnNsaWNlKDAsIC1zdWZmaXgubGVuZ3RoKTtcbiAgICAgIGlmICghL15bYS16MC05XVthLXowLTktXSokLy50ZXN0KHNlcnZpY2VJZCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2F1dGgvc3NvLWhhbmRvZmY/c2VydmljZUlkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2VJZCl9YCwge1xuICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgICBjYWNoZTogJ25vLXN0b3JlJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXMub2spIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZGF0YS5zdWNjZXNzICYmIGJ1aWxkU3NvSGFuZG9mZlRhcmdldChyZXR1cm5VcmwsIGRhdGEuc3NvVG9rZW4pO1xuICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBmYWxzZTtcbiAgICAgIHRyeSB7IHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ3RvdHBfcmVkaXJlY3QnKTsgfSBjYXRjaCAoXykge31cbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHRhcmdldCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgaWYgKHVybFBhcmFtcy5nZXQoJ2F1dGgnKSA9PT0gJ3JlcXVpcmVkJykge1xuICAgIC8vIFByZXNlcnZlIHRoZSBnYXRlZCBzZXJ2aWNlIGRlc3RpbmF0aW9uIHNvIHN1Ym1pdFRvdHBDb2RlKCkgY2FuIGFwcGVuZFxuICAgIC8vIHRoZSBvbmUtdGltZSBTU08gaGFuZG9mZiB0b2tlbiBhbmQgcmV0dXJuIHRoZSBicm93c2VyIHRvIHRoYXQgaG9zdC5cbiAgICBjb25zdCByZXR1cm5VcmwgPSB1cmxQYXJhbXMuZ2V0KCdyZXR1cm4nKTtcbiAgICBpZiAocmV0dXJuVXJsICYmIGlzQWxsb3dlZFJldHVyblVybChyZXR1cm5VcmwpKSB7XG4gICAgICB0cnkgeyBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCd0b3RwX3JlZGlyZWN0JywgcmV0dXJuVXJsKTsgfSBjYXRjaCAoXykge31cbiAgICB9XG4gICAgLy8gQ2xlYW4gVVJMIFx1MjAxNCBoYXBwZW5zIGFmdGVyIHdlJ3ZlIGNhcHR1cmVkIHRoZSByZWRpcmVjdFxuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgJycsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgLy8gUmV1c2UgdGhlIHZhbGlkIHN0YXR1cy5zYW1pIHNlc3Npb24gZmlyc3QuIE9ubHkgc2hvdyB0aGUgVE9UUC9wcm92aWRlclxuICAgIC8vIGNoYWxsZW5nZSB3aGVuIHRoYXQgc2Vzc2lvbiBpcyBnZW51aW5lbHkgYWJzZW50IG9yIGV4cGlyZWQuXG4gICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoYXdhaXQgcmVzdW1lRXhpc3RpbmdTZXNzaW9uKHJldHVyblVybCkpIHJldHVybjtcbiAgICAgIGF3YWl0IHNob3coKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIEV4cG9zZSBmb3IgaG90LXRyaWdnZXIgZnJvbSBvdGhlciBtb2R1bGVzIChlLmcuIGxvZ291dClcbiAgd2luZG93Ll9zaG93QXV0aEdhdGUgPSBzaG93O1xuICB3aW5kb3cuX2F1dGhHYXRlTWV0aG9kcyA9IGZldGNoTWV0aG9kcztcbn0pKCk7XG47XG4vLyA9PT09PSBUT1RQIEFVVEhFTlRJQ0FUSU9OIEdBVEUgPT09PT1cbihmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gdXBkYXRlVG90cExvZ28oKSB7XG4gICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWNhcmQnKTtcbiAgICBpZiAoIWNhcmQpIHJldHVybjtcbiAgICBjb25zdCBiZyA9IGdldENvbXB1dGVkU3R5bGUoY2FyZCkuYmFja2dyb3VuZENvbG9yO1xuICAgIGNvbnN0IG0gPSBiZy5tYXRjaCgvXFxkKy9nKTtcbiAgICBpZiAoIW0pIHJldHVybjtcbiAgICBjb25zdCBsdW0gPSAoMC4yOTkgKiArbVswXSArIDAuNTg3ICogK21bMV0gKyAwLjExNCAqICttWzJdKSAvIDI1NTtcbiAgICBjb25zdCBkYXJrID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcudG90cC1sb2dvLWRhcmsnKTtcbiAgICBjb25zdCBsaWdodCA9IGNhcmQucXVlcnlTZWxlY3RvcignLnRvdHAtbG9nby1saWdodCcpO1xuICAgIGlmIChkYXJrKSBkYXJrLnN0eWxlLmRpc3BsYXkgPSBsdW0gPiAwLjUgPyAnbm9uZScgOiAnJztcbiAgICBpZiAobGlnaHQpIGxpZ2h0LnN0eWxlLmRpc3BsYXkgPSBsdW0gPiAwLjUgPyAnJyA6ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dUb3RwT3ZlcmxheSgpIHtcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgIGlmIChvdmVybGF5KSB7XG4gICAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIHNldFRpbWVvdXQodXBkYXRlVG90cExvZ28sIDUwKTtcbiAgICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWRpZ2l0cyBpbnB1dCcpO1xuICAgICAgaWYgKGZpcnN0SW5wdXQpIHNldFRpbWVvdXQoKCkgPT4gZmlyc3RJbnB1dC5mb2N1cygpLCAxMDApO1xuICAgIH1cbiAgICAvLyBSZWZyZXNoIHRoZSBcIkxvc3QgYWNjZXNzP1wiIHJlY292ZXJ5IGxpbmsgdmlzaWJpbGl0eSBiYXNlZCBvbiBzZXJ2ZXIgc3RhdGUuXG4gICAgLy8gSGlkZXMgaXRzZWxmIGlmIFRPVFAgaXMgaGVhbHRoeTsgc2hvd3MgaWYgdW5yZWFkYWJsZS9jb3JydXB0LiBUaGUgdXNlclxuICAgIC8vIGNhbiBzdGlsbCBjbGljayBpdCBldmVuIHdoZW4gaGVhbHRoeSBcdTIwMTQgYnV0IHRoZSBwYW5lbCB3aWxsIGV4cGxhaW4gdGhlcmUnc1xuICAgIC8vIG5vIHJlY292ZXJ5IG5lZWRlZC4gQ2hlYXBlciB0aGFuIGdhdGluZyBpdC5cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5fcmVmcmVzaFJlY292ZXJ5TGluayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd2luZG93Ll9yZWZyZXNoUmVjb3ZlcnlMaW5rKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGlkZVRvdHBPdmVybGF5KCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRTc29IYW5kb2ZmVGFyZ2V0KHJlZGlyZWN0LCB0b2tlbikge1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmVkaXJlY3QsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgIGlmIChwYXJzZWQub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luKSByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCBzdWZmaXggPSBTSVRFLnRsZC5zdGFydHNXaXRoKCcuJykgPyBTSVRFLnRsZCA6IGAuJHtTSVRFLnRsZH1gO1xuICAgIGNvbnN0IGlzUHJpdmF0ZUhvc3QgPSBwYXJzZWQuaG9zdG5hbWUgPT09IHN1ZmZpeC5zbGljZSgxKSB8fCBwYXJzZWQuaG9zdG5hbWUuZW5kc1dpdGgoc3VmZml4KTtcbiAgICBpZiAocGFyc2VkLnByb3RvY29sICE9PSAnaHR0cHM6JyB8fCAhaXNQcml2YXRlSG9zdCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0b2tlbikgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xuXG4gICAgY29uc3QgcmV0dXJuUGF0aCA9IGAke3BhcnNlZC5wYXRobmFtZX0ke3BhcnNlZC5zZWFyY2h9JHtwYXJzZWQuaGFzaH1gO1xuICAgIHBhcnNlZC5wYXRobmFtZSA9ICcvZGFzaGNhZGR5LXNzbyc7XG4gICAgcGFyc2VkLnNlYXJjaCA9ICcnO1xuICAgIHBhcnNlZC5oYXNoID0gJyc7XG4gICAgcGFyc2VkLnNlYXJjaFBhcmFtcy5zZXQoJ3Rva2VuJywgdG9rZW4pO1xuICAgIHBhcnNlZC5zZWFyY2hQYXJhbXMuc2V0KCdyZXR1cm4nLCByZXR1cm5QYXRoKTtcbiAgICByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvLyBTZXR1cCBkaWdpdCBpbnB1dCBVWFxuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kaWdpdHMnKTtcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGlucHV0cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpO1xuICAgIGlucHV0cy5mb3JFYWNoKChpbnB1dCwgaWR4KSA9PiB7XG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGUudGFyZ2V0LnZhbHVlLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgICAgIGUudGFyZ2V0LnZhbHVlID0gdmFsLnNsaWNlKDAsIDEpO1xuICAgICAgICBpZiAodmFsICYmIGlkeCA8IGlucHV0cy5sZW5ndGggLSAxKSBpbnB1dHNbaWR4ICsgMV0uZm9jdXMoKTtcbiAgICAgICAgY29uc3QgY29kZSA9IEFycmF5LmZyb20oaW5wdXRzKS5tYXAoaSA9PiBpLnZhbHVlKS5qb2luKCcnKTtcbiAgICAgICAgaWYgKGNvZGUubGVuZ3RoID09PSA2KSBzdWJtaXRUb3RwQ29kZShjb2RlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgICAgaWYgKGUua2V5ID09PSAnQmFja3NwYWNlJyAmJiAhZS50YXJnZXQudmFsdWUgJiYgaWR4ID4gMCkge1xuICAgICAgICAgIGlucHV0c1tpZHggLSAxXS5mb2N1cygpO1xuICAgICAgICAgIGlucHV0c1tpZHggLSAxXS52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHBhc3RlZCA9IChlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpIHx8ICcnKS5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgICBpZiAocGFzdGVkLmxlbmd0aCA+PSA2KSB7XG4gICAgICAgICAgaW5wdXRzLmZvckVhY2goKGlucCwgaSkgPT4geyBpbnAudmFsdWUgPSBwYXN0ZWRbaV0gfHwgJyc7IH0pO1xuICAgICAgICAgIGlucHV0c1s1XS5mb2N1cygpO1xuICAgICAgICAgIHN1Ym1pdFRvdHBDb2RlKHBhc3RlZC5zbGljZSgwLCA2KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc3VibWl0VG90cENvZGUoY29kZSkge1xuICAgIGNvbnN0IGVycm9yRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1lcnJvcicpO1xuICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnVmVyaWZ5aW5nLi4uJztcbiAgICBlcnJvckVsLmNsYXNzTmFtZSA9ICd0b3RwLWVycm9yIHZlcmlmeWluZyc7XG5cbiAgICBjb25zdCByZWRpcmVjdCA9IHNhZmVTZXNzaW9uR2V0KCd0b3RwX3JlZGlyZWN0Jyk7XG4gICAgbGV0IHNlcnZpY2VJZCA9IG51bGw7XG4gICAgaWYgKHJlZGlyZWN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHJlZGlyZWN0LCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gU0lURS50bGQuc3RhcnRzV2l0aCgnLicpID8gU0lURS50bGQgOiBgLiR7U0lURS50bGR9YDtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gcGFyc2VkLmhvc3RuYW1lLnNsaWNlKDAsIC1zdWZmaXgubGVuZ3RoKTtcbiAgICAgICAgaWYgKHBhcnNlZC5ob3N0bmFtZS5lbmRzV2l0aChzdWZmaXgpICYmIC9eW2EtejAtOV1bYS16MC05LV0qJC8udGVzdChjYW5kaWRhdGUpKSBzZXJ2aWNlSWQgPSBjYW5kaWRhdGU7XG4gICAgICB9IGNhdGNoIChfKSB7IC8qIGludmFsaWQgcmVkaXJlY3QgaXMgaGFuZGxlZCBieSB0aGUgbm9ybWFsIGF1dGggZmxvdyAqLyB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3RvdHAvdmVyaWZ5Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY29kZSwgc2VydmljZUlkIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgLy8gVXBkYXRlIGNhY2hlZCBDU1JGIHRva2VuIGZyb20gVE9UUCByZXNwb25zZSAoc2VydmVyIHJvdGF0ZXMgaXQgb24gbG9naW4pXG4gICAgICAgIGlmIChkYXRhLmNzcmZUb2tlbikge1xuICAgICAgICAgIGNzcmZUb2tlbiA9IGRhdGEuY3NyZlRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGhpZGVUb3RwT3ZlcmxheSgpO1xuICAgICAgICAvLyBDaGVjayBpZiByZWRpcmVjdGVkIGhlcmUgZnJvbSBhbm90aGVyIHNlcnZpY2VcbiAgICAgICAgaWYgKHJlZGlyZWN0KSB7XG4gICAgICAgICAgdHJ5IHsgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgndG90cF9yZWRpcmVjdCcpOyB9IGNhdGNoIChfKSB7fVxuICAgICAgICAgIC8vIC5zYW1pIGlzIGFuIHVucmVnaXN0ZXJlZCBUTEQsIHNvIGJyb3dzZXJzIHNpbGVudGx5IGRyb3AgdGhlXG4gICAgICAgICAgLy8gRG9tYWluPS5zYW1pIHNlc3Npb24gY29va2llIG9uIGFueSBPVEhFUiAqLnNhbWkgc3ViZG9tYWluICh0aGV5XG4gICAgICAgICAgLy8gdHJlYXQgXCJzYW1pXCIgYXMgdGhlIGVmZmVjdGl2ZSBwdWJsaWMgc3VmZml4LCBzYW1lIHByb3RlY3Rpb25cbiAgICAgICAgICAvLyB0aGF0IGJsb2NrcyBhIERvbWFpbj0uY29tIHN1cGVyY29va2llKS4gVGhlIHRhcmdldCBzZXJ2aWNlIGNhbid0XG4gICAgICAgICAgLy8gc2VlIG91ciBzZXNzaW9uIGNvb2tpZSBubyBtYXR0ZXIgaG93IGl0J3MgYnVpbHQsIHNvIGluc3RlYWQgd2VcbiAgICAgICAgICAvLyBoYW5kIGl0IGEgb25lLXRpbWUgdG9rZW4gaW4gdGhlIFVSTDsgaXRzIGxvZ2luIHBhZ2UgZXhjaGFuZ2VzXG4gICAgICAgICAgLy8gdGhhdCBmb3IgaXRzIG93biBob3N0LW9ubHkgY29va2llIHZpYSAvYXV0aC9zc28tZXhjaGFuZ2UuXG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gYnVpbGRTc29IYW5kb2ZmVGFyZ2V0KHJlZGlyZWN0LCBkYXRhLnNzb1Rva2VuKTtcbiAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGFyZ2V0O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbml0aWFsaXplIGRhc2hib2FyZFxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5pbml0aWFsaXplRGFzaGJvYXJkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2luZG93LmluaXRpYWxpemVEYXNoYm9hcmQoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN1bWUgbGl2ZSB1cGRhdGVzIGFmdGVyIG1pZC1zZXNzaW9uIHJlLWF1dGguIFRoZSBhdXRoLWxvc3NcbiAgICAgICAgLy8gaGFuZGxlcnMgbGF0Y2hlZCBwb2xsaW5nICsgU1NFIG9mZiB3aGVuIHRoZSBzZXNzaW9uIGV4cGlyZWRcbiAgICAgICAgLy8gKGdyaWQuanMgc2V0cyBfZGNBdXRoTG9zdCwgbGl2ZS1ldmVudHMuanMgbGF0Y2hlcyB0aGUgc3RyZWFtXG4gICAgICAgIC8vIGNsb3NlZCk7IGEgZnJlc2ggbG9naW4gbXVzdCBjbGVhciBib3RoIGFuZCByZWNvbm5lY3QsIG9yIHRoZVxuICAgICAgICAvLyBkYXNoYm9hcmQgc3RheXMgZnJvemVuIG9uIHN0YWxlIGRhdGEgdW50aWwgYSBtYW51YWwgRjUuXG4gICAgICAgIHdpbmRvdy5fZGNBdXRoTG9zdCA9IGZhbHNlO1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5fc3NlUmVzdW1lID09PSAnZnVuY3Rpb24nKSB3aW5kb3cuX3NzZVJlc3VtZSgpO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygd2luZG93Ll9zc2VSZWNvbm5lY3QgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5fc3NlUmVjb25uZWN0KCk7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93LnJlZnJlc2hBbGwgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gZGF0YS5lcnJvciB8fCAnSW52YWxpZCBjb2RlJztcbiAgICAgICAgZXJyb3JFbC5jbGFzc05hbWUgPSAndG90cC1lcnJvcic7XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN0b3RwLWRpZ2l0cyBpbnB1dCcpO1xuICAgICAgICBpbnB1dHMuZm9yRWFjaChpID0+IHsgaS52YWx1ZSA9ICcnOyB9KTtcbiAgICAgICAgaW5wdXRzWzBdPy5mb2N1cygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnQ29ubmVjdGlvbiBlcnJvcic7XG4gICAgICBlcnJvckVsLmNsYXNzTmFtZSA9ICd0b3RwLWVycm9yJztcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgP2F1dGg9cmVxdWlyZWQgcmVkaXJlY3QgZnJvbSBDYWRkeSBTU08uXG4gIC8vIERDLTA0OTogaWYgdGhlIGF1dGgtZ2F0ZSBtb2R1bGUgd2lsbCBoYW5kbGUgdGhpcyAobXVsdGktcHJvdmlkZXJcbiAgLy8gaW5zdGFsbHMpLCBza2lwIG91ciBUT1RQLW9ubHkgYnJhbmNoIGVudGlyZWx5LiBTaW5nbGUtcHJvdmlkZXJcbiAgLy8gVE9UUC1vbmx5IGluc3RhbGxzIGNvbnRpbnVlIHRvIHVzZSB0aGlzIHBhdGggYmVjYXVzZSBhdXRoLWdhdGUuanNcbiAgLy8gZGVsZWdhdGVzIGJhY2sgdG8gd2luZG93Ll9zaG93VG90cE92ZXJsYXkoKS5cbiAgY29uc3QgX19kY18wNDlfc2tpcCA9ICEhKHdpbmRvdy5fX2RjXzA0OV9oYW5kbGVkKTtcbiAgaWYgKCFfX2RjXzA0OV9za2lwICYmIHVybFBhcmFtcy5nZXQoJ2F1dGgnKSA9PT0gJ3JlcXVpcmVkJykge1xuICAgIGNvbnN0IHJldHVyblVybCA9IHVybFBhcmFtcy5nZXQoJ3JldHVybicpO1xuICAgIGlmIChyZXR1cm5VcmwpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHJlZGlyZWN0IFVSTDogbXVzdCBiZSBzYW1lLW9yaWdpbiBvciBob3N0bmFtZSBtdXN0IGVuZCB3aXRoIG91ciBUTERcbiAgICAgIC8vIChwcmV2ZW50cyBvcGVuIHJlZGlyZWN0IHZpYSBpbmNsdWRlcygpIGJ5cGFzcyBsaWtlIGV2aWwuY29tP3E9LnNhbWkpXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHJldHVyblVybCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgICAgIGNvbnN0IGhvc3RuYW1lID0gcGFyc2VkLmhvc3RuYW1lO1xuICAgICAgICBjb25zdCBpc1NhbWVPcmlnaW4gPSBwYXJzZWQub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgICAgICBjb25zdCB0bGRTdWZmaXggPSBTSVRFLnRsZC5zdGFydHNXaXRoKCcuJykgPyBTSVRFLnRsZCA6ICcuJyArIFNJVEUudGxkO1xuICAgICAgICBjb25zdCBpc091clRsZCA9IGhvc3RuYW1lLmVuZHNXaXRoKHRsZFN1ZmZpeCkgfHwgaG9zdG5hbWUgPT09IHRsZFN1ZmZpeC5zdWJzdHJpbmcoMSk7XG4gICAgICAgIGlmIChpc1NhbWVPcmlnaW4gfHwgaXNPdXJUbGQpIHtcbiAgICAgICAgICBzYWZlU2Vzc2lvblNldCgndG90cF9yZWRpcmVjdCcsIHJldHVyblVybCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgLy8gSW52YWxpZCBVUkwgXHUyMDE0IHJlamVjdCByZWRpcmVjdFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhbiBVUkxcbiAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICcnLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO1xuICB9XG5cbiAgd2luZG93Ll9zaG93VG90cE92ZXJsYXkgPSBzaG93VG90cE92ZXJsYXk7XG59KSgpO1xuO1xuLy8gPT09PT0gVE9UUCBSRUNPVkVSWSBGTE9XID09PT09XG4vLyBQdWJsaWMsIHVuYXV0aGVudGljYXRlZCByZWNvdmVyeSBwYXRoIGZvciB1c2VycyB3aG8gY2FuJ3QgbG9nIGluLlxuLy8gRGVzaWduZWQgZm9yIHRoZSBcImVuY3J5cHRpb24ga2V5IHJvdGF0ZWQgYW5kIGxvc3QgbXkgYXV0aGVudGljYXRvclwiIGNhc2UuXG4vLyBUaGUgZmxvdyBpczpcbi8vXG4vLyAgMS4gT24gVE9UUCBvdmVybGF5IHNob3csIGNhbGwgL2FwaS92MS90b3RwL3JlY292ZXJ5LWluZm8gKHB1YmxpYykuXG4vLyAgICAgSWYgc3RhdHVzID09PSAndW5yZWFkYWJsZScsIHNob3cgdGhlIFwiTG9zdCBhY2Nlc3M/XCIgbGluayBvbiB0aGUgb3ZlcmxheS5cbi8vICAyLiBVc2VyIGNsaWNrcyBsaW5rIFx1MjE5MiBvcGVucyByZWNvdmVyeSBwYW5lbC5cbi8vICAzLiBVc2VyIHBhc3RlcyBCYXNlMzIgc2VjcmV0IFx1MjE5MiBQT1NUIC9hcGkvdjEvdG90cC9zZXR1cCB3aXRoIHtzZWNyZXQ6IC4uLn0uXG4vLyAgICAgQmFja2VuZCBzdG9yZXMgYXMgdG90cC5wZW5kaW5nX3NlY3JldCAoZW5jcnlwdGVkIHdpdGggY3VycmVudCBrZXkpLlxuLy8gIDQuIFBhbmVsIHN3aXRjaGVzIHRvIFwidmVyaWZ5XCIgbW9kZS4gVXNlciBlbnRlcnMgYSBjb2RlIGZyb20gdGhlXG4vLyAgICAgbmV3bHktYWRkZWQgYXV0aGVudGljYXRvciBlbnRyeS4gUE9TVCAvYXBpL3YxL3RvdHAvdmVyaWZ5LXNldHVwXG4vLyAgICAgcHJvbW90ZXMgcGVuZGluZyBcdTIxOTIgYWN0aXZlIGFuZCBzdGFydHMgYSBzZXNzaW9uLlxuLy8gIDUuIGhpZGVUb3RwT3ZlcmxheSgpIGFuZCBpbml0aWFsaXplRGFzaGJvYXJkKCkgXHUyMDE0IHNhbWUgYXMgbm9ybWFsIGxvZ2luLlxuLy9cbi8vIFRoZSByZWNvdmVyeSBmbG93IG5ldmVyIHJlcXVpcmVzIHRoZSB1c2VyIHRvIGJlIGxvZ2dlZCBpbi4gSXQgZG9lcyByZXF1aXJlXG4vLyB0aGVtIHRvIGhhdmUgdGhlaXIgQmFzZTMyIHNlY3JldCBzYXZlZCAoZS5nLiBwYXNzd29yZCBtYW5hZ2VyLCBzY3JlZW5zaG90LFxuLy8gdGhlIFwiRG93bmxvYWQgYmFja3VwIGZpbGVcIiB3ZSBvZmZlciBhdCBzZXR1cCB0aW1lIFx1MjAxNCBzZWUgdG90cC1zZXR0aW5ncy5qcykuXG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBIZWxwZXJzIFx1MjUwMFx1MjUwMFxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFJlY292ZXJ5SW5mbygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvcmVjb3ZlcnktaW5mbycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICByZXR1cm4gYXdhaXQgci5qc29uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHN0YXR1czogJ3Vua25vd24nLCBoaW50OiAnQ291bGQgbm90IGNvbnRhY3Qgc2VydmVyJyB9O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dSZWNvdmVyeUxpbmsoc2hvdykge1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1saW5rJyk7XG4gICAgaWYgKGxpbmspIGxpbmsuc3R5bGUuZGlzcGxheSA9IHNob3cgPyAnJyA6ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5SZWNvdmVyeVBhbmVsKCkge1xuICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktcGFuZWwnKTtcbiAgICBpZiAocGFuZWwpIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXN0YXR1cycpO1xuICAgIGNvbnN0IGltcG9ydEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktaW1wb3J0Jyk7XG4gICAgY29uc3QgdmVyaWZ5RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS12ZXJpZnknKTtcbiAgICBpZiAoaW1wb3J0RWwpIGltcG9ydEVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBpZiAodmVyaWZ5RWwpIHZlcmlmeUVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgLy8gUmVzZXQgc3RhdGVcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1lcnJvcicpLnRleHRDb250ZW50ID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29uZmlybS1lcnJvcicpLnRleHRDb250ZW50ID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc2VjcmV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJykudmFsdWUgPSAnJztcbiAgICAvLyBTaG93IGN1cnJlbnQgc3RhdHVzXG4gICAgZmV0Y2hSZWNvdmVyeUluZm8oKS50aGVuKGluZm8gPT4ge1xuICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBpbmZvLmhpbnQgfHwgJyc7XG4gICAgICAvLyBDb2xvci1jb2RlIHRoZSBzdGF0dXMgYmFubmVyXG4gICAgICBpZiAoaW5mby5zdGF0dXMgPT09ICdoZWFsdGh5Jykge1xuICAgICAgICBzdGF0dXNFbC5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1vay1mZywgIzdlZjJmZiknO1xuICAgICAgfSBlbHNlIGlmIChpbmZvLnN0YXR1cyA9PT0gJ3VucmVhZGFibGUnKSB7XG4gICAgICAgIHN0YXR1c0VsLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLWJhZC1mZywgI2ZmOWFhMyknO1xuICAgICAgICBzdGF0dXNFbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1iYWQtZmcpIDYlLCB0cmFuc3BhcmVudCknO1xuICAgICAgfSBlbHNlIGlmIChpbmZvLnN0YXR1cyA9PT0gJ25vdF9jb25maWd1cmVkJykge1xuICAgICAgICBzdGF0dXNFbC5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHVzRWwuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tYm9yZGVyKSc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1zZWNyZXQnKT8uZm9jdXMoKTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VSZWNvdmVyeVBhbmVsKCkge1xuICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktcGFuZWwnKTtcbiAgICBpZiAocGFuZWwpIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzdWJtaXRSZWNvdmVyeVNlY3JldCgpIHtcbiAgICBjb25zdCBzZWNyZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1zZWNyZXQnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWVycm9yJyk7XG4gICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgaWYgKCFzZWNyZXQpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnUGFzdGUgeW91ciBCYXNlMzIga2V5IGZpcnN0JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCEvXltBLVphLXoyLTdcXHNdKz0qJC8udGVzdChzZWNyZXQpKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ0ludmFsaWQgQmFzZTMyIGZvcm1hdCBcdTIwMTQgc2hvdWxkIGJlIGxldHRlcnMgQS1aIGFuZCBkaWdpdHMgMi03IG9ubHknO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFBPU1QgL2FwaS92MS90b3RwL3NldHVwIHdpdGgge3NlY3JldH0gXHUyMDE0IGJhY2tlbmQgc3RvcmVzIGFzIHBlbmRpbmdcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvc2V0dXAnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZWNyZXQgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKCFyLm9rIHx8ICFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgZGF0YS5tZXNzYWdlIHx8ICdSZXN0b3JlIGZhaWxlZCc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFN3aXRjaCBwYW5lbCB0byB2ZXJpZnkgbW9kZVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktaW1wb3J0Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXZlcmlmeScpLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpPy5mb2N1cygpLCAxMDApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnTmV0d29yayBlcnJvciBcdTIwMTQgdHJ5IGFnYWluJztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzdWJtaXRSZWNvdmVyeUNvZGUoKSB7XG4gICAgY29uc3QgY29kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvZGUnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvbmZpcm0tZXJyb3InKTtcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJyc7XG5cbiAgICBpZiAoIS9eXFxkezZ9JC8udGVzdChjb2RlKSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdFbnRlciBhIDYtZGlnaXQgY29kZSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUE9TVCAvYXBpL3YxL3RvdHAvdmVyaWZ5LXNldHVwIFx1MjAxNCBwcm9tb3RlcyBwZW5kaW5nIFx1MjE5MiBhY3RpdmUgKyBzdGFydHMgc2Vzc2lvblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC92ZXJpZnktc2V0dXAnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb2RlIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgIGlmICghci5vayB8fCAhZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8IGRhdGEubWVzc2FnZSB8fCAnSW52YWxpZCBjb2RlJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvZGUnKT8uZm9jdXMoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU3VjY2VzcyBcdTIwMTQgaGlkZSBldmVyeXRoaW5nIGFuZCBpbml0aWFsaXplIGRhc2hib2FyZFxuICAgICAgY2xvc2VSZWNvdmVyeVBhbmVsKCk7XG4gICAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgICAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuaW5pdGlhbGl6ZURhc2hib2FyZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3aW5kb3cuaW5pdGlhbGl6ZURhc2hib2FyZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnTmV0d29yayBlcnJvciBcdTIwMTQgdHJ5IGFnYWluJztcbiAgICB9XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgV2lyZSB1cCBoYW5kbGVycyBcdTI1MDBcdTI1MDBcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2hvdy1yZWNvdmVyeScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIG9wZW5SZWNvdmVyeVBhbmVsKCk7XG4gIH0pO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jbG9zZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlUmVjb3ZlcnlQYW5lbCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXN1Ym1pdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHN1Ym1pdFJlY292ZXJ5U2VjcmV0KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29uZmlybScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHN1Ym1pdFJlY292ZXJ5Q29kZSk7XG5cbiAgLy8gRW50ZXIga2V5IHN1Ym1pdHMgaW4gc2VjcmV0IGZpZWxkXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXNlY3JldCcpPy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzdWJtaXRSZWNvdmVyeVNlY3JldCgpOyB9XG4gIH0pO1xuICAvLyBFbnRlciBrZXkgc3VibWl0cyBpbiBjb2RlIGZpZWxkXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvZGUnKT8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7IGUucHJldmVudERlZmF1bHQoKTsgc3VibWl0UmVjb3ZlcnlDb2RlKCk7IH1cbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFB1YmxpYyBBUEkgXHUyNTAwXHUyNTAwXG4gIC8vIENhbGxlZCBieSB0b3RwLWF1dGguanMgYWZ0ZXIgc2hvd2luZyB0aGUgb3ZlcmxheSwgc28gd2UgY2FuIGRlY2lkZSB3aGV0aGVyXG4gIC8vIHRvIHNob3cgdGhlIHJlY292ZXJ5IGxpbmsuIFdlIGRvIHRoaXMgd2l0aCBhIHB1YmxpYyBlbmRwb2ludCB0aGF0IGRvZXNuJ3RcbiAgLy8gcmVxdWlyZSBhdXRoIFx1MjAxNCBwZXJmZWN0IGZvciB0aGUgbG9ja2VkLW91dCBzdGF0ZS5cbiAgd2luZG93Ll9yZWZyZXNoUmVjb3ZlcnlMaW5rID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgaW5mbyA9IGF3YWl0IGZldGNoUmVjb3ZlcnlJbmZvKCk7XG4gICAgLy8gU2hvdyB0aGUgbGluayBpbiBhbnkgbm9uLWhlYWx0aHkgc3RhdGUgKHVucmVhZGFibGUgLyBjb3JydXB0IC8gdW5rbm93bikuXG4gICAgLy8gVGhlIGhpbnQgaW5zaWRlIHRoZSBwYW5lbCB0ZWxscyB0aGUgdXNlciB3aGF0IHRoZSBhY3R1YWwgaXNzdWUgaXMuXG4gICAgaWYgKGluZm8gJiYgaW5mby5zdWNjZXNzICYmIGluZm8uc3RhdHVzICYmIGluZm8uc3RhdHVzICE9PSAnaGVhbHRoeScpIHtcbiAgICAgIHNob3dSZWNvdmVyeUxpbmsodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dSZWNvdmVyeUxpbmsoZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfTtcbn0pKCk7XG47XG4vLyA9PT09PSBFTkNSWVBURUQgVkFVTFQgLT4gU0VSVklDRSBTU08gSEFORE9GRiA9PT09PVxuKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBpc0FsbG93ZWRSZXR1cm5VcmwocmV0dXJuVXJsLCBleHBlY3RlZFNlcnZpY2VJZCkge1xuICAgIGlmICghcmV0dXJuVXJsIHx8ICFleHBlY3RlZFNlcnZpY2VJZCB8fCAhL15bYS16MC05XVthLXowLTktXSokLy50ZXN0KGV4cGVjdGVkU2VydmljZUlkKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHJldHVyblVybCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgICBjb25zdCBzdWZmaXggPSBTSVRFLnRsZC5zdGFydHNXaXRoKCcuJykgPyBTSVRFLnRsZCA6IGAuJHtTSVRFLnRsZH1gO1xuICAgICAgY29uc3QgZXhwZWN0ZWRIb3N0ID0gYCR7ZXhwZWN0ZWRTZXJ2aWNlSWR9JHtzdWZmaXh9YDtcbiAgICAgIHJldHVybiBwYXJzZWQucHJvdG9jb2wgPT09ICdodHRwczonICYmIHBhcnNlZC5ob3N0bmFtZSA9PT0gZXhwZWN0ZWRIb3N0O1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZEhhbmRvZmZUYXJnZXQocmV0dXJuVXJsLCB0b2tlbiwgZXhwZWN0ZWRTZXJ2aWNlSWQpIHtcbiAgICBpZiAoIWlzQWxsb3dlZFJldHVyblVybChyZXR1cm5VcmwsIGV4cGVjdGVkU2VydmljZUlkKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTChyZXR1cm5VcmwsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgIGlmICghdG9rZW4pIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgcmV0dXJuUGF0aCA9IGAke3BhcnNlZC5wYXRobmFtZX0ke3BhcnNlZC5zZWFyY2h9JHtwYXJzZWQuaGFzaH1gO1xuICAgIC8vIFRoZSBzaGFyZWQgKGRhc2hjYWRkeV9hdXRoKSBDYWRkeSBzbmlwcGV0IGluc3RhbGxzIHRoaXMgcHVibGljIGxhbmRpbmdcbiAgICAvLyByb3V0ZSBvbiBldmVyeSBwcm90ZWN0ZWQgaG9zdC4gSXQgcmV3cml0ZXMgdG8gL2FwaS92MS9hdXRoL3Nzby1leGNoYW5nZS5cbiAgICBwYXJzZWQucGF0aG5hbWUgPSAnL2Rhc2hjYWRkeS1zc28nO1xuICAgIHBhcnNlZC5zZWFyY2ggPSAnJztcbiAgICBwYXJzZWQuaGFzaCA9ICcnO1xuICAgIHBhcnNlZC5zZWFyY2hQYXJhbXMuc2V0KCd0b2tlbicsIHRva2VuKTtcbiAgICBwYXJzZWQuc2VhcmNoUGFyYW1zLnNldCgncmV0dXJuJywgcmV0dXJuUGF0aCk7XG4gICAgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVzdW1lKHJldHVyblVybCwgZXhwZWN0ZWRTZXJ2aWNlSWQsIHJ1bnRpbWUgPSB7fSkge1xuICAgIGlmICghaXNBbGxvd2VkUmV0dXJuVXJsKHJldHVyblVybCwgZXhwZWN0ZWRTZXJ2aWNlSWQpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZmV0Y2hGbiA9IHJ1bnRpbWUuZmV0Y2ggfHwgd2luZG93LmZldGNoLmJpbmQod2luZG93KTtcbiAgICBjb25zdCBsb2NhdGlvbk9iaiA9IHJ1bnRpbWUubG9jYXRpb24gfHwgd2luZG93LmxvY2F0aW9uO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoRm4oYC9hcGkvdjEvYXV0aC9zc28taGFuZG9mZj9zZXJ2aWNlSWQ9JHtlbmNvZGVVUklDb21wb25lbnQoZXhwZWN0ZWRTZXJ2aWNlSWQpfWAsIHtcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgICAgY2FjaGU6ICduby1zdG9yZScsXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBjb25zdCB0YXJnZXQgPSBkYXRhLnN1Y2Nlc3MgJiYgYnVpbGRIYW5kb2ZmVGFyZ2V0KHJldHVyblVybCwgZGF0YS5zc29Ub2tlbiwgZXhwZWN0ZWRTZXJ2aWNlSWQpO1xuICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBmYWxzZTtcbiAgICAgIGxvY2F0aW9uT2JqLnJlcGxhY2UodGFyZ2V0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB3aW5kb3cuRENDcmVkZW50aWFsVmF1bHQgPSB7IGlzQWxsb3dlZFJldHVyblVybCwgYnVpbGRIYW5kb2ZmVGFyZ2V0LCByZXN1bWUgfTtcbn0pKCk7O1xuLy8gPT09PT0gU0VSVklDRSBDUkVERU5USUFMUyA9PT09PVxuKGZ1bmN0aW9uKCkge1xuICBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG4gIGluamVjdE1vZGFsKCdmb2xkZXItYnJvd3Nlci1tb2RhbCcsIGA8ZGl2IGlkPVwiZm9sZGVyLWJyb3dzZXItbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDUwMHB4OyBtYXgtd2lkdGg6IDcwMHB4OyBtYXgtaGVpZ2h0OiA4MHZoO1wiPlxuICAgICAgPGgzPlx1RDgzRFx1RENDMiBCcm93c2UgZm9yIE1lZGlhIEZvbGRlcnM8L2gzPlxuXG4gICAgICA8ZGl2IGlkPVwiZm9sZGVyLWJyb3dzZXItcGF0aFwiIHN0eWxlPVwicGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlci1yYWRpdXM6IDZweDsgbWFyZ2luLWJvdHRvbTogMTJweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjlyZW07IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcIj5cbiAgICAgICAgL1xuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJmb2xkZXItYnJvd3Nlci1saXN0XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0MDBweDsgb3ZlcmZsb3cteTogYXV0bzsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkxvYWRpbmcuLi48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwiZm9sZGVyLWJyb3dzZXItc2VsZWN0ZWRcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSAxMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tc3VjY2Vzcyk7IGJvcmRlci1yYWRpdXM6IDZweDsgZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+U2VsZWN0ZWQgZm9sZGVyczo8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImZvbGRlci1icm93c2VyLXNlbGVjdGVkLWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiA2cHg7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImZvbGRlci1icm93c2VyLXNlbGVjdC1jdXJyZW50XCIgY2xhc3M9XCJidG4tYWNjZW50XCI+XG4gICAgICAgICAgKyBBZGQgQ3VycmVudCBGb2xkZXJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy1nYXBcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZm9sZGVyLWJyb3dzZXItY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImZvbGRlci1icm93c2VyLWRvbmVcIiBzdHlsZT1cImJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSAyMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1zdWNjZXNzKTsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpO1wiPkRvbmU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgaW5qZWN0TW9kYWwoJ3NlcnZpY2UtY3JlZHMtbW9kYWwnLCBgPGRpdiBpZD1cInNlcnZpY2UtY3JlZHMtbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jcmVkcy1jb250ZW50XCI+XG4gICAgICA8aDMgaWQ9XCJzdmMtY3JlZHMtdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjogMCAwIDRweDsgZm9udC1zaXplOiAxLjA1cmVtO1wiPkVuY3J5cHRlZCBDcmVkZW50aWFsIFZhdWx0PC9oMz5cbiAgICAgIDxwIGlkPVwic3ZjLWNyZWRzLWRlc2NcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTRweDtcIj5QYXNzd29yZHMgYXJlIGVuY3J5cHRlZCBhdCByZXN0IGFuZCB1c2VkIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3Ugb3BlbiB0aGlzIHNlcnZpY2UuPC9wPlxuXG4gICAgICA8IS0tIFN0YXR1cyBpbmRpY2F0b3IgLS0+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwic3ZjLWNyZWRzLWRvdFwiIGNsYXNzPVwic3RhdHVzLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gaWQ9XCJzdmMtY3JlZHMtc3RhdHVzXCIgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+Tm8gY3JlZGVudGlhbHMgc3RvcmVkPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2VlZGhvc3QgY3JlZGVudGlhbHMgKHNob3duIGZvciBleHRlcm5hbCBzZXJ2aWNlcykgLS0+XG4gICAgICA8ZGl2IGlkPVwic3ZjLWNyZWRzLXNlZWRob3N0XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1ib2xkXCI+U2VlZGhvc3QgTG9naW48L2xhYmVsPlxuICAgICAgICA8cCBjbGFzcz1cImhpbnQtbWljcm9cIj5Vc2VybmFtZSBzaGFyZWQgYWNyb3NzIGFsbCBzZXJ2aWNlcy4gUGFzc3dvcmQgaXMgcGVyLXNlcnZpY2UuPC9wPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInN2Yy1zZWVkaG9zdC11c2VyXCIgcGxhY2Vob2xkZXI9XCJVc2VybmFtZSAoc2hhcmVkKVwiIGF1dG9jb21wbGV0ZT1cInVzZXJuYW1lXCJcbiAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMHB4OyBtYXJnaW4tYm90dG9tOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCIgLz5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwic3ZjLXNlZWRob3N0LXBhc3NcIiBwbGFjZWhvbGRlcj1cIlBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwiY3VycmVudC1wYXNzd29yZFwiXG4gICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWNyZWRzXCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEFQSSBLZXkgKHNob3duIGZvciBhcnIgc2VydmljZXMgb3Igc2VydmljZXMgd2l0aCBBUEkga2V5IHN1cHBvcnQpIC0tPlxuICAgICAgPGRpdiBpZD1cInN2Yy1jcmVkcy1hcGlrZXlcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE0cHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLWJvbGRcIj5BUEkgS2V5PC9sYWJlbD5cbiAgICAgICAgPHAgY2xhc3M9XCJoaW50LW1pY3JvXCI+QnlwYXNzZXMgdGhlIGFwcCdzIG93biBsb2dpbiBzY3JlZW48L3A+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3ZjLWFwaWtleS1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiQVBJIGtleVwiXG4gICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIiAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUXVhbGl0eSBQcm9maWxlIChzaG93biBmb3IgcmFkYXJyL3NvbmFyciBvbmx5KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdmMtY3JlZHMtcXVhbGl0eVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTRweDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtYm9sZFwiPlF1YWxpdHkgUHJvZmlsZTwvbGFiZWw+XG4gICAgICAgIDxwIGNsYXNzPVwiaGludC1taWNyb1wiPlVzZWQgd2hlbiByZXF1ZXN0aW5nIHZpYSBTZWVycjwvcD5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzdmMtcXVhbGl0eS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBFbnRlciBBUEkga2V5IGZpcnN0IC0tPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInN2Yy1xdWFsaXR5LWZldGNoXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBmb250LXNpemU6IDAuNzVyZW07IGN1cnNvcjogcG9pbnRlcjsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbiAgICAgICAgICAgIEZldGNoXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic3ZjLXF1YWxpdHktc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IG1hcmdpbi10b3A6IDRweDsgbWluLWhlaWdodDogMWVtO1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUGVyLXNlcnZpY2UgQmFzaWMgQXV0aCAoc2hvd24gZm9yIG5vbi1leHRlcm5hbCBzZXJ2aWNlcykgLS0+XG4gICAgICA8ZGl2IGlkPVwic3ZjLWNyZWRzLWJhc2ljXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1ib2xkXCI+U2VydmljZSBMb2dpbjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic3ZjLWJhc2ljLXVzZXJcIiBwbGFjZWhvbGRlcj1cIlVzZXJuYW1lXCIgYXV0b2NvbXBsZXRlPVwidXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEwcHg7IG1hcmdpbi10b3A6IDZweDsgbWFyZ2luLWJvdHRvbTogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiIC8+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cInN2Yy1iYXNpYy1wYXNzXCIgcGxhY2Vob2xkZXI9XCJQYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cImN1cnJlbnQtcGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1jcmVkc1wiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBFcnJvciBtZXNzYWdlIC0tPlxuICAgICAgPGRpdiBpZD1cInN2Yy1jcmVkcy1lcnJvclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogOHB4IDEwcHg7IG1hcmdpbi1ib3R0b206IDEwcHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1lcnJvciwgI2M2MjgyOCkgMTIlLCB0cmFuc3BhcmVudCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWVycm9yLCAjYzYyODI4KTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj48L2Rpdj5cblxuICAgICAgPCEtLSBCdXR0b25zIC0tPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBtYXJnaW4tdG9wOiAxNHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwic3ZjLWNyZWRzLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDlweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgIFNhdmUgdG8gZW5jcnlwdGVkIHZhdWx0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwic3ZjLWNyZWRzLWNsZWFyXCIgc3R5bGU9XCJwYWRkaW5nOiA5cHggMTRweDsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGNvbG9yOiB2YXIoLS1iYWQtZmcsICNmZjlhYTMpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWQtZmcsICNmZjlhYTMpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtOyBkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIENsZWFyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwic3ZjLWNyZWRzLWNsb3NlXCIgc3R5bGU9XCJwYWRkaW5nOiA5cHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICBDYW5jZWxcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1jcmVkcy1tb2RhbCcpO1xuICBsZXQgY3VycmVudFNlcnZpY2UgPSBudWxsO1xuICBsZXQgY3JlZGVudGlhbFJldHVyblVybCA9IG51bGw7XG4gIGxldCBjdXJyZW50U2VydmljZUhhZENyZWRzID0gZmFsc2U7XG4gIGNvbnN0IGFyclNlcnZpY2VzID0gWydzb25hcnInLCAncmFkYXJyJywgJ3Byb3dsYXJyJywgJ292ZXJzZWVyciddO1xuICBjb25zdCBxdWFsaXR5UHJvZmlsZVNlcnZpY2VzID0gWydzb25hcnInLCAncmFkYXJyJ107XG5cbiAgZnVuY3Rpb24gZ2V0U2VydmljZVVybChzZXJ2aWNlKSB7XG4gICAgcmV0dXJuIHNlcnZpY2UuZXh0ZXJuYWxVcmwgfHwgc2VydmljZS51cmwgfHwgJyc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93RXJyb3IobXNnKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWVycm9yJyk7XG4gICAgZWwudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlkZUVycm9yKCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1lcnJvcicpO1xuICAgIGVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVTdWNjZXNzZnVsV3JpdGUocmVzcG9uc2UsIGxhYmVsKSB7XG4gICAgaWYgKCFyZXNwb25zZSkgdGhyb3cgbmV3IEVycm9yKGAke2xhYmVsfSBmYWlsZWQ6IG5vIHJlc3BvbnNlYCk7XG4gICAgbGV0IGRhdGE7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2xhYmVsfSBmYWlsZWQ6IGludmFsaWQgc2VydmVyIHJlc3BvbnNlYCk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2Uub2sgfHwgZGF0YT8uc3VjY2VzcyAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGRhdGE/LmVycm9yIHx8IGAke2xhYmVsfSBmYWlsZWQgKCR7cmVzcG9uc2Uuc3RhdHVzIHx8ICd1bmtub3duIHN0YXR1cyd9KWApO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQWxsb3dlZENyZWRlbnRpYWxSZXR1cm5VcmwocmV0dXJuVXJsLCBzZXJ2aWNlSWQpIHtcbiAgICByZXR1cm4gISF3aW5kb3cuRENDcmVkZW50aWFsVmF1bHQ/LmlzQWxsb3dlZFJldHVyblVybChyZXR1cm5VcmwsIHNlcnZpY2VJZCk7XG4gIH1cblxuICB3aW5kb3cub3BlblNlcnZpY2VDcmVkc01vZGFsID0gYXN5bmMgZnVuY3Rpb24oc2VydmljZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY3VycmVudFNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIGNyZWRlbnRpYWxSZXR1cm5VcmwgPSBpc0FsbG93ZWRDcmVkZW50aWFsUmV0dXJuVXJsKG9wdGlvbnMucmV0dXJuVXJsLCBzZXJ2aWNlLmlkKSA/IG9wdGlvbnMucmV0dXJuVXJsIDogbnVsbDtcbiAgICBjdXJyZW50U2VydmljZUhhZENyZWRzID0gZmFsc2U7XG4gICAgaGlkZUVycm9yKCk7XG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXRpdGxlJyk7XG4gICAgY29uc3QgZGVzYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtZGVzYycpO1xuICAgIGNvbnN0IHNlZWRob3N0U2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtc2VlZGhvc3QnKTtcbiAgICBjb25zdCBhcGlrZXlTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1hcGlrZXknKTtcbiAgICBjb25zdCBiYXNpY1NlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWJhc2ljJyk7XG4gICAgY29uc3QgcXVhbGl0eVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXF1YWxpdHknKTtcblxuICAgIHRpdGxlLnRleHRDb250ZW50ID0gc2VydmljZS5uYW1lICsgJyBcdTIwMTQgRW5jcnlwdGVkIFZhdWx0JztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXNhdmUnKS50ZXh0Q29udGVudCA9IGNyZWRlbnRpYWxSZXR1cm5VcmxcbiAgICAgID8gJ1NhdmUgdG8gdmF1bHQgJiBvcGVuIHNlcnZpY2UnXG4gICAgICA6ICdTYXZlIHRvIGVuY3J5cHRlZCB2YXVsdCc7XG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHNlY3Rpb25zIHRvIHNob3dcbiAgICBjb25zdCBpc0V4dCA9ICEhc2VydmljZS5pc0V4dGVybmFsO1xuICAgIGNvbnN0IGlzQXJyID0gYXJyU2VydmljZXMuaW5jbHVkZXMoc2VydmljZS5pZCkgfHwgYXJyU2VydmljZXMuaW5jbHVkZXMoc2VydmljZS5hcHBUZW1wbGF0ZSk7XG4gICAgY29uc3QgaGFzUXVhbGl0eSA9IHF1YWxpdHlQcm9maWxlU2VydmljZXMuaW5jbHVkZXMoc2VydmljZS5pZCkgfHwgcXVhbGl0eVByb2ZpbGVTZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlLmFwcFRlbXBsYXRlKTtcblxuICAgIHNlZWRob3N0U2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gaXNFeHQgPyAnJyA6ICdub25lJztcbiAgICBhcGlrZXlTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBpc0FyciA/ICcnIDogJ25vbmUnO1xuICAgIHF1YWxpdHlTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBoYXNRdWFsaXR5ID8gJycgOiAnbm9uZSc7XG4gICAgYmFzaWNTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAhaXNFeHQgPyAnJyA6ICdub25lJztcblxuICAgIC8vIFJlc2V0IHF1YWxpdHkgZHJvcGRvd25cbiAgICBjb25zdCBxdWFsU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXNlbGVjdCcpO1xuICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBFbnRlciBBUEkga2V5IGZpcnN0IC0tPC9vcHRpb24+JztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc3RhdHVzJykudGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmIChpc0V4dCkge1xuICAgICAgZGVzYy50ZXh0Q29udGVudCA9ICdTZWVkaG9zdCBjcmVkZW50aWFscyBhdXRvLWxvZ2luIHBhc3QgdGhlIEhUVFAgcHJvbXB0LiBBUEkga2V5IGJ5cGFzc2VzIHRoZSBhcHAgbG9naW4uJztcbiAgICAgIC8vIFVwZGF0ZSBwYXNzd29yZCBwbGFjZWhvbGRlciB3aXRoIHNlcnZpY2UgbmFtZVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC1wYXNzJykucGxhY2Vob2xkZXIgPSBgUGFzc3dvcmQgZm9yICR7c2VydmljZS5uYW1lfWA7XG4gICAgfSBlbHNlIGlmIChpc0Fycikge1xuICAgICAgZGVzYy50ZXh0Q29udGVudCA9ICdBUEkga2V5IGJ5cGFzc2VzIHRoZSBhcHAgbG9naW4gc2NyZWVuIGF1dG9tYXRpY2FsbHkuJztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzYy50ZXh0Q29udGVudCA9ICdDcmVkZW50aWFscyBhcmUgaW5qZWN0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFjY2Vzc2luZyB0aGlzIHNlcnZpY2UuJztcbiAgICB9XG5cbiAgICAvLyBMb2FkIGV4aXN0aW5nIGNyZWRlbnRpYWxzXG4gICAgYXdhaXQgbG9hZFNlcnZpY2VDcmVkcyhzZXJ2aWNlKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH07XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFNlcnZpY2VDcmVkcyhzZXJ2aWNlKSB7XG4gICAgY29uc3QgZG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1kb3QnKTtcbiAgICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXN0YXR1cycpO1xuICAgIGNvbnN0IGNsZWFyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1jbGVhcicpO1xuICAgIGxldCBoYXNDcmVkcyA9IGZhbHNlO1xuXG4gICAgLy8gTG9hZCBzZWVkaG9zdCBjcmVkcyAoc2hhcmVkIHVzZXJuYW1lICsgcGVyLXNlcnZpY2UgcGFzc3dvcmQpXG4gICAgaWYgKHNlcnZpY2UuaXNFeHRlcm5hbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2VlZGhvc3QtY3JlZHM/c2VydmljZUlkPSR7c2VydmljZS5pZH1gKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXVzZXInKS52YWx1ZSA9IGRhdGEudXNlcm5hbWUgfHwgJyc7XG4gICAgICAgICAgaWYgKGRhdGEuaGFzQ3JlZGVudGlhbHMpIGhhc0NyZWRzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXVzZXInKS52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXBhc3MnKS52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIC8vIExvYWQgcGVyLXNlcnZpY2UgY3JlZHNcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHtzZXJ2aWNlLmlkfS9jcmVkZW50aWFsc2ApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGlmIChkYXRhLmhhc0FwaUtleSkge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYXBpa2V5LWlucHV0JykudmFsdWUgPSAnXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyJztcbiAgICAgICAgICBoYXNDcmVkcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1hcGlrZXktaW5wdXQnKS52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmhhc0Jhc2ljQXV0aCAmJiAhc2VydmljZS5pc0V4dGVybmFsKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1iYXNpYy11c2VyJykudmFsdWUgPSBkYXRhLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgICAgIGhhc0NyZWRzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXVzZXInKS52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXBhc3MnKSkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1iYXNpYy1wYXNzJykudmFsdWUgPSAnJztcblxuICAgIC8vIExvYWQgcXVhbGl0eSBwcm9maWxlIGZvciBhcnIgc2VydmljZXNcbiAgICBjb25zdCBzdmNJZCA9IHNlcnZpY2UuaWQgfHwgc2VydmljZS5hcHBUZW1wbGF0ZTtcbiAgICBpZiAocXVhbGl0eVByb2ZpbGVTZXJ2aWNlcy5pbmNsdWRlcyhzdmNJZCkpIHtcbiAgICAgIGF3YWl0IGxvYWRRdWFsaXR5UHJvZmlsZXMoc2VydmljZSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0NyZWRzKSB7XG4gICAgICBjdXJyZW50U2VydmljZUhhZENyZWRzID0gdHJ1ZTtcbiAgICAgIGRvdC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLW9rLWZnLCAjNzRkZmM0KSc7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcsICM3NGRmYzQpJztcbiAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdDcmVkZW50aWFscyBzdG9yZWQnO1xuICAgICAgY2xlYXJCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgLy8gVXBkYXRlIHRoZSBjYXJkIGJ1dHRvblxuICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGNyZWRzLWJ0bi0ke3NlcnZpY2UuaWR9YCk7XG4gICAgICBpZiAoYnRuKSBidG4uY2xhc3NMaXN0LmFkZCgnaGFzLWNyZWRzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvdC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tbXV0ZWQpJztcbiAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdObyBjcmVkZW50aWFscyBzdG9yZWQnO1xuICAgICAgY2xlYXJCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cblxuICAvLyBGZXRjaCBhbmQgcG9wdWxhdGUgcXVhbGl0eSBwcm9maWxlcyBkcm9wZG93blxuICBhc3luYyBmdW5jdGlvbiBsb2FkUXVhbGl0eVByb2ZpbGVzKHNlcnZpY2UpIHtcbiAgICBjb25zdCBxdWFsU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXNlbGVjdCcpO1xuICAgIGNvbnN0IHF1YWxTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc3RhdHVzJyk7XG4gICAgY29uc3Qgc3ZjSWQgPSBzZXJ2aWNlLmlkIHx8IHNlcnZpY2UuYXBwVGVtcGxhdGU7XG4gICAgY29uc3Qgc3ZjVXJsID0gZ2V0U2VydmljZVVybChzZXJ2aWNlKTtcblxuICAgIGlmICghc3ZjVXJsKSB7XG4gICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gTm8gc2VydmljZSBVUkwgLS08L29wdGlvbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5Mb2FkaW5nLi4uPC9vcHRpb24+JztcbiAgICBxdWFsU3RhdHVzLnRleHRDb250ZW50ID0gJyc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHNlcnZpY2U6IHN2Y0lkLCB1cmw6IHN2Y1VybCB9KTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2Fyci9xdWFsaXR5LXByb2ZpbGVzPyR7cGFyYW1zfWApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFkYXRhLnByb2ZpbGVzPy5sZW5ndGgpIHtcbiAgICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIE5vIHByb2ZpbGVzIGZvdW5kIChlbnRlciBBUEkga2V5IGFuZCBjbGljayBGZXRjaCkgLS08L29wdGlvbj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJyc7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgZGF0YS5wcm9maWxlcykge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gcC5pZDtcbiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gcC5uYW1lO1xuICAgICAgICBxdWFsU2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByZS1zZWxlY3Qgc3RvcmVkIHByb2ZpbGUgb3IgYmVzdCBtYXRjaCBmb3IgXCI3MjBcIlxuICAgICAgaWYgKGRhdGEuc3RvcmVkUHJvZmlsZUlkKSB7XG4gICAgICAgIHF1YWxTZWxlY3QudmFsdWUgPSBTdHJpbmcoZGF0YS5zdG9yZWRQcm9maWxlSWQpO1xuICAgICAgfVxuICAgICAgaWYgKCFxdWFsU2VsZWN0LnZhbHVlKSB7XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgNzIwcC1pc2ggcHJvZmlsZVxuICAgICAgICBjb25zdCBtYXRjaDcyMCA9IGRhdGEucHJvZmlsZXMuZmluZChwID0+IC83MjAvaS50ZXN0KHAubmFtZSkpO1xuICAgICAgICBpZiAobWF0Y2g3MjApIHF1YWxTZWxlY3QudmFsdWUgPSBTdHJpbmcobWF0Y2g3MjAuaWQpO1xuICAgICAgfVxuICAgICAgaWYgKCFxdWFsU2VsZWN0LnZhbHVlICYmIGRhdGEucHJvZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgIHF1YWxTZWxlY3QudmFsdWUgPSBTdHJpbmcoZGF0YS5wcm9maWxlc1swXS5pZCk7XG4gICAgICB9XG5cbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW9rLWZnKTtcIj4ke2RhdGEucHJvZmlsZXMubGVuZ3RofSBwcm9maWxlcyBsb2FkZWQ8L3NwYW4+YDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gRmFpbGVkIHRvIGxvYWQgLS08L29wdGlvbj4nO1xuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPkVycm9yOiAke2UubWVzc2FnZX08L3NwYW4+YDtcbiAgICB9XG4gIH1cblxuICAvLyBGZXRjaCBidXR0b24gZm9yIHF1YWxpdHkgcHJvZmlsZXNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LWZldGNoJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY3VycmVudFNlcnZpY2UpIHJldHVybjtcbiAgICBjb25zdCBzdmNJZCA9IGN1cnJlbnRTZXJ2aWNlLmlkIHx8IGN1cnJlbnRTZXJ2aWNlLmFwcFRlbXBsYXRlO1xuICAgIGNvbnN0IHN2Y1VybCA9IGdldFNlcnZpY2VVcmwoY3VycmVudFNlcnZpY2UpO1xuICAgIGNvbnN0IGFwaUtleUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1hcGlrZXktaW5wdXQnKTtcbiAgICBjb25zdCBhcGlLZXkgPSBhcGlLZXlJbnB1dD8udmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IHF1YWxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc2VsZWN0Jyk7XG4gICAgY29uc3QgcXVhbFN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zdGF0dXMnKTtcblxuICAgIGlmICghc3ZjVXJsKSB7XG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1lcnJvciwgI2M2MjgyOCk7XCI+Tm8gc2VydmljZSBVUkwgYXZhaWxhYmxlPC9zcGFuPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghYXBpS2V5IHx8IGFwaUtleSA9PT0gJ1x1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMicpIHtcbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj5FbnRlciBhbiBBUEkga2V5IGZpcnN0PC9zcGFuPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPkZldGNoaW5nLi4uPC9vcHRpb24+JztcbiAgICBxdWFsU3RhdHVzLnRleHRDb250ZW50ID0gJyc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHNlcnZpY2U6IHN2Y0lkLCB1cmw6IHN2Y1VybCwgYXBpS2V5IH0pO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvYXJyL3F1YWxpdHktcHJvZmlsZXM/JHtwYXJhbXN9YCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIEVycm9yIC0tPC9vcHRpb24+JztcbiAgICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPiR7ZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGZldGNoIHByb2ZpbGVzJ308L3NwYW4+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRhdGEucHJvZmlsZXM/Lmxlbmd0aCkge1xuICAgICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gTm8gcHJvZmlsZXMgZm91bmQgLS08L29wdGlvbj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJyc7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgZGF0YS5wcm9maWxlcykge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gcC5pZDtcbiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gcC5uYW1lO1xuICAgICAgICBxdWFsU2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByZS1zZWxlY3QgNzIwcCBtYXRjaFxuICAgICAgY29uc3QgbWF0Y2g3MjAgPSBkYXRhLnByb2ZpbGVzLmZpbmQocCA9PiAvNzIwL2kudGVzdChwLm5hbWUpKTtcbiAgICAgIGlmIChtYXRjaDcyMCkgcXVhbFNlbGVjdC52YWx1ZSA9IFN0cmluZyhtYXRjaDcyMC5pZCk7XG4gICAgICBlbHNlIGlmIChkYXRhLnByb2ZpbGVzLmxlbmd0aCkgcXVhbFNlbGVjdC52YWx1ZSA9IFN0cmluZyhkYXRhLnByb2ZpbGVzWzBdLmlkKTtcblxuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiR7ZGF0YS5wcm9maWxlcy5sZW5ndGh9IHByb2ZpbGVzIGxvYWRlZDwvc3Bhbj5gO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBFcnJvciAtLTwvb3B0aW9uPic7XG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1lcnJvciwgI2M2MjgyOCk7XCI+JHtlLm1lc3NhZ2V9PC9zcGFuPmA7XG4gICAgfVxuICB9KTtcblxuICAvLyBTYXZlIGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjdXJyZW50U2VydmljZSkgcmV0dXJuO1xuICAgIGNvbnN0IHNhdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXNhdmUnKTtcbiAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmluZy4uLic7XG4gICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgaGlkZUVycm9yKCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgaXNBcnIgPSBhcnJTZXJ2aWNlcy5pbmNsdWRlcyhjdXJyZW50U2VydmljZS5pZCkgfHwgYXJyU2VydmljZXMuaW5jbHVkZXMoY3VycmVudFNlcnZpY2UuYXBwVGVtcGxhdGUpO1xuICAgICAgY29uc3Qgc3ZjSWQgPSBjdXJyZW50U2VydmljZS5pZCB8fCBjdXJyZW50U2VydmljZS5hcHBUZW1wbGF0ZTtcblxuICAgICAgaWYgKGNyZWRlbnRpYWxSZXR1cm5VcmwgJiYgIWN1cnJlbnRTZXJ2aWNlSGFkQ3JlZHMpIHtcbiAgICAgICAgY29uc3QgZXh0ZXJuYWxVc2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC11c2VyJykudmFsdWUudHJpbSgpO1xuICAgICAgICBjb25zdCBleHRlcm5hbFBhc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXBhc3MnKS52YWx1ZTtcbiAgICAgICAgY29uc3QgYXBpS2V5SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWFwaWtleS1pbnB1dCcpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ZWRBcGlLZXkgPSBhcGlLZXlJbnB1dD8udmFsdWUudHJpbSgpO1xuICAgICAgICBjb25zdCBiYXNpY1VzZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXVzZXInKS52YWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnN0IGJhc2ljUGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtcGFzcycpLnZhbHVlO1xuICAgICAgICBjb25zdCBoYXNFeHRlcm5hbExvZ2luID0gY3VycmVudFNlcnZpY2UuaXNFeHRlcm5hbCAmJiBleHRlcm5hbFVzZXIgJiYgZXh0ZXJuYWxQYXNzO1xuICAgICAgICBjb25zdCBoYXNBcGlLZXkgPSBpc0FyciAmJiByZXF1ZXN0ZWRBcGlLZXkgJiYgcmVxdWVzdGVkQXBpS2V5ICE9PSAnXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyJztcbiAgICAgICAgY29uc3QgaGFzQmFzaWNMb2dpbiA9ICFjdXJyZW50U2VydmljZS5pc0V4dGVybmFsICYmIGJhc2ljVXNlciAmJiBiYXNpY1Bhc3M7XG4gICAgICAgIGlmICghaGFzRXh0ZXJuYWxMb2dpbiAmJiAhaGFzQXBpS2V5ICYmICFoYXNCYXNpY0xvZ2luKSB7XG4gICAgICAgICAgc2hvd0Vycm9yKCdFbnRlciB0aGUgbG9naW4gb3IgQVBJIGtleSBEYXNoQ2FkZHkgc2hvdWxkIHN0b3JlIGZvciB0aGlzIHNlcnZpY2UuJyk7XG4gICAgICAgICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZlIHRvIHZhdWx0ICYgb3BlbiBzZXJ2aWNlJztcbiAgICAgICAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmUgc2VlZGhvc3QgY3JlZHMgKHNoYXJlZCB1c2VybmFtZSArIHBlci1zZXJ2aWNlIHBhc3N3b3JkKVxuICAgICAgaWYgKGN1cnJlbnRTZXJ2aWNlLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgY29uc3QgdXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtdXNlcicpLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgY29uc3QgcGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtcGFzcycpLnZhbHVlO1xuICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc2VlZGhvc3QtY3JlZHMnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB1c2VybmFtZTogdXNlciwgcGFzc3dvcmQ6IHBhc3MgfHwgdW5kZWZpbmVkLCBzZXJ2aWNlSWQ6IGN1cnJlbnRTZXJ2aWNlLmlkIH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXdhaXQgcmVxdWlyZVN1Y2Nlc3NmdWxXcml0ZShyZXNwb25zZSwgJ1NlZWRob3N0IGNyZWRlbnRpYWwgc2F2ZScpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmUgQVBJIGtleSBcdTIwMTQgZm9yIGFyciBzZXJ2aWNlcywgdXNlIHRoZSBhcnIgY3JlZGVudGlhbHMgZW5kcG9pbnQgKGNvcnJlY3QgbmFtZXNwYWNlKVxuICAgICAgY29uc3QgYXBpS2V5SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWFwaWtleS1pbnB1dCcpO1xuICAgICAgY29uc3QgYXBpS2V5ID0gYXBpS2V5SW5wdXQ/LnZhbHVlLnRyaW0oKTtcbiAgICAgIGlmIChhcGlLZXkgJiYgYXBpS2V5ICE9PSAnXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyXHUyMDIyJykge1xuICAgICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgICAvLyBVc2UgYXJyIGNyZWRlbnRpYWxzIGVuZHBvaW50IFx1MjAxNCB2YWxpZGF0ZXMga2V5LCB0ZXN0cyBjb25uZWN0aW9uLCBzdG9yZXMgaW4gYXJyLiogbmFtZXNwYWNlXG4gICAgICAgICAgY29uc3Qgc3ZjVXJsID0gZ2V0U2VydmljZVVybChjdXJyZW50U2VydmljZSk7XG4gICAgICAgICAgY29uc3QgcXVhbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zZWxlY3QnKTtcbiAgICAgICAgICBjb25zdCBxdWFsaXR5UHJvZmlsZUlkID0gcXVhbFNlbGVjdD8udmFsdWUgPyBwYXJzZUludChxdWFsU2VsZWN0LnZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCBxdWFsaXR5UHJvZmlsZU5hbWUgPSBxdWFsU2VsZWN0Py5zZWxlY3RlZE9wdGlvbnM/LlswXT8udGV4dENvbnRlbnQgfHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXJyL2NyZWRlbnRpYWxzJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgc2VydmljZTogc3ZjSWQsXG4gICAgICAgICAgICAgIGFwaUtleSxcbiAgICAgICAgICAgICAgdXJsOiBzdmNVcmwgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBxdWFsaXR5UHJvZmlsZUlkOiBxdWFsaXR5UHJvZmlsZUlkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcXVhbGl0eVByb2ZpbGVOYW1lOiBxdWFsaXR5UHJvZmlsZU5hbWUgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXF1aXJlU3VjY2Vzc2Z1bFdyaXRlKHJlcywgJ0FSUiBjcmVkZW50aWFsIHNhdmUnKTtcbiAgICAgICAgICBpZiAoZGF0YS5jb25uZWN0aW9uVGVzdCAmJiAhZGF0YS5jb25uZWN0aW9uVGVzdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICBzaG93RXJyb3IoYEFQSSBrZXkgc2F2ZWQgYnV0IGNvbm5lY3Rpb24gdGVzdCBmYWlsZWQ6ICR7ZGF0YS5jb25uZWN0aW9uVGVzdC5lcnJvcn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm9uLWFyciBzZXJ2aWNlcyB1c2UgdGhlIGdlbmVyaWMgZW5kcG9pbnRcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7Y3VycmVudFNlcnZpY2UuaWR9L2NyZWRlbnRpYWxzYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYXBpS2V5IH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXdhaXQgcmVxdWlyZVN1Y2Nlc3NmdWxXcml0ZShyZXNwb25zZSwgJ0FQSSBrZXkgc2F2ZScpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQXJyICYmIHF1YWxpdHlQcm9maWxlU2VydmljZXMuaW5jbHVkZXMoc3ZjSWQpKSB7XG4gICAgICAgIC8vIEFQSSBrZXkgdW5jaGFuZ2VkIGJ1dCB1c2VyIG1heSBoYXZlIGNoYW5nZWQgcXVhbGl0eSBwcm9maWxlIFx1MjAxNCBzYXZlIHByb2ZpbGUgb25seVxuICAgICAgICBjb25zdCBxdWFsU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXNlbGVjdCcpO1xuICAgICAgICBjb25zdCBxdWFsaXR5UHJvZmlsZUlkID0gcXVhbFNlbGVjdD8udmFsdWUgPyBwYXJzZUludChxdWFsU2VsZWN0LnZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcXVhbGl0eVByb2ZpbGVOYW1lID0gcXVhbFNlbGVjdD8uc2VsZWN0ZWRPcHRpb25zPy5bMF0/LnRleHRDb250ZW50IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHF1YWxpdHlQcm9maWxlSWQpIHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Fyci9xdWFsaXR5LXByb2ZpbGVzJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmljZTogc3ZjSWQsIHF1YWxpdHlQcm9maWxlSWQsIHF1YWxpdHlQcm9maWxlTmFtZSB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGF3YWl0IHJlcXVpcmVTdWNjZXNzZnVsV3JpdGUocmVzcG9uc2UsICdRdWFsaXR5IHByb2ZpbGUgc2F2ZScpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNhdmUgcGVyLXNlcnZpY2UgYmFzaWMgYXV0aFxuICAgICAgaWYgKCFjdXJyZW50U2VydmljZS5pc0V4dGVybmFsKSB7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXVzZXInKS52YWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnN0IHBhc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXBhc3MnKS52YWx1ZTtcbiAgICAgICAgaWYgKHVzZXIgJiYgcGFzcykge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHtjdXJyZW50U2VydmljZS5pZH0vY3JlZGVudGlhbHNgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB1c2VybmFtZTogdXNlciwgcGFzc3dvcmQ6IHBhc3MgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhd2FpdCByZXF1aXJlU3VjY2Vzc2Z1bFdyaXRlKHJlc3BvbnNlLCAnU2VydmljZSBjcmVkZW50aWFsIHNhdmUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBsb2FkU2VydmljZUNyZWRzKGN1cnJlbnRTZXJ2aWNlKTtcbiAgICAgIGlmIChjcmVkZW50aWFsUmV0dXJuVXJsKSB7XG4gICAgICAgIGNvbnN0IHJldHVyblVybCA9IGNyZWRlbnRpYWxSZXR1cm5Vcmw7XG4gICAgICAgIGNvbnN0IHJlc3VtZWQgPSBhd2FpdCB3aW5kb3cuRENDcmVkZW50aWFsVmF1bHQ/LnJlc3VtZShyZXR1cm5VcmwsIGN1cnJlbnRTZXJ2aWNlLmlkKTtcbiAgICAgICAgaWYgKCFyZXN1bWVkKSB0aHJvdyBuZXcgRXJyb3IoJ0NyZWRlbnRpYWwgc2F2ZWQsIGJ1dCB0aGUgc2VjdXJlIHNlcnZpY2UgaGFuZG9mZiBmYWlsZWQuIFRyeSBvcGVuaW5nIHRoZSBzZXJ2aWNlIGFnYWluLicpO1xuICAgICAgICBjcmVkZW50aWFsUmV0dXJuVXJsID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1NlcnZpY2VDcmVkZW50aWFsc10gU2F2ZScsIGUsIHsgZnVuY3Rpb246ICdzYXZlQ3JlZGVudGlhbHMnIH0pO1xuICAgICAgc2hvd0Vycm9yKCdGYWlsZWQgdG8gc2F2ZTogJyArIChlLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InKSk7XG4gICAgfVxuICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSBjcmVkZW50aWFsUmV0dXJuVXJsID8gJ1NhdmUgdG8gdmF1bHQgJiBvcGVuIHNlcnZpY2UnIDogJ1NhdmUgdG8gZW5jcnlwdGVkIHZhdWx0JztcbiAgICBzYXZlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gIH0pO1xuXG4gIC8vIENsZWFyIGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWNsZWFyJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY3VycmVudFNlcnZpY2UpIHJldHVybjtcbiAgICBpZiAoIWNvbmZpcm0oYFJlbW92ZSBzdG9yZWQgY3JlZGVudGlhbHMgZm9yICR7Y3VycmVudFNlcnZpY2UubmFtZX0/YCkpIHJldHVybjtcbiAgICBoaWRlRXJyb3IoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3ZjSWQgPSBjdXJyZW50U2VydmljZS5pZCB8fCBjdXJyZW50U2VydmljZS5hcHBUZW1wbGF0ZTtcbiAgICAgIGNvbnN0IGlzQXJyID0gYXJyU2VydmljZXMuaW5jbHVkZXMoc3ZjSWQpO1xuICAgICAgaWYgKGN1cnJlbnRTZXJ2aWNlLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9zZWVkaG9zdC1jcmVkcz9zZXJ2aWNlSWQ9JHtjdXJyZW50U2VydmljZS5pZH1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICAgIGF3YWl0IHJlcXVpcmVTdWNjZXNzZnVsV3JpdGUocmVzcG9uc2UsICdTZWVkaG9zdCBjcmVkZW50aWFsIHJlbW92YWwnKTtcbiAgICAgIH1cbiAgICAgIC8vIERlbGV0ZSBmcm9tIGJvdGggbmFtZXNwYWNlc1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9zZXJ2aWNlcy8ke2N1cnJlbnRTZXJ2aWNlLmlkfS9jcmVkZW50aWFsc2AsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIGF3YWl0IHJlcXVpcmVTdWNjZXNzZnVsV3JpdGUocmVzcG9uc2UsICdTZXJ2aWNlIGNyZWRlbnRpYWwgcmVtb3ZhbCcpO1xuICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIGNvbnN0IGFyclJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvYXJyL2NyZWRlbnRpYWxzLyR7c3ZjSWR9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgICBhd2FpdCByZXF1aXJlU3VjY2Vzc2Z1bFdyaXRlKGFyclJlc3BvbnNlLCAnQVJSIGNyZWRlbnRpYWwgcmVtb3ZhbCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGNyZWRzLWJ0bi0ke2N1cnJlbnRTZXJ2aWNlLmlkfWApO1xuICAgICAgaWYgKGJ0bikgYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy1jcmVkcycpO1xuICAgICAgYXdhaXQgbG9hZFNlcnZpY2VDcmVkcyhjdXJyZW50U2VydmljZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbU2VydmljZUNyZWRlbnRpYWxzXSBDbGVhcicsIGUsIHsgZnVuY3Rpb246ICdjbGVhckNyZWRlbnRpYWxzJyB9KTtcbiAgICAgIHNob3dFcnJvcignRmFpbGVkIHRvIGNsZWFyOiAnICsgKGUubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcicpKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENsb3NlIGJ1dHRvbiAvIGJhY2tkcm9wXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtY2xvc2UnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIGN1cnJlbnRTZXJ2aWNlID0gbnVsbDtcbiAgICBjcmVkZW50aWFsUmV0dXJuVXJsID0gbnVsbDtcbiAgfSk7XG4gIG1vZGFsPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkge1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgY3VycmVudFNlcnZpY2UgPSBudWxsO1xuICAgICAgY3JlZGVudGlhbFJldHVyblVybCA9IG51bGw7XG4gICAgfVxuICB9KTtcblxuICAvLyBDaGVjayBjcmVkZW50aWFsIHN0YXR1cyBmb3IgYWxsIHNlcnZpY2VzIG9uIHBhZ2UgbG9hZCAodXBkYXRlIGtleSBidXR0b24gaGlnaGxpZ2h0cylcbiAgd2luZG93LnJlZnJlc2hDcmVkc0J1dHRvbnMgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBhcHAgb2YgKHdpbmRvdy5BUFBTIHx8IFtdKSkge1xuICAgICAgICBpZiAoIWFwcC5pc0V4dGVybmFsICYmICFhcHAuYXBwVGVtcGxhdGUgJiYgIWFwcC51cmwpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgaGFzQ3JlZHMgPSBmYWxzZTtcbiAgICAgICAgaWYgKGFwcC5pc0V4dGVybmFsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNlZWRSZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZWVkaG9zdC1jcmVkcz9zZXJ2aWNlSWQ9JHthcHAuaWR9YCk7XG4gICAgICAgICAgICBjb25zdCBzZWVkRGF0YSA9IGF3YWl0IHNlZWRSZXMuanNvbigpO1xuICAgICAgICAgICAgaWYgKHNlZWREYXRhLnN1Y2Nlc3MgJiYgc2VlZERhdGEuaGFzQ3JlZGVudGlhbHMpIGhhc0NyZWRzID0gdHJ1ZTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHthcHAuaWR9L2NyZWRlbnRpYWxzYCk7XG4gICAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICAgIGlmIChkLnN1Y2Nlc3MgJiYgKGQuaGFzQXBpS2V5IHx8IGQuaGFzQmFzaWNBdXRoKSkgaGFzQ3JlZHMgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBjcmVkcy1idG4tJHthcHAuaWR9YCk7XG4gICAgICAgIGlmIChidG4pIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdoYXMtY3JlZHMnLCBoYXNDcmVkcyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICB9O1xuXG4gIC8vIFByb3RlY3RlZCBzZXJ2aWNlIGxvZ2luIHBhZ2VzIHNlbmQgbWlzc2luZyBjcmVkZW50aWFscyBoZXJlLiBSZXVzZSB0aGVcbiAgLy8gbm9ybWFsIHZhdWx0IGZvcm0sIHRoZW4gcmVzdW1lIHRocm91Z2ggdGhlIGV4aXN0aW5nIG9uZS10aW1lIFNTTyBoYW5kb2ZmLlxuICB3aW5kb3cub3BlblJlcXVlc3RlZENyZWRlbnRpYWxGb3JtID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICBjb25zdCBzZXJ2aWNlSWQgPSBwYXJhbXMuZ2V0KCdjcmVkZW50aWFscycpO1xuICAgIGlmICghc2VydmljZUlkKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgc2VydmljZSA9ICh3aW5kb3cuQVBQUyB8fCBbXSkuZmluZChhcHAgPT4gYXBwLmlkID09PSBzZXJ2aWNlSWQgfHwgYXBwLmFwcFRlbXBsYXRlID09PSBzZXJ2aWNlSWQpO1xuICAgIGlmICghc2VydmljZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJldHVyblVybCA9IHBhcmFtcy5nZXQoJ3JldHVybicpO1xuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgJycsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgd2luZG93Lm9wZW5TZXJ2aWNlQ3JlZHNNb2RhbChzZXJ2aWNlLCB7IHJldHVyblVybCB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn0pKCk7XG47XG4vLyA9PT09PSBUT1RQIFNFVFRJTkdTID09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcbiAgaW5qZWN0TW9kYWwoJ3RvdHAtc2V0dGluZ3MtbW9kYWwnLCBgPGRpdiBpZD1cInRvdHAtc2V0dGluZ3MtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDQyMHB4OyBtYXgtd2lkdGg6IDUyMHB4O1wiPlxuICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwIDAgMTZweDsgZm9udC1zaXplOiAxLjFyZW07XCI+QXV0aGVudGljYXRpb24gU2V0dGluZ3M8L2gzPlxuXG4gICAgICA8IS0tIFN0YXR1cyBCYW5uZXIgLS0+XG4gICAgICA8ZGl2IGlkPVwidG90cC1zdGF0dXMtYmFubmVyXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nOiAxMnB4IDE2cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwidG90cC1zdGF0dXMtZG90XCIgY2xhc3M9XCJzdGF0dXMtZG90XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBpZD1cInRvdHAtc3RhdHVzLXRleHRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC45cmVtO1wiPlRPVFAgaXMgbm90IGNvbmZpZ3VyZWQ8L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZXR1cCBCdXR0b24gKG5vdCBjb25maWd1cmVkIHN0YXRlKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ0b3RwLXNldHVwLXNlY3Rpb25cIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtc2V0dXAtYnRuXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTJweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjk1cmVtO1wiPlxuICAgICAgICAgIEdlbmVyYXRlIE5ldyBTZWNyZXRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgbWFyZ2luOiAxMHB4IDAgMDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlci1saW5lXCI+PC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRpbnktbXV0ZWRcIj5vcjwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlci1saW5lXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5JbXBvcnQgYW4gZXhpc3Rpbmcgc2VjcmV0IGtleTo8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLXRvcDogNnB4O1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ0b3RwLWltcG9ydC1rZXlcIiBwbGFjZWhvbGRlcj1cIlBhc3RlIHlvdXIgQmFzZTMyIGtleVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjlyZW07IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGxldHRlci1zcGFjaW5nOiAxcHg7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XCIgLz5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLWltcG9ydC1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC44NXJlbTsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbiAgICAgICAgICAgICAgSW1wb3J0XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwidG90cC1pbXBvcnQtZXJyb3JcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNmZjlhYTMpOyBmb250LXNpemU6IDAuOHJlbTsgbWluLWhlaWdodDogMS4yZW07IG1hcmdpbi10b3A6IDZweDtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZWNyZXQgRGlzcGxheSAoc2V0dXAgZmxvdykgLS0+XG4gICAgICA8ZGl2IGlkPVwidG90cC1xci1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8IS0tIE1hbnVhbCBLZXkgKHByaW1hcnkgLSBmb3IgV2luQXV0aC9kZXNrdG9wIGF1dGhlbnRpY2F0b3JzKSAtLT5cbiAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDhweDtcIj5Db3B5IHRoaXMga2V5IGludG8geW91ciBhdXRoZW50aWNhdG9yIGFwcDo8L3A+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgIDxjb2RlIGlkPVwidG90cC1tYW51YWwta2V5XCIgc3R5bGU9XCJmbGV4OiAxOyBkaXNwbGF5OiBibG9jazsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tYmcsICMwYjBmMWEpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMXJlbTsgZm9udC1mYW1pbHk6ICdTYW1pIEdyb3Rlc2snLCBtb25vc3BhY2U7IGxldHRlci1zcGFjaW5nOiAycHg7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgdXNlci1zZWxlY3Q6IGFsbDsgY29sb3I6IHZhcigtLWZnKTtcIj48L2NvZGU+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtY29weS1rZXlcIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTRweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMXJlbTsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgY29sb3I6IHZhcigtLWZnKTtcIiB0aXRsZT1cIkNvcHkgdG8gY2xpcGJvYXJkXCI+XHVEODNEXHVEQ0NCPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRG93bmxvYWQgYmFja3VwIGZpbGUgKHJlY292ZXJ5IGFpZCkgLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWJnLCAjMGIwZjFhKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZsZXg6IDE7XCI+XG4gICAgICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjogdmFyKC0tZmcpO1wiPlNhdmUgYSBiYWNrdXAgZmlsZTwvc3Ryb25nPiBcdTIwMTQgaWYgeW91IGV2ZXIgbG9zZSB5b3VyIGF1dGhlbnRpY2F0b3IsXG4gICAgICAgICAgICAgIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIHJlY292ZXIgd2l0aG91dCBTU0ggYWNjZXNzIHRvIHRoZSBzZXJ2ZXIuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1kb3dubG9hZC1iYWNrdXBcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTRweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC44NXJlbTsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbiAgICAgICAgICAgICAgXHUyQjA3IERvd25sb2FkXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBRUiBDb2RlIChzZWNvbmRhcnkgLSBmb3IgbW9iaWxlIGFwcHMpIC0tPlxuICAgICAgICA8ZGV0YWlscyBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgICAgPHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlNob3cgUVIgY29kZSAoZm9yIG1vYmlsZSBhdXRoZW50aWNhdG9yIGFwcHMpPC9zdW1tYXJ5PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IG1hcmdpbi10b3A6IDhweDtcIj5cbiAgICAgICAgICAgIDxpbWcgaWQ9XCJ0b3RwLXFyLWltYWdlXCIgc3R5bGU9XCJ3aWR0aDogMTgwcHg7IGhlaWdodDogMTgwcHg7IGJvcmRlci1yYWRpdXM6IDhweDtcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2RldGFpbHM+XG5cbiAgICAgICAgPCEtLSBWZXJpZnkgRmlyc3QgQ29kZSAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBwYWRkaW5nLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb250LWJvbGQtc21cIj5FbnRlciBjb2RlIHRvIGNvbmZpcm0gc2V0dXA6PC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi10b3A6IDhweDtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwidG90cC1zZXR1cC1jb2RlXCIgbWF4bGVuZ3RoPVwiNlwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBwYXR0ZXJuPVwiWzAtOV17Nn1cIiBwbGFjZWhvbGRlcj1cIjAwMDAwMFwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMS4zcmVtOyBwYWRkaW5nOiAxMHB4OyBmb250LWZhbWlseTogJ1NhbWkgR3JvdGVzaycsIG1vbm9zcGFjZTsgbGV0dGVyLXNwYWNpbmc6IDRweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA4cHg7IG91dGxpbmU6IG5vbmU7XCIgLz5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLWNvbmZpcm0tc2V0dXBcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMjBweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDtcIj5cbiAgICAgICAgICAgICAgQ29uZmlybVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInRvdHAtc2V0dXAtZXJyb3JcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNmZjlhYTMpOyBmb250LXNpemU6IDAuOHJlbTsgbWluLWhlaWdodDogMS4yZW07IG1hcmdpbi10b3A6IDZweDtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZXNzaW9uIER1cmF0aW9uIChhY3RpdmUgc3RhdGUpIC0tPlxuICAgICAgPGRpdiBpZD1cInRvdHAtZHVyYXRpb24tc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTJweDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9udC1ib2xkLXNtXCI+U2Vzc2lvbiBEdXJhdGlvbjo8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwidG90cC1kdXJhdGlvbi1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW4tdG9wOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnLCAjMGIwZjFhKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogOHB4OyBmb250LXNpemU6IDAuOXJlbTsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxNW1cIj4xNSBtaW51dGVzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjMwbVwiPjMwIG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMWhcIj4xIGhvdXI8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMmhcIj4yIGhvdXJzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjRoXCI+NCBob3Vyczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI4aFwiPjggaG91cnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMTJoXCI+MTIgaG91cnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMjRoXCI+MjQgaG91cnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibmV2ZXJcIj5OZXZlciAoZGlzYWJsZSBUT1RQKTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogNHB4IDAgMDtcIj5Ib3cgbG9uZyBiZWZvcmUgeW91IG5lZWQgdG8gcmUtZW50ZXIgeW91ciBjb2RlPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRGlzYWJsZSBCdXR0b24gKGFjdGl2ZSBzdGF0ZSkgLS0+XG4gICAgICA8ZGl2IGlkPVwidG90cC1kaXNhYmxlLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmctdG9wOiAxNnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtZGlzYWJsZS1idG5cIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuOXJlbTtcIj5cbiAgICAgICAgICBEaXNhYmxlIFRPVFBcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDbG9zZSAtLT5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtbW9kYWwtY2xvc2VcIiBzdHlsZT1cInBhZGRpbmc6IDhweCAyMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICBDbG9zZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkVG90cFNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL2NvbmZpZycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgcmV0dXJuO1xuXG4gICAgICBjb25zdCB7IGVuYWJsZWQsIHNlc3Npb25EdXJhdGlvbiwgaXNTZXRVcCB9ID0gZGF0YS5jb25maWc7XG4gICAgICBjb25zdCBzdGF0dXNEb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zdGF0dXMtZG90Jyk7XG4gICAgICBjb25zdCBzdGF0dXNUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc3RhdHVzLXRleHQnKTtcbiAgICAgIGNvbnN0IHN0YXR1c0Jhbm5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXN0YXR1cy1iYW5uZXInKTtcbiAgICAgIGNvbnN0IHNldHVwU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLXNlY3Rpb24nKTtcbiAgICAgIGNvbnN0IHFyU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXFyLXNlY3Rpb24nKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWR1cmF0aW9uLXNlY3Rpb24nKTtcbiAgICAgIGNvbnN0IGRpc2FibGVTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZGlzYWJsZS1zZWN0aW9uJyk7XG5cbiAgICAgIGlmIChlbmFibGVkICYmIGlzU2V0VXApIHtcbiAgICAgICAgc3RhdHVzRG90LnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tb2stZmcsICM3ZWYyZmYpJztcbiAgICAgICAgc3RhdHVzQmFubmVyLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLW9rLWZnLCAjN2VmMmZmKSc7XG4gICAgICAgIHN0YXR1c0Jhbm5lci5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1vay1mZykgOCUsIHRyYW5zcGFyZW50KSc7XG4gICAgICAgIHN0YXR1c1RleHQudGV4dENvbnRlbnQgPSAnVE9UUCBpcyBhY3RpdmUnO1xuICAgICAgICBzdGF0dXNUZXh0LnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnLCAjN2VmMmZmKSc7XG4gICAgICAgIC8vIEtlZXAgdGhlIHNldHVwIHNlY3Rpb24gdmlzaWJsZSAoY29sbGFwc2VkKSBzbyB0aGUgXCJJbXBvcnQgZXhpc3RpbmdcbiAgICAgICAgLy8gc2VjcmV0XCIgb3B0aW9uIGlzIGFsd2F5cyByZWFjaGFibGUgXHUyMDE0IHVzZXJzIG1heSBuZWVkIHRvIHJlLWVucm9sbFxuICAgICAgICAvLyB0aGVpciBhdXRoZW50aWNhdG9yIHdpdGggdGhlIHNhbWUgc2VjcmV0IGZyb20gYSBiYWNrdXAgZmlsZS5cbiAgICAgICAgc2V0dXBTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBjb25zdCBzZXR1cEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWJ0bicpO1xuICAgICAgICBpZiAoc2V0dXBCdG4pIHNldHVwQnRuLnRleHRDb250ZW50ID0gJ0dlbmVyYXRlIE5ldyBTZWNyZXQnO1xuICAgICAgICAvLyBIaWRlIHRoZSBRUiBzZWN0aW9uIGJ5IGRlZmF1bHQgaW4gdGhlIGFjdGl2ZSBzdGF0ZSBcdTIwMTQgc2V0dXBCdG4gY2xpY2sgc2hvd3MgaXRcbiAgICAgICAgcXJTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGR1cmF0aW9uU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgZGlzYWJsZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWR1cmF0aW9uLXNlbGVjdCcpLnZhbHVlID0gc2Vzc2lvbkR1cmF0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHVzRG90LnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tbXV0ZWQpJztcbiAgICAgICAgc3RhdHVzQmFubmVyLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLWJvcmRlciknO1xuICAgICAgICBzdGF0dXNCYW5uZXIuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgIHN0YXR1c1RleHQudGV4dENvbnRlbnQgPSAnVE9UUCBpcyBub3QgY29uZmlndXJlZCc7XG4gICAgICAgIHN0YXR1c1RleHQuc3R5bGUuY29sb3IgPSAndmFyKC0tbXV0ZWQpJztcbiAgICAgICAgc2V0dXBTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBxclNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZHVyYXRpb25TZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRpc2FibGVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgQXV0aCBjYXJkIGluIHRoZSB0b3Agcm93XG4gICAgICB1cGRhdGVBdXRoQ2FyZChlbmFibGVkICYmIGlzU2V0VXAsIHNlc3Npb25EdXJhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gbG9hZCBUT1RQIHNldHRpbmdzOicsIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIER1cmF0aW9uIGxhYmVsIGhlbHBlclxuICBjb25zdCBEVVJBVElPTl9MQUJFTFMgPSB7XG4gICAgJzE1bSc6ICcxNSBtaW4nLCAnMzBtJzogJzMwIG1pbicsICcxaCc6ICcxIGhvdXInLCAnMmgnOiAnMiBob3VycycsXG4gICAgJzRoJzogJzQgaG91cnMnLCAnOGgnOiAnOCBob3VycycsICcxMmgnOiAnMTIgaG91cnMnLCAnMjRoJzogJzI0IGhvdXJzJywgJ25ldmVyJzogJ0Rpc2FibGVkJ1xuICB9O1xuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZWQoa2V5LCBmYWxsYmFjaykge1xuICAgIGNvbnN0IGkxOG4gPSB3aW5kb3cuRENJMThuO1xuICAgIHJldHVybiBpMThuICYmIGkxOG4uaXNMb2FkZWQoKSA/IGkxOG4udChrZXkpIDogZmFsbGJhY2s7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVBdXRoQ2FyZChhY3RpdmUsIGR1cmF0aW9uKSB7XG4gICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLWNhcmQnKTtcbiAgICBjb25zdCBwaWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtcGlsbCcpO1xuICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLWRvdCcpO1xuICAgIGNvbnN0IHN0YXR1c1RleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1zdGF0dXMtdGV4dCcpO1xuICAgIGlmICghY2FyZCkgcmV0dXJuO1xuXG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgJ29uJyk7XG4gICAgICBwaWxsLmNsYXNzTmFtZSA9ICdiYWRnZSBvbic7XG4gICAgICBwaWxsLnRleHRDb250ZW50ID0gdHJhbnNsYXRlZCgnY2FyZC5zdGF0dXMueWVzJywgJ1lFUycpO1xuICAgICAgZG90LmNsYXNzTmFtZSA9ICdkb3Qgb2sgYXQtYmwnO1xuICAgICAgc3RhdHVzVGV4dC50ZXh0Q29udGVudCA9ICdTZXNzaW9uOiAnICsgKERVUkFUSU9OX0xBQkVMU1tkdXJhdGlvbl0gfHwgZHVyYXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0dXMnLCAnb2ZmJyk7XG4gICAgICBwaWxsLmNsYXNzTmFtZSA9ICdiYWRnZSBvZmYnO1xuICAgICAgcGlsbC50ZXh0Q29udGVudCA9IHRyYW5zbGF0ZWQoJ2NhcmQuc3RhdHVzLm5vJywgJ05PJyk7XG4gICAgICBkb3QuY2xhc3NOYW1lID0gJ2RvdCBiYWQgYXQtYmwnO1xuICAgICAgc3RhdHVzVGV4dC50ZXh0Q29udGVudCA9IHRyYW5zbGF0ZWQoJ2NhcmQuYXV0aC5ub3RfY29uZmlndXJlZCcsICdOb3QgY29uZmlndXJlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldHVwIGJ1dHRvbiAoZ2VuZXJhdGUgbmV3IHNlY3JldClcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS90b3RwL3NldHVwJywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1xci1pbWFnZScpLnNyYyA9IGRhdGEucXJDb2RlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1tYW51YWwta2V5JykudGV4dENvbnRlbnQgPSBkYXRhLm1hbnVhbEtleTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtc2VjdGlvbicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXFyLXNlY3Rpb24nKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtY29kZScpLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWVycm9yJykudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtY29kZScpLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbVE9UUF0gU2V0dXAgRmFpbGVkJywgZSwgeyBmdW5jdGlvbjogJ3NldHVwVE9UUCcgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBJbXBvcnQgZXhpc3Rpbmcgc2VjcmV0IGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1pbXBvcnQtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNlY3JldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWltcG9ydC1rZXknKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWltcG9ydC1lcnJvcicpO1xuICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICBpZiAoIXNlY3JldCkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdQYXN0ZSBhIEJhc2UzMiBzZWNyZXQga2V5IGZpcnN0JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3RvdHAvc2V0dXAnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZWNyZXQgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcXItaW1hZ2UnKS5zcmMgPSBkYXRhLnFyQ29kZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtbWFudWFsLWtleScpLnRleHRDb250ZW50ID0gZGF0YS5tYW51YWxLZXk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLXNlY3Rpb24nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1xci1zZWN0aW9uJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWNvZGUnKS52YWx1ZSA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1lcnJvcicpLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWNvZGUnKS5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgZGF0YS5tZXNzYWdlIHx8ICdJbXBvcnQgZmFpbGVkJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ0Nvbm5lY3Rpb24gZXJyb3IgXHUyMDE0IHRyeSByZWZyZXNoaW5nIHRoZSBwYWdlJztcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENvcHkga2V5IGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1jb3B5LWtleScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1tYW51YWwta2V5JykudGV4dENvbnRlbnQ7XG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoa2V5KS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWNvcHkta2V5Jyk7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzA1JztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVEQ0NCJzsgfSwgMjAwMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIERvd25sb2FkIGJhY2t1cCBmaWxlIFx1MjAxNCBwbGFpbiBKU09OIHNvIGl0IHJvdW5kLXRyaXBzIHRocm91Z2ggYW55IHBhc3N3b3JkXG4gIC8vIG1hbmFnZXIsIGNsb3VkIGJhY2t1cCwgb3IgcHJpbnRlZCBwYXBlci4gVGhlIHNlY3JldCBJUyByZWNvdmVyYWJsZSBwbGFpbnRleHRcbiAgLy8gKHRoYXQncyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhlIGJhY2t1cCksIHNvIHdhcm4gdGhlIHVzZXIgYW5kIHJlbHkgb25cbiAgLy8gdGhlbSB0byBrZWVwIGl0IHNhZmUuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWRvd25sb2FkLWJhY2t1cCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBzZWNyZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1tYW51YWwta2V5JykudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIGlmICghc2VjcmV0KSByZXR1cm47XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIHNlcnZpY2U6ICdEYXNoQ2FkZHknLFxuICAgICAgdHlwZTogJ3RvdHAtc2VjcmV0JyxcbiAgICAgIHNlY3JldDogc2VjcmV0LFxuICAgICAgaXNzdWVyOiAnRGFzaENhZGR5JyxcbiAgICAgIGFsZ29yaXRobTogJ1NIQTEnLFxuICAgICAgZGlnaXRzOiA2LFxuICAgICAgcGVyaW9kOiAzMCxcbiAgICAgIGlzc3VlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLy8gUmVjb3ZlcnkgaW5zdHJ1Y3Rpb25zIGJha2VkIGludG8gdGhlIGZpbGUgc28gYSB5ZWFyIGZyb20gbm93IHRoZVxuICAgICAgLy8gdXNlciAob3IgdGhlaXIgZnV0dXJlIHNlbGYpIGtub3dzIHdoYXQgdGhpcyBmaWxlIGlzIGFuZCBob3cgdG8gdXNlIGl0LlxuICAgICAgcmVjb3ZlcnlfdXJsOiBgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2lufS8gIChsb2dpbiBzY3JlZW4gXHUyMTkyIFwiTG9zdCBhY2Nlc3M/XCIpYCxcbiAgICAgIG5vdGU6ICdLZWVwIHRoaXMgZmlsZSBzb21ld2hlcmUgc2FmZS4gQW55b25lIHdpdGggdGhpcyBzZWNyZXQgY2FuIGdlbmVyYXRlIHlvdXIgbG9naW4gY29kZXMuIFVzZSBpdCBPTkxZIHRvIHJlY292ZXIgVE9UUCBhY2Nlc3MgdmlhIHRoZSBcIkxvc3QgYWNjZXNzP1wiIGxpbmsgb24gdGhlIERhc2hDYWRkeSBsb2dpbiBzY3JlZW4uJ1xuICAgIH07XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShwYXlsb2FkLCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgYS5kb3dubG9hZCA9IGBkYXNoY2FkZHktdG90cC1iYWNrdXAtJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApfS5qc29uYDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kb3dubG9hZC1iYWNrdXAnKTtcbiAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzA1IFNhdmVkJztcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ1x1MkIwNyBEb3dubG9hZCc7IH0sIDIwMDApO1xuICB9KTtcblxuICAvLyBDb25maXJtIHNldHVwXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWNvbmZpcm0tc2V0dXAnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWNvZGUnKS52YWx1ZTtcbiAgICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtZXJyb3InKTtcbiAgICBpZiAoIS9eXFxkezZ9JC8udGVzdChjb2RlKSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdFbnRlciBhIDYtZGlnaXQgY29kZSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3RvdHAvdmVyaWZ5LXNldHVwJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY29kZSB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICBsb2FkVG90cFNldHRpbmdzKCk7IC8vIFVwZGF0ZXMgYm90aCBtb2RhbCBhbmQgY2FyZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgJ0ludmFsaWQgY29kZSc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdDb25uZWN0aW9uIGVycm9yJztcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFsbG93IEVudGVyIGtleSBvbiBzZXR1cCBjb2RlIGlucHV0XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWNvZGUnKT8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1jb25maXJtLXNldHVwJyk/LmNsaWNrKCk7XG4gIH0pO1xuXG4gIC8vIER1cmF0aW9uIGNoYW5nZVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kdXJhdGlvbi1zZWxlY3QnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYXN5bmMgKGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdG90cC9jb25maWcnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXNzaW9uRHVyYXRpb246IGUudGFyZ2V0LnZhbHVlIH0pXG4gICAgICB9KTtcbiAgICAgIGxvYWRUb3RwU2V0dGluZ3MoKTsgLy8gUmVmcmVzaCBtb2RhbCArIGNhcmQgKGhhbmRsZXMgXCJuZXZlclwiIGRpc2FibGluZyBUT1RQKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbVE9UUF0gVXBkYXRlIFNlc3Npb24gRHVyYXRpb24nLCBlcnIsIHsgZnVuY3Rpb246ICd1cGRhdGVTZXNzaW9uRHVyYXRpb24nIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gRGlzYWJsZSBUT1RQXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWRpc2FibGUtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlybSgnRGlzYWJsZSBUT1RQIGF1dGhlbnRpY2F0aW9uPyBBbGwgc2VydmljZXMgd2lsbCBiZSBhY2Nlc3NpYmxlIHdpdGhvdXQgYSBjb2RlLicpKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3RvdHAvZGlzYWJsZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiAne30nXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2VzcykgbG9hZFRvdHBTZXR0aW5ncygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1RPVFBdIERpc2FibGUgRmFpbGVkJywgZSwgeyBmdW5jdGlvbjogJ2Rpc2FibGVUT1RQJyB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIE9wZW4gc2V0dGluZ3MgbW9kYWwgZnJvbSBBdXRoIGNhcmRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtc2V0dGluZ3MtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvYWRUb3RwU2V0dGluZ3MoKTtcbiAgICBvcGVuTW9kYWwoJ3RvdHAtc2V0dGluZ3MtbW9kYWwnKTtcbiAgfSk7XG5cbiAgLy8gQ2xvc2Ugc2V0dGluZ3MgbW9kYWxcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtbW9kYWwtY2xvc2UnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY2xvc2VNb2RhbCgndG90cC1zZXR0aW5ncy1tb2RhbCcpO1xuICB9KTtcblxuICAvLyBCYWNrZHJvcCBjbGljayB0byBjbG9zZVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR0aW5ncy1tb2RhbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0LmlkID09PSAndG90cC1zZXR0aW5ncy1tb2RhbCcpIHtcbiAgICAgIGNsb3NlTW9kYWwoJ3RvdHAtc2V0dGluZ3MtbW9kYWwnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFVwZGF0ZSBhdXRoIGNhcmQgb24gcGFnZSBsb2FkXG4gIHdpbmRvdy5fdXBkYXRlQXV0aENhcmQgPSB1cGRhdGVBdXRoQ2FyZDtcbiAgKGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9jb25maWcnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBkYXRhLmNvbmZpZy5lbmFibGVkICYmIGRhdGEuY29uZmlnLmlzU2V0VXA7XG4gICAgICAgIHVwZGF0ZUF1dGhDYXJkKGFjdGl2ZSwgZGF0YS5jb25maWcuc2Vzc2lvbkR1cmF0aW9uKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IGVycm9ySGFuZGxlci5sb2dFcnJvcignW1RPVFBdIEF1dGhDYXJkIFVwZGF0ZScsIGUsIHsgZnVuY3Rpb246ICdhdXRoQ2FyZFVwZGF0ZScgfSk7IH1cbiAgfSkoKTtcblxufSkoKTtcbjtcbi8qKlxuICogQWRtaW4gcGFuZWwgXHUyMDE0IERDLTA0OC5cbiAqXG4gKiBNaW5pbWFsIGFkbWluIFVJIGZvciBtYW5hZ2luZyB1c2VycyArIGludml0ZXMuIFJlbmRlcmVkIGFzIGEgbW9kYWwgb3ZlcmxheVxuICogdHJpZ2dlcmVkIGJ5IGFuIFwiQWRtaW5cIiBidXR0b24gaW4gdGhlIHRvcCBiYXIgdGhhdCBvbmx5IGFwcGVhcnMgd2hlblxuICogL2FwaS92MS9hdXRoL21lIHJldHVybnMgaXNBZG1pbj10cnVlLiBUaGUgcGFuZWwgcmVuZGVycyB0aHJlZSBzZWN0aW9uczpcbiAqXG4gKiAgIDEuIFVzZXJzIFx1MjAxNCBsaXN0IG9mIGF1dGhvcml6ZWQgdXNlcnMgd2l0aCByb2xlIGJhZGdlcywgcm9sZS1lZGl0LFxuICogICAgICBkZWxldGUgYWN0aW9ucy5cbiAqICAgMi4gSW52aXRlIGEgdXNlciBcdTIwMTQgZm9ybSB0byBpc3N1ZSBhIHNpbmdsZS11c2UgaW52aXRlIChlbWFpbCwgcm9sZSxcbiAqICAgICAgVFRMKS4gVGhlIGFjY2VwdC1saW5rIGlzIHNob3duIHBvc3QtaXNzdWUgc28gdGhlIGFkbWluIGNhbiBjb3B5IGl0LlxuICogICAzLiBPdXRzdGFuZGluZyBpbnZpdGVzIFx1MjAxNCBsaXN0IG9mIGlzc3VlZC1ub3QteWV0LWFjY2VwdGVkIGludml0ZXNcbiAqICAgICAgd2l0aCBhIHJldm9rZSBidXR0b24uXG4gKlxuICogVGhlIHBhbmVsIGRvZXMgTk9UIGFkZCBhIHRhYiB0byB0aGUgZGFzaGJvYXJkIG5hdiBcdTIwMTQgaXQgbGl2ZXMgYXMgYSBtb2RhbFxuICogdG8ga2VlcCBEQy0wNDggc3VyZ2ljYWwuIEZ1dHVyZSBEQy0wNDkgd29yayBjYW4gcHJvbW90ZSBpdCB0byBhIHRhYi5cbiAqXG4gKiBCZWhhdmlvdXI6XG4gKiAgIC0gT24gbG9hZDogR0VUIC9tZTsgaWYgIWlzQWRtaW4gXHUyMTkyIHNob3cgXCJhZG1pbiBvbmx5XCIgcGxhY2Vob2xkZXJcbiAqICAgLSBUaGVuIEdFVCAvYWRtaW4vdXNlcnMgKyAvYWRtaW4vaW52aXRlcyBpbiBwYXJhbGxlbFxuICogICAtIEZvcm1zIFBPU1QgdG8gdGhlIGFkbWluIGVuZHBvaW50cywgcmVmcmVzaCBsaXN0cyBvbiBzdWNjZXNzXG4gKiAgIC0gXCJDb3B5IGxpbmtcIiBidXR0b24gd3JpdGVzIHRoZSBhY2NlcHRVcmwgdG8gdGhlIGNsaXBib2FyZFxuICpcbiAqIFdpcmVzIGludG8gdGhlIGdsb2JhbCBlcnJvci1oYW5kbGVyICh3aW5kb3cuZXJyb3JIYW5kbGVyKSBmb3IgZmFpbHVyZVxuICogc3VyZmFjZXMuIFVzZXMgd2luZG93LlNJVEUgZm9yIGFueSBVSSBjb25zdGFudHMgKG5vbmUgY3VycmVudGx5KS5cbiAqL1xuXG4oZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgQVBJID0ge1xuICAgIG1lOiAnL2FwaS92MS9hdXRoL21lJyxcbiAgICB1c2VyczogJy9hcGkvdjEvYXV0aC9hZG1pbi91c2VycycsXG4gICAgYWxsb3dsaXN0OiAnL2FwaS92MS9hdXRoL2FkbWluL2FsbG93bGlzdCcsXG4gICAgaW52aXRlczogJy9hcGkvdjEvYXV0aC9hZG1pbi9pbnZpdGVzJyxcbiAgfTtcblxuICBmdW5jdGlvbiBfZWwodGFnLCBhdHRycywgLi4uY2hpbGRyZW4pIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuICAgIGlmIChhdHRycykge1xuICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKGF0dHJzKSkge1xuICAgICAgICBjb25zdCB2ID0gYXR0cnNba107XG4gICAgICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBmYWxzZSkgY29udGludWU7XG4gICAgICAgIGlmIChrID09PSAnY2xhc3MnKSBub2RlLmNsYXNzTmFtZSA9IHY7XG4gICAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHY7XG4gICAgICAgIGVsc2UgaWYgKGsgPT09ICdodG1sJykgbm9kZS5pbm5lckhUTUwgPSB2O1xuICAgICAgICBlbHNlIGlmIChrLnN0YXJ0c1dpdGgoJ29uJykgJiYgdHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHYpO1xuICAgICAgICBlbHNlIG5vZGUuc2V0QXR0cmlidXRlKGssIHYpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGMgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjID09PSBudWxsIHx8IGMgPT09IHVuZGVmaW5lZCB8fCBjID09PSBmYWxzZSkgY29udGludWU7XG4gICAgICBpZiAodHlwZW9mIGMgPT09ICdzdHJpbmcnKSBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGMpKTtcbiAgICAgIGVsc2Ugbm9kZS5hcHBlbmRDaGlsZChjKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBfZmV0Y2hKU09OKHVybCwgb3B0cykge1xuICAgIGNvbnN0IGNzcmYgPSAod2luZG93LlNJVEUgJiYgd2luZG93LlNJVEUuY3NyZlRva2VuKSB8fCAnJztcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICBvcHRzLmhlYWRlcnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBvcHRzLmhlYWRlcnMgfHwge30sXG4gICAgICBjc3JmID8geyAnWC1DU1JGLVRva2VuJzogY3NyZiB9IDoge31cbiAgICApO1xuICAgIGlmIChvcHRzLmJvZHkgJiYgdHlwZW9mIG9wdHMuYm9keSAhPT0gJ3N0cmluZycpIG9wdHMuYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdHMuYm9keSk7XG4gICAgY29uc3QgciA9IGF3YWl0IGZldGNoKHVybCwgb3B0cyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIGlmICghci5vaykge1xuICAgICAgY29uc3QgbXNnID0gKGRhdGEgJiYgKGRhdGEubWVzc2FnZSB8fCBkYXRhLmVycm9yKSkgfHwgKCdIVFRQICcgKyByLnN0YXR1cyk7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobXNnKTtcbiAgICAgIGVyci5zdGF0dXMgPSByLnN0YXR1cztcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBmdW5jdGlvbiBfcmVuZGVyQmFkZ2Uocm9sZSkge1xuICAgIGNvbnN0IGNvbG9ycyA9IHtcbiAgICAgIGFkbWluOiAnYmFja2dyb3VuZDojN2MzYWVkO2NvbG9yOiNmZmYnLFxuICAgICAgb3BlcmF0b3I6ICdiYWNrZ3JvdW5kOiMyNTYzZWI7Y29sb3I6I2ZmZicsXG4gICAgICB2aWV3ZXI6ICdiYWNrZ3JvdW5kOiM2YjcyODA7Y29sb3I6I2ZmZicsXG4gICAgfTtcbiAgICByZXR1cm4gX2VsKCdzcGFuJywge1xuICAgICAgY2xhc3M6ICdyb2xlLWJhZGdlJyxcbiAgICAgIHN0eWxlOiAnZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjc1cmVtO2ZvbnQtd2VpZ2h0OjYwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7JyArXG4gICAgICAgIChjb2xvcnNbcm9sZV0gfHwgY29sb3JzLnZpZXdlciksXG4gICAgICB0ZXh0OiByb2xlLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlclVzZXJzTGlzdChjb250YWluZXIsIHVzZXJzLCBvbkNoYW5nZSkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBpZiAoIXVzZXJzIHx8IHVzZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKF9lbCgncCcsIHsgc3R5bGU6ICdjb2xvcjp2YXIoLS1tdXRlZCknLCB0ZXh0OiAnTm8gdXNlcnMgeWV0LicgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZSA9IF9lbCgndGFibGUnLCB7XG4gICAgICBzdHlsZTogJ3dpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjlyZW0nLFxuICAgIH0pO1xuICAgIHRhYmxlLmFwcGVuZENoaWxkKF9lbCgndGhlYWQnLCBudWxsLFxuICAgICAgX2VsKCd0cicsIHsgc3R5bGU6ICdib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpJyB9LFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdFbWFpbCcgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ1JvbGUnIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdDcmVhdGVkJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnTGFzdCBsb2dpbicgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpyaWdodDtwYWRkaW5nOjhweCcsIHRleHQ6ICdBY3Rpb25zJyB9KSxcbiAgICAgICksXG4gICAgKSk7XG4gICAgY29uc3QgdGJvZHkgPSBfZWwoJ3Rib2R5Jyk7XG4gICAgZm9yIChjb25zdCB1IG9mIHVzZXJzKSB7XG4gICAgICBjb25zdCByb3cgPSBfZWwoJ3RyJywgeyBzdHlsZTogJ2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlciknIH0pO1xuXG4gICAgICBjb25zdCBlbWFpbENlbGwgPSBfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4JyB9KTtcbiAgICAgIGVtYWlsQ2VsbC5hcHBlbmRDaGlsZChfZWwoJ3NwYW4nLCB7IHRleHQ6IHUuZW1haWwgfHwgJyhubyBlbWFpbCknIH0pKTtcbiAgICAgIGlmICh1LmRpc3BsYXlOYW1lICYmIHUuZGlzcGxheU5hbWUgIT09ICh1LmVtYWlsIHx8ICcnKS5zcGxpdCgnQCcpWzBdKSB7XG4gICAgICAgIGVtYWlsQ2VsbC5hcHBlbmRDaGlsZChfZWwoJ2JyJykpO1xuICAgICAgICBlbWFpbENlbGwuYXBwZW5kQ2hpbGQoX2VsKCdzbWFsbCcsIHtcbiAgICAgICAgICBzdHlsZTogJ2NvbG9yOnZhcigtLW11dGVkKScsIHRleHQ6IHUuZGlzcGxheU5hbWUsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIHJvdy5hcHBlbmRDaGlsZChlbWFpbENlbGwpO1xuXG4gICAgICBjb25zdCByb2xlQ2VsbCA9IF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHgnIH0pO1xuICAgICAgcm9sZUNlbGwuYXBwZW5kQ2hpbGQoX3JlbmRlckJhZGdlKHUucm9sZSkpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKHJvbGVDZWxsKTtcblxuICAgICAgcm93LmFwcGVuZENoaWxkKF9lbCgndGQnLCB7XG4gICAgICAgIHN0eWxlOiAncGFkZGluZzo4cHg7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTowLjg1cmVtJyxcbiAgICAgICAgdGV4dDogdS5jcmVhdGVkQXQgPyBuZXcgRGF0ZSh1LmNyZWF0ZWRBdCkudG9Mb2NhbGVEYXRlU3RyaW5nKCkgOiAnXHUyMDE0JyxcbiAgICAgIH0pKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywge1xuICAgICAgICBzdHlsZTogJ3BhZGRpbmc6OHB4O2NvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MC44NXJlbScsXG4gICAgICAgIHRleHQ6IHUubGFzdExvZ2luQXQgPyBuZXcgRGF0ZSh1Lmxhc3RMb2dpbkF0KS50b0xvY2FsZVN0cmluZygpIDogJ1x1MjAxNCcsXG4gICAgICB9KSk7XG5cbiAgICAgIGNvbnN0IGFjdGlvbnNDZWxsID0gX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweDt0ZXh0LWFsaWduOnJpZ2h0JyB9KTtcbiAgICAgIGNvbnN0IHJvbGVTZWxlY3QgPSBfZWwoJ3NlbGVjdCcsIHtcbiAgICAgICAgc3R5bGU6ICdwYWRkaW5nOjJweCA2cHg7bWFyZ2luLXJpZ2h0OjZweCcsXG4gICAgICAgIG9uY2hhbmdlOiBhc3luYyAoZXYpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgX2ZldGNoSlNPTihBUEkudXNlcnMgKyAnLycgKyBlbmNvZGVVUklDb21wb25lbnQodS5pZCksIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUEFUQ0gnLCBib2R5OiB7IHJvbGU6IGV2LnRhcmdldC52YWx1ZSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvbkNoYW5nZSAmJiBvbkNoYW5nZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5lcnJvckhhbmRsZXIgJiYgd2luZG93LmVycm9ySGFuZGxlci5zaG93KCdSb2xlIHVwZGF0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgZXYudGFyZ2V0LnZhbHVlID0gdS5yb2xlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCByIG9mIFsnYWRtaW4nLCAnb3BlcmF0b3InLCAndmlld2VyJ10pIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gX2VsKCdvcHRpb24nLCB7IHZhbHVlOiByLCB0ZXh0OiByIH0pO1xuICAgICAgICBpZiAociA9PT0gdS5yb2xlKSBvcHQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICByb2xlU2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgICB9XG4gICAgICBhY3Rpb25zQ2VsbC5hcHBlbmRDaGlsZChyb2xlU2VsZWN0KTtcblxuICAgICAgY29uc3QgZGVsQnRuID0gX2VsKCdidXR0b24nLCB7XG4gICAgICAgIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdwYWRkaW5nOjJweCA4cHgnLFxuICAgICAgICB0ZXh0OiAnRGVsZXRlJyxcbiAgICAgICAgb25jbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlybSgnRGVsZXRlIHVzZXIgJyArICh1LmVtYWlsIHx8IHUuaWQpICsgJz8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicpKSByZXR1cm47XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IF9mZXRjaEpTT04oQVBJLnVzZXJzICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHUuaWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICAgICAgICBvbkNoYW5nZSAmJiBvbkNoYW5nZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5lcnJvckhhbmRsZXIgJiYgd2luZG93LmVycm9ySGFuZGxlci5zaG93KCdEZWxldGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGFjdGlvbnNDZWxsLmFwcGVuZENoaWxkKGRlbEJ0bik7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoYWN0aW9uc0NlbGwpO1xuXG4gICAgICB0Ym9keS5hcHBlbmRDaGlsZChyb3cpO1xuICAgIH1cbiAgICB0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYmxlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJJbnZpdGVGb3JtKGNvbnRhaW5lciwgb25Jc3N1ZWQpIHtcbiAgICBjb25zdCBmb3JtID0gX2VsKCdmb3JtJywge1xuICAgICAgc3R5bGU6ICdkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDthbGlnbi1pdGVtczplbmQnLFxuICAgICAgb25zdWJtaXQ6IGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBmZCA9IG5ldyBGb3JtRGF0YShldi50YXJnZXQpO1xuICAgICAgICBjb25zdCBib2R5ID0ge1xuICAgICAgICAgIGVtYWlsOiBmZC5nZXQoJ2VtYWlsJyksXG4gICAgICAgICAgcm9sZTogZmQuZ2V0KCdyb2xlJyksXG4gICAgICAgICAgdHRsSG91cnM6IHBhcnNlSW50KGZkLmdldCgndHRsSG91cnMnKSwgMTApIHx8IDI0LFxuICAgICAgICAgIHNlbmRFbWFpbDogZmQuZ2V0KCdzZW5kRW1haWwnKSA9PT0gJ29uJyxcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByID0gYXdhaXQgX2ZldGNoSlNPTihBUEkuaW52aXRlcywgeyBtZXRob2Q6ICdQT1NUJywgYm9keSB9KTtcbiAgICAgICAgICBldi50YXJnZXQucmVzZXQoKTtcbiAgICAgICAgICBvbklzc3VlZCAmJiBvbklzc3VlZChyKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHdpbmRvdy5lcnJvckhhbmRsZXIgJiYgd2luZG93LmVycm9ySGFuZGxlci5zaG93KCdJbnZpdGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKF9lbCgnbGFiZWwnLCB7IHN0eWxlOiAnZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O2ZvbnQtc2l6ZTowLjg1cmVtJyB9LFxuICAgICAgX2VsKCdzcGFuJywgeyB0ZXh0OiAnRW1haWwnIH0pLFxuICAgICAgX2VsKCdpbnB1dCcsIHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ2VtYWlsJywgcmVxdWlyZWQ6IHRydWUsIHBsYWNlaG9sZGVyOiAndXNlckBleGFtcGxlLmNvbScsIHN0eWxlOiAncGFkZGluZzo2cHgnIH0pLFxuICAgICkpO1xuICAgIGNvbnN0IHJvbGVTZWwgPSBfZWwoJ3NlbGVjdCcsIHsgbmFtZTogJ3JvbGUnLCBzdHlsZTogJ3BhZGRpbmc6NnB4JyB9KTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgWydvcGVyYXRvcicsICd2aWV3ZXInLCAnYWRtaW4nXSkge1xuICAgICAgcm9sZVNlbC5hcHBlbmRDaGlsZChfZWwoJ29wdGlvbicsIHsgdmFsdWU6IHIsIHRleHQ6IHIgfSkpO1xuICAgIH1cbiAgICBmb3JtLmFwcGVuZENoaWxkKF9lbCgnbGFiZWwnLCB7IHN0eWxlOiAnZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O2ZvbnQtc2l6ZTowLjg1cmVtJyB9LFxuICAgICAgX2VsKCdzcGFuJywgeyB0ZXh0OiAnUm9sZScgfSksIHJvbGVTZWwsXG4gICAgKSk7XG4gICAgZm9ybS5hcHBlbmRDaGlsZChfZWwoJ2xhYmVsJywgeyBzdHlsZTogJ2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjJweDtmb250LXNpemU6MC44NXJlbScgfSxcbiAgICAgIF9lbCgnc3BhbicsIHsgdGV4dDogJ1RUTCAoaG91cnMpJyB9KSxcbiAgICAgIF9lbCgnaW5wdXQnLCB7IG5hbWU6ICd0dGxIb3VycycsIHR5cGU6ICdudW1iZXInLCBtaW46ICcxJywgbWF4OiAnMTY4JywgdmFsdWU6ICcyNCcsIHN0eWxlOiAncGFkZGluZzo2cHg7d2lkdGg6ODBweCcgfSksXG4gICAgKSk7XG4gICAgZm9ybS5hcHBlbmRDaGlsZChfZWwoJ2xhYmVsJywgeyBzdHlsZTogJ2Rpc3BsYXk6ZmxleDtnYXA6NHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6MC44NXJlbScgfSxcbiAgICAgIF9lbCgnaW5wdXQnLCB7IG5hbWU6ICdzZW5kRW1haWwnLCB0eXBlOiAnY2hlY2tib3gnLCBjaGVja2VkOiB0cnVlIH0pLFxuICAgICAgX2VsKCdzcGFuJywgeyB0ZXh0OiAnU2VuZCBlbWFpbCcgfSksXG4gICAgKSk7XG4gICAgZm9ybS5hcHBlbmRDaGlsZChfZWwoJ2J1dHRvbicsIHsgdHlwZTogJ3N1Ym1pdCcsIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdwYWRkaW5nOjZweCAxMnB4JywgdGV4dDogJ0lzc3VlIGludml0ZScgfSkpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmb3JtKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJJbnZpdGVzTGlzdChjb250YWluZXIsIGludml0ZXMsIG9uQ2hhbmdlKSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGlmICghaW52aXRlcyB8fCBpbnZpdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKF9lbCgncCcsIHsgc3R5bGU6ICdjb2xvcjp2YXIoLS1tdXRlZCknLCB0ZXh0OiAnTm8gb3V0c3RhbmRpbmcgaW52aXRlcy4nIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFibGUgPSBfZWwoJ3RhYmxlJywge1xuICAgICAgc3R5bGU6ICd3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6MC45cmVtJyxcbiAgICB9KTtcbiAgICB0YWJsZS5hcHBlbmRDaGlsZChfZWwoJ3RoZWFkJywgbnVsbCxcbiAgICAgIF9lbCgndHInLCB7IHN0eWxlOiAnYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKScgfSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnRW1haWwnIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdSb2xlJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnSW52aXRlZCBieScgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0V4cGlyZXMnIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246cmlnaHQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnQWN0aW9ucycgfSksXG4gICAgICApLFxuICAgICkpO1xuICAgIGNvbnN0IHRib2R5ID0gX2VsKCd0Ym9keScpO1xuICAgIGZvciAoY29uc3QgaW52IG9mIGludml0ZXMpIHtcbiAgICAgIGNvbnN0IHJvdyA9IF9lbCgndHInLCB7IHN0eWxlOiAnYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKScgfSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweCcsIHRleHQ6IGludi5lbWFpbCB9KSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweCcgfSwgX3JlbmRlckJhZGdlKGludi5yb2xlKSkpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHg7Y29sb3I6dmFyKC0tbXV0ZWQpJywgdGV4dDogaW52Lmludml0ZWRCeSB8fCAnXHUyMDE0JyB9KSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoX2VsKCd0ZCcsIHtcbiAgICAgICAgc3R5bGU6ICdwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuODVyZW0nLFxuICAgICAgICB0ZXh0OiBpbnYuZXhwaXJlc0F0ID8gbmV3IERhdGUoaW52LmV4cGlyZXNBdCkudG9Mb2NhbGVTdHJpbmcoKSA6ICdcdTIwMTQnLFxuICAgICAgfSkpO1xuICAgICAgY29uc3QgYWN0aW9uc0NlbGwgPSBfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4O3RleHQtYWxpZ246cmlnaHQnIH0pO1xuICAgICAgYWN0aW9uc0NlbGwuYXBwZW5kQ2hpbGQoX2VsKCdidXR0b24nLCB7XG4gICAgICAgIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdwYWRkaW5nOjJweCA4cHgnLFxuICAgICAgICB0ZXh0OiAnUmV2b2tlJyxcbiAgICAgICAgb25jbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlybSgnUmV2b2tlIGludml0ZSBmb3IgJyArIGludi5lbWFpbCArICc/JykpIHJldHVybjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgX2ZldGNoSlNPTihBUEkuaW52aXRlcyArICcvJyArIGVuY29kZVVSSUNvbXBvbmVudChpbnYuaWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICAgICAgICBvbkNoYW5nZSAmJiBvbkNoYW5nZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5lcnJvckhhbmRsZXIgJiYgd2luZG93LmVycm9ySGFuZGxlci5zaG93KCdSZXZva2UgZmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoYWN0aW9uc0NlbGwpO1xuICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTtcbiAgICB9XG4gICAgdGFibGUuYXBwZW5kQ2hpbGQodGJvZHkpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBfcmVuZGVySXNzdWVkSW52aXRlQmFubmVyKGludml0ZSwgcGFyZW50KSB7XG4gICAgY29uc3QgYmFubmVyID0gX2VsKCdkaXYnLCB7XG4gICAgICBzdHlsZTogJ21hcmdpbi10b3A6MTJweDtwYWRkaW5nOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjMTZhMzRhO2JvcmRlci1yYWRpdXM6NnB4O2JhY2tncm91bmQ6IzA1MmUxYTtjb2xvcjojYmJmN2QwO2ZvbnQtc2l6ZTowLjg1cmVtJyxcbiAgICB9KTtcbiAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoX2VsKCdzdHJvbmcnLCB7IHRleHQ6ICdJbnZpdGUgaXNzdWVkIFx1MjAxNCBjb3B5IHRoZSBsaW5rIGJlbG93LiAnICtcbiAgICAgICdJdCB3aWxsIG5vdCBiZSBzaG93biBhZ2Fpbi4nIH0pKTtcbiAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoX2VsKCdicicpKTtcbiAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoX2VsKCdjb2RlJywge1xuICAgICAgc3R5bGU6ICdkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6OHB4O3BhZGRpbmc6OHB4O2JhY2tncm91bmQ6IzAwMDtib3JkZXItcmFkaXVzOjRweDt3b3JkLWJyZWFrOmJyZWFrLWFsbDtjb2xvcjojZDFmYWU1JyxcbiAgICAgIHRleHQ6IGludml0ZS5hY2NlcHRVcmwsXG4gICAgfSkpO1xuICAgIGNvbnN0IGNvcHlCdG4gPSBfZWwoJ2J1dHRvbicsIHtcbiAgICAgIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdtYXJnaW4tdG9wOjhweDtwYWRkaW5nOjRweCAxMHB4JyxcbiAgICAgIHRleHQ6ICdDb3B5IGxpbmsnLFxuICAgICAgb25jbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGludml0ZS5hY2NlcHRVcmwpO1xuICAgICAgICAgIGNvcHlCdG4udGV4dENvbnRlbnQgPSAnQ29waWVkISc7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGNvcHlCdG4udGV4dENvbnRlbnQgPSAnQ29weSBsaW5rJzsgfSwgMjAwMCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnQ2xpcGJvYXJkIGJsb2NrZWQ6IHNlbGVjdCB0aGUgbGluayBtYW51YWxseS4nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoY29weUJ0bik7XG4gICAgaWYgKGludml0ZS5kZWxpdmVyZWRWaWEgPT09ICdkZXYtY29uc29sZScpIHtcbiAgICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ3AnLCB7XG4gICAgICAgIHN0eWxlOiAnbWFyZ2luLXRvcDo4cHg7Y29sb3I6I2ZiYmYyNDtmb250LXNpemU6MC44cmVtJyxcbiAgICAgICAgdGV4dDogJ1NNVFAgbm90IGNvbmZpZ3VyZWQgXHUyMDE0IHRoZSBpbnZpdGUgd2FzIGxvZ2dlZCB0byB0aGUgc2VydmVyIGNvbnNvbGUgKHNlYXJjaCBmb3IgW0RDLTA0OC1ERVYtSU5WSVRFLUxJTktdKS4nLFxuICAgICAgfSkpO1xuICAgIH0gZWxzZSBpZiAoaW52aXRlLmRlbGl2ZXJlZFZpYSA9PT0gJ2VtYWlsJykge1xuICAgICAgYmFubmVyLmFwcGVuZENoaWxkKF9lbCgncCcsIHtcbiAgICAgICAgc3R5bGU6ICdtYXJnaW4tdG9wOjhweDtjb2xvcjojODZlZmFjO2ZvbnQtc2l6ZTowLjhyZW0nLFxuICAgICAgICB0ZXh0OiAnRW1haWwgc2VudCB0byAnICsgaW52aXRlLmVtYWlsICsgJy4nLFxuICAgICAgfSkpO1xuICAgIH1cbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoYmFubmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgYWRtaW4gcGFuZWwuIENhbGxlZCBieSB0aGUgb3BlbiB0cmlnZ2VyOyBzYWZlIHRvIGNhbGwgbXVsdGlwbGVcbiAgICogdGltZXMgKHJlLXJlbmRlcnMgaW50byB0aGUgc2FtZSBjb250YWluZXIpLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gbW91bnQoY29udGFpbmVyKSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ2gyJywgeyBzdHlsZTogJ21hcmdpbjowIDAgMTZweCcsIHRleHQ6ICdBZG1pbiBcdTAwQjcgVXNlcnMgJiBJbnZpdGVzJyB9KSk7XG5cbiAgICBjb25zdCBtZURhdGEgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS5tZSkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgaWYgKCFtZURhdGEgfHwgIW1lRGF0YS51c2VyIHx8IG1lRGF0YS51c2VyLnJvbGUgIT09ICdhZG1pbicpIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ3AnLCB7XG4gICAgICAgIHN0eWxlOiAnY29sb3I6dmFyKC0tbXV0ZWQpJyxcbiAgICAgICAgdGV4dDogJ0FkbWluIHJvbGUgcmVxdWlyZWQgdG8gdmlldyB0aGlzIHBhbmVsLiBJZiBtdWx0aS11c2VyIG1vZGUgaXMgZW5hYmxlZCBhbmQgeW91IHNob3VsZCBoYXZlIGFjY2VzcywgY2hlY2sgL2FwaS92MS9hdXRoL21lLicsXG4gICAgICB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVmcmVzaCBidXR0b25cbiAgICBjb25zdCByZWZyZXNoQnRuID0gX2VsKCdidXR0b24nLCB7XG4gICAgICBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAnZmxvYXQ6cmlnaHQ7cGFkZGluZzo0cHggMTBweCcsXG4gICAgICB0ZXh0OiAnUmVmcmVzaCcsXG4gICAgICBvbmNsaWNrOiAoKSA9PiBtb3VudChjb250YWluZXIpLFxuICAgIH0pO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChyZWZyZXNoQnRuKTtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBVc2VycyBzZWN0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IHVzZXJzSGVhZGVyID0gX2VsKCdoMycsIHsgc3R5bGU6ICdtYXJnaW46MjRweCAwIDhweDtjbGVhcjpib3RoJywgdGV4dDogJ1VzZXJzJyB9KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodXNlcnNIZWFkZXIpO1xuXG4gICAgY29uc3QgdXNlcnNMaXN0ID0gX2VsKCdkaXYnLCB7IGlkOiAnYWRtaW4tdXNlcnMtbGlzdCcgfSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJzTGlzdCk7XG5cbiAgICBjb25zdCB1c2Vyc0RhdGEgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS51c2VycykuY2F0Y2goKCkgPT4gKHsgdXNlcnM6IFtdIH0pKTtcbiAgICBfcmVuZGVyVXNlcnNMaXN0KHVzZXJzTGlzdCwgdXNlcnNEYXRhLnVzZXJzLCAoKSA9PiBtb3VudChjb250YWluZXIpKTtcblxuICAgIC8vIEFkZCB1c2VyIGZvcm0gKHByZS1hdXRob3JpemUgYW4gZW1haWwgd2l0aG91dCBpc3N1aW5nIGFuIGludml0ZSkuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKF9lbCgnaDQnLCB7IHN0eWxlOiAnbWFyZ2luOjI0cHggMCA4cHg7Zm9udC1zaXplOjAuOTVyZW0nLCB0ZXh0OiAnUHJlLWF1dGhvcml6ZSBlbWFpbCcgfSkpO1xuICAgIGNvbnN0IGFkZFVzZXJGb3JtID0gX2VsKCdmb3JtJywge1xuICAgICAgc3R5bGU6ICdkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczplbmQnLFxuICAgICAgb25zdWJtaXQ6IGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBlbWFpbCA9IGV2LnRhcmdldC5lbWFpbC52YWx1ZS50cmltKCk7XG4gICAgICAgIGlmICghZW1haWwpIHJldHVybjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBfZmV0Y2hKU09OKEFQSS51c2VycywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogeyBlbWFpbCB9IH0pO1xuICAgICAgICAgIGV2LnRhcmdldC5yZXNldCgpO1xuICAgICAgICAgIG1vdW50KGNvbnRhaW5lcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnQWRkIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgYWRkVXNlckZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdpbnB1dCcsIHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ2VtYWlsJywgcmVxdWlyZWQ6IHRydWUsIHBsYWNlaG9sZGVyOiAndXNlckBleGFtcGxlLmNvbScsIHN0eWxlOiAncGFkZGluZzo2cHgnIH0pKTtcbiAgICBhZGRVc2VyRm9ybS5hcHBlbmRDaGlsZChfZWwoJ2J1dHRvbicsIHsgdHlwZTogJ3N1Ym1pdCcsIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdwYWRkaW5nOjZweCAxMnB4JywgdGV4dDogJ0FkZCB0byBhbGxvd2xpc3QnIH0pKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYWRkVXNlckZvcm0pO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIEludml0ZXMgc2VjdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdoMycsIHsgc3R5bGU6ICdtYXJnaW46MjRweCAwIDhweCcsIHRleHQ6ICdJc3N1ZSBpbnZpdGUnIH0pKTtcbiAgICBjb25zdCBpbnZpdGVGb3JtQ29udGFpbmVyID0gX2VsKCdkaXYnKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaW52aXRlRm9ybUNvbnRhaW5lcik7XG5cbiAgICBjb25zdCBpbnZpdGVzTGlzdCA9IF9lbCgnZGl2JywgeyBpZDogJ2FkbWluLWludml0ZXMtbGlzdCcsIHN0eWxlOiAnbWFyZ2luLXRvcDoxNnB4JyB9KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaW52aXRlc0xpc3QpO1xuXG4gICAgY29uc3QgaW52aXRlc0RhdGEgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS5pbnZpdGVzKS5jYXRjaCgoKSA9PiAoeyBpbnZpdGVzOiBbXSB9KSk7XG4gICAgX3JlbmRlckludml0ZXNMaXN0KGludml0ZXNMaXN0LCBpbnZpdGVzRGF0YS5pbnZpdGVzLCAoKSA9PiBtb3VudChjb250YWluZXIpKTtcblxuICAgIF9yZW5kZXJJbnZpdGVGb3JtKGludml0ZUZvcm1Db250YWluZXIsIChpc3N1ZWQpID0+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/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXhpdEJhdGNoTW9kZSk7XG59KSgpO1xuIl0sCiAgIm1hcHBpbmdzIjogIkNBS0MsU0FBU0EsRUFBUSxDQUNoQixhQUVBLE1BQU1DLENBQWEsQ0FDakIsYUFBYyxDQUNaLEtBQUssT0FBUyxDQUFDLEVBQ2YsS0FBSyxVQUFZLEVBQ25CLENBUUEsU0FBU0MsRUFBU0MsRUFBT0MsRUFBVyxDQUFDLEVBQUcsQ0FDdEMsTUFBTUMsRUFBYSxDQUNqQixVQUFXLElBQUksS0FBSyxFQUFFLFlBQVksRUFDbEMsUUFBQUgsRUFDQSxRQUFTQyxhQUFpQixNQUFRQSxFQUFNLFFBQVVBLEVBQ2xELE1BQU9BLGFBQWlCLE1BQVFBLEVBQU0sTUFBUSxLQUM5QyxTQUFBQyxDQUNGLEVBR0EsS0FBSyxPQUFPLEtBQUtDLENBQVUsRUFHdkIsS0FBSyxPQUFPLE9BQVMsS0FBSyxXQUM1QixLQUFLLE9BQU8sTUFBTSxFQUlwQixRQUFRLE1BQU0sc0JBQXNCSCxDQUFPLElBQUtDLEVBQU9DLENBQVEsQ0FJakUsQ0FRQSxpQkFBaUJELEVBQU9HLEVBQWEsQ0FHbkMsT0FGa0IsS0FBSyxjQUFjSCxDQUFLLEVBRXZCLENBQ2pCLElBQUssb0JBQ0gsWUFBSyxTQUFTLG9CQUFxQkEsRUFBTyxDQUFFLFlBQUFHLENBQVksQ0FBQyxFQUNsRCxDQUNMLE9BQVEsWUFDUixTQUFVQSxFQUFjLEVBQ3hCLFFBQVMsaURBQ1gsRUFFRixJQUFLLHNCQUNILFlBQUssU0FBUyxzQkFBdUJILENBQUssRUFDbkMsQ0FDTCxPQUFRLHFCQUNSLFFBQVMsb0RBQ1gsRUFFRixJQUFLLG9CQUNILFlBQUssU0FBUyx1QkFBd0JBLENBQUssRUFD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QUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixTQUFVLEVBQ2hkLGlCQUFrQixDQUFFLEdBQUksVUFBVyxHQUFJLFVBQVcsTUFBTyxVQUFXLFdBQVksVUFBVyxZQUFhLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxNQUFPLFVBQVcsYUFBYyxVQUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixTQUFVLEVBQ2hkLGtCQUFrQixDQUFFLEdBQUksVUFBVyxHQUFJLFVBQVcsTUFBTyxVQUFXLFdBQVksVUFBVyxZQUFhLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxNQUFPLFVBQVcsYUFBYyxVQUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixVQUFXLFFBQVMsRUFBSyxFQUMvZCxLQUFrQixDQUFFLEdBQUksVUFBVyxHQUFJLFVBQVcsTUFBTyxVQUFXLFdBQVksVUFBVyxZQUFhLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxNQUFPLFVBQVcsYUFBYyxVQUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixVQUFXLFFBQVMsRUFBSyxFQUMvZCxNQUFrQixDQUFFLEdBQUksVUFB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QTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQWtHM0IsRUFFUCxZQUFZLHVCQUF3QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0E2QjdCLEVBRVAsWUFBWSxvQkFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQXFPMUIsQ0FFVCxHQUFHLEdBSUYsVUFBWSxDQUlYLGVBQWV1QixFQUFnQkMsRUFBZSxDQUM1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TVMsRUFBWSxPQUFPLENBQUMsRUFDOURSLEdBQVMsaUJBQWlCLFFBQVMsSUFBTVEsRUFBWSxNQUFNLENBQUMsRUFDNUR4UCxHQUFZLGlCQUFpQixRQUFTLElBQU13UCxFQUFZLFNBQVMsQ0FBQyxFQUNsRXBJLEdBQVcsaUJBQWlCLFFBQVNrSSxDQUFhLENBQ3BELEdBQUciLAogICJuYW1lcyI6IFsid2luZG93IiwgIkVycm9ySGFuZGxlciIsICJjb250ZXh0IiwgImVycm9yIiwgIm1ldGFkYXRhIiwgImVycm9yRW50cnkiLCAiY3VycmVudFN0ZXAiLCAibWVzc2FnZSIsICJzdGF0cyIsICJ0eXBlIiwgImZhbGxiYWNrTWVzc2FnZSIsICJtZW1vcnlTdG9yYWdlIiwgImtleSIsICJ2YWx1ZSIsICJyYXciLCAicyIsICJyIiwgImMiLCAiayIsICJ2IiwgInRva2Vuc0J0biIsICJlbCIsICJ0bGRTdWZmaXgiLCAicHJveHlJcElucHV0IiwgInN1YiIsICJkbnNJZCIsICJpZCIsICJpbmZvIiwgInRvcFJvdyIsICJkbnNJZHMiLCAic3ZnSWNvbiIsICJmaXJzdENoaWxkIiwgInNhZmVJZCIsICJsYWJlbCIsICJjYXJkIiwgInJlc3BvbnNlIiwgInVybCIsICJvcHRpb25zIiwgIm1ldGhvZCIsICJuZWVkc0NzcmYiLCAidG9rZW4iLCAiYm9keSIsICJmcmVzaFRva2VuIiwgImRhdGEiLCAicmVzcCIsICJyZXN1bHQiLCAibXNnIiwgImJ0biIsICJsb2FkaW5nVGV4dCIsICJhc3luY0ZuIiwgIm9wdHMiLCAib3JpZ2luYWwiLCAic3VjY2Vzc1RleHQiLCAicmVzZXREZWxheSIsICJlIiwgIm1vZGFsIiwgImNsb3NlQnRucyIsICJ0ZXh0IiwgImR1cmF0aW9uIiwgImV4aXN0aW5nTm90aWYiLCAiY29sb3JzIiwgInRzIiwgImRpZmYiLCAiZmFsbGJhY2siLCAiaHRtbCIsICJldmVudCIsICJmbiIsICJfYSIsICJoIiwgImFwcHMiLCAiYXBwIiwgImlkeCIsICJhIiwgImNoYW5nZXMiLCAiY3JlYXRlU2tlbGV0b25DYXJkIiwgInNob3dTa2VsZXRvbnMiLCAiY291bnQiLCAiZ3JpZCIsICJpIiwgInNrIiwgImhpZGVTa2VsZXRvbnMiLCAic2tlbGV0b25zIiwgIlRIRU1FX0tFWSIsICJVU0VSX1RIRU1FU19LRVkiLCAiTEVHQUNZX0NVU1RPTV9LRVkiLCAiQlVJTFRJTl9USEVNRVMiLCAiVEhFTUVTIiwgIlRIRU1FX1BST1BTIiwgIkJBU0VfUFJPUFMiLCAiREVSSVZFRF9QUk9QUyIsICJUSEVNRV9DT0xPUlMiLCAiaGV4VG9SZ2IiLCAiaGV4IiwgInJnYlRvSGV4IiwgImciLCAiYiIsICJ4IiwgImJsZW5kQ29sb3JzIiwgImhleDEiLCAiaGV4MiIsICJyYXRpbyIsICJjMSIsICJjMiIsICJoZXhMdW1pbmFuY2UiLCAiZGVyaXZlRXh0ZW5kZWRDb2xvcnMiLCAiYmciLCAiZmciLCAibXV0ZWQiLCAiY2FyZEJhc2UiLCAiZG90T2siLCAiZG90QmFkIiwgImlzTGlnaHQiLCAiZGVyaXZlZCIsICJnZW5lcmF0ZUJvZHlCYWNrZ3JvdW5kQ1NTIiwgInNsdWciLCAiYWNjZW50IiwgImFjY2VudFJnYiIsICJnZW5lcmF0ZUJ1dHRvbkhvdmVyQ1NTIiwgImdldFN5c3RlbVRoZW1lIiwgImNsZWFyQ3VzdG9tUHJvcGVydGllcyIsICJwcm9wIiwgInNsdWdpZnkiLCAibmFtZSIsICJjdXJyZW50U2x1ZyIsICJjYWNoZWQiLCAiYmFzZSIsICJjb3VudGVyIiwgImluamVjdFVzZXJUaGVtZVN0eWxlcyIsICJ0aGVtZXNEYXRhIiwgImV4aXN0aW5nIiwgInVzZXJUaGVtZXMiLCAic2x1Z3MiLCAiY3NzIiwgInRoZW1lIiwgImNvbG9yTWFwIiwgInAiLCAic3R5bGUiLCAic3luY1RoZW1lc0Zyb21TZXJ2ZXIiLCAic2VydmVyVGhlbWVzIiwgImN1cnJlbnQiLCAiYXBwbHlUaGVtZSIsICJtaWdyYXRlTGVnYWN5Q3VzdG9tVGhlbWUiLCAibGVnYWN5IiwgInRoZW1lRGF0YSIsICJtb2RlIiwgInQiLCAibWV0YSIsICJzYXZlZFRoZW1lIiwgIm1ldGhvZHNDYWNoZSIsICJmZXRjaE1ldGhvZHMiLCAicmVzIiwgInNob3dQcm92aWRlclNlbGVjdG9yIiwgInByb3ZpZGVycyIsICJvdmVybGF5IiwgIm9yaWdpbmFsQm9keSIsICJwcm92aWRlckJ1dHRvbnMiLCAicHJvdmlkZXIiLCAicmVuZGVyUHJvdmlkZXJDaGFsbGVuZ2UiLCAicmVzdG9yZU9yaWdpbmFsQm9keSIsICJpbnB1dCIsICJzdWJtaXQiLCAic3RhdHVzIiwgImJhY2siLCAiZW1haWwiLCAidmlhIiwgIm1hc2tlZCIsICJzaG93IiwgInNob3dUb3RwV2l0aEVtYWlsRmFsbGJhY2siLCAidG90cFByb3ZpZGVyIiwgImVtYWlsRW5hYmxlZCIsICJkaXYiLCAiaXNBbGxvd2VkUmV0dXJuVXJsIiwgInJldHVyblVybCIsICJwYXJzZWQiLCAic3VmZml4IiwgImJ1aWxkU3NvSGFuZG9mZlRhcmdldCIsICJpc1ByaXZhdGVIb3N0IiwgInJldHVyblBhdGgiLCAicmVzdW1lRXhpc3RpbmdTZXNzaW9uIiwgInBhcnNlZFJldHVybiIsICJzZXJ2aWNlSWQiLCAidGFyZ2V0IiwgInVybFBhcmFtcyIsICJ1cGRhdGVUb3RwTG9nbyIsICJtIiwgImx1bSIsICJkYXJrIiwgImxpZ2h0IiwgInNob3dUb3RwT3ZlcmxheSIsICJmaXJzdElucHV0IiwgImhpZGVUb3RwT3ZlcmxheSIsICJyZWRpcmVjdCIsICJjb250YWluZXIiLCAiaW5wdXRzIiwgInZhbCIsICJjb2RlIiwgInN1Ym1pdFRvdHBDb2RlIiwgInBhc3RlZCIsICJpbnAiLCAiZXJyb3JFbCIsICJjYW5kaWRhdGUiLCAiaG9zdG5hbWUiLCAiaXNTYW1lT3JpZ2luIiwgImlzT3VyVGxkIiwgImZldGNoUmVjb3ZlcnlJbmZvIiwgInNob3dSZWNvdmVyeUxpbmsiLCAibGluayIsICJvcGVuUmVjb3ZlcnlQYW5lbCIsICJwYW5lbCIsICJzdGF0dXNFbCIsICJpbXBvcnRFbCIsICJ2ZXJpZnlFbCIsICJjbG9zZVJlY292ZXJ5UGFuZWwiLCAic3VibWl0UmVjb3ZlcnlTZWNyZXQiLCAic2VjcmV0IiwgInN1Ym1pdFJlY292ZXJ5Q29kZSIsICJleHBlY3RlZFNlcnZpY2VJZCIsICJleHBlY3RlZEhvc3QiLCAiYnVpbGRIYW5kb2ZmVGFyZ2V0IiwgInJlc3VtZSIsICJydW50aW1lIiwgImZldGNoRm4iLCAibG9jYXRpb25PYmoiLCAiZXJyb3JIYW5kbGVyIiwgImN1cnJlbnRTZXJ2aWNlIiwgImNyZWRlbnRpYWxSZXR1cm5VcmwiLCAiY3VycmVudFNlcnZpY2VIYWRDcmVkcyIsICJhcnJTZXJ2aWNlcyIsICJxdWFsaXR5UHJvZmlsZVNlcnZpY2VzIiwgImdldFNlcnZpY2VVcmwiLCAic2VydmljZSIsICJzaG93RXJyb3IiLCAiaGlkZUVycm9yIiwgInJlcXVpcmVTdWNjZXNzZnVsV3JpdGUiLCAiaXNBbGxvd2VkQ3JlZGVudGlhbFJldHVyblVybCIsICJ0aXRsZSIsICJkZXNjIiwgInNlZWRob3N0U2VjdGlvbiIsICJhcGlrZXlTZWN0aW9uIiwgImJhc2ljU2VjdGlvbiIsICJxdWFsaXR5U2VjdGlvbiIsICJpc0V4dCIsICJpc0FyciIsICJoYXNRdWFsaXR5IiwgInF1YWxTZWxlY3QiLCAibG9hZFNlcnZpY2VDcmVkcyIsICJkb3QiLCAiY2xlYXJCdG4iLCAiaGFzQ3JlZHMiLCAic3ZjSWQiLCAibG9hZFF1YWxpdHlQcm9maWxlcyIsICJxdWFsU3RhdHVzIiwgInN2Y1VybCIsICJwYXJhbXMiLCAib3B0IiwgIm1hdGNoNzIwIiwgImFwaUtleSIsICJzYXZlQnRuIiwgImV4dGVybmFsVXNlciIsICJleHRlcm5hbFBhc3MiLCAicmVxdWVzdGVkQXBpS2V5IiwgImJhc2ljVXNlciIsICJiYXNpY1Bhc3MiLCAiaGFzRXh0ZXJuYWxMb2dpbiIsICJoYXNBcGlLZXkiLCAiaGFzQmFzaWNMb2dpbiIsICJ1c2VyIiwgInBhc3MiLCAicXVhbGl0eVByb2ZpbGVJZCIsICJxdWFsaXR5UHJvZmlsZU5hbWUiLCAiYXJyUmVzcG9uc2UiLCAic2VlZERhdGEiLCAiZCIsICJsb2FkVG90cFNldHRpbmdzIiwgImVuYWJsZWQiLCAic2Vzc2lvbkR1cmF0aW9uIiwgImlzU2V0VXAiLCAic3RhdHVzRG90IiwgInN0YXR1c1RleHQiLCAic3RhdHVzQmFubmVyIiwgInNldHVwU2VjdGlvbiIsICJxclNlY3Rpb24iLCAiZHVyYXRpb25TZWN0aW9uIiwgImRpc2FibGVTZWN0aW9uIiwgInNldHVwQnRuIiwgInVwZGF0ZUF1dGhDYXJkIiwgIkRVUkFUSU9OX0xBQkVMUyIsICJ0cmFuc2xhdGVkIiwgImkxOG4iLCAiYWN0aXZlIiwgInBpbGwiLCAicGF5bG9hZCIsICJibG9iIiwgImVyciIsICJBUEkiLCAiX2VsIiwgInRhZyIsICJhdHRycyIsICJjaGlsZHJlbiIsICJub2RlIiwgIl9mZXRjaEpTT04iLCAiY3NyZiIsICJfcmVuZGVyQmFkZ2UiLCAicm9sZSIsICJfcmVuZGVyVXNlcnNMaXN0IiwgInVzZXJzIiwgIm9uQ2hhbmdlIiwgInRhYmxlIiwgInRib2R5IiwgInUiLCAicm93IiwgImVtYWlsQ2VsbCIsICJyb2xlQ2VsbCIsICJhY3Rpb25zQ2VsbCIsICJyb2xlU2VsZWN0IiwgImV2IiwgImRlbEJ0biIsICJfcmVuZGVySW52aXRlRm9ybSIsICJvbklzc3VlZCIsICJmb3JtIiwgImZkIiwgInJvbGVTZWwiLCAiX3JlbmRlckludml0ZXNMaXN0IiwgImludml0ZXMiLCAiaW52IiwgIl9yZW5kZXJJc3N1ZWRJbnZpdGVCYW5uZXIiLCAiaW52aXRlIiwgInBhcmVudCIsICJiYW5uZXIiLCAiY29weUJ0biIsICJtb3VudCIsICJtZURhdGEiLCAicmVmcmVzaEJ0biIsICJ1c2Vyc0hlYWRlciIsICJ1c2Vyc0xpc3QiLCAidXNlcnNEYXRhIiwgImFkZFVzZXJGb3JtIiwgImludml0ZUZvcm1Db250YWluZXIiLCAiaW52aXRlc0xpc3QiLCAiaW52aXRlc0RhdGEiLCAiaXNzdWVkIiwgIm9wZW4iLCAiYmFja2Ryb3AiLCAiY2xvc2UiLCAiYXR0YWNoVHJpZ2dlciIsICJiYXJDb250YWluZXIiLCAiX21heWJlU2hvdyIsICJtZSIsICJnZXREbnNJZHMiLCAiZ2V0RG5zRGlzcGxheU5hbWUiLCAicmVxdWlyZVN1Y2Nlc3NmdWxEbnNNdXRhdGlvbiIsICJidWlsZENyZWRlbnRpYWxTZWN0aW9ucyIsICJnZXRFbmNyeXB0aW9uS2V5IiwgIm9sZEtleSIsICJhcnJheSIsICJFTkNSWVBUSU9OX0tFWSIsICJjcmVkZW50aWFsRW5jcnlwdCIsICJpdiIsICJpdkhleCIsICJrZXlCeXRlcyIsICJjaGFyQ29kZSIsICJjcmVkZW50aWFsRGVjcnlwdCIsICJlbmNyeXB0ZWRUZXh0IiwgImRlY29kZWQiLCAiZ2V0Q3JlZGVudGlhbCIsICJ0b2tlblR5cGUiLCAiY3JlZFR5cGUiLCAiZW5jcnlwdGVkIiwgInNldENyZWRlbnRpYWwiLCAiZ2V0VG9rZW4iLCAiZ2V0VXNlcm5hbWUiLCAic2V0VG9rZW4iLCAic2V0VXNlcm5hbWUiLCAidXNlcm5hbWUiLCAiZ2V0QWxsQ3JlZGVudGlhbHMiLCAiY2xlYXJBbGxDcmVkZW50aWFscyIsICJnZXRTdG9yZWRDcmVkZW50aWFscyIsICJyZWFkb25seVRva2VuIiwgInJlYWRvbmx5VXNlcm5hbWUiLCAiYWRtaW5Ub2tlbiIsICJhZG1pblVzZXJuYW1lIiwgIm9sZFRva2VuIiwgIm9sZFVzZXJuYW1lIiwgImNyZWRzIiwgInRhcmdldElkIiwgInNlcnZlcnMiLCAiaGFzQW55Q3JlZHMiLCAiZW50cnkiLCAicm9Vc2VyIiwgInJvUGFzcyIsICJhZG1pblVzZXIiLCAiYWRtaW5QYXNzIiwgImZhaWxlZCIsICJkZXRhaWxzIiwgInN0YXR1c0xhYmVsIiwgInVwIiwgInNldFF1aWNrIiwgInJlc3BvbnNlVGltZSIsICJ0aW1lRWwiLCAiZ2V0UmVzcG9uc2VUaW1lQ2xhc3MiLCAidGltZSIsICJpc1VwIiwgImNoZWNrU2VydmljZVdpdGhUaW1pbmciLCAic3RhcnRUaW1lIiwgImVuZFRpbWUiLCAicmVmcmVzaEluRmxpZ2h0IiwgInJlZnJlc2hRdWV1ZWQiLCAibG9hZFNlcnZpY2VzIiwgInNlcnZpY2VVcmwiLCAic3ZjIiwgImRucyIsICJjbHMiLCAidHh0IiwgImJ1aWxkR3JpZCIsICJyb290IiwgIndyYXAiLCAiaW1nIiwgImFwcElkIiwgImNkblVybHMiLCAidW5pcXVlVXJscyIsICJuZXh0SW5kZXgiLCAibmFtZVNwYW4iLCAidHNCYWRnZSIsICJjYXRJbmZvIiwgImNhdEJhZGdlIiwgInVwZGF0ZUJhZGdlIiwgInJlc3BvbnNlUm93IiwgInRpbWVTcGFuIiwgImhlYWx0aFJvdyIsICJ1cHRpbWVDaGlwIiwgInVwdGltZU1pbmlCYXIiLCAidXB0aW1lRmlsbCIsICJidG5Sb3ciLCAibG9nc0J0biIsICJ1cGRhdGVCdG4iLCAiZXhlY0J0biIsICJjcmVkc0J0biIsICJvcHRCdG4iLCAic2hhcmVCdG4iLCAic2V0QmFkZ2UiLCAicmVmcmVzaEFsbCIsICJ1cGRhdGVTdGFtcCIsICJjaGVja2VkQXQiLCAic3RhbXAiLCAiYXBwbHlCYXRjaFJlc3VsdHMiLCAic3RhdHVzZXMiLCAicmVmcmVzaEZhbGxiYWNrIiwgInRvcENoZWNrcyIsICJ0b3BSZXN1bHRzIiwgImludGVybmV0UmVzdWx0IiwgImJhdGNoRXJyb3IiLCAiZmFsbGJhY2tFcnJvciIsICJvcGVuQnRuIiwgInJlc3RhcnREbnNTZXJ2aWNlIiwgInJlc3RhcnRCdG4iLCAidXBkYXRlRG5zU2VydmVyIiwgInNlcnZlcklwIiwgIm9yaWdpbmFsVGV4dCIsICJjaGVja1Jlc3VsdCIsICJ1cGRhdGVSZXN1bHQiLCAiZG93bmxvYWRJbmZvIiwgImluc3RydWN0aW9uc0luZm8iLCAiY3VycmVudERuc0lkIiwgIm9wZW5EbnNTZXR0aW5ncyIsICJzZXJ2ZXIiLCAic2F2ZURuc1NldHRpbmdzIiwgImlwIiwgInBvcnQiLCAidXBkYXRlIiwgImNsb3NlRG5zU2V0dGluZ3MiLCAicmVtb3ZlRG5zU2VydmVyIiwgImNvbmZpZyIsICJzZXR0aW5nc0J0biIsICJjdXJyZW50RG5zU2VydmljZSIsICJsb2dzSW50ZXJ2YWwiLCAibG9nc1BhdXNlZCIsICJjdXJyZW50Q29udGFpbmVySWQiLCAiY3VycmVudENvbnRhaW5lck5hbWUiLCAiY29udGFpbmVyTG9nc01vZGUiLCAiY3VycmVudExvZ1BhdGgiLCAiY3VycmVudExvZ1NlcnZpY2VOYW1lIiwgImZpbGVMb2dzTW9kZSIsICJsb2dFdmVudFNvdXJjZSIsICJpc1N0cmVhbWluZyIsICJmZXRjaERuc0xvZ3MiLCAibGluZXMiLCAic2VydmVySVAiLCAiZ2V0UmNvZGVDb2xvciIsICJyY29kZSIsICJyZW5kZXJEbnNMb2dFbnRyeSIsICJsb2ciLCAicmNvZGVDb2xvciIsICJpc0Jsb2NrZWQiLCAidXBkYXRlTG9nc0Rpc3BsYXkiLCAidXBkYXRlRmlsZUxvZ3NEaXNwbGF5IiwgInVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5IiwgImxvZ3NDb250ZW50IiwgImxvZ0VsZW1lbnQiLCAib3BlbkxvZ3NNb2RhbCIsICJwYXVzZUJ0biIsICJzdHJlYW1CdG4iLCAiY2xvc2VMb2dzTW9kYWwiLCAic3RvcExvZ1N0cmVhbWluZyIsICJzdGFydExvZ1N0cmVhbWluZyIsICJjb250YWluZXJJZCIsICJpc0Vycm9yIiwgImxldmVsQ29sb3IiLCAibGV2ZWxCYWRnZSIsICJmZXRjaENvbnRhaW5lckxvZ3MiLCAiZW5kcG9pbnQiLCAicmVuZGVyQ29udGFpbmVyTG9nRW50cnkiLCAic3RyZWFtQ29sb3IiLCAic3RyZWFtQmFkZ2UiLCAib3BlbkNvbnRhaW5lckxvZ3NNb2RhbCIsICJjb250YWluZXJOYW1lIiwgImZldGNoRmlsZUxvZ3MiLCAibG9nUGF0aCIsICJyZW5kZXJGaWxlTG9nRW50cnkiLCAibG9nTGV2ZWwiLCAib3BlbkZpbGVMb2dzTW9kYWwiLCAic2VydmljZU5hbWUiLCAibG9hZEV4aXN0aW5nQ0FzIiwgImNhZGR5ZmlsZVBhdGgiLCAic2VsZWN0IiwgImNhIiwgIm9wdGlvbiIsICJnZW5lcmF0ZUNhZGR5Q29uZmlnIiwgInN1YmRvbWFpbiIsICJzc2xUeXBlIiwgImNhTmFtZSIsICJleGlzdGluZ0NhIiwgImVuYWJsZUF1dGgiLCAiZW5hYmxlQ29ycyIsICJjdXN0b21IZWFkZXJzIiwgInVwc3RyZWFtUGF0aCIsICJoZWFsdGhDaGVjayIsICJ0aW1lb3V0IiwgInRhaWxzY2FsZU9ubHkiLCAiY2FkZHlDb25maWciLCAiaGVhZGVycyIsICJjcmVhdGVEbnNSZWNvcmQiLCAidHRsIiwgImRuc1Rva2VuIiwgImRvbWFpbiIsICJlcnJvclRleHQiLCAiYWRkU2VydmljZVRvQ29uZmlnIiwgInNlcnZpY2VDb25maWciLCAibmV3U2VydmljZSIsICJhZGRUb0NhZGR5ZmlsZSIsICJjdXJyZW50RWRpdFNlcnZpY2UiLCAib3BlblNlcnZpY2VFZGl0TW9kYWwiLCAiY2F0ZWdvcnlTZWxlY3QiLCAiY2xvc2VTZXJ2aWNlRWRpdE1vZGFsIiwgInNhdmVTZXJ2aWNlQ2hhbmdlcyIsICJuZXdTdWJkb21haW4iLCAibmV3TmFtZSIsICJuZXdQb3J0IiwgIm5ld0lwIiwgIm5ld0xvZ28iLCAibmV3Q2F0ZWdvcnkiLCAib2xkU3ViZG9tYWluIiwgImFwcEluZGV4IiwgImZpbGUiLCAicmVhZGVyIiwgImRhdGFVcmwiLCAic2hvd0RlbGV0ZU1vZGFsIiwgImhhc0NvbnRhaW5lciIsICJyZXNvbHZlIiwgImNvbnRhaW5lckluZm8iLCAiaGVscCIsICJjYW5jZWxCdG4iLCAicmVtb3ZlQnRuIiwgImRlbGV0ZUJ0biIsICJjbGVhbnVwIiwgImhhbmRsZUNhbmNlbCIsICJoYW5kbGVSZW1vdmUiLCAiaGFuZGxlRGVsZXRlIiwgImhhbmRsZUJhY2tkcm9wIiwgInVwZGF0ZUNvbnRhaW5lciIsICJkZWxldGVTZXJ2aWNlIiwgImRlbGV0ZUNvbnRhaW5lciIsICJyZXN1bHRzIiwgInNlcnZpY2VJUCIsICJkbnNSZXN1bHQiLCAiY2FkZHlSZXN1bHQiLCAiaW5kZXgiLCAiY3VzdG9tQXBwcyIsICJsb2NhbEluZGV4IiwgInNlcnZpY2VSZXN1bHQiLCAiaGFzRXJyb3JzIiwgImVycm9yTWVzc2FnZXMiLCAic3VjY2Vzc1N0YXRlcyIsICJpc1N1Y2Nlc3MiLCAiZGVyaXZlU3ViZG9tYWluIiwgImdldFNtYXJ0U3NsRGVmYXVsdCIsICJ1cGRhdGVTZXJ2aWNlUHJldmlldyIsICJRVUlDS19JUFMiLCAiZG5zUHJldmlldyIsICJ1cmxQcmV2aWV3IiwgImNvbmZpZ1ByZXZpZXciLCAiZGV0ZWN0TmV0d29ya0lQcyIsICJsYW5CdG4iLCAidHNCdG4iLCAiaXBJbnB1dCIsICJpbml0UXVpY2tJUEJ1dHRvbnMiLCAiY3VycmVudElQIiwgIm9wZW5BZGRTZXJ2aWNlTW9kYWwiLCAibW9kYWxDb250ZW50IiwgInNzbFNlbGVjdCIsICJ0YWlsc2NhbGVTdGF0dXMiLCAidGFpbHNjYWxlQ2hlY2tib3giLCAic2V0dXBTZXJ2aWNlVHlwZVN3aXRjaGluZyIsICJsb2NhbFJhZGlvIiwgImV4dGVybmFsUmFkaW8iLCAibG9jYWxDb25maWciLCAiZXh0ZXJuYWxDb25maWciLCAidGFiTG9jYWwiLCAidGFiRXh0ZXJuYWwiLCAic3dpdGNoU2VydmljZVR5cGUiLCAic2V0dXBBdXRvU3ViZG9tYWluIiwgIm5hbWVJbnB1dCIsICJzdWJkb21haW5JbnB1dCIsICJzdWJkb21haW5QcmV2aWV3IiwgInVzZXJFZGl0ZWRTdWJkb21haW4iLCAiZXh0TmFtZUlucHV0IiwgImV4dFN1YmRvbWFpbklucHV0IiwgImV4dFN1YmRvbWFpblByZXZpZXciLCAiZXh0RG9tYWluUHJldmlldyIsICJ1c2VyRWRpdGVkRXh0U3ViZG9tYWluIiwgImNyZWF0ZUV4dGVybmFsU2VydmljZSIsICJleHRlcm5hbFVybCIsICJsb2dvIiwgImljb24iLCAiY3JlYXRlRG5zIiwgImNyZWF0ZUNhZGR5IiwgInByb3h5SXAiLCAicHJlc2VydmVIb3N0IiwgImZvbGxvd1JlZGlyZWN0cyIsICJjYXRlZ29yeSIsICJkZWZhdWx0U2VydmljZXMiLCAiY3VzdG9tU2VydmljZXMiLCAiY2xvc2VBZGRTZXJ2aWNlTW9kYWwiLCAicGFydHMiLCAic3ViUHJldiIsICJleHRTdWJQcmV2IiwgImV4dE5hbWUiLCAiZXh0U3ViIiwgImV4dFVybCIsICJleHRMb2dvIiwgImV4dEljb24iLCAibG9jYWxPcHRzIiwgImV4dE9wdHMiLCAiY3JlYXRlTmV3U2VydmljZSIsICJzdGF0dXNQYXJ0cyIsICJleGlzdGluZ0NhQ29uZmlnIiwgImN1c3RvbUNhQ29uZmlnIiwgImJ1dHRvbiIsICJkbnNDb25maWciLCAiZWxlbWVudCIsICJsb2FkQ3VzdG9tU2VydmljZXMiLCAiZXMiLCAicmVjb25uZWN0RGVsYXkiLCAiTUFYX1JFQ09OTkVDVCIsICJfc3NlRmFpbENvdW50IiwgIl9zc2VNYW51YWxseUNsb3NlZCIsICJjb25uZWN0IiwgInVwZGF0ZXNCdG4iLCAiY2xvc2VBbmRTdG9wIiwgInJlc3VtZUFmdGVyUmVhdXRoIiwgInNlYXJjaElucHV0IiwgInN0YXR1c1NlbGVjdCIsICJjb3VudFNwYW4iLCAiZ2V0Q2F0ZWdvcnlMaXN0IiwgInNlZW4iLCAiZnJvbUNhcmRzIiwgImNhdCIsICJhcGlDYXRzIiwgInJlZnJlc2hDYXRlZ29yeURyb3Bkb3duIiwgImxpc3QiLCAibyIsICJ1cGRhdGVGaWx0ZXIiLCAicXVlcnkiLCAic3RhdHVzRmlsdGVyIiwgImNhdGVnb3J5RmlsdGVyIiwgImNhcmRzIiwgInZpc2libGVDb3VudCIsICJ0b3RhbCIsICJkZWJvdW5jZSIsICJkZWxheSIsICJhcmdzIiwgImJhdGNoQnRuIiwgImJhdGNoQmFyIiwgImJhdGNoQ291bnQiLCAic3RhcnRCdG4iLCAic3RvcEJ0biIsICJiYXRjaE1vZGUiLCAic2VsZWN0ZWRDb250YWluZXJzIiwgImVudGVyQmF0Y2hNb2RlIiwgInVwZGF0ZVNlbGVjdGVkQ291bnQiLCAiY2hlY2tib3giLCAiZXhpdEJhdGNoTW9kZSIsICJjYiIsICJiYXRjaEFjdGlvbiIsICJhY3Rpb24iLCAiY29udGFpbmVycyIsICJhY3Rpb25MYWJlbCIsICJidG5zIiwgInN1Y2Nlc3MiLCAiZXJyb3JzIl0KfQo= diff --git a/status/dist/init.js b/status/dist/init.js index 6eacd0d..b91b825 100644 --- a/status/dist/init.js +++ b/status/dist/init.js @@ -1,4 +1,4 @@ -(function(){function v(){const i=safeGet("custom-services");if(i)try{JSON.parse(i).forEach(e=>{window.APPS.find(a=>a.id===e.id)||window.APPS.push(e)})}catch(n){console.warn("Failed to load custom services:",n)}}v();function k(){const i=document.querySelectorAll(".top .card");i.forEach((n,e)=>{n.style.transitionDelay=`${Math.min(e*60,300)}ms`}),requestAnimationFrame(()=>{i.forEach(n=>n.classList.add("loaded"))})}function u(){if(!("serviceWorker"in navigator)||!window.isSecureContext&&location.hostname!=="localhost"&&location.hostname!=="127.0.0.1")return;const i=()=>{navigator.serviceWorker.register("/sw.js",{updateViaCache:"none"}).catch(n=>{console.warn("[init] Service worker registration failed:",n)})};document.readyState==="complete"?i():window.addEventListener("load",i,{once:!0})}let h=!1;async function f(){if(h){console.warn("[init] initializeDashboard called again, skipping duplicate");return}if(h=!0,await window.loadServices(),await y(),window.buildGrid(),k(),window.refreshAll(),setInterval(()=>{window._dcAuthLost||window.refreshAll()},DC.POLL.DASHBOARD),typeof window.refreshCredsButtons=="function"&&window.refreshCredsButtons(),typeof window.refreshMonitoringWidgets=="function"&&window.refreshMonitoringWidgets(),typeof window._updateAuthCard=="function")try{const n=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();n.success&&window._updateAuthCard(n.config.enabled&&n.config.isSetUp,n.config.sessionDuration)}catch{}if(window.__dashcaddySiteConfigLoaded)try{await window.__dashcaddySiteConfigLoaded}catch{}if(S(),C()&&b(),window.AdminPanel&&typeof window.AdminPanel.attachTrigger=="function")try{await window.AdminPanel.attachTrigger(document.body)}catch(i){console.warn("[init] AdminPanel attachTrigger failed:",i)}}function b(){if(document.querySelector('script[src="/dist/onboarding.js"]'))return;const i=document.createElement("script");if(i.src="/dist/onboarding.js",i.defer=!0,document.head.appendChild(i),!document.querySelector('link[href="/css/driver.min.css"]')){const n=document.createElement("link");n.rel="stylesheet",n.href="/css/driver.min.css",document.head.appendChild(n)}if(!document.querySelector('link[href="/css/onboarding.css"]')){const n=document.createElement("link");n.rel="stylesheet",n.href="/css/onboarding.css",document.head.appendChild(n)}}function C(){if(typeof SITE<"u"&&SITE.onboardingCompleted)return!1;try{const i=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));return!i||!i.tourCompleted&&i.currentStep===0}catch{return!0}}function E(){const i=document.querySelectorAll(".tools-section");if(!i.length)return;let n={};try{n=JSON.parse(localStorage.getItem("toolbar-sections")||"{}")}catch{}i.forEach(e=>{const a=e.dataset.section,c=e.querySelector(".tools-section-header");c&&(n[a]&&(e.classList.add("open"),c.setAttribute("aria-expanded","true")),c.addEventListener("click",s=>{s.preventDefault();const l=e.classList.toggle("open");c.setAttribute("aria-expanded",l?"true":"false");const m={};document.querySelectorAll(".tools-section").forEach(t=>{m[t.dataset.section]=t.classList.contains("open")}),localStorage.setItem("toolbar-sections",JSON.stringify(m))}))})}E();function S(){if(document.getElementById("restart-tour-btn"))return;let i=typeof SITE<"u"&&SITE.onboardingCompleted;try{const a=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));i=i||!!(a&&a.tourCompleted)}catch{}const n=i?document.querySelector('.tools-section[data-section="admin"] .tools-section-items'):document.querySelector(".tools-primary");if(!n)return;const e=document.createElement("button");e.id="restart-tour-btn",e.textContent=i?"Help Tour":"\u{1F393} Help Tour",e.title="Restart the onboarding tour",e.onclick=()=>{if(window.DashCaddyOnboarding)window.DashCaddyOnboarding.restartTour();else{b();const a=setInterval(()=>{window.DashCaddyOnboarding&&(clearInterval(a),window.DashCaddyOnboarding.restartTour())},100);setTimeout(()=>clearInterval(a),5e3)}},n.appendChild(e)}window.initializeDashboard=f,window.loadCustomServices=v,u();async function y(){try{const i=await fetch("/api/v1/templates",{cache:"no-store"});if(!i.ok)return;const n=await i.json();n&&n.categories&&(window.DC_CATEGORIES=n.categories,typeof DC<"u"&&(DC.CATEGORIES=n.categories),q())}catch(i){console.warn("[init] Failed to load template categories:",i)}}function q(){const i=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES;i&&document.querySelectorAll('select[data-role="service-category"]').forEach(n=>{const e=n.dataset.current||"",a=n.querySelector('option[value=""]');if(n.innerHTML="",a)n.appendChild(a);else{const c=document.createElement("option");c.value="",c.textContent="\u2014 Select category \u2014",n.appendChild(c)}Object.entries(i).forEach(([c,s])=>{const l=document.createElement("option");l.value=c,l.textContent=`${s.icon||""} ${c}`.trim(),c===e&&(l.selected=!0),n.appendChild(l)})})}window.populateCategorySelects=q,window.loadTemplateCategories=y,(async()=>{try{const n=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();if(n.success&&n.config.enabled&&(await fetch("/api/v1/totp/check-session",{cache:"no-store"})).status===401){window._showTotpOverlay();return}}catch(i){console.warn("TOTP check failed, proceeding normally:",i)}f()})()})(),(function(){const v=document.createElement("style");v.textContent=` +(function(){function v(){const n=safeGet("custom-services");if(n)try{JSON.parse(n).forEach(e=>{window.APPS.find(a=>a.id===e.id)||window.APPS.push(e)})}catch(i){console.warn("Failed to load custom services:",i)}}v();function k(){const n=document.querySelectorAll(".top .card");n.forEach((i,e)=>{i.style.transitionDelay=`${Math.min(e*60,300)}ms`}),requestAnimationFrame(()=>{n.forEach(i=>i.classList.add("loaded"))})}function u(){if(!("serviceWorker"in navigator)||!window.isSecureContext&&location.hostname!=="localhost"&&location.hostname!=="127.0.0.1")return;const n=()=>{navigator.serviceWorker.register("/sw.js",{updateViaCache:"none"}).catch(i=>{console.warn("[init] Service worker registration failed:",i)})};document.readyState==="complete"?n():window.addEventListener("load",n,{once:!0})}let h=!1;async function f(){if(h){console.warn("[init] initializeDashboard called again, skipping duplicate");return}if(h=!0,await window.loadServices(),await y(),window.buildGrid(),typeof window.openRequestedCredentialForm=="function"&&window.openRequestedCredentialForm(),k(),window.refreshAll(),setInterval(()=>{window._dcAuthLost||window.refreshAll()},DC.POLL.DASHBOARD),typeof window.refreshCredsButtons=="function"&&window.refreshCredsButtons(),typeof window.refreshMonitoringWidgets=="function"&&window.refreshMonitoringWidgets(),typeof window._updateAuthCard=="function")try{const i=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();i.success&&window._updateAuthCard(i.config.enabled&&i.config.isSetUp,i.config.sessionDuration)}catch{}if(window.__dashcaddySiteConfigLoaded)try{await window.__dashcaddySiteConfigLoaded}catch{}if(S(),C()&&b(),window.AdminPanel&&typeof window.AdminPanel.attachTrigger=="function")try{await window.AdminPanel.attachTrigger(document.body)}catch(n){console.warn("[init] AdminPanel attachTrigger failed:",n)}}function b(){if(document.querySelector('script[src="/dist/onboarding.js"]'))return;const n=document.createElement("script");if(n.src="/dist/onboarding.js",n.defer=!0,document.head.appendChild(n),!document.querySelector('link[href="/css/driver.min.css"]')){const i=document.createElement("link");i.rel="stylesheet",i.href="/css/driver.min.css",document.head.appendChild(i)}if(!document.querySelector('link[href="/css/onboarding.css"]')){const i=document.createElement("link");i.rel="stylesheet",i.href="/css/onboarding.css",document.head.appendChild(i)}}function C(){if(typeof SITE<"u"&&SITE.onboardingCompleted)return!1;try{const n=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));return!n||!n.tourCompleted&&n.currentStep===0}catch{return!0}}function E(){const n=document.querySelectorAll(".tools-section");if(!n.length)return;let i={};try{i=JSON.parse(localStorage.getItem("toolbar-sections")||"{}")}catch{}n.forEach(e=>{const a=e.dataset.section,c=e.querySelector(".tools-section-header");c&&(i[a]&&(e.classList.add("open"),c.setAttribute("aria-expanded","true")),c.addEventListener("click",s=>{s.preventDefault();const l=e.classList.toggle("open");c.setAttribute("aria-expanded",l?"true":"false");const m={};document.querySelectorAll(".tools-section").forEach(t=>{m[t.dataset.section]=t.classList.contains("open")}),localStorage.setItem("toolbar-sections",JSON.stringify(m))}))})}E();function S(){if(document.getElementById("restart-tour-btn"))return;let n=typeof SITE<"u"&&SITE.onboardingCompleted;try{const a=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));n=n||!!(a&&a.tourCompleted)}catch{}const i=n?document.querySelector('.tools-section[data-section="admin"] .tools-section-items'):document.querySelector(".tools-primary");if(!i)return;const e=document.createElement("button");e.id="restart-tour-btn",e.textContent=n?"Help Tour":"\u{1F393} Help Tour",e.title="Restart the onboarding tour",e.onclick=()=>{if(window.DashCaddyOnboarding)window.DashCaddyOnboarding.restartTour();else{b();const a=setInterval(()=>{window.DashCaddyOnboarding&&(clearInterval(a),window.DashCaddyOnboarding.restartTour())},100);setTimeout(()=>clearInterval(a),5e3)}},i.appendChild(e)}window.initializeDashboard=f,window.loadCustomServices=v,u();async function y(){try{const n=await fetch("/api/v1/templates",{cache:"no-store"});if(!n.ok)return;const i=await n.json();i&&i.categories&&(window.DC_CATEGORIES=i.categories,typeof DC<"u"&&(DC.CATEGORIES=i.categories),q())}catch(n){console.warn("[init] Failed to load template categories:",n)}}function q(){const n=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES;n&&document.querySelectorAll('select[data-role="service-category"]').forEach(i=>{const e=i.dataset.current||"",a=i.querySelector('option[value=""]');if(i.innerHTML="",a)i.appendChild(a);else{const c=document.createElement("option");c.value="",c.textContent="\u2014 Select category \u2014",i.appendChild(c)}Object.entries(n).forEach(([c,s])=>{const l=document.createElement("option");l.value=c,l.textContent=`${s.icon||""} ${c}`.trim(),c===e&&(l.selected=!0),i.appendChild(l)})})}window.populateCategorySelects=q,window.loadTemplateCategories=y,(async()=>{try{const i=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();if(i.success&&i.config.enabled&&(await fetch("/api/v1/totp/check-session",{cache:"no-store"})).status===401){window._showTotpOverlay();return}}catch(n){console.warn("TOTP check failed, proceeding normally:",n)}f()})()})(),(function(){const v=document.createElement("style");v.textContent=` .dc-monitor { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); @@ -109,7 +109,7 @@
\u2014
\u2014
- `,k.parentNode.insertBefore(u,k);function h(e,a){const c=document.getElementById(e);if(!c)return;const s=Math.max(0,Math.min(100,Number(a)||0));c.style.width=s+"%",c.classList.remove("warn","bad"),s>=85?c.classList.add("bad"):s>=65&&c.classList.add("warn")}function f(e){return e==null||isNaN(e)?"\u2014":Math.round(e*10)/10+"%"}function b(e){if(e==null||isNaN(e))return"\u2014";const a=["B","KB","MB","GB","TB"];let c=0;for(;e>=1024&&c{l.dataset.status==="on"&&a++});const c=document.getElementById("dc-monitor-services"),s=document.getElementById("dc-monitor-services-sub");c&&(c.textContent=`${a} / ${e}`),s&&(s.textContent=e===0?"no services yet":`${a} online \xB7 ${e-a} offline`)}function E(e){const a=document.getElementById("dc-monitor-health"),c=document.getElementById("dc-monitor-health-sub");if(!a)return;if(!e||e.summary==null){a.textContent="\u2014",c&&(c.textContent="no data");return}const s=e.summary,l=s.healthy??s.up??0,m=s.unhealthy??s.down??0,t=s.total??l+m;a.textContent=`${l}/${t}`,c&&(m===0?c.innerHTML='\u25CF all healthy':m<=2?c.innerHTML=`\u25CF ${m} degraded`:c.innerHTML=`\u25CF ${m} down`)}async function S(){try{const e=await fetch("/api/v1/monitoring/stats",{cache:"no-store"});if(!e.ok)return null;const a=await e.json();return a&&a.stats?a.stats:null}catch{return null}}async function y(){try{const e=await fetch("/api/v1/health-checks/status",{cache:"no-store"});return e.ok?await e.json():null}catch{return null}}function q(e){const a=document.getElementById("dc-monitor-containers"),c=document.getElementById("dc-monitor-containers-sub"),s=document.getElementById("dc-monitor-cpu"),l=document.getElementById("dc-monitor-mem");if(!e){a&&(a.textContent="\u2014"),s&&(s.textContent="\u2014"),l&&(l.textContent="\u2014");return}const m=Object.values(e);if(m.length===0){a&&(a.textContent="0"),c&&(c.textContent="no containers reporting"),s&&(s.textContent="0%"),l&&(l.textContent="0%"),h("dc-monitor-cpu-bar",0),h("dc-monitor-mem-bar",0);return}let t=0,o=0,r=0,p=0,d=0;m.forEach(g=>{if(g.cpu!=null){const x=Number(g.cpu);isNaN(x)||(t+=x>1?x:x*100,p++)}if(g.memory!=null){const x=Number(g.memory);isNaN(x)||(o+=x,r+=Number(g.memoryUsage||0),d++)}});const w=p?t/p:0,L=d?o/d:0;if(a&&(a.textContent=String(m.length)),c){const g=r?` \xB7 ${b(r)} RAM`:"";c.textContent=`running${g}`}s&&(s.textContent=f(w)),l&&(l.textContent=f(L)),h("dc-monitor-cpu-bar",w),h("dc-monitor-mem-bar",L)}let i=!1;async function n(){if(!i){i=!0;try{C();const[e,a]=await Promise.all([S(),y()]);q(e),E(a);const c=document.getElementById("dc-monitor-refresh-stamp");if(c){const s=new Date;c.textContent=`updated ${s.toLocaleTimeString()}`}}finally{i=!1}}}window.refreshMonitoringWidgets=n,setInterval(n,typeof DC<"u"&&DC.POLL&&DC.POLL.STATS||5e3),setTimeout(n,200)})(),(function(){"use strict";const v=(...t)=>{window.DASHCADDY_DEBUG&&console.log(...t)},k=["#app-selector-modal","#app-deploy-modal","#weather-modal","#token-management-modal","#service-edit-modal","#notifications-modal","#backup-modal","#stats-modal","#arr-setup-modal","#add-service-modal","#error-log-modal","#logs-modal","#dns-template-modal"];let u=null,h=null,f=null;function b(){try{C(),document.addEventListener("keydown",E),v("[Keyboard Shortcuts] Initialized"),v("[Keyboard Shortcuts] Press Ctrl+K to open quick search"),v("[Keyboard Shortcuts] Press Escape to close modals")}catch(t){console.warn("[Keyboard Shortcuts] Failed to initialize:",t.message)}}function C(){u=document.createElement("div"),u.id="quick-search-modal",u.className="quick-search-modal",u.innerHTML=` + `,k.parentNode.insertBefore(u,k);function h(e,a){const c=document.getElementById(e);if(!c)return;const s=Math.max(0,Math.min(100,Number(a)||0));c.style.width=s+"%",c.classList.remove("warn","bad"),s>=85?c.classList.add("bad"):s>=65&&c.classList.add("warn")}function f(e){return e==null||isNaN(e)?"\u2014":Math.round(e*10)/10+"%"}function b(e){if(e==null||isNaN(e))return"\u2014";const a=["B","KB","MB","GB","TB"];let c=0;for(;e>=1024&&c{l.dataset.status==="on"&&a++});const c=document.getElementById("dc-monitor-services"),s=document.getElementById("dc-monitor-services-sub");c&&(c.textContent=`${a} / ${e}`),s&&(s.textContent=e===0?"no services yet":`${a} online \xB7 ${e-a} offline`)}function E(e){const a=document.getElementById("dc-monitor-health"),c=document.getElementById("dc-monitor-health-sub");if(!a)return;if(!e||e.summary==null){a.textContent="\u2014",c&&(c.textContent="no data");return}const s=e.summary,l=s.healthy??s.up??0,m=s.unhealthy??s.down??0,t=s.total??l+m;a.textContent=`${l}/${t}`,c&&(m===0?c.innerHTML='\u25CF all healthy':m<=2?c.innerHTML=`\u25CF ${m} degraded`:c.innerHTML=`\u25CF ${m} down`)}async function S(){try{const e=await fetch("/api/v1/monitoring/stats",{cache:"no-store"});if(!e.ok)return null;const a=await e.json();return a&&a.stats?a.stats:null}catch{return null}}async function y(){try{const e=await fetch("/api/v1/health-checks/status",{cache:"no-store"});return e.ok?await e.json():null}catch{return null}}function q(e){const a=document.getElementById("dc-monitor-containers"),c=document.getElementById("dc-monitor-containers-sub"),s=document.getElementById("dc-monitor-cpu"),l=document.getElementById("dc-monitor-mem");if(!e){a&&(a.textContent="\u2014"),s&&(s.textContent="\u2014"),l&&(l.textContent="\u2014");return}const m=Object.values(e);if(m.length===0){a&&(a.textContent="0"),c&&(c.textContent="no containers reporting"),s&&(s.textContent="0%"),l&&(l.textContent="0%"),h("dc-monitor-cpu-bar",0),h("dc-monitor-mem-bar",0);return}let t=0,o=0,r=0,p=0,d=0;m.forEach(g=>{if(g.cpu!=null){const x=Number(g.cpu);isNaN(x)||(t+=x>1?x:x*100,p++)}if(g.memory!=null){const x=Number(g.memory);isNaN(x)||(o+=x,r+=Number(g.memoryUsage||0),d++)}});const w=p?t/p:0,L=d?o/d:0;if(a&&(a.textContent=String(m.length)),c){const g=r?` \xB7 ${b(r)} RAM`:"";c.textContent=`running${g}`}s&&(s.textContent=f(w)),l&&(l.textContent=f(L)),h("dc-monitor-cpu-bar",w),h("dc-monitor-mem-bar",L)}let n=!1;async function i(){if(!n){n=!0;try{C();const[e,a]=await Promise.all([S(),y()]);q(e),E(a);const c=document.getElementById("dc-monitor-refresh-stamp");if(c){const s=new Date;c.textContent=`updated ${s.toLocaleTimeString()}`}}finally{n=!1}}}window.refreshMonitoringWidgets=i,setInterval(i,typeof DC<"u"&&DC.POLL&&DC.POLL.STATS||5e3),setTimeout(i,200)})(),(function(){"use strict";const v=(...t)=>{window.DASHCADDY_DEBUG&&console.log(...t)},k=["#app-selector-modal","#app-deploy-modal","#weather-modal","#token-management-modal","#service-edit-modal","#notifications-modal","#backup-modal","#stats-modal","#arr-setup-modal","#add-service-modal","#error-log-modal","#logs-modal","#dns-template-modal"];let u=null,h=null,f=null;function b(){try{C(),document.addEventListener("keydown",E),v("[Keyboard Shortcuts] Initialized"),v("[Keyboard Shortcuts] Press Ctrl+K to open quick search"),v("[Keyboard Shortcuts] Press Escape to close modals")}catch(t){console.warn("[Keyboard Shortcuts] Failed to initialize:",t.message)}}function C(){u=document.createElement("div"),u.id="quick-search-modal",u.className="quick-search-modal",u.innerHTML=`
\u{1F50D} @@ -271,7 +271,7 @@ font-family: monospace; margin-right: 4px; } - `,document.head.appendChild(t),document.body.appendChild(u),h=document.getElementById("quick-search-input"),f=document.getElementById("quick-search-results"),h.addEventListener("input",e),h.addEventListener("keydown",l),u.addEventListener("click",o=>{o.target===u&&y()})}function E(t){try{if((t.ctrlKey||t.metaKey)&&t.key==="k"){t.preventDefault(),S();return}if(t.key==="Escape"){if(u&&u.classList.contains("show")){y();return}q()}}catch(o){console.warn("[Keyboard Shortcuts] Error handling keydown:",o.message)}}function S(){try{u.classList.add("show"),h.value="",h.focus(),i()}catch(t){console.warn("[Keyboard Shortcuts] Error opening quick search:",t.message)}}function y(){try{u.classList.remove("show"),h.value="",f.innerHTML=""}catch(t){console.warn("[Keyboard Shortcuts] Error closing quick search:",t.message)}}function q(){for(const t of k){const o=document.querySelector(t);if(o&&(o.classList.contains("show")||o.style.display==="flex"))return o.classList.remove("show"),o.style.display="none",!0}return!1}function i(){const t=` + `,document.head.appendChild(t),document.body.appendChild(u),h=document.getElementById("quick-search-input"),f=document.getElementById("quick-search-results"),h.addEventListener("input",e),h.addEventListener("keydown",l),u.addEventListener("click",o=>{o.target===u&&y()})}function E(t){try{if((t.ctrlKey||t.metaKey)&&t.key==="k"){t.preventDefault(),S();return}if(t.key==="Escape"){if(u&&u.classList.contains("show")){y();return}q()}}catch(o){console.warn("[Keyboard Shortcuts] Error handling keydown:",o.message)}}function S(){try{u.classList.add("show"),h.value="",h.focus(),n()}catch(t){console.warn("[Keyboard Shortcuts] Error opening quick search:",t.message)}}function y(){try{u.classList.remove("show"),h.value="",f.innerHTML=""}catch(t){console.warn("[Keyboard Shortcuts] Error closing quick search:",t.message)}}function q(){for(const t of k){const o=document.querySelector(t);if(o&&(o.classList.contains("show")||o.style.display==="flex"))return o.classList.remove("show"),o.style.display="none",!0}return!1}function n(){const t=`
Quick Actions
\u{1F504} @@ -303,8 +303,8 @@
Services
- ${n()} - `;f.innerHTML=t,s()}function n(){const t=document.querySelectorAll(".card[data-app], #cards .card");let o="";return t.forEach(r=>{const p=r.querySelector(".name")?.textContent||"Unknown",d=r.dataset.status||"unknown",w=r.dataset.app||"";p&&p!=="--"&&(o+=` + ${i()} + `;f.innerHTML=t,s()}function i(){const t=document.querySelectorAll(".card[data-app], #cards .card");let o="";return t.forEach(r=>{const p=r.querySelector(".name")?.textContent||"Unknown",d=r.dataset.status||"unknown",w=r.dataset.app||"";p&&p!=="--"&&(o+=`
${d==="on"?"\u{1F7E2}":"\u{1F534}"}
@@ -313,7 +313,7 @@
${d.toUpperCase()}
- `)}),o||'
No services found
'}function e(t){try{const o=t.target.value.toLowerCase().trim();if(!o){i();return}const r=a(o);c(r)}catch(o){console.warn("[Keyboard Shortcuts] Error handling search input:",o.message)}}function a(t){const o={actions:[],services:[]};return[{id:"refresh",title:"Refresh Dashboard",icon:"\u{1F504}",keywords:"refresh reload update status"},{id:"reload-caddy",title:"Reload Caddy",icon:"\u26A1",keywords:"reload caddy proxy config"},{id:"add-service",title:"Add Service",icon:"\u2795",keywords:"add new service create"},{id:"app-selector",title:"App Selector",icon:"\u{1F4F1}",keywords:"app deploy install docker container"},{id:"backup",title:"Backup & Restore",icon:"\u{1F4BE}",keywords:"backup restore export import"},{id:"stats",title:"Container Stats",icon:"\u{1F4CA}",keywords:"stats resources cpu memory"},{id:"logs",title:"View Logs",icon:"\u{1F4CB}",keywords:"logs error debug"},{id:"tokens",title:"Manage Tokens",icon:"\u{1F511}",keywords:"tokens api keys credentials"},{id:"notifications",title:"Notifications",icon:"\u{1F514}",keywords:"alerts notifications discord telegram"},{id:"theme",title:"Change Theme",icon:"\u{1F3A8}",keywords:"theme dark light appearance"},{id:"tour",title:"Help Tour",icon:"\u{1F393}",keywords:"help tour guide onboarding"}].forEach(d=>{(d.title.toLowerCase().includes(t)||d.keywords.includes(t))&&o.actions.push(d)}),document.querySelectorAll(".card[data-app], #cards .card").forEach(d=>{const w=d.querySelector(".name")?.textContent||"",L=d.dataset.app||"",g=d.dataset.status||"unknown";(w.toLowerCase().includes(t)||L.toLowerCase().includes(t))&&o.services.push({id:L,title:w,status:g,icon:g==="on"?"\u{1F7E2}":"\u{1F534}"})}),o}function c(t){let o="";t.actions.length>0&&(o+='
Actions
',t.actions.forEach(r=>{o+=` + `)}),o||'
No services found
'}function e(t){try{const o=t.target.value.toLowerCase().trim();if(!o){n();return}const r=a(o);c(r)}catch(o){console.warn("[Keyboard Shortcuts] Error handling search input:",o.message)}}function a(t){const o={actions:[],services:[]};return[{id:"refresh",title:"Refresh Dashboard",icon:"\u{1F504}",keywords:"refresh reload update status"},{id:"reload-caddy",title:"Reload Caddy",icon:"\u26A1",keywords:"reload caddy proxy config"},{id:"add-service",title:"Add Service",icon:"\u2795",keywords:"add new service create"},{id:"app-selector",title:"App Selector",icon:"\u{1F4F1}",keywords:"app deploy install docker container"},{id:"backup",title:"Backup & Restore",icon:"\u{1F4BE}",keywords:"backup restore export import"},{id:"stats",title:"Container Stats",icon:"\u{1F4CA}",keywords:"stats resources cpu memory"},{id:"logs",title:"View Logs",icon:"\u{1F4CB}",keywords:"logs error debug"},{id:"tokens",title:"Manage Tokens",icon:"\u{1F511}",keywords:"tokens api keys credentials"},{id:"notifications",title:"Notifications",icon:"\u{1F514}",keywords:"alerts notifications discord telegram"},{id:"theme",title:"Change Theme",icon:"\u{1F3A8}",keywords:"theme dark light appearance"},{id:"tour",title:"Help Tour",icon:"\u{1F393}",keywords:"help tour guide onboarding"}].forEach(d=>{(d.title.toLowerCase().includes(t)||d.keywords.includes(t))&&o.actions.push(d)}),document.querySelectorAll(".card[data-app], #cards .card").forEach(d=>{const w=d.querySelector(".name")?.textContent||"",L=d.dataset.app||"",g=d.dataset.status||"unknown";(w.toLowerCase().includes(t)||L.toLowerCase().includes(t))&&o.services.push({id:L,title:w,status:g,icon:g==="on"?"\u{1F7E2}":"\u{1F534}"})}),o}function c(t){let o="";t.actions.length>0&&(o+='
Actions
',t.actions.forEach(r=>{o+=`
${r.icon}
@@ -329,4 +329,4 @@ ${r.status.toUpperCase()}
`})),o||(o='
No results found
'),f.innerHTML=o,s()}function s(){f.querySelectorAll(".quick-search-item").forEach((o,r)=>{o.addEventListener("click",()=>m(o)),r===0&&o.classList.add("selected")})}function l(t){try{const o=f.querySelectorAll(".quick-search-item"),r=f.querySelector(".quick-search-item.selected"),p=Array.from(o).indexOf(r);if(t.key==="ArrowDown"){t.preventDefault(),r&&r.classList.remove("selected");const d=(p+1)%o.length;o[d]?.classList.add("selected"),o[d]?.scrollIntoView({block:"nearest"})}else if(t.key==="ArrowUp"){t.preventDefault(),r&&r.classList.remove("selected");const d=p<=0?o.length-1:p-1;o[d]?.classList.add("selected"),o[d]?.scrollIntoView({block:"nearest"})}else t.key==="Enter"&&(t.preventDefault(),r&&m(r))}catch(o){console.warn("[Keyboard Shortcuts] Error handling search navigation:",o.message)}}function m(t){try{const o=t.dataset.action,r=t.dataset.service;switch(y(),o){case"refresh":document.getElementById("refresh")?.click();break;case"reload-caddy":document.getElementById("reload-caddy-top")?.click();break;case"add-service":document.getElementById("add-service")?.click();break;case"app-selector":document.getElementById("add-service-btn")?.click();break;case"backup":document.getElementById("backup-restore-btn")?.click();break;case"stats":document.getElementById("container-stats-btn")?.click();break;case"logs":document.getElementById("view-error-logs")?.click();break;case"tokens":document.getElementById("manage-tokens")?.click();break;case"notifications":document.getElementById("manage-notifications")?.click();break;case"theme":document.getElementById("theme")?.click();break;case"tour":document.getElementById("restart-tour-btn")?.click();break;case"open-service":if(r){const p=document.querySelector(`[data-app="${r}"] [id$="-open"], [data-app="${r}"] button:not(.restart-btn):not(.logs-btn):not(.settings-btn)`);if(p)p.click();else{const d=document.querySelector(`[data-app="${r}"]`);d&&d.click()}}break;default:v("[Keyboard Shortcuts] Unknown action:",o)}}catch(o){console.warn("[Keyboard Shortcuts] Error executing action:",o.message)}}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",b):b(),window.DashCaddyKeyboardShortcuts={openQuickSearch:S,closeQuickSearch:y}})(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gPT09PT09PT09PSBEQVNIQk9BUkQgSU5JVElBTElaQVRJT04gPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBsb2FkQ3VzdG9tU2VydmljZXMoKSB7XG4gICAgY29uc3QgY3VzdG9tU2VydmljZXMgPSBzYWZlR2V0KCdjdXN0b20tc2VydmljZXMnKTtcbiAgICBpZiAoY3VzdG9tU2VydmljZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gSlNPTi5wYXJzZShjdXN0b21TZXJ2aWNlcyk7XG4gICAgICAgIC8vIE1lcmdlIHdpdGggZGVmYXVsdCBBUFBTLCBhdm9pZGluZyBkdXBsaWNhdGVzXG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgaWYgKCF3aW5kb3cuQVBQUy5maW5kKGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2UuaWQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKHNlcnZpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgY3VzdG9tIHNlcnZpY2VzOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgY3VzdG9tIHNlcnZpY2VzIGltbWVkaWF0ZWx5IHNvIHdpbmRvdy5BUFBTIGlzIHBvcHVsYXRlZCBiZWZvcmUgYnVpbGRHcmlkIHJ1bnNcbiAgbG9hZEN1c3RvbVNlcnZpY2VzKCk7XG5cbiAgLy8gU3RhZ2dlcmVkIGFuaW1hdGlvbiBmb3IgdG9wIGNhcmRzIHRvb1xuICBmdW5jdGlvbiBhbmltYXRlVG9wQ2FyZHMoKSB7XG4gICAgY29uc3QgdG9wQ2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG9wIC5jYXJkJyk7XG4gICAgdG9wQ2FyZHMuZm9yRWFjaCgoY2FyZCwgaW5kZXgpID0+IHtcbiAgICAgIGNhcmQuc3R5bGUudHJhbnNpdGlvbkRlbGF5ID0gYCR7TWF0aC5taW4oaW5kZXggKiA2MCwgMzAwKX1tc2A7XG4gICAgfSk7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRvcENhcmRzLmZvckVhY2goY2FyZCA9PiBjYXJkLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU2VydmljZVdvcmtlcigpIHtcbiAgICBpZiAoISgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSkgcmV0dXJuO1xuICAgIGlmICghd2luZG93LmlzU2VjdXJlQ29udGV4dCAmJiBsb2NhdGlvbi5ob3N0bmFtZSAhPT0gJ2xvY2FsaG9zdCcgJiYgbG9jYXRpb24uaG9zdG5hbWUgIT09ICcxMjcuMC4wLjEnKSByZXR1cm47XG5cbiAgICBjb25zdCByZWdpc3RlciA9ICgpID0+IHtcbiAgICAgIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlZ2lzdGVyKCcvc3cuanMnLCB7IHVwZGF0ZVZpYUNhY2hlOiAnbm9uZScgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2luaXRdIFNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICByZWdpc3RlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlZ2lzdGVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBkYXNoYm9hcmQgKGNhbGxlZCBhZnRlciBUT1RQIGdhdGUgY2hlY2sgb3IgZGlyZWN0bHkgaWYgVE9UUCBkaXNhYmxlZClcbiAgLy8gTk9URTogbG9hZFNlcnZpY2VzIGNvbWVzIGZyb20gd2luZG93LmxvYWRTZXJ2aWNlcyAoZXhwb3J0ZWQgYnkgZ3JpZC5qcylcbiAgbGV0IF9kYXNoYm9hcmRJbml0aWFsaXplZCA9IGZhbHNlO1xuICBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplRGFzaGJvYXJkKCkge1xuICAgIGlmIChfZGFzaGJvYXJkSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignW2luaXRdIGluaXRpYWxpemVEYXNoYm9hcmQgY2FsbGVkIGFnYWluLCBza2lwcGluZyBkdXBsaWNhdGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX2Rhc2hib2FyZEluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBhd2FpdCB3aW5kb3cubG9hZFNlcnZpY2VzKCk7XG4gICAgYXdhaXQgbG9hZFRlbXBsYXRlQ2F0ZWdvcmllcygpO1xuICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcbiAgICBhbmltYXRlVG9wQ2FyZHMoKTtcbiAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIC8vIFN0b3AgcG9sbGluZyBpZiB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBpbnZhbGlkYXRlZCAoZS5nLiBUT1RQIGdhdGVcbiAgICAgIC8vIG5vdyBhY3RpdmUsIG9yIHVzZXIgbG9nZ2VkIG91dCkuIEF2b2lkcyByZWxlbnRsZXNzIDQwMS80MDMgbm9pc2UuXG4gICAgICBpZiAod2luZG93Ll9kY0F1dGhMb3N0KSByZXR1cm47XG4gICAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgIH0sIERDLlBPTEwuREFTSEJPQVJEKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5yZWZyZXNoQ3JlZHNCdXR0b25zID09PSAnZnVuY3Rpb24nKSB3aW5kb3cucmVmcmVzaENyZWRzQnV0dG9ucygpO1xuICAgIGlmICh0eXBlb2Ygd2luZG93LnJlZnJlc2hNb25pdG9yaW5nV2lkZ2V0cyA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LnJlZnJlc2hNb25pdG9yaW5nV2lkZ2V0cygpO1xuICAgIC8vIFVwZGF0ZSBhdXRoIGNhcmQgKG1heSBoYXZlIGFscmVhZHkgYmVlbiB1cGRhdGVkIGJ5IHRoZSBhdXRvLWxvYWQgSUlGRSBidXQgZW5zdXJlIGl0J3MgY29ycmVjdClcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5fdXBkYXRlQXV0aENhcmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL2NvbmZpZycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgaWYgKGQuc3VjY2Vzcykgd2luZG93Ll91cGRhdGVBdXRoQ2FyZChkLmNvbmZpZy5lbmFibGVkICYmIGQuY29uZmlnLmlzU2V0VXAsIGQuY29uZmlnLnNlc3Npb25EdXJhdGlvbik7XG4gICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgfVxuICAgIGlmICh3aW5kb3cuX19kYXNoY2FkZHlTaXRlQ29uZmlnTG9hZGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3aW5kb3cuX19kYXNoY2FkZHlTaXRlQ29uZmlnTG9hZGVkO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgKi8gfVxuICAgIH1cbiAgICAvLyBMYXp5LWxvYWQgb25ib2FyZGluZyBvbmx5IG9uY2UgcGVyIGluc3RhbGwsIG90aGVyd2lzZSBqdXN0IGFkZCB0aGUgdG91ciBidXR0b25cbiAgICBhZGRUb3VyQnV0dG9uKCk7XG4gICAgaWYgKHNob3VsZExvYWRPbmJvYXJkaW5nKCkpIHtcbiAgICAgIGxvYWRPbmJvYXJkaW5nKCk7XG4gICAgfVxuXG4gICAgLy8gREMtMDQ4OiBpbmplY3QgdGhlIFwiQWRtaW5cIiB0cmlnZ2VyIGJ1dHRvbiBpbnRvIHRoZSB0b3AgYmFyLiBUaGVcbiAgICAvLyBidXR0b24gb25seSByZW5kZXJzIHdoZW4gL21lIHJldHVybnMgaXNBZG1pbj10cnVlOyB0aGUgbW9kdWxlXG4gICAgLy8gcmUtY2hlY2tzIGV2ZXJ5IDYwcyBzbyBhIHBlcm1pc3Npb24gZG93bmdyYWRlIHRha2VzIGVmZmVjdC5cbiAgICBpZiAod2luZG93LkFkbWluUGFuZWwgJiYgdHlwZW9mIHdpbmRvdy5BZG1pblBhbmVsLmF0dGFjaFRyaWdnZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdpbmRvdy5BZG1pblBhbmVsLmF0dGFjaFRyaWdnZXIoZG9jdW1lbnQuYm9keSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2luaXRdIEFkbWluUGFuZWwgYXR0YWNoVHJpZ2dlciBmYWlsZWQ6JywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gTGF6eS1sb2FkIG9uYm9hcmRpbmcgYnVuZGxlICg1MiBLQikgXHUyMDE0IG9ubHkgbG9hZGVkIHdoZW4gbmVlZGVkXG4gIGZ1bmN0aW9uIGxvYWRPbmJvYXJkaW5nKCkge1xuICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjPVwiL2Rpc3Qvb25ib2FyZGluZy5qc1wiXScpKSByZXR1cm47IC8vIGFscmVhZHkgbG9hZGluZy9sb2FkZWRcbiAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgcy5zcmMgPSAnL2Rpc3Qvb25ib2FyZGluZy5qcyc7XG4gICAgcy5kZWZlciA9IHRydWU7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTtcbiAgICAvLyBBbHNvIGxvYWQgb25ib2FyZGluZyBDU1MgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tocmVmPVwiL2Nzcy9kcml2ZXIubWluLmNzc1wiXScpKSB7XG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICBsaW5rLmhyZWYgPSAnL2Nzcy9kcml2ZXIubWluLmNzcyc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgIH1cbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj1cIi9jc3Mvb25ib2FyZGluZy5jc3NcIl0nKSkge1xuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgbGluay5ocmVmID0gJy9jc3Mvb25ib2FyZGluZy5jc3MnO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpZiBvbmJvYXJkaW5nIHNob3VsZCBhdXRvLXN0YXJ0IChmaXJzdC10aW1lIHVzZXIpXG4gIGZ1bmN0aW9uIHNob3VsZExvYWRPbmJvYXJkaW5nKCkge1xuICAgIGlmICh0eXBlb2YgU0lURSAhPT0gJ3VuZGVmaW5lZCcgJiYgU0lURS5vbmJvYXJkaW5nQ29tcGxldGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaGNhZGR5X29uYm9hcmRpbmcnKSk7XG4gICAgICByZXR1cm4gIWRhdGEgfHwgKCFkYXRhLnRvdXJDb21wbGV0ZWQgJiYgZGF0YS5jdXJyZW50U3RlcCA9PT0gMCk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIHRydWU7IC8vIE5vIGRhdGEgbWVhbnMgZmlyc3QtdGltZSB1c2VyXG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gQ29sbGFwc2libGUgdG9vbGJhciBzZWN0aW9ucyA9PT09PVxuICBmdW5jdGlvbiBpbml0VG9vbGJhclNlY3Rpb25zKCkge1xuICAgIGNvbnN0IHNlY3Rpb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRvb2xzLXNlY3Rpb24nKTtcbiAgICBpZiAoIXNlY3Rpb25zLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgLy8gUmVzdG9yZSBzYXZlZCBzdGF0ZSBmcm9tIGxvY2FsU3RvcmFnZVxuICAgIGxldCBzYXZlZCA9IHt9O1xuICAgIHRyeSB7IHNhdmVkID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9vbGJhci1zZWN0aW9ucycpIHx8ICd7fScpOyB9IGNhdGNoIChfKSB7fVxuXG4gICAgc2VjdGlvbnMuZm9yRWFjaChzZWN0aW9uID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHNlY3Rpb24uZGF0YXNldC5zZWN0aW9uO1xuICAgICAgY29uc3QgaGVhZGVyID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yKCcudG9vbHMtc2VjdGlvbi1oZWFkZXInKTtcbiAgICAgIGlmICghaGVhZGVyKSByZXR1cm47XG5cbiAgICAgIC8vIFJlc3RvcmUgc3RhdGUgKGRlZmF1bHQ6IGNvbGxhcHNlZClcbiAgICAgIGlmIChzYXZlZFtrZXldKSB7XG4gICAgICAgIHNlY3Rpb24uY2xhc3NMaXN0LmFkZCgnb3BlbicpO1xuICAgICAgICBoZWFkZXIuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICAgIH1cblxuICAgICAgaGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBpc09wZW4gPSBzZWN0aW9uLmNsYXNzTGlzdC50b2dnbGUoJ29wZW4nKTtcbiAgICAgICAgaGVhZGVyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGlzT3BlbiA/ICd0cnVlJyA6ICdmYWxzZScpO1xuXG4gICAgICAgIC8vIFNhdmUgc3RhdGVcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7fTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRvb2xzLXNlY3Rpb24nKS5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgIHN0YXRlW3MuZGF0YXNldC5zZWN0aW9uXSA9IHMuY2xhc3NMaXN0LmNvbnRhaW5zKCdvcGVuJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9vbGJhci1zZWN0aW9ucycsIEpTT04uc3RyaW5naWZ5KHN0YXRlKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgdG9vbGJhciBzZWN0aW9ucyBvbiBET00gcmVhZHlcbiAgaW5pdFRvb2xiYXJTZWN0aW9ucygpO1xuXG4gIC8vIEFkZCByZXN0YXJ0IHRvdXIgYnV0dG9uIChsb2FkcyBidW5kbGUgb24gY2xpY2sgaWYgbm90IGxvYWRlZClcbiAgLy8gVmlzaWJsZSBpbiBwcmltYXJ5IHRvb2xiYXIgdW50aWwgdG91ciBjb21wbGV0ZWQgb25jZSwgdGhlbiBtb3ZlcyB0byBBZG1pbiBzZWN0aW9uXG4gIGZ1bmN0aW9uIGFkZFRvdXJCdXR0b24oKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN0YXJ0LXRvdXItYnRuJykpIHJldHVybjtcblxuICAgIGxldCB0b3VyRG9uZSA9IHR5cGVvZiBTSVRFICE9PSAndW5kZWZpbmVkJyAmJiBTSVRFLm9uYm9hcmRpbmdDb21wbGV0ZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkYXNoY2FkZHlfb25ib2FyZGluZycpKTtcbiAgICAgIHRvdXJEb25lID0gdG91ckRvbmUgfHwgISEoZGF0YSAmJiBkYXRhLnRvdXJDb21wbGV0ZWQpO1xuICAgIH0gY2F0Y2ggKF8pIHt9XG5cbiAgICAvLyBCZWZvcmUgZmlyc3QgY29tcGxldGlvbjogc2hvdyBpbiBwcmltYXJ5IHRvb2xiYXIuIEFmdGVyOiB0dWNrIGludG8gQWRtaW4gc2VjdGlvbi5cbiAgICBjb25zdCB0YXJnZXQgPSB0b3VyRG9uZVxuICAgICAgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9vbHMtc2VjdGlvbltkYXRhLXNlY3Rpb249XCJhZG1pblwiXSAudG9vbHMtc2VjdGlvbi1pdGVtcycpXG4gICAgICA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b29scy1wcmltYXJ5Jyk7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ1dHRvbi5pZCA9ICdyZXN0YXJ0LXRvdXItYnRuJztcbiAgICBidXR0b24udGV4dENvbnRlbnQgPSB0b3VyRG9uZSA/ICdIZWxwIFRvdXInIDogJ1x1RDgzQ1x1REY5MyBIZWxwIFRvdXInO1xuICAgIGJ1dHRvbi50aXRsZSA9ICdSZXN0YXJ0IHRoZSBvbmJvYXJkaW5nIHRvdXInO1xuICAgIGJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nKSB7XG4gICAgICAgIHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nLnJlc3RhcnRUb3VyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkT25ib2FyZGluZygpO1xuICAgICAgICAvLyBXYWl0IGZvciBidW5kbGUgdG8gbG9hZCwgdGhlbiBzdGFydFxuICAgICAgICBjb25zdCBjaGVjayA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICBpZiAod2luZG93LkRhc2hDYWRkeU9uYm9hcmRpbmcpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY2hlY2spO1xuICAgICAgICAgICAgd2luZG93LkRhc2hDYWRkeU9uYm9hcmRpbmcucmVzdGFydFRvdXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2xlYXJJbnRlcnZhbChjaGVjayksIDUwMDApOyAvLyBnaXZlIHVwIGFmdGVyIDVzXG4gICAgICB9XG4gICAgfTtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgfVxuXG4gIHdpbmRvdy5pbml0aWFsaXplRGFzaGJvYXJkID0gaW5pdGlhbGl6ZURhc2hib2FyZDtcbiAgd2luZG93LmxvYWRDdXN0b21TZXJ2aWNlcyA9IGxvYWRDdXN0b21TZXJ2aWNlcztcbiAgcmVnaXN0ZXJTZXJ2aWNlV29ya2VyKCk7XG5cbiAgLy8gPT09PT0gVEVNUExBVEUgQ0FURUdPUklFUyA9PT09PVxuICAvLyBDYWNoZWQgdGVtcGxhdGUgY2F0ZWdvcmllcyBmcm9tIC9hcGkvdjEvdGVtcGxhdGVzIGZvciB1c2UgYWNyb3NzIHRoZSBVSVxuICAvLyAoc2VydmljZSBjcmVhdGUvZWRpdCwgZmlsdGVyIGRyb3Bkb3duLCBjYXRlZ29yeSBiYWRnZXMsIGV0Yy4pXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRUZW1wbGF0ZUNhdGVnb3JpZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90ZW1wbGF0ZXMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgaWYgKCFyLm9rKSByZXR1cm47XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgci5qc29uKCk7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmNhdGVnb3JpZXMpIHtcbiAgICAgICAgd2luZG93LkRDX0NBVEVHT1JJRVMgPSBkYXRhLmNhdGVnb3JpZXM7XG4gICAgICAgIC8vIEFsc28gZXhwb3NlIHZpYSBnbG9iYWxzLmpzIGNvbnN0YW50IGZvciBjb252ZW5pZW5jZVxuICAgICAgICBpZiAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJykgREMuQ0FURUdPUklFUyA9IGRhdGEuY2F0ZWdvcmllcztcbiAgICAgICAgLy8gUG9wdWxhdGUgYW55IGNhdGVnb3J5IDxzZWxlY3Q+IHRoYXQncyBhbHJlYWR5IGluIHRoZSBET01cbiAgICAgICAgcG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tpbml0XSBGYWlsZWQgdG8gbG9hZCB0ZW1wbGF0ZSBjYXRlZ29yaWVzOicsIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBvcHVsYXRlQ2F0ZWdvcnlTZWxlY3RzKCkge1xuICAgIGNvbnN0IGNhdHMgPSB3aW5kb3cuRENfQ0FURUdPUklFUyB8fCAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5DQVRFR09SSUVTKTtcbiAgICBpZiAoIWNhdHMpIHJldHVybjtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzZWxlY3RbZGF0YS1yb2xlPVwic2VydmljZS1jYXRlZ29yeVwiXScpLmZvckVhY2goc2VsZWN0ID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBzZWxlY3QuZGF0YXNldC5jdXJyZW50IHx8ICcnO1xuICAgICAgLy8gQ2xlYXIgb3B0aW9ucyBidXQga2VlcCB0aGUgZmlyc3QgKHBsYWNlaG9sZGVyKVxuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBzZWxlY3QucXVlcnlTZWxlY3Rvcignb3B0aW9uW3ZhbHVlPVwiXCJdJyk7XG4gICAgICBzZWxlY3QuaW5uZXJIVE1MID0gJyc7XG4gICAgICBpZiAocGxhY2Vob2xkZXIpIHNlbGVjdC5hcHBlbmRDaGlsZChwbGFjZWhvbGRlcik7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgcGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgcGgudmFsdWUgPSAnJztcbiAgICAgICAgcGgudGV4dENvbnRlbnQgPSAnXHUyMDE0IFNlbGVjdCBjYXRlZ29yeSBcdTIwMTQnO1xuICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQocGgpO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmVudHJpZXMoY2F0cykuZm9yRWFjaCgoW25hbWUsIGluZm9dKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQudmFsdWUgPSBuYW1lO1xuICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBgJHtpbmZvLmljb24gfHwgJyd9ICR7bmFtZX1gLnRyaW0oKTtcbiAgICAgICAgaWYgKG5hbWUgPT09IGN1cnJlbnQpIG9wdC5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBBbGxvdyBvdGhlciBtb2R1bGVzIHRvIHJlLXJ1biBwb3B1bGF0aW9uIGFmdGVyIHRoZXkgKHJlKWluamVjdCBzZWxlY3RzXG4gIHdpbmRvdy5wb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cyA9IHBvcHVsYXRlQ2F0ZWdvcnlTZWxlY3RzO1xuICB3aW5kb3cubG9hZFRlbXBsYXRlQ2F0ZWdvcmllcyA9IGxvYWRUZW1wbGF0ZUNhdGVnb3JpZXM7XG5cbiAgLy8gVE9UUC1nYXRlZCBpbml0aWFsaXphdGlvblxuICAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b3RwUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9jb25maWcnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgY29uc3QgdG90cERhdGEgPSBhd2FpdCB0b3RwUmVzLmpzb24oKTtcblxuICAgICAgaWYgKHRvdHBEYXRhLnN1Y2Nlc3MgJiYgdG90cERhdGEuY29uZmlnLmVuYWJsZWQpIHtcbiAgICAgICAgLy8gVE9UUCBpcyBlbmFibGVkIC0gY2hlY2sgaWYgd2UgaGF2ZSBhIHZhbGlkIHNlc3Npb25cbiAgICAgICAgY29uc3QgdGVzdFJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvY2hlY2stc2Vzc2lvbicsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICAgIGlmICh0ZXN0UmVzLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgLy8gTmVlZCBUT1RQIHZlcmlmaWNhdGlvbiAtIHNob3cgb3ZlcmxheVxuICAgICAgICAgIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5KCk7XG4gICAgICAgICAgcmV0dXJuOyAvLyBpbml0aWFsaXplRGFzaGJvYXJkKCkgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCB2ZXJpZmljYXRpb25cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignVE9UUCBjaGVjayBmYWlsZWQsIHByb2NlZWRpbmcgbm9ybWFsbHk6JywgZSk7XG4gICAgfVxuXG4gICAgLy8gVE9UUCBkaXNhYmxlZCBvciBzZXNzaW9uIHZhbGlkIC0gaW5pdGlhbGl6ZSBpbW1lZGlhdGVseVxuICAgIGluaXRpYWxpemVEYXNoYm9hcmQoKTtcbiAgfSkoKTtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gTU9OSVRPUklORyBXSURHRVRTID09PT09PT09PT1cbi8vIEVtYmVkcyBhIGNvbXBhY3Qgc3lzdGVtLXJlc291cmNlICsgaGVhbHRoIHN1bW1hcnkgcGFuZWwgZGlyZWN0bHkgb24gdGhlXG4vLyBtYWluIGRhc2hib2FyZC4gUmVwbGFjZXMgdGhlIG5lZWQgZm9yIGEgc2VwYXJhdGUgbW9uaXRvcmluZy1kYXNoYm9hcmQuaHRtbFxuLy8gcGFnZSBcdTIwMTQgcXVpY2sgYXQtYS1nbGFuY2Ugc3RhdHMgd2hlcmUgeW91IGFscmVhZHkgYXJlLlxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyAtLS0tLSBTdHlsZSBpbmplY3Rpb24gKHNjb3BlZCB0byAuZGMtbW9uaXRvciBzbyBpdCBkb2Vzbid0IGxlYWspIC0tLS0tXG4gIGNvbnN0IHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICBzdHlsZUVsLnRleHRDb250ZW50ID0gYFxuICAgIC5kYy1tb25pdG9yIHtcbiAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIyMHB4LCAxZnIpKTtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7XG4gICAgfVxuICAgIC5kYy1tb25pdG9yLWNhcmQge1xuICAgICAgcGFkZGluZzogMTBweCAxMnB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZywgcmdiYSgyNTUsMjU1LDI1NSwwLjA0KSk7XG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1sYWJlbCB7XG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcbiAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1xuICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci12YWx1ZSB7XG4gICAgICBmb250LXNpemU6IDEuNHJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogdmFyKC0tZmcpO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1zdWIge1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBjb2xvcjogdmFyKC0tbXV0ZWQpO1xuICAgICAgbWFyZ2luLXRvcDogNHB4O1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1iYXIge1xuICAgICAgbWFyZ2luLXRvcDogNnB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDRweDtcbiAgICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tdXRlZCkgMjAlLCB0cmFuc3BhcmVudCk7XG4gICAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1iYXItZmlsbCB7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB3aWR0aDogMCU7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1vay1mZywgIzI3YWU2MCk7XG4gICAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzIGVhc2UsIGJhY2tncm91bmQgMC4zcyBlYXNlO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1iYXItZmlsbC53YXJuIHsgYmFja2dyb3VuZDogI2YzOWMxMjsgfVxuICAgIC5kYy1tb25pdG9yLWJhci1maWxsLmJhZCAgeyBiYWNrZ3JvdW5kOiAjZTc0YzNjOyB9XG4gICAgLmRjLW1vbml0b3ItaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDAuODVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgfVxuICAgIC5kYy1tb25pdG9yLXBpbGwge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA0cHg7XG4gICAgICBwYWRkaW5nOiAycHggOHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgfVxuICAgIC5kYy1tb25pdG9yLXBpbGwub2sgICB7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjMjdhZTYwIDIwJSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogIzI3YWU2MDsgfVxuICAgIC5kYy1tb25pdG9yLXBpbGwud2FybiB7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZjM5YzEyIDIwJSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogI2YzOWMxMjsgfVxuICAgIC5kYy1tb25pdG9yLXBpbGwuYmFkICB7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZTc0YzNjIDIwJSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogI2U3NGMzYzsgfVxuICAgIC5kYy1tb25pdG9yLXJlZnJlc2gge1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBjb2xvcjogdmFyKC0tbXV0ZWQpO1xuICAgICAgb3BhY2l0eTogMC43O1xuICAgIH1cbiAgYDtcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsKTtcblxuICAvLyAtLS0tLSBDb250YWluZXIgZWxlbWVudCAoaW5zZXJ0ZWQgYWJvdmUgc2VydmljZS1maWx0ZXItYmFyKSAtLS0tLVxuICBjb25zdCBmaWx0ZXJCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1maWx0ZXItYmFyJyk7XG4gIGlmICghZmlsdGVyQmFyKSByZXR1cm47XG5cbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcGFuZWwuY2xhc3NOYW1lID0gJ2RjLW1vbml0b3InO1xuICBwYW5lbC5pZCA9ICdkYy1tb25pdG9yLXBhbmVsJztcbiAgcGFuZWwuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWhlYWRlclwiIHN0eWxlPVwiZ3JpZC1jb2x1bW46IDEgLyAtMTtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXRpdGxlXCI+XHVEODNEXHVEQ0NBIFN5c3RlbSBPdmVydmlldzwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJkYy1tb25pdG9yLXJlZnJlc2hcIiBpZD1cImRjLW1vbml0b3ItcmVmcmVzaC1zdGFtcFwiPlx1MjAxNDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1sYWJlbFwiPlNlcnZpY2VzPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1zZXJ2aWNlc1wiPlx1MjAxNDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3Itc3ViXCIgaWQ9XCJkYy1tb25pdG9yLXNlcnZpY2VzLXN1YlwiPmxvYWRpbmdcdTIwMjY8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1sYWJlbFwiPkNvbnRhaW5lcnMgVXA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXZhbHVlXCIgaWQ9XCJkYy1tb25pdG9yLWNvbnRhaW5lcnNcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXN1YlwiIGlkPVwiZGMtbW9uaXRvci1jb250YWluZXJzLXN1YlwiPmxvYWRpbmdcdTIwMjY8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1sYWJlbFwiPkF2ZyBDUFU8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXZhbHVlXCIgaWQ9XCJkYy1tb25pdG9yLWNwdVwiPlx1MjAxNDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyXCI+PGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyLWZpbGxcIiBpZD1cImRjLW1vbml0b3ItY3B1LWJhclwiPjwvZGl2PjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWxhYmVsXCI+QXZnIE1lbW9yeTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItdmFsdWVcIiBpZD1cImRjLW1vbml0b3ItbWVtXCI+XHUyMDE0PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1iYXJcIj48ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1iYXItZmlsbFwiIGlkPVwiZGMtbW9uaXRvci1tZW0tYmFyXCI+PC9kaXY+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5IZWFsdGg8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXZhbHVlXCIgaWQ9XCJkYy1tb25pdG9yLWhlYWx0aFwiPlx1MjAxNDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3Itc3ViXCIgaWQ9XCJkYy1tb25pdG9yLWhlYWx0aC1zdWJcIj5cdTIwMTQ8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgLy8gSW5zZXJ0IEFCT1ZFIHRoZSBmaWx0ZXIgYmFyXG4gIGZpbHRlckJhci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShwYW5lbCwgZmlsdGVyQmFyKTtcblxuICAvLyAtLS0tLSBIZWxwZXJzIC0tLS0tXG4gIGZ1bmN0aW9uIHNldEJhcihpZCwgcGN0KSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHAgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIE51bWJlcihwY3QpIHx8IDApKTtcbiAgICBlbC5zdHlsZS53aWR0aCA9IHAgKyAnJSc7XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnd2FybicsICdiYWQnKTtcbiAgICBpZiAocCA+PSA4NSkgZWwuY2xhc3NMaXN0LmFkZCgnYmFkJyk7XG4gICAgZWxzZSBpZiAocCA+PSA2NSkgZWwuY2xhc3NMaXN0LmFkZCgnd2FybicpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm10UGN0KHYpIHtcbiAgICBpZiAodiA9PSBudWxsIHx8IGlzTmFOKHYpKSByZXR1cm4gJ1x1MjAxNCc7XG4gICAgcmV0dXJuIChNYXRoLnJvdW5kKHYgKiAxMCkgLyAxMCkgKyAnJSc7XG4gIH1cblxuICBmdW5jdGlvbiBmbXRCeXRlcyhiKSB7XG4gICAgaWYgKGIgPT0gbnVsbCB8fCBpc05hTihiKSkgcmV0dXJuICdcdTIwMTQnO1xuICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChiID49IDEwMjQgJiYgaSA8IHVuaXRzLmxlbmd0aCAtIDEpIHsgYiAvPSAxMDI0OyBpKys7IH1cbiAgICByZXR1cm4gYi50b0ZpeGVkKDEpICsgJyAnICsgdW5pdHNbaV07XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTZXJ2aWNlc0NhcmQoKSB7XG4gICAgY29uc3QgdG90YWwgPSAod2luZG93LkFQUFMgfHwgW10pLmxlbmd0aDtcbiAgICBsZXQgdXAgPSAwO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjYXJkcyAuY2FyZCcpLmZvckVhY2goYyA9PiB7XG4gICAgICBpZiAoYy5kYXRhc2V0LnN0YXR1cyA9PT0gJ29uJykgdXArKztcbiAgICB9KTtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLXNlcnZpY2VzJyk7XG4gICAgY29uc3Qgc3ViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3Itc2VydmljZXMtc3ViJyk7XG4gICAgaWYgKGVsKSBlbC50ZXh0Q29udGVudCA9IGAke3VwfSAvICR7dG90YWx9YDtcbiAgICBpZiAoc3ViKSBzdWIudGV4dENvbnRlbnQgPSB0b3RhbCA9PT0gMCA/ICdubyBzZXJ2aWNlcyB5ZXQnIDogYCR7dXB9IG9ubGluZSBcdTAwQjcgJHt0b3RhbCAtIHVwfSBvZmZsaW5lYDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5SGVhbHRoU3VtbWFyeShkYXRhKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1oZWFsdGgnKTtcbiAgICBjb25zdCBzdWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1oZWFsdGgtc3ViJyk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGlmICghZGF0YSB8fCBkYXRhLnN1bW1hcnkgPT0gbnVsbCkge1xuICAgICAgZWwudGV4dENvbnRlbnQgPSAnXHUyMDE0JztcbiAgICAgIGlmIChzdWIpIHN1Yi50ZXh0Q29udGVudCA9ICdubyBkYXRhJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcyA9IGRhdGEuc3VtbWFyeTtcbiAgICBjb25zdCBoZWFsdGh5ID0gcy5oZWFsdGh5ID8/IHMudXAgPz8gMDtcbiAgICBjb25zdCB1bmhlYWx0aHkgPSBzLnVuaGVhbHRoeSA/PyBzLmRvd24gPz8gMDtcbiAgICBjb25zdCB0b3RhbCA9IHMudG90YWwgPz8gKGhlYWx0aHkgKyB1bmhlYWx0aHkpO1xuICAgIGVsLnRleHRDb250ZW50ID0gYCR7aGVhbHRoeX0vJHt0b3RhbH1gO1xuICAgIGlmIChzdWIpIHtcbiAgICAgIGlmICh1bmhlYWx0aHkgPT09IDApIHtcbiAgICAgICAgc3ViLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImRjLW1vbml0b3ItcGlsbCBva1wiPlx1MjVDRiBhbGwgaGVhbHRoeTwvc3Bhbj4nO1xuICAgICAgfSBlbHNlIGlmICh1bmhlYWx0aHkgPD0gMikge1xuICAgICAgICBzdWIuaW5uZXJIVE1MID0gYDxzcGFuIGNsYXNzPVwiZGMtbW9uaXRvci1waWxsIHdhcm5cIj5cdTI1Q0YgJHt1bmhlYWx0aHl9IGRlZ3JhZGVkPC9zcGFuPmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWIuaW5uZXJIVE1MID0gYDxzcGFuIGNsYXNzPVwiZGMtbW9uaXRvci1waWxsIGJhZFwiPlx1MjVDRiAke3VuaGVhbHRoeX0gZG93bjwvc3Bhbj5gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tIERhdGEgZmV0Y2hlcyAtLS0tLVxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFN0YXRzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbW9uaXRvcmluZy9zdGF0cycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICBpZiAoIXIub2spIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgcmV0dXJuIChkYXRhICYmIGRhdGEuc3RhdHMpID8gZGF0YS5zdGF0cyA6IG51bGw7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hIZWFsdGgoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL3N0YXR1cycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICBpZiAoIXIub2spIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGF3YWl0IHIuanNvbigpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5U3RhdHMoc3RhdHMpIHtcbiAgICBjb25zdCBjb250YWluZXJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItY29udGFpbmVycycpO1xuICAgIGNvbnN0IGNvbnRhaW5lcnNTdWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1jb250YWluZXJzLXN1YicpO1xuICAgIGNvbnN0IGNwdUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItY3B1Jyk7XG4gICAgY29uc3QgbWVtRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1tZW0nKTtcblxuICAgIGlmICghc3RhdHMpIHtcbiAgICAgIGlmIChjb250YWluZXJzKSBjb250YWluZXJzLnRleHRDb250ZW50ID0gJ1x1MjAxNCc7XG4gICAgICBpZiAoY3B1RWwpIGNwdUVsLnRleHRDb250ZW50ID0gJ1x1MjAxNCc7XG4gICAgICBpZiAobWVtRWwpIG1lbUVsLnRleHRDb250ZW50ID0gJ1x1MjAxNCc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC52YWx1ZXMoc3RhdHMpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGNvbnRhaW5lcnMpIGNvbnRhaW5lcnMudGV4dENvbnRlbnQgPSAnMCc7XG4gICAgICBpZiAoY29udGFpbmVyc1N1YikgY29udGFpbmVyc1N1Yi50ZXh0Q29udGVudCA9ICdubyBjb250YWluZXJzIHJlcG9ydGluZyc7XG4gICAgICBpZiAoY3B1RWwpIGNwdUVsLnRleHRDb250ZW50ID0gJzAlJztcbiAgICAgIGlmIChtZW1FbCkgbWVtRWwudGV4dENvbnRlbnQgPSAnMCUnO1xuICAgICAgc2V0QmFyKCdkYy1tb25pdG9yLWNwdS1iYXInLCAwKTtcbiAgICAgIHNldEJhcignZGMtbW9uaXRvci1tZW0tYmFyJywgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNwdVN1bSA9IDAsIG1lbVN1bSA9IDAsIG1lbUJ5dGVzID0gMCwgY3B1Q291bnQgPSAwLCBtZW1Db3VudCA9IDA7XG4gICAgZW50cmllcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgLy8gQ1BVIG1heSBiZSBwZXJjZW50YWdlICgwLTEwMCkgb3IgZnJhY3Rpb24gKDAtMSkgXHUyMDE0IGhhbmRsZSBib3RoXG4gICAgICBpZiAocy5jcHUgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjcHUgPSBOdW1iZXIocy5jcHUpO1xuICAgICAgICBpZiAoIWlzTmFOKGNwdSkpIHtcbiAgICAgICAgICBjcHVTdW0gKz0gY3B1ID4gMSA/IGNwdSA6IGNwdSAqIDEwMDtcbiAgICAgICAgICBjcHVDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocy5tZW1vcnkgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBtZW0gPSBOdW1iZXIocy5tZW1vcnkpO1xuICAgICAgICBpZiAoIWlzTmFOKG1lbSkpIHtcbiAgICAgICAgICBtZW1TdW0gKz0gbWVtO1xuICAgICAgICAgIG1lbUJ5dGVzICs9IE51bWJlcihzLm1lbW9yeVVzYWdlIHx8IDApO1xuICAgICAgICAgIG1lbUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGF2Z0NwdSA9IGNwdUNvdW50ID8gY3B1U3VtIC8gY3B1Q291bnQgOiAwO1xuICAgIGNvbnN0IGF2Z01lbSA9IG1lbUNvdW50ID8gbWVtU3VtIC8gbWVtQ291bnQgOiAwO1xuXG4gICAgaWYgKGNvbnRhaW5lcnMpIGNvbnRhaW5lcnMudGV4dENvbnRlbnQgPSBTdHJpbmcoZW50cmllcy5sZW5ndGgpO1xuICAgIGlmIChjb250YWluZXJzU3ViKSB7XG4gICAgICBjb25zdCBtZW1UeHQgPSBtZW1CeXRlcyA/IGAgXHUwMEI3ICR7Zm10Qnl0ZXMobWVtQnl0ZXMpfSBSQU1gIDogJyc7XG4gICAgICBjb250YWluZXJzU3ViLnRleHRDb250ZW50ID0gYHJ1bm5pbmcke21lbVR4dH1gO1xuICAgIH1cbiAgICBpZiAoY3B1RWwpIGNwdUVsLnRleHRDb250ZW50ID0gZm10UGN0KGF2Z0NwdSk7XG4gICAgaWYgKG1lbUVsKSBtZW1FbC50ZXh0Q29udGVudCA9IGZtdFBjdChhdmdNZW0pO1xuICAgIHNldEJhcignZGMtbW9uaXRvci1jcHUtYmFyJywgYXZnQ3B1KTtcbiAgICBzZXRCYXIoJ2RjLW1vbml0b3ItbWVtLWJhcicsIGF2Z01lbSk7XG4gIH1cblxuICAvLyAtLS0tLSBQdWJsaWMgcmVmcmVzaCBmdW5jdGlvbiAtLS0tLVxuICBsZXQgaW5GbGlnaHQgPSBmYWxzZTtcbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICBpZiAoaW5GbGlnaHQpIHJldHVybjtcbiAgICBpbkZsaWdodCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHNldFNlcnZpY2VzQ2FyZCgpO1xuICAgICAgY29uc3QgW3N0YXRzLCBoZWFsdGhdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2ZldGNoU3RhdHMoKSwgZmV0Y2hIZWFsdGgoKV0pO1xuICAgICAgYXBwbHlTdGF0cyhzdGF0cyk7XG4gICAgICBhcHBseUhlYWx0aFN1bW1hcnkoaGVhbHRoKTtcbiAgICAgIGNvbnN0IHN0YW1wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItcmVmcmVzaC1zdGFtcCcpO1xuICAgICAgaWYgKHN0YW1wKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHN0YW1wLnRleHRDb250ZW50ID0gYHVwZGF0ZWQgJHtub3cudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YDtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaW5GbGlnaHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBFeHBvc2UgZm9yIGluaXQuanMgdG8gY2FsbCBvbmNlIGFuZCByZS1jYWxsIGFmdGVyIGVhY2ggcmVmcmVzaEFsbCBjeWNsZVxuICB3aW5kb3cucmVmcmVzaE1vbml0b3JpbmdXaWRnZXRzID0gcmVmcmVzaDtcblxuICAvLyBBdXRvLXJlZnJlc2ggb24gdGhlIFNUQVRTIGludGVydmFsIChzZXBhcmF0ZSBmcm9tIGZ1bGwgREFTSEJPQVJEIHJlZnJlc2gpXG4gIHNldEludGVydmFsKHJlZnJlc2gsICh0eXBlb2YgREMgIT09ICd1bmRlZmluZWQnICYmIERDLlBPTEwgJiYgREMuUE9MTC5TVEFUUykgfHwgNTAwMCk7XG5cbiAgLy8gUmVmcmVzaCBvbmNlIG9uIGZpcnN0IHNjcmlwdCBsb2FkIChpbml0LmpzIGFsc28gY2FsbHMgdGhpczsgZG91YmxlLWNhbGwgaXMgaGFybWxlc3MpXG4gIHNldFRpbWVvdXQocmVmcmVzaCwgMjAwKTtcblxufSkoKTtcbjtcbi8qKlxuICogRGFzaENhZGR5IEtleWJvYXJkIFNob3J0Y3V0cyBTeXN0ZW1cbiAqIFByb3ZpZGVzIGdsb2JhbCBrZXlib2FyZCBzaG9ydGN1dHMgZm9yIGltcHJvdmVkIG5hdmlnYXRpb25cbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBkZWJ1ZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5EQVNIQ0FERFlfREVCVUcpIHsgY29uc29sZS5sb2coLi4uYXJncyk7IH1cbiAgfTtcblxuICAvLyBBbGwgbW9kYWwgc2VsZWN0b3JzIHRoYXQgY2FuIGJlIGNsb3NlZCB3aXRoIEVzY2FwZVxuICBjb25zdCBNT0RBTF9TRUxFQ1RPUlMgPSBbXG4gICAgJyNhcHAtc2VsZWN0b3ItbW9kYWwnLFxuICAgICcjYXBwLWRlcGxveS1tb2RhbCcsXG4gICAgJyN3ZWF0aGVyLW1vZGFsJyxcbiAgICAnI3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnLFxuICAgICcjc2VydmljZS1lZGl0LW1vZGFsJyxcbiAgICAnI25vdGlmaWNhdGlvbnMtbW9kYWwnLFxuICAgICcjYmFja3VwLW1vZGFsJyxcbiAgICAnI3N0YXRzLW1vZGFsJyxcbiAgICAnI2Fyci1zZXR1cC1tb2RhbCcsXG4gICAgJyNhZGQtc2VydmljZS1tb2RhbCcsXG4gICAgJyNlcnJvci1sb2ctbW9kYWwnLFxuICAgICcjbG9ncy1tb2RhbCcsXG4gICAgJyNkbnMtdGVtcGxhdGUtbW9kYWwnXG4gIF07XG5cbiAgLy8gUXVpY2sgc2VhcmNoIHN0YXRlXG4gIGxldCBxdWlja1NlYXJjaE1vZGFsID0gbnVsbDtcbiAgbGV0IHF1aWNrU2VhcmNoSW5wdXQgPSBudWxsO1xuICBsZXQgcXVpY2tTZWFyY2hSZXN1bHRzID0gbnVsbDtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUga2V5Ym9hcmQgc2hvcnRjdXRzIHN5c3RlbVxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIHF1aWNrIHNlYXJjaCBtb2RhbFxuICAgICAgY3JlYXRlUXVpY2tTZWFyY2hNb2RhbCgpO1xuXG4gICAgICAvLyBBZGQgZ2xvYmFsIGtleWJvYXJkIGxpc3RlbmVyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93bik7XG5cbiAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBJbml0aWFsaXplZCcpO1xuICAgICAgZGVidWcoJ1tLZXlib2FyZCBTaG9ydGN1dHNdIFByZXNzIEN0cmwrSyB0byBvcGVuIHF1aWNrIHNlYXJjaCcpO1xuICAgICAgZGVidWcoJ1tLZXlib2FyZCBTaG9ydGN1dHNdIFByZXNzIEVzY2FwZSB0byBjbG9zZSBtb2RhbHMnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEZhaWxlZCB0byBpbml0aWFsaXplOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgcXVpY2sgc2VhcmNoIG1vZGFsXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVRdWlja1NlYXJjaE1vZGFsKCkge1xuICAgIHF1aWNrU2VhcmNoTW9kYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBxdWlja1NlYXJjaE1vZGFsLmlkID0gJ3F1aWNrLXNlYXJjaC1tb2RhbCc7XG4gICAgcXVpY2tTZWFyY2hNb2RhbC5jbGFzc05hbWUgPSAncXVpY2stc2VhcmNoLW1vZGFsJztcbiAgICBxdWlja1NlYXJjaE1vZGFsLmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWlucHV0LXdyYXBwZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pY29uXCI+XHVEODNEXHVERDBEPC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicXVpY2stc2VhcmNoLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc2VydmljZXMsIGFwcHMsIG9yIGFjdGlvbnMuLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1zaG9ydGN1dFwiPkVTQzwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJxdWljay1zZWFyY2gtcmVzdWx0c1wiIGNsYXNzPVwicXVpY2stc2VhcmNoLXJlc3VsdHNcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1mb290ZXJcIj5cbiAgICAgICAgICA8c3Bhbj48a2JkPlx1MjE5MVx1MjE5Mzwva2JkPiBOYXZpZ2F0ZTwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj48a2JkPkVudGVyPC9rYmQ+IFNlbGVjdDwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj48a2JkPkVzYzwva2JkPiBDbG9zZTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuXG4gICAgLy8gQWRkIHN0eWxlc1xuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAgIC5xdWljay1zZWFyY2gtbW9kYWwge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjcpO1xuICAgICAgICB6LWluZGV4OiAxMDAwMDA7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgcGFkZGluZy10b3A6IDE1dmg7XG4gICAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLW1vZGFsLnNob3cge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWNvbnRlbnQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMxYTFhMmUpO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIsICMzMzMpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgICAgICB3aWR0aDogOTAlO1xuICAgICAgICBtYXgtd2lkdGg6IDYwMHB4O1xuICAgICAgICBib3gtc2hhZG93OiAwIDI1cHggNTBweCAtMTJweCByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaW5wdXQtd3JhcHBlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDE2cHggMjBweDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlciwgIzMzMyk7XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pY29uIHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICB9XG5cbiAgICAgICNxdWljay1zZWFyY2gtaW5wdXQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICBjb2xvcjogdmFyKC0tZmcsICNmZmYpO1xuICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgICAgfVxuXG4gICAgICAjcXVpY2stc2VhcmNoLWlucHV0OjpwbGFjZWhvbGRlciB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzY2Nik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtc2hvcnRjdXQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWhvdmVyLCAjMmEyYTRlKTtcbiAgICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzY2Nik7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtcmVzdWx0cyB7XG4gICAgICAgIG1heC1oZWlnaHQ6IDQwMHB4O1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWNhdGVnb3J5IHtcbiAgICAgICAgcGFkZGluZzogOHB4IDIwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjNjY2KTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3ZlciwgIzJhMmE0ZSk7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgcGFkZGluZzogMTJweCAyMHB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtOmhvdmVyLFxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtLnNlbGVjdGVkIHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LCAjMzQ5OGRiKTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtLWljb24ge1xuICAgICAgICBmb250LXNpemU6IDI0cHg7XG4gICAgICAgIHdpZHRoOiAzMnB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1jb250ZW50IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgY29sb3I6IHZhcigtLWZnLCAjZmZmKTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtLWRlc2NyaXB0aW9uIHtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICNhYWEpO1xuICAgICAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1iYWRnZSB7XG4gICAgICAgIHBhZGRpbmc6IDJweCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWhvdmVyLCAjMmEyYTRlKTtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjODg4KTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1lbXB0eSB7XG4gICAgICAgIHBhZGRpbmc6IDQwcHggMjBweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWZvb3RlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBnYXA6IDI0cHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMjBweDtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlciwgIzMzMyk7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtaG92ZXIsICMyYTJhNGUpO1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzY2Nik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtZm9vdGVyIGtiZCB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSwgIzFhMWEyZSk7XG4gICAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiA0cHg7XG4gICAgICB9XG4gICAgYDtcblxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocXVpY2tTZWFyY2hNb2RhbCk7XG5cbiAgICBxdWlja1NlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1aWNrLXNlYXJjaC1pbnB1dCcpO1xuICAgIHF1aWNrU2VhcmNoUmVzdWx0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWljay1zZWFyY2gtcmVzdWx0cycpO1xuXG4gICAgLy8gSW5wdXQgaGFuZGxpbmdcbiAgICBxdWlja1NlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgaGFuZGxlU2VhcmNoSW5wdXQpO1xuICAgIHF1aWNrU2VhcmNoSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZVNlYXJjaEtleURvd24pO1xuXG4gICAgLy8gQ2xvc2Ugb24gYmFja2Ryb3AgY2xpY2tcbiAgICBxdWlja1NlYXJjaE1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldCA9PT0gcXVpY2tTZWFyY2hNb2RhbCkge1xuICAgICAgICBjbG9zZVF1aWNrU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGdsb2JhbCBrZXlkb3duIGV2ZW50c1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlS2V5RG93bihlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEN0cmwrSyBvciBDbWQrSyB0byBvcGVuIHF1aWNrIHNlYXJjaFxuICAgICAgaWYgKChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSAmJiBlLmtleSA9PT0gJ2snKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb3BlblF1aWNrU2VhcmNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRXNjYXBlIHRvIGNsb3NlIG1vZGFsc1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiBxdWljayBzZWFyY2ggaXMgb3BlblxuICAgICAgICBpZiAocXVpY2tTZWFyY2hNb2RhbCAmJiBxdWlja1NlYXJjaE1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSB7XG4gICAgICAgICAgY2xvc2VRdWlja1NlYXJjaCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZW4gY2xvc2UgYW55IG90aGVyIG9wZW4gbW9kYWxcbiAgICAgICAgY2xvc2VUb3BNb2RhbCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGhhbmRsaW5nIGtleWRvd246JywgZTIubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gcXVpY2sgc2VhcmNoIG1vZGFsXG4gICAqL1xuICBmdW5jdGlvbiBvcGVuUXVpY2tTZWFyY2goKSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1aWNrU2VhcmNoTW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgICAgcXVpY2tTZWFyY2hJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgcXVpY2tTZWFyY2hJbnB1dC5mb2N1cygpO1xuICAgICAgc2hvd0RlZmF1bHRSZXN1bHRzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBFcnJvciBvcGVuaW5nIHF1aWNrIHNlYXJjaDonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBxdWljayBzZWFyY2ggbW9kYWxcbiAgICovXG4gIGZ1bmN0aW9uIGNsb3NlUXVpY2tTZWFyY2goKSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1aWNrU2VhcmNoTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgcXVpY2tTZWFyY2hJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgcXVpY2tTZWFyY2hSZXN1bHRzLmlubmVySFRNTCA9ICcnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0tleWJvYXJkIFNob3J0Y3V0c10gRXJyb3IgY2xvc2luZyBxdWljayBzZWFyY2g6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIHRvcG1vc3Qgb3BlbiBtb2RhbFxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VUb3BNb2RhbCgpIHtcbiAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIE1PREFMX1NFTEVDVE9SUykge1xuICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIGlmIChtb2RhbCAmJiAobW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykgfHwgbW9kYWwuc3R5bGUuZGlzcGxheSA9PT0gJ2ZsZXgnKSkge1xuICAgICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICAgIG1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBkZWZhdWx0L3N1Z2dlc3RlZCByZXN1bHRzXG4gICAqL1xuICBmdW5jdGlvbiBzaG93RGVmYXVsdFJlc3VsdHMoKSB7XG4gICAgY29uc3QgaHRtbCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY2F0ZWdvcnlcIj5RdWljayBBY3Rpb25zPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW1cIiBkYXRhLWFjdGlvbj1cInJlZnJlc2hcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+XHVEODNEXHVERDA0PC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS10aXRsZVwiPlJlZnJlc2ggRGFzaGJvYXJkPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWRlc2NyaXB0aW9uXCI+UmVmcmVzaCBhbGwgc2VydmljZSBzdGF0dXNlczwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJyZWxvYWQtY2FkZHlcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+XHUyNkExPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS10aXRsZVwiPlJlbG9hZCBDYWRkeTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPlJlbG9hZCBDYWRkeSBjb25maWd1cmF0aW9uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW1cIiBkYXRhLWFjdGlvbj1cImFkZC1zZXJ2aWNlXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPlx1Mjc5NTwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj5BZGQgU2VydmljZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPk9wZW4gc2VydmljZSBjb25maWd1cmF0aW9uIG1vZGFsPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW1cIiBkYXRhLWFjdGlvbj1cImFwcC1zZWxlY3RvclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj5cdUQ4M0RcdURDRjE8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+QXBwIFNlbGVjdG9yPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWRlc2NyaXB0aW9uXCI+RGVwbG95IG5ldyBhcHBsaWNhdGlvbnM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1jYXRlZ29yeVwiPlNlcnZpY2VzPC9kaXY+XG4gICAgICAke2dldFNlcnZpY2VJdGVtcygpfVxuICAgIGA7XG5cbiAgICBxdWlja1NlYXJjaFJlc3VsdHMuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBhdHRhY2hSZXN1bHRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VydmljZSBpdGVtcyBmcm9tIHRoZSBkYXNoYm9hcmRcbiAgICovXG4gIGZ1bmN0aW9uIGdldFNlcnZpY2VJdGVtcygpIHtcbiAgICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJkW2RhdGEtYXBwXSwgI2NhcmRzIC5jYXJkJyk7XG4gICAgbGV0IGh0bWwgPSAnJztcblxuICAgIGNhcmRzLmZvckVhY2goY2FyZCA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcubmFtZScpPy50ZXh0Q29udGVudCB8fCAnVW5rbm93bic7XG4gICAgICBjb25zdCBzdGF0dXMgPSBjYXJkLmRhdGFzZXQuc3RhdHVzIHx8ICd1bmtub3duJztcbiAgICAgIGNvbnN0IGFwcCA9IGNhcmQuZGF0YXNldC5hcHAgfHwgJyc7XG5cbiAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09ICctLScpIHtcbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJvcGVuLXNlcnZpY2VcIiBkYXRhLXNlcnZpY2U9XCIke2FwcH1cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPiR7c3RhdHVzID09PSAnb24nID8gJ1x1RDgzRFx1REZFMicgOiAnXHVEODNEXHVERDM0J308L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj4ke25hbWV9PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPkNsaWNrIHRvIG9wZW4gc2VydmljZTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWJhZGdlXCI+JHtzdGF0dXMudG9VcHBlckNhc2UoKX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaHRtbCB8fCAnPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1lbXB0eVwiPk5vIHNlcnZpY2VzIGZvdW5kPC9kaXY+JztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VhcmNoIGlucHV0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVTZWFyY2hJbnB1dChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gZS50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgc2hvd0RlZmF1bHRSZXN1bHRzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2VhcmNoIHRocm91Z2ggc2VydmljZXMgYW5kIGFjdGlvbnNcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBzZWFyY2hBbGwocXVlcnkpO1xuICAgICAgZGlzcGxheVNlYXJjaFJlc3VsdHMocmVzdWx0cyk7XG4gICAgfSBjYXRjaCAoZTIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0tleWJvYXJkIFNob3J0Y3V0c10gRXJyb3IgaGFuZGxpbmcgc2VhcmNoIGlucHV0OicsIGUyLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggYWxsIGl0ZW1zXG4gICAqL1xuICBmdW5jdGlvbiBzZWFyY2hBbGwocXVlcnkpIHtcbiAgICBjb25zdCByZXN1bHRzID0ge1xuICAgICAgYWN0aW9uczogW10sXG4gICAgICBzZXJ2aWNlczogW11cbiAgICB9O1xuXG4gICAgLy8gU2VhcmNoIGFjdGlvbnNcbiAgICBjb25zdCBhY3Rpb25zID0gW1xuICAgICAgeyBpZDogJ3JlZnJlc2gnLCB0aXRsZTogJ1JlZnJlc2ggRGFzaGJvYXJkJywgaWNvbjogJ1x1RDgzRFx1REQwNCcsIGtleXdvcmRzOiAncmVmcmVzaCByZWxvYWQgdXBkYXRlIHN0YXR1cycgfSxcbiAgICAgIHsgaWQ6ICdyZWxvYWQtY2FkZHknLCB0aXRsZTogJ1JlbG9hZCBDYWRkeScsIGljb246ICdcdTI2QTEnLCBrZXl3b3JkczogJ3JlbG9hZCBjYWRkeSBwcm94eSBjb25maWcnIH0sXG4gICAgICB7IGlkOiAnYWRkLXNlcnZpY2UnLCB0aXRsZTogJ0FkZCBTZXJ2aWNlJywgaWNvbjogJ1x1Mjc5NScsIGtleXdvcmRzOiAnYWRkIG5ldyBzZXJ2aWNlIGNyZWF0ZScgfSxcbiAgICAgIHsgaWQ6ICdhcHAtc2VsZWN0b3InLCB0aXRsZTogJ0FwcCBTZWxlY3RvcicsIGljb246ICdcdUQ4M0RcdURDRjEnLCBrZXl3b3JkczogJ2FwcCBkZXBsb3kgaW5zdGFsbCBkb2NrZXIgY29udGFpbmVyJyB9LFxuICAgICAgeyBpZDogJ2JhY2t1cCcsIHRpdGxlOiAnQmFja3VwICYgUmVzdG9yZScsIGljb246ICdcdUQ4M0RcdURDQkUnLCBrZXl3b3JkczogJ2JhY2t1cCByZXN0b3JlIGV4cG9ydCBpbXBvcnQnIH0sXG4gICAgICB7IGlkOiAnc3RhdHMnLCB0aXRsZTogJ0NvbnRhaW5lciBTdGF0cycsIGljb246ICdcdUQ4M0RcdURDQ0EnLCBrZXl3b3JkczogJ3N0YXRzIHJlc291cmNlcyBjcHUgbWVtb3J5JyB9LFxuICAgICAgeyBpZDogJ2xvZ3MnLCB0aXRsZTogJ1ZpZXcgTG9ncycsIGljb246ICdcdUQ4M0RcdURDQ0InLCBrZXl3b3JkczogJ2xvZ3MgZXJyb3IgZGVidWcnIH0sXG4gICAgICB7IGlkOiAndG9rZW5zJywgdGl0bGU6ICdNYW5hZ2UgVG9rZW5zJywgaWNvbjogJ1x1RDgzRFx1REQxMScsIGtleXdvcmRzOiAndG9rZW5zIGFwaSBrZXlzIGNyZWRlbnRpYWxzJyB9LFxuICAgICAgeyBpZDogJ25vdGlmaWNhdGlvbnMnLCB0aXRsZTogJ05vdGlmaWNhdGlvbnMnLCBpY29uOiAnXHVEODNEXHVERDE0Jywga2V5d29yZHM6ICdhbGVydHMgbm90aWZpY2F0aW9ucyBkaXNjb3JkIHRlbGVncmFtJyB9LFxuICAgICAgeyBpZDogJ3RoZW1lJywgdGl0bGU6ICdDaGFuZ2UgVGhlbWUnLCBpY29uOiAnXHVEODNDXHVERkE4Jywga2V5d29yZHM6ICd0aGVtZSBkYXJrIGxpZ2h0IGFwcGVhcmFuY2UnIH0sXG4gICAgICB7IGlkOiAndG91cicsIHRpdGxlOiAnSGVscCBUb3VyJywgaWNvbjogJ1x1RDgzQ1x1REY5MycsIGtleXdvcmRzOiAnaGVscCB0b3VyIGd1aWRlIG9uYm9hcmRpbmcnIH1cbiAgICBdO1xuXG4gICAgYWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICBpZiAoYWN0aW9uLnRpdGxlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkpIHx8IGFjdGlvbi5rZXl3b3Jkcy5pbmNsdWRlcyhxdWVyeSkpIHtcbiAgICAgICAgcmVzdWx0cy5hY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFNlYXJjaCBzZXJ2aWNlc1xuICAgIGNvbnN0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNhcmRbZGF0YS1hcHBdLCAjY2FyZHMgLmNhcmQnKTtcbiAgICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLm5hbWUnKT8udGV4dENvbnRlbnQgfHwgJyc7XG4gICAgICBjb25zdCBhcHAgPSBjYXJkLmRhdGFzZXQuYXBwIHx8ICcnO1xuICAgICAgY29uc3Qgc3RhdHVzID0gY2FyZC5kYXRhc2V0LnN0YXR1cyB8fCAndW5rbm93bic7XG5cbiAgICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkpIHx8IGFwcC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSkge1xuICAgICAgICByZXN1bHRzLnNlcnZpY2VzLnB1c2goe1xuICAgICAgICAgIGlkOiBhcHAsXG4gICAgICAgICAgdGl0bGU6IG5hbWUsXG4gICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgICAgaWNvbjogc3RhdHVzID09PSAnb24nID8gJ1x1RDgzRFx1REZFMicgOiAnXHVEODNEXHVERDM0J1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgc2VhcmNoIHJlc3VsdHNcbiAgICovXG4gIGZ1bmN0aW9uIGRpc3BsYXlTZWFyY2hSZXN1bHRzKHJlc3VsdHMpIHtcbiAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgaWYgKHJlc3VsdHMuYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWNhdGVnb3J5XCI+QWN0aW9uczwvZGl2Pic7XG4gICAgICByZXN1bHRzLmFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICBodG1sICs9IGBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW1cIiBkYXRhLWFjdGlvbj1cIiR7YWN0aW9uLmlkfVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+JHthY3Rpb24uaWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj4ke2FjdGlvbi50aXRsZX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdHMuc2VydmljZXMubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1jYXRlZ29yeVwiPlNlcnZpY2VzPC9kaXY+JztcbiAgICAgIHJlc3VsdHMuc2VydmljZXMuZm9yRWFjaChzZXJ2aWNlID0+IHtcbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJvcGVuLXNlcnZpY2VcIiBkYXRhLXNlcnZpY2U9XCIke3NlcnZpY2UuaWR9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj4ke3NlcnZpY2UuaWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj4ke3NlcnZpY2UudGl0bGV9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tYmFkZ2VcIj4ke3NlcnZpY2Uuc3RhdHVzLnRvVXBwZXJDYXNlKCl9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFodG1sKSB7XG4gICAgICBodG1sID0gJzxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtZW1wdHlcIj5ObyByZXN1bHRzIGZvdW5kPC9kaXY+JztcbiAgICB9XG5cbiAgICBxdWlja1NlYXJjaFJlc3VsdHMuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBhdHRhY2hSZXN1bHRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggY2xpY2sgbGlzdGVuZXJzIHRvIHJlc3VsdCBpdGVtc1xuICAgKi9cbiAgZnVuY3Rpb24gYXR0YWNoUmVzdWx0TGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IGl0ZW1zID0gcXVpY2tTZWFyY2hSZXN1bHRzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdWljay1zZWFyY2gtaXRlbScpO1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZXhlY3V0ZUFjdGlvbihpdGVtKSk7XG5cbiAgICAgIC8vIFNlbGVjdCBmaXJzdCBpdGVtIGJ5IGRlZmF1bHRcbiAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGtleWJvYXJkIG5hdmlnYXRpb24gaW4gc2VhcmNoXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVTZWFyY2hLZXlEb3duKGUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaXRlbXMgPSBxdWlja1NlYXJjaFJlc3VsdHMucXVlcnlTZWxlY3RvckFsbCgnLnF1aWNrLXNlYXJjaC1pdGVtJyk7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IHF1aWNrU2VhcmNoUmVzdWx0cy5xdWVyeVNlbGVjdG9yKCcucXVpY2stc2VhcmNoLWl0ZW0uc2VsZWN0ZWQnKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSBBcnJheS5mcm9tKGl0ZW1zKS5pbmRleE9mKHNlbGVjdGVkKTtcblxuICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChzZWxlY3RlZCkgc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gKHNlbGVjdGVkSW5kZXggKyAxKSAlIGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgaXRlbXNbbmV4dEluZGV4XT8uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgICAgaXRlbXNbbmV4dEluZGV4XT8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkKSBzZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgICBjb25zdCBwcmV2SW5kZXggPSBzZWxlY3RlZEluZGV4IDw9IDAgPyBpdGVtcy5sZW5ndGggLSAxIDogc2VsZWN0ZWRJbmRleCAtIDE7XG4gICAgICAgIGl0ZW1zW3ByZXZJbmRleF0/LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICAgIGl0ZW1zW3ByZXZJbmRleF0/LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICBleGVjdXRlQWN0aW9uKHNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGhhbmRsaW5nIHNlYXJjaCBuYXZpZ2F0aW9uOicsIGUyLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFjdGlvbiBmcm9tIHF1aWNrIHNlYXJjaFxuICAgKi9cbiAgZnVuY3Rpb24gZXhlY3V0ZUFjdGlvbihpdGVtKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGl0ZW0uZGF0YXNldC5hY3Rpb247XG4gICAgICBjb25zdCBzZXJ2aWNlID0gaXRlbS5kYXRhc2V0LnNlcnZpY2U7XG5cbiAgICAgIGNsb3NlUXVpY2tTZWFyY2goKTtcblxuICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgY2FzZSAncmVmcmVzaCc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZnJlc2gnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmVsb2FkLWNhZGR5JzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVsb2FkLWNhZGR5LXRvcCcpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdhZGQtc2VydmljZSc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FwcC1zZWxlY3Rvcic6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWJ0bicpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdiYWNrdXAnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtcmVzdG9yZS1idG4nKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RhdHMnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXItc3RhdHMtYnRuJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xvZ3MnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3LWVycm9yLWxvZ3MnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9rZW5zJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFuYWdlLXRva2VucycpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdub3RpZmljYXRpb25zJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFuYWdlLW5vdGlmaWNhdGlvbnMnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndGhlbWUnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZScpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b3VyJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdGFydC10b3VyLWJ0bicpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdvcGVuLXNlcnZpY2UnOlxuICAgICAgICAgIGlmIChzZXJ2aWNlKSB7XG4gICAgICAgICAgICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXBwPVwiJHtzZXJ2aWNlfVwiXSBbaWQkPVwiLW9wZW5cIl0sIFtkYXRhLWFwcD1cIiR7c2VydmljZX1cIl0gYnV0dG9uOm5vdCgucmVzdGFydC1idG4pOm5vdCgubG9ncy1idG4pOm5vdCguc2V0dGluZ3MtYnRuKWApO1xuICAgICAgICAgICAgaWYgKG9wZW5CdG4pIHtcbiAgICAgICAgICAgICAgb3BlbkJ0bi5jbGljaygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgdGhlIGNhcmQgYW5kIGNsaWNrIGl0XG4gICAgICAgICAgICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHA9XCIke3NlcnZpY2V9XCJdYCk7XG4gICAgICAgICAgICAgIGlmIChjYXJkKSBjYXJkLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBVbmtub3duIGFjdGlvbjonLCBhY3Rpb24pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0tleWJvYXJkIFNob3J0Y3V0c10gRXJyb3IgZXhlY3V0aW5nIGFjdGlvbjonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgd2hlbiBET00gaXMgcmVhZHlcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBpbml0KTtcbiAgfSBlbHNlIHtcbiAgICBpbml0KCk7XG4gIH1cblxuICAvLyBFeHBvc2UgdG8gZ2xvYmFsIHNjb3BlXG4gIHdpbmRvdy5EYXNoQ2FkZHlLZXlib2FyZFNob3J0Y3V0cyA9IHtcbiAgICBvcGVuUXVpY2tTZWFyY2gsXG4gICAgY2xvc2VRdWlja1NlYXJjaFxuICB9O1xuXG59KSgpO1xuIl0sCiAgIm1hcHBpbmdzIjogIkNBQ0MsVUFBWSxDQUVYLFNBQVNBLEdBQXFCLENBQzVCLE1BQU1DLEVBQWlCLFFBQVEsaUJBQWlCLEVBQ2hELEdBQUlBLEVBQ0YsR0FBSSxDQUNlLEtBQUssTUFBTUEsQ0FBYyxFQUVqQyxRQUFRQyxHQUFXLENBQ3JCLE9BQU8sS0FBSyxLQUFLQyxHQUFPQSxFQUFJLEtBQU9ELEVBQVEsRUFBRSxHQUNoRCxPQUFPLEtBQUssS0FBS0EsQ0FBTyxDQUU1QixDQUFDLENBQ0gsT0FBU0UsRUFBRyxDQUNWLFFBQVEsS0FBSyxrQ0FBbUNBLENBQUMsQ0FDbkQsQ0FFSixDQUdBSixFQUFtQixFQUduQixTQUFTSyxHQUFrQixDQUN6QixNQUFNQyxFQUFXLFNBQVMsaUJBQWlCLFlBQVksRUFDdkRBLEVBQVMsUUFBUSxDQUFDQyxFQUFNQyxJQUFVLENBQ2hDRCxFQUFLLE1BQU0sZ0JBQWtCLEdBQUcsS0FBSyxJQUFJQyxFQUFRLEdBQUksR0FBRyxDQUFDLElBQzNELENBQUMsRUFDRCxzQkFBc0IsSUFBTSxDQUMxQkYsRUFBUyxRQUFRQyxHQUFRQSxFQUFLLFVBQVUsSUFBSSxRQUFRLENBQUMsQ0FDdkQsQ0FBQyxDQUNILENBRUEsU0FBU0UsR0FBd0IsQ0FFL0IsR0FESSxFQUFFLGtCQUFtQixZQUNyQixDQUFDLE9BQU8saUJBQW1CLFNBQVMsV0FBYSxhQUFlLFNBQVMsV0FBYSxZQUFh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c3RvbVNlcnZpY2VzIiwgImN1c3RvbVNlcnZpY2VzIiwgInNlcnZpY2UiLCAiYXBwIiwgImUiLCAiYW5pbWF0ZVRvcENhcmRzIiwgInRvcENhcmRzIiwgImNhcmQiLCAiaW5kZXgiLCAicmVnaXN0ZXJTZXJ2aWNlV29ya2VyIiwgInJlZ2lzdGVyIiwgImVycm9yIiwgIl9kYXNoYm9hcmRJbml0aWFsaXplZCIsICJpbml0aWFsaXplRGFzaGJvYXJkIiwgImxvYWRUZW1wbGF0ZUNhdGVnb3JpZXMiLCAiZCIsICJhZGRUb3VyQnV0dG9uIiwgInNob3VsZExvYWRPbmJvYXJkaW5nIiwgImxvYWRPbmJvYXJkaW5nIiwgInMiLCAibGluayIsICJkYXRhIiwgImluaXRUb29sYmFyU2VjdGlvbnMiLCAic2VjdGlvbnMiLCAic2F2ZWQiLCAic2VjdGlvbiIsICJrZXkiLCAiaGVhZGVyIiwgImlzT3BlbiIsICJzdGF0ZSIsICJ0b3VyRG9uZSIsICJ0YXJnZXQiLCAiYnV0dG9uIiwgImNoZWNrIiwgInIiLCAicG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMiLCAiY2F0cyIsICJzZWxlY3QiLCAiY3VycmVudCIsICJwbGFjZWhvbGRlciIsICJwaCIsICJuYW1lIiwgImluZm8iLCAib3B0IiwgInRvdHBEYXRhIiwgInN0eWxlRWwiLCAiZmlsdGVyQmFyIiwgInBhbmVsIiwgInNldEJhciIsICJpZCIsICJwY3QiLCAiZWwiLCAicCIsICJmbXRQY3QiLCAidiIsICJmbXRCeXRlcyIsICJiIiwgInVuaXRzIiwgImkiLCAic2V0U2VydmljZXNDYXJkIiwgInRvdGFsIiwgInVwIiwgImMiLCAic3ViIiwgImFwcGx5SGVhbHRoU3VtbWFyeSIsICJoZWFsdGh5IiwgInVuaGVhbHRoeSIsICJmZXRjaFN0YXRzIiwgImZldGNoSGVhbHRoIiwgImFwcGx5U3RhdHMiLCAic3RhdHMiLCAiY29udGFpbmVycyIsICJjb250YWluZXJzU3ViIiwgImNwdUVsIiwgIm1lbUVsIiwgImVudHJpZXMiLCAiY3B1U3VtIiwgIm1lbVN1bSIsICJtZW1CeXRlcyIsICJjcHVDb3VudCIsICJtZW1Db3VudCIsICJjcHUiLCAibWVtIiwgImF2Z0NwdSIsICJhdmdNZW0iLCAibWVtVHh0IiwgImluRmxpZ2h0IiwgInJlZnJlc2giLCAiaGVhbHRoIiwgInN0YW1wIiwgIm5vdyIsICJkZWJ1ZyIsICJhcmdzIiwgIk1PREFMX1NFTEVDVE9SUyIsICJxdWlja1NlYXJjaE1vZGFsIiwgInF1aWNrU2VhcmNoSW5wdXQiLCAicXVpY2tTZWFyY2hSZXN1bHRzIiwgImluaXQiLCAiY3JlYXRlUXVpY2tTZWFyY2hNb2RhbCIsICJoYW5kbGVLZXlEb3duIiwgInN0eWxlIiwgImhhbmRsZVNlYXJjaElucHV0IiwgImhhbmRsZVNlYXJjaEtleURvd24iLCAiY2xvc2VRdWlja1NlYXJjaCIsICJvcGVuUXVpY2tTZWFyY2giLCAiY2xvc2VUb3BNb2RhbCIsICJlMiIsICJzaG93RGVmYXVsdFJlc3VsdHMiLCAic2VsZWN0b3IiLCAibW9kYWwiLCAiaHRtbCIsICJnZXRTZXJ2aWNlSXRlbXMiLCAiYXR0YWNoUmVzdWx0TGlzdGVuZXJzIiwgImNhcmRzIiwgInN0YXR1cyIsICJxdWVyeSIsICJyZXN1bHRzIiwgInNlYXJjaEFsbCIsICJkaXNwbGF5U2VhcmNoUmVzdWx0cyIsICJhY3Rpb24iLCAiaXRlbSIsICJleGVjdXRlQWN0aW9uIiwgIml0ZW1zIiwgInNlbGVjdGVkIiwgInNlbGVjdGVkSW5kZXgiLCAibmV4dEluZGV4IiwgInByZXZJbmRleCIsICJvcGVuQnRuIl0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gPT09PT09PT09PSBEQVNIQk9BUkQgSU5JVElBTElaQVRJT04gPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBsb2FkQ3VzdG9tU2VydmljZXMoKSB7XG4gICAgY29uc3QgY3VzdG9tU2VydmljZXMgPSBzYWZlR2V0KCdjdXN0b20tc2VydmljZXMnKTtcbiAgICBpZiAoY3VzdG9tU2VydmljZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gSlNPTi5wYXJzZShjdXN0b21TZXJ2aWNlcyk7XG4gICAgICAgIC8vIE1lcmdlIHdpdGggZGVmYXVsdCBBUFBTLCBhdm9pZGluZyBkdXBsaWNhdGVzXG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgaWYgKCF3aW5kb3cuQVBQUy5maW5kKGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2UuaWQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKHNlcnZpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgY3VzdG9tIHNlcnZpY2VzOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgY3VzdG9tIHNlcnZpY2VzIGltbWVkaWF0ZWx5IHNvIHdpbmRvdy5BUFBTIGlzIHBvcHVsYXRlZCBiZWZvcmUgYnVpbGRHcmlkIHJ1bnNcbiAgbG9hZEN1c3RvbVNlcnZpY2VzKCk7XG5cbiAgLy8gU3RhZ2dlcmVkIGFuaW1hdGlvbiBmb3IgdG9wIGNhcmRzIHRvb1xuICBmdW5jdGlvbiBhbmltYXRlVG9wQ2FyZHMoKSB7XG4gICAgY29uc3QgdG9wQ2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG9wIC5jYXJkJyk7XG4gICAgdG9wQ2FyZHMuZm9yRWFjaCgoY2FyZCwgaW5kZXgpID0+IHtcbiAgICAgIGNhcmQuc3R5bGUudHJhbnNpdGlvbkRlbGF5ID0gYCR7TWF0aC5taW4oaW5kZXggKiA2MCwgMzAwKX1tc2A7XG4gICAgfSk7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRvcENhcmRzLmZvckVhY2goY2FyZCA9PiBjYXJkLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU2VydmljZVdvcmtlcigpIHtcbiAgICBpZiAoISgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSkgcmV0dXJuO1xuICAgIGlmICghd2luZG93LmlzU2VjdXJlQ29udGV4dCAmJiBsb2NhdGlvbi5ob3N0bmFtZSAhPT0gJ2xvY2FsaG9zdCcgJiYgbG9jYXRpb24uaG9zdG5hbWUgIT09ICcxMjcuMC4wLjEnKSByZXR1cm47XG5cbiAgICBjb25zdCByZWdpc3RlciA9ICgpID0+IHtcbiAgICAgIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlZ2lzdGVyKCcvc3cuanMnLCB7IHVwZGF0ZVZpYUNhY2hlOiAnbm9uZScgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2luaXRdIFNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICByZWdpc3RlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlZ2lzdGVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBkYXNoYm9hcmQgKGNhbGxlZCBhZnRlciBUT1RQIGdhdGUgY2hlY2sgb3IgZGlyZWN0bHkgaWYgVE9UUCBkaXNhYmxlZClcbiAgLy8gTk9URTogbG9hZFNlcnZpY2VzIGNvbWVzIGZyb20gd2luZG93LmxvYWRTZXJ2aWNlcyAoZXhwb3J0ZWQgYnkgZ3JpZC5qcylcbiAgbGV0IF9kYXNoYm9hcmRJbml0aWFsaXplZCA9IGZhbHNlO1xuICBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplRGFzaGJvYXJkKCkge1xuICAgIGlmIChfZGFzaGJvYXJkSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignW2luaXRdIGluaXRpYWxpemVEYXNoYm9hcmQgY2FsbGVkIGFnYWluLCBza2lwcGluZyBkdXBsaWNhdGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX2Rhc2hib2FyZEluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBhd2FpdCB3aW5kb3cubG9hZFNlcnZpY2VzKCk7XG4gICAgYXdhaXQgbG9hZFRlbXBsYXRlQ2F0ZWdvcmllcygpO1xuICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5vcGVuUmVxdWVzdGVkQ3JlZGVudGlhbEZvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdpbmRvdy5vcGVuUmVxdWVzdGVkQ3JlZGVudGlhbEZvcm0oKTtcbiAgICB9XG4gICAgYW5pbWF0ZVRvcENhcmRzKCk7XG4gICAgd2luZG93LnJlZnJlc2hBbGwoKTtcbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAvLyBTdG9wIHBvbGxpbmcgaWYgdGhlIHNlc3Npb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQgKGUuZy4gVE9UUCBnYXRlXG4gICAgICAvLyBub3cgYWN0aXZlLCBvciB1c2VyIGxvZ2dlZCBvdXQpLiBBdm9pZHMgcmVsZW50bGVzcyA0MDEvNDAzIG5vaXNlLlxuICAgICAgaWYgKHdpbmRvdy5fZGNBdXRoTG9zdCkgcmV0dXJuO1xuICAgICAgd2luZG93LnJlZnJlc2hBbGwoKTtcbiAgICB9LCBEQy5QT0xMLkRBU0hCT0FSRCk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cucmVmcmVzaENyZWRzQnV0dG9ucyA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LnJlZnJlc2hDcmVkc0J1dHRvbnMoKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5yZWZyZXNoTW9uaXRvcmluZ1dpZGdldHMgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5yZWZyZXNoTW9uaXRvcmluZ1dpZGdldHMoKTtcbiAgICAvLyBVcGRhdGUgYXV0aCBjYXJkIChtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gdXBkYXRlZCBieSB0aGUgYXV0by1sb2FkIElJRkUgYnV0IGVuc3VyZSBpdCdzIGNvcnJlY3QpXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuX3VwZGF0ZUF1dGhDYXJkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9jb25maWcnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgIGlmIChkLnN1Y2Nlc3MpIHdpbmRvdy5fdXBkYXRlQXV0aENhcmQoZC5jb25maWcuZW5hYmxlZCAmJiBkLmNvbmZpZy5pc1NldFVwLCBkLmNvbmZpZy5zZXNzaW9uRHVyYXRpb24pO1xuICAgICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICAgIH1cbiAgICBpZiAod2luZG93Ll9fZGFzaGNhZGR5U2l0ZUNvbmZpZ0xvYWRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2luZG93Ll9fZGFzaGNhZGR5U2l0ZUNvbmZpZ0xvYWRlZDtcbiAgICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgICB9XG4gICAgLy8gTGF6eS1sb2FkIG9uYm9hcmRpbmcgb25seSBvbmNlIHBlciBpbnN0YWxsLCBvdGhlcndpc2UganVzdCBhZGQgdGhlIHRvdXIgYnV0dG9uXG4gICAgYWRkVG91ckJ1dHRvbigpO1xuICAgIGlmIChzaG91bGRMb2FkT25ib2FyZGluZygpKSB7XG4gICAgICBsb2FkT25ib2FyZGluZygpO1xuICAgIH1cblxuICAgIC8vIERDLTA0ODogaW5qZWN0IHRoZSBcIkFkbWluXCIgdHJpZ2dlciBidXR0b24gaW50byB0aGUgdG9wIGJhci4gVGhlXG4gICAgLy8gYnV0dG9uIG9ubHkgcmVuZGVycyB3aGVuIC9tZSByZXR1cm5zIGlzQWRtaW49dHJ1ZTsgdGhlIG1vZHVsZVxuICAgIC8vIHJlLWNoZWNrcyBldmVyeSA2MHMgc28gYSBwZXJtaXNzaW9uIGRvd25ncmFkZSB0YWtlcyBlZmZlY3QuXG4gICAgaWYgKHdpbmRvdy5BZG1pblBhbmVsICYmIHR5cGVvZiB3aW5kb3cuQWRtaW5QYW5lbC5hdHRhY2hUcmlnZ2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3aW5kb3cuQWRtaW5QYW5lbC5hdHRhY2hUcmlnZ2VyKGRvY3VtZW50LmJvZHkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tpbml0XSBBZG1pblBhbmVsIGF0dGFjaFRyaWdnZXIgZmFpbGVkOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIExhenktbG9hZCBvbmJvYXJkaW5nIGJ1bmRsZSAoNTIgS0IpIFx1MjAxNCBvbmx5IGxvYWRlZCB3aGVuIG5lZWRlZFxuICBmdW5jdGlvbiBsb2FkT25ib2FyZGluZygpIHtcbiAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYz1cIi9kaXN0L29uYm9hcmRpbmcuanNcIl0nKSkgcmV0dXJuOyAvLyBhbHJlYWR5IGxvYWRpbmcvbG9hZGVkXG4gICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHMuc3JjID0gJy9kaXN0L29uYm9hcmRpbmcuanMnO1xuICAgIHMuZGVmZXIgPSB0cnVlO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocyk7XG4gICAgLy8gQWxzbyBsb2FkIG9uYm9hcmRpbmcgQ1NTIGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj1cIi9jc3MvZHJpdmVyLm1pbi5jc3NcIl0nKSkge1xuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgbGluay5ocmVmID0gJy9jc3MvZHJpdmVyLm1pbi5jc3MnO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICB9XG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW2hyZWY9XCIvY3NzL29uYm9hcmRpbmcuY3NzXCJdJykpIHtcbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgIGxpbmsuaHJlZiA9ICcvY3NzL29uYm9hcmRpbmcuY3NzJztcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgb25ib2FyZGluZyBzaG91bGQgYXV0by1zdGFydCAoZmlyc3QtdGltZSB1c2VyKVxuICBmdW5jdGlvbiBzaG91bGRMb2FkT25ib2FyZGluZygpIHtcbiAgICBpZiAodHlwZW9mIFNJVEUgIT09ICd1bmRlZmluZWQnICYmIFNJVEUub25ib2FyZGluZ0NvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Rhc2hjYWRkeV9vbmJvYXJkaW5nJykpO1xuICAgICAgcmV0dXJuICFkYXRhIHx8ICghZGF0YS50b3VyQ29tcGxldGVkICYmIGRhdGEuY3VycmVudFN0ZXAgPT09IDApO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBObyBkYXRhIG1lYW5zIGZpcnN0LXRpbWUgdXNlclxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IENvbGxhcHNpYmxlIHRvb2xiYXIgc2VjdGlvbnMgPT09PT1cbiAgZnVuY3Rpb24gaW5pdFRvb2xiYXJTZWN0aW9ucygpIHtcbiAgICBjb25zdCBzZWN0aW9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50b29scy1zZWN0aW9uJyk7XG4gICAgaWYgKCFzZWN0aW9ucy5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIFJlc3RvcmUgc2F2ZWQgc3RhdGUgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICBsZXQgc2F2ZWQgPSB7fTtcbiAgICB0cnkgeyBzYXZlZCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Rvb2xiYXItc2VjdGlvbnMnKSB8fCAne30nKTsgfSBjYXRjaCAoXykge31cblxuICAgIHNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBzZWN0aW9uLmRhdGFzZXQuc2VjdGlvbjtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHNlY3Rpb24ucXVlcnlTZWxlY3RvcignLnRvb2xzLXNlY3Rpb24taGVhZGVyJyk7XG4gICAgICBpZiAoIWhlYWRlcikgcmV0dXJuO1xuXG4gICAgICAvLyBSZXN0b3JlIHN0YXRlIChkZWZhdWx0OiBjb2xsYXBzZWQpXG4gICAgICBpZiAoc2F2ZWRba2V5XSkge1xuICAgICAgICBzZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTtcbiAgICAgICAgaGVhZGVyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgICB9XG5cbiAgICAgIGhlYWRlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgaXNPcGVuID0gc2VjdGlvbi5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XG4gICAgICAgIGhlYWRlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBpc09wZW4gPyAndHJ1ZScgOiAnZmFsc2UnKTtcblxuICAgICAgICAvLyBTYXZlIHN0YXRlXG4gICAgICAgIGNvbnN0IHN0YXRlID0ge307XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50b29scy1zZWN0aW9uJykuZm9yRWFjaChzID0+IHtcbiAgICAgICAgICBzdGF0ZVtzLmRhdGFzZXQuc2VjdGlvbl0gPSBzLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpO1xuICAgICAgICB9KTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Rvb2xiYXItc2VjdGlvbnMnLCBKU09OLnN0cmluZ2lmeShzdGF0ZSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBJbml0aWFsaXplIHRvb2xiYXIgc2VjdGlvbnMgb24gRE9NIHJlYWR5XG4gIGluaXRUb29sYmFyU2VjdGlvbnMoKTtcblxuICAvLyBBZGQgcmVzdGFydCB0b3VyIGJ1dHRvbiAobG9hZHMgYnVuZGxlIG9uIGNsaWNrIGlmIG5vdCBsb2FkZWQpXG4gIC8vIFZpc2libGUgaW4gcHJpbWFyeSB0b29sYmFyIHVudGlsIHRvdXIgY29tcGxldGVkIG9uY2UsIHRoZW4gbW92ZXMgdG8gQWRtaW4gc2VjdGlvblxuICBmdW5jdGlvbiBhZGRUb3VyQnV0dG9uKCkge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdGFydC10b3VyLWJ0bicpKSByZXR1cm47XG5cbiAgICBsZXQgdG91ckRvbmUgPSB0eXBlb2YgU0lURSAhPT0gJ3VuZGVmaW5lZCcgJiYgU0lURS5vbmJvYXJkaW5nQ29tcGxldGVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaGNhZGR5X29uYm9hcmRpbmcnKSk7XG4gICAgICB0b3VyRG9uZSA9IHRvdXJEb25lIHx8ICEhKGRhdGEgJiYgZGF0YS50b3VyQ29tcGxldGVkKTtcbiAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgLy8gQmVmb3JlIGZpcnN0IGNvbXBsZXRpb246IHNob3cgaW4gcHJpbWFyeSB0b29sYmFyLiBBZnRlcjogdHVjayBpbnRvIEFkbWluIHNlY3Rpb24uXG4gICAgY29uc3QgdGFyZ2V0ID0gdG91ckRvbmVcbiAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvb2xzLXNlY3Rpb25bZGF0YS1zZWN0aW9uPVwiYWRtaW5cIl0gLnRvb2xzLXNlY3Rpb24taXRlbXMnKVxuICAgICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9vbHMtcHJpbWFyeScpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG5cbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBidXR0b24uaWQgPSAncmVzdGFydC10b3VyLWJ0bic7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gdG91ckRvbmUgPyAnSGVscCBUb3VyJyA6ICdcdUQ4M0NcdURGOTMgSGVscCBUb3VyJztcbiAgICBidXR0b24udGl0bGUgPSAnUmVzdGFydCB0aGUgb25ib2FyZGluZyB0b3VyJztcbiAgICBidXR0b24ub25jbGljayA9ICgpID0+IHtcbiAgICAgIGlmICh3aW5kb3cuRGFzaENhZGR5T25ib2FyZGluZykge1xuICAgICAgICB3aW5kb3cuRGFzaENhZGR5T25ib2FyZGluZy5yZXN0YXJ0VG91cigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZE9uYm9hcmRpbmcoKTtcbiAgICAgICAgLy8gV2FpdCBmb3IgYnVuZGxlIHRvIGxvYWQsIHRoZW4gc3RhcnRcbiAgICAgICAgY29uc3QgY2hlY2sgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGNoZWNrKTtcbiAgICAgICAgICAgIHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nLnJlc3RhcnRUb3VyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGNsZWFySW50ZXJ2YWwoY2hlY2spLCA1MDAwKTsgLy8gZ2l2ZSB1cCBhZnRlciA1c1xuICAgICAgfVxuICAgIH07XG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gIH1cblxuICB3aW5kb3cuaW5pdGlhbGl6ZURhc2hib2FyZCA9IGluaXRpYWxpemVEYXNoYm9hcmQ7XG4gIHdpbmRvdy5sb2FkQ3VzdG9tU2VydmljZXMgPSBsb2FkQ3VzdG9tU2VydmljZXM7XG4gIHJlZ2lzdGVyU2VydmljZVdvcmtlcigpO1xuXG4gIC8vID09PT09IFRFTVBMQVRFIENBVEVHT1JJRVMgPT09PT1cbiAgLy8gQ2FjaGVkIHRlbXBsYXRlIGNhdGVnb3JpZXMgZnJvbSAvYXBpL3YxL3RlbXBsYXRlcyBmb3IgdXNlIGFjcm9zcyB0aGUgVUlcbiAgLy8gKHNlcnZpY2UgY3JlYXRlL2VkaXQsIGZpbHRlciBkcm9wZG93biwgY2F0ZWdvcnkgYmFkZ2VzLCBldGMuKVxuICBhc3luYyBmdW5jdGlvbiBsb2FkVGVtcGxhdGVDYXRlZ29yaWVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdGVtcGxhdGVzJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGlmICghci5vaykgcmV0dXJuO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5jYXRlZ29yaWVzKSB7XG4gICAgICAgIHdpbmRvdy5EQ19DQVRFR09SSUVTID0gZGF0YS5jYXRlZ29yaWVzO1xuICAgICAgICAvLyBBbHNvIGV4cG9zZSB2aWEgZ2xvYmFscy5qcyBjb25zdGFudCBmb3IgY29udmVuaWVuY2VcbiAgICAgICAgaWYgKHR5cGVvZiBEQyAhPT0gJ3VuZGVmaW5lZCcpIERDLkNBVEVHT1JJRVMgPSBkYXRhLmNhdGVnb3JpZXM7XG4gICAgICAgIC8vIFBvcHVsYXRlIGFueSBjYXRlZ29yeSA8c2VsZWN0PiB0aGF0J3MgYWxyZWFkeSBpbiB0aGUgRE9NXG4gICAgICAgIHBvcHVsYXRlQ2F0ZWdvcnlTZWxlY3RzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbaW5pdF0gRmFpbGVkIHRvIGxvYWQgdGVtcGxhdGUgY2F0ZWdvcmllczonLCBlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cygpIHtcbiAgICBjb25zdCBjYXRzID0gd2luZG93LkRDX0NBVEVHT1JJRVMgfHwgKHR5cGVvZiBEQyAhPT0gJ3VuZGVmaW5lZCcgJiYgREMuQ0FURUdPUklFUyk7XG4gICAgaWYgKCFjYXRzKSByZXR1cm47XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc2VsZWN0W2RhdGEtcm9sZT1cInNlcnZpY2UtY2F0ZWdvcnlcIl0nKS5mb3JFYWNoKHNlbGVjdCA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gc2VsZWN0LmRhdGFzZXQuY3VycmVudCB8fCAnJztcbiAgICAgIC8vIENsZWFyIG9wdGlvbnMgYnV0IGtlZXAgdGhlIGZpcnN0IChwbGFjZWhvbGRlcilcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gc2VsZWN0LnF1ZXJ5U2VsZWN0b3IoJ29wdGlvblt2YWx1ZT1cIlwiXScpO1xuICAgICAgc2VsZWN0LmlubmVySFRNTCA9ICcnO1xuICAgICAgaWYgKHBsYWNlaG9sZGVyKSBzZWxlY3QuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXIpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgIHBoLnZhbHVlID0gJyc7XG4gICAgICAgIHBoLnRleHRDb250ZW50ID0gJ1x1MjAxNCBTZWxlY3QgY2F0ZWdvcnkgXHUyMDE0JztcbiAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKHBoKTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5lbnRyaWVzKGNhdHMpLmZvckVhY2goKFtuYW1lLCBpbmZvXSkgPT4ge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gbmFtZTtcbiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gYCR7aW5mby5pY29uIHx8ICcnfSAke25hbWV9YC50cmltKCk7XG4gICAgICAgIGlmIChuYW1lID09PSBjdXJyZW50KSBvcHQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQWxsb3cgb3RoZXIgbW9kdWxlcyB0byByZS1ydW4gcG9wdWxhdGlvbiBhZnRlciB0aGV5IChyZSlpbmplY3Qgc2VsZWN0c1xuICB3aW5kb3cucG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMgPSBwb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cztcbiAgd2luZG93LmxvYWRUZW1wbGF0ZUNhdGVnb3JpZXMgPSBsb2FkVGVtcGxhdGVDYXRlZ29yaWVzO1xuXG4gIC8vIFRPVFAtZ2F0ZWQgaW5pdGlhbGl6YXRpb25cbiAgKGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdG90cFJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvY29uZmlnJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGNvbnN0IHRvdHBEYXRhID0gYXdhaXQgdG90cFJlcy5qc29uKCk7XG5cbiAgICAgIGlmICh0b3RwRGF0YS5zdWNjZXNzICYmIHRvdHBEYXRhLmNvbmZpZy5lbmFibGVkKSB7XG4gICAgICAgIC8vIFRPVFAgaXMgZW5hYmxlZCAtIGNoZWNrIGlmIHdlIGhhdmUgYSB2YWxpZCBzZXNzaW9uXG4gICAgICAgIGNvbnN0IHRlc3RSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL2NoZWNrLXNlc3Npb24nLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgICBpZiAodGVzdFJlcy5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgIC8vIE5lZWQgVE9UUCB2ZXJpZmljYXRpb24gLSBzaG93IG92ZXJsYXlcbiAgICAgICAgICB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpO1xuICAgICAgICAgIHJldHVybjsgLy8gaW5pdGlhbGl6ZURhc2hib2FyZCgpIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHN1Y2Nlc3NmdWwgdmVyaWZpY2F0aW9uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RPVFAgY2hlY2sgZmFpbGVkLCBwcm9jZWVkaW5nIG5vcm1hbGx5OicsIGUpO1xuICAgIH1cblxuICAgIC8vIFRPVFAgZGlzYWJsZWQgb3Igc2Vzc2lvbiB2YWxpZCAtIGluaXRpYWxpemUgaW1tZWRpYXRlbHlcbiAgICBpbml0aWFsaXplRGFzaGJvYXJkKCk7XG4gIH0pKCk7XG5cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IE1PTklUT1JJTkcgV0lER0VUUyA9PT09PT09PT09XG4vLyBFbWJlZHMgYSBjb21wYWN0IHN5c3RlbS1yZXNvdXJjZSArIGhlYWx0aCBzdW1tYXJ5IHBhbmVsIGRpcmVjdGx5IG9uIHRoZVxuLy8gbWFpbiBkYXNoYm9hcmQuIFJlcGxhY2VzIHRoZSBuZWVkIGZvciBhIHNlcGFyYXRlIG1vbml0b3JpbmctZGFzaGJvYXJkLmh0bWxcbi8vIHBhZ2UgXHUyMDE0IHF1aWNrIGF0LWEtZ2xhbmNlIHN0YXRzIHdoZXJlIHlvdSBhbHJlYWR5IGFyZS5cbihmdW5jdGlvbiAoKSB7XG5cbiAgLy8gLS0tLS0gU3R5bGUgaW5qZWN0aW9uIChzY29wZWQgdG8gLmRjLW1vbml0b3Igc28gaXQgZG9lc24ndCBsZWFrKSAtLS0tLVxuICBjb25zdCBzdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGVFbC50ZXh0Q29udGVudCA9IGBcbiAgICAuZGMtbW9uaXRvciB7XG4gICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMjBweCwgMWZyKSk7XG4gICAgICBnYXA6IDEycHg7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1jYXJkIHtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcsIHJnYmEoMjU1LDI1NSwyNTUsMC4wNCkpO1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItbGFiZWwge1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBjb2xvcjogdmFyKC0tbXV0ZWQpO1xuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItdmFsdWUge1xuICAgICAgZm9udC1zaXplOiAxLjRyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLWZnKTtcbiAgICB9XG4gICAgLmRjLW1vbml0b3Itc3ViIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItYmFyIHtcbiAgICAgIG1hcmdpbi10b3A6IDZweDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbXV0ZWQpIDIwJSwgdHJhbnNwYXJlbnQpO1xuICAgICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItYmFyLWZpbGwge1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgd2lkdGg6IDAlO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tb2stZmcsICMyN2FlNjApO1xuICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC4zcyBlYXNlLCBiYWNrZ3JvdW5kIDAuM3MgZWFzZTtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItYmFyLWZpbGwud2FybiB7IGJhY2tncm91bmQ6ICNmMzljMTI7IH1cbiAgICAuZGMtbW9uaXRvci1iYXItZmlsbC5iYWQgIHsgYmFja2dyb3VuZDogI2U3NGMzYzsgfVxuICAgIC5kYy1tb25pdG9yLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjg1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1waWxsIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNHB4O1xuICAgICAgcGFkZGluZzogMnB4IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1waWxsLm9rICAgeyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgIzI3YWU2MCAyMCUsIHRyYW5zcGFyZW50KTsgY29sb3I6ICMyN2FlNjA7IH1cbiAgICAuZGMtbW9uaXRvci1waWxsLndhcm4geyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzOWMxMiAyMCUsIHRyYW5zcGFyZW50KTsgY29sb3I6ICNmMzljMTI7IH1cbiAgICAuZGMtbW9uaXRvci1waWxsLmJhZCAgeyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2U3NGMzYyAyMCUsIHRyYW5zcGFyZW50KTsgY29sb3I6ICNlNzRjM2M7IH1cbiAgICAuZGMtbW9uaXRvci1yZWZyZXNoIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIG9wYWNpdHk6IDAuNztcbiAgICB9XG4gIGA7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XG5cbiAgLy8gLS0tLS0gQ29udGFpbmVyIGVsZW1lbnQgKGluc2VydGVkIGFib3ZlIHNlcnZpY2UtZmlsdGVyLWJhcikgLS0tLS1cbiAgY29uc3QgZmlsdGVyQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZmlsdGVyLWJhcicpO1xuICBpZiAoIWZpbHRlckJhcikgcmV0dXJuO1xuXG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHBhbmVsLmNsYXNzTmFtZSA9ICdkYy1tb25pdG9yJztcbiAgcGFuZWwuaWQgPSAnZGMtbW9uaXRvci1wYW5lbCc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1oZWFkZXJcIiBzdHlsZT1cImdyaWQtY29sdW1uOiAxIC8gLTE7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci10aXRsZVwiPlx1RDgzRFx1RENDQSBTeXN0ZW0gT3ZlcnZpZXc8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZGMtbW9uaXRvci1yZWZyZXNoXCIgaWQ9XCJkYy1tb25pdG9yLXJlZnJlc2gtc3RhbXBcIj5cdTIwMTQ8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5TZXJ2aWNlczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItdmFsdWVcIiBpZD1cImRjLW1vbml0b3Itc2VydmljZXNcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXN1YlwiIGlkPVwiZGMtbW9uaXRvci1zZXJ2aWNlcy1zdWJcIj5sb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5Db250YWluZXJzIFVwPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1jb250YWluZXJzXCI+XHUyMDE0PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1zdWJcIiBpZD1cImRjLW1vbml0b3ItY29udGFpbmVycy1zdWJcIj5sb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5BdmcgQ1BVPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1jcHVcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWJhclwiPjxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWJhci1maWxsXCIgaWQ9XCJkYy1tb25pdG9yLWNwdS1iYXJcIj48L2Rpdj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1sYWJlbFwiPkF2ZyBNZW1vcnk8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXZhbHVlXCIgaWQ9XCJkYy1tb25pdG9yLW1lbVwiPlx1MjAxNDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyXCI+PGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyLWZpbGxcIiBpZD1cImRjLW1vbml0b3ItbWVtLWJhclwiPjwvZGl2PjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWxhYmVsXCI+SGVhbHRoPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1oZWFsdGhcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXN1YlwiIGlkPVwiZGMtbW9uaXRvci1oZWFsdGgtc3ViXCI+XHUyMDE0PC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIC8vIEluc2VydCBBQk9WRSB0aGUgZmlsdGVyIGJhclxuICBmaWx0ZXJCYXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocGFuZWwsIGZpbHRlckJhcik7XG5cbiAgLy8gLS0tLS0gSGVscGVycyAtLS0tLVxuICBmdW5jdGlvbiBzZXRCYXIoaWQsIHBjdCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBwID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBOdW1iZXIocGN0KSB8fCAwKSk7XG4gICAgZWwuc3R5bGUud2lkdGggPSBwICsgJyUnO1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ3dhcm4nLCAnYmFkJyk7XG4gICAgaWYgKHAgPj0gODUpIGVsLmNsYXNzTGlzdC5hZGQoJ2JhZCcpO1xuICAgIGVsc2UgaWYgKHAgPj0gNjUpIGVsLmNsYXNzTGlzdC5hZGQoJ3dhcm4nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZtdFBjdCh2KSB7XG4gICAgaWYgKHYgPT0gbnVsbCB8fCBpc05hTih2KSkgcmV0dXJuICdcdTIwMTQnO1xuICAgIHJldHVybiAoTWF0aC5yb3VuZCh2ICogMTApIC8gMTApICsgJyUnO1xuICB9XG5cbiAgZnVuY3Rpb24gZm10Qnl0ZXMoYikge1xuICAgIGlmIChiID09IG51bGwgfHwgaXNOYU4oYikpIHJldHVybiAnXHUyMDE0JztcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQiddO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoYiA+PSAxMDI0ICYmIGkgPCB1bml0cy5sZW5ndGggLSAxKSB7IGIgLz0gMTAyNDsgaSsrOyB9XG4gICAgcmV0dXJuIGIudG9GaXhlZCgxKSArICcgJyArIHVuaXRzW2ldO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2VydmljZXNDYXJkKCkge1xuICAgIGNvbnN0IHRvdGFsID0gKHdpbmRvdy5BUFBTIHx8IFtdKS5sZW5ndGg7XG4gICAgbGV0IHVwID0gMDtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY2FyZHMgLmNhcmQnKS5mb3JFYWNoKGMgPT4ge1xuICAgICAgaWYgKGMuZGF0YXNldC5zdGF0dXMgPT09ICdvbicpIHVwKys7XG4gICAgfSk7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1zZXJ2aWNlcycpO1xuICAgIGNvbnN0IHN1YiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLXNlcnZpY2VzLXN1YicpO1xuICAgIGlmIChlbCkgZWwudGV4dENvbnRlbnQgPSBgJHt1cH0gLyAke3RvdGFsfWA7XG4gICAgaWYgKHN1Yikgc3ViLnRleHRDb250ZW50ID0gdG90YWwgPT09IDAgPyAnbm8gc2VydmljZXMgeWV0JyA6IGAke3VwfSBvbmxpbmUgXHUwMEI3ICR7dG90YWwgLSB1cH0gb2ZmbGluZWA7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseUhlYWx0aFN1bW1hcnkoZGF0YSkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItaGVhbHRoJyk7XG4gICAgY29uc3Qgc3ViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItaGVhbHRoLXN1YicpO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBpZiAoIWRhdGEgfHwgZGF0YS5zdW1tYXJ5ID09IG51bGwpIHtcbiAgICAgIGVsLnRleHRDb250ZW50ID0gJ1x1MjAxNCc7XG4gICAgICBpZiAoc3ViKSBzdWIudGV4dENvbnRlbnQgPSAnbm8gZGF0YSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHMgPSBkYXRhLnN1bW1hcnk7XG4gICAgY29uc3QgaGVhbHRoeSA9IHMuaGVhbHRoeSA/PyBzLnVwID8/IDA7XG4gICAgY29uc3QgdW5oZWFsdGh5ID0gcy51bmhlYWx0aHkgPz8gcy5kb3duID8/IDA7XG4gICAgY29uc3QgdG90YWwgPSBzLnRvdGFsID8/IChoZWFsdGh5ICsgdW5oZWFsdGh5KTtcbiAgICBlbC50ZXh0Q29udGVudCA9IGAke2hlYWx0aHl9LyR7dG90YWx9YDtcbiAgICBpZiAoc3ViKSB7XG4gICAgICBpZiAodW5oZWFsdGh5ID09PSAwKSB7XG4gICAgICAgIHN1Yi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJkYy1tb25pdG9yLXBpbGwgb2tcIj5cdTI1Q0YgYWxsIGhlYWx0aHk8L3NwYW4+JztcbiAgICAgIH0gZWxzZSBpZiAodW5oZWFsdGh5IDw9IDIpIHtcbiAgICAgICAgc3ViLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cImRjLW1vbml0b3ItcGlsbCB3YXJuXCI+XHUyNUNGICR7dW5oZWFsdGh5fSBkZWdyYWRlZDwvc3Bhbj5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3ViLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cImRjLW1vbml0b3ItcGlsbCBiYWRcIj5cdTI1Q0YgJHt1bmhlYWx0aHl9IGRvd248L3NwYW4+YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLSBEYXRhIGZldGNoZXMgLS0tLS1cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hTdGF0cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL21vbml0b3Jpbmcvc3RhdHMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgaWYgKCFyLm9rKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgIHJldHVybiAoZGF0YSAmJiBkYXRhLnN0YXRzKSA/IGRhdGEuc3RhdHMgOiBudWxsO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoSGVhbHRoKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9zdGF0dXMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgaWYgKCFyLm9rKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBhd2FpdCByLmpzb24oKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseVN0YXRzKHN0YXRzKSB7XG4gICAgY29uc3QgY29udGFpbmVycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLWNvbnRhaW5lcnMnKTtcbiAgICBjb25zdCBjb250YWluZXJzU3ViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItY29udGFpbmVycy1zdWInKTtcbiAgICBjb25zdCBjcHVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLWNwdScpO1xuICAgIGNvbnN0IG1lbUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItbWVtJyk7XG5cbiAgICBpZiAoIXN0YXRzKSB7XG4gICAgICBpZiAoY29udGFpbmVycykgY29udGFpbmVycy50ZXh0Q29udGVudCA9ICdcdTIwMTQnO1xuICAgICAgaWYgKGNwdUVsKSBjcHVFbC50ZXh0Q29udGVudCA9ICdcdTIwMTQnO1xuICAgICAgaWYgKG1lbUVsKSBtZW1FbC50ZXh0Q29udGVudCA9ICdcdTIwMTQnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QudmFsdWVzKHN0YXRzKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChjb250YWluZXJzKSBjb250YWluZXJzLnRleHRDb250ZW50ID0gJzAnO1xuICAgICAgaWYgKGNvbnRhaW5lcnNTdWIpIGNvbnRhaW5lcnNTdWIudGV4dENvbnRlbnQgPSAnbm8gY29udGFpbmVycyByZXBvcnRpbmcnO1xuICAgICAgaWYgKGNwdUVsKSBjcHVFbC50ZXh0Q29udGVudCA9ICcwJSc7XG4gICAgICBpZiAobWVtRWwpIG1lbUVsLnRleHRDb250ZW50ID0gJzAlJztcbiAgICAgIHNldEJhcignZGMtbW9uaXRvci1jcHUtYmFyJywgMCk7XG4gICAgICBzZXRCYXIoJ2RjLW1vbml0b3ItbWVtLWJhcicsIDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjcHVTdW0gPSAwLCBtZW1TdW0gPSAwLCBtZW1CeXRlcyA9IDAsIGNwdUNvdW50ID0gMCwgbWVtQ291bnQgPSAwO1xuICAgIGVudHJpZXMuZm9yRWFjaChzID0+IHtcbiAgICAgIC8vIENQVSBtYXkgYmUgcGVyY2VudGFnZSAoMC0xMDApIG9yIGZyYWN0aW9uICgwLTEpIFx1MjAxNCBoYW5kbGUgYm90aFxuICAgICAgaWYgKHMuY3B1ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3B1ID0gTnVtYmVyKHMuY3B1KTtcbiAgICAgICAgaWYgKCFpc05hTihjcHUpKSB7XG4gICAgICAgICAgY3B1U3VtICs9IGNwdSA+IDEgPyBjcHUgOiBjcHUgKiAxMDA7XG4gICAgICAgICAgY3B1Q291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMubWVtb3J5ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbWVtID0gTnVtYmVyKHMubWVtb3J5KTtcbiAgICAgICAgaWYgKCFpc05hTihtZW0pKSB7XG4gICAgICAgICAgbWVtU3VtICs9IG1lbTtcbiAgICAgICAgICBtZW1CeXRlcyArPSBOdW1iZXIocy5tZW1vcnlVc2FnZSB8fCAwKTtcbiAgICAgICAgICBtZW1Db3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhdmdDcHUgPSBjcHVDb3VudCA/IGNwdVN1bSAvIGNwdUNvdW50IDogMDtcbiAgICBjb25zdCBhdmdNZW0gPSBtZW1Db3VudCA/IG1lbVN1bSAvIG1lbUNvdW50IDogMDtcblxuICAgIGlmIChjb250YWluZXJzKSBjb250YWluZXJzLnRleHRDb250ZW50ID0gU3RyaW5nKGVudHJpZXMubGVuZ3RoKTtcbiAgICBpZiAoY29udGFpbmVyc1N1Yikge1xuICAgICAgY29uc3QgbWVtVHh0ID0gbWVtQnl0ZXMgPyBgIFx1MDBCNyAke2ZtdEJ5dGVzKG1lbUJ5dGVzKX0gUkFNYCA6ICcnO1xuICAgICAgY29udGFpbmVyc1N1Yi50ZXh0Q29udGVudCA9IGBydW5uaW5nJHttZW1UeHR9YDtcbiAgICB9XG4gICAgaWYgKGNwdUVsKSBjcHVFbC50ZXh0Q29udGVudCA9IGZtdFBjdChhdmdDcHUpO1xuICAgIGlmIChtZW1FbCkgbWVtRWwudGV4dENvbnRlbnQgPSBmbXRQY3QoYXZnTWVtKTtcbiAgICBzZXRCYXIoJ2RjLW1vbml0b3ItY3B1LWJhcicsIGF2Z0NwdSk7XG4gICAgc2V0QmFyKCdkYy1tb25pdG9yLW1lbS1iYXInLCBhdmdNZW0pO1xuICB9XG5cbiAgLy8gLS0tLS0gUHVibGljIHJlZnJlc2ggZnVuY3Rpb24gLS0tLS1cbiAgbGV0IGluRmxpZ2h0ID0gZmFsc2U7XG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgaWYgKGluRmxpZ2h0KSByZXR1cm47XG4gICAgaW5GbGlnaHQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBzZXRTZXJ2aWNlc0NhcmQoKTtcbiAgICAgIGNvbnN0IFtzdGF0cywgaGVhbHRoXSA9IGF3YWl0IFByb21pc2UuYWxsKFtmZXRjaFN0YXRzKCksIGZldGNoSGVhbHRoKCldKTtcbiAgICAgIGFwcGx5U3RhdHMoc3RhdHMpO1xuICAgICAgYXBwbHlIZWFsdGhTdW1tYXJ5KGhlYWx0aCk7XG4gICAgICBjb25zdCBzdGFtcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLXJlZnJlc2gtc3RhbXAnKTtcbiAgICAgIGlmIChzdGFtcCkge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBzdGFtcC50ZXh0Q29udGVudCA9IGB1cGRhdGVkICR7bm93LnRvTG9jYWxlVGltZVN0cmluZygpfWA7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGluRmxpZ2h0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhwb3NlIGZvciBpbml0LmpzIHRvIGNhbGwgb25jZSBhbmQgcmUtY2FsbCBhZnRlciBlYWNoIHJlZnJlc2hBbGwgY3ljbGVcbiAgd2luZG93LnJlZnJlc2hNb25pdG9yaW5nV2lkZ2V0cyA9IHJlZnJlc2g7XG5cbiAgLy8gQXV0by1yZWZyZXNoIG9uIHRoZSBTVEFUUyBpbnRlcnZhbCAoc2VwYXJhdGUgZnJvbSBmdWxsIERBU0hCT0FSRCByZWZyZXNoKVxuICBzZXRJbnRlcnZhbChyZWZyZXNoLCAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5QT0xMICYmIERDLlBPTEwuU1RBVFMpIHx8IDUwMDApO1xuXG4gIC8vIFJlZnJlc2ggb25jZSBvbiBmaXJzdCBzY3JpcHQgbG9hZCAoaW5pdC5qcyBhbHNvIGNhbGxzIHRoaXM7IGRvdWJsZS1jYWxsIGlzIGhhcm1sZXNzKVxuICBzZXRUaW1lb3V0KHJlZnJlc2gsIDIwMCk7XG5cbn0pKCk7XG47XG4vKipcbiAqIERhc2hDYWRkeSBLZXlib2FyZCBTaG9ydGN1dHMgU3lzdGVtXG4gKiBQcm92aWRlcyBnbG9iYWwga2V5Ym9hcmQgc2hvcnRjdXRzIGZvciBpbXByb3ZlZCBuYXZpZ2F0aW9uXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgZGVidWcgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmICh3aW5kb3cuREFTSENBRERZX0RFQlVHKSB7IGNvbnNvbGUubG9nKC4uLmFyZ3MpOyB9XG4gIH07XG5cbiAgLy8gQWxsIG1vZGFsIHNlbGVjdG9ycyB0aGF0IGNhbiBiZSBjbG9zZWQgd2l0aCBFc2NhcGVcbiAgY29uc3QgTU9EQUxfU0VMRUNUT1JTID0gW1xuICAgICcjYXBwLXNlbGVjdG9yLW1vZGFsJyxcbiAgICAnI2FwcC1kZXBsb3ktbW9kYWwnLFxuICAgICcjd2VhdGhlci1tb2RhbCcsXG4gICAgJyN0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJyxcbiAgICAnI3NlcnZpY2UtZWRpdC1tb2RhbCcsXG4gICAgJyNub3RpZmljYXRpb25zLW1vZGFsJyxcbiAgICAnI2JhY2t1cC1tb2RhbCcsXG4gICAgJyNzdGF0cy1tb2RhbCcsXG4gICAgJyNhcnItc2V0dXAtbW9kYWwnLFxuICAgICcjYWRkLXNlcnZpY2UtbW9kYWwnLFxuICAgICcjZXJyb3ItbG9nLW1vZGFsJyxcbiAgICAnI2xvZ3MtbW9kYWwnLFxuICAgICcjZG5zLXRlbXBsYXRlLW1vZGFsJ1xuICBdO1xuXG4gIC8vIFF1aWNrIHNlYXJjaCBzdGF0ZVxuICBsZXQgcXVpY2tTZWFyY2hNb2RhbCA9IG51bGw7XG4gIGxldCBxdWlja1NlYXJjaElucHV0ID0gbnVsbDtcbiAgbGV0IHF1aWNrU2VhcmNoUmVzdWx0cyA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGtleWJvYXJkIHNob3J0Y3V0cyBzeXN0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBxdWljayBzZWFyY2ggbW9kYWxcbiAgICAgIGNyZWF0ZVF1aWNrU2VhcmNoTW9kYWwoKTtcblxuICAgICAgLy8gQWRkIGdsb2JhbCBrZXlib2FyZCBsaXN0ZW5lclxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUtleURvd24pO1xuXG4gICAgICBkZWJ1ZygnW0tleWJvYXJkIFNob3J0Y3V0c10gSW5pdGlhbGl6ZWQnKTtcbiAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBQcmVzcyBDdHJsK0sgdG8gb3BlbiBxdWljayBzZWFyY2gnKTtcbiAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBQcmVzcyBFc2NhcGUgdG8gY2xvc2UgbW9kYWxzJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZTonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIHF1aWNrIHNlYXJjaCBtb2RhbFxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlUXVpY2tTZWFyY2hNb2RhbCgpIHtcbiAgICBxdWlja1NlYXJjaE1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcXVpY2tTZWFyY2hNb2RhbC5pZCA9ICdxdWljay1zZWFyY2gtbW9kYWwnO1xuICAgIHF1aWNrU2VhcmNoTW9kYWwuY2xhc3NOYW1lID0gJ3F1aWNrLXNlYXJjaC1tb2RhbCc7XG4gICAgcXVpY2tTZWFyY2hNb2RhbC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaWNvblwiPlx1RDgzRFx1REQwRDwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInF1aWNrLXNlYXJjaC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHNlcnZpY2VzLCBhcHBzLCBvciBhY3Rpb25zLi4uXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtc2hvcnRjdXRcIj5FU0M8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwicXVpY2stc2VhcmNoLXJlc3VsdHNcIiBjbGFzcz1cInF1aWNrLXNlYXJjaC1yZXN1bHRzXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtZm9vdGVyXCI+XG4gICAgICAgICAgPHNwYW4+PGtiZD5cdTIxOTFcdTIxOTM8L2tiZD4gTmF2aWdhdGU8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PGtiZD5FbnRlcjwva2JkPiBTZWxlY3Q8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PGtiZD5Fc2M8L2tiZD4gQ2xvc2U8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIC8vIEFkZCBzdHlsZXNcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgICAucXVpY2stc2VhcmNoLW1vZGFsIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICBib3R0b206IDA7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC43KTtcbiAgICAgICAgei1pbmRleDogMTAwMDAwO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIHBhZGRpbmctdG9wOiAxNXZoO1xuICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1tb2RhbC5zaG93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1jb250ZW50IHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlLCAjMWExYTJlKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLCAjMzMzKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICAgICAgd2lkdGg6IDkwJTtcbiAgICAgICAgbWF4LXdpZHRoOiA2MDBweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCAyNXB4IDUwcHggLTEycHggcmdiYSgwLCAwLCAwLCAwLjUpO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWlucHV0LXdyYXBwZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBwYWRkaW5nOiAxNnB4IDIwcHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIsICMzMzMpO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaWNvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICAgICAgb3BhY2l0eTogMC42O1xuICAgICAgfVxuXG4gICAgICAjcXVpY2stc2VhcmNoLWlucHV0IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgY29sb3I6IHZhcigtLWZnLCAjZmZmKTtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICAgIH1cblxuICAgICAgI3F1aWNrLXNlYXJjaC1pbnB1dDo6cGxhY2Vob2xkZXIge1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLXNob3J0Y3V0IHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3ZlciwgIzJhMmE0ZSk7XG4gICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLXJlc3VsdHMge1xuICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1jYXRlZ29yeSB7XG4gICAgICAgIHBhZGRpbmc6IDhweCAyMHB4O1xuICAgICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzY2Nik7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtaG92ZXIsICMyYTJhNGUpO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMjBweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbTpob3ZlcixcbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS5zZWxlY3RlZCB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCwgIzM0OThkYik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1pY29uIHtcbiAgICAgICAgZm9udC1zaXplOiAyNHB4O1xuICAgICAgICB3aWR0aDogMzJweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWl0ZW0tY29udGVudCB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS10aXRsZSB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1mZywgI2ZmZik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjYWFhKTtcbiAgICAgICAgbWFyZ2luLXRvcDogMnB4O1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWl0ZW0tYmFkZ2Uge1xuICAgICAgICBwYWRkaW5nOiAycHggOHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3ZlciwgIzJhMmE0ZSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzg4OCk7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtZW1wdHkge1xuICAgICAgICBwYWRkaW5nOiA0MHB4IDIwcHg7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjNjY2KTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1mb290ZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAyNHB4O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDIwcHg7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIsICMzMzMpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWhvdmVyLCAjMmEyYTRlKTtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWZvb3RlciBrYmQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMxYTFhMmUpO1xuICAgICAgICBwYWRkaW5nOiAycHggNnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgfVxuICAgIGA7XG5cbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHF1aWNrU2VhcmNoTW9kYWwpO1xuXG4gICAgcXVpY2tTZWFyY2hJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWljay1zZWFyY2gtaW5wdXQnKTtcbiAgICBxdWlja1NlYXJjaFJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpY2stc2VhcmNoLXJlc3VsdHMnKTtcblxuICAgIC8vIElucHV0IGhhbmRsaW5nXG4gICAgcXVpY2tTZWFyY2hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGhhbmRsZVNlYXJjaElucHV0KTtcbiAgICBxdWlja1NlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVTZWFyY2hLZXlEb3duKTtcblxuICAgIC8vIENsb3NlIG9uIGJhY2tkcm9wIGNsaWNrXG4gICAgcXVpY2tTZWFyY2hNb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQgPT09IHF1aWNrU2VhcmNoTW9kYWwpIHtcbiAgICAgICAgY2xvc2VRdWlja1NlYXJjaCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBnbG9iYWwga2V5ZG93biBldmVudHNcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBDdHJsK0sgb3IgQ21kK0sgdG8gb3BlbiBxdWljayBzZWFyY2hcbiAgICAgIGlmICgoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkgJiYgZS5rZXkgPT09ICdrJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9wZW5RdWlja1NlYXJjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEVzY2FwZSB0byBjbG9zZSBtb2RhbHNcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgcXVpY2sgc2VhcmNoIGlzIG9wZW5cbiAgICAgICAgaWYgKHF1aWNrU2VhcmNoTW9kYWwgJiYgcXVpY2tTZWFyY2hNb2RhbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSkge1xuICAgICAgICAgIGNsb3NlUXVpY2tTZWFyY2goKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVuIGNsb3NlIGFueSBvdGhlciBvcGVuIG1vZGFsXG4gICAgICAgIGNsb3NlVG9wTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlMikge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBFcnJvciBoYW5kbGluZyBrZXlkb3duOicsIGUyLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHF1aWNrIHNlYXJjaCBtb2RhbFxuICAgKi9cbiAgZnVuY3Rpb24gb3BlblF1aWNrU2VhcmNoKCkge1xuICAgIHRyeSB7XG4gICAgICBxdWlja1NlYXJjaE1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIHF1aWNrU2VhcmNoSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHF1aWNrU2VhcmNoSW5wdXQuZm9jdXMoKTtcbiAgICAgIHNob3dEZWZhdWx0UmVzdWx0cygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0tleWJvYXJkIFNob3J0Y3V0c10gRXJyb3Igb3BlbmluZyBxdWljayBzZWFyY2g6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgcXVpY2sgc2VhcmNoIG1vZGFsXG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZVF1aWNrU2VhcmNoKCkge1xuICAgIHRyeSB7XG4gICAgICBxdWlja1NlYXJjaE1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIHF1aWNrU2VhcmNoSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHF1aWNrU2VhcmNoUmVzdWx0cy5pbm5lckhUTUwgPSAnJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGNsb3NpbmcgcXVpY2sgc2VhcmNoOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSB0b3Btb3N0IG9wZW4gbW9kYWxcbiAgICovXG4gIGZ1bmN0aW9uIGNsb3NlVG9wTW9kYWwoKSB7XG4gICAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBNT0RBTF9TRUxFQ1RPUlMpIHtcbiAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICBpZiAobW9kYWwgJiYgKG1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpIHx8IG1vZGFsLnN0eWxlLmRpc3BsYXkgPT09ICdmbGV4JykpIHtcbiAgICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgICBtb2RhbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgZGVmYXVsdC9zdWdnZXN0ZWQgcmVzdWx0c1xuICAgKi9cbiAgZnVuY3Rpb24gc2hvd0RlZmF1bHRSZXN1bHRzKCkge1xuICAgIGNvbnN0IGh0bWwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWNhdGVnb3J5XCI+UXVpY2sgQWN0aW9uczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJyZWZyZXNoXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPlx1RDgzRFx1REQwNDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj5SZWZyZXNoIERhc2hib2FyZDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPlJlZnJlc2ggYWxsIHNlcnZpY2Ugc3RhdHVzZXM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbVwiIGRhdGEtYWN0aW9uPVwicmVsb2FkLWNhZGR5XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPlx1MjZBMTwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj5SZWxvYWQgQ2FkZHk8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tZGVzY3JpcHRpb25cIj5SZWxvYWQgQ2FkZHkgY29uZmlndXJhdGlvbjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJhZGQtc2VydmljZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj5cdTI3OTU8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+QWRkIFNlcnZpY2U8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tZGVzY3JpcHRpb25cIj5PcGVuIHNlcnZpY2UgY29uZmlndXJhdGlvbiBtb2RhbDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJhcHAtc2VsZWN0b3JcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+XHVEODNEXHVEQ0YxPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS10aXRsZVwiPkFwcCBTZWxlY3RvcjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPkRlcGxveSBuZXcgYXBwbGljYXRpb25zPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY2F0ZWdvcnlcIj5TZXJ2aWNlczwvZGl2PlxuICAgICAgJHtnZXRTZXJ2aWNlSXRlbXMoKX1cbiAgICBgO1xuXG4gICAgcXVpY2tTZWFyY2hSZXN1bHRzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgYXR0YWNoUmVzdWx0TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlcnZpY2UgaXRlbXMgZnJvbSB0aGUgZGFzaGJvYXJkXG4gICAqL1xuICBmdW5jdGlvbiBnZXRTZXJ2aWNlSXRlbXMoKSB7XG4gICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyZFtkYXRhLWFwcF0sICNjYXJkcyAuY2FyZCcpO1xuICAgIGxldCBodG1sID0gJyc7XG5cbiAgICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLm5hbWUnKT8udGV4dENvbnRlbnQgfHwgJ1Vua25vd24nO1xuICAgICAgY29uc3Qgc3RhdHVzID0gY2FyZC5kYXRhc2V0LnN0YXR1cyB8fCAndW5rbm93bic7XG4gICAgICBjb25zdCBhcHAgPSBjYXJkLmRhdGFzZXQuYXBwIHx8ICcnO1xuXG4gICAgICBpZiAobmFtZSAmJiBuYW1lICE9PSAnLS0nKSB7XG4gICAgICAgIGh0bWwgKz0gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbVwiIGRhdGEtYWN0aW9uPVwib3Blbi1zZXJ2aWNlXCIgZGF0YS1zZXJ2aWNlPVwiJHthcHB9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj4ke3N0YXR1cyA9PT0gJ29uJyA/ICdcdUQ4M0RcdURGRTInIDogJ1x1RDgzRFx1REQzNCd9PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+JHtuYW1lfTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tZGVzY3JpcHRpb25cIj5DbGljayB0byBvcGVuIHNlcnZpY2U8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1iYWRnZVwiPiR7c3RhdHVzLnRvVXBwZXJDYXNlKCl9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGh0bWwgfHwgJzxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtZW1wdHlcIj5ObyBzZXJ2aWNlcyBmb3VuZDwvZGl2Pic7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHNlYXJjaCBpbnB1dFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlU2VhcmNoSW5wdXQoZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeSA9IGUudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICAgIHNob3dEZWZhdWx0UmVzdWx0cygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNlYXJjaCB0aHJvdWdoIHNlcnZpY2VzIGFuZCBhY3Rpb25zXG4gICAgICBjb25zdCByZXN1bHRzID0gc2VhcmNoQWxsKHF1ZXJ5KTtcbiAgICAgIGRpc3BsYXlTZWFyY2hSZXN1bHRzKHJlc3VsdHMpO1xuICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGhhbmRsaW5nIHNlYXJjaCBpbnB1dDonLCBlMi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGFsbCBpdGVtc1xuICAgKi9cbiAgZnVuY3Rpb24gc2VhcmNoQWxsKHF1ZXJ5KSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IHtcbiAgICAgIGFjdGlvbnM6IFtdLFxuICAgICAgc2VydmljZXM6IFtdXG4gICAgfTtcblxuICAgIC8vIFNlYXJjaCBhY3Rpb25zXG4gICAgY29uc3QgYWN0aW9ucyA9IFtcbiAgICAgIHsgaWQ6ICdyZWZyZXNoJywgdGl0bGU6ICdSZWZyZXNoIERhc2hib2FyZCcsIGljb246ICdcdUQ4M0RcdUREMDQnLCBrZXl3b3JkczogJ3JlZnJlc2ggcmVsb2FkIHVwZGF0ZSBzdGF0dXMnIH0sXG4gICAgICB7IGlkOiAncmVsb2FkLWNhZGR5JywgdGl0bGU6ICdSZWxvYWQgQ2FkZHknLCBpY29uOiAnXHUyNkExJywga2V5d29yZHM6ICdyZWxvYWQgY2FkZHkgcHJveHkgY29uZmlnJyB9LFxuICAgICAgeyBpZDogJ2FkZC1zZXJ2aWNlJywgdGl0bGU6ICdBZGQgU2VydmljZScsIGljb246ICdcdTI3OTUnLCBrZXl3b3JkczogJ2FkZCBuZXcgc2VydmljZSBjcmVhdGUnIH0sXG4gICAgICB7IGlkOiAnYXBwLXNlbGVjdG9yJywgdGl0bGU6ICdBcHAgU2VsZWN0b3InLCBpY29uOiAnXHVEODNEXHVEQ0YxJywga2V5d29yZHM6ICdhcHAgZGVwbG95IGluc3RhbGwgZG9ja2VyIGNvbnRhaW5lcicgfSxcbiAgICAgIHsgaWQ6ICdiYWNrdXAnLCB0aXRsZTogJ0JhY2t1cCAmIFJlc3RvcmUnLCBpY29uOiAnXHVEODNEXHVEQ0JFJywga2V5d29yZHM6ICdiYWNrdXAgcmVzdG9yZSBleHBvcnQgaW1wb3J0JyB9LFxuICAgICAgeyBpZDogJ3N0YXRzJywgdGl0bGU6ICdDb250YWluZXIgU3RhdHMnLCBpY29uOiAnXHVEODNEXHVEQ0NBJywga2V5d29yZHM6ICdzdGF0cyByZXNvdXJjZXMgY3B1IG1lbW9yeScgfSxcbiAgICAgIHsgaWQ6ICdsb2dzJywgdGl0bGU6ICdWaWV3IExvZ3MnLCBpY29uOiAnXHVEODNEXHVEQ0NCJywga2V5d29yZHM6ICdsb2dzIGVycm9yIGRlYnVnJyB9LFxuICAgICAgeyBpZDogJ3Rva2VucycsIHRpdGxlOiAnTWFuYWdlIFRva2VucycsIGljb246ICdcdUQ4M0RcdUREMTEnLCBrZXl3b3JkczogJ3Rva2VucyBhcGkga2V5cyBjcmVkZW50aWFscycgfSxcbiAgICAgIHsgaWQ6ICdub3RpZmljYXRpb25zJywgdGl0bGU6ICdOb3RpZmljYXRpb25zJywgaWNvbjogJ1x1RDgzRFx1REQxNCcsIGtleXdvcmRzOiAnYWxlcnRzIG5vdGlmaWNhdGlvbnMgZGlzY29yZCB0ZWxlZ3JhbScgfSxcbiAgICAgIHsgaWQ6ICd0aGVtZScsIHRpdGxlOiAnQ2hhbmdlIFRoZW1lJywgaWNvbjogJ1x1RDgzQ1x1REZBOCcsIGtleXdvcmRzOiAndGhlbWUgZGFyayBsaWdodCBhcHBlYXJhbmNlJyB9LFxuICAgICAgeyBpZDogJ3RvdXInLCB0aXRsZTogJ0hlbHAgVG91cicsIGljb246ICdcdUQ4M0NcdURGOTMnLCBrZXl3b3JkczogJ2hlbHAgdG91ciBndWlkZSBvbmJvYXJkaW5nJyB9XG4gICAgXTtcblxuICAgIGFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgaWYgKGFjdGlvbi50aXRsZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSB8fCBhY3Rpb24ua2V5d29yZHMuaW5jbHVkZXMocXVlcnkpKSB7XG4gICAgICAgIHJlc3VsdHMuYWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTZWFyY2ggc2VydmljZXNcbiAgICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJkW2RhdGEtYXBwXSwgI2NhcmRzIC5jYXJkJyk7XG4gICAgY2FyZHMuZm9yRWFjaChjYXJkID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5uYW1lJyk/LnRleHRDb250ZW50IHx8ICcnO1xuICAgICAgY29uc3QgYXBwID0gY2FyZC5kYXRhc2V0LmFwcCB8fCAnJztcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGNhcmQuZGF0YXNldC5zdGF0dXMgfHwgJ3Vua25vd24nO1xuXG4gICAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSB8fCBhcHAudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpIHtcbiAgICAgICAgcmVzdWx0cy5zZXJ2aWNlcy5wdXNoKHtcbiAgICAgICAgICBpZDogYXBwLFxuICAgICAgICAgIHRpdGxlOiBuYW1lLFxuICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgIGljb246IHN0YXR1cyA9PT0gJ29uJyA/ICdcdUQ4M0RcdURGRTInIDogJ1x1RDgzRFx1REQzNCdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHNlYXJjaCByZXN1bHRzXG4gICAqL1xuICBmdW5jdGlvbiBkaXNwbGF5U2VhcmNoUmVzdWx0cyhyZXN1bHRzKSB7XG4gICAgbGV0IGh0bWwgPSAnJztcblxuICAgIGlmIChyZXN1bHRzLmFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1jYXRlZ29yeVwiPkFjdGlvbnM8L2Rpdj4nO1xuICAgICAgcmVzdWx0cy5hY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCIke2FjdGlvbi5pZH1cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPiR7YWN0aW9uLmljb259PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+JHthY3Rpb24udGl0bGV9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHRzLnNlcnZpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY2F0ZWdvcnlcIj5TZXJ2aWNlczwvZGl2Pic7XG4gICAgICByZXN1bHRzLnNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgIGh0bWwgKz0gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbVwiIGRhdGEtYWN0aW9uPVwib3Blbi1zZXJ2aWNlXCIgZGF0YS1zZXJ2aWNlPVwiJHtzZXJ2aWNlLmlkfVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+JHtzZXJ2aWNlLmljb259PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+JHtzZXJ2aWNlLnRpdGxlfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWJhZGdlXCI+JHtzZXJ2aWNlLnN0YXR1cy50b1VwcGVyQ2FzZSgpfTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghaHRtbCkge1xuICAgICAgaHRtbCA9ICc8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWVtcHR5XCI+Tm8gcmVzdWx0cyBmb3VuZDwvZGl2Pic7XG4gICAgfVxuXG4gICAgcXVpY2tTZWFyY2hSZXN1bHRzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgYXR0YWNoUmVzdWx0TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGNsaWNrIGxpc3RlbmVycyB0byByZXN1bHQgaXRlbXNcbiAgICovXG4gIGZ1bmN0aW9uIGF0dGFjaFJlc3VsdExpc3RlbmVycygpIHtcbiAgICBjb25zdCBpdGVtcyA9IHF1aWNrU2VhcmNoUmVzdWx0cy5xdWVyeVNlbGVjdG9yQWxsKCcucXVpY2stc2VhcmNoLWl0ZW0nKTtcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGV4ZWN1dGVBY3Rpb24oaXRlbSkpO1xuXG4gICAgICAvLyBTZWxlY3QgZmlyc3QgaXRlbSBieSBkZWZhdWx0XG4gICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBrZXlib2FyZCBuYXZpZ2F0aW9uIGluIHNlYXJjaFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlU2VhcmNoS2V5RG93bihlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gcXVpY2tTZWFyY2hSZXN1bHRzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdWljay1zZWFyY2gtaXRlbScpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBxdWlja1NlYXJjaFJlc3VsdHMucXVlcnlTZWxlY3RvcignLnF1aWNrLXNlYXJjaC1pdGVtLnNlbGVjdGVkJyk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gQXJyYXkuZnJvbShpdGVtcykuaW5kZXhPZihzZWxlY3RlZCk7XG5cbiAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoc2VsZWN0ZWQpIHNlbGVjdGVkLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IChzZWxlY3RlZEluZGV4ICsgMSkgJSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIGl0ZW1zW25leHRJbmRleF0/LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICAgIGl0ZW1zW25leHRJbmRleF0/LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChzZWxlY3RlZCkgc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgY29uc3QgcHJldkluZGV4ID0gc2VsZWN0ZWRJbmRleCA8PSAwID8gaXRlbXMubGVuZ3RoIC0gMSA6IHNlbGVjdGVkSW5kZXggLSAxO1xuICAgICAgICBpdGVtc1twcmV2SW5kZXhdPy5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICBpdGVtc1twcmV2SW5kZXhdPy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgZXhlY3V0ZUFjdGlvbihzZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlMikge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBFcnJvciBoYW5kbGluZyBzZWFyY2ggbmF2aWdhdGlvbjonLCBlMi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhbiBhY3Rpb24gZnJvbSBxdWljayBzZWFyY2hcbiAgICovXG4gIGZ1bmN0aW9uIGV4ZWN1dGVBY3Rpb24oaXRlbSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBpdGVtLmRhdGFzZXQuYWN0aW9uO1xuICAgICAgY29uc3Qgc2VydmljZSA9IGl0ZW0uZGF0YXNldC5zZXJ2aWNlO1xuXG4gICAgICBjbG9zZVF1aWNrU2VhcmNoKCk7XG5cbiAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3JlZnJlc2gnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZyZXNoJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JlbG9hZC1jYWRkeSc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYWRkLXNlcnZpY2UnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZScpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdhcHAtc2VsZWN0b3InOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZS1idG4nKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYmFja3VwJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXJlc3RvcmUtYnRuJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3N0YXRzJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyLXN0YXRzLWJ0bicpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsb2dzJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1lcnJvci1sb2dzJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Rva2Vucyc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS10b2tlbnMnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbm90aWZpY2F0aW9ucyc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS1ub3RpZmljYXRpb25zJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RoZW1lJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG91cic6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3RhcnQtdG91ci1idG4nKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb3Blbi1zZXJ2aWNlJzpcbiAgICAgICAgICBpZiAoc2VydmljZSkge1xuICAgICAgICAgICAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFwcD1cIiR7c2VydmljZX1cIl0gW2lkJD1cIi1vcGVuXCJdLCBbZGF0YS1hcHA9XCIke3NlcnZpY2V9XCJdIGJ1dHRvbjpub3QoLnJlc3RhcnQtYnRuKTpub3QoLmxvZ3MtYnRuKTpub3QoLnNldHRpbmdzLWJ0bilgKTtcbiAgICAgICAgICAgIGlmIChvcGVuQnRuKSB7XG4gICAgICAgICAgICAgIG9wZW5CdG4uY2xpY2soKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRyeSB0byBmaW5kIHRoZSBjYXJkIGFuZCBjbGljayBpdFxuICAgICAgICAgICAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXBwPVwiJHtzZXJ2aWNlfVwiXWApO1xuICAgICAgICAgICAgICBpZiAoY2FyZCkgY2FyZC5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBkZWJ1ZygnW0tleWJvYXJkIFNob3J0Y3V0c10gVW5rbm93biBhY3Rpb246JywgYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGV4ZWN1dGluZyBhY3Rpb246JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvLyBJbml0aWFsaXplIHdoZW4gRE9NIGlzIHJlYWR5XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdCk7XG4gIH0gZWxzZSB7XG4gICAgaW5pdCgpO1xuICB9XG5cbiAgLy8gRXhwb3NlIHRvIGdsb2JhbCBzY29wZVxuICB3aW5kb3cuRGFzaENhZGR5S2V5Ym9hcmRTaG9ydGN1dHMgPSB7XG4gICAgb3BlblF1aWNrU2VhcmNoLFxuICAgIGNsb3NlUXVpY2tTZWFyY2hcbiAgfTtcblxufSkoKTtcbiJdLAogICJtYXBwaW5ncyI6ICJDQUNDLFVBQVksQ0FFWCxTQUFTQSxHQUFxQixDQUM1QixNQUFNQyxFQUFpQixRQUFRLGlCQUFpQixFQUNoRCxHQUFJQSxFQUNGLEdBQUksQ0FDZSxLQUFLLE1BQU1BLENBQWMsRUFFakMsUUFBUUMsR0FBVyxDQUNyQixPQUFPLEtBQUssS0FBS0MsR0FBT0EsRUFBSSxLQUFPRCxFQUFRLEVBQUUsR0FDaEQsT0FBTyxLQUFLLEtBQUtBLENBQU8sQ0FFNUIsQ0FBQyxDQUNILE9BQVNFLEVBQUcsQ0FDVixRQUFRLEtBQUssa0NBQW1DQSxDQUFDLENBQ25ELENBRUosQ0FHQUosRUFBbUIsRUFHbkIsU0FBU0ssR0FBa0IsQ0FDekIsTUFBTUMsRUFBVyxTQUFTLGlCQUFpQixZQUFZLEVBQ3ZEQSxFQUFTLFFBQVEsQ0FBQ0MsRUFBTUMsSUFBVSxDQUNoQ0QsRUFBSyxNQUFNLGdCQUFrQixHQUFHLEtBQUssSUFBSUMsRUFBUSxHQUFJLEdBQUcsQ0FBQyxJQUMzRCxDQUFDLEVBQ0Qsc0JBQXNCLElBQU0sQ0FDMUJGLEVBQVMsUUFBUUMsR0FBUUEsRUFBSyxVQUFVLElB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Z0RBLEVBQUUsT0FBTyxDQUN4RSxDQUNGLENBR0ksU0FBUyxhQUFlLFVBQzFCLFNBQVMsaUJBQWlCLG1CQUFvQjZGLENBQUksRUFFbERBLEVBQUssRUFJUCxPQUFPLDJCQUE2QixDQUNsQyxnQkFBQU8sRUFDQSxpQkFBQUQsQ0FDRixDQUVGLEdBQUciLAogICJuYW1lcyI6IFsibG9hZEN1c3RvbVNlcnZpY2VzIiwgImN1c3RvbVNlcnZpY2VzIiwgInNlcnZpY2UiLCAiYXBwIiwgImUiLCAiYW5pbWF0ZVRvcENhcmRzIiwgInRvcENhcmRzIiwgImNhcmQiLCAiaW5kZXgiLCAicmVnaXN0ZXJTZXJ2aWNlV29ya2VyIiwgInJlZ2lzdGVyIiwgImVycm9yIiwgIl9kYXNoYm9hcmRJbml0aWFsaXplZCIsICJpbml0aWFsaXplRGFzaGJvYXJkIiwgImxvYWRUZW1wbGF0ZUNhdGVnb3JpZXMiLCAiZCIsICJhZGRUb3VyQnV0dG9uIiwgInNob3VsZExvYWRPbmJvYXJkaW5nIiwgImxvYWRPbmJvYXJkaW5nIiwgInMiLCAibGluayIsICJkYXRhIiwgImluaXRUb29sYmFyU2VjdGlvbnMiLCAic2VjdGlvbnMiLCAic2F2ZWQiLCAic2VjdGlvbiIsICJrZXkiLCAiaGVhZGVyIiwgImlzT3BlbiIsICJzdGF0ZSIsICJ0b3VyRG9uZSIsICJ0YXJnZXQiLCAiYnV0dG9uIiwgImNoZWNrIiwgInIiLCAicG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMiLCAiY2F0cyIsICJzZWxlY3QiLCAiY3VycmVudCIsICJwbGFjZWhvbGRlciIsICJwaCIsICJuYW1lIiwgImluZm8iLCAib3B0IiwgInRvdHBEYXRhIiwgInN0eWxlRWwiLCAiZmlsdGVyQmFyIiwgInBhbmVsIiwgInNldEJhciIsICJpZCIsICJwY3QiLCAiZWwiLCAicCIsICJmbXRQY3QiLCAidiIsICJmbXRCeXRlcyIsICJiIiwgInVuaXRzIiwgImkiLCAic2V0U2VydmljZXNDYXJkIiwgInRvdGFsIiwgInVwIiwgImMiLCAic3ViIiwgImFwcGx5SGVhbHRoU3VtbWFyeSIsICJoZWFsdGh5IiwgInVuaGVhbHRoeSIsICJmZXRjaFN0YXRzIiwgImZldGNoSGVhbHRoIiwgImFwcGx5U3RhdHMiLCAic3RhdHMiLCAiY29udGFpbmVycyIsICJjb250YWluZXJzU3ViIiwgImNwdUVsIiwgIm1lbUVsIiwgImVudHJpZXMiLCAiY3B1U3VtIiwgIm1lbVN1bSIsICJtZW1CeXRlcyIsICJjcHVDb3VudCIsICJtZW1Db3VudCIsICJjcHUiLCAibWVtIiwgImF2Z0NwdSIsICJhdmdNZW0iLCAibWVtVHh0IiwgImluRmxpZ2h0IiwgInJlZnJlc2giLCAiaGVhbHRoIiwgInN0YW1wIiwgIm5vdyIsICJkZWJ1ZyIsICJhcmdzIiwgIk1PREFMX1NFTEVDVE9SUyIsICJxdWlja1NlYXJjaE1vZGFsIiwgInF1aWNrU2VhcmNoSW5wdXQiLCAicXVpY2tTZWFyY2hSZXN1bHRzIiwgImluaXQiLCAiY3JlYXRlUXVpY2tTZWFyY2hNb2RhbCIsICJoYW5kbGVLZXlEb3duIiwgInN0eWxlIiwgImhhbmRsZVNlYXJjaElucHV0IiwgImhhbmRsZVNlYXJjaEtleURvd24iLCAiY2xvc2VRdWlja1NlYXJjaCIsICJvcGVuUXVpY2tTZWFyY2giLCAiY2xvc2VUb3BNb2RhbCIsICJlMiIsICJzaG93RGVmYXVsdFJlc3VsdHMiLCAic2VsZWN0b3IiLCAibW9kYWwiLCAiaHRtbCIsICJnZXRTZXJ2aWNlSXRlbXMiLCAiYXR0YWNoUmVzdWx0TGlzdGVuZXJzIiwgImNhcmRzIiwgInN0YXR1cyIsICJxdWVyeSIsICJyZXN1bHRzIiwgInNlYXJjaEFsbCIsICJkaXNwbGF5U2VhcmNoUmVzdWx0cyIsICJhY3Rpb24iLCAiaXRlbSIsICJleGVjdXRlQWN0aW9uIiwgIml0ZW1zIiwgInNlbGVjdGVkIiwgInNlbGVjdGVkSW5kZXgiLCAibmV4dEluZGV4IiwgInByZXZJbmRleCIsICJvcGVuQnRuIl0KfQo= diff --git a/status/js/auth-gate.js b/status/js/auth-gate.js index 3a4e11c..2809292 100644 --- a/status/js/auth-gate.js +++ b/status/js/auth-gate.js @@ -287,7 +287,11 @@ async function resumeExistingSession(returnUrl) { if (!returnUrl || !isAllowedReturnUrl(returnUrl)) return false; try { - const res = await fetch('/api/v1/auth/sso-handoff', { + const parsedReturn = new URL(returnUrl, window.location.origin); + const suffix = SITE.tld.startsWith('.') ? SITE.tld : `.${SITE.tld}`; + const serviceId = parsedReturn.hostname.slice(0, -suffix.length); + if (!/^[a-z0-9][a-z0-9-]*$/.test(serviceId)) return false; + const res = await fetch(`/api/v1/auth/sso-handoff?serviceId=${encodeURIComponent(serviceId)}`, { credentials: 'include', cache: 'no-store', }); diff --git a/status/js/core/credentials.js b/status/js/core/credentials.js index c17ba4b..d210927 100644 --- a/status/js/core/credentials.js +++ b/status/js/core/credentials.js @@ -33,6 +33,20 @@ return server?.name || dnsId.toUpperCase(); } + async function requireSuccessfulDnsMutation(response, label) { + if (!response) throw new Error(`${label} failed: no response`); + let data; + try { + data = await response.json(); + } catch (_) { + throw new Error(`${label} failed: invalid server response`); + } + if (!response.ok || data?.success !== true) { + throw new Error(data?.error || `${label} failed (${response.status || 'unknown status'})`); + } + return data; + } + /** Build per-server credential form sections from SITE.dnsServers */ function buildCredentialSections() { const container = document.getElementById('dns-cred-sections'); @@ -258,14 +272,6 @@ document.getElementById('token-save')?.addEventListener('click', async () => { const dnsIds = getDnsIds(); - // Save all to localStorage - dnsIds.forEach(dnsId => { - setUsername(dnsId, 'readonly', document.getElementById(`${dnsId}-readonly-username`).value.trim()); - setToken(dnsId, 'readonly', document.getElementById(`${dnsId}-readonly-token`).value.trim()); - setUsername(dnsId, 'admin', document.getElementById(`${dnsId}-admin-username`).value.trim()); - setToken(dnsId, 'admin', document.getElementById(`${dnsId}-admin-token`).value.trim()); - }); - // Build per-server credentials payload for backend sync const servers = {}; let hasAnyCreds = false; @@ -304,45 +310,36 @@ headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ servers }) }); - const data = await res.json(); - + const data = await requireSuccessfulDnsMutation(res, 'DNS credential save'); if (data.results) { - dnsIds.forEach(dnsId => { - const statusEl = document.getElementById(`${dnsId}-token-status`); - if (!servers[dnsId]) { statusEl.textContent = ''; return; } - const result = data.results[dnsId]; - if (result?.success) { - statusEl.textContent = '\u2713 Verified & saved'; - statusEl.className = 'token-status success'; - } else if (result?.partial) { - statusEl.textContent = '\u2713 ' + result.partial; - statusEl.className = 'token-status success'; - } else { - statusEl.textContent = '\u2717 ' + (result?.error || 'Login failed'); - statusEl.className = 'token-status error'; - } - }); - } else if (data.success) { - dnsIds.forEach(dnsId => { - if (servers[dnsId]) { - document.getElementById(`${dnsId}-token-status`).textContent = '\u2713 Saved'; - document.getElementById(`${dnsId}-token-status`).className = 'token-status success'; - } - }); - } else { - dnsIds.forEach(dnsId => { - if (servers[dnsId]) { - document.getElementById(`${dnsId}-token-status`).textContent = '\u2717 ' + (data.error || 'Failed'); - document.getElementById(`${dnsId}-token-status`).className = 'token-status error'; - } - }); + const failed = Object.keys(servers).filter(dnsId => data.results[dnsId]?.success !== true); + if (failed.length) { + const details = failed.map(dnsId => data.results[dnsId]?.error || `${dnsId} failed`).join('; '); + throw new Error(details); + } } + + // Cache locally only after the encrypted server vault confirms success. + dnsIds.forEach(dnsId => { + setUsername(dnsId, 'readonly', document.getElementById(`${dnsId}-readonly-username`).value.trim()); + setToken(dnsId, 'readonly', document.getElementById(`${dnsId}-readonly-token`).value.trim()); + setUsername(dnsId, 'admin', document.getElementById(`${dnsId}-admin-username`).value.trim()); + setToken(dnsId, 'admin', document.getElementById(`${dnsId}-admin-token`).value.trim()); + }); + + dnsIds.forEach(dnsId => { + const statusEl = document.getElementById(`${dnsId}-token-status`); + if (!servers[dnsId]) { statusEl.textContent = ''; return; } + const result = data.results?.[dnsId]; + statusEl.textContent = result?.partial ? '\u2713 ' + result.partial : '\u2713 Verified & saved'; + statusEl.className = 'token-status success'; + }); } catch (e) { console.error('Failed to sync DNS credentials to backend:', e); dnsIds.forEach(dnsId => { if (servers[dnsId]) { - document.getElementById(`${dnsId}-token-status`).textContent = '\u2713 Saved locally (sync failed)'; - document.getElementById(`${dnsId}-token-status`).className = 'token-status'; + document.getElementById(`${dnsId}-token-status`).textContent = '\u2717 ' + (e.message || 'Save failed'); + document.getElementById(`${dnsId}-token-status`).className = 'token-status error'; } }); } @@ -368,18 +365,24 @@ document.getElementById('token-clear-all')?.addEventListener('click', async () => { if (confirm('Clear all stored DNS credentials? This cannot be undone.')) { - clearAllCredentials(); - getDnsIds().forEach(dnsId => { - document.getElementById(`${dnsId}-readonly-username`).value = ''; - document.getElementById(`${dnsId}-readonly-token`).value = ''; - document.getElementById(`${dnsId}-admin-username`).value = ''; - document.getElementById(`${dnsId}-admin-token`).value = ''; - document.getElementById(`${dnsId}-token-status`).textContent = '\u2713 Cleared'; - document.getElementById(`${dnsId}-token-status`).className = 'token-status success'; - }); try { - await secureFetch('/api/v1/dns/credentials', { method: 'DELETE' }); - } catch (_) {} + const response = await secureFetch('/api/v1/dns/credentials', { method: 'DELETE' }); + await requireSuccessfulDnsMutation(response, 'DNS credential removal'); + clearAllCredentials(); + getDnsIds().forEach(dnsId => { + document.getElementById(`${dnsId}-readonly-username`).value = ''; + document.getElementById(`${dnsId}-readonly-token`).value = ''; + document.getElementById(`${dnsId}-admin-username`).value = ''; + document.getElementById(`${dnsId}-admin-token`).value = ''; + document.getElementById(`${dnsId}-token-status`).textContent = '\u2713 Cleared'; + document.getElementById(`${dnsId}-token-status`).className = 'token-status success'; + }); + } catch (e) { + getDnsIds().forEach(dnsId => { + document.getElementById(`${dnsId}-token-status`).textContent = '\u2717 ' + (e.message || 'Clear failed'); + document.getElementById(`${dnsId}-token-status`).className = 'token-status error'; + }); + } } }); diff --git a/status/js/core/init.js b/status/js/core/init.js index a53b380..6a30e86 100644 --- a/status/js/core/init.js +++ b/status/js/core/init.js @@ -61,6 +61,9 @@ await window.loadServices(); await loadTemplateCategories(); window.buildGrid(); + if (typeof window.openRequestedCredentialForm === 'function') { + window.openRequestedCredentialForm(); + } animateTopCards(); window.refreshAll(); setInterval(() => { diff --git a/status/js/credential-vault-handoff.js b/status/js/credential-vault-handoff.js new file mode 100644 index 0000000..546285f --- /dev/null +++ b/status/js/credential-vault-handoff.js @@ -0,0 +1,52 @@ +// ===== ENCRYPTED VAULT -> SERVICE SSO HANDOFF ===== +(function() { + function isAllowedReturnUrl(returnUrl, expectedServiceId) { + if (!returnUrl || !expectedServiceId || !/^[a-z0-9][a-z0-9-]*$/.test(expectedServiceId)) return false; + try { + const parsed = new URL(returnUrl, window.location.origin); + const suffix = SITE.tld.startsWith('.') ? SITE.tld : `.${SITE.tld}`; + const expectedHost = `${expectedServiceId}${suffix}`; + return parsed.protocol === 'https:' && parsed.hostname === expectedHost; + } catch (_) { + return false; + } + } + + function buildHandoffTarget(returnUrl, token, expectedServiceId) { + if (!isAllowedReturnUrl(returnUrl, expectedServiceId)) return null; + const parsed = new URL(returnUrl, window.location.origin); + if (!token) return null; + + const returnPath = `${parsed.pathname}${parsed.search}${parsed.hash}`; + // The shared (dashcaddy_auth) Caddy snippet installs this public landing + // route on every protected host. It rewrites to /api/v1/auth/sso-exchange. + parsed.pathname = '/dashcaddy-sso'; + parsed.search = ''; + parsed.hash = ''; + parsed.searchParams.set('token', token); + parsed.searchParams.set('return', returnPath); + return parsed.toString(); + } + + async function resume(returnUrl, expectedServiceId, runtime = {}) { + if (!isAllowedReturnUrl(returnUrl, expectedServiceId)) return false; + const fetchFn = runtime.fetch || window.fetch.bind(window); + const locationObj = runtime.location || window.location; + try { + const response = await fetchFn(`/api/v1/auth/sso-handoff?serviceId=${encodeURIComponent(expectedServiceId)}`, { + credentials: 'include', + cache: 'no-store', + }); + if (!response.ok) return false; + const data = await response.json(); + const target = data.success && buildHandoffTarget(returnUrl, data.ssoToken, expectedServiceId); + if (!target) return false; + locationObj.replace(target); + return true; + } catch (_) { + return false; + } + } + + window.DCCredentialVault = { isAllowedReturnUrl, buildHandoffTarget, resume }; +})(); \ No newline at end of file diff --git a/status/js/service-credentials.js b/status/js/service-credentials.js index 0186b74..72931da 100644 --- a/status/js/service-credentials.js +++ b/status/js/service-credentials.js @@ -32,8 +32,8 @@ injectModal('service-creds-modal', `
-

Service Credentials

-

Credentials are injected automatically when accessing this service.

+

Encrypted Credential Vault

+

Passwords are encrypted at rest and used automatically when you open this service.

@@ -91,7 +91,7 @@
', { + url: 'https://status.sami/', + runScripts: 'outside-only', + }); + const { window } = dom; + window.ErrorHandler = class { logError() {} }; + window.SITE = { tld: '.sami' }; + window.injectModal = (_id, html) => window.document.body.insertAdjacentHTML('beforeend', html); + window.fetch = async () => ({ + ok: true, + json: async () => ({ success: true, hasApiKey: false, hasBasicAuth: true, username: 'vault-user' }), + }); + window.secureFetch = async () => ({ + ok: false, + status: 500, + json: async () => ({ success: false, error: 'clear rejected' }), + }); + window.DCCredentialVault = { isAllowedReturnUrl: () => false }; + window.confirm = () => true; + window.eval(formSource); + + const service = { id: 'plex', name: 'Plex', appTemplate: 'plex', url: 'https://plex.sami' }; + await window.openServiceCredsModal(service); + window.document.getElementById('svc-creds-clear').click(); + await new Promise(resolve => setTimeout(resolve, 20)); + + assert.match(window.document.getElementById('svc-creds-error').textContent, /clear rejected/); + assert.equal(window.document.getElementById('creds-btn-plex').classList.contains('has-creds'), true); +}); + +test('handoff rejects a private-TLD host that is not the requested protected service', async () => { + const vault = loadVault(); + let fetchCalled = false; + const resumed = await vault.resume('https://dns1.sami/', 'plex', { + fetch: async () => { fetchCalled = true; }, + location: { replace: () => assert.fail('must not navigate') }, + }); + + assert.equal(resumed, false); + assert.equal(fetchCalled, false); +}); diff --git a/status/tests/dns-credential-vault.test.js b/status/tests/dns-credential-vault.test.js new file mode 100644 index 0000000..8356b88 --- /dev/null +++ b/status/tests/dns-credential-vault.test.js @@ -0,0 +1,67 @@ +const fs = require('node:fs'); +const path = require('node:path'); +const { JSDOM } = require('jsdom'); +const test = require('node:test'); +const assert = require('node:assert/strict'); + +const source = fs.readFileSync(path.join(__dirname, '..', 'js', 'core', 'credentials.js'), 'utf8'); + +function buildDnsCredentialUi() { + const dom = new JSDOM('', { + url: 'https://status.sami/', + runScripts: 'outside-only', + }); + const { window } = dom; + const local = new Map(); + const session = new Map(); + window.SITE = { dnsServers: { dns1: { name: 'Primary DNS' } } }; + window.injectModal = (_id, html) => window.document.body.insertAdjacentHTML('beforeend', html); + window.safeGet = key => local.get(key) || null; + window.safeSet = (key, value) => local.set(key, value); + window.safeRemove = key => local.delete(key); + window.safeSessionGet = key => session.get(key) || null; + window.safeSessionSet = (key, value) => session.set(key, value); + window.closeModal = () => {}; + window.confirm = () => true; + window.TextEncoder = TextEncoder; + window.setTimeout = () => 1; + window.eval(source); + window.document.getElementById('manage-tokens').click(); + return { window, local }; +} + +test('failed DNS credential save never populates browser cache or success UI', async () => { + const { window, local } = buildDnsCredentialUi(); + window.secureFetch = async () => ({ + ok: false, + status: 500, + json: async () => ({ success: false, error: 'DNS vault rejected' }), + }); + window.document.getElementById('dns1-admin-username').value = 'dns-admin'; + window.document.getElementById('dns1-admin-token').value = 'dns-password'; + window.document.getElementById('token-save').click(); + await new Promise(resolve => setTimeout(resolve, 20)); + + assert.equal(local.has('dns1-admin-username-enc'), false); + assert.equal(local.has('dns1-admin-token-enc'), false); + assert.match(window.document.getElementById('dns1-token-status').textContent, /DNS vault rejected/); + assert.equal(window.document.getElementById('dns1-token-status').classList.contains('success'), false); +}); + +test('failed DNS credential clear preserves cached state and shows error', async () => { + const { window, local } = buildDnsCredentialUi(); + local.set('dns1-admin-username-enc', 'existing-user'); + local.set('dns1-admin-token-enc', 'existing-password'); + window.secureFetch = async () => ({ + ok: true, + status: 200, + json: async () => ({ message: 'ambiguous response' }), + }); + window.document.getElementById('token-clear-all').click(); + await new Promise(resolve => setTimeout(resolve, 20)); + + assert.equal(local.has('dns1-admin-username-enc'), true); + assert.equal(local.has('dns1-admin-token-enc'), true); + assert.match(window.document.getElementById('dns1-token-status').textContent, /DNS credential removal failed/); + assert.equal(window.document.getElementById('dns1-token-status').classList.contains('success'), false); +});