From 7e4ee60dcfd214c3f4922510ebf65e5f74682f9f Mon Sep 17 00:00:00 2001 From: Hermes Date: Sat, 22 Aug 2026 18:16:47 -0700 Subject: [PATCH] =?UTF-8?q?[glm-grade=3DB]=20fix(notifications):=20repair?= =?UTF-8?q?=20UI/API=20contract=20drift=20=E2=80=94=20SMTP=20auth,=20event?= =?UTF-8?q?=20gate,=20test=20button=20(DC-092)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three user-facing notification features were silently dead from contract drift between the settings UI and the backend: 1. SMTP auth never applied: the UI sent email.user/email.pass while the manager read username/password. Route now normalizes aliases; legacy config files canonicalize at load. 2. Event toggles were cosmetic: UI sent camelCase keys (containerDown), the send() gate read kebab-case ('container-down'). EVENT_ALIASES now folds every known spelling (manager gate, route store, legacy files); UI sends and reads canonical keys. 3. Deploy/auto-restart notifications always dropped: deploy-success/ deploy-failed/auto-restart were missing from DEFAULT events, and send('test') was itself gated -> the Test button was a no-op. Defaults added; 'test' bypasses the gate. Also: strict boolean contract (string 'false' for secure/enabled rejected — previously coerced truthy, silently forcing TLS), SMTP port bounds, non-destructive credential merge (blank password no longer clobbers the stored one), GET /config returns port/secure/to/username + hasPassword (password never returned), full form prefill + keep-hint placeholder. Verified live pre-fix: send('test')/'deploymentSuccess'/'auto-restart' all returned 'not enabled'. Post-fix: +20 tests (route + manager), full suite 2641/2641 (112 suites). Judge: GLM-5.3 cold read via delegate_task (deleg_ad765d63), grade B, ship, zero blockers; judge independently ran the DC-092 suites (38/38). Polish #1 (canonical event for provider titles) folded in. Remaining emitters with the same gate-miss class (recipeRemoved, workflow, ssl-cert-expiry, dns-propagation, drift-detected, dependency-restart-*) noted for a follow-up tick. --- .../__tests__/notification-manager.test.js | 95 +++++++ .../routes/notifications-dc092.routes.test.js | 267 ++++++++++++++++++ dashcaddy-api/routes/notifications.js | 91 +++++- .../src/managers/notification-manager.js | 93 +++++- status/dist/features.js | 120 ++++---- status/js/notification-settings.js | 44 ++- status/sw.js | 2 +- 7 files changed, 620 insertions(+), 92 deletions(-) create mode 100644 dashcaddy-api/__tests__/routes/notifications-dc092.routes.test.js diff --git a/dashcaddy-api/__tests__/notification-manager.test.js b/dashcaddy-api/__tests__/notification-manager.test.js index 24f5939..4315a7c 100644 --- a/dashcaddy-api/__tests__/notification-manager.test.js +++ b/dashcaddy-api/__tests__/notification-manager.test.js @@ -214,4 +214,99 @@ describe('NotificationManager', () => { nm.stopHealthDaemon(); expect(nm.healthDaemonInterval).toBeNull(); }); + + // ── DC-092: event alias folding + legacy config canonicalization ────────── + + test('DC-092: send() folds camelCase aliases onto canonical kebab keys', async () => { + // deploymentSuccess (emitted by routes/apps/deploy.js) previously hit a + // gate miss (no such key in events) and the notification was dropped. + const result = await nm.send('deploymentSuccess', { text: 'deployed' }); + expect(result.error).toBeUndefined(); + expect(nm.getHistory()[0].event).toBe('deploy-success'); + }); + + test('DC-092: send() accepts the canonical kebab spelling too', async () => { + const result = await nm.send('deploy-success', { text: 'deployed' }); + expect(result.error).toBeUndefined(); + expect(nm.getHistory()[0].event).toBe('deploy-success'); + }); + + test("DC-092: send('test') bypasses the events gate (Test button works)", async () => { + const result = await nm.send('test', { text: 'Test Notification' }); + // No providers are enabled in the default config, so results is empty — + // but the gate must NOT return 'Event test not enabled' like it used to. + expect(result.error).toBeUndefined(); + expect(nm.getHistory()[0].event).toBe('test'); + }); + + test('DC-092: send() still gates unknown and disabled events', async () => { + const unknown = await nm.send('some-unknown-event', { text: 'x' }); + expect(unknown.success).toBe(false); + expect(unknown.error).toMatch(/not enabled/i); + + nm.config.events['container-down'] = false; + const disabled = await nm.send('container-down', { text: 'x' }); + expect(disabled.success).toBe(false); + expect(disabled.error).toMatch(/not enabled/i); + }); + + test('DC-092: DEFAULT_CONFIG includes deploy/auto-restart events', () => { + // Regression pin: these were absent entirely, so deploy notifications + // were dropped for every install regardless of UI toggles. + expect(nm.config.events['deploy-success']).toBe(true); + expect(nm.config.events['deploy-failed']).toBe(true); + expect(nm.config.events['auto-restart']).toBe(true); + }); + + test('DC-092: legacy config with user/pass and camelCase events canonicalizes on load', () => { + fs.existsSync.mockReturnValue(true); + fs.readFileSync.mockReturnValue(JSON.stringify({ + enabled: true, + providers: { + email: { + enabled: true, + host: 'smtp.test', + port: 465, + secure: 'false', // legacy string — must normalize to boolean false + to: 'me@test', + from: 'from@test', + user: 'legacy-user', + pass: 'legacy-pass', + } + }, + events: { + containerDown: false, + deploymentSuccess: false, + } + })); + const loaded = new NotificationManager({ + NOTIFICATIONS_FILE: NOTIF_FILE, + log: { error: jest.fn(), info: jest.fn(), warn: jest.fn() }, + }); + const email = loaded.getConfig().providers.email; + expect(email.username).toBe('legacy-user'); + expect(email.password).toBe('legacy-pass'); + expect(email.user).toBeUndefined(); + expect(email.pass).toBeUndefined(); + expect(email.secure).toBe(false); + const events = loaded.getConfig().events; + expect(events['container-down']).toBe(false); + expect(events['deploy-success']).toBe(false); + expect(events.containerDown).toBeUndefined(); + expect(events.deploymentSuccess).toBeUndefined(); + }); + + test('DC-092: canonical keys win when both spellings exist in a legacy file', () => { + fs.existsSync.mockReturnValue(true); + fs.readFileSync.mockReturnValue(JSON.stringify({ + providers: { email: { user: 'legacy', username: 'canonical' } }, + events: { containerDown: false, 'container-down': true }, + })); + const loaded = new NotificationManager({ + NOTIFICATIONS_FILE: NOTIF_FILE, + log: { error: jest.fn(), info: jest.fn(), warn: jest.fn() }, + }); + expect(loaded.getConfig().providers.email.username).toBe('canonical'); + expect(loaded.getConfig().events['container-down']).toBe(true); + }); }); diff --git a/dashcaddy-api/__tests__/routes/notifications-dc092.routes.test.js b/dashcaddy-api/__tests__/routes/notifications-dc092.routes.test.js new file mode 100644 index 0000000..f52609c --- /dev/null +++ b/dashcaddy-api/__tests__/routes/notifications-dc092.routes.test.js @@ -0,0 +1,267 @@ +/** + * DC-092: notifications config contract tests (route level). + * + * The settings UI and the backend drifted apart in three ways, all of which + * made user-facing features silently dead: + * 1. UI sent email.user/email.pass; backend read username/password → + * SMTP auth never applied for UI-saved configs. + * 2. UI sent camelCase event keys (containerDown); the send() gate read + * kebab-case keys (container-down) → event toggles were cosmetic. + * 3. deploy-success/deploy-failed/auto-restart were missing from DEFAULT + * events → deploy + auto-restart notifications always dropped, and + * 'test' was gated too → the Test button was a no-op. + * 4. Non-boolean enabled/secure values (string "false") persisted as-is and + * coerced truthy (!!secure) — silently forcing TLS. + * 5. UI password field roundtrip: GET /config omitted port/secure/to/ + * username, and an empty password on save clobbered the stored one. + * + * These tests pin the FIXED contract: alias normalization, strict booleans, + * event-key folding, non-destructive credential merge, redacted GET fields. + */ + +'use strict'; + +const express = require('express'); +const request = require('supertest'); + +// Stub notification manager: in-memory config object, real merge semantics +// are exercised through the route; manager-level canonicalization has its +// own tests in notification-manager.test.js. +function makeStubNotification(initial) { + const nm = { + config: initial, + getConfig() { return this.config; }, + async saveConfig() { this.saved = JSON.parse(JSON.stringify(this.config)); return true; }, + startHealthDaemon: jest.fn(), + stopHealthDaemon: jest.fn(), + }; + return nm; +} + +function buildApp(notification) { + const app = express(); + app.use(express.json()); + const notificationRoutes = require('../../routes/notifications'); + app.use('/api/v1/notifications', notificationRoutes({ + notification, + asyncHandler: (fn) => (req, res, next) => Promise.resolve(fn(req, res)).catch(next), + ok: (res, data) => res.json({ success: true, ...data }), + })); + // Inline error handler (same pattern as sites-dc074.routes.test.js): maps + // AppError.statusCode to the HTTP status and surfaces err.message. + app.use((err, req, res, next) => { + const status = err.statusCode || 500; + res.status(status).json({ + error: err.message || 'Internal Server Error', + code: err.code || null, + }); + }); + return app; +} + +const DEFAULTS = { + enabled: true, + providers: { + discord: { enabled: false, webhookUrl: '' }, + telegram: { enabled: false, botToken: '', chatId: '' }, + ntfy: { enabled: false, topic: '', serverUrl: 'https://ntfy.sh' }, + email: { enabled: false, host: '', port: 587, to: '', from: '', username: '', password: '' }, + }, + events: { + 'container-down': true, + 'container-up': false, + 'alert': true, + 'backup-complete': true, + 'backup-failed': true, + 'update-available': true, + 'deploy-success': true, + 'deploy-failed': true, + 'auto-restart': true, + }, + healthCheck: { enabled: false }, +}; + +function freshConfig() { + return JSON.parse(JSON.stringify(DEFAULTS)); +} + +describe('DC-092: POST /config field aliases and typing', () => { + test('UI spelling email.user/email.pass normalizes onto username/password', async () => { + const nm = makeStubNotification(freshConfig()); + const app = buildApp(nm); + const res = await request(app) + .post('/api/v1/notifications/config') + .send({ providers: { email: { user: 'svc@example.com', pass: 'app-secret' } } }); + expect(res.status).toBe(200); + expect(nm.config.providers.email.username).toBe('svc@example.com'); + expect(nm.config.providers.email.password).toBe('app-secret'); + expect(nm.config.providers.email.user).toBeUndefined(); + expect(nm.config.providers.email.pass).toBeUndefined(); + }); + + test('explicit username/password wins over user/pass aliases', async () => { + const nm = makeStubNotification(freshConfig()); + const app = buildApp(nm); + await request(app) + .post('/api/v1/notifications/config') + .send({ providers: { email: { user: 'legacy@x.com', pass: 'old', username: 'modern@x.com', password: 'new' } } }); + expect(nm.config.providers.email.username).toBe('modern@x.com'); + expect(nm.config.providers.email.password).toBe('new'); + }); + + test('string "false" for secure is rejected, not coerced truthy', async () => { + const nm = makeStubNotification(freshConfig()); + const app = buildApp(nm); + const res = await request(app) + .post('/api/v1/notifications/config') + .send({ providers: { email: { secure: 'false' } } }); + expect(res.status).toBe(400); + expect(nm.config.providers.email.secure).toBeUndefined(); + }); + + test('string enabled for any provider is rejected', async () => { + const nm = makeStubNotification(freshConfig()); + const app = buildApp(nm); + for (const prov of ['discord', 'telegram', 'ntfy', 'email']) { + const res = await request(app) + .post('/api/v1/notifications/config') + .send({ providers: { [prov]: { enabled: 'true' } } }); + expect(res.status).toBe(400); + } + const top = await request(app) + .post('/api/v1/notifications/config') + .send({ enabled: 'true' }); + expect(top.status).toBe(400); + }); + + test('real booleans pass and persist', async () => { + const nm = makeStubNotification(freshConfig()); + const app = buildApp(nm); + const res = await request(app) + .post('/api/v1/notifications/config') + .send({ enabled: false, providers: { email: { secure: true } } }); + expect(res.status).toBe(200); + expect(nm.config.enabled).toBe(false); + expect(nm.config.providers.email.secure).toBe(true); + }); + + test('SMTP port bounds enforced (0, 65536, non-integer rejected)', async () => { + const nm = makeStubNotification(freshConfig()); + const app = buildApp(nm); + for (const bad of [0, 65536, 58.5, 'abc']) { + const res = await request(app) + .post('/api/v1/notifications/config') + .send({ providers: { email: { port: bad } } }); + expect(res.status).toBe(400); + } + const good = await request(app) + .post('/api/v1/notifications/config') + .send({ providers: { email: { port: 465 } } }); + expect(good.status).toBe(200); + expect(nm.config.providers.email.port).toBe(465); + }); +}); + +describe('DC-092: POST /config event-key folding', () => { + test('camelCase event keys fold onto canonical kebab keys', async () => { + const nm = makeStubNotification(freshConfig()); + const app = buildApp(nm); + const res = await request(app) + .post('/api/v1/notifications/config') + .send({ events: { containerDown: false, deploymentSuccess: false, resourceAlert: false } }); + expect(res.status).toBe(200); + expect(nm.config.events['container-down']).toBe(false); + expect(nm.config.events['deploy-success']).toBe(false); + expect(nm.config.events['alert']).toBe(false); + // legacy camelCase keys must NOT be stored + expect(nm.config.events.containerDown).toBeUndefined(); + expect(nm.config.events.deploymentSuccess).toBeUndefined(); + expect(nm.config.events.resourceAlert).toBeUndefined(); + }); + + test('canonical kebab keys accepted directly', async () => { + const nm = makeStubNotification(freshConfig()); + const app = buildApp(nm); + const res = await request(app) + .post('/api/v1/notifications/config') + .send({ events: { 'container-down': false, 'auto-restart': false } }); + expect(res.status).toBe(200); + expect(nm.config.events['container-down']).toBe(false); + expect(nm.config.events['auto-restart']).toBe(false); + }); + + test('non-boolean event values rejected', async () => { + const nm = makeStubNotification(freshConfig()); + const app = buildApp(nm); + const res = await request(app) + .post('/api/v1/notifications/config') + .send({ events: { 'container-down': 'yes' } }); + expect(res.status).toBe(400); + }); +}); + +describe('DC-092: POST /config non-destructive credential merge', () => { + test('empty password does not clobber stored password', async () => { + const cfg = freshConfig(); + cfg.providers.email.username = 'svc@example.com'; + cfg.providers.email.password = 'stored-secret'; + const nm = makeStubNotification(cfg); + const app = buildApp(nm); + const res = await request(app) + .post('/api/v1/notifications/config') + .send({ providers: { email: { host: 'smtp.example.com', password: '' } } }); + expect(res.status).toBe(200); + expect(nm.config.providers.email.password).toBe('stored-secret'); + expect(nm.config.providers.email.host).toBe('smtp.example.com'); + }); + + test('empty username does not clobber stored username', async () => { + const cfg = freshConfig(); + cfg.providers.email.username = 'svc@example.com'; + const nm = makeStubNotification(cfg); + const app = buildApp(nm); + await request(app) + .post('/api/v1/notifications/config') + .send({ providers: { email: { username: '' } } }); + expect(nm.config.providers.email.username).toBe('svc@example.com'); + }); + + test('non-empty password overwrites', async () => { + const cfg = freshConfig(); + cfg.providers.email.password = 'old'; + const nm = makeStubNotification(cfg); + const app = buildApp(nm); + await request(app) + .post('/api/v1/notifications/config') + .send({ providers: { email: { password: 'rotated' } } }); + expect(nm.config.providers.email.password).toBe('rotated'); + }); +}); + +describe('DC-092: GET /config redaction and roundtrip fields', () => { + test('returns port/secure/to/username/hasPassword but never the password', async () => { + const cfg = freshConfig(); + cfg.providers.email = { + enabled: true, + host: 'smtp.example.com', + port: 465, + secure: true, + to: 'admin@example.com', + from: 'DashCaddy ', + username: 'svc@example.com', + password: 'super-secret', + }; + const nm = makeStubNotification(cfg); + const app = buildApp(nm); + const res = await request(app).get('/api/v1/notifications/config'); + expect(res.status).toBe(200); + const email = res.body.config.providers.email; + expect(email.port).toBe(465); + expect(email.secure).toBe(true); + expect(email.to).toBe('admin@example.com'); + expect(email.username).toBe('svc@example.com'); + expect(email.hasPassword).toBe(true); + expect(JSON.stringify(res.body)).not.toContain('super-secret'); + expect(res.body.config.providers.email.password).toBeUndefined(); + }); +}); diff --git a/dashcaddy-api/routes/notifications.js b/dashcaddy-api/routes/notifications.js index 5d24dca..e484522 100644 --- a/dashcaddy-api/routes/notifications.js +++ b/dashcaddy-api/routes/notifications.js @@ -40,7 +40,15 @@ module.exports = function({ notification, asyncHandler, ok }) { enabled: notificationConfig.providers.email?.enabled || false, configured: !!(notificationConfig.providers.email?.host && notificationConfig.providers.email?.to), host: notificationConfig.providers.email?.host || '', - from: notificationConfig.providers.email?.from || '' + from: notificationConfig.providers.email?.from || '', + // DC-092: the settings UI needs these to roundtrip the form. + // Password is NEVER returned; hasPassword lets the UI show a + // "leave blank to keep" hint instead of an empty-looking field. + port: notificationConfig.providers.email?.port || 587, + secure: notificationConfig.providers.email?.secure === true, + to: notificationConfig.providers.email?.to || '', + username: notificationConfig.providers.email?.username || '', + hasPassword: !!notificationConfig.providers.email?.password } }, events: notificationConfig.events, @@ -54,6 +62,39 @@ module.exports = function({ notification, asyncHandler, ok }) { const { enabled, providers, events, healthCheck } = req.body; const notificationConfig = notification.getConfig(); + // DC-092: clients have historically sent at least three field spellings: + // the settings UI sends email.user/email.pass (its input ids are + // email-user/email-pass) while the manager/route read username/password. + // Normalize aliases onto the canonical keys BEFORE the merge so SMTP auth + // actually applies for UI-saved configs. + if (providers?.email) { + if (providers.email.user !== undefined && providers.email.username === undefined) { + providers.email.username = providers.email.user; + } + if (providers.email.pass !== undefined && providers.email.password === undefined) { + providers.email.password = providers.email.pass; + } + delete providers.email.user; + delete providers.email.pass; + } + + // DC-092 strict boolean contract: enabled/secure must be actual + // booleans. `"false"` (string) is truthy — !!"false" === true — and + // previously persisted as-is, silently forcing TLS on the next send. + // Reject instead of coercing. + const boolOrThrow = (val, label) => { + if (val === undefined) return; + if (typeof val !== 'boolean') { + throw new ValidationError(`${label} must be a boolean (got ${typeof val})`); + } + }; + boolOrThrow(enabled, 'enabled'); + boolOrThrow(providers?.discord?.enabled, 'providers.discord.enabled'); + boolOrThrow(providers?.telegram?.enabled, 'providers.telegram.enabled'); + boolOrThrow(providers?.ntfy?.enabled, 'providers.ntfy.enabled'); + boolOrThrow(providers?.email?.enabled, 'providers.email.enabled'); + boolOrThrow(providers?.email?.secure, 'providers.email.secure'); + // Validate provider webhook URLs and tokens if (providers) { if (providers.discord?.webhookUrl) { @@ -96,6 +137,12 @@ module.exports = function({ notification, asyncHandler, ok }) { throw new ValidationError('Invalid SMTP host'); } } + if (providers.email?.port !== undefined) { + const p = Number(providers.email.port); + if (!Number.isInteger(p) || p < 1 || p > 65535) { + throw new ValidationError('SMTP port must be an integer 1-65535'); + } + } } // Update enabled state @@ -124,16 +171,50 @@ module.exports = function({ notification, asyncHandler, ok }) { }; } if (providers.email) { + // Non-destructive merge: an empty-string username/password from the + // UI (password field is intentionally left blank to keep stored + // credentials) must NOT clobber the stored credential. + const stored = notificationConfig.providers.email; + const incoming = { ...providers.email }; + if (incoming.password === '') delete incoming.password; + if (incoming.username === '') delete incoming.username; notificationConfig.providers.email = { - ...notificationConfig.providers.email, - ...providers.email + ...stored, + ...incoming }; } } - // Update events + // Update events. DC-092: the UI sends camelCase keys (containerDown); + // the canonical store/gate keys are kebab-case (container-down). Fold + // before merging so UI toggles actually reach the keys the send() gate + // reads. Values must be booleans; unknown keys pass through unchanged + // (canonicalized if known alias) and merge over defaults. if (events) { - notificationConfig.events = { ...notificationConfig.events, ...events }; + const EVENT_KEY_ALIASES = { + containerDown: 'container-down', + containerUp: 'container-up', + deploymentSuccess: 'deploy-success', + deploymentFailed: 'deploy-failed', + deploySuccess: 'deploy-success', + deployFailed: 'deploy-failed', + resourceAlert: 'alert', + updateAvailable: 'update-available', + backupComplete: 'backup-complete', + backupFailed: 'backup-failed', + autoRestart: 'auto-restart', + }; + const folded = {}; + for (const [k, v] of Object.entries(events)) { + const canonicalKey = EVENT_KEY_ALIASES[k] || k; + folded[canonicalKey] = v; + } + for (const [k, v] of Object.entries(folded)) { + if (typeof v !== 'boolean') { + throw new ValidationError(`events.${k} must be a boolean (got ${typeof v})`); + } + } + notificationConfig.events = { ...notificationConfig.events, ...folded }; } // Update health check settings diff --git a/dashcaddy-api/src/managers/notification-manager.js b/dashcaddy-api/src/managers/notification-manager.js index aa0050d..1909ca1 100644 --- a/dashcaddy-api/src/managers/notification-manager.js +++ b/dashcaddy-api/src/managers/notification-manager.js @@ -7,6 +7,28 @@ const fs = require('fs'); const path = require('path'); const nodemailer = require('nodemailer'); +// Canonical event names are kebab-case ('container-down'). Emitters and the +// settings UI historically send camelCase ('containerDown', 'deploymentSuccess') +// and the alias map below folds every known spelling onto the canonical key. +// DC-092: before this map, the events gate looked up the RAW event name, so +// 'deploymentSuccess' (routes/apps/deploy.js, routes/recipes/deploy.js) and +// 'auto-restart' (resource-monitor.js) were absent from DEFAULT events and +// silently dropped, and UI camelCase toggles never reached the kebab keys the +// gate reads — the toggles were cosmetic. +const EVENT_ALIASES = { + containerDown: 'container-down', + containerUp: 'container-up', + deploymentSuccess: 'deploy-success', + deploymentFailed: 'deploy-failed', + deploySuccess: 'deploy-success', + deployFailed: 'deploy-failed', + resourceAlert: 'alert', + updateAvailable: 'update-available', + backupComplete: 'backup-complete', + backupFailed: 'backup-failed', + autoRestart: 'auto-restart', +}; + const DEFAULT_CONFIG = { enabled: true, providers: { @@ -21,7 +43,13 @@ const DEFAULT_CONFIG = { 'alert': true, 'backup-complete': true, 'backup-failed': true, - 'update-available': true + 'update-available': true, + // DC-092: emitters (apps/recipes deploy routes) fire these; they were + // missing from defaults entirely, so every deploy notification was + // silently dropped before this fix. + 'deploy-success': true, + 'deploy-failed': true, + 'auto-restart': true } }; @@ -48,6 +76,7 @@ class NotificationManager extends EventEmitter { try { if (fs.existsSync(this.NOTIFICATIONS_FILE)) { const data = JSON.parse(fs.readFileSync(this.NOTIFICATIONS_FILE, 'utf8')); + this._canonicalizeLegacyKeys(data); this.config = this._mergeConfig(DEFAULT_CONFIG, data); } } catch (error) { @@ -55,6 +84,40 @@ class NotificationManager extends EventEmitter { } } + /** + * DC-092: configs saved by older clients may contain the legacy spellings + * the old POST /config merged verbatim — email.user/email.pass instead of + * username/password, and camelCase event keys instead of kebab-case. Fold + * them onto the canonical keys BEFORE the defaults merge (after the merge + * the canonical keys always exist from defaults, so the alias guards would + * never fire) so a config file written before this fix keeps working: SMTP + * auth applies and event toggles gate correctly. + */ + _canonicalizeLegacyKeys(data) { + // Email credentials: user/pass → username/password (only when the + // canonical key is absent in the raw data; canonical wins on conflict). + const email = data?.providers?.email; + if (email && typeof email === 'object') { + if (email.user !== undefined && email.username === undefined) email.username = email.user; + if (email.pass !== undefined && email.password === undefined) email.password = email.pass; + delete email.user; + delete email.pass; + // secure must be a real boolean: legacy string values (e.g. "false" + // from hand-edited JSON) are truthy under !! and would force TLS. + if (email.secure !== undefined) email.secure = email.secure === true; + } + // Event keys: camelCase → kebab-case canonical. + if (data?.events && typeof data.events === 'object') { + for (const [k, v] of Object.entries(data.events)) { + const canonicalKey = EVENT_ALIASES[k]; + if (canonicalKey) { + if (data.events[canonicalKey] === undefined) data.events[canonicalKey] = v; + delete data.events[k]; + } + } + } + } + /** * Merge loaded config with defaults */ @@ -130,9 +193,15 @@ class NotificationManager extends EventEmitter { return { success: false, error: 'Notifications disabled' }; } - // Check if event is enabled - if (event && this.config.events && !this.config.events[event]) { - return { success: false, error: `Event ${event} not enabled` }; + // Fold legacy/camelCase spellings onto canonical kebab-case keys (DC-092). + const canonical = EVENT_ALIASES[event] || event; + + // Check if event is enabled. 'test' bypasses the gate: it is the settings + // UI "Send Test" flow and is not an operator-togglable event (there is no + // 'test' key in events; gating on it made the Test button a no-op). + const gated = canonical !== 'test'; + if (gated && this.config.events && this.config.events[canonical] !== true) { + return { success: false, error: `Event ${canonical} not enabled` }; } const results = []; @@ -141,7 +210,7 @@ class NotificationManager extends EventEmitter { // Discord if (providers.discord?.enabled && providers.discord?.webhookUrl) { try { - const result = await this.sendDiscord(this._formatText(data, event), this._formatEmbed(data, event, type)); + const result = await this.sendDiscord(this._formatText(data, canonical), this._formatEmbed(data, canonical, type)); results.push({ provider: 'discord', ...result }); } catch (error) { results.push({ provider: 'discord', success: false, error: error.message }); @@ -151,7 +220,7 @@ class NotificationManager extends EventEmitter { // Telegram if (providers.telegram?.enabled && providers.telegram?.botToken && providers.telegram?.chatId) { try { - const result = await this.sendTelegram(this._formatText(data, event)); + const result = await this.sendTelegram(this._formatText(data, canonical)); results.push({ provider: 'telegram', ...result }); } catch (error) { results.push({ provider: 'telegram', success: false, error: error.message }); @@ -161,7 +230,7 @@ class NotificationManager extends EventEmitter { // ntfy if (providers.ntfy?.enabled && providers.ntfy?.topic) { try { - const result = await this.sendNtfy(this._formatText(data, event), this._formatTitle(event)); + const result = await this.sendNtfy(this._formatText(data, canonical), this._formatTitle(canonical)); results.push({ provider: 'ntfy', ...result }); } catch (error) { results.push({ provider: 'ntfy', success: false, error: error.message }); @@ -172,8 +241,8 @@ class NotificationManager extends EventEmitter { if (providers.email?.enabled && providers.email?.host && providers.email?.to) { try { const result = await this.sendEmail( - this._formatTitle(event), - this._formatText(data, event) + this._formatTitle(canonical), + this._formatText(data, canonical) ); results.push({ provider: 'email', ...result }); } catch (error) { @@ -183,9 +252,9 @@ class NotificationManager extends EventEmitter { const allSucceeded = results.every(r => r.success); this._addToHistory({ - title: this._formatTitle(event), + title: this._formatTitle(canonical), type, - event, + event: canonical, results }); @@ -290,7 +359,7 @@ class NotificationManager extends EventEmitter { const transporter = nodemailer.createTransport({ host, port: parseInt(port) || 587, - secure: !!secure, + secure: secure === true, auth: username ? { user: username, pass: password diff --git a/status/dist/features.js b/status/dist/features.js index 9c5a22d..01cf46f 100644 --- a/status/dist/features.js +++ b/status/dist/features.js @@ -90,9 +90,9 @@ - `);const w=document.getElementById("logo-modal"),B=document.getElementById("logo-preview-dark"),A=document.getElementById("logo-preview-light"),S=document.getElementById("logo-status"),z=document.getElementById("logo-same-both"),P=document.getElementById("logo-dual-uploads"),M=document.getElementById("logo-single-upload"),D=document.getElementById("logo-upload-dark"),h=document.getElementById("logo-upload-light"),T=document.getElementById("logo-upload-single"),f=document.querySelector("#brand .brand-logo-dark"),H=document.querySelector("#brand .brand-logo-light"),k=document.querySelector(".top-row"),$=document.getElementById("dashboard-title"),E=DC.NAME;let I=null,O=null,C=null,j="left",N=E;z?.addEventListener("change",()=>{z.checked?(P.style.display="none",M.style.display="",I=null,O=null):(P.style.display="flex",M.style.display="none",C=null)});function R(t,e){if(!t||!t.type.startsWith("image/")){showNotification("Please select an image file","warning");return}const a=new FileReader;a.onload=o=>e(o.target.result),a.readAsDataURL(t)}D?.addEventListener("change",t=>{R(t.target.files[0],e=>{I=e,B.src=e,S.textContent="New dark logo ready to save"})}),h?.addEventListener("change",t=>{R(t.target.files[0],e=>{O=e,A.src=e,S.textContent="New light logo ready to save"})}),T?.addEventListener("change",t=>{R(t.target.files[0],e=>{C=e,B.src=e,A.src=e,S.textContent="New logo ready to save (both themes)"})});function u(t){k.setAttribute("data-logo-pos",t),document.querySelectorAll(".logo-pos-btn").forEach(e=>{e.style.background=e.dataset.pos===t?"var(--accent)":"var(--card-bg)",e.style.color=e.dataset.pos===t?"white":"var(--fg)"})}function v(t){N=t||E,document.title=N;const e=document.querySelector(".dashboard-title");e&&(e.textContent=N)}async function x(){try{const t=await fetch("/api/v1/logo");if(t.ok){const e=await t.json();e.customLogoDark&&(f.src=e.customLogoDark,B.src=e.customLogoDark),e.customLogoLight&&(H.src=e.customLogoLight,A.src=e.customLogoLight),!e.customLogoDark&&!e.customLogoLight&&e.customLogo&&(f.src=e.customLogo,H.src=e.customLogo,B.src=e.customLogo,A.src=e.customLogo),e.isDefault||(S.textContent="Using custom logo"),e.position&&(j=e.position,u(e.position)),e.dashboardTitle&&v(e.dashboardTitle)}}catch(t){console.warn("Could not load custom logo:",t.message)}}document.querySelectorAll(".logo-pos-btn").forEach(t=>{t.addEventListener("click",()=>{j=t.dataset.pos,u(j)})}),document.getElementById("brand")?.addEventListener("click",()=>{I=null,O=null,C=null,D&&(D.value=""),h&&(h.value=""),T&&(T.value=""),z&&(z.checked=!1),P.style.display="flex",M.style.display="none",B.src=f.src,A.src=H.src;const t=f.src.includes("custom-logo")||H.src.includes("custom-logo");S.textContent=t?"Using custom logo":"Using default logos",u(j),$.value=N,w.classList.add("show")}),document.getElementById("logo-save")?.addEventListener("click",async()=>{try{const t=$.value.trim()||E,e={position:j,dashboardTitle:t};z?.checked&&C?(e.dataDark=C,e.dataLight=C):(I&&(e.dataDark=I),O&&(e.dataLight=O));const a=await secureFetch("/api/v1/logo",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(a.ok){const o=await a.json(),i="?t="+Date.now();o.pathDark&&(f.src=o.pathDark+i,B.src=o.pathDark+i),o.pathLight&&(H.src=o.pathLight+i,A.src=o.pathLight+i),u(j),v(t),w.classList.remove("show")}else{const o=await a.json();showNotification("Failed to save: "+o.error,"error")}}catch(t){showNotification("Error saving: "+t.message,"error")}}),document.getElementById("logo-reset")?.addEventListener("click",async()=>{if(confirm(`Reset all branding to DashCaddy defaults? + `);const k=document.getElementById("logo-modal"),B=document.getElementById("logo-preview-dark"),A=document.getElementById("logo-preview-light"),I=document.getElementById("logo-status"),z=document.getElementById("logo-same-both"),P=document.getElementById("logo-dual-uploads"),M=document.getElementById("logo-single-upload"),D=document.getElementById("logo-upload-dark"),h=document.getElementById("logo-upload-light"),T=document.getElementById("logo-upload-single"),f=document.querySelector("#brand .brand-logo-dark"),H=document.querySelector("#brand .brand-logo-light"),S=document.querySelector(".top-row"),$=document.getElementById("dashboard-title"),w=DC.NAME;let E=null,O=null,C=null,j="left",N=w;z?.addEventListener("change",()=>{z.checked?(P.style.display="none",M.style.display="",E=null,O=null):(P.style.display="flex",M.style.display="none",C=null)});function R(t,e){if(!t||!t.type.startsWith("image/")){showNotification("Please select an image file","warning");return}const a=new FileReader;a.onload=o=>e(o.target.result),a.readAsDataURL(t)}D?.addEventListener("change",t=>{R(t.target.files[0],e=>{E=e,B.src=e,I.textContent="New dark logo ready to save"})}),h?.addEventListener("change",t=>{R(t.target.files[0],e=>{O=e,A.src=e,I.textContent="New light logo ready to save"})}),T?.addEventListener("change",t=>{R(t.target.files[0],e=>{C=e,B.src=e,A.src=e,I.textContent="New logo ready to save (both themes)"})});function u(t){S.setAttribute("data-logo-pos",t),document.querySelectorAll(".logo-pos-btn").forEach(e=>{e.style.background=e.dataset.pos===t?"var(--accent)":"var(--card-bg)",e.style.color=e.dataset.pos===t?"white":"var(--fg)"})}function v(t){N=t||w,document.title=N;const e=document.querySelector(".dashboard-title");e&&(e.textContent=N)}async function x(){try{const t=await fetch("/api/v1/logo");if(t.ok){const e=await t.json();e.customLogoDark&&(f.src=e.customLogoDark,B.src=e.customLogoDark),e.customLogoLight&&(H.src=e.customLogoLight,A.src=e.customLogoLight),!e.customLogoDark&&!e.customLogoLight&&e.customLogo&&(f.src=e.customLogo,H.src=e.customLogo,B.src=e.customLogo,A.src=e.customLogo),e.isDefault||(I.textContent="Using custom logo"),e.position&&(j=e.position,u(e.position)),e.dashboardTitle&&v(e.dashboardTitle)}}catch(t){console.warn("Could not load custom logo:",t.message)}}document.querySelectorAll(".logo-pos-btn").forEach(t=>{t.addEventListener("click",()=>{j=t.dataset.pos,u(j)})}),document.getElementById("brand")?.addEventListener("click",()=>{E=null,O=null,C=null,D&&(D.value=""),h&&(h.value=""),T&&(T.value=""),z&&(z.checked=!1),P.style.display="flex",M.style.display="none",B.src=f.src,A.src=H.src;const t=f.src.includes("custom-logo")||H.src.includes("custom-logo");I.textContent=t?"Using custom logo":"Using default logos",u(j),$.value=N,k.classList.add("show")}),document.getElementById("logo-save")?.addEventListener("click",async()=>{try{const t=$.value.trim()||w,e={position:j,dashboardTitle:t};z?.checked&&C?(e.dataDark=C,e.dataLight=C):(E&&(e.dataDark=E),O&&(e.dataLight=O));const a=await secureFetch("/api/v1/logo",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(a.ok){const o=await a.json(),i="?t="+Date.now();o.pathDark&&(f.src=o.pathDark+i,B.src=o.pathDark+i),o.pathLight&&(H.src=o.pathLight+i,A.src=o.pathLight+i),u(j),v(t),k.classList.remove("show")}else{const o=await a.json();showNotification("Failed to save: "+o.error,"error")}}catch(t){showNotification("Error saving: "+t.message,"error")}}),document.getElementById("logo-reset")?.addEventListener("click",async()=>{if(confirm(`Reset all branding to DashCaddy defaults? -This will reset the logo, favicon, title, and position.`))try{if((await secureFetch("/api/v1/logo",{method:"DELETE"})).ok&&(f.src="/assets/dashcaddy-logo-dark.png",H.src="/assets/dashcaddy-logo-light.png",B.src="/assets/dashcaddy-logo-dark.png",A.src="/assets/dashcaddy-logo-light.png",S.textContent="Using default logos",I=null,O=null,C=null,$.value=E,v(E),j="left",u("left")),(await secureFetch("/api/v1/favicon",{method:"DELETE"})).ok){const a=document.querySelector('link[rel="icon"]'),o=document.getElementById("favicon-preview"),i=document.getElementById("favicon-status");a&&(a.href="/assets/dashcaddy-favicon.ico?t="+Date.now()),o&&(o.src="/assets/dashcaddy-favicon.ico?t="+Date.now()),i&&(i.textContent="Using DashCaddy favicon"),l=null}}catch(t){showNotification("Error resetting branding: "+t.message,"error")}}),wireModal(w,document.getElementById("logo-cancel"));const g=document.getElementById("favicon-preview"),b=document.getElementById("favicon-status"),s=document.getElementById("favicon-upload"),p=document.querySelector('link[rel="icon"]')||document.createElement("link");let l=null;document.querySelector('link[rel="icon"]')||(p.rel="icon",p.href="/assets/dashcaddy-favicon.ico",document.head.appendChild(p));async function m(){try{const t=await fetch("/api/v1/favicon");if(t.ok){const e=await t.json();e.customFavicon&&(p.href=e.customFavicon+"?t="+Date.now(),g.src=e.customFavicon+"?t="+Date.now(),b.textContent="Using custom favicon")}}catch(t){console.warn("Could not load custom favicon:",t.message)}}s?.addEventListener("change",t=>{const e=t.target.files[0];if(!e)return;if(!e.type.match(/^image\/(png|svg\+xml)$/)){showNotification("Please select a PNG or SVG file","warning"),s.value="";return}const a=new FileReader;a.onload=o=>{l=o.target.result,g.src=l,b.textContent="New favicon ready to save"},a.readAsDataURL(e)}),document.getElementById("logo-save")?.addEventListener("click",async()=>{if(l)try{const t=await secureFetch("/api/v1/favicon",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({data:l})});if(t.ok){const e=await t.json();p.href=e.path+"?t="+Date.now(),g.src=e.path+"?t="+Date.now(),b.textContent="Using custom favicon",l=null}else{const e=await t.json();showNotification("Failed to save favicon: "+e.error,"error")}}catch(t){showNotification("Error saving favicon: "+t.message,"error")}}),m(),x();const c=document.getElementById("settings-timezone");c&&(new MutationObserver(()=>{w.classList.contains("show")&&c.options.length===0&&(async()=>{let e;try{const a=await fetch("/api/v1/config");a.ok&&(e=(await a.json()).timezone)}catch{}window.populateTimezoneSelect(c,e)})()}).observe(w,{attributes:!0,attributeFilter:["class"]}),document.getElementById("logo-save")?.addEventListener("click",async()=>{const e=c.value;if(e)try{const a=await fetch("/api/v1/config");if(!a.ok)return;const o=await a.json();o.timezone=e,o.updatedAt=new Date().toISOString(),await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})}catch(a){console.warn("Failed to save timezone:",a.message)}}))})(),window.populateTimezoneSelect=function(w,B){const A=Intl.supportedValuesOf("timeZone"),S=B||Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC";w.innerHTML="";for(const z of A){const P=document.createElement("option");P.value=z,P.textContent=z.replace(/_/g," "),z===S&&(P.selected=!0),w.appendChild(P)}},(function(){let w="homelab",B=null;async function A(){try{const v=await fetch("/api/v1/config");if(v.ok&&(B=await v.json(),B&&B.setupComplete))return document.getElementById("setup-wizard").style.display="none",!0}catch(v){console.warn("Could not fetch server config, checking localStorage fallback:",v.message)}return safeGet("dashcaddy-setup")?(document.getElementById("setup-wizard").style.display="none",!0):(document.getElementById("setup-wizard").style.display="flex",!1)}A();const S=document.getElementById("setup-timezone");S&&window.populateTimezoneSelect(S);function z(u){document.querySelectorAll(".setup-step").forEach(x=>{x.style.display="none"});const v=document.getElementById(u);v&&(v.style.display="block")}function P(){const u=document.getElementById("setup-summary-content");if(!u)return;let v='
';if(w==="homelab"){const g=document.getElementById("setup-tld")?.value?.trim()||".home",b=document.getElementById("setup-ca-name")?.value?.trim()||"",s=document.getElementById("setup-dns-ip")?.value?.trim()||"",p=document.getElementById("setup-dns-port")?.value?.trim()||DC.DEFAULTS.DNS_PORT;v+=` +This will reset the logo, favicon, title, and position.`))try{if((await secureFetch("/api/v1/logo",{method:"DELETE"})).ok&&(f.src="/assets/dashcaddy-logo-dark.png",H.src="/assets/dashcaddy-logo-light.png",B.src="/assets/dashcaddy-logo-dark.png",A.src="/assets/dashcaddy-logo-light.png",I.textContent="Using default logos",E=null,O=null,C=null,$.value=w,v(w),j="left",u("left")),(await secureFetch("/api/v1/favicon",{method:"DELETE"})).ok){const a=document.querySelector('link[rel="icon"]'),o=document.getElementById("favicon-preview"),i=document.getElementById("favicon-status");a&&(a.href="/assets/dashcaddy-favicon.ico?t="+Date.now()),o&&(o.src="/assets/dashcaddy-favicon.ico?t="+Date.now()),i&&(i.textContent="Using DashCaddy favicon"),l=null}}catch(t){showNotification("Error resetting branding: "+t.message,"error")}}),wireModal(k,document.getElementById("logo-cancel"));const g=document.getElementById("favicon-preview"),b=document.getElementById("favicon-status"),s=document.getElementById("favicon-upload"),p=document.querySelector('link[rel="icon"]')||document.createElement("link");let l=null;document.querySelector('link[rel="icon"]')||(p.rel="icon",p.href="/assets/dashcaddy-favicon.ico",document.head.appendChild(p));async function m(){try{const t=await fetch("/api/v1/favicon");if(t.ok){const e=await t.json();e.customFavicon&&(p.href=e.customFavicon+"?t="+Date.now(),g.src=e.customFavicon+"?t="+Date.now(),b.textContent="Using custom favicon")}}catch(t){console.warn("Could not load custom favicon:",t.message)}}s?.addEventListener("change",t=>{const e=t.target.files[0];if(!e)return;if(!e.type.match(/^image\/(png|svg\+xml)$/)){showNotification("Please select a PNG or SVG file","warning"),s.value="";return}const a=new FileReader;a.onload=o=>{l=o.target.result,g.src=l,b.textContent="New favicon ready to save"},a.readAsDataURL(e)}),document.getElementById("logo-save")?.addEventListener("click",async()=>{if(l)try{const t=await secureFetch("/api/v1/favicon",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({data:l})});if(t.ok){const e=await t.json();p.href=e.path+"?t="+Date.now(),g.src=e.path+"?t="+Date.now(),b.textContent="Using custom favicon",l=null}else{const e=await t.json();showNotification("Failed to save favicon: "+e.error,"error")}}catch(t){showNotification("Error saving favicon: "+t.message,"error")}}),m(),x();const c=document.getElementById("settings-timezone");c&&(new MutationObserver(()=>{k.classList.contains("show")&&c.options.length===0&&(async()=>{let e;try{const a=await fetch("/api/v1/config");a.ok&&(e=(await a.json()).timezone)}catch{}window.populateTimezoneSelect(c,e)})()}).observe(k,{attributes:!0,attributeFilter:["class"]}),document.getElementById("logo-save")?.addEventListener("click",async()=>{const e=c.value;if(e)try{const a=await fetch("/api/v1/config");if(!a.ok)return;const o=await a.json();o.timezone=e,o.updatedAt=new Date().toISOString(),await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})}catch(a){console.warn("Failed to save timezone:",a.message)}}))})(),window.populateTimezoneSelect=function(k,B){const A=Intl.supportedValuesOf("timeZone"),I=B||Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC";k.innerHTML="";for(const z of A){const P=document.createElement("option");P.value=z,P.textContent=z.replace(/_/g," "),z===I&&(P.selected=!0),k.appendChild(P)}},(function(){let k="homelab",B=null;async function A(){try{const v=await fetch("/api/v1/config");if(v.ok&&(B=await v.json(),B&&B.setupComplete))return document.getElementById("setup-wizard").style.display="none",!0}catch(v){console.warn("Could not fetch server config, checking localStorage fallback:",v.message)}return safeGet("dashcaddy-setup")?(document.getElementById("setup-wizard").style.display="none",!0):(document.getElementById("setup-wizard").style.display="flex",!1)}A();const I=document.getElementById("setup-timezone");I&&window.populateTimezoneSelect(I);function z(u){document.querySelectorAll(".setup-step").forEach(x=>{x.style.display="none"});const v=document.getElementById(u);v&&(v.style.display="block")}function P(){const u=document.getElementById("setup-summary-content");if(!u)return;let v='
';if(k==="homelab"){const g=document.getElementById("setup-tld")?.value?.trim()||".home",b=document.getElementById("setup-ca-name")?.value?.trim()||"",s=document.getElementById("setup-dns-ip")?.value?.trim()||"",p=document.getElementById("setup-dns-port")?.value?.trim()||DC.DEFAULTS.DNS_PORT;v+=`

Home Lab Configuration

@@ -102,7 +102,7 @@ This will reset the logo, favicon, title, and position.`))try{if((await secureFe
Example URLs: https://uptime${g}, https://nextcloud${g}
- `}else if(w==="simple"){const g=document.getElementById("setup-simple-ip")?.value?.trim()||"localhost";v+=` + `}else if(k==="simple"){const g=document.getElementById("setup-simple-ip")?.value?.trim()||"localhost";v+=`

Simple Setup

@@ -112,7 +112,7 @@ This will reset the logo, favicon, title, and position.`))try{if((await secureFe
Example URLs: http://${g}:8080, http://${g}:3000
- `}else if(w==="public"){const g=document.getElementById("setup-public-domain")?.value?.trim()||"",b=document.getElementById("setup-public-email")?.value?.trim()||"",s=document.querySelector('input[name="routing-mode"]:checked')?.value||"subdirectory",p=s==="subdirectory"?`https://${g}/sonarr, https://${g}/grafana`:`https://sonarr.${g}, https://grafana.${g}`;v+=` + `}else if(k==="public"){const g=document.getElementById("setup-public-domain")?.value?.trim()||"",b=document.getElementById("setup-public-email")?.value?.trim()||"",s=document.querySelector('input[name="routing-mode"]:checked')?.value||"subdirectory",p=s==="subdirectory"?`https://${g}/sonarr, https://${g}/grafana`:`https://sonarr.${g}, https://grafana.${g}`;v+=`

Public Server

@@ -127,7 +127,7 @@ This will reset the logo, favicon, title, and position.`))try{if((await secureFe
Timezone: ${x.replace(/_/g," ")}
- `,v+="
",u.innerHTML=v,z("setup-step-summary")}async function M(u){try{const v=await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});return v.ok?(await v.json(),!0):(errorHandler.logError("[SetupWizard] Save Config",new Error(`Server returned ${v.status}`),{function:"saveConfigToServer"}),!1)}catch(v){return errorHandler.logError("[SetupWizard] Save Config",v,{function:"saveConfigToServer"}),!1}}async function D(){const u={setupComplete:!0,configurationType:w,timestamp:new Date().toISOString(),timezone:document.getElementById("setup-timezone")?.value||Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC"};if(w==="homelab"){u.tld=document.getElementById("setup-tld")?.value?.trim()||".home",u.caName=document.getElementById("setup-ca-name")?.value?.trim()||"";const b=document.getElementById("setup-dns-provider")?.value||"technitium";u.dns={provider:b,ip:document.getElementById("setup-dns-ip")?.value?.trim()||"",port:document.getElementById("setup-dns-port")?.value?.trim()||DC.DEFAULTS.DNS_PORT,token:document.getElementById("setup-dns-token")?.value?.trim()||""},u.defaults={dnsType:"private",sslType:"internal",targetIP:"localhost"}}else w==="simple"?(u.defaultIP=document.getElementById("setup-simple-ip")?.value?.trim()||"localhost",u.defaults={dnsType:"none",sslType:"none",targetIP:u.defaultIP}):w==="public"&&(u.domain=document.getElementById("setup-public-domain")?.value?.trim()||"",u.email=document.getElementById("setup-public-email")?.value?.trim()||"",u.routingMode=document.querySelector('input[name="routing-mode"]:checked')?.value||"subdirectory",u.defaults={dnsType:u.routingMode==="subdirectory"?"none":"public",sslType:"letsencrypt",targetIP:"localhost"});const v=await M(u);safeSet("dashcaddy-config",JSON.stringify(u)),safeSet("dashcaddy-setup","completed"),document.getElementById("setup-wizard").style.display="none";const x=w==="homelab"?"Professional Home Lab":w==="simple"?"Simple Setup":"Public Server",g=v?"server (shared across all devices)":"locally (this browser only)";showNotification(`Setup Complete! Configured for: ${x}. Settings saved to: ${g}`,"success",5e3),setTimeout(()=>location.reload(),500)}const h=document.getElementById("setup-step-1-next");h&&(h.onclick=function(u){u.preventDefault();const v=document.querySelector('input[name="config-type"]:checked');v&&(w=v.value),z(w==="homelab"?"setup-step-homelab":w==="simple"?"setup-step-simple":w==="public"?"setup-step-public":"setup-step-homelab")});const T=document.getElementById("setup-skip");T&&(T.onclick=async function(u){u.preventDefault(),confirm("Skip setup? You can run it later from Settings.")&&(await M({setupComplete:!0,skipped:!0,timestamp:new Date().toISOString()}),safeSet("dashcaddy-setup","skipped"),document.getElementById("setup-wizard").style.display="none")});const f=document.getElementById("setup-tld");f&&(f.oninput=function(u){const v=u.target.value||".home",x=document.getElementById("tld-preview"),g=document.getElementById("tld-preview-2");x&&(x.textContent=v),g&&(g.textContent=v)});const H=document.getElementById("setup-homelab-back");H&&(H.onclick=function(u){u.preventDefault(),z("setup-step-1")});const k=document.getElementById("setup-homelab-next");k&&(k.onclick=function(u){u.preventDefault();const v=document.getElementById("setup-tld")?.value?.trim()||"",x=document.getElementById("setup-ca-name")?.value?.trim()||"",g=document.getElementById("setup-dns-ip")?.value?.trim()||"";if(!v||!v.startsWith(".")){showNotification("Please enter a valid TLD starting with a dot (e.g., .home)","warning");return}if(!x){showNotification("Please enter a Certificate Authority name","warning");return}if(!g){showNotification("Please enter your DNS server IP address","warning");return}P()});const $=document.getElementById("setup-simple-back");$&&($.onclick=function(u){u.preventDefault(),z("setup-step-1")});const E=document.getElementById("setup-simple-next");E&&(E.onclick=function(u){u.preventDefault(),P()}),document.querySelectorAll('input[name="routing-mode"]').forEach(function(u){u.onchange=function(){var v=document.getElementById("dns-requirement-note");v&&(v.textContent=this.value==="subdirectory"?"Only one DNS record needed (for the main domain)":"You'll need to configure DNS manually for each subdomain")}});const I=document.getElementById("setup-public-back");I&&(I.onclick=function(u){u.preventDefault(),z("setup-step-1")});const O=document.getElementById("setup-public-next");O&&(O.onclick=function(u){u.preventDefault();const v=document.getElementById("setup-public-domain")?.value?.trim()||"",x=document.getElementById("setup-public-email")?.value?.trim()||"";if(!v){showNotification("Please enter your domain name","warning");return}if(!x||!x.includes("@")){showNotification("Please enter a valid email address","warning");return}P()});const C=document.getElementById("setup-summary-back");C&&(C.onclick=function(u){u.preventDefault(),w==="homelab"?z("setup-step-homelab"):w==="simple"?z("setup-step-simple"):w==="public"&&z("setup-step-public")});const j=document.getElementById("setup-summary-next");j&&(j.onclick=function(u){u.preventDefault(),z("setup-step-disk-safety")});const N=document.getElementById("setup-disk-safety-back");N&&(N.onclick=function(u){u.preventDefault(),z("setup-step-summary")});const R=document.getElementById("setup-disk-safety-finish");R&&(R.onclick=function(u){u.preventDefault(),D()}),window.getGlobalConfig=async function(){try{const v=await fetch("/api/v1/config");if(v.ok){const x=await v.json();if(x&&x.setupComplete)return x}}catch{console.warn("Could not fetch config from server")}const u=safeGet("dashcaddy-config");return u?JSON.parse(u):{setupComplete:!1,configurationType:"homelab",tld:".home",caName:"",defaults:{dnsType:"private",sslType:"internal",targetIP:"localhost"}}},window.resetSetupWizard=async function(){if(confirm("Reset DashCaddy configuration? This will show the setup wizard again.")){try{await secureFetch("/api/v1/config",{method:"DELETE"})}catch{console.warn("Could not delete server config")}safeRemove("dashcaddy-setup"),safeRemove("dashcaddy-config"),location.reload()}}})(),(function(){const w=new ErrorHandler;injectModal("app-selector-modal",`
+ `,v+="
",u.innerHTML=v,z("setup-step-summary")}async function M(u){try{const v=await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});return v.ok?(await v.json(),!0):(errorHandler.logError("[SetupWizard] Save Config",new Error(`Server returned ${v.status}`),{function:"saveConfigToServer"}),!1)}catch(v){return errorHandler.logError("[SetupWizard] Save Config",v,{function:"saveConfigToServer"}),!1}}async function D(){const u={setupComplete:!0,configurationType:k,timestamp:new Date().toISOString(),timezone:document.getElementById("setup-timezone")?.value||Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC"};if(k==="homelab"){u.tld=document.getElementById("setup-tld")?.value?.trim()||".home",u.caName=document.getElementById("setup-ca-name")?.value?.trim()||"";const b=document.getElementById("setup-dns-provider")?.value||"technitium";u.dns={provider:b,ip:document.getElementById("setup-dns-ip")?.value?.trim()||"",port:document.getElementById("setup-dns-port")?.value?.trim()||DC.DEFAULTS.DNS_PORT,token:document.getElementById("setup-dns-token")?.value?.trim()||""},u.defaults={dnsType:"private",sslType:"internal",targetIP:"localhost"}}else k==="simple"?(u.defaultIP=document.getElementById("setup-simple-ip")?.value?.trim()||"localhost",u.defaults={dnsType:"none",sslType:"none",targetIP:u.defaultIP}):k==="public"&&(u.domain=document.getElementById("setup-public-domain")?.value?.trim()||"",u.email=document.getElementById("setup-public-email")?.value?.trim()||"",u.routingMode=document.querySelector('input[name="routing-mode"]:checked')?.value||"subdirectory",u.defaults={dnsType:u.routingMode==="subdirectory"?"none":"public",sslType:"letsencrypt",targetIP:"localhost"});const v=await M(u);safeSet("dashcaddy-config",JSON.stringify(u)),safeSet("dashcaddy-setup","completed"),document.getElementById("setup-wizard").style.display="none";const x=k==="homelab"?"Professional Home Lab":k==="simple"?"Simple Setup":"Public Server",g=v?"server (shared across all devices)":"locally (this browser only)";showNotification(`Setup Complete! Configured for: ${x}. Settings saved to: ${g}`,"success",5e3),setTimeout(()=>location.reload(),500)}const h=document.getElementById("setup-step-1-next");h&&(h.onclick=function(u){u.preventDefault();const v=document.querySelector('input[name="config-type"]:checked');v&&(k=v.value),z(k==="homelab"?"setup-step-homelab":k==="simple"?"setup-step-simple":k==="public"?"setup-step-public":"setup-step-homelab")});const T=document.getElementById("setup-skip");T&&(T.onclick=async function(u){u.preventDefault(),confirm("Skip setup? You can run it later from Settings.")&&(await M({setupComplete:!0,skipped:!0,timestamp:new Date().toISOString()}),safeSet("dashcaddy-setup","skipped"),document.getElementById("setup-wizard").style.display="none")});const f=document.getElementById("setup-tld");f&&(f.oninput=function(u){const v=u.target.value||".home",x=document.getElementById("tld-preview"),g=document.getElementById("tld-preview-2");x&&(x.textContent=v),g&&(g.textContent=v)});const H=document.getElementById("setup-homelab-back");H&&(H.onclick=function(u){u.preventDefault(),z("setup-step-1")});const S=document.getElementById("setup-homelab-next");S&&(S.onclick=function(u){u.preventDefault();const v=document.getElementById("setup-tld")?.value?.trim()||"",x=document.getElementById("setup-ca-name")?.value?.trim()||"",g=document.getElementById("setup-dns-ip")?.value?.trim()||"";if(!v||!v.startsWith(".")){showNotification("Please enter a valid TLD starting with a dot (e.g., .home)","warning");return}if(!x){showNotification("Please enter a Certificate Authority name","warning");return}if(!g){showNotification("Please enter your DNS server IP address","warning");return}P()});const $=document.getElementById("setup-simple-back");$&&($.onclick=function(u){u.preventDefault(),z("setup-step-1")});const w=document.getElementById("setup-simple-next");w&&(w.onclick=function(u){u.preventDefault(),P()}),document.querySelectorAll('input[name="routing-mode"]').forEach(function(u){u.onchange=function(){var v=document.getElementById("dns-requirement-note");v&&(v.textContent=this.value==="subdirectory"?"Only one DNS record needed (for the main domain)":"You'll need to configure DNS manually for each subdomain")}});const E=document.getElementById("setup-public-back");E&&(E.onclick=function(u){u.preventDefault(),z("setup-step-1")});const O=document.getElementById("setup-public-next");O&&(O.onclick=function(u){u.preventDefault();const v=document.getElementById("setup-public-domain")?.value?.trim()||"",x=document.getElementById("setup-public-email")?.value?.trim()||"";if(!v){showNotification("Please enter your domain name","warning");return}if(!x||!x.includes("@")){showNotification("Please enter a valid email address","warning");return}P()});const C=document.getElementById("setup-summary-back");C&&(C.onclick=function(u){u.preventDefault(),k==="homelab"?z("setup-step-homelab"):k==="simple"?z("setup-step-simple"):k==="public"&&z("setup-step-public")});const j=document.getElementById("setup-summary-next");j&&(j.onclick=function(u){u.preventDefault(),z("setup-step-disk-safety")});const N=document.getElementById("setup-disk-safety-back");N&&(N.onclick=function(u){u.preventDefault(),z("setup-step-summary")});const R=document.getElementById("setup-disk-safety-finish");R&&(R.onclick=function(u){u.preventDefault(),D()}),window.getGlobalConfig=async function(){try{const v=await fetch("/api/v1/config");if(v.ok){const x=await v.json();if(x&&x.setupComplete)return x}}catch{console.warn("Could not fetch config from server")}const u=safeGet("dashcaddy-config");return u?JSON.parse(u):{setupComplete:!1,configurationType:"homelab",tld:".home",caName:"",defaults:{dnsType:"private",sslType:"internal",targetIP:"localhost"}}},window.resetSetupWizard=async function(){if(confirm("Reset DashCaddy configuration? This will show the setup wizard again.")){try{await secureFetch("/api/v1/config",{method:"DELETE"})}catch{console.warn("Could not delete server config")}safeRemove("dashcaddy-setup"),safeRemove("dashcaddy-config"),location.reload()}}})(),(function(){const k=new ErrorHandler;injectModal("app-selector-modal",`

Choose an App

@@ -333,7 +333,7 @@ This will reset the logo, favicon, title, and position.`))try{if((await secureFe
-
`);const B="custom-apps";let A=null,S=null;const z=document.getElementById("app-selector-modal"),P=document.getElementById("app-selector-grid");async function M(){try{const p=await(await fetch("/api/v1/apps/templates")).json();if(p.success)return A=p.templates,S=p.categories,!0}catch(s){w.logError("[AppSelector] Fetch Templates",s,{function:"fetchApiTemplates"})}return!1}async function D(s){try{return await(await fetch(`/api/v1/apps/ports/${s}/check`)).json()}catch(p){return w.logError("[AppSelector] Check Port",p,{function:"checkPortAvailability"}),{available:!0}}}async function h(s){try{const l=await(await fetch(`/api/v1/apps/ports/${s}/suggest`)).json();if(l.success)return l.suggestedPort}catch(p){w.logError("[AppSelector] Get Suggested Port",p,{function:"getSuggestedPort"})}return s}async function T(){if(P.innerHTML='
Loading app templates...
',!A&&!await M()){P.innerHTML='
Failed to load app templates. Please try again.
';return}P.innerHTML="";const s={};for(const[l,m]of Object.entries(A)){const c=m.category||"Other";s[c]||(s[c]=[]),s[c].push({id:l,...m})}const p=S?Object.keys(S):Object.keys(s).sort();for(const l of p){const m=s[l];if(!m||m.length===0)continue;m.sort((e,a)=>(a.popularity||0)-(e.popularity||0));const c=document.createElement("div");c.className="app-category-header";const t=S?.[l]||{};c.innerHTML=`${escapeHtml(t.icon||"")} ${escapeHtml(l)}`,t.color&&(c.style.borderBottomColor=t.color),P.appendChild(c),m.forEach(e=>{const a=document.createElement("div");a.className="app-option";const o=e.isDashboardWidget,i=o&&safeGet("widget-"+e.id+"-enabled")!=="false",n=o?`
${i?"ON":"OFF"}
`:"",r=!o&&e.difficulty?`
${escapeHtml(e.difficulty)}
`:"";a.innerHTML=` +
`);const B="custom-apps";let A=null,I=null;const z=document.getElementById("app-selector-modal"),P=document.getElementById("app-selector-grid");async function M(){try{const p=await(await fetch("/api/v1/apps/templates")).json();if(p.success)return A=p.templates,I=p.categories,!0}catch(s){k.logError("[AppSelector] Fetch Templates",s,{function:"fetchApiTemplates"})}return!1}async function D(s){try{return await(await fetch(`/api/v1/apps/ports/${s}/check`)).json()}catch(p){return k.logError("[AppSelector] Check Port",p,{function:"checkPortAvailability"}),{available:!0}}}async function h(s){try{const l=await(await fetch(`/api/v1/apps/ports/${s}/suggest`)).json();if(l.success)return l.suggestedPort}catch(p){k.logError("[AppSelector] Get Suggested Port",p,{function:"getSuggestedPort"})}return s}async function T(){if(P.innerHTML='
Loading app templates...
',!A&&!await M()){P.innerHTML='
Failed to load app templates. Please try again.
';return}P.innerHTML="";const s={};for(const[l,m]of Object.entries(A)){const c=m.category||"Other";s[c]||(s[c]=[]),s[c].push({id:l,...m})}const p=I?Object.keys(I):Object.keys(s).sort();for(const l of p){const m=s[l];if(!m||m.length===0)continue;m.sort((e,a)=>(a.popularity||0)-(e.popularity||0));const c=document.createElement("div");c.className="app-category-header";const t=I?.[l]||{};c.innerHTML=`${escapeHtml(t.icon||"")} ${escapeHtml(l)}`,t.color&&(c.style.borderBottomColor=t.color),P.appendChild(c),m.forEach(e=>{const a=document.createElement("div");a.className="app-option";const o=e.isDashboardWidget,i=o&&safeGet("widget-"+e.id+"-enabled")!=="false",n=o?`
${i?"ON":"OFF"}
`:"",r=!o&&e.difficulty?`
${escapeHtml(e.difficulty)}
`:"";a.innerHTML=`
${escapeHtml(e.icon||"\u{1F4E6}")}
${escapeHtml(e.name)}
${escapeHtml(e.description||"")}
@@ -358,15 +358,15 @@ Click Cancel to deploy a new container.`)&&(s._useExisting=!0,s._existingContain Connected ${G.self?.hostname} (${G.self?.ip}) | ${G.deviceCount} devices - `:G.installed?o.innerHTML='Not connected':(o.innerHTML='Not available',a.disabled=!0)}catch{o.innerHTML='Could not check status'}function ae(){const W=m.value||"subdomain",G=document.querySelector('input[name="dns-type"]:checked').value,V=document.querySelector('input[name="ssl-type"]:checked').value;let K="";if(SITE.routingMode==="subdirectory"&&SITE.domain)K=`https://${SITE.domain}/${W}`;else if(G==="private")K=`${V==="none"?"http":"https"}://${buildDomain(W)}`;else if(G==="public"){const te=V==="none"?"http":"https",ee=SITE.domain||W;K=SITE.domain?`${te}://${W}.${SITE.domain}`:`${te}://${W}`}else{const te=e.value||s.defaultPort||DC.DEFAULTS.SERVICE_PORT;K=`http://${t.value}:${te}`}c.textContent=K}m.oninput=ae,t.oninput=ae,e.oninput=ae,document.querySelectorAll('input[name="dns-type"]').forEach(W=>{W.onchange=ae}),document.querySelectorAll('input[name="ssl-type"]').forEach(W=>{W.onchange=ae}),ae(),z.classList.remove("show"),p.classList.add("show"),p.dataset.appTemplate=JSON.stringify(s)}async function k(s){const p=s.appTemplate,l=safeGetJSON(B,[]),m=p._useExisting&&p._existingContainer,c=l.find(t=>t.id===s.subdomain);if(!(c&&!m&&!confirm(`An app with subdomain "${s.subdomain}" already exists. Redeploy?`))){if(c){const t=l.indexOf(c);l.splice(t,1),safeSet(B,JSON.stringify(l))}if(m)s.port=p._existingContainer.primaryPort;else{const t=s.port||p.defaultPort||8080;showNotification(`Checking port ${t} availability...`,"info",0);const e=await D(t);if(!e.available){const a=await h(p.defaultPort||8080);if(confirm(`Port ${t} is already in use by ${e.conflict?.usedBy||"another container"}. + `:G.installed?o.innerHTML='Not connected':(o.innerHTML='Not available',a.disabled=!0)}catch{o.innerHTML='Could not check status'}function ae(){const W=m.value||"subdomain",G=document.querySelector('input[name="dns-type"]:checked').value,V=document.querySelector('input[name="ssl-type"]:checked').value;let K="";if(SITE.routingMode==="subdirectory"&&SITE.domain)K=`https://${SITE.domain}/${W}`;else if(G==="private")K=`${V==="none"?"http":"https"}://${buildDomain(W)}`;else if(G==="public"){const te=V==="none"?"http":"https",ee=SITE.domain||W;K=SITE.domain?`${te}://${W}.${SITE.domain}`:`${te}://${W}`}else{const te=e.value||s.defaultPort||DC.DEFAULTS.SERVICE_PORT;K=`http://${t.value}:${te}`}c.textContent=K}m.oninput=ae,t.oninput=ae,e.oninput=ae,document.querySelectorAll('input[name="dns-type"]').forEach(W=>{W.onchange=ae}),document.querySelectorAll('input[name="ssl-type"]').forEach(W=>{W.onchange=ae}),ae(),z.classList.remove("show"),p.classList.add("show"),p.dataset.appTemplate=JSON.stringify(s)}async function S(s){const p=s.appTemplate,l=safeGetJSON(B,[]),m=p._useExisting&&p._existingContainer,c=l.find(t=>t.id===s.subdomain);if(!(c&&!m&&!confirm(`An app with subdomain "${s.subdomain}" already exists. Redeploy?`))){if(c){const t=l.indexOf(c);l.splice(t,1),safeSet(B,JSON.stringify(l))}if(m)s.port=p._existingContainer.primaryPort;else{const t=s.port||p.defaultPort||8080;showNotification(`Checking port ${t} availability...`,"info",0);const e=await D(t);if(!e.available){const a=await h(p.defaultPort||8080);if(confirm(`Port ${t} is already in use by ${e.conflict?.usedBy||"another container"}. Would you like to use port ${a} instead?`))s.port=a;else{showNotification("Deployment cancelled - port conflict","error",5e3);return}}}showNotification(m?`Configuring ${p.name} with existing container...`:`Deploying ${p.name}...`,"info",0);try{const t={appId:p.id,config:{subdomain:s.subdomain,ip:s.ip,createDns:s.dnsType==="private",port:s.port||p.defaultPort||null,sslType:s.sslType,dnsType:s.dnsType,tailscaleOnly:s.tailscaleOnly||!1,mediaPath:s.mediaPath||null,plexClaimToken:s.plexClaimToken||null,customVolumes:s.customVolumes||null}};m&&(t.config.useExisting=!0,t.config.existingContainerId=p._existingContainer.id,t.config.existingPort=p._existingContainer.primaryPort,!s.port&&p._existingContainer.primaryPort&&(t.config.port=p._existingContainer.primaryPort));const a=await(await secureFetch("/api/v1/apps/deploy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})).json();if(a.success){const o={id:s.subdomain,name:p.name,logo:`/assets/${p.id}.png`,containerId:a.containerId,url:a.url,ip:s.ip,appTemplate:p.id,tailscaleOnly:s.tailscaleOnly||!1};l.push(o),safeSet(B,JSON.stringify(l)),window.APPS&&!window.APPS.some(n=>n.id===p.id)&&(window.APPS.push(o),typeof window.buildGrid=="function"&&window.buildGrid(),typeof window.refreshAll=="function"&&setTimeout(()=>window.refreshAll(),500));let i=a.usedExisting?`${p.name} configured with existing container! URL: ${a.url}`:`${p.name} deployed successfully! URL: ${a.url}`;a.warning&&(i+=` \u26A0 Warning: ${a.warning}`),showNotification(i,"success",8e3),delete p._useExisting,delete p._existingContainer,a.url&&a.url.startsWith("https://")&&$(a.url,p.name),a.setupInstructions&&a.setupInstructions.length>0&&setTimeout(()=>{const n=a.setupInstructions.join(` -`);showNotification(`Setup Instructions for ${p.name}: ${n}`,"info",1e4)},1e3)}else throw new Error(a.error||"Deployment failed")}catch(t){w.logError("[AppSelector] Deployment",t,{function:"deploy"}),showNotification(`Failed to deploy ${p.name}: ${t.message}`,"error",8e3)}}}async function $(s,p){showNotification(`\u23F3 Generating SSL certificate for ${p}...`,"warning",6e4);let l=0;const m=12,c=async()=>{l++;try{const t=await fetch(s,{method:"HEAD",mode:"no-cors"});return showNotification(`\u2705 ${p} is ready! SSL certificate generated.`,"success",5e3),!0}catch{return l{window.APPS.some(l=>l.id===p.id)||window.APPS.push(p)})}document.getElementById("add-service-btn")?.addEventListener("click",()=>{T(),z.classList.add("show")}),wireModal(z,document.getElementById("app-selector-cancel"));const I=document.getElementById("app-deploy-modal");document.getElementById("app-deploy-cancel")?.addEventListener("click",()=>{I.classList.remove("show")}),document.getElementById("app-deploy-confirm")?.addEventListener("click",()=>{const s=JSON.parse(I.dataset.appTemplate),p=document.getElementById("deploy-media-path").value.trim(),l=[];document.querySelectorAll("#volume-mounts-list .vol-host-path").forEach(c=>{l.push({hostPath:c.value.trim(),containerPath:c.dataset.containerPath})});const m={appTemplate:s,subdomain:document.getElementById("deploy-subdomain").value.trim(),dnsType:document.querySelector('input[name="dns-type"]:checked').value,sslType:document.querySelector('input[name="ssl-type"]:checked').value,ip:document.getElementById("deploy-ip").value.trim(),port:document.getElementById("deploy-port").value.trim(),tailscaleOnly:document.getElementById("deploy-tailscale-only").checked,mediaPath:p||null,plexClaimToken:document.getElementById("deploy-plex-claim")?.value.trim()||null,customVolumes:l.length>0?l:null,resources:{cpus:parseFloat(document.getElementById("deploy-cpu-limit").value)||0,memory:parseFloat(document.getElementById("deploy-memory-limit").value)||0}};if(!m.subdomain){showNotification("Please enter a subdomain or domain name","warning");return}if(s.mediaMount?.required&&!p){showNotification("Please enter a media library path for this application","warning");return}I.classList.remove("show"),k(m)}),wireModal(I);const O=document.getElementById("folder-browser-modal"),C=document.getElementById("folder-browser-path"),j=document.getElementById("folder-browser-list"),N=document.getElementById("folder-browser-selected"),R=document.getElementById("folder-browser-selected-list");let u="",v=[],x=null;window.openFolderBrowser=function(s){x=s,v=s.value.split(",").map(p=>p.trim()).filter(p=>p),u="",b(),g(""),O.classList.add("show")};async function g(s){C.textContent=s||"Select a drive...",j.innerHTML='
Loading...
';try{const l=await(await fetch(`/api/v1/browse/directories?path=${encodeURIComponent(s)}`)).json();if(!l.success){j.innerHTML=`
Error: ${escapeHtml(l.error)}
`;return}u=l.path||"",C.textContent=u||"Select a drive...";let m="";l.parent&&l.parent!==l.path&&(m+=`
+`);showNotification(`Setup Instructions for ${p.name}: ${n}`,"info",1e4)},1e3)}else throw new Error(a.error||"Deployment failed")}catch(t){k.logError("[AppSelector] Deployment",t,{function:"deploy"}),showNotification(`Failed to deploy ${p.name}: ${t.message}`,"error",8e3)}}}async function $(s,p){showNotification(`\u23F3 Generating SSL certificate for ${p}...`,"warning",6e4);let l=0;const m=12,c=async()=>{l++;try{const t=await fetch(s,{method:"HEAD",mode:"no-cors"});return showNotification(`\u2705 ${p} is ready! SSL certificate generated.`,"success",5e3),!0}catch{return l{window.APPS.some(l=>l.id===p.id)||window.APPS.push(p)})}document.getElementById("add-service-btn")?.addEventListener("click",()=>{T(),z.classList.add("show")}),wireModal(z,document.getElementById("app-selector-cancel"));const E=document.getElementById("app-deploy-modal");document.getElementById("app-deploy-cancel")?.addEventListener("click",()=>{E.classList.remove("show")}),document.getElementById("app-deploy-confirm")?.addEventListener("click",()=>{const s=JSON.parse(E.dataset.appTemplate),p=document.getElementById("deploy-media-path").value.trim(),l=[];document.querySelectorAll("#volume-mounts-list .vol-host-path").forEach(c=>{l.push({hostPath:c.value.trim(),containerPath:c.dataset.containerPath})});const m={appTemplate:s,subdomain:document.getElementById("deploy-subdomain").value.trim(),dnsType:document.querySelector('input[name="dns-type"]:checked').value,sslType:document.querySelector('input[name="ssl-type"]:checked').value,ip:document.getElementById("deploy-ip").value.trim(),port:document.getElementById("deploy-port").value.trim(),tailscaleOnly:document.getElementById("deploy-tailscale-only").checked,mediaPath:p||null,plexClaimToken:document.getElementById("deploy-plex-claim")?.value.trim()||null,customVolumes:l.length>0?l:null,resources:{cpus:parseFloat(document.getElementById("deploy-cpu-limit").value)||0,memory:parseFloat(document.getElementById("deploy-memory-limit").value)||0}};if(!m.subdomain){showNotification("Please enter a subdomain or domain name","warning");return}if(s.mediaMount?.required&&!p){showNotification("Please enter a media library path for this application","warning");return}E.classList.remove("show"),S(m)}),wireModal(E);const O=document.getElementById("folder-browser-modal"),C=document.getElementById("folder-browser-path"),j=document.getElementById("folder-browser-list"),N=document.getElementById("folder-browser-selected"),R=document.getElementById("folder-browser-selected-list");let u="",v=[],x=null;window.openFolderBrowser=function(s){x=s,v=s.value.split(",").map(p=>p.trim()).filter(p=>p),u="",b(),g(""),O.classList.add("show")};async function g(s){C.textContent=s||"Select a drive...",j.innerHTML='
Loading...
';try{const l=await(await fetch(`/api/v1/browse/directories?path=${encodeURIComponent(s)}`)).json();if(!l.success){j.innerHTML=`
Error: ${escapeHtml(l.error)}
`;return}u=l.path||"",C.textContent=u||"Select a drive...";let m="";l.parent&&l.parent!==l.path&&(m+=`
\u2B06\uFE0F .. Parent Directory
`),l.items.length===0&&!l.parent?m+='
No browseable drives configured. Check your docker-compose.yml volume mounts.
':l.items.length===0?m+='
No subfolders found
':l.items.forEach(c=>{const t=c.type==="drive"?"\u{1F4BE}":"\u{1F4C1}",e=v.includes(c.path),a=e?"background: color-mix(in srgb, var(--success) 20%, transparent);":"";m+=`
@@ -378,7 +378,7 @@ Try refreshing in a moment if you see a certificate error.`,"warning",1e4),!1}}; ${escapeHtml(s)} - `).join("")}window.removeSelectedFolder=function(s){v=v.filter(p=>p!==s),b(),g(u)},document.getElementById("folder-browser-select-current").addEventListener("click",()=>{u&&!v.includes(u)&&(v.push(u),b(),g(u))}),wireModal(O,document.getElementById("folder-browser-cancel")),document.getElementById("folder-browser-done").addEventListener("click",()=>{x&&(x.value=v.join(", ")),O.classList.remove("show")}),E()})(),(function(){injectModal("recipe-deploy-modal",`
+ `).join("")}window.removeSelectedFolder=function(s){v=v.filter(p=>p!==s),b(),g(u)},document.getElementById("folder-browser-select-current").addEventListener("click",()=>{u&&!v.includes(u)&&(v.push(u),b(),g(u))}),wireModal(O,document.getElementById("folder-browser-cancel")),document.getElementById("folder-browser-done").addEventListener("click",()=>{x&&(x.value=v.join(", ")),O.classList.remove("show")}),w()})(),(function(){injectModal("recipe-deploy-modal",`

Deploy Recipe

@@ -445,13 +445,13 @@ Try refreshing in a moment if you see a certificate error.`,"warning",1e4),!1}};
-
`);let w=null,B=null,A=null,S=1,z=!1;const P=document.getElementById("recipe-deploy-modal"),M=document.getElementById("recipe-cancel"),D=document.getElementById("recipe-prev"),h=document.getElementById("recipe-next");wireModal(P,M);async function T(){try{const u=await fetch("/api/v1/recipes/templates"),v=await u.json();if(v.success)return w=v.templates,B=v.categories,!0;if(u.status===403)return z=!1,!1}catch(u){console.warn("Failed to fetch recipe templates:",u.message)}return!1}async function f(){try{z=(await(await fetch("/api/v1/license/feature/recipes")).json()).available}catch{z=!1}return z}window.renderRecipeCards=async function(u){await f();let v;if(z&&w?v=w:v=H(),!v||v.length===0)return;const x=document.createElement("div");x.className="app-category-header",x.innerHTML="\u{1F9EA} Recipes",x.style.borderBottomColor="#8e44ad",u.appendChild(x);const g=Array.isArray(v)?v:Object.values(v);g.sort((b,s)=>(s.popularity||0)-(b.popularity||0));for(const b of g){const s=document.createElement("div");s.className="app-option",s.style.position="relative";const p=`
${b.componentCount||b.components?.length||"?"} apps
`,l=z?"":'
PREMIUM
';s.innerHTML=` +
`);let k=null,B=null,A=null,I=1,z=!1;const P=document.getElementById("recipe-deploy-modal"),M=document.getElementById("recipe-cancel"),D=document.getElementById("recipe-prev"),h=document.getElementById("recipe-next");wireModal(P,M);async function T(){try{const u=await fetch("/api/v1/recipes/templates"),v=await u.json();if(v.success)return k=v.templates,B=v.categories,!0;if(u.status===403)return z=!1,!1}catch(u){console.warn("Failed to fetch recipe templates:",u.message)}return!1}async function f(){try{z=(await(await fetch("/api/v1/license/feature/recipes")).json()).available}catch{z=!1}return z}window.renderRecipeCards=async function(u){await f();let v;if(z&&k?v=k:v=H(),!v||v.length===0)return;const x=document.createElement("div");x.className="app-category-header",x.innerHTML="\u{1F9EA} Recipes",x.style.borderBottomColor="#8e44ad",u.appendChild(x);const g=Array.isArray(v)?v:Object.values(v);g.sort((b,s)=>(s.popularity||0)-(b.popularity||0));for(const b of g){const s=document.createElement("div");s.className="app-option",s.style.position="relative";const p=`
${b.componentCount||b.components?.length||"?"} apps
`,l=z?"":'
PREMIUM
';s.innerHTML=` ${l}
${escapeHtml(b.icon||"\u{1F9EA}")}
${escapeHtml(b.name)}
${escapeHtml(b.description||"")}
${p} - `,s.onclick=()=>{if(!z){showNotification("Recipes require a DashCaddy Premium license. Click the License button to activate.","warning",5e3),window.openLicenseModal&&window.openLicenseModal();return}k(b)},u.appendChild(s)}};function H(){return[{id:"htpc-suite",name:"HTPC Suite",icon:"\u{1F3AC}",description:"Complete media automation: find, download, organize, and stream",componentCount:6,popularity:98},{id:"nextcloud-complete",name:"Nextcloud Complete",icon:"\u2601\uFE0F",description:"Full productivity suite: cloud storage, office editing, and collaboration",componentCount:4,popularity:90},{id:"smart-home",name:"Smart Home Hub",icon:"\u{1F3E0}",description:"Home automation: control, automate, and monitor IoT devices",componentCount:4,popularity:88},{id:"dev-environment",name:"Dev Environment",icon:"\u{1F4BB}",description:"Self-hosted development workflow: Git, CI/CD, IDE, and database",componentCount:4,popularity:82}]}function k(u){A=u,S=1;const v=document.getElementById("app-selector-modal");v&&v.classList.remove("show"),document.getElementById("recipe-deploy-title").textContent=`Deploy ${u.name}`,$(),E(),P.classList.add("show")}function $(){document.querySelectorAll("#recipe-steps .recipe-step").forEach(u=>{const v=parseInt(u.dataset.step);u.classList.toggle("active",v===S),u.classList.toggle("completed",v1&&S<4?"":"none",S===4?(h.style.display="none",M.textContent="Close"):S===3?(h.textContent="\u{1F680} Deploy",h.style.display="",M.textContent="Cancel"):(h.textContent="Next",h.style.display="",M.textContent="Cancel")}function E(){const u=document.getElementById("recipe-component-list");u.innerHTML="";const v=A.components||[];for(const x of v){const g=document.createElement("div");g.style.cssText="display: flex; align-items: center; gap: 12px; padding: 12px; border-radius: 8px; background: var(--card-bg); border: 1px solid var(--border);";const b=x.required,s=x.internal;g.innerHTML=` + `,s.onclick=()=>{if(!z){showNotification("Recipes require a DashCaddy Premium license. Click the License button to activate.","warning",5e3),window.openLicenseModal&&window.openLicenseModal();return}S(b)},u.appendChild(s)}};function H(){return[{id:"htpc-suite",name:"HTPC Suite",icon:"\u{1F3AC}",description:"Complete media automation: find, download, organize, and stream",componentCount:6,popularity:98},{id:"nextcloud-complete",name:"Nextcloud Complete",icon:"\u2601\uFE0F",description:"Full productivity suite: cloud storage, office editing, and collaboration",componentCount:4,popularity:90},{id:"smart-home",name:"Smart Home Hub",icon:"\u{1F3E0}",description:"Home automation: control, automate, and monitor IoT devices",componentCount:4,popularity:88},{id:"dev-environment",name:"Dev Environment",icon:"\u{1F4BB}",description:"Self-hosted development workflow: Git, CI/CD, IDE, and database",componentCount:4,popularity:82}]}function S(u){A=u,I=1;const v=document.getElementById("app-selector-modal");v&&v.classList.remove("show"),document.getElementById("recipe-deploy-title").textContent=`Deploy ${u.name}`,$(),w(),P.classList.add("show")}function $(){document.querySelectorAll("#recipe-steps .recipe-step").forEach(u=>{const v=parseInt(u.dataset.step);u.classList.toggle("active",v===I),u.classList.toggle("completed",v1&&I<4?"":"none",I===4?(h.style.display="none",M.textContent="Close"):I===3?(h.textContent="\u{1F680} Deploy",h.style.display="",M.textContent="Cancel"):(h.textContent="Next",h.style.display="",M.textContent="Cancel")}function w(){const u=document.getElementById("recipe-component-list");u.innerHTML="";const v=A.components||[];for(const x of v){const g=document.createElement("div");g.style.cssText="display: flex; align-items: center; gap: 12px; padding: 12px; border-radius: 8px; background: var(--card-bg); border: 1px solid var(--border);";const b=x.required,s=x.internal;g.innerHTML=`
@@ -463,7 +463,7 @@ Try refreshing in a moment if you see a certificate error.`,"warning",1e4),!1}};
${x.note?`
\u26A0 ${escapeHtml(x.note)}
`:""}
- `,u.appendChild(g)}}function I(){const u=document.getElementById("recipe-volumes-section"),v=document.getElementById("recipe-volume-list"),x=A.sharedVolumes;if(x&&Object.keys(x).length>0){u.style.display="",v.innerHTML="";for(const[g,b]of Object.entries(x)){const s=document.createElement("div");s.style.cssText="display: grid; gap: 4px;",s.innerHTML=` + `,u.appendChild(g)}}function E(){const u=document.getElementById("recipe-volumes-section"),v=document.getElementById("recipe-volume-list"),x=A.sharedVolumes;if(x&&Object.keys(x).length>0){u.style.display="",v.innerHTML="";for(const[g,b]of Object.entries(x)){const s=document.createElement("div");s.style.cssText="display: grid; gap: 4px;",s.innerHTML=` Deployment failed: ${escapeHtml(l.error||"Unknown error")}
`,showNotification(`Recipe deployment failed: ${l.error}`,"error",5e3)}catch(p){v.style.display="",v.innerHTML=`
Network error: ${escapeHtml(p.message)} -
`}}function N(u,v,x){const g=document.getElementById(`recipe-progress-${u}`);if(!g)return;const b=g.querySelector(".recipe-progress-icon"),s=g.querySelector(".recipe-progress-status");v==="deploying"?(b.textContent="\u23F3",s.style.color="var(--accent)"):v==="success"?(b.textContent="\u2705",s.style.color="var(--ok-fg)"):v==="error"&&(b.textContent="\u274C",s.style.color="var(--bad-fg)"),s.textContent=x}h.addEventListener("click",()=>{if(S===3){S=4,$(),j();return}S<3&&(S++,$(),S===2&&I(),S===3&&O())}),D.addEventListener("click",()=>{S>1&&S<4&&(S--,$())}),window.groupRecipeCards=function(){const u=document.querySelectorAll(".service-card[data-recipe-id]");if(u.length===0)return;const v={};u.forEach(x=>{const g=x.dataset.recipeId;v[g]||(v[g]=[]),v[g].push(x)});for(const[x,g]of Object.entries(v))g.length<2||g.forEach((b,s)=>{if(b.style.borderLeft="3px solid rgba(142,68,173,0.5)",s===0){let p=b.querySelector(".recipe-group-label");p||(p=document.createElement("div"),p.className="recipe-group-label",p.style.cssText="position: absolute; top: -8px; left: 12px; font-size: 0.6rem; padding: 1px 8px; border-radius: 8px; background: rgba(142,68,173,0.3); color: #d4a5ff; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px;",p.textContent=x.replace(/-/g," "),b.style.position="relative",b.appendChild(p))}})},window.manageRecipe=async function(u,v){const x=`/api/v1/recipes/${u}/${v}`,g=v==="remove"?"DELETE":"POST",b=v==="remove"?`/api/v1/recipes/${u}`:x;if(!(v==="remove"&&!confirm(`Remove the entire ${u} recipe? This will delete all containers and configuration.`)))try{const p=await(await secureFetch(b,{method:g})).json();p.success?(showNotification(`Recipe ${v}: ${p.results?.filter(l=>l.status!=="failed").length||0} components processed`,"success",4e3),window.loadServices&&window.loadServices()):showNotification(`Recipe ${v} failed: ${p.error}`,"error",5e3)}catch(s){showNotification(`Network error: ${s.message}`,"error",5e3)}};const R=document.createElement("style");R.textContent=` + `}}function N(u,v,x){const g=document.getElementById(`recipe-progress-${u}`);if(!g)return;const b=g.querySelector(".recipe-progress-icon"),s=g.querySelector(".recipe-progress-status");v==="deploying"?(b.textContent="\u23F3",s.style.color="var(--accent)"):v==="success"?(b.textContent="\u2705",s.style.color="var(--ok-fg)"):v==="error"&&(b.textContent="\u274C",s.style.color="var(--bad-fg)"),s.textContent=x}h.addEventListener("click",()=>{if(I===3){I=4,$(),j();return}I<3&&(I++,$(),I===2&&E(),I===3&&O())}),D.addEventListener("click",()=>{I>1&&I<4&&(I--,$())}),window.groupRecipeCards=function(){const u=document.querySelectorAll(".service-card[data-recipe-id]");if(u.length===0)return;const v={};u.forEach(x=>{const g=x.dataset.recipeId;v[g]||(v[g]=[]),v[g].push(x)});for(const[x,g]of Object.entries(v))g.length<2||g.forEach((b,s)=>{if(b.style.borderLeft="3px solid rgba(142,68,173,0.5)",s===0){let p=b.querySelector(".recipe-group-label");p||(p=document.createElement("div"),p.className="recipe-group-label",p.style.cssText="position: absolute; top: -8px; left: 12px; font-size: 0.6rem; padding: 1px 8px; border-radius: 8px; background: rgba(142,68,173,0.3); color: #d4a5ff; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px;",p.textContent=x.replace(/-/g," "),b.style.position="relative",b.appendChild(p))}})},window.manageRecipe=async function(u,v){const x=`/api/v1/recipes/${u}/${v}`,g=v==="remove"?"DELETE":"POST",b=v==="remove"?`/api/v1/recipes/${u}`:x;if(!(v==="remove"&&!confirm(`Remove the entire ${u} recipe? This will delete all containers and configuration.`)))try{const p=await(await secureFetch(b,{method:g})).json();p.success?(showNotification(`Recipe ${v}: ${p.results?.filter(l=>l.status!=="failed").length||0} components processed`,"success",4e3),window.loadServices&&window.loadServices()):showNotification(`Recipe ${v} failed: ${p.error}`,"error",5e3)}catch(s){showNotification(`Network error: ${s.message}`,"error",5e3)}};const R=document.createElement("style");R.textContent=` .recipe-step { flex: 1; text-align: center; @@ -550,7 +550,7 @@ Try refreshing in a moment if you see a certificate error.`,"warning",1e4),!1}}; .recipe-step-panel { min-height: 180px; } - `,document.head.appendChild(R),f()})(),(function(){document.getElementById("reload-caddy-top")?.addEventListener("click",async()=>{const w=document.getElementById("reload-caddy-top"),B=w.textContent;try{w.textContent="\u23F3 Reloading...",w.disabled=!0;const A=await secureFetch("/api/v1/caddy/reload",{method:"POST",headers:{"Content-Type":"application/json"}}),S=await A.json();if(A.ok&&S.success)w.textContent="\u2705 Reloaded!",setTimeout(()=>{w.textContent=B,w.disabled=!1},2e3);else throw new Error(S.error||"Reload failed")}catch(A){w.textContent="\u274C Failed",showNotification(`Failed to reload Caddy: ${A.message}`,"error"),setTimeout(()=>{w.textContent=B,w.disabled=!1},2e3)}})})(),(function(){injectModal("error-log-modal",`
+ `,document.head.appendChild(R),f()})(),(function(){document.getElementById("reload-caddy-top")?.addEventListener("click",async()=>{const k=document.getElementById("reload-caddy-top"),B=k.textContent;try{k.textContent="\u23F3 Reloading...",k.disabled=!0;const A=await secureFetch("/api/v1/caddy/reload",{method:"POST",headers:{"Content-Type":"application/json"}}),I=await A.json();if(A.ok&&I.success)k.textContent="\u2705 Reloaded!",setTimeout(()=>{k.textContent=B,k.disabled=!1},2e3);else throw new Error(I.error||"Reload failed")}catch(A){k.textContent="\u274C Failed",showNotification(`Failed to reload Caddy: ${A.message}`,"error"),setTimeout(()=>{k.textContent=B,k.disabled=!1},2e3)}})})(),(function(){injectModal("error-log-modal",`

\u{1F4CB} Error Logs

-
`);const w=document.getElementById("error-log-modal"),B=document.getElementById("view-error-logs"),A=document.getElementById("error-log-refresh"),S=document.getElementById("error-log-clear"),z=document.getElementById("error-log-close"),P=document.getElementById("error-log-level"),M=document.getElementById("error-log-context"),D=document.getElementById("error-log-search"),h=document.getElementById("error-log-since"),T=document.getElementById("error-log-until"),f=document.getElementById("error-log-container"),H=document.getElementById("error-log-load-more"),k=document.getElementById("error-log-total"),$=50;let E=0,I=null,O=0,C=[];function j(b){if(!b)return null;const s=new Date(b);return isNaN(s.getTime())?null:s.toISOString()}async function N(){try{const b=await fetch("/api/v1/error-logs/contexts");if(!b.ok)return;const s=await b.json();if(!s.success||!Array.isArray(s.contexts))return;C=s.contexts;const p=M.value;M.innerHTML='';for(const l of s.contexts){const m=document.createElement("option");m.value=l.name,m.textContent=`${l.name} (${l.count})`,M.appendChild(m)}p&&s.contexts.some(l=>l.name===p)&&(M.value=p)}catch{}}function R(){const b=new URLSearchParams;b.set("limit",String($)),b.set("offset",String(E)),P.value&&b.set("level",P.value),M.value&&b.set("context",M.value);const s=j(h.value),p=j(T.value);s&&b.set("since",s),p&&b.set("until",p);const l=(D.value||"").trim();return l&&b.set("search",l),b}async function u(b){try{b?(I&&I.abort(),I=new AbortController):(I&&I.abort(),I=new AbortController,E=0,O++,f.innerHTML='
Loading...
');const s=O,p=R(),l=await fetch("/api/v1/error-logs?"+p.toString(),{signal:I.signal});if(!l.ok){f.innerHTML=`
Failed: HTTP ${l.status}
`,H.style.display="none",k.textContent="";return}const m=await l.json();if(!m.success){f.innerHTML=`
Failed: ${escapeHtml(m.error||"unknown")}
`,H.style.display="none",k.textContent="";return}if(!b&&s!==O)return;const c=Array.isArray(m.logs)?m.logs:[];if(c.length===0&&!b){const e=m.filters&&(m.filters.level||m.filters.context||m.filters.search||m.filters.since||m.filters.until)?"No error log entries match your filters.":"\u2705 No errors logged! Everything is working smoothly.";f.innerHTML=`
\u{1F4CB}${escapeHtml(e)}
`,H.style.display="none",k.textContent=m.total?`${m.total} total`:"";return}let t="";b||(t='',t+='',t+='',t+='',t+='',t+='',t+='',t+="");for(const e of c){const a=(e.level||"?").toUpperCase(),o=a==="ERR"?"var(--bad-fg)":a==="WARN"?"var(--warn-fg, #f0c674)":"var(--muted)",i=e.timestamp?new Date(e.timestamp).toLocaleString():"\u2014",n=e.context||"\u2014",r=(e.error||"").split(` -`)[0],d=e.request&&e.request.ip||"";t+='',t+=``,t+=``,t+=``,t+=``,t+=``,t+="",e.detail&&(t+=``)}if(!b)t+="
WhenLevelContextMessageIP
${escapeHtml(i)}${escapeHtml(a)}${escapeHtml(n)}${escapeHtml(r)}${escapeHtml(d)}
",f.innerHTML=t;else{const e=f.querySelector("table");e&&e.insertAdjacentHTML("beforeend",t)}E+=c.length,H.style.display=m.hasMore?"":"none",k.textContent=`${m.total} total${m.hasMore?" (showing "+E+")":""}`,f.querySelectorAll(".error-log-row").forEach(e=>{e.dataset.wired||(e.dataset.wired="true",e.addEventListener("click",()=>{const a=e.nextElementSibling;a&&a.classList.contains("error-log-detail")&&(a.style.display=a.style.display==="none"?"":"none")}))})}catch(s){if(s&&s.name==="AbortError")return;f.innerHTML=`
Failed: ${escapeHtml(s.message)}
`,k.textContent=""}}async function v(){if(confirm("Clear the entire error log? This cannot be undone."))try{const s=await(await secureFetch("/api/v1/error-logs",{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:"CLEAR"})})).json();s.success?(await N(),u(!1),showNotification("\u2705 Error logs cleared","success",3e3)):showNotification("\u274C "+(s.error||"Clear failed"),"error",4e3)}catch(b){showNotification("\u274C "+b.message,"error",4e3)}}let x;function g(){P?.addEventListener("change",()=>u(!1)),M?.addEventListener("change",()=>u(!1)),D?.addEventListener("input",()=>{clearTimeout(x),x=setTimeout(()=>u(!1),250)});let b;[h,T].forEach(s=>{s?.addEventListener("change",()=>{clearTimeout(b),b=setTimeout(()=>u(!1),250)})}),A?.addEventListener("click",()=>u(!1)),H?.addEventListener("click",()=>u(!0)),S?.addEventListener("click",v),wireModal(w,z)}B?.addEventListener("click",async()=>{w?.classList.add("show"),await N(),u(!1)}),g()})(),(function(){injectModal("container-logs-modal",`
+
`);const k=document.getElementById("error-log-modal"),B=document.getElementById("view-error-logs"),A=document.getElementById("error-log-refresh"),I=document.getElementById("error-log-clear"),z=document.getElementById("error-log-close"),P=document.getElementById("error-log-level"),M=document.getElementById("error-log-context"),D=document.getElementById("error-log-search"),h=document.getElementById("error-log-since"),T=document.getElementById("error-log-until"),f=document.getElementById("error-log-container"),H=document.getElementById("error-log-load-more"),S=document.getElementById("error-log-total"),$=50;let w=0,E=null,O=0,C=[];function j(b){if(!b)return null;const s=new Date(b);return isNaN(s.getTime())?null:s.toISOString()}async function N(){try{const b=await fetch("/api/v1/error-logs/contexts");if(!b.ok)return;const s=await b.json();if(!s.success||!Array.isArray(s.contexts))return;C=s.contexts;const p=M.value;M.innerHTML='';for(const l of s.contexts){const m=document.createElement("option");m.value=l.name,m.textContent=`${l.name} (${l.count})`,M.appendChild(m)}p&&s.contexts.some(l=>l.name===p)&&(M.value=p)}catch{}}function R(){const b=new URLSearchParams;b.set("limit",String($)),b.set("offset",String(w)),P.value&&b.set("level",P.value),M.value&&b.set("context",M.value);const s=j(h.value),p=j(T.value);s&&b.set("since",s),p&&b.set("until",p);const l=(D.value||"").trim();return l&&b.set("search",l),b}async function u(b){try{b?(E&&E.abort(),E=new AbortController):(E&&E.abort(),E=new AbortController,w=0,O++,f.innerHTML='
Loading...
');const s=O,p=R(),l=await fetch("/api/v1/error-logs?"+p.toString(),{signal:E.signal});if(!l.ok){f.innerHTML=`
Failed: HTTP ${l.status}
`,H.style.display="none",S.textContent="";return}const m=await l.json();if(!m.success){f.innerHTML=`
Failed: ${escapeHtml(m.error||"unknown")}
`,H.style.display="none",S.textContent="";return}if(!b&&s!==O)return;const c=Array.isArray(m.logs)?m.logs:[];if(c.length===0&&!b){const e=m.filters&&(m.filters.level||m.filters.context||m.filters.search||m.filters.since||m.filters.until)?"No error log entries match your filters.":"\u2705 No errors logged! Everything is working smoothly.";f.innerHTML=`
\u{1F4CB}${escapeHtml(e)}
`,H.style.display="none",S.textContent=m.total?`${m.total} total`:"";return}let t="";b||(t='',t+='',t+='',t+='',t+='',t+='',t+='',t+="");for(const e of c){const a=(e.level||"?").toUpperCase(),o=a==="ERR"?"var(--bad-fg)":a==="WARN"?"var(--warn-fg, #f0c674)":"var(--muted)",i=e.timestamp?new Date(e.timestamp).toLocaleString():"\u2014",n=e.context||"\u2014",r=(e.error||"").split(` +`)[0],d=e.request&&e.request.ip||"";t+='',t+=``,t+=``,t+=``,t+=``,t+=``,t+="",e.detail&&(t+=``)}if(!b)t+="
WhenLevelContextMessageIP
${escapeHtml(i)}${escapeHtml(a)}${escapeHtml(n)}${escapeHtml(r)}${escapeHtml(d)}
",f.innerHTML=t;else{const e=f.querySelector("table");e&&e.insertAdjacentHTML("beforeend",t)}w+=c.length,H.style.display=m.hasMore?"":"none",S.textContent=`${m.total} total${m.hasMore?" (showing "+w+")":""}`,f.querySelectorAll(".error-log-row").forEach(e=>{e.dataset.wired||(e.dataset.wired="true",e.addEventListener("click",()=>{const a=e.nextElementSibling;a&&a.classList.contains("error-log-detail")&&(a.style.display=a.style.display==="none"?"":"none")}))})}catch(s){if(s&&s.name==="AbortError")return;f.innerHTML=`
Failed: ${escapeHtml(s.message)}
`,S.textContent=""}}async function v(){if(confirm("Clear the entire error log? This cannot be undone."))try{const s=await(await secureFetch("/api/v1/error-logs",{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:"CLEAR"})})).json();s.success?(await N(),u(!1),showNotification("\u2705 Error logs cleared","success",3e3)):showNotification("\u274C "+(s.error||"Clear failed"),"error",4e3)}catch(b){showNotification("\u274C "+b.message,"error",4e3)}}let x;function g(){P?.addEventListener("change",()=>u(!1)),M?.addEventListener("change",()=>u(!1)),D?.addEventListener("input",()=>{clearTimeout(x),x=setTimeout(()=>u(!1),250)});let b;[h,T].forEach(s=>{s?.addEventListener("change",()=>{clearTimeout(b),b=setTimeout(()=>u(!1),250)})}),A?.addEventListener("click",()=>u(!1)),H?.addEventListener("click",()=>u(!0)),I?.addEventListener("click",v),wireModal(k,z)}B?.addEventListener("click",async()=>{k?.classList.add("show"),await N(),u(!1)}),g()})(),(function(){injectModal("container-logs-modal",`
@@ -648,14 +648,14 @@ Try refreshing in a moment if you see a certificate error.`,"warning",1e4),!1}};
-
`);const w=document.getElementById("container-logs-modal"),B=document.getElementById("cl-container-select"),A=document.getElementById("cl-log-content"),S=document.getElementById("cl-log-search"),z=document.getElementById("cl-log-tail"),P=document.getElementById("cl-refresh"),M=document.getElementById("cl-stream"),D=document.getElementById("cl-download"),h=document.getElementById("cl-clear-search"),T=document.getElementById("cl-close"),f=document.getElementById("cl-close-btn"),H=document.getElementById("cl-stream-status"),k=document.getElementById("cl-stream-indicator"),$=document.getElementById("cl-stream-text"),E=document.getElementById("cl-line-count"),I=document.getElementById("cl-filter-count"),O=document.getElementById("cl-image"),C=document.getElementById("cl-status"),j=document.getElementById("cl-created");let N=null,R=[],u=[],v=null,x=!1,g=null;function b(r){if(!r)return"-";const d=new Date(r);return isNaN(d.getTime())?r:d.toLocaleString()}function s(r){if(!r)return"";const d=document.createElement("div");return d.textContent=r,d.innerHTML}function p(r,d){const y=r.stream==="stderr"?"log-stderr":"log-stdout",L=r.stream==="stderr"?"\u26A0\uFE0F":"\u{1F4E4}";return` +
`);const k=document.getElementById("container-logs-modal"),B=document.getElementById("cl-container-select"),A=document.getElementById("cl-log-content"),I=document.getElementById("cl-log-search"),z=document.getElementById("cl-log-tail"),P=document.getElementById("cl-refresh"),M=document.getElementById("cl-stream"),D=document.getElementById("cl-download"),h=document.getElementById("cl-clear-search"),T=document.getElementById("cl-close"),f=document.getElementById("cl-close-btn"),H=document.getElementById("cl-stream-status"),S=document.getElementById("cl-stream-indicator"),$=document.getElementById("cl-stream-text"),w=document.getElementById("cl-line-count"),E=document.getElementById("cl-filter-count"),O=document.getElementById("cl-image"),C=document.getElementById("cl-status"),j=document.getElementById("cl-created");let N=null,R=[],u=[],v=null,x=!1,g=null;function b(r){if(!r)return"-";const d=new Date(r);return isNaN(d.getTime())?r:d.toLocaleString()}function s(r){if(!r)return"";const d=document.createElement("div");return d.textContent=r,d.innerHTML}function p(r,d){const y=r.stream==="stderr"?"log-stderr":"log-stdout",L=r.stream==="stderr"?"\u26A0\uFE0F":"\u{1F4E4}";return`
${d+1} ${L} ${s(r.text)}
- `}function l(r,d=""){if(!r||r.length===0){A.innerHTML='
No logs available
',E.textContent="0 lines",I.textContent="0 filtered";return}if(R=r,u=d?r.filter(y=>y.text&&y.text.toLowerCase().includes(d.toLowerCase())):r,E.textContent=`${r.length} lines`,I.textContent=d?`${u.length} of ${r.length} shown`:`${r.length} shown`,u.length===0){A.innerHTML=`
No logs match "${s(d)}"
`;return}A.innerHTML=u.map((y,L)=>p(y,L)).join(""),A.scrollTop=A.scrollHeight}async function m(){try{const d=(await getJSON("/api/v1/logs/containers")).containers||[],y=B.value;B.innerHTML='',d.forEach(L=>{const U=document.createElement("option");U.value=L.id,U.textContent=`${L.name} (${L.image.split(":")[0]}) - ${L.status}`,U.dataset.name=L.name,U.dataset.image=L.image,U.dataset.status=L.status,U.dataset.created=L.created,B.appendChild(U)}),y&&B.querySelector(`option[value="${y}"]`)&&(B.value=y,c(y))}catch(r){console.error("Failed to load containers:",r)}}function c(r){const d=B.querySelector(`option[value="${r}"]`);d&&(O.textContent=d.dataset.image||"-",C.textContent=d.dataset.status||"-",C.style.color=d.dataset.status==="running"?"var(--ok-fg, #4ade80)":"var(--bad-fg, #ef4444)",j.textContent=b(d.dataset.created))}async function t(){const r=B.value;if(!r){A.innerHTML='
Select a container to view logs
';return}a(),N=r,c(r);const d=z.value,y=S.value.trim();A.innerHTML='
Loading logs...
';try{const L=`/api/v1/logs/container/${r}${d!=="all"?`?tail=${d}`:""}`,U=await getJSON(L);U.logs&&U.logs.length>0?l(U.logs,y):(A.innerHTML='
No logs found for this container
',E.textContent="0 lines",I.textContent="0 filtered")}catch(L){A.innerHTML=`
Error loading logs: ${s(L.message)}
`}}function e(){const r=B.value;if(!r)return;a(),x=!0,M.textContent="\u23F9 Stop",H.style.display="flex",k.textContent="\u{1F7E2}",$.textContent="Connecting...";const d=`/api/v1/logs/stream/${r}`;v=new EventSource(d),v.onopen=()=>{k.textContent="\u{1F7E2}",$.textContent="Connected - streaming logs"},v.onmessage=y=>{try{const L=JSON.parse(y.data);if(L.error){k.textContent="\u{1F534}",$.textContent=`Error: ${L.error}`;return}R.push(L),u.push(L),E.textContent=`${R.length} lines`,I.textContent=`${u.length} shown`;const U=S.value.trim();if(!U||L.text&&L.text.toLowerCase().includes(U.toLowerCase())){const q=document.createElement("div");q.innerHTML=p(L,u.length-1);const F=q.firstElementChild;F.style.background="#1a3a1a",A.appendChild(F),A.scrollTop=A.scrollHeight}}catch(L){console.error("Error parsing log:",L)}},v.onerror=()=>{k.textContent="\u{1F534}",$.textContent="Disconnected",x=!1,M.textContent="\u25B6 Stream"},w._eventSource=v}function a(){v&&(v.close(),v=null),w._eventSource&&(w._eventSource.close(),w._eventSource=null),x=!1,M.textContent="\u25B6 Stream",H.style.display="none"}function o(){if(!R||R.length===0){showNotification("No logs to download","error");return}const r=B.querySelector(`option[value="${N}"]`)?.dataset.name||N,d=new Date().toISOString().replace(/[:.]/g,"-"),y=`${r}-logs-${d}.txt`,L=R.map(_=>{const J=_.timestamp||"",X=_.stream==="stderr"?"[ERR]":"[OUT]";return`${J?J+" ":""}${X} ${_.text}`}).join(` -`),U=new Blob([L],{type:"text/plain"}),q=URL.createObjectURL(U),F=document.createElement("a");F.href=q,F.download=y,document.body.appendChild(F),F.click(),document.body.removeChild(F),URL.revokeObjectURL(q),showNotification(`Downloaded ${R.length} log lines`,"success")}B?.addEventListener("change",()=>{t()}),z?.addEventListener("change",()=>{t()}),P?.addEventListener("click",()=>{t()}),M?.addEventListener("click",()=>{x?a():e()}),D?.addEventListener("click",()=>{o()}),h?.addEventListener("click",()=>{S.value="",l(R,"")}),S?.addEventListener("input",()=>{clearTimeout(g),g=setTimeout(()=>{l(R,S.value.trim())},300)}),S?.addEventListener("keydown",r=>{r.key==="Escape"&&(S.value="",l(R,""))}),document.getElementById("view-container-logs")?.addEventListener("click",()=>{w.classList.add("show"),m()});function n(){a(),w.classList.remove("show")}T?.addEventListener("click",n),f?.addEventListener("click",n),document.addEventListener("keydown",r=>{r.key==="Escape"&&w.classList.contains("show")&&n()}),w.addEventListener("click",r=>{r.target===w&&n()}),window.openContainerLogsModal=function(r,d){w.classList.add("show"),m().then(()=>{const y=Array.from(B.options).find(L=>L.value===r||L.dataset.name===d);y?(B.value=y.value,c(y.value),t()):r?(N=r,O.textContent=d||r,C.textContent="-",j.textContent="-",t()):A.innerHTML='
Select a container to view logs
'})}})(),(function(){"use strict";const w=[{unit:"caddy",label:"Caddy (reverse proxy)"},{unit:"dashcaddy-api",label:"DashCaddy API (host systemd unit, not this container)"},{unit:"docker",label:"Docker daemon"},{unit:"ssh",label:"SSH server"},{unit:"systemd-journald",label:"systemd-journald"},{unit:"tailscaled",label:"Tailscale"},{unit:"networkd-dispatcher",label:"Networkd dispatcher"}];injectModal("journald-modal",` + `}function l(r,d=""){if(!r||r.length===0){A.innerHTML='
No logs available
',w.textContent="0 lines",E.textContent="0 filtered";return}if(R=r,u=d?r.filter(y=>y.text&&y.text.toLowerCase().includes(d.toLowerCase())):r,w.textContent=`${r.length} lines`,E.textContent=d?`${u.length} of ${r.length} shown`:`${r.length} shown`,u.length===0){A.innerHTML=`
No logs match "${s(d)}"
`;return}A.innerHTML=u.map((y,L)=>p(y,L)).join(""),A.scrollTop=A.scrollHeight}async function m(){try{const d=(await getJSON("/api/v1/logs/containers")).containers||[],y=B.value;B.innerHTML='',d.forEach(L=>{const U=document.createElement("option");U.value=L.id,U.textContent=`${L.name} (${L.image.split(":")[0]}) - ${L.status}`,U.dataset.name=L.name,U.dataset.image=L.image,U.dataset.status=L.status,U.dataset.created=L.created,B.appendChild(U)}),y&&B.querySelector(`option[value="${y}"]`)&&(B.value=y,c(y))}catch(r){console.error("Failed to load containers:",r)}}function c(r){const d=B.querySelector(`option[value="${r}"]`);d&&(O.textContent=d.dataset.image||"-",C.textContent=d.dataset.status||"-",C.style.color=d.dataset.status==="running"?"var(--ok-fg, #4ade80)":"var(--bad-fg, #ef4444)",j.textContent=b(d.dataset.created))}async function t(){const r=B.value;if(!r){A.innerHTML='
Select a container to view logs
';return}a(),N=r,c(r);const d=z.value,y=I.value.trim();A.innerHTML='
Loading logs...
';try{const L=`/api/v1/logs/container/${r}${d!=="all"?`?tail=${d}`:""}`,U=await getJSON(L);U.logs&&U.logs.length>0?l(U.logs,y):(A.innerHTML='
No logs found for this container
',w.textContent="0 lines",E.textContent="0 filtered")}catch(L){A.innerHTML=`
Error loading logs: ${s(L.message)}
`}}function e(){const r=B.value;if(!r)return;a(),x=!0,M.textContent="\u23F9 Stop",H.style.display="flex",S.textContent="\u{1F7E2}",$.textContent="Connecting...";const d=`/api/v1/logs/stream/${r}`;v=new EventSource(d),v.onopen=()=>{S.textContent="\u{1F7E2}",$.textContent="Connected - streaming logs"},v.onmessage=y=>{try{const L=JSON.parse(y.data);if(L.error){S.textContent="\u{1F534}",$.textContent=`Error: ${L.error}`;return}R.push(L),u.push(L),w.textContent=`${R.length} lines`,E.textContent=`${u.length} shown`;const U=I.value.trim();if(!U||L.text&&L.text.toLowerCase().includes(U.toLowerCase())){const q=document.createElement("div");q.innerHTML=p(L,u.length-1);const F=q.firstElementChild;F.style.background="#1a3a1a",A.appendChild(F),A.scrollTop=A.scrollHeight}}catch(L){console.error("Error parsing log:",L)}},v.onerror=()=>{S.textContent="\u{1F534}",$.textContent="Disconnected",x=!1,M.textContent="\u25B6 Stream"},k._eventSource=v}function a(){v&&(v.close(),v=null),k._eventSource&&(k._eventSource.close(),k._eventSource=null),x=!1,M.textContent="\u25B6 Stream",H.style.display="none"}function o(){if(!R||R.length===0){showNotification("No logs to download","error");return}const r=B.querySelector(`option[value="${N}"]`)?.dataset.name||N,d=new Date().toISOString().replace(/[:.]/g,"-"),y=`${r}-logs-${d}.txt`,L=R.map(_=>{const J=_.timestamp||"",X=_.stream==="stderr"?"[ERR]":"[OUT]";return`${J?J+" ":""}${X} ${_.text}`}).join(` +`),U=new Blob([L],{type:"text/plain"}),q=URL.createObjectURL(U),F=document.createElement("a");F.href=q,F.download=y,document.body.appendChild(F),F.click(),document.body.removeChild(F),URL.revokeObjectURL(q),showNotification(`Downloaded ${R.length} log lines`,"success")}B?.addEventListener("change",()=>{t()}),z?.addEventListener("change",()=>{t()}),P?.addEventListener("click",()=>{t()}),M?.addEventListener("click",()=>{x?a():e()}),D?.addEventListener("click",()=>{o()}),h?.addEventListener("click",()=>{I.value="",l(R,"")}),I?.addEventListener("input",()=>{clearTimeout(g),g=setTimeout(()=>{l(R,I.value.trim())},300)}),I?.addEventListener("keydown",r=>{r.key==="Escape"&&(I.value="",l(R,""))}),document.getElementById("view-container-logs")?.addEventListener("click",()=>{k.classList.add("show"),m()});function n(){a(),k.classList.remove("show")}T?.addEventListener("click",n),f?.addEventListener("click",n),document.addEventListener("keydown",r=>{r.key==="Escape"&&k.classList.contains("show")&&n()}),k.addEventListener("click",r=>{r.target===k&&n()}),window.openContainerLogsModal=function(r,d){k.classList.add("show"),m().then(()=>{const y=Array.from(B.options).find(L=>L.value===r||L.dataset.name===d);y?(B.value=y.value,c(y.value),t()):r?(N=r,O.textContent=d||r,C.textContent="-",j.textContent="-",t()):A.innerHTML='
Select a container to view logs
'})}})(),(function(){"use strict";const k=[{unit:"caddy",label:"Caddy (reverse proxy)"},{unit:"dashcaddy-api",label:"DashCaddy API (host systemd unit, not this container)"},{unit:"docker",label:"Docker daemon"},{unit:"ssh",label:"SSH server"},{unit:"systemd-journald",label:"systemd-journald"},{unit:"tailscaled",label:"Tailscale"},{unit:"networkd-dispatcher",label:"Networkd dispatcher"}];injectModal("journald-modal",`
@@ -698,7 +698,7 @@ Try refreshing in a moment if you see a certificate error.`,"warning",1e4),!1}};
- `);const B=document.getElementById("journald-modal"),A=document.getElementById("jd-unit-select"),S=document.getElementById("jd-search"),z=document.getElementById("jd-tail"),P=document.getElementById("jd-refresh"),M=document.getElementById("jd-stream"),D=document.getElementById("jd-clear-search"),h=document.getElementById("jd-close"),T=document.getElementById("jd-close-btn"),f=document.getElementById("jd-content"),H=document.getElementById("jd-line-count"),k=document.getElementById("jd-filter-count"),$=document.getElementById("jd-overflow"),E=document.getElementById("jd-unit-display"),I=document.getElementById("jd-stream-state");let O=!1,C=[],j=!1,N=null,R=null;function u(c){const t=document.createElement("div");return t.textContent=String(c),t.innerHTML}function v(c){O=c,A.innerHTML="",w.forEach(t=>{const e=document.createElement("option");e.value=t.unit,e.textContent=t.label+" ("+t.unit+")",A.appendChild(e)}),A.disabled=!c,c?(P.disabled=!1,M.disabled=!1):(f.innerHTML='
journald bind-mount not available in this container.
Requires /var/log/journal + /usr/bin/journalctl mounted (start.sh).
',P.disabled=!0,M.disabled=!0)}async function x(){try{const c=await fetch("/api/v1/logs/journal/units");if(!c.ok){v(!1);return}const t=await c.json();v(!!t.available)}catch{v(!1)}}function g(){const c=(S.value||"").trim().toLowerCase(),t=c?C.filter(e=>(e.textContent||"").toLowerCase().includes(c)):C;if(t.length===0)f.innerHTML='
No entries'+(c?` matching "${u(c)}"`:"")+"
";else{const e=t.map(o=>{const i=o.timestamp?u(o.timestamp):"\u2014",n=u(o.textContent);return`
${i}${n}
`}).join("");f.innerHTML=e,f.scrollHeight-f.scrollTop-f.clientHeight<80&&(f.scrollTop=f.scrollHeight)}H.textContent=`${C.length} entries`,k.textContent=c?`${t.length} of ${C.length} shown`:`${C.length} shown`}async function b(){if(!O)return;p();const c=A.value;if(!c)return;const t=Math.max(1,Math.min(5e3,Number(z.value)||200)),e=(S.value||"").trim();f.innerHTML='
Loading\u2026
';try{const a=new URL("/api/v1/logs/journal",window.location.origin);a.searchParams.set("unit",c),a.searchParams.set("tail",String(t)),e&&a.searchParams.set("search",e);const o=await fetch(a.toString()),i=await o.json();if(!o.ok||!i.success){f.innerHTML='
Failed: '+u(i&&i.error||"HTTP "+o.status)+"
";return}E.textContent=c,C=(i.entries||[]).map(n=>({timestamp:n.timestamp,unit:n.unit,textContent:n.text||""})),$.style.display="none",g()}catch(a){f.innerHTML='
Error: '+u(a.message)+"
"}}function s(){if(!O)return;p();const c=A.value;if(!c)return;const t=(S.value||"").trim();E.textContent=c,M.textContent="\u23F8 Stop",M.classList.add("streaming"),I.textContent="streaming",I.style.color="var(--ok-fg, #4ade80)",C=[],g(),$.style.display="none";const e=new URL("/api/v1/logs/journal/stream",window.location.origin);e.searchParams.set("unit",c),t&&e.searchParams.set("search",t),N=new EventSource(e.toString()),N.onmessage=a=>{try{const o=JSON.parse(a.data);if(o.error){/stream (exceeded|line cap)/.test(o.error)&&($.style.display="",p()),f.innerHTML+='
\u26A0 '+u(o.error)+"
",f.scrollTop=f.scrollHeight;return}C.push({timestamp:o.timestamp,unit:o.unit||c,textContent:o.text||""}),C.length>5e3&&(C=C.slice(C.length-5e3),$.style.display=""),g()}catch{}},N.onerror=()=>{},j=!0}function p(){if(j=!1,N){try{N.close()}catch{}N=null}M.textContent="\u25B6 Stream",M.classList.remove("streaming"),I.textContent="disconnected",I.style.color="var(--muted)"}function l(){p(),B.classList.remove("show")}P.addEventListener("click",b),M.addEventListener("click",()=>j?p():s()),D.addEventListener("click",()=>{S.value="",g()}),S.addEventListener("input",()=>{clearTimeout(R),R=setTimeout(g,200)}),S.addEventListener("keydown",c=>{c.key==="Escape"&&(S.value="",g())}),h.addEventListener("click",l),T.addEventListener("click",l),B.addEventListener("click",c=>{c.target===B&&l()}),document.addEventListener("keydown",c=>{c.key==="Escape"&&B.classList.contains("show")&&l()}),A.addEventListener("change",()=>{C.length>0&&b()});function m(){B.classList.add("show"),x()}window.openJournaldModal=m,document.getElementById("view-journald-logs")?.addEventListener("click",m)})(),(function(){injectModal("snapshot-modal",`
+ `);const B=document.getElementById("journald-modal"),A=document.getElementById("jd-unit-select"),I=document.getElementById("jd-search"),z=document.getElementById("jd-tail"),P=document.getElementById("jd-refresh"),M=document.getElementById("jd-stream"),D=document.getElementById("jd-clear-search"),h=document.getElementById("jd-close"),T=document.getElementById("jd-close-btn"),f=document.getElementById("jd-content"),H=document.getElementById("jd-line-count"),S=document.getElementById("jd-filter-count"),$=document.getElementById("jd-overflow"),w=document.getElementById("jd-unit-display"),E=document.getElementById("jd-stream-state");let O=!1,C=[],j=!1,N=null,R=null;function u(c){const t=document.createElement("div");return t.textContent=String(c),t.innerHTML}function v(c){O=c,A.innerHTML="",k.forEach(t=>{const e=document.createElement("option");e.value=t.unit,e.textContent=t.label+" ("+t.unit+")",A.appendChild(e)}),A.disabled=!c,c?(P.disabled=!1,M.disabled=!1):(f.innerHTML='
journald bind-mount not available in this container.
Requires /var/log/journal + /usr/bin/journalctl mounted (start.sh).
',P.disabled=!0,M.disabled=!0)}async function x(){try{const c=await fetch("/api/v1/logs/journal/units");if(!c.ok){v(!1);return}const t=await c.json();v(!!t.available)}catch{v(!1)}}function g(){const c=(I.value||"").trim().toLowerCase(),t=c?C.filter(e=>(e.textContent||"").toLowerCase().includes(c)):C;if(t.length===0)f.innerHTML='
No entries'+(c?` matching "${u(c)}"`:"")+"
";else{const e=t.map(o=>{const i=o.timestamp?u(o.timestamp):"\u2014",n=u(o.textContent);return`
${i}${n}
`}).join("");f.innerHTML=e,f.scrollHeight-f.scrollTop-f.clientHeight<80&&(f.scrollTop=f.scrollHeight)}H.textContent=`${C.length} entries`,S.textContent=c?`${t.length} of ${C.length} shown`:`${C.length} shown`}async function b(){if(!O)return;p();const c=A.value;if(!c)return;const t=Math.max(1,Math.min(5e3,Number(z.value)||200)),e=(I.value||"").trim();f.innerHTML='
Loading\u2026
';try{const a=new URL("/api/v1/logs/journal",window.location.origin);a.searchParams.set("unit",c),a.searchParams.set("tail",String(t)),e&&a.searchParams.set("search",e);const o=await fetch(a.toString()),i=await o.json();if(!o.ok||!i.success){f.innerHTML='
Failed: '+u(i&&i.error||"HTTP "+o.status)+"
";return}w.textContent=c,C=(i.entries||[]).map(n=>({timestamp:n.timestamp,unit:n.unit,textContent:n.text||""})),$.style.display="none",g()}catch(a){f.innerHTML='
Error: '+u(a.message)+"
"}}function s(){if(!O)return;p();const c=A.value;if(!c)return;const t=(I.value||"").trim();w.textContent=c,M.textContent="\u23F8 Stop",M.classList.add("streaming"),E.textContent="streaming",E.style.color="var(--ok-fg, #4ade80)",C=[],g(),$.style.display="none";const e=new URL("/api/v1/logs/journal/stream",window.location.origin);e.searchParams.set("unit",c),t&&e.searchParams.set("search",t),N=new EventSource(e.toString()),N.onmessage=a=>{try{const o=JSON.parse(a.data);if(o.error){/stream (exceeded|line cap)/.test(o.error)&&($.style.display="",p()),f.innerHTML+='
\u26A0 '+u(o.error)+"
",f.scrollTop=f.scrollHeight;return}C.push({timestamp:o.timestamp,unit:o.unit||c,textContent:o.text||""}),C.length>5e3&&(C=C.slice(C.length-5e3),$.style.display=""),g()}catch{}},N.onerror=()=>{},j=!0}function p(){if(j=!1,N){try{N.close()}catch{}N=null}M.textContent="\u25B6 Stream",M.classList.remove("streaming"),E.textContent="disconnected",E.style.color="var(--muted)"}function l(){p(),B.classList.remove("show")}P.addEventListener("click",b),M.addEventListener("click",()=>j?p():s()),D.addEventListener("click",()=>{I.value="",g()}),I.addEventListener("input",()=>{clearTimeout(R),R=setTimeout(g,200)}),I.addEventListener("keydown",c=>{c.key==="Escape"&&(I.value="",g())}),h.addEventListener("click",l),T.addEventListener("click",l),B.addEventListener("click",c=>{c.target===B&&l()}),document.addEventListener("keydown",c=>{c.key==="Escape"&&B.classList.contains("show")&&l()}),A.addEventListener("change",()=>{C.length>0&&b()});function m(){B.classList.add("show"),x()}window.openJournaldModal=m,document.getElementById("view-journald-logs")?.addEventListener("click",m)})(),(function(){injectModal("snapshot-modal",`

\u{1F4BE} Container Snapshots

-
`);const w=document.getElementById("snapshot-modal"),B=document.getElementById("snapshot-btn"),A=document.getElementById("snapshot-close"),S=document.getElementById("snapshot-container-select"),z=document.getElementById("snapshot-details"),P=document.getElementById("snapshot-create-btn"),M=document.getElementById("snapshot-create-status");let D=null;async function h(){try{const E=await(await fetch("/api/v1/containers")).json();if(!E.success||!E.containers)return;S.innerHTML='';for(const I of E.containers){const O=document.createElement("option");O.value=I.id,O.textContent=`${I.name||I.id} (${I.image||"unknown"})`,O.dataset.name=I.name,O.dataset.image=I.image,O.dataset.status=I.status,O.dataset.created=I.created,S.appendChild(O)}}catch($){console.error("Failed to load containers:",$)}}function T($){if(!$||!$.value){z.style.display="none",D=null;return}D=$.value,document.getElementById("snapshot-image").textContent=$.dataset.image||"-",document.getElementById("snapshot-status").textContent=$.dataset.status||"-",document.getElementById("snapshot-created").textContent=$.dataset.created?new Date($.dataset.created*1e3).toLocaleString():"-",document.getElementById("snapshot-id").textContent=$.value.substring(0,12),z.style.display=""}async function f(){if(!D){M.textContent="Please select a container first",M.style.color="var(--bad-fg)";return}const $=document.getElementById("snapshot-name").value.trim();if(!$){M.textContent="Please enter a snapshot name",M.style.color="var(--bad-fg)";return}const E=document.getElementById("snapshot-leave-running").checked;P.disabled=!0,P.textContent="Creating...",M.textContent="";try{const O=await(await fetch(`/api/v1/containers/${encodeURIComponent(D)}/checkpoint`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:$,leaveRunning:E})})).json();O.success?(M.textContent=`\u2713 Snapshot "${$}" created successfully`,M.style.color="var(--ok-fg)",document.getElementById("snapshot-name").value=""):(M.textContent=`\u2717 Failed: ${O.error||"Unknown error"}`,M.style.color="var(--bad-fg)")}catch(I){M.textContent=`\u2717 Error: ${I.message}`,M.style.color="var(--bad-fg)"}finally{P.disabled=!1,P.textContent="\u{1F4BE} Create Snapshot"}}function H(){w.classList.add("show"),h()}function k(){w.classList.remove("show"),z.style.display="none",D=null,S.selectedIndex=0}B?.addEventListener("click",H),A?.addEventListener("click",k),wireModal(w,A),S?.addEventListener("change",$=>{const E=S.options[S.selectedIndex];T(E)}),P?.addEventListener("click",f),w?.querySelectorAll(".panel-tab").forEach($=>{$.addEventListener("click",()=>{w.querySelectorAll(".panel-tab").forEach(E=>E.classList.remove("active")),w.querySelectorAll(".panel-section").forEach(E=>E.classList.remove("active")),$.classList.add("active"),w.querySelector(`#${$.dataset.panel}`).classList.add("active")})})})(),(function(){injectModal("arr-setup-modal",`
+
`);const k=document.getElementById("snapshot-modal"),B=document.getElementById("snapshot-btn"),A=document.getElementById("snapshot-close"),I=document.getElementById("snapshot-container-select"),z=document.getElementById("snapshot-details"),P=document.getElementById("snapshot-create-btn"),M=document.getElementById("snapshot-create-status");let D=null;async function h(){try{const w=await(await fetch("/api/v1/containers")).json();if(!w.success||!w.containers)return;I.innerHTML='';for(const E of w.containers){const O=document.createElement("option");O.value=E.id,O.textContent=`${E.name||E.id} (${E.image||"unknown"})`,O.dataset.name=E.name,O.dataset.image=E.image,O.dataset.status=E.status,O.dataset.created=E.created,I.appendChild(O)}}catch($){console.error("Failed to load containers:",$)}}function T($){if(!$||!$.value){z.style.display="none",D=null;return}D=$.value,document.getElementById("snapshot-image").textContent=$.dataset.image||"-",document.getElementById("snapshot-status").textContent=$.dataset.status||"-",document.getElementById("snapshot-created").textContent=$.dataset.created?new Date($.dataset.created*1e3).toLocaleString():"-",document.getElementById("snapshot-id").textContent=$.value.substring(0,12),z.style.display=""}async function f(){if(!D){M.textContent="Please select a container first",M.style.color="var(--bad-fg)";return}const $=document.getElementById("snapshot-name").value.trim();if(!$){M.textContent="Please enter a snapshot name",M.style.color="var(--bad-fg)";return}const w=document.getElementById("snapshot-leave-running").checked;P.disabled=!0,P.textContent="Creating...",M.textContent="";try{const O=await(await fetch(`/api/v1/containers/${encodeURIComponent(D)}/checkpoint`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:$,leaveRunning:w})})).json();O.success?(M.textContent=`\u2713 Snapshot "${$}" created successfully`,M.style.color="var(--ok-fg)",document.getElementById("snapshot-name").value=""):(M.textContent=`\u2717 Failed: ${O.error||"Unknown error"}`,M.style.color="var(--bad-fg)")}catch(E){M.textContent=`\u2717 Error: ${E.message}`,M.style.color="var(--bad-fg)"}finally{P.disabled=!1,P.textContent="\u{1F4BE} Create Snapshot"}}function H(){k.classList.add("show"),h()}function S(){k.classList.remove("show"),z.style.display="none",D=null,I.selectedIndex=0}B?.addEventListener("click",H),A?.addEventListener("click",S),wireModal(k,A),I?.addEventListener("change",$=>{const w=I.options[I.selectedIndex];T(w)}),P?.addEventListener("click",f),k?.querySelectorAll(".panel-tab").forEach($=>{$.addEventListener("click",()=>{k.querySelectorAll(".panel-tab").forEach(w=>w.classList.remove("active")),k.querySelectorAll(".panel-section").forEach(w=>w.classList.remove("active")),$.classList.add("active"),k.querySelector(`#${$.dataset.panel}`).classList.add("active")})})})(),(function(){injectModal("arr-setup-modal",`

\u{1F3AC} Smart Arr Connect

@@ -831,7 +831,7 @@ Try refreshing in a moment if you see a certificate error.`,"warning",1e4),!1}};

- `);const w=document.getElementById("arr-setup-modal"),B=document.getElementById("arr-setup-btn"),A=document.getElementById("arr-setup-cancel"),S=document.getElementById("smart-connect-btn"),z=document.getElementById("smart-phase-detect"),P=document.getElementById("smart-phase-credentials"),M=document.getElementById("smart-phase-progress"),D=document.getElementById("smart-phase-results"),h=document.getElementById("smart-detect-results"),T=document.getElementById("smart-credential-inputs"),f=document.getElementById("smart-progress-steps"),H=document.getElementById("smart-results-content"),k=document.getElementById("smart-plex-libraries"),$=document.getElementById("smart-retry-btn");let E=null;const I={plex:"\u{1F3AC}",radarr:"\u{1F3AC}",sonarr:"\u{1F4FA}",prowlarr:"\u{1F50D}",seerr:"\u{1F4CB}"},O={plex:"Plex",radarr:"Radarr (Movies)",sonarr:"Sonarr (TV)",prowlarr:"Prowlarr (Indexers)",seerr:"Seerr"};function C(g){z.style.display=g==="detect"?"block":"none",P.style.display=g==="credentials"?"block":"none",M.style.display=g==="progress"?"block":"none",D.style.display=g==="results"?"block":"none"}function j(g){const b={connected:{bg:"var(--ok-fg)",icon:"✓",text:"Connected"},needs_key:{bg:"#f39c12",icon:"🔑",text:"Needs API Key"},not_found:{bg:"var(--muted)",icon:"—",text:"Not Found"},error:{bg:"var(--bad-fg)",icon:"✗",text:"Error"}},s=b[g]||b.not_found;return`${s.icon} ${s.text}`}async function N(){C("detect"),h.style.display="none";try{if(E=await(await fetch("/api/v1/arr/smart-detect")).json(),!E.success){h.innerHTML=`
Detection failed: ${escapeHtml(E.error)}
`,h.style.display="block";return}let b='
';for(const[p,l]of Object.entries(E.services)){const m=I[p]||"\u{1F4E6}",c=O[p]||p,t=l.source?`${escapeHtml(l.source)}`:"",e=l.version?`v${escapeHtml(l.version)}`:"",a=(l.hasApiKey||l.hasToken)&&l.status==="connected"?'Key saved':"";b+=`
+
`);const k=document.getElementById("arr-setup-modal"),B=document.getElementById("arr-setup-btn"),A=document.getElementById("arr-setup-cancel"),I=document.getElementById("smart-connect-btn"),z=document.getElementById("smart-phase-detect"),P=document.getElementById("smart-phase-credentials"),M=document.getElementById("smart-phase-progress"),D=document.getElementById("smart-phase-results"),h=document.getElementById("smart-detect-results"),T=document.getElementById("smart-credential-inputs"),f=document.getElementById("smart-progress-steps"),H=document.getElementById("smart-results-content"),S=document.getElementById("smart-plex-libraries"),$=document.getElementById("smart-retry-btn");let w=null;const E={plex:"\u{1F3AC}",radarr:"\u{1F3AC}",sonarr:"\u{1F4FA}",prowlarr:"\u{1F50D}",seerr:"\u{1F4CB}"},O={plex:"Plex",radarr:"Radarr (Movies)",sonarr:"Sonarr (TV)",prowlarr:"Prowlarr (Indexers)",seerr:"Seerr"};function C(g){z.style.display=g==="detect"?"block":"none",P.style.display=g==="credentials"?"block":"none",M.style.display=g==="progress"?"block":"none",D.style.display=g==="results"?"block":"none"}function j(g){const b={connected:{bg:"var(--ok-fg)",icon:"✓",text:"Connected"},needs_key:{bg:"#f39c12",icon:"🔑",text:"Needs API Key"},not_found:{bg:"var(--muted)",icon:"—",text:"Not Found"},error:{bg:"var(--bad-fg)",icon:"✗",text:"Error"}},s=b[g]||b.not_found;return`${s.icon} ${s.text}`}async function N(){C("detect"),h.style.display="none";try{if(w=await(await fetch("/api/v1/arr/smart-detect")).json(),!w.success){h.innerHTML=`
Detection failed: ${escapeHtml(w.error)}
`,h.style.display="block";return}let b='
';for(const[p,l]of Object.entries(w.services)){const m=E[p]||"\u{1F4E6}",c=O[p]||p,t=l.source?`${escapeHtml(l.source)}`:"",e=l.version?`v${escapeHtml(l.version)}`:"",a=(l.hasApiKey||l.hasToken)&&l.status==="connected"?'Key saved':"";b+=`
${m}
${c}
@@ -840,10 +840,10 @@ Try refreshing in a moment if you see a certificate error.`,"warning",1e4),!1}};
${j(l.status)} -
`}b+="
";const s=E.summary;b+=`
+
`}b+="";const s=w.summary;b+=`
${escapeHtml(String(s.fullyConnected))}/${escapeHtml(String(s.totalDetected+(5-s.totalDetected)))} services detected · ${escapeHtml(String(s.fullyConnected))} connected${s.needsApiKey>0?` · ${escapeHtml(String(s.needsApiKey))} needs API key`:""} -
`,h.innerHTML=b,h.style.display="block",R(E),setTimeout(()=>{C("credentials")},800)}catch(g){h.innerHTML=`
Error: ${escapeHtml(g.message)}
`,h.style.display="block"}}function R(g){let b="";const s=g.services,p=["radarr","sonarr","prowlarr"];for(const c of p){const t=s[c];if(!t||t.status==="not_found"&&!t.url)continue;const e=I[c],a=O[c],o=t.status==="connected";b+=`
+
`,h.innerHTML=b,h.style.display="block",R(w),setTimeout(()=>{C("credentials")},800)}catch(g){h.innerHTML=`
Error: ${escapeHtml(g.message)}
`,h.style.display="block"}}function R(g){let b="";const s=g.services,p=["radarr","sonarr","prowlarr"];for(const c of p){const t=s[c];if(!t||t.status==="not_found"&&!t.url)continue;const e=E[c],a=O[c],o=t.status==="connected";b+=`
${e} ${a} @@ -897,7 +897,7 @@ Try refreshing in a moment if you see a certificate error.`,"warning",1e4),!1}};
`;for(const p of b.libraries){const l=p.type==="movie"?"\u{1F3AC}":p.type==="show"?"\u{1F4FA}":"\u{1F3B5}";s+=`
${l} ${escapeHtml(p.title)} ${escapeHtml(String(p.count))} items -
`}s+="
",k.innerHTML=s,k.style.display="block"}}catch{}}B?.addEventListener("click",()=>{w.classList.add("show"),k.style.display="none",N()}),wireModal(w,A),S?.addEventListener("click",u),$?.addEventListener("click",u)})(),(function(){const w=new ErrorHandler;injectModal("notifications-modal",`
+
`}s+="
",S.innerHTML=s,S.style.display="block"}}catch{}}B?.addEventListener("click",()=>{k.classList.add("show"),S.style.display="none",N()}),wireModal(k,A),I?.addEventListener("click",u),$?.addEventListener("click",u)})(),(function(){const k=new ErrorHandler;injectModal("notifications-modal",`

\u{1F514} Notification Settings

@@ -1082,15 +1082,15 @@ Try refreshing in a moment if you see a certificate error.`,"warning",1e4),!1}};
- `);const B=document.getElementById("notifications-modal"),A=document.getElementById("manage-notifications"),S=document.getElementById("notifications-save"),z=document.getElementById("notifications-cancel");["discord","telegram","ntfy","email"].forEach(k=>{const $=document.getElementById(`${k}-enabled`),E=document.getElementById(`${k}-config`);$?.addEventListener("change",()=>{E.style.display=$.checked?"block":"none"})});const P=document.getElementById("health-check-enabled"),M=document.getElementById("health-check-config");P?.addEventListener("change",()=>{M.style.opacity=P.checked?"1":"0.5"});async function D(){try{const $=await(await fetch("/api/v1/notifications/config")).json();if($.success){const E=$.config;document.getElementById("notifications-enabled").checked=E.enabled,document.getElementById("discord-enabled").checked=E.providers?.discord?.enabled||!1,document.getElementById("telegram-enabled").checked=E.providers?.telegram?.enabled||!1,document.getElementById("ntfy-enabled").checked=E.providers?.ntfy?.enabled||!1,document.getElementById("email-enabled").checked=E.providers?.email?.enabled||!1,document.getElementById("discord-config").style.display=E.providers?.discord?.enabled?"block":"none",document.getElementById("telegram-config").style.display=E.providers?.telegram?.enabled?"block":"none",document.getElementById("ntfy-config").style.display=E.providers?.ntfy?.enabled?"block":"none",document.getElementById("email-config").style.display=E.providers?.email?.enabled?"block":"none",E.providers?.ntfy?.serverUrl&&(document.getElementById("ntfy-server").value=E.providers.ntfy.serverUrl),E.providers?.email?.host&&(document.getElementById("email-host").value=E.providers.email.host),E.providers?.email?.from&&(document.getElementById("email-from").value=E.providers.email.from),document.getElementById("health-check-enabled").checked=E.healthCheck?.enabled||!1,E.healthCheck?.intervalMinutes&&(document.getElementById("health-check-interval").value=E.healthCheck.intervalMinutes),E.healthCheck?.lastCheck&&(document.getElementById("health-check-status").textContent=`Last check: ${new Date(E.healthCheck.lastCheck).toLocaleString()}`),document.getElementById("event-container-down").checked=E.events?.containerDown!==!1,document.getElementById("event-container-up").checked=E.events?.containerUp!==!1,document.getElementById("event-deploy-success").checked=E.events?.deploymentSuccess!==!1,document.getElementById("event-deploy-failed").checked=E.events?.deploymentFailed!==!1,document.getElementById("event-resource-alert").checked=E.events?.resourceAlert!==!1}}catch(k){w.logError("[Notifications] Load Config",k,{function:"loadConfig"})}}async function h(){try{const $=await(await fetch("/api/v1/notifications/history?limit=10")).json(),E=document.getElementById("notification-history");$.success&&$.history?.length>0?E.innerHTML=$.history.map(I=>{const O=new Date(I.timestamp).toLocaleString();return` + `);const B=document.getElementById("notifications-modal"),A=document.getElementById("manage-notifications"),I=document.getElementById("notifications-save"),z=document.getElementById("notifications-cancel");["discord","telegram","ntfy","email"].forEach(S=>{const $=document.getElementById(`${S}-enabled`),w=document.getElementById(`${S}-config`);$?.addEventListener("change",()=>{w.style.display=$.checked?"block":"none"})});const P=document.getElementById("health-check-enabled"),M=document.getElementById("health-check-config");P?.addEventListener("change",()=>{M.style.opacity=P.checked?"1":"0.5"});async function D(){try{const $=await(await fetch("/api/v1/notifications/config")).json();if($.success){const w=$.config;document.getElementById("notifications-enabled").checked=w.enabled,document.getElementById("discord-enabled").checked=w.providers?.discord?.enabled||!1,document.getElementById("telegram-enabled").checked=w.providers?.telegram?.enabled||!1,document.getElementById("ntfy-enabled").checked=w.providers?.ntfy?.enabled||!1,document.getElementById("email-enabled").checked=w.providers?.email?.enabled||!1,document.getElementById("discord-config").style.display=w.providers?.discord?.enabled?"block":"none",document.getElementById("telegram-config").style.display=w.providers?.telegram?.enabled?"block":"none",document.getElementById("ntfy-config").style.display=w.providers?.ntfy?.enabled?"block":"none",document.getElementById("email-config").style.display=w.providers?.email?.enabled?"block":"none",w.providers?.ntfy?.serverUrl&&(document.getElementById("ntfy-server").value=w.providers.ntfy.serverUrl),w.providers?.email?.host&&(document.getElementById("email-host").value=w.providers.email.host),w.providers?.email?.from&&(document.getElementById("email-from").value=w.providers.email.from),w.providers?.email?.to&&(document.getElementById("email-to").value=w.providers.email.to),w.providers?.email?.port&&(document.getElementById("email-port").value=w.providers.email.port),w.providers?.email?.secure!==void 0&&(document.getElementById("email-secure").checked=w.providers.email.secure===!0),w.providers?.email?.username&&(document.getElementById("email-user").value=w.providers.email.username);const E=document.getElementById("email-pass");w.providers?.email?.hasPassword?(E.value="",E.placeholder="saved \u2014 leave blank to keep"):E.placeholder="app password",document.getElementById("health-check-enabled").checked=w.healthCheck?.enabled||!1,w.healthCheck?.intervalMinutes&&(document.getElementById("health-check-interval").value=w.healthCheck.intervalMinutes),w.healthCheck?.lastCheck&&(document.getElementById("health-check-status").textContent=`Last check: ${new Date(w.healthCheck.lastCheck).toLocaleString()}`),document.getElementById("event-container-down").checked=w.events?.["container-down"]!==!1,document.getElementById("event-container-up").checked=w.events?.["container-up"]===!0,document.getElementById("event-deploy-success").checked=w.events?.["deploy-success"]!==!1,document.getElementById("event-deploy-failed").checked=w.events?.["deploy-failed"]!==!1,document.getElementById("event-resource-alert").checked=w.events?.alert!==!1}}catch(S){k.logError("[Notifications] Load Config",S,{function:"loadConfig"})}}async function h(){try{const $=await(await fetch("/api/v1/notifications/history?limit=10")).json(),w=document.getElementById("notification-history");$.success&&$.history?.length>0?w.innerHTML=$.history.map(E=>{const O=new Date(E.timestamp).toLocaleString();return`
- ${I.type==="success"?"\u2713":I.type==="error"?"\u2717":"\u2139"} + ${E.type==="success"?"\u2713":E.type==="error"?"\u2717":"\u2139"}
-
${escapeHtml(I.title)}
+
${escapeHtml(E.title)}
${O}
- `}).join(""):E.innerHTML='
No notifications yet
'}catch(k){w.logError("[Notifications] Load History",k,{function:"loadHistory"})}}async function T(){try{const k={enabled:document.getElementById("notifications-enabled").checked,providers:{discord:{enabled:document.getElementById("discord-enabled").checked,webhookUrl:document.getElementById("discord-webhook").value.trim()},telegram:{enabled:document.getElementById("telegram-enabled").checked,botToken:document.getElementById("telegram-bot-token").value.trim(),chatId:document.getElementById("telegram-chat-id").value.trim()},ntfy:{enabled:document.getElementById("ntfy-enabled").checked,serverUrl:document.getElementById("ntfy-server").value.trim()||"https://ntfy.sh",topic:document.getElementById("ntfy-topic").value.trim()},email:{enabled:document.getElementById("email-enabled").checked,host:document.getElementById("email-host").value.trim(),port:parseInt(document.getElementById("email-port").value)||587,secure:document.getElementById("email-secure").checked,user:document.getElementById("email-user").value.trim(),pass:document.getElementById("email-pass").value.trim(),from:document.getElementById("email-from").value.trim(),to:document.getElementById("email-to").value.trim()}},events:{containerDown:document.getElementById("event-container-down").checked,containerUp:document.getElementById("event-container-up").checked,deploymentSuccess:document.getElementById("event-deploy-success").checked,deploymentFailed:document.getElementById("event-deploy-failed").checked,resourceAlert:document.getElementById("event-resource-alert").checked},healthCheck:{enabled:document.getElementById("health-check-enabled").checked,intervalMinutes:parseInt(document.getElementById("health-check-interval").value)||5}},E=await(await secureFetch("/api/v1/notifications/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(k)})).json();E.success?(showNotification("Notification settings saved","success",3e3),B.classList.remove("show")):showNotification(`Failed to save: ${E.error}`,"error",3e3)}catch(k){showNotification(`Error: ${k.message}`,"error",3e3)}}async function f(k){try{const E=await(await secureFetch("/api/v1/notifications/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:k})})).json();E.success?showNotification(`Test ${k} notification sent!`,"success",3e3):showNotification(`Test failed: ${E.error}`,"error",3e3)}catch($){showNotification(`Error: ${$.message}`,"error",3e3)}}document.getElementById("discord-test")?.addEventListener("click",()=>f("discord")),document.getElementById("telegram-test")?.addEventListener("click",()=>f("telegram")),document.getElementById("ntfy-test")?.addEventListener("click",()=>f("ntfy")),document.getElementById("email-test")?.addEventListener("click",()=>f("email")),document.getElementById("health-check-now")?.addEventListener("click",async()=>{try{const $=await(await secureFetch("/api/v1/notifications/health-check",{method:"POST"})).json();$.success&&(document.getElementById("health-check-status").textContent=`Last check: ${new Date($.lastCheck).toLocaleString()} (${$.containersMonitored} containers)`,showNotification("Health check completed","success",2e3))}catch(k){showNotification(`Error: ${k.message}`,"error",3e3)}}),A?.addEventListener("click",()=>{B.classList.add("show"),D(),h()}),S?.addEventListener("click",T),document.getElementById("notifications-send-test")?.addEventListener("click",async()=>{const k=document.getElementById("notifications-send-test"),$=k.textContent;k.textContent="Sending...",k.disabled=!0;try{const I=await(await secureFetch("/api/v1/notifications/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({event:"test",data:{message:"This is a test notification from DashCaddy."},type:"info"})})).json();I.success?(showNotification("Test notification sent!","success",3e3),H()):showNotification(`Test failed: ${I.results?.map(O=>`${O.provider}: ${O.error||"ok"}`).join(", ")}`,"error",5e3)}catch(E){showNotification(`Error: ${E.message}`,"error",3e3)}finally{k.textContent=$,k.disabled=!1}});async function H(){try{const $=await(await fetch("/api/v1/notifications/status")).json();if($.success&&$.lastSent){const E=document.getElementById("last-notification-sent");E&&(E.textContent=`Last sent: ${new Date($.lastSent).toLocaleString()}`)}}catch{}}wireModal(B,z)})(),(function(){document.addEventListener("click",w=>{const B=w.target.closest(".panel-tab");if(!B)return;const A=B.dataset.panel;if(!A)return;const S=B.closest(".panel-tabs"),z=S.closest(".weather-modal-content");S.querySelectorAll(".panel-tab").forEach(M=>M.classList.remove("active")),B.classList.add("active"),z.querySelectorAll(".panel-section").forEach(M=>M.classList.remove("active"));const P=z.querySelector("#"+A);P&&P.classList.add("active")})})(),(function(){var w=["dashcaddy_site_config","dashcaddy_onboarding","dashcaddy-encryption-key","dashcaddy-setup","dashcaddy-config","theme","user-themes","custom-theme","custom-apps","custom-services","toolbar-sections","weather-location","weather-zip","weather-geo","weather-unit","clock-style","clock-chimes","clock-chime-volume"];function B(){for(var e={},a=0;a + `}).join(""):w.innerHTML='
No notifications yet
'}catch(S){k.logError("[Notifications] Load History",S,{function:"loadHistory"})}}async function T(){try{const S={enabled:document.getElementById("notifications-enabled").checked,providers:{discord:{enabled:document.getElementById("discord-enabled").checked,webhookUrl:document.getElementById("discord-webhook").value.trim()},telegram:{enabled:document.getElementById("telegram-enabled").checked,botToken:document.getElementById("telegram-bot-token").value.trim(),chatId:document.getElementById("telegram-chat-id").value.trim()},ntfy:{enabled:document.getElementById("ntfy-enabled").checked,serverUrl:document.getElementById("ntfy-server").value.trim()||"https://ntfy.sh",topic:document.getElementById("ntfy-topic").value.trim()},email:{enabled:document.getElementById("email-enabled").checked,host:document.getElementById("email-host").value.trim(),port:parseInt(document.getElementById("email-port").value)||587,secure:document.getElementById("email-secure").checked,username:document.getElementById("email-user").value.trim(),password:document.getElementById("email-pass").value.trim(),from:document.getElementById("email-from").value.trim(),to:document.getElementById("email-to").value.trim()}},events:{"container-down":document.getElementById("event-container-down").checked,"container-up":document.getElementById("event-container-up").checked,"deploy-success":document.getElementById("event-deploy-success").checked,"deploy-failed":document.getElementById("event-deploy-failed").checked,alert:document.getElementById("event-resource-alert").checked},healthCheck:{enabled:document.getElementById("health-check-enabled").checked,intervalMinutes:parseInt(document.getElementById("health-check-interval").value)||5}},w=await(await secureFetch("/api/v1/notifications/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(S)})).json();w.success?(showNotification("Notification settings saved","success",3e3),B.classList.remove("show")):showNotification(`Failed to save: ${w.error}`,"error",3e3)}catch(S){showNotification(`Error: ${S.message}`,"error",3e3)}}async function f(S){try{const w=await(await secureFetch("/api/v1/notifications/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:S})})).json();w.success?showNotification(`Test ${S} notification sent!`,"success",3e3):showNotification(`Test failed: ${w.error}`,"error",3e3)}catch($){showNotification(`Error: ${$.message}`,"error",3e3)}}document.getElementById("discord-test")?.addEventListener("click",()=>f("discord")),document.getElementById("telegram-test")?.addEventListener("click",()=>f("telegram")),document.getElementById("ntfy-test")?.addEventListener("click",()=>f("ntfy")),document.getElementById("email-test")?.addEventListener("click",()=>f("email")),document.getElementById("health-check-now")?.addEventListener("click",async()=>{try{const $=await(await secureFetch("/api/v1/notifications/health-check",{method:"POST"})).json();$.success&&(document.getElementById("health-check-status").textContent=`Last check: ${new Date($.lastCheck).toLocaleString()} (${$.containersMonitored} containers)`,showNotification("Health check completed","success",2e3))}catch(S){showNotification(`Error: ${S.message}`,"error",3e3)}}),A?.addEventListener("click",()=>{B.classList.add("show"),D(),h()}),I?.addEventListener("click",T),document.getElementById("notifications-send-test")?.addEventListener("click",async()=>{const S=document.getElementById("notifications-send-test"),$=S.textContent;S.textContent="Sending...",S.disabled=!0;try{const E=await(await secureFetch("/api/v1/notifications/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({event:"test",data:{message:"This is a test notification from DashCaddy."},type:"info"})})).json();E.success?(showNotification("Test notification sent!","success",3e3),H()):showNotification(`Test failed: ${E.results?.map(O=>`${O.provider}: ${O.error||"ok"}`).join(", ")}`,"error",5e3)}catch(w){showNotification(`Error: ${w.message}`,"error",3e3)}finally{S.textContent=$,S.disabled=!1}});async function H(){try{const $=await(await fetch("/api/v1/notifications/status")).json();if($.success&&$.lastSent){const w=document.getElementById("last-notification-sent");w&&(w.textContent=`Last sent: ${new Date($.lastSent).toLocaleString()}`)}}catch{}}wireModal(B,z)})(),(function(){document.addEventListener("click",k=>{const B=k.target.closest(".panel-tab");if(!B)return;const A=B.dataset.panel;if(!A)return;const I=B.closest(".panel-tabs"),z=I.closest(".weather-modal-content");I.querySelectorAll(".panel-tab").forEach(M=>M.classList.remove("active")),B.classList.add("active"),z.querySelectorAll(".panel-section").forEach(M=>M.classList.remove("active"));const P=z.querySelector("#"+A);P&&P.classList.add("active")})})(),(function(){var k=["dashcaddy_site_config","dashcaddy_onboarding","dashcaddy-encryption-key","dashcaddy-setup","dashcaddy-config","theme","user-themes","custom-theme","custom-apps","custom-services","toolbar-sections","weather-location","weather-zip","weather-geo","weather-unit","clock-style","clock-chimes","clock-chime-volume"];function B(){for(var e={},a=0;a

\u{1F4BE} Backup & Restore

- `);var P=document.getElementById("backup-modal"),M=document.getElementById("backup-restore-btn"),D=document.getElementById("backup-cancel"),h=document.getElementById("backup-export-btn"),T=document.getElementById("backup-select-file"),f=document.getElementById("backup-file-input"),H=document.getElementById("backup-file-name"),k=document.getElementById("backup-preview"),$=document.getElementById("backup-preview-content"),E=document.getElementById("backup-do-restore-btn"),I=document.getElementById("backup-result"),O=document.getElementById("backup-schedules-container"),C=document.getElementById("backup-history-container"),j=document.getElementById("backup-disk-container"),N=document.getElementById("pointintime-container"),R=null;M?.addEventListener("click",function(){P.classList.add("show"),I&&(I.style.display="none"),k&&(k.style.display="none"),H&&(H.style.display="none"),R=null}),wireModal(P,D),h?.addEventListener("click",async function(){h.disabled=!0,h.innerHTML=' Exporting...';try{var e=await fetch("/api/v1/backup/export"),a=await e.json();a.browserState=B();var o=new Blob([JSON.stringify(a,null,2)],{type:"application/json"}),i=URL.createObjectURL(o),n=document.createElement("a");n.href=i,n.download="dashcaddy-backup-"+new Date().toISOString().split("T")[0]+".json",document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i);var r=Object.keys(a.browserState).length,d=a.themes?Object.keys(a.themes).length:0;I.innerHTML="\u2705 Full backup downloaded \u2014 server config + "+r+" browser settings"+(d?" + "+d+" themes":""),I.style.display="block",I.style.background="color-mix(in srgb, var(--ok-fg) 15%, transparent)",I.style.border="1px solid var(--ok-fg)"}catch(y){I.innerHTML="\u274C Export failed: "+escapeHtml(y.message),I.style.display="block",I.style.background="color-mix(in srgb, var(--bad-fg) 15%, transparent)",I.style.border="1px solid var(--bad-fg)"}h.disabled=!1,h.innerHTML="\u2B07\uFE0F Download Full Backup"}),T?.addEventListener("click",function(){f.click()}),f?.addEventListener("change",async function(e){var a=e.target.files[0];if(a){H.textContent="\u{1F4C4} "+a.name,H.style.display="block",I.style.display="none";try{var o=await a.text(),i=JSON.parse(o);if(S(i)){R=i;var n='
Legacy format (v'+escapeHtml(i.version)+")
";n+='
',i.services?.length&&(n+='\u{1F4CB} '+i.services.length+" services"),i.customApps?.length&&(n+='\u{1F4E6} '+i.customApps.length+" custom apps"),i.theme&&(n+='\u{1F3A8} Theme: '+escapeHtml(i.theme)+""),i.userThemes&&(n+='\u{1F3A8} '+Object.keys(i.userThemes).length+" custom themes"),n+="
",$.innerHTML=n,k.style.display="block";return}var r=await secureFetch("/api/v1/backup/preview",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}),d=await r.json();if(d.success){R=i;var n='
Exported: '+new Date(i.exportedAt).toLocaleString()+" (v"+escapeHtml(i.version)+")
";n+='
Server Config
',n+='
';for(var y in d.preview.files){var L=d.preview.files[y],U=L.action==="create"?"\u{1F195}":"\u{1F4DD}";n+=''+U+" "+escapeHtml(L.description)+""}n+="
",d.preview.serviceCount&&(n+='
'+d.preview.serviceCount+" services
"),d.preview.themeCount&&(n+='
\u{1F3A8} '+d.preview.themeCount+" custom themes
"),d.preview.browserStateCount&&(n+='
Browser Preferences
',n+='
\u{1F5A5}\uFE0F '+d.preview.browserStateCount+" saved settings (theme, weather, clock, widgets, etc.)
"),$.innerHTML=n,k.style.display="block"}else I.innerHTML="\u26A0\uFE0F Invalid backup file: "+escapeHtml(d.error),I.style.display="block",I.style.background="color-mix(in srgb, #f39c12 15%, transparent)",I.style.border="1px solid #f39c12",k.style.display="none"}catch(q){I.innerHTML="\u274C Could not read file: "+escapeHtml(q.message),I.style.display="block",I.style.background="color-mix(in srgb, var(--bad-fg) 15%, transparent)",I.style.border="1px solid var(--bad-fg)",k.style.display="none"}}}),E?.addEventListener("click",async function(){if(R&&confirm("This will overwrite your current configuration and browser preferences. Continue?")){E.disabled=!0,E.innerHTML=' Restoring...';try{if(S(R)){z(R),I.innerHTML="\u2705 Legacy backup restored \u2014 browser settings and services imported.",I.style.background="color-mix(in srgb, var(--ok-fg) 15%, transparent)",I.style.border="1px solid var(--ok-fg)",I.style.display="block",setTimeout(function(){location.reload()},2e3),E.disabled=!1,E.innerHTML="\u26A1 Restore Everything";return}var e=document.getElementById("backup-reload-caddy")?.checked??!0,a=await secureFetch("/api/v1/backup/restore",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({backup:R,options:{reloadCaddy:e}})}),o=await a.json(),i=0;if(R.browserState&&(i=A(R.browserState)),o.success){var n="\u2705 "+o.message;i>0&&(n+='
'+i+" browser settings restored"),o.results.caddyReloaded&&(n+='
Caddy configuration reloaded'),I.innerHTML=n,I.style.background="color-mix(in srgb, var(--ok-fg) 15%, transparent)",I.style.border="1px solid var(--ok-fg)",setTimeout(function(){location.reload()},2e3)}else I.innerHTML="\u26A0\uFE0F "+escapeHtml(o.message),i>0&&(I.innerHTML+='
'+i+" browser settings were restored"),o.results?.errors?.length>0&&(I.innerHTML+="
"+o.results.errors.map(function(r){return escapeHtml(r.file)+": "+escapeHtml(r.error)}).join(", ")+""),I.style.background="color-mix(in srgb, #f39c12 15%, transparent)",I.style.border="1px solid #f39c12";I.style.display="block"}catch(r){I.innerHTML="\u274C Restore failed: "+escapeHtml(r.message),I.style.display="block",I.style.background="color-mix(in srgb, var(--bad-fg) 15%, transparent)",I.style.border="1px solid var(--bad-fg)"}E.disabled=!1,E.innerHTML="\u26A1 Restore Everything"}});async function u(){if(O){O.innerHTML='
Loading...
';try{var e=await fetch("/api/v1/backups/schedule"),a=await e.json();if(a.premiumRequired){O.innerHTML=`
\u2B50
Premium Feature
Auto-backup scheduling requires a DashCaddy Premium subscription.
`;return}if(!a.success)throw new Error(a.error||"Failed to load schedules");var o=a.schedules||[];if(o.length===0){O.innerHTML='
\u23F0
No backup schedules configured
Select apps below to enable auto-backup
';return}for(var i='
',n=0;n
Schedule:
Keep last:
Next run: '+escapeHtml(d)+"
Last run: "+escapeHtml(y)+'
'}i+="",i+='

\u2795 Add New Schedule

',O.innerHTML=i,O.querySelectorAll(".schedule-toggle").forEach(function(L){L.addEventListener("change",function(){v(L.dataset.appid,{enabled:L.checked})})}),O.querySelectorAll(".schedule-select").forEach(function(L){L.addEventListener("change",function(){v(L.dataset.appid,{schedule:L.value})})}),O.querySelectorAll(".retention-input").forEach(function(L){L.addEventListener("change",function(){v(L.dataset.appid,{retention:{keep:parseInt(L.value)||7}})})}),O.querySelectorAll(".schedule-run-now").forEach(function(L){L.addEventListener("click",function(){x(L.dataset.appid)})}),O.querySelectorAll(".schedule-delete").forEach(function(L){L.addEventListener("click",function(){g(L.dataset.appid)})}),document.getElementById("add-schedule-btn")?.addEventListener("click",b)}catch(L){O.innerHTML='
Failed to load: '+escapeHtml(L.message)+"
"}}}async function v(e,a){try{var o=await secureFetch("/api/v1/backups/schedule",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:e,...a})}),i=await o.json();i.success?showNotification("Schedule updated for "+e,"success"):(showNotification("Update failed: "+(i.error||"Unknown"),"error"),u())}catch(n){showNotification("Error: "+n.message,"error")}}async function x(e){try{var a=await secureFetch("/api/v1/backups/backup/"+encodeURIComponent(e),{method:"POST",headers:{"Content-Type":"application/json"}}),o=await a.json();o.success?showNotification("Backup started for "+e+"!","success"):showNotification("Backup failed: "+(o.error||"Unknown"),"error")}catch(i){showNotification("Error: "+i.message,"error")}}async function g(e){if(confirm("Remove backup schedule for "+e+"?"))try{var a=await secureFetch("/api/v1/backups/schedule/"+encodeURIComponent(e),{method:"DELETE"}),o=await a.json();o.success?(showNotification("Schedule removed for "+e,"success"),u()):showNotification("Delete failed: "+(o.error||"Unknown"),"error")}catch(i){showNotification("Error: "+i.message,"error")}}async function b(){var e=document.getElementById("new-schedule-appid")?.value?.trim(),a=document.getElementById("new-schedule-interval")?.value||"daily",o=parseInt(document.getElementById("new-schedule-retention")?.value)||7;if(!e){showNotification("Please enter an App ID","warning");return}try{var i=await secureFetch("/api/v1/backups/schedule",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:e,schedule:a,retention:{keep:o},enabled:!0})}),n=await i.json();if(n.success){showNotification("Schedule created for "+e,"success"),u();var r=document.getElementById("new-schedule-appid");r&&(r.value="")}else showNotification("Failed: "+(n.error||"Unknown"),"error")}catch(d){showNotification("Error: "+d.message,"error")}}async function s(){if(j){j.innerHTML='
Loading...
';try{var e=await fetch("/api/v1/backups/files"),a=await e.json();if(!a.success)throw new Error(a.error||"Failed to load");var o=a.files||[];if(o.length===0){j.innerHTML='
\u{1F4BE}
No backup files on disk
Run a backup to create backup files
';return}for(var i={},n=0;n";y+='
';for(var L=Object.keys(i).sort(),U=0;U
'+escapeHtml(d)+' ('+q.length+" backup(s))
";for(var F=0;F
'+r.sizeFormatted+'
'+_+'
'}y+=""}y+="",j.innerHTML=y,j.querySelectorAll(".disk-compare-btn").forEach(function(J){J.addEventListener("click",function(){c(J.dataset.appid,J.dataset.filename)})}),j.querySelectorAll(".disk-restore-btn").forEach(function(J){J.addEventListener("click",function(){t(J.dataset.appid,J.dataset.filename)})})}catch(J){j.innerHTML='
Failed: '+escapeHtml(J.message)+"
"}}}async function p(){if(C){C.innerHTML='
Loading...
';try{var e=await fetch("/api/v1/backups/history?limit=50"),a=await e.json();if(!a.success||!a.history?.length){C.innerHTML='
\u{1F4CB} No backup history yet
';return}for(var o='
',i=0;i',o+='
',o+=' '+escapeHtml(n.name||"backup")+"",o+='
',o+=' '+escapeHtml(n.status)+"",n.status==="success"&&(o+=' '),o+="
",o+="
",o+='
',o+=" "+new Date(n.timestamp).toLocaleString()+" | "+r+" MB | "+(n.duration?(n.duration/1e3).toFixed(1)+"s":"--"),n.encrypted&&(o+=" | \u{1F512}"),o+="
",o+="
"}o+="",C.innerHTML=o,C.querySelectorAll(".backup-restore-btn").forEach(function(d){d.addEventListener("click",function(){window.__restoreServerBackup(d.dataset.backupId)})})}catch(d){C.innerHTML='
Failed: '+escapeHtml(d.message)+"
"}}}window.__restoreServerBackup=async function(e){if(confirm("Restore from this server backup? This will overwrite current configuration."))try{var a=await secureFetch("/api/v1/backups/restore/"+e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({restoreServices:!0,restoreConfig:!0})}),o=await a.json();o.success?(showNotification("Restore completed successfully!","success"),location.reload()):showNotification("Restore failed: "+(o.error||"Unknown error"),"error")}catch(i){showNotification("Restore error: "+i.message,"error")}},document.querySelector('[data-panel="backup-schedules-tab"]')?.addEventListener("click",u),document.querySelector('[data-panel="backup-disk-tab"]')?.addEventListener("click",s),document.querySelector('[data-panel="backup-pointintime-tab"]')?.addEventListener("click",l),document.querySelector('[data-panel="backup-history-tab"]')?.addEventListener("click",p);async function l(){if(N){try{var e=await fetch("/api/v1/license/status"),a=await e.json();if(a.tier!=="premium"){N.innerHTML=`
\u2B50
Premium Feature
Point-in-time restore requires DashCaddy Premium with auto-backup enabled.
`;return}}catch{}N.innerHTML='
Loading...
';try{var o=await fetch("/api/v1/services"),i=await o.json(),n=i.services||[];if(n.length===0){N.innerHTML='
\u{1F4E6} No apps deployed yet
';return}for(var r='
',N.innerHTML=r,document.getElementById("pit-load-btn")?.addEventListener("click",function(){var y=document.getElementById("pit-app-select")?.value;y&&m(y)})}catch(y){N.innerHTML='
Failed: '+escapeHtml(y.message)+"
"}}}async function m(e){var a=document.getElementById("pit-backups-list");if(a){a.innerHTML='
Loading backups...
';try{var o=await fetch("/api/v1/backups/files/"+encodeURIComponent(e)),i=await o.json();if(!i.success||!i.files||i.files.length===0){a.innerHTML='
\u{1F4BE} No backup files for '+escapeHtml(e)+"
";return}for(var n='
'+i.files.length+' backup(s)
',r=0;r
'+d.sizeFormatted+'
'+y+'
'}n+="",a.innerHTML=n,a.querySelectorAll(".pit-compare-btn").forEach(function(L){L.addEventListener("click",function(){c(L.dataset.appid,L.dataset.filename)})}),a.querySelectorAll(".pit-restore-btn").forEach(function(L){L.addEventListener("click",function(){t(L.dataset.appid,L.dataset.filename)})})}catch(L){a.innerHTML='
Failed: '+escapeHtml(L.message)+"
"}}}async function c(e,a){try{var o=await secureFetch("/api/v1/backups/compare/"+encodeURIComponent(a),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})}),i=await o.json();if(!i.success){showNotification("Compare failed: "+(i.error||"Unknown"),"error");return}var n=i.diff,r='

\u{1F4CA} Compare: '+escapeHtml(a)+'

Size: '+(n.sizeFormatted||"?")+" | Created: "+new Date(n.timestamp).toLocaleString()+"
";if(n.services){var d=n.services.hasChanges?"\u{1F534}":"\u{1F7E2}";r+='
'+d+' Services (backup vs current)
Backup: '+n.services.backupCount+" services | Current: "+n.services.currentCount+" services
",n.services.hasChanges&&(r+='
Services differ \u2014 restoring will replace current configuration
'),r+="
"}if(n.config){var y=n.config.hasChanges?"\u{1F534}":"\u{1F7E2}";r+='
'+y+" Configuration
",n.config.hasChanges?r+='
Configuration differs \u2014 restoring will replace current settings
':r+='
No changes
',r+="
"}r+='
',document.body.insertAdjacentHTML("beforeend",r),document.getElementById("compare-close-btn")?.addEventListener("click",function(){document.getElementById("compare-overlay")?.remove()}),document.getElementById("compare-overlay")?.addEventListener("click",function(L){L.target===this&&this.remove()})}catch(L){showNotification("Compare error: "+L.message,"error")}}async function t(e,a){if(confirm("Restore "+a+" for "+e+`? + `);var P=document.getElementById("backup-modal"),M=document.getElementById("backup-restore-btn"),D=document.getElementById("backup-cancel"),h=document.getElementById("backup-export-btn"),T=document.getElementById("backup-select-file"),f=document.getElementById("backup-file-input"),H=document.getElementById("backup-file-name"),S=document.getElementById("backup-preview"),$=document.getElementById("backup-preview-content"),w=document.getElementById("backup-do-restore-btn"),E=document.getElementById("backup-result"),O=document.getElementById("backup-schedules-container"),C=document.getElementById("backup-history-container"),j=document.getElementById("backup-disk-container"),N=document.getElementById("pointintime-container"),R=null;M?.addEventListener("click",function(){P.classList.add("show"),E&&(E.style.display="none"),S&&(S.style.display="none"),H&&(H.style.display="none"),R=null}),wireModal(P,D),h?.addEventListener("click",async function(){h.disabled=!0,h.innerHTML=' Exporting...';try{var e=await fetch("/api/v1/backup/export"),a=await e.json();a.browserState=B();var o=new Blob([JSON.stringify(a,null,2)],{type:"application/json"}),i=URL.createObjectURL(o),n=document.createElement("a");n.href=i,n.download="dashcaddy-backup-"+new Date().toISOString().split("T")[0]+".json",document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i);var r=Object.keys(a.browserState).length,d=a.themes?Object.keys(a.themes).length:0;E.innerHTML="\u2705 Full backup downloaded \u2014 server config + "+r+" browser settings"+(d?" + "+d+" themes":""),E.style.display="block",E.style.background="color-mix(in srgb, var(--ok-fg) 15%, transparent)",E.style.border="1px solid var(--ok-fg)"}catch(y){E.innerHTML="\u274C Export failed: "+escapeHtml(y.message),E.style.display="block",E.style.background="color-mix(in srgb, var(--bad-fg) 15%, transparent)",E.style.border="1px solid var(--bad-fg)"}h.disabled=!1,h.innerHTML="\u2B07\uFE0F Download Full Backup"}),T?.addEventListener("click",function(){f.click()}),f?.addEventListener("change",async function(e){var a=e.target.files[0];if(a){H.textContent="\u{1F4C4} "+a.name,H.style.display="block",E.style.display="none";try{var o=await a.text(),i=JSON.parse(o);if(I(i)){R=i;var n='
Legacy format (v'+escapeHtml(i.version)+")
";n+='
',i.services?.length&&(n+='\u{1F4CB} '+i.services.length+" services"),i.customApps?.length&&(n+='\u{1F4E6} '+i.customApps.length+" custom apps"),i.theme&&(n+='\u{1F3A8} Theme: '+escapeHtml(i.theme)+""),i.userThemes&&(n+='\u{1F3A8} '+Object.keys(i.userThemes).length+" custom themes"),n+="
",$.innerHTML=n,S.style.display="block";return}var r=await secureFetch("/api/v1/backup/preview",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}),d=await r.json();if(d.success){R=i;var n='
Exported: '+new Date(i.exportedAt).toLocaleString()+" (v"+escapeHtml(i.version)+")
";n+='
Server Config
',n+='
';for(var y in d.preview.files){var L=d.preview.files[y],U=L.action==="create"?"\u{1F195}":"\u{1F4DD}";n+=''+U+" "+escapeHtml(L.description)+""}n+="
",d.preview.serviceCount&&(n+='
'+d.preview.serviceCount+" services
"),d.preview.themeCount&&(n+='
\u{1F3A8} '+d.preview.themeCount+" custom themes
"),d.preview.browserStateCount&&(n+='
Browser Preferences
',n+='
\u{1F5A5}\uFE0F '+d.preview.browserStateCount+" saved settings (theme, weather, clock, widgets, etc.)
"),$.innerHTML=n,S.style.display="block"}else E.innerHTML="\u26A0\uFE0F Invalid backup file: "+escapeHtml(d.error),E.style.display="block",E.style.background="color-mix(in srgb, #f39c12 15%, transparent)",E.style.border="1px solid #f39c12",S.style.display="none"}catch(q){E.innerHTML="\u274C Could not read file: "+escapeHtml(q.message),E.style.display="block",E.style.background="color-mix(in srgb, var(--bad-fg) 15%, transparent)",E.style.border="1px solid var(--bad-fg)",S.style.display="none"}}}),w?.addEventListener("click",async function(){if(R&&confirm("This will overwrite your current configuration and browser preferences. Continue?")){w.disabled=!0,w.innerHTML=' Restoring...';try{if(I(R)){z(R),E.innerHTML="\u2705 Legacy backup restored \u2014 browser settings and services imported.",E.style.background="color-mix(in srgb, var(--ok-fg) 15%, transparent)",E.style.border="1px solid var(--ok-fg)",E.style.display="block",setTimeout(function(){location.reload()},2e3),w.disabled=!1,w.innerHTML="\u26A1 Restore Everything";return}var e=document.getElementById("backup-reload-caddy")?.checked??!0,a=await secureFetch("/api/v1/backup/restore",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({backup:R,options:{reloadCaddy:e}})}),o=await a.json(),i=0;if(R.browserState&&(i=A(R.browserState)),o.success){var n="\u2705 "+o.message;i>0&&(n+='
'+i+" browser settings restored"),o.results.caddyReloaded&&(n+='
Caddy configuration reloaded'),E.innerHTML=n,E.style.background="color-mix(in srgb, var(--ok-fg) 15%, transparent)",E.style.border="1px solid var(--ok-fg)",setTimeout(function(){location.reload()},2e3)}else E.innerHTML="\u26A0\uFE0F "+escapeHtml(o.message),i>0&&(E.innerHTML+='
'+i+" browser settings were restored"),o.results?.errors?.length>0&&(E.innerHTML+="
"+o.results.errors.map(function(r){return escapeHtml(r.file)+": "+escapeHtml(r.error)}).join(", ")+""),E.style.background="color-mix(in srgb, #f39c12 15%, transparent)",E.style.border="1px solid #f39c12";E.style.display="block"}catch(r){E.innerHTML="\u274C Restore failed: "+escapeHtml(r.message),E.style.display="block",E.style.background="color-mix(in srgb, var(--bad-fg) 15%, transparent)",E.style.border="1px solid var(--bad-fg)"}w.disabled=!1,w.innerHTML="\u26A1 Restore Everything"}});async function u(){if(O){O.innerHTML='
Loading...
';try{var e=await fetch("/api/v1/backups/schedule"),a=await e.json();if(a.premiumRequired){O.innerHTML=`
\u2B50
Premium Feature
Auto-backup scheduling requires a DashCaddy Premium subscription.
`;return}if(!a.success)throw new Error(a.error||"Failed to load schedules");var o=a.schedules||[];if(o.length===0){O.innerHTML='
\u23F0
No backup schedules configured
Select apps below to enable auto-backup
';return}for(var i='
',n=0;n
Schedule:
Keep last:
Next run: '+escapeHtml(d)+"
Last run: "+escapeHtml(y)+'
'}i+="",i+='

\u2795 Add New Schedule

',O.innerHTML=i,O.querySelectorAll(".schedule-toggle").forEach(function(L){L.addEventListener("change",function(){v(L.dataset.appid,{enabled:L.checked})})}),O.querySelectorAll(".schedule-select").forEach(function(L){L.addEventListener("change",function(){v(L.dataset.appid,{schedule:L.value})})}),O.querySelectorAll(".retention-input").forEach(function(L){L.addEventListener("change",function(){v(L.dataset.appid,{retention:{keep:parseInt(L.value)||7}})})}),O.querySelectorAll(".schedule-run-now").forEach(function(L){L.addEventListener("click",function(){x(L.dataset.appid)})}),O.querySelectorAll(".schedule-delete").forEach(function(L){L.addEventListener("click",function(){g(L.dataset.appid)})}),document.getElementById("add-schedule-btn")?.addEventListener("click",b)}catch(L){O.innerHTML='
Failed to load: '+escapeHtml(L.message)+"
"}}}async function v(e,a){try{var o=await secureFetch("/api/v1/backups/schedule",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:e,...a})}),i=await o.json();i.success?showNotification("Schedule updated for "+e,"success"):(showNotification("Update failed: "+(i.error||"Unknown"),"error"),u())}catch(n){showNotification("Error: "+n.message,"error")}}async function x(e){try{var a=await secureFetch("/api/v1/backups/backup/"+encodeURIComponent(e),{method:"POST",headers:{"Content-Type":"application/json"}}),o=await a.json();o.success?showNotification("Backup started for "+e+"!","success"):showNotification("Backup failed: "+(o.error||"Unknown"),"error")}catch(i){showNotification("Error: "+i.message,"error")}}async function g(e){if(confirm("Remove backup schedule for "+e+"?"))try{var a=await secureFetch("/api/v1/backups/schedule/"+encodeURIComponent(e),{method:"DELETE"}),o=await a.json();o.success?(showNotification("Schedule removed for "+e,"success"),u()):showNotification("Delete failed: "+(o.error||"Unknown"),"error")}catch(i){showNotification("Error: "+i.message,"error")}}async function b(){var e=document.getElementById("new-schedule-appid")?.value?.trim(),a=document.getElementById("new-schedule-interval")?.value||"daily",o=parseInt(document.getElementById("new-schedule-retention")?.value)||7;if(!e){showNotification("Please enter an App ID","warning");return}try{var i=await secureFetch("/api/v1/backups/schedule",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:e,schedule:a,retention:{keep:o},enabled:!0})}),n=await i.json();if(n.success){showNotification("Schedule created for "+e,"success"),u();var r=document.getElementById("new-schedule-appid");r&&(r.value="")}else showNotification("Failed: "+(n.error||"Unknown"),"error")}catch(d){showNotification("Error: "+d.message,"error")}}async function s(){if(j){j.innerHTML='
Loading...
';try{var e=await fetch("/api/v1/backups/files"),a=await e.json();if(!a.success)throw new Error(a.error||"Failed to load");var o=a.files||[];if(o.length===0){j.innerHTML='
\u{1F4BE}
No backup files on disk
Run a backup to create backup files
';return}for(var i={},n=0;n";y+='
';for(var L=Object.keys(i).sort(),U=0;U
'+escapeHtml(d)+' ('+q.length+" backup(s))
";for(var F=0;F
'+r.sizeFormatted+'
'+_+'
'}y+=""}y+="",j.innerHTML=y,j.querySelectorAll(".disk-compare-btn").forEach(function(J){J.addEventListener("click",function(){c(J.dataset.appid,J.dataset.filename)})}),j.querySelectorAll(".disk-restore-btn").forEach(function(J){J.addEventListener("click",function(){t(J.dataset.appid,J.dataset.filename)})})}catch(J){j.innerHTML='
Failed: '+escapeHtml(J.message)+"
"}}}async function p(){if(C){C.innerHTML='
Loading...
';try{var e=await fetch("/api/v1/backups/history?limit=50"),a=await e.json();if(!a.success||!a.history?.length){C.innerHTML='
\u{1F4CB} No backup history yet
';return}for(var o='
',i=0;i',o+='
',o+=' '+escapeHtml(n.name||"backup")+"",o+='
',o+=' '+escapeHtml(n.status)+"",n.status==="success"&&(o+=' '),o+="
",o+="
",o+='
',o+=" "+new Date(n.timestamp).toLocaleString()+" | "+r+" MB | "+(n.duration?(n.duration/1e3).toFixed(1)+"s":"--"),n.encrypted&&(o+=" | \u{1F512}"),o+="
",o+="
"}o+="",C.innerHTML=o,C.querySelectorAll(".backup-restore-btn").forEach(function(d){d.addEventListener("click",function(){window.__restoreServerBackup(d.dataset.backupId)})})}catch(d){C.innerHTML='
Failed: '+escapeHtml(d.message)+"
"}}}window.__restoreServerBackup=async function(e){if(confirm("Restore from this server backup? This will overwrite current configuration."))try{var a=await secureFetch("/api/v1/backups/restore/"+e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({restoreServices:!0,restoreConfig:!0})}),o=await a.json();o.success?(showNotification("Restore completed successfully!","success"),location.reload()):showNotification("Restore failed: "+(o.error||"Unknown error"),"error")}catch(i){showNotification("Restore error: "+i.message,"error")}},document.querySelector('[data-panel="backup-schedules-tab"]')?.addEventListener("click",u),document.querySelector('[data-panel="backup-disk-tab"]')?.addEventListener("click",s),document.querySelector('[data-panel="backup-pointintime-tab"]')?.addEventListener("click",l),document.querySelector('[data-panel="backup-history-tab"]')?.addEventListener("click",p);async function l(){if(N){try{var e=await fetch("/api/v1/license/status"),a=await e.json();if(a.tier!=="premium"){N.innerHTML=`
\u2B50
Premium Feature
Point-in-time restore requires DashCaddy Premium with auto-backup enabled.
`;return}}catch{}N.innerHTML='
Loading...
';try{var o=await fetch("/api/v1/services"),i=await o.json(),n=i.services||[];if(n.length===0){N.innerHTML='
\u{1F4E6} No apps deployed yet
';return}for(var r='
',N.innerHTML=r,document.getElementById("pit-load-btn")?.addEventListener("click",function(){var y=document.getElementById("pit-app-select")?.value;y&&m(y)})}catch(y){N.innerHTML='
Failed: '+escapeHtml(y.message)+"
"}}}async function m(e){var a=document.getElementById("pit-backups-list");if(a){a.innerHTML='
Loading backups...
';try{var o=await fetch("/api/v1/backups/files/"+encodeURIComponent(e)),i=await o.json();if(!i.success||!i.files||i.files.length===0){a.innerHTML='
\u{1F4BE} No backup files for '+escapeHtml(e)+"
";return}for(var n='
'+i.files.length+' backup(s)
',r=0;r
'+d.sizeFormatted+'
'+y+'
'}n+="",a.innerHTML=n,a.querySelectorAll(".pit-compare-btn").forEach(function(L){L.addEventListener("click",function(){c(L.dataset.appid,L.dataset.filename)})}),a.querySelectorAll(".pit-restore-btn").forEach(function(L){L.addEventListener("click",function(){t(L.dataset.appid,L.dataset.filename)})})}catch(L){a.innerHTML='
Failed: '+escapeHtml(L.message)+"
"}}}async function c(e,a){try{var o=await secureFetch("/api/v1/backups/compare/"+encodeURIComponent(a),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})}),i=await o.json();if(!i.success){showNotification("Compare failed: "+(i.error||"Unknown"),"error");return}var n=i.diff,r='

\u{1F4CA} Compare: '+escapeHtml(a)+'

Size: '+(n.sizeFormatted||"?")+" | Created: "+new Date(n.timestamp).toLocaleString()+"
";if(n.services){var d=n.services.hasChanges?"\u{1F534}":"\u{1F7E2}";r+='
'+d+' Services (backup vs current)
Backup: '+n.services.backupCount+" services | Current: "+n.services.currentCount+" services
",n.services.hasChanges&&(r+='
Services differ \u2014 restoring will replace current configuration
'),r+="
"}if(n.config){var y=n.config.hasChanges?"\u{1F534}":"\u{1F7E2}";r+='
'+y+" Configuration
",n.config.hasChanges?r+='
Configuration differs \u2014 restoring will replace current settings
':r+='
No changes
',r+="
"}r+='
',document.body.insertAdjacentHTML("beforeend",r),document.getElementById("compare-close-btn")?.addEventListener("click",function(){document.getElementById("compare-overlay")?.remove()}),document.getElementById("compare-overlay")?.addEventListener("click",function(L){L.target===this&&this.remove()})}catch(L){showNotification("Compare error: "+L.message,"error")}}async function t(e,a){if(confirm("Restore "+a+" for "+e+`? This will replace current configuration, credentials, and data. Containers will be restarted.`))try{var o=await secureFetch("/api/v1/apps/"+encodeURIComponent(e)+"/revert/"+encodeURIComponent(a),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({restartContainers:!0})}),i=await o.json();i.success?(showNotification(e+" restored to "+a,"success"),setTimeout(function(){location.reload()},1500)):showNotification("Restore failed: "+(i.error||"Unknown"),"error")}catch(n){showNotification("Restore error: "+n.message,"error")}}})(),(function(){injectModal("stats-modal",`
@@ -1278,7 +1278,7 @@ This will replace current configuration, credentials, and data. Containers will
- `);const w=document.getElementById("stats-modal"),B=document.getElementById("container-stats-btn"),A=document.getElementById("stats-cancel"),S=document.getElementById("stats-refresh-btn"),z=document.getElementById("stats-auto-refresh"),P=document.getElementById("stats-container"),M=document.getElementById("stats-aggregated-container"),D=document.getElementById("stats-alerts-container"),h=document.getElementById("stats-last-update");let T=null,f=null;function H(l){if(l===0||!l)return"0 B";const m=1024,c=["B","KB","MB","GB"],t=Math.floor(Math.log(l)/Math.log(m));return parseFloat((l/Math.pow(m,t)).toFixed(1))+" "+c[t]}function k(l){return l<30?"#2ecc71":l<70?"#f39c12":"#e74c3c"}function $(l){return l<50?"#2ecc71":l<80?"#f39c12":"#e74c3c"}async function E(){try{let l=null,m=!1;try{const e=await(await fetch("/api/v1/monitoring/stats")).json();e.success&&e.stats&&(l=e.stats,m=!0,f=e.stats)}catch{}if(!m){const e=await(await fetch("/api/v1/stats/containers")).json();if(e.success&&e.stats){l={};for(const a of e.stats)l[a.name]={name:a.name,current:{cpu:a.cpu,memory:{percent:a.memory.percent,usage:a.memory.used,limit:a.memory.limit,usageMB:Math.round(a.memory.used/1048576),limitMB:Math.round(a.memory.limit/1048576)},network:{rxBytes:a.network.rx,txBytes:a.network.tx,rxMB:(a.network.rx/1048576).toFixed(1),txMB:(a.network.tx/1048576).toFixed(1)},disk:{readMB:0,writeMB:0}},status:a.status};f=l}}if(!l||Object.keys(l).length===0){P.innerHTML='
No running containers found
';return}let c='
';for(const[t,e]of Object.entries(l)){const a=e.current||e,o=a.cpu?.percent||0,i=a.memory?.percent||0,n=k(o),r=$(i),d=a.memory?.usage||a.memory?.used||0,y=a.memory?.limit||0,L=a.network?.rxBytes||a.network?.rx||0,U=a.network?.txBytes||a.network?.tx||0,q=e.aggregated;c+=` +
`);const k=document.getElementById("stats-modal"),B=document.getElementById("container-stats-btn"),A=document.getElementById("stats-cancel"),I=document.getElementById("stats-refresh-btn"),z=document.getElementById("stats-auto-refresh"),P=document.getElementById("stats-container"),M=document.getElementById("stats-aggregated-container"),D=document.getElementById("stats-alerts-container"),h=document.getElementById("stats-last-update");let T=null,f=null;function H(l){if(l===0||!l)return"0 B";const m=1024,c=["B","KB","MB","GB"],t=Math.floor(Math.log(l)/Math.log(m));return parseFloat((l/Math.pow(m,t)).toFixed(1))+" "+c[t]}function S(l){return l<30?"#2ecc71":l<70?"#f39c12":"#e74c3c"}function $(l){return l<50?"#2ecc71":l<80?"#f39c12":"#e74c3c"}async function w(){try{let l=null,m=!1;try{const e=await(await fetch("/api/v1/monitoring/stats")).json();e.success&&e.stats&&(l=e.stats,m=!0,f=e.stats)}catch{}if(!m){const e=await(await fetch("/api/v1/stats/containers")).json();if(e.success&&e.stats){l={};for(const a of e.stats)l[a.name]={name:a.name,current:{cpu:a.cpu,memory:{percent:a.memory.percent,usage:a.memory.used,limit:a.memory.limit,usageMB:Math.round(a.memory.used/1048576),limitMB:Math.round(a.memory.limit/1048576)},network:{rxBytes:a.network.rx,txBytes:a.network.tx,rxMB:(a.network.rx/1048576).toFixed(1),txMB:(a.network.tx/1048576).toFixed(1)},disk:{readMB:0,writeMB:0}},status:a.status};f=l}}if(!l||Object.keys(l).length===0){P.innerHTML='
No running containers found
';return}let c='
';for(const[t,e]of Object.entries(l)){const a=e.current||e,o=a.cpu?.percent||0,i=a.memory?.percent||0,n=S(o),r=$(i),d=a.memory?.usage||a.memory?.used||0,y=a.memory?.limit||0,L=a.network?.rxBytes||a.network?.rx||0,U=a.network?.txBytes||a.network?.tx||0,q=e.aggregated;c+=`
${e.name||t} @@ -1314,7 +1314,7 @@ This will replace current configuration, credentials, and data. Containers will
- `}c+="",P.innerHTML=c,h.textContent="Updated: "+new Date().toLocaleTimeString()}catch(l){P.innerHTML=`
\u274C Failed to load stats: ${escapeHtml(l.message)}
`}}async function I(){if(!M)return;const l=f;if(!l||Object.keys(l).length===0){M.innerHTML='
\u{1F4C8}No monitoring data available. Open the Live Stats tab first.
';return}let m='
';for(const[c,t]of Object.entries(l)){const e=t.aggregated;e&&(m+=`
+
`}c+="
",P.innerHTML=c,h.textContent="Updated: "+new Date().toLocaleTimeString()}catch(l){P.innerHTML=`
\u274C Failed to load stats: ${escapeHtml(l.message)}
`}}async function E(){if(!M)return;const l=f;if(!l||Object.keys(l).length===0){M.innerHTML='
\u{1F4C8}No monitoring data available. Open the Live Stats tab first.
';return}let m='
';for(const[c,t]of Object.entries(l)){const e=t.aggregated;e&&(m+=`
${t.name||c}
${e.cpu?.avg?.toFixed(1)||0}%Avg CPU
@@ -1396,7 +1396,7 @@ This will replace current configuration, credentials, and data. Containers will
`:'
No alerts recorded yet.
'}
- `,document.getElementById("save-all-alerts")?.addEventListener("click",async()=>{const n={};document.querySelectorAll("#stats-alerts-container tr[data-container]").forEach(r=>{const d=r.dataset.container;n[d]={cpuThreshold:parseInt(r.querySelector(".alert-cpu")?.value)||80,memoryThreshold:parseInt(r.querySelector(".alert-mem")?.value)||90,diskIOThreshold:parseInt(r.querySelector(".alert-disk")?.value)||50,autoRestart:!!r.querySelector(".alert-autorestart")?.checked,enabled:!0}});try{const d=await(await secureFetch("/api/v1/monitoring/alerts/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:n})})).json(),y=document.getElementById("save-all-alerts");y.textContent=d.success?"\u2705 Saved":"\u274C Failed",setTimeout(()=>{y.textContent="Save All"},2e3)}catch{const d=document.getElementById("save-all-alerts");d.textContent="\u274C Error",setTimeout(()=>{d.textContent="Save All"},2e3)}}),document.getElementById("go-to-notifications")?.addEventListener("click",n=>{n.preventDefault(),w.classList.remove("show"),j(),document.getElementById("manage-notifications")?.click()}),document.querySelectorAll(".alert-test-btn").forEach(n=>{n.addEventListener("click",async()=>{const r=n.textContent;n.textContent="...";try{await secureFetch(`/api/v1/monitoring/alerts/${n.dataset.container}/test`,{method:"POST"}),n.textContent="\u2705",showNotification("Test alert sent for "+n.dataset.name,"success",3e3)}catch{n.textContent="\u274C"}setTimeout(()=>{n.textContent=r},2e3)})}),document.getElementById("upgrade-for-alerts")?.addEventListener("click",()=>{w.classList.remove("show"),j(),typeof openLicenseModal=="function"&&openLicenseModal()})}function C(){T&&clearInterval(T),z?.checked&&(T=setInterval(E,DC.POLL.STATS))}function j(){T&&(clearInterval(T),T=null)}B?.addEventListener("click",()=>{w.classList.add("show"),E(),C()}),A?.addEventListener("click",()=>{w.classList.remove("show"),j()}),w?.addEventListener("click",l=>{l.target===w&&(w.classList.remove("show"),j())}),S?.addEventListener("click",E),z?.addEventListener("change",()=>{z.checked?C():j()}),document.querySelector('[data-panel="stats-aggregated"]')?.addEventListener("click",I),document.querySelector('[data-panel="stats-alerts"]')?.addEventListener("click",O);const N=document.getElementById("stats-history-container"),R=document.getElementById("stats-history-container-area"),u=document.querySelectorAll(".stats-range-btn");let v="1h";function x(l){switch(l){case"1h":return 3600*1e3;case"24h":return 1440*60*1e3;case"7d":return 10080*60*1e3;case"30d":return 720*60*60*1e3;case"1y":return 365*24*60*60*1e3;default:return 3600*1e3}}function g(l){return l==="raw"?"live (10s samples)":l==="hourly"?"hourly average":l==="daily"?"daily average":l}function b(l,m,c,t,e){if(!l||l.length===0)return`
No data for ${escapeHtml(t)}
`;const a=l.map(m).filter(_=>_!=null);if(a.length===0)return`
No data for ${escapeHtml(t)}
`;const o=Math.max(...a,1),i=Math.min(...a,0),n=o-i||1,r=600,d=80,y=4,L=(r-y*2)/Math.max(a.length-1,1),U=a.map((_,J)=>{const X=y+J*L,Q=d-y-(_-i)/n*(d-y*2);return`${X.toFixed(1)},${Q.toFixed(1)}`}).join(" "),q=a[a.length-1],F=a.reduce((_,J)=>_+J,0)/a.length;return` + `,document.getElementById("save-all-alerts")?.addEventListener("click",async()=>{const n={};document.querySelectorAll("#stats-alerts-container tr[data-container]").forEach(r=>{const d=r.dataset.container;n[d]={cpuThreshold:parseInt(r.querySelector(".alert-cpu")?.value)||80,memoryThreshold:parseInt(r.querySelector(".alert-mem")?.value)||90,diskIOThreshold:parseInt(r.querySelector(".alert-disk")?.value)||50,autoRestart:!!r.querySelector(".alert-autorestart")?.checked,enabled:!0}});try{const d=await(await secureFetch("/api/v1/monitoring/alerts/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:n})})).json(),y=document.getElementById("save-all-alerts");y.textContent=d.success?"\u2705 Saved":"\u274C Failed",setTimeout(()=>{y.textContent="Save All"},2e3)}catch{const d=document.getElementById("save-all-alerts");d.textContent="\u274C Error",setTimeout(()=>{d.textContent="Save All"},2e3)}}),document.getElementById("go-to-notifications")?.addEventListener("click",n=>{n.preventDefault(),k.classList.remove("show"),j(),document.getElementById("manage-notifications")?.click()}),document.querySelectorAll(".alert-test-btn").forEach(n=>{n.addEventListener("click",async()=>{const r=n.textContent;n.textContent="...";try{await secureFetch(`/api/v1/monitoring/alerts/${n.dataset.container}/test`,{method:"POST"}),n.textContent="\u2705",showNotification("Test alert sent for "+n.dataset.name,"success",3e3)}catch{n.textContent="\u274C"}setTimeout(()=>{n.textContent=r},2e3)})}),document.getElementById("upgrade-for-alerts")?.addEventListener("click",()=>{k.classList.remove("show"),j(),typeof openLicenseModal=="function"&&openLicenseModal()})}function C(){T&&clearInterval(T),z?.checked&&(T=setInterval(w,DC.POLL.STATS))}function j(){T&&(clearInterval(T),T=null)}B?.addEventListener("click",()=>{k.classList.add("show"),w(),C()}),A?.addEventListener("click",()=>{k.classList.remove("show"),j()}),k?.addEventListener("click",l=>{l.target===k&&(k.classList.remove("show"),j())}),I?.addEventListener("click",w),z?.addEventListener("change",()=>{z.checked?C():j()}),document.querySelector('[data-panel="stats-aggregated"]')?.addEventListener("click",E),document.querySelector('[data-panel="stats-alerts"]')?.addEventListener("click",O);const N=document.getElementById("stats-history-container"),R=document.getElementById("stats-history-container-area"),u=document.querySelectorAll(".stats-range-btn");let v="1h";function x(l){switch(l){case"1h":return 3600*1e3;case"24h":return 1440*60*1e3;case"7d":return 10080*60*1e3;case"30d":return 720*60*60*1e3;case"1y":return 365*24*60*60*1e3;default:return 3600*1e3}}function g(l){return l==="raw"?"live (10s samples)":l==="hourly"?"hourly average":l==="daily"?"daily average":l}function b(l,m,c,t,e){if(!l||l.length===0)return`
No data for ${escapeHtml(t)}
`;const a=l.map(m).filter(_=>_!=null);if(a.length===0)return`
No data for ${escapeHtml(t)}
`;const o=Math.max(...a,1),i=Math.min(...a,0),n=o-i||1,r=600,d=80,y=4,L=(r-y*2)/Math.max(a.length-1,1),U=a.map((_,J)=>{const X=y+J*L,Q=d-y-(_-i)/n*(d-y*2);return`${X.toFixed(1)},${Q.toFixed(1)}`}).join(" "),q=a[a.length-1],F=a.reduce((_,J)=>_+J,0)/a.length;return`
${escapeHtml(t)} @@ -1534,7 +1534,7 @@ This will replace current configuration, credentials, and data. Containers will
-
`);const w=document.getElementById("health-modal"),B=document.getElementById("health-check-btn"),A=document.getElementById("health-cancel"),S=document.getElementById("health-refresh-btn"),z=document.getElementById("health-status-container"),P=document.getElementById("health-incidents-container"),M=document.getElementById("health-config-container"),D=document.getElementById("health-last-update"),h=document.getElementById("health-add-btn"),T=document.getElementById("health-config-form"),f=document.getElementById("health-form-title"),H=document.getElementById("health-form-cancel"),k=document.getElementById("health-form-save"),$="dashcaddy-health-settings",E={retentionDays:30,pollingInterval:60,statsPollingInterval:30,maxEntriesPerService:500,diskUsageThreshold:80},I=document.getElementById("health-global-save"),O=document.getElementById("health-global-reset"),C=document.getElementById("health-global-status"),j=document.getElementById("health-setting-retention"),N=document.getElementById("health-setting-interval"),R=document.getElementById("health-setting-stats-interval"),u=document.getElementById("health-setting-max-entries"),v=document.getElementById("health-setting-disk-threshold");function x(){try{const i=safeGet($),n=i?JSON.parse(i):{};return Object.assign({},E,n)}catch{return Object.assign({},E)}}function g(){const i=x();j&&(j.value=i.retentionDays),N&&(N.value=i.pollingInterval),R&&(R.value=i.statsPollingInterval),u&&(u.value=i.maxEntriesPerService),v&&(v.value=i.diskUsageThreshold)}function b(){const i={retentionDays:Math.max(1,Math.min(3650,parseInt(j?.value)||E.retentionDays)),pollingInterval:Math.max(5,Math.min(3600,parseInt(N?.value)||E.pollingInterval)),statsPollingInterval:Math.max(5,Math.min(3600,parseInt(R?.value)||E.statsPollingInterval)),maxEntriesPerService:Math.max(10,Math.min(1e5,parseInt(u?.value)||E.maxEntriesPerService)),diskUsageThreshold:Math.max(50,Math.min(99,parseInt(v?.value)||E.diskUsageThreshold))};try{safeSet($,JSON.stringify(i)),g(),C&&(C.textContent="Saved \u2713",C.style.color="var(--ok-fg)",setTimeout(()=>{C&&(C.textContent="")},2500)),typeof showNotification=="function"&&showNotification("Global health settings saved","success")}catch(n){C&&(C.textContent="Save failed",C.style.color="var(--bad-fg)"),typeof showNotification=="function"&&showNotification("Failed to save settings: "+n.message,"error")}}function s(){try{safeSet($,JSON.stringify(E))}catch{}g(),C&&(C.textContent="Reset to defaults \u2713",C.style.color="var(--ok-fg)",setTimeout(()=>{C&&(C.textContent="")},2500))}g(),I?.addEventListener("click",b),O?.addEventListener("click",s);let p=null;function l(i){return i>=99.9?"var(--ok-fg)":i>=95?"#f39c12":"var(--bad-fg)"}function m(i){const n={critical:"var(--bad-fg)",high:"#ff6b6b",medium:"#f39c12",low:"var(--muted)"};return`${i}`}async function c(){try{const n=await(await fetch("/api/v1/health-checks/status")).json();if(!n.success||!n.status||Object.keys(n.status).length===0){z.innerHTML='
\u{1F3E5}No health checks configured. Go to the Configure tab to add services.
';return}const r=Object.values(n.status);let d='';d+='',d+='',d+='',d+='';for(const y of r){const L=y.status==="up",U=L?"var(--dot-ok)":"var(--dot-bad)",q=y.uptime?.["24h"]??"-",F=y.uptime?.["7d"]??"-",_=y.avgResponseTime!=null?Math.round(y.avgResponseTime)+"ms":"-",J=y.timestamp?timeAgo(y.timestamp):"-";d+=``,d+=``,d+=``,d+=``,d+=``,d+=``,d+=``,d+="",d+=``}d+="
ServiceStatusUptime 24hUptime 7dAvg ResponseLast Check
${escapeHtml(y.name||y.serviceId)}${L?"Up":"Down"}${typeof q=="number"?q.toFixed(1)+"%":q}${typeof F=="number"?F.toFixed(1)+"%":F}${_}${J}
",z.innerHTML=d,D.textContent="Updated "+new Date().toLocaleTimeString(),z.querySelectorAll("tr[data-health-id]").forEach(y=>{y.addEventListener("click",async()=>{const L=y.dataset.healthId,U=document.getElementById("health-detail-"+L);if(U){if(U.style.display!=="none"){U.style.display="none";return}U.style.display="";try{const F=await(await fetch(`/api/v1/health-checks/${L}/stats?hours=24`)).json();if(F.success&&F.stats){const _=F.stats,J=_.responseTime||{};U.querySelector("td").innerHTML=` + `);const k=document.getElementById("health-modal"),B=document.getElementById("health-check-btn"),A=document.getElementById("health-cancel"),I=document.getElementById("health-refresh-btn"),z=document.getElementById("health-status-container"),P=document.getElementById("health-incidents-container"),M=document.getElementById("health-config-container"),D=document.getElementById("health-last-update"),h=document.getElementById("health-add-btn"),T=document.getElementById("health-config-form"),f=document.getElementById("health-form-title"),H=document.getElementById("health-form-cancel"),S=document.getElementById("health-form-save"),$="dashcaddy-health-settings",w={retentionDays:30,pollingInterval:60,statsPollingInterval:30,maxEntriesPerService:500,diskUsageThreshold:80},E=document.getElementById("health-global-save"),O=document.getElementById("health-global-reset"),C=document.getElementById("health-global-status"),j=document.getElementById("health-setting-retention"),N=document.getElementById("health-setting-interval"),R=document.getElementById("health-setting-stats-interval"),u=document.getElementById("health-setting-max-entries"),v=document.getElementById("health-setting-disk-threshold");function x(){try{const i=safeGet($),n=i?JSON.parse(i):{};return Object.assign({},w,n)}catch{return Object.assign({},w)}}function g(){const i=x();j&&(j.value=i.retentionDays),N&&(N.value=i.pollingInterval),R&&(R.value=i.statsPollingInterval),u&&(u.value=i.maxEntriesPerService),v&&(v.value=i.diskUsageThreshold)}function b(){const i={retentionDays:Math.max(1,Math.min(3650,parseInt(j?.value)||w.retentionDays)),pollingInterval:Math.max(5,Math.min(3600,parseInt(N?.value)||w.pollingInterval)),statsPollingInterval:Math.max(5,Math.min(3600,parseInt(R?.value)||w.statsPollingInterval)),maxEntriesPerService:Math.max(10,Math.min(1e5,parseInt(u?.value)||w.maxEntriesPerService)),diskUsageThreshold:Math.max(50,Math.min(99,parseInt(v?.value)||w.diskUsageThreshold))};try{safeSet($,JSON.stringify(i)),g(),C&&(C.textContent="Saved \u2713",C.style.color="var(--ok-fg)",setTimeout(()=>{C&&(C.textContent="")},2500)),typeof showNotification=="function"&&showNotification("Global health settings saved","success")}catch(n){C&&(C.textContent="Save failed",C.style.color="var(--bad-fg)"),typeof showNotification=="function"&&showNotification("Failed to save settings: "+n.message,"error")}}function s(){try{safeSet($,JSON.stringify(w))}catch{}g(),C&&(C.textContent="Reset to defaults \u2713",C.style.color="var(--ok-fg)",setTimeout(()=>{C&&(C.textContent="")},2500))}g(),E?.addEventListener("click",b),O?.addEventListener("click",s);let p=null;function l(i){return i>=99.9?"var(--ok-fg)":i>=95?"#f39c12":"var(--bad-fg)"}function m(i){const n={critical:"var(--bad-fg)",high:"#ff6b6b",medium:"#f39c12",low:"var(--muted)"};return`${i}`}async function c(){try{const n=await(await fetch("/api/v1/health-checks/status")).json();if(!n.success||!n.status||Object.keys(n.status).length===0){z.innerHTML='
\u{1F3E5}No health checks configured. Go to the Configure tab to add services.
';return}const r=Object.values(n.status);let d='';d+='',d+='',d+='',d+='';for(const y of r){const L=y.status==="up",U=L?"var(--dot-ok)":"var(--dot-bad)",q=y.uptime?.["24h"]??"-",F=y.uptime?.["7d"]??"-",_=y.avgResponseTime!=null?Math.round(y.avgResponseTime)+"ms":"-",J=y.timestamp?timeAgo(y.timestamp):"-";d+=``,d+=``,d+=``,d+=``,d+=``,d+=``,d+=``,d+="",d+=``}d+="
ServiceStatusUptime 24hUptime 7dAvg ResponseLast Check
${escapeHtml(y.name||y.serviceId)}${L?"Up":"Down"}${typeof q=="number"?q.toFixed(1)+"%":q}${typeof F=="number"?F.toFixed(1)+"%":F}${_}${J}
",z.innerHTML=d,D.textContent="Updated "+new Date().toLocaleTimeString(),z.querySelectorAll("tr[data-health-id]").forEach(y=>{y.addEventListener("click",async()=>{const L=y.dataset.healthId,U=document.getElementById("health-detail-"+L);if(U){if(U.style.display!=="none"){U.style.display="none";return}U.style.display="";try{const F=await(await fetch(`/api/v1/health-checks/${L}/stats?hours=24`)).json();if(F.success&&F.stats){const _=F.stats,J=_.responseTime||{};U.querySelector("td").innerHTML=`
Total Checks
${_.totalChecks||0}
Uptime
${(_.uptime||0).toFixed(2)}%
@@ -1551,7 +1551,7 @@ This will replace current configuration, credentials, and data. Containers will
${escapeHtml(q.message)}
Started ${timeAgo(q.createdAt)} \xB7 ${q.occurrences||1} occurrence(s)
- `;y+=""}else y+='
All services operational \u2014 no open incidents
';const U=d.success&&d.history?d.history:[];if(U.length>0){y+='

Incident History

',y+='',y+='';for(const q of U){const F=q.status==="resolved",_=F&&q.duration?q.duration<6e4?Math.round(q.duration/1e3)+"s":Math.round(q.duration/6e4)+"m":"-";y+='',y+=``,y+=``,y+=``,y+=``,y+=``,y+=``,y+=""}y+="
ServiceTypeSeverityStatusDurationWhen
${escapeHtml(q.serviceId)}${escapeHtml(q.type)}${m(q.severity)}${q.status}${_}${timeAgo(q.createdAt)}
"}P.innerHTML=y||'
\u{1F6A8}No incidents recorded yet.
'}catch(i){P.innerHTML=`
Failed: ${escapeHtml(i.message)}
`}}async function e(){try{const n=await(await fetch("/api/v1/health-checks/status")).json(),r=n.success&&n.status?Object.values(n.status):[];if(r.length===0){M.innerHTML='
\u2699\uFE0FNo health checks configured yet. Click "Add Health Check" below.
';return}let d='';d+='';for(const y of r){const L=y.status==="up";d+='',d+=``,d+=``,d+=``,d+='"}d+="
ServiceStatusSLA TargetActions
${escapeHtml(y.name||y.serviceId)}${L?"Up":"Down"}${y.sla?.target?y.sla.target+"%":"-"}',d+=``,d+=``,d+="
",M.innerHTML=d}catch(i){M.innerHTML=`
Failed: ${escapeHtml(i.message)}
`}}function a(i,n,r,d,y,L,U){p=i||null,f.textContent=i?"Edit Health Check":"Add Health Check",document.getElementById("health-form-id").value=i||"",document.getElementById("health-form-id").disabled=!!i,document.getElementById("health-form-name").value=n||"",document.getElementById("health-form-url").value=r||"",document.getElementById("health-form-timeout").value=d||1e4,document.getElementById("health-form-codes").value=y||"200",document.getElementById("health-form-sla").value=L||99.9,document.getElementById("health-form-slow").value=U||5e3,T.style.display="",h.style.display="none"}function o(){T.style.display="none",h.style.display="",p=null}h?.addEventListener("click",()=>a("","","",1e4,"200",99.9,5e3)),H?.addEventListener("click",o),k?.addEventListener("click",async()=>{const i=p||document.getElementById("health-form-id").value.trim();if(!i)return showNotification("Service ID is required","warning");const n=document.getElementById("health-form-url").value.trim();if(!n)return showNotification("URL is required","warning");const r=document.getElementById("health-form-codes").value.split(",").map(y=>parseInt(y.trim())).filter(Boolean),d={name:document.getElementById("health-form-name").value.trim()||i,url:n,timeout:parseInt(document.getElementById("health-form-timeout").value)||1e4,expectedStatusCodes:r.length?r:[200],sla:{target:parseFloat(document.getElementById("health-form-sla").value)||99.9},slowResponseThreshold:parseInt(document.getElementById("health-form-slow").value)||5e3};try{k.textContent="Saving...",k.disabled=!0;const L=await(await secureFetch(`/api/v1/health-checks/${encodeURIComponent(i)}/configure`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)})).json();if(!L.success)throw new Error(L.error||"Save failed");o(),e(),c()}catch(y){showNotification("Error: "+y.message,"error")}finally{k.textContent="Save",k.disabled=!1}}),document.addEventListener("health-edit",async i=>{const n=i.detail;a(n,"","",1e4,"200",99.9,5e3)}),document.addEventListener("health-delete",async i=>{const n=i.detail;if(confirm(`Delete health check for "${n}"?`))try{const d=await(await secureFetch(`/api/v1/health-checks/${encodeURIComponent(n)}/configure`,{method:"DELETE"})).json();if(!d.success)throw new Error(d.error);e(),c()}catch(r){showNotification("Error: "+r.message,"error")}}),B?.addEventListener("click",()=>{w?.classList.add("show"),c()}),wireModal(w,A),S?.addEventListener("click",c),document.querySelector('[data-panel="health-incidents"]')?.addEventListener("click",t),document.querySelector('[data-panel="health-config"]')?.addEventListener("click",e)})(),(function(){injectModal("updates-modal",`
+
`;y+=""}else y+='
All services operational \u2014 no open incidents
';const U=d.success&&d.history?d.history:[];if(U.length>0){y+='

Incident History

',y+='',y+='';for(const q of U){const F=q.status==="resolved",_=F&&q.duration?q.duration<6e4?Math.round(q.duration/1e3)+"s":Math.round(q.duration/6e4)+"m":"-";y+='',y+=``,y+=``,y+=``,y+=``,y+=``,y+=``,y+=""}y+="
ServiceTypeSeverityStatusDurationWhen
${escapeHtml(q.serviceId)}${escapeHtml(q.type)}${m(q.severity)}${q.status}${_}${timeAgo(q.createdAt)}
"}P.innerHTML=y||'
\u{1F6A8}No incidents recorded yet.
'}catch(i){P.innerHTML=`
Failed: ${escapeHtml(i.message)}
`}}async function e(){try{const n=await(await fetch("/api/v1/health-checks/status")).json(),r=n.success&&n.status?Object.values(n.status):[];if(r.length===0){M.innerHTML='
\u2699\uFE0FNo health checks configured yet. Click "Add Health Check" below.
';return}let d='';d+='';for(const y of r){const L=y.status==="up";d+='',d+=``,d+=``,d+=``,d+='"}d+="
ServiceStatusSLA TargetActions
${escapeHtml(y.name||y.serviceId)}${L?"Up":"Down"}${y.sla?.target?y.sla.target+"%":"-"}',d+=``,d+=``,d+="
",M.innerHTML=d}catch(i){M.innerHTML=`
Failed: ${escapeHtml(i.message)}
`}}function a(i,n,r,d,y,L,U){p=i||null,f.textContent=i?"Edit Health Check":"Add Health Check",document.getElementById("health-form-id").value=i||"",document.getElementById("health-form-id").disabled=!!i,document.getElementById("health-form-name").value=n||"",document.getElementById("health-form-url").value=r||"",document.getElementById("health-form-timeout").value=d||1e4,document.getElementById("health-form-codes").value=y||"200",document.getElementById("health-form-sla").value=L||99.9,document.getElementById("health-form-slow").value=U||5e3,T.style.display="",h.style.display="none"}function o(){T.style.display="none",h.style.display="",p=null}h?.addEventListener("click",()=>a("","","",1e4,"200",99.9,5e3)),H?.addEventListener("click",o),S?.addEventListener("click",async()=>{const i=p||document.getElementById("health-form-id").value.trim();if(!i)return showNotification("Service ID is required","warning");const n=document.getElementById("health-form-url").value.trim();if(!n)return showNotification("URL is required","warning");const r=document.getElementById("health-form-codes").value.split(",").map(y=>parseInt(y.trim())).filter(Boolean),d={name:document.getElementById("health-form-name").value.trim()||i,url:n,timeout:parseInt(document.getElementById("health-form-timeout").value)||1e4,expectedStatusCodes:r.length?r:[200],sla:{target:parseFloat(document.getElementById("health-form-sla").value)||99.9},slowResponseThreshold:parseInt(document.getElementById("health-form-slow").value)||5e3};try{S.textContent="Saving...",S.disabled=!0;const L=await(await secureFetch(`/api/v1/health-checks/${encodeURIComponent(i)}/configure`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)})).json();if(!L.success)throw new Error(L.error||"Save failed");o(),e(),c()}catch(y){showNotification("Error: "+y.message,"error")}finally{S.textContent="Save",S.disabled=!1}}),document.addEventListener("health-edit",async i=>{const n=i.detail;a(n,"","",1e4,"200",99.9,5e3)}),document.addEventListener("health-delete",async i=>{const n=i.detail;if(confirm(`Delete health check for "${n}"?`))try{const d=await(await secureFetch(`/api/v1/health-checks/${encodeURIComponent(n)}/configure`,{method:"DELETE"})).json();if(!d.success)throw new Error(d.error);e(),c()}catch(r){showNotification("Error: "+r.message,"error")}}),B?.addEventListener("click",()=>{k?.classList.add("show"),c()}),wireModal(k,A),I?.addEventListener("click",c),document.querySelector('[data-panel="health-incidents"]')?.addEventListener("click",t),document.querySelector('[data-panel="health-config"]')?.addEventListener("click",e)})(),(function(){injectModal("updates-modal",`

\u2B06\uFE0F Update Management

- `);const w=document.getElementById("updates-modal"),B=document.getElementById("updates-btn"),A=document.getElementById("updates-cancel"),S=document.getElementById("updates-check-btn"),z=document.getElementById("updates-available-container"),P=document.getElementById("updates-history-container"),M=document.getElementById("updates-auto-container"),D=document.getElementById("updates-last-check");async function h(){try{const t=await(await fetch("/api/v1/updates/available")).json();if(!t.success)throw new Error(t.error);const e=t.updates||[];if(e.length===0){z.innerHTML='
\u2705All containers are up to date.
',D.textContent="",document.getElementById("updates-update-all-btn").style.display="none",document.getElementById("updates-count-badge").style.display="none",window._pendingUpdates=[];return}let a='';a+='';for(const n of e){const r=(()=>{const d=window.APPS||[];for(const y of d)if(y.containerId===n.containerId||y.name===n.containerName||y.id===n.containerName)return y.id;return n.containerName})();a+=``,a+=``,a+=``,a+=``,a+=``,a+='"}a+="
ContainerImageCurrentLatestActions
${escapeHtml(n.containerName)}${escapeHtml(n.imageName)}${escapeHtml(n.currentDigest)}${escapeHtml(n.latestDigest)}',a+=``,a+=``,a+="
",z.innerHTML=a,D.textContent=e.length+" update(s) available";const o=document.getElementById("updates-count-badge"),i=document.getElementById("updates-update-all-btn");o&&(o.textContent=e.length+" pending",o.style.display=""),i&&e.length>0&&(i.style.display=""),window._pendingUpdates=e,z.querySelectorAll(".update-now-btn").forEach(n=>{n.addEventListener("click",async()=>{const r=n.dataset.id,d=n.dataset.name;if(confirm(`Update "${d}" to the latest version? The container will restart.`)){n.textContent="Updating...",n.disabled=!0;try{const L=await(await secureFetch(`/api/v1/updates/update/${encodeURIComponent(r)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoRollback:!0})})).json();if(L.success)n.textContent="Done!",n.style.background="var(--ok-fg)",setTimeout(()=>h(),2e3);else throw new Error(L.error||"Update failed")}catch(y){n.textContent="Failed",n.style.color="var(--bad-fg)",showNotification("Update error: "+y.message,"error"),setTimeout(()=>{n.textContent="Update",n.disabled=!1,n.style.color="",n.style.background=""},3e3)}}})}),z.querySelectorAll(".rollback-btn").forEach(n=>{n.addEventListener("click",async()=>{const r=n.dataset.id,d=n.dataset.name;if(confirm(`Rollback "${d}" to its previous version?`)){n.textContent="Rolling back...",n.disabled=!0;try{const L=await(await secureFetch(`/api/v1/updates/rollback/${encodeURIComponent(r)}`,{method:"POST"})).json();if(L.success)n.textContent="Rolled back!",setTimeout(()=>h(),2e3);else throw new Error(L.error||"Rollback failed")}catch(y){n.textContent="Failed",showNotification("Rollback error: "+y.message,"error"),setTimeout(()=>{n.textContent="Rollback",n.disabled=!1},3e3)}}})})}catch(c){z.innerHTML=`
Failed: ${escapeHtml(c.message)}
`}}async function T(){const c=window._pendingUpdates||[];if(!c.length)return;const t=document.getElementById("updates-update-all-btn");if(!confirm(`Update all ${c.length} containers? Each will restart.`))return;t.textContent="\u23F3 Updating...",t.disabled=!0;let e=0,a=0;for(const o of c)try{(await(await secureFetch(`/api/v1/updates/update/${encodeURIComponent(o.containerId)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoRollback:!0})})).json()).success?e++:a++}catch{a++}t.textContent="\u2705 Done",showNotification(`Update all: ${e} succeeded, ${a} failed.`,e>0&&a===0?"success":"error"),setTimeout(()=>{t.textContent="\u2B06\uFE0F Update All",t.disabled=!1,h()},3e3)}document.getElementById("updates-update-all-btn")?.addEventListener("click",T);async function f(){S.textContent="\u{1F50D} Checking...",S.disabled=!0;try{const t=await(await secureFetch("/api/v1/updates/check",{method:"POST"})).json();if(!t.success)throw new Error(t.error);S.textContent="\u2705 Done!",await h()}catch(c){S.textContent="\u274C Failed",showNotification("Check error: "+c.message,"error")}setTimeout(()=>{S.textContent="\u{1F50D} Check for Updates",S.disabled=!1},3e3)}async function H(){try{P.innerHTML='
Loading...
';const t=await(await fetch("/api/v1/updates/history?limit=50")).json(),e=t.success&&t.history?t.history:[];if(e.length===0){P.innerHTML='
\u{1F4CB}No update history yet.
';return}let a='';a+='';for(const o of e){const i=o.status==="success",n=o.duration?o.duration<1e3?o.duration+"ms":Math.round(o.duration/1e3)+"s":"-";a+='',a+=``,a+=``,a+=``,a+=``,a+=``,a+="",!i&&o.error&&(a+=``)}a+="
WhenContainerImageDurationStatus
${timeAgo(o.timestamp)}${escapeHtml(o.containerName)}${escapeHtml(o.imageName)}${n}${i?"\u2713 success":"\u2717 failed"}
${escapeHtml(o.error)}
",P.innerHTML=a}catch(c){P.innerHTML=`
Failed: ${escapeHtml(c.message)}
`}}async function k(){try{M.innerHTML='
Loading...
';const[c,t]=await Promise.all([fetch("/api/v1/stats/containers"),fetch("/api/v1/updates/auto-update")]),e=await c.json(),a=await t.json(),o=e.success&&e.stats?e.stats:[],i=a.success&&a.config?a.config:{};if(o.length===0){M.innerHTML='
\u{1F916}No running containers found.
';return}let n='
Auto-updates run during maintenance window (default 2AM-4AM). Daily = every day, Weekly = Sundays, Monthly = 1st of month.
';n+='',n+='';for(const r of o){const d=r.name||r.Names?.[0]?.replace(/^\//,"")||r.Id?.substring(0,12),y=r.containerId||r.Id,L=i[y]||{},U=L.enabled?L.schedule||"weekly":"",q=L.autoRollback!==!1,F=L.maintenanceWindow||"",_=L.lastAutoUpdate?timeAgo(L.lastAutoUpdate):"Never";n+=``,n+=``,n+=``,n+=``,n+=``,n+=``,n+=``,n+=""}n+="
ContainerScheduleWindowRollbackLast RunActions
${escapeHtml(d)} + `);const k=document.getElementById("updates-modal"),B=document.getElementById("updates-btn"),A=document.getElementById("updates-cancel"),I=document.getElementById("updates-check-btn"),z=document.getElementById("updates-available-container"),P=document.getElementById("updates-history-container"),M=document.getElementById("updates-auto-container"),D=document.getElementById("updates-last-check");async function h(){try{const t=await(await fetch("/api/v1/updates/available")).json();if(!t.success)throw new Error(t.error);const e=t.updates||[];if(e.length===0){z.innerHTML='
\u2705All containers are up to date.
',D.textContent="",document.getElementById("updates-update-all-btn").style.display="none",document.getElementById("updates-count-badge").style.display="none",window._pendingUpdates=[];return}let a='';a+='';for(const n of e){const r=(()=>{const d=window.APPS||[];for(const y of d)if(y.containerId===n.containerId||y.name===n.containerName||y.id===n.containerName)return y.id;return n.containerName})();a+=``,a+=``,a+=``,a+=``,a+=``,a+='"}a+="
ContainerImageCurrentLatestActions
${escapeHtml(n.containerName)}${escapeHtml(n.imageName)}${escapeHtml(n.currentDigest)}${escapeHtml(n.latestDigest)}',a+=``,a+=``,a+="
",z.innerHTML=a,D.textContent=e.length+" update(s) available";const o=document.getElementById("updates-count-badge"),i=document.getElementById("updates-update-all-btn");o&&(o.textContent=e.length+" pending",o.style.display=""),i&&e.length>0&&(i.style.display=""),window._pendingUpdates=e,z.querySelectorAll(".update-now-btn").forEach(n=>{n.addEventListener("click",async()=>{const r=n.dataset.id,d=n.dataset.name;if(confirm(`Update "${d}" to the latest version? The container will restart.`)){n.textContent="Updating...",n.disabled=!0;try{const L=await(await secureFetch(`/api/v1/updates/update/${encodeURIComponent(r)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoRollback:!0})})).json();if(L.success)n.textContent="Done!",n.style.background="var(--ok-fg)",setTimeout(()=>h(),2e3);else throw new Error(L.error||"Update failed")}catch(y){n.textContent="Failed",n.style.color="var(--bad-fg)",showNotification("Update error: "+y.message,"error"),setTimeout(()=>{n.textContent="Update",n.disabled=!1,n.style.color="",n.style.background=""},3e3)}}})}),z.querySelectorAll(".rollback-btn").forEach(n=>{n.addEventListener("click",async()=>{const r=n.dataset.id,d=n.dataset.name;if(confirm(`Rollback "${d}" to its previous version?`)){n.textContent="Rolling back...",n.disabled=!0;try{const L=await(await secureFetch(`/api/v1/updates/rollback/${encodeURIComponent(r)}`,{method:"POST"})).json();if(L.success)n.textContent="Rolled back!",setTimeout(()=>h(),2e3);else throw new Error(L.error||"Rollback failed")}catch(y){n.textContent="Failed",showNotification("Rollback error: "+y.message,"error"),setTimeout(()=>{n.textContent="Rollback",n.disabled=!1},3e3)}}})})}catch(c){z.innerHTML=`
Failed: ${escapeHtml(c.message)}
`}}async function T(){const c=window._pendingUpdates||[];if(!c.length)return;const t=document.getElementById("updates-update-all-btn");if(!confirm(`Update all ${c.length} containers? Each will restart.`))return;t.textContent="\u23F3 Updating...",t.disabled=!0;let e=0,a=0;for(const o of c)try{(await(await secureFetch(`/api/v1/updates/update/${encodeURIComponent(o.containerId)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoRollback:!0})})).json()).success?e++:a++}catch{a++}t.textContent="\u2705 Done",showNotification(`Update all: ${e} succeeded, ${a} failed.`,e>0&&a===0?"success":"error"),setTimeout(()=>{t.textContent="\u2B06\uFE0F Update All",t.disabled=!1,h()},3e3)}document.getElementById("updates-update-all-btn")?.addEventListener("click",T);async function f(){I.textContent="\u{1F50D} Checking...",I.disabled=!0;try{const t=await(await secureFetch("/api/v1/updates/check",{method:"POST"})).json();if(!t.success)throw new Error(t.error);I.textContent="\u2705 Done!",await h()}catch(c){I.textContent="\u274C Failed",showNotification("Check error: "+c.message,"error")}setTimeout(()=>{I.textContent="\u{1F50D} Check for Updates",I.disabled=!1},3e3)}async function H(){try{P.innerHTML='
Loading...
';const t=await(await fetch("/api/v1/updates/history?limit=50")).json(),e=t.success&&t.history?t.history:[];if(e.length===0){P.innerHTML='
\u{1F4CB}No update history yet.
';return}let a='';a+='';for(const o of e){const i=o.status==="success",n=o.duration?o.duration<1e3?o.duration+"ms":Math.round(o.duration/1e3)+"s":"-";a+='',a+=``,a+=``,a+=``,a+=``,a+=``,a+="",!i&&o.error&&(a+=``)}a+="
WhenContainerImageDurationStatus
${timeAgo(o.timestamp)}${escapeHtml(o.containerName)}${escapeHtml(o.imageName)}${n}${i?"\u2713 success":"\u2717 failed"}
${escapeHtml(o.error)}
",P.innerHTML=a}catch(c){P.innerHTML=`
Failed: ${escapeHtml(c.message)}
`}}async function S(){try{M.innerHTML='
Loading...
';const[c,t]=await Promise.all([fetch("/api/v1/stats/containers"),fetch("/api/v1/updates/auto-update")]),e=await c.json(),a=await t.json(),o=e.success&&e.stats?e.stats:[],i=a.success&&a.config?a.config:{};if(o.length===0){M.innerHTML='
\u{1F916}No running containers found.
';return}let n='
Auto-updates run during maintenance window (default 2AM-4AM). Daily = every day, Weekly = Sundays, Monthly = 1st of month.
';n+='',n+='';for(const r of o){const d=r.name||r.Names?.[0]?.replace(/^\//,"")||r.Id?.substring(0,12),y=r.containerId||r.Id,L=i[y]||{},U=L.enabled?L.schedule||"weekly":"",q=L.autoRollback!==!1,F=L.maintenanceWindow||"",_=L.lastAutoUpdate?timeAgo(L.lastAutoUpdate):"Never";n+=``,n+=``,n+=``,n+=``,n+=``,n+=``,n+=``,n+=""}n+="
ContainerScheduleWindowRollbackLast RunActions
${escapeHtml(d)} ${_}
",M.innerHTML=n,M.querySelectorAll(".save-auto-btn").forEach(r=>{r.addEventListener("click",async()=>{const d=r.dataset.id,y=r.closest("tr"),L=y.querySelector(".auto-schedule").value,U=y.querySelector(".auto-rollback").checked,q=y.querySelector(".auto-window").value.trim();r.textContent="Saving...",r.disabled=!0;try{const _=await(await secureFetch(`/api/v1/updates/auto-update/${encodeURIComponent(d)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({enabled:!!L,schedule:L||"weekly",autoRollback:U,maintenanceWindow:q||void 0})})).json();if(_.success)r.textContent="\u2713 Saved";else throw new Error(_.error)}catch(F){r.textContent="\u2717 Error",showNotification("Save error: "+F.message,"error")}setTimeout(()=>{r.textContent="Save",r.disabled=!1},2e3)})})}catch(c){M.innerHTML=`
Failed: ${escapeHtml(c.message)}
`}}const $=document.getElementById("dashcaddy-current-version"),E=document.getElementById("dashcaddy-update-badge"),I=document.getElementById("dashcaddy-update-details"),O=document.getElementById("dashcaddy-new-version"),C=document.getElementById("dashcaddy-changelog"),j=document.getElementById("dashcaddy-apply-btn"),N=document.getElementById("dashcaddy-check-btn"),R=document.getElementById("dashcaddy-rollback-btn"),u=document.getElementById("dashcaddy-status-bar"),v=document.getElementById("dashcaddy-history-container");let x=null;function g(c,t){u&&(u.style.display="block",u.style.background=t==="error"?"var(--bad-bg)":t==="success"?"var(--ok-bg)":"var(--bg)",u.style.color=t==="error"?"var(--bad-fg)":t==="success"?"var(--ok-fg)":"var(--fg)",u.textContent=c)}async function b(){try{const t=await(await fetch("/api/v1/system/version")).json();if(t.success){const e=t.commit&&t.commit!=="unknown"?t.commit:null;$.textContent="v"+t.version+(e?" ("+e.substring(0,7)+")":"")}}catch{$.textContent="Unable to fetch version"}}async function s(c){c||(N.textContent="Checking...",N.disabled=!0);try{const e=await(await fetch("/api/v1/system/update-check")).json();if(x=e,e.success&&e.available&&e.remote){E.style.display="",I.style.display="",O.textContent="v"+e.remote.version,C.textContent=e.remote.changelog||"No changelog available.";const a=document.getElementById("updates-btn");if(a&&!a.querySelector(".update-dot")){const i=document.createElement("span");i.className="update-dot",i.style.cssText="position:absolute;top:2px;right:2px;width:8px;height:8px;border-radius:50%;background:var(--accent);",a.style.position="relative",a.appendChild(i)}const o=document.getElementById("updates-dashcaddy-tab");if(o&&!o.querySelector(".update-dot")){const i=document.createElement("span");i.className="update-dot",i.style.cssText="display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--accent);margin-left:4px;vertical-align:middle;",o.appendChild(i)}}else E.style.display="none",I.style.display="none",await b(),c||g("You are running the latest version.","success");c||(N.textContent="Check for Updates",N.disabled=!1)}catch(t){c||(g("Failed to check: "+t.message,"error"),N.textContent="Check for Updates",N.disabled=!1)}}async function p(){if(!confirm("Apply DashCaddy update? The API container will restart."))return!1;j.textContent="Updating...",j.disabled=!0,g("Downloading and applying update...","info");try{const t=await(await secureFetch("/api/v1/system/update-apply",{method:"POST"})).json();if(t.success)return g("Update initiated: v"+(t.fromVersion||"?")+" \u2192 v"+(t.toVersion||"?")+". The container will restart shortly.","success"),j.textContent="Applied!",document.querySelectorAll(".update-dot").forEach(e=>e.remove()),!0;throw new Error(t.error||"Update failed")}catch(c){throw g("Update failed: "+c.message,"error"),j.textContent="Update Now",j.disabled=!1,c}}async function l(){try{const t=await(await fetch("/api/v1/system/update-history")).json(),e=t.success&&t.history?t.history:[];if(e.length===0){v.innerHTML='
\u{1F4E6}No self-update history.
';return}let a='';a+='';for(const o of e){const i=o.status==="success"?"\u2713 success":o.status==="pending"?"\u23F3 pending":o.status==="partial"?"\u26A0 partial":"\u2717 "+o.status,n=o.status==="success"?"var(--ok-fg)":o.status==="pending"?"var(--muted)":"var(--bad-fg)";a+='',a+='",a+='",a+='",a+='",a+="",o.error&&(a+='"),o.note&&(a+='")}a+="
WhenVersionFromStatus
'+timeAgo(o.timestamp)+"v'+escapeHtml(o.version)+(o.rollback?" (rollback)":"")+"v'+escapeHtml(o.fromVersion||"?")+"'+i+"
'+escapeHtml(o.error)+"
'+escapeHtml(o.note)+"
",v.innerHTML=a}catch(c){v.innerHTML='
Failed: '+escapeHtml(c.message)+"
"}}async function m(){try{const t=await(await fetch("/api/v1/system/rollback-versions")).json(),e=t.success&&t.versions?t.versions:[];if(e.length===0){showNotification("No rollback versions available.","info");return}const a=prompt(`Available rollback versions: +
${_}
",M.innerHTML=n,M.querySelectorAll(".save-auto-btn").forEach(r=>{r.addEventListener("click",async()=>{const d=r.dataset.id,y=r.closest("tr"),L=y.querySelector(".auto-schedule").value,U=y.querySelector(".auto-rollback").checked,q=y.querySelector(".auto-window").value.trim();r.textContent="Saving...",r.disabled=!0;try{const _=await(await secureFetch(`/api/v1/updates/auto-update/${encodeURIComponent(d)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({enabled:!!L,schedule:L||"weekly",autoRollback:U,maintenanceWindow:q||void 0})})).json();if(_.success)r.textContent="\u2713 Saved";else throw new Error(_.error)}catch(F){r.textContent="\u2717 Error",showNotification("Save error: "+F.message,"error")}setTimeout(()=>{r.textContent="Save",r.disabled=!1},2e3)})})}catch(c){M.innerHTML=`
Failed: ${escapeHtml(c.message)}
`}}const $=document.getElementById("dashcaddy-current-version"),w=document.getElementById("dashcaddy-update-badge"),E=document.getElementById("dashcaddy-update-details"),O=document.getElementById("dashcaddy-new-version"),C=document.getElementById("dashcaddy-changelog"),j=document.getElementById("dashcaddy-apply-btn"),N=document.getElementById("dashcaddy-check-btn"),R=document.getElementById("dashcaddy-rollback-btn"),u=document.getElementById("dashcaddy-status-bar"),v=document.getElementById("dashcaddy-history-container");let x=null;function g(c,t){u&&(u.style.display="block",u.style.background=t==="error"?"var(--bad-bg)":t==="success"?"var(--ok-bg)":"var(--bg)",u.style.color=t==="error"?"var(--bad-fg)":t==="success"?"var(--ok-fg)":"var(--fg)",u.textContent=c)}async function b(){try{const t=await(await fetch("/api/v1/system/version")).json();if(t.success){const e=t.commit&&t.commit!=="unknown"?t.commit:null;$.textContent="v"+t.version+(e?" ("+e.substring(0,7)+")":"")}}catch{$.textContent="Unable to fetch version"}}async function s(c){c||(N.textContent="Checking...",N.disabled=!0);try{const e=await(await fetch("/api/v1/system/update-check")).json();if(x=e,e.success&&e.available&&e.remote){w.style.display="",E.style.display="",O.textContent="v"+e.remote.version,C.textContent=e.remote.changelog||"No changelog available.";const a=document.getElementById("updates-btn");if(a&&!a.querySelector(".update-dot")){const i=document.createElement("span");i.className="update-dot",i.style.cssText="position:absolute;top:2px;right:2px;width:8px;height:8px;border-radius:50%;background:var(--accent);",a.style.position="relative",a.appendChild(i)}const o=document.getElementById("updates-dashcaddy-tab");if(o&&!o.querySelector(".update-dot")){const i=document.createElement("span");i.className="update-dot",i.style.cssText="display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--accent);margin-left:4px;vertical-align:middle;",o.appendChild(i)}}else w.style.display="none",E.style.display="none",await b(),c||g("You are running the latest version.","success");c||(N.textContent="Check for Updates",N.disabled=!1)}catch(t){c||(g("Failed to check: "+t.message,"error"),N.textContent="Check for Updates",N.disabled=!1)}}async function p(){if(!confirm("Apply DashCaddy update? The API container will restart."))return!1;j.textContent="Updating...",j.disabled=!0,g("Downloading and applying update...","info");try{const t=await(await secureFetch("/api/v1/system/update-apply",{method:"POST"})).json();if(t.success)return g("Update initiated: v"+(t.fromVersion||"?")+" \u2192 v"+(t.toVersion||"?")+". The container will restart shortly.","success"),j.textContent="Applied!",document.querySelectorAll(".update-dot").forEach(e=>e.remove()),!0;throw new Error(t.error||"Update failed")}catch(c){throw g("Update failed: "+c.message,"error"),j.textContent="Update Now",j.disabled=!1,c}}async function l(){try{const t=await(await fetch("/api/v1/system/update-history")).json(),e=t.success&&t.history?t.history:[];if(e.length===0){v.innerHTML='
\u{1F4E6}No self-update history.
';return}let a='';a+='';for(const o of e){const i=o.status==="success"?"\u2713 success":o.status==="pending"?"\u23F3 pending":o.status==="partial"?"\u26A0 partial":"\u2717 "+o.status,n=o.status==="success"?"var(--ok-fg)":o.status==="pending"?"var(--muted)":"var(--bad-fg)";a+='',a+='",a+='",a+='",a+='",a+="",o.error&&(a+='"),o.note&&(a+='")}a+="
WhenVersionFromStatus
'+timeAgo(o.timestamp)+"v'+escapeHtml(o.version)+(o.rollback?" (rollback)":"")+"v'+escapeHtml(o.fromVersion||"?")+"'+i+"
'+escapeHtml(o.error)+"
'+escapeHtml(o.note)+"
",v.innerHTML=a}catch(c){v.innerHTML='
Failed: '+escapeHtml(c.message)+"
"}}async function m(){try{const t=await(await fetch("/api/v1/system/rollback-versions")).json(),e=t.success&&t.versions?t.versions:[];if(e.length===0){showNotification("No rollback versions available.","info");return}const a=prompt(`Available rollback versions: `+e.join(` `)+` -Enter version to rollback to:`);if(!a)return;if(!e.includes(a)){showNotification("Invalid version: "+a,"error");return}if(!confirm("Rollback DashCaddy to v"+a+"? The container will restart."))return;g("Rolling back to v"+a+"...","info");const i=await(await secureFetch("/api/v1/system/rollback",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({version:a})})).json();if(i.success)g("Rollback to v"+a+" initiated. Container will restart.","success");else throw new Error(i.error||"Rollback failed")}catch(c){g("Rollback failed: "+c.message,"error")}}N?.addEventListener("click",()=>s(!1)),j?.addEventListener("click",()=>p().catch(()=>{})),R?.addEventListener("click",m),S?.addEventListener("click",f),B?.addEventListener("click",()=>{w?.classList.add("show"),h()}),wireModal(w,A),window.openUpdateModal=function(c){w?.classList.add("show"),h().then(()=>{if(!c)return;const t=z.querySelector(`[data-app-id="${c}"]`);t&&(t.scrollIntoView({behavior:"smooth",block:"center"}),t.style.background="rgba(249,115,22,0.15)",setTimeout(()=>{t.style.background=""},3e3))})},document.querySelector('[data-panel="updates-history"]')?.addEventListener("click",H),document.querySelector('[data-panel="updates-auto"]')?.addEventListener("click",k),document.querySelector('[data-panel="updates-dashcaddy"]')?.addEventListener("click",()=>{b(),l(),x||s(!0)}),window.dcApplyUpdate=p,window.dcCheckForUpdate=s,setTimeout(()=>s(!0),5e3)})(),(function(){injectModal("docker-resources-modal",`
+Enter version to rollback to:`);if(!a)return;if(!e.includes(a)){showNotification("Invalid version: "+a,"error");return}if(!confirm("Rollback DashCaddy to v"+a+"? The container will restart."))return;g("Rolling back to v"+a+"...","info");const i=await(await secureFetch("/api/v1/system/rollback",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({version:a})})).json();if(i.success)g("Rollback to v"+a+" initiated. Container will restart.","success");else throw new Error(i.error||"Rollback failed")}catch(c){g("Rollback failed: "+c.message,"error")}}N?.addEventListener("click",()=>s(!1)),j?.addEventListener("click",()=>p().catch(()=>{})),R?.addEventListener("click",m),I?.addEventListener("click",f),B?.addEventListener("click",()=>{k?.classList.add("show"),h()}),wireModal(k,A),window.openUpdateModal=function(c){k?.classList.add("show"),h().then(()=>{if(!c)return;const t=z.querySelector(`[data-app-id="${c}"]`);t&&(t.scrollIntoView({behavior:"smooth",block:"center"}),t.style.background="rgba(249,115,22,0.15)",setTimeout(()=>{t.style.background=""},3e3))})},document.querySelector('[data-panel="updates-history"]')?.addEventListener("click",H),document.querySelector('[data-panel="updates-auto"]')?.addEventListener("click",S),document.querySelector('[data-panel="updates-dashcaddy"]')?.addEventListener("click",()=>{b(),l(),x||s(!0)}),window.dcApplyUpdate=p,window.dcCheckForUpdate=s,setTimeout(()=>s(!0),5e3)})(),(function(){injectModal("docker-resources-modal",`

\u{1F433} Docker Resources

@@ -1684,7 +1684,7 @@ Enter version to rollback to:`);if(!a)return;if(!e.includes(a)){showNotification
-
`);const w=document.getElementById("docker-resources-modal"),B=document.getElementById("docker-resources-btn"),A=document.getElementById("dr-close");function S(D){if(!D||D===0)return"0 B";const h=["B","KB","MB","GB","TB"],T=Math.floor(Math.log(Math.abs(D))/Math.log(1024));return(D/Math.pow(1024,T)).toFixed(1)+" "+h[T]}async function z(){const D=document.getElementById("dr-vol-list");try{const T=(await getJSON("/api/v1/docker/volumes")).volumes||[];if(T.length===0){D.innerHTML='
\u{1F4E6}No volumes found.
';return}let f='';f+='';for(const H of T){const k=H.name==="buildkit"||H.name.length===64;f+='',f+=``,f+=``,f+=``,f+='"}f+="
NameDriverScopeActions
${escapeHtml(H.name.length>40?H.name.substring(0,37)+"...":H.name)}${escapeHtml(H.driver)}${escapeHtml(H.scope)}',k||(f+=``),f+="
",D.innerHTML=f,D.querySelectorAll(".dr-vol-del").forEach(H=>{H.addEventListener("click",async()=>{if(confirm(`Delete volume "${H.dataset.name}"? Data will be lost.`)){H.textContent="...",H.disabled=!0;try{await deleteAPI(`/api/v1/docker/volumes/${encodeURIComponent(H.dataset.name)}?force=true`),z()}catch(k){showNotification("Delete failed: "+k.message,"error"),H.textContent="Delete",H.disabled=!1}}})})}catch(h){D.innerHTML=`
Failed: ${escapeHtml(h.message)}
`}}document.getElementById("dr-vol-create")?.addEventListener("click",async()=>{const D=document.getElementById("dr-vol-name"),h=D.value.trim();if(!h){showNotification("Enter a volume name","warning");return}try{await postJSON("/api/v1/docker/volumes",{name:h}),D.value="",showNotification(`Volume "${h}" created`,"success"),z()}catch(T){showNotification("Create failed: "+T.message,"error")}});async function P(){const D=document.getElementById("dr-net-list");try{const T=(await getJSON("/api/v1/docker/networks")).networks||[];if(T.length===0){D.innerHTML='
\u{1F310}No networks found.
';return}let f='';f+='';for(const H of T){const k=["bridge","host","none"].includes(H.name);f+='',f+=``,f+=``,f+=``,f+=``,f+='"}f+="
NameDriverScopeContainersActions
${escapeHtml(H.name)}${escapeHtml(H.driver)}${escapeHtml(H.scope)}${H.containers}',k||(f+=``),f+="
",D.innerHTML=f,D.querySelectorAll(".dr-net-del").forEach(H=>{H.addEventListener("click",async()=>{if(confirm(`Delete network "${H.dataset.name}"?`)){H.textContent="...",H.disabled=!0;try{await deleteAPI(`/api/v1/docker/networks/${encodeURIComponent(H.dataset.id)}`),P()}catch(k){showNotification("Delete failed: "+k.message,"error"),H.textContent="Delete",H.disabled=!1}}})})}catch(h){D.innerHTML=`
Failed: ${escapeHtml(h.message)}
`}}document.getElementById("dr-net-create")?.addEventListener("click",async()=>{const D=document.getElementById("dr-net-name"),h=document.getElementById("dr-net-driver"),T=D.value.trim();if(!T){showNotification("Enter a network name","warning");return}try{await postJSON("/api/v1/docker/networks",{name:T,driver:h.value}),D.value="",showNotification(`Network "${T}" created`,"success"),P()}catch(f){showNotification("Create failed: "+f.message,"error")}});async function M(){const D=document.getElementById("dr-disk-content");try{const h=await getJSON("/api/v1/docker/disk-usage"),T=[{label:"Images",icon:"\u{1F4C0}",count:h.images.count,size:h.images.size,reclaimable:h.images.reclaimable},{label:"Containers",icon:"\u{1F4E6}",count:h.containers.count,size:h.containers.size,extra:`${h.containers.running} running`},{label:"Volumes",icon:"\u{1F4BE}",count:h.volumes.count,size:h.volumes.size,reclaimable:h.volumes.reclaimable},{label:"Build Cache",icon:"\u{1F527}",count:h.buildCache.count,size:h.buildCache.size,reclaimable:h.buildCache.reclaimable}];let f=`
Total: ${S(h.totalSize)}
`;f+='
';for(const H of T)f+='
',f+=`
${H.icon} ${H.label} (${H.count})
`,f+=`
${S(H.size)}
`,H.reclaimable>0&&(f+=`
Reclaimable: ${S(H.reclaimable)}
`),H.extra&&(f+=`
${H.extra}
`),f+="
";f+="
",D.innerHTML=f}catch(h){D.innerHTML=`
Failed: ${escapeHtml(h.message)}
`}}B?.addEventListener("click",()=>{w?.classList.add("show"),z()}),wireModal(w,A),document.querySelector('[data-panel="dr-networks"]')?.addEventListener("click",P),document.querySelector('[data-panel="dr-disk"]')?.addEventListener("click",M)})(),(function(){injectModal("compose-import-modal",`
+
`);const k=document.getElementById("docker-resources-modal"),B=document.getElementById("docker-resources-btn"),A=document.getElementById("dr-close");function I(D){if(!D||D===0)return"0 B";const h=["B","KB","MB","GB","TB"],T=Math.floor(Math.log(Math.abs(D))/Math.log(1024));return(D/Math.pow(1024,T)).toFixed(1)+" "+h[T]}async function z(){const D=document.getElementById("dr-vol-list");try{const T=(await getJSON("/api/v1/docker/volumes")).volumes||[];if(T.length===0){D.innerHTML='
\u{1F4E6}No volumes found.
';return}let f='';f+='';for(const H of T){const S=H.name==="buildkit"||H.name.length===64;f+='',f+=``,f+=``,f+=``,f+='"}f+="
NameDriverScopeActions
${escapeHtml(H.name.length>40?H.name.substring(0,37)+"...":H.name)}${escapeHtml(H.driver)}${escapeHtml(H.scope)}',S||(f+=``),f+="
",D.innerHTML=f,D.querySelectorAll(".dr-vol-del").forEach(H=>{H.addEventListener("click",async()=>{if(confirm(`Delete volume "${H.dataset.name}"? Data will be lost.`)){H.textContent="...",H.disabled=!0;try{await deleteAPI(`/api/v1/docker/volumes/${encodeURIComponent(H.dataset.name)}?force=true`),z()}catch(S){showNotification("Delete failed: "+S.message,"error"),H.textContent="Delete",H.disabled=!1}}})})}catch(h){D.innerHTML=`
Failed: ${escapeHtml(h.message)}
`}}document.getElementById("dr-vol-create")?.addEventListener("click",async()=>{const D=document.getElementById("dr-vol-name"),h=D.value.trim();if(!h){showNotification("Enter a volume name","warning");return}try{await postJSON("/api/v1/docker/volumes",{name:h}),D.value="",showNotification(`Volume "${h}" created`,"success"),z()}catch(T){showNotification("Create failed: "+T.message,"error")}});async function P(){const D=document.getElementById("dr-net-list");try{const T=(await getJSON("/api/v1/docker/networks")).networks||[];if(T.length===0){D.innerHTML='
\u{1F310}No networks found.
';return}let f='';f+='';for(const H of T){const S=["bridge","host","none"].includes(H.name);f+='',f+=``,f+=``,f+=``,f+=``,f+='"}f+="
NameDriverScopeContainersActions
${escapeHtml(H.name)}${escapeHtml(H.driver)}${escapeHtml(H.scope)}${H.containers}',S||(f+=``),f+="
",D.innerHTML=f,D.querySelectorAll(".dr-net-del").forEach(H=>{H.addEventListener("click",async()=>{if(confirm(`Delete network "${H.dataset.name}"?`)){H.textContent="...",H.disabled=!0;try{await deleteAPI(`/api/v1/docker/networks/${encodeURIComponent(H.dataset.id)}`),P()}catch(S){showNotification("Delete failed: "+S.message,"error"),H.textContent="Delete",H.disabled=!1}}})})}catch(h){D.innerHTML=`
Failed: ${escapeHtml(h.message)}
`}}document.getElementById("dr-net-create")?.addEventListener("click",async()=>{const D=document.getElementById("dr-net-name"),h=document.getElementById("dr-net-driver"),T=D.value.trim();if(!T){showNotification("Enter a network name","warning");return}try{await postJSON("/api/v1/docker/networks",{name:T,driver:h.value}),D.value="",showNotification(`Network "${T}" created`,"success"),P()}catch(f){showNotification("Create failed: "+f.message,"error")}});async function M(){const D=document.getElementById("dr-disk-content");try{const h=await getJSON("/api/v1/docker/disk-usage"),T=[{label:"Images",icon:"\u{1F4C0}",count:h.images.count,size:h.images.size,reclaimable:h.images.reclaimable},{label:"Containers",icon:"\u{1F4E6}",count:h.containers.count,size:h.containers.size,extra:`${h.containers.running} running`},{label:"Volumes",icon:"\u{1F4BE}",count:h.volumes.count,size:h.volumes.size,reclaimable:h.volumes.reclaimable},{label:"Build Cache",icon:"\u{1F527}",count:h.buildCache.count,size:h.buildCache.size,reclaimable:h.buildCache.reclaimable}];let f=`
Total: ${I(h.totalSize)}
`;f+='
';for(const H of T)f+='
',f+=`
${H.icon} ${H.label} (${H.count})
`,f+=`
${I(H.size)}
`,H.reclaimable>0&&(f+=`
Reclaimable: ${I(H.reclaimable)}
`),H.extra&&(f+=`
${H.extra}
`),f+="
";f+="
",D.innerHTML=f}catch(h){D.innerHTML=`
Failed: ${escapeHtml(h.message)}
`}}B?.addEventListener("click",()=>{k?.classList.add("show"),z()}),wireModal(k,A),document.querySelector('[data-panel="dr-networks"]')?.addEventListener("click",P),document.querySelector('[data-panel="dr-disk"]')?.addEventListener("click",M)})(),(function(){injectModal("compose-import-modal",`

\u{1F4E6} Import Docker Compose

@@ -1725,7 +1725,7 @@ Enter version to rollback to:`);if(!a)return;if(!e.includes(a)){showNotification
- `);const w=document.getElementById("compose-import-modal"),B=document.getElementById("compose-import-btn"),A=document.getElementById("compose-cancel");wireModal(w,A);let S=null;function z(M){document.getElementById("compose-step-paste").style.display=M==="paste"?"":"none",document.getElementById("compose-step-preview").style.display=M==="preview"?"":"none",document.getElementById("compose-step-progress").style.display=M==="progress"?"":"none"}B?.addEventListener("click",()=>{z("paste"),S=null,document.getElementById("compose-yaml").value="",document.getElementById("compose-stack-name").value="",w?.classList.add("show")}),document.getElementById("compose-file-upload")?.addEventListener("change",M=>{const D=M.target.files[0];if(!D)return;const h=new FileReader;h.onload=()=>{document.getElementById("compose-yaml").value=h.result},h.readAsText(D)}),document.getElementById("compose-parse-btn")?.addEventListener("click",async()=>{const M=document.getElementById("compose-yaml").value.trim(),D=document.getElementById("compose-stack-name").value.trim()||"stack";if(!M){showNotification("Paste a docker-compose.yml","warning");return}const h=document.getElementById("compose-parse-btn"),T=h.textContent;h.textContent="Parsing...",h.disabled=!0;try{const f=await postJSON("/api/v1/apps/import-compose",{yaml:M,stackName:D});S=f,S.stackName=D,P(f),z("preview")}catch(f){showNotification("Parse failed: "+f.message,"error")}finally{h.textContent=T,h.disabled=!1}});function P(M){const D=document.getElementById("compose-preview-content");let h="";M.networks&&M.networks.length>0&&(h+=`
Networks: ${M.networks.map(T=>`${escapeHtml(T)}`).join(", ")}
`),M.volumes&&M.volumes.length>0&&(h+=`
Volumes: ${M.volumes.map(T=>`${escapeHtml(T)}`).join(", ")}
`),h+=`
${M.services.length} service(s)
`,h+='
';for(const T of M.services){const f=T.skip?"var(--bad-fg)":"var(--border)";if(h+=`
`,h+=`
${escapeHtml(T.name)}`,T.skip&&(h+=` \u2014 skipped: ${escapeHtml(T.reason)}`),h+="
",!T.skip&&(h+=`
Image: ${escapeHtml(T.image)}
`,T.ports?.length&&(h+=`
Ports: ${T.ports.map(H=>`${H.host}:${H.container}`).join(", ")}
`),T.volumes?.length&&(h+=`
Volumes: ${T.volumes.length}
`),Object.keys(T.environment||{}).length&&(h+=`
Env vars: ${Object.keys(T.environment).length}
`),T.envFileWarning&&(h+=`
\u26A0 ${escapeHtml(T.envFileWarning)}
`),T.resources?.cpus||T.resources?.memory)){const H=[];T.resources.cpus&&H.push(`CPU: ${T.resources.cpus}`),T.resources.memory&&H.push(`Mem: ${T.resources.memory}MB`),h+=`
Limits: ${H.join(", ")}
`}h+="
"}h+="
",D.innerHTML=h}document.getElementById("compose-back-btn")?.addEventListener("click",()=>z("paste")),document.getElementById("compose-deploy-btn")?.addEventListener("click",async()=>{if(!S)return;const M=document.getElementById("compose-deploy-btn");M.textContent="Deploying...",M.disabled=!0,z("progress");const D=document.getElementById("compose-progress-content");D.innerHTML='
Deploying services...
';try{const h=await postJSON("/api/v1/apps/deploy-compose",{services:S.services,networks:S.networks,stackName:S.stackName});let T=`
Stack "${escapeHtml(h.stackName)}" \u2014 Deployment Complete
`;T+='
';for(const f of h.results){const H=f.status==="deployed"||f.status==="created"?"\u2705":f.status==="exists"?"\u26A1":f.status==="skipped"?"\u23ED":"\u274C";T+='
',T+=`${H} ${escapeHtml(f.name)} (${f.type}) \u2014 ${escapeHtml(f.status)}`,f.error&&(T+=` ${escapeHtml(f.error)}`),f.subdomain&&(T+=` \u2192 ${escapeHtml(f.subdomain)}`),f.reason&&(T+=` (${escapeHtml(f.reason)})`),T+="
"}T+="
",T+='',D.innerHTML=T,document.getElementById("compose-done-btn")?.addEventListener("click",()=>{w?.classList.remove("show"),typeof window.loadServices=="function"&&window.loadServices().then(()=>{typeof window.buildGrid=="function"&&window.buildGrid()})}),showNotification(`Stack "${h.stackName}" deployed`,"success")}catch(h){D.innerHTML=`
Deployment failed: ${escapeHtml(h.message)}
+ `);const k=document.getElementById("compose-import-modal"),B=document.getElementById("compose-import-btn"),A=document.getElementById("compose-cancel");wireModal(k,A);let I=null;function z(M){document.getElementById("compose-step-paste").style.display=M==="paste"?"":"none",document.getElementById("compose-step-preview").style.display=M==="preview"?"":"none",document.getElementById("compose-step-progress").style.display=M==="progress"?"":"none"}B?.addEventListener("click",()=>{z("paste"),I=null,document.getElementById("compose-yaml").value="",document.getElementById("compose-stack-name").value="",k?.classList.add("show")}),document.getElementById("compose-file-upload")?.addEventListener("change",M=>{const D=M.target.files[0];if(!D)return;const h=new FileReader;h.onload=()=>{document.getElementById("compose-yaml").value=h.result},h.readAsText(D)}),document.getElementById("compose-parse-btn")?.addEventListener("click",async()=>{const M=document.getElementById("compose-yaml").value.trim(),D=document.getElementById("compose-stack-name").value.trim()||"stack";if(!M){showNotification("Paste a docker-compose.yml","warning");return}const h=document.getElementById("compose-parse-btn"),T=h.textContent;h.textContent="Parsing...",h.disabled=!0;try{const f=await postJSON("/api/v1/apps/import-compose",{yaml:M,stackName:D});I=f,I.stackName=D,P(f),z("preview")}catch(f){showNotification("Parse failed: "+f.message,"error")}finally{h.textContent=T,h.disabled=!1}});function P(M){const D=document.getElementById("compose-preview-content");let h="";M.networks&&M.networks.length>0&&(h+=`
Networks: ${M.networks.map(T=>`${escapeHtml(T)}`).join(", ")}
`),M.volumes&&M.volumes.length>0&&(h+=`
Volumes: ${M.volumes.map(T=>`${escapeHtml(T)}`).join(", ")}
`),h+=`
${M.services.length} service(s)
`,h+='
';for(const T of M.services){const f=T.skip?"var(--bad-fg)":"var(--border)";if(h+=`
`,h+=`
${escapeHtml(T.name)}`,T.skip&&(h+=` \u2014 skipped: ${escapeHtml(T.reason)}`),h+="
",!T.skip&&(h+=`
Image: ${escapeHtml(T.image)}
`,T.ports?.length&&(h+=`
Ports: ${T.ports.map(H=>`${H.host}:${H.container}`).join(", ")}
`),T.volumes?.length&&(h+=`
Volumes: ${T.volumes.length}
`),Object.keys(T.environment||{}).length&&(h+=`
Env vars: ${Object.keys(T.environment).length}
`),T.envFileWarning&&(h+=`
\u26A0 ${escapeHtml(T.envFileWarning)}
`),T.resources?.cpus||T.resources?.memory)){const H=[];T.resources.cpus&&H.push(`CPU: ${T.resources.cpus}`),T.resources.memory&&H.push(`Mem: ${T.resources.memory}MB`),h+=`
Limits: ${H.join(", ")}
`}h+="
"}h+="
",D.innerHTML=h}document.getElementById("compose-back-btn")?.addEventListener("click",()=>z("paste")),document.getElementById("compose-deploy-btn")?.addEventListener("click",async()=>{if(!I)return;const M=document.getElementById("compose-deploy-btn");M.textContent="Deploying...",M.disabled=!0,z("progress");const D=document.getElementById("compose-progress-content");D.innerHTML='
Deploying services...
';try{const h=await postJSON("/api/v1/apps/deploy-compose",{services:I.services,networks:I.networks,stackName:I.stackName});let T=`
Stack "${escapeHtml(h.stackName)}" \u2014 Deployment Complete
`;T+='
';for(const f of h.results){const H=f.status==="deployed"||f.status==="created"?"\u2705":f.status==="exists"?"\u26A1":f.status==="skipped"?"\u23ED":"\u274C";T+='
',T+=`${H} ${escapeHtml(f.name)} (${f.type}) \u2014 ${escapeHtml(f.status)}`,f.error&&(T+=` ${escapeHtml(f.error)}`),f.subdomain&&(T+=` \u2192 ${escapeHtml(f.subdomain)}`),f.reason&&(T+=` (${escapeHtml(f.reason)})`),T+="
"}T+="
",T+='',D.innerHTML=T,document.getElementById("compose-done-btn")?.addEventListener("click",()=>{k?.classList.remove("show"),typeof window.loadServices=="function"&&window.loadServices().then(()=>{typeof window.buildGrid=="function"&&window.buildGrid()})}),showNotification(`Stack "${h.stackName}" deployed`,"success")}catch(h){D.innerHTML=`
Deployment failed: ${escapeHtml(h.message)}
`,document.getElementById("compose-retry-btn")?.addEventListener("click",()=>z("paste"))}finally{M.textContent="Deploy All",M.disabled=!1}})})(),(function(){injectModal("exec-modal",`

Terminal

@@ -1734,11 +1734,11 @@ Enter version to rollback to:`);if(!a)return;if(!e.includes(a)){showNotification
- `);const w=document.getElementById("exec-modal"),B=document.getElementById("exec-terminal"),A=document.getElementById("exec-close");let S=null,z=null,P=null;function M(){if(z){try{z.close()}catch{}z=null}if(S){try{S.dispose()}catch{}S=null}P=null,B.innerHTML=""}function D(h,T){if(M(),document.getElementById("exec-title").textContent=`Terminal \u2014 ${T||h}`,w?.classList.add("show"),typeof Terminal>"u"){B.innerHTML='
xterm.js not loaded
';return}S=new Terminal({cursorBlink:!0,fontSize:14,fontFamily:"'Cascadia Code', 'Fira Code', 'Consolas', monospace",theme:{background:"#1e1e1e",foreground:"#d4d4d4",cursor:"#aeafad",selectionBackground:"#264f78"},scrollback:5e3}),typeof FitAddon<"u"&&(P=new FitAddon.FitAddon,S.loadAddon(P)),S.open(B),P&&setTimeout(()=>P.fit(),50);const f=location.protocol==="https:"?"wss:":"ws:";z=new WebSocket(`${f}//${location.host}/ws/exec/${encodeURIComponent(h)}`),z.binaryType="arraybuffer",z.onopen=()=>{if(S.writeln("\x1B[32mConnecting...\x1B[0m"),P){const k=P.proposeDimensions();k&&z.send(JSON.stringify({type:"resize",cols:k.cols,rows:k.rows}))}},z.onmessage=k=>{if(typeof k.data=="string"){try{const $=JSON.parse(k.data);if($.type==="connected"){S.writeln(`\x1B[32mConnected (${$.shell})\x1B[0m\r -`);return}if($.type==="error"){S.writeln(`\x1B[31mError: ${$.message}\x1B[0m`);return}if($.type==="exit"){S.writeln(`\r -\x1B[33mSession ended.\x1B[0m`);return}}catch{}S.write(k.data)}else S.write(new Uint8Array(k.data))},z.onclose=()=>{S&&S.writeln(`\r -\x1B[33mDisconnected.\x1B[0m`)},z.onerror=()=>{S&&S.writeln(`\r -\x1B[31mConnection error.\x1B[0m`)},S.onData(k=>{z&&z.readyState===WebSocket.OPEN&&z.send(k)}),S.onResize(({cols:k,rows:$})=>{z&&z.readyState===WebSocket.OPEN&&z.send(JSON.stringify({type:"resize",cols:k,rows:$}))});const H=()=>{P&&P.fit()};window.addEventListener("resize",H),w._resizeHandler=H}A?.addEventListener("click",()=>{M(),w._resizeHandler&&window.removeEventListener("resize",w._resizeHandler),w?.classList.remove("show")}),w?.addEventListener("click",h=>{h.target===w&&(M(),w._resizeHandler&&window.removeEventListener("resize",w._resizeHandler),w?.classList.remove("show"))}),window.openExecModal=D})(),(function(){injectModal("audit-modal",`
+
`);const k=document.getElementById("exec-modal"),B=document.getElementById("exec-terminal"),A=document.getElementById("exec-close");let I=null,z=null,P=null;function M(){if(z){try{z.close()}catch{}z=null}if(I){try{I.dispose()}catch{}I=null}P=null,B.innerHTML=""}function D(h,T){if(M(),document.getElementById("exec-title").textContent=`Terminal \u2014 ${T||h}`,k?.classList.add("show"),typeof Terminal>"u"){B.innerHTML='
xterm.js not loaded
';return}I=new Terminal({cursorBlink:!0,fontSize:14,fontFamily:"'Cascadia Code', 'Fira Code', 'Consolas', monospace",theme:{background:"#1e1e1e",foreground:"#d4d4d4",cursor:"#aeafad",selectionBackground:"#264f78"},scrollback:5e3}),typeof FitAddon<"u"&&(P=new FitAddon.FitAddon,I.loadAddon(P)),I.open(B),P&&setTimeout(()=>P.fit(),50);const f=location.protocol==="https:"?"wss:":"ws:";z=new WebSocket(`${f}//${location.host}/ws/exec/${encodeURIComponent(h)}`),z.binaryType="arraybuffer",z.onopen=()=>{if(I.writeln("\x1B[32mConnecting...\x1B[0m"),P){const S=P.proposeDimensions();S&&z.send(JSON.stringify({type:"resize",cols:S.cols,rows:S.rows}))}},z.onmessage=S=>{if(typeof S.data=="string"){try{const $=JSON.parse(S.data);if($.type==="connected"){I.writeln(`\x1B[32mConnected (${$.shell})\x1B[0m\r +`);return}if($.type==="error"){I.writeln(`\x1B[31mError: ${$.message}\x1B[0m`);return}if($.type==="exit"){I.writeln(`\r +\x1B[33mSession ended.\x1B[0m`);return}}catch{}I.write(S.data)}else I.write(new Uint8Array(S.data))},z.onclose=()=>{I&&I.writeln(`\r +\x1B[33mDisconnected.\x1B[0m`)},z.onerror=()=>{I&&I.writeln(`\r +\x1B[31mConnection error.\x1B[0m`)},I.onData(S=>{z&&z.readyState===WebSocket.OPEN&&z.send(S)}),I.onResize(({cols:S,rows:$})=>{z&&z.readyState===WebSocket.OPEN&&z.send(JSON.stringify({type:"resize",cols:S,rows:$}))});const H=()=>{P&&P.fit()};window.addEventListener("resize",H),k._resizeHandler=H}A?.addEventListener("click",()=>{M(),k._resizeHandler&&window.removeEventListener("resize",k._resizeHandler),k?.classList.remove("show")}),k?.addEventListener("click",h=>{h.target===k&&(M(),k._resizeHandler&&window.removeEventListener("resize",k._resizeHandler),k?.classList.remove("show"))}),window.openExecModal=D})(),(function(){injectModal("audit-modal",`

\u{1F4DC} Audit Log

- `);const w=document.getElementById("audit-modal"),B=document.getElementById("audit-log-btn"),A=document.getElementById("audit-cancel"),S=document.getElementById("audit-refresh-btn"),z=document.getElementById("audit-clear-btn"),P=document.getElementById("audit-filter"),M=document.getElementById("audit-outcome-filter"),D=document.getElementById("audit-since"),h=document.getElementById("audit-until"),T=document.getElementById("audit-log-container"),f=document.getElementById("audit-load-more");let H=0,k=null,$=0;const E=50;function I(N){if(!N)return null;const R=new Date(N);return isNaN(R.getTime())?null:R.toISOString()}async function O(N){try{N?(k&&k.abort(),k=new AbortController):(k&&k.abort(),k=new AbortController,H=0,$++,T.innerHTML='
Loading...
');const R=$,u=new URLSearchParams;u.set("limit",String(E)),u.set("offset",String(H));const v=P.value,x=M.value,g=I(D.value),b=I(h.value);v&&u.set("action",v),x&&u.set("outcome",x),g&&u.set("since",g),b&&u.set("until",b);const s=await fetch("/api/v1/audit-logs?"+u.toString(),{signal:k.signal});if(!s.ok){T.innerHTML=`
Failed: HTTP ${s.status}
`,f.style.display="none";return}const p=await s.json();if(!p.success){T.innerHTML=`
Failed: ${escapeHtml(p.error||"unknown")}
`,f.style.display="none";return}if(!N&&R!==$)return;const l=Array.isArray(p.entries)?p.entries:[];if(l.length===0&&!N){const c=p.filters&&(p.filters.action||p.filters.outcome||p.filters.since||p.filters.until)?"No entries match your filters.":"No audit log entries yet. Actions will be logged automatically.";T.innerHTML=`
\u{1F4DC}${escapeHtml(c)}
`,f.style.display="none";return}let m="";N||(m='',m+='',m+='',m+='',m+='',m+='',m+='',m+='',m+="");for(const c of l){const t=c.outcome==="success",e=C(c);m+='',m+=``,m+=``,m+=``,m+=``,m+=``,m+=``,m+="",c.details&&Object.keys(c.details).length>0&&(m+=``)}if(!N)m+="
WhenActorIPActionResourceResult
${timeAgo(c.timestamp)}${e}${escapeHtml(c.ip||"-")}${escapeHtml(c.action||"-")}${escapeHtml(c.resource||"-")}${t?"\u2713":"\u2717"} ${escapeHtml(c.outcome||"")}
",T.innerHTML=m;else{const c=T.querySelector("table");c&&c.insertAdjacentHTML("beforeend",m)}H+=l.length,f.style.display=p.hasMore?"":"none",T.querySelectorAll(".audit-row").forEach(c=>{c.dataset.wired||(c.dataset.wired="true",c.addEventListener("click",()=>{const t=c.nextElementSibling;t&&t.classList.contains("audit-detail")&&(t.style.display=t.style.display==="none"?"":"none")}))})}catch(R){if(R&&R.name==="AbortError")return;T.innerHTML=`
Failed: ${escapeHtml(R.message)}
`}}function C(N){const R=N.details||{},u=R.userEmail,v=R.userId,x=R.userRole,g=R.viaProvider;if(u){const b=x?` [${escapeHtml(x)}${g?"/"+escapeHtml(g):""}]`:"";return`${escapeHtml(u)}${b}`}return v?`${escapeHtml(v)}`:N.ip?'anon':'system'}B?.addEventListener("click",()=>{w?.classList.add("show"),O(!1)}),wireModal(w,A),S?.addEventListener("click",()=>O(!1)),P?.addEventListener("change",()=>O(!1)),M?.addEventListener("change",()=>O(!1));let j;[D,h].forEach(N=>{N?.addEventListener("change",()=>{clearTimeout(j),j=setTimeout(()=>O(!1),250)})}),f?.addEventListener("click",()=>O(!0)),z?.addEventListener("click",async()=>{if(confirm("Clear the entire audit log? This cannot be undone."))try{const R=await(await secureFetch("/api/v1/audit-logs",{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:"CLEAR"})})).json();R.success?O(!1):showNotification("Error: "+(R.error||"Clear failed"),"error")}catch(N){showNotification("Error: "+N.message,"error")}})})(),(function(){injectModal("security-modal",`
+
`);const k=document.getElementById("audit-modal"),B=document.getElementById("audit-log-btn"),A=document.getElementById("audit-cancel"),I=document.getElementById("audit-refresh-btn"),z=document.getElementById("audit-clear-btn"),P=document.getElementById("audit-filter"),M=document.getElementById("audit-outcome-filter"),D=document.getElementById("audit-since"),h=document.getElementById("audit-until"),T=document.getElementById("audit-log-container"),f=document.getElementById("audit-load-more");let H=0,S=null,$=0;const w=50;function E(N){if(!N)return null;const R=new Date(N);return isNaN(R.getTime())?null:R.toISOString()}async function O(N){try{N?(S&&S.abort(),S=new AbortController):(S&&S.abort(),S=new AbortController,H=0,$++,T.innerHTML='
Loading...
');const R=$,u=new URLSearchParams;u.set("limit",String(w)),u.set("offset",String(H));const v=P.value,x=M.value,g=E(D.value),b=E(h.value);v&&u.set("action",v),x&&u.set("outcome",x),g&&u.set("since",g),b&&u.set("until",b);const s=await fetch("/api/v1/audit-logs?"+u.toString(),{signal:S.signal});if(!s.ok){T.innerHTML=`
Failed: HTTP ${s.status}
`,f.style.display="none";return}const p=await s.json();if(!p.success){T.innerHTML=`
Failed: ${escapeHtml(p.error||"unknown")}
`,f.style.display="none";return}if(!N&&R!==$)return;const l=Array.isArray(p.entries)?p.entries:[];if(l.length===0&&!N){const c=p.filters&&(p.filters.action||p.filters.outcome||p.filters.since||p.filters.until)?"No entries match your filters.":"No audit log entries yet. Actions will be logged automatically.";T.innerHTML=`
\u{1F4DC}${escapeHtml(c)}
`,f.style.display="none";return}let m="";N||(m='',m+='',m+='',m+='',m+='',m+='',m+='',m+='',m+="");for(const c of l){const t=c.outcome==="success",e=C(c);m+='',m+=``,m+=``,m+=``,m+=``,m+=``,m+=``,m+="",c.details&&Object.keys(c.details).length>0&&(m+=``)}if(!N)m+="
WhenActorIPActionResourceResult
${timeAgo(c.timestamp)}${e}${escapeHtml(c.ip||"-")}${escapeHtml(c.action||"-")}${escapeHtml(c.resource||"-")}${t?"\u2713":"\u2717"} ${escapeHtml(c.outcome||"")}
",T.innerHTML=m;else{const c=T.querySelector("table");c&&c.insertAdjacentHTML("beforeend",m)}H+=l.length,f.style.display=p.hasMore?"":"none",T.querySelectorAll(".audit-row").forEach(c=>{c.dataset.wired||(c.dataset.wired="true",c.addEventListener("click",()=>{const t=c.nextElementSibling;t&&t.classList.contains("audit-detail")&&(t.style.display=t.style.display==="none"?"":"none")}))})}catch(R){if(R&&R.name==="AbortError")return;T.innerHTML=`
Failed: ${escapeHtml(R.message)}
`}}function C(N){const R=N.details||{},u=R.userEmail,v=R.userId,x=R.userRole,g=R.viaProvider;if(u){const b=x?` [${escapeHtml(x)}${g?"/"+escapeHtml(g):""}]`:"";return`${escapeHtml(u)}${b}`}return v?`${escapeHtml(v)}`:N.ip?'anon':'system'}B?.addEventListener("click",()=>{k?.classList.add("show"),O(!1)}),wireModal(k,A),I?.addEventListener("click",()=>O(!1)),P?.addEventListener("change",()=>O(!1)),M?.addEventListener("change",()=>O(!1));let j;[D,h].forEach(N=>{N?.addEventListener("change",()=>{clearTimeout(j),j=setTimeout(()=>O(!1),250)})}),f?.addEventListener("click",()=>O(!0)),z?.addEventListener("click",async()=>{if(confirm("Clear the entire audit log? This cannot be undone."))try{const R=await(await secureFetch("/api/v1/audit-logs",{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:"CLEAR"})})).json();R.success?O(!1):showNotification("Error: "+(R.error||"Clear failed"),"error")}catch(N){showNotification("Error: "+N.message,"error")}})})(),(function(){injectModal("security-modal",`

\u{1F6E1}\uFE0F Security Center

- `);const w=document.getElementById("security-modal"),B=document.getElementById("security-center-btn"),A=document.getElementById("sec-cancel"),S=w.querySelectorAll(".sec-tab"),z=w.querySelectorAll(".sec-panel");let P=[],M=[],D=null;S.forEach(s=>{s.addEventListener("click",()=>{S.forEach(p=>p.classList.toggle("active",p===s)),z.forEach(p=>p.style.display=p.dataset.panel===s.dataset.tab?"":"none"),s.dataset.tab==="overview"&&H(),s.dataset.tab==="events"&&j(),s.dataset.tab==="hosts"&&v()})}),B&&B.addEventListener("click",()=>{w.classList.add("show"),H(),T()}),A.addEventListener("click",h),w.addEventListener("click",s=>{s.target===w&&h()});function h(){w.classList.remove("show"),f()}function T(){if(f(),!!document.getElementById("sec-live-tail").checked&&!(typeof EventSource>"u"))try{D=new EventSource("/api/v1/security/events/stream"),D.addEventListener("init",s=>{try{P=JSON.parse(s.data).events||[],N()}catch{}}),D.addEventListener("security",s=>{try{const p=JSON.parse(s.data);P.unshift(p),P.length>500&&(P.length=500);const l=w.querySelector(".sec-tab.active")?.dataset?.tab;l==="events"?N():l==="overview"&&H()}catch{}}),D.onerror=()=>{}}catch(s){console.warn("[security] SSE failed:",s.message)}}function f(){if(D){try{D.close()}catch{}D=null}}document.getElementById("sec-live-tail").addEventListener("change",()=>{w.classList.contains("show")&&T()});async function H(){try{const s=new Date(Date.now()-864e5).toISOString(),[p,l,m]=await Promise.all([fetch(`/api/v1/security/events/stats?since=${encodeURIComponent(s)}`),fetch("/api/v1/security/hosts"),fetch(`/api/v1/security/events?limit=1&since=${encodeURIComponent(s)}`)]),c=(await p.json()).data||{},t=(await l.json()).data?.hosts||[],e=(await m.json()).data?.total||0;document.querySelector('#sec-stats [data-key="total"]').textContent=`${e} events (24h)`,document.querySelector('#sec-stats [data-key="warn"]').textContent=`${c.by_severity?.warn||0} warnings`,document.querySelector('#sec-stats [data-key="error"]').textContent=`${c.by_severity?.error||0} errors`,document.querySelector('#sec-stats [data-key="denied"]').textContent=`${c.by_outcome?.denied||0} denied`,document.querySelector('#sec-stats [data-key="hosts"]').textContent=`${t.length} hosts`,k("sec-top-actors",c.top_actors||[]),k("sec-top-targets",c.top_targets||[])}catch(s){console.warn("[security] refreshOverview failed:",s.message)}}function k(s,p){const l=document.getElementById(s);if(!p.length){l.innerHTML='
No data
';return}l.innerHTML=''+p.map(m=>``).join("")+"
${g(String(m.key))}${m.count}
"}const $=document.getElementById("sec-filter-source"),E=document.getElementById("sec-filter-severity"),I=document.getElementById("sec-filter-host"),O=document.getElementById("sec-filter-actor"),C=document.getElementById("sec-refresh-btn");[$,E,I].forEach(s=>s.addEventListener("change",j)),O.addEventListener("input",b(j,250)),C.addEventListener("click",j);async function j(){try{const s=new URLSearchParams;s.set("limit","200"),$.value&&s.set("source_type",$.value),E.value&&s.set("severity",E.value),I.value&&s.set("source_host",I.value),O.value&&s.set("actor_prefix",O.value),P=(await(await fetch(`/api/v1/security/events?${s}`)).json()).data.events||[],N(),(!I.options.length||I.options.length===1)&&await u()}catch(s){document.getElementById("sec-events-container").innerHTML='
Load failed: '+g(s.message)+"
"}}function N(){const s=document.getElementById("sec-events-container");if(!P.length){s.innerHTML='
No events
';return}s.innerHTML=P.slice(0,200).map(R).join("")}function R(s){const p=s.severity||"info",l={critical:"#c0392b",error:"#e74c3c",warn:"#f39c12",notice:"#3498db",info:"#7f8c8d"}[p]||"#7f8c8d",m=s.ts?new Date(s.ts).toLocaleTimeString():"",c=s.source_type||"",t=s.actor||"\u2014",e=s.target||"",a=s.action||"",o=s.outcome||"";return`
+
`);const k=document.getElementById("security-modal"),B=document.getElementById("security-center-btn"),A=document.getElementById("sec-cancel"),I=k.querySelectorAll(".sec-tab"),z=k.querySelectorAll(".sec-panel");let P=[],M=[],D=null;I.forEach(s=>{s.addEventListener("click",()=>{I.forEach(p=>p.classList.toggle("active",p===s)),z.forEach(p=>p.style.display=p.dataset.panel===s.dataset.tab?"":"none"),s.dataset.tab==="overview"&&H(),s.dataset.tab==="events"&&j(),s.dataset.tab==="hosts"&&v()})}),B&&B.addEventListener("click",()=>{k.classList.add("show"),H(),T()}),A.addEventListener("click",h),k.addEventListener("click",s=>{s.target===k&&h()});function h(){k.classList.remove("show"),f()}function T(){if(f(),!!document.getElementById("sec-live-tail").checked&&!(typeof EventSource>"u"))try{D=new EventSource("/api/v1/security/events/stream"),D.addEventListener("init",s=>{try{P=JSON.parse(s.data).events||[],N()}catch{}}),D.addEventListener("security",s=>{try{const p=JSON.parse(s.data);P.unshift(p),P.length>500&&(P.length=500);const l=k.querySelector(".sec-tab.active")?.dataset?.tab;l==="events"?N():l==="overview"&&H()}catch{}}),D.onerror=()=>{}}catch(s){console.warn("[security] SSE failed:",s.message)}}function f(){if(D){try{D.close()}catch{}D=null}}document.getElementById("sec-live-tail").addEventListener("change",()=>{k.classList.contains("show")&&T()});async function H(){try{const s=new Date(Date.now()-864e5).toISOString(),[p,l,m]=await Promise.all([fetch(`/api/v1/security/events/stats?since=${encodeURIComponent(s)}`),fetch("/api/v1/security/hosts"),fetch(`/api/v1/security/events?limit=1&since=${encodeURIComponent(s)}`)]),c=(await p.json()).data||{},t=(await l.json()).data?.hosts||[],e=(await m.json()).data?.total||0;document.querySelector('#sec-stats [data-key="total"]').textContent=`${e} events (24h)`,document.querySelector('#sec-stats [data-key="warn"]').textContent=`${c.by_severity?.warn||0} warnings`,document.querySelector('#sec-stats [data-key="error"]').textContent=`${c.by_severity?.error||0} errors`,document.querySelector('#sec-stats [data-key="denied"]').textContent=`${c.by_outcome?.denied||0} denied`,document.querySelector('#sec-stats [data-key="hosts"]').textContent=`${t.length} hosts`,S("sec-top-actors",c.top_actors||[]),S("sec-top-targets",c.top_targets||[])}catch(s){console.warn("[security] refreshOverview failed:",s.message)}}function S(s,p){const l=document.getElementById(s);if(!p.length){l.innerHTML='
No data
';return}l.innerHTML=''+p.map(m=>``).join("")+"
${g(String(m.key))}${m.count}
"}const $=document.getElementById("sec-filter-source"),w=document.getElementById("sec-filter-severity"),E=document.getElementById("sec-filter-host"),O=document.getElementById("sec-filter-actor"),C=document.getElementById("sec-refresh-btn");[$,w,E].forEach(s=>s.addEventListener("change",j)),O.addEventListener("input",b(j,250)),C.addEventListener("click",j);async function j(){try{const s=new URLSearchParams;s.set("limit","200"),$.value&&s.set("source_type",$.value),w.value&&s.set("severity",w.value),E.value&&s.set("source_host",E.value),O.value&&s.set("actor_prefix",O.value),P=(await(await fetch(`/api/v1/security/events?${s}`)).json()).data.events||[],N(),(!E.options.length||E.options.length===1)&&await u()}catch(s){document.getElementById("sec-events-container").innerHTML='
Load failed: '+g(s.message)+"
"}}function N(){const s=document.getElementById("sec-events-container");if(!P.length){s.innerHTML='
No events
';return}s.innerHTML=P.slice(0,200).map(R).join("")}function R(s){const p=s.severity||"info",l={critical:"#c0392b",error:"#e74c3c",warn:"#f39c12",notice:"#3498db",info:"#7f8c8d"}[p]||"#7f8c8d",m=s.ts?new Date(s.ts).toLocaleTimeString():"",c=s.source_type||"",t=s.actor||"\u2014",e=s.target||"",a=s.action||"",o=s.outcome||"";return`
${g(p)} ${g(c)} ${g(t)} ${g(a)} ${g(e)} ${g(o)} ${g(m)} -
`}async function u(){try{const p=(await(await fetch("/api/v1/security/hosts")).json()).data?.hosts||[],l=I.value;I.innerHTML=''+p.map(m=>``).join(""),l&&(I.value=l)}catch{}}document.getElementById("sec-host-register-btn").addEventListener("click",x),document.getElementById("sec-hosts-refresh").addEventListener("click",v);async function v(){try{const p=(await(await fetch("/api/v1/security/hosts")).json()).data?.hosts||[];M=p;const l=document.getElementById("sec-hosts-container");if(!p.length){l.innerHTML='
No hosts registered. Click \u2795 Register Host to add one.
';return}l.innerHTML=p.map(m=>{const c=m.enabled?m.last_seen_at?Date.now()-Date.parse(m.last_seen_at)>18e5?"\u{1F7E1} stale":"\u{1F7E2} online":"\u26AA registered":"\u{1F534} disabled";return`
+
`}async function u(){try{const p=(await(await fetch("/api/v1/security/hosts")).json()).data?.hosts||[],l=E.value;E.innerHTML=''+p.map(m=>``).join(""),l&&(E.value=l)}catch{}}document.getElementById("sec-host-register-btn").addEventListener("click",x),document.getElementById("sec-hosts-refresh").addEventListener("click",v);async function v(){try{const p=(await(await fetch("/api/v1/security/hosts")).json()).data?.hosts||[];M=p;const l=document.getElementById("sec-hosts-container");if(!p.length){l.innerHTML='
No hosts registered. Click \u2795 Register Host to add one.
';return}l.innerHTML=p.map(m=>{const c=m.enabled?m.last_seen_at?Date.now()-Date.parse(m.last_seen_at)>18e5?"\u{1F7E1} stale":"\u{1F7E2} online":"\u26AA registered":"\u{1F534} disabled";return`
${g(m.label||m.id)} ${g(m.type)} @@ -1895,7 +1895,7 @@ type: ${c.data.host.type} ${c.data.api_key} Send this key as: Authorization: Bearer -To endpoint: POST /api/v1/security/events/ingest or /events/batch`),v()}catch(m){alert("Failed: "+m.message)}}function g(s){return String(s).replace(/[&<>"']/g,p=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[p])}function b(s,p){let l;return function(){clearTimeout(l),l=setTimeout(()=>s.apply(this,arguments),p)}}})(),(function(){const w=new ErrorHandler;injectModal("weather-modal",`

Weather Settings

+To endpoint: POST /api/v1/security/events/ingest or /events/batch`),v()}catch(m){alert("Failed: "+m.message)}}function g(s){return String(s).replace(/[&<>"']/g,p=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[p])}function b(s,p){let l;return function(){clearTimeout(l),l=setTimeout(()=>s.apply(this,arguments),p)}}})(),(function(){const k=new ErrorHandler;injectModal("weather-modal",`

Weather Settings

Enter a city name, postal code, or “City, Country”
@@ -1906,7 +1906,7 @@ To endpoint: POST /api/v1/security/events/ingest or /events/batch`),v()}catch(m)
-
`);const B="weather-location",A="weather-zip",S="weather-geo",z="weather-unit";!safeGet(B)&&safeGet(A)&&safeSet(B,safeGet(A));function P(){return safeGet(z)||"imperial"}function M(){return{icon:document.querySelector(".weather-icon"),temp:document.querySelector(".weather-temp"),condition:document.querySelector(".weather-condition"),location:document.querySelector(".weather-location"),wind:document.querySelector(".weather-wind")}}const D={0:"Clear sky",1:"Mainly clear",2:"Partly cloudy",3:"Overcast",45:"Fog",48:"Rime fog",51:"Light drizzle",53:"Drizzle",55:"Dense drizzle",56:"Freezing drizzle",57:"Dense freezing drizzle",61:"Light rain",63:"Moderate rain",65:"Heavy rain",66:"Light freezing rain",67:"Heavy freezing rain",71:"Light snow",73:"Moderate snow",75:"Heavy snow",77:"Snow grains",80:"Light showers",81:"Moderate showers",82:"Violent showers",85:"Light snow showers",86:"Heavy snow showers",95:"Thunderstorm",96:"Thunderstorm with hail",99:"Severe thunderstorm"},h={0:"\u2600\uFE0F",1:"\u{1F324}\uFE0F",2:"\u26C5",3:"\u2601\uFE0F",45:"\u{1F32B}\uFE0F",48:"\u{1F32B}\uFE0F",51:"\u{1F326}\uFE0F",53:"\u{1F326}\uFE0F",55:"\u{1F326}\uFE0F",56:"\u{1F328}\uFE0F",57:"\u{1F328}\uFE0F",61:"\u{1F326}\uFE0F",63:"\u{1F327}\uFE0F",65:"\u{1F327}\uFE0F",66:"\u{1F328}\uFE0F",67:"\u{1F328}\uFE0F",71:"\u{1F328}\uFE0F",73:"\u2744\uFE0F",75:"\u2744\uFE0F",77:"\u2744\uFE0F",80:"\u{1F326}\uFE0F",81:"\u{1F327}\uFE0F",82:"\u{1F327}\uFE0F",85:"\u{1F328}\uFE0F",86:"\u2744\uFE0F",95:"\u26C8\uFE0F",96:"\u26C8\uFE0F",99:"\u26C8\uFE0F"},T=["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"];function f(C){return T[Math.round(C/22.5)%16]}async function H(C){const j=safeGet(S);if(j)try{const x=JSON.parse(j);if(x.query===C)return x}catch{}const N=await fetch(`https://geocoding-api.open-meteo.com/v1/search?name=${encodeURIComponent(C)}&count=1&language=en&format=json`);if(!N.ok)throw new Error("Geocoding failed");const R=await N.json();if(!R.results||!R.results.length)throw new Error("Location not found");const u=R.results[0],v={query:C,lat:u.latitude,lon:u.longitude,city:u.name,state:u.admin1||"",country:u.country||"",countryCode:u.country_code||""};return safeSet(S,JSON.stringify(v)),v}function k(C){return C.countryCode==="US"&&C.state?`${C.city}, ${C.state}`:C.country?`${C.city}, ${C.country}`:C.city}async function $(C){try{const j=await H(C),N=P(),R=N==="metric"?"celsius":"fahrenheit",u=N==="metric"?"kmh":"mph",v=`https://api.open-meteo.com/v1/forecast?latitude=${j.lat}&longitude=${j.lon}¤t=temperature_2m,weather_code,wind_speed_10m,wind_direction_10m&temperature_unit=${R}&wind_speed_unit=${u}`,x=await fetch(v);if(!x.ok)throw new Error("Weather fetch failed");const b=(await x.json()).current,s=b.weather_code;return{temp:Math.round(b.temperature_2m),condition:D[s]||"Unknown",icon:h[s]||"\u{1F324}\uFE0F",locationStr:k(j),windSpeed:Math.round(b.wind_speed_10m),windDir:f(b.wind_direction_10m),unit:N}}catch(j){return console.warn("Weather fetch failed:",j),null}}async function E(){const C=M();if(!C.icon||!C.temp||!C.condition||!C.location||!C.wind){console.warn("Weather widget elements not found");return}const j=safeGet(B);if(!j){C.location.textContent="Set Location",C.temp.textContent="--\xB0",C.condition.textContent="Click \u2699\uFE0F to configure",C.wind.textContent="--",C.icon.innerHTML='\u{1F324}\uFE0F';return}try{const N=await $(j);if(N){const R=N.unit==="metric"?"\xB0C":"\xB0F",u=N.unit==="metric"?"km/h":"mph";C.location.textContent=N.locationStr,C.temp.textContent=`${N.temp}${R}`,C.condition.textContent=N.condition,C.wind.textContent=`Wind: ${N.windSpeed} ${u} ${N.windDir}`,C.icon.innerHTML=`${escapeHtml(N.icon)}`}}catch(N){w.logError("[Weather] Update Error",N,{function:"updateWeather"}),C.location.textContent="Weather Error",C.temp.textContent="Error",C.condition.textContent="Failed to load",C.wind.textContent="--"}}const I=document.getElementById("weather-modal"),O=document.getElementById("weather-location-input");document.getElementById("weather-settings")?.addEventListener("click",()=>{O.value=safeGet(B)||"";const C=P(),j=I.querySelector(`input[name="weather-unit-radio"][value="${C}"]`);j&&(j.checked=!0),I.classList.add("show"),O.focus()}),document.getElementById("weather-cancel")?.addEventListener("click",()=>{I.classList.remove("show")}),document.getElementById("weather-save")?.addEventListener("click",()=>{const C=O.value.trim();if(C){safeGet(B)!==C&&safeSet(S,""),safeSet(B,C);const N=I.querySelector('input[name="weather-unit-radio"]:checked'),R=N?N.value:"imperial",u=P();safeSet(z,R),u!==R&&safeSet(S,""),I.classList.remove("show"),E()}else showNotification("Please enter a location (e.g., Hamburg, London, 90210)","warning")}),wireModal(I),document.addEventListener("keydown",C=>{C.key==="Escape"&&I.classList.contains("show")&&I.classList.remove("show")}),E(),setInterval(E,DC.POLL.WEATHER)})(),(function(){const w=document.getElementById("clock-widget"),B=document.getElementById("clock-render");if(!w||!B)return;const A=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],S=["January","February","March","April","May","June","July","August","September","October","November","December"],z=["XII","I","II","III","IV","V","VI","VII","VIII","IX","X","XI"];let P=safeGet("clock-style")||"default",M=-1,D=!1,h="",T="",f=null,H=null;function k(t){if(D||safeGet("clock-chimes")!=="true")return;D=!0;const e=parseInt(safeGet("clock-chime-volume")||"50",10)/100;let a=0;function o(){if(a>=t){D=!1;return}const i=new Audio("/assets/sounds/church-bell.mp3");i.volume=e,i.play().catch(()=>{}),a++,a{D=!1},2500)}o()}function $(t){return A[t.getDay()]+", "+S[t.getMonth()]+" "+t.getDate()+", "+t.getFullYear()}function E(){T="",f=null}function I(){return T!=="digital"&&(B.innerHTML='
',f={main:B.querySelector(".clock-main"),seconds:B.querySelector(".clock-seconds"),ampm:B.querySelector(".clock-ampm"),date:B.querySelector(".clock-date")},T="digital"),f}function O(t){const e=t.getHours(),a=t.getMinutes(),o=t.getSeconds(),i=e>=12?"PM":"AM",n=e%12||12,r=I();r.main.textContent=`${n}:${String(a).padStart(2,"0")}`,r.seconds.textContent=`:${String(o).padStart(2,"0")}`,r.ampm.textContent=i,r.date.textContent=$(t)}function C(t,e){const a=t.getHours(),o=t.getMinutes(),i=t.getSeconds(),n=a>=12?"PM":"AM",r=a%12||12,d=I();d.main.textContent=`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`,d.seconds.textContent=`:${String(i).padStart(2,"0")}`,d.ampm.textContent=n,d.date.textContent=$(t)}function j(t){const e=t.getHours(),a=t.getMinutes(),o=t.getSeconds(),i=e>=12?"PM":"AM",n=e%12||12,r=String(n).padStart(2," ")+String(a).padStart(2,"0")+String(o).padStart(2,"0");let d='
';if(d+=N(r[0],0),d+=N(r[1],1),d+=':',d+=N(r[2],2),d+=N(r[3],3),d+=':',d+=N(r[4],4),d+=N(r[5],5),d+=`${i}`,d+="
",d+=`
${$(t)}
`,B.innerHTML=d,T="flip",h){for(let y=0;y<6;y++)if(r[y]!==h[y]){const L=B.querySelector(`.flip-card[data-idx="${y}"]`);L&&L.classList.add("flipping")}}h=r}function N(t,e){const a=t===" "?"":t;return`
${a}
${a}
`}function R(t){const e=t.getHours(),a=t.getMinutes(),o=t.getSeconds(),i=e%12||12,n=e>=12?"PM":"AM",r=[Math.floor(i/10),i%10,Math.floor(a/10),a%10,Math.floor(o/10),o%10];let d='
';d+='
HHMMSS
';for(let y=3;y>=0;y--){d+='
';for(let L=0;L<6;L++){const U=r[L]>>y&1;d+=`
`}d+="
"}d+='
';for(let y=0;y<6;y++)d+=`${r[y]}`;d+="
",d+=`
${n}
`,d+="
",d+=`
${$(t)}
`,B.innerHTML=d,T="binary"}function u(t,e){const a=t.getHours(),o=t.getMinutes(),i=t.getSeconds(),n=120,r=n/2,d=n/2,y=i/60*360-90,L=(o+i/60)/60*360-90,U=(a%12+o/60)/12*360-90;let q="";for(let X=1;X<=12;X++){const Q=X/12*2*Math.PI-Math.PI/2,ne=47,oe=r+ne*Math.cos(Q),se=d+ne*Math.sin(Q),Y=e?z[X%12]:X;q+=`${Y}`}let F="";for(let X=0;X<60;X++){const Q=X/60*2*Math.PI-Math.PI/2,ne=56,oe=X%5===0?52:54,se=r+oe*Math.cos(Q),Y=d+oe*Math.sin(Q),ie=r+ne*Math.cos(Q),re=d+ne*Math.sin(Q),ae=X%5===0?1.5:.5;F+=``}const _=` +
`);const B="weather-location",A="weather-zip",I="weather-geo",z="weather-unit";!safeGet(B)&&safeGet(A)&&safeSet(B,safeGet(A));function P(){return safeGet(z)||"imperial"}function M(){return{icon:document.querySelector(".weather-icon"),temp:document.querySelector(".weather-temp"),condition:document.querySelector(".weather-condition"),location:document.querySelector(".weather-location"),wind:document.querySelector(".weather-wind")}}const D={0:"Clear sky",1:"Mainly clear",2:"Partly cloudy",3:"Overcast",45:"Fog",48:"Rime fog",51:"Light drizzle",53:"Drizzle",55:"Dense drizzle",56:"Freezing drizzle",57:"Dense freezing drizzle",61:"Light rain",63:"Moderate rain",65:"Heavy rain",66:"Light freezing rain",67:"Heavy freezing rain",71:"Light snow",73:"Moderate snow",75:"Heavy snow",77:"Snow grains",80:"Light showers",81:"Moderate showers",82:"Violent showers",85:"Light snow showers",86:"Heavy snow showers",95:"Thunderstorm",96:"Thunderstorm with hail",99:"Severe thunderstorm"},h={0:"\u2600\uFE0F",1:"\u{1F324}\uFE0F",2:"\u26C5",3:"\u2601\uFE0F",45:"\u{1F32B}\uFE0F",48:"\u{1F32B}\uFE0F",51:"\u{1F326}\uFE0F",53:"\u{1F326}\uFE0F",55:"\u{1F326}\uFE0F",56:"\u{1F328}\uFE0F",57:"\u{1F328}\uFE0F",61:"\u{1F326}\uFE0F",63:"\u{1F327}\uFE0F",65:"\u{1F327}\uFE0F",66:"\u{1F328}\uFE0F",67:"\u{1F328}\uFE0F",71:"\u{1F328}\uFE0F",73:"\u2744\uFE0F",75:"\u2744\uFE0F",77:"\u2744\uFE0F",80:"\u{1F326}\uFE0F",81:"\u{1F327}\uFE0F",82:"\u{1F327}\uFE0F",85:"\u{1F328}\uFE0F",86:"\u2744\uFE0F",95:"\u26C8\uFE0F",96:"\u26C8\uFE0F",99:"\u26C8\uFE0F"},T=["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"];function f(C){return T[Math.round(C/22.5)%16]}async function H(C){const j=safeGet(I);if(j)try{const x=JSON.parse(j);if(x.query===C)return x}catch{}const N=await fetch(`https://geocoding-api.open-meteo.com/v1/search?name=${encodeURIComponent(C)}&count=1&language=en&format=json`);if(!N.ok)throw new Error("Geocoding failed");const R=await N.json();if(!R.results||!R.results.length)throw new Error("Location not found");const u=R.results[0],v={query:C,lat:u.latitude,lon:u.longitude,city:u.name,state:u.admin1||"",country:u.country||"",countryCode:u.country_code||""};return safeSet(I,JSON.stringify(v)),v}function S(C){return C.countryCode==="US"&&C.state?`${C.city}, ${C.state}`:C.country?`${C.city}, ${C.country}`:C.city}async function $(C){try{const j=await H(C),N=P(),R=N==="metric"?"celsius":"fahrenheit",u=N==="metric"?"kmh":"mph",v=`https://api.open-meteo.com/v1/forecast?latitude=${j.lat}&longitude=${j.lon}¤t=temperature_2m,weather_code,wind_speed_10m,wind_direction_10m&temperature_unit=${R}&wind_speed_unit=${u}`,x=await fetch(v);if(!x.ok)throw new Error("Weather fetch failed");const b=(await x.json()).current,s=b.weather_code;return{temp:Math.round(b.temperature_2m),condition:D[s]||"Unknown",icon:h[s]||"\u{1F324}\uFE0F",locationStr:S(j),windSpeed:Math.round(b.wind_speed_10m),windDir:f(b.wind_direction_10m),unit:N}}catch(j){return console.warn("Weather fetch failed:",j),null}}async function w(){const C=M();if(!C.icon||!C.temp||!C.condition||!C.location||!C.wind){console.warn("Weather widget elements not found");return}const j=safeGet(B);if(!j){C.location.textContent="Set Location",C.temp.textContent="--\xB0",C.condition.textContent="Click \u2699\uFE0F to configure",C.wind.textContent="--",C.icon.innerHTML='\u{1F324}\uFE0F';return}try{const N=await $(j);if(N){const R=N.unit==="metric"?"\xB0C":"\xB0F",u=N.unit==="metric"?"km/h":"mph";C.location.textContent=N.locationStr,C.temp.textContent=`${N.temp}${R}`,C.condition.textContent=N.condition,C.wind.textContent=`Wind: ${N.windSpeed} ${u} ${N.windDir}`,C.icon.innerHTML=`${escapeHtml(N.icon)}`}}catch(N){k.logError("[Weather] Update Error",N,{function:"updateWeather"}),C.location.textContent="Weather Error",C.temp.textContent="Error",C.condition.textContent="Failed to load",C.wind.textContent="--"}}const E=document.getElementById("weather-modal"),O=document.getElementById("weather-location-input");document.getElementById("weather-settings")?.addEventListener("click",()=>{O.value=safeGet(B)||"";const C=P(),j=E.querySelector(`input[name="weather-unit-radio"][value="${C}"]`);j&&(j.checked=!0),E.classList.add("show"),O.focus()}),document.getElementById("weather-cancel")?.addEventListener("click",()=>{E.classList.remove("show")}),document.getElementById("weather-save")?.addEventListener("click",()=>{const C=O.value.trim();if(C){safeGet(B)!==C&&safeSet(I,""),safeSet(B,C);const N=E.querySelector('input[name="weather-unit-radio"]:checked'),R=N?N.value:"imperial",u=P();safeSet(z,R),u!==R&&safeSet(I,""),E.classList.remove("show"),w()}else showNotification("Please enter a location (e.g., Hamburg, London, 90210)","warning")}),wireModal(E),document.addEventListener("keydown",C=>{C.key==="Escape"&&E.classList.contains("show")&&E.classList.remove("show")}),w(),setInterval(w,DC.POLL.WEATHER)})(),(function(){const k=document.getElementById("clock-widget"),B=document.getElementById("clock-render");if(!k||!B)return;const A=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],I=["January","February","March","April","May","June","July","August","September","October","November","December"],z=["XII","I","II","III","IV","V","VI","VII","VIII","IX","X","XI"];let P=safeGet("clock-style")||"default",M=-1,D=!1,h="",T="",f=null,H=null;function S(t){if(D||safeGet("clock-chimes")!=="true")return;D=!0;const e=parseInt(safeGet("clock-chime-volume")||"50",10)/100;let a=0;function o(){if(a>=t){D=!1;return}const i=new Audio("/assets/sounds/church-bell.mp3");i.volume=e,i.play().catch(()=>{}),a++,a{D=!1},2500)}o()}function $(t){return A[t.getDay()]+", "+I[t.getMonth()]+" "+t.getDate()+", "+t.getFullYear()}function w(){T="",f=null}function E(){return T!=="digital"&&(B.innerHTML='
',f={main:B.querySelector(".clock-main"),seconds:B.querySelector(".clock-seconds"),ampm:B.querySelector(".clock-ampm"),date:B.querySelector(".clock-date")},T="digital"),f}function O(t){const e=t.getHours(),a=t.getMinutes(),o=t.getSeconds(),i=e>=12?"PM":"AM",n=e%12||12,r=E();r.main.textContent=`${n}:${String(a).padStart(2,"0")}`,r.seconds.textContent=`:${String(o).padStart(2,"0")}`,r.ampm.textContent=i,r.date.textContent=$(t)}function C(t,e){const a=t.getHours(),o=t.getMinutes(),i=t.getSeconds(),n=a>=12?"PM":"AM",r=a%12||12,d=E();d.main.textContent=`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`,d.seconds.textContent=`:${String(i).padStart(2,"0")}`,d.ampm.textContent=n,d.date.textContent=$(t)}function j(t){const e=t.getHours(),a=t.getMinutes(),o=t.getSeconds(),i=e>=12?"PM":"AM",n=e%12||12,r=String(n).padStart(2," ")+String(a).padStart(2,"0")+String(o).padStart(2,"0");let d='
';if(d+=N(r[0],0),d+=N(r[1],1),d+=':',d+=N(r[2],2),d+=N(r[3],3),d+=':',d+=N(r[4],4),d+=N(r[5],5),d+=`${i}`,d+="
",d+=`
${$(t)}
`,B.innerHTML=d,T="flip",h){for(let y=0;y<6;y++)if(r[y]!==h[y]){const L=B.querySelector(`.flip-card[data-idx="${y}"]`);L&&L.classList.add("flipping")}}h=r}function N(t,e){const a=t===" "?"":t;return`
${a}
${a}
`}function R(t){const e=t.getHours(),a=t.getMinutes(),o=t.getSeconds(),i=e%12||12,n=e>=12?"PM":"AM",r=[Math.floor(i/10),i%10,Math.floor(a/10),a%10,Math.floor(o/10),o%10];let d='
';d+='
HHMMSS
';for(let y=3;y>=0;y--){d+='
';for(let L=0;L<6;L++){const U=r[L]>>y&1;d+=`
`}d+="
"}d+='
';for(let y=0;y<6;y++)d+=`${r[y]}`;d+="
",d+=`
${n}
`,d+="
",d+=`
${$(t)}
`,B.innerHTML=d,T="binary"}function u(t,e){const a=t.getHours(),o=t.getMinutes(),i=t.getSeconds(),n=120,r=n/2,d=n/2,y=i/60*360-90,L=(o+i/60)/60*360-90,U=(a%12+o/60)/12*360-90;let q="";for(let X=1;X<=12;X++){const Q=X/12*2*Math.PI-Math.PI/2,ne=47,oe=r+ne*Math.cos(Q),se=d+ne*Math.sin(Q),Y=e?z[X%12]:X;q+=`${Y}`}let F="";for(let X=0;X<60;X++){const Q=X/60*2*Math.PI-Math.PI/2,ne=56,oe=X%5===0?52:54,se=r+oe*Math.cos(Q),Y=d+oe*Math.sin(Q),ie=r+ne*Math.cos(Q),re=d+ne*Math.sin(Q),ae=X%5===0?1.5:.5;F+=``}const _=` ${F} ${q} @@ -1914,7 +1914,7 @@ To endpoint: POST /api/v1/security/events/ingest or /events/batch`),v()}catch(m) - `,J=t.getHours()>=12?"PM":"AM";B.innerHTML=`
${_}
${t.getHours()%12||12}:${String(o).padStart(2,"0")} ${J}${$(t)}
`,T="analog"}function v(){const t=new Date,e=t.getHours()%12||12,a=t.getMinutes(),o=t.getSeconds(),i="clock-widget"+(P!=="default"?" "+P:"");switch(w.className!==i&&(w.className=i),P){case"lcd":C(t);break;case"lcd-blue":C(t);break;case"lcd-amber":C(t);break;case"lcd-retro":C(t);break;case"lcd-taxi":C(t);break;case"flip":j(t);break;case"binary":R(t);break;case"analog":u(t,!1);break;case"roman":u(t,!0);break;default:O(t)}a===0&&o===0&&e!==M&&(M=e,k(e)),a!==0&&(M=-1)}function x(){clearTimeout(H);const t=document.hidden?6e4:1e3,e=t-Date.now()%t+25;H=setTimeout(()=>{v(),x()},e)}document.addEventListener("visibilitychange",()=>{h="",E(),v(),x()}),v(),x();const g=[{id:"default",label:"Default",icon:"\u{1F550}"},{id:"lcd",label:"LCD Green",icon:"\u{1F49A}"},{id:"lcd-blue",label:"LCD Blue",icon:"\u{1F499}"},{id:"lcd-amber",label:"LCD Amber",icon:"\u{1F7E0}"},{id:"lcd-retro",label:"LCD Retro",icon:"\u{1F7E9}"},{id:"lcd-taxi",label:"LCD Taxi",icon:"\u{1F7E1}"},{id:"flip",label:"Flip Clock",icon:"\u{1F4DF}"},{id:"binary",label:"Binary",icon:"\u{1F4BB}"},{id:"analog",label:"Analog",icon:"\u23F0"},{id:"roman",label:"Roman",icon:"\u{1F3DB}\uFE0F"}];let b='
';g.forEach(t=>{b+=`
- `);const s=document.getElementById("clock-settings-modal"),p=document.getElementById("clock-chimes-toggle"),l=document.getElementById("clock-chime-volume"),m=document.getElementById("clock-volume-section");function c(){const t=safeGet("clock-style")||"default",e=s.querySelector(`input[value="${t}"]`);e&&(e.checked=!0),p.checked=safeGet("clock-chimes")==="true",l.value=safeGet("clock-chime-volume")||"50",m.style.opacity=p.checked?"1":"0.4"}p?.addEventListener("change",()=>{m.style.opacity=p.checked?"1":"0.4"}),document.getElementById("clock-settings")?.addEventListener("click",()=>{c(),s.classList.add("show")}),document.getElementById("clock-chime-test")?.addEventListener("click",()=>{const t=parseInt(l.value,10)/100,e=new Audio("/assets/sounds/church-bell.mp3");e.volume=t,e.play().catch(()=>{})}),document.getElementById("clock-settings-save")?.addEventListener("click",()=>{const t=s.querySelector('input[name="clock-style-radio"]:checked'),e=t?t.value:"default";safeSet("clock-style",e),safeSet("clock-chimes",String(p.checked)),safeSet("clock-chime-volume",l.value),P=e,h="",E(),v(),x(),s.classList.remove("show"),showNotification("Clock settings saved","success",2e3)}),document.getElementById("clock-settings-cancel")?.addEventListener("click",()=>{s.classList.remove("show")}),wireModal(s),s?.querySelectorAll('input[name="clock-style-radio"]').forEach(t=>{t.addEventListener("change",()=>{P=t.value,h="",E(),v()})})})(),(function(){async function w(){try{const D=await(await fetch("/api/v1/health-checks/status")).json();if(!D.success||!D.status)return;for(const[h,T]of Object.entries(D.status)){const f=document.getElementById("uptime-"+h),H=document.getElementById("uptime-bar-"+h);if(!f)continue;const k=T.uptime?.["24h"];if(k!=null){const $=k.toFixed(1);f.textContent=`${$}% uptime`,f.className="uptime-chip",k>=99.9?f.classList.add("excellent"):k>=99?f.classList.add("good"):k>=95?f.classList.add("degraded"):f.classList.add("poor"),H&&(H.style.width=$+"%")}}}catch{console.warn("[Card Badges] Health check API unavailable")}}let B;try{B=new Set(JSON.parse(safeSessionGet("dismissed-updates")||"[]"))}catch{B=new Set}let A=[];async function S(M){try{const h=await(await fetch("/api/v1/updates/available")).json();if(!h.success)return;document.querySelectorAll(".update-available-badge").forEach(f=>f.classList.remove("visible"));const T=h.updates||[];if(A=T,M&&T.length>0){const f=window._lastKnownUpdateCount||0;f>0&&T.length>f&&showNotification(`${T.length} container update(s) available \u2014 click Update Management to review.`,"info"),window._lastKnownUpdateCount=T.length}if(!T.length)return;for(const f of T){const H=window.APPS||[];for(const k of H)if(k.containerId===f.containerId||k.id===f.containerName||k.name===f.containerName){if(B.has(k.id))break;const $=document.getElementById("update-badge-"+k.id),E=document.getElementById("update-btn-"+k.id);$&&($.classList.add("visible"),$.title="Update available \u2014 click to open Update Management.",$.style.cursor="pointer",$.onclick=I=>{I.stopPropagation(),window.openUpdateModal&&window.openUpdateModal(k.id)}),E&&(E.style.background="#f97316",E.style.borderColor="#f97316",E.style.boxShadow="0 0 6px #f9731688",E.title="Update available \u2014 click to open Update Management.");break}}}catch{console.warn("[Card Badges] Updates API unavailable")}}function z(){setTimeout(()=>{w(),S()},5e3),setInterval(()=>{w(),S(!0)},6e4)}const P=window.refreshAll;P&&(window.refreshAll=async function(){try{await P(),setTimeout(w,1e3)}catch(M){console.warn("[Card Badges] Error in refreshAll hook:",M.message)}}),z()})(),(function(){var w=null,B=null,A={},S={dark:"Dark",light:"Light",blue:"Blue",black:"Black",nord:"Nord",dracula:"Dracula","solarized-dark":"Solarized Dark","solarized-light":"Solarized Light",taxi:"Taxi",ocean:"Ocean"},z=[["bg","Background","base"],["card-base","Card","base"],["fg","Text","base"],["muted","Muted Text","base"],["border","Border","base"],["accent","Accent","accent"],["accent-strong","Accent Strong","accent"],["ok-bg","OK Background","status"],["ok-fg","OK Text","status"],["bad-bg","Error Bg","status"],["bad-fg","Error Text","status"],["dot-ok","Dot OK","status"],["dot-bad","Dot Error","status"],["uptime","Uptime Bar","status"],["hover","Hover","advanced"],["card-hover","Card Hover","advanced"],["base","Tags/Badges","advanced"],["fg-muted","Dim Text","advanced"],["success","Success","advanced"],["error","Error","advanced"],["warning","Warning","advanced"]],P=document.getElementById("theme");if(!P)return;var M=document.getElementById("theme-label");function D(o){if(S[o])return S[o];var i=safeGetJSON(window.USER_THEMES_KEY,{});return i[o]&&i[o].name||o}function h(){M&&(M.textContent=D(window.getActiveTheme()))}P.addEventListener("click",function(){var o=window.THEMES.slice(),i=window.getActiveTheme(),n=o.indexOf(i),r=o[(n+1)%o.length];window.applyTheme(r),h()}),h();function T(){var o={base:"Base Colors",accent:"Accent",status:"Status",advanced:"Advanced (auto-derived)"},i={};z.forEach(function(r){i[r[2]]||(i[r[2]]=[]),i[r[2]].push(r)});var n="";return Object.keys(o).forEach(function(r){r==="advanced"?(n+='
Show advanced colors ▼
',n+='`);const k=document.getElementById("license-modal"),B=document.getElementById("license-code-input"),A=document.getElementById("license-activate"),I=document.getElementById("license-deactivate"),z=document.getElementById("license-error"),P=document.getElementById("license-success"),M=document.getElementById("license-badge-icon"),D=document.getElementById("license-badge-text"),h=document.getElementById("license-badge"),T=document.getElementById("license-details"),f=document.getElementById("license-feature-list"),H=document.getElementById("license-activate-section");let S=null;function $(){z.style.display="none",P.style.display="none"}function w(x){$(),z.textContent=x,z.style.display="block"}function E(x){$(),P.textContent=x,P.style.display="block"}function O(x){if(S=x,x.active){h.style.background="rgba(46,204,113,0.15)",h.style.color="var(--ok-fg)",M.textContent="\u2605",D.textContent="Premium Active";const s=x.lifetime?"
License: LIFETIME
":`
Expires: ${new Date(x.expiresAt).toLocaleDateString()} (${x.daysRemaining} days remaining)
`;T.innerHTML=`
Code: ${x.code||"***"}
${s} - `,H.style.display="none",A.style.display="none",S.style.display=""}else h.style.background="rgba(149,165,166,0.15)",h.style.color="var(--muted)",M.textContent="\u2606",D.textContent=x.expired?"License Expired":"Free Tier",T.innerHTML=x.expired?"
Your license has expired. Enter a new code to renew.
":"
Enter a license code to unlock premium features.
",H.style.display="",A.style.display="",S.style.display="none";const g=x.premiumFeatures||{},b=new Set(x.features||[]);f.innerHTML=Object.entries(g).map(([s,p])=>`
+ `,H.style.display="none",A.style.display="none",I.style.display=""}else h.style.background="rgba(149,165,166,0.15)",h.style.color="var(--muted)",M.textContent="\u2606",D.textContent=x.expired?"License Expired":"Free Tier",T.innerHTML=x.expired?"
Your license has expired. Enter a new code to renew.
":"
Enter a license code to unlock premium features.
",H.style.display="",A.style.display="",I.style.display="none";const g=x.premiumFeatures||{},b=new Set(x.features||[]);f.innerHTML=Object.entries(g).map(([s,p])=>`
${b.has(s)?"\u2705":"\u{1F512}"}
${p.name}
${p.description}
-
`).join("")}async function C(){try{const g=await(await fetch("/api/v1/license/status")).json();g.success&&(O(g.license),R(g.license))}catch(x){console.warn("Failed to load license status:",x.message)}}async function j(){const x=B.value.trim();if(!x){E("Please enter a license code.");return}$(),A.disabled=!0,A.textContent="Activating...";try{const b=await(await secureFetch("/api/v1/license/activate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:x})})).json();b.success?(I(b.message),B.value="",O(b.license),showNotification("License activated! Premium features unlocked.","success",5e3),R(b.license)):E(b.error||"Activation failed")}catch(g){E("Network error: "+g.message)}finally{A.disabled=!1,A.textContent="Activate"}}async function N(){if(confirm("Deactivate your license? You can reuse the code on another machine.")){S.disabled=!0,S.textContent="Deactivating...";try{const g=await(await secureFetch("/api/v1/license/deactivate",{method:"POST"})).json();g.success?(I(g.message),await C(),showNotification("License deactivated.","info",3e3),R({active:!1})):E(g.error||"Deactivation failed")}catch(x){E("Network error: "+x.message)}finally{S.disabled=!1,S.textContent="Deactivate"}}}function R(x){const g=document.getElementById("license-status-topbar"),b=document.getElementById("license-topbar-icon"),s=document.getElementById("license-topbar-text"),p=document.getElementById("license-topbar-time");if(g)if(g.className="license-status-topbar "+(x.active?"premium":"free"),x.active)if(b.textContent="\u2605",s.textContent="PREMIUM",x.lifetime)p.textContent="\xB7 LIFETIME";else{const l=x.daysRemaining;p.textContent=l!=null?"\xB7 "+l+"d remaining":""}else b.textContent="\u2606",s.textContent=x.expired?"EXPIRED":"FREE TIER",p.textContent=""}function u(){$(),C(),w.classList.add("show")}B.addEventListener("input",function(){let x=this.value.toUpperCase().replace(/[^A-Z0-9-]/g,"");if(x.length>this._prevLength&&(x=x.replace(/-/g,""),x.length>2&&!x.startsWith("DC")&&(x="DC"+x),x.startsWith("DC")&&x.length>2)){const g=["DC"],b=x.substring(2);for(let s=0;s{x.key==="Enter"&&j()}),wireModal(w,document.getElementById("license-cancel"));const v=document.getElementById("license-status-topbar");v&&v.addEventListener("click",()=>window.openLicenseModal&&window.openLicenseModal()),window.openLicenseModal=u,window.checkPremiumFeature=async function(x){try{return(await(await fetch(`/api/v1/license/feature/${x}`)).json()).available}catch{return!1}},C().then(x=>{k&&R(k)})})(),(function(){"use strict";if(window.__dc_058_share_modal_loaded)return;window.__dc_058_share_modal_loaded=!0;const w=[{ms:3600*1e3,label:"1 hour"},{ms:1440*60*1e3,label:"24 hours"},{ms:10080*60*1e3,label:"7 days"}];injectModal("share-modal",` +
`).join("")}async function C(){try{const g=await(await fetch("/api/v1/license/status")).json();g.success&&(O(g.license),R(g.license))}catch(x){console.warn("Failed to load license status:",x.message)}}async function j(){const x=B.value.trim();if(!x){w("Please enter a license code.");return}$(),A.disabled=!0,A.textContent="Activating...";try{const b=await(await secureFetch("/api/v1/license/activate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:x})})).json();b.success?(E(b.message),B.value="",O(b.license),showNotification("License activated! Premium features unlocked.","success",5e3),R(b.license)):w(b.error||"Activation failed")}catch(g){w("Network error: "+g.message)}finally{A.disabled=!1,A.textContent="Activate"}}async function N(){if(confirm("Deactivate your license? You can reuse the code on another machine.")){I.disabled=!0,I.textContent="Deactivating...";try{const g=await(await secureFetch("/api/v1/license/deactivate",{method:"POST"})).json();g.success?(E(g.message),await C(),showNotification("License deactivated.","info",3e3),R({active:!1})):w(g.error||"Deactivation failed")}catch(x){w("Network error: "+x.message)}finally{I.disabled=!1,I.textContent="Deactivate"}}}function R(x){const g=document.getElementById("license-status-topbar"),b=document.getElementById("license-topbar-icon"),s=document.getElementById("license-topbar-text"),p=document.getElementById("license-topbar-time");if(g)if(g.className="license-status-topbar "+(x.active?"premium":"free"),x.active)if(b.textContent="\u2605",s.textContent="PREMIUM",x.lifetime)p.textContent="\xB7 LIFETIME";else{const l=x.daysRemaining;p.textContent=l!=null?"\xB7 "+l+"d remaining":""}else b.textContent="\u2606",s.textContent=x.expired?"EXPIRED":"FREE TIER",p.textContent=""}function u(){$(),C(),k.classList.add("show")}B.addEventListener("input",function(){let x=this.value.toUpperCase().replace(/[^A-Z0-9-]/g,"");if(x.length>this._prevLength&&(x=x.replace(/-/g,""),x.length>2&&!x.startsWith("DC")&&(x="DC"+x),x.startsWith("DC")&&x.length>2)){const g=["DC"],b=x.substring(2);for(let s=0;s{x.key==="Enter"&&j()}),wireModal(k,document.getElementById("license-cancel"));const v=document.getElementById("license-status-topbar");v&&v.addEventListener("click",()=>window.openLicenseModal&&window.openLicenseModal()),window.openLicenseModal=u,window.checkPremiumFeature=async function(x){try{return(await(await fetch(`/api/v1/license/feature/${x}`)).json()).available}catch{return!1}},C().then(x=>{S&&R(S)})})(),(function(){"use strict";if(window.__dc_058_share_modal_loaded)return;window.__dc_058_share_modal_loaded=!0;const k=[{ms:3600*1e3,label:"1 hour"},{ms:1440*60*1e3,label:"24 hours"},{ms:10080*60*1e3,label:"7 days"}];injectModal("share-modal",` - `);const B=document.getElementById("share-modal"),A=document.getElementById("share-modal-service-name"),S=document.getElementById("share-issued"),z=document.getElementById("share-issued-url"),P=document.getElementById("share-issued-copy"),M=document.getElementById("share-issued-meta"),D=document.getElementById("share-error"),h=document.getElementById("share-success"),T=document.getElementById("share-outstanding-list"),f=document.getElementById("share-cancel"),H=document.getElementById("share-public-create"),k=document.getElementById("share-ts-create"),$=document.getElementById("share-ts-email"),E=document.getElementById("share-public-ttl");let I=null,O="public";function C(){D.style.display="none",h.style.display="none",S.style.display="none"}function j(t){h.style.display="none",S.style.display="none",D.textContent=t,D.style.display="block"}function N(t){D.style.display="none",h.textContent=t,h.style.display="block"}function R(){return window.location.origin}function u(t){return t.startsWith("http")?t:R()+t}function v(t){if(!t)return"";const e=new Date(t);return Number.isNaN(e.getTime())?"":e.toLocaleString()}function x(t){if(t<=0)return"expired";const e=Math.floor(t/36e5);if(e>=24)return`${Math.floor(e/24)}d ${e%24}h left`;const a=Math.floor(t%36e5/6e4);return`${e}h ${a}m left`}function g(t){O=t,C(),B.querySelectorAll(".share-tab").forEach(e=>{const a=e.dataset.tab===t;e.classList.toggle("active",a),e.style.borderBottomColor=a?"var(--accent)":"transparent",e.style.color=a?"var(--fg)":"var(--muted)",e.style.fontWeight=a?"600":"400"}),B.querySelectorAll(".share-tab-panel").forEach(e=>{e.style.display=e.dataset.panel===t?"":"none"})}async function b(){T.innerHTML='Loading\u2026';try{const t=await fetch("/api/v1/share",{credentials:"same-origin"});if(!t.ok){T.innerHTML='No shares listed.';return}const e=await t.json(),o=(e&&e.data||[]).filter(i=>i.serviceId===I.id);if(o.length===0){T.innerHTML='No outstanding shares for this service.';return}T.innerHTML=o.map(i=>{const n=i.expiresAt?x(new Date(i.expiresAt).getTime()-Date.now()):"";return` + `);const B=document.getElementById("share-modal"),A=document.getElementById("share-modal-service-name"),I=document.getElementById("share-issued"),z=document.getElementById("share-issued-url"),P=document.getElementById("share-issued-copy"),M=document.getElementById("share-issued-meta"),D=document.getElementById("share-error"),h=document.getElementById("share-success"),T=document.getElementById("share-outstanding-list"),f=document.getElementById("share-cancel"),H=document.getElementById("share-public-create"),S=document.getElementById("share-ts-create"),$=document.getElementById("share-ts-email"),w=document.getElementById("share-public-ttl");let E=null,O="public";function C(){D.style.display="none",h.style.display="none",I.style.display="none"}function j(t){h.style.display="none",I.style.display="none",D.textContent=t,D.style.display="block"}function N(t){D.style.display="none",h.textContent=t,h.style.display="block"}function R(){return window.location.origin}function u(t){return t.startsWith("http")?t:R()+t}function v(t){if(!t)return"";const e=new Date(t);return Number.isNaN(e.getTime())?"":e.toLocaleString()}function x(t){if(t<=0)return"expired";const e=Math.floor(t/36e5);if(e>=24)return`${Math.floor(e/24)}d ${e%24}h left`;const a=Math.floor(t%36e5/6e4);return`${e}h ${a}m left`}function g(t){O=t,C(),B.querySelectorAll(".share-tab").forEach(e=>{const a=e.dataset.tab===t;e.classList.toggle("active",a),e.style.borderBottomColor=a?"var(--accent)":"transparent",e.style.color=a?"var(--fg)":"var(--muted)",e.style.fontWeight=a?"600":"400"}),B.querySelectorAll(".share-tab-panel").forEach(e=>{e.style.display=e.dataset.panel===t?"":"none"})}async function b(){T.innerHTML='Loading\u2026';try{const t=await fetch("/api/v1/share",{credentials:"same-origin"});if(!t.ok){T.innerHTML='No shares listed.';return}const e=await t.json(),o=(e&&e.data||[]).filter(i=>i.serviceId===E.id);if(o.length===0){T.innerHTML='No outstanding shares for this service.';return}T.innerHTML=o.map(i=>{const n=i.expiresAt?x(new Date(i.expiresAt).getTime()-Date.now()):"";return` - `}).join(""),T.querySelectorAll(".share-revoke").forEach(i=>{i.addEventListener("click",()=>s(i.dataset.shareId))})}catch{T.innerHTML='Could not load outstanding shares.'}}async function s(t){try{const e=await fetch(`/api/v1/share/${encodeURIComponent(t)}`,{method:"DELETE",credentials:"same-origin"});if(!e.ok){const a=await e.json().catch(()=>({}));j(a&&a.error||`Revoke failed (HTTP ${e.status}).`);return}N("Share revoked."),b()}catch{j("Network error while revoking.")}}async function p(){if(!I)return;C(),H.disabled=!0;const t=H.textContent;H.textContent="Creating\u2026";try{const e=parseInt(E.value,10),a=await fetch("/api/v1/share",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceId:I.id,ttlMs:e})}),o=await a.json().catch(()=>({}));if(!a.ok||!o.success){m(a.status,o);return}const i=o.data.urlPath;z.value=u(i),M.textContent=`Public link \xB7 expires ${v(o.data.expiresAt)}`,S.style.display="block",N("Share link created."),b()}catch{j("Network error while creating share.")}finally{H.disabled=!1,H.textContent=t}}async function l(){if(!I)return;const t=($.value||"").trim();if(!t||!t.includes("@")){j("A valid recipient email is required.");return}C(),k.disabled=!0;const e=k.textContent;k.textContent="Creating\u2026";try{const a=await fetch("/api/v1/share/tailscale",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceId:I.id,email:t})}),o=await a.json().catch(()=>({}));if(!a.ok||!o.success){m(a.status,o);return}const i=o.data&&o.data.urlPath;i?(z.value=u(i),M.textContent=`Tailscale invite \xB7 emailed to ${t} (or use this URL manually if delivery failed).`):(z.value="",M.textContent=`Tailscale invite sent to ${t}.`),S.style.display="block",N("Tailscale invite created."),$.value="",b()}catch{j("Network error while creating Tailscale invite.")}finally{k.disabled=!1,k.textContent=e}}function m(t,e){const a=e&&e.error||"";if(t===402){j("Share is a Pro feature. Activate a license to unlock.");return}if(t===400&&/tailscale/i.test(a)){j("Tailscale is not configured on this host. Set up Tailscale in the dashboard first.");return}if(t===403){j("You do not have permission to share services.");return}if(t===404){j("Service not found. It may have been deleted.");return}j(a||`Request failed (HTTP ${t}).`)}function c(t){!t||!t.id||(I={id:t.id,name:t.name||t.id},A.textContent=I.name,C(),g("public"),$.value="",E.value=String(w[1].ms),B.classList.add("show"),b())}B.querySelectorAll(".share-tab").forEach(t=>{t.addEventListener("click",()=>g(t.dataset.tab))}),H.addEventListener("click",p),k.addEventListener("click",l),f.addEventListener("click",()=>B.classList.remove("show")),wireModal(B,f),P.addEventListener("click",async()=>{const t=z.value;if(t)try{navigator.clipboard&&navigator.clipboard.writeText?await navigator.clipboard.writeText(t):(z.select(),document.execCommand("copy"));const e=P.textContent;P.textContent="Copied!",setTimeout(()=>{P.textContent=e},1200)}catch{j("Could not copy to clipboard. Select the URL manually.")}}),window.openShareModal=c})(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gTG9nbyBDdXN0b21pemF0aW9uIFN5c3RlbVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnbG9nby1tb2RhbCcsIGA8ZGl2IGlkPVwibG9nby1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDAwcHg7IG1heC13aWR0aDogNTIwcHg7XCI+XG4gICAgICA8aDM+RGFzaGJvYXJkIFNldHRpbmdzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNnB4O1wiPlxuICAgICAgICBDdXN0b21pemUgeW91ciBkYXNoYm9hcmQncyBhcHBlYXJhbmNlIGFuZCBzeXN0ZW0gcHJlZmVyZW5jZXMuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiZGFzaGJvYXJkLXRpdGxlXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5EYXNoYm9hcmQgVGl0bGU6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkYXNoYm9hcmQtdGl0bGVcIiBwbGFjZWhvbGRlcj1cIkRhc2hDYWRkeVwiIG1heGxlbmd0aD1cIjUwXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDFyZW07XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJ0aW55LWhpbnRcIj5TaG93biBpbiBicm93c2VyIHRhYiBhbmQgaGVhZGVyIChtYXggNTAgY2hhcmFjdGVycyk8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGhyIGNsYXNzPVwiaHItZGl2aWRlclwiIC8+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5Mb2dvOjwvbGFiZWw+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAycHg7XCI+U2VwYXJhdGUgbG9nb3MgZm9yIGRhcmsgYW5kIGxpZ2h0IHRoZW1lcywgb3IgdXNlIHRoZSBzYW1lIGZvciBib3RoLjwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogIzFhMWEyZTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMSk7XCI+XG4gICAgICAgICAgPGltZyBpZD1cImxvZ28tcHJldmlldy1kYXJrXCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1kYXJrLnBuZ1wiIGFsdD1cIkRhcmsgdGhlbWUgbG9nb1wiIHN0eWxlPVwibWF4LWhlaWdodDogNjBweDsgbWF4LXdpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiAjOWFhNmJmOyBtYXJnaW4tdG9wOiA2cHg7XCI+RGFyayB0aGVtZXM8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogI2YwZjBmMDsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwuMSk7XCI+XG4gICAgICAgICAgPGltZyBpZD1cImxvZ28tcHJldmlldy1saWdodFwiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tbGlnaHQucG5nXCIgYWx0PVwiTGlnaHQgdGhlbWUgbG9nb1wiIHN0eWxlPVwibWF4LWhlaWdodDogNjBweDsgbWF4LXdpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiAjNWY2YjdhOyBtYXJnaW4tdG9wOiA2cHg7XCI+TGlnaHQgdGhlbWVzPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgaWQ9XCJsb2dvLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxMnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+VXNpbmcgZGVmYXVsdCBsb2dvczwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBmb250LXNpemU6IDAuODJyZW07IGN1cnNvcjogcG9pbnRlcjsgdXNlci1zZWxlY3Q6IG5vbmU7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwibG9nby1zYW1lLWJvdGhcIiAvPiBVc2Ugc2FtZSBsb2dvIGZvciBib3RoXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxvZ28tZHVhbC11cGxvYWRzXCIgY2xhc3M9XCJtYi0xNlwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwibG9nby11cGxvYWQtZGFya1wiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDZweDsgZm9udC1zaXplOiAwLjhyZW07XCI+RGFyayB0aGVtZSBsb2dvOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC1kYXJrXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIGNsYXNzPVwiaW5wdXQtY2FyZC1hbHRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImxvZ28tdXBsb2FkLWxpZ2h0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5MaWdodCB0aGVtZSBsb2dvOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC1saWdodFwiIGFjY2VwdD1cImltYWdlLypcIiBjbGFzcz1cImlucHV0LWNhcmQtYWx0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxvZ28tc2luZ2xlLXVwbG9hZFwiIGNsYXNzPVwibWItMTZcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJsb2dvLXVwbG9hZC1zaW5nbGVcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA2cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlVwbG9hZCBsb2dvOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwibG9nby11cGxvYWQtc2luZ2xlXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIGNsYXNzPVwiaW5wdXQtY2FyZC1hbHRcIiAvPlxuICAgICAgICA8cCBjbGFzcz1cInRpbnktaGludFwiPlRoaXMgbG9nbyB3aWxsIGJlIHVzZWQgb24gYWxsIHRoZW1lczwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItMTZcIj5cbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDhweDtcIj5Mb2dvIFBvc2l0aW9uOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJsb2dvLXBvc2l0aW9uLWJ0bnNcIiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtcG9zPVwibGVmdFwiIGNsYXNzPVwibG9nby1wb3MtYnRuIGJ0bi1vcHRpb25cIj5MZWZ0PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1wb3M9XCJjZW50ZXJcIiBjbGFzcz1cImxvZ28tcG9zLWJ0biBidG4tb3B0aW9uXCI+Q2VudGVyPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1wb3M9XCJyaWdodFwiIGNsYXNzPVwibG9nby1wb3MtYnRuIGJ0bi1vcHRpb25cIj5SaWdodDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8aHIgY2xhc3M9XCJoci1kaXZpZGVyXCIgLz5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPkZhdmljb24gKEJyb3dzZXIgVGFiIEljb24pOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJmYXZpY29uLXByZXZpZXctY29udGFpbmVyXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDhweDsgcGFkZGluZzogMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTtcIj5cbiAgICAgICAgICA8aW1nIGlkPVwiZmF2aWNvbi1wcmV2aWV3XCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktZmF2aWNvbi5pY29cIiBhbHQ9XCJDdXJyZW50IGZhdmljb25cIiBzdHlsZT1cIndpZHRoOiAzMnB4OyBoZWlnaHQ6IDMycHg7IGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkO1wiIG9uZXJyb3I9XCJ0aGlzLnNyYz0nZGF0YTppbWFnZS9zdmcreG1sLDxzdmcgeG1sbnM9JTIyaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjIgdmlld0JveD0lMjIwIDAgMzIgMzIlMjI+PHJlY3QgZmlsbD0lMjIlMjM2NjclMjIgd2lkdGg9JTIyMzIlMjIgaGVpZ2h0PSUyMjMyJTIyIHJ4PSUyMjQlMjIvPjwvc3ZnPidcIiAvPlxuICAgICAgICAgIDxzcGFuIGlkPVwiZmF2aWNvbi1zdGF0dXNcIiBjbGFzcz1cInRleHQtdGlueS1tdXRlZFwiPlVzaW5nIERhc2hDYWRkeSBmYXZpY29uPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJmYXZpY29uLXVwbG9hZFwiIGFjY2VwdD1cImltYWdlL3BuZyxpbWFnZS9zdmcreG1sXCIgY2xhc3M9XCJpbnB1dC1jYXJkLWFsdFwiIC8+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCI+VXBsb2FkIFBORyBvciBTVkcgLSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBJQ088L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGhyIGNsYXNzPVwiaHItZGl2aWRlclwiIC8+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwic2V0dGluZ3MtdGltZXpvbmVcIiBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPlRpbWV6b25lOjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJzZXR0aW5ncy10aW1lem9uZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAxcmVtO1wiPlxuICAgICAgICAgIDwhLS0gUG9wdWxhdGVkIGJ5IEpTIHdpdGggSUFOQSB0aW1lem9uZXMgLS0+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8cCBjbGFzcz1cInRpbnktaGludFwiPlVzZWQgYnkgYWxsIGRlcGxveWVkIGNvbnRhaW5lcnMuIENoYW5nZXMgYXBwbHkgdG8gbmV3IGRlcGxveW1lbnRzLjwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsb2dvLXJlc2V0XCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2VmNDQ0NCAyMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWNvbG9yOiAjZWY0NDQ0OyBjb2xvcjogI2VmNDQ0NDtcIj5SZXNldCB0byBEZWZhdWx0PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsb2dvLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwibG9nby1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IGxvZ29Nb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLW1vZGFsJyk7XG4gIGNvbnN0IHByZXZpZXdEYXJrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tcHJldmlldy1kYXJrJyk7XG4gIGNvbnN0IHByZXZpZXdMaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXByZXZpZXctbGlnaHQnKTtcbiAgY29uc3QgbG9nb1N0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXN0YXR1cycpO1xuICBjb25zdCBzYW1lQm90aENoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tc2FtZS1ib3RoJyk7XG4gIGNvbnN0IGR1YWxVcGxvYWRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tZHVhbC11cGxvYWRzJyk7XG4gIGNvbnN0IHNpbmdsZVVwbG9hZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXNpbmdsZS11cGxvYWQnKTtcbiAgY29uc3QgdXBsb2FkRGFyayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXVwbG9hZC1kYXJrJyk7XG4gIGNvbnN0IHVwbG9hZExpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tdXBsb2FkLWxpZ2h0Jyk7XG4gIGNvbnN0IHVwbG9hZFNpbmdsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXVwbG9hZC1zaW5nbGUnKTtcbiAgY29uc3QgYnJhbmRMb2dvRGFyayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNicmFuZCAuYnJhbmQtbG9nby1kYXJrJyk7XG4gIGNvbnN0IGJyYW5kTG9nb0xpZ2h0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JyYW5kIC5icmFuZC1sb2dvLWxpZ2h0Jyk7XG4gIGNvbnN0IHRvcFJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3Atcm93Jyk7XG4gIGNvbnN0IGRhc2hib2FyZFRpdGxlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGJvYXJkLXRpdGxlJyk7XG4gIGNvbnN0IERFRkFVTFRfVElUTEUgPSBEQy5OQU1FO1xuXG4gIGxldCBwZW5kaW5nRGFya0RhdGEgPSBudWxsO1xuICBsZXQgcGVuZGluZ0xpZ2h0RGF0YSA9IG51bGw7XG4gIGxldCBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gIGxldCBjdXJyZW50UG9zaXRpb24gPSAnbGVmdCc7XG4gIGxldCBjdXJyZW50VGl0bGUgPSBERUZBVUxUX1RJVExFO1xuXG4gIC8vIFRvZ2dsZSBiZXR3ZWVuIGR1YWwgYW5kIHNpbmdsZSB1cGxvYWQgbW9kZVxuICBzYW1lQm90aENoZWNrYm94Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKHNhbWVCb3RoQ2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgZHVhbFVwbG9hZHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHNpbmdsZVVwbG9hZC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAvLyBDbGVhciBpbmRpdmlkdWFsIHBlbmRpbmcgZGF0YVxuICAgICAgcGVuZGluZ0RhcmtEYXRhID0gbnVsbDtcbiAgICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBkdWFsVXBsb2Fkcy5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgc2luZ2xlVXBsb2FkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gICAgfVxuICB9KTtcblxuICAvLyBSZWFkIGZpbGUgYXMgZGF0YSBVUkwgaGVscGVyXG4gIGZ1bmN0aW9uIHJlYWRGaWxlQXNEYXRhVVJMKGZpbGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFmaWxlIHx8ICFmaWxlLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBzZWxlY3QgYW4gaW1hZ2UgZmlsZScsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiBjYWxsYmFjayhlLnRhcmdldC5yZXN1bHQpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9XG5cbiAgLy8gVXBsb2FkIGhhbmRsZXJzXG4gIHVwbG9hZERhcms/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgcmVhZEZpbGVBc0RhdGFVUkwoZS50YXJnZXQuZmlsZXNbMF0sIChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nRGFya0RhdGEgPSBkYXRhO1xuICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YTtcbiAgICAgIGxvZ29TdGF0dXMudGV4dENvbnRlbnQgPSAnTmV3IGRhcmsgbG9nbyByZWFkeSB0byBzYXZlJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgdXBsb2FkTGlnaHQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgcmVhZEZpbGVBc0RhdGFVUkwoZS50YXJnZXQuZmlsZXNbMF0sIChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nTGlnaHREYXRhID0gZGF0YTtcbiAgICAgIHByZXZpZXdMaWdodC5zcmMgPSBkYXRhO1xuICAgICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgbGlnaHQgbG9nbyByZWFkeSB0byBzYXZlJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgdXBsb2FkU2luZ2xlPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIHJlYWRGaWxlQXNEYXRhVVJMKGUudGFyZ2V0LmZpbGVzWzBdLCAoZGF0YSkgPT4ge1xuICAgICAgcGVuZGluZ1NpbmdsZURhdGEgPSBkYXRhO1xuICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YTtcbiAgICAgIHByZXZpZXdMaWdodC5zcmMgPSBkYXRhO1xuICAgICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgbG9nbyByZWFkeSB0byBzYXZlIChib3RoIHRoZW1lcyknO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBBcHBseSBsb2dvIHBvc2l0aW9uXG4gIGZ1bmN0aW9uIGFwcGx5TG9nb1Bvc2l0aW9uKHBvcykge1xuICAgIHRvcFJvdy5zZXRBdHRyaWJ1dGUoJ2RhdGEtbG9nby1wb3MnLCBwb3MpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sb2dvLXBvcy1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9IGJ0bi5kYXRhc2V0LnBvcyA9PT0gcG9zID8gJ3ZhcigtLWFjY2VudCknIDogJ3ZhcigtLWNhcmQtYmcpJztcbiAgICAgIGJ0bi5zdHlsZS5jb2xvciA9IGJ0bi5kYXRhc2V0LnBvcyA9PT0gcG9zID8gJ3doaXRlJyA6ICd2YXIoLS1mZyknO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQXBwbHkgZGFzaGJvYXJkIHRpdGxlXG4gIGZ1bmN0aW9uIGFwcGx5RGFzaGJvYXJkVGl0bGUodGl0bGUpIHtcbiAgICBjdXJyZW50VGl0bGUgPSB0aXRsZSB8fCBERUZBVUxUX1RJVExFO1xuICAgIGRvY3VtZW50LnRpdGxlID0gY3VycmVudFRpdGxlO1xuICAgIGNvbnN0IGhlYWRlclRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmRhc2hib2FyZC10aXRsZScpO1xuICAgIGlmIChoZWFkZXJUaXRsZSkgaGVhZGVyVGl0bGUudGV4dENvbnRlbnQgPSBjdXJyZW50VGl0bGU7XG4gIH1cblxuICAvLyBMb2FkIGN1c3RvbSBsb2dvLCBwb3NpdGlvbiwgYW5kIHRpdGxlIG9uIHN0YXJ0dXBcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEN1c3RvbUxvZ28oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbG9nbycpO1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIC8vIEFwcGx5IGRhcmsvbGlnaHQgdmFyaWFudHNcbiAgICAgICAgaWYgKGRhdGEuY3VzdG9tTG9nb0RhcmspIHtcbiAgICAgICAgICBicmFuZExvZ29EYXJrLnNyYyA9IGRhdGEuY3VzdG9tTG9nb0Rhcms7XG4gICAgICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YS5jdXN0b21Mb2dvRGFyaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5jdXN0b21Mb2dvTGlnaHQpIHtcbiAgICAgICAgICBicmFuZExvZ29MaWdodC5zcmMgPSBkYXRhLmN1c3RvbUxvZ29MaWdodDtcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvTGlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGVnYWN5IHNpbmdsZS1sb2dvIGZhbGxiYWNrXG4gICAgICAgIGlmICghZGF0YS5jdXN0b21Mb2dvRGFyayAmJiAhZGF0YS5jdXN0b21Mb2dvTGlnaHQgJiYgZGF0YS5jdXN0b21Mb2dvKSB7XG4gICAgICAgICAgYnJhbmRMb2dvRGFyay5zcmMgPSBkYXRhLmN1c3RvbUxvZ287XG4gICAgICAgICAgYnJhbmRMb2dvTGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvO1xuICAgICAgICAgIHByZXZpZXdEYXJrLnNyYyA9IGRhdGEuY3VzdG9tTG9nbztcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGF0YS5pc0RlZmF1bHQpIHtcbiAgICAgICAgICBsb2dvU3RhdHVzLnRleHRDb250ZW50ID0gJ1VzaW5nIGN1c3RvbSBsb2dvJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5wb3NpdGlvbikge1xuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IGRhdGEucG9zaXRpb247XG4gICAgICAgICAgYXBwbHlMb2dvUG9zaXRpb24oZGF0YS5wb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuZGFzaGJvYXJkVGl0bGUpIHtcbiAgICAgICAgICBhcHBseURhc2hib2FyZFRpdGxlKGRhdGEuZGFzaGJvYXJkVGl0bGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGxvYWQgY3VzdG9tIGxvZ286JywgZXJyb3IubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUG9zaXRpb24gYnV0dG9uIGhhbmRsZXJzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sb2dvLXBvcy1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY3VycmVudFBvc2l0aW9uID0gYnRuLmRhdGFzZXQucG9zO1xuICAgICAgYXBwbHlMb2dvUG9zaXRpb24oY3VycmVudFBvc2l0aW9uKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gT3BlbiBsb2dvIG1vZGFsIG9uIGJyYW5kIGNsaWNrXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdicmFuZCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBwZW5kaW5nRGFya0RhdGEgPSBudWxsO1xuICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgIHBlbmRpbmdTaW5nbGVEYXRhID0gbnVsbDtcbiAgICBpZiAodXBsb2FkRGFyaykgdXBsb2FkRGFyay52YWx1ZSA9ICcnO1xuICAgIGlmICh1cGxvYWRMaWdodCkgdXBsb2FkTGlnaHQudmFsdWUgPSAnJztcbiAgICBpZiAodXBsb2FkU2luZ2xlKSB1cGxvYWRTaW5nbGUudmFsdWUgPSAnJztcbiAgICAvLyBSZXNldCBjaGVja2JveCB0byBkdWFsIG1vZGVcbiAgICBpZiAoc2FtZUJvdGhDaGVja2JveCkgc2FtZUJvdGhDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgZHVhbFVwbG9hZHMuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBzaW5nbGVVcGxvYWQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAvLyBSZXNldCBwcmV2aWV3cyB0byBjdXJyZW50IGhlYWRlciBsb2dvc1xuICAgIHByZXZpZXdEYXJrLnNyYyA9IGJyYW5kTG9nb0Rhcmsuc3JjO1xuICAgIHByZXZpZXdMaWdodC5zcmMgPSBicmFuZExvZ29MaWdodC5zcmM7XG4gICAgY29uc3QgaXNDdXN0b20gPSBicmFuZExvZ29EYXJrLnNyYy5pbmNsdWRlcygnY3VzdG9tLWxvZ28nKSB8fCBicmFuZExvZ29MaWdodC5zcmMuaW5jbHVkZXMoJ2N1c3RvbS1sb2dvJyk7XG4gICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9IGlzQ3VzdG9tID8gJ1VzaW5nIGN1c3RvbSBsb2dvJyA6ICdVc2luZyBkZWZhdWx0IGxvZ29zJztcbiAgICBhcHBseUxvZ29Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24pO1xuICAgIGRhc2hib2FyZFRpdGxlSW5wdXQudmFsdWUgPSBjdXJyZW50VGl0bGU7XG4gICAgbG9nb01vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gU2F2ZSBsb2dvLCBwb3NpdGlvbiwgYW5kIHRpdGxlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5ld1RpdGxlID0gZGFzaGJvYXJkVGl0bGVJbnB1dC52YWx1ZS50cmltKCkgfHwgREVGQVVMVF9USVRMRTtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIHBvc2l0aW9uOiBjdXJyZW50UG9zaXRpb24sXG4gICAgICAgIGRhc2hib2FyZFRpdGxlOiBuZXdUaXRsZVxuICAgICAgfTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGxvZ28gZGF0YSB0byBzZW5kXG4gICAgICBpZiAoc2FtZUJvdGhDaGVja2JveD8uY2hlY2tlZCAmJiBwZW5kaW5nU2luZ2xlRGF0YSkge1xuICAgICAgICAvLyBTaW5nbGUgbG9nbyBmb3IgYm90aCB2YXJpYW50c1xuICAgICAgICBwYXlsb2FkLmRhdGFEYXJrID0gcGVuZGluZ1NpbmdsZURhdGE7XG4gICAgICAgIHBheWxvYWQuZGF0YUxpZ2h0ID0gcGVuZGluZ1NpbmdsZURhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocGVuZGluZ0RhcmtEYXRhKSBwYXlsb2FkLmRhdGFEYXJrID0gcGVuZGluZ0RhcmtEYXRhO1xuICAgICAgICBpZiAocGVuZGluZ0xpZ2h0RGF0YSkgcGF5bG9hZC5kYXRhTGlnaHQgPSBwZW5kaW5nTGlnaHREYXRhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2xvZ28nLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgY29uc3QgdCA9ICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGRhdGEucGF0aERhcmspIHtcbiAgICAgICAgICBicmFuZExvZ29EYXJrLnNyYyA9IGRhdGEucGF0aERhcmsgKyB0O1xuICAgICAgICAgIHByZXZpZXdEYXJrLnNyYyA9IGRhdGEucGF0aERhcmsgKyB0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLnBhdGhMaWdodCkge1xuICAgICAgICAgIGJyYW5kTG9nb0xpZ2h0LnNyYyA9IGRhdGEucGF0aExpZ2h0ICsgdDtcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5wYXRoTGlnaHQgKyB0O1xuICAgICAgICB9XG4gICAgICAgIGFwcGx5TG9nb1Bvc2l0aW9uKGN1cnJlbnRQb3NpdGlvbik7XG4gICAgICAgIGFwcGx5RGFzaGJvYXJkVGl0bGUobmV3VGl0bGUpO1xuICAgICAgICBsb2dvTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlOiAnICsgZXJyb3IuZXJyb3IsICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvciBzYXZpbmc6ICcgKyBlcnJvci5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFJlc2V0IGFsbCBicmFuZGluZyB0byBkZWZhdWx0c1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1yZXNldCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpcm0oJ1Jlc2V0IGFsbCBicmFuZGluZyB0byBEYXNoQ2FkZHkgZGVmYXVsdHM/XFxuXFxuVGhpcyB3aWxsIHJlc2V0IHRoZSBsb2dvLCBmYXZpY29uLCB0aXRsZSwgYW5kIHBvc2l0aW9uLicpKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9nb1Jlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbG9nbycsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIGlmIChsb2dvUmVzcG9uc2Uub2spIHtcbiAgICAgICAgYnJhbmRMb2dvRGFyay5zcmMgPSAnL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1kYXJrLnBuZyc7XG4gICAgICAgIGJyYW5kTG9nb0xpZ2h0LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZyc7XG4gICAgICAgIHByZXZpZXdEYXJrLnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWRhcmsucG5nJztcbiAgICAgICAgcHJldmlld0xpZ2h0LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZyc7XG4gICAgICAgIGxvZ29TdGF0dXMudGV4dENvbnRlbnQgPSAnVXNpbmcgZGVmYXVsdCBsb2dvcyc7XG4gICAgICAgIHBlbmRpbmdEYXJrRGF0YSA9IG51bGw7XG4gICAgICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgICAgICBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gICAgICAgIGRhc2hib2FyZFRpdGxlSW5wdXQudmFsdWUgPSBERUZBVUxUX1RJVExFO1xuICAgICAgICBhcHBseURhc2hib2FyZFRpdGxlKERFRkFVTFRfVElUTEUpO1xuICAgICAgICBjdXJyZW50UG9zaXRpb24gPSAnbGVmdCc7XG4gICAgICAgIGFwcGx5TG9nb1Bvc2l0aW9uKCdsZWZ0Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZhdmljb25SZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Zhdmljb24nLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICBpZiAoZmF2aWNvblJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGZhdmljb25MaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tyZWw9XCJpY29uXCJdJyk7XG4gICAgICAgIGNvbnN0IGZhdmljb25QcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zhdmljb24tcHJldmlldycpO1xuICAgICAgICBjb25zdCBmYXZpY29uU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zhdmljb24tc3RhdHVzJyk7XG4gICAgICAgIGlmIChmYXZpY29uTGluaykgZmF2aWNvbkxpbmsuaHJlZiA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1mYXZpY29uLmljbz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoZmF2aWNvblByZXZpZXcpIGZhdmljb25QcmV2aWV3LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1mYXZpY29uLmljbz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoZmF2aWNvblN0YXR1cykgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdVc2luZyBEYXNoQ2FkZHkgZmF2aWNvbic7XG4gICAgICAgIHBlbmRpbmdGYXZpY29uRGF0YSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yIHJlc2V0dGluZyBicmFuZGluZzogJyArIGVycm9yLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgd2lyZU1vZGFsKGxvZ29Nb2RhbCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tY2FuY2VsJykpO1xuXG4gIC8vID09PT09IEZBVklDT04gSEFORExJTkcgPT09PT1cbiAgY29uc3QgZmF2aWNvblByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmF2aWNvbi1wcmV2aWV3Jyk7XG4gIGNvbnN0IGZhdmljb25TdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmF2aWNvbi1zdGF0dXMnKTtcbiAgY29uc3QgZmF2aWNvblVwbG9hZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYXZpY29uLXVwbG9hZCcpO1xuICBjb25zdCBmYXZpY29uTGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwiaWNvblwiXScpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgbGV0IHBlbmRpbmdGYXZpY29uRGF0YSA9IG51bGw7XG5cbiAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW3JlbD1cImljb25cIl0nKSkge1xuICAgIGZhdmljb25MaW5rLnJlbCA9ICdpY29uJztcbiAgICBmYXZpY29uTGluay5ocmVmID0gJy9hc3NldHMvZGFzaGNhZGR5LWZhdmljb24uaWNvJztcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGZhdmljb25MaW5rKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRDdXN0b21GYXZpY29uKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Zhdmljb24nKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5jdXN0b21GYXZpY29uKSB7XG4gICAgICAgICAgZmF2aWNvbkxpbmsuaHJlZiA9IGRhdGEuY3VzdG9tRmF2aWNvbiArICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgICBmYXZpY29uUHJldmlldy5zcmMgPSBkYXRhLmN1c3RvbUZhdmljb24gKyAnP3Q9JyArIERhdGUubm93KCk7XG4gICAgICAgICAgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdVc2luZyBjdXN0b20gZmF2aWNvbic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgbG9hZCBjdXN0b20gZmF2aWNvbjonLCBlcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBmYXZpY29uVXBsb2FkPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBpZiAoIWZpbGUudHlwZS5tYXRjaCgvXmltYWdlXFwvKHBuZ3xzdmdcXCt4bWwpJC8pKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2Ugc2VsZWN0IGEgUE5HIG9yIFNWRyBmaWxlJywgJ3dhcm5pbmcnKTtcbiAgICAgIGZhdmljb25VcGxvYWQudmFsdWUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKGV2ZW50KSA9PiB7XG4gICAgICBwZW5kaW5nRmF2aWNvbkRhdGEgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgZmF2aWNvblByZXZpZXcuc3JjID0gcGVuZGluZ0Zhdmljb25EYXRhO1xuICAgICAgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgZmF2aWNvbiByZWFkeSB0byBzYXZlJztcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9KTtcblxuICAvLyBTYXZlIGZhdmljb24gYWxvbmdzaWRlIGxvZ28gc2F2ZVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChwZW5kaW5nRmF2aWNvbkRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZmF2aWNvbicsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRhdGE6IHBlbmRpbmdGYXZpY29uRGF0YSB9KVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICBmYXZpY29uTGluay5ocmVmID0gZGF0YS5wYXRoICsgJz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICAgIGZhdmljb25QcmV2aWV3LnNyYyA9IGRhdGEucGF0aCArICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgICBmYXZpY29uU3RhdHVzLnRleHRDb250ZW50ID0gJ1VzaW5nIGN1c3RvbSBmYXZpY29uJztcbiAgICAgICAgICBwZW5kaW5nRmF2aWNvbkRhdGEgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlIGZhdmljb246ICcgKyBlcnJvci5lcnJvciwgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yIHNhdmluZyBmYXZpY29uOiAnICsgZXJyb3IubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBsb2FkQ3VzdG9tRmF2aWNvbigpO1xuICBsb2FkQ3VzdG9tTG9nbygpO1xuXG4gIC8vID09PT09IFRJTUVaT05FIFNFVFRJTkcgPT09PT1cbiAgY29uc3Qgc2V0dGluZ3NUelNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy10aW1lem9uZScpO1xuICBpZiAoc2V0dGluZ3NUelNlbGVjdCkge1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKGxvZ29Nb2RhbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSAmJiBzZXR0aW5nc1R6U2VsZWN0Lm9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgbGV0IGN1cnJlbnRUejtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvY29uZmlnJyk7XG4gICAgICAgICAgICBpZiAocmVzLm9rKSB7IGNvbnN0IGNmZyA9IGF3YWl0IHJlcy5qc29uKCk7IGN1cnJlbnRUeiA9IGNmZy50aW1lem9uZTsgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICAgICAgICB3aW5kb3cucG9wdWxhdGVUaW1lem9uZVNlbGVjdChzZXR0aW5nc1R6U2VsZWN0LCBjdXJyZW50VHopO1xuICAgICAgICB9KSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUobG9nb01vZGFsLCB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR6ID0gc2V0dGluZ3NUelNlbGVjdC52YWx1ZTtcbiAgICAgIGlmICghdHopIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbmZpZycpO1xuICAgICAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgICAgICBjb25zdCBjZmcgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBjZmcudGltZXpvbmUgPSB0ejtcbiAgICAgICAgY2ZnLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNmZylcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgdGltZXpvbmU6JywgZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSkoKTtcbjtcbi8vIFNoYXJlZCB0aW1lem9uZSB1dGlsaXR5IFx1MjAxNCB1c2VkIGJ5IHNldHVwIHdpemFyZCBhbmQgc2V0dGluZ3MgbW9kYWxcbi8vIGVycm9ySGFuZGxlciBpcyBkZWNsYXJlZCBnbG9iYWxseSBpbiBnbG9iYWxzLmpzIChjb3JlLmpzIGJ1bmRsZSk7IHJldXNpbmcgaXRcbi8vIGhlcmUgc28gd2UgZG9uJ3QgZ2V0IFwicmVkZWNsYXJhdGlvbiBvZiBjb25zdCBlcnJvckhhbmRsZXJcIiBhdCBzY3JpcHQgc2NvcGUuXG5cbndpbmRvdy5wb3B1bGF0ZVRpbWV6b25lU2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0RWwsIHNlbGVjdGVkVHopIHtcbiAgY29uc3QgdGltZXpvbmVzID0gSW50bC5zdXBwb3J0ZWRWYWx1ZXNPZigndGltZVpvbmUnKTtcbiAgY29uc3QgZGV0ZWN0ZWQgPSBzZWxlY3RlZFR6IHx8IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCAnVVRDJztcbiAgc2VsZWN0RWwuaW5uZXJIVE1MID0gJyc7XG4gIGZvciAoY29uc3QgdHogb2YgdGltZXpvbmVzKSB7XG4gICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgb3B0LnZhbHVlID0gdHo7XG4gICAgb3B0LnRleHRDb250ZW50ID0gdHoucmVwbGFjZSgvXy9nLCAnICcpO1xuICAgIGlmICh0eiA9PT0gZGV0ZWN0ZWQpIG9wdC5zZWxlY3RlZCA9IHRydWU7XG4gICAgc2VsZWN0RWwuYXBwZW5kQ2hpbGQob3B0KTtcbiAgfVxufTtcblxuLy8gU2V0dXAgV2l6YXJkIFN5c3RlbSAtIFNlcnZlci1zaWRlIGNvbmZpZyBzdG9yYWdlXG4oZnVuY3Rpb24gKCkge1xuICBsZXQgY3VycmVudENvbmZpZ1R5cGUgPSAnaG9tZWxhYic7XG4gIGxldCBzZXJ2ZXJDb25maWcgPSBudWxsO1xuXG4gIC8vIENoZWNrIHNlcnZlciBmb3IgZXhpc3RpbmcgY29uZmlnIG9uIHBhZ2UgbG9hZFxuICBhc3luYyBmdW5jdGlvbiBjaGVja1NlcnZlckNvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBzZXJ2ZXJDb25maWcgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChzZXJ2ZXJDb25maWcgJiYgc2VydmVyQ29uZmlnLnNldHVwQ29tcGxldGUpIHtcbiAgICAgICAgICAvLyBDb25maWcgZXhpc3RzIG9uIHNlcnZlciAtIGRvbid0IHNob3cgd2l6YXJkXG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmV0Y2ggc2VydmVyIGNvbmZpZywgY2hlY2tpbmcgbG9jYWxTdG9yYWdlIGZhbGxiYWNrOicsIGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBjaGVjayBsb2NhbFN0b3JhZ2UgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgbG9jYWxTZXR1cCA9IHNhZmVHZXQoJ2Rhc2hjYWRkeS1zZXR1cCcpO1xuICAgIGlmIChsb2NhbFNldHVwKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtd2l6YXJkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIE5vIGNvbmZpZyBmb3VuZCAtIHNob3cgd2l6YXJkXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBvbiBwYWdlIGxvYWRcbiAgY2hlY2tTZXJ2ZXJDb25maWcoKTtcblxuICAvLyBQb3B1bGF0ZSB0aW1lem9uZSBkcm9wZG93biB3aXRoIGF1dG8tZGV0ZWN0aW9uXG4gIGNvbnN0IHNldHVwVHpTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKTtcbiAgaWYgKHNldHVwVHpTZWxlY3QpIHdpbmRvdy5wb3B1bGF0ZVRpbWV6b25lU2VsZWN0KHNldHVwVHpTZWxlY3QpO1xuXG4gIC8vIFN0ZXAgbmF2aWdhdGlvblxuICBmdW5jdGlvbiBzaG93U3RlcChzdGVwSWQpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2V0dXAtc3RlcCcpLmZvckVhY2goc3RlcCA9PiB7XG4gICAgICBzdGVwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0U3RlcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0ZXBJZCk7XG4gICAgaWYgKHRhcmdldFN0ZXApIHtcbiAgICAgIHRhcmdldFN0ZXAuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuICB9XG5cbiAgLy8gU2hvdyBzdW1tYXJ5XG4gIGZ1bmN0aW9uIHNob3dTdW1tYXJ5KCkge1xuICAgIGNvbnN0IHN1bW1hcnlDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXN1bW1hcnktY29udGVudCcpO1xuICAgIGlmICghc3VtbWFyeUNvbnRlbnQpIHJldHVybjtcblxuICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDIwcHg7XCI+JztcblxuICAgIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ2hvbWVsYWInKSB7XG4gICAgICBjb25zdCB0bGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGxkJyk/LnZhbHVlPy50cmltKCkgfHwgJy5ob21lJztcbiAgICAgIGNvbnN0IGNhTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1jYS1uYW1lJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBkbnNJUCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGRuc1BvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXBvcnQnKT8udmFsdWU/LnRyaW0oKSB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVDtcblxuICAgICAgaHRtbCArPSBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+SG9tZSBMYWIgQ29uZmlndXJhdGlvbjwvaDM+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTJweDsgZm9udC1zaXplOiAwLjk1cmVtO1wiPlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlRMRDo8L3N0cm9uZz4gJHt0bGR9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+Q2VydGlmaWNhdGUgQXV0aG9yaXR5Ojwvc3Ryb25nPiAke2NhTmFtZX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5ETlMgU2VydmVyOjwvc3Ryb25nPiAke2Ruc0lQfToke2Ruc1BvcnR9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+RXhhbXBsZSBVUkxzOjwvc3Ryb25nPiBodHRwczovL3VwdGltZSR7dGxkfSwgaHR0cHM6Ly9uZXh0Y2xvdWQke3RsZH08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdzaW1wbGUnKSB7XG4gICAgICBjb25zdCBpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zaW1wbGUtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnbG9jYWxob3N0JztcblxuICAgICAgaHRtbCArPSBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+U2ltcGxlIFNldHVwPC9oMz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4OyBmb250LXNpemU6IDAuOTVyZW07XCI+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+QWNjZXNzIE1ldGhvZDo8L3N0cm9uZz4gSVA6UG9ydCBvbmx5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+RGVmYXVsdCBJUDo8L3N0cm9uZz4gJHtpcH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5TU0w6PC9zdHJvbmc+IE5vbmUgKEhUVFAgb25seSk8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5FeGFtcGxlIFVSTHM6PC9zdHJvbmc+IGh0dHA6Ly8ke2lwfTo4MDgwLCBodHRwOi8vJHtpcH06MzAwMDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBlbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZW1haWwnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IHJvdXRpbmdNb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInJvdXRpbmctbW9kZVwiXTpjaGVja2VkJyk/LnZhbHVlIHx8ICdzdWJkaXJlY3RvcnknO1xuICAgICAgY29uc3QgZXhhbXBsZVVybHMgPSByb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeSdcbiAgICAgICAgPyBgaHR0cHM6Ly8ke2RvbWFpbn0vc29uYXJyLCBodHRwczovLyR7ZG9tYWlufS9ncmFmYW5hYFxuICAgICAgICA6IGBodHRwczovL3NvbmFyci4ke2RvbWFpbn0sIGh0dHBzOi8vZ3JhZmFuYS4ke2RvbWFpbn1gO1xuICAgICAgY29uc3Qgcm91dGluZ0xhYmVsID0gcm91dGluZ01vZGUgPT09ICdzdWJkaXJlY3RvcnknID8gJ1N1YmRpcmVjdG9yeSAoZG9tYWluLmNvbS9hcHApJyA6ICdTdWJkb21haW4gKGFwcC5kb21haW4uY29tKSc7XG5cbiAgICAgIGh0bWwgKz0gYFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjogMCAwIDEycHg7IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPlB1YmxpYyBTZXJ2ZXI8L2gzPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDEycHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5Eb21haW46PC9zdHJvbmc+ICR7ZG9tYWlufTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlNTTDo8L3N0cm9uZz4gTGV0J3MgRW5jcnlwdDwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPkVtYWlsOjwvc3Ryb25nPiAke2VtYWlsfTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlJvdXRpbmc6PC9zdHJvbmc+ICR7cm91dGluZ0xhYmVsfTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPkV4YW1wbGUgVVJMczo8L3N0cm9uZz4gJHtleGFtcGxlVXJsc308L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH1cblxuICAgIC8vIFRpbWV6b25lICh1bml2ZXJzYWwgYWNyb3NzIGFsbCBjb25maWcgdHlwZXMpXG4gICAgY29uc3QgdHogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKT8udmFsdWUgfHwgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8ICdVVEMnO1xuICAgIGh0bWwgKz0gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjk1cmVtO1wiPjxzdHJvbmc+VGltZXpvbmU6PC9zdHJvbmc+ICR7dHoucmVwbGFjZSgvXy9nLCAnICcpfTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgc3VtbWFyeUNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zdW1tYXJ5Jyk7XG4gIH1cblxuICAvLyBTYXZlIGNvbmZpZyB0byBzZXJ2ZXJcbiAgYXN5bmMgZnVuY3Rpb24gc2F2ZUNvbmZpZ1RvU2VydmVyKGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2NvbmZpZycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb25maWcpXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tTZXR1cFdpemFyZF0gU2F2ZSBDb25maWcnLCBuZXcgRXJyb3IoYFNlcnZlciByZXR1cm5lZCAke3Jlc3BvbnNlLnN0YXR1c31gKSwgeyBmdW5jdGlvbjogJ3NhdmVDb25maWdUb1NlcnZlcicgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbU2V0dXBXaXphcmRdIFNhdmUgQ29uZmlnJywgZXJyb3IsIHsgZnVuY3Rpb246ICdzYXZlQ29uZmlnVG9TZXJ2ZXInIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmlzaCBzZXR1cCBoYW5kbGVyXG4gIGFzeW5jIGZ1bmN0aW9uIGZpbmlzaFNldHVwKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHNldHVwQ29tcGxldGU6IHRydWUsXG4gICAgICBjb25maWd1cmF0aW9uVHlwZTogY3VycmVudENvbmZpZ1R5cGUsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRpbWV6b25lOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKT8udmFsdWUgfHwgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8ICdVVEMnXG4gICAgfTtcblxuICAgIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ2hvbWVsYWInKSB7XG4gICAgICBjb25maWcudGxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXRsZCcpPy52YWx1ZT8udHJpbSgpIHx8ICcuaG9tZSc7XG4gICAgICBjb25maWcuY2FOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWNhLW5hbWUnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IHNlbGVjdGVkUHJvdmlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXByb3ZpZGVyJyk/LnZhbHVlIHx8ICd0ZWNobml0aXVtJztcbiAgICAgIGNvbmZpZy5kbnMgPSB7XG4gICAgICAgIHByb3ZpZGVyOiBzZWxlY3RlZFByb3ZpZGVyLFxuICAgICAgICBpcDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRucy1pcCcpPy52YWx1ZT8udHJpbSgpIHx8ICcnLFxuICAgICAgICBwb3J0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXBvcnQnKT8udmFsdWU/LnRyaW0oKSB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVCxcbiAgICAgICAgdG9rZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtdG9rZW4nKT8udmFsdWU/LnRyaW0oKSB8fCAnJ1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5kZWZhdWx0cyA9IHtcbiAgICAgICAgZG5zVHlwZTogJ3ByaXZhdGUnLFxuICAgICAgICBzc2xUeXBlOiAnaW50ZXJuYWwnLFxuICAgICAgICB0YXJnZXRJUDogJ2xvY2FsaG9zdCdcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgIGNvbmZpZy5kZWZhdWx0SVAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc2ltcGxlLWlwJyk/LnZhbHVlPy50cmltKCkgfHwgJ2xvY2FsaG9zdCc7XG4gICAgICBjb25maWcuZGVmYXVsdHMgPSB7XG4gICAgICAgIGRuc1R5cGU6ICdub25lJyxcbiAgICAgICAgc3NsVHlwZTogJ25vbmUnLFxuICAgICAgICB0YXJnZXRJUDogY29uZmlnLmRlZmF1bHRJUFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAncHVibGljJykge1xuICAgICAgY29uZmlnLmRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25maWcuZW1haWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtcHVibGljLWVtYWlsJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25maWcucm91dGluZ01vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwicm91dGluZy1tb2RlXCJdOmNoZWNrZWQnKT8udmFsdWUgfHwgJ3N1YmRpcmVjdG9yeSc7XG4gICAgICBjb25maWcuZGVmYXVsdHMgPSB7XG4gICAgICAgIGRuc1R5cGU6IGNvbmZpZy5yb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeScgPyAnbm9uZScgOiAncHVibGljJyxcbiAgICAgICAgc3NsVHlwZTogJ2xldHNlbmNyeXB0JyxcbiAgICAgICAgdGFyZ2V0SVA6ICdsb2NhbGhvc3QnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNhdmUgdG8gc2VydmVyIChwcmltYXJ5KSBhbmQgbG9jYWxTdG9yYWdlIChmYWxsYmFjaylcbiAgICBjb25zdCBzYXZlZFRvU2VydmVyID0gYXdhaXQgc2F2ZUNvbmZpZ1RvU2VydmVyKGNvbmZpZyk7XG4gICAgc2FmZVNldCgnZGFzaGNhZGR5LWNvbmZpZycsIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuICAgIHNhZmVTZXQoJ2Rhc2hjYWRkeS1zZXR1cCcsICdjb21wbGV0ZWQnKTtcblxuICAgIC8vIEhpZGUgd2l6YXJkXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAvLyBTaG93IHN1Y2Nlc3Mgbm90aWZpY2F0aW9uXG4gICAgY29uc3QgY29uZmlnTmFtZSA9IGN1cnJlbnRDb25maWdUeXBlID09PSAnaG9tZWxhYicgPyAnUHJvZmVzc2lvbmFsIEhvbWUgTGFiJyA6XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbmZpZ1R5cGUgPT09ICdzaW1wbGUnID8gJ1NpbXBsZSBTZXR1cCcgOiAnUHVibGljIFNlcnZlcic7XG4gICAgY29uc3Qgc2F2ZUxvY2F0aW9uID0gc2F2ZWRUb1NlcnZlciA/ICdzZXJ2ZXIgKHNoYXJlZCBhY3Jvc3MgYWxsIGRldmljZXMpJyA6ICdsb2NhbGx5ICh0aGlzIGJyb3dzZXIgb25seSknO1xuXG4gICAgc2hvd05vdGlmaWNhdGlvbihgU2V0dXAgQ29tcGxldGUhIENvbmZpZ3VyZWQgZm9yOiAke2NvbmZpZ05hbWV9LiBTZXR0aW5ncyBzYXZlZCB0bzogJHtzYXZlTG9jYXRpb259YCwgJ3N1Y2Nlc3MnLCA1MDAwKTtcblxuICAgIC8vIFJlbG9hZCBwYWdlIHRvIGFwcGx5IGNvbmZpZ3VyYXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IGxvY2F0aW9uLnJlbG9hZCgpLCA1MDApO1xuICB9XG5cbiAgLy8gPT09PT0gRXZlbnQgSGFuZGxlcnMgdXNpbmcgZGlyZWN0IG9uY2xpY2sgZm9yIHJlbGlhYmlsaXR5ID09PT09XG5cbiAgLy8gU3RlcCAxOiBDb250aW51ZSBidXR0b25cbiAgY29uc3Qgc3RlcDFOZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXN0ZXAtMS1uZXh0Jyk7XG4gIGlmIChzdGVwMU5leHQpIHtcbiAgICBzdGVwMU5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImNvbmZpZy10eXBlXCJdOmNoZWNrZWQnKTtcbiAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBjdXJyZW50Q29uZmlnVHlwZSA9IHNlbGVjdGVkLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnaG9tZWxhYicpIHtcbiAgICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtaG9tZWxhYicpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtc2ltcGxlJyk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAncHVibGljJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1wdWJsaWMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLWhvbWVsYWInKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gU2tpcCBzZXR1cCBidXR0b25cbiAgY29uc3Qgc2tpcEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1za2lwJyk7XG4gIGlmIChza2lwQnRuKSB7XG4gICAgc2tpcEJ0bi5vbmNsaWNrID0gYXN5bmMgZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGNvbmZpcm0oJ1NraXAgc2V0dXA/IFlvdSBjYW4gcnVuIGl0IGxhdGVyIGZyb20gU2V0dGluZ3MuJykpIHtcbiAgICAgICAgLy8gU2F2ZSBza2lwIHN0YXR1cyB0byBzZXJ2ZXJcbiAgICAgICAgYXdhaXQgc2F2ZUNvbmZpZ1RvU2VydmVyKHsgc2V0dXBDb21wbGV0ZTogdHJ1ZSwgc2tpcHBlZDogdHJ1ZSwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSk7XG4gICAgICAgIHNhZmVTZXQoJ2Rhc2hjYWRkeS1zZXR1cCcsICdza2lwcGVkJyk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC13aXphcmQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBIb21lIExhYjogVExEIFByZXZpZXdcbiAgY29uc3QgdGxkSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGxkJyk7XG4gIGlmICh0bGRJbnB1dCkge1xuICAgIHRsZElucHV0Lm9uaW5wdXQgPSBmdW5jdGlvbihlKSB7XG4gICAgICBjb25zdCB0bGQgPSBlLnRhcmdldC52YWx1ZSB8fCAnLmhvbWUnO1xuICAgICAgY29uc3QgcHJldmlldzEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGxkLXByZXZpZXcnKTtcbiAgICAgIGNvbnN0IHByZXZpZXcyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RsZC1wcmV2aWV3LTInKTtcbiAgICAgIGlmIChwcmV2aWV3MSkgcHJldmlldzEudGV4dENvbnRlbnQgPSB0bGQ7XG4gICAgICBpZiAocHJldmlldzIpIHByZXZpZXcyLnRleHRDb250ZW50ID0gdGxkO1xuICAgIH07XG4gIH1cblxuICAvLyBIb21lIExhYiBuYXZpZ2F0aW9uXG4gIGNvbnN0IGhvbWVsYWJCYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWhvbWVsYWItYmFjaycpO1xuICBpZiAoaG9tZWxhYkJhY2spIHtcbiAgICBob21lbGFiQmFjay5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtMScpO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBob21lbGFiTmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1ob21lbGFiLW5leHQnKTtcbiAgaWYgKGhvbWVsYWJOZXh0KSB7XG4gICAgaG9tZWxhYk5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHRsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC10bGQnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGNhTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1jYS1uYW1lJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBkbnNJUCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcblxuICAgICAgaWYgKCF0bGQgfHwgIXRsZC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgdmFsaWQgVExEIHN0YXJ0aW5nIHdpdGggYSBkb3QgKGUuZy4sIC5ob21lKScsICd3YXJuaW5nJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghY2FOYW1lKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIENlcnRpZmljYXRlIEF1dGhvcml0eSBuYW1lJywgJ3dhcm5pbmcnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFkbnNJUCkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgeW91ciBETlMgc2VydmVyIElQIGFkZHJlc3MnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93U3VtbWFyeSgpO1xuICAgIH07XG4gIH1cblxuICAvLyBTaW1wbGUgbmF2aWdhdGlvblxuICBjb25zdCBzaW1wbGVCYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXNpbXBsZS1iYWNrJyk7XG4gIGlmIChzaW1wbGVCYWNrKSB7XG4gICAgc2ltcGxlQmFjay5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtMScpO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBzaW1wbGVOZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXNpbXBsZS1uZXh0Jyk7XG4gIGlmIChzaW1wbGVOZXh0KSB7XG4gICAgc2ltcGxlTmV4dC5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N1bW1hcnkoKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gUHVibGljIHJvdXRpbmcgbW9kZSB0b2dnbGUgXHUyMDE0IHVwZGF0ZSByZXF1aXJlbWVudCB0ZXh0XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9XCJyb3V0aW5nLW1vZGVcIl0nKS5mb3JFYWNoKGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgcmFkaW8ub25jaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBub3RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1yZXF1aXJlbWVudC1ub3RlJyk7XG4gICAgICBpZiAobm90ZSkge1xuICAgICAgICBub3RlLnRleHRDb250ZW50ID0gdGhpcy52YWx1ZSA9PT0gJ3N1YmRpcmVjdG9yeSdcbiAgICAgICAgICA/ICdPbmx5IG9uZSBETlMgcmVjb3JkIG5lZWRlZCAoZm9yIHRoZSBtYWluIGRvbWFpbiknXG4gICAgICAgICAgOiAnWW91XFwnbGwgbmVlZCB0byBjb25maWd1cmUgRE5TIG1hbnVhbGx5IGZvciBlYWNoIHN1YmRvbWFpbic7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gUHVibGljIG5hdmlnYXRpb25cbiAgY29uc3QgcHVibGljQmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtYmFjaycpO1xuICBpZiAocHVibGljQmFjaykge1xuICAgIHB1YmxpY0JhY2sub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLTEnKTtcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcHVibGljTmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtbmV4dCcpO1xuICBpZiAocHVibGljTmV4dCkge1xuICAgIHB1YmxpY05leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBlbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZW1haWwnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcblxuICAgICAgaWYgKCFkb21haW4pIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIHlvdXIgZG9tYWluIG5hbWUnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWVtYWlsIHx8ICFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93U3VtbWFyeSgpO1xuICAgIH07XG4gIH1cblxuICAvLyBTdW1tYXJ5IG5hdmlnYXRpb25cbiAgY29uc3Qgc3VtbWFyeUJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc3VtbWFyeS1iYWNrJyk7XG4gIGlmIChzdW1tYXJ5QmFjaykge1xuICAgIHN1bW1hcnlCYWNrLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdob21lbGFiJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1ob21lbGFiJyk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnc2ltcGxlJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zaW1wbGUnKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLXB1YmxpYycpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBTdW1tYXJ5IFwiQ29udGludWUgXHUyMTkyXCIgXHUyMDE0IGFkdmFuY2UgdG8gdGhlIGRpc2stc2FmZXR5IHdhcm5pbmcgc3RlcFxuICBjb25zdCBzdW1tYXJ5TmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zdW1tYXJ5LW5leHQnKTtcbiAgaWYgKHN1bW1hcnlOZXh0KSB7XG4gICAgc3VtbWFyeU5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLWRpc2stc2FmZXR5Jyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIERpc2stc2FmZXR5IHN0ZXAgbmF2aWdhdGlvblxuICBjb25zdCBkaXNrU2FmZXR5QmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kaXNrLXNhZmV0eS1iYWNrJyk7XG4gIGlmIChkaXNrU2FmZXR5QmFjaykge1xuICAgIGRpc2tTYWZldHlCYWNrLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zdW1tYXJ5Jyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIEZpbmlzaCBzZXR1cCBidXR0b24gKG5vdyBvbiB0aGUgZGlzay1zYWZldHkgc3RlcClcbiAgY29uc3QgZmluaXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRpc2stc2FmZXR5LWZpbmlzaCcpO1xuICBpZiAoZmluaXNoQnRuKSB7XG4gICAgZmluaXNoQnRuLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBmaW5pc2hTZXR1cCgpO1xuICAgIH07XG4gIH1cblxuICAvLyBFeHBvc2UgZnVuY3Rpb24gdG8gZ2V0IGdsb2JhbCBjb25maWcgKGZyb20gc2VydmVyIG9yIGxvY2FsU3RvcmFnZSlcbiAgd2luZG93LmdldEdsb2JhbENvbmZpZyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIC8vIFRyeSBzZXJ2ZXIgZmlyc3RcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnNldHVwQ29tcGxldGUpIHtcbiAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmV0Y2ggY29uZmlnIGZyb20gc2VydmVyJyk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gbG9jYWxTdG9yYWdlXG4gICAgY29uc3QgY29uZmlnU3RyID0gc2FmZUdldCgnZGFzaGNhZGR5LWNvbmZpZycpO1xuICAgIGlmIChjb25maWdTdHIpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGNvbmZpZ1N0cik7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGRlZmF1bHQgY29uZmlnIGlmIG5vdCBzZXRcbiAgICByZXR1cm4ge1xuICAgICAgc2V0dXBDb21wbGV0ZTogZmFsc2UsXG4gICAgICBjb25maWd1cmF0aW9uVHlwZTogJ2hvbWVsYWInLFxuICAgICAgdGxkOiAnLmhvbWUnLFxuICAgICAgY2FOYW1lOiAnJyxcbiAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGRuc1R5cGU6ICdwcml2YXRlJyxcbiAgICAgICAgc3NsVHlwZTogJ2ludGVybmFsJyxcbiAgICAgICAgdGFyZ2V0SVA6ICdsb2NhbGhvc3QnXG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBFeHBvc2UgcmVzZXQgZnVuY3Rpb24gZm9yIHNldHRpbmdzXG4gIHdpbmRvdy5yZXNldFNldHVwV2l6YXJkID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgaWYgKGNvbmZpcm0oJ1Jlc2V0IERhc2hDYWRkeSBjb25maWd1cmF0aW9uPyBUaGlzIHdpbGwgc2hvdyB0aGUgc2V0dXAgd2l6YXJkIGFnYWluLicpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jb25maWcnLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGRlbGV0ZSBzZXJ2ZXIgY29uZmlnJyk7XG4gICAgICB9XG4gICAgICBzYWZlUmVtb3ZlKCdkYXNoY2FkZHktc2V0dXAnKTtcbiAgICAgIHNhZmVSZW1vdmUoJ2Rhc2hjYWRkeS1jb25maWcnKTtcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cbiAgfTtcbn0pKCk7XG47XG4vLyBBcHAgU2VsZWN0b3IgU3lzdGVtXG4oZnVuY3Rpb24gKCkge1xuICBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG4gIGluamVjdE1vZGFsKCdhcHAtc2VsZWN0b3ItbW9kYWwnLCBgPGRpdiBpZD1cImFwcC1zZWxlY3Rvci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJhcHAtc2VsZWN0b3ItY29udGVudFwiPlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luOiAwIDAgMjRweDsgY29sb3I6IHZhcigtLWZnKTsgdGV4dC1hbGlnbjogY2VudGVyO1wiPkNob29zZSBhbiBBcHA8L2gyPlxuICAgICAgPGRpdiBpZD1cImFwcC1zZWxlY3Rvci1ncmlkXCIgY2xhc3M9XCJhcHAtc2VsZWN0b3ItZ3JpZFwiPjwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogMjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImFwcC1zZWxlY3Rvci1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBpbmplY3RNb2RhbCgnYXBwLWRlcGxveS1tb2RhbCcsIGA8ZGl2IGlkPVwiYXBwLWRlcGxveS1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjAwcHg7IG1heC13aWR0aDogNzAwcHg7XCI+XG4gICAgICA8aDMgaWQ9XCJhcHAtZGVwbG95LXRpdGxlXCI+RGVwbG95IEFwcGxpY2F0aW9uPC9oMz5cblxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDwhLS0gU3ViZG9tYWluL0RvbWFpbiAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZGVwbG95LXN1YmRvbWFpblwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cbiAgICAgICAgICAgIFx1RDgzQ1x1REYxMCBTdWJkb21haW4gb3IgRG9tYWluXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRlcGxveS1zdWJkb21haW5cIiBwbGFjZWhvbGRlcj1cInVwdGltZVwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWhpbnQtc21cIj5cbiAgICAgICAgICAgIFlvdXIgYXBwIHdpbGwgYmUgYXZhaWxhYmxlIGF0OiA8c3BhbiBpZD1cImRlcGxveS11cmwtcHJldmlld1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+dXB0aW1lLmhvbWU8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInN1YnBhdGgtY29tcGF0LXdhcm5pbmdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDhweCAxMnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZmY5ODAwIDEwJSwgdmFyKC0tY2FyZC1iZykpOyBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgI2ZmOTgwMCAzMCUsIHRyYW5zcGFyZW50KTsgbWFyZ2luLXRvcDogOHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRE5TIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnRcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1RERDMlx1RkUwRiBETlMgQ29uZmlndXJhdGlvblxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sLWdhcFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicmFkaW8tb3B0aW9uXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZG5zLXR5cGVcIiB2YWx1ZT1cInByaXZhdGVcIiBjaGVja2VkIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPlByaXZhdGUgRE5TIChUZWNobml0aXVtKTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5Vc2UgeW91ciBsb2NhbCBETlMgc2VydmVyIHdpdGggY3VzdG9tIFRMRCAoLnNhbWksIC5ob21lLCBldGMuKTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJkbnMtdHlwZVwiIHZhbHVlPVwicHVibGljXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+UHVibGljIEROUzwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5Vc2UgYSByZWFsIGRvbWFpbiAoZXhhbXBsZS5jb20pIC0gcmVxdWlyZXMgRE5TIHByb3ZpZGVyIHNldHVwPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImRucy10eXBlXCIgdmFsdWU9XCJub25lXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+Tm8gRE5TIChJUDpQb3J0IG9ubHkpPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPkFjY2VzcyB2aWEgSVAgYWRkcmVzcyBhbmQgcG9ydCAtIG5vIGRvbWFpbiBzZXR1cDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gU1NMIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnRcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1REQxMiBTU0wvVExTIENlcnRpZmljYXRlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtZ2FwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzc2wtdHlwZVwiIHZhbHVlPVwiaW50ZXJuYWxcIiBjaGVja2VkIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPkludGVybmFsIENBPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlVzZSBDYWRkeSdzIGludGVybmFsIGNlcnRpZmljYXRlIGF1dGhvcml0eSAoc2VsZi1zaWduZWQpPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInNzbC10eXBlXCIgdmFsdWU9XCJsZXRzZW5jcnlwdFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPkxldCdzIEVuY3J5cHQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1oaW50XCI+RnJlZSBwdWJsaWMgU1NMIGNlcnRpZmljYXRlIChyZXF1aXJlcyBwdWJsaWMgZG9tYWluKTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzc2wtdHlwZVwiIHZhbHVlPVwibm9uZVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPk5vIFNTTCAoSFRUUCBvbmx5KTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5cdTI2QTBcdUZFMEYgTm90IHJlY29tbWVuZGVkIC0gdHJhZmZpYyB3aWxsIGJlIHVuZW5jcnlwdGVkPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBNZWRpYSBMaWJyYXJ5IFBhdGggKHNob3duIGZvciBtZWRpYSBhcHBzKSAtLT5cbiAgICAgICAgPGRpdiBpZD1cIm1lZGlhLXBhdGgtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudFwiPlxuICAgICAgICAgICAgXHVEODNEXHVEQ0MxIE1lZGlhIExpYnJhcnkgTG9jYXRpb25cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgICA8IS0tIERldGVjdGVkIG1vdW50cyBmcm9tIGV4aXN0aW5nIG1lZGlhIHNlcnZlcnMgLS0+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZGV0ZWN0ZWQtbW91bnRzLWNvbnRhaW5lclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+XG4gICAgICAgICAgICAgICAgXHUyNzEzIERldGVjdGVkIGZyb20gZXhpc3RpbmcgbWVkaWEgc2VydmVyczpcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJkZXRlY3RlZC1tb3VudHMtbGlzdFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZsZXgtd3JhcDogd3JhcDtcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBhdGggaW5wdXQgd2l0aCBicm93c2UgYnV0dG9uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRlcGxveS1tZWRpYS1wYXRoXCIgcGxhY2Vob2xkZXI9XCIvbWVkaWEvTW92aWVzLCAvbWVkaWEvVFZTaG93c1wiXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWZsZXhcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC45NXJlbTtcIiAvPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImJyb3dzZS1tZWRpYS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgICAgIFx1RDgzRFx1RENDMiBCcm93c2VcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBpZD1cIm1lZGlhLXBhdGgtZGVzY3JpcHRpb25cIiBjbGFzcz1cInRleHQtaGludFwiPlxuICAgICAgICAgICAgICBTZWxlY3QgZm9sZGVycyBmcm9tIGV4aXN0aW5nIHNlcnZlcnMsIGJyb3dzZSwgb3IgdHlwZSBwYXRocyBtYW51YWxseS4gU2VwYXJhdGUgbXVsdGlwbGUgd2l0aCBjb21tYXMuXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBTZWxlY3RlZCBwYXRocyBkaXNwbGF5IC0tPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNlbGVjdGVkLW1lZGlhLXBhdGhzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNnB4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFBsZXggQ2xhaW0gVG9rZW4gKHNob3duIG9ubHkgZm9yIFBsZXggZGVwbG95bWVudHMpIC0tPlxuICAgICAgICA8ZGl2IGlkPVwicGxleC1jbGFpbS1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50XCI+XG4gICAgICAgICAgICBcdUQ4M0RcdUREMTEgUGxleCBDbGFpbSBUb2tlblxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkZXBsb3ktcGxleC1jbGFpbVwiIHBsYWNlaG9sZGVyPVwiY2xhaW0teHh4eHh4eHh4eHh4eHh4eHh4eHhcIlxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmxleFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjk1cmVtO1wiIC8+XG4gICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9wbGV4LnR2L2NsYWltXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogI2U1YTAwZDsgY29sb3I6ICMwMDA7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgR2V0IFRva2VuXG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogI2U1YTAwZDsgbWFyZ2luLXRvcDogNHB4O1wiPlxuICAgICAgICAgICAgVG9rZW4gZXhwaXJlcyBpbiA0IG1pbnV0ZXMhIEdldCBpdCByaWdodCBiZWZvcmUgY2xpY2tpbmcgRGVwbG95LiBMZWF2ZSBlbXB0eSB0byBjb25maWd1cmUgUGxleCBtYW51YWxseSBsYXRlci5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUYWlsc2NhbGUgU2VjdXJpdHkgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJ0YWlsc2NhbGUtc2VjdGlvblwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50XCI+XG4gICAgICAgICAgICBcdUQ4M0RcdUREMTAgVGFpbHNjYWxlIFNlY3VyaXR5XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtZ2FwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZGVwbG95LXRhaWxzY2FsZS1vbmx5XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7IHdpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+VGFpbHNjYWxlLU9ubHkgQWNjZXNzPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlJlc3RyaWN0IHRoaXMgc2VydmljZSB0byBUYWlsc2NhbGUgdXNlcnMgb25seSAoMTAwLngueC54IElQcyk8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBpZD1cInRhaWxzY2FsZS1zdGF0dXNcIiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DaGVja2luZyBUYWlsc2NhbGUgc3RhdHVzLi4uPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQWR2YW5jZWQgT3B0aW9ucyAoQ29sbGFwc2libGUpIC0tPlxuICAgICAgICA8ZGV0YWlscz5cbiAgICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtd2VpZ2h0OiA1MDA7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2OTlcdUZFMEYgQWR2YW5jZWQgT3B0aW9uczwvc3VtbWFyeT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1wb3J0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPkN1c3RvbSBQb3J0IChvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZGVwbG95LXBvcnRcIiBwbGFjZWhvbGRlcj1cIkxlYXZlIGVtcHR5IGZvciBkZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1pbnB1dC1jYXJkXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1pcFwiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDZweDtcIj5UYXJnZXQgSVAgQWRkcmVzczwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZGVwbG95LWlwXCIgdmFsdWU9XCJsb2NhbGhvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWlucHV0LWNhcmRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+XG4gICAgICAgICAgICAgICAgVXNlICdsb2NhbGhvc3QnIGZvciBzYW1lLWhvc3QgY29udGFpbmVycywgb3Igc3BlY2lmaWMgSVAgZm9yIHJlbW90ZSBzZXJ2aWNlc1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBpZD1cInZvbHVtZS1tb3VudHMtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cdUQ4M0RcdURDQzIgVm9sdW1lIE1vdW50czwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgICAgIEN1c3RvbWl6ZSB3aGVyZSBjb250YWluZXIgZGF0YSBpcyBzdG9yZWQgb24gdGhlIGhvc3QuIE1lZGlhIHZvbHVtZXMgYXJlIGNvbmZpZ3VyZWQgYWJvdmUuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwidm9sdW1lLW1vdW50cy1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDhweDtcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XHUyNjk5XHVGRTBGIFJlc291cmNlIExpbWl0czwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgICAgIE9wdGlvbmFsIENQVSBhbmQgbWVtb3J5IGNvbnN0cmFpbnRzLiBMZWF2ZSBhdCAwIGZvciB1bmxpbWl0ZWQuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJkZXBsb3ktY3B1LWxpbWl0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+Q1BVIENvcmVzPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJkZXBsb3ktY3B1LWxpbWl0XCIgdmFsdWU9XCIwXCIgbWluPVwiMFwiIG1heD1cIjY0XCIgc3RlcD1cIjAuMjVcIiBjbGFzcz1cImZvcm0taW5wdXQtY2FyZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgcGxhY2Vob2xkZXI9XCIwID0gdW5saW1pdGVkXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1tZW1vcnktbGltaXRcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDtcIj5NZW1vcnkgKE1CKTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZGVwbG95LW1lbW9yeS1saW1pdFwiIHZhbHVlPVwiMFwiIG1pbj1cIjBcIiBtYXg9XCIxMzEwNzJcIiBzdGVwPVwiNjRcIiBjbGFzcz1cImZvcm0taW5wdXQtY2FyZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgcGxhY2Vob2xkZXI9XCIwID0gdW5saW1pdGVkXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDI0cHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhcHAtZGVwbG95LWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXBwLWRlcGxveS1jb25maXJtXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+XG4gICAgICAgICAgXHVEODNEXHVERTgwIERlcGxveVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBBUFBTX0tFWSA9ICdjdXN0b20tYXBwcyc7XG5cbiAgLy8gQ2FjaGUgZm9yIEFQSSB0ZW1wbGF0ZXNcbiAgbGV0IGFwaVRlbXBsYXRlcyA9IG51bGw7XG4gIGxldCBhcGlDYXRlZ29yaWVzID0gbnVsbDtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItbW9kYWwnKTtcbiAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItZ3JpZCcpO1xuXG4gIC8vIEZldGNoIGFwcCB0ZW1wbGF0ZXMgZnJvbSBBUElcbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hBcHBUZW1wbGF0ZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYXBwcy90ZW1wbGF0ZXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGFwaVRlbXBsYXRlcyA9IGRhdGEudGVtcGxhdGVzO1xuICAgICAgICBhcGlDYXRlZ29yaWVzID0gZGF0YS5jYXRlZ29yaWVzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gRmV0Y2ggVGVtcGxhdGVzJywgZSwgeyBmdW5jdGlvbjogJ2ZldGNoQXBpVGVtcGxhdGVzJyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgcG9ydCBhdmFpbGFiaWxpdHlcbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tQb3J0QXZhaWxhYmlsaXR5KHBvcnQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcHBzL3BvcnRzLyR7cG9ydH0vY2hlY2tgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gQ2hlY2sgUG9ydCcsIGUsIHsgZnVuY3Rpb246ICdjaGVja1BvcnRBdmFpbGFiaWxpdHknIH0pO1xuICAgICAgcmV0dXJuIHsgYXZhaWxhYmxlOiB0cnVlIH07IC8vIEFzc3VtZSBhdmFpbGFibGUgb24gZXJyb3JcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgc3VnZ2VzdGVkIGF2YWlsYWJsZSBwb3J0XG4gIGFzeW5jIGZ1bmN0aW9uIGdldFN1Z2dlc3RlZFBvcnQoYmFzZVBvcnQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcHBzL3BvcnRzLyR7YmFzZVBvcnR9L3N1Z2dlc3RgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnN1Z2dlc3RlZFBvcnQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbQXBwU2VsZWN0b3JdIEdldCBTdWdnZXN0ZWQgUG9ydCcsIGUsIHsgZnVuY3Rpb246ICdnZXRTdWdnZXN0ZWRQb3J0JyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2VQb3J0O1xuICB9XG5cbiAgLy8gQnVpbGQgYXBwIHNlbGVjdG9yIGdyaWQgZnJvbSBBUEkgdGVtcGxhdGVzXG4gIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQXBwU2VsZWN0b3IoKSB7XG4gICAgZ3JpZC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Mb2FkaW5nIGFwcCB0ZW1wbGF0ZXMuLi48L2Rpdj4nO1xuXG4gICAgLy8gRmV0Y2ggdGVtcGxhdGVzIGlmIG5vdCBjYWNoZWRcbiAgICBpZiAoIWFwaVRlbXBsYXRlcykge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGZldGNoQXBwVGVtcGxhdGVzKCk7XG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgZ3JpZC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLWVycm9yKTtcIj5GYWlsZWQgdG8gbG9hZCBhcHAgdGVtcGxhdGVzLiBQbGVhc2UgdHJ5IGFnYWluLjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBncmlkLmlubmVySFRNTCA9ICcnO1xuXG4gICAgLy8gR3JvdXAgdGVtcGxhdGVzIGJ5IGNhdGVnb3J5XG4gICAgY29uc3QgYnlDYXRlZ29yeSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2FwcElkLCB0ZW1wbGF0ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXBpVGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSB0ZW1wbGF0ZS5jYXRlZ29yeSB8fCAnT3RoZXInO1xuICAgICAgaWYgKCFieUNhdGVnb3J5W2NhdGVnb3J5XSkge1xuICAgICAgICBieUNhdGVnb3J5W2NhdGVnb3J5XSA9IFtdO1xuICAgICAgfVxuICAgICAgYnlDYXRlZ29yeVtjYXRlZ29yeV0ucHVzaCh7IGlkOiBhcHBJZCwgLi4udGVtcGxhdGUgfSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBjYXRlZ29yaWVzIGJ5IHRoZSBvcmRlciBpbiBhcGlDYXRlZ29yaWVzIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNhdGVnb3J5T3JkZXIgPSBhcGlDYXRlZ29yaWVzID8gT2JqZWN0LmtleXMoYXBpQ2F0ZWdvcmllcykgOiBPYmplY3Qua2V5cyhieUNhdGVnb3J5KS5zb3J0KCk7XG5cbiAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIGNhdGVnb3J5T3JkZXIpIHtcbiAgICAgIGNvbnN0IGFwcHMgPSBieUNhdGVnb3J5W2NhdGVnb3J5XTtcbiAgICAgIGlmICghYXBwcyB8fCBhcHBzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgIC8vIFNvcnQgYXBwcyBieSBwb3B1bGFyaXR5IChkZXNjZW5kaW5nKVxuICAgICAgYXBwcy5zb3J0KChhLCBiKSA9PiAoYi5wb3B1bGFyaXR5IHx8IDApIC0gKGEucG9wdWxhcml0eSB8fCAwKSk7XG5cbiAgICAgIC8vIENhdGVnb3J5IGhlYWRlciB3aXRoIGljb24gYW5kIGNvbG9yIGZyb20gQVBJXG4gICAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhlYWRlci5jbGFzc05hbWUgPSAnYXBwLWNhdGVnb3J5LWhlYWRlcic7XG4gICAgICBjb25zdCBjYXRlZ29yeUluZm8gPSBhcGlDYXRlZ29yaWVzPy5bY2F0ZWdvcnldIHx8IHt9O1xuICAgICAgaGVhZGVyLmlubmVySFRNTCA9IGAke2VzY2FwZUh0bWwoY2F0ZWdvcnlJbmZvLmljb24gfHwgJycpfSAke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfWA7XG4gICAgICBpZiAoY2F0ZWdvcnlJbmZvLmNvbG9yKSB7XG4gICAgICAgIGhlYWRlci5zdHlsZS5ib3JkZXJCb3R0b21Db2xvciA9IGNhdGVnb3J5SW5mby5jb2xvcjtcbiAgICAgIH1cbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcblxuICAgICAgLy8gQXBwIG9wdGlvbnNcbiAgICAgIGFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgb3B0aW9uLmNsYXNzTmFtZSA9ICdhcHAtb3B0aW9uJztcblxuICAgICAgICAvLyBXaWRnZXQgZW5hYmxlZCBiYWRnZVxuICAgICAgICBjb25zdCBpc1dpZGdldCA9IGFwcC5pc0Rhc2hib2FyZFdpZGdldDtcbiAgICAgICAgY29uc3Qgd2lkZ2V0RW5hYmxlZCA9IGlzV2lkZ2V0ICYmIHNhZmVHZXQoJ3dpZGdldC0nICsgYXBwLmlkICsgJy1lbmFibGVkJykgIT09ICdmYWxzZSc7XG4gICAgICAgIGNvbnN0IHdpZGdldEJhZGdlID0gaXNXaWRnZXRcbiAgICAgICAgICA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjY1cmVtOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi10b3A6IDRweDsgYmFja2dyb3VuZDogJHt3aWRnZXRFbmFibGVkID8gJyMyZWNjNzEzMCcgOiAnI2U3NGMzYzMwJ307IGNvbG9yOiAke3dpZGdldEVuYWJsZWQgPyAnIzJlY2M3MScgOiAnI2U3NGMzYyd9OyBmb250LXdlaWdodDogNjAwO1wiPiR7d2lkZ2V0RW5hYmxlZCA/ICdPTicgOiAnT0ZGJ308L2Rpdj5gXG4gICAgICAgICAgOiAnJztcblxuICAgICAgICAvLyBTaG93IGRpZmZpY3VsdHkgYmFkZ2UgKG5vbi13aWRnZXRzIG9ubHkpXG4gICAgICAgIGNvbnN0IGRpZmZpY3VsdHlCYWRnZSA9ICFpc1dpZGdldCAmJiBhcHAuZGlmZmljdWx0eSA/XG4gICAgICAgICAgYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXRvcDogNHB4OyBiYWNrZ3JvdW5kOiAke1xuICAgICAgICAgICAgYXBwLmRpZmZpY3VsdHkgPT09ICdFYXN5JyA/ICcjMmVjYzcxJyA6XG4gICAgICAgICAgICBhcHAuZGlmZmljdWx0eSA9PT0gJ0ludGVybWVkaWF0ZScgPyAnI2YzOWMxMicgOiAnI2U3NGMzYydcbiAgICAgICAgICB9MjA7IGNvbG9yOiAke1xuICAgICAgICAgICAgYXBwLmRpZmZpY3VsdHkgPT09ICdFYXN5JyA/ICcjMmVjYzcxJyA6XG4gICAgICAgICAgICBhcHAuZGlmZmljdWx0eSA9PT0gJ0ludGVybWVkaWF0ZScgPyAnI2YzOWMxMicgOiAnI2U3NGMzYydcbiAgICAgICAgICB9O1wiPiR7ZXNjYXBlSHRtbChhcHAuZGlmZmljdWx0eSl9PC9kaXY+YCA6ICcnO1xuXG4gICAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24taWNvblwiPiR7ZXNjYXBlSHRtbChhcHAuaWNvbiB8fCAnXHVEODNEXHVEQ0U2Jyl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24tbmFtZVwiPiR7ZXNjYXBlSHRtbChhcHAubmFtZSl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24tZGVzY1wiPiR7ZXNjYXBlSHRtbChhcHAuZGVzY3JpcHRpb24gfHwgJycpfTwvZGl2PlxuICAgICAgICAgICR7d2lkZ2V0QmFkZ2V9JHtkaWZmaWN1bHR5QmFkZ2V9XG4gICAgICAgIGA7XG5cbiAgICAgICAgaWYgKGlzV2lkZ2V0KSB7XG4gICAgICAgICAgb3B0aW9uLm9uY2xpY2sgPSAoKSA9PiB0b2dnbGVEYXNoYm9hcmRXaWRnZXQoYXBwLCBvcHRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbi5vbmNsaWNrID0gKCkgPT4gc2hvd0RlcGxveUNvbmZpZyhhcHApO1xuICAgICAgICB9XG4gICAgICAgIGdyaWQuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciByZWNpcGUgY2FyZHMgYXQgdGhlIGVuZCBvZiB0aGUgZ3JpZFxuICAgIGlmICh3aW5kb3cucmVuZGVyUmVjaXBlQ2FyZHMpIHtcbiAgICAgIGF3YWl0IHdpbmRvdy5yZW5kZXJSZWNpcGVDYXJkcyhncmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBUb2dnbGUgYSBkYXNoYm9hcmQgd2lkZ2V0IG9uL29mZlxuICBmdW5jdGlvbiB0b2dnbGVEYXNoYm9hcmRXaWRnZXQoYXBwLCBvcHRpb25FbCkge1xuICAgIGNvbnN0IGtleSA9ICd3aWRnZXQtJyArIGFwcC5pZCArICctZW5hYmxlZCc7XG4gICAgY29uc3QgY3VycmVudGx5RW5hYmxlZCA9IHNhZmVHZXQoa2V5KSAhPT0gJ2ZhbHNlJztcbiAgICBjb25zdCBuZXdTdGF0ZSA9ICFjdXJyZW50bHlFbmFibGVkO1xuICAgIHNhZmVTZXQoa2V5LCBTdHJpbmcobmV3U3RhdGUpKTtcblxuICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5IGltbWVkaWF0ZWx5XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBhcHAud2lkZ2V0U2VsZWN0b3I7XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgaWYgKGVsKSBlbC5zdHlsZS5kaXNwbGF5ID0gbmV3U3RhdGUgPyAnJyA6ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGJhZGdlIGluIHRoZSBhcHAgc2VsZWN0b3IgY2FyZFxuICAgIGNvbnN0IGJhZGdlID0gb3B0aW9uRWwucXVlcnlTZWxlY3RvcignZGl2W3N0eWxlKj1cImJvcmRlci1yYWRpdXM6IDRweFwiXScpO1xuICAgIGlmIChiYWRnZSkge1xuICAgICAgYmFkZ2UudGV4dENvbnRlbnQgPSBuZXdTdGF0ZSA/ICdPTicgOiAnT0ZGJztcbiAgICAgIGJhZGdlLnN0eWxlLmJhY2tncm91bmQgPSBuZXdTdGF0ZSA/ICcjMmVjYzcxMzAnIDogJyNlNzRjM2MzMCc7XG4gICAgICBiYWRnZS5zdHlsZS5jb2xvciA9IG5ld1N0YXRlID8gJyMyZWNjNzEnIDogJyNlNzRjM2MnO1xuICAgIH1cblxuICAgIHNob3dOb3RpZmljYXRpb24oYCR7YXBwLm5hbWV9IHdpZGdldCAke25ld1N0YXRlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gLCAnc3VjY2VzcycsIDIwMDApO1xuICB9XG5cbiAgLy8gU2hvdyBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24gbW9kYWxcbiAgYXN5bmMgZnVuY3Rpb24gc2hvd0RlcGxveUNvbmZpZyhhcHBUZW1wbGF0ZSkge1xuICAgIGNvbnN0IGRlcGxveU1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcC1kZXBsb3ktbW9kYWwnKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LXRpdGxlJyk7XG4gICAgY29uc3Qgc3ViZG9tYWluSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXN1YmRvbWFpbicpO1xuICAgIGNvbnN0IHVybFByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXVybC1wcmV2aWV3Jyk7XG4gICAgY29uc3QgaXBJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktaXAnKTtcbiAgICBjb25zdCBwb3J0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBvcnQnKTtcbiAgICBjb25zdCB0YWlsc2NhbGVDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktdGFpbHNjYWxlLW9ubHknKTtcbiAgICBjb25zdCB0YWlsc2NhbGVTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFpbHNjYWxlLXN0YXR1cycpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIGNvbnRhaW5lciB3aXRoIHNhbWUgaW1hZ2VcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hlY2tSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2FwcHMvY2hlY2stZXhpc3RpbmcnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhcHBJZDogYXBwVGVtcGxhdGUuaWQgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCBjaGVja1Jlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKGNoZWNrUmVzdWx0LnN1Y2Nlc3MgJiYgY2hlY2tSZXN1bHQuZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNoZWNrUmVzdWx0LmNvbnRhaW5lcjtcbiAgICAgICAgY29uc3QgdXNlRXhpc3RpbmcgPSBjb25maXJtKFxuICAgICAgICAgIGBGb3VuZCBleGlzdGluZyAke2FwcFRlbXBsYXRlLm5hbWV9IGNvbnRhaW5lcjpcXG5cXG5gICtcbiAgICAgICAgICBgQ29udGFpbmVyOiAke2NvbnRhaW5lci5uYW1lfVxcbmAgK1xuICAgICAgICAgIGBTdGF0dXM6ICR7Y29udGFpbmVyLnN0YXR1c31cXG5gICtcbiAgICAgICAgICBgUG9ydDogJHtjb250YWluZXIucHJpbWFyeVBvcnQgfHwgJ04vQSd9XFxuXFxuYCArXG4gICAgICAgICAgYFdvdWxkIHlvdSBsaWtlIHRvIHVzZSB0aGlzIGV4aXN0aW5nIGNvbnRhaW5lcj9cXG5cXG5gICtcbiAgICAgICAgICBgQ2xpY2sgT0sgdG8gY29uZmlndXJlIEROUy9DYWRkeSBmb3IgdGhlIGV4aXN0aW5nIGNvbnRhaW5lci5cXG5gICtcbiAgICAgICAgICBgQ2xpY2sgQ2FuY2VsIHRvIGRlcGxveSBhIG5ldyBjb250YWluZXIuYFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh1c2VFeGlzdGluZykge1xuICAgICAgICAgIC8vIFN0b3JlIGV4aXN0aW5nIGNvbnRhaW5lciBpbmZvIGZvciBkZXBsb3ltZW50XG4gICAgICAgICAgYXBwVGVtcGxhdGUuX3VzZUV4aXN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBhcHBUZW1wbGF0ZS5fZXhpc3RpbmdDb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZ25vcmUgY29udGFpbmVyIGNoZWNrIGVycm9yc1xuICAgIH1cblxuICAgIC8vIFNldCB0aXRsZSB3aXRoIGFwcCBpbmZvXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBgRGVwbG95ICR7YXBwVGVtcGxhdGUubmFtZX1gO1xuXG4gICAgLy8gUHJlLWZpbGwgc3ViZG9tYWluIGZyb20gdGVtcGxhdGUgb3IgYXBwIElEXG4gICAgY29uc3QgZGVmYXVsdFN1YmRvbWFpbiA9IGFwcFRlbXBsYXRlLnN1YmRvbWFpbiB8fCBhcHBUZW1wbGF0ZS5pZC5yZXBsYWNlKC8tL2csICcnKTtcbiAgICBzdWJkb21haW5JbnB1dC52YWx1ZSA9IGRlZmF1bHRTdWJkb21haW47XG5cbiAgICAvLyBTaG93IHN1YnBhdGggY29tcGF0aWJpbGl0eSB3YXJuaW5nIGluIHN1YmRpcmVjdG9yeSBtb2RlXG4gICAgY29uc3Qgc3VicGF0aFdhcm5pbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VicGF0aC1jb21wYXQtd2FybmluZycpO1xuICAgIGlmIChzdWJwYXRoV2FybmluZykge1xuICAgICAgaWYgKFNJVEUucm91dGluZ01vZGUgPT09ICdzdWJkaXJlY3RvcnknKSB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnQgPSBhcHBUZW1wbGF0ZS5zdWJwYXRoU3VwcG9ydCB8fCAnc3RyaXAnO1xuICAgICAgICBpZiAoc3VwcG9ydCA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjk4MDA7XCI+JiM5ODg4OyA8c3Ryb25nPicgKyBhcHBUZW1wbGF0ZS5uYW1lICsgJzwvc3Ryb25nPiBkb2VzIG5vdCBzdXBwb3J0IHN1YmRpcmVjdG9yeSBtb2RlLiBJdCBtYXkgbm90IHdvcmsgY29ycmVjdGx5IGF0IGEgc3VicGF0aC48L3NwYW4+JztcbiAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0ID09PSAnc3RyaXAnKSB7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4mIzk0MzI7ICcgKyBhcHBUZW1wbGF0ZS5uYW1lICsgJyBoYXMgdW52ZXJpZmllZCBzdWJkaXJlY3Rvcnkgc3VwcG9ydC4gSXQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uLjwvc3Bhbj4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1YnBhdGhXYXJuaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnBhdGhXYXJuaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJlLXNlbGVjdCBETlMvU1NMIGZyb20gc2l0ZSBjb25maWcgKHNldCBkdXJpbmcgc2V0dXAgd2l6YXJkKVxuICAgIGNvbnN0IGNmZ0Ruc1R5cGUgPSBTSVRFLmRlZmF1bHRzLmRuc1R5cGUgfHwgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnID8gJ3B1YmxpYycgOiAncHJpdmF0ZScpO1xuICAgIGNvbnN0IGNmZ1NzbFR5cGUgPSBTSVRFLmRlZmF1bHRzLnNzbFR5cGUgfHwgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnID8gJ2xldHNlbmNyeXB0JyA6ICdpbnRlcm5hbCcpO1xuICAgIGNvbnN0IGRuc1JhZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT1cImRucy10eXBlXCJdW3ZhbHVlPVwiJHtjZmdEbnNUeXBlfVwiXWApO1xuICAgIGNvbnN0IHNzbFJhZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT1cInNzbC10eXBlXCJdW3ZhbHVlPVwiJHtjZmdTc2xUeXBlfVwiXWApO1xuICAgIGlmIChkbnNSYWRpbykgZG5zUmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgZWxzZSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl1bdmFsdWU9XCJwcml2YXRlXCJdJykuY2hlY2tlZCA9IHRydWU7XG4gICAgaWYgKHNzbFJhZGlvKSBzc2xSYWRpby5jaGVja2VkID0gdHJ1ZTtcbiAgICBlbHNlIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzc2wtdHlwZVwiXVt2YWx1ZT1cImludGVybmFsXCJdJykuY2hlY2tlZCA9IHRydWU7XG4gICAgaXBJbnB1dC52YWx1ZSA9IFNJVEUuZGVmYXVsdHMudGFyZ2V0SVAgfHwgJ2xvY2FsaG9zdCc7XG4gICAgdGFpbHNjYWxlQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuXG4gICAgLy8gTW92ZSBETlMvU1NMIGludG8gQWR2YW5jZWQgc2VjdGlvbiB3aGVuIGFscmVhZHkgY29uZmlndXJlZFxuICAgIGNvbnN0IGRuc1NlY3Rpb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXBwLWRlcGxveS1tb2RhbCAuZmxleC1jb2wtZ2FwJyk/LmNsb3Nlc3QoJ2RpdicpO1xuICAgIGNvbnN0IGFkdmFuY2VkRGV0YWlscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhcHAtZGVwbG95LW1vZGFsIGRldGFpbHMnKTtcbiAgICBjb25zdCBhZHZhbmNlZENvbnRlbnQgPSBhZHZhbmNlZERldGFpbHM/LnF1ZXJ5U2VsZWN0b3IoJ2RpdicpO1xuICAgIGlmIChhZHZhbmNlZERldGFpbHMgJiYgYWR2YW5jZWRDb250ZW50ICYmIChTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID09PSAncHVibGljJyB8fCBTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID09PSAnaG9tZWxhYicpKSB7XG4gICAgICAvLyBNb3ZlIEROUyBhbmQgU1NMIHNlY3Rpb25zIGluc2lkZSBBZHZhbmNlZFxuICAgICAgY29uc3QgZG5zU2VjdGlvbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2FwcC1kZXBsb3ktbW9kYWwgaW5wdXRbbmFtZT1cImRucy10eXBlXCJdJylbMF0/LmNsb3Nlc3QoJ2Rpdi5mbGV4LWNvbC1nYXAnKT8ucGFyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHNzbFNlY3Rpb25FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNhcHAtZGVwbG95LW1vZGFsIGlucHV0W25hbWU9XCJzc2wtdHlwZVwiXScpWzBdPy5jbG9zZXN0KCdkaXYuZmxleC1jb2wtZ2FwJyk/LnBhcmVudEVsZW1lbnQ7XG4gICAgICBpZiAoZG5zU2VjdGlvbkVsICYmICFkbnNTZWN0aW9uRWwuZGF0YXNldC5tb3ZlZCkge1xuICAgICAgICBhZHZhbmNlZENvbnRlbnQuYXBwZW5kQ2hpbGQoZG5zU2VjdGlvbkVsKTtcbiAgICAgICAgZG5zU2VjdGlvbkVsLmRhdGFzZXQubW92ZWQgPSAnMSc7XG4gICAgICB9XG4gICAgICBpZiAoc3NsU2VjdGlvbkVsICYmICFzc2xTZWN0aW9uRWwuZGF0YXNldC5tb3ZlZCkge1xuICAgICAgICBhZHZhbmNlZENvbnRlbnQuYXBwZW5kQ2hpbGQoc3NsU2VjdGlvbkVsKTtcbiAgICAgICAgc3NsU2VjdGlvbkVsLmRhdGFzZXQubW92ZWQgPSAnMSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG1lZGlhIHBhdGggc2VjdGlvbiBmb3IgbWVkaWEgYXBwc1xuICAgIGNvbnN0IG1lZGlhUGF0aFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVkaWEtcGF0aC1zZWN0aW9uJyk7XG4gICAgY29uc3QgbWVkaWFQYXRoSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LW1lZGlhLXBhdGgnKTtcbiAgICBjb25zdCBtZWRpYVBhdGhEZXNjcmlwdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZWRpYS1wYXRoLWRlc2NyaXB0aW9uJyk7XG5cbiAgICBpZiAoYXBwVGVtcGxhdGUubWVkaWFNb3VudCkge1xuICAgICAgbWVkaWFQYXRoU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIG1lZGlhUGF0aElucHV0LnZhbHVlID0gJyc7XG4gICAgICBtZWRpYVBhdGhJbnB1dC5wbGFjZWhvbGRlciA9ICcvbWVkaWEvTW92aWVzLCAvbWVkaWEvVFZTaG93cyBvciBjbGljayBCcm93c2UnO1xuXG4gICAgICAvLyBGZXRjaCBkZXRlY3RlZCBtb3VudHMgZnJvbSBleGlzdGluZyBtZWRpYSBzZXJ2ZXJzXG4gICAgICBjb25zdCBkZXRlY3RlZE1vdW50c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXRlY3RlZC1tb3VudHMtY29udGFpbmVyJyk7XG4gICAgICBjb25zdCBkZXRlY3RlZE1vdW50c0xpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGV0ZWN0ZWQtbW91bnRzLWxpc3QnKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbW91bnRzUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9tZWRpYS9kZXRlY3RlZC1tb3VudHMnKTtcbiAgICAgICAgY29uc3QgbW91bnRzUmVzdWx0ID0gYXdhaXQgbW91bnRzUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgIGlmIChtb3VudHNSZXN1bHQuc3VjY2VzcyAmJiBtb3VudHNSZXN1bHQubW91bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkZXRlY3RlZE1vdW50c0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICBkZXRlY3RlZE1vdW50c0xpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAvLyBBdXRvLWZpbGwgbWVkaWEgcGF0aCB3aXRoIGFsbCBkZXRlY3RlZCBtb3VudHNcbiAgICAgICAgICBjb25zdCBhdXRvUGF0aHMgPSBbLi4ubmV3IFNldChtb3VudHNSZXN1bHQubW91bnRzLm1hcChtID0+IG0uaG9zdFBhdGgpKV07XG4gICAgICAgICAgbWVkaWFQYXRoSW5wdXQudmFsdWUgPSBhdXRvUGF0aHMuam9pbignLCAnKTtcblxuICAgICAgICAgIG1vdW50c1Jlc3VsdC5tb3VudHMuZm9yRWFjaChtb3VudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICAgIGJ0bi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYXV0b1BhdGhzLmluY2x1ZGVzKG1vdW50Lmhvc3RQYXRoKTtcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0gYHBhZGRpbmc6IDhweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSAke2lzU2VsZWN0ZWQgPyAnNDAlJyA6ICcxNSUnfSwgdmFyKC0tY2FyZC1iZykpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zdWNjZXNzKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiB2YXIoLS1mZyk7YDtcbiAgICAgICAgICAgIGJ0bi5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChtb3VudC5mb2xkZXJOYW1lKX08L3NwYW4+PGJyPjxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+ZnJvbSAke2VzY2FwZUh0bWwobW91bnQuc291cmNlSW1hZ2UpfTwvc3Bhbj5gO1xuICAgICAgICAgICAgYnRuLnRpdGxlID0gYCR7bW91bnQuaG9zdFBhdGh9IChmcm9tICR7bW91bnQuc291cmNlQ29udGFpbmVyfSlgO1xuICAgICAgICAgICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRocyA9IG1lZGlhUGF0aElucHV0LnZhbHVlLnNwbGl0KCcsJykubWFwKHAgPT4gcC50cmltKCkpLmZpbHRlcihwID0+IHApO1xuICAgICAgICAgICAgICBjb25zdCBpZHggPSBjdXJyZW50UGF0aHMuaW5kZXhPZihtb3VudC5ob3N0UGF0aCk7XG4gICAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRocy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMTUlLCB2YXIoLS1jYXJkLWJnKSknO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRocy5wdXNoKG1vdW50Lmhvc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgNDAlLCB2YXIoLS1jYXJkLWJnKSknO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1lZGlhUGF0aElucHV0LnZhbHVlID0gY3VycmVudFBhdGhzLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGV0ZWN0ZWRNb3VudHNMaXN0LmFwcGVuZENoaWxkKGJ0bik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGV0ZWN0ZWRNb3VudHNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkZXRlY3RlZE1vdW50c0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgYnJvd3NlIGJ1dHRvblxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Jyb3dzZS1tZWRpYS1idG4nKS5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICBvcGVuRm9sZGVyQnJvd3NlcihtZWRpYVBhdGhJbnB1dCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBtZWRpYVBhdGhTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBtZWRpYVBhdGhJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldGVjdGVkLW1vdW50cy1jb250YWluZXInKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIFNob3cgUGxleCBjbGFpbSB0b2tlbiBzZWN0aW9uIGZvciBQbGV4IGRlcGxveW1lbnRzXG4gICAgY29uc3QgcGxleENsYWltU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGV4LWNsYWltLXNlY3Rpb24nKTtcbiAgICBpZiAocGxleENsYWltU2VjdGlvbikge1xuICAgICAgaWYgKGFwcFRlbXBsYXRlLmlkID09PSAncGxleCcgfHwgYXBwVGVtcGxhdGUuY2xhaW1Ub2tlbikge1xuICAgICAgICBwbGV4Q2xhaW1TZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBsZXgtY2xhaW0nKS52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGxleENsYWltU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBvcHVsYXRlIHZvbHVtZSBtb3VudHMgaW4gQWR2YW5jZWQgT3B0aW9uc1xuICAgIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndm9sdW1lLW1vdW50cy1zZWN0aW9uJyk7XG4gICAgY29uc3Qgdm9sdW1lTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2b2x1bWUtbW91bnRzLWxpc3QnKTtcbiAgICB2b2x1bWVMaXN0LmlubmVySFRNTCA9ICcnO1xuXG4gICAgaWYgKGFwcFRlbXBsYXRlLmRvY2tlcj8udm9sdW1lcz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBtZWRpYUNvbnRhaW5lclBhdGggPSBhcHBUZW1wbGF0ZS5tZWRpYU1vdW50Py5jb250YWluZXJQYXRoO1xuICAgICAgY29uc3Qgbm9uTWVkaWFWb2x1bWVzID0gYXBwVGVtcGxhdGUuZG9ja2VyLnZvbHVtZXMuZmlsdGVyKHYgPT4gIXYuaW5jbHVkZXMoJ3t7TUVESUFfUEFUSH19JykgJiYgIShtZWRpYUNvbnRhaW5lclBhdGggJiYgdi5lbmRzV2l0aCgnOicgKyBtZWRpYUNvbnRhaW5lclBhdGgpKSk7XG5cbiAgICAgIGlmIChub25NZWRpYVZvbHVtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBub25NZWRpYVZvbHVtZXMuZm9yRWFjaCgodm9sLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgW2hvc3REZWZhdWx0LCBjb250YWluZXJQYXRoXSA9IHZvbC5zcGxpdCgnOicpO1xuICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHJvdy5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGZsZXg7IGdhcDogNnB4OyBhbGlnbi1pdGVtczogY2VudGVyOyc7XG4gICAgICAgICAgcm93LmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwidm9sLWhvc3QtcGF0aFwiIGRhdGEtY29udGFpbmVyLXBhdGg9XCIke2NvbnRhaW5lclBhdGh9XCIgdmFsdWU9XCIke2hvc3REZWZhdWx0fVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIiAvPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuODVyZW07IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XHUyMTkyICR7Y29udGFpbmVyUGF0aH08L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvbC1icm93c2UtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0RcdURDQzI8L2J1dHRvbj5cbiAgICAgICAgICBgO1xuICAgICAgICAgIHZvbHVtZUxpc3QuYXBwZW5kQ2hpbGQocm93KTtcbiAgICAgICAgICByb3cucXVlcnlTZWxlY3RvcignLnZvbC1icm93c2UtYnRuJykub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy52b2wtaG9zdC1wYXRoJyk7XG4gICAgICAgICAgICBvcGVuRm9sZGVyQnJvd3NlcihpbnB1dCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBwb3J0IGZyb20gdGVtcGxhdGUgYW5kIGNoZWNrIGF2YWlsYWJpbGl0eVxuICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gYXBwVGVtcGxhdGUuZGVmYXVsdFBvcnQgfHwgODA4MDtcbiAgICBwb3J0SW5wdXQudmFsdWUgPSAnJztcbiAgICBwb3J0SW5wdXQucGxhY2Vob2xkZXIgPSBgRGVmYXVsdDogJHtkZWZhdWx0UG9ydH1gO1xuXG4gICAgLy8gQWRkIHBvcnQgc3RhdHVzIGVsZW1lbnQgaWYgbm90IGV4aXN0c1xuICAgIGxldCBwb3J0U3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1wb3J0LXN0YXR1cycpO1xuICAgIGlmICghcG9ydFN0YXR1cykge1xuICAgICAgcG9ydFN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcG9ydFN0YXR1cy5pZCA9ICdkZXBsb3ktcG9ydC1zdGF0dXMnO1xuICAgICAgcG9ydFN0YXR1cy5zdHlsZS5jc3NUZXh0ID0gJ2ZvbnQtc2l6ZTogMC44cmVtOyBtYXJnaW4tdG9wOiA0cHg7JztcbiAgICAgIHBvcnRJbnB1dC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHBvcnRTdGF0dXMpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGRlZmF1bHQgcG9ydCBhdmFpbGFiaWxpdHlcbiAgICBhc3luYyBmdW5jdGlvbiBjaGVja0FuZFVwZGF0ZVBvcnRTdGF0dXMoKSB7XG4gICAgICBjb25zdCBwb3J0VG9DaGVjayA9IHBvcnRJbnB1dC52YWx1ZSB8fCBkZWZhdWx0UG9ydDtcbiAgICAgIHBvcnRTdGF0dXMuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DaGVja2luZyBwb3J0Li4uPC9zcGFuPic7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrUG9ydEF2YWlsYWJpbGl0eShwb3J0VG9DaGVjayk7XG4gICAgICBpZiAocmVzdWx0LmF2YWlsYWJsZSkge1xuICAgICAgICBwb3J0U3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNGNhZjUwO1wiPlBvcnQgJHtlc2NhcGVIdG1sKFN0cmluZyhwb3J0VG9DaGVjaykpfSBpcyBhdmFpbGFibGU8L3NwYW4+YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3RlZFBvcnQgPSBhd2FpdCBnZXRTdWdnZXN0ZWRQb3J0KGRlZmF1bHRQb3J0KTtcbiAgICAgICAgcG9ydFN0YXR1cy5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogI2U3NGMzYztcIj5Qb3J0ICR7ZXNjYXBlSHRtbChwb3J0VG9DaGVjayl9IGluIHVzZSBieSAke2VzY2FwZUh0bWwocmVzdWx0LmNvbmZsaWN0Py51c2VkQnkgfHwgJ3Vua25vd24nKX08L3NwYW4+XG4gICAgICAgIGA7XG4gICAgICAgIGNvbnN0IHVzZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICB1c2VCdG4udHlwZSA9ICdidXR0b24nO1xuICAgICAgICB1c2VCdG4udGV4dENvbnRlbnQgPSBgVXNlICR7c3VnZ2VzdGVkUG9ydH1gO1xuICAgICAgICB1c2VCdG4uc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tbGVmdDogOHB4OyBwYWRkaW5nOiAycHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGN1cnNvcjogcG9pbnRlcjsnO1xuICAgICAgICB1c2VCdG4ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBvcnQnKS52YWx1ZSA9IHN1Z2dlc3RlZFBvcnQ7XG4gICAgICAgICAgcG9ydFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzRjYWY1MDtcIj5Vc2luZyBzdWdnZXN0ZWQgcG9ydCAke2VzY2FwZUh0bWwoU3RyaW5nKHN1Z2dlc3RlZFBvcnQpKX08L3NwYW4+YDtcbiAgICAgICAgfTtcbiAgICAgICAgcG9ydFN0YXR1cy5hcHBlbmRDaGlsZCh1c2VCdG4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIHBvcnQgb24gaW5wdXQgY2hhbmdlIChkZWJvdW5jZWQpXG4gICAgbGV0IHBvcnRDaGVja1RpbWVvdXQ7XG4gICAgcG9ydElucHV0Lm9uaW5wdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGNsZWFyVGltZW91dChwb3J0Q2hlY2tUaW1lb3V0KTtcbiAgICAgIHBvcnRDaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrQW5kVXBkYXRlUG9ydFN0YXR1cywgNTAwKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbCBwb3J0IGNoZWNrXG4gICAgY2hlY2tBbmRVcGRhdGVQb3J0U3RhdHVzKCk7XG5cbiAgICAvLyBGZXRjaCBUYWlsc2NhbGUgc3RhdHVzXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdGFpbHNjYWxlL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5pbnN0YWxsZWQgJiYgZGF0YS5jb25uZWN0ZWQpIHtcbiAgICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNGNhZjUwO1wiPkNvbm5lY3RlZDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1sZWZ0OiA4cHg7XCI+JHtkYXRhLnNlbGY/Lmhvc3RuYW1lfSAoJHtkYXRhLnNlbGY/LmlwfSk8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogOHB4O1wiPnwgJHtkYXRhLmRldmljZUNvdW50fSBkZXZpY2VzPC9zcGFuPlxuICAgICAgICBgO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmluc3RhbGxlZCkge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjk4MDA7XCI+Tm90IGNvbm5lY3RlZDwvc3Bhbj5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm90IGF2YWlsYWJsZTwvc3Bhbj5gO1xuICAgICAgICB0YWlsc2NhbGVDaGVja2JveC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q291bGQgbm90IGNoZWNrIHN0YXR1czwvc3Bhbj5gO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBVUkwgcHJldmlldyBpbiByZWFsLXRpbWVcbiAgICBmdW5jdGlvbiB1cGRhdGVVcmxQcmV2aWV3KCkge1xuICAgICAgY29uc3Qgc3ViZG9tYWluID0gc3ViZG9tYWluSW5wdXQudmFsdWUgfHwgJ3N1YmRvbWFpbic7XG4gICAgICBjb25zdCBkbnNUeXBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImRucy10eXBlXCJdOmNoZWNrZWQnKS52YWx1ZTtcbiAgICAgIGNvbnN0IHNzbFR5cGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwic3NsLXR5cGVcIl06Y2hlY2tlZCcpLnZhbHVlO1xuXG4gICAgICBsZXQgdXJsID0gJyc7XG4gICAgICBpZiAoU0lURS5yb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeScgJiYgU0lURS5kb21haW4pIHtcbiAgICAgICAgLy8gU3ViZGlyZWN0b3J5IG1vZGU6IGRvbWFpbi5jb20vYXBwXG4gICAgICAgIHVybCA9IGBodHRwczovLyR7U0lURS5kb21haW59LyR7c3ViZG9tYWlufWA7XG4gICAgICB9IGVsc2UgaWYgKGRuc1R5cGUgPT09ICdwcml2YXRlJykge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNzbFR5cGUgPT09ICdub25lJyA/ICdodHRwJyA6ICdodHRwcyc7XG4gICAgICAgIHVybCA9IGAke3Byb3RvY29sfTovLyR7YnVpbGREb21haW4oc3ViZG9tYWluKX1gO1xuICAgICAgfSBlbHNlIGlmIChkbnNUeXBlID09PSAncHVibGljJykge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNzbFR5cGUgPT09ICdub25lJyA/ICdodHRwJyA6ICdodHRwcyc7XG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IFNJVEUuZG9tYWluIHx8IHN1YmRvbWFpbjtcbiAgICAgICAgdXJsID0gU0lURS5kb21haW4gPyBgJHtwcm90b2NvbH06Ly8ke3N1YmRvbWFpbn0uJHtTSVRFLmRvbWFpbn1gIDogYCR7cHJvdG9jb2x9Oi8vJHtzdWJkb21haW59YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBwb3J0SW5wdXQudmFsdWUgfHwgYXBwVGVtcGxhdGUuZGVmYXVsdFBvcnQgfHwgREMuREVGQVVMVFMuU0VSVklDRV9QT1JUO1xuICAgICAgICB1cmwgPSBgaHR0cDovLyR7aXBJbnB1dC52YWx1ZX06JHtwb3J0fWA7XG4gICAgICB9XG4gICAgICB1cmxQcmV2aWV3LnRleHRDb250ZW50ID0gdXJsO1xuICAgIH1cblxuICAgIC8vIEF0dGFjaCBsaXN0ZW5lcnNcbiAgICBzdWJkb21haW5JbnB1dC5vbmlucHV0ID0gdXBkYXRlVXJsUHJldmlldztcbiAgICBpcElucHV0Lm9uaW5wdXQgPSB1cGRhdGVVcmxQcmV2aWV3O1xuICAgIHBvcnRJbnB1dC5vbmlucHV0ID0gdXBkYXRlVXJsUHJldmlldztcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICAgIHJhZGlvLm9uY2hhbmdlID0gdXBkYXRlVXJsUHJldmlldztcbiAgICB9KTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwic3NsLXR5cGVcIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICAgIHJhZGlvLm9uY2hhbmdlID0gdXBkYXRlVXJsUHJldmlldztcbiAgICB9KTtcblxuICAgIHVwZGF0ZVVybFByZXZpZXcoKTtcblxuICAgIC8vIENsb3NlIGFwcCBzZWxlY3Rvciwgb3BlbiBkZXBsb3kgY29uZmlnXG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIGRlcGxveU1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIFN0b3JlIGFwcCB0ZW1wbGF0ZSBmb3IgZGVwbG95bWVudFxuICAgIGRlcGxveU1vZGFsLmRhdGFzZXQuYXBwVGVtcGxhdGUgPSBKU09OLnN0cmluZ2lmeShhcHBUZW1wbGF0ZSk7XG4gIH1cblxuICAvLyBBZGQgYXBwIHRvIGdyaWQgd2l0aCBmdWxsIERvY2tlciBkZXBsb3ltZW50XG4gIGFzeW5jIGZ1bmN0aW9uIGFkZEFwcFRvR3JpZChkZXBsb3lDb25maWcpIHtcbiAgICBjb25zdCBhcHBUZW1wbGF0ZSA9IGRlcGxveUNvbmZpZy5hcHBUZW1wbGF0ZTtcbiAgICBjb25zdCBjdXN0b21BcHBzID0gc2FmZUdldEpTT04oQVBQU19LRVksIFtdKTtcblxuICAgIC8vIENoZWNrIGlmIHVzaW5nIGV4aXN0aW5nIGNvbnRhaW5lclxuICAgIGNvbnN0IHVzaW5nRXhpc3RpbmcgPSBhcHBUZW1wbGF0ZS5fdXNlRXhpc3RpbmcgJiYgYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyO1xuXG4gICAgLy8gQ2hlY2sgaWYgYXBwIGFscmVhZHkgZXhpc3RzIC0gc2tpcCBpZiB1c2luZyBleGlzdGluZyBjb250YWluZXIgKHVzZXIgYWxyZWFkeSBjb25maXJtZWQpXG4gICAgY29uc3QgZXhpc3RpbmdBcHAgPSBjdXN0b21BcHBzLmZpbmQoYSA9PiBhLmlkID09PSBkZXBsb3lDb25maWcuc3ViZG9tYWluKTtcbiAgICBpZiAoZXhpc3RpbmdBcHAgJiYgIXVzaW5nRXhpc3RpbmcpIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGNvbmZpcm0oYEFuIGFwcCB3aXRoIHN1YmRvbWFpbiBcIiR7ZGVwbG95Q29uZmlnLnN1YmRvbWFpbn1cIiBhbHJlYWR5IGV4aXN0cy4gUmVkZXBsb3k/YCk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgZnJvbSBsb2NhbFN0b3JhZ2UgdG8gYWxsb3cgcmVkZXBsb3ltZW50L3VwZGF0ZVxuICAgIGlmIChleGlzdGluZ0FwcCkge1xuICAgICAgY29uc3QgaW5kZXggPSBjdXN0b21BcHBzLmluZGV4T2YoZXhpc3RpbmdBcHApO1xuICAgICAgY3VzdG9tQXBwcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgc2FmZVNldChBUFBTX0tFWSwgSlNPTi5zdHJpbmdpZnkoY3VzdG9tQXBwcykpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHBvcnQgYXZhaWxhYmlsaXR5IGJlZm9yZSBkZXBsb3ltZW50IChza2lwIGlmIHVzaW5nIGV4aXN0aW5nIGNvbnRhaW5lcilcbiAgICBpZiAoIXVzaW5nRXhpc3RpbmcpIHtcbiAgICAgIGNvbnN0IHBvcnRUb1VzZSA9IGRlcGxveUNvbmZpZy5wb3J0IHx8IGFwcFRlbXBsYXRlLmRlZmF1bHRQb3J0IHx8IDgwODA7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBDaGVja2luZyBwb3J0ICR7cG9ydFRvVXNlfSBhdmFpbGFiaWxpdHkuLi5gLCAnaW5mbycsIDApO1xuXG4gICAgICBjb25zdCBwb3J0Q2hlY2sgPSBhd2FpdCBjaGVja1BvcnRBdmFpbGFiaWxpdHkocG9ydFRvVXNlKTtcbiAgICAgIGlmICghcG9ydENoZWNrLmF2YWlsYWJsZSkge1xuICAgICAgICBjb25zdCBzdWdnZXN0ZWRQb3J0ID0gYXdhaXQgZ2V0U3VnZ2VzdGVkUG9ydChhcHBUZW1wbGF0ZS5kZWZhdWx0UG9ydCB8fCA4MDgwKTtcbiAgICAgICAgY29uc3QgdXNlQWx0ZXJuYXRlID0gY29uZmlybShcbiAgICAgICAgICBgUG9ydCAke3BvcnRUb1VzZX0gaXMgYWxyZWFkeSBpbiB1c2UgYnkgJHtwb3J0Q2hlY2suY29uZmxpY3Q/LnVzZWRCeSB8fCAnYW5vdGhlciBjb250YWluZXInfS5cXG5cXG5gICtcbiAgICAgICAgICBgV291bGQgeW91IGxpa2UgdG8gdXNlIHBvcnQgJHtzdWdnZXN0ZWRQb3J0fSBpbnN0ZWFkP2BcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHVzZUFsdGVybmF0ZSkge1xuICAgICAgICAgIGRlcGxveUNvbmZpZy5wb3J0ID0gc3VnZ2VzdGVkUG9ydDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdEZXBsb3ltZW50IGNhbmNlbGxlZCAtIHBvcnQgY29uZmxpY3QnLCAnZXJyb3InLCA1MDAwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIGV4aXN0aW5nIGNvbnRhaW5lcidzIHBvcnRcbiAgICAgIGRlcGxveUNvbmZpZy5wb3J0ID0gYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyLnByaW1hcnlQb3J0O1xuICAgIH1cbiAgICBzaG93Tm90aWZpY2F0aW9uKFxuICAgICAgdXNpbmdFeGlzdGluZ1xuICAgICAgICA/IGBDb25maWd1cmluZyAke2FwcFRlbXBsYXRlLm5hbWV9IHdpdGggZXhpc3RpbmcgY29udGFpbmVyLi4uYFxuICAgICAgICA6IGBEZXBsb3lpbmcgJHthcHBUZW1wbGF0ZS5uYW1lfS4uLmAsXG4gICAgICAnaW5mbycsIDBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFByZXBhcmUgZGVwbG95bWVudCBjb25maWcgZnJvbSB1c2VyJ3MgY2hvaWNlc1xuICAgICAgY29uc3QgYXBpRGVwbG95Q29uZmlnID0ge1xuICAgICAgICBhcHBJZDogYXBwVGVtcGxhdGUuaWQsXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIHN1YmRvbWFpbjogZGVwbG95Q29uZmlnLnN1YmRvbWFpbixcbiAgICAgICAgICBpcDogZGVwbG95Q29uZmlnLmlwLFxuICAgICAgICAgIGNyZWF0ZURuczogZGVwbG95Q29uZmlnLmRuc1R5cGUgPT09ICdwcml2YXRlJywgIC8vIE9ubHkgY3JlYXRlIEROUyBmb3IgcHJpdmF0ZVxuICAgICAgICAgIHBvcnQ6IGRlcGxveUNvbmZpZy5wb3J0IHx8IGFwcFRlbXBsYXRlLmRlZmF1bHRQb3J0IHx8IG51bGwsICAvLyBVc2UgY3VzdG9tLCB0ZW1wbGF0ZSBkZWZhdWx0LCBvciBudWxsXG4gICAgICAgICAgc3NsVHlwZTogZGVwbG95Q29uZmlnLnNzbFR5cGUsXG4gICAgICAgICAgZG5zVHlwZTogZGVwbG95Q29uZmlnLmRuc1R5cGUsXG4gICAgICAgICAgdGFpbHNjYWxlT25seTogZGVwbG95Q29uZmlnLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2UsICAvLyBUYWlsc2NhbGUtb25seSBhY2Nlc3MgcmVzdHJpY3Rpb25cbiAgICAgICAgICBtZWRpYVBhdGg6IGRlcGxveUNvbmZpZy5tZWRpYVBhdGggfHwgbnVsbCwgIC8vIE1lZGlhIGZvbGRlciBwYXRoIGZvciBtZWRpYSBhcHBzXG4gICAgICAgICAgcGxleENsYWltVG9rZW46IGRlcGxveUNvbmZpZy5wbGV4Q2xhaW1Ub2tlbiB8fCBudWxsLCAgLy8gUGxleCBjbGFpbSB0b2tlbiBmb3IgYXV0by1jbGFpbVxuICAgICAgICAgIGN1c3RvbVZvbHVtZXM6IGRlcGxveUNvbmZpZy5jdXN0b21Wb2x1bWVzIHx8IG51bGwgIC8vIEN1c3RvbSB2b2x1bWUgbW91bnQgb3ZlcnJpZGVzXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEFkZCBleGlzdGluZyBjb250YWluZXIgaW5mbyBpZiB1c2luZyBleGlzdGluZ1xuICAgICAgaWYgKHVzaW5nRXhpc3RpbmcpIHtcbiAgICAgICAgYXBpRGVwbG95Q29uZmlnLmNvbmZpZy51c2VFeGlzdGluZyA9IHRydWU7XG4gICAgICAgIGFwaURlcGxveUNvbmZpZy5jb25maWcuZXhpc3RpbmdDb250YWluZXJJZCA9IGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5pZDtcbiAgICAgICAgYXBpRGVwbG95Q29uZmlnLmNvbmZpZy5leGlzdGluZ1BvcnQgPSBhcHBUZW1wbGF0ZS5fZXhpc3RpbmdDb250YWluZXIucHJpbWFyeVBvcnQ7XG4gICAgICAgIC8vIFVzZSBleGlzdGluZyBjb250YWluZXIncyBwb3J0IGlmIG5vIGN1c3RvbSBwb3J0IHNwZWNpZmllZFxuICAgICAgICBpZiAoIWRlcGxveUNvbmZpZy5wb3J0ICYmIGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5wcmltYXJ5UG9ydCkge1xuICAgICAgICAgIGFwaURlcGxveUNvbmZpZy5jb25maWcucG9ydCA9IGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5wcmltYXJ5UG9ydDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDYWxsIGRlcGxveW1lbnQgQVBJXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2FwcHMvZGVwbG95Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGFwaURlcGxveUNvbmZpZylcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAvLyBBZGQgdG8gc2F2ZWQgYXBwcyAoc3RvcmUgSVAgZm9yIGxhdGVyIGRlbGV0aW9uKVxuICAgICAgICBjb25zdCBuZXdBcHAgPSB7XG4gICAgICAgICAgaWQ6IGRlcGxveUNvbmZpZy5zdWJkb21haW4sICAvLyBVc2Ugc3ViZG9tYWluIGFzIElEXG4gICAgICAgICAgbmFtZTogYXBwVGVtcGxhdGUubmFtZSxcbiAgICAgICAgICBsb2dvOiBgL2Fzc2V0cy8ke2FwcFRlbXBsYXRlLmlkfS5wbmdgLFxuICAgICAgICAgIGNvbnRhaW5lcklkOiByZXN1bHQuY29udGFpbmVySWQsXG4gICAgICAgICAgdXJsOiByZXN1bHQudXJsLFxuICAgICAgICAgIGlwOiBkZXBsb3lDb25maWcuaXAsICAvLyBTdG9yZSBJUCBmb3IgRE5TIHJlY29yZCBkZWxldGlvblxuICAgICAgICAgIGFwcFRlbXBsYXRlOiBhcHBUZW1wbGF0ZS5pZCwgIC8vIFN0b3JlIG9yaWdpbmFsIHRlbXBsYXRlIElEXG4gICAgICAgICAgdGFpbHNjYWxlT25seTogZGVwbG95Q29uZmlnLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2UgIC8vIFRhaWxzY2FsZSBwcm90ZWN0aW9uIHN0YXR1c1xuICAgICAgICB9O1xuICAgICAgICBjdXN0b21BcHBzLnB1c2gobmV3QXBwKTtcbiAgICAgICAgc2FmZVNldChBUFBTX0tFWSwgSlNPTi5zdHJpbmdpZnkoY3VzdG9tQXBwcykpO1xuXG4gICAgICAgIC8vIEFkZCB0byBBUFBTIGFycmF5IGFuZCByZWJ1aWxkIGdyaWRcbiAgICAgICAgLy8gQWNjZXNzIEFQUFMgZnJvbSBwYXJlbnQgc2NvcGUgdmlhIHdpbmRvd1xuICAgICAgICBpZiAod2luZG93LkFQUFMgJiYgIXdpbmRvdy5BUFBTLnNvbWUoYSA9PiBhLmlkID09PSBhcHBUZW1wbGF0ZS5pZCkpIHtcbiAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKG5ld0FwcCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuYnVpbGRHcmlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LnJlZnJlc2hBbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gd2luZG93LnJlZnJlc2hBbGwoKSwgNTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaG93IHN1Y2Nlc3Mgd2l0aCBVUkwgKGFuZCB3YXJuaW5nIGlmIEROUyBmYWlsZWQpXG4gICAgICAgIGxldCBtZXNzYWdlID0gcmVzdWx0LnVzZWRFeGlzdGluZ1xuICAgICAgICAgID8gYCR7YXBwVGVtcGxhdGUubmFtZX0gY29uZmlndXJlZCB3aXRoIGV4aXN0aW5nIGNvbnRhaW5lciFcXG5VUkw6ICR7cmVzdWx0LnVybH1gXG4gICAgICAgICAgOiBgJHthcHBUZW1wbGF0ZS5uYW1lfSBkZXBsb3llZCBzdWNjZXNzZnVsbHkhXFxuVVJMOiAke3Jlc3VsdC51cmx9YDtcbiAgICAgICAgaWYgKHJlc3VsdC53YXJuaW5nKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgXFxuXFxuXHUyNkEwIFdhcm5pbmc6ICR7cmVzdWx0Lndhcm5pbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3dOb3RpZmljYXRpb24obWVzc2FnZSwgJ3N1Y2Nlc3MnLCA4MDAwKTtcblxuICAgICAgICAvLyBDbGVhbiB1cCB0ZW1wb3JhcnkgcHJvcGVydGllc1xuICAgICAgICBkZWxldGUgYXBwVGVtcGxhdGUuX3VzZUV4aXN0aW5nO1xuICAgICAgICBkZWxldGUgYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyO1xuICAgICAgICBcbiAgICAgICAgLy8gRm9yIEhUVFBTIFVSTHMsIGNoZWNrIFNTTCBjZXJ0aWZpY2F0ZSBzdGF0dXNcbiAgICAgICAgaWYgKHJlc3VsdC51cmwgJiYgcmVzdWx0LnVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICAgICAgY2hlY2tTU0xDZXJ0aWZpY2F0ZShyZXN1bHQudXJsLCBhcHBUZW1wbGF0ZS5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNob3cgc2V0dXAgaW5zdHJ1Y3Rpb25zIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAocmVzdWx0LnNldHVwSW5zdHJ1Y3Rpb25zICYmIHJlc3VsdC5zZXR1cEluc3RydWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSByZXN1bHQuc2V0dXBJbnN0cnVjdGlvbnMuam9pbignXFxuJyk7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBTZXR1cCBJbnN0cnVjdGlvbnMgZm9yICR7YXBwVGVtcGxhdGUubmFtZX06ICR7aW5zdHJ1Y3Rpb25zfWAsICdpbmZvJywgMTAwMDApO1xuICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdEZXBsb3ltZW50IGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gRGVwbG95bWVudCcsIGVycm9yLCB7IGZ1bmN0aW9uOiAnZGVwbG95JyB9KTtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oXG4gICAgICAgIGBGYWlsZWQgdG8gZGVwbG95ICR7YXBwVGVtcGxhdGUubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICAnZXJyb3InLFxuICAgICAgICA4MDAwXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIFNTTCBjZXJ0aWZpY2F0ZSBzdGF0dXMgYW5kIG5vdGlmeSB3aGVuIHJlYWR5XG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrU1NMQ2VydGlmaWNhdGUodXJsLCBhcHBOYW1lKSB7XG4gICAgc2hvd05vdGlmaWNhdGlvbihgXHUyM0YzIEdlbmVyYXRpbmcgU1NMIGNlcnRpZmljYXRlIGZvciAke2FwcE5hbWV9Li4uYCwgJ3dhcm5pbmcnLCA2MDAwMCk7XG4gICAgXG4gICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICBjb25zdCBtYXhBdHRlbXB0cyA9IDEyOyAvLyA2MCBzZWNvbmRzIHRvdGFsICg1IHNlY29uZCBpbnRlcnZhbHMpXG4gICAgXG4gICAgY29uc3QgY2hlY2tDZXJ0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgYXR0ZW1wdHMrKztcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVHJ5IHRvIGZldGNoIHRoZSBVUkwgLSBpZiBTU0wgd29ya3MsIHRoaXMgd2lsbCBzdWNjZWVkXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IFxuICAgICAgICAgIG1ldGhvZDogJ0hFQUQnLFxuICAgICAgICAgIG1vZGU6ICduby1jb3JzJyAvLyBBdm9pZCBDT1JTIGlzc3Vlc1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIElmIHdlIGdldCBoZXJlLCBTU0wgaXMgd29ya2luZ1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBcdTI3MDUgJHthcHBOYW1lfSBpcyByZWFkeSEgU1NMIGNlcnRpZmljYXRlIGdlbmVyYXRlZC5gLCAnc3VjY2VzcycsIDUwMDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFNTTCBub3QgcmVhZHkgeWV0XG4gICAgICAgIGlmIChhdHRlbXB0cyA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgc2V0VGltZW91dChjaGVja0NlcnQsIDUwMDApOyAvLyBDaGVjayBhZ2FpbiBpbiA1IHNlY29uZHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgYFx1MjZBMFx1RkUwRiAke2FwcE5hbWV9IGRlcGxveWVkIGJ1dCBTU0wgY2VydGlmaWNhdGUgbWF5IHN0aWxsIGJlIGdlbmVyYXRpbmcuXFxuVHJ5IHJlZnJlc2hpbmcgaW4gYSBtb21lbnQgaWYgeW91IHNlZSBhIGNlcnRpZmljYXRlIGVycm9yLmAsXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAxMDAwMFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gU3RhcnQgY2hlY2tpbmcgYWZ0ZXIgMyBzZWNvbmRzIChnaXZlIENhZGR5IHRpbWUgdG8gc3RhcnQpXG4gICAgc2V0VGltZW91dChjaGVja0NlcnQsIDMwMDApO1xuICB9XG5cbiAgLy8gTG9hZCBjdXN0b20gYXBwcyBvbiBzdGFydHVwXG4gIGZ1bmN0aW9uIGxvYWRDdXN0b21BcHBzKCkge1xuICAgIGNvbnN0IGN1c3RvbUFwcHMgPSBzYWZlR2V0SlNPTihBUFBTX0tFWSwgW10pO1xuICAgIGN1c3RvbUFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgaWYgKCF3aW5kb3cuQVBQUy5zb21lKGEgPT4gYS5pZCA9PT0gYXBwLmlkKSkge1xuICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKGFwcCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBidWlsZEFwcFNlbGVjdG9yKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItY2FuY2VsJykpO1xuXG4gIC8vIERlcGxveSBtb2RhbCBldmVudCBsaXN0ZW5lcnNcbiAgY29uc3QgZGVwbG95TW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwLWRlcGxveS1tb2RhbCcpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBkZXBsb3lNb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LWNvbmZpcm0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgLy8gR2V0IHVzZXIgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGFwcFRlbXBsYXRlID0gSlNPTi5wYXJzZShkZXBsb3lNb2RhbC5kYXRhc2V0LmFwcFRlbXBsYXRlKTtcbiAgICBjb25zdCBtZWRpYVBhdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LW1lZGlhLXBhdGgnKS52YWx1ZS50cmltKCk7XG5cbiAgICAvLyBDb2xsZWN0IGN1c3RvbSB2b2x1bWUgb3ZlcnJpZGVzXG4gICAgY29uc3QgY3VzdG9tVm9sdW1lcyA9IFtdO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN2b2x1bWUtbW91bnRzLWxpc3QgLnZvbC1ob3N0LXBhdGgnKS5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgIGN1c3RvbVZvbHVtZXMucHVzaCh7IGhvc3RQYXRoOiBpbnB1dC52YWx1ZS50cmltKCksIGNvbnRhaW5lclBhdGg6IGlucHV0LmRhdGFzZXQuY29udGFpbmVyUGF0aCB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRlcGxveUNvbmZpZyA9IHtcbiAgICAgIGFwcFRlbXBsYXRlOiBhcHBUZW1wbGF0ZSxcbiAgICAgIHN1YmRvbWFpbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1zdWJkb21haW4nKS52YWx1ZS50cmltKCksXG4gICAgICBkbnNUeXBlOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl06Y2hlY2tlZCcpLnZhbHVlLFxuICAgICAgc3NsVHlwZTogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInNzbC10eXBlXCJdOmNoZWNrZWQnKS52YWx1ZSxcbiAgICAgIGlwOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LWlwJykudmFsdWUudHJpbSgpLFxuICAgICAgcG9ydDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1wb3J0JykudmFsdWUudHJpbSgpLFxuICAgICAgdGFpbHNjYWxlT25seTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS10YWlsc2NhbGUtb25seScpLmNoZWNrZWQsXG4gICAgICBtZWRpYVBhdGg6IG1lZGlhUGF0aCB8fCBudWxsLFxuICAgICAgcGxleENsYWltVG9rZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktcGxleC1jbGFpbScpPy52YWx1ZS50cmltKCkgfHwgbnVsbCxcbiAgICAgIGN1c3RvbVZvbHVtZXM6IGN1c3RvbVZvbHVtZXMubGVuZ3RoID4gMCA/IGN1c3RvbVZvbHVtZXMgOiBudWxsLFxuICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgIGNwdXM6IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1jcHUtbGltaXQnKS52YWx1ZSkgfHwgMCxcbiAgICAgICAgbWVtb3J5OiBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktbWVtb3J5LWxpbWl0JykudmFsdWUpIHx8IDAsXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFZhbGlkYXRlIHN1YmRvbWFpblxuICAgIGlmICghZGVwbG95Q29uZmlnLnN1YmRvbWFpbikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgc3ViZG9tYWluIG9yIGRvbWFpbiBuYW1lJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtZWRpYSBwYXRoIGZvciBtZWRpYSBhcHBzXG4gICAgaWYgKGFwcFRlbXBsYXRlLm1lZGlhTW91bnQ/LnJlcXVpcmVkICYmICFtZWRpYVBhdGgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIG1lZGlhIGxpYnJhcnkgcGF0aCBmb3IgdGhpcyBhcHBsaWNhdGlvbicsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgZGVwbG95IG1vZGFsXG4gICAgZGVwbG95TW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuXG4gICAgLy8gU3RhcnQgZGVwbG95bWVudFxuICAgIGFkZEFwcFRvR3JpZChkZXBsb3lDb25maWcpO1xuICB9KTtcblxuICB3aXJlTW9kYWwoZGVwbG95TW9kYWwpO1xuXG4gIC8vID09PT09IEZPTERFUiBCUk9XU0VSIEZVTkNUSU9OQUxJVFkgPT09PT1cbiAgY29uc3QgZm9sZGVyQnJvd3Nlck1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbGRlci1icm93c2VyLW1vZGFsJyk7XG4gIGNvbnN0IGZvbGRlckJyb3dzZXJQYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbGRlci1icm93c2VyLXBhdGgnKTtcbiAgY29uc3QgZm9sZGVyQnJvd3Nlckxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItbGlzdCcpO1xuICBjb25zdCBmb2xkZXJCcm93c2VyU2VsZWN0ZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItc2VsZWN0ZWQnKTtcbiAgY29uc3QgZm9sZGVyQnJvd3NlclNlbGVjdGVkTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb2xkZXItYnJvd3Nlci1zZWxlY3RlZC1saXN0Jyk7XG4gIGxldCBjdXJyZW50QnJvd3NlclBhdGggPSAnJztcbiAgbGV0IHNlbGVjdGVkRm9sZGVycyA9IFtdO1xuICBsZXQgdGFyZ2V0TWVkaWFJbnB1dCA9IG51bGw7XG5cbiAgd2luZG93Lm9wZW5Gb2xkZXJCcm93c2VyID0gZnVuY3Rpb24obWVkaWFJbnB1dCkge1xuICAgIHRhcmdldE1lZGlhSW5wdXQgPSBtZWRpYUlucHV0O1xuICAgIHNlbGVjdGVkRm9sZGVycyA9IG1lZGlhSW5wdXQudmFsdWUuc3BsaXQoJywnKS5tYXAocCA9PiBwLnRyaW0oKSkuZmlsdGVyKHAgPT4gcCk7XG4gICAgY3VycmVudEJyb3dzZXJQYXRoID0gJyc7XG4gICAgdXBkYXRlU2VsZWN0ZWRGb2xkZXJzRGlzcGxheSgpO1xuICAgIGxvYWRGb2xkZXJDb250ZW50cygnJyk7XG4gICAgZm9sZGVyQnJvd3Nlck1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfTtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkRm9sZGVyQ29udGVudHMocGF0aCkge1xuICAgIGZvbGRlckJyb3dzZXJQYXRoLnRleHRDb250ZW50ID0gcGF0aCB8fCAnU2VsZWN0IGEgZHJpdmUuLi4nO1xuICAgIGZvbGRlckJyb3dzZXJMaXN0LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkxvYWRpbmcuLi48L2Rpdj4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvYnJvd3NlL2RpcmVjdG9yaWVzP3BhdGg9JHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9YCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgZm9sZGVyQnJvd3Nlckxpc3QuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1lcnJvcik7XCI+RXJyb3I6ICR7ZXNjYXBlSHRtbChyZXN1bHQuZXJyb3IpfTwvZGl2PmA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudEJyb3dzZXJQYXRoID0gcmVzdWx0LnBhdGggfHwgJyc7XG4gICAgICBmb2xkZXJCcm93c2VyUGF0aC50ZXh0Q29udGVudCA9IGN1cnJlbnRCcm93c2VyUGF0aCB8fCAnU2VsZWN0IGEgZHJpdmUuLi4nO1xuXG4gICAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgICAvLyBBZGQgcGFyZW50IGZvbGRlciBuYXZpZ2F0aW9uXG4gICAgICBpZiAocmVzdWx0LnBhcmVudCAmJiByZXN1bHQucGFyZW50ICE9PSByZXN1bHQucGF0aCkge1xuICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiZm9sZGVyLWl0ZW1cIiBkYXRhLXBhdGg9XCIke2VzY2FwZUh0bWwocmVzdWx0LnBhcmVudCl9XCIgc3R5bGU9XCJwYWRkaW5nOiAxMnB4IDE2cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjdXJzb3I6IHBvaW50ZXI7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4ycmVtO1wiPlx1MkIwNlx1RkUwRjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Li4gUGFyZW50IERpcmVjdG9yeTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGZvbGRlcnNcbiAgICAgIGlmIChyZXN1bHQuaXRlbXMubGVuZ3RoID09PSAwICYmICFyZXN1bHQucGFyZW50KSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gYnJvd3NlYWJsZSBkcml2ZXMgY29uZmlndXJlZC4gQ2hlY2sgeW91ciBkb2NrZXItY29tcG9zZS55bWwgdm9sdW1lIG1vdW50cy48L2Rpdj4nO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQuaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gc3ViZm9sZGVycyBmb3VuZDwvZGl2Pic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBjb25zdCBpY29uID0gaXRlbS50eXBlID09PSAnZHJpdmUnID8gJ1x1RDgzRFx1RENCRScgOiAnXHVEODNEXHVEQ0MxJztcbiAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gc2VsZWN0ZWRGb2xkZXJzLmluY2x1ZGVzKGl0ZW0ucGF0aCk7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdHlsZSA9IGlzU2VsZWN0ZWQgPyAnYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXN1Y2Nlc3MpIDIwJSwgdHJhbnNwYXJlbnQpOycgOiAnJztcbiAgICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiZm9sZGVyLWl0ZW1cIiBkYXRhLXBhdGg9XCIke2VzY2FwZUh0bWwoaXRlbS5wYXRoKX1cIiBzdHlsZT1cInBhZGRpbmc6IDEycHggMTZweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyAke3NlbGVjdGVkU3R5bGV9XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4ycmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+JHtlc2NhcGVIdG1sKGl0ZW0ubmFtZSl9PC9zcGFuPlxuICAgICAgICAgICAgJHtpc1NlbGVjdGVkID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLXN1Y2Nlc3MpO1wiPlx1MjcxMzwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZvbGRlckJyb3dzZXJMaXN0LmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIC8vIEFkZCBjbGljayBoYW5kbGVyc1xuICAgICAgZm9sZGVyQnJvd3Nlckxpc3QucXVlcnlTZWxlY3RvckFsbCgnLmZvbGRlci1pdGVtJykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBsb2FkRm9sZGVyQ29udGVudHMoaXRlbS5kYXRhc2V0LnBhdGgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgICAgIGl0ZW0uc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1jYXJkLWJnKSc7XG4gICAgICAgIH0pO1xuICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkRm9sZGVycy5pbmNsdWRlcyhpdGVtLmRhdGFzZXQucGF0aCk7XG4gICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kID0gaXNTZWxlY3RlZCA/ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMjAlLCB0cmFuc3BhcmVudCknIDogJyc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZm9sZGVyQnJvd3Nlckxpc3QuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1lcnJvcik7XCI+RmFpbGVkIHRvIGxvYWQ6ICR7ZXNjYXBlSHRtbChlcnJvci5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGVkRm9sZGVyc0Rpc3BsYXkoKSB7XG4gICAgaWYgKHNlbGVjdGVkRm9sZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGZvbGRlckJyb3dzZXJTZWxlY3RlZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb2xkZXJCcm93c2VyU2VsZWN0ZWQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgZm9sZGVyQnJvd3NlclNlbGVjdGVkTGlzdC5pbm5lckhUTUwgPSBzZWxlY3RlZEZvbGRlcnMubWFwKHBhdGggPT4gYFxuICAgICAgPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA2cHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXN1Y2Nlc3MpOyBib3JkZXItcmFkaXVzOiA0cHg7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4O1wiPlxuICAgICAgICAke2VzY2FwZUh0bWwocGF0aCl9XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uY2xpY2s9XCJyZW1vdmVTZWxlY3RlZEZvbGRlcignJHtlc2NhcGVIdG1sKHBhdGgpfScpXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBub25lOyBib3JkZXI6IG5vbmU7IGN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLWVycm9yKTsgZm9udC1zaXplOiAxcmVtOyBwYWRkaW5nOiAwO1wiPlx1MDBENzwvYnV0dG9uPlxuICAgICAgPC9zcGFuPlxuICAgIGApLmpvaW4oJycpO1xuICB9XG5cbiAgd2luZG93LnJlbW92ZVNlbGVjdGVkRm9sZGVyID0gZnVuY3Rpb24ocGF0aCkge1xuICAgIHNlbGVjdGVkRm9sZGVycyA9IHNlbGVjdGVkRm9sZGVycy5maWx0ZXIocCA9PiBwICE9PSBwYXRoKTtcbiAgICB1cGRhdGVTZWxlY3RlZEZvbGRlcnNEaXNwbGF5KCk7XG4gICAgbG9hZEZvbGRlckNvbnRlbnRzKGN1cnJlbnRCcm93c2VyUGF0aCk7IC8vIFJlZnJlc2ggdG8gdXBkYXRlIGNoZWNrbWFya3NcbiAgfTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItc2VsZWN0LWN1cnJlbnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoY3VycmVudEJyb3dzZXJQYXRoICYmICFzZWxlY3RlZEZvbGRlcnMuaW5jbHVkZXMoY3VycmVudEJyb3dzZXJQYXRoKSkge1xuICAgICAgc2VsZWN0ZWRGb2xkZXJzLnB1c2goY3VycmVudEJyb3dzZXJQYXRoKTtcbiAgICAgIHVwZGF0ZVNlbGVjdGVkRm9sZGVyc0Rpc3BsYXkoKTtcbiAgICAgIGxvYWRGb2xkZXJDb250ZW50cyhjdXJyZW50QnJvd3NlclBhdGgpOyAvLyBSZWZyZXNoIHRvIHNob3cgY2hlY2ttYXJrXG4gICAgfVxuICB9KTtcblxuICB3aXJlTW9kYWwoZm9sZGVyQnJvd3Nlck1vZGFsLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItY2FuY2VsJykpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb2xkZXItYnJvd3Nlci1kb25lJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKHRhcmdldE1lZGlhSW5wdXQpIHtcbiAgICAgIHRhcmdldE1lZGlhSW5wdXQudmFsdWUgPSBzZWxlY3RlZEZvbGRlcnMuam9pbignLCAnKTtcbiAgICB9XG4gICAgZm9sZGVyQnJvd3Nlck1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gTG9hZCBjdXN0b20gYXBwcyBvbiBwYWdlIGxvYWRcbiAgbG9hZEN1c3RvbUFwcHMoKTtcbn0pKCk7XG47XG4vLyBSZWNpcGUgU3lzdGVtIFx1MjAxNCBtdWx0aS1jb250YWluZXIgc3RhY2sgZGVwbG95bWVudFxuKGZ1bmN0aW9uKCkge1xuICAvLyA9PT0gUkVDSVBFIERFUExPWSBXSVpBUkQgTU9EQUwgPT09XG4gIGluamVjdE1vZGFsKCdyZWNpcGUtZGVwbG95LW1vZGFsJywgYDxkaXYgaWQ9XCJyZWNpcGUtZGVwbG95LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA2MjBweDsgbWF4LXdpZHRoOiA3NDBweDtcIj5cbiAgICAgIDxoMyBpZD1cInJlY2lwZS1kZXBsb3ktdGl0bGVcIj5EZXBsb3kgUmVjaXBlPC9oMz5cblxuICAgICAgPCEtLSBTdGVwIGluZGljYXRvciAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcHNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4OyBtYXJnaW46IDE2cHggMCAyNHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVjaXBlLXN0ZXAgYWN0aXZlXCIgZGF0YS1zdGVwPVwiMVwiPjxzcGFuPjE8L3NwYW4+IENvbXBvbmVudHM8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY2lwZS1zdGVwXCIgZGF0YS1zdGVwPVwiMlwiPjxzcGFuPjI8L3NwYW4+IENvbmZpZ3VyYXRpb248L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY2lwZS1zdGVwXCIgZGF0YS1zdGVwPVwiM1wiPjxzcGFuPjM8L3NwYW4+IFJldmlldzwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVjaXBlLXN0ZXBcIiBkYXRhLXN0ZXA9XCI0XCI+PHNwYW4+NDwvc3Bhbj4gUHJvZ3Jlc3M8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgMTogQ29tcG9uZW50IFNlbGVjdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0xXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlNlbGVjdCBDb21wb25lbnRzOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtY29tcG9uZW50LWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgbWFyZ2luLXRvcDogOHB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RlcCAyOiBTaGFyZWQgQ29uZmlndXJhdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0yXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxNnB4O1wiPlxuICAgICAgICAgIDwhLS0gU2hhcmVkIHZvbHVtZXMgLS0+XG4gICAgICAgICAgPGRpdiBpZD1cInJlY2lwZS12b2x1bWVzLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+U2hhcmVkIFZvbHVtZXM6PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtdm9sdW1lLWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgbWFyZ2luLXRvcDogOHB4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBUaW1lem9uZSAtLT5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5UaW1lem9uZTo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJyZWNpcGUtdGltZXpvbmVcIiB2YWx1ZT1cIlVUQ1wiIHBsYWNlaG9sZGVyPVwiZS5nLiBBbWVyaWNhL05ld19Zb3JrXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVGFyZ2V0IElQIC0tPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlRhcmdldCBJUCBBZGRyZXNzOjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInJlY2lwZS1pcFwiIHZhbHVlPVwiaG9zdC5kb2NrZXIuaW50ZXJuYWxcIiBwbGFjZWhvbGRlcj1cImxvY2FsaG9zdCBvciBJUFwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+SVAgd2hlcmUgY29udGFpbmVycyBleHBvc2UgcG9ydHM8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVGFpbHNjYWxlIC0tPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJyZWNpcGUtdGFpbHNjYWxlXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPlJlc3RyaWN0IHRvIFRhaWxzY2FsZSBuZXR3b3JrIG9ubHk8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwIDM6IFJldmlldyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0zXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IGlkPVwicmVjaXBlLXJldmlldy1jb250ZW50XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOXJlbTsgbGluZS1oZWlnaHQ6IDEuNztcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgNDogUHJvZ3Jlc3MgLS0+XG4gICAgICA8ZGl2IGlkPVwicmVjaXBlLXN0ZXAtNFwiIGNsYXNzPVwicmVjaXBlLXN0ZXAtcGFuZWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cInJlY2lwZS1wcm9ncmVzcy1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDhweDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInJlY2lwZS1kZXBsb3ktcmVzdWx0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMjBweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlY2lwZS1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlY2lwZS1wcmV2XCIgY2xhc3M9XCJidG4tYWNjZW50XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+QmFjazwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVjaXBlLW5leHRcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIj5OZXh0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgLy8gPT09IFNUQVRFID09PVxuICBsZXQgcmVjaXBlVGVtcGxhdGVzID0gbnVsbDtcbiAgbGV0IHJlY2lwZUNhdGVnb3JpZXMgPSBudWxsO1xuICBsZXQgY3VycmVudFJlY2lwZSA9IG51bGw7XG4gIGxldCBjdXJyZW50U3RlcCA9IDE7XG4gIGxldCBpc1ByZW1pdW0gPSBmYWxzZTtcblxuICBjb25zdCBkZXBsb3lNb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtZGVwbG95LW1vZGFsJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtY2FuY2VsJyk7XG4gIGNvbnN0IHByZXZCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXByZXYnKTtcbiAgY29uc3QgbmV4dEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtbmV4dCcpO1xuXG4gIHdpcmVNb2RhbChkZXBsb3lNb2RhbCwgY2FuY2VsQnRuKTtcblxuICAvLyA9PT0gRkVUQ0ggUkVDSVBFIFRFTVBMQVRFUyA9PT1cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWNpcGVUZW1wbGF0ZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9yZWNpcGVzL3RlbXBsYXRlcycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICByZWNpcGVUZW1wbGF0ZXMgPSBkYXRhLnRlbXBsYXRlcztcbiAgICAgICAgcmVjaXBlQ2F0ZWdvcmllcyA9IGRhdGEuY2F0ZWdvcmllcztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvLyBQcmVtaXVtIHJlcXVpcmVkIFx1MjAxNCB0ZW1wbGF0ZXMgQVBJIGdhdGVkXG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICBpc1ByZW1pdW0gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGZldGNoIHJlY2lwZSB0ZW1wbGF0ZXM6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gPT09IENIRUNLIFBSRU1JVU0gPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrUmVjaXBlUHJlbWl1bSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xpY2Vuc2UvZmVhdHVyZS9yZWNpcGVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBpc1ByZW1pdW0gPSBkYXRhLmF2YWlsYWJsZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGlzUHJlbWl1bSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaXNQcmVtaXVtO1xuICB9XG5cbiAgLy8gPT09IFJFTkRFUiBSRUNJUEUgQ0FSRFMgSU5UTyBBUFAgU0VMRUNUT1IgPT09XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhcHAgc2VsZWN0b3IgdG8gaW5qZWN0IHJlY2lwZSBjYXJkc1xuICB3aW5kb3cucmVuZGVyUmVjaXBlQ2FyZHMgPSBhc3luYyBmdW5jdGlvbihncmlkKSB7XG4gICAgYXdhaXQgY2hlY2tSZWNpcGVQcmVtaXVtKCk7XG5cbiAgICAvLyBCdWlsZCByZWNpcGUgZGF0YSBcdTIwMTQgd2UgY2FuIHNob3cgY2FyZCBtZXRhZGF0YSBldmVuIHdpdGhvdXQgcHJlbWl1bVxuICAgIC8vIChjYXJkcyBqdXN0IHNob3cgYSBsb2NrIGFuZCBwcm9tcHQgdG8gdXBncmFkZSlcbiAgICBsZXQgcmVjaXBlcztcbiAgICBpZiAoaXNQcmVtaXVtICYmIHJlY2lwZVRlbXBsYXRlcykge1xuICAgICAgcmVjaXBlcyA9IHJlY2lwZVRlbXBsYXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2hvdyBoYXJkY29kZWQgcHJldmlldyBjYXJkcyB3aGVuIG5vdCBwcmVtaXVtXG4gICAgICByZWNpcGVzID0gZ2V0UHJldmlld1JlY2lwZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlY2lwZXMgfHwgcmVjaXBlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIENhdGVnb3J5IGhlYWRlclxuICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGhlYWRlci5jbGFzc05hbWUgPSAnYXBwLWNhdGVnb3J5LWhlYWRlcic7XG4gICAgaGVhZGVyLmlubmVySFRNTCA9IGBcXHVEODNFXFx1RERFQSBSZWNpcGVzYDtcbiAgICBoZWFkZXIuc3R5bGUuYm9yZGVyQm90dG9tQ29sb3IgPSAnIzhlNDRhZCc7XG4gICAgZ3JpZC5hcHBlbmRDaGlsZChoZWFkZXIpO1xuXG4gICAgY29uc3QgcmVjaXBlTGlzdCA9IEFycmF5LmlzQXJyYXkocmVjaXBlcykgPyByZWNpcGVzIDogT2JqZWN0LnZhbHVlcyhyZWNpcGVzKTtcbiAgICByZWNpcGVMaXN0LnNvcnQoKGEsIGIpID0+IChiLnBvcHVsYXJpdHkgfHwgMCkgLSAoYS5wb3B1bGFyaXR5IHx8IDApKTtcblxuICAgIGZvciAoY29uc3QgcmVjaXBlIG9mIHJlY2lwZUxpc3QpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgb3B0aW9uLmNsYXNzTmFtZSA9ICdhcHAtb3B0aW9uJztcbiAgICAgIG9wdGlvbi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICAgIGNvbnN0IGNvbXBvbmVudEJhZGdlID0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXRvcDogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDE0Miw2OCwxNzMsMC4yKTsgY29sb3I6ICNhODU1Zjc7XCI+JHtyZWNpcGUuY29tcG9uZW50Q291bnQgfHwgcmVjaXBlLmNvbXBvbmVudHM/Lmxlbmd0aCB8fCAnPyd9IGFwcHM8L2Rpdj5gO1xuXG4gICAgICBjb25zdCBsb2NrT3ZlcmxheSA9ICFpc1ByZW1pdW0gPyBgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA2cHg7IHJpZ2h0OiA2cHg7IGZvbnQtc2l6ZTogMC42NXJlbTsgcGFkZGluZzogMnB4IDhweDsgYm9yZGVyLXJhZGl1czogMTBweDsgYmFja2dyb3VuZDogcmdiYSgyNDEsMTk2LDE1LDAuMik7IGNvbG9yOiAjZjFjNDBmOyBmb250LXdlaWdodDogNjAwO1wiPlBSRU1JVU08L2Rpdj5gIDogJyc7XG5cbiAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgICR7bG9ja092ZXJsYXl9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtb3B0aW9uLWljb25cIj4ke2VzY2FwZUh0bWwocmVjaXBlLmljb24gfHwgJ1xcdUQ4M0VcXHVEREVBJyl9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtb3B0aW9uLW5hbWVcIj4ke2VzY2FwZUh0bWwocmVjaXBlLm5hbWUpfTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW9wdGlvbi1kZXNjXCI+JHtlc2NhcGVIdG1sKHJlY2lwZS5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG4gICAgICAgICR7Y29tcG9uZW50QmFkZ2V9XG4gICAgICBgO1xuXG4gICAgICBvcHRpb24ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFpc1ByZW1pdW0pIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZWNpcGVzIHJlcXVpcmUgYSBEYXNoQ2FkZHkgUHJlbWl1bSBsaWNlbnNlLiBDbGljayB0aGUgTGljZW5zZSBidXR0b24gdG8gYWN0aXZhdGUuJywgJ3dhcm5pbmcnLCA1MDAwKTtcbiAgICAgICAgICBpZiAod2luZG93Lm9wZW5MaWNlbnNlTW9kYWwpIHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9wZW5SZWNpcGVEZXBsb3lXaXphcmQocmVjaXBlKTtcbiAgICAgIH07XG5cbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0UHJldmlld1JlY2lwZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgaWQ6ICdodHBjLXN1aXRlJywgbmFtZTogJ0hUUEMgU3VpdGUnLCBpY29uOiAnXFx1RDgzQ1xcdURGQUMnLCBkZXNjcmlwdGlvbjogJ0NvbXBsZXRlIG1lZGlhIGF1dG9tYXRpb246IGZpbmQsIGRvd25sb2FkLCBvcmdhbml6ZSwgYW5kIHN0cmVhbScsIGNvbXBvbmVudENvdW50OiA2LCBwb3B1bGFyaXR5OiA5OCB9LFxuICAgICAgeyBpZDogJ25leHRjbG91ZC1jb21wbGV0ZScsIG5hbWU6ICdOZXh0Y2xvdWQgQ29tcGxldGUnLCBpY29uOiAnXFx1MjYwMVxcdUZFMEYnLCBkZXNjcmlwdGlvbjogJ0Z1bGwgcHJvZHVjdGl2aXR5IHN1aXRlOiBjbG91ZCBzdG9yYWdlLCBvZmZpY2UgZWRpdGluZywgYW5kIGNvbGxhYm9yYXRpb24nLCBjb21wb25lbnRDb3VudDogNCwgcG9wdWxhcml0eTogOTAgfSxcbiAgICAgIHsgaWQ6ICdzbWFydC1ob21lJywgbmFtZTogJ1NtYXJ0IEhvbWUgSHViJywgaWNvbjogJ1xcdUQ4M0NcXHVERkUwJywgZGVzY3JpcHRpb246ICdIb21lIGF1dG9tYXRpb246IGNvbnRyb2wsIGF1dG9tYXRlLCBhbmQgbW9uaXRvciBJb1QgZGV2aWNlcycsIGNvbXBvbmVudENvdW50OiA0LCBwb3B1bGFyaXR5OiA4OCB9LFxuICAgICAgeyBpZDogJ2Rldi1lbnZpcm9ubWVudCcsIG5hbWU6ICdEZXYgRW52aXJvbm1lbnQnLCBpY29uOiAnXFx1RDgzRFxcdURDQkInLCBkZXNjcmlwdGlvbjogJ1NlbGYtaG9zdGVkIGRldmVsb3BtZW50IHdvcmtmbG93OiBHaXQsIENJL0NELCBJREUsIGFuZCBkYXRhYmFzZScsIGNvbXBvbmVudENvdW50OiA0LCBwb3B1bGFyaXR5OiA4MiB9XG4gICAgXTtcbiAgfVxuXG4gIC8vID09PSBSRUNJUEUgREVQTE9ZIFdJWkFSRCA9PT1cbiAgZnVuY3Rpb24gb3BlblJlY2lwZURlcGxveVdpemFyZChyZWNpcGUpIHtcbiAgICBjdXJyZW50UmVjaXBlID0gcmVjaXBlO1xuICAgIGN1cnJlbnRTdGVwID0gMTtcblxuICAgIC8vIENsb3NlIGFwcCBzZWxlY3RvclxuICAgIGNvbnN0IGFwcFNlbGVjdG9yTW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwLXNlbGVjdG9yLW1vZGFsJyk7XG4gICAgaWYgKGFwcFNlbGVjdG9yTW9kYWwpIGFwcFNlbGVjdG9yTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1kZXBsb3ktdGl0bGUnKS50ZXh0Q29udGVudCA9IGBEZXBsb3kgJHtyZWNpcGUubmFtZX1gO1xuXG4gICAgLy8gUmVzZXQgc3RlcHNcbiAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICByZW5kZXJTdGVwMSgpO1xuXG4gICAgZGVwbG95TW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU3RlcFVJKCkge1xuICAgIC8vIFN0ZXAgaW5kaWNhdG9yc1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNyZWNpcGUtc3RlcHMgLnJlY2lwZS1zdGVwJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gcGFyc2VJbnQoZWwuZGF0YXNldC5zdGVwKTtcbiAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIHN0ZXAgPT09IGN1cnJlbnRTdGVwKTtcbiAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ2NvbXBsZXRlZCcsIHN0ZXAgPCBjdXJyZW50U3RlcCk7XG4gICAgfSk7XG5cbiAgICAvLyBTdGVwIHBhbmVsc1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDQ7IGkrKykge1xuICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcmVjaXBlLXN0ZXAtJHtpfWApO1xuICAgICAgaWYgKHBhbmVsKSBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gaSA9PT0gY3VycmVudFN0ZXAgPyAnJyA6ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBOYXZpZ2F0aW9uIGJ1dHRvbnNcbiAgICBwcmV2QnRuLnN0eWxlLmRpc3BsYXkgPSBjdXJyZW50U3RlcCA+IDEgJiYgY3VycmVudFN0ZXAgPCA0ID8gJycgOiAnbm9uZSc7XG4gICAgaWYgKGN1cnJlbnRTdGVwID09PSA0KSB7XG4gICAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBjYW5jZWxCdG4udGV4dENvbnRlbnQgPSAnQ2xvc2UnO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudFN0ZXAgPT09IDMpIHtcbiAgICAgIG5leHRCdG4udGV4dENvbnRlbnQgPSAnXFx1RDgzRFxcdURFODAgRGVwbG95JztcbiAgICAgIG5leHRCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgY2FuY2VsQnRuLnRleHRDb250ZW50ID0gJ0NhbmNlbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRCdG4udGV4dENvbnRlbnQgPSAnTmV4dCc7XG4gICAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdDYW5jZWwnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgMTogQ29tcG9uZW50IHNlbGVjdGlvblxuICBmdW5jdGlvbiByZW5kZXJTdGVwMSgpIHtcbiAgICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1jb21wb25lbnQtbGlzdCcpO1xuICAgIGxpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBjb25zdCBjb21wb25lbnRzID0gY3VycmVudFJlY2lwZS5jb21wb25lbnRzIHx8IFtdO1xuICAgIGZvciAoY29uc3QgY29tcCBvZiBjb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7JztcblxuICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IGNvbXAucmVxdWlyZWQ7XG4gICAgICBjb25zdCBpc0ludGVybmFsID0gY29tcC5pbnRlcm5hbDtcblxuICAgICAgZWwuaW5uZXJIVE1MID0gYFxuICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgJHtpc1JlcXVpcmVkID8gJ2NoZWNrZWQgZGlzYWJsZWQnIDogJ2NoZWNrZWQnfSBkYXRhLWNvbXBvbmVudC1pZD1cIiR7Y29tcC5pZH1cIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgYWNjZW50LWNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiIC8+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOXJlbTtcIj4ke2VzY2FwZUh0bWwoY29tcC5yb2xlIHx8IGNvbXAuaWQpfTwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICAke2NvbXAudGVtcGxhdGVSZWYgPyBlc2NhcGVIdG1sKGNvbXAudGVtcGxhdGVSZWYpIDogJ0J1aWx0LWluJ31cbiAgICAgICAgICAgICR7aXNSZXF1aXJlZCA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPlJlcXVpcmVkPC9zcGFuPicgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPk9wdGlvbmFsPC9zcGFuPid9XG4gICAgICAgICAgICAke2lzSW50ZXJuYWwgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPihJbnRlcm5hbCk8L3NwYW4+JyA6ICcnfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICR7Y29tcC5ub3RlID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS13YXJuLWZnKTsgbWFyZ2luLXRvcDogNHB4O1wiPlxcdTI2QTAgJHtlc2NhcGVIdG1sKGNvbXAubm90ZSl9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgICBsaXN0LmFwcGVuZENoaWxkKGVsKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGVwIDI6IFNoYXJlZCBjb25maWd1cmF0aW9uXG4gIGZ1bmN0aW9uIHJlbmRlclN0ZXAyKCkge1xuICAgIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXZvbHVtZXMtc2VjdGlvbicpO1xuICAgIGNvbnN0IHZvbHVtZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXZvbHVtZS1saXN0Jyk7XG5cbiAgICBjb25zdCBzaGFyZWRWb2x1bWVzID0gY3VycmVudFJlY2lwZS5zaGFyZWRWb2x1bWVzO1xuICAgIGlmIChzaGFyZWRWb2x1bWVzICYmIE9iamVjdC5rZXlzKHNoYXJlZFZvbHVtZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgdm9sdW1lTGlzdC5pbm5lckhUTUwgPSAnJztcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2b2xdIG9mIE9iamVjdC5lbnRyaWVzKHNoYXJlZFZvbHVtZXMpKSB7XG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGVsLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZ3JpZDsgZ2FwOiA0cHg7JztcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4ke2VzY2FwZUh0bWwodm9sLmxhYmVsIHx8IGtleSl9PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBkYXRhLXZvbHVtZS1rZXk9XCIke2tleX1cIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbCh2b2wuZGVmYXVsdFBhdGggfHwgJycpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiR7ZXNjYXBlSHRtbCh2b2wuZGVmYXVsdFBhdGggfHwgJy9wYXRoJyl9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuODVyZW07XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+JHtlc2NhcGVIdG1sKHZvbC5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG4gICAgICAgIGA7XG4gICAgICAgIHZvbHVtZUxpc3QuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RlcCAzOiBSZXZpZXdcbiAgZnVuY3Rpb24gcmVuZGVyU3RlcDMoKSB7XG4gICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtcmV2aWV3LWNvbnRlbnQnKTtcbiAgICBjb25zdCBzZWxlY3RlZENvbXBvbmVudHMgPSBnZXRTZWxlY3RlZENvbXBvbmVudHMoKTtcblxuICAgIGNvbnN0IHZvbHVtZUlucHV0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNyZWNpcGUtdm9sdW1lLWxpc3QgaW5wdXRbZGF0YS12b2x1bWUta2V5XScpO1xuICAgIGNvbnN0IHZvbHVtZXMgPSB7fTtcbiAgICB2b2x1bWVJbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICB2b2x1bWVzW2lucHV0LmRhdGFzZXQudm9sdW1lS2V5XSA9IGlucHV0LnZhbHVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdHogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXRpbWV6b25lJykudmFsdWUgfHwgJ1VUQyc7XG4gICAgY29uc3QgaXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLWlwJykudmFsdWUgfHwgJ2hvc3QuZG9ja2VyLmludGVybmFsJztcbiAgICBjb25zdCB0YWlsc2NhbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXRhaWxzY2FsZScpLmNoZWNrZWQ7XG5cbiAgICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDFyZW07IG1hcmdpbi1ib3R0b206IDEycHg7XCI+JHtlc2NhcGVIdG1sKGN1cnJlbnRSZWNpcGUubmFtZSl9PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogMTZweDtcIj4ke2VzY2FwZUh0bWwoY3VycmVudFJlY2lwZS5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8c3Ryb25nPkNvbXBvbmVudHMgKCR7c2VsZWN0ZWRDb21wb25lbnRzLmxlbmd0aH0pOjwvc3Ryb25nPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiA0cHg7IG1hcmdpbi10b3A6IDZweDtcIj5cbiAgICAgICAgICAke3NlbGVjdGVkQ29tcG9uZW50cy5tYXAoYyA9PiBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDRweCAwOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICBcXHUyMDIyIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGMucm9sZSB8fCBjLmlkKX08L3N0cm9uZz4gJHtjLmludGVybmFsID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpXCI+KGludGVybmFsKTwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgICR7T2JqZWN0LmtleXModm9sdW1lcykubGVuZ3RoID4gMCA/IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgPHN0cm9uZz5Wb2x1bWVzOjwvc3Ryb25nPlxuICAgICAgICAke09iamVjdC5lbnRyaWVzKHZvbHVtZXMpLm1hcCgoW2ssIHZdKSA9PiBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2t9OiAke2VzY2FwZUh0bWwodil9PC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgIFRpbWV6b25lOiAke2VzY2FwZUh0bWwodHopfSAmYnVsbDsgSVA6ICR7ZXNjYXBlSHRtbChpcCl9ICR7dGFpbHNjYWxlID8gJyZidWxsOyBUYWlsc2NhbGUgb25seScgOiAnJ31cbiAgICAgIDwvZGl2PlxuXG4gICAgICAke2N1cnJlbnRSZWNpcGUubmV0d29yayA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+RG9ja2VyIG5ldHdvcms6IDxjb2RlPiR7ZXNjYXBlSHRtbChjdXJyZW50UmVjaXBlLm5ldHdvcmsubmFtZSl9PC9jb2RlPjwvZGl2PmAgOiAnJ31cbiAgICBgO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnRzKCkge1xuICAgIGNvbnN0IGNoZWNrYm94ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmVjaXBlLWNvbXBvbmVudC1saXN0IGlucHV0W2RhdGEtY29tcG9uZW50LWlkXScpO1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gbmV3IFNldCgpO1xuICAgIGNoZWNrYm94ZXMuZm9yRWFjaChjYiA9PiB7XG4gICAgICBpZiAoY2IuY2hlY2tlZCkgc2VsZWN0ZWRJZHMuYWRkKGNiLmRhdGFzZXQuY29tcG9uZW50SWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQWx3YXlzIGluY2x1ZGUgcmVxdWlyZWQgY29tcG9uZW50c1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSBjdXJyZW50UmVjaXBlLmNvbXBvbmVudHMgfHwgW107XG4gICAgY29tcG9uZW50cy5maWx0ZXIoYyA9PiBjLnJlcXVpcmVkKS5mb3JFYWNoKGMgPT4gc2VsZWN0ZWRJZHMuYWRkKGMuaWQpKTtcblxuICAgIHJldHVybiBjb21wb25lbnRzLmZpbHRlcihjID0+IHNlbGVjdGVkSWRzLmhhcyhjLmlkKSk7XG4gIH1cblxuICAvLyBTdGVwIDQ6IERlcGxveVxuICBhc3luYyBmdW5jdGlvbiBleGVjdXRlRGVwbG95KCkge1xuICAgIGNvbnN0IHByb2dyZXNzTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtcHJvZ3Jlc3MtbGlzdCcpO1xuICAgIGNvbnN0IHJlc3VsdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1kZXBsb3ktcmVzdWx0Jyk7XG4gICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBwcm9ncmVzc0xpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBjb25zdCBzZWxlY3RlZENvbXBvbmVudHMgPSBnZXRTZWxlY3RlZENvbXBvbmVudHMoKTtcblxuICAgIC8vIFNob3cgcHJvZ3Jlc3MgaXRlbXNcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2Ygc2VsZWN0ZWRDb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZWwuaWQgPSBgcmVjaXBlLXByb2dyZXNzLSR7Y29tcC5pZH1gO1xuICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IHBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtOyc7XG4gICAgICBlbC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmVjaXBlLXByb2dyZXNzLWljb25cIiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPlxcdTIzRjM8L3NwYW4+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxOyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChjb21wLnJvbGUgfHwgY29tcC5pZCl9PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInJlY2lwZS1wcm9ncmVzcy1zdGF0dXNcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UXVldWVkPC9zcGFuPlxuICAgICAgYDtcbiAgICAgIHByb2dyZXNzTGlzdC5hcHBlbmRDaGlsZChlbCk7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdCBjb25maWdcbiAgICBjb25zdCB2b2x1bWVJbnB1dHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmVjaXBlLXZvbHVtZS1saXN0IGlucHV0W2RhdGEtdm9sdW1lLWtleV0nKTtcbiAgICBjb25zdCB2b2x1bWVzID0ge307XG4gICAgdm9sdW1lSW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgdm9sdW1lc1tpbnB1dC5kYXRhc2V0LnZvbHVtZUtleV0gPSBpbnB1dC52YWx1ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHNlbGVjdGVkQ29tcG9uZW50czogc2VsZWN0ZWRDb21wb25lbnRzLm1hcChjID0+IGMuaWQpLFxuICAgICAgc2hhcmVkQ29uZmlnOiB7XG4gICAgICAgIGlwOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLWlwJykudmFsdWUgfHwgJ2hvc3QuZG9ja2VyLmludGVybmFsJyxcbiAgICAgICAgdGltZXpvbmU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtdGltZXpvbmUnKS52YWx1ZSB8fCAnVVRDJyxcbiAgICAgICAgdGFpbHNjYWxlT25seTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS10YWlsc2NhbGUnKS5jaGVja2VkLFxuICAgICAgICB2b2x1bWVzXG4gICAgICB9LFxuICAgICAgY29tcG9uZW50T3ZlcnJpZGVzOiB7fVxuICAgIH07XG5cbiAgICAvLyBNYXJrIGFsbCBhcyBkZXBsb3lpbmdcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2Ygc2VsZWN0ZWRDb21wb25lbnRzKSB7XG4gICAgICB1cGRhdGVQcm9ncmVzc0l0ZW0oY29tcC5pZCwgJ2RlcGxveWluZycsICdEZXBsb3lpbmcuLi4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3JlY2lwZXMvZGVwbG95Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVjaXBlSWQ6IGN1cnJlbnRSZWNpcGUuaWQsIGNvbmZpZyB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gTWFyayBkZXBsb3llZCBjb21wb25lbnRzXG4gICAgICAgIGZvciAoY29uc3QgZGVwbG95ZWQgb2YgKGRhdGEuZGVwbG95ZWQgfHwgW10pKSB7XG4gICAgICAgICAgdXBkYXRlUHJvZ3Jlc3NJdGVtKGRlcGxveWVkLmlkLCAnc3VjY2VzcycsIGRlcGxveWVkLnVybCA/IGBSdW5uaW5nIFxcdTIxOTIgJHtkZXBsb3llZC51cmx9YCA6ICdSdW5uaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFyayBlcnJvcnNcbiAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgKGRhdGEuZXJyb3JzIHx8IFtdKSkge1xuICAgICAgICAgIHVwZGF0ZVByb2dyZXNzSXRlbShlcnIuY29tcG9uZW50SWQsICdlcnJvcicsIGVyci5lcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHRFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJlc3VsdEVsLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTRweDsgYm9yZGVyLXJhZGl1czogOHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDQ2LDIwNCwxMTMsMC4xKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSg0NiwyMDQsMTEzLDAuMyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLW9rLWZnKTsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPiR7ZXNjYXBlSHRtbChkYXRhLm1lc3NhZ2UgfHwgJ0RlcGxveWVkIScpfTwvZGl2PlxuICAgICAgICAgICAgJHtkYXRhLnNldHVwSW5zdHJ1Y3Rpb25zID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogOHB4O1wiPlxuICAgICAgICAgICAgICA8c3Ryb25nPlNldHVwIHRpcHM6PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjogNHB4IDAgMCAxNnB4OyBwYWRkaW5nOiAwO1wiPiR7ZGF0YS5zZXR1cEluc3RydWN0aW9ucy5tYXAocyA9PiBgPGxpPiR7ZXNjYXBlSHRtbChzKX08L2xpPmApLmpvaW4oJycpfTwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG5cbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtjdXJyZW50UmVjaXBlLm5hbWV9IHJlY2lwZSBkZXBsb3llZCBzdWNjZXNzZnVsbHkhYCwgJ3N1Y2Nlc3MnLCA1MDAwKTtcblxuICAgICAgICAvLyBSZWZyZXNoIGRhc2hib2FyZFxuICAgICAgICBpZiAod2luZG93LmxvYWRTZXJ2aWNlcykgd2luZG93LmxvYWRTZXJ2aWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE0cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogcmdiYSgyMzEsNzYsNjAsMC4xKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMzEsNzYsNjAsMC4zKTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgPHN0cm9uZz5EZXBsb3ltZW50IGZhaWxlZDo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKX1cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVjaXBlIGRlcGxveW1lbnQgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJywgNTAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgcmVzdWx0RWwuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHJnYmEoMjMxLDc2LDYwLDAuMSk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjMxLDc2LDYwLDAuMyk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICA8c3Ryb25nPk5ldHdvcmsgZXJyb3I6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfVxuICAgICAgPC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQcm9ncmVzc0l0ZW0oY29tcG9uZW50SWQsIHN0YXR1cywgdGV4dCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJlY2lwZS1wcm9ncmVzcy0ke2NvbXBvbmVudElkfWApO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBpY29uID0gZWwucXVlcnlTZWxlY3RvcignLnJlY2lwZS1wcm9ncmVzcy1pY29uJyk7XG4gICAgY29uc3Qgc3RhdHVzRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCcucmVjaXBlLXByb2dyZXNzLXN0YXR1cycpO1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gJ2RlcGxveWluZycpIHtcbiAgICAgIGljb24udGV4dENvbnRlbnQgPSAnXFx1MjNGMyc7XG4gICAgICBzdGF0dXNFbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1hY2NlbnQpJztcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICBpY29uLnRleHRDb250ZW50ID0gJ1xcdTI3MDUnO1xuICAgICAgc3RhdHVzRWwuc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcpJztcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgaWNvbi50ZXh0Q29udGVudCA9ICdcXHUyNzRDJztcbiAgICAgIHN0YXR1c0VsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgIH1cbiAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cblxuICAvLyA9PT0gU1RFUCBOQVZJR0FUSU9OID09PVxuICBuZXh0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMykge1xuICAgICAgY3VycmVudFN0ZXAgPSA0O1xuICAgICAgdXBkYXRlU3RlcFVJKCk7XG4gICAgICBleGVjdXRlRGVwbG95KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50U3RlcCA8IDMpIHtcbiAgICAgIGN1cnJlbnRTdGVwKys7XG4gICAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMikgcmVuZGVyU3RlcDIoKTtcbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMykgcmVuZGVyU3RlcDMoKTtcbiAgICB9XG4gIH0pO1xuXG4gIHByZXZCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnRTdGVwID4gMSAmJiBjdXJyZW50U3RlcCA8IDQpIHtcbiAgICAgIGN1cnJlbnRTdGVwLS07XG4gICAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PSBSRUNJUEUgQ0FSRCBHUk9VUElORyBPTiBEQVNIQk9BUkQgPT09XG4gIC8vIEFmdGVyIGRhc2hib2FyZCBsb2FkcywgZ3JvdXAgY2FyZHMgdGhhdCBzaGFyZSBhIHJlY2lwZUlkXG4gIHdpbmRvdy5ncm91cFJlY2lwZUNhcmRzID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VydmljZS1jYXJkW2RhdGEtcmVjaXBlLWlkXScpO1xuICAgIGlmIChjYXJkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGdyb3VwcyA9IHt9O1xuICAgIGNhcmRzLmZvckVhY2goY2FyZCA9PiB7XG4gICAgICBjb25zdCByZWNpcGVJZCA9IGNhcmQuZGF0YXNldC5yZWNpcGVJZDtcbiAgICAgIGlmICghZ3JvdXBzW3JlY2lwZUlkXSkgZ3JvdXBzW3JlY2lwZUlkXSA9IFtdO1xuICAgICAgZ3JvdXBzW3JlY2lwZUlkXS5wdXNoKGNhcmQpO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBbcmVjaXBlSWQsIGdyb3VwQ2FyZHNdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwcykpIHtcbiAgICAgIGlmIChncm91cENhcmRzLmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBBcHBseSBzdWJ0bGUgdmlzdWFsIGdyb3VwaW5nXG4gICAgICBncm91cENhcmRzLmZvckVhY2goKGNhcmQsIGkpID0+IHtcbiAgICAgICAgY2FyZC5zdHlsZS5ib3JkZXJMZWZ0ID0gJzNweCBzb2xpZCByZ2JhKDE0Miw2OCwxNzMsMC41KSc7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgLy8gQWRkIGEgcmVjaXBlIGxhYmVsIHRvIHRoZSBmaXJzdCBjYXJkXG4gICAgICAgICAgbGV0IGxhYmVsID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcucmVjaXBlLWdyb3VwLWxhYmVsJyk7XG4gICAgICAgICAgaWYgKCFsYWJlbCkge1xuICAgICAgICAgICAgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdyZWNpcGUtZ3JvdXAtbGFiZWwnO1xuICAgICAgICAgICAgbGFiZWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLThweDsgbGVmdDogMTJweDsgZm9udC1zaXplOiAwLjZyZW07IHBhZGRpbmc6IDFweCA4cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogcmdiYSgxNDIsNjgsMTczLDAuMyk7IGNvbG9yOiAjZDRhNWZmOyBmb250LXdlaWdodDogNjAwOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBsZXR0ZXItc3BhY2luZzogMC41cHg7JztcbiAgICAgICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gcmVjaXBlSWQucmVwbGFjZSgvLS9nLCAnICcpO1xuICAgICAgICAgICAgY2FyZC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgICBjYXJkLmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT0gUkVDSVBFIE1BTkFHRU1FTlQgQUNUSU9OUyA9PT1cbiAgd2luZG93Lm1hbmFnZVJlY2lwZSA9IGFzeW5jIGZ1bmN0aW9uKHJlY2lwZUlkLCBhY3Rpb24pIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IGAvYXBpL3YxL3JlY2lwZXMvJHtyZWNpcGVJZH0vJHthY3Rpb259YDtcbiAgICBjb25zdCBtZXRob2QgPSBhY3Rpb24gPT09ICdyZW1vdmUnID8gJ0RFTEVURScgOiAnUE9TVCc7XG4gICAgY29uc3QgdXJsID0gYWN0aW9uID09PSAncmVtb3ZlJyA/IGAvYXBpL3YxL3JlY2lwZXMvJHtyZWNpcGVJZH1gIDogZW5kcG9pbnQ7XG5cbiAgICBpZiAoYWN0aW9uID09PSAncmVtb3ZlJyAmJiAhY29uZmlybShgUmVtb3ZlIHRoZSBlbnRpcmUgJHtyZWNpcGVJZH0gcmVjaXBlPyBUaGlzIHdpbGwgZGVsZXRlIGFsbCBjb250YWluZXJzIGFuZCBjb25maWd1cmF0aW9uLmApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwsIHsgbWV0aG9kIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBSZWNpcGUgJHthY3Rpb259OiAke2RhdGEucmVzdWx0cz8uZmlsdGVyKHIgPT4gci5zdGF0dXMgIT09ICdmYWlsZWQnKS5sZW5ndGggfHwgMH0gY29tcG9uZW50cyBwcm9jZXNzZWRgLCAnc3VjY2VzcycsIDQwMDApO1xuICAgICAgICBpZiAod2luZG93LmxvYWRTZXJ2aWNlcykgd2luZG93LmxvYWRTZXJ2aWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVjaXBlICR7YWN0aW9ufSBmYWlsZWQ6ICR7ZGF0YS5lcnJvcn1gLCAnZXJyb3InLCA1MDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBOZXR3b3JrIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InLCA1MDAwKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09IElOSkVDVCBDU1MgPT09XG4gIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgLnJlY2lwZS1zdGVwIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiA4cHggNHB4O1xuICAgICAgZm9udC1zaXplOiAwLjc4cmVtO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XG4gICAgfVxuICAgIC5yZWNpcGUtc3RlcCBzcGFuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXIpO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgIH1cbiAgICAucmVjaXBlLXN0ZXAuYWN0aXZlIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tYWNjZW50KTtcbiAgICB9XG4gICAgLnJlY2lwZS1zdGVwLmFjdGl2ZSBzcGFuIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7XG4gICAgICBjb2xvcjogI2ZmZjtcbiAgICB9XG4gICAgLnJlY2lwZS1zdGVwLmNvbXBsZXRlZCB7XG4gICAgICBjb2xvcjogdmFyKC0tb2stZmcpO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tb2stZmcpO1xuICAgIH1cbiAgICAucmVjaXBlLXN0ZXAuY29tcGxldGVkIHNwYW4ge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tb2stZmcpO1xuICAgICAgY29sb3I6ICNmZmY7XG4gICAgfVxuICAgIC5yZWNpcGUtc3RlcC1wYW5lbCB7XG4gICAgICBtaW4taGVpZ2h0OiAxODBweDtcbiAgICB9XG4gIGA7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXG4gIC8vID09PSBJTklUID09PVxuICAvLyBQcmUtZmV0Y2ggcHJlbWl1bSBzdGF0dXMgb24gbG9hZFxuICBjaGVja1JlY2lwZVByZW1pdW0oKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENBRERZIFJFTE9BRCBCVVRUT04gPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBSZWxvYWQgQ2FkZHkgYnV0dG9uIGhhbmRsZXJcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidXR0b24udGV4dENvbnRlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1MjNGMyBSZWxvYWRpbmcuLi4nO1xuICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jYWRkeS9yZWxvYWQnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rICYmIHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTI3MDUgUmVsb2FkZWQhJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB9LCAyMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgJ1JlbG9hZCBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1Mjc0QyBGYWlsZWQnO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIHJlbG9hZCBDYWRkeTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9LCAyMDAwKTtcbiAgICB9XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gRVJST1IgTE9HIFZJRVdFUiAoREMtMDUyKSA9PT09PT09PT09XG4vLyBEQy0wNTI6IEFkZHMgTGV2ZWwgLyBDb250ZXh0IC8gU2VhcmNoIC8gVGltZS1yYW5nZSBmaWx0ZXJzLCBzZXJ2ZXItc2lkZVxuLy8gcGFnaW5hdGlvbiB3aXRoIExvYWQgTW9yZSwgY2xpY2stdG8tZXhwYW5kIHN0YWNrIGZyYW1lcywgYW5kIGEgZGlzdGluY3Rcbi8vIGNvbnRleHRzIGRyb3Bkb3duIGJhY2tlZCBieSAvYXBpL3YxL2Vycm9yLWxvZ3MvY29udGV4dHMuIE1pcnJvcnMgdGhlXG4vLyBhdWRpdC1sb2cgVVggKERDLTA1MCkgc28gb3BlcmF0b3JzIGNhbiBkcmlsbCBpbnRvIGEgc3Vic3lzdGVtIGFzIGVhc2lseVxuLy8gYXMgdGhleSBjYW4gYXVkaXQgd2hvLWRpZC13aGF0LlxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTC4gU2FtZSB3ZWF0aGVyLW1vZGFsIHNoZWxsIGFzIGF1ZGl0LWxvZyBzbyBzdHlsZXNcbiAgLy8gYXJlIHNoYXJlZDsgd2lkZXIgbWluLXdpZHRoIGJlY2F1c2UgZXJyb3Igc3RhY2tzIG5lZWQgcm9vbSB0byBicmVhdGhlLlxuICBpbmplY3RNb2RhbCgnZXJyb3ItbG9nLW1vZGFsJywgYDxkaXYgaWQ9XCJlcnJvci1sb2ctbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDk1MHB4OyBtYXgtd2lkdGg6IDExNTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQ0IgRXJyb3IgTG9nczwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIEVycm9ycyBhbmQgd2FybmluZ3MgZnJvbSB0aGUgRGFzaENhZGR5IEFQSS4gQ2xpY2sgYSByb3cgdG8gc2VlIHRoZSBmdWxsIHN0YWNrIHRyYWNlLlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBmbGV4LXdyYXA6IHdyYXA7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5MZXZlbDo8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwiZXJyb3ItbG9nLWxldmVsXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkVSUlwiPkVycm9yczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJXQVJOXCI+V2FybmluZ3M8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiSU5GT1wiPkluZm88L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiREVCVUdcIj5EZWJ1Zzwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkNvbnRleHQ6PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cImVycm9yLWxvZy1jb250ZXh0XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTsgbWF4LXdpZHRoOiAyMjBweDtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogOHB4O1wiPlNlYXJjaDo8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJlcnJvci1sb2ctc2VhcmNoXCIgdHlwZT1cInNlYXJjaFwiIHBsYWNlaG9sZGVyPVwibWVzc2FnZSAvIHN0YWNrIC8gaXBcIiBzdHlsZT1cInBhZGRpbmc6IDVweCA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODJyZW07IG1pbi13aWR0aDogMTgwcHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA4cHg7XCI+U2luY2U6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiZXJyb3ItbG9nLXNpbmNlXCIgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+VW50aWw6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiZXJyb3ItbG9nLXVudGlsXCIgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXJyb3ItbG9nLXJlZnJlc2hcIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj48L3NwYW4+XG4gICAgICAgIDxidXR0b24gaWQ9XCJlcnJvci1sb2ctY2xlYXJcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMnB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGJvcmRlci1jb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cdUQ4M0RcdURERDFcdUZFMEYgQ2xlYXIgTG9nPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImVycm9yLWxvZy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGVycm9yIGxvZ3MuLi48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXJyb3ItbG9nLWxvYWQtbW9yZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogNnB4IDE2cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPkxvYWQgTW9yZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwiZXJyb3ItbG9nLXRvdGFsXCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXJyb3ItbG9nLWNsb3NlXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctbW9kYWwnKTtcbiAgY29uc3Qgdmlld0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3LWVycm9yLWxvZ3MnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctcmVmcmVzaCcpO1xuICBjb25zdCBjbGVhckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctY2xlYXInKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLWNsb3NlJyk7XG4gIGNvbnN0IGxldmVsU2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1sZXZlbCcpO1xuICBjb25zdCBjb250ZXh0U2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1jb250ZXh0Jyk7XG4gIGNvbnN0IHNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1zZWFyY2gnKTtcbiAgY29uc3Qgc2luY2VJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctc2luY2UnKTtcbiAgY29uc3QgdW50aWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctdW50aWwnKTtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1jb250YWluZXInKTtcbiAgY29uc3QgbG9hZE1vcmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLWxvYWQtbW9yZScpO1xuICBjb25zdCB0b3RhbFNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLXRvdGFsJyk7XG5cbiAgY29uc3QgUEFHRV9TSVpFID0gNTA7XG4gIGxldCBjdXJyZW50T2Zmc2V0ID0gMDtcbiAgbGV0IGluZmxpZ2h0ID0gbnVsbDtcbiAgbGV0IGZpbHRlck5vbmNlID0gMDtcbiAgLy8gQ2FjaGVkIGRpc3RpbmN0IGNvbnRleHRzIHNvIHRoZSBkcm9wZG93biBpcyBwb3B1bGF0ZWQgb25jZSBwZXIgb3BlbiBhbmRcbiAgLy8gcmUtcG9wdWxhdGVkIGFmdGVyIGEgY2xlYXIgKHdoaWNoIHJlbW92ZXMgYWxsIGNvbnRleHRzKSBvciBhIHJlZnJlc2hcbiAgLy8gdGhhdCBzdXJmYWNlcyBhIG5ldyBzdWJzeXN0ZW0gZm9yIHRoZSBmaXJzdCB0aW1lLlxuICBsZXQga25vd25Db250ZXh0cyA9IFtdO1xuXG4gIC8vIGRhdGV0aW1lLWxvY2FsIGZpZWxkcyBhcmUgbmFpdmUgbG9jYWwgdGltZSBcdTIwMTQgY29udmVydCB0byBVVEMgSVNPIHNvIHRoZVxuICAvLyBzZXJ2ZXIgY29tcGFyZXMgY29ycmVjdGx5LiBTYW1lIHNoYXBlIGFzIGF1ZGl0LWxvZy5qcyBzbyB0aGUgb3BlcmF0b3JcbiAgLy8gc2VlcyBjb25zaXN0ZW50IGJlaGF2aW91ciBiZXR3ZWVuIHRoZSB0d28gbW9kYWxzLlxuICBmdW5jdGlvbiB0b0lzbyhsb2NhbER0VmFsdWUpIHtcbiAgICBpZiAoIWxvY2FsRHRWYWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGxvY2FsRHRWYWx1ZSk7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKTtcbiAgfVxuXG4gIC8vIFB1bGwgdGhlIGRpc3RpbmN0IGNvbnRleHRzIGxpc3Qgb25jZSBwZXIgb3Blbi4gRmFpbHVyZXMgYXJlIHNpbGVudFxuICAvLyAodGhlIGRyb3Bkb3duIHdpbGwganVzdCBzaG93IFwiQWxsXCIgb25seSkgc28gYSB0cmFuc2llbnQgYmFja2VuZCBoaWNjdXBcbiAgLy8gZG9lc24ndCBibG9jayB0aGUgb3BlcmF0b3IgZnJvbSBzZWVpbmcgdGhlIGFjdHVhbCBlcnJvciByb3dzLlxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoQ29udGV4dHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Vycm9yLWxvZ3MvY29udGV4dHMnKTtcbiAgICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFBcnJheS5pc0FycmF5KGRhdGEuY29udGV4dHMpKSByZXR1cm47XG4gICAgICBrbm93bkNvbnRleHRzID0gZGF0YS5jb250ZXh0cztcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbnRleHRTZWwudmFsdWU7XG4gICAgICBjb250ZXh0U2VsLmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+JztcbiAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhLmNvbnRleHRzKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQudmFsdWUgPSBjLm5hbWU7XG4gICAgICAgIG9wdC50ZXh0Q29udGVudCA9IGAke2MubmFtZX0gKCR7Yy5jb3VudH0pYDtcbiAgICAgICAgY29udGV4dFNlbC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgfVxuICAgICAgLy8gUmVzdG9yZSBwcmV2aW91cyBzZWxlY3Rpb24gaWYgc3RpbGwgcHJlc2VudC5cbiAgICAgIGlmIChjdXJyZW50VmFsdWUgJiYgZGF0YS5jb250ZXh0cy5zb21lKChjKSA9PiBjLm5hbWUgPT09IGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgY29udGV4dFNlbC52YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkUXVlcnkoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKFBBR0VfU0laRSkpO1xuICAgIHBhcmFtcy5zZXQoJ29mZnNldCcsIFN0cmluZyhjdXJyZW50T2Zmc2V0KSk7XG4gICAgaWYgKGxldmVsU2VsLnZhbHVlKSBwYXJhbXMuc2V0KCdsZXZlbCcsIGxldmVsU2VsLnZhbHVlKTtcbiAgICBpZiAoY29udGV4dFNlbC52YWx1ZSkgcGFyYW1zLnNldCgnY29udGV4dCcsIGNvbnRleHRTZWwudmFsdWUpO1xuICAgIGNvbnN0IHNpbmNlID0gdG9Jc28oc2luY2VJbnB1dC52YWx1ZSk7XG4gICAgY29uc3QgdW50aWwgPSB0b0lzbyh1bnRpbElucHV0LnZhbHVlKTtcbiAgICBpZiAoc2luY2UpIHBhcmFtcy5zZXQoJ3NpbmNlJywgc2luY2UpO1xuICAgIGlmICh1bnRpbCkgcGFyYW1zLnNldCgndW50aWwnLCB1bnRpbCk7XG4gICAgY29uc3Qgc2VhcmNoID0gKHNlYXJjaElucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgaWYgKHNlYXJjaCkgcGFyYW1zLnNldCgnc2VhcmNoJywgc2VhcmNoKTtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZExvZ3MoYXBwZW5kKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIGlmIChpbmZsaWdodCkgaW5mbGlnaHQuYWJvcnQoKTtcbiAgICAgICAgaW5mbGlnaHQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGN1cnJlbnRPZmZzZXQgPSAwO1xuICAgICAgICBmaWx0ZXJOb25jZSsrO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5mbGlnaHQpIGluZmxpZ2h0LmFib3J0KCk7XG4gICAgICAgIGluZmxpZ2h0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgfVxuICAgICAgY29uc3QgbXlOb25jZSA9IGZpbHRlck5vbmNlO1xuICAgICAgY29uc3QgcGFyYW1zID0gYnVpbGRRdWVyeSgpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9lcnJvci1sb2dzPycgKyBwYXJhbXMudG9TdHJpbmcoKSwge1xuICAgICAgICBzaWduYWw6IGluZmxpZ2h0LnNpZ25hbCxcbiAgICAgIH0pO1xuICAgICAgLy8gTWlycm9yIGF1ZGl0LWxvZzogc3VyZmFjZSA0eHgvNXh4IGV4cGxpY2l0bHkgaW5zdGVhZCBvZiBmYWxsaW5nXG4gICAgICAvLyB0aHJvdWdoIHRvIGEgbWlzbGVhZGluZyBcIm5vIGVudHJpZXMgeWV0XCIgZW1wdHkgc3RhdGUuXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiBIVFRQICR7cmVzLnN0YXR1c308L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0b3RhbFNwYW4udGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZGF0YS5lcnJvciB8fCAndW5rbm93bicpfTwvZGl2PmA7XG4gICAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHRvdGFsU3Bhbi50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTdGFsZS1yZXNwb25zZSBndWFyZDogYSBub24tYXBwZW5kIGxvYWQgaGFwcGVuZWQgYWZ0ZXIgdGhpcyBmZXRjaCxcbiAgICAgIC8vIGRpc2NhcmQgc28gd2UgZG9uJ3Qgc3BsaWNlIGludG8gdGhlIHdyb25nIERPTS5cbiAgICAgIGlmICghYXBwZW5kICYmIG15Tm9uY2UgIT09IGZpbHRlck5vbmNlKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGxvZ3MgPSBBcnJheS5pc0FycmF5KGRhdGEubG9ncykgPyBkYXRhLmxvZ3MgOiBbXTtcbiAgICAgIGlmIChsb2dzLmxlbmd0aCA9PT0gMCAmJiAhYXBwZW5kKSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IChkYXRhLmZpbHRlcnMgJiYgKGRhdGEuZmlsdGVycy5sZXZlbCB8fCBkYXRhLmZpbHRlcnMuY29udGV4dCB8fCBkYXRhLmZpbHRlcnMuc2VhcmNoIHx8IGRhdGEuZmlsdGVycy5zaW5jZSB8fCBkYXRhLmZpbHRlcnMudW50aWwpKVxuICAgICAgICAgID8gJ05vIGVycm9yIGxvZyBlbnRyaWVzIG1hdGNoIHlvdXIgZmlsdGVycy4nXG4gICAgICAgICAgOiAnXHUyNzA1IE5vIGVycm9ycyBsb2dnZWQhIEV2ZXJ5dGhpbmcgaXMgd29ya2luZyBzbW9vdGhseS4nO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQjwvc3Bhbj4ke2VzY2FwZUh0bWwocmVhc29uKX08L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0b3RhbFNwYW4udGV4dENvbnRlbnQgPSBkYXRhLnRvdGFsID8gYCR7ZGF0YS50b3RhbH0gdG90YWxgIDogJyc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxNjBweDtcIj5XaGVuPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiA4MHB4O1wiPkxldmVsPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxNDBweDtcIj5Db250ZXh0PC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+TWVzc2FnZTwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDogMTEwcHg7XCI+SVA8L3RoPic7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsb2cgb2YgbG9ncykge1xuICAgICAgICBjb25zdCBsZXZlbCA9IChsb2cubGV2ZWwgfHwgJz8nKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBjb25zdCBsZXZlbENvbG9yID0gbGV2ZWwgPT09ICdFUlInID8gJ3ZhcigtLWJhZC1mZyknIDogKGxldmVsID09PSAnV0FSTicgPyAndmFyKC0td2Fybi1mZywgI2YwYzY3NCknIDogJ3ZhcigtLW11dGVkKScpO1xuICAgICAgICBjb25zdCB0cyA9IGxvZy50aW1lc3RhbXAgPyBuZXcgRGF0ZShsb2cudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpIDogJ1x1MjAxNCc7XG4gICAgICAgIGNvbnN0IGN0eCA9IGxvZy5jb250ZXh0IHx8ICdcdTIwMTQnO1xuICAgICAgICBjb25zdCBtc2cgPSAobG9nLmVycm9yIHx8ICcnKS5zcGxpdCgnXFxuJylbMF07XG4gICAgICAgIGNvbnN0IGlwID0gKGxvZy5yZXF1ZXN0ICYmIGxvZy5yZXF1ZXN0LmlwKSB8fCAnJztcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjtcIiBjbGFzcz1cImVycm9yLWxvZy1yb3dcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwobG9nLnRpbWVzdGFtcCB8fCAnJyl9XCI+JHtlc2NhcGVIdG1sKHRzKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiAke2xldmVsQ29sb3J9OyBmb250LXdlaWdodDogNjAwO1wiPiR7ZXNjYXBlSHRtbChsZXZlbCl9PC9zcGFuPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuNzhyZW07XCI+JHtlc2NhcGVIdG1sKGN0eCl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtlc2NhcGVIdG1sKG1zZyl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC43OHJlbTtcIj4ke2VzY2FwZUh0bWwoaXApfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICBpZiAobG9nLmRldGFpbCkge1xuICAgICAgICAgIGh0bWwgKz0gYDx0ciBjbGFzcz1cImVycm9yLWxvZy1kZXRhaWxcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PHRkIGNvbHNwYW49XCI1XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggNnB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48cHJlIHN0eWxlPVwibWFyZ2luOiAwOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IG1heC1oZWlnaHQ6IDMyMHB4OyBvdmVyZmxvdzogYXV0bztcIj4ke2VzY2FwZUh0bWwobG9nLmRldGFpbCl9PC9wcmU+PC90ZD48L3RyPmA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XG4gICAgICAgIGlmICh0YWJsZSkgdGFibGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudE9mZnNldCArPSBsb2dzLmxlbmd0aDtcbiAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSBkYXRhLmhhc01vcmUgPyAnJyA6ICdub25lJztcbiAgICAgIHRvdGFsU3Bhbi50ZXh0Q29udGVudCA9IGAke2RhdGEudG90YWx9IHRvdGFsJHtkYXRhLmhhc01vcmUgPyAnIChzaG93aW5nICcgKyBjdXJyZW50T2Zmc2V0ICsgJyknIDogJyd9YDtcblxuICAgICAgLy8gVG9nZ2xlIGRldGFpbCByb3dzIG9uIGNsaWNrIFx1MjAxNCBzYW1lIHBhdHRlcm4gYXMgYXVkaXQtbG9nLmpzXG4gICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmVycm9yLWxvZy1yb3cnKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgaWYgKHJvdy5kYXRhc2V0LndpcmVkKSByZXR1cm47XG4gICAgICAgIHJvdy5kYXRhc2V0LndpcmVkID0gJ3RydWUnO1xuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGV0YWlsID0gcm93Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICBpZiAoZGV0YWlsICYmIGRldGFpbC5jbGFzc0xpc3QuY29udGFpbnMoJ2Vycm9yLWxvZy1kZXRhaWwnKSkge1xuICAgICAgICAgICAgZGV0YWlsLnN0eWxlLmRpc3BsYXkgPSBkZXRhaWwuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJycgOiAnbm9uZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlICYmIGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgICAgdG90YWxTcGFuLnRleHRDb250ZW50ID0gJyc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xlYXJMb2dzKCkge1xuICAgIGlmICghY29uZmlybSgnQ2xlYXIgdGhlIGVudGlyZSBlcnJvciBsb2c/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9lcnJvci1sb2dzJywge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb25maXJtOiAnQ0xFQVInIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gQWZ0ZXIgYSBjbGVhciwgdGhlIGNvbnRleHRzIGxpc3Qgd2lsbCBiZSBlbXB0eSBcdTIwMTQgcmUtZmV0Y2ggc28gdGhlXG4gICAgICAgIC8vIGRyb3Bkb3duIHJlZmxlY3RzIHJlYWxpdHkuIExvYWQgdGhlIG5vdy1lbXB0eSBwYWdlIGluIHBhcmFsbGVsLlxuICAgICAgICBhd2FpdCByZWZyZXNoQ29udGV4dHMoKTtcbiAgICAgICAgbG9hZExvZ3MoZmFsc2UpO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdcdTI3MDUgRXJyb3IgbG9ncyBjbGVhcmVkJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1x1Mjc0QyAnICsgKGRhdGEuZXJyb3IgfHwgJ0NsZWFyIGZhaWxlZCcpLCAnZXJyb3InLCA0MDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdcdTI3NEMgJyArIGUubWVzc2FnZSwgJ2Vycm9yJywgNDAwMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVib3VuY2UgdGV4dC1pbnB1dCBjaGFuZ2VzIHNvIHdlIGRvbid0IHJlZmV0Y2ggb24gZXZlcnkga2V5c3Ryb2tlLlxuICBsZXQgc2VhcmNoRGVib3VuY2U7XG4gIGZ1bmN0aW9uIHdpcmVGaWx0ZXJzKCkge1xuICAgIGxldmVsU2VsPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiBsb2FkTG9ncyhmYWxzZSkpO1xuICAgIGNvbnRleHRTZWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IGxvYWRMb2dzKGZhbHNlKSk7XG4gICAgc2VhcmNoSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHNlYXJjaERlYm91bmNlKTtcbiAgICAgIHNlYXJjaERlYm91bmNlID0gc2V0VGltZW91dCgoKSA9PiBsb2FkTG9ncyhmYWxzZSksIDI1MCk7XG4gICAgfSk7XG4gICAgbGV0IGRhdGVEZWJvdW5jZTtcbiAgICBbc2luY2VJbnB1dCwgdW50aWxJbnB1dF0uZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dChkYXRlRGVib3VuY2UpO1xuICAgICAgICBkYXRlRGVib3VuY2UgPSBzZXRUaW1lb3V0KCgpID0+IGxvYWRMb2dzKGZhbHNlKSwgMjUwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbG9hZExvZ3MoZmFsc2UpKTtcbiAgICBsb2FkTW9yZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBsb2FkTG9ncyh0cnVlKSk7XG4gICAgY2xlYXJCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xlYXJMb2dzKTtcbiAgICB3aXJlTW9kYWwobW9kYWwsIGNsb3NlQnRuKTtcbiAgfVxuXG4gIHZpZXdCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgYXdhaXQgcmVmcmVzaENvbnRleHRzKCk7XG4gICAgbG9hZExvZ3MoZmFsc2UpO1xuICB9KTtcbiAgd2lyZUZpbHRlcnMoKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENPTlRBSU5FUiBMT0cgVklFV0VSID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2NvbnRhaW5lci1sb2dzLW1vZGFsJywgYDxkaXYgaWQ9XCJjb250YWluZXItbG9ncy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiIHN0eWxlPVwiei1pbmRleDogMTAwMTtcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDkwMHB4OyBtYXgtd2lkdGg6IDk1dnc7IGhlaWdodDogODB2aDsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWhlYWRlclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBwYWRkaW5nLWJvdHRvbTogMTJweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwO1wiPlx1RDgzRFx1RENEQyBDb250YWluZXIgTG9nczwvaDM+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOiA0cHggMCAwIDA7IGZvbnQtc2l6ZTogMC44NXJlbTsgb3BhY2l0eTogMC43O1wiPlZpZXcgYW5kIHN0cmVhbSBEb2NrZXIgY29udGFpbmVyIGxvZ3M8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9ncy1jb250cm9sc1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImNsLWNvbnRhaW5lci1zZWxlY3RcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgbWluLXdpZHRoOiAyMDBweDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgYSBjb250YWluZXIuLi48L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNsLWxvZy1zZWFyY2hcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBsb2dzLi4uXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IHdpZHRoOiAxNTBweDtcIiAvPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJjbC1sb2ctdGFpbFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjUwXCI+TGFzdCA1MCBsaW5lczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEwMFwiIHNlbGVjdGVkPkxhc3QgMTAwIGxpbmVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiNTAwXCI+TGFzdCA1MDAgbGluZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMDAwXCI+TGFzdCAxMDAwIGxpbmVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWxsXCI+QWxsIGxvZ3M8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY2wtcmVmcmVzaFwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjbC1zdHJlYW1cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XHUyNUI2IFN0cmVhbTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjbC1kb3dubG9hZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdURDQkUgRG93bmxvYWQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY2wtY2xlYXItc2VhcmNoXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiIHRpdGxlPVwiQ2xlYXIgc2VhcmNoXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNsLWNsb3NlXCIgY2xhc3M9XCJjbG9zZS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4O1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGlkPVwiY2wtY29udGFpbmVyLWluZm9cIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMTZweDsgbWFyZ2luLWJvdHRvbTogMTJweDsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWJnLXNlY29uZGFyeSwgdmFyKC0tYmcpKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODJyZW07XCI+XG4gICAgICAgIDxzcGFuPjxzdHJvbmc+SW1hZ2U6PC9zdHJvbmc+IDxzcGFuIGlkPVwiY2wtaW1hZ2VcIj4tPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+PHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IDxzcGFuIGlkPVwiY2wtc3RhdHVzXCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICAgIDxzcGFuPjxzdHJvbmc+Q3JlYXRlZDo8L3N0cm9uZz4gPHNwYW4gaWQ9XCJjbC1jcmVhdGVkXCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBpZD1cImNsLWxvZy1jb250ZW50XCIgY2xhc3M9XCJsb2dzLWNvbnRlbnQgc2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwiZmxleDogMTsgbWluLWhlaWdodDogMDsgYmFja2dyb3VuZDogIzFhMWExYTsgYm9yZGVyLXJhZGl1czogNnB4OyBwYWRkaW5nOiAxMnB4OyBmb250LWZhbWlseTogJ01vbmFjbycsICdNZW5sbycsICdVYnVudHUgTW9ubycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjc4cmVtOyBvdmVyZmxvdzogYXV0bztcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGxvZ3M8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGlkPVwiY2wtc3RyZWFtLXN0YXR1c1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLW9rLWJnLCAjMWEzYTFhKTsgY29sb3I6IHZhcigtLW9rLWZnLCAjNGFkZTgwKTsgYm9yZGVyLXJhZGl1czogNnB4OyBtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJjbC1zdHJlYW0taW5kaWNhdG9yXCI+XHVEODNEXHVERDM0PC9zcGFuPiA8c3BhbiBpZD1cImNsLXN0cmVhbS10ZXh0XCI+RGlzY29ubmVjdGVkPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICA8c3BhbiBpZD1cImNsLWxpbmUtY291bnRcIj4wIGxpbmVzPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnw8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJjbC1maWx0ZXItY291bnRcIj4wIGZpbHRlcmVkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsLWNsb3NlLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyLWxvZ3MtbW9kYWwnKTtcbiAgY29uc3QgY29udGFpbmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbnRhaW5lci1zZWxlY3QnKTtcbiAgY29uc3QgbG9nQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sb2ctY29udGVudCcpO1xuICBjb25zdCBsb2dTZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtbG9nLXNlYXJjaCcpO1xuICBjb25zdCBsb2dUYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxvZy10YWlsJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtcmVmcmVzaCcpO1xuICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtc3RyZWFtJyk7XG4gIGNvbnN0IGRvd25sb2FkQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWRvd25sb2FkJyk7XG4gIGNvbnN0IGNsZWFyU2VhcmNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNsZWFyLXNlYXJjaCcpO1xuICBjb25zdCBjbG9zZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jbG9zZScpO1xuICBjb25zdCBjbG9zZUJ0bjIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY2xvc2UtYnRuJyk7XG4gIGNvbnN0IHN0cmVhbVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zdHJlYW0tc3RhdHVzJyk7XG4gIGNvbnN0IHN0cmVhbUluZGljYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zdHJlYW0taW5kaWNhdG9yJyk7XG4gIGNvbnN0IHN0cmVhbVRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtc3RyZWFtLXRleHQnKTtcbiAgY29uc3QgbGluZUNvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxpbmUtY291bnQnKTtcbiAgY29uc3QgZmlsdGVyQ291bnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtZmlsdGVyLWNvdW50Jyk7XG4gIFxuICAvLyBDb250YWluZXIgaW5mbyBlbGVtZW50c1xuICBjb25zdCBpbWFnZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWltYWdlJyk7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXN0YXR1cycpO1xuICBjb25zdCBjcmVhdGVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY3JlYXRlZCcpO1xuXG4gIGxldCBjdXJyZW50Q29udGFpbmVySWQgPSBudWxsO1xuICBsZXQgY3VycmVudExvZ3MgPSBbXTtcbiAgbGV0IGZpbHRlcmVkTG9ncyA9IFtdO1xuICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuICBsZXQgaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgbGV0IHNlYXJjaFRpbWVvdXQgPSBudWxsO1xuXG4gIC8vIEZvcm1hdCBkYXRlXG4gIGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZVN0cikge1xuICAgIGlmICghZGF0ZVN0cikgcmV0dXJuICctJztcbiAgICBjb25zdCBkID0gbmV3IERhdGUoZGF0ZVN0cik7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIGRhdGVTdHI7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoKTtcbiAgfVxuXG4gIC8vIEVzY2FwZSBIVE1MXG4gIGZ1bmN0aW9uIGVzY2FwZUh0bWwoc3RyKSB7XG4gICAgaWYgKCFzdHIpIHJldHVybiAnJztcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBzdHI7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICAvLyBGb3JtYXQgbG9nIGVudHJ5IGZvciBkaXNwbGF5XG4gIGZ1bmN0aW9uIGZvcm1hdExvZ0VudHJ5KGxvZywgaW5kZXgpIHtcbiAgICBjb25zdCBzdHJlYW1DbGFzcyA9IGxvZy5zdHJlYW0gPT09ICdzdGRlcnInID8gJ2xvZy1zdGRlcnInIDogJ2xvZy1zdGRvdXQnO1xuICAgIGNvbnN0IHN0cmVhbUljb24gPSBsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICdcdTI2QTBcdUZFMEYnIDogJ1x1RDgzRFx1RENFNCc7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJsb2ctZW50cnkgJHtzdHJlYW1DbGFzc31cIiBkYXRhLWluZGV4PVwiJHtpbmRleH1cIiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzMzOyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctbGluZS1udW1cIiBzdHlsZT1cImNvbG9yOiAjNjY2OyBtaW4td2lkdGg6IDQwcHg7IHRleHQtYWxpZ246IHJpZ2h0OyB1c2VyLXNlbGVjdDogbm9uZTtcIj4ke2luZGV4ICsgMX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLXN0cmVhbS1pY29uXCIgc3R5bGU9XCJjb2xvcjogJHtsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICcjZjU5ZTBiJyA6ICcjMjJjNTVlJ307XCI+JHtzdHJlYW1JY29ufTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctdGV4dFwiIHN0eWxlPVwiZmxleDogMTsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB3b3JkLWJyZWFrOiBicmVhay1hbGw7IGNvbG9yOiAjZTVlNWU1O1wiPiR7ZXNjYXBlSHRtbChsb2cudGV4dCl9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8vIFJlbmRlciBsb2dzIHRvIHRoZSBjb250ZW50IGFyZWFcbiAgZnVuY3Rpb24gcmVuZGVyTG9ncyhsb2dzLCBzZWFyY2hUZXJtID0gJycpIHtcbiAgICBpZiAoIWxvZ3MgfHwgbG9ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5ObyBsb2dzIGF2YWlsYWJsZTwvZGl2Pic7XG4gICAgICBsaW5lQ291bnQudGV4dENvbnRlbnQgPSAnMCBsaW5lcyc7XG4gICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9ICcwIGZpbHRlcmVkJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjdXJyZW50TG9ncyA9IGxvZ3M7XG4gICAgZmlsdGVyZWRMb2dzID0gc2VhcmNoVGVybSA/IGxvZ3MuZmlsdGVyKGxvZyA9PiBcbiAgICAgIGxvZy50ZXh0ICYmIGxvZy50ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKVxuICAgICkgOiBsb2dzO1xuXG4gICAgbGluZUNvdW50LnRleHRDb250ZW50ID0gYCR7bG9ncy5sZW5ndGh9IGxpbmVzYDtcbiAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9IHNlYXJjaFRlcm0gPyBgJHtmaWx0ZXJlZExvZ3MubGVuZ3RofSBvZiAke2xvZ3MubGVuZ3RofSBzaG93bmAgOiBgJHtsb2dzLmxlbmd0aH0gc2hvd25gO1xuXG4gICAgaWYgKGZpbHRlcmVkTG9ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5ObyBsb2dzIG1hdGNoIFwiJHtlc2NhcGVIdG1sKHNlYXJjaFRlcm0pfVwiPC9kaXY+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dDb250ZW50LmlubmVySFRNTCA9IGZpbHRlcmVkTG9ncy5tYXAoKGxvZywgaSkgPT4gZm9ybWF0TG9nRW50cnkobG9nLCBpKSkuam9pbignJyk7XG4gICAgXG4gICAgLy8gU2Nyb2xsIHRvIGJvdHRvbVxuICAgIGxvZ0NvbnRlbnQuc2Nyb2xsVG9wID0gbG9nQ29udGVudC5zY3JvbGxIZWlnaHQ7XG4gIH1cblxuICAvLyBMb2FkIGNvbnRhaW5lciBsaXN0XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRDb250YWluZXJzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0SlNPTignL2FwaS92MS9sb2dzL2NvbnRhaW5lcnMnKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBkYXRhLmNvbnRhaW5lcnMgfHwgW107XG4gICAgICBcbiAgICAgIC8vIFN0b3JlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICBjb25zdCBjdXJyZW50VmFsID0gY29udGFpbmVyU2VsZWN0LnZhbHVlO1xuICAgICAgXG4gICAgICBjb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgYSBjb250YWluZXIuLi48L29wdGlvbj4nO1xuICAgICAgXG4gICAgICBjb250YWluZXJzLmZvckVhY2goYyA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHRpb24udmFsdWUgPSBjLmlkO1xuICAgICAgICBvcHRpb24udGV4dENvbnRlbnQgPSBgJHtjLm5hbWV9ICgke2MuaW1hZ2Uuc3BsaXQoJzonKVswXX0pIC0gJHtjLnN0YXR1c31gO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5uYW1lID0gYy5uYW1lO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5pbWFnZSA9IGMuaW1hZ2U7XG4gICAgICAgIG9wdGlvbi5kYXRhc2V0LnN0YXR1cyA9IGMuc3RhdHVzO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5jcmVhdGVkID0gYy5jcmVhdGVkO1xuICAgICAgICBjb250YWluZXJTZWxlY3QuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXN0b3JlIHNlbGVjdGlvbiBpZiBzdGlsbCB2YWxpZFxuICAgICAgaWYgKGN1cnJlbnRWYWwgJiYgY29udGFpbmVyU2VsZWN0LnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7Y3VycmVudFZhbH1cIl1gKSkge1xuICAgICAgICBjb250YWluZXJTZWxlY3QudmFsdWUgPSBjdXJyZW50VmFsO1xuICAgICAgICBsb2FkQ29udGFpbmVySW5mbyhjdXJyZW50VmFsKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGNvbnRhaW5lcnM6JywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvLyBMb2FkIGNvbnRhaW5lciBpbmZvXG4gIGZ1bmN0aW9uIGxvYWRDb250YWluZXJJbmZvKGNvbnRhaW5lcklkKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gY29udGFpbmVyU2VsZWN0LnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7Y29udGFpbmVySWR9XCJdYCk7XG4gICAgaWYgKG9wdGlvbikge1xuICAgICAgaW1hZ2VFbC50ZXh0Q29udGVudCA9IG9wdGlvbi5kYXRhc2V0LmltYWdlIHx8ICctJztcbiAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gb3B0aW9uLmRhdGFzZXQuc3RhdHVzIHx8ICctJztcbiAgICAgIHN0YXR1c0VsLnN0eWxlLmNvbG9yID0gb3B0aW9uLmRhdGFzZXQuc3RhdHVzID09PSAncnVubmluZycgPyAndmFyKC0tb2stZmcsICM0YWRlODApJyA6ICd2YXIoLS1iYWQtZmcsICNlZjQ0NDQpJztcbiAgICAgIGNyZWF0ZWRFbC50ZXh0Q29udGVudCA9IGZvcm1hdERhdGUob3B0aW9uLmRhdGFzZXQuY3JlYXRlZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTG9hZCBsb2dzIGZvciBzZWxlY3RlZCBjb250YWluZXJcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZExvZ3MoKSB7XG4gICAgY29uc3QgY29udGFpbmVySWQgPSBjb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgaWYgKCFjb250YWluZXJJZCkge1xuICAgICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGxvZ3M8L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIHN0cmVhbVxuICAgIHN0b3BTdHJlYW0oKTtcblxuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IGNvbnRhaW5lcklkO1xuICAgIGxvYWRDb250YWluZXJJbmZvKGNvbnRhaW5lcklkKTtcblxuICAgIGNvbnN0IHRhaWwgPSBsb2dUYWlsLnZhbHVlO1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSBsb2dTZWFyY2gudmFsdWUudHJpbSgpO1xuXG4gICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPkxvYWRpbmcgbG9ncy4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gYC9hcGkvdjEvbG9ncy9jb250YWluZXIvJHtjb250YWluZXJJZH0ke3RhaWwgIT09ICdhbGwnID8gYD90YWlsPSR7dGFpbH1gIDogJyd9YDtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRKU09OKHVybCk7XG5cbiAgICAgIGlmIChkYXRhLmxvZ3MgJiYgZGF0YS5sb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVuZGVyTG9ncyhkYXRhLmxvZ3MsIHNlYXJjaFRlcm0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPk5vIGxvZ3MgZm91bmQgZm9yIHRoaXMgY29udGFpbmVyPC9kaXY+JztcbiAgICAgICAgbGluZUNvdW50LnRleHRDb250ZW50ID0gJzAgbGluZXMnO1xuICAgICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9ICcwIGZpbHRlcmVkJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+RXJyb3IgbG9hZGluZyBsb2dzOiAke2VzY2FwZUh0bWwoZXJyLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RhcnQgc3RyZWFtaW5nIGxvZ3NcbiAgZnVuY3Rpb24gc3RhcnRTdHJlYW0oKSB7XG4gICAgY29uc3QgY29udGFpbmVySWQgPSBjb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgaWYgKCFjb250YWluZXJJZCkgcmV0dXJuO1xuXG4gICAgLy8gU3RvcCBhbnkgZXhpc3Rpbmcgc3RyZWFtXG4gICAgc3RvcFN0cmVhbSgpO1xuXG4gICAgaXNTdHJlYW1pbmcgPSB0cnVlO1xuICAgIHN0cmVhbUJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjkgU3RvcCc7XG4gICAgc3RyZWFtU3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REZFMic7XG4gICAgc3RyZWFtVGV4dC50ZXh0Q29udGVudCA9ICdDb25uZWN0aW5nLi4uJztcblxuICAgIGNvbnN0IHVybCA9IGAvYXBpL3YxL2xvZ3Mvc3RyZWFtLyR7Y29udGFpbmVySWR9YDtcbiAgICBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gKCkgPT4ge1xuICAgICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REZFMic7XG4gICAgICBzdHJlYW1UZXh0LnRleHRDb250ZW50ID0gJ0Nvbm5lY3RlZCAtIHN0cmVhbWluZyBsb2dzJztcbiAgICB9O1xuXG4gICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBsb2cgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGxvZy5lcnJvcikge1xuICAgICAgICAgIHN0cmVhbUluZGljYXRvci50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMzQnO1xuICAgICAgICAgIHN0cmVhbVRleHQudGV4dENvbnRlbnQgPSBgRXJyb3I6ICR7bG9nLmVycm9yfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIGN1cnJlbnQgbG9nc1xuICAgICAgICBjdXJyZW50TG9ncy5wdXNoKGxvZyk7XG4gICAgICAgIGZpbHRlcmVkTG9ncy5wdXNoKGxvZyk7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgY291bnRzXG4gICAgICAgIGxpbmVDb3VudC50ZXh0Q29udGVudCA9IGAke2N1cnJlbnRMb2dzLmxlbmd0aH0gbGluZXNgO1xuICAgICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9IGAke2ZpbHRlcmVkTG9ncy5sZW5ndGh9IHNob3duYDtcbiAgICAgICAgXG4gICAgICAgIC8vIEFwcGVuZCBuZXcgbG9nIGVudHJ5XG4gICAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSBsb2dTZWFyY2gudmFsdWUudHJpbSgpO1xuICAgICAgICBpZiAoIXNlYXJjaFRlcm0gfHwgKGxvZy50ZXh0ICYmIGxvZy50ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKSkpIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIGVudHJ5LmlubmVySFRNTCA9IGZvcm1hdExvZ0VudHJ5KGxvZywgZmlsdGVyZWRMb2dzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgIGNvbnN0IGVudHJ5RGl2ID0gZW50cnkuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgZW50cnlEaXYuc3R5bGUuYmFja2dyb3VuZCA9ICcjMWEzYTFhJztcbiAgICAgICAgICBsb2dDb250ZW50LmFwcGVuZENoaWxkKGVudHJ5RGl2KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBBdXRvLXNjcm9sbCB0byBib3R0b21cbiAgICAgICAgICBsb2dDb250ZW50LnNjcm9sbFRvcCA9IGxvZ0NvbnRlbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgbG9nOicsIGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REQzNCc7XG4gICAgICBzdHJlYW1UZXh0LnRleHRDb250ZW50ID0gJ0Rpc2Nvbm5lY3RlZCc7XG4gICAgICBpc1N0cmVhbWluZyA9IGZhbHNlO1xuICAgICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1MjVCNiBTdHJlYW0nO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSB0aGUgRXZlbnRTb3VyY2UgZm9yIGNsZWFudXBcbiAgICBtb2RhbC5fZXZlbnRTb3VyY2UgPSBldmVudFNvdXJjZTtcbiAgfVxuXG4gIC8vIFN0b3Agc3RyZWFtaW5nIGxvZ3NcbiAgZnVuY3Rpb24gc3RvcFN0cmVhbSgpIHtcbiAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICBldmVudFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChtb2RhbC5fZXZlbnRTb3VyY2UpIHtcbiAgICAgIG1vZGFsLl9ldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgbW9kYWwuX2V2ZW50U291cmNlID0gbnVsbDtcbiAgICB9XG4gICAgaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgICBzdHJlYW1CdG4udGV4dENvbnRlbnQgPSAnXHUyNUI2IFN0cmVhbSc7XG4gICAgc3RyZWFtU3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICAvLyBEb3dubG9hZCBsb2dzIGFzIGZpbGVcbiAgZnVuY3Rpb24gZG93bmxvYWRMb2dzKCkge1xuICAgIGlmICghY3VycmVudExvZ3MgfHwgY3VycmVudExvZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdObyBsb2dzIHRvIGRvd25sb2FkJywgJ2Vycm9yJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyTmFtZSA9IGNvbnRhaW5lclNlbGVjdC5xdWVyeVNlbGVjdG9yKGBvcHRpb25bdmFsdWU9XCIke2N1cnJlbnRDb250YWluZXJJZH1cIl1gKT8uZGF0YXNldC5uYW1lIHx8IGN1cnJlbnRDb250YWluZXJJZDtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvWzouXS9nLCAnLScpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7Y29udGFpbmVyTmFtZX0tbG9ncy0ke3RpbWVzdGFtcH0udHh0YDtcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBjdXJyZW50TG9ncy5tYXAobG9nID0+IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IGxvZy50aW1lc3RhbXAgfHwgJyc7XG4gICAgICBjb25zdCBzdHJlYW0gPSBsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICdbRVJSXScgOiAnW09VVF0nO1xuICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcCA/IHRpbWVzdGFtcCArICcgJyA6ICcnfSR7c3RyZWFtfSAke2xvZy50ZXh0fWA7XG4gICAgfSkuam9pbignXFxuJyk7XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L3BsYWluJyB9KTtcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcblxuICAgIHNob3dOb3RpZmljYXRpb24oYERvd25sb2FkZWQgJHtjdXJyZW50TG9ncy5sZW5ndGh9IGxvZyBsaW5lc2AsICdzdWNjZXNzJyk7XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgY29udGFpbmVyU2VsZWN0Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgbG9hZExvZ3MoKTtcbiAgfSk7XG5cbiAgbG9nVGFpbD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIHN0cmVhbUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKGlzU3RyZWFtaW5nKSB7XG4gICAgICBzdG9wU3RyZWFtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0U3RyZWFtKCk7XG4gICAgfVxuICB9KTtcblxuICBkb3dubG9hZEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZG93bmxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIGNsZWFyU2VhcmNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBsb2dTZWFyY2gudmFsdWUgPSAnJztcbiAgICByZW5kZXJMb2dzKGN1cnJlbnRMb2dzLCAnJyk7XG4gIH0pO1xuXG4gIGxvZ1NlYXJjaD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgLy8gRGVib3VuY2Ugc2VhcmNoXG4gICAgY2xlYXJUaW1lb3V0KHNlYXJjaFRpbWVvdXQpO1xuICAgIHNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlbmRlckxvZ3MoY3VycmVudExvZ3MsIGxvZ1NlYXJjaC52YWx1ZS50cmltKCkpO1xuICAgIH0sIDMwMCk7XG4gIH0pO1xuXG4gIGxvZ1NlYXJjaD8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgbG9nU2VhcmNoLnZhbHVlID0gJyc7XG4gICAgICByZW5kZXJMb2dzKGN1cnJlbnRMb2dzLCAnJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBPcGVuIG1vZGFsXG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1jb250YWluZXItbG9ncycpO1xuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZENvbnRhaW5lcnMoKTtcbiAgfSk7XG5cbiAgLy8gQ2xvc2UgbW9kYWwgaGFuZGxlcnNcbiAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICBzdG9wU3RyZWFtKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9XG5cbiAgY2xvc2VCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VNb2RhbCk7XG4gIGNsb3NlQnRuMj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZU1vZGFsKTtcblxuICAvLyBDbG9zZSBvbiBlc2NhcGUga2V5XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgbW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcbiAgICAgIGNsb3NlTW9kYWwoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFdpcmUgYmFja2Ryb3AgY2xpY2sgdG8gY2xvc2VNb2RhbCBzbyB0aGUgbG9nIHN0cmVhbSBzdG9wcyB0b28uXG4gIC8vIChDYW4ndCB1c2Ugd2lyZU1vZGFsIGhlcmUgXHUyMDE0IGl0IG9ubHkgZG9lcyBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JylcbiAgLy8gb24gYmFja2Ryb3AgY2xpY2ssIHdoaWNoIHdvdWxkIGxlYWsgdGhlIFNTRS9zdHJlYW0gY29ubmVjdGlvbi4pXG4gIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgY2xvc2VNb2RhbCgpOyB9KTtcblxuICAvLyBFeHBvc2UgZm9yIHVzZSBieSBzZXJ2aWNlIGNhcmQgYnV0dG9ucyAoZ3JpZC5qcyBjYWxscyBvcGVuQ29udGFpbmVyTG9nc01vZGFsKVxuICB3aW5kb3cub3BlbkNvbnRhaW5lckxvZ3NNb2RhbCA9IGZ1bmN0aW9uKGNvbnRhaW5lcklkLCBjb250YWluZXJOYW1lKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRDb250YWluZXJzKCkudGhlbigoKSA9PiB7XG4gICAgICAvLyBUcnkgdG8gZmluZCBhbmQgc2VsZWN0IHRoZSBjb250YWluZXJcbiAgICAgIGNvbnN0IG9wdGlvbiA9IEFycmF5LmZyb20oY29udGFpbmVyU2VsZWN0Lm9wdGlvbnMpLmZpbmQob3B0ID0+IFxuICAgICAgICBvcHQudmFsdWUgPT09IGNvbnRhaW5lcklkIHx8IG9wdC5kYXRhc2V0Lm5hbWUgPT09IGNvbnRhaW5lck5hbWVcbiAgICAgICk7XG4gICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgIGNvbnRhaW5lclNlbGVjdC52YWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgbG9hZENvbnRhaW5lckluZm8ob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgbG9hZExvZ3MoKTtcbiAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVySWQpIHtcbiAgICAgICAgLy8gSWYgY29udGFpbmVyIG5vdCBmb3VuZCBpbiBsaXN0IGJ1dCB3ZSBoYXZlIGFuIElELCB0cnkgbG9hZGluZyBkaXJlY3RseVxuICAgICAgICBjdXJyZW50Q29udGFpbmVySWQgPSBjb250YWluZXJJZDtcbiAgICAgICAgaW1hZ2VFbC50ZXh0Q29udGVudCA9IGNvbnRhaW5lck5hbWUgfHwgY29udGFpbmVySWQ7XG4gICAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJy0nO1xuICAgICAgICBjcmVhdGVkRWwudGV4dENvbnRlbnQgPSAnLSc7XG4gICAgICAgIGxvYWRMb2dzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBjb250YWluZXIgSUQsIGp1c3Qgc2hvdyBtb2RhbCB3aXRoIGNvbnRhaW5lciBsaXN0XG4gICAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5TZWxlY3QgYSBjb250YWluZXIgdG8gdmlldyBsb2dzPC9kaXY+JztcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IERDLTA1NTogSE9TVCBKT1VSTkFMRCBMT0cgVklFV0VSID09PT09PT09PT1cbi8vIFN0cmVhbXMgaG9zdCBzZXJ2aWNlIGxvZ3MgKGNhZGR5LCBkYXNoY2FkZHktYXBpLCBkb2NrZXIsIHNzaCwgXHUyMDI2KSB2aWEgdGhlXG4vLyBqb3VybmFsY3RsIGJpbmQtbW91bnQgYWRkZWQgaW4gc3RhcnQuc2guIFNlcnZlci1TZW50IEV2ZW50cyBmb3IgbGl2ZVxuLy8gdGFpbGluZzsgYm91bmRlZCBub24tc3RyZWFtaW5nIHJlYWQgZm9yIGhpc3RvcmljYWwgdmlld3MuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBBbGxvdy1saXN0IG1pcnJvcnMgdGhlIGJhY2tlbmQncyBBTExPV0VEX1VOSVRTIHNvIHRoZSBkcm9wZG93biBzdGF5c1xuICAvLyBob25lc3Qgd2hlbiB0aGUgYmluZC1tb3VudCBpc24ndCBhdmFpbGFibGUuIFRoZSBzZXJ2ZXIgaXMgc3RpbGwgdGhlXG4gIC8vIHNvdXJjZSBvZiB0cnV0aCBcdTIwMTQgYW55dGhpbmcgbm90IGluIGl0cyBhbGxvdy1saXN0IHJldHVybnMgNDAwLlxuICBjb25zdCBVTklUX1BSRVNFVFMgPSBbXG4gICAgeyB1bml0OiAnY2FkZHknLCAgICAgICAgICBsYWJlbDogJ0NhZGR5IChyZXZlcnNlIHByb3h5KScgfSxcbiAgICB7IHVuaXQ6ICdkYXNoY2FkZHktYXBpJywgIGxhYmVsOiAnRGFzaENhZGR5IEFQSSAoaG9zdCBzeXN0ZW1kIHVuaXQsIG5vdCB0aGlzIGNvbnRhaW5lciknIH0sXG4gICAgeyB1bml0OiAnZG9ja2VyJywgICAgICAgICBsYWJlbDogJ0RvY2tlciBkYWVtb24nIH0sXG4gICAgeyB1bml0OiAnc3NoJywgICAgICAgICAgICBsYWJlbDogJ1NTSCBzZXJ2ZXInIH0sXG4gICAgeyB1bml0OiAnc3lzdGVtZC1qb3VybmFsZCcsIGxhYmVsOiAnc3lzdGVtZC1qb3VybmFsZCcgfSxcbiAgICB7IHVuaXQ6ICd0YWlsc2NhbGVkJywgICAgIGxhYmVsOiAnVGFpbHNjYWxlJyB9LFxuICAgIHsgdW5pdDogJ25ldHdvcmtkLWRpc3BhdGNoZXInLCBsYWJlbDogJ05ldHdvcmtkIGRpc3BhdGNoZXInIH0sXG4gIF07XG5cbiAgaW5qZWN0TW9kYWwoJ2pvdXJuYWxkLW1vZGFsJywgYFxuICAgIDxkaXYgaWQ9XCJqb3VybmFsZC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiIHN0eWxlPVwiei1pbmRleDogMTAwMjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogOTAwcHg7IG1heC13aWR0aDogOTV2dzsgaGVpZ2h0OiA4MHZoOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9ncy1oZWFkZXJcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgcGFkZGluZy1ib3R0b206IDEycHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDMgc3R5bGU9XCJtYXJnaW46IDA7XCI+XHVEODNEXHVERUYwXHVGRTBGIEhvc3QgTG9ncyAoam91cm5hbGQpPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIiBzdHlsZT1cIm1hcmdpbjogNHB4IDAgMCAwOyBmb250LXNpemU6IDAuODVyZW07IG9wYWNpdHk6IDAuNztcIj5cbiAgICAgICAgICAgICAgU3RyZWFtIGhvc3Qgc2VydmljZSBsb2dzIGZyb20gPGNvZGU+am91cm5hbGN0bDwvY29kZT4gKHJlYWQtb25seSBtb3VudCkuIERvY2tlciBjb250YWluZXIgbG9ncyBhcmUgc3RpbGwgaW4gdGhlIDxlbT5Db250YWluZXIgTG9nczwvZW0+IG1vZGFsLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWNvbnRyb2xzXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwOyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1wiPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cImpkLXVuaXQtc2VsZWN0XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IG1pbi13aWR0aDogMjIwcHg7XCI+PC9zZWxlY3Q+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImpkLXNlYXJjaFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGxvZ3MuLi5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgd2lkdGg6IDE2MHB4O1wiIC8+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiamQtdGFpbFwiIG1pbj1cIjFcIiBtYXg9XCI1MDAwXCIgdmFsdWU9XCIyMDBcIiB0aXRsZT1cIkxpbmVzIHRvIGxvYWQgKGhpc3RvcmljYWwgdmlldylcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgd2lkdGg6IDkwcHg7XCIgLz5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1yZWZyZXNoXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlx1RDgzRFx1REQwNCBMb2FkIHRhaWw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1zdHJlYW1cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XHUyNUI2IFN0cmVhbTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImpkLWNsZWFyLXNlYXJjaFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIiB0aXRsZT1cIkNsZWFyIHNlYXJjaFwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImpkLWNsb3NlXCIgY2xhc3M9XCJjbG9zZS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4O1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiamQtbWV0YVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxNnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBwYWRkaW5nOiA4cHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tYmctc2Vjb25kYXJ5LCB2YXIoLS1iZykpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44MnJlbTsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICAgIDxzcGFuPjxzdHJvbmc+U291cmNlOjwvc3Ryb25nPiA8c3BhbiBpZD1cImpkLXNvdXJjZVwiPmpvdXJuYWxkPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj48c3Ryb25nPlVuaXQ6PC9zdHJvbmc+IDxzcGFuIGlkPVwiamQtdW5pdC1kaXNwbGF5XCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PHN0cm9uZz5TdHJlYW06PC9zdHJvbmc+IDxzcGFuIGlkPVwiamQtc3RyZWFtLXN0YXRlXCI+ZGlzY29ubmVjdGVkPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cImpkLWNvbnRlbnRcIiBjbGFzcz1cImxvZ3MtY29udGVudCBzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJmbGV4OiAxOyBtaW4taGVpZ2h0OiAwOyBiYWNrZ3JvdW5kOiAjMWExYTFhOyBib3JkZXItcmFkaXVzOiA2cHg7IHBhZGRpbmc6IDEycHg7IGZvbnQtZmFtaWx5OiAnTW9uYWNvJywgJ01lbmxvJywgJ1VidW50dSBNb25vJywgbW9ub3NwYWNlOyBmb250LXNpemU6IDAuNzhyZW07IG92ZXJmbG93OiBhdXRvO1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5TZWxlY3QgYSB1bml0IGFuZCBjbGljayA8ZW0+TG9hZCB0YWlsPC9lbT4gb3IgPGVtPlN0cmVhbTwvZW0+LjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmctdG9wOiAxMnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiamQtbGluZS1jb3VudFwiPjAgbGluZXM8L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj58PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJqZC1maWx0ZXItY291bnRcIj4wIHNob3duPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+fDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiamQtb3ZlcmZsb3dcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IGNvbG9yOiB2YXIoLS13YXJuLWZnLCAjZmJiZjI0KTtcIj5cdTI2QTAgc3RyZWFtIG92ZXJmbG93IFx1MjAxNCByZS1sb2FkIHdpdGggbmFycm93ZXIgd2luZG93PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1jbG9zZS1idG5cIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgKTtcblxuICBjb25zdCBtb2RhbCAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam91cm5hbGQtbW9kYWwnKTtcbiAgY29uc3QgdW5pdFNlbGVjdCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXVuaXQtc2VsZWN0Jyk7XG4gIGNvbnN0IHNlYXJjaElucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1zZWFyY2gnKTtcbiAgY29uc3QgdGFpbElucHV0ICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXRhaWwnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXJlZnJlc2gnKTtcbiAgY29uc3Qgc3RyZWFtQnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXN0cmVhbScpO1xuICBjb25zdCBjbGVhclNlYXJjaCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtY2xlYXItc2VhcmNoJyk7XG4gIGNvbnN0IGNsb3NlQnRuICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1jbG9zZScpO1xuICBjb25zdCBjbG9zZUJ0bjIgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtY2xvc2UtYnRuJyk7XG4gIGNvbnN0IGNvbnRlbnQgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1jb250ZW50Jyk7XG4gIGNvbnN0IGxpbmVDb3VudCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1saW5lLWNvdW50Jyk7XG4gIGNvbnN0IGZpbHRlckNvdW50ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1maWx0ZXItY291bnQnKTtcbiAgY29uc3Qgb3ZlcmZsb3dIaW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLW92ZXJmbG93Jyk7XG4gIGNvbnN0IHVuaXREaXNwbGF5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC11bml0LWRpc3BsYXknKTtcbiAgY29uc3Qgc3RyZWFtU3RhdGUgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXN0cmVhbS1zdGF0ZScpO1xuXG4gIGxldCBhdmFpbGFibGUgPSBmYWxzZTsgICAgIC8vIC92YXIvbG9nL2pvdXJuYWwgbW91bnRlZD9cbiAgbGV0IGxpbmVzID0gW107ICAgICAgICAgICAgLy8gY3VycmVudCBidWZmZXIgKGFycmF5IG9mIHt0aW1lc3RhbXAsIHVuaXQsIHRleHR9KVxuICBsZXQgc3RyZWFtaW5nID0gZmFsc2U7XG4gIGxldCBldmVudFNvdXJjZSA9IG51bGw7XG4gIGxldCBzZWFyY2hUaW1lciA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZXNjYXBlSHRtbChzKSB7XG4gICAgLy8gTG9jYWwgcmUtZGVjbGFyYXRpb24gc28gd2UgZG9uJ3QgZGVwZW5kIG9uIGEgZ2xvYmFsOyBzYW1lIHNlbWFudGljc1xuICAgIC8vIGFzIHRoZSBoZWxwZXIgdXNlZCBieSBjb250YWluZXItbG9ncy5qcyBhbmQgZXJyb3ItbG9ncy5qcy5cbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBTdHJpbmcocyk7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRBdmFpbGFibGUoaXNBdmFpbGFibGUpIHtcbiAgICBhdmFpbGFibGUgPSBpc0F2YWlsYWJsZTtcbiAgICB1bml0U2VsZWN0LmlubmVySFRNTCA9ICcnO1xuICAgIFVOSVRfUFJFU0VUUy5mb3JFYWNoKHAgPT4ge1xuICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICBvcHQudmFsdWUgPSBwLnVuaXQ7XG4gICAgICBvcHQudGV4dENvbnRlbnQgPSBwLmxhYmVsICsgJyAoJyArIHAudW5pdCArICcpJztcbiAgICAgIHVuaXRTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICB9KTtcbiAgICB1bml0U2VsZWN0LmRpc2FibGVkID0gIWlzQXZhaWxhYmxlO1xuICAgIGlmICghaXNBdmFpbGFibGUpIHtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5qb3VybmFsZCBiaW5kLW1vdW50IG5vdCBhdmFpbGFibGUgaW4gdGhpcyBjb250YWluZXIuPGJyLz48c21hbGw+UmVxdWlyZXMgPGNvZGU+L3Zhci9sb2cvam91cm5hbDwvY29kZT4gKyA8Y29kZT4vdXNyL2Jpbi9qb3VybmFsY3RsPC9jb2RlPiBtb3VudGVkIChzdGFydC5zaCkuPC9zbWFsbD48L2Rpdj4nO1xuICAgICAgcmVmcmVzaEJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBzdHJlYW1CdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWZyZXNoQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBzdHJlYW1CdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBwcm9iZUF2YWlsYWJsZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xvZ3Mvam91cm5hbC91bml0cycpO1xuICAgICAgaWYgKCFyZXNwLm9rKSB7IHNldEF2YWlsYWJsZShmYWxzZSk7IHJldHVybjsgfVxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgc2V0QXZhaWxhYmxlKCEhZGF0YS5hdmFpbGFibGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNldEF2YWlsYWJsZShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyTGluZXMoKSB7XG4gICAgY29uc3QgdGVybSA9IChzZWFyY2hJbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0ZXJtID8gbGluZXMuZmlsdGVyKGwgPT4gKGwudGV4dENvbnRlbnQgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkpIDogbGluZXM7XG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPk5vIGVudHJpZXMnICsgKHRlcm0gPyBgIG1hdGNoaW5nICZxdW90OyR7ZXNjYXBlSHRtbCh0ZXJtKX0mcXVvdDtgIDogJycpICsgJzwvZGl2Pic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGh0bWwgPSBmaWx0ZXJlZC5tYXAobGluZSA9PiB7XG4gICAgICAgIGNvbnN0IHRzID0gbGluZS50aW1lc3RhbXAgPyBlc2NhcGVIdG1sKGxpbmUudGltZXN0YW1wKSA6ICdcdTIwMTQnO1xuICAgICAgICBjb25zdCB0ID0gZXNjYXBlSHRtbChsaW5lLnRleHRDb250ZW50KTtcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiamQtbGluZVwiIHN0eWxlPVwicGFkZGluZzogMXB4IDA7IGxpbmUtaGVpZ2h0OiAxLjQ7IGNvbG9yOiAjZDRkNGQ0O1wiPjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXJpZ2h0OiA4cHg7XCI+JHt0c308L3NwYW4+JHt0fTwvZGl2PmA7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIC8vIEF1dG8tc2Nyb2xsIG9ubHkgaWYgdXNlciBpcyBhbHJlYWR5IGF0IHRoZSBib3R0b20gKGRvbid0IGZpZ2h0IHRoZW0pLlxuICAgICAgY29uc3QgbmVhckJvdHRvbSA9IGNvbnRlbnQuc2Nyb2xsSGVpZ2h0IC0gY29udGVudC5zY3JvbGxUb3AgLSBjb250ZW50LmNsaWVudEhlaWdodCA8IDgwO1xuICAgICAgaWYgKG5lYXJCb3R0b20pIGNvbnRlbnQuc2Nyb2xsVG9wID0gY29udGVudC5zY3JvbGxIZWlnaHQ7XG4gICAgfVxuICAgIGxpbmVDb3VudC50ZXh0Q29udGVudCA9IGAke2xpbmVzLmxlbmd0aH0gZW50cmllc2A7XG4gICAgZmlsdGVyQ291bnQudGV4dENvbnRlbnQgPSB0ZXJtID8gYCR7ZmlsdGVyZWQubGVuZ3RofSBvZiAke2xpbmVzLmxlbmd0aH0gc2hvd25gIDogYCR7bGluZXMubGVuZ3RofSBzaG93bmA7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkVGFpbCgpIHtcbiAgICBpZiAoIWF2YWlsYWJsZSkgcmV0dXJuO1xuICAgIHN0b3BTdHJlYW0oKTtcbiAgICBjb25zdCB1bml0ID0gdW5pdFNlbGVjdC52YWx1ZTtcbiAgICBpZiAoIXVuaXQpIHJldHVybjtcbiAgICBjb25zdCB0YWlsID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oNTAwMCwgTnVtYmVyKHRhaWxJbnB1dC52YWx1ZSkgfHwgMjAwKSk7XG4gICAgY29uc3QgdGVybSA9IChzZWFyY2hJbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+JztcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCgnL2FwaS92MS9sb2dzL2pvdXJuYWwnLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCd1bml0JywgdW5pdCk7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndGFpbCcsIFN0cmluZyh0YWlsKSk7XG4gICAgICBpZiAodGVybSkgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3NlYXJjaCcsIHRlcm0pO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybC50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlmICghcmVzcC5vayB8fCAhZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbCgoZGF0YSAmJiBkYXRhLmVycm9yKSB8fCAoJ0hUVFAgJyArIHJlc3Auc3RhdHVzKSkgKyAnPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW5pdERpc3BsYXkudGV4dENvbnRlbnQgPSB1bml0O1xuICAgICAgbGluZXMgPSAoZGF0YS5lbnRyaWVzIHx8IFtdKS5tYXAoZSA9PiAoe1xuICAgICAgICB0aW1lc3RhbXA6IGUudGltZXN0YW1wLFxuICAgICAgICB1bml0OiBlLnVuaXQsXG4gICAgICAgIHRleHRDb250ZW50OiBlLnRleHQgfHwgJycsXG4gICAgICB9KSk7XG4gICAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHJlbmRlckxpbmVzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZywgI2VmNDQ0NCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5FcnJvcjogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0U3RyZWFtKCkge1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm47XG4gICAgc3RvcFN0cmVhbSgpO1xuICAgIGNvbnN0IHVuaXQgPSB1bml0U2VsZWN0LnZhbHVlO1xuICAgIGlmICghdW5pdCkgcmV0dXJuO1xuICAgIGNvbnN0IHRlcm0gPSAoc2VhcmNoSW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICB1bml0RGlzcGxheS50ZXh0Q29udGVudCA9IHVuaXQ7XG4gICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1MjNGOCBTdG9wJztcbiAgICBzdHJlYW1CdG4uY2xhc3NMaXN0LmFkZCgnc3RyZWFtaW5nJyk7XG4gICAgc3RyZWFtU3RhdGUudGV4dENvbnRlbnQgPSAnc3RyZWFtaW5nJztcbiAgICBzdHJlYW1TdGF0ZS5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZywgIzRhZGU4MCknO1xuICAgIGxpbmVzID0gW107XG4gICAgcmVuZGVyTGluZXMoKTtcbiAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKCcvYXBpL3YxL2xvZ3Mvam91cm5hbC9zdHJlYW0nLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndW5pdCcsIHVuaXQpO1xuICAgIGlmICh0ZXJtKSB1cmwuc2VhcmNoUGFyYW1zLnNldCgnc2VhcmNoJywgdGVybSk7XG4gICAgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsLnRvU3RyaW5nKCkpO1xuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IChldikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBKU09OLnBhcnNlKGV2LmRhdGEpO1xuICAgICAgICBpZiAoZW50cnkuZXJyb3IpIHtcbiAgICAgICAgICAvLyBPdmVyZmxvdyAvIHZhbGlkYXRpb24gLyBiaW5kLW1vdW50IGVycm9yc1xuICAgICAgICAgIGlmICgvc3RyZWFtIChleGNlZWRlZHxsaW5lIGNhcCkvLnRlc3QoZW50cnkuZXJyb3IpKSB7XG4gICAgICAgICAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgICAgc3RvcFN0cmVhbSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZW50LmlubmVySFRNTCArPSAnPGRpdiBjbGFzcz1cImpkLWxpbmVcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyBwYWRkaW5nOiA0cHggMDtcIj5cdTI2QTAgJyArIGVzY2FwZUh0bWwoZW50cnkuZXJyb3IpICsgJzwvZGl2Pic7XG4gICAgICAgICAgY29udGVudC5zY3JvbGxUb3AgPSBjb250ZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGluZXMucHVzaCh7XG4gICAgICAgICAgdGltZXN0YW1wOiBlbnRyeS50aW1lc3RhbXAsXG4gICAgICAgICAgdW5pdDogZW50cnkudW5pdCB8fCB1bml0LFxuICAgICAgICAgIHRleHRDb250ZW50OiBlbnRyeS50ZXh0IHx8ICcnLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSGFyZCBjYXAgdG8ga2VlcCBtZW1vcnkgYm91bmRlZCBpZiBvcGVyYXRvciBzdHJlYW1zIGZvcmV2ZXIuXG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiA1MDAwKSB7XG4gICAgICAgICAgbGluZXMgPSBsaW5lcy5zbGljZShsaW5lcy5sZW5ndGggLSA1MDAwKTtcbiAgICAgICAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlckxpbmVzKCk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIC8vIElnbm9yZSBtYWxmb3JtZWQgZXZlbnRzOyB0aGUgc2VydmVyIGlzIGF1dGhvcml0YXRpdmUuXG4gICAgICB9XG4gICAgfTtcbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgLy8gRXZlbnRTb3VyY2UgYXV0by1yZWNvbm5lY3RzOyBtYXJrIHRyYW5zaWVudCBpZiB3ZSB3ZXJlIGV4cGVjdGluZ1xuICAgICAgLy8gbW9yZSwgb3RoZXJ3aXNlIHdlIGNsb3NlZCBpdCBkZWxpYmVyYXRlbHkuXG4gICAgICBpZiAoIXN0cmVhbWluZykgcmV0dXJuO1xuICAgIH07XG4gICAgc3RyZWFtaW5nID0gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3BTdHJlYW0oKSB7XG4gICAgc3RyZWFtaW5nID0gZmFsc2U7XG4gICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICB0cnkgeyBldmVudFNvdXJjZS5jbG9zZSgpOyB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICBldmVudFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIHN0cmVhbUJ0bi50ZXh0Q29udGVudCA9ICdcdTI1QjYgU3RyZWFtJztcbiAgICBzdHJlYW1CdG4uY2xhc3NMaXN0LnJlbW92ZSgnc3RyZWFtaW5nJyk7XG4gICAgc3RyZWFtU3RhdGUudGV4dENvbnRlbnQgPSAnZGlzY29ubmVjdGVkJztcbiAgICBzdHJlYW1TdGF0ZS5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgc3RvcFN0cmVhbSgpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfVxuXG4gIC8vIFdpcmUgZXZlbnRzXG4gIHJlZnJlc2hCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkVGFpbCk7XG4gIHN0cmVhbUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN0cmVhbWluZyA/IHN0b3BTdHJlYW0oKSA6IHN0YXJ0U3RyZWFtKCkpO1xuICBjbGVhclNlYXJjaC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsgc2VhcmNoSW5wdXQudmFsdWUgPSAnJzsgcmVuZGVyTGluZXMoKTsgfSk7XG4gIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dChzZWFyY2hUaW1lcik7XG4gICAgc2VhcmNoVGltZXIgPSBzZXRUaW1lb3V0KHJlbmRlckxpbmVzLCAyMDApO1xuICB9KTtcbiAgc2VhcmNoSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBzZWFyY2hJbnB1dC52YWx1ZSA9ICcnOyByZW5kZXJMaW5lcygpOyB9XG4gIH0pO1xuICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlKTtcbiAgY2xvc2VCdG4yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIGNsb3NlKCk7IH0pO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIG1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSBjbG9zZSgpO1xuICB9KTtcbiAgLy8gUmVsb2FkIHRhaWwgYXV0b21hdGljYWxseSB3aGVuIHRoZSB1bml0IGRyb3Bkb3duIGNoYW5nZXMgKGlmIHdlIGhhdmVcbiAgLy8gZGF0YSBhbHJlYWR5IFx1MjAxNCBzYXZlcyBhIGNsaWNrKS5cbiAgdW5pdFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA+IDApIGxvYWRUYWlsKCk7XG4gIH0pO1xuXG4gIC8vIEhvb2sgaW50byB0aGUgZXhpc3RpbmcgXCJDb250YWluZXIgTG9nc1wiIG1vZGFsIGJ1dHRvbiBzbyBvcGVyYXRvcnMgZ2V0IGFcbiAgLy8gc2VwYXJhdGUgZW50cnkgcG9pbnQ7IG1pcnJvciB0aGUgb3BlbkNvbnRhaW5lckxvZ3NNb2RhbCBwYXR0ZXJuLlxuICBmdW5jdGlvbiBvcGVuSm91cm5hbGRNb2RhbCgpIHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgcHJvYmVBdmFpbGFibGUoKTtcbiAgfVxuICB3aW5kb3cub3BlbkpvdXJuYWxkTW9kYWwgPSBvcGVuSm91cm5hbGRNb2RhbDtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1qb3VybmFsZC1sb2dzJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlbkpvdXJuYWxkTW9kYWwpO1xufSkoKTs7XG4vLyA9PT09PT09PT09IENPTlRBSU5FUiBTTkFQU0hPVCAvIENIRUNLUE9JTlQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnc25hcHNob3QtbW9kYWwnLCBgPGRpdiBpZD1cInNuYXBzaG90LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA3MDBweDsgbWF4LXdpZHRoOiA4NTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQkUgQ29udGFpbmVyIFNuYXBzaG90czwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIENyZWF0ZSBhbmQgbWFuYWdlIERvY2tlciBjb250YWluZXIgY2hlY2twb2ludHMgZm9yIGluc3RhbnQgc3RhdGUgcmVjb3ZlcnkuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1jb250YWluZXItc2VsZWN0LXdyYXBwZXJcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5TZWxlY3QgQ29udGFpbmVyOjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJzbmFwc2hvdC1jb250YWluZXItc2VsZWN0XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEycHg7IG1hcmdpbi10b3A6IDRweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBTZWxlY3QgYSBjb250YWluZXIgLS08L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cInNuYXBzaG90LWRldGFpbHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3Zlcik7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+SW1hZ2U6PC9zcGFuPiA8c3BhbiBpZD1cInNuYXBzaG90LWltYWdlXCI+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlN0YXR1czo8L3NwYW4+IDxzcGFuIGlkPVwic25hcHNob3Qtc3RhdHVzXCI+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNyZWF0ZWQ6PC9zcGFuPiA8c3BhbiBpZD1cInNuYXBzaG90LWNyZWF0ZWRcIj48L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q29udGFpbmVyIElEOjwvc3Bhbj4gPHNwYW4gaWQ9XCJzbmFwc2hvdC1pZFwiIHN0eWxlPVwiZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj48L3NwYW4+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC10YWJzXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJzbmFwc2hvdC1jcmVhdGVcIj5DcmVhdGUgU25hcHNob3Q8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJzbmFwc2hvdC1saXN0XCI+TWFuYWdlIFNuYXBzaG90czwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1jcmVhdGVcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5TbmFwc2hvdCBOYW1lOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzbmFwc2hvdC1uYW1lXCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBiZWZvcmUtdXBkYXRlLTIwMjRcIiBcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBtYXJnaW4tdG9wOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuOXJlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNuYXBzaG90LWxlYXZlLXJ1bm5pbmdcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICBMZWF2ZSBjb250YWluZXIgcnVubmluZyBhZnRlciBjaGVja3BvaW50IChyZXN1bWUgd2l0aG91dCByZXN0YXJ0KVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGlkPVwic25hcHNob3QtY3JlYXRlLWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XHVEODNEXHVEQ0JFIENyZWF0ZSBTbmFwc2hvdDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGlkPVwic25hcHNob3QtY3JlYXRlLXN0YXR1c1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cInNuYXBzaG90LWxpc3RcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1saXN0LWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogMzAwcHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0JFPC9zcGFuPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGl0cyBzbmFwc2hvdHM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzbmFwc2hvdC1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1idG4nKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtY2xvc2UnKTtcbiAgY29uc3QgY29udGFpbmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWNvbnRhaW5lci1zZWxlY3QnKTtcbiAgY29uc3QgZGV0YWlsc0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1kZXRhaWxzJyk7XG4gIGNvbnN0IGNyZWF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGUtYnRuJyk7XG4gIGNvbnN0IGNyZWF0ZVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGUtc3RhdHVzJyk7XG5cbiAgbGV0IGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZENvbnRhaW5lcnMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbnRhaW5lcnMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEuY29udGFpbmVycykgcmV0dXJuO1xuICAgICAgXG4gICAgICBjb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBTZWxlY3QgYSBjb250YWluZXIgLS08L29wdGlvbj4nO1xuICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEuY29udGFpbmVycykge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gYy5pZDtcbiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gYCR7Yy5uYW1lIHx8IGMuaWR9ICgke2MuaW1hZ2UgfHwgJ3Vua25vd24nfSlgO1xuICAgICAgICBvcHQuZGF0YXNldC5uYW1lID0gYy5uYW1lO1xuICAgICAgICBvcHQuZGF0YXNldC5pbWFnZSA9IGMuaW1hZ2U7XG4gICAgICAgIG9wdC5kYXRhc2V0LnN0YXR1cyA9IGMuc3RhdHVzO1xuICAgICAgICBvcHQuZGF0YXNldC5jcmVhdGVkID0gYy5jcmVhdGVkO1xuICAgICAgICBjb250YWluZXJTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBjb250YWluZXJzOicsIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dDb250YWluZXJEZXRhaWxzKG9wdCkge1xuICAgIGlmICghb3B0IHx8ICFvcHQudmFsdWUpIHtcbiAgICAgIGRldGFpbHNEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG9wdC52YWx1ZTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtaW1hZ2UnKS50ZXh0Q29udGVudCA9IG9wdC5kYXRhc2V0LmltYWdlIHx8ICctJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3Qtc3RhdHVzJykudGV4dENvbnRlbnQgPSBvcHQuZGF0YXNldC5zdGF0dXMgfHwgJy0nO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGVkJykudGV4dENvbnRlbnQgPSBvcHQuZGF0YXNldC5jcmVhdGVkID8gbmV3IERhdGUob3B0LmRhdGFzZXQuY3JlYXRlZCAqIDEwMDApLnRvTG9jYWxlU3RyaW5nKCkgOiAnLSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWlkJykudGV4dENvbnRlbnQgPSBvcHQudmFsdWUuc3Vic3RyaW5nKDAsIDEyKTtcbiAgICBkZXRhaWxzRGl2LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNuYXBzaG90KCkge1xuICAgIGlmICghY3VycmVudENvbnRhaW5lcklkKSB7XG4gICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSAnUGxlYXNlIHNlbGVjdCBhIGNvbnRhaW5lciBmaXJzdCc7XG4gICAgICBjcmVhdGVTdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tYmFkLWZnKSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtbmFtZScpLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNyZWF0ZVN0YXR1cy50ZXh0Q29udGVudCA9ICdQbGVhc2UgZW50ZXIgYSBzbmFwc2hvdCBuYW1lJztcbiAgICAgIGNyZWF0ZVN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGVhdmVSdW5uaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWxlYXZlLXJ1bm5pbmcnKS5jaGVja2VkO1xuICAgIFxuICAgIGNyZWF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgY3JlYXRlQnRuLnRleHRDb250ZW50ID0gJ0NyZWF0aW5nLi4uJztcbiAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSAnJztcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvY29udGFpbmVycy8ke2VuY29kZVVSSUNvbXBvbmVudChjdXJyZW50Q29udGFpbmVySWQpfS9jaGVja3BvaW50YCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbmFtZSwgbGVhdmVSdW5uaW5nIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzEzIFNuYXBzaG90IFwiJHtuYW1lfVwiIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5YDtcbiAgICAgICAgY3JlYXRlU3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1uYW1lJykudmFsdWUgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNyZWF0ZVN0YXR1cy50ZXh0Q29udGVudCA9IGBcdTI3MTcgRmFpbGVkOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWA7XG4gICAgICAgIGNyZWF0ZVN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzE3IEVycm9yOiAke2UubWVzc2FnZX1gO1xuICAgICAgY3JlYXRlU3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGNyZWF0ZUJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgQ3JlYXRlIFNuYXBzaG90JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuTW9kYWwoKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRDb250YWluZXJzKCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZU1vZGFsKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBkZXRhaWxzRGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgY3VycmVudENvbnRhaW5lcklkID0gbnVsbDtcbiAgICBjb250YWluZXJTZWxlY3Quc2VsZWN0ZWRJbmRleCA9IDA7XG4gIH1cblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5Nb2RhbCk7XG4gIGNsb3NlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9kYWwpO1xuICB3aXJlTW9kYWwobW9kYWwsIGNsb3NlQnRuKTtcbiAgXG4gIGNvbnRhaW5lclNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICBjb25zdCBvcHQgPSBjb250YWluZXJTZWxlY3Qub3B0aW9uc1tjb250YWluZXJTZWxlY3Quc2VsZWN0ZWRJbmRleF07XG4gICAgc2hvd0NvbnRhaW5lckRldGFpbHMob3B0KTtcbiAgfSk7XG4gIFxuICBjcmVhdGVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY3JlYXRlU25hcHNob3QpO1xuICBcbiAgLy8gVGFiIHN3aXRjaGluZ1xuICBtb2RhbD8ucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXRhYicpLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcucGFuZWwtdGFiJykuZm9yRWFjaCh0ID0+IHQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXNlY3Rpb24nKS5mb3JFYWNoKHMgPT4gcy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgICB0YWIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKGAjJHt0YWIuZGF0YXNldC5wYW5lbH1gKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICB9KTtcbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTTUFSVCBBUlIgQ09OTkVDVCA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGluamVjdE1vZGFsKCdhcnItc2V0dXAtbW9kYWwnLCBgPGRpdiBpZD1cImFyci1zZXR1cC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjAwcHg7IG1heC13aWR0aDogNzIwcHg7XCI+XG4gICAgICA8aDM+XHVEODNDXHVERkFDIFNtYXJ0IEFyciBDb25uZWN0PC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTZweDsgZm9udC1zaXplOiAwLjlyZW07XCI+XG4gICAgICAgIEF1dG8tZGlzY292ZXIgYW5kIGNvbm5lY3QgeW91ciBlbnRpcmUgbWVkaWEgc3RhY2suXG4gICAgICA8L3A+XG5cbiAgICAgIDwhLS0gUGhhc2UgMTogRGV0ZWN0aW9uIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLWRldGVjdFwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjlyZW07XCI+U2Nhbm5pbmcgZm9yIHNlcnZpY2VzLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic21hcnQtZGV0ZWN0LXJlc3VsdHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQaGFzZSAyOiBDcmVkZW50aWFsIElucHV0IChvbmx5IGZvciBzZXJ2aWNlcyBuZWVkaW5nIGtleXMpIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLWNyZWRlbnRpYWxzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8aDQgY2xhc3M9XCJoZWFkaW5nLWFjY2VudC1zZWN0aW9uXCI+RW50ZXIgTWlzc2luZyBBUEkgS2V5czwvaDQ+XG4gICAgICAgIDxkaXYgaWQ9XCJzbWFydC1jcmVkZW50aWFsLWlucHV0c1wiPjwvZGl2PlxuXG4gICAgICAgIDwhLS0gQ29ubmVjdGlvbiBPcHRpb25zIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDEwcHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+Q29ubmVjdGlvbiBPcHRpb25zPC9oND5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJvcHRpb24tbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNtYXJ0LW9wdC1zZWVyclwiIGNoZWNrZWQgY2xhc3M9XCJjaGVja2JveC1zbVwiIC8+XG4gICAgICAgICAgICBDb25maWd1cmUgU2VlcnIgd2l0aCBSYWRhcnIgKyBTb25hcnJcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm9wdGlvbi1sYWJlbFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic21hcnQtb3B0LXBsZXhcIiBjaGVja2VkIGNsYXNzPVwiY2hlY2tib3gtc21cIiAvPlxuICAgICAgICAgICAgQ29ubmVjdCBQbGV4IHRvIFNlZXJyXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJvcHRpb24tbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNtYXJ0LW9wdC1wcm93bGFyclwiIGNoZWNrZWQgY2xhc3M9XCJjaGVja2JveC1zbVwiIC8+XG4gICAgICAgICAgICBDb25uZWN0IFByb3dsYXJyIHRvIFJhZGFyciArIFNvbmFyclxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic21hcnQtb3B0LXNhdmVcIiBjaGVja2VkIGNsYXNzPVwiY2hlY2tib3gtc21cIiAvPlxuICAgICAgICAgICAgU2F2ZSBBUEkga2V5cyBmb3Igb25lLWNsaWNrIHJlY29ubmVjdFxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxidXR0b24gaWQ9XCJzbWFydC1jb25uZWN0LWJ0blwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNlNzRjM2MgMCUsICM5YjU5YjYgMTAwJSk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDFyZW07IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIFNtYXJ0IENvbm5lY3RcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQaGFzZSAzOiBDb25uZWN0aW9uIFByb2dyZXNzIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLXByb2dyZXNzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8aDQgY2xhc3M9XCJoZWFkaW5nLWFjY2VudC1zZWN0aW9uXCI+Q29ubmVjdGluZyBFdmVyeXRoaW5nLi4uPC9oND5cbiAgICAgICAgPGRpdiBpZD1cInNtYXJ0LXByb2dyZXNzLXN0ZXBzXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFBoYXNlIDQ6IFJlc3VsdHMgLS0+XG4gICAgICA8ZGl2IGlkPVwic21hcnQtcGhhc2UtcmVzdWx0c1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cInNtYXJ0LXJlc3VsdHMtY29udGVudFwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic21hcnQtcGxleC1saWJyYXJpZXNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic21hcnQtcmV0cnktYnRuXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBmbGV4OiAxOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiAjZjM5YzEyOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IDUwMDsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBSZXRyeSBGYWlsZWQgU3RlcHNcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YSBpZD1cInNtYXJ0LW9wZW4tc2VlcnJcIiBocmVmPVwiI1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIE9wZW4gU2VlcnJcbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gSGVscCBUZXh0IC0tPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgNSUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgICA8c3Ryb25nPldoZXJlIHRvIGZpbmQgQVBJIGtleXM6PC9zdHJvbmc+PGJyPlxuICAgICAgICBSYWRhcnIvU29uYXJyL1Byb3dsYXJyOiBTZXR0aW5ncyAtPiBHZW5lcmFsIC0+IFNlY3VyaXR5IC0+IEFQSSBLZXlcbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIEJ1dHRvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXJyLXNldHVwLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLWNhbmNlbCcpO1xuICBjb25zdCBjb25uZWN0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LWNvbm5lY3QtYnRuJyk7XG5cbiAgLy8gUGhhc2UgZWxlbWVudHNcbiAgY29uc3QgcGhhc2VEZXRlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtZGV0ZWN0Jyk7XG4gIGNvbnN0IHBoYXNlQ3JlZGVudGlhbHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtY3JlZGVudGlhbHMnKTtcbiAgY29uc3QgcGhhc2VQcm9ncmVzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1waGFzZS1wcm9ncmVzcycpO1xuICBjb25zdCBwaGFzZVJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtcmVzdWx0cycpO1xuXG4gIGNvbnN0IGRldGVjdFJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtZGV0ZWN0LXJlc3VsdHMnKTtcbiAgY29uc3QgY3JlZGVudGlhbElucHV0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1jcmVkZW50aWFsLWlucHV0cycpO1xuICBjb25zdCBwcm9ncmVzc1N0ZXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXByb2dyZXNzLXN0ZXBzJyk7XG4gIGNvbnN0IHJlc3VsdHNDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXJlc3VsdHMtY29udGVudCcpO1xuICBjb25zdCBwbGV4TGlicmFyaWVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXBsZXgtbGlicmFyaWVzJyk7XG4gIGNvbnN0IHJldHJ5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXJldHJ5LWJ0bicpO1xuXG4gIGxldCBkZXRlY3RlZERhdGEgPSBudWxsOyAvLyBTdG9yZSBkZXRlY3Rpb24gcmVzdWx0cyBmb3Igc21hcnQtY29ubmVjdFxuXG4gIGNvbnN0IHNlcnZpY2VJY29ucyA9IHsgcGxleDogJ1x1RDgzQ1x1REZBQycsIHJhZGFycjogJ1x1RDgzQ1x1REZBQycsIHNvbmFycjogJ1x1RDgzRFx1RENGQScsIHByb3dsYXJyOiAnXHVEODNEXHVERDBEJywgc2VlcnI6ICdcdUQ4M0RcdURDQ0InIH07XG4gIGNvbnN0IHNlcnZpY2VMYWJlbHMgPSB7IHBsZXg6ICdQbGV4JywgcmFkYXJyOiAnUmFkYXJyIChNb3ZpZXMpJywgc29uYXJyOiAnU29uYXJyIChUViknLCBwcm93bGFycjogJ1Byb3dsYXJyIChJbmRleGVycyknLCBzZWVycjogJ1NlZXJyJyB9O1xuXG4gIGZ1bmN0aW9uIHNob3dQaGFzZShwaGFzZSkge1xuICAgIHBoYXNlRGV0ZWN0LnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ2RldGVjdCcgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIHBoYXNlQ3JlZGVudGlhbHMuc3R5bGUuZGlzcGxheSA9IHBoYXNlID09PSAnY3JlZGVudGlhbHMnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICBwaGFzZVByb2dyZXNzLnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ3Byb2dyZXNzJyA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgcGhhc2VSZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ3Jlc3VsdHMnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXR1c0JhZGdlKHN0YXR1cykge1xuICAgIGNvbnN0IGNvbG9ycyA9IHtcbiAgICAgIGNvbm5lY3RlZDogeyBiZzogJ3ZhcigtLW9rLWZnKScsIGljb246ICcmIzEwMDAzOycsIHRleHQ6ICdDb25uZWN0ZWQnIH0sXG4gICAgICBuZWVkc19rZXk6IHsgYmc6ICcjZjM5YzEyJywgaWNvbjogJyYjMTI4MjczOycsIHRleHQ6ICdOZWVkcyBBUEkgS2V5JyB9LFxuICAgICAgbm90X2ZvdW5kOiB7IGJnOiAndmFyKC0tbXV0ZWQpJywgaWNvbjogJyZtZGFzaDsnLCB0ZXh0OiAnTm90IEZvdW5kJyB9LFxuICAgICAgZXJyb3I6IHsgYmc6ICd2YXIoLS1iYWQtZmcpJywgaWNvbjogJyYjMTAwMDc7JywgdGV4dDogJ0Vycm9yJyB9XG4gICAgfTtcbiAgICBjb25zdCBjID0gY29sb3JzW3N0YXR1c10gfHwgY29sb3JzLm5vdF9mb3VuZDtcbiAgICByZXR1cm4gYDxzcGFuIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNHB4OyBwYWRkaW5nOiAycHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICR7Yy5iZ30gMjAlLCB0cmFuc3BhcmVudCk7IGNvbG9yOiAke2MuYmd9O1wiPiR7Yy5pY29ufSAke2MudGV4dH08L3NwYW4+YDtcbiAgfVxuXG4gIC8vIFBoYXNlIDE6IFNtYXJ0IERldGVjdGlvblxuICBhc3luYyBmdW5jdGlvbiBzbWFydERldGVjdCgpIHtcbiAgICBzaG93UGhhc2UoJ2RldGVjdCcpO1xuICAgIGRldGVjdFJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Fyci9zbWFydC1kZXRlY3QnKTtcbiAgICAgIGRldGVjdGVkRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKCFkZXRlY3RlZERhdGEuc3VjY2Vzcykge1xuICAgICAgICBkZXRlY3RSZXN1bHRzLmlubmVySFRNTCA9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGV0ZWN0aW9uIGZhaWxlZDogJHtlc2NhcGVIdG1sKGRldGVjdGVkRGF0YS5lcnJvcil9PC9kaXY+YDtcbiAgICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW5kZXIgZGV0ZWN0aW9uIHJlc3VsdHNcbiAgICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDtcIj4nO1xuXG4gICAgICBmb3IgKGNvbnN0IFtzdmMsIGluZm9dIG9mIE9iamVjdC5lbnRyaWVzKGRldGVjdGVkRGF0YS5zZXJ2aWNlcykpIHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHNlcnZpY2VJY29uc1tzdmNdIHx8ICdcdUQ4M0RcdURDRTYnO1xuICAgICAgICBjb25zdCBsYWJlbCA9IHNlcnZpY2VMYWJlbHNbc3ZjXSB8fCBzdmM7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGluZm8uc291cmNlID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBhZGRpbmc6IDFweCA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiAzcHg7XCI+JHtlc2NhcGVIdG1sKGluZm8uc291cmNlKX08L3NwYW4+YCA6ICcnO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gaW5mby52ZXJzaW9uID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+diR7ZXNjYXBlSHRtbChpbmZvLnZlcnNpb24pfTwvc3Bhbj5gIDogJyc7XG4gICAgICAgIGNvbnN0IGtleVNhdmVkID0gKGluZm8uaGFzQXBpS2V5IHx8IGluZm8uaGFzVG9rZW4pICYmIGluZm8uc3RhdHVzID09PSAnY29ubmVjdGVkJ1xuICAgICAgICAgID8gJzxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1vay1mZyk7XCI+S2V5IHNhdmVkPC9zcGFuPicgOiAnJztcblxuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyBwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JHtsYWJlbH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICAgICAgICAke3NvdXJjZX0gJHt2ZXJzaW9ufSAke2tleVNhdmVkfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgJHtzdGF0dXNCYWRnZShpbmZvLnN0YXR1cyl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICAgIC8vIFN1bW1hcnlcbiAgICAgIGNvbnN0IHMgPSBkZXRlY3RlZERhdGEuc3VtbWFyeTtcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSA4JSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgJHtlc2NhcGVIdG1sKFN0cmluZyhzLmZ1bGx5Q29ubmVjdGVkKSl9LyR7ZXNjYXBlSHRtbChTdHJpbmcocy50b3RhbERldGVjdGVkICsgKDUgLSBzLnRvdGFsRGV0ZWN0ZWQpKSl9IHNlcnZpY2VzIGRldGVjdGVkICZtaWRkb3Q7XG4gICAgICAgICR7ZXNjYXBlSHRtbChTdHJpbmcocy5mdWxseUNvbm5lY3RlZCkpfSBjb25uZWN0ZWQke3MubmVlZHNBcGlLZXkgPiAwID8gYCAmbWlkZG90OyA8c3Ryb25nPiR7ZXNjYXBlSHRtbChTdHJpbmcocy5uZWVkc0FwaUtleSkpfSBuZWVkcyBBUEkga2V5PC9zdHJvbmc+YCA6ICcnfVxuICAgICAgPC9kaXY+YDtcblxuICAgICAgZGV0ZWN0UmVzdWx0cy5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgLy8gQnVpbGQgY3JlZGVudGlhbCBpbnB1dHMgZm9yIHNlcnZpY2VzIHRoYXQgbmVlZCBrZXlzXG4gICAgICBidWlsZENyZWRlbnRpYWxJbnB1dHMoZGV0ZWN0ZWREYXRhKTtcblxuICAgICAgLy8gQXV0by1hZHZhbmNlIGFmdGVyIGEgc2hvcnQgZGVsYXlcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzaG93UGhhc2UoJ2NyZWRlbnRpYWxzJyk7XG4gICAgICB9LCA4MDApO1xuXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGV0ZWN0UmVzdWx0cy5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkVycm9yOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZCBjcmVkZW50aWFsIGlucHV0IGZpZWxkc1xuICBmdW5jdGlvbiBidWlsZENyZWRlbnRpYWxJbnB1dHMoZGF0YSkge1xuICAgIGxldCBodG1sID0gJyc7XG4gICAgY29uc3Qgc2VydmljZXMgPSBkYXRhLnNlcnZpY2VzO1xuICAgIGNvbnN0IGFyclNlcnZpY2VzID0gWydyYWRhcnInLCAnc29uYXJyJywgJ3Byb3dsYXJyJ107XG5cbiAgICBmb3IgKGNvbnN0IHN2YyBvZiBhcnJTZXJ2aWNlcykge1xuICAgICAgY29uc3QgaW5mbyA9IHNlcnZpY2VzW3N2Y107XG4gICAgICBpZiAoIWluZm8gfHwgaW5mby5zdGF0dXMgPT09ICdub3RfZm91bmQnICYmICFpbmZvLnVybCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGljb24gPSBzZXJ2aWNlSWNvbnNbc3ZjXTtcbiAgICAgIGNvbnN0IGxhYmVsID0gc2VydmljZUxhYmVsc1tzdmNdO1xuICAgICAgY29uc3QgaXNDb25uZWN0ZWQgPSBpbmZvLnN0YXR1cyA9PT0gJ2Nvbm5lY3RlZCc7XG4gICAgICBjb25zdCBib3JkZXJDb2xvciA9IGlzQ29ubmVjdGVkID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYm9yZGVyKSc7XG5cbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICR7Ym9yZGVyQ29sb3J9O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPiR7bGFiZWx9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGlkPVwic21hcnQtJHtzdmN9LXN0YXR1c1wiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IGF1dG87IGZvbnQtc2l6ZTogMC43NXJlbTtcIj5cbiAgICAgICAgICAgICR7aXNDb25uZWN0ZWQgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7IENvbm5lY3RlZDwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5VUkw6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic21hcnQtJHtzdmN9LXVybFwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGluZm8udXJsIHx8ICcnKX1cIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vc2VlZGJveC5jb20vJHtzdmN9L1wiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgZm9udC1zaXplOiAwLjg1cmVtOyBwYWRkaW5nOiA2cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5BUEkgS2V5OjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJzbWFydC0ke3N2Y30ta2V5XCIgcGxhY2Vob2xkZXI9XCIke2lzQ29ubmVjdGVkID8gJyhzYXZlZCknIDogJ1Bhc3RlIEFQSSBrZXknfVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgZm9udC1zaXplOiAwLjg1cmVtOyBwYWRkaW5nOiA2cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJzbWFydFRlc3RDb25uZWN0aW9uKCcke3N2Y30nKVwiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4OyBwYWRkaW5nOiA0cHggMTJweDsgZm9udC1zaXplOiAwLjc1cmVtOyBjdXJzb3I6IHBvaW50ZXI7XCI+VGVzdDwvYnV0dG9uPlxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICAvLyBQbGV4IHN0YXR1cyAobm9uLWVkaXRhYmxlLCBqdXN0IHNob3dzIHN0YXR1cylcbiAgICBjb25zdCBwbGV4ID0gc2VydmljZXMucGxleDtcbiAgICBpZiAocGxleCkge1xuICAgICAgY29uc3QgcGxleENvbm5lY3RlZCA9IHBsZXguc3RhdHVzID09PSAnY29ubmVjdGVkJztcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgJHtwbGV4Q29ubmVjdGVkID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYm9yZGVyKSd9OyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTtcIj5cdUQ4M0NcdURGQUM8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPlBsZXg8L3NwYW4+XG4gICAgICAgICAgJHtzdGF0dXNCYWRnZShwbGV4LnN0YXR1cyl9XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbChwbGV4LnNvdXJjZSB8fCAnJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgLy8gU2VlcnIgc3RhdHVzXG4gICAgY29uc3Qgc2VlcnIgPSBzZXJ2aWNlcy5zZWVycjtcbiAgICBpZiAoc2VlcnIpIHtcbiAgICAgIGNvbnN0IHNlZXJyT2sgPSBzZWVyci5zdGF0dXMgPT09ICdjb25uZWN0ZWQnO1xuICAgICAgbGV0IGNvbmZpZ3VyZWRIdG1sID0gJyc7XG4gICAgICBpZiAoc2VlcnIuY29uZmlndXJlZFNlcnZpY2VzKSB7XG4gICAgICAgIGNvbnN0IGNzID0gc2VlcnIuY29uZmlndXJlZFNlcnZpY2VzO1xuICAgICAgICBjb25maWd1cmVkSHRtbCA9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+XG4gICAgICAgICAgQ29uZmlndXJlZDogJHtjcy5yYWRhcnIgPyAnJiMxMDAwMzsgUmFkYXJyJyA6ICcmIzEwMDA3OyBSYWRhcnInfSAmbWlkZG90O1xuICAgICAgICAgICR7Y3Muc29uYXJyID8gJyYjMTAwMDM7IFNvbmFycicgOiAnJiMxMDAwNzsgU29uYXJyJ30gJm1pZGRvdDtcbiAgICAgICAgICAke2NzLnBsZXggPyAnJiMxMDAwMzsgUGxleCcgOiAnJiMxMDAwNzsgUGxleCd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICR7c2VlcnJPayA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJvcmRlciknfTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxLjFyZW07XCI+XHVEODNEXHVEQ0NCPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDtcIj5TZWVycjwvc3Bhbj5cbiAgICAgICAgICAke3N0YXR1c0JhZGdlKHNlZXJyLnN0YXR1cyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke2NvbmZpZ3VyZWRIdG1sfVxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICBjcmVkZW50aWFsSW5wdXRzLmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICAvLyBUZXN0IGNvbm5lY3Rpb24gKGdsb2JhbCBmb3Igb25jbGljaylcbiAgd2luZG93LnNtYXJ0VGVzdENvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbihzZXJ2aWNlKSB7XG4gICAgY29uc3QgdXJsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc21hcnQtJHtzZXJ2aWNlfS11cmxgKTtcbiAgICBjb25zdCBrZXlJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3NlcnZpY2V9LWtleWApO1xuICAgIGNvbnN0IHN0YXR1c1NwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc21hcnQtJHtzZXJ2aWNlfS1zdGF0dXNgKTtcblxuICAgIGNvbnN0IHVybCA9IHVybElucHV0Py52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgYXBpS2V5ID0ga2V5SW5wdXQ/LnZhbHVlLnRyaW0oKTtcblxuICAgIGlmICghdXJsIHx8ICFhcGlLZXkpIHtcbiAgICAgIHN0YXR1c1NwYW4uaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RW50ZXIgVVJMIGFuZCBBUEkga2V5PC9zcGFuPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hcnIvdGVzdC1jb25uZWN0aW9uJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmljZSwgdXJsLCBhcGlLZXkgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7ICR7ZXNjYXBlSHRtbChkYXRhLmFwcE5hbWUgfHwgJ0Nvbm5lY3RlZCcpfSB2JHtlc2NhcGVIdG1sKGRhdGEudmVyc2lvbiB8fCAnJyl9PC9zcGFuPmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXNTcGFuLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7ICR7ZXNjYXBlSHRtbChkYXRhLmVycm9yKX08L3NwYW4+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdGF0dXNTcGFuLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvc3Bhbj5gO1xuICAgIH1cbiAgfTtcblxuICAvLyBQaGFzZSAzOiBTbWFydCBDb25uZWN0XG4gIGFzeW5jIGZ1bmN0aW9uIHNtYXJ0Q29ubmVjdCgpIHtcbiAgICBzaG93UGhhc2UoJ3Byb2dyZXNzJyk7XG4gICAgcHJvZ3Jlc3NTdGVwcy5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+PGRpdiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDhweDtcIj5Db25uZWN0aW5nIHNlcnZpY2VzLi4uPC9kaXY+PC9kaXY+JztcblxuICAgIC8vIEdhdGhlciBpbnB1dFxuICAgIGNvbnN0IHNlcnZpY2VzID0ge307XG4gICAgZm9yIChjb25zdCBzdmMgb2YgWydyYWRhcnInLCAnc29uYXJyJywgJ3Byb3dsYXJyJ10pIHtcbiAgICAgIGNvbnN0IHVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3N2Y30tdXJsYCk/LnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IGFwaUtleSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3N2Y30ta2V5YCk/LnZhbHVlLnRyaW0oKTtcbiAgICAgIGlmIChhcGlLZXkgJiYgdXJsKSB7XG4gICAgICAgIHNlcnZpY2VzW3N2Y10gPSB7IGFwaUtleSwgdXJsIH07XG4gICAgICB9IGVsc2UgaWYgKGFwaUtleSkge1xuICAgICAgICAvLyBLZXkgcHJvdmlkZWQgd2l0aG91dCBVUkwgLSBsZXQgYmFja2VuZCByZXNvbHZlXG4gICAgICAgIHNlcnZpY2VzW3N2Y10gPSB7IGFwaUtleSB9O1xuICAgICAgfVxuICAgICAgLy8gSWYgbm8ga2V5IGVudGVyZWQgYnV0IHNlcnZpY2Ugd2FzIGFscmVhZHkgY29ubmVjdGVkLCBiYWNrZW5kIHVzZXMgc3RvcmVkIGNyZWRlbnRpYWxzXG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIHNlcnZpY2VzOiBPYmplY3Qua2V5cyhzZXJ2aWNlcykubGVuZ3RoID4gMCA/IHNlcnZpY2VzIDogdW5kZWZpbmVkLFxuICAgICAgY29uZmlndXJlUGxleDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1wbGV4Jyk/LmNoZWNrZWQsXG4gICAgICBjb25maWd1cmVQcm93bGFycjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1wcm93bGFycicpPy5jaGVja2VkLFxuICAgICAgY29uZmlndXJlU2VlcnI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1vcHQtc2VlcnInKT8uY2hlY2tlZCxcbiAgICAgIHNhdmVDcmVkZW50aWFsczogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1zYXZlJyk/LmNoZWNrZWRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXJyL3NtYXJ0LWNvbm5lY3QnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAvLyBSZW5kZXIgcHJvZ3Jlc3Mgc3RlcHNcbiAgICAgIGxldCBzdGVwc0h0bWwgPSAnJztcbiAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiAoZGF0YS5zdGVwcyB8fCBbXSkpIHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHN0ZXAuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7PC9zcGFuPidcbiAgICAgICAgICAgICAgICAgICA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7PC9zcGFuPic7XG4gICAgICAgIGNvbnN0IGRldGFpbENvbG9yID0gc3RlcC5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICd2YXIoLS1tdXRlZCknIDogJ3ZhcigtLWJhZC1mZyknO1xuICAgICAgICBzdGVwc0h0bWwgKz0gYDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgcGFkZGluZzogNnB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICR7aWNvbn1cbiAgICAgICAgICA8c3Bhbj4ke2VzY2FwZUh0bWwoc3RlcC5zdGVwKX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogJHtkZXRhaWxDb2xvcn07XCI+JHtlc2NhcGVIdG1sKHN0ZXAuZGV0YWlscyB8fCAnJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgICAgcHJvZ3Jlc3NTdGVwcy5pbm5lckhUTUwgPSBzdGVwc0h0bWw7XG5cbiAgICAgIC8vIFNob3cgcmVzdWx0cyBhZnRlciBicmllZiBkZWxheVxuICAgICAgc2V0VGltZW91dCgoKSA9PiBzaG93UmVzdWx0cyhkYXRhKSwgNTAwKTtcblxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHByb2dyZXNzU3RlcHMuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5Db25uZWN0aW9uIGVycm9yOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBoYXNlIDQ6IFJlc3VsdHNcbiAgZnVuY3Rpb24gc2hvd1Jlc3VsdHMoZGF0YSkge1xuICAgIHNob3dQaGFzZSgncmVzdWx0cycpO1xuXG4gICAgY29uc3QgcyA9IGRhdGEuc3VtbWFyeSB8fCB7fTtcbiAgICBjb25zdCBhbGxHb29kID0gcy5mYWlsZWQgPT09IDAgJiYgcy5zdWNjZWVkZWQgPiAwO1xuICAgIGNvbnN0IGhlYWRlckNvbG9yID0gYWxsR29vZCA/ICd2YXIoLS1vay1mZyknIDogJyNmMzljMTInO1xuICAgIGNvbnN0IGhlYWRlckljb24gPSBhbGxHb29kID8gJyYjMTAwMDM7JyA6ICcmIzk4ODg7JztcbiAgICBjb25zdCBoZWFkZXJUZXh0ID0gYWxsR29vZCA/ICdBbGwgQ29ubmVjdGVkIScgOiBgJHtlc2NhcGVIdG1sKFN0cmluZyhzLnN1Y2NlZWRlZCkpfS8ke2VzY2FwZUh0bWwoU3RyaW5nKHMudG90YWxTdGVwcykpfSBTdGVwcyBTdWNjZWVkZWRgO1xuXG4gICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMTZweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICR7aGVhZGVyQ29sb3J9IDEyJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCAke2hlYWRlckNvbG9yfTsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuNXJlbTsgY29sb3I6ICR7aGVhZGVyQ29sb3J9O1wiPiR7aGVhZGVySWNvbn08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICR7aGVhZGVyQ29sb3J9O1wiPiR7aGVhZGVyVGV4dH08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj4ke2VzY2FwZUh0bWwoU3RyaW5nKHMuc3VjY2VlZGVkKSl9IHN1Y2NlZWRlZCwgJHtlc2NhcGVIdG1sKFN0cmluZyhzLmZhaWxlZCkpfSBmYWlsZWQ8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gICAgLy8gU3RlcHMgZGV0YWlsXG4gICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNHB4O1wiPic7XG4gICAgZm9yIChjb25zdCBzdGVwIG9mIChkYXRhLnN0ZXBzIHx8IFtdKSkge1xuICAgICAgY29uc3QgaWNvbiA9IHN0ZXAuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7PC9zcGFuPidcbiAgICAgICAgICAgICAgICAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj4mIzEwMDA3Ozwvc3Bhbj4nO1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBwYWRkaW5nOiA0cHggOHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cbiAgICAgICAgJHtpY29ufSAke2VzY2FwZUh0bWwoc3RlcC5zdGVwKX0gPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjc1cmVtO1wiPiR7ZXNjYXBlSHRtbChzdGVwLmRldGFpbHMgfHwgJycpfTwvc3Bhbj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICByZXN1bHRzQ29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgLy8gU2hvdyByZXRyeSBidXR0b24gaWYgYW55IGZhaWx1cmVzXG4gICAgcmV0cnlCdG4uc3R5bGUuZGlzcGxheSA9IHMuZmFpbGVkID4gMCA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAvLyBGZXRjaCBQbGV4IGxpYnJhcmllcyBpZiBQbGV4IHdhcyBjb25uZWN0ZWRcbiAgICBpZiAoZGF0YS5zdGVwcz8uc29tZShzdCA9PiBzdC5zdGVwLmluY2x1ZGVzKCdQbGV4JykgJiYgc3Quc3RhdHVzID09PSAnc3VjY2VzcycpKSB7XG4gICAgICBmZXRjaFBsZXhMaWJyYXJpZXMoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFBsZXhMaWJyYXJpZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3BsZXgvbGlicmFyaWVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5saWJyYXJpZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+XHVEODNDXHVERkFDICR7ZXNjYXBlSHRtbChkYXRhLnNlcnZlck5hbWUpfSBMaWJyYXJpZXM8L2g0PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogOHB4O1wiPmA7XG4gICAgICAgIGZvciAoY29uc3QgbGliIG9mIGRhdGEubGlicmFyaWVzKSB7XG4gICAgICAgICAgY29uc3QgdHlwZUljb24gPSBsaWIudHlwZSA9PT0gJ21vdmllJyA/ICdcdUQ4M0NcdURGQUMnIDogbGliLnR5cGUgPT09ICdzaG93JyA/ICdcdUQ4M0RcdURDRkEnIDogJ1x1RDgzQ1x1REZCNSc7XG4gICAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICAke3R5cGVJY29ufSA8c3Ryb25nPiR7ZXNjYXBlSHRtbChsaWIudGl0bGUpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKFN0cmluZyhsaWIuY291bnQpKX0gaXRlbXM8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICAgICAgICBwbGV4TGlicmFyaWVzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHBsZXhMaWJyYXJpZXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIFBsZXggbGlicmFyeSBmZXRjaCBlcnJvcnNcbiAgICB9XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIHBsZXhMaWJyYXJpZXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzbWFydERldGVjdCgpO1xuICB9KTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG4gIGNvbm5lY3RCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc21hcnRDb25uZWN0KTtcbiAgcmV0cnlCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc21hcnRDb25uZWN0KTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IE5PVElGSUNBVElPTiBTRVRUSU5HUyA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ25vdGlmaWNhdGlvbnMtbW9kYWwnLCBgPGRpdiBpZD1cIm5vdGlmaWNhdGlvbnMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDU1MHB4OyBtYXgtd2lkdGg6IDY1MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1REQxNCBOb3RpZmljYXRpb24gU2V0dGluZ3M8L2gzPlxuXG4gICAgICA8IS0tIE1hc3RlciBUb2dnbGUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWNjZW50LWluZm8tYm94XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm5vdGlmaWNhdGlvbnMtZW5hYmxlZFwiIC8+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+RW5hYmxlIE5vdGlmaWNhdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10aW55LW11dGVkXCI+UmVjZWl2ZSBhbGVydHMgd2hlbiBjb250YWluZXJzIGdvIHVwL2Rvd248L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFByb3ZpZGVycyBTZWN0aW9uIC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+Tm90aWZpY2F0aW9uIFByb3ZpZGVyczwvaDQ+XG5cbiAgICAgIDwhLS0gRGlzY29yZCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tcHJvdmlkZXIgcHJvdmlkZXItY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvdmlkZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImRpc2NvcmQtZW5hYmxlZFwiIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LTUwMFwiPkRpc2NvcmQ8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZGlzY29yZC10ZXN0XCIgY2xhc3M9XCJ0ZXN0LWJ0biBidG4teHNcIj5UZXN0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZGlzY29yZC1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5XZWJob29rIFVSTDo8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZGlzY29yZC13ZWJob29rXCIgcGxhY2Vob2xkZXI9XCJodHRwczovL2Rpc2NvcmQuY29tL2FwaS92MS93ZWJob29rcy8uLi5cIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGVsZWdyYW0gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ0ZWxlZ3JhbS1lbmFibGVkXCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+VGVsZWdyYW08L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwidGVsZWdyYW0tdGVzdFwiIGNsYXNzPVwidGVzdC1idG4gYnRuLXhzXCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInRlbGVncmFtLWNvbmZpZ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC0yY29sXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPkJvdCBUb2tlbjo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRlbGVncmFtLWJvdC10b2tlblwiIHBsYWNlaG9sZGVyPVwiMTIzNDU2OkFCQy4uLlwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+Q2hhdCBJRDo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRlbGVncmFtLWNoYXQtaWRcIiBwbGFjZWhvbGRlcj1cIi0xMDAxMjM0NTY3ODkwXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIG50Znkuc2ggLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJudGZ5LWVuYWJsZWRcIiAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy01MDBcIj5udGZ5LnNoPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cIm50ZnktdGVzdFwiIGNsYXNzPVwidGVzdC1idG4gYnRuLXhzXCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cIm50ZnktY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDJmciAxZnI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5TZXJ2ZXIgVVJMOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwibnRmeS1zZXJ2ZXJcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vbnRmeS5zaFwiIHZhbHVlPVwiaHR0cHM6Ly9udGZ5LnNoXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5Ub3BpYzo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIm50ZnktdG9waWNcIiBwbGFjZWhvbGRlcj1cImRhc2hjYWRkeS1hbGVydHNcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRW1haWwgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJlbWFpbC1lbmFibGVkXCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+RW1haWwgKFNNVFApPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImVtYWlsLXRlc3RcIiBjbGFzcz1cInRlc3QtYnRuIGJ0bi14c1wiPlRlc3Q8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJlbWFpbC1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmcjsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+U01UUCBIb3N0OjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtaG9zdFwiIHBsYWNlaG9sZGVyPVwic210cC5nbWFpbC5jb21cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlBvcnQ6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVtYWlsLXBvcnRcIiB2YWx1ZT1cIjU4N1wiIHBsYWNlaG9sZGVyPVwiNTg3XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlVzZXJuYW1lOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtdXNlclwiIHBsYWNlaG9sZGVyPVwidXNlckBnbWFpbC5jb21cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlBhc3N3b3JkOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImVtYWlsLXBhc3NcIiBwbGFjZWhvbGRlcj1cImFwcCBwYXNzd29yZFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+RnJvbTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVtYWlsLWZyb21cIiBwbGFjZWhvbGRlcj1cIkRhc2hDYWRkeSAmbHQ7bm9yZXBseUBleGFtcGxlLmNvbSZndDtcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlRvOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtdG9cIiBwbGFjZWhvbGRlcj1cImFkbWluQGV4YW1wbGUuY29tXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZW1haWwtc2VjdXJlXCIgLz4gVXNlIFRMUyAocG9ydCA0NjUpXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIZWFsdGggQ2hlY2sgU2V0dGluZ3MgLS0+XG4gICAgICA8aDQgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj5IZWFsdGggTW9uaXRvcmluZzwvaDQ+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IGN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJoZWFsdGgtY2hlY2stZW5hYmxlZFwiIC8+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+RW5hYmxlIEhlYWx0aCBNb25pdG9yaW5nPC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtdGlueS1tdXRlZFwiPlBlcmlvZGljYWxseSBjaGVjayBjb250YWluZXIgc3RhdHVzPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY2hlY2stY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5DaGVjayBpbnRlcnZhbDo8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJoZWFsdGgtY2hlY2staW50ZXJ2YWxcIiBzdHlsZT1cIndpZHRoOiBhdXRvO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj4xIG1pbnV0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjVcIiBzZWxlY3RlZD41IG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxNVwiPjE1IG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIzMFwiPjMwIG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI2MFwiPjEgaG91cjwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtY2hlY2stbm93XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc1cmVtOyBtYXJnaW4tbGVmdDogYXV0bztcIj5DaGVjayBOb3c8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY2hlY2stc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDhweDtcIj5cbiAgICAgICAgICBMYXN0IGNoZWNrOiBOZXZlclxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEV2ZW50IFR5cGVzIC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+RXZlbnRzIHRvIE5vdGlmeTwvaDQ+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWNvbnRhaW5lci1kb3duXCIgY2hlY2tlZCAvPiBDb250YWluZXIgRG93blxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWNvbnRhaW5lci11cFwiIGNoZWNrZWQgLz4gQ29udGFpbmVyIFJlY292ZXJlZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWRlcGxveS1zdWNjZXNzXCIgY2hlY2tlZCAvPiBEZXBsb3ltZW50IFN1Y2Nlc3NcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWwtc21cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1kZXBsb3ktZmFpbGVkXCIgY2hlY2tlZCAvPiBEZXBsb3ltZW50IEZhaWxlZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiIHN0eWxlPVwiZ3JpZC1jb2x1bW46IDEgLyAtMTtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1yZXNvdXJjZS1hbGVydFwiIGNoZWNrZWQgLz4gUmVzb3VyY2UgQWxlcnRzXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIaXN0b3J5IC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+Tm90aWZpY2F0aW9uIEhpc3Rvcnk8L2g0PlxuICAgICAgPGRpdiBpZD1cIm5vdGlmaWNhdGlvbi1oaXN0b3J5XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAxNTBweDsgb3ZlcmZsb3cteTogYXV0bzsgcGFkZGluZzogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPk5vIG5vdGlmaWNhdGlvbnMgeWV0PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJsYXN0LW5vdGlmaWNhdGlvbi1zZW50XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogNnB4O1wiPjwvZGl2PlxuXG4gICAgICA8IS0tIEJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cIm5vdGlmaWNhdGlvbnMtc2VuZC10ZXN0XCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IGF1dG87XCI+U2VuZCBUZXN0PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJub3RpZmljYXRpb25zLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwibm90aWZpY2F0aW9ucy1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZSBTZXR0aW5nczwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW5hZ2Utbm90aWZpY2F0aW9ucycpO1xuICBjb25zdCBzYXZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtc2F2ZScpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9ucy1jYW5jZWwnKTtcblxuICAvLyBQcm92aWRlciB0b2dnbGUgaGFuZGxlcnNcbiAgWydkaXNjb3JkJywgJ3RlbGVncmFtJywgJ250ZnknLCAnZW1haWwnXS5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3Byb3ZpZGVyfS1lbmFibGVkYCk7XG4gICAgY29uc3QgY29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7cHJvdmlkZXJ9LWNvbmZpZ2ApO1xuXG4gICAgY2hlY2tib3g/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIGNvbmZpZy5zdHlsZS5kaXNwbGF5ID0gY2hlY2tib3guY2hlY2tlZCA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEhlYWx0aCBjaGVjayB0b2dnbGVcbiAgY29uc3QgaGVhbHRoQ2hlY2tFbmFibGVkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1lbmFibGVkJyk7XG4gIGNvbnN0IGhlYWx0aENoZWNrQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1jb25maWcnKTtcbiAgaGVhbHRoQ2hlY2tFbmFibGVkPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaGVhbHRoQ2hlY2tDb25maWcuc3R5bGUub3BhY2l0eSA9IGhlYWx0aENoZWNrRW5hYmxlZC5jaGVja2VkID8gJzEnIDogJzAuNSc7XG4gIH0pO1xuXG4gIC8vIExvYWQgbm90aWZpY2F0aW9uIGNvbmZpZyBmcm9tIEFQSVxuICBhc3luYyBmdW5jdGlvbiBsb2FkTm90aWZpY2F0aW9uQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvY29uZmlnJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGRhdGEuY29uZmlnO1xuXG4gICAgICAgIC8vIE1hc3RlciB0b2dnbGVcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcuZW5hYmxlZDtcblxuICAgICAgICAvLyBQcm92aWRlcnNcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc2NvcmQtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5kaXNjb3JkPy5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy50ZWxlZ3JhbT8uZW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5udGZ5Py5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5lbWFpbD8uZW5hYmxlZCB8fCBmYWxzZTtcblxuICAgICAgICAvLyBTaG93L2hpZGUgY29uZmlnIHNlY3Rpb25zXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3JkLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5kaXNjb3JkPy5lbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy50ZWxlZ3JhbT8uZW5hYmxlZCA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudGZ5LWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5udGZ5Py5lbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5lbWFpbD8uZW5hYmxlZCA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAgICAgLy8gbnRmeSBzZXJ2ZXIgVVJMXG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZXJzPy5udGZ5Py5zZXJ2ZXJVcmwpIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS1zZXJ2ZXInKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMubnRmeS5zZXJ2ZXJVcmw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbWFpbCBmaWVsZHNcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5ob3N0KSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtaG9zdCcpLnZhbHVlID0gY29uZmlnLnByb3ZpZGVycy5lbWFpbC5ob3N0O1xuICAgICAgICBpZiAoY29uZmlnLnByb3ZpZGVycz8uZW1haWw/LmZyb20pIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1mcm9tJykudmFsdWUgPSBjb25maWcucHJvdmlkZXJzLmVtYWlsLmZyb207XG5cbiAgICAgICAgLy8gSGVhbHRoIGNoZWNrXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2stZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcuaGVhbHRoQ2hlY2s/LmVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICAgIGlmIChjb25maWcuaGVhbHRoQ2hlY2s/LmludGVydmFsTWludXRlcykge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2staW50ZXJ2YWwnKS52YWx1ZSA9IGNvbmZpZy5oZWFsdGhDaGVjay5pbnRlcnZhbE1pbnV0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5oZWFsdGhDaGVjaz8ubGFzdENoZWNrKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1zdGF0dXMnKS50ZXh0Q29udGVudCA9XG4gICAgICAgICAgICBgTGFzdCBjaGVjazogJHtuZXcgRGF0ZShjb25maWcuaGVhbHRoQ2hlY2subGFzdENoZWNrKS50b0xvY2FsZVN0cmluZygpfWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFdmVudHNcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWNvbnRhaW5lci1kb3duJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LmNvbnRhaW5lckRvd24gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtY29udGFpbmVyLXVwJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LmNvbnRhaW5lclVwICE9PSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWRlcGxveS1zdWNjZXNzJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LmRlcGxveW1lbnRTdWNjZXNzICE9PSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWRlcGxveS1mYWlsZWQnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uZGVwbG95bWVudEZhaWxlZCAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1yZXNvdXJjZS1hbGVydCcpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5yZXNvdXJjZUFsZXJ0ICE9PSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbTm90aWZpY2F0aW9uc10gTG9hZCBDb25maWcnLCBlcnJvciwgeyBmdW5jdGlvbjogJ2xvYWRDb25maWcnIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIExvYWQgbm90aWZpY2F0aW9uIGhpc3RvcnlcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZE5vdGlmaWNhdGlvbkhpc3RvcnkoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy9oaXN0b3J5P2xpbWl0PTEwJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uLWhpc3RvcnknKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5oaXN0b3J5Py5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBkYXRhLmhpc3RvcnkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpdGVtLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICBjb25zdCB0eXBlQ29sb3JzID0ge1xuICAgICAgICAgICAgc3VjY2VzczogJ3ZhcigtLW9rLWZnKScsXG4gICAgICAgICAgICBlcnJvcjogJ3ZhcigtLWJhZC1mZyknLFxuICAgICAgICAgICAgd2FybmluZzogJyNmMzljMTInLFxuICAgICAgICAgICAgaW5mbzogJ3ZhcigtLWFjY2VudCknXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICR7dHlwZUNvbG9yc1tpdGVtLnR5cGVdIHx8ICd2YXIoLS1tdXRlZCknfVwiPiR7aXRlbS50eXBlID09PSAnc3VjY2VzcycgPyAnXHUyNzEzJyA6IGl0ZW0udHlwZSA9PT0gJ2Vycm9yJyA/ICdcdTI3MTcnIDogJ1x1MjEzOSd9PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgbWluLXdpZHRoOiAwO1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNTAwOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcIj4ke2VzY2FwZUh0bWwoaXRlbS50aXRsZSl9PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZGF0ZX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgO1xuICAgICAgICB9KS5qb2luKCcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj5ObyBub3RpZmljYXRpb25zIHlldDwvZGl2Pic7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW05vdGlmaWNhdGlvbnNdIExvYWQgSGlzdG9yeScsIGVycm9yLCB7IGZ1bmN0aW9uOiAnbG9hZEhpc3RvcnknIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNhdmUgbm90aWZpY2F0aW9uIGNvbmZpZ1xuICBhc3luYyBmdW5jdGlvbiBzYXZlTm90aWZpY2F0aW9uQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb25zLWVuYWJsZWQnKS5jaGVja2VkLFxuICAgICAgICBwcm92aWRlcnM6IHtcbiAgICAgICAgICBkaXNjb3JkOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzY29yZC1lbmFibGVkJykuY2hlY2tlZCxcbiAgICAgICAgICAgIHdlYmhvb2tVcmw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3JkLXdlYmhvb2snKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRlbGVncmFtOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgICBib3RUb2tlbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLWJvdC10b2tlbicpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIGNoYXRJZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLWNoYXQtaWQnKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIG50Znk6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudGZ5LWVuYWJsZWQnKS5jaGVja2VkLFxuICAgICAgICAgICAgc2VydmVyVXJsOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS1zZXJ2ZXInKS52YWx1ZS50cmltKCkgfHwgJ2h0dHBzOi8vbnRmeS5zaCcsXG4gICAgICAgICAgICB0b3BpYzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktdG9waWMnKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVtYWlsOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgICBob3N0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtaG9zdCcpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1wb3J0JykudmFsdWUpIHx8IDU4NyxcbiAgICAgICAgICAgIHNlY3VyZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXNlY3VyZScpLmNoZWNrZWQsXG4gICAgICAgICAgICB1c2VyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtdXNlcicpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIHBhc3M6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1wYXNzJykudmFsdWUudHJpbSgpLFxuICAgICAgICAgICAgZnJvbTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLWZyb20nKS52YWx1ZS50cmltKCksXG4gICAgICAgICAgICB0bzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXRvJykudmFsdWUudHJpbSgpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICBjb250YWluZXJEb3duOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtY29udGFpbmVyLWRvd24nKS5jaGVja2VkLFxuICAgICAgICAgIGNvbnRhaW5lclVwOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtY29udGFpbmVyLXVwJykuY2hlY2tlZCxcbiAgICAgICAgICBkZXBsb3ltZW50U3VjY2VzczogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWRlcGxveS1zdWNjZXNzJykuY2hlY2tlZCxcbiAgICAgICAgICBkZXBsb3ltZW50RmFpbGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZGVwbG95LWZhaWxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgcmVzb3VyY2VBbGVydDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LXJlc291cmNlLWFsZXJ0JykuY2hlY2tlZFxuICAgICAgICB9LFxuICAgICAgICBoZWFsdGhDaGVjazoge1xuICAgICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2stZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgaW50ZXJ2YWxNaW51dGVzOiBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWludGVydmFsJykudmFsdWUpIHx8IDVcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9ub3RpZmljYXRpb25zL2NvbmZpZycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb25maWcpXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignTm90aWZpY2F0aW9uIHNldHRpbmdzIHNhdmVkJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIHNhdmU6ICR7ZGF0YS5lcnJvcn1gLCAnZXJyb3InLCAzMDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCAzMDAwKTtcbiAgICB9XG4gIH1cblxuICAvLyBUZXN0IG5vdGlmaWNhdGlvbiBoYW5kbGVyc1xuICBhc3luYyBmdW5jdGlvbiB0ZXN0UHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9ub3RpZmljYXRpb25zL3Rlc3QnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwcm92aWRlciB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYFRlc3QgJHtwcm92aWRlcn0gbm90aWZpY2F0aW9uIHNlbnQhYCwgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYFRlc3QgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgfVxuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc2NvcmQtdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRlc3RQcm92aWRlcignZGlzY29yZCcpKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLXRlc3QnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0ZXN0UHJvdmlkZXIoJ3RlbGVncmFtJykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS10ZXN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGVzdFByb3ZpZGVyKCdudGZ5JykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRlc3RQcm92aWRlcignZW1haWwnKSk7XG5cbiAgLy8gSGVhbHRoIGNoZWNrIG5vdyBidXR0b25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1ub3cnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy9oZWFsdGgtY2hlY2snLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLXN0YXR1cycpLnRleHRDb250ZW50ID1cbiAgICAgICAgICBgTGFzdCBjaGVjazogJHtuZXcgRGF0ZShkYXRhLmxhc3RDaGVjaykudG9Mb2NhbGVTdHJpbmcoKX0gKCR7ZGF0YS5jb250YWluZXJzTW9uaXRvcmVkfSBjb250YWluZXJzKWA7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0hlYWx0aCBjaGVjayBjb21wbGV0ZWQnLCAnc3VjY2VzcycsIDIwMDApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIDMwMDApO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTW9kYWwgaGFuZGxlcnNcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWROb3RpZmljYXRpb25Db25maWcoKTtcbiAgICBsb2FkTm90aWZpY2F0aW9uSGlzdG9yeSgpO1xuICB9KTtcblxuICBzYXZlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNhdmVOb3RpZmljYXRpb25Db25maWcpO1xuXG4gIC8vIFNlbmQgVGVzdCBidXR0b24gLSBzZW5kcyB0ZXN0IG5vdGlmaWNhdGlvbiB0byBhbGwgZW5hYmxlZCBwcm92aWRlcnNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtc2VuZC10ZXN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb25zLXNlbmQtdGVzdCcpO1xuICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICBidG4udGV4dENvbnRlbnQgPSAnU2VuZGluZy4uLic7XG4gICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvc2VuZCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IFxuICAgICAgICAgIGV2ZW50OiAndGVzdCcsXG4gICAgICAgICAgZGF0YTogeyBtZXNzYWdlOiAnVGhpcyBpcyBhIHRlc3Qgbm90aWZpY2F0aW9uIGZyb20gRGFzaENhZGR5LicgfSxcbiAgICAgICAgICB0eXBlOiAnaW5mbydcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdUZXN0IG5vdGlmaWNhdGlvbiBzZW50IScsICdzdWNjZXNzJywgMzAwMCk7XG4gICAgICAgIC8vIFVwZGF0ZSBsYXN0IHNlbnQgdGltZXN0YW1wXG4gICAgICAgIGxvYWROb3RpZmljYXRpb25TdGF0dXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYFRlc3QgZmFpbGVkOiAke2RhdGEucmVzdWx0cz8ubWFwKHIgPT4gYCR7ci5wcm92aWRlcn06ICR7ci5lcnJvciB8fCAnb2snfWApLmpvaW4oJywgJyl9YCwgJ2Vycm9yJywgNTAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTG9hZCBub3RpZmljYXRpb24gc3RhdHVzIChsYXN0IHNlbnQgdGltZXN0YW1wKVxuICBhc3luYyBmdW5jdGlvbiBsb2FkTm90aWZpY2F0aW9uU3RhdHVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLmxhc3RTZW50KSB7XG4gICAgICAgIGNvbnN0IGxhc3RTZW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFzdC1ub3RpZmljYXRpb24tc2VudCcpO1xuICAgICAgICBpZiAobGFzdFNlbnRFbCkge1xuICAgICAgICAgIGxhc3RTZW50RWwudGV4dENvbnRlbnQgPSBgTGFzdCBzZW50OiAke25ldyBEYXRlKGRhdGEubGFzdFNlbnQpLnRvTG9jYWxlU3RyaW5nKCl9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBTaWxlbnRseSBmYWlsIC0gc3RhdHVzIGlzIG5vdCBjcml0aWNhbFxuICAgIH1cbiAgfVxuXG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFBBTkVMIFRBQiBTV0lUQ0hJTkcgKHNoYXJlZCB1dGlsaXR5KSA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBjb25zdCB0YWIgPSBlLnRhcmdldC5jbG9zZXN0KCcucGFuZWwtdGFiJyk7XG4gICAgaWYgKCF0YWIpIHJldHVybjtcbiAgICBjb25zdCBwYW5lbElkID0gdGFiLmRhdGFzZXQucGFuZWw7XG4gICAgaWYgKCFwYW5lbElkKSByZXR1cm47XG4gICAgY29uc3QgdGFiQmFyID0gdGFiLmNsb3Nlc3QoJy5wYW5lbC10YWJzJyk7XG4gICAgY29uc3QgbW9kYWxDb250ZW50ID0gdGFiQmFyLmNsb3Nlc3QoJy53ZWF0aGVyLW1vZGFsLWNvbnRlbnQnKTtcbiAgICB0YWJCYXIucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXRhYicpLmZvckVhY2godCA9PiB0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgICB0YWIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgbW9kYWxDb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYW5lbC1zZWN0aW9uJykuZm9yRWFjaChzID0+IHMuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgIGNvbnN0IHRhcmdldCA9IG1vZGFsQ29udGVudC5xdWVyeVNlbGVjdG9yKCcjJyArIHBhbmVsSWQpO1xuICAgIGlmICh0YXJnZXQpIHRhcmdldC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBVTklGSUVEIEJBQ0tVUC9SRVNUT1JFIHYyLjAgPT09PT09PT09PVxuLy8gU2luZ2xlIGZpbGUgY2FwdHVyZXMgZXZlcnl0aGluZzogc2VydmVyIGNvbmZpZyArIGJyb3dzZXIgc3RhdGUgKyB0aGVtZXMgKyBlbmNyeXB0aW9uIGtleVxuKGZ1bmN0aW9uKCkge1xuICAvLyBBbGwgRGFzaENhZGR5IGxvY2FsU3RvcmFnZSBrZXlzIHRvIGluY2x1ZGUgaW4gYmFja3VwXG4gIHZhciBCUk9XU0VSX1NUQVRFX0tFWVMgPSBbXG4gICAgJ2Rhc2hjYWRkeV9zaXRlX2NvbmZpZycsICdkYXNoY2FkZHlfb25ib2FyZGluZycsICdkYXNoY2FkZHktZW5jcnlwdGlvbi1rZXknLFxuICAgICdkYXNoY2FkZHktc2V0dXAnLCAnZGFzaGNhZGR5LWNvbmZpZycsXG4gICAgJ3RoZW1lJywgJ3VzZXItdGhlbWVzJywgJ2N1c3RvbS10aGVtZScsXG4gICAgJ2N1c3RvbS1hcHBzJywgJ2N1c3RvbS1zZXJ2aWNlcycsICd0b29sYmFyLXNlY3Rpb25zJyxcbiAgICAnd2VhdGhlci1sb2NhdGlvbicsICd3ZWF0aGVyLXppcCcsICd3ZWF0aGVyLWdlbycsICd3ZWF0aGVyLXVuaXQnLFxuICAgICdjbG9jay1zdHlsZScsICdjbG9jay1jaGltZXMnLCAnY2xvY2stY2hpbWUtdm9sdW1lJ1xuICBdO1xuXG4gIC8vIENvbGxlY3QgYWxsIERhc2hDYWRkeSBicm93c2VyIHN0YXRlIGZyb20gbG9jYWxTdG9yYWdlXG4gIGZ1bmN0aW9uIGNvbGxlY3RCcm93c2VyU3RhdGUoKSB7XG4gICAgdmFyIHN0YXRlID0ge307XG4gICAgLy8gR3JhYiBhbGwgd2hpdGVsaXN0ZWQga2V5c1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQlJPV1NFUl9TVEFURV9LRVlTLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gQlJPV1NFUl9TVEFURV9LRVlTW2ldO1xuICAgICAgdmFyIHZhbCA9IHNhZmVHZXQoa2V5KTtcbiAgICAgIGlmICh2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQpIHN0YXRlW2tleV0gPSB2YWw7XG4gICAgfVxuICAgIC8vIEdyYWIgZHluYW1pYyB3aWRnZXQtKi1lbmFibGVkIGtleXNcbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsb2NhbFN0b3JhZ2UubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGsgPSBsb2NhbFN0b3JhZ2Uua2V5KGopO1xuICAgICAgICBpZiAoL153aWRnZXQtListZW5hYmxlZCQvLnRlc3QoaykpIHtcbiAgICAgICAgICBzdGF0ZVtrXSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGspO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyAvKiBwcml2YXRlIGJyb3dzaW5nICovIH1cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvLyBSZXN0b3JlIGJyb3dzZXIgc3RhdGUgZnJvbSBiYWNrdXAgaW50byBsb2NhbFN0b3JhZ2VcbiAgZnVuY3Rpb24gcmVzdG9yZUJyb3dzZXJTdGF0ZShicm93c2VyU3RhdGUpIHtcbiAgICBpZiAoIWJyb3dzZXJTdGF0ZSB8fCB0eXBlb2YgYnJvd3NlclN0YXRlICE9PSAnb2JqZWN0JykgcmV0dXJuIDA7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICBmb3IgKHZhciBrZXkgaW4gYnJvd3NlclN0YXRlKSB7XG4gICAgICBpZiAoIWJyb3dzZXJTdGF0ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZTtcbiAgICAgIHNhZmVTZXQoa2V5LCBicm93c2VyU3RhdGVba2V5XSk7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgbGVnYWN5IHYxLjAuMCBpbXBvcnQtZXhwb3J0IGZvcm1hdCAocHJlLWJhY2t1cCBtb2RhbClcbiAgZnVuY3Rpb24gaXNMZWdhY3lGb3JtYXQoZGF0YSkge1xuICAgIHJldHVybiBkYXRhLnZlcnNpb24gJiYgIWRhdGEuZmlsZXMgJiYgZGF0YS5zZXJ2aWNlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3RvcmVMZWdhY3lGb3JtYXQoZGF0YSkge1xuICAgIC8vIE1hcCB0aGUgb2xkIGZsYXQga2V5cyBpbnRvIGJyb3dzZXJTdGF0ZSBmb3IgbG9jYWxTdG9yYWdlIHJlc3RvcmVcbiAgICB2YXIgYnJvd3NlclN0YXRlID0ge307XG4gICAgaWYgKGRhdGEuY3VzdG9tU2VydmljZXMpIGJyb3dzZXJTdGF0ZVsnY3VzdG9tLXNlcnZpY2VzJ10gPSBKU09OLnN0cmluZ2lmeShkYXRhLmN1c3RvbVNlcnZpY2VzKTtcbiAgICBpZiAoZGF0YS5jdXN0b21BcHBzKSBicm93c2VyU3RhdGVbJ2N1c3RvbS1hcHBzJ10gPSBKU09OLnN0cmluZ2lmeShkYXRhLmN1c3RvbUFwcHMpO1xuICAgIGlmIChkYXRhLndlYXRoZXJaaXApIGJyb3dzZXJTdGF0ZVsnd2VhdGhlci16aXAnXSA9IGRhdGEud2VhdGhlclppcDtcbiAgICBpZiAoZGF0YS50aGVtZSkgYnJvd3NlclN0YXRlWyd0aGVtZSddID0gZGF0YS50aGVtZTtcbiAgICBpZiAoZGF0YS51c2VyVGhlbWVzICYmIE9iamVjdC5rZXlzKGRhdGEudXNlclRoZW1lcykubGVuZ3RoKSBicm93c2VyU3RhdGVbJ3VzZXItdGhlbWVzJ10gPSBKU09OLnN0cmluZ2lmeShkYXRhLnVzZXJUaGVtZXMpO1xuICAgIHJlc3RvcmVCcm93c2VyU3RhdGUoYnJvd3NlclN0YXRlKTtcblxuICAgIC8vIFB1c2ggc2VydmljZXMgdG8gc2VydmVyIGlmIGF2YWlsYWJsZVxuICAgIGlmIChkYXRhLnNlcnZpY2VzICYmIEFycmF5LmlzQXJyYXkoZGF0YS5zZXJ2aWNlcykpIHtcbiAgICAgIHNlY3VyZUZldGNoKCcvYXBpL3YxL3NlcnZpY2VzJywge1xuICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YS5zZXJ2aWNlcylcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkge30pO1xuICAgIH1cblxuICAgIC8vIFB1c2ggdGhlbWVzIHRvIHNlcnZlciBpZiBhdmFpbGFibGVcbiAgICBpZiAoZGF0YS51c2VyVGhlbWVzKSB7XG4gICAgICBPYmplY3Qua2V5cyhkYXRhLnVzZXJUaGVtZXMpLmZvckVhY2goZnVuY3Rpb24oc2x1Zykge1xuICAgICAgICB2YXIgdCA9IGRhdGEudXNlclRoZW1lc1tzbHVnXTtcbiAgICAgICAgdmFyIGNvbG9ycyA9IHt9O1xuICAgICAgICAod2luZG93LlRIRU1FX1BST1BTIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uKHApIHsgaWYgKHRbcF0pIGNvbG9yc1twXSA9IHRbcF07IH0pO1xuICAgICAgICBzZWN1cmVGZXRjaCgnL2FwaS92MS90aGVtZXMvJyArIHNsdWcsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IHQubmFtZSB8fCBzbHVnLCBjb2xvcnM6IGNvbG9ycyB9KVxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHt9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdiYWNrdXAtbW9kYWwnLCBgPGRpdiBpZD1cImJhY2t1cC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNTUwcHg7IG1heC13aWR0aDogNjUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0JFIEJhY2t1cCAmIFJlc3RvcmU8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlxuICAgICAgICBGdWxsIGJhY2t1cCBvZiB5b3VyIGVudGlyZSBEYXNoQ2FkZHkgc2V0dXAgXHUyMDE0IHNlcnZlciBjb25maWcsIGNyZWRlbnRpYWxzLCB0aGVtZXMsIGFuZCBicm93c2VyIHByZWZlcmVuY2VzIGluIG9uZSBmaWxlLlxuICAgICAgPC9wPlxuXG4gICAgICA8IS0tIFRhYiBiYXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJiYWNrdXAtbWFudWFsXCI+TWFudWFsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiYmFja3VwLXNjaGVkdWxlcy10YWJcIj5TY2hlZHVsZXM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJiYWNrdXAtZGlzay10YWJcIj5CYWNrdXBzIG9uIERpc2s8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJiYWNrdXAtcG9pbnRpbnRpbWUtdGFiXCI+UG9pbnQtaW4tVGltZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImJhY2t1cC1oaXN0b3J5LXRhYlwiPkhpc3Rvcnk8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogTWFudWFsIC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1tYW51YWxcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDwhLS0gRXhwb3J0IFNlY3Rpb24gLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4OyBwYWRkaW5nOiAxNnB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCBjb2xvci1taXgoaW4gc3JnYiwgIzI3YWU2MCAxNSUsIHRyYW5zcGFyZW50KSwgY29sb3ItbWl4KGluIHNyZ2IsICMyZWNjNzEgMTAlLCB0cmFuc3BhcmVudCkpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCAjMjdhZTYwO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDhweDsgY29sb3I6ICMyZWNjNzE7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cdUQ4M0RcdURDRTQgRXhwb3J0IEJhY2t1cDwvaDQ+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTJweDtcIj5cbiAgICAgICAgICAgIERvd25sb2FkcyBldmVyeXRoaW5nIFx1MjAxNCBzZXJ2aWNlcywgQ2FkZHlmaWxlLCBjcmVkZW50aWFscywgZW5jcnlwdGlvbiBrZXksIHRoZW1lcywgYW5kIGFsbCBicm93c2VyIHByZWZlcmVuY2VzLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLWV4cG9ydC1idG5cIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMjdhZTYwIDAlLCAjMmVjYzcxIDEwMCUpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IDYwMDsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBcdTJCMDdcdUZFMEYgRG93bmxvYWQgRnVsbCBCYWNrdXBcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBJbXBvcnQgU2VjdGlvbiAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE2cHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIGNvbG9yLW1peChpbiBzcmdiLCAjMzQ5OGRiIDE1JSwgdHJhbnNwYXJlbnQpLCBjb2xvci1taXgoaW4gc3JnYiwgIzI5ODBiOSAxMCUsIHRyYW5zcGFyZW50KSk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkICMzNDk4ZGI7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgOHB4OyBjb2xvcjogIzM0OThkYjsgZm9udC1zaXplOiAwLjk1cmVtO1wiPlx1RDgzRFx1RENFNSBSZXN0b3JlIEJhY2t1cDwvaDQ+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTJweDtcIj5cbiAgICAgICAgICAgIFVwbG9hZCBhIGJhY2t1cCBmaWxlIHRvIHJlc3RvcmUgeW91ciBlbnRpcmUgY29uZmlndXJhdGlvbiBcdTIwMTQgZHJhZyBhbmQgZHJvcCByZWFkeS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJiYWNrdXAtZmlsZS1pbnB1dFwiIGFjY2VwdD1cIi5qc29uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJhY2t1cC1zZWxlY3QtZmlsZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICMzNDk4ZGIgMCUsICMyOTgwYjkgMTAwJSk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogNjAwOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1RENDMSBTZWxlY3QgQmFja3VwIEZpbGVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLWZpbGUtbmFtZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogOHB4OyBwYWRkaW5nOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFByZXZpZXcgU2VjdGlvbiAoc2hvd24gYWZ0ZXIgZmlsZSBzZWxlY3RlZCkgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtcHJldmlld1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTZweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCAxMnB4OyBmb250LXNpemU6IDAuOXJlbTtcIj5cdUQ4M0RcdURDQ0IgQmFja3VwIENvbnRlbnRzPC9oND5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLXByZXZpZXctY29udGVudFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nLXRvcDogMTJweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJiYWNrdXAtcmVsb2FkLWNhZGR5XCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICBSZWxvYWQgQ2FkZHkgYWZ0ZXIgcmVzdG9yZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLWRvLXJlc3RvcmUtYnRuXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2U3NGMzYyAwJSwgI2MwMzkyYiAxMDAlKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiA2MDA7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgXHUyNkExIFJlc3RvcmUgRXZlcnl0aGluZ1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlc3VsdCBNZXNzYWdlIC0tPlxuICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLXJlc3VsdFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYm9yZGVyLXJhZGl1czogOHB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBTY2hlZHVsZXMgKFByZW1pdW0pIC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1zY2hlZHVsZXMtdGFiXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtc2NoZWR1bGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyM0YwPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIHNjaGVkdWxlcy4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogQmFja3VwcyBvbiBEaXNrIC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1kaXNrLXRhYlwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLWRpc2stY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQkU8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgYmFja3VwIGZpbGVzLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBQb2ludC1pbi1UaW1lIFJlc3RvcmUgLS0+XG4gICAgICA8ZGl2IGlkPVwiYmFja3VwLXBvaW50aW50aW1lLXRhYlwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwicG9pbnRpbnRpbWUtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTIzRUE8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEJhY2t1cCBIaXN0b3J5IC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1oaXN0b3J5LXRhYlwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLWhpc3RvcnktY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0MDBweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBiYWNrdXAgaGlzdG9yeS4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIEJ1dHRvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgdmFyIG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1tb2RhbCcpO1xuICB2YXIgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtcmVzdG9yZS1idG4nKTtcbiAgdmFyIGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtY2FuY2VsJyk7XG4gIHZhciBleHBvcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWV4cG9ydC1idG4nKTtcbiAgdmFyIHNlbGVjdEZpbGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXNlbGVjdC1maWxlJyk7XG4gIHZhciBmaWxlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWZpbGUtaW5wdXQnKTtcbiAgdmFyIGZpbGVOYW1lRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1maWxlLW5hbWUnKTtcbiAgdmFyIHByZXZpZXdEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXByZXZpZXcnKTtcbiAgdmFyIHByZXZpZXdDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1wcmV2aWV3LWNvbnRlbnQnKTtcbiAgdmFyIHJlc3RvcmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWRvLXJlc3RvcmUtYnRuJyk7XG4gIHZhciByZXN1bHREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXJlc3VsdCcpO1xuICB2YXIgc2NoZWR1bGVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXNjaGVkdWxlcy1jb250YWluZXInKTtcbiAgdmFyIGhpc3RvcnlDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWhpc3RvcnktY29udGFpbmVyJyk7XG4gIHZhciBkaXNrQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1kaXNrLWNvbnRhaW5lcicpO1xuICB2YXIgcG9pbnRpbnRpbWVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9pbnRpbnRpbWUtY29udGFpbmVyJyk7XG5cbiAgdmFyIHNlbGVjdGVkQmFja3VwID0gbnVsbDtcblxuICAvLyBPcGVuIG1vZGFsXG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChwcmV2aWV3RGl2KSBwcmV2aWV3RGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgaWYgKGZpbGVOYW1lRGl2KSBmaWxlTmFtZURpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHNlbGVjdGVkQmFja3VwID0gbnVsbDtcbiAgfSk7XG5cbiAgd2lyZU1vZGFsKG1vZGFsLCBjYW5jZWxCdG4pO1xuXG4gIC8vID09PSBFWFBPUlQ6IFNlcnZlciBiYWNrdXAgKyBicm93c2VyIHN0YXRlIGluIG9uZSBmaWxlID09PVxuICBleHBvcnRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgZXhwb3J0QnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBleHBvcnRCdG4uaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gRXhwb3J0aW5nLi4uJztcbiAgICB0cnkge1xuICAgICAgLy8gRmV0Y2ggc2VydmVyLXNpZGUgYmFja3VwIChjb25maWcsIHNlcnZpY2VzLCBjYWRkeWZpbGUsIGNyZWRlbnRpYWxzLCBlbmNyeXB0aW9uIGtleSwgdGhlbWVzLCBldGMuKVxuICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3VwL2V4cG9ydCcpO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIC8vIEFkZCBhbGwgYnJvd3NlciBsb2NhbFN0b3JhZ2Ugc3RhdGVcbiAgICAgIGRhdGEuYnJvd3NlclN0YXRlID0gY29sbGVjdEJyb3dzZXJTdGF0ZSgpO1xuXG4gICAgICAvLyBEb3dubG9hZCB1bmlmaWVkIGJhY2t1cFxuICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICBhLmRvd25sb2FkID0gJ2Rhc2hjYWRkeS1iYWNrdXAtJyArIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdICsgJy5qc29uJztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICBhLmNsaWNrKCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuXG4gICAgICB2YXIgc3RhdGVDb3VudCA9IE9iamVjdC5rZXlzKGRhdGEuYnJvd3NlclN0YXRlKS5sZW5ndGg7XG4gICAgICB2YXIgdGhlbWVDb3VudCA9IGRhdGEudGhlbWVzID8gT2JqZWN0LmtleXMoZGF0YS50aGVtZXMpLmxlbmd0aCA6IDA7XG4gICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gJ1x1MjcwNSBGdWxsIGJhY2t1cCBkb3dubG9hZGVkIFx1MjAxNCBzZXJ2ZXIgY29uZmlnICsgJyArIHN0YXRlQ291bnQgKyAnIGJyb3dzZXIgc2V0dGluZ3MnICsgKHRoZW1lQ291bnQgPyAnICsgJyArIHRoZW1lQ291bnQgKyAnIHRoZW1lcycgOiAnJyk7XG4gICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLW9rLWZnKSc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI3NEMgRXhwb3J0IGZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKTtcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1iYWQtZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLWJhZC1mZyknO1xuICAgIH1cbiAgICBleHBvcnRCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBleHBvcnRCdG4uaW5uZXJIVE1MID0gJ1x1MkIwN1x1RkUwRiBEb3dubG9hZCBGdWxsIEJhY2t1cCc7XG4gIH0pO1xuXG4gIC8vIFNlbGVjdCBmaWxlIGJ1dHRvblxuICBzZWxlY3RGaWxlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyBmaWxlSW5wdXQuY2xpY2soKTsgfSk7XG5cbiAgLy8gPT09IEZJTEUgU0VMRUNURUQ6IFByZXZpZXcgY29udGVudHMgPT09XG4gIGZpbGVJbnB1dD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYXN5bmMgZnVuY3Rpb24oZSkge1xuICAgIHZhciBmaWxlID0gZS50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKCFmaWxlKSByZXR1cm47XG4gICAgZmlsZU5hbWVEaXYudGV4dENvbnRlbnQgPSAnXHVEODNEXHVEQ0M0ICcgKyBmaWxlLm5hbWU7XG4gICAgZmlsZU5hbWVEaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdHJ5IHtcbiAgICAgIHZhciB0ZXh0ID0gYXdhaXQgZmlsZS50ZXh0KCk7XG4gICAgICB2YXIgYmFja3VwID0gSlNPTi5wYXJzZSh0ZXh0KTtcblxuICAgICAgLy8gSGFuZGxlIGxlZ2FjeSB2MS4wLjAgZm9ybWF0IChmcm9tIG9sZCBpbXBvcnQtZXhwb3J0LmpzKVxuICAgICAgaWYgKGlzTGVnYWN5Rm9ybWF0KGJhY2t1cCkpIHtcbiAgICAgICAgc2VsZWN0ZWRCYWNrdXAgPSBiYWNrdXA7XG4gICAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC44cmVtO1wiPkxlZ2FjeSBmb3JtYXQgKHYnICsgZXNjYXBlSHRtbChiYWNrdXAudmVyc2lvbikgKyAnKTwvZGl2Pic7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNnB4O1wiPic7XG4gICAgICAgIGlmIChiYWNrdXAuc2VydmljZXM/Lmxlbmd0aCkgaHRtbCArPSAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0RcdURDQ0IgJyArIGJhY2t1cC5zZXJ2aWNlcy5sZW5ndGggKyAnIHNlcnZpY2VzPC9zcGFuPic7XG4gICAgICAgIGlmIChiYWNrdXAuY3VzdG9tQXBwcz8ubGVuZ3RoKSBodG1sICs9ICc8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlx1RDgzRFx1RENFNiAnICsgYmFja3VwLmN1c3RvbUFwcHMubGVuZ3RoICsgJyBjdXN0b20gYXBwczwvc3Bhbj4nO1xuICAgICAgICBpZiAoYmFja3VwLnRoZW1lKSBodG1sICs9ICc8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlx1RDgzQ1x1REZBOCBUaGVtZTogJyArIGVzY2FwZUh0bWwoYmFja3VwLnRoZW1lKSArICc8L3NwYW4+JztcbiAgICAgICAgaWYgKGJhY2t1cC51c2VyVGhlbWVzKSBodG1sICs9ICc8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlx1RDgzQ1x1REZBOCAnICsgT2JqZWN0LmtleXMoYmFja3VwLnVzZXJUaGVtZXMpLmxlbmd0aCArICcgY3VzdG9tIHRoZW1lczwvc3Bhbj4nO1xuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgICBwcmV2aWV3Q29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICBwcmV2aWV3RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIHYxLjErIC8gdjIuMCBmb3JtYXQgXHUyMDE0IHNlbmQgdG8gc2VydmVyIGZvciBwcmV2aWV3XG4gICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXAvcHJldmlldycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShiYWNrdXApXG4gICAgICB9KTtcbiAgICAgIHZhciBwcmV2aWV3ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKHByZXZpZXcuc3VjY2Vzcykge1xuICAgICAgICBzZWxlY3RlZEJhY2t1cCA9IGJhY2t1cDtcbiAgICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+RXhwb3J0ZWQ6ICcgKyBuZXcgRGF0ZShiYWNrdXAuZXhwb3J0ZWRBdCkudG9Mb2NhbGVTdHJpbmcoKSArICcgKHYnICsgZXNjYXBlSHRtbChiYWNrdXAudmVyc2lvbikgKyAnKTwvZGl2Pic7XG5cbiAgICAgICAgLy8gU2VydmVyIGZpbGVzXG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA2cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1wiPlNlcnZlciBDb25maWc8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDZweDsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj4nO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcHJldmlldy5wcmV2aWV3LmZpbGVzKSB7XG4gICAgICAgICAgdmFyIGluZm8gPSBwcmV2aWV3LnByZXZpZXcuZmlsZXNba2V5XTtcbiAgICAgICAgICB2YXIgaWNvbiA9IGluZm8uYWN0aW9uID09PSAnY3JlYXRlJyA/ICdcdUQ4M0NcdUREOTUnIDogJ1x1RDgzRFx1RENERCc7XG4gICAgICAgICAgaHRtbCArPSAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj4nICsgaWNvbiArICcgJyArIGVzY2FwZUh0bWwoaW5mby5kZXNjcmlwdGlvbikgKyAnPC9zcGFuPic7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcblxuICAgICAgICAvLyBTZXJ2aWNlcyBjb3VudFxuICAgICAgICBpZiAocHJldmlldy5wcmV2aWV3LnNlcnZpY2VDb3VudCkge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7IG1hcmdpbi1ib3R0b206IDZweDtcIj4nICsgcHJldmlldy5wcmV2aWV3LnNlcnZpY2VDb3VudCArICcgc2VydmljZXM8L2Rpdj4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlbWVzXG4gICAgICAgIGlmIChwcmV2aWV3LnByZXZpZXcudGhlbWVDb3VudCkge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7IG1hcmdpbi1ib3R0b206IDZweDtcIj5cdUQ4M0NcdURGQTggJyArIHByZXZpZXcucHJldmlldy50aGVtZUNvdW50ICsgJyBjdXN0b20gdGhlbWVzPC9kaXY+JztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJyb3dzZXIgc3RhdGVcbiAgICAgICAgaWYgKHByZXZpZXcucHJldmlldy5icm93c2VyU3RhdGVDb3VudCkge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA2cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1wiPkJyb3dzZXIgUHJlZmVyZW5jZXM8L2Rpdj4nO1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+XHVEODNEXHVEREE1XHVGRTBGICcgKyBwcmV2aWV3LnByZXZpZXcuYnJvd3NlclN0YXRlQ291bnQgKyAnIHNhdmVkIHNldHRpbmdzICh0aGVtZSwgd2VhdGhlciwgY2xvY2ssIHdpZGdldHMsIGV0Yy4pPC9kaXY+JztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpZXdDb250ZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHByZXZpZXdEaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gJ1x1MjZBMFx1RkUwRiBJbnZhbGlkIGJhY2t1cCBmaWxlOiAnICsgZXNjYXBlSHRtbChwcmV2aWV3LmVycm9yKTtcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgI2YzOWMxMiAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNmMzljMTInO1xuICAgICAgICBwcmV2aWV3RGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI3NEMgQ291bGQgbm90IHJlYWQgZmlsZTogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKTtcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1iYWQtZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLWJhZC1mZyknO1xuICAgICAgcHJldmlld0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gPT09IFJFU1RPUkU6IFNlcnZlciArIGJyb3dzZXIgc3RhdGUgPT09XG4gIHJlc3RvcmVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgaWYgKCFzZWxlY3RlZEJhY2t1cCkgcmV0dXJuO1xuICAgIGlmICghY29uZmlybSgnVGhpcyB3aWxsIG92ZXJ3cml0ZSB5b3VyIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgYnJvd3NlciBwcmVmZXJlbmNlcy4gQ29udGludWU/JykpIHJldHVybjtcbiAgICByZXN0b3JlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICByZXN0b3JlQnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IFJlc3RvcmluZy4uLic7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEhhbmRsZSBsZWdhY3kgZm9ybWF0XG4gICAgICBpZiAoaXNMZWdhY3lGb3JtYXQoc2VsZWN0ZWRCYWNrdXApKSB7XG4gICAgICAgIHJlc3RvcmVMZWdhY3lGb3JtYXQoc2VsZWN0ZWRCYWNrdXApO1xuICAgICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gJ1x1MjcwNSBMZWdhY3kgYmFja3VwIHJlc3RvcmVkIFx1MjAxNCBicm93c2VyIHNldHRpbmdzIGFuZCBzZXJ2aWNlcyBpbXBvcnRlZC4nO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgdmFyKC0tb2stZmcpJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBsb2NhdGlvbi5yZWxvYWQoKTsgfSwgMjAwMCk7XG4gICAgICAgIHJlc3RvcmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVzdG9yZUJ0bi5pbm5lckhUTUwgPSAnXHUyNkExIFJlc3RvcmUgRXZlcnl0aGluZyc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gdjEuMSsgLyB2Mi4wIFx1MjAxNCByZXN0b3JlIHNlcnZlci1zaWRlIGZpcnN0XG4gICAgICB2YXIgcmVsb2FkQ2FkZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXJlbG9hZC1jYWRkeScpPy5jaGVja2VkID8/IHRydWU7XG4gICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXAvcmVzdG9yZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGJhY2t1cDogc2VsZWN0ZWRCYWNrdXAsIG9wdGlvbnM6IHsgcmVsb2FkQ2FkZHk6IHJlbG9hZENhZGR5IH0gfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIC8vIFRoZW4gcmVzdG9yZSBicm93c2VyIHN0YXRlXG4gICAgICB2YXIgYnJvd3NlckNvdW50ID0gMDtcbiAgICAgIGlmIChzZWxlY3RlZEJhY2t1cC5icm93c2VyU3RhdGUpIHtcbiAgICAgICAgYnJvd3NlckNvdW50ID0gcmVzdG9yZUJyb3dzZXJTdGF0ZShzZWxlY3RlZEJhY2t1cC5icm93c2VyU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHZhciBtc2cgPSAnXHUyNzA1ICcgKyBkYXRhLm1lc3NhZ2U7XG4gICAgICAgIGlmIChicm93c2VyQ291bnQgPiAwKSBtc2cgKz0gJzxicj48c21hbGwgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPicgKyBicm93c2VyQ291bnQgKyAnIGJyb3dzZXIgc2V0dGluZ3MgcmVzdG9yZWQ8L3NtYWxsPic7XG4gICAgICAgIGlmIChkYXRhLnJlc3VsdHMuY2FkZHlSZWxvYWRlZCkgbXNnICs9ICc8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DYWRkeSBjb25maWd1cmF0aW9uIHJlbG9hZGVkPC9zbWFsbD4nO1xuICAgICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gbXNnO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgdmFyKC0tb2stZmcpJztcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgbG9jYXRpb24ucmVsb2FkKCk7IH0sIDIwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI2QTBcdUZFMEYgJyArIGVzY2FwZUh0bWwoZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgaWYgKGJyb3dzZXJDb3VudCA+IDApIHJlc3VsdERpdi5pbm5lckhUTUwgKz0gJzxicj48c21hbGwgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPicgKyBicm93c2VyQ291bnQgKyAnIGJyb3dzZXIgc2V0dGluZ3Mgd2VyZSByZXN0b3JlZDwvc21hbGw+JztcbiAgICAgICAgaWYgKGRhdGEucmVzdWx0cz8uZXJyb3JzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCArPSAnPGJyPjxzbWFsbD4nICsgZGF0YS5yZXN1bHRzLmVycm9ycy5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gZXNjYXBlSHRtbChlLmZpbGUpICsgJzogJyArIGVzY2FwZUh0bWwoZS5lcnJvcik7IH0pLmpvaW4oJywgJykgKyAnPC9zbWFsbD4nO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCAjZjM5YzEyIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2YzOWMxMic7XG4gICAgICB9XG4gICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI3NEMgUmVzdG9yZSBmYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSk7XG4gICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYmFkLWZnKSAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCB2YXIoLS1iYWQtZmcpJztcbiAgICB9XG4gICAgcmVzdG9yZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHJlc3RvcmVCdG4uaW5uZXJIVE1MID0gJ1x1MjZBMSBSZXN0b3JlIEV2ZXJ5dGhpbmcnO1xuICB9KTtcblxuICAvLyA9PT0gU2NoZWR1bGVzIFRhYiAoUHJlbWl1bSkgPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRTY2hlZHVsZXNUYWIoKSB7XG4gICAgaWYgKCFzY2hlZHVsZUNvbnRhaW5lcikgcmV0dXJuO1xuICAgIHNjaGVkdWxlQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9zY2hlZHVsZScpO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgXG4gICAgICBpZiAoZGF0YS5wcmVtaXVtUmVxdWlyZWQpIHtcbiAgICAgICAgc2NoZWR1bGVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwicGFkZGluZzogMjRweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAycmVtOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlx1MkI1MDwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlByZW1pdW0gRmVhdHVyZTwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkF1dG8tYmFja3VwIHNjaGVkdWxpbmcgcmVxdWlyZXMgYSBEYXNoQ2FkZHkgUHJlbWl1bSBzdWJzY3JpcHRpb24uPC9kaXY+JyArXG4gICAgICAgICAgJzxidXR0b24gb25jbGljaz1cInNob3dOb3RpZmljYXRpb24oXFwnVXBncmFkZSB0byBQcmVtaXVtIHRvIGVuYWJsZSBhdXRvLWJhY2t1cHMhXFwnLCBcXCdpbmZvXFwnKTsgc2Nyb2xsVG9TZWN0aW9uKFxcJ2xpY2Vuc2VcXCcpO1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogOHB4IDIwcHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmMzljMTIsICNlNjdlMjIpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+VXBncmFkZSB0byBQcmVtaXVtPC9idXR0b24+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBzY2hlZHVsZXMnKTtcbiAgICAgIFxuICAgICAgdmFyIHNjaGVkdWxlcyA9IGRhdGEuc2NoZWR1bGVzIHx8IFtdO1xuICAgICAgXG4gICAgICBpZiAoc2NoZWR1bGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzY2hlZHVsZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+JyArXG4gICAgICAgICAgJzxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1MjNGMDwvc3Bhbj4nICtcbiAgICAgICAgICAnPGRpdj5ObyBiYWNrdXAgc2NoZWR1bGVzIGNvbmZpZ3VyZWQ8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+U2VsZWN0IGFwcHMgYmVsb3cgdG8gZW5hYmxlIGF1dG8tYmFja3VwPC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4O1wiPic7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVkdWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2NoID0gc2NoZWR1bGVzW2ldO1xuICAgICAgICB2YXIgbmV4dFJ1blN0ciA9IHNjaC5uZXh0UnVuID8gbmV3IERhdGUoc2NoLm5leHRSdW4pLnRvTG9jYWxlU3RyaW5nKCkgOiAnTm90IHNjaGVkdWxlZCc7XG4gICAgICAgIHZhciBsYXN0UnVuU3RyID0gc2NoLmxhc3RSdW4gPyBuZXcgRGF0ZShzY2gubGFzdFJ1bikudG9Mb2NhbGVTdHJpbmcoKSA6ICdOZXZlcic7XG4gICAgICAgIFxuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweCAxNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDhweDtcIj4nICtcbiAgICAgICAgICAnICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JyArIGVzY2FwZUh0bWwoc2NoLmFwcElkKSArICc8L2Rpdj4nICtcbiAgICAgICAgICAnICA8bGFiZWwgY2xhc3M9XCJ0b2dnbGUtc3dpdGNoXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDtcIj4nICtcbiAgICAgICAgICAnICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInNjaGVkdWxlLXRvZ2dsZVwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChzY2guYXBwSWQpICsgJ1wiJyArIChzY2guZW5hYmxlZCA/ICcgY2hlY2tlZCcgOiAnJykgKyAnIC8+JyArXG4gICAgICAgICAgJyAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgKHNjaC5lbmFibGVkID8gJ09OJyA6ICdPRkYnKSArICc8L3NwYW4+JyArXG4gICAgICAgICAgJyAgPC9sYWJlbD4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4OyBmb250LXNpemU6IDAuOHJlbTsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj4nICtcbiAgICAgICAgICAnICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5TY2hlZHVsZTo8L3NwYW4+IDxzZWxlY3QgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3RcIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoc2NoLmFwcElkKSArICdcIiBzdHlsZT1cImJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDJweCA2cHg7XCI+JyArXG4gICAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwiaG91cmx5XCInICsgKHNjaC5zY2hlZHVsZSA9PT0gJ2hvdXJseScgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+SG91cmx5PC9vcHRpb24+JyArXG4gICAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwiZGFpbHlcIicgKyAoc2NoLnNjaGVkdWxlID09PSAnZGFpbHknID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPkRhaWx5PC9vcHRpb24+JyArXG4gICAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwid2Vla2x5XCInICsgKHNjaC5zY2hlZHVsZSA9PT0gJ3dlZWtseScgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+V2Vla2x5PC9vcHRpb24+JyArXG4gICAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwibW9udGhseVwiJyArIChzY2guc2NoZWR1bGUgPT09ICdtb250aGx5JyA/ICcgc2VsZWN0ZWQnIDogJycpICsgJz5Nb250aGx5PC9vcHRpb24+JyArXG4gICAgICAgICAgJyAgPC9zZWxlY3Q+PC9kaXY+JyArXG4gICAgICAgICAgJyAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+S2VlcCBsYXN0Ojwvc3Bhbj4gPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInJldGVudGlvbi1pbnB1dFwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChzY2guYXBwSWQpICsgJ1wiIHZhbHVlPVwiJyArIChzY2gucmV0ZW50aW9uPy5rZWVwIHx8IDcpICsgJ1wiIG1pbj1cIjFcIiBtYXg9XCIxMDBcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBwYWRkaW5nOiAycHggNnB4O1wiIC8+PC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPicgK1xuICAgICAgICAgICcgIDxkaXY+TmV4dCBydW46ICcgKyBlc2NhcGVIdG1sKG5leHRSdW5TdHIpICsgJzwvZGl2PicgK1xuICAgICAgICAgICcgIDxkaXY+TGFzdCBydW46ICcgKyBlc2NhcGVIdG1sKGxhc3RSdW5TdHIpICsgJzwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNnB4O1wiPicgK1xuICAgICAgICAgICcgIDxidXR0b24gY2xhc3M9XCJzY2hlZHVsZS1ydW4tbm93XCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKHNjaC5hcHBJZCkgKyAnXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggMTJweDsgZm9udC1zaXplOiAwLjhyZW07IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1vay1mZykgMjAlLCB0cmFuc3BhcmVudCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW9rLWZnKTsgY29sb3I6IHZhcigtLW9rLWZnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XHUyNUI2XHVGRTBGIFJ1biBOb3c8L2J1dHRvbj4nICtcbiAgICAgICAgICAnICA8YnV0dG9uIGNsYXNzPVwic2NoZWR1bGUtZGVsZXRlXCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKHNjaC5hcHBJZCkgKyAnXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggMTJweDsgZm9udC1zaXplOiAwLjhyZW07IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWQtZmcpOyBjb2xvcjogdmFyKC0tYmFkLWZnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XHVEODNEXHVEREQxXHVGRTBGIFJlbW92ZTwvYnV0dG9uPicgK1xuICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICBcbiAgICAgIC8vIEFkZCBcIkFkZCBTY2hlZHVsZVwiIHNlY3Rpb24gYXQgYm90dG9tXG4gICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTZweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgNSUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLXJhZGl1czogMTBweDsgYm9yZGVyOiAxcHggZGFzaGVkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICc8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCAxMnB4OyBmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XHUyNzk1IEFkZCBOZXcgU2NoZWR1bGU8L2g0PicgK1xuICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBmbGV4LXdyYXA6IHdyYXA7XCI+JyArXG4gICAgICAgICcgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwibmV3LXNjaGVkdWxlLWFwcGlkXCIgcGxhY2Vob2xkZXI9XCJBcHAgSUQgKGUuZy4sIHBsZXgsIHNvbmFycilcIiBzdHlsZT1cImZsZXg6IDE7IG1pbi13aWR0aDogMTUwcHg7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTtcIiAvPicgK1xuICAgICAgICAnICA8c2VsZWN0IGlkPVwibmV3LXNjaGVkdWxlLWludGVydmFsXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7XCI+JyArXG4gICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cImhvdXJseVwiPkhvdXJseTwvb3B0aW9uPicgK1xuICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJkYWlseVwiIHNlbGVjdGVkPkRhaWx5PC9vcHRpb24+JyArXG4gICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIndlZWtseVwiPldlZWtseTwvb3B0aW9uPicgK1xuICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJtb250aGx5XCI+TW9udGhseTwvb3B0aW9uPicgK1xuICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCI2aFwiPkV2ZXJ5IDYgaG91cnM8L29wdGlvbj4nICtcbiAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwiMzBtXCI+RXZlcnkgMzAgbWludXRlczwvb3B0aW9uPicgK1xuICAgICAgICAnICA8L3NlbGVjdD4nICtcbiAgICAgICAgJyAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cIm5ldy1zY2hlZHVsZS1yZXRlbnRpb25cIiB2YWx1ZT1cIjdcIiBtaW49XCIxXCIgbWF4PVwiMTAwXCIgcGxhY2Vob2xkZXI9XCJLZWVwXCIgc3R5bGU9XCJ3aWR0aDogNzBweDsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpO1wiIC8+JyArXG4gICAgICAgICcgIDxidXR0b24gaWQ9XCJhZGQtc2NoZWR1bGUtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwO1wiPkFkZCBTY2hlZHVsZTwvYnV0dG9uPicgK1xuICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICc8L2Rpdj4nO1xuICAgICAgXG4gICAgICBzY2hlZHVsZUNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgXG4gICAgICAvLyBXaXJlIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgc2NoZWR1bGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnNjaGVkdWxlLXRvZ2dsZScpLmZvckVhY2goZnVuY3Rpb24odG9nZ2xlKSB7XG4gICAgICAgIHRvZ2dsZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsgdXBkYXRlU2NoZWR1bGUodG9nZ2xlLmRhdGFzZXQuYXBwaWQsIHsgZW5hYmxlZDogdG9nZ2xlLmNoZWNrZWQgfSk7IH0pO1xuICAgICAgfSk7XG4gICAgICBzY2hlZHVsZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuc2NoZWR1bGUtc2VsZWN0JykuZm9yRWFjaChmdW5jdGlvbihzZWwpIHtcbiAgICAgICAgc2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyB1cGRhdGVTY2hlZHVsZShzZWwuZGF0YXNldC5hcHBpZCwgeyBzY2hlZHVsZTogc2VsLnZhbHVlIH0pOyB9KTtcbiAgICAgIH0pO1xuICAgICAgc2NoZWR1bGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnJldGVudGlvbi1pbnB1dCcpLmZvckVhY2goZnVuY3Rpb24oaW5wKSB7XG4gICAgICAgIGlucC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsgdXBkYXRlU2NoZWR1bGUoaW5wLmRhdGFzZXQuYXBwaWQsIHsgcmV0ZW50aW9uOiB7IGtlZXA6IHBhcnNlSW50KGlucC52YWx1ZSkgfHwgNyB9IH0pOyB9KTtcbiAgICAgIH0pO1xuICAgICAgc2NoZWR1bGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnNjaGVkdWxlLXJ1bi1ub3cnKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bikge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgcnVuQmFja3VwTm93KGJ0bi5kYXRhc2V0LmFwcGlkKTsgfSk7XG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zY2hlZHVsZS1kZWxldGUnKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bikge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgZGVsZXRlU2NoZWR1bGUoYnRuLmRhdGFzZXQuYXBwaWQpOyB9KTtcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zY2hlZHVsZS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhZGROZXdTY2hlZHVsZSk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzY2hlZHVsZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQgdG8gbG9hZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2NoZWR1bGUoYXBwSWQsIHVwZGF0ZXMpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cHMvc2NoZWR1bGUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhcHBJZCwgLi4udXBkYXRlcyB9KVxuICAgICAgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1NjaGVkdWxlIHVwZGF0ZWQgZm9yICcgKyBhcHBJZCwgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1VwZGF0ZSBmYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93bicpLCAnZXJyb3InKTtcbiAgICAgICAgbG9hZFNjaGVkdWxlc1RhYigpOyAvLyBSZWZyZXNoIG9uIGZhaWx1cmVcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBmdW5jdGlvbiBydW5CYWNrdXBOb3coYXBwSWQpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cHMvYmFja3VwLycgKyBlbmNvZGVVUklDb21wb25lbnQoYXBwSWQpLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxuICAgICAgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0JhY2t1cCBzdGFydGVkIGZvciAnICsgYXBwSWQgKyAnIScsICdzdWNjZXNzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdCYWNrdXAgZmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZnVuY3Rpb24gZGVsZXRlU2NoZWR1bGUoYXBwSWQpIHtcbiAgICBpZiAoIWNvbmZpcm0oJ1JlbW92ZSBiYWNrdXAgc2NoZWR1bGUgZm9yICcgKyBhcHBJZCArICc/JykpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cHMvc2NoZWR1bGUvJyArIGVuY29kZVVSSUNvbXBvbmVudChhcHBJZCksIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignU2NoZWR1bGUgcmVtb3ZlZCBmb3IgJyArIGFwcElkLCAnc3VjY2VzcycpO1xuICAgICAgICBsb2FkU2NoZWR1bGVzVGFiKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdEZWxldGUgZmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZnVuY3Rpb24gYWRkTmV3U2NoZWR1bGUoKSB7XG4gICAgdmFyIGFwcElkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ldy1zY2hlZHVsZS1hcHBpZCcpPy52YWx1ZT8udHJpbSgpO1xuICAgIHZhciBpbnRlcnZhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctc2NoZWR1bGUtaW50ZXJ2YWwnKT8udmFsdWUgfHwgJ2RhaWx5JztcbiAgICB2YXIgcmV0ZW50aW9uID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ldy1zY2hlZHVsZS1yZXRlbnRpb24nKT8udmFsdWUpIHx8IDc7XG4gICAgXG4gICAgaWYgKCFhcHBJZCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGFuIEFwcCBJRCcsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9zY2hlZHVsZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFwcElkLCBzY2hlZHVsZTogaW50ZXJ2YWwsIHJldGVudGlvbjogeyBrZWVwOiByZXRlbnRpb24gfSwgZW5hYmxlZDogdHJ1ZSB9KVxuICAgICAgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1NjaGVkdWxlIGNyZWF0ZWQgZm9yICcgKyBhcHBJZCwgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgbG9hZFNjaGVkdWxlc1RhYigpO1xuICAgICAgICAvLyBDbGVhciBpbnB1dHNcbiAgICAgICAgdmFyIGFwcElkSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3LXNjaGVkdWxlLWFwcGlkJyk7XG4gICAgICAgIGlmIChhcHBJZElucHV0KSBhcHBJZElucHV0LnZhbHVlID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdGYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93bicpLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG4gIFxuICAvLyA9PT0gQmFja3VwcyBvbiBEaXNrIFRhYiA9PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZERpc2tCYWNrdXBzKCkge1xuICAgIGlmICghZGlza0NvbnRhaW5lcikgcmV0dXJuO1xuICAgIGRpc2tDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9iYWNrdXBzL2ZpbGVzJyk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkJyk7XG5cbiAgICAgIHZhciBmaWxlcyA9IGRhdGEuZmlsZXMgfHwgW107XG5cbiAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGlza0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+JyArXG4gICAgICAgICAgJzxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENCRTwvc3Bhbj4nICtcbiAgICAgICAgICAnPGRpdj5ObyBiYWNrdXAgZmlsZXMgb24gZGlzazwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj5SdW4gYSBiYWNrdXAgdG8gY3JlYXRlIGJhY2t1cCBmaWxlczwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEdyb3VwIGJ5IGFwcElkXG4gICAgICB2YXIgYnlBcHAgPSB7fTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGYgPSBmaWxlc1tpXTtcbiAgICAgICAgdmFyIGFwcElkID0gZi5hcHBJZCB8fCAndW5rbm93bic7XG4gICAgICAgIGlmICghYnlBcHBbYXBwSWRdKSBieUFwcFthcHBJZF0gPSBbXTtcbiAgICAgICAgYnlBcHBbYXBwSWRdLnB1c2goZik7XG4gICAgICB9XG5cbiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+JyArIGZpbGVzLmxlbmd0aCArICcgYmFja3VwIGZpbGUocykgYWNyb3NzICcgKyBPYmplY3Qua2V5cyhieUFwcCkubGVuZ3RoICsgJyBhcHAocyk8L2Rpdj4nO1xuICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTJweDtcIj4nO1xuXG4gICAgICB2YXIgYXBwSWRzID0gT2JqZWN0LmtleXMoYnlBcHApLnNvcnQoKTtcbiAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgYXBwSWRzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgIHZhciBhcHBJZCA9IGFwcElkc1thXTtcbiAgICAgICAgdmFyIGFwcEZpbGVzID0gYnlBcHBbYXBwSWRdO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBvdmVyZmxvdzogaGlkZGVuO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwicGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDglLCB0cmFuc3BhcmVudCk7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07XCI+JyArXG4gICAgICAgICAgZXNjYXBlSHRtbChhcHBJZCkgKyAnIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IG5vcm1hbDsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjc1cmVtO1wiPignICsgYXBwRmlsZXMubGVuZ3RoICsgJyBiYWNrdXAocykpPC9zcGFuPicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYXBwRmlsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgZiA9IGFwcEZpbGVzW2pdO1xuICAgICAgICAgIHZhciBkYXRlU3RyID0gbmV3IERhdGUoZi50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPicgK1xuICAgICAgICAgICAgJyAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nICsgZXNjYXBlSHRtbChmLm5hbWUpICsgJzwvZGl2PicgK1xuICAgICAgICAgICAgJyAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgZi5zaXplRm9ybWF0dGVkICsgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDhweDtcIj4nICsgZGF0ZVN0ciArICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA2cHg7XCI+JyArXG4gICAgICAgICAgICAnICA8YnV0dG9uIGNsYXNzPVwiZGlzay1jb21wYXJlLWJ0blwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChhcHBJZCkgKyAnXCIgZGF0YS1maWxlbmFtZT1cIicgKyBlc2NhcGVIdG1sKGYubmFtZSkgKyAnXCIgc3R5bGU9XCJwYWRkaW5nOiAzcHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgYm9yZGVyLXJhZGl1czogNXB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+Q29tcGFyZTwvYnV0dG9uPicgK1xuICAgICAgICAgICAgJyAgPGJ1dHRvbiBjbGFzcz1cImRpc2stcmVzdG9yZS1idG5cIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoYXBwSWQpICsgJ1wiIGRhdGEtZmlsZW5hbWU9XCInICsgZXNjYXBlSHRtbChmLm5hbWUpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogM3B4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCB2YXIoLS1vay1mZyksICMyN2FlNjApOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogNXB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+UmVzdG9yZTwvYnV0dG9uPicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICAgIGRpc2tDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgLy8gV2lyZSB1cCBidXR0b25zXG4gICAgICBkaXNrQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXNrLWNvbXBhcmUtYnRuJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IGNvbXBhcmVCYWNrdXBGaWxlKGJ0bi5kYXRhc2V0LmFwcGlkLCBidG4uZGF0YXNldC5maWxlbmFtZSk7IH0pO1xuICAgICAgfSk7XG4gICAgICBkaXNrQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXNrLXJlc3RvcmUtYnRuJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IHJlc3RvcmVCYWNrdXBGaWxlKGJ0bi5kYXRhc2V0LmFwcGlkLCBidG4uZGF0YXNldC5maWxlbmFtZSk7IH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGlza0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JztcbiAgICB9XG4gIH1cbiAgXG4gIC8vID09PSBCYWNrdXAgSGlzdG9yeSBUYWIgPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRCYWNrdXBIaXN0b3J5KCkge1xuICAgIGlmICghaGlzdG9yeUNvbnRhaW5lcikgcmV0dXJuO1xuICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9iYWNrdXBzL2hpc3Rvcnk/bGltaXQ9NTAnKTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFkYXRhLmhpc3Rvcnk/Lmxlbmd0aCkge1xuICAgICAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0I8L3NwYW4+IE5vIGJhY2t1cCBoaXN0b3J5IHlldDwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDtcIj4nO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmhpc3RvcnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGJrID0gZGF0YS5oaXN0b3J5W2ldO1xuICAgICAgICB2YXIgc2l6ZU1CID0gYmsuc2l6ZSA/IChiay5zaXplIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMikgOiAnPyc7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPic7XG4gICAgICAgIGh0bWwgKz0gJyAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPic7XG4gICAgICAgIGh0bWwgKz0gJyAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7XCI+JyArIGVzY2FwZUh0bWwoYmsubmFtZSB8fCAnYmFja3VwJykgKyAnPC9zcGFuPic7XG4gICAgICAgIGh0bWwgKz0gJyAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+JztcbiAgICAgICAgaHRtbCArPSAnICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtYmFkZ2UgJyArIChiay5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICdzdWNjZXNzJyA6ICdkb3duJykgKyAnXCI+JyArIGVzY2FwZUh0bWwoYmsuc3RhdHVzKSArICc8L3NwYW4+JztcbiAgICAgICAgaWYgKGJrLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSBodG1sICs9ICcgICAgICA8YnV0dG9uIGNsYXNzPVwiYmFja3VwLXJlc3RvcmUtYnRuXCIgZGF0YS1iYWNrdXAtaWQ9XCInICsgZXNjYXBlSHRtbChiay5pZCkgKyAnXCIgc3R5bGU9XCJwYWRkaW5nOiAzcHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07XCI+UmVzdG9yZTwvYnV0dG9uPic7XG4gICAgICAgIGh0bWwgKz0gJyAgICA8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICcgIDwvZGl2Pic7XG4gICAgICAgIGh0bWwgKz0gJyAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nO1xuICAgICAgICBodG1sICs9ICcgICAgJyArIG5ldyBEYXRlKGJrLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKSArICcgfCAnICsgc2l6ZU1CICsgJyBNQiB8ICcgKyAoYmsuZHVyYXRpb24gPyAoYmsuZHVyYXRpb24gLyAxMDAwKS50b0ZpeGVkKDEpICsgJ3MnIDogJy0tJyk7XG4gICAgICAgIGlmIChiay5lbmNyeXB0ZWQpIGh0bWwgKz0gJyB8IFx1RDgzRFx1REQxMic7XG4gICAgICAgIGh0bWwgKz0gJyAgPC9kaXY+JztcbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICBoaXN0b3J5Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5iYWNrdXAtcmVzdG9yZS1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bikge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgd2luZG93Ll9fcmVzdG9yZVNlcnZlckJhY2t1cChidG4uZGF0YXNldC5iYWNrdXBJZCk7IH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JztcbiAgICB9XG4gIH1cblxuICB3aW5kb3cuX19yZXN0b3JlU2VydmVyQmFja3VwID0gYXN5bmMgZnVuY3Rpb24oYmFja3VwSWQpIHtcbiAgICBpZiAoIWNvbmZpcm0oJ1Jlc3RvcmUgZnJvbSB0aGlzIHNlcnZlciBiYWNrdXA/IFRoaXMgd2lsbCBvdmVyd3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uLicpKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL3Jlc3RvcmUvJyArIGJhY2t1cElkLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyByZXN0b3JlU2VydmljZXM6IHRydWUsIHJlc3RvcmVDb25maWc6IHRydWUgfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZXN0b3JlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZXN0b3JlIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyksICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgc2hvd05vdGlmaWNhdGlvbignUmVzdG9yZSBlcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7IH1cbiAgfTtcblxuICAvLyBMYXp5LWxvYWQgdGFic1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cImJhY2t1cC1zY2hlZHVsZXMtdGFiXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZFNjaGVkdWxlc1RhYik7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiYmFja3VwLWRpc2stdGFiXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZERpc2tCYWNrdXBzKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJiYWNrdXAtcG9pbnRpbnRpbWUtdGFiXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZFBvaW50SW5UaW1lVGFiKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJiYWNrdXAtaGlzdG9yeS10YWJcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkQmFja3VwSGlzdG9yeSk7XG5cbiAgLy8gPT09PT0gUG9pbnQtaW4tVGltZSBSZXN0b3JlIFRhYiA9PT09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkUG9pbnRJblRpbWVUYWIoKSB7XG4gICAgaWYgKCFwb2ludGludGltZUNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgcHJlbWl1bVxuICAgIHRyeSB7XG4gICAgICB2YXIgbGljZW5zZVJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xpY2Vuc2Uvc3RhdHVzJyk7XG4gICAgICB2YXIgbGljZW5zZURhdGEgPSBhd2FpdCBsaWNlbnNlUmVzLmpzb24oKTtcbiAgICAgIGlmIChsaWNlbnNlRGF0YS50aWVyICE9PSAncHJlbWl1bScpIHtcbiAgICAgICAgcG9pbnRpbnRpbWVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwicGFkZGluZzogMjRweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAycmVtOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlx1MkI1MDwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlByZW1pdW0gRmVhdHVyZTwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlBvaW50LWluLXRpbWUgcmVzdG9yZSByZXF1aXJlcyBEYXNoQ2FkZHkgUHJlbWl1bSB3aXRoIGF1dG8tYmFja3VwIGVuYWJsZWQuPC9kaXY+JyArXG4gICAgICAgICAgJzxidXR0b24gb25jbGljaz1cInNob3dOb3RpZmljYXRpb24oXFwnVXBncmFkZSB0byBQcmVtaXVtIGZvciBwb2ludC1pbi10aW1lIHJlc3RvcmUhXFwnLCBcXCdpbmZvXFwnKTsgc2Nyb2xsVG9TZWN0aW9uKFxcJ2xpY2Vuc2VcXCcpO1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogOHB4IDIwcHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmMzljMTIsICNlNjdlMjIpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+VXBncmFkZSB0byBQcmVtaXVtPC9idXR0b24+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG5cbiAgICBwb2ludGludGltZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+JztcblxuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBzZXJ2aWNlcyBmb3IgZHJvcGRvd25cbiAgICAgIHZhciBzZXJ2aWNlc1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlcnZpY2VzJyk7XG4gICAgICB2YXIgc2VydmljZXNEYXRhID0gYXdhaXQgc2VydmljZXNSZXMuanNvbigpO1xuICAgICAgdmFyIHNlcnZpY2VzID0gc2VydmljZXNEYXRhLnNlcnZpY2VzIHx8IFtdO1xuXG4gICAgICBpZiAoc2VydmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBvaW50aW50aW1lQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDRTY8L3NwYW4+IE5vIGFwcHMgZGVwbG95ZWQgeWV0PC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogOHB4IDAgMTJweDtcIj4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj4nICtcbiAgICAgICAgJyAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPkFwcDo8L2xhYmVsPicgK1xuICAgICAgICAnICA8c2VsZWN0IGlkPVwicGl0LWFwcC1zZWxlY3RcIiBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgbWF4LXdpZHRoOiAyNDBweDtcIj4nO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBodG1sICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIGVzY2FwZUh0bWwoc2VydmljZXNbaV0uaWQgfHwgc2VydmljZXNbaV0ubmFtZSB8fCAnJykgKyAnXCI+JyArXG4gICAgICAgICAgZXNjYXBlSHRtbChzZXJ2aWNlc1tpXS5uYW1lIHx8IHNlcnZpY2VzW2ldLmlkIHx8ICcnKSArICc8L29wdGlvbj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9zZWxlY3Q+JyArXG4gICAgICAgICcgIDxidXR0b24gaWQ9XCJwaXQtbG9hZC1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDhweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+TG9hZCBCYWNrdXBzPC9idXR0b24+JyArXG4gICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgaWQ9XCJwaXQtYmFja3Vwcy1saXN0XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAzMjBweDsgb3ZlcmZsb3cteTogYXV0bztcIj48L2Rpdj4nICtcbiAgICAgICAgJzwvZGl2Pic7XG5cbiAgICAgIHBvaW50aW50aW1lQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaXQtbG9hZC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFwcElkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpdC1hcHAtc2VsZWN0Jyk/LnZhbHVlO1xuICAgICAgICBpZiAoYXBwSWQpIGxvYWRQb2ludEluVGltZUJhY2t1cHMoYXBwSWQpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcG9pbnRpbnRpbWVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJzwvZGl2Pic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFBvaW50SW5UaW1lQmFja3VwcyhhcHBJZCkge1xuICAgIHZhciBsaXN0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGl0LWJhY2t1cHMtbGlzdCcpO1xuICAgIGlmICghbGlzdEVsKSByZXR1cm47XG5cbiAgICBsaXN0RWwuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGJhY2t1cHMuLi48L2Rpdj4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9iYWNrdXBzL2ZpbGVzLycgKyBlbmNvZGVVUklDb21wb25lbnQoYXBwSWQpKTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEuZmlsZXMgfHwgZGF0YS5maWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQkU8L3NwYW4+IE5vIGJhY2t1cCBmaWxlcyBmb3IgJyArIGVzY2FwZUh0bWwoYXBwSWQpICsgJzwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPicgKyBkYXRhLmZpbGVzLmxlbmd0aCArICcgYmFja3VwKHMpPC9kaXY+JyArXG4gICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7XCI+JztcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmID0gZGF0YS5maWxlc1tpXTtcbiAgICAgICAgdmFyIGRhdGVTdHIgPSBuZXcgRGF0ZShmLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+JyArXG4gICAgICAgICAgJyAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nICsgZXNjYXBlSHRtbChmLm5hbWUpICsgJzwvZGl2PicgK1xuICAgICAgICAgICcgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIGYuc2l6ZUZvcm1hdHRlZCArICc8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDhweDtcIj4nICsgZGF0ZVN0ciArICc8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNnB4O1wiPicgK1xuICAgICAgICAgICcgIDxidXR0b24gY2xhc3M9XCJwaXQtY29tcGFyZS1idG5cIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoYXBwSWQpICsgJ1wiIGRhdGEtZmlsZW5hbWU9XCInICsgZXNjYXBlSHRtbChmLm5hbWUpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBib3JkZXItcmFkaXVzOiA1cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5Db21wYXJlPC9idXR0b24+JyArXG4gICAgICAgICAgJyAgPGJ1dHRvbiBjbGFzcz1cInBpdC1yZXN0b3JlLWJ0blwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChhcHBJZCkgKyAnXCIgZGF0YS1maWxlbmFtZT1cIicgKyBlc2NhcGVIdG1sKGYubmFtZSkgKyAnXCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCB2YXIoLS1vay1mZyksICMyN2FlNjApOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogNXB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+UmVzdG9yZTwvYnV0dG9uPicgK1xuICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICBsaXN0RWwuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgLy8gV2lyZSB1cCBidXR0b25zXG4gICAgICBsaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnLnBpdC1jb21wYXJlLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyBjb21wYXJlQmFja3VwRmlsZShidG4uZGF0YXNldC5hcHBpZCwgYnRuLmRhdGFzZXQuZmlsZW5hbWUpOyB9KTtcbiAgICAgIH0pO1xuICAgICAgbGlzdEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5waXQtcmVzdG9yZS1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bikge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgcmVzdG9yZUJhY2t1cEZpbGUoYnRuLmRhdGFzZXQuYXBwaWQsIGJ0bi5kYXRhc2V0LmZpbGVuYW1lKTsgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsaXN0RWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJzwvZGl2Pic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY29tcGFyZUJhY2t1cEZpbGUoYXBwSWQsIGZpbGVuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL2NvbXBhcmUvJyArIGVuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSksIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7fSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignQ29tcGFyZSBmYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93bicpLCAnZXJyb3InKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGlmZiA9IGRhdGEuZGlmZjtcbiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJwb3NpdGlvbjogZml4ZWQ7IHRvcDogMDsgbGVmdDogMDsgcmlnaHQ6IDA7IGJvdHRvbTogMDsgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjUpOyB6LWluZGV4OiAxMDAwMDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCIgaWQ9XCJjb21wYXJlLW92ZXJsYXlcIj4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogMTJweDsgbWF4LXdpZHRoOiA2MDBweDsgd2lkdGg6IDkwJTsgbWF4LWhlaWdodDogODB2aDsgb3ZlcmZsb3c6IGF1dG87IHBhZGRpbmc6IDIwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICc8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCAxNnB4O1wiPlx1RDgzRFx1RENDQSBDb21wYXJlOiAnICsgZXNjYXBlSHRtbChmaWxlbmFtZSkgKyAnPC9oND4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogMTZweDtcIj5TaXplOiAnICsgKGRpZmYuc2l6ZUZvcm1hdHRlZCB8fCAnPycpICsgJyB8IENyZWF0ZWQ6ICcgKyBuZXcgRGF0ZShkaWZmLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKSArICc8L2Rpdj4nO1xuXG4gICAgICBpZiAoZGlmZi5zZXJ2aWNlcykge1xuICAgICAgICB2YXIgc3ZjQ2hhbmdlZCA9IGRpZmYuc2VydmljZXMuaGFzQ2hhbmdlcyA/ICdcdUQ4M0RcdUREMzQnIDogJ1x1RDgzRFx1REZFMic7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07IG1hcmdpbi1ib3R0b206IDRweDtcIj4nICsgc3ZjQ2hhbmdlZCArICcgU2VydmljZXMgKGJhY2t1cCB2cyBjdXJyZW50KTwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+QmFja3VwOiAnICsgZGlmZi5zZXJ2aWNlcy5iYWNrdXBDb3VudCArICcgc2VydmljZXMgfCBDdXJyZW50OiAnICsgZGlmZi5zZXJ2aWNlcy5jdXJyZW50Q291bnQgKyAnIHNlcnZpY2VzPC9kaXY+JztcbiAgICAgICAgaWYgKGRpZmYuc2VydmljZXMuaGFzQ2hhbmdlcykge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA2cHg7IGZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogI2YzOWMxMjtcIj5TZXJ2aWNlcyBkaWZmZXIgXHUyMDE0IHJlc3RvcmluZyB3aWxsIHJlcGxhY2UgY3VycmVudCBjb25maWd1cmF0aW9uPC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlmZi5jb25maWcpIHtcbiAgICAgICAgdmFyIGNmZ0NoYW5nZWQgPSBkaWZmLmNvbmZpZy5oYXNDaGFuZ2VzID8gJ1x1RDgzRFx1REQzNCcgOiAnXHVEODNEXHVERkUyJztcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC44NXJlbTsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPicgKyBjZmdDaGFuZ2VkICsgJyBDb25maWd1cmF0aW9uPC9kaXY+JztcbiAgICAgICAgaWYgKGRpZmYuY29uZmlnLmhhc0NoYW5nZXMpIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiAjZjM5YzEyO1wiPkNvbmZpZ3VyYXRpb24gZGlmZmVycyBcdTIwMTQgcmVzdG9yaW5nIHdpbGwgcmVwbGFjZSBjdXJyZW50IHNldHRpbmdzPC9kaXY+JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1vay1mZyk7XCI+Tm8gY2hhbmdlczwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH1cblxuICAgICAgaHRtbCArPSAnPGJ1dHRvbiBpZD1cImNvbXBhcmUtY2xvc2UtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMjBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwO1wiPkNsb3NlPC9idXR0b24+JyArXG4gICAgICAgICc8L2Rpdj48L2Rpdj4nO1xuXG4gICAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcGFyZS1jbG9zZS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBhcmUtb3ZlcmxheScpPy5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBhcmUtb3ZlcmxheScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYgKGUudGFyZ2V0ID09PSB0aGlzKSB0aGlzLnJlbW92ZSgpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ29tcGFyZSBlcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVzdG9yZUJhY2t1cEZpbGUoYXBwSWQsIGZpbGVuYW1lKSB7XG4gICAgaWYgKCFjb25maXJtKCdSZXN0b3JlICcgKyBmaWxlbmFtZSArICcgZm9yICcgKyBhcHBJZCArICc/XFxuXFxuVGhpcyB3aWxsIHJlcGxhY2UgY3VycmVudCBjb25maWd1cmF0aW9uLCBjcmVkZW50aWFscywgYW5kIGRhdGEuIENvbnRhaW5lcnMgd2lsbCBiZSByZXN0YXJ0ZWQuJykpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXBwcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFwcElkKSArICcvcmV2ZXJ0LycgKyBlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyByZXN0YXJ0Q29udGFpbmVyczogdHJ1ZSB9KVxuICAgICAgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYXBwSWQgKyAnIHJlc3RvcmVkIHRvICcgKyBmaWxlbmFtZSwgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgbG9jYXRpb24ucmVsb2FkKCk7IH0sIDE1MDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUmVzdG9yZSBmYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93bicpLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZXN0b3JlIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFJFU09VUkNFIE1PTklUT1IgKEVuaGFuY2VkKSA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdzdGF0cy1tb2RhbCcsIGA8ZGl2IGlkPVwic3RhdHMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDc1MHB4OyBtYXgtd2lkdGg6IDk1MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1RENDQSBSZXNvdXJjZSBNb25pdG9yPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgUmVhbC10aW1lIGFuZCBoaXN0b3JpY2FsIENQVSwgbWVtb3J5LCBuZXR3b3JrLCBhbmQgZGlzayB1c2FnZSBmb3IgY29udGFpbmVycy5cbiAgICAgIDwvcD5cblxuICAgICAgPCEtLSBUYWIgYmFyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXRhYnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYiBhY3RpdmVcIiBkYXRhLXBhbmVsPVwic3RhdHMtbGl2ZVwiPkxpdmUgU3RhdHM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJzdGF0cy1hZ2dyZWdhdGVkXCI+MjRoIFN1bW1hcnk8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJzdGF0cy1oaXN0b3J5XCI+SGlzdG9yeTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cInN0YXRzLWFsZXJ0c1wiPkFsZXJ0czwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBMaXZlIFN0YXRzIC0tPlxuICAgICAgPGRpdiBpZD1cInN0YXRzLWxpdmVcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzdGF0cy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGNvbnRhaW5lciBzdGF0cy4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogMjRoIEFnZ3JlZ2F0ZWQgU3VtbWFyeSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdGF0cy1hZ2dyZWdhdGVkXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzdGF0cy1hZ2dyZWdhdGVkLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0M4PC9zcGFuPlxuICAgICAgICAgICAgTG9hZGluZyAyNC1ob3VyIGFnZ3JlZ2F0ZWQgbWV0cmljcy4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogTG9uZy10ZXJtIEhpc3RvcnkgLS0+XG4gICAgICA8ZGl2IGlkPVwic3RhdHMtaGlzdG9yeVwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDEycHg7IGZsZXgtd3JhcDogd3JhcDtcIj5cbiAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q29udGFpbmVyOjwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInN0YXRzLWhpc3RvcnktY29udGFpbmVyXCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgZmxleDogMTsgbWluLXdpZHRoOiAxODBweDtcIj48L3NlbGVjdD5cbiAgICAgICAgICA8ZGl2IGlkPVwic3RhdHMtaGlzdG9yeS1yYW5nZS1idXR0b25zXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDRweDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdGF0cy1yYW5nZS1idG4gYWN0aXZlXCIgZGF0YS1yYW5nZT1cIjFoXCI+MWg8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdGF0cy1yYW5nZS1idG5cIiBkYXRhLXJhbmdlPVwiMjRoXCI+MjRoPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RhdHMtcmFuZ2UtYnRuXCIgZGF0YS1yYW5nZT1cIjdkXCI+N2Q8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdGF0cy1yYW5nZS1idG5cIiBkYXRhLXJhbmdlPVwiMzBkXCI+MzBkPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RhdHMtcmFuZ2UtYnRuXCIgZGF0YS1yYW5nZT1cIjF5XCI+MXk8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJzdGF0cy1oaXN0b3J5LWNvbnRhaW5lci1hcmVhXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0E8L3NwYW4+XG4gICAgICAgICAgICBDaG9vc2UgYSBjb250YWluZXIgYW5kIHRpbWUgcmFuZ2UgdG8gdmlldyBoaXN0b3J5LlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogQWxlcnQgQ29uZmlndXJhdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdGF0cy1hbGVydHNcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cInN0YXRzLWFsZXJ0cy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1REQxNDwvc3Bhbj5cbiAgICAgICAgICAgIExvYWRpbmcgYWxlcnQgY29uZmlndXJhdGlvbnMuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBBdXRvLXJlZnJlc2ggdG9nZ2xlIChib3R0b20gYmFyKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib3R0b20tYmFyXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCIgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic3RhdHMtYXV0by1yZWZyZXNoXCIgY2hlY2tlZCAvPlxuICAgICAgICAgIEF1dG8tcmVmcmVzaCBldmVyeSA1c1xuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8YnV0dG9uIGlkPVwic3RhdHMtcmVmcmVzaC1idG5cIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoIE5vdzwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBpZD1cInN0YXRzLWxhc3QtdXBkYXRlXCIgY2xhc3M9XCJ0ZXh0LWF1dG8tcmlnaHRcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDbG9zZSBCdXR0b24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInN0YXRzLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXItc3RhdHMtYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1jYW5jZWwnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1yZWZyZXNoLWJ0bicpO1xuICBjb25zdCBhdXRvUmVmcmVzaENoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWF1dG8tcmVmcmVzaCcpO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtY29udGFpbmVyJyk7XG4gIGNvbnN0IGFnZ3JlZ2F0ZWRDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtYWdncmVnYXRlZC1jb250YWluZXInKTtcbiAgY29uc3QgYWxlcnRzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWFsZXJ0cy1jb250YWluZXInKTtcbiAgY29uc3QgbGFzdFVwZGF0ZVNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtbGFzdC11cGRhdGUnKTtcblxuICBsZXQgcmVmcmVzaEludGVydmFsID0gbnVsbDtcbiAgbGV0IGNhY2hlZE1vbml0b3JpbmdEYXRhID0gbnVsbDtcblxuICBmdW5jdGlvbiBmb3JtYXRCeXRlcyhieXRlcykge1xuICAgIGlmIChieXRlcyA9PT0gMCB8fCAhYnl0ZXMpIHJldHVybiAnMCBCJztcbiAgICBjb25zdCBrID0gMTAyNDtcbiAgICBjb25zdCBzaXplcyA9IFsnQicsICdLQicsICdNQicsICdHQiddO1xuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKTtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZCgxKSkgKyAnICcgKyBzaXplc1tpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldENwdUNvbG9yKHBlcmNlbnQpIHtcbiAgICBpZiAocGVyY2VudCA8IDMwKSByZXR1cm4gJyMyZWNjNzEnO1xuICAgIGlmIChwZXJjZW50IDwgNzApIHJldHVybiAnI2YzOWMxMic7XG4gICAgcmV0dXJuICcjZTc0YzNjJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1lbUNvbG9yKHBlcmNlbnQpIHtcbiAgICBpZiAocGVyY2VudCA8IDUwKSByZXR1cm4gJyMyZWNjNzEnO1xuICAgIGlmIChwZXJjZW50IDwgODApIHJldHVybiAnI2YzOWMxMic7XG4gICAgcmV0dXJuICcjZTc0YzNjJztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRTdGF0cygpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IG5ldyBtb25pdG9yaW5nIEFQSSBmaXJzdCwgZmFsbCBiYWNrIHRvIG9sZFxuICAgICAgbGV0IHN0YXRzID0gbnVsbDtcbiAgICAgIGxldCBpc05ld0FwaSA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbW9uaXRvcmluZy9zdGF0cycpO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLnN0YXRzKSB7IHN0YXRzID0gZGF0YS5zdGF0czsgaXNOZXdBcGkgPSB0cnVlOyBjYWNoZWRNb25pdG9yaW5nRGF0YSA9IGRhdGEuc3RhdHM7IH1cbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG5cbiAgICAgIGlmICghaXNOZXdBcGkpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zdGF0cy9jb250YWluZXJzJyk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5zdGF0cykge1xuICAgICAgICAgIC8vIENvbnZlcnQgYXJyYXkgZm9ybWF0IHRvIG9iamVjdCBmb3JtYXRcbiAgICAgICAgICBzdGF0cyA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBkYXRhLnN0YXRzKSB7XG4gICAgICAgICAgICBzdGF0c1tzLm5hbWVdID0geyBuYW1lOiBzLm5hbWUsIGN1cnJlbnQ6IHsgY3B1OiBzLmNwdSwgbWVtb3J5OiB7IHBlcmNlbnQ6IHMubWVtb3J5LnBlcmNlbnQsIHVzYWdlOiBzLm1lbW9yeS51c2VkLCBsaW1pdDogcy5tZW1vcnkubGltaXQsIHVzYWdlTUI6IE1hdGgucm91bmQocy5tZW1vcnkudXNlZCAvIDEwNDg1NzYpLCBsaW1pdE1COiBNYXRoLnJvdW5kKHMubWVtb3J5LmxpbWl0IC8gMTA0ODU3NikgfSwgbmV0d29yazogeyByeEJ5dGVzOiBzLm5ldHdvcmsucngsIHR4Qnl0ZXM6IHMubmV0d29yay50eCwgcnhNQjogKHMubmV0d29yay5yeCAvIDEwNDg1NzYpLnRvRml4ZWQoMSksIHR4TUI6IChzLm5ldHdvcmsudHggLyAxMDQ4NTc2KS50b0ZpeGVkKDEpIH0sIGRpc2s6IHsgcmVhZE1COiAwLCB3cml0ZU1COiAwIH0gfSwgc3RhdHVzOiBzLnN0YXR1cyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYWNoZWRNb25pdG9yaW5nRGF0YSA9IHN0YXRzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RhdHMgfHwgT2JqZWN0LmtleXMoc3RhdHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gcnVubmluZyBjb250YWluZXJzIGZvdW5kPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA4cHg7XCI+JztcblxuICAgICAgZm9yIChjb25zdCBbaWQsIGluZm9dIG9mIE9iamVjdC5lbnRyaWVzKHN0YXRzKSkge1xuICAgICAgICBjb25zdCBjdXIgPSBpbmZvLmN1cnJlbnQgfHwgaW5mbztcbiAgICAgICAgY29uc3QgY3B1ID0gY3VyLmNwdT8ucGVyY2VudCB8fCAwO1xuICAgICAgICBjb25zdCBtZW0gPSBjdXIubWVtb3J5Py5wZXJjZW50IHx8IDA7XG4gICAgICAgIGNvbnN0IGNwdUNvbG9yID0gZ2V0Q3B1Q29sb3IoY3B1KTtcbiAgICAgICAgY29uc3QgbWVtQ29sb3IgPSBnZXRNZW1Db2xvcihtZW0pO1xuICAgICAgICBjb25zdCBtZW1Vc2VkID0gY3VyLm1lbW9yeT8udXNhZ2UgfHwgY3VyLm1lbW9yeT8udXNlZCB8fCAwO1xuICAgICAgICBjb25zdCBtZW1MaW1pdCA9IGN1ci5tZW1vcnk/LmxpbWl0IHx8IDA7XG4gICAgICAgIGNvbnN0IG5ldFJ4ID0gY3VyLm5ldHdvcms/LnJ4Qnl0ZXMgfHwgY3VyLm5ldHdvcms/LnJ4IHx8IDA7XG4gICAgICAgIGNvbnN0IG5ldFR4ID0gY3VyLm5ldHdvcms/LnR4Qnl0ZXMgfHwgY3VyLm5ldHdvcms/LnR4IHx8IDA7XG4gICAgICAgIGNvbnN0IGFnZyA9IGluZm8uYWdncmVnYXRlZDtcblxuICAgICAgICBodG1sICs9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTJweDsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmbGV4OiAxO1wiPiR7aW5mby5uYW1lIHx8IGlkfTwvc3Bhbj5cbiAgICAgICAgICAgICAgJHthZ2cgPyBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBhZGRpbmc6IDJweCA2cHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDEwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiA0cHg7XCI+YXZnICR7YWdnLmNwdT8uYXZnPy50b0ZpeGVkKDApIHx8IDB9JSBjcHU8L3NwYW4+YCA6ICcnfVxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IHBhZGRpbmc6IDJweCA4cHg7IGJvcmRlci1yYWRpdXM6IDRweDtcIj4ke2luZm8uc3RhdHVzIHx8ICdydW5uaW5nJ308L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCAxZnIpOyBnYXA6IDEycHg7XCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+Q1BVPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7IGhlaWdodDogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogM3B4OyBvdmVyZmxvdzogaGlkZGVuO1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogJHtNYXRoLm1pbihjcHUsIDEwMCl9JTsgYmFja2dyb3VuZDogJHtjcHVDb2xvcn07IGJvcmRlci1yYWRpdXM6IDNweDsgdHJhbnNpdGlvbjogd2lkdGggMC4zcztcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgZm9udC13ZWlnaHQ6IDUwMDsgY29sb3I6ICR7Y3B1Q29sb3J9OyBtaW4td2lkdGg6IDQ1cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPiR7Y3B1LnRvRml4ZWQoMSl9JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+TWVtb3J5PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7IGhlaWdodDogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogM3B4OyBvdmVyZmxvdzogaGlkZGVuO1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogJHtNYXRoLm1pbihtZW0sIDEwMCl9JTsgYmFja2dyb3VuZDogJHttZW1Db2xvcn07IGJvcmRlci1yYWRpdXM6IDNweDsgdHJhbnNpdGlvbjogd2lkdGggMC4zcztcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgZm9udC13ZWlnaHQ6IDUwMDsgY29sb3I6ICR7bWVtQ29sb3J9OyBtaW4td2lkdGg6IDQ1cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPiR7bWVtLnRvRml4ZWQoMSl9JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjY1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAycHg7XCI+JHtmb3JtYXRCeXRlcyhtZW1Vc2VkKX0gLyAke2Zvcm1hdEJ5dGVzKG1lbUxpbWl0KX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+TmV0d29yazwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTtcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICMzNDk4ZGI7XCI+XHUyMTkzICR7Zm9ybWF0Qnl0ZXMobmV0UngpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDRweDtcIj4vPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogI2U3NGMzYztcIj5cdTIxOTEgJHtmb3JtYXRCeXRlcyhuZXRUeCl9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICBsYXN0VXBkYXRlU3Bhbi50ZXh0Q29udGVudCA9ICdVcGRhdGVkOiAnICsgbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlx1Mjc0QyBGYWlsZWQgdG8gbG9hZCBzdGF0czogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICAvLyA9PT0gMjRoIEFnZ3JlZ2F0ZWQgVGFiID09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkQWdncmVnYXRlZCgpIHtcbiAgICBpZiAoIWFnZ3JlZ2F0ZWRDb250YWluZXIpIHJldHVybjtcbiAgICBjb25zdCBkYXRhID0gY2FjaGVkTW9uaXRvcmluZ0RhdGE7XG4gICAgaWYgKCFkYXRhIHx8IE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYWdncmVnYXRlZENvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0M4PC9zcGFuPk5vIG1vbml0b3JpbmcgZGF0YSBhdmFpbGFibGUuIE9wZW4gdGhlIExpdmUgU3RhdHMgdGFiIGZpcnN0LjwvZGl2Pic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEycHg7XCI+JztcbiAgICBmb3IgKGNvbnN0IFtpZCwgaW5mb10gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgIGNvbnN0IGFnZyA9IGluZm8uYWdncmVnYXRlZDtcbiAgICAgIGlmICghYWdnKSBjb250aW51ZTtcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPiR7aW5mby5uYW1lIHx8IGlkfTwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNCwgMWZyKTsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXQtbWluaS1jYXJkXCI+PHNwYW4gY2xhc3M9XCJzdGF0LXZhbFwiPiR7YWdnLmNwdT8uYXZnPy50b0ZpeGVkKDEpIHx8IDB9JTwvc3Bhbj48c3BhbiBjbGFzcz1cInN0YXQtbGJsXCI+QXZnIENQVTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdC1taW5pLWNhcmRcIj48c3BhbiBjbGFzcz1cInN0YXQtdmFsXCI+JHthZ2cuY3B1Py5tYXg/LnRvRml4ZWQoMSkgfHwgMH0lPC9zcGFuPjxzcGFuIGNsYXNzPVwic3RhdC1sYmxcIj5NYXggQ1BVPC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LW1pbmktY2FyZFwiPjxzcGFuIGNsYXNzPVwic3RhdC12YWxcIj4ke2FnZy5tZW1vcnk/LmF2Zz8udG9GaXhlZCgxKSB8fCAwfSU8L3NwYW4+PHNwYW4gY2xhc3M9XCJzdGF0LWxibFwiPkF2ZyBNZW08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXQtbWluaS1jYXJkXCI+PHNwYW4gY2xhc3M9XCJzdGF0LXZhbFwiPiR7YWdnLm1lbW9yeT8ubWF4Py50b0ZpeGVkKDEpIHx8IDB9JTwvc3Bhbj48c3BhbiBjbGFzcz1cInN0YXQtbGJsXCI+TWF4IE1lbTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7YWdnLmRhdGFQb2ludHMgPyBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA2cHg7XCI+JHthZ2cuZGF0YVBvaW50c30gZGF0YSBwb2ludHMgb3ZlciAke2FnZy50aW1lUmFuZ2UgfHwgMjR9aDwvZGl2PmAgOiAnJ31cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgYWdncmVnYXRlZENvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICB9XG5cbiAgLy8gPT09IEFsZXJ0cyBUYWIgPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRBbGVydHMoKSB7XG4gICAgaWYgKCFhbGVydHNDb250YWluZXIpIHJldHVybjtcbiAgICBhbGVydHNDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBhbGVydHMuLi48L2Rpdj4nO1xuXG4gICAgY29uc3QgZGF0YSA9IGNhY2hlZE1vbml0b3JpbmdEYXRhO1xuICAgIGlmICghZGF0YSB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGFsZXJ0c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVERDE0PC9zcGFuPk5vIGNvbnRhaW5lcnMgZm91bmQuIE9wZW4gdGhlIExpdmUgU3RhdHMgdGFiIGZpcnN0LjwvZGl2Pic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgcHJlbWl1bSBzdGF0dXMgZm9yIGNvbmZpZyBzZWN0aW9uIHZpc2liaWxpdHlcbiAgICBsZXQgaXNQcmVtaXVtID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9saWNlbnNlL2ZlYXR1cmUvcmVzb3VyY2UtYWxlcnRzJyk7XG4gICAgICBjb25zdCBsZCA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaXNQcmVtaXVtID0gbGQuYXZhaWxhYmxlO1xuICAgIH0gY2F0Y2ggKF8pIHsgaXNQcmVtaXVtID0gZmFsc2U7IH1cblxuICAgIC8vIEZldGNoIGFsZXJ0IGhpc3RvcnlcbiAgICBsZXQgYWxlcnRIaXN0b3J5ID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhyID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbW9uaXRvcmluZy9hbGVydHM/bGltaXQ9NTAnKTtcbiAgICAgIGNvbnN0IGhkID0gYXdhaXQgaHIuanNvbigpO1xuICAgICAgaWYgKGhkLnN1Y2Nlc3MpIGFsZXJ0SGlzdG9yeSA9IGhkLmhpc3RvcnkgfHwgW107XG4gICAgfSBjYXRjaCAoXykge31cblxuICAgIC8vIEZldGNoIGFsbCBhbGVydCBjb25maWdzXG4gICAgbGV0IGFsbENvbmZpZ3MgPSB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3IgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9tb25pdG9yaW5nL2FsZXJ0cy9jb25maWcnKTtcbiAgICAgIGNvbnN0IGNkID0gYXdhaXQgY3IuanNvbigpO1xuICAgICAgaWYgKGNkLnN1Y2Nlc3MpIGFsbENvbmZpZ3MgPSBjZC5jb25maWdzIHx8IHt9O1xuICAgIH0gY2F0Y2ggKF8pIHt9XG5cbiAgICBjb25zdCBjb250YWluZXJzID0gT2JqZWN0LmVudHJpZXMoZGF0YSk7XG4gICAgY29uc3QgY29udGFpbmVyUm93cyA9IGNvbnRhaW5lcnMubWFwKChbaWQsIGluZm9dKSA9PiB7XG4gICAgICBjb25zdCBjZmcgPSBhbGxDb25maWdzW2lkXSB8fCB7IGNwdVRocmVzaG9sZDogODAsIG1lbW9yeVRocmVzaG9sZDogOTAsIGRpc2tJT1RocmVzaG9sZDogNTAsIGF1dG9SZXN0YXJ0OiBmYWxzZSwgZW5hYmxlZDogZmFsc2UgfTtcbiAgICAgIHJldHVybiBgXG4gICAgICAgIDx0ciBkYXRhLWNvbnRhaW5lcj1cIiR7aWR9XCI+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgcGFkZGluZzogOHB4O1wiPiR7aW5mby5uYW1lIHx8IGlkfTwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDtcIj48aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiYWxlcnQtY3B1XCIgdmFsdWU9XCIke2NmZy5jcHVUaHJlc2hvbGQgPz8gODB9XCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIHN0eWxlPVwid2lkdGg6IDYwcHg7IGZvbnQtc2l6ZTogMC44cmVtOyBwYWRkaW5nOiAycHggNHB4O1wiICR7aXNQcmVtaXVtID8gJycgOiAnZGlzYWJsZWQnfSAvPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDtcIj48aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiYWxlcnQtbWVtXCIgdmFsdWU9XCIke2NmZy5tZW1vcnlUaHJlc2hvbGQgPz8gOTB9XCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIHN0eWxlPVwid2lkdGg6IDYwcHg7IGZvbnQtc2l6ZTogMC44cmVtOyBwYWRkaW5nOiAycHggNHB4O1wiICR7aXNQcmVtaXVtID8gJycgOiAnZGlzYWJsZWQnfSAvPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDtcIj48aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiYWxlcnQtZGlza1wiIHZhbHVlPVwiJHtjZmcuZGlza0lPVGhyZXNob2xkID8/IDUwfVwiIG1pbj1cIjBcIiBtYXg9XCIxMDAwXCIgc3R5bGU9XCJ3aWR0aDogNzBweDsgZm9udC1zaXplOiAwLjhyZW07IHBhZGRpbmc6IDJweCA0cHg7XCIgJHtpc1ByZW1pdW0gPyAnJyA6ICdkaXNhYmxlZCd9IC8+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4O1wiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImFsZXJ0LWF1dG9yZXN0YXJ0XCIgJHtjZmcuYXV0b1Jlc3RhcnQgPyAnY2hlY2tlZCcgOiAnJ30gJHtpc1ByZW1pdW0gPyAnJyA6ICdkaXNhYmxlZCd9IC8+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4O1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFsZXJ0LXRlc3QtYnRuIGJ0bi14c1wiIGRhdGEtY29udGFpbmVyPVwiJHtpZH1cIiBkYXRhLW5hbWU9XCIke2luZm8ubmFtZSB8fCBpZH1cIiBzdHlsZT1cInBhZGRpbmc6IDJweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICBgO1xuICAgIH0pLmpvaW4oJycpO1xuXG4gICAgY29uc3QgaGlzdG9yeVJvd3MgPSBhbGVydEhpc3RvcnkubWFwKGVudHJ5ID0+IHtcbiAgICAgIGNvbnN0IHRpbWUgPSBuZXcgRGF0ZShlbnRyeS50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgICBjb25zdCBub3RpZmllZE1hcmsgPSBlbnRyeS5ub3RpZmllZCA/ICdcdTI3MTMnIDogJ1x1MjAxNCc7XG4gICAgICByZXR1cm4gYFxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHt0aW1lfTwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VudHJ5LmNvbnRhaW5lck5hbWUgfHwgZW50cnkuY29udGFpbmVySWR9PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4OyB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcIj4ke2VudHJ5Lm1ldHJpYyB8fCBlbnRyeS50eXBlfTwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDtcIj4ke3R5cGVvZiBlbnRyeS52YWx1ZSA9PT0gJ251bWJlcicgPyBlbnRyeS52YWx1ZS50b0ZpeGVkKDEpIDogZW50cnkudmFsdWV9JHtlbnRyeS5tZXRyaWMgPT09ICdkaXNrJyA/ICcgTUIvcycgOiAnJSd9PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+JHtub3RpZmllZE1hcmt9PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiAke2VudHJ5LmF1dG9SZXN0YXJ0VHJpZ2dlcmVkID8gJyNmMzljMTInIDogJ3ZhcigtLW11dGVkKSd9O1wiPiR7ZW50cnkuYXV0b1Jlc3RhcnRUcmlnZ2VyZWQgPyAnXHUyMUJCJyA6ICcnfTwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICBgO1xuICAgIH0pLmpvaW4oJycpO1xuXG4gICAgY29uc3QgY29uZmlnU2VjdGlvbiA9IGlzUHJlbWl1bSA/IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMDsgZm9udC1zaXplOiAwLjlyZW07XCI+XHUyNjk5XHVGRTBGIEFsZXJ0IENvbmZpZ3VyYXRpb248L2g0PlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgaWQ9XCJnby10by1ub3RpZmljYXRpb25zXCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7IHRleHQtZGVjb3JhdGlvbjogbm9uZTtcIj5Db25maWd1cmUgbm90aWZpY2F0aW9ucyBcdTIxOTI8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3cteDogYXV0bztcIj5cbiAgICAgICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNvbnRhaW5lcjwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5DUFUgJTwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5NZW0gJTwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5EaXNrIEkvTyBNQi9zPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+QXV0by1SZXN0YXJ0PC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4O1wiPjwvdGg+XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5PiR7Y29udGFpbmVyUm93c308L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2F2ZS1hbGwtYWxlcnRzXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTZweDsgZm9udC1zaXplOiAwLjg1cmVtOyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYmFzZSk7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+U2F2ZSBBbGw8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgIDogYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDIwcHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHJnYmEoMjQxLDE5NiwxNSwwLjEpOyBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI0MSwxOTYsMTUsMC4zKTsgYm9yZGVyLXJhZGl1czogOHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICNmMWM0MGY7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdTJCNTAgUHJlbWl1bSBGZWF0dXJlPC9zcGFuPlxuICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjogNnB4IDAgMDsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlVwZ3JhZGUgdG8gY29uZmlndXJlIHJlc291cmNlIGFsZXJ0IHRocmVzaG9sZHMgcGVyIGNvbnRhaW5lci48L3A+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ1cGdyYWRlLWZvci1hbGVydHNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDsgcGFkZGluZzogNHB4IDEycHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogI2YxYzQwZjsgY29sb3I6ICMwMDA7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+VXBncmFkZSBOb3c8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG5cbiAgICBhbGVydHNDb250YWluZXIuaW5uZXJIVE1MID0gYFxuICAgICAgJHtjb25maWdTZWN0aW9ufVxuICAgICAgPGRpdj5cbiAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgMTBweDsgZm9udC1zaXplOiAwLjlyZW07XCI+XHVEODNEXHVEQ0NCIFJlY2VudCBBbGVydHM8L2g0PlxuICAgICAgICAke2hpc3RvcnlSb3dzID8gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy14OiBhdXRvO1wiPlxuICAgICAgICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlRpbWU8L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Db250YWluZXI8L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5NZXRyaWM8L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5WYWx1ZTwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XHUyNzEzPzwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4O1wiPjwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgPHRib2R5PiR7aGlzdG9yeVJvd3N9PC90Ym9keT5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGAgOiAnPGRpdiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj5ObyBhbGVydHMgcmVjb3JkZWQgeWV0LjwvZGl2Pid9XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuXG4gICAgLy8gV2lyZSB1cCBzYXZlLWFsbCBidXR0b25cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZS1hbGwtYWxlcnRzJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29uZmlncyA9IHt9O1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3N0YXRzLWFsZXJ0cy1jb250YWluZXIgdHJbZGF0YS1jb250YWluZXJdJykuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICBjb25zdCBjSWQgPSByb3cuZGF0YXNldC5jb250YWluZXI7XG4gICAgICAgIGNvbmZpZ3NbY0lkXSA9IHtcbiAgICAgICAgICBjcHVUaHJlc2hvbGQ6IHBhcnNlSW50KHJvdy5xdWVyeVNlbGVjdG9yKCcuYWxlcnQtY3B1Jyk/LnZhbHVlKSB8fCA4MCxcbiAgICAgICAgICBtZW1vcnlUaHJlc2hvbGQ6IHBhcnNlSW50KHJvdy5xdWVyeVNlbGVjdG9yKCcuYWxlcnQtbWVtJyk/LnZhbHVlKSB8fCA5MCxcbiAgICAgICAgICBkaXNrSU9UaHJlc2hvbGQ6IHBhcnNlSW50KHJvdy5xdWVyeVNlbGVjdG9yKCcuYWxlcnQtZGlzaycpPy52YWx1ZSkgfHwgNTAsXG4gICAgICAgICAgYXV0b1Jlc3RhcnQ6ICEhcm93LnF1ZXJ5U2VsZWN0b3IoJy5hbGVydC1hdXRvcmVzdGFydCcpPy5jaGVja2VkLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbW9uaXRvcmluZy9hbGVydHMvY29uZmlnJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY29uZmlncyB9KVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZCA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlLWFsbC1hbGVydHMnKTtcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gZC5zdWNjZXNzID8gJ1x1MjcwNSBTYXZlZCcgOiAnXHUyNzRDIEZhaWxlZCc7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnU2F2ZSBBbGwnOyB9LCAyMDAwKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NhdmUtYWxsLWFsZXJ0cycpO1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzRDIEVycm9yJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdTYXZlIEFsbCc7IH0sIDIwMDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2lyZSB1cCBub3RpZmljYXRpb24gc2V0dGluZ3MgbGlua1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnby10by1ub3RpZmljYXRpb25zJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIHN0b3BBdXRvUmVmcmVzaCgpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS1ub3RpZmljYXRpb25zJyk/LmNsaWNrKCk7XG4gICAgfSk7XG5cbiAgICAvLyBXaXJlIHVwIHRlc3QgYnV0dG9uc1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hbGVydC10ZXN0LWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3JpZyA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJy4uLic7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvbW9uaXRvcmluZy9hbGVydHMvJHtidG4uZGF0YXNldC5jb250YWluZXJ9L3Rlc3RgLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUnO1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1Rlc3QgYWxlcnQgc2VudCBmb3IgJyArIGJ0bi5kYXRhc2V0Lm5hbWUsICdzdWNjZXNzJywgMzAwMCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzRDJztcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gb3JpZzsgfSwgMjAwMCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFdpcmUgdXAgdXBncmFkZSBidXR0b25cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBncmFkZS1mb3ItYWxlcnRzJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgc3RvcEF1dG9SZWZyZXNoKCk7XG4gICAgICBpZiAodHlwZW9mIG9wZW5MaWNlbnNlTW9kYWwgPT09ICdmdW5jdGlvbicpIG9wZW5MaWNlbnNlTW9kYWwoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0QXV0b1JlZnJlc2goKSB7XG4gICAgaWYgKHJlZnJlc2hJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbChyZWZyZXNoSW50ZXJ2YWwpO1xuICAgIGlmIChhdXRvUmVmcmVzaENoZWNrYm94Py5jaGVja2VkKSB7XG4gICAgICByZWZyZXNoSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChsb2FkU3RhdHMsIERDLlBPTEwuU1RBVFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3BBdXRvUmVmcmVzaCgpIHtcbiAgICBpZiAocmVmcmVzaEludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHJlZnJlc2hJbnRlcnZhbCk7XG4gICAgICByZWZyZXNoSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIE9wZW4gbW9kYWxcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRTdGF0cygpO1xuICAgIHN0YXJ0QXV0b1JlZnJlc2goKTtcbiAgfSk7XG5cbiAgLy8gQ2xvc2UgbW9kYWxcbiAgY2FuY2VsQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgc3RvcEF1dG9SZWZyZXNoKCk7XG4gIH0pO1xuXG4gIG1vZGFsPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkge1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgc3RvcEF1dG9SZWZyZXNoKCk7XG4gICAgfVxuICB9KTtcblxuICByZWZyZXNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRTdGF0cyk7XG5cbiAgYXV0b1JlZnJlc2hDaGVja2JveD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGlmIChhdXRvUmVmcmVzaENoZWNrYm94LmNoZWNrZWQpIHN0YXJ0QXV0b1JlZnJlc2goKTtcbiAgICBlbHNlIHN0b3BBdXRvUmVmcmVzaCgpO1xuICB9KTtcblxuICAvLyBMYXp5LWxvYWQgdGFic1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cInN0YXRzLWFnZ3JlZ2F0ZWRcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkQWdncmVnYXRlZCk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwic3RhdHMtYWxlcnRzXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEFsZXJ0cyk7XG5cbiAgLy8gPT09IEhpc3RvcnkgVGFiID09PVxuICBjb25zdCBoaXN0b3J5Q29udGFpbmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWhpc3RvcnktY29udGFpbmVyJyk7XG4gIGNvbnN0IGhpc3RvcnlBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWhpc3RvcnktY29udGFpbmVyLWFyZWEnKTtcbiAgY29uc3QgcmFuZ2VCdXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YXRzLXJhbmdlLWJ0bicpO1xuXG4gIGxldCBjdXJyZW50UmFuZ2UgPSAnMWgnO1xuXG4gIGZ1bmN0aW9uIHJhbmdlVG9NcyhyYW5nZSkge1xuICAgIHN3aXRjaCAocmFuZ2UpIHtcbiAgICAgIGNhc2UgJzFoJzogIHJldHVybiA2MCAqIDYwICogMTAwMDtcbiAgICAgIGNhc2UgJzI0aCc6IHJldHVybiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgICAgY2FzZSAnN2QnOiAgcmV0dXJuIDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgICAgY2FzZSAnMzBkJzogcmV0dXJuIDMwICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICAgIGNhc2UgJzF5JzogIHJldHVybiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgICAgZGVmYXVsdDogICAgcmV0dXJuIDYwICogNjAgKiAxMDAwO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRpZXJMYWJlbCh0aWVyKSB7XG4gICAgaWYgKHRpZXIgPT09ICdyYXcnKSByZXR1cm4gJ2xpdmUgKDEwcyBzYW1wbGVzKSc7XG4gICAgaWYgKHRpZXIgPT09ICdob3VybHknKSByZXR1cm4gJ2hvdXJseSBhdmVyYWdlJztcbiAgICBpZiAodGllciA9PT0gJ2RhaWx5JykgcmV0dXJuICdkYWlseSBhdmVyYWdlJztcbiAgICByZXR1cm4gdGllcjtcbiAgfVxuXG4gIC8vIFNpbXBsZSBTVkcgc3BhcmtsaW5lIFx1MjAxNCBubyBleHRlcm5hbCBsaWJcbiAgZnVuY3Rpb24gcmVuZGVyU3BhcmtsaW5lKHNhbXBsZXMsIGFjY2Vzc29yLCBjb2xvciwgbGFiZWwsIHVuaXQpIHtcbiAgICBpZiAoIXNhbXBsZXMgfHwgc2FtcGxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTsgcGFkZGluZzogMjBweDtcIj5ObyBkYXRhIGZvciAke2VzY2FwZUh0bWwobGFiZWwpfTwvZGl2PmA7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IHNhbXBsZXMubWFwKGFjY2Vzc29yKS5maWx0ZXIodiA9PiB2ICE9IG51bGwpO1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBhZGRpbmc6IDIwcHg7XCI+Tm8gZGF0YSBmb3IgJHtlc2NhcGVIdG1sKGxhYmVsKX08L2Rpdj5gO1xuICAgIH1cbiAgICBjb25zdCBtYXggPSBNYXRoLm1heCguLi52YWx1ZXMsIDEpO1xuICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKC4uLnZhbHVlcywgMCk7XG4gICAgY29uc3QgcmFuZ2UgPSBtYXggLSBtaW4gfHwgMTtcbiAgICBjb25zdCB3ID0gNjAwLCBoID0gODAsIHBhZCA9IDQ7XG4gICAgY29uc3Qgc3RlcFggPSAodyAtIHBhZCAqIDIpIC8gTWF0aC5tYXgodmFsdWVzLmxlbmd0aCAtIDEsIDEpO1xuICAgIGNvbnN0IHBvaW50cyA9IHZhbHVlcy5tYXAoKHYsIGkpID0+IHtcbiAgICAgIGNvbnN0IHggPSBwYWQgKyBpICogc3RlcFg7XG4gICAgICBjb25zdCB5ID0gaCAtIHBhZCAtICgodiAtIG1pbikgLyByYW5nZSkgKiAoaCAtIHBhZCAqIDIpO1xuICAgICAgcmV0dXJuIGAke3gudG9GaXhlZCgxKX0sJHt5LnRvRml4ZWQoMSl9YDtcbiAgICB9KS5qb2luKCcgJyk7XG4gICAgY29uc3QgbGFzdCA9IHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYXZnID0gdmFsdWVzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gdmFsdWVzLmxlbmd0aDtcbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE0cHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogYmFzZWxpbmU7IGdhcDogMTJweDsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JHtlc2NhcGVIdG1sKGxhYmVsKX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+bGFzdCAke2xhc3QudG9GaXhlZCgxKX0ke3VuaXR9IFx1MDBCNyBhdmcgJHthdmcudG9GaXhlZCgxKX0ke3VuaXR9IFx1MDBCNyBtYXggJHttYXgudG9GaXhlZCgxKX0ke3VuaXR9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwICR7d30gJHtofVwiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJub25lXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAke2h9cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XG4gICAgICAgICAgPHBvbHlsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiJHtjb2xvcn1cIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBwb2ludHM9XCIke3BvaW50c31cIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICBmdW5jdGlvbiBwb3B1bGF0ZUhpc3RvcnlDb250YWluZXJTZWxlY3QoKSB7XG4gICAgaWYgKCFoaXN0b3J5Q29udGFpbmVyU2VsZWN0KSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGNhY2hlZE1vbml0b3JpbmdEYXRhIHx8IHt9O1xuICAgIGNvbnN0IHByZXZpb3VzID0gaGlzdG9yeUNvbnRhaW5lclNlbGVjdC52YWx1ZTtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZGF0YSk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBoaXN0b3J5Q29udGFpbmVyU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+Tm8gY29udGFpbmVyczwvb3B0aW9uPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhpc3RvcnlDb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gZW50cmllc1xuICAgICAgLm1hcCgoW2lkLCBpbmZvXSkgPT4gYDxvcHRpb24gdmFsdWU9XCIke2VzY2FwZUh0bWwoaWQpfVwiPiR7ZXNjYXBlSHRtbChpbmZvLm5hbWUgfHwgaWQpfTwvb3B0aW9uPmApXG4gICAgICAuam9pbignJyk7XG4gICAgaWYgKHByZXZpb3VzICYmIGRhdGFbcHJldmlvdXNdKSBoaXN0b3J5Q29udGFpbmVyU2VsZWN0LnZhbHVlID0gcHJldmlvdXM7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkSGlzdG9yeSgpIHtcbiAgICBpZiAoIWhpc3RvcnlBcmVhIHx8ICFoaXN0b3J5Q29udGFpbmVyU2VsZWN0KSByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVySWQgPSBoaXN0b3J5Q29udGFpbmVyU2VsZWN0LnZhbHVlO1xuICAgIGlmICghY29udGFpbmVySWQpIHtcbiAgICAgIGhpc3RvcnlBcmVhLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0E8L3NwYW4+Tm8gY29udGFpbmVyIHNlbGVjdGVkLjwvZGl2Pic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IGVuZFRpbWUgLSByYW5nZVRvTXMoY3VycmVudFJhbmdlKTtcbiAgICBoaXN0b3J5QXJlYS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGhpc3RvcnkuLi48L2Rpdj4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL21vbml0b3JpbmcvaGlzdG9yeS8ke2VuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJJZCl9P3N0YXJ0VGltZT0ke3N0YXJ0VGltZX0mZW5kVGltZT0ke2VuZFRpbWV9YCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQgaGlzdG9yeScpO1xuXG4gICAgICBjb25zdCBzYW1wbGVzID0gZGF0YS5zYW1wbGVzIHx8IFtdO1xuICAgICAgY29uc3QgdGllciA9IGRhdGEudGllciB8fCAncmF3JztcblxuICAgICAgaWYgKHNhbXBsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGhpc3RvcnlBcmVhLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0E8L3NwYW4+Tm8gZGF0YSBmb3IgdGhlIGxhc3QgJHtjdXJyZW50UmFuZ2V9LiBUaWVyOiAke3RpZXJMYWJlbCh0aWVyKX0uPC9kaXY+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEaWZmZXJlbnQgc2hhcGUgYmV0d2VlbiByYXcgdnMgcm9sbGVkLXVwIHNhbXBsZXNcbiAgICAgIGNvbnN0IGlzUmF3ID0gdGllciA9PT0gJ3Jhdyc7XG4gICAgICBjb25zdCBjcHVBY2Nlc3NvciA9IGlzUmF3ID8gKHMpID0+IHMuY3B1Py5wZXJjZW50IDogKHMpID0+IHMuY3B1Py5hdmc7XG4gICAgICBjb25zdCBtZW1BY2Nlc3NvciA9IGlzUmF3ID8gKHMpID0+IHMubWVtb3J5Py5wZXJjZW50IDogKHMpID0+IHMubWVtb3J5Py5hdmdQZXJjZW50O1xuICAgICAgY29uc3QgbmV0UnhBY2Nlc3NvciA9IGlzUmF3ID8gKHMpID0+IChzLm5ldHdvcms/LnJ4TUIgfHwgMCkgOiAocykgPT4gKHMubmV0d29yaz8ucnhNQiB8fCAwKTtcbiAgICAgIGNvbnN0IG5ldFR4QWNjZXNzb3IgPSBpc1JhdyA/IChzKSA9PiAocy5uZXR3b3JrPy50eE1CIHx8IDApIDogKHMpID0+IChzLm5ldHdvcms/LnR4TUIgfHwgMCk7XG5cbiAgICAgIGxldCBodG1sID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgJHtzYW1wbGVzLmxlbmd0aH0gc2FtcGxlcyBcdTAwQjcgJHtlc2NhcGVIdG1sKHRpZXJMYWJlbCh0aWVyKSl9IFx1MDBCNyAke25ldyBEYXRlKHN0YXJ0VGltZSkudG9Mb2NhbGVTdHJpbmcoKX0gXHUyMTkyICR7bmV3IERhdGUoZW5kVGltZSkudG9Mb2NhbGVTdHJpbmcoKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgICAgaHRtbCArPSByZW5kZXJTcGFya2xpbmUoc2FtcGxlcywgY3B1QWNjZXNzb3IsICcjMmVjYzcxJywgJ0NQVScsICclJyk7XG4gICAgICBodG1sICs9IHJlbmRlclNwYXJrbGluZShzYW1wbGVzLCBtZW1BY2Nlc3NvciwgJyMzNDk4ZGInLCAnTWVtb3J5JywgJyUnKTtcbiAgICAgIGh0bWwgKz0gcmVuZGVyU3BhcmtsaW5lKHNhbXBsZXMsIG5ldFJ4QWNjZXNzb3IsICcjOWI1OWI2JywgJ05ldHdvcmsgUlgnLCAnIE1CJyk7XG4gICAgICBodG1sICs9IHJlbmRlclNwYXJrbGluZShzYW1wbGVzLCBuZXRUeEFjY2Vzc29yLCAnI2U2N2UyMicsICdOZXR3b3JrIFRYJywgJyBNQicpO1xuXG4gICAgICBoaXN0b3J5QXJlYS5pbm5lckhUTUwgPSBodG1sO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhpc3RvcnlBcmVhLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTI2QTBcdUZFMEY8L3NwYW4+RmFpbGVkIHRvIGxvYWQgaGlzdG9yeTogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICByYW5nZUJ1dHRvbnMuZm9yRWFjaChidG4gPT4ge1xuICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHJhbmdlQnV0dG9ucy5mb3JFYWNoKGIgPT4gYi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgICBidG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBjdXJyZW50UmFuZ2UgPSBidG4uZGF0YXNldC5yYW5nZTtcbiAgICAgIGxvYWRIaXN0b3J5KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGhpc3RvcnlDb250YWluZXJTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGxvYWRIaXN0b3J5KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cInN0YXRzLWhpc3RvcnlcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgcG9wdWxhdGVIaXN0b3J5Q29udGFpbmVyU2VsZWN0KCk7XG4gICAgbG9hZEhpc3RvcnkoKTtcbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBIRUFMVEggQ0hFQ0sgREFTSEJPQVJEID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2hlYWx0aC1tb2RhbCcsIGA8ZGl2IGlkPVwiaGVhbHRoLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA4MDBweDsgbWF4LXdpZHRoOiAxMDAwcHg7XCI+XG4gICAgICA8aDM+XHVEODNDXHVERkU1IEhlYWx0aCBDaGVjayBEYXNoYm9hcmQ8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlxuICAgICAgICBTZXJ2aWNlIHVwdGltZSB0cmFja2luZywgU0xBIG1vbml0b3JpbmcsIGFuZCBpbmNpZGVudCBtYW5hZ2VtZW50LlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJoZWFsdGgtc3RhdHVzXCI+U3RhdHVzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiaGVhbHRoLWluY2lkZW50c1wiPkluY2lkZW50czwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImhlYWx0aC1jb25maWdcIj5Db25maWd1cmU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogU3RhdHVzIC0tPlxuICAgICAgPGRpdiBpZD1cImhlYWx0aC1zdGF0dXNcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtc3RhdHVzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBoZWFsdGggc3RhdHVzLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBJbmNpZGVudHMgLS0+XG4gICAgICA8ZGl2IGlkPVwiaGVhbHRoLWluY2lkZW50c1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiaGVhbHRoLWluY2lkZW50cy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURFQTg8L3NwYW4+IExvYWRpbmcgaW5jaWRlbnRzLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBDb25maWd1cmUgLS0+XG4gICAgICA8ZGl2IGlkPVwiaGVhbHRoLWNvbmZpZ1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiaGVhbHRoLWNvbmZpZy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTI2OTlcdUZFMEY8L3NwYW4+IExvYWRpbmcgY29uZmlndXJhdGlvbi4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEdsb2JhbCBTZXR0aW5nczogcmV0ZW50aW9uLCBwb2xsaW5nIGludGVydmFscywgbWF4IGVudHJpZXMsIGRpc2stdXNhZ2UgdGhyZXNob2xkIC0tPlxuICAgICAgICA8ZGl2IGlkPVwiaGVhbHRoLWdsb2JhbC1zZXR0aW5nc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzKTsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCA0cHg7XCI+XHVEODNDXHVERjBEIEdsb2JhbCBTZXR0aW5nczwvaDQ+XG4gICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCIgc3R5bGU9XCJtYXJnaW46IDAgMCAxMnB4O1wiPkFwcGxpZXMgdG8gYWxsIGhlYWx0aCBjaGVja3MuIFNldHRpbmdzIGFyZSBzdG9yZWQgbG9jYWxseSBpbiB0aGlzIGJyb3dzZXIuPC9wPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogMTJweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5IZWFsdGggQ2hlY2sgUG9sbGluZyBJbnRlcnZhbCAoc2Vjb25kcyk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLXNldHRpbmctaW50ZXJ2YWxcIiB2YWx1ZT1cIjYwXCIgbWluPVwiNVwiIG1heD1cIjM2MDBcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjcycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAycHg7XCI+SG93IG9mdGVuIGVhY2ggc2VydmljZSdzIGhlYWx0aCBlbmRwb2ludCBpcyBjaGVja2VkLjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+U3RhdHMgUG9sbGluZyBJbnRlcnZhbCAoc2Vjb25kcyk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLXNldHRpbmctc3RhdHMtaW50ZXJ2YWxcIiB2YWx1ZT1cIjMwXCIgbWluPVwiNVwiIG1heD1cIjM2MDBcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjcycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAycHg7XCI+SG93IG9mdGVuIGNvbnRhaW5lciBzdGF0aXN0aWNzIChDUFUvbWVtb3J5KSBhcmUgc2FtcGxlZC48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPk1heCBFbnRyaWVzIFBlciBTZXJ2aWNlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1zZXR0aW5nLW1heC1lbnRyaWVzXCIgdmFsdWU9XCI1MDBcIiBtaW49XCIxMFwiIG1heD1cIjEwMDAwMFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDJweDtcIj5DYXAgb24gc3RvcmVkIGhpc3RvcnkgcmVjb3JkcyBwZXIgc2VydmljZS48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkRhdGEgUmV0ZW50aW9uIChkYXlzKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtc2V0dGluZy1yZXRlbnRpb25cIiB2YWx1ZT1cIjMwXCIgbWluPVwiMVwiIG1heD1cIjM2NTBcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjcycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAycHg7XCI+SGVhbHRoIGhpc3Rvcnkgb2xkZXIgdGhhbiB0aGlzIGlzIHBydW5lZC48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkRpc2stVXNhZ2UgV2FybmluZyAoJSk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLXNldHRpbmctZGlzay10aHJlc2hvbGRcIiB2YWx1ZT1cIjgwXCIgbWluPVwiNTBcIiBtYXg9XCI5OVwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDJweDtcIj5XYXJuIHdoZW4gZGlzayB1c2FnZSBleGNlZWRzIHRoaXMgbGV2ZWwuPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLWdsb2JhbC1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCI+U2F2ZSBHbG9iYWwgU2V0dGluZ3M8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtZ2xvYmFsLXJlc2V0XCIgY2xhc3M9XCJidG4tc21cIj5SZXNldCB0byBEZWZhdWx0czwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJoZWFsdGgtZ2xvYmFsLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEFkZC9FZGl0IEhlYWx0aCBDaGVjayBGb3JtIC0tPlxuICAgICAgICA8ZGl2IGlkPVwiaGVhbHRoLWNvbmZpZy1mb3JtXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpOyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpO1wiPlxuICAgICAgICAgIDxoNCBpZD1cImhlYWx0aC1mb3JtLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46IDAgMCAxMnB4O1wiPkFkZCBIZWFsdGggQ2hlY2s8L2g0PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogMTJweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5TZXJ2aWNlIElEPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJoZWFsdGgtZm9ybS1pZFwiIHBsYWNlaG9sZGVyPVwiZS5nLiBwbGV4XCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkRpc3BsYXkgTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaGVhbHRoLWZvcm0tbmFtZVwiIHBsYWNlaG9sZGVyPVwiZS5nLiBQbGV4IE1lZGlhIFNlcnZlclwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJncmlkLWNvbHVtbjogc3BhbiAyO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+VVJMPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJoZWFsdGgtZm9ybS11cmxcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vcGxleC5ob21lXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlRpbWVvdXQgKG1zKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtZm9ybS10aW1lb3V0XCIgdmFsdWU9XCIxMDAwMFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5FeHBlY3RlZCBTdGF0dXMgQ29kZXM8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImhlYWx0aC1mb3JtLWNvZGVzXCIgdmFsdWU9XCIyMDBcIiBwbGFjZWhvbGRlcj1cIjIwMCwgMzAxLCAzMDJcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+U0xBIFRhcmdldCAoJSk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLWZvcm0tc2xhXCIgdmFsdWU9XCI5OS45XCIgc3RlcD1cIjAuMVwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5TbG93IFJlc3BvbnNlIFRocmVzaG9sZCAobXMpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1mb3JtLXNsb3dcIiB2YWx1ZT1cIjUwMDBcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1mb3JtLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1mb3JtLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIj5TYXZlPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4O1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtYWRkLWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiPisgQWRkIEhlYWx0aCBDaGVjazwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtYm90dG9tLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLXJlZnJlc2gtYnRuXCIgY2xhc3M9XCJidG4tc21cIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBpZD1cImhlYWx0aC1sYXN0LXVwZGF0ZVwiIGNsYXNzPVwidGV4dC1hdXRvLXJpZ2h0XCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNhbmNlbCcpO1xuICBjb25zdCByZWZyZXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1yZWZyZXNoLWJ0bicpO1xuICBjb25zdCBzdGF0dXNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXN0YXR1cy1jb250YWluZXInKTtcbiAgY29uc3QgaW5jaWRlbnRzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1pbmNpZGVudHMtY29udGFpbmVyJyk7XG4gIGNvbnN0IGNvbmZpZ0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY29uZmlnLWNvbnRhaW5lcicpO1xuICBjb25zdCBsYXN0VXBkYXRlU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtbGFzdC11cGRhdGUnKTtcbiAgY29uc3QgYWRkQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1hZGQtYnRuJyk7XG4gIGNvbnN0IGZvcm1FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY29uZmlnLWZvcm0nKTtcbiAgY29uc3QgZm9ybVRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXRpdGxlJyk7XG4gIGNvbnN0IGZvcm1DYW5jZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tY2FuY2VsJyk7XG4gIGNvbnN0IGZvcm1TYXZlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXNhdmUnKTtcblxuICAvLyAtLS0tIEdsb2JhbCBoZWFsdGggc2V0dGluZ3MgKHJldGVudGlvbiwgcG9sbGluZyBpbnRlcnZhbHMsIG1heCBlbnRyaWVzLCBkaXNrIHRocmVzaG9sZCkgLS0tLVxuICBjb25zdCBIRUFMVEhfU0VUVElOR1NfS0VZID0gJ2Rhc2hjYWRkeS1oZWFsdGgtc2V0dGluZ3MnO1xuICBjb25zdCBIRUFMVEhfREVGQVVMVFMgPSB7IHJldGVudGlvbkRheXM6IDMwLCBwb2xsaW5nSW50ZXJ2YWw6IDYwLCBzdGF0c1BvbGxpbmdJbnRlcnZhbDogMzAsIG1heEVudHJpZXNQZXJTZXJ2aWNlOiA1MDAsIGRpc2tVc2FnZVRocmVzaG9sZDogODAgfTtcbiAgY29uc3QgZ2xvYmFsU2F2ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZ2xvYmFsLXNhdmUnKTtcbiAgY29uc3QgZ2xvYmFsUmVzZXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWdsb2JhbC1yZXNldCcpO1xuICBjb25zdCBnbG9iYWxTdGF0dXNTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1nbG9iYWwtc3RhdHVzJyk7XG4gIGNvbnN0IHJldGVudGlvbklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1zZXR0aW5nLXJldGVudGlvbicpO1xuICBjb25zdCBpbnRlcnZhbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1zZXR0aW5nLWludGVydmFsJyk7XG4gIGNvbnN0IHN0YXRzSW50ZXJ2YWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtc2V0dGluZy1zdGF0cy1pbnRlcnZhbCcpO1xuICBjb25zdCBtYXhFbnRyaWVzSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXNldHRpbmctbWF4LWVudHJpZXMnKTtcbiAgY29uc3QgZGlza1RocmVzaG9sZElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1zZXR0aW5nLWRpc2stdGhyZXNob2xkJyk7XG5cbiAgZnVuY3Rpb24gbG9hZEhlYWx0aFNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBzYWZlR2V0KEhFQUxUSF9TRVRUSU5HU19LRVkpO1xuICAgICAgY29uc3Qgc2F2ZWQgPSByYXcgPyBKU09OLnBhcnNlKHJhdykgOiB7fTtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBIRUFMVEhfREVGQVVMVFMsIHNhdmVkKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgSEVBTFRIX0RFRkFVTFRTKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseUhlYWx0aFNldHRpbmdzVG9VSSgpIHtcbiAgICBjb25zdCBzID0gbG9hZEhlYWx0aFNldHRpbmdzKCk7XG4gICAgaWYgKHJldGVudGlvbklucHV0KSByZXRlbnRpb25JbnB1dC52YWx1ZSA9IHMucmV0ZW50aW9uRGF5cztcbiAgICBpZiAoaW50ZXJ2YWxJbnB1dCkgaW50ZXJ2YWxJbnB1dC52YWx1ZSA9IHMucG9sbGluZ0ludGVydmFsO1xuICAgIGlmIChzdGF0c0ludGVydmFsSW5wdXQpIHN0YXRzSW50ZXJ2YWxJbnB1dC52YWx1ZSA9IHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWw7XG4gICAgaWYgKG1heEVudHJpZXNJbnB1dCkgbWF4RW50cmllc0lucHV0LnZhbHVlID0gcy5tYXhFbnRyaWVzUGVyU2VydmljZTtcbiAgICBpZiAoZGlza1RocmVzaG9sZElucHV0KSBkaXNrVGhyZXNob2xkSW5wdXQudmFsdWUgPSBzLmRpc2tVc2FnZVRocmVzaG9sZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVIZWFsdGhTZXR0aW5ncygpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHtcbiAgICAgIHJldGVudGlvbkRheXM6IE1hdGgubWF4KDEsIE1hdGgubWluKDM2NTAsIHBhcnNlSW50KHJldGVudGlvbklucHV0Py52YWx1ZSkgfHwgSEVBTFRIX0RFRkFVTFRTLnJldGVudGlvbkRheXMpKSxcbiAgICAgIHBvbGxpbmdJbnRlcnZhbDogTWF0aC5tYXgoNSwgTWF0aC5taW4oMzYwMCwgcGFyc2VJbnQoaW50ZXJ2YWxJbnB1dD8udmFsdWUpIHx8IEhFQUxUSF9ERUZBVUxUUy5wb2xsaW5nSW50ZXJ2YWwpKSxcbiAgICAgIHN0YXRzUG9sbGluZ0ludGVydmFsOiBNYXRoLm1heCg1LCBNYXRoLm1pbigzNjAwLCBwYXJzZUludChzdGF0c0ludGVydmFsSW5wdXQ/LnZhbHVlKSB8fCBIRUFMVEhfREVGQVVMVFMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwpKSxcbiAgICAgIG1heEVudHJpZXNQZXJTZXJ2aWNlOiBNYXRoLm1heCgxMCwgTWF0aC5taW4oMTAwMDAwLCBwYXJzZUludChtYXhFbnRyaWVzSW5wdXQ/LnZhbHVlKSB8fCBIRUFMVEhfREVGQVVMVFMubWF4RW50cmllc1BlclNlcnZpY2UpKSxcbiAgICAgIGRpc2tVc2FnZVRocmVzaG9sZDogTWF0aC5tYXgoNTAsIE1hdGgubWluKDk5LCBwYXJzZUludChkaXNrVGhyZXNob2xkSW5wdXQ/LnZhbHVlKSB8fCBIRUFMVEhfREVGQVVMVFMuZGlza1VzYWdlVGhyZXNob2xkKSlcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBzYWZlU2V0KEhFQUxUSF9TRVRUSU5HU19LRVksIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSk7XG4gICAgICBhcHBseUhlYWx0aFNldHRpbmdzVG9VSSgpO1xuICAgICAgaWYgKGdsb2JhbFN0YXR1c1NwYW4pIHtcbiAgICAgICAgZ2xvYmFsU3RhdHVzU3Bhbi50ZXh0Q29udGVudCA9ICdTYXZlZCBcdTI3MTMnO1xuICAgICAgICBnbG9iYWxTdGF0dXNTcGFuLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBpZiAoZ2xvYmFsU3RhdHVzU3BhbikgZ2xvYmFsU3RhdHVzU3Bhbi50ZXh0Q29udGVudCA9ICcnOyB9LCAyNTAwKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykgc2hvd05vdGlmaWNhdGlvbignR2xvYmFsIGhlYWx0aCBzZXR0aW5ncyBzYXZlZCcsICdzdWNjZXNzJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGdsb2JhbFN0YXR1c1NwYW4pIHsgZ2xvYmFsU3RhdHVzU3Bhbi50ZXh0Q29udGVudCA9ICdTYXZlIGZhaWxlZCc7IGdsb2JhbFN0YXR1c1NwYW4uc3R5bGUuY29sb3IgPSAndmFyKC0tYmFkLWZnKSc7IH1cbiAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykgc2hvd05vdGlmaWNhdGlvbignRmFpbGVkIHRvIHNhdmUgc2V0dGluZ3M6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0SGVhbHRoU2V0dGluZ3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHNhZmVTZXQoSEVBTFRIX1NFVFRJTkdTX0tFWSwgSlNPTi5zdHJpbmdpZnkoSEVBTFRIX0RFRkFVTFRTKSk7XG4gICAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgKi8gfVxuICAgIGFwcGx5SGVhbHRoU2V0dGluZ3NUb1VJKCk7XG4gICAgaWYgKGdsb2JhbFN0YXR1c1NwYW4pIHtcbiAgICAgIGdsb2JhbFN0YXR1c1NwYW4udGV4dENvbnRlbnQgPSAnUmVzZXQgdG8gZGVmYXVsdHMgXHUyNzEzJztcbiAgICAgIGdsb2JhbFN0YXR1c1NwYW4uc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcpJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBpZiAoZ2xvYmFsU3RhdHVzU3BhbikgZ2xvYmFsU3RhdHVzU3Bhbi50ZXh0Q29udGVudCA9ICcnOyB9LCAyNTAwKTtcbiAgICB9XG4gIH1cblxuICBhcHBseUhlYWx0aFNldHRpbmdzVG9VSSgpO1xuICBnbG9iYWxTYXZlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNhdmVIZWFsdGhTZXR0aW5ncyk7XG4gIGdsb2JhbFJlc2V0QnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlc2V0SGVhbHRoU2V0dGluZ3MpO1xuICAvLyAtLS0tIEVuZCBnbG9iYWwgaGVhbHRoIHNldHRpbmdzIC0tLS1cblxuICBsZXQgZWRpdGluZ0lkID0gbnVsbDtcblxuICBmdW5jdGlvbiB1cHRpbWVDb2xvcihwY3QpIHtcbiAgICBpZiAocGN0ID49IDk5LjkpIHJldHVybiAndmFyKC0tb2stZmcpJztcbiAgICBpZiAocGN0ID49IDk1KSByZXR1cm4gJyNmMzljMTInO1xuICAgIHJldHVybiAndmFyKC0tYmFkLWZnKSc7XG4gIH1cblxuICBmdW5jdGlvbiBzZXZlcml0eUJhZGdlKHNldikge1xuICAgIGNvbnN0IGNvbG9ycyA9IHsgY3JpdGljYWw6ICd2YXIoLS1iYWQtZmcpJywgaGlnaDogJyNmZjZiNmInLCBtZWRpdW06ICcjZjM5YzEyJywgbG93OiAndmFyKC0tbXV0ZWQpJyB9O1xuICAgIHJldHVybiBgPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiAycHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogJHtjb2xvcnNbc2V2XSB8fCAndmFyKC0tbXV0ZWQpJ30yMDsgY29sb3I6ICR7Y29sb3JzW3Nldl0gfHwgJ3ZhcigtLW11dGVkKSd9O1wiPiR7c2V2fTwvc3Bhbj5gO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFN0YXR1cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEuc3RhdHVzIHx8IE9iamVjdC5rZXlzKGRhdGEuc3RhdHVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc3RhdHVzQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0NcdURGRTU8L3NwYW4+Tm8gaGVhbHRoIGNoZWNrcyBjb25maWd1cmVkLiBHbyB0byB0aGUgQ29uZmlndXJlIHRhYiB0byBhZGQgc2VydmljZXMuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VydmljZXMgPSBPYmplY3QudmFsdWVzKGRhdGEuc3RhdHVzKTtcbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODVyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBsZWZ0O1wiPic7XG4gICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+U2VydmljZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPlN0YXR1czwvdGg+JztcbiAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5VcHRpbWUgMjRoPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+VXB0aW1lIDdkPC90aD4nO1xuICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPkF2ZyBSZXNwb25zZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPkxhc3QgQ2hlY2s8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgcyBvZiBzZXJ2aWNlcykge1xuICAgICAgICBjb25zdCBpc1VwID0gcy5zdGF0dXMgPT09ICd1cCc7XG4gICAgICAgIGNvbnN0IGRvdENvbG9yID0gaXNVcCA/ICd2YXIoLS1kb3Qtb2spJyA6ICd2YXIoLS1kb3QtYmFkKSc7XG4gICAgICAgIGNvbnN0IHUyNCA9IHMudXB0aW1lPy5bJzI0aCddID8/ICctJztcbiAgICAgICAgY29uc3QgdTdkID0gcy51cHRpbWU/LlsnN2QnXSA/PyAnLSc7XG4gICAgICAgIGNvbnN0IGF2Z1J0ID0gcy5hdmdSZXNwb25zZVRpbWUgIT0gbnVsbCA/IE1hdGgucm91bmQocy5hdmdSZXNwb25zZVRpbWUpICsgJ21zJyA6ICctJztcbiAgICAgICAgY29uc3QgbGFzdENoZWNrID0gcy50aW1lc3RhbXAgPyB0aW1lQWdvKHMudGltZXN0YW1wKSA6ICctJztcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjtcIiBkYXRhLWhlYWx0aC1pZD1cIiR7ZXNjYXBlSHRtbChzLnNlcnZpY2VJZCl9XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChzLm5hbWUgfHwgcy5zZXJ2aWNlSWQpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPjxzcGFuIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogOHB4OyBoZWlnaHQ6IDhweDsgYm9yZGVyLXJhZGl1czogNTAlOyBiYWNrZ3JvdW5kOiAke2RvdENvbG9yfTsgbWFyZ2luLXJpZ2h0OiA2cHg7XCI+PC9zcGFuPiR7aXNVcCA/ICdVcCcgOiAnRG93bid9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGNvbG9yOiAke3R5cGVvZiB1MjQgPT09ICdudW1iZXInID8gdXB0aW1lQ29sb3IodTI0KSA6ICd2YXIoLS1tdXRlZCknfTtcIj4ke3R5cGVvZiB1MjQgPT09ICdudW1iZXInID8gdTI0LnRvRml4ZWQoMSkgKyAnJScgOiB1MjR9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGNvbG9yOiAke3R5cGVvZiB1N2QgPT09ICdudW1iZXInID8gdXB0aW1lQ29sb3IodTdkKSA6ICd2YXIoLS1tdXRlZCknfTtcIj4ke3R5cGVvZiB1N2QgPT09ICdudW1iZXInID8gdTdkLnRvRml4ZWQoMSkgKyAnJScgOiB1N2R9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+JHthdmdSdH08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2xhc3RDaGVja308L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgICAgaHRtbCArPSBgPHRyIGlkPVwiaGVhbHRoLWRldGFpbC0ke2VzY2FwZUh0bWwocy5zZXJ2aWNlSWQpfVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48dGQgY29sc3Bhbj1cIjZcIiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+PGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGRldGFpbHMuLi48L2Rpdj48L3RkPjwvdHI+YDtcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIHN0YXR1c0NvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgbGFzdFVwZGF0ZVNwYW4udGV4dENvbnRlbnQgPSAnVXBkYXRlZCAnICsgbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKTtcblxuICAgICAgLy8gUm93IGNsaWNrIHRvIGV4cGFuZCBkZXRhaWxzXG4gICAgICBzdGF0dXNDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgndHJbZGF0YS1oZWFsdGgtaWRdJykuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSByb3cuZGF0YXNldC5oZWFsdGhJZDtcbiAgICAgICAgICBjb25zdCBkZXRhaWxSb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWRldGFpbC0nICsgaWQpO1xuICAgICAgICAgIGlmICghZGV0YWlsUm93KSByZXR1cm47XG4gICAgICAgICAgaWYgKGRldGFpbFJvdy5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGRldGFpbFJvdy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZXRhaWxSb3cuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvaGVhbHRoLWNoZWNrcy8ke2lkfS9zdGF0cz9ob3Vycz0yNGApO1xuICAgICAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICAgICAgaWYgKGQuc3VjY2VzcyAmJiBkLnN0YXRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0ID0gZC5zdGF0cztcbiAgICAgICAgICAgICAgY29uc3QgcnQgPSBzdC5yZXNwb25zZVRpbWUgfHwge307XG4gICAgICAgICAgICAgIGRldGFpbFJvdy5xdWVyeVNlbGVjdG9yKCd0ZCcpLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNCwgMWZyKTsgZ2FwOiAxMnB4OyBmb250LXNpemU6IDAuODJyZW07XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5Ub3RhbCBDaGVja3M8L3NwYW4+PGJyPjxzdHJvbmc+JHtzdC50b3RhbENoZWNrcyB8fCAwfTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+VXB0aW1lPC9zcGFuPjxicj48c3Ryb25nIHN0eWxlPVwiY29sb3I6ICR7dXB0aW1lQ29sb3Ioc3QudXB0aW1lIHx8IDApfTtcIj4keyhzdC51cHRpbWUgfHwgMCkudG9GaXhlZCgyKX0lPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5BdmcgUmVzcG9uc2U8L3NwYW4+PGJyPjxzdHJvbmc+JHtNYXRoLnJvdW5kKHJ0LmF2ZyB8fCAwKX1tczwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UDk1IC8gUDk5PC9zcGFuPjxicj48c3Ryb25nPiR7TWF0aC5yb3VuZChydC5wOTUgfHwgMCl9bXMgLyAke01hdGgucm91bmQocnQucDk5IHx8IDApfW1zPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5NaW4gUmVzcG9uc2U8L3NwYW4+PGJyPjxzdHJvbmc+JHtNYXRoLnJvdW5kKHJ0Lm1pbiB8fCAwKX1tczwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TWF4IFJlc3BvbnNlPC9zcGFuPjxicj48c3Ryb25nPiR7TWF0aC5yb3VuZChydC5tYXggfHwgMCl9bXM8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlVwIENoZWNrczwvc3Bhbj48YnI+PHN0cm9uZyBzdHlsZT1cImNvbG9yOiB2YXIoLS1vay1mZyk7XCI+JHtzdC51cENoZWNrcyB8fCAwfTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+RG93biBDaGVja3M8L3NwYW4+PGJyPjxzdHJvbmcgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj4ke3N0LmRvd25DaGVja3MgfHwgMH08L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGV0YWlsUm93LnF1ZXJ5U2VsZWN0b3IoJ3RkJykuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPk5vIGRldGFpbGVkIHN0YXRzIGF2YWlsYWJsZSBmb3IgdGhpcyBwZXJpb2QuPC9kaXY+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkZXRhaWxSb3cucXVlcnlTZWxlY3RvcigndGQnKS5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0YXR1c0NvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQgdG8gbG9hZCBoZWFsdGggc3RhdHVzOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRJbmNpZGVudHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFtvcGVuUmVzLCBoaXN0UmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9pbmNpZGVudHMnKSxcbiAgICAgICAgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9pbmNpZGVudHMvaGlzdG9yeT9saW1pdD01MCcpXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IG9wZW5EYXRhID0gYXdhaXQgb3BlblJlcy5qc29uKCk7XG4gICAgICBjb25zdCBoaXN0RGF0YSA9IGF3YWl0IGhpc3RSZXMuanNvbigpO1xuICAgICAgbGV0IGh0bWwgPSAnJztcblxuICAgICAgLy8gT3BlbiBpbmNpZGVudHNcbiAgICAgIGNvbnN0IG9wZW4gPSAob3BlbkRhdGEuc3VjY2VzcyAmJiBvcGVuRGF0YS5pbmNpZGVudHMpID8gb3BlbkRhdGEuaW5jaWRlbnRzIDogW107XG4gICAgICBpZiAob3Blbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4O1wiPjxoNCBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpOyBtYXJnaW46IDAgMCA4cHg7XCI+T3BlbiBJbmNpZGVudHMgKCcgKyBvcGVuLmxlbmd0aCArICcpPC9oND4nO1xuICAgICAgICBmb3IgKGNvbnN0IGluYyBvZiBvcGVuKSB7XG4gICAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTJweDsgbWFyZ2luLWJvdHRvbTogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWQtZmcpMzA7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmFkLWJnKTtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwoaW5jLnNlcnZpY2VJZCl9PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj4ke3NldmVyaXR5QmFkZ2UoaW5jLnNldmVyaXR5KX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj4ke2VzY2FwZUh0bWwoaW5jLm1lc3NhZ2UpfTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPlN0YXJ0ZWQgJHt0aW1lQWdvKGluYy5jcmVhdGVkQXQpfSBcdTAwQjcgJHtpbmMub2NjdXJyZW5jZXMgfHwgMX0gb2NjdXJyZW5jZShzKTwvZGl2PlxuICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1vay1mZykzMDsgYm9yZGVyLXJhZGl1czogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1vay1iZyk7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW9rLWZnKTsgZm9udC1zaXplOiAwLjlyZW07XCI+QWxsIHNlcnZpY2VzIG9wZXJhdGlvbmFsIFx1MjAxNCBubyBvcGVuIGluY2lkZW50czwvZGl2Pic7XG4gICAgICB9XG5cbiAgICAgIC8vIEluY2lkZW50IGhpc3RvcnlcbiAgICAgIGNvbnN0IGhpc3RvcnkgPSAoaGlzdERhdGEuc3VjY2VzcyAmJiBoaXN0RGF0YS5oaXN0b3J5KSA/IGhpc3REYXRhLmhpc3RvcnkgOiBbXTtcbiAgICAgIGlmIChoaXN0b3J5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaHRtbCArPSAnPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkluY2lkZW50IEhpc3Rvcnk8L2g0Pic7XG4gICAgICAgIGh0bWwgKz0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODJyZW07XCI+JztcbiAgICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlNlcnZpY2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5UeXBlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U2V2ZXJpdHk8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TdGF0dXM8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5EdXJhdGlvbjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPldoZW48L3RoPjwvdHI+JztcbiAgICAgICAgZm9yIChjb25zdCBpbmMgb2YgaGlzdG9yeSkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gaW5jLnN0YXR1cyA9PT0gJ3Jlc29sdmVkJztcbiAgICAgICAgICBjb25zdCBkdXIgPSByZXNvbHZlZCAmJiBpbmMuZHVyYXRpb24gPyAoaW5jLmR1cmF0aW9uIDwgNjAwMDAgPyBNYXRoLnJvdW5kKGluYy5kdXJhdGlvbiAvIDEwMDApICsgJ3MnIDogTWF0aC5yb3VuZChpbmMuZHVyYXRpb24gLyA2MDAwMCkgKyAnbScpIDogJy0nO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPiR7ZXNjYXBlSHRtbChpbmMuc2VydmljZUlkKX08L3RkPmA7XG4gICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPiR7ZXNjYXBlSHRtbChpbmMudHlwZSl9PC90ZD5gO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj4ke3NldmVyaXR5QmFkZ2UoaW5jLnNldmVyaXR5KX08L3RkPmA7XG4gICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPjxzcGFuIHN0eWxlPVwiY29sb3I6ICR7cmVzb2x2ZWQgPyAndmFyKC0tb2stZmcpJyA6ICd2YXIoLS1iYWQtZmcpJ307XCI+JHtpbmMuc3RhdHVzfTwvc3Bhbj48L3RkPmA7XG4gICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPiR7ZHVyfTwvdGQ+YDtcbiAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHt0aW1lQWdvKGluYy5jcmVhdGVkQXQpfTwvdGQ+YDtcbiAgICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgfVxuXG4gICAgICBpbmNpZGVudHNDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbCB8fCAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVERUE4PC9zcGFuPk5vIGluY2lkZW50cyByZWNvcmRlZCB5ZXQuPC9kaXY+JztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpbmNpZGVudHNDb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRDb25maWcoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2hlYWx0aC1jaGVja3Mvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IHNlcnZpY2VzID0gZGF0YS5zdWNjZXNzICYmIGRhdGEuc3RhdHVzID8gT2JqZWN0LnZhbHVlcyhkYXRhLnN0YXR1cykgOiBbXTtcbiAgICAgIGlmIChzZXJ2aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uZmlnQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTI2OTlcdUZFMEY8L3NwYW4+Tm8gaGVhbHRoIGNoZWNrcyBjb25maWd1cmVkIHlldC4gQ2xpY2sgXCJBZGQgSGVhbHRoIENoZWNrXCIgYmVsb3cuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlNlcnZpY2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TdGF0dXM8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TTEEgVGFyZ2V0PC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPkFjdGlvbnM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgcyBvZiBzZXJ2aWNlcykge1xuICAgICAgICBjb25zdCBpc1VwID0gcy5zdGF0dXMgPT09ICd1cCc7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwocy5uYW1lIHx8IHMuc2VydmljZUlkKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgY29sb3I6ICR7aXNVcCA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJhZC1mZyknfTtcIj4ke2lzVXAgPyAnVXAnIDogJ0Rvd24nfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPiR7cy5zbGE/LnRhcmdldCA/IHMuc2xhLnRhcmdldCArICclJyA6ICctJ308L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPGJ1dHRvbiBvbmNsaWNrPVwiZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hlYWx0aC1lZGl0Jywge2RldGFpbDonJHtlc2NhcGVIdG1sKHMuc2VydmljZUlkKX0nfSkpXCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtOyBtYXJnaW4tcmlnaHQ6IDRweDtcIj5FZGl0PC9idXR0b24+YDtcbiAgICAgICAgaHRtbCArPSBgPGJ1dHRvbiBvbmNsaWNrPVwiZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hlYWx0aC1kZWxldGUnLCB7ZGV0YWlsOicke2VzY2FwZUh0bWwocy5zZXJ2aWNlSWQpfSd9KSlcIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBib3JkZXItY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGVsZXRlPC9idXR0b24+YDtcbiAgICAgICAgaHRtbCArPSAnPC90ZD48L3RyPic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBjb25maWdDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25maWdDb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dGb3JtKGlkLCBuYW1lLCB1cmwsIHRpbWVvdXQsIGNvZGVzLCBzbGEsIHNsb3cpIHtcbiAgICBlZGl0aW5nSWQgPSBpZCB8fCBudWxsO1xuICAgIGZvcm1UaXRsZS50ZXh0Q29udGVudCA9IGlkID8gJ0VkaXQgSGVhbHRoIENoZWNrJyA6ICdBZGQgSGVhbHRoIENoZWNrJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0taWQnKS52YWx1ZSA9IGlkIHx8ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1pZCcpLmRpc2FibGVkID0gISFpZDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tbmFtZScpLnZhbHVlID0gbmFtZSB8fCAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tdXJsJykudmFsdWUgPSB1cmwgfHwgJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXRpbWVvdXQnKS52YWx1ZSA9IHRpbWVvdXQgfHwgMTAwMDA7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWNvZGVzJykudmFsdWUgPSBjb2RlcyB8fCAnMjAwJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tc2xhJykudmFsdWUgPSBzbGEgfHwgOTkuOTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tc2xvdycpLnZhbHVlID0gc2xvdyB8fCA1MDAwO1xuICAgIGZvcm1FbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgYWRkQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlRm9ybSgpIHtcbiAgICBmb3JtRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBhZGRCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGVkaXRpbmdJZCA9IG51bGw7XG4gIH1cblxuICBhZGRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2hvd0Zvcm0oJycsICcnLCAnJywgMTAwMDAsICcyMDAnLCA5OS45LCA1MDAwKSk7XG4gIGZvcm1DYW5jZWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGlkZUZvcm0pO1xuXG4gIGZvcm1TYXZlPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpZCA9IGVkaXRpbmdJZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0taWQnKS52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFpZCkgcmV0dXJuIHNob3dOb3RpZmljYXRpb24oJ1NlcnZpY2UgSUQgaXMgcmVxdWlyZWQnLCAnd2FybmluZycpO1xuICAgIGNvbnN0IHVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS11cmwnKS52YWx1ZS50cmltKCk7XG4gICAgaWYgKCF1cmwpIHJldHVybiBzaG93Tm90aWZpY2F0aW9uKCdVUkwgaXMgcmVxdWlyZWQnLCAnd2FybmluZycpO1xuXG4gICAgY29uc3QgY29kZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tY29kZXMnKS52YWx1ZS5zcGxpdCgnLCcpLm1hcChjID0+IHBhcnNlSW50KGMudHJpbSgpKSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICBuYW1lOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tbmFtZScpLnZhbHVlLnRyaW0oKSB8fCBpZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS10aW1lb3V0JykudmFsdWUpIHx8IDEwMDAwLFxuICAgICAgZXhwZWN0ZWRTdGF0dXNDb2RlczogY29kZXMubGVuZ3RoID8gY29kZXMgOiBbMjAwXSxcbiAgICAgIHNsYTogeyB0YXJnZXQ6IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXNsYScpLnZhbHVlKSB8fCA5OS45IH0sXG4gICAgICBzbG93UmVzcG9uc2VUaHJlc2hvbGQ6IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1zbG93JykudmFsdWUpIHx8IDUwMDBcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvcm1TYXZlLnRleHRDb250ZW50ID0gJ1NhdmluZy4uLic7XG4gICAgICBmb3JtU2F2ZS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9oZWFsdGgtY2hlY2tzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX0vY29uZmlndXJlYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgICAgaGlkZUZvcm0oKTtcbiAgICAgIGxvYWRDb25maWcoKTtcbiAgICAgIGxvYWRTdGF0dXMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGZvcm1TYXZlLnRleHRDb250ZW50ID0gJ1NhdmUnO1xuICAgICAgZm9ybVNhdmUuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hlYWx0aC1lZGl0JywgYXN5bmMgKGUpID0+IHtcbiAgICBjb25zdCBpZCA9IGUuZGV0YWlsO1xuICAgIC8vIExvYWQgZXhpc3RpbmcgY29uZmlnIHRvIHBvcHVsYXRlIGZvcm0gXHUyMDE0IHVzZSBjdXJyZW50IHN0YXR1cyBkYXRhIGFzIGZhbGxiYWNrXG4gICAgc2hvd0Zvcm0oaWQsICcnLCAnJywgMTAwMDAsICcyMDAnLCA5OS45LCA1MDAwKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaGVhbHRoLWRlbGV0ZScsIGFzeW5jIChlKSA9PiB7XG4gICAgY29uc3QgaWQgPSBlLmRldGFpbDtcbiAgICBpZiAoIWNvbmZpcm0oYERlbGV0ZSBoZWFsdGggY2hlY2sgZm9yIFwiJHtpZH1cIj9gKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9oZWFsdGgtY2hlY2tzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX0vY29uZmlndXJlYCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IpO1xuICAgICAgbG9hZENvbmZpZygpO1xuICAgICAgbG9hZFN0YXR1cygpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRTdGF0dXMoKTtcbiAgfSk7XG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcbiAgcmVmcmVzaEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkU3RhdHVzKTtcblxuICAvLyBMYXp5LWxvYWQgdGFic1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cImhlYWx0aC1pbmNpZGVudHNcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkSW5jaWRlbnRzKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJoZWFsdGgtY29uZmlnXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZENvbmZpZyk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBVUERBVEUgTUFOQUdFTUVOVCA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCd1cGRhdGVzLW1vZGFsJywgYDxkaXYgaWQ9XCJ1cGRhdGVzLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA3NTBweDsgbWF4LXdpZHRoOiA5NTBweDtcIj5cbiAgICAgIDxoMz5cdTJCMDZcdUZFMEYgVXBkYXRlIE1hbmFnZW1lbnQ8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlxuICAgICAgICBDaGVjayBmb3IgY29udGFpbmVyIGltYWdlIHVwZGF0ZXMsIGFwcGx5IHRoZW0sIGFuZCBtYW5hZ2Ugcm9sbGJhY2tzLlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJ1cGRhdGVzLWF2YWlsYWJsZVwiPkF2YWlsYWJsZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cInVwZGF0ZXMtaGlzdG9yeVwiPkhpc3Rvcnk8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJ1cGRhdGVzLWF1dG9cIj5BdXRvLVVwZGF0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cInVwZGF0ZXMtZGFzaGNhZGR5XCIgaWQ9XCJ1cGRhdGVzLWRhc2hjYWRkeS10YWJcIj5EYXNoQ2FkZHk8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogQXZhaWxhYmxlIFVwZGF0ZXMgLS0+XG4gICAgICA8ZGl2IGlkPVwidXBkYXRlcy1hdmFpbGFibGVcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwidXBkYXRlcy1jaGVjay1idG5cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIj5cdUQ4M0RcdUREMEQgQ2hlY2sgZm9yIFVwZGF0ZXM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwidXBkYXRlcy11cGRhdGUtYWxsLWJ0blwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44MnJlbTsgYmFja2dyb3VuZDogI2Y5NzMxNjsgY29sb3I6ICNmZmY7IGJvcmRlcjogMXB4IHNvbGlkICNmOTczMTY7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlx1MkIwNlx1RkUwRiBVcGRhdGUgQWxsPC9idXR0b24+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJ1cGRhdGVzLWNvdW50LWJhZGdlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBwYWRkaW5nOiA0cHggMTBweDsgYm9yZGVyLXJhZGl1czogMTJweDsgZm9udC1zaXplOiAwLjc4cmVtOyBmb250LXdlaWdodDogNjAwOyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYmcpO1wiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWF2YWlsYWJsZS1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDQ1MHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENFNjwvc3Bhbj4gQ2xpY2sgXCJDaGVjayBmb3IgVXBkYXRlc1wiIHRvIHNjYW4gY29udGFpbmVycy48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEhpc3RvcnkgLS0+XG4gICAgICA8ZGl2IGlkPVwidXBkYXRlcy1oaXN0b3J5XCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWhpc3RvcnktY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIHVwZGF0ZSBoaXN0b3J5Li4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBBdXRvLVVwZGF0ZSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWF1dG9cIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cInVwZGF0ZXMtYXV0by1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0VcdUREMTY8L3NwYW4+IExvYWRpbmcgYXV0by11cGRhdGUgY29uZmlndXJhdGlvbi4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogRGFzaENhZGR5IFNlbGYtVXBkYXRlIC0tPlxuICAgICAgPGRpdiBpZD1cInVwZGF0ZXMtZGFzaGNhZGR5XCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJkYXNoY2FkZHktdmVyc2lvbi1pbmZvXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDE2cHg7IG1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMXJlbTtcIj5EYXNoQ2FkZHk8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJkYXNoY2FkZHktY3VycmVudC12ZXJzaW9uXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuODVyZW07XCI+TG9hZGluZy4uLjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJkYXNoY2FkZHktdXBkYXRlLWJhZGdlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBwYWRkaW5nOiA0cHggMTJweDsgYm9yZGVyLXJhZGl1czogMTJweDsgZm9udC1zaXplOiAwLjc4cmVtOyBmb250LXdlaWdodDogNjAwOyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYmcpO1wiPlVwZGF0ZSBhdmFpbGFibGU8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkYXNoY2FkZHktdXBkYXRlLWRldGFpbHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7XCI+TmV3IHZlcnNpb246IDxzcGFuIGlkPVwiZGFzaGNhZGR5LW5ldy12ZXJzaW9uXCI+PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJkYXNoY2FkZHktYXBwbHktYnRuXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTZweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlVwZGF0ZSBOb3c8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LWNoYW5nZWxvZ1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1heC1oZWlnaHQ6IDEyMHB4OyBvdmVyZmxvdy15OiBhdXRvOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LW1vbm8pOyBsaW5lLWhlaWdodDogMS41O1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRhc2hjYWRkeS1zdGF0dXMtYmFyXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nOiAxMHB4IDEycHg7IGJvcmRlci1yYWRpdXM6IDhweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZGFzaGNhZGR5LWNoZWNrLWJ0blwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5DaGVjayBmb3IgVXBkYXRlczwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJkYXNoY2FkZHktcm9sbGJhY2stYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjgycmVtOyBtYXJnaW4tbGVmdDogNnB4O1wiPlJvbGxiYWNrPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LWhpc3RvcnktY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAyNTBweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDRTY8L3NwYW4+Tm8gc2VsZi11cGRhdGUgaGlzdG9yeS48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvdHRvbS1iYXJcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJ1cGRhdGVzLWxhc3QtY2hlY2tcIiBjbGFzcz1cInRleHQtYXV0by1yaWdodFwiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInVwZGF0ZXMtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtY2FuY2VsJyk7XG4gIGNvbnN0IGNoZWNrQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtY2hlY2stYnRuJyk7XG4gIGNvbnN0IGF2YWlsYWJsZUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWF2YWlsYWJsZS1jb250YWluZXInKTtcbiAgY29uc3QgaGlzdG9yeUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWhpc3RvcnktY29udGFpbmVyJyk7XG4gIGNvbnN0IGF1dG9Db250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1hdXRvLWNvbnRhaW5lcicpO1xuICBjb25zdCBsYXN0Q2hlY2tTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtbGFzdC1jaGVjaycpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRBdmFpbGFibGUoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3VwZGF0ZXMvYXZhaWxhYmxlJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvcik7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZXMgPSBkYXRhLnVwZGF0ZXMgfHwgW107XG4gICAgICBpZiAodXBkYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYXZhaWxhYmxlQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTI3MDU8L3NwYW4+QWxsIGNvbnRhaW5lcnMgYXJlIHVwIHRvIGRhdGUuPC9kaXY+JztcbiAgICAgICAgbGFzdENoZWNrU3Bhbi50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy11cGRhdGUtYWxsLWJ0bicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWNvdW50LWJhZGdlJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgd2luZG93Ll9wZW5kaW5nVXBkYXRlcyA9IFtdO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODVyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5Db250YWluZXI8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5JbWFnZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkN1cnJlbnQ8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5MYXRlc3Q8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+QWN0aW9uczwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCB1IG9mIHVwZGF0ZXMpIHtcbiAgICAgICAgLy8gTWF0Y2ggYXBwIGJ5IGNvbnRhaW5lcklkIGZpcnN0LCB0aGVuIG5hbWVcbiAgICAgICAgY29uc3QgYXBwSWQgPSAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFwcHMgPSB3aW5kb3cuQVBQUyB8fCBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGEgb2YgYXBwcykge1xuICAgICAgICAgICAgaWYgKGEuY29udGFpbmVySWQgPT09IHUuY29udGFpbmVySWQgfHwgYS5uYW1lID09PSB1LmNvbnRhaW5lck5hbWUgfHwgYS5pZCA9PT0gdS5jb250YWluZXJOYW1lKSByZXR1cm4gYS5pZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHUuY29udGFpbmVyTmFtZTtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgaHRtbCArPSBgPHRyIGRhdGEtYXBwLWlkPVwiJHtlc2NhcGVIdG1sKGFwcElkKX1cIiBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwodS5jb250YWluZXJOYW1lKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2VzY2FwZUh0bWwodS5pbWFnZU5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPjxjb2RlIHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDtcIj4ke2VzY2FwZUh0bWwodS5jdXJyZW50RGlnZXN0KX08L2NvZGU+PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+PGNvZGUgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGJhY2tncm91bmQ6IHZhcigtLW9rLWJnKTsgY29sb3I6IHZhcigtLW9rLWZnKTsgcGFkZGluZzogMnB4IDZweDsgYm9yZGVyLXJhZGl1czogNHB4O1wiPiR7ZXNjYXBlSHRtbCh1LmxhdGVzdERpZ2VzdCl9PC9jb2RlPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5gO1xuICAgICAgICBodG1sICs9IGA8YnV0dG9uIGNsYXNzPVwidXBkYXRlLW5vdy1idG5cIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKHUuY29udGFpbmVySWQpfVwiIGRhdGEtbmFtZT1cIiR7ZXNjYXBlSHRtbCh1LmNvbnRhaW5lck5hbWUpfVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWJnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tcmlnaHQ6IDRweDtcIj5VcGRhdGU8L2J1dHRvbj5gO1xuICAgICAgICBodG1sICs9IGA8YnV0dG9uIGNsYXNzPVwicm9sbGJhY2stYnRuXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbCh1LmNvbnRhaW5lcklkKX1cIiBkYXRhLW5hbWU9XCIke2VzY2FwZUh0bWwodS5jb250YWluZXJOYW1lKX1cIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07XCI+Um9sbGJhY2s8L2J1dHRvbj5gO1xuICAgICAgICBodG1sICs9ICc8L3RkPjwvdHI+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIGF2YWlsYWJsZUNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgbGFzdENoZWNrU3Bhbi50ZXh0Q29udGVudCA9IHVwZGF0ZXMubGVuZ3RoICsgJyB1cGRhdGUocykgYXZhaWxhYmxlJztcblxuICAgICAgLy8gU2hvdyBjb3VudCBiYWRnZSBhbmQgVXBkYXRlIEFsbCBidXR0b25cbiAgICAgIGNvbnN0IGNvdW50QmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1jb3VudC1iYWRnZScpO1xuICAgICAgY29uc3QgdXBkYXRlQWxsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtdXBkYXRlLWFsbC1idG4nKTtcbiAgICAgIGlmIChjb3VudEJhZGdlKSB7XG4gICAgICAgIGNvdW50QmFkZ2UudGV4dENvbnRlbnQgPSB1cGRhdGVzLmxlbmd0aCArICcgcGVuZGluZyc7XG4gICAgICAgIGNvdW50QmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZUFsbEJ0biAmJiB1cGRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXBkYXRlQWxsQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUgdXBkYXRlcyBmb3IgVXBkYXRlIEFsbCBidXR0b25cbiAgICAgIHdpbmRvdy5fcGVuZGluZ1VwZGF0ZXMgPSB1cGRhdGVzO1xuXG4gICAgICAvLyBXaXJlIHVwZGF0ZSBidXR0b25zXG4gICAgICBhdmFpbGFibGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnVwZGF0ZS1ub3ctYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBidG4uZGF0YXNldC5pZDtcbiAgICAgICAgICBjb25zdCBuYW1lID0gYnRuLmRhdGFzZXQubmFtZTtcbiAgICAgICAgICBpZiAoIWNvbmZpcm0oYFVwZGF0ZSBcIiR7bmFtZX1cIiB0byB0aGUgbGF0ZXN0IHZlcnNpb24/IFRoZSBjb250YWluZXIgd2lsbCByZXN0YXJ0LmApKSByZXR1cm47XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1VwZGF0aW5nLi4uJztcbiAgICAgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvdXBkYXRlcy91cGRhdGUvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfWAsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGF1dG9Sb2xsYmFjazogdHJ1ZSB9KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgICAgICBpZiAoZC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdEb25lISc7XG4gICAgICAgICAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gbG9hZEF2YWlsYWJsZSgpLCAyMDAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkLmVycm9yIHx8ICdVcGRhdGUgZmFpbGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ0ZhaWxlZCc7XG4gICAgICAgICAgICBidG4uc3R5bGUuY29sb3IgPSAndmFyKC0tYmFkLWZnKSc7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdVcGRhdGUgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdVcGRhdGUnOyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLnN0eWxlLmNvbG9yID0gJyc7IGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7IH0sIDMwMDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gV2lyZSByb2xsYmFjayBidXR0b25zXG4gICAgICBhdmFpbGFibGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnJvbGxiYWNrLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gYnRuLmRhdGFzZXQuaWQ7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGJ0bi5kYXRhc2V0Lm5hbWU7XG4gICAgICAgICAgaWYgKCFjb25maXJtKGBSb2xsYmFjayBcIiR7bmFtZX1cIiB0byBpdHMgcHJldmlvdXMgdmVyc2lvbj9gKSkgcmV0dXJuO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdSb2xsaW5nIGJhY2suLi4nO1xuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS91cGRhdGVzL3JvbGxiYWNrLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICAgICAgaWYgKGQuc3VjY2Vzcykge1xuICAgICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnUm9sbGVkIGJhY2shJztcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBsb2FkQXZhaWxhYmxlKCksIDIwMDApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGQuZXJyb3IgfHwgJ1JvbGxiYWNrIGZhaWxlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdGYWlsZWQnO1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUm9sbGJhY2sgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdSb2xsYmFjayc7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyB9LCAzMDAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXZhaWxhYmxlQ29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICAvLyBVcGRhdGUgQWxsIFx1MjAxNCBzZXF1ZW50aWFsbHksIHNraXAgZmFpbHVyZXNcbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQWxsQ29udGFpbmVycygpIHtcbiAgICBjb25zdCB1cGRhdGVzID0gd2luZG93Ll9wZW5kaW5nVXBkYXRlcyB8fCBbXTtcbiAgICBpZiAoIXVwZGF0ZXMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtdXBkYXRlLWFsbC1idG4nKTtcbiAgICBpZiAoIWNvbmZpcm0oYFVwZGF0ZSBhbGwgJHt1cGRhdGVzLmxlbmd0aH0gY29udGFpbmVycz8gRWFjaCB3aWxsIHJlc3RhcnQuYCkpIHJldHVybjtcbiAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyM0YzIFVwZGF0aW5nLi4uJztcbiAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGxldCBzdWNjZXNzID0gMCwgZmFpbGVkID0gMDtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdXBkYXRlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3VwZGF0ZXMvdXBkYXRlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHUuY29udGFpbmVySWQpfWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGF1dG9Sb2xsYmFjazogdHJ1ZSB9KVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICBpZiAoZC5zdWNjZXNzKSBzdWNjZXNzKys7XG4gICAgICAgIGVsc2UgZmFpbGVkKys7XG4gICAgICB9IGNhdGNoIChfKSB7IGZhaWxlZCsrOyB9XG4gICAgfVxuICAgIGJ0bi50ZXh0Q29udGVudCA9IGBcdTI3MDUgRG9uZWA7XG4gICAgc2hvd05vdGlmaWNhdGlvbihgVXBkYXRlIGFsbDogJHtzdWNjZXNzfSBzdWNjZWVkZWQsICR7ZmFpbGVkfSBmYWlsZWQuYCwgc3VjY2VzcyA+IDAgJiYgZmFpbGVkID09PSAwID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyQjA2XHVGRTBGIFVwZGF0ZSBBbGwnO1xuICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBsb2FkQXZhaWxhYmxlKCk7XG4gICAgfSwgMzAwMCk7XG4gIH1cblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy11cGRhdGUtYWxsLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHVwZGF0ZUFsbENvbnRhaW5lcnMpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrRm9yVXBkYXRlcygpIHtcbiAgICBjaGVja0J0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMEQgQ2hlY2tpbmcuLi4nO1xuICAgIGNoZWNrQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdXBkYXRlcy9jaGVjaycsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvcik7XG4gICAgICBjaGVja0J0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgRG9uZSEnO1xuICAgICAgYXdhaXQgbG9hZEF2YWlsYWJsZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNoZWNrQnRuLnRleHRDb250ZW50ID0gJ1x1Mjc0QyBGYWlsZWQnO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ2hlY2sgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgY2hlY2tCdG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDBEIENoZWNrIGZvciBVcGRhdGVzJzsgY2hlY2tCdG4uZGlzYWJsZWQgPSBmYWxzZTsgfSwgMzAwMCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkSGlzdG9yeSgpIHtcbiAgICB0cnkge1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+JztcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3VwZGF0ZXMvaGlzdG9yeT9saW1pdD01MCcpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBjb25zdCBoaXN0b3J5ID0gZGF0YS5zdWNjZXNzICYmIGRhdGEuaGlzdG9yeSA/IGRhdGEuaGlzdG9yeSA6IFtdO1xuICAgICAgaWYgKGhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQjwvc3Bhbj5ObyB1cGRhdGUgaGlzdG9yeSB5ZXQuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPldoZW48L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5Db250YWluZXI8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5JbWFnZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkR1cmF0aW9uPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U3RhdHVzPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IGggb2YgaGlzdG9yeSkge1xuICAgICAgICBjb25zdCBvayA9IGguc3RhdHVzID09PSAnc3VjY2Vzcyc7XG4gICAgICAgIGNvbnN0IGR1ciA9IGguZHVyYXRpb24gPyAoaC5kdXJhdGlvbiA8IDEwMDAgPyBoLmR1cmF0aW9uICsgJ21zJyA6IE1hdGgucm91bmQoaC5kdXJhdGlvbiAvIDEwMDApICsgJ3MnKSA6ICctJztcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7dGltZUFnbyhoLnRpbWVzdGFtcCl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKGguY29udGFpbmVyTmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKGguaW1hZ2VOYW1lKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj4ke2R1cn08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiAke29rID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYmFkLWZnKSd9O1wiPiR7b2sgPyAnXHUyNzEzIHN1Y2Nlc3MnIDogJ1x1MjcxNyBmYWlsZWQnfTwvc3Bhbj48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgICAgaWYgKCFvayAmJiBoLmVycm9yKSB7XG4gICAgICAgICAgaHRtbCArPSBgPHRyPjx0ZCBjb2xzcGFuPVwiNVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDZweCA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+JHtlc2NhcGVIdG1sKGguZXJyb3IpfTwvdGQ+PC90cj5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEF1dG9Db25maWcoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF1dG9Db250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG5cbiAgICAgIC8vIEZldGNoIGNvbnRhaW5lcnMgYW5kIHNhdmVkIGF1dG8tdXBkYXRlIGNvbmZpZyBpbiBwYXJhbGxlbFxuICAgICAgY29uc3QgW2NvbnRhaW5lcnNSZXMsIGNvbmZpZ1Jlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGZldGNoKCcvYXBpL3YxL3N0YXRzL2NvbnRhaW5lcnMnKSxcbiAgICAgICAgZmV0Y2goJy9hcGkvdjEvdXBkYXRlcy9hdXRvLXVwZGF0ZScpXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcnNEYXRhID0gYXdhaXQgY29udGFpbmVyc1Jlcy5qc29uKCk7XG4gICAgICBjb25zdCBjb25maWdEYXRhID0gYXdhaXQgY29uZmlnUmVzLmpzb24oKTtcblxuICAgICAgY29uc3QgY29udGFpbmVycyA9IGNvbnRhaW5lcnNEYXRhLnN1Y2Nlc3MgJiYgY29udGFpbmVyc0RhdGEuc3RhdHMgPyBjb250YWluZXJzRGF0YS5zdGF0cyA6IFtdO1xuICAgICAgY29uc3Qgc2F2ZWRDb25maWcgPSBjb25maWdEYXRhLnN1Y2Nlc3MgJiYgY29uZmlnRGF0YS5jb25maWcgPyBjb25maWdEYXRhLmNvbmZpZyA6IHt9O1xuXG4gICAgICBpZiAoY29udGFpbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYXV0b0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNFXHVERDE2PC9zcGFuPk5vIHJ1bm5pbmcgY29udGFpbmVycyBmb3VuZC48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5BdXRvLXVwZGF0ZXMgcnVuIGR1cmluZyBtYWludGVuYW5jZSB3aW5kb3cgKGRlZmF1bHQgMkFNLTRBTSkuIERhaWx5ID0gZXZlcnkgZGF5LCBXZWVrbHkgPSBTdW5kYXlzLCBNb250aGx5ID0gMXN0IG9mIG1vbnRoLjwvZGl2Pic7XG4gICAgICBodG1sICs9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+Q29udGFpbmVyPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U2NoZWR1bGU8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5XaW5kb3c8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5Sb2xsYmFjazwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkxhc3QgUnVuPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPkFjdGlvbnM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgYyBvZiBjb250YWluZXJzKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBjLm5hbWUgfHwgYy5OYW1lcz8uWzBdPy5yZXBsYWNlKC9eXFwvLywgJycpIHx8IGMuSWQ/LnN1YnN0cmluZygwLCAxMik7XG4gICAgICAgIGNvbnN0IGNpZCA9IGMuY29udGFpbmVySWQgfHwgYy5JZDtcbiAgICAgICAgY29uc3Qgc2F2ZWQgPSBzYXZlZENvbmZpZ1tjaWRdIHx8IHt9O1xuICAgICAgICBjb25zdCBzY2hlZHVsZVZhbCA9IHNhdmVkLmVuYWJsZWQgPyAoc2F2ZWQuc2NoZWR1bGUgfHwgJ3dlZWtseScpIDogJyc7XG4gICAgICAgIGNvbnN0IHJvbGxiYWNrVmFsID0gc2F2ZWQuYXV0b1JvbGxiYWNrICE9PSBmYWxzZTtcbiAgICAgICAgY29uc3Qgd2luZG93VmFsID0gc2F2ZWQubWFpbnRlbmFuY2VXaW5kb3cgfHwgJyc7XG4gICAgICAgIGNvbnN0IGxhc3RSdW4gPSBzYXZlZC5sYXN0QXV0b1VwZGF0ZSA/IHRpbWVBZ28oc2F2ZWQubGFzdEF1dG9VcGRhdGUpIDogJ05ldmVyJztcblxuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIiBkYXRhLWNvbnRhaW5lci1pZD1cIiR7ZXNjYXBlSHRtbChjaWQpfVwiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwobmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+XG4gICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImF1dG8tc2NoZWR1bGVcIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKGNpZCl9XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiJHshc2NoZWR1bGVWYWwgPyAnIHNlbGVjdGVkJyA6ICcnfT5EaXNhYmxlZDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImRhaWx5XCIke3NjaGVkdWxlVmFsID09PSAnZGFpbHknID8gJyBzZWxlY3RlZCcgOiAnJ30+RGFpbHk8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ3ZWVrbHlcIiR7c2NoZWR1bGVWYWwgPT09ICd3ZWVrbHknID8gJyBzZWxlY3RlZCcgOiAnJ30+V2Vla2x5PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibW9udGhseVwiJHtzY2hlZHVsZVZhbCA9PT0gJ21vbnRobHknID8gJyBzZWxlY3RlZCcgOiAnJ30+TW9udGhseTwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPjxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYXV0by13aW5kb3dcIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKGNpZCl9XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwod2luZG93VmFsKX1cIiBwbGFjZWhvbGRlcj1cIjAyOjAwLTA0OjAwXCIgc3R5bGU9XCJ3aWR0aDogOTBweDsgcGFkZGluZzogM3B4IDZweDsgZm9udC1zaXplOiAwLjc4cmVtOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTtcIiAvPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImF1dG8tcm9sbGJhY2tcIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKGNpZCl9XCIke3JvbGxiYWNrVmFsID8gJyBjaGVja2VkJyA6ICcnfSAvPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtsYXN0UnVufTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj48YnV0dG9uIGNsYXNzPVwic2F2ZS1hdXRvLWJ0blwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwoY2lkKX1cIiBkYXRhLW5hbWU9XCIke2VzY2FwZUh0bWwobmFtZSl9XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtO1wiPlNhdmU8L2J1dHRvbj48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIGF1dG9Db250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgLy8gV2lyZSBzYXZlIGJ1dHRvbnNcbiAgICAgIGF1dG9Db250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnNhdmUtYXV0by1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGJ0bi5kYXRhc2V0LmlkO1xuICAgICAgICAgIGNvbnN0IHJvdyA9IGJ0bi5jbG9zZXN0KCd0cicpO1xuICAgICAgICAgIGNvbnN0IHNjaGVkdWxlID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5hdXRvLXNjaGVkdWxlJykudmFsdWU7XG4gICAgICAgICAgY29uc3Qgcm9sbGJhY2sgPSByb3cucXVlcnlTZWxlY3RvcignLmF1dG8tcm9sbGJhY2snKS5jaGVja2VkO1xuICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuYXV0by13aW5kb3cnKS52YWx1ZS50cmltKCk7XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1NhdmluZy4uLic7XG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgciA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3VwZGF0ZXMvYXV0by11cGRhdGUvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfWAsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVuYWJsZWQ6ICEhc2NoZWR1bGUsIHNjaGVkdWxlOiBzY2hlZHVsZSB8fCAnd2Vla2x5JywgYXV0b1JvbGxiYWNrOiByb2xsYmFjaywgbWFpbnRlbmFuY2VXaW5kb3c6IHdpbmRvdyB8fCB1bmRlZmluZWQgfSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICAgICAgaWYgKGQuc3VjY2Vzcykge1xuICAgICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzEzIFNhdmVkJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkLmVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzE3IEVycm9yJztcbiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1NhdmUgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ1NhdmUnOyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgfSwgMjAwMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXV0b0NvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gREFTSENBRERZIFNFTEYtVVBEQVRFID09PT09XG5cbiAgY29uc3QgZGNWZXJzaW9uSW5mbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktY3VycmVudC12ZXJzaW9uJyk7XG4gIGNvbnN0IGRjVXBkYXRlQmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LXVwZGF0ZS1iYWRnZScpO1xuICBjb25zdCBkY1VwZGF0ZURldGFpbHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LXVwZGF0ZS1kZXRhaWxzJyk7XG4gIGNvbnN0IGRjTmV3VmVyc2lvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktbmV3LXZlcnNpb24nKTtcbiAgY29uc3QgZGNDaGFuZ2Vsb2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LWNoYW5nZWxvZycpO1xuICBjb25zdCBkY0FwcGx5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1hcHBseS1idG4nKTtcbiAgY29uc3QgZGNDaGVja0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktY2hlY2stYnRuJyk7XG4gIGNvbnN0IGRjUm9sbGJhY2tCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LXJvbGxiYWNrLWJ0bicpO1xuICBjb25zdCBkY1N0YXR1c0JhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktc3RhdHVzLWJhcicpO1xuICBjb25zdCBkY0hpc3RvcnlDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LWhpc3RvcnktY29udGFpbmVyJyk7XG5cbiAgbGV0IGRjTGFzdENoZWNrID0gbnVsbDtcblxuICBmdW5jdGlvbiBkY1Nob3dTdGF0dXMobXNnLCB0eXBlKSB7XG4gICAgaWYgKCFkY1N0YXR1c0JhcikgcmV0dXJuO1xuICAgIGRjU3RhdHVzQmFyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGRjU3RhdHVzQmFyLnN0eWxlLmJhY2tncm91bmQgPSB0eXBlID09PSAnZXJyb3InID8gJ3ZhcigtLWJhZC1iZyknIDogdHlwZSA9PT0gJ3N1Y2Nlc3MnID8gJ3ZhcigtLW9rLWJnKScgOiAndmFyKC0tYmcpJztcbiAgICBkY1N0YXR1c0Jhci5zdHlsZS5jb2xvciA9IHR5cGUgPT09ICdlcnJvcicgPyAndmFyKC0tYmFkLWZnKScgOiB0eXBlID09PSAnc3VjY2VzcycgPyAndmFyKC0tb2stZmcpJyA6ICd2YXIoLS1mZyknO1xuICAgIGRjU3RhdHVzQmFyLnRleHRDb250ZW50ID0gbXNnO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGNMb2FkVmVyc2lvbigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc3lzdGVtL3ZlcnNpb24nKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjb25zdCBjb21taXQgPSBkYXRhLmNvbW1pdCAmJiBkYXRhLmNvbW1pdCAhPT0gJ3Vua25vd24nID8gZGF0YS5jb21taXQgOiBudWxsO1xuICAgICAgICBkY1ZlcnNpb25JbmZvLnRleHRDb250ZW50ID0gJ3YnICsgZGF0YS52ZXJzaW9uICsgKGNvbW1pdCA/ICcgKCcgKyBjb21taXQuc3Vic3RyaW5nKDAsIDcpICsgJyknIDogJycpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIGRjVmVyc2lvbkluZm8udGV4dENvbnRlbnQgPSAnVW5hYmxlIHRvIGZldGNoIHZlcnNpb24nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRjQ2hlY2tGb3JVcGRhdGUoc2lsZW50KSB7XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIGRjQ2hlY2tCdG4udGV4dENvbnRlbnQgPSAnQ2hlY2tpbmcuLi4nO1xuICAgICAgZGNDaGVja0J0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zeXN0ZW0vdXBkYXRlLWNoZWNrJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGRjTGFzdENoZWNrID0gZGF0YTtcblxuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLmF2YWlsYWJsZSAmJiBkYXRhLnJlbW90ZSkge1xuICAgICAgICBkY1VwZGF0ZUJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgZGNVcGRhdGVEZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgZGNOZXdWZXJzaW9uLnRleHRDb250ZW50ID0gJ3YnICsgZGF0YS5yZW1vdGUudmVyc2lvbjtcbiAgICAgICAgZGNDaGFuZ2Vsb2cudGV4dENvbnRlbnQgPSBkYXRhLnJlbW90ZS5jaGFuZ2Vsb2cgfHwgJ05vIGNoYW5nZWxvZyBhdmFpbGFibGUuJztcblxuICAgICAgICAvLyBBZGQgbm90aWZpY2F0aW9uIGRvdCB0byB0aGUgVXBkYXRlcyBidXR0b25cbiAgICAgICAgY29uc3QgdXBkYXRlc0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWJ0bicpO1xuICAgICAgICBpZiAodXBkYXRlc0J0biAmJiAhdXBkYXRlc0J0bi5xdWVyeVNlbGVjdG9yKCcudXBkYXRlLWRvdCcpKSB7XG4gICAgICAgICAgY29uc3QgZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIGRvdC5jbGFzc05hbWUgPSAndXBkYXRlLWRvdCc7XG4gICAgICAgICAgZG90LnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246YWJzb2x1dGU7dG9wOjJweDtyaWdodDoycHg7d2lkdGg6OHB4O2hlaWdodDo4cHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDp2YXIoLS1hY2NlbnQpOyc7XG4gICAgICAgICAgdXBkYXRlc0J0bi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgdXBkYXRlc0J0bi5hcHBlbmRDaGlsZChkb3QpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsc28gYWRkIGRvdCB0byB0aGUgRGFzaENhZGR5IHRhYlxuICAgICAgICBjb25zdCBkY1RhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWRhc2hjYWRkeS10YWInKTtcbiAgICAgICAgaWYgKGRjVGFiICYmICFkY1RhYi5xdWVyeVNlbGVjdG9yKCcudXBkYXRlLWRvdCcpKSB7XG4gICAgICAgICAgY29uc3QgZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIGRvdC5jbGFzc05hbWUgPSAndXBkYXRlLWRvdCc7XG4gICAgICAgICAgZG90LnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6NnB4O2hlaWdodDo2cHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDp2YXIoLS1hY2NlbnQpO21hcmdpbi1sZWZ0OjRweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7JztcbiAgICAgICAgICBkY1RhYi5hcHBlbmRDaGlsZChkb3QpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkY1VwZGF0ZUJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRjVXBkYXRlRGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBhd2FpdCBkY0xvYWRWZXJzaW9uKCk7XG4gICAgICAgIGlmICghc2lsZW50KSBkY1Nob3dTdGF0dXMoJ1lvdSBhcmUgcnVubmluZyB0aGUgbGF0ZXN0IHZlcnNpb24uJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgZGNDaGVja0J0bi50ZXh0Q29udGVudCA9ICdDaGVjayBmb3IgVXBkYXRlcyc7XG4gICAgICAgIGRjQ2hlY2tCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICBkY1Nob3dTdGF0dXMoJ0ZhaWxlZCB0byBjaGVjazogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgIGRjQ2hlY2tCdG4udGV4dENvbnRlbnQgPSAnQ2hlY2sgZm9yIFVwZGF0ZXMnO1xuICAgICAgICBkY0NoZWNrQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGNBcHBseVVwZGF0ZSgpIHtcbiAgICBpZiAoIWNvbmZpcm0oJ0FwcGx5IERhc2hDYWRkeSB1cGRhdGU/IFRoZSBBUEkgY29udGFpbmVyIHdpbGwgcmVzdGFydC4nKSkgcmV0dXJuIGZhbHNlO1xuICAgIGRjQXBwbHlCdG4udGV4dENvbnRlbnQgPSAnVXBkYXRpbmcuLi4nO1xuICAgIGRjQXBwbHlCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGRjU2hvd1N0YXR1cygnRG93bmxvYWRpbmcgYW5kIGFwcGx5aW5nIHVwZGF0ZS4uLicsICdpbmZvJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3N5c3RlbS91cGRhdGUtYXBwbHknLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGRjU2hvd1N0YXR1cygnVXBkYXRlIGluaXRpYXRlZDogdicgKyAoZGF0YS5mcm9tVmVyc2lvbiB8fCAnPycpICsgJyBcdTIxOTIgdicgKyAoZGF0YS50b1ZlcnNpb24gfHwgJz8nKSArICcuIFRoZSBjb250YWluZXIgd2lsbCByZXN0YXJ0IHNob3J0bHkuJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgZGNBcHBseUJ0bi50ZXh0Q29udGVudCA9ICdBcHBsaWVkISc7XG4gICAgICAgIC8vIFJlbW92ZSBub3RpZmljYXRpb24gZG90c1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXBkYXRlLWRvdCcpLmZvckVhY2goZCA9PiBkLnJlbW92ZSgpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvciB8fCAnVXBkYXRlIGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRjU2hvd1N0YXR1cygnVXBkYXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICBkY0FwcGx5QnRuLnRleHRDb250ZW50ID0gJ1VwZGF0ZSBOb3cnO1xuICAgICAgZGNBcHBseUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkY0xvYWRIaXN0b3J5KCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zeXN0ZW0vdXBkYXRlLWhpc3RvcnknKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgY29uc3QgaGlzdG9yeSA9IGRhdGEuc3VjY2VzcyAmJiBkYXRhLmhpc3RvcnkgPyBkYXRhLmhpc3RvcnkgOiBbXTtcbiAgICAgIGlmIChoaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkY0hpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENFNjwvc3Bhbj5ObyBzZWxmLXVwZGF0ZSBoaXN0b3J5LjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODJyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5XaGVuPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+VmVyc2lvbjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkZyb208L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TdGF0dXM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgaCBvZiBoaXN0b3J5KSB7XG4gICAgICAgIGNvbnN0IHN0ID0gaC5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICdcdTI3MTMgc3VjY2VzcycgOiBoLnN0YXR1cyA9PT0gJ3BlbmRpbmcnID8gJ1x1MjNGMyBwZW5kaW5nJyA6IGguc3RhdHVzID09PSAncGFydGlhbCcgPyAnXHUyNkEwIHBhcnRpYWwnIDogJ1x1MjcxNyAnICsgaC5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHN0Q29sb3IgPSBoLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnID8gJ3ZhcigtLW9rLWZnKScgOiBoLnN0YXR1cyA9PT0gJ3BlbmRpbmcnID8gJ3ZhcigtLW11dGVkKScgOiAndmFyKC0tYmFkLWZnKSc7XG4gICAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPic7XG4gICAgICAgIGh0bWwgKz0gJzx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgdGltZUFnbyhoLnRpbWVzdGFtcCkgKyAnPC90ZD4nO1xuICAgICAgICBodG1sICs9ICc8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+dicgKyBlc2NhcGVIdG1sKGgudmVyc2lvbikgKyAoaC5yb2xsYmFjayA/ICcgKHJvbGxiYWNrKScgOiAnJykgKyAnPC90ZD4nO1xuICAgICAgICBodG1sICs9ICc8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+dicgKyBlc2NhcGVIdG1sKGguZnJvbVZlcnNpb24gfHwgJz8nKSArICc8L3RkPic7XG4gICAgICAgIGh0bWwgKz0gJzx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiAnICsgc3RDb2xvciArICc7XCI+JyArIHN0ICsgJzwvc3Bhbj48L3RkPic7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgICAgaWYgKGguZXJyb3IpIHtcbiAgICAgICAgICBodG1sICs9ICc8dHI+PHRkIGNvbHNwYW49XCI0XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggNnB4IDhweDsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj4nICsgZXNjYXBlSHRtbChoLmVycm9yKSArICc8L3RkPjwvdHI+JztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaC5ub3RlKSB7XG4gICAgICAgICAgaHRtbCArPSAnPHRyPjx0ZCBjb2xzcGFuPVwiNFwiIHN0eWxlPVwicGFkZGluZzogNHB4IDZweCA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgZXNjYXBlSHRtbChoLm5vdGUpICsgJzwvdGQ+PC90cj4nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBkY0hpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkY0hpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJzwvZGl2Pic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGNTaG93Um9sbGJhY2soKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3N5c3RlbS9yb2xsYmFjay12ZXJzaW9ucycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBjb25zdCB2ZXJzaW9ucyA9IGRhdGEuc3VjY2VzcyAmJiBkYXRhLnZlcnNpb25zID8gZGF0YS52ZXJzaW9ucyA6IFtdO1xuICAgICAgaWYgKHZlcnNpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdObyByb2xsYmFjayB2ZXJzaW9ucyBhdmFpbGFibGUuJywgJ2luZm8nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdmVyc2lvbiA9IHByb21wdCgnQXZhaWxhYmxlIHJvbGxiYWNrIHZlcnNpb25zOlxcbicgKyB2ZXJzaW9ucy5qb2luKCdcXG4nKSArICdcXG5cXG5FbnRlciB2ZXJzaW9uIHRvIHJvbGxiYWNrIHRvOicpO1xuICAgICAgaWYgKCF2ZXJzaW9uKSByZXR1cm47XG4gICAgICBpZiAoIXZlcnNpb25zLmluY2x1ZGVzKHZlcnNpb24pKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ludmFsaWQgdmVyc2lvbjogJyArIHZlcnNpb24sICdlcnJvcicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWNvbmZpcm0oJ1JvbGxiYWNrIERhc2hDYWRkeSB0byB2JyArIHZlcnNpb24gKyAnPyBUaGUgY29udGFpbmVyIHdpbGwgcmVzdGFydC4nKSkgcmV0dXJuO1xuICAgICAgZGNTaG93U3RhdHVzKCdSb2xsaW5nIGJhY2sgdG8gdicgKyB2ZXJzaW9uICsgJy4uLicsICdpbmZvJyk7XG4gICAgICBjb25zdCByID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc3lzdGVtL3JvbGxiYWNrJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdmVyc2lvbiB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICBpZiAoZC5zdWNjZXNzKSB7XG4gICAgICAgIGRjU2hvd1N0YXR1cygnUm9sbGJhY2sgdG8gdicgKyB2ZXJzaW9uICsgJyBpbml0aWF0ZWQuIENvbnRhaW5lciB3aWxsIHJlc3RhcnQuJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihkLmVycm9yIHx8ICdSb2xsYmFjayBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkY1Nob3dTdGF0dXMoJ1JvbGxiYWNrIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgZGNDaGVja0J0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBkY0NoZWNrRm9yVXBkYXRlKGZhbHNlKSk7XG4gIGRjQXBwbHlCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZGNBcHBseVVwZGF0ZSgpLmNhdGNoKCgpID0+IHt9KSk7XG4gIGRjUm9sbGJhY2tCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZGNTaG93Um9sbGJhY2spO1xuXG4gIGNoZWNrQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoZWNrRm9yVXBkYXRlcyk7XG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZEF2YWlsYWJsZSgpO1xuICB9KTtcbiAgd2lyZU1vZGFsKG1vZGFsLCBjYW5jZWxCdG4pO1xuXG4gIC8vIE9wZW4gVXBkYXRlIE1hbmFnZW1lbnQgbW9kYWwsIG9wdGlvbmFsbHkgc2Nyb2xsZWQgdG8gYSBzcGVjaWZpYyBhcHBcbiAgd2luZG93Lm9wZW5VcGRhdGVNb2RhbCA9IGZ1bmN0aW9uKGFwcElkKSB7XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkQXZhaWxhYmxlKCkudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIWFwcElkKSByZXR1cm47XG4gICAgICAvLyBTY3JvbGwgdG8gYW5kIGhpZ2hsaWdodCB0aGUgbWF0Y2hpbmcgcm93XG4gICAgICBjb25zdCByb3cgPSBhdmFpbGFibGVDb250YWluZXIucXVlcnlTZWxlY3RvcihgW2RhdGEtYXBwLWlkPVwiJHthcHBJZH1cIl1gKTtcbiAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgcm93LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7XG4gICAgICAgIHJvdy5zdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoMjQ5LDExNSwyMiwwLjE1KSc7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyByb3cuc3R5bGUuYmFja2dyb3VuZCA9ICcnOyB9LCAzMDAwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvLyBMYXp5LWxvYWQgdGFic1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cInVwZGF0ZXMtaGlzdG9yeVwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRIaXN0b3J5KTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJ1cGRhdGVzLWF1dG9cIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkQXV0b0NvbmZpZyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwidXBkYXRlcy1kYXNoY2FkZHlcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZGNMb2FkVmVyc2lvbigpO1xuICAgIGRjTG9hZEhpc3RvcnkoKTtcbiAgICBpZiAoIWRjTGFzdENoZWNrKSBkY0NoZWNrRm9yVXBkYXRlKHRydWUpO1xuICB9KTtcblxuICB3aW5kb3cuZGNBcHBseVVwZGF0ZSA9IGRjQXBwbHlVcGRhdGU7XG4gIHdpbmRvdy5kY0NoZWNrRm9yVXBkYXRlID0gZGNDaGVja0ZvclVwZGF0ZTtcblxuICAvLyBOb24tYmxvY2tpbmcgY2hlY2sgb24gcGFnZSBsb2FkIFx1MjAxNCBqdXN0IGFkZHMgbm90aWZpY2F0aW9uIGRvdCBpZiB1cGRhdGUgYXZhaWxhYmxlXG4gIHNldFRpbWVvdXQoKCkgPT4gZGNDaGVja0ZvclVwZGF0ZSh0cnVlKSwgNTAwMCk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBET0NLRVIgUkVTT1VSQ0VTIChWb2x1bWVzLCBOZXR3b3JrcywgRGlzayBVc2FnZSkgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICBpbmplY3RNb2RhbCgnZG9ja2VyLXJlc291cmNlcy1tb2RhbCcsIGA8ZGl2IGlkPVwiZG9ja2VyLXJlc291cmNlcy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNzUwcHg7IG1heC13aWR0aDogOTUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQzMzIERvY2tlciBSZXNvdXJjZXM8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPk1hbmFnZSB2b2x1bWVzLCBuZXR3b3JrcywgYW5kIHZpZXcgZGlzayB1c2FnZS48L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC10YWJzXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWIgYWN0aXZlXCIgZGF0YS1wYW5lbD1cImRyLXZvbHVtZXNcIj5Wb2x1bWVzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiZHItbmV0d29ya3NcIj5OZXR3b3JrczwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImRyLWRpc2tcIj5EaXNrIFVzYWdlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBWb2x1bWVzIC0tPlxuICAgICAgPGRpdiBpZD1cImRyLXZvbHVtZXNcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRyLXZvbC1uYW1lXCIgcGxhY2Vob2xkZXI9XCJWb2x1bWUgbmFtZVwiIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogNnB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiIC8+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImRyLXZvbC1jcmVhdGVcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODJyZW07XCI+Q3JlYXRlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZHItdm9sLWxpc3RcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDQwMHB4O1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE5ldHdvcmtzIC0tPlxuICAgICAgPGRpdiBpZD1cImRyLW5ldHdvcmtzXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRyLW5ldC1uYW1lXCIgcGxhY2Vob2xkZXI9XCJOZXR3b3JrIG5hbWVcIiBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTtcIiAvPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJkci1uZXQtZHJpdmVyXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7XCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYnJpZGdlXCI+YnJpZGdlPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwib3ZlcmxheVwiPm92ZXJsYXk8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJob3N0XCI+aG9zdDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJkci1uZXQtY3JlYXRlXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjgycmVtO1wiPkNyZWF0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRyLW5ldC1saXN0XCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0MDBweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBEaXNrIFVzYWdlIC0tPlxuICAgICAgPGRpdiBpZD1cImRyLWRpc2tcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cImRyLWRpc2stY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRyLWNsb3NlXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2NrZXItcmVzb3VyY2VzLW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9ja2VyLXJlc291cmNlcy1idG4nKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItY2xvc2UnKTtcblxuICBmdW5jdGlvbiBmbXRCeXRlcyhieXRlcykge1xuICAgIGlmICghYnl0ZXMgfHwgYnl0ZXMgPT09IDApIHJldHVybiAnMCBCJztcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQiddO1xuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKE1hdGguYWJzKGJ5dGVzKSkgLyBNYXRoLmxvZygxMDI0KSk7XG4gICAgcmV0dXJuIChieXRlcyAvIE1hdGgucG93KDEwMjQsIGkpKS50b0ZpeGVkKDEpICsgJyAnICsgdW5pdHNbaV07XG4gIH1cblxuICAvLyA9PT09PSBWT0xVTUVTID09PT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRWb2x1bWVzKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci12b2wtbGlzdCcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0SlNPTignL2FwaS92MS9kb2NrZXIvdm9sdW1lcycpO1xuICAgICAgY29uc3Qgdm9scyA9IGRhdGEudm9sdW1lcyB8fCBbXTtcbiAgICAgIGlmICh2b2xzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENFNjwvc3Bhbj5ObyB2b2x1bWVzIGZvdW5kLjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODJyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5OYW1lPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+RHJpdmVyPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+U2NvcGU8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+QWN0aW9uczwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCB2IG9mIHZvbHMpIHtcbiAgICAgICAgY29uc3QgaXNTeXN0ZW0gPSB2Lm5hbWUgPT09ICdidWlsZGtpdCcgfHwgdi5uYW1lLmxlbmd0aCA9PT0gNjQ7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgZm9udC13ZWlnaHQ6IDUwMDsgbWF4LXdpZHRoOiAzMDBweDsgb3ZlcmZsb3c6IGhpZGRlbjsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IHdoaXRlLXNwYWNlOiBub3dyYXA7XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwodi5uYW1lKX1cIj4ke2VzY2FwZUh0bWwodi5uYW1lLmxlbmd0aCA+IDQwID8gdi5uYW1lLnN1YnN0cmluZygwLCAzNykgKyAnLi4uJyA6IHYubmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2VzY2FwZUh0bWwodi5kcml2ZXIpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKHYuc2NvcGUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5gO1xuICAgICAgICBpZiAoIWlzU3lzdGVtKSB7XG4gICAgICAgICAgaHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cImRyLXZvbC1kZWxcIiBkYXRhLW5hbWU9XCIke2VzY2FwZUh0bWwodi5uYW1lKX1cIiBzdHlsZT1cInBhZGRpbmc6IDNweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGVsZXRlPC9idXR0b24+YDtcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9IGA8L3RkPjwvdHI+YDtcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmRyLXZvbC1kZWwnKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbmZpcm0oYERlbGV0ZSB2b2x1bWUgXCIke2J0bi5kYXRhc2V0Lm5hbWV9XCI/IERhdGEgd2lsbCBiZSBsb3N0LmApKSByZXR1cm47XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJy4uLic7XG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZGVsZXRlQVBJKGAvYXBpL3YxL2RvY2tlci92b2x1bWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGJ0bi5kYXRhc2V0Lm5hbWUpfT9mb3JjZT10cnVlYCk7XG4gICAgICAgICAgICBsb2FkVm9sdW1lcygpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0RlbGV0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ0RlbGV0ZSc7XG4gICAgICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItdm9sLWNyZWF0ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBuYW1lSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItdm9sLW5hbWUnKTtcbiAgICBjb25zdCBuYW1lID0gbmFtZUlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUpIHsgc2hvd05vdGlmaWNhdGlvbignRW50ZXIgYSB2b2x1bWUgbmFtZScsICd3YXJuaW5nJyk7IHJldHVybjsgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwb3N0SlNPTignL2FwaS92MS9kb2NrZXIvdm9sdW1lcycsIHsgbmFtZSB9KTtcbiAgICAgIG5hbWVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgVm9sdW1lIFwiJHtuYW1lfVwiIGNyZWF0ZWRgLCAnc3VjY2VzcycpO1xuICAgICAgbG9hZFZvbHVtZXMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdDcmVhdGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PT09IE5FVFdPUktTID09PT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWROZXR3b3JrcygpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItbmV0LWxpc3QnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldEpTT04oJy9hcGkvdjEvZG9ja2VyL25ldHdvcmtzJyk7XG4gICAgICBjb25zdCBuZXRzID0gZGF0YS5uZXR3b3JrcyB8fCBbXTtcbiAgICAgIGlmIChuZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzQ1x1REYxMDwvc3Bhbj5ObyBuZXR3b3JrcyBmb3VuZC48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+TmFtZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPkRyaXZlcjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPlNjb3BlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+Q29udGFpbmVyczwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5BY3Rpb25zPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IG4gb2YgbmV0cykge1xuICAgICAgICBjb25zdCBpc1N5c3RlbSA9IFsnYnJpZGdlJywgJ2hvc3QnLCAnbm9uZSddLmluY2x1ZGVzKG4ubmFtZSk7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwobi5uYW1lKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbChuLmRyaXZlcil9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2VzY2FwZUh0bWwobi5zY29wZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4ke24uY29udGFpbmVyc308L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+YDtcbiAgICAgICAgaWYgKCFpc1N5c3RlbSkge1xuICAgICAgICAgIGh0bWwgKz0gYDxidXR0b24gY2xhc3M9XCJkci1uZXQtZGVsXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChuLmlkKX1cIiBkYXRhLW5hbWU9XCIke2VzY2FwZUh0bWwobi5uYW1lKX1cIiBzdHlsZT1cInBhZGRpbmc6IDNweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGVsZXRlPC9idXR0b24+YDtcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9IGA8L3RkPjwvdHI+YDtcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmRyLW5ldC1kZWwnKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbmZpcm0oYERlbGV0ZSBuZXR3b3JrIFwiJHtidG4uZGF0YXNldC5uYW1lfVwiP2ApKSByZXR1cm47XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJy4uLic7XG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZGVsZXRlQVBJKGAvYXBpL3YxL2RvY2tlci9uZXR3b3Jrcy8ke2VuY29kZVVSSUNvbXBvbmVudChidG4uZGF0YXNldC5pZCl9YCk7XG4gICAgICAgICAgICBsb2FkTmV0d29ya3MoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdEZWxldGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdEZWxldGUnO1xuICAgICAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLW5ldC1jcmVhdGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmFtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLW5ldC1uYW1lJyk7XG4gICAgY29uc3QgZHJpdmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLW5ldC1kcml2ZXInKTtcbiAgICBjb25zdCBuYW1lID0gbmFtZUlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUpIHsgc2hvd05vdGlmaWNhdGlvbignRW50ZXIgYSBuZXR3b3JrIG5hbWUnLCAnd2FybmluZycpOyByZXR1cm47IH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcG9zdEpTT04oJy9hcGkvdjEvZG9ja2VyL25ldHdvcmtzJywgeyBuYW1lLCBkcml2ZXI6IGRyaXZlclNlbGVjdC52YWx1ZSB9KTtcbiAgICAgIG5hbWVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgTmV0d29yayBcIiR7bmFtZX1cIiBjcmVhdGVkYCwgJ3N1Y2Nlc3MnKTtcbiAgICAgIGxvYWROZXR3b3JrcygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0NyZWF0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gPT09PT0gRElTSyBVU0FHRSA9PT09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkRGlza1VzYWdlKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci1kaXNrLWNvbnRlbnQnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldEpTT04oJy9hcGkvdjEvZG9ja2VyL2Rpc2stdXNhZ2UnKTtcbiAgICAgIGNvbnN0IHNlY3Rpb25zID0gW1xuICAgICAgICB7IGxhYmVsOiAnSW1hZ2VzJywgaWNvbjogJ1x1RDgzRFx1RENDMCcsIGNvdW50OiBkYXRhLmltYWdlcy5jb3VudCwgc2l6ZTogZGF0YS5pbWFnZXMuc2l6ZSwgcmVjbGFpbWFibGU6IGRhdGEuaW1hZ2VzLnJlY2xhaW1hYmxlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb250YWluZXJzJywgaWNvbjogJ1x1RDgzRFx1RENFNicsIGNvdW50OiBkYXRhLmNvbnRhaW5lcnMuY291bnQsIHNpemU6IGRhdGEuY29udGFpbmVycy5zaXplLCBleHRyYTogYCR7ZGF0YS5jb250YWluZXJzLnJ1bm5pbmd9IHJ1bm5pbmdgIH0sXG4gICAgICAgIHsgbGFiZWw6ICdWb2x1bWVzJywgaWNvbjogJ1x1RDgzRFx1RENCRScsIGNvdW50OiBkYXRhLnZvbHVtZXMuY291bnQsIHNpemU6IGRhdGEudm9sdW1lcy5zaXplLCByZWNsYWltYWJsZTogZGF0YS52b2x1bWVzLnJlY2xhaW1hYmxlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdCdWlsZCBDYWNoZScsIGljb246ICdcdUQ4M0RcdUREMjcnLCBjb3VudDogZGF0YS5idWlsZENhY2hlLmNvdW50LCBzaXplOiBkYXRhLmJ1aWxkQ2FjaGUuc2l6ZSwgcmVjbGFpbWFibGU6IGRhdGEuYnVpbGRDYWNoZS5yZWNsYWltYWJsZSB9LFxuICAgICAgXTtcblxuICAgICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtOyBmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlRvdGFsOiAke2ZtdEJ5dGVzKGRhdGEudG90YWxTaXplKX08L2Rpdj5gO1xuICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiAxMnB4O1wiPic7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc2VjdGlvbnMpIHtcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE0cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+JHtzLmljb259ICR7cy5sYWJlbH0gPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXdlaWdodDogNDAwOyBmb250LXNpemU6IDAuODJyZW07XCI+KCR7cy5jb3VudH0pPC9zcGFuPjwvZGl2PmA7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+JHtmbXRCeXRlcyhzLnNpemUpfTwvZGl2PmA7XG4gICAgICAgIGlmIChzLnJlY2xhaW1hYmxlID4gMCkgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5SZWNsYWltYWJsZTogJHtmbXRCeXRlcyhzLnJlY2xhaW1hYmxlKX08L2Rpdj5gO1xuICAgICAgICBpZiAocy5leHRyYSkgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke3MuZXh0cmF9PC9kaXY+YDtcbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1vZGFsIGV2ZW50c1xuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRWb2x1bWVzKCk7XG4gIH0pO1xuICB3aXJlTW9kYWwobW9kYWwsIGNsb3NlQnRuKTtcblxuICAvLyBMYXp5LWxvYWQgdGFic1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cImRyLW5ldHdvcmtzXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZE5ldHdvcmtzKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJkci1kaXNrXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZERpc2tVc2FnZSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBET0NLRVIgQ09NUE9TRSBJTVBPUlQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICBpbmplY3RNb2RhbCgnY29tcG9zZS1pbXBvcnQtbW9kYWwnLCBgPGRpdiBpZD1cImNvbXBvc2UtaW1wb3J0LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA2NTBweDsgbWF4LXdpZHRoOiA4MDBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDRTYgSW1wb3J0IERvY2tlciBDb21wb3NlPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5QYXN0ZSBhIGRvY2tlci1jb21wb3NlLnltbCB0byBpbXBvcnQgYW5kIGRlcGxveSBzZXJ2aWNlcy48L3A+XG5cbiAgICAgIDwhLS0gU3RlcCAxOiBQYXN0ZSBZQU1MIC0tPlxuICAgICAgPGRpdiBpZD1cImNvbXBvc2Utc3RlcC1wYXN0ZVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlN0YWNrIE5hbWU8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY29tcG9zZS1zdGFjay1uYW1lXCIgcGxhY2Vob2xkZXI9XCJteS1zdGFja1wiIHZhbHVlPVwiXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPmRvY2tlci1jb21wb3NlLnltbDwvbGFiZWw+XG4gICAgICAgICAgPHRleHRhcmVhIGlkPVwiY29tcG9zZS15YW1sXCIgcm93cz1cIjE0XCIgcGxhY2Vob2xkZXI9XCJ2ZXJzaW9uOiAnMycmIzEwO3NlcnZpY2VzOiYjMTA7ICB3ZWI6JiMxMDsgICAgaW1hZ2U6IG5naW54OmxhdGVzdCYjMTA7ICAgIHBvcnRzOiYjMTA7ICAgICAgLSAnODA4MDo4MCdcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuODJyZW07IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyByZXNpemU6IHZlcnRpY2FsO1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDZweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuODJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiY29tcG9zZS1maWxlLXVwbG9hZFwiIGFjY2VwdD1cIi55bWwsLnlhbWxcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcIj5vciB1cGxvYWQgYSBmaWxlPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjb21wb3NlLXBhcnNlLWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogOHB4IDIwcHg7XCI+UGFyc2UgJiBQcmV2aWV3PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbXBvc2UtY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RlcCAyOiBQcmV2aWV3IC0tPlxuICAgICAgPGRpdiBpZD1cImNvbXBvc2Utc3RlcC1wcmV2aWV3XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8ZGl2IGlkPVwiY29tcG9zZS1wcmV2aWV3LWNvbnRlbnRcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjb21wb3NlLWRlcGxveS1idG5cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDhweCAyMHB4O1wiPkRlcGxveSBBbGw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY29tcG9zZS1iYWNrLWJ0blwiPkJhY2s8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwIDM6IFByb2dyZXNzIC0tPlxuICAgICAgPGRpdiBpZD1cImNvbXBvc2Utc3RlcC1wcm9ncmVzc1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cImNvbXBvc2UtcHJvZ3Jlc3MtY29udGVudFwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtaW1wb3J0LW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1pbXBvcnQtYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWNhbmNlbCcpO1xuXG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcblxuICBsZXQgcGFyc2VkRGF0YSA9IG51bGw7XG5cbiAgZnVuY3Rpb24gc2hvd1N0ZXAoc3RlcCkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXN0ZXAtcGFzdGUnKS5zdHlsZS5kaXNwbGF5ID0gc3RlcCA9PT0gJ3Bhc3RlJyA/ICcnIDogJ25vbmUnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXN0ZXAtcHJldmlldycpLnN0eWxlLmRpc3BsYXkgPSBzdGVwID09PSAncHJldmlldycgPyAnJyA6ICdub25lJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGVwLXByb2dyZXNzJykuc3R5bGUuZGlzcGxheSA9IHN0ZXAgPT09ICdwcm9ncmVzcycgPyAnJyA6ICdub25lJztcbiAgfVxuXG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHNob3dTdGVwKCdwYXN0ZScpO1xuICAgIHBhcnNlZERhdGEgPSBudWxsO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXlhbWwnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXN0YWNrLW5hbWUnKS52YWx1ZSA9ICcnO1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH0pO1xuXG4gIC8vIEZpbGUgdXBsb2FkXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWZpbGUtdXBsb2FkJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgY29uc3QgZmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGlmICghZmlsZSkgcmV0dXJuO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UteWFtbCcpLnZhbHVlID0gcmVhZGVyLnJlc3VsdDsgfTtcbiAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbiAgfSk7XG5cbiAgLy8gUGFyc2VcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtcGFyc2UtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhbWxTdHIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS15YW1sJykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXN0YWNrLW5hbWUnKS52YWx1ZS50cmltKCkgfHwgJ3N0YWNrJztcbiAgICBpZiAoIXlhbWxTdHIpIHsgc2hvd05vdGlmaWNhdGlvbignUGFzdGUgYSBkb2NrZXItY29tcG9zZS55bWwnLCAnd2FybmluZycpOyByZXR1cm47IH1cblxuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXBhcnNlLWJ0bicpO1xuICAgIGNvbnN0IG9yaWdUZXh0ID0gYnRuLnRleHRDb250ZW50O1xuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdQYXJzaW5nLi4uJztcbiAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBwb3N0SlNPTignL2FwaS92MS9hcHBzL2ltcG9ydC1jb21wb3NlJywgeyB5YW1sOiB5YW1sU3RyLCBzdGFja05hbWUgfSk7XG4gICAgICBwYXJzZWREYXRhID0gZGF0YTtcbiAgICAgIHBhcnNlZERhdGEuc3RhY2tOYW1lID0gc3RhY2tOYW1lO1xuICAgICAgcmVuZGVyUHJldmlldyhkYXRhKTtcbiAgICAgIHNob3dTdGVwKCdwcmV2aWV3Jyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGFyc2UgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gb3JpZ1RleHQ7XG4gICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHJlbmRlclByZXZpZXcoZGF0YSkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXByZXZpZXctY29udGVudCcpO1xuICAgIGxldCBodG1sID0gJyc7XG5cbiAgICBpZiAoZGF0YS5uZXR3b3JrcyAmJiBkYXRhLm5ldHdvcmtzLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4OyBmb250LXNpemU6IDAuODJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TmV0d29ya3M6ICR7ZGF0YS5uZXR3b3Jrcy5tYXAobiA9PiBgPGNvZGU+JHtlc2NhcGVIdG1sKG4pfTwvY29kZT5gKS5qb2luKCcsICcpfTwvZGl2PmA7XG4gICAgfVxuICAgIGlmIChkYXRhLnZvbHVtZXMgJiYgZGF0YS52b2x1bWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4OyBmb250LXNpemU6IDAuODJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Vm9sdW1lczogJHtkYXRhLnZvbHVtZXMubWFwKHYgPT4gYDxjb2RlPiR7ZXNjYXBlSHRtbCh2KX08L2NvZGU+YCkuam9pbignLCAnKX08L2Rpdj5gO1xuICAgIH1cblxuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+JHtkYXRhLnNlcnZpY2VzLmxlbmd0aH0gc2VydmljZShzKTwvZGl2PmA7XG4gICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDM1MHB4O1wiPic7XG5cbiAgICBmb3IgKGNvbnN0IHN2YyBvZiBkYXRhLnNlcnZpY2VzKSB7XG4gICAgICBjb25zdCBib3JkZXJDb2xvciA9IHN2Yy5za2lwID8gJ3ZhcigtLWJhZC1mZyknIDogJ3ZhcigtLWJvcmRlciknO1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTRweDsgYm9yZGVyOiAxcHggc29saWQgJHtib3JkZXJDb2xvcn07IGJvcmRlci1yYWRpdXM6IDhweDsgbWFyZ2luLWJvdHRvbTogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7XCI+YDtcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOXJlbTtcIj4ke2VzY2FwZUh0bWwoc3ZjLm5hbWUpfWA7XG4gICAgICBpZiAoc3ZjLnNraXApIGh0bWwgKz0gYCA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpOyBmb250LXdlaWdodDogNDAwOyBmb250LXNpemU6IDAuNzhyZW07XCI+XHUyMDE0IHNraXBwZWQ6ICR7ZXNjYXBlSHRtbChzdmMucmVhc29uKX08L3NwYW4+YDtcbiAgICAgIGh0bWwgKz0gYDwvZGl2PmA7XG5cbiAgICAgIGlmICghc3ZjLnNraXApIHtcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+SW1hZ2U6IDxjb2RlPiR7ZXNjYXBlSHRtbChzdmMuaW1hZ2UpfTwvY29kZT48L2Rpdj5gO1xuICAgICAgICBpZiAoc3ZjLnBvcnRzPy5sZW5ndGgpIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Qb3J0czogJHtzdmMucG9ydHMubWFwKHAgPT4gYCR7cC5ob3N0fToke3AuY29udGFpbmVyfWApLmpvaW4oJywgJyl9PC9kaXY+YDtcbiAgICAgICAgaWYgKHN2Yy52b2x1bWVzPy5sZW5ndGgpIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Wb2x1bWVzOiAke3N2Yy52b2x1bWVzLmxlbmd0aH08L2Rpdj5gO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc3ZjLmVudmlyb25tZW50IHx8IHt9KS5sZW5ndGgpIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5FbnYgdmFyczogJHtPYmplY3Qua2V5cyhzdmMuZW52aXJvbm1lbnQpLmxlbmd0aH08L2Rpdj5gO1xuICAgICAgICBpZiAoc3ZjLmVudkZpbGVXYXJuaW5nKSBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cdTI2QTAgJHtlc2NhcGVIdG1sKHN2Yy5lbnZGaWxlV2FybmluZyl9PC9kaXY+YDtcbiAgICAgICAgaWYgKHN2Yy5yZXNvdXJjZXM/LmNwdXMgfHwgc3ZjLnJlc291cmNlcz8ubWVtb3J5KSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICAgICAgICBpZiAoc3ZjLnJlc291cmNlcy5jcHVzKSBwYXJ0cy5wdXNoKGBDUFU6ICR7c3ZjLnJlc291cmNlcy5jcHVzfWApO1xuICAgICAgICAgIGlmIChzdmMucmVzb3VyY2VzLm1lbW9yeSkgcGFydHMucHVzaChgTWVtOiAke3N2Yy5yZXNvdXJjZXMubWVtb3J5fU1CYCk7XG4gICAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkxpbWl0czogJHtwYXJ0cy5qb2luKCcsICcpfTwvZGl2PmA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICB9XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgfVxuXG4gIC8vIEJhY2sgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWJhY2stYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2hvd1N0ZXAoJ3Bhc3RlJykpO1xuXG4gIC8vIERlcGxveVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1kZXBsb3ktYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcGFyc2VkRGF0YSkgcmV0dXJuO1xuXG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtZGVwbG95LWJ0bicpO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdEZXBsb3lpbmcuLi4nO1xuICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgc2hvd1N0ZXAoJ3Byb2dyZXNzJyk7XG5cbiAgICBjb25zdCBwcm9ncmVzc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtcHJvZ3Jlc3MtY29udGVudCcpO1xuICAgIHByb2dyZXNzRWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gRGVwbG95aW5nIHNlcnZpY2VzLi4uPC9kaXY+JztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb3N0SlNPTignL2FwaS92MS9hcHBzL2RlcGxveS1jb21wb3NlJywge1xuICAgICAgICBzZXJ2aWNlczogcGFyc2VkRGF0YS5zZXJ2aWNlcyxcbiAgICAgICAgbmV0d29ya3M6IHBhcnNlZERhdGEubmV0d29ya3MsXG4gICAgICAgIHN0YWNrTmFtZTogcGFyc2VkRGF0YS5zdGFja05hbWVcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgaHRtbCA9IGA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5TdGFjayBcIiR7ZXNjYXBlSHRtbChyZXN1bHQuc3RhY2tOYW1lKX1cIiBcdTIwMTQgRGVwbG95bWVudCBDb21wbGV0ZTwvZGl2PmA7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogMzUwcHg7XCI+JztcblxuICAgICAgZm9yIChjb25zdCByIG9mIHJlc3VsdC5yZXN1bHRzKSB7XG4gICAgICAgIGNvbnN0IGljb24gPSByLnN0YXR1cyA9PT0gJ2RlcGxveWVkJyB8fCByLnN0YXR1cyA9PT0gJ2NyZWF0ZWQnID8gJ1x1MjcwNScgOiByLnN0YXR1cyA9PT0gJ2V4aXN0cycgPyAnXHUyNkExJyA6IHIuc3RhdHVzID09PSAnc2tpcHBlZCcgPyAnXHUyM0VEJyA6ICdcdTI3NEMnO1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogOHB4IDEycHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuODVyZW07XCI+YDtcbiAgICAgICAgaHRtbCArPSBgJHtpY29ufSA8c3Ryb25nPiR7ZXNjYXBlSHRtbChyLm5hbWUpfTwvc3Ryb25nPiAoJHtyLnR5cGV9KSBcdTIwMTQgJHtlc2NhcGVIdG1sKHIuc3RhdHVzKX1gO1xuICAgICAgICBpZiAoci5lcnJvcikgaHRtbCArPSBgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+JHtlc2NhcGVIdG1sKHIuZXJyb3IpfTwvc3Bhbj5gO1xuICAgICAgICBpZiAoci5zdWJkb21haW4pIGh0bWwgKz0gYCBcdTIxOTIgPGNvZGU+JHtlc2NhcGVIdG1sKHIuc3ViZG9tYWluKX08L2NvZGU+YDtcbiAgICAgICAgaWYgKHIucmVhc29uKSBodG1sICs9IGAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPigke2VzY2FwZUh0bWwoci5yZWFzb24pfSk8L3NwYW4+YDtcbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7XCI+PGJ1dHRvbiBpZD1cImNvbXBvc2UtZG9uZS1idG5cIj5Eb25lPC9idXR0b24+PC9kaXY+JztcblxuICAgICAgcHJvZ3Jlc3NFbC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtZG9uZS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIG1vZGFsPy5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmxvYWRTZXJ2aWNlcyA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LmxvYWRTZXJ2aWNlcygpLnRoZW4oKCkgPT4geyBpZiAodHlwZW9mIHdpbmRvdy5idWlsZEdyaWQgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5idWlsZEdyaWQoKTsgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2hvd05vdGlmaWNhdGlvbihgU3RhY2sgXCIke3Jlc3VsdC5zdGFja05hbWV9XCIgZGVwbG95ZWRgLCAnc3VjY2VzcycpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHByb2dyZXNzRWwuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGVwbG95bWVudCBmYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7XCI+PGJ1dHRvbiBpZD1cImNvbXBvc2UtcmV0cnktYnRuXCI+QmFjazwvYnV0dG9uPjwvZGl2PmA7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1yZXRyeS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzaG93U3RlcCgncGFzdGUnKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdEZXBsb3kgQWxsJztcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBDT05UQUlORVIgRVhFQyAvIFNIRUxMIChXZWJTb2NrZXQgKyB4dGVybS5qcykgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICBpbmplY3RNb2RhbCgnZXhlYy1tb2RhbCcsIGA8ZGl2IGlkPVwiZXhlYy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNzAwcHg7IG1heC13aWR0aDogOTAwcHg7IHBhZGRpbmctYm90dG9tOiAwO1wiPlxuICAgICAgPGgzIGlkPVwiZXhlYy10aXRsZVwiPlRlcm1pbmFsPC9oMz5cbiAgICAgIDxkaXYgaWQ9XCJleGVjLXRlcm1pbmFsXCIgc3R5bGU9XCJoZWlnaHQ6IDQyMHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IG92ZXJmbG93OiBoaWRkZW47IGJhY2tncm91bmQ6ICMxZTFlMWU7XCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDsgcGFkZGluZy1ib3R0b206IDEycHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJleGVjLWNsb3NlXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGVjLW1vZGFsJyk7XG4gIGNvbnN0IHRlcm1FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGVjLXRlcm1pbmFsJyk7XG4gIGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4ZWMtY2xvc2UnKTtcblxuICBsZXQgdGVybSA9IG51bGw7XG4gIGxldCB3cyA9IG51bGw7XG4gIGxldCBmaXRBZGRvbiA9IG51bGw7XG5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBpZiAod3MpIHsgdHJ5IHsgd3MuY2xvc2UoKTsgfSBjYXRjaCAoXykge30gd3MgPSBudWxsOyB9XG4gICAgaWYgKHRlcm0pIHsgdHJ5IHsgdGVybS5kaXNwb3NlKCk7IH0gY2F0Y2ggKF8pIHt9IHRlcm0gPSBudWxsOyB9XG4gICAgZml0QWRkb24gPSBudWxsO1xuICAgIHRlcm1FbC5pbm5lckhUTUwgPSAnJztcbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5FeGVjKGNvbnRhaW5lcklkLCBjb250YWluZXJOYW1lKSB7XG4gICAgY2xlYW51cCgpO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4ZWMtdGl0bGUnKS50ZXh0Q29udGVudCA9IGBUZXJtaW5hbCBcdTIwMTQgJHtjb250YWluZXJOYW1lIHx8IGNvbnRhaW5lcklkfWA7XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIEVuc3VyZSB4dGVybSBpcyBhdmFpbGFibGVcbiAgICBpZiAodHlwZW9mIFRlcm1pbmFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGVybUVsLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwiY29sb3I6ICNmNDQ7IHBhZGRpbmc6IDIwcHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XCI+eHRlcm0uanMgbm90IGxvYWRlZDwvZGl2Pic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGVybSA9IG5ldyBUZXJtaW5hbCh7XG4gICAgICBjdXJzb3JCbGluazogdHJ1ZSxcbiAgICAgIGZvbnRTaXplOiAxNCxcbiAgICAgIGZvbnRGYW1pbHk6IFwiJ0Nhc2NhZGlhIENvZGUnLCAnRmlyYSBDb2RlJywgJ0NvbnNvbGFzJywgbW9ub3NwYWNlXCIsXG4gICAgICB0aGVtZToge1xuICAgICAgICBiYWNrZ3JvdW5kOiAnIzFlMWUxZScsXG4gICAgICAgIGZvcmVncm91bmQ6ICcjZDRkNGQ0JyxcbiAgICAgICAgY3Vyc29yOiAnI2FlYWZhZCcsXG4gICAgICAgIHNlbGVjdGlvbkJhY2tncm91bmQ6ICcjMjY0Zjc4JyxcbiAgICAgIH0sXG4gICAgICBzY3JvbGxiYWNrOiA1MDAwLFxuICAgIH0pO1xuXG4gICAgLy8gRml0IGFkZG9uXG4gICAgaWYgKHR5cGVvZiBGaXRBZGRvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGZpdEFkZG9uID0gbmV3IEZpdEFkZG9uLkZpdEFkZG9uKCk7XG4gICAgICB0ZXJtLmxvYWRBZGRvbihmaXRBZGRvbik7XG4gICAgfVxuXG4gICAgdGVybS5vcGVuKHRlcm1FbCk7XG4gICAgaWYgKGZpdEFkZG9uKSB7XG4gICAgICAvLyBTbWFsbCBkZWxheSBmb3IgRE9NIHRvIHNldHRsZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiBmaXRBZGRvbi5maXQoKSwgNTApO1xuICAgIH1cblxuICAgIC8vIENvbm5lY3QgV2ViU29ja2V0XG4gICAgY29uc3QgcHJvdG9jb2wgPSBsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzOicgOiAnd3M6JztcbiAgICB3cyA9IG5ldyBXZWJTb2NrZXQoYCR7cHJvdG9jb2x9Ly8ke2xvY2F0aW9uLmhvc3R9L3dzL2V4ZWMvJHtlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVySWQpfWApO1xuICAgIHdzLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInO1xuXG4gICAgd3Mub25vcGVuID0gKCkgPT4ge1xuICAgICAgdGVybS53cml0ZWxuKCdcXHgxYlszMm1Db25uZWN0aW5nLi4uXFx4MWJbMG0nKTtcbiAgICAgIC8vIFNlbmQgaW5pdGlhbCByZXNpemVcbiAgICAgIGlmIChmaXRBZGRvbikge1xuICAgICAgICBjb25zdCBkaW1zID0gZml0QWRkb24ucHJvcG9zZURpbWVuc2lvbnMoKTtcbiAgICAgICAgaWYgKGRpbXMpIHtcbiAgICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3Jlc2l6ZScsIGNvbHM6IGRpbXMuY29scywgcm93czogZGltcy5yb3dzIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB3cy5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBlLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICAgIHRlcm0ud3JpdGVsbihgXFx4MWJbMzJtQ29ubmVjdGVkICgke21zZy5zaGVsbH0pXFx4MWJbMG1cXHJcXG5gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1zZy50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICB0ZXJtLndyaXRlbG4oYFxceDFiWzMxbUVycm9yOiAke21zZy5tZXNzYWdlfVxceDFiWzBtYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2V4aXQnKSB7XG4gICAgICAgICAgICB0ZXJtLndyaXRlbG4oJ1xcclxcblxceDFiWzMzbVNlc3Npb24gZW5kZWQuXFx4MWJbMG0nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIC8vIFBsYWluIHRleHRcbiAgICAgICAgdGVybS53cml0ZShlLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQmluYXJ5IGRhdGFcbiAgICAgICAgdGVybS53cml0ZShuZXcgVWludDhBcnJheShlLmRhdGEpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd3Mub25jbG9zZSA9ICgpID0+IHtcbiAgICAgIGlmICh0ZXJtKSB0ZXJtLndyaXRlbG4oJ1xcclxcblxceDFiWzMzbURpc2Nvbm5lY3RlZC5cXHgxYlswbScpO1xuICAgIH07XG5cbiAgICB3cy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgaWYgKHRlcm0pIHRlcm0ud3JpdGVsbignXFxyXFxuXFx4MWJbMzFtQ29ubmVjdGlvbiBlcnJvci5cXHgxYlswbScpO1xuICAgIH07XG5cbiAgICAvLyBUZXJtaW5hbCBpbnB1dCBcdTIxOTIgV2ViU29ja2V0XG4gICAgdGVybS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgIGlmICh3cyAmJiB3cy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgICB3cy5zZW5kKGRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIHJlc2l6ZVxuICAgIHRlcm0ub25SZXNpemUoKHsgY29scywgcm93cyB9KSA9PiB7XG4gICAgICBpZiAod3MgJiYgd3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdyZXNpemUnLCBjb2xzLCByb3dzIH0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFJlLWZpdCBvbiB3aW5kb3cgcmVzaXplXG4gICAgY29uc3QgcmVzaXplSGFuZGxlciA9ICgpID0+IHsgaWYgKGZpdEFkZG9uKSBmaXRBZGRvbi5maXQoKTsgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgcmVzaXplSGFuZGxlcik7XG5cbiAgICAvLyBTdG9yZSBoYW5kbGVyIGZvciBjbGVhbnVwXG4gICAgbW9kYWwuX3Jlc2l6ZUhhbmRsZXIgPSByZXNpemVIYW5kbGVyO1xuICB9XG5cbiAgY2xvc2VCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNsZWFudXAoKTtcbiAgICBpZiAobW9kYWwuX3Jlc2l6ZUhhbmRsZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBtb2RhbC5fcmVzaXplSGFuZGxlcik7XG4gICAgfVxuICAgIG1vZGFsPy5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH0pO1xuXG4gIC8vIEFsc28gY2xvc2Ugb24gYmFja2Ryb3AgY2xpY2tcbiAgbW9kYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICBpZiAobW9kYWwuX3Jlc2l6ZUhhbmRsZXIpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG1vZGFsLl9yZXNpemVIYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIG1vZGFsPy5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBFeHBvcnRcbiAgd2luZG93Lm9wZW5FeGVjTW9kYWwgPSBvcGVuRXhlYztcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IEFVRElUIExPRyBWSUVXRVIgPT09PT09PT09PVxuLy8gREMtMDUwOiBzdXJmYWNlIGF1dGhlbnRpY2F0ZWQgdXNlciBpZGVudGl0eSAodXNlckVtYWlsIC8gdXNlclJvbGUgZnJvbVxuLy8gYXVkaXRMb2dnZXIuZGV0YWlscyksIGFkZCBvdXRjb21lIGZpbHRlciwgcGFzcyBjb25maXJtPUNMRUFSIGJvZHkgZm9yXG4vLyBkZXN0cnVjdGl2ZSBERUxFVEUuXG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdhdWRpdC1tb2RhbCcsIGA8ZGl2IGlkPVwiYXVkaXQtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDk1MHB4OyBtYXgtd2lkdGg6IDExNTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDREMgQXVkaXQgTG9nPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgVHJhY2sgYWxsIGFjdGlvbnMgcGVyZm9ybWVkIHRocm91Z2ggdGhlIEFQSS5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMTJweDsgbWFyZ2luLWJvdHRvbTogMTJweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+Q2F0ZWdvcnk6PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cImF1ZGl0LWZpbHRlclwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzZXJ2aWNlXCI+U2VydmljZXM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY29udGFpbmVyXCI+Q29udGFpbmVyczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjYWRkeVwiPkNhZGR5PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImRuc1wiPkROUzwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJiYWNrdXBcIj5CYWNrdXBzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNvbmZpZ1wiPkNvbmZpZzwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhdXRoXCI+QXV0aDwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlJlc3VsdDo8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwiYXVkaXQtb3V0Y29tZS1maWx0ZXJcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5Bbnk8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic3VjY2Vzc1wiPlx1MjcxMyBTdWNjZXNzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImZhaWx1cmVcIj5cdTI3MTcgRmFpbHVyZTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDhweDtcIj5TaW5jZTo8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJhdWRpdC1zaW5jZVwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0eWxlPVwicGFkZGluZzogNXB4IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlVudGlsOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImF1ZGl0LXVudGlsXCIgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXVkaXQtcmVmcmVzaC1idG5cIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj48L3NwYW4+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhdWRpdC1jbGVhci1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMnB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGJvcmRlci1jb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cdUQ4M0RcdURERDFcdUZFMEYgQ2xlYXIgTG9nPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImF1ZGl0LWxvZy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGF1ZGl0IGxvZy4uLjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhdWRpdC1sb2FkLW1vcmVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDZweCAxNnB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5Mb2FkIE1vcmU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImF1ZGl0LWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1sb2ctYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1jYW5jZWwnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1yZWZyZXNoLWJ0bicpO1xuICBjb25zdCBjbGVhckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1jbGVhci1idG4nKTtcbiAgY29uc3QgZmlsdGVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LWZpbHRlcicpO1xuICBjb25zdCBvdXRjb21lU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LW91dGNvbWUtZmlsdGVyJyk7XG4gIGNvbnN0IHNpbmNlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtc2luY2UnKTtcbiAgY29uc3QgdW50aWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC11bnRpbCcpO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtbG9nLWNvbnRhaW5lcicpO1xuICBjb25zdCBsb2FkTW9yZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1sb2FkLW1vcmUnKTtcbiAgbGV0IGN1cnJlbnRPZmZzZXQgPSAwO1xuICBsZXQgaW5mbGlnaHQgPSBudWxsOyAvLyBBYm9ydENvbnRyb2xsZXIgZm9yIHRoZSBpbi1mbGlnaHQgcmVxdWVzdFxuICBsZXQgZmlsdGVyTm9uY2UgPSAwOyAvLyBpbmNyZW1lbnRzIG9uIGV2ZXJ5IGZyZXNoIChub24tYXBwZW5kKSBsb2FkOyBsZXRzXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGluLWZsaWdodCBhcHBlbmQgZGV0ZWN0IHRoZSBmaWx0ZXIgaGFzIGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHNraXAgaXRzIERPTSBzcGxpY2UuXG4gIGNvbnN0IFBBR0VfU0laRSA9IDUwO1xuXG4gIC8vIGRhdGV0aW1lLWxvY2FsIGZpZWxkcyBjYXJyeSBubyB0aW1lem9uZSBvZmZzZXQgXHUyMDE0IGNvbnZlcnQgdG8gSVNPIDg2MDFcbiAgLy8gd2l0aCB0aGUgbG9jYWwgb2Zmc2V0IHNvIHRoZSBzZXJ2ZXIgY2FuIGNvbXBhcmUgY29ycmVjdGx5LlxuICBmdW5jdGlvbiB0b0lzbyhsb2NhbER0VmFsdWUpIHtcbiAgICBpZiAoIWxvY2FsRHRWYWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgLy8gQnJvd3NlcnMgZXhwb3NlIGRhdGV0aW1lLWxvY2FsIGFzIG5haXZlIGxvY2FsIHRpbWUuIG5ldyBEYXRlKCkgb25cbiAgICAvLyB0aGF0IHN0cmluZyBwYXJzZXMgaXQgYXMgTE9DQUwsIHNvIHRvSVNPU3RyaW5nKCkgeWllbGRzIHRoZSBVVENcbiAgICAvLyBlcXVpdmFsZW50IHRoZSBzZXJ2ZXIgZXhwZWN0cy5cbiAgICBjb25zdCBkID0gbmV3IERhdGUobG9jYWxEdFZhbHVlKTtcbiAgICBpZiAoaXNOYU4oZC5nZXRUaW1lKCkpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gZC50b0lTT1N0cmluZygpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEF1ZGl0KGFwcGVuZCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWFwcGVuZCkge1xuICAgICAgICAvLyBDYW5jZWwgYW55IHBlbmRpbmcgcmVxdWVzdCBhbmQgYnVtcCB0aGUgZmlsdGVyIG5vbmNlIHNvIGFueVxuICAgICAgICAvLyBhcHBlbmRpbmcgZmV0Y2ggKHN0aWxsIGluIGZsaWdodCkga25vd3MgdG8gZGlzY2FyZCBpdHMgcmVzcG9uc2UuXG4gICAgICAgIGlmIChpbmZsaWdodCkgaW5mbGlnaHQuYWJvcnQoKTtcbiAgICAgICAgaW5mbGlnaHQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGN1cnJlbnRPZmZzZXQgPSAwO1xuICAgICAgICBmaWx0ZXJOb25jZSsrO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5mbGlnaHQpIGluZmxpZ2h0LmFib3J0KCk7XG4gICAgICAgIGluZmxpZ2h0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgfVxuICAgICAgY29uc3QgbXlOb25jZSA9IGZpbHRlck5vbmNlO1xuICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgcGFyYW1zLnNldCgnbGltaXQnLCBTdHJpbmcoUEFHRV9TSVpFKSk7XG4gICAgICBwYXJhbXMuc2V0KCdvZmZzZXQnLCBTdHJpbmcoY3VycmVudE9mZnNldCkpO1xuICAgICAgY29uc3QgYWN0aW9uID0gZmlsdGVyU2VsZWN0LnZhbHVlO1xuICAgICAgY29uc3Qgb3V0Y29tZSA9IG91dGNvbWVTZWxlY3QudmFsdWU7XG4gICAgICBjb25zdCBzaW5jZSA9IHRvSXNvKHNpbmNlSW5wdXQudmFsdWUpO1xuICAgICAgY29uc3QgdW50aWwgPSB0b0lzbyh1bnRpbElucHV0LnZhbHVlKTtcbiAgICAgIGlmIChhY3Rpb24pIHBhcmFtcy5zZXQoJ2FjdGlvbicsIGFjdGlvbik7XG4gICAgICBpZiAob3V0Y29tZSkgcGFyYW1zLnNldCgnb3V0Y29tZScsIG91dGNvbWUpO1xuICAgICAgaWYgKHNpbmNlKSBwYXJhbXMuc2V0KCdzaW5jZScsIHNpbmNlKTtcbiAgICAgIGlmICh1bnRpbCkgcGFyYW1zLnNldCgndW50aWwnLCB1bnRpbCk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2F1ZGl0LWxvZ3M/JyArIHBhcmFtcy50b1N0cmluZygpLCB7XG4gICAgICAgIHNpZ25hbDogaW5mbGlnaHQuc2lnbmFsLFxuICAgICAgfSk7XG4gICAgICAvLyBTdXJmYWNlIDQwMS80MDMvNTAwIGV4cGxpY2l0bHkgXHUyMDE0IHRoZSBkYXNoYm9hcmQgdXNlZCB0byByZW5kZXIgYW55XG4gICAgICAvLyBub24tc3VjY2VzcyByZXNwb25zZSBhcyBcIm5vIGF1ZGl0IGxvZyBlbnRyaWVzIHlldCxcIiB3aGljaCBpc1xuICAgICAgLy8gbWlzbGVhZGluZyBmb3IgYW4gZXhwaXJlZCBzZXNzaW9uLlxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogSFRUUCAke3Jlcy5zdGF0dXN9PC9kaXY+YDtcbiAgICAgICAgbG9hZE1vcmVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZGF0YS5lcnJvciB8fCAndW5rbm93bicpfTwvZGl2PmA7XG4gICAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIElmIGEgbm9uLWFwcGVuZCBsb2FkIGhhcHBlbmVkIGFmdGVyIHRoaXMgZmV0Y2ggd2FzIGlzc3VlZCwgdGhlXG4gICAgICAvLyBvcGVyYXRvciBjaGFuZ2VkIGZpbHRlcnM7IGRpc2NhcmQgdGhlIG5vdy1zdGFsZSByZXNwb25zZS5cbiAgICAgIGlmICghYXBwZW5kICYmIG15Tm9uY2UgIT09IGZpbHRlck5vbmNlKSByZXR1cm47XG4gICAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuaXNBcnJheShkYXRhLmVudHJpZXMpID8gZGF0YS5lbnRyaWVzIDogW107XG5cbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCAmJiAhYXBwZW5kKSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IGRhdGEuZmlsdGVycyAmJiAoZGF0YS5maWx0ZXJzLmFjdGlvbiB8fCBkYXRhLmZpbHRlcnMub3V0Y29tZSB8fCBkYXRhLmZpbHRlcnMuc2luY2UgfHwgZGF0YS5maWx0ZXJzLnVudGlsKVxuICAgICAgICAgID8gJ05vIGVudHJpZXMgbWF0Y2ggeW91ciBmaWx0ZXJzLidcbiAgICAgICAgICA6ICdObyBhdWRpdCBsb2cgZW50cmllcyB5ZXQuIEFjdGlvbnMgd2lsbCBiZSBsb2dnZWQgYXV0b21hdGljYWxseS4nO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENEQzwvc3Bhbj4ke2VzY2FwZUh0bWwocmVhc29uKX08L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBodG1sID0gJyc7XG4gICAgICBpZiAoIWFwcGVuZCkge1xuICAgICAgICBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODJyZW07XCI+JztcbiAgICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPldoZW48L3RoPic7XG4gICAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5BY3RvcjwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPklQPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+QWN0aW9uPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+UmVzb3VyY2U8L3RoPic7XG4gICAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5SZXN1bHQ8L3RoPic7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBlIG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3Qgb2sgPSBlLm91dGNvbWUgPT09ICdzdWNjZXNzJztcbiAgICAgICAgY29uc3QgYWN0b3IgPSBhY3RvckxhYmVsKGUpO1xuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY3Vyc29yOiBwb2ludGVyO1wiIGNsYXNzPVwiYXVkaXQtcm93XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGUudGltZXN0YW1wIHx8ICcnKX1cIj4ke3RpbWVBZ28oZS50aW1lc3RhbXApfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LXNpemU6IDAuNzhyZW07XCI+JHthY3Rvcn08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjc4cmVtO1wiPiR7ZXNjYXBlSHRtbChlLmlwIHx8ICctJyl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKGUuYWN0aW9uIHx8ICctJyl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtlc2NhcGVIdG1sKGUucmVzb3VyY2UgfHwgJy0nKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiAke29rID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYmFkLWZnKSd9O1wiPiR7b2sgPyAnXHUyNzEzJyA6ICdcdTI3MTcnfSAke2VzY2FwZUh0bWwoZS5vdXRjb21lIHx8ICcnKX08L3NwYW4+PC90ZD5gO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICAgIGlmIChlLmRldGFpbHMgJiYgT2JqZWN0LmtleXMoZS5kZXRhaWxzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaHRtbCArPSBgPHRyIGNsYXNzPVwiYXVkaXQtZGV0YWlsXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjx0ZCBjb2xzcGFuPVwiNlwiIHN0eWxlPVwicGFkZGluZzogNnB4IDZweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHByZSBzdHlsZT1cIm1hcmdpbjogMDsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyBmb250LWZhbWlseTogbW9ub3NwYWNlO1wiPiR7ZXNjYXBlSHRtbChKU09OLnN0cmluZ2lmeShlLmRldGFpbHMsIG51bGwsIDIpKX08L3ByZT48L3RkPjwvdHI+YDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWFwcGVuZCkge1xuICAgICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigndGFibGUnKTtcbiAgICAgICAgaWYgKHRhYmxlKSB0YWJsZS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bWwpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50T2Zmc2V0ICs9IGVudHJpZXMubGVuZ3RoO1xuICAgICAgLy8gaGFzTW9yZSBpcyByZXBvcnRlZCBieSB0aGUgc2VydmVyIChwb3N0LWZpbHRlciB0b3RhbCksIHNvIHRoZVxuICAgICAgLy8gTG9hZCBNb3JlIGJ1dHRvbiBzdGF5cyBhY2N1cmF0ZSB3aGVuIGZpbHRlcnMgY2hhbmdlIG1pZC1zY3JvbGwuXG4gICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gZGF0YS5oYXNNb3JlID8gJycgOiAnbm9uZSc7XG5cbiAgICAgIC8vIFRvZ2dsZSBkZXRhaWwgcm93cyBvbiBjbGlja1xuICAgICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5hdWRpdC1yb3cnKS5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgIGlmIChyb3cuZGF0YXNldC53aXJlZCkgcmV0dXJuO1xuICAgICAgICByb3cuZGF0YXNldC53aXJlZCA9ICd0cnVlJztcbiAgICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRldGFpbCA9IHJvdy5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgaWYgKGRldGFpbCAmJiBkZXRhaWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdhdWRpdC1kZXRhaWwnKSkge1xuICAgICAgICAgICAgZGV0YWlsLnN0eWxlLmRpc3BsYXkgPSBkZXRhaWwuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJycgOiAnbm9uZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIEFib3J0RXJyb3IgaXMgZXhwZWN0ZWQgd2hlbiB3ZSBkZWxpYmVyYXRlbHkgY2FuY2VsIGFuIGluLWZsaWdodFxuICAgICAgLy8gcmVxdWVzdCAoZS5nLiB0aGUgb3BlcmF0b3IgY2hhbmdlZCBmaWx0ZXJzIG1pZC1mZXRjaCkgXHUyMDE0IGRvbid0XG4gICAgICAvLyBmbGFzaCBhIFwiRmFpbGVkOiBUaGUgdXNlciBhYm9ydGVkIGEgcmVxdWVzdFwiIG1lc3NhZ2Ugb3ZlciB0aGVcbiAgICAgIC8vIGxvYWRpbmcgc3Bpbm5lci4gVGhlIG5ldyBmZXRjaCBoYXMgYWxyZWFkeSBraWNrZWQgb2ZmLlxuICAgICAgaWYgKGUgJiYgZS5uYW1lID09PSAnQWJvcnRFcnJvcicpIHJldHVybjtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVuZGVyIHRoZSBodW1hbi1yZWFkYWJsZSBhY3RvcjogcHJlZmVyIHVzZXJFbWFpbCwgZmFsbCBiYWNrIHRvXG4gIC8vIHVzZXJJZCwgZmFsbCBiYWNrIHRvIGJhcmUgSVAuIElmIG5vIHVzZXIgYXR0cmlidXRpb24sIG1hcmsgYXNcbiAgLy8gXCJzeXN0ZW1cIiBzbyB0aGUgb3BlcmF0b3Iga25vd3MgdGhlIGVudHJ5IGNhbWUgZnJvbSBhbiB1bmF1dGhlbnRpY2F0ZWRcbiAgLy8gb3Igc2VydmljZSBwYXRoIChlLmcuIGNyb24tZHJpdmVuIGJhY2t1cHMpLlxuICBmdW5jdGlvbiBhY3RvckxhYmVsKGVudHJ5KSB7XG4gICAgY29uc3QgZCA9IGVudHJ5LmRldGFpbHMgfHwge307XG4gICAgY29uc3QgZW1haWwgPSBkLnVzZXJFbWFpbDtcbiAgICBjb25zdCBpZCA9IGQudXNlcklkO1xuICAgIGNvbnN0IHJvbGUgPSBkLnVzZXJSb2xlO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gZC52aWFQcm92aWRlcjtcbiAgICBpZiAoZW1haWwpIHtcbiAgICAgIGNvbnN0IHRhZyA9IHJvbGUgPyBgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjcycmVtO1wiPlske2VzY2FwZUh0bWwocm9sZSl9JHtwcm92aWRlciA/ICcvJyArIGVzY2FwZUh0bWwocHJvdmlkZXIpIDogJyd9XTwvc3Bhbj5gIDogJyc7XG4gICAgICByZXR1cm4gYCR7ZXNjYXBlSHRtbChlbWFpbCl9JHt0YWd9YDtcbiAgICB9XG4gICAgaWYgKGlkKSByZXR1cm4gYDxzcGFuIHN0eWxlPVwiZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2VzY2FwZUh0bWwoaWQpfTwvc3Bhbj5gO1xuICAgIGlmICghZW50cnkuaXApIHJldHVybiAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPnN5c3RlbTwvc3Bhbj4nO1xuICAgIHJldHVybiAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPmFub248L3NwYW4+JztcbiAgfVxuXG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZEF1ZGl0KGZhbHNlKTtcbiAgfSk7XG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcbiAgcmVmcmVzaEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBsb2FkQXVkaXQoZmFsc2UpKTtcbiAgZmlsdGVyU2VsZWN0Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiBsb2FkQXVkaXQoZmFsc2UpKTtcbiAgb3V0Y29tZVNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gbG9hZEF1ZGl0KGZhbHNlKSk7XG4gIC8vIFJlLWZldGNoIG9uIGRhdGUgY2hhbmdlIG9ubHkgd2hlbiBib3RoIGZpZWxkcyBoYXZlIGEgdmFsdWUgb3IgYm90aCBhcmVcbiAgLy8gZW1wdHkgXHUyMDE0IHR5cGluZyBvbmUgY2hhcmFjdGVyIHNob3VsZG4ndCB0cmlnZ2VyIGEgZmV0Y2ggZm9yIGV2ZXJ5IGtleXN0cm9rZS5cbiAgbGV0IGRhdGVEZWJvdW5jZTtcbiAgW3NpbmNlSW5wdXQsIHVudGlsSW5wdXRdLmZvckVhY2goKGVsKSA9PiB7XG4gICAgZWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChkYXRlRGVib3VuY2UpO1xuICAgICAgZGF0ZURlYm91bmNlID0gc2V0VGltZW91dCgoKSA9PiBsb2FkQXVkaXQoZmFsc2UpLCAyNTApO1xuICAgIH0pO1xuICB9KTtcbiAgbG9hZE1vcmVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbG9hZEF1ZGl0KHRydWUpKTtcblxuICBjbGVhckJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maXJtKCdDbGVhciB0aGUgZW50aXJlIGF1ZGl0IGxvZz8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicpKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2F1ZGl0LWxvZ3MnLCB7XG4gICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgIGhlYWRlcnM6IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvbmZpcm06ICdDTEVBUicgfSksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2VzcykgbG9hZEF1ZGl0KGZhbHNlKTtcbiAgICAgIGVsc2Ugc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyAoZGF0YS5lcnJvciB8fCAnQ2xlYXIgZmFpbGVkJyksICdlcnJvcicpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH0pO1xufSkoKTs7XG4vLyA9PT09PT09PT09IFNFQ1VSSVRZIENFTlRFUiA9PT09PT09PT09XG4vLyBNdWx0aS1zb3VyY2Ugc2VjdXJpdHkgZXZlbnQgdmlld2VyICsgaG9zdCByZWdpc3RyeSBVSS5cbi8vXG4vLyBTaG93cyBsaXZlIGV2ZW50cyBmcm9tIGFueSBzb3VyY2UgKEFQSSBhdWRpdCwgQ2FkZHkgYWNjZXNzIGxvZywgZmFpbDJiYW4sXG4vLyBzaGFyZWRfYmFucykgb24gYW55IHJlZ2lzdGVyZWQgaG9zdCAodGhpcyBEYXNoQ2FkZHksIGZ1dHVyZSByZW1vdGUgYWdlbnRzKS5cbi8vXG4vLyBMaXZlLXRhaWwgdXNlcyBTU0UgKC9hcGkvdjEvc2VjdXJpdHkvZXZlbnRzL3N0cmVhbSkuXG4oZnVuY3Rpb24oKSB7XG4gIGluamVjdE1vZGFsKCdzZWN1cml0eS1tb2RhbCcsIGA8ZGl2IGlkPVwic2VjdXJpdHktbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDk4MHB4OyBtYXgtd2lkdGg6IDEyODBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURFRTFcdUZFMEYgU2VjdXJpdHkgQ2VudGVyPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgTGl2ZSBldmVudHMgZnJvbSBBUEksIENhZGR5LCBmYWlsMmJhbiAmIHNoYXJlZF9iYW5zLiBMaXZlLXRhaWwgdmlhIFNTRS5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cInNlYy10YWJzXCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tYm90dG9tOjE0cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlYy10YWIgYWN0aXZlXCIgZGF0YS10YWI9XCJvdmVydmlld1wiPk92ZXJ2aWV3PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzZWMtdGFiXCIgZGF0YS10YWI9XCJldmVudHNcIj5FdmVudHM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlYy10YWJcIiBkYXRhLXRhYj1cImhvc3RzXCI+SG9zdHM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE9WRVJWSUVXIFRBQiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWMtcGFuZWxcIiBkYXRhLXBhbmVsPVwib3ZlcnZpZXdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlYy1zdGF0c1wiIGlkPVwic2VjLXN0YXRzXCIgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdChhdXRvLWZpdCxtaW5tYXgoMTgwcHgsMWZyKSk7Z2FwOjEycHg7bWFyZ2luLWJvdHRvbToxOHB4O1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdFwiIGRhdGEta2V5PVwidG90YWxcIj5cdTIwMTQgZXZlbnRzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlYy1zdGF0XCIgZGF0YS1rZXk9XCJ3YXJuXCI+XHUyMDE0IHdhcm5pbmdzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlYy1zdGF0XCIgZGF0YS1rZXk9XCJlcnJvclwiPlx1MjAxNCBlcnJvcnM8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjLXN0YXRcIiBkYXRhLWtleT1cImRlbmllZFwiPlx1MjAxNCBkZW5pZWQ8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjLXN0YXRcIiBkYXRhLWtleT1cImhvc3RzXCI+XHUyMDE0IGhvc3RzPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgMWZyO2dhcDoxNHB4O1wiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46OHB4IDAgNnB4O1wiPlRvcCBBY3RvcnMgKDI0aCk8L2g0PlxuICAgICAgICAgICAgPGRpdiBpZD1cInNlYy10b3AtYWN0b3JzXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OjI0MHB4O1wiPlx1MjAxNDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46OHB4IDAgNnB4O1wiPlRvcCBUYXJnZXRzICgyNGgpPC9oND5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJzZWMtdG9wLXRhcmdldHNcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6MjQwcHg7XCI+XHUyMDE0PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRVZFTlRTIFRBQiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWMtcGFuZWxcIiBkYXRhLXBhbmVsPVwiZXZlbnRzXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tYm90dG9tOjEycHg7YWxpZ24taXRlbXM6Y2VudGVyO2ZsZXgtd3JhcDp3cmFwO1wiPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzZWMtZmlsdGVyLXNvdXJjZVwiIGNsYXNzPVwic2VjLWZpbHRlclwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBzb3VyY2VzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYXBpXCI+QVBJPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2FkZHlcIj5DYWRkeTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImZhaWwyYmFuXCI+ZmFpbDJiYW48L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzaGFyZWQtYmFuc1wiPnNoYXJlZF9iYW5zPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWdlbnRcIj5BZ2VudDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzZWMtZmlsdGVyLXNldmVyaXR5XCIgY2xhc3M9XCJzZWMtZmlsdGVyXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsIHNldmVyaXRpZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjcml0aWNhbFwiPmNyaXRpY2FsPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZXJyb3JcIj5lcnJvcjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIndhcm5cIj53YXJuPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibm90aWNlXCI+bm90aWNlPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW5mb1wiPmluZm88L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic2VjLWZpbHRlci1ob3N0XCIgY2xhc3M9XCJzZWMtZmlsdGVyXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsIGhvc3RzPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGlucHV0IGlkPVwic2VjLWZpbHRlci1hY3RvclwiIGNsYXNzPVwic2VjLWZpbHRlclwiIHBsYWNlaG9sZGVyPVwiYWN0b3IgKElQIG9yIHVzZXIpXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxMHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJzZWMtcmVmcmVzaC1idG5cIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+XG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwibWFyZ2luLWxlZnQ6YXV0bztkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHg7XCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJzZWMtbGl2ZS10YWlsXCIgY2hlY2tlZD5cbiAgICAgICAgICAgIDxzcGFuPkxpdmUgdGFpbDwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInNlYy1ldmVudHMtY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OjQ4MHB4O1wiPkxvYWRpbmdcdTIwMjY8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEhPU1RTIFRBQiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWMtcGFuZWxcIiBkYXRhLXBhbmVsPVwiaG9zdHNcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2VjLWhvc3QtcmVnaXN0ZXItYnRuXCIgY2xhc3M9XCJidG4tc21cIj5cdTI3OTUgUmVnaXN0ZXIgSG9zdDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJzZWMtaG9zdHMtcmVmcmVzaFwiIGNsYXNzPVwiYnRuLXNtXCI+XHVEODNEXHVERDA0IFJlZnJlc2g8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJzZWMtaG9zdHMtY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OjQ4MHB4O1wiPkxvYWRpbmdcdTIwMjY8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInNlYy1jYW5jZWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIC8vID09PT09PT09PT09PT0gU1RBVEUgPT09PT09PT09PT09PVxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN1cml0eS1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3VyaXR5LWNlbnRlci1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1jYW5jZWwnKTtcbiAgY29uc3QgdGFicyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWMtdGFiJyk7XG4gIGNvbnN0IHBhbmVscyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWMtcGFuZWwnKTtcblxuICBsZXQgYWxsRXZlbnRzID0gW107IC8vIG5ld2VzdCBmaXJzdFxuICBsZXQgYWxsSG9zdHMgPSBbXTtcbiAgbGV0IHNzZVNvdXJjZSA9IG51bGw7XG5cbiAgLy8gPT09PT09PT09PT09PSBUQUIgU1dJVENISU5HID09PT09PT09PT09PT1cbiAgdGFicy5mb3JFYWNoKHRhYiA9PiB7XG4gICAgdGFiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGFicy5mb3JFYWNoKHQgPT4gdC5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCB0ID09PSB0YWIpKTtcbiAgICAgIHBhbmVscy5mb3JFYWNoKHAgPT4gcC5zdHlsZS5kaXNwbGF5ID0gcC5kYXRhc2V0LnBhbmVsID09PSB0YWIuZGF0YXNldC50YWIgPyAnJyA6ICdub25lJyk7XG4gICAgICBpZiAodGFiLmRhdGFzZXQudGFiID09PSAnb3ZlcnZpZXcnKSByZWZyZXNoT3ZlcnZpZXcoKTtcbiAgICAgIGlmICh0YWIuZGF0YXNldC50YWIgPT09ICdldmVudHMnKSByZWZyZXNoRXZlbnRzKCk7XG4gICAgICBpZiAodGFiLmRhdGFzZXQudGFiID09PSAnaG9zdHMnKSByZWZyZXNoSG9zdHMoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PSBPUEVOL0NMT1NFID09PT09PT09PT09PT1cbiAgaWYgKG9wZW5CdG4pIHtcbiAgICBvcGVuQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgICAgcmVmcmVzaE92ZXJ2aWV3KCk7XG4gICAgICBzdGFydExpdmVUYWlsKCk7XG4gICAgfSk7XG4gIH1cbiAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VNb2RhbCk7XG4gIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7IGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIGNsb3NlTW9kYWwoKTsgfSk7XG4gIGZ1bmN0aW9uIGNsb3NlTW9kYWwoKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHN0b3BMaXZlVGFpbCgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PSBMSVZFIFRBSUwgKFNTRSkgPT09PT09PT09PT09PVxuICBmdW5jdGlvbiBzdGFydExpdmVUYWlsKCkge1xuICAgIHN0b3BMaXZlVGFpbCgpO1xuICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1saXZlLXRhaWwnKS5jaGVja2VkKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBFdmVudFNvdXJjZSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjsgLy8gYnJvd3NlciBkb2Vzbid0IHN1cHBvcnRcbiAgICB0cnkge1xuICAgICAgc3NlU291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cy9zdHJlYW0nKTtcbiAgICAgIHNzZVNvdXJjZS5hZGRFdmVudExpc3RlbmVyKCdpbml0JywgKGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICAgIGFsbEV2ZW50cyA9IGRhdGEuZXZlbnRzIHx8IFtdO1xuICAgICAgICAgIHJlbmRlckV2ZW50cygpO1xuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9KTtcbiAgICAgIHNzZVNvdXJjZS5hZGRFdmVudExpc3RlbmVyKCdzZWN1cml0eScsIChlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZXYgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgICAgYWxsRXZlbnRzLnVuc2hpZnQoZXYpO1xuICAgICAgICAgIGlmIChhbGxFdmVudHMubGVuZ3RoID4gNTAwKSBhbGxFdmVudHMubGVuZ3RoID0gNTAwO1xuICAgICAgICAgIC8vIEF1dG8tcmVmcmVzaCB3aGljaGV2ZXIgcGFuZWwgaXMgc2hvd2luZ1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJy5zZWMtdGFiLmFjdGl2ZScpPy5kYXRhc2V0Py50YWI7XG4gICAgICAgICAgaWYgKGFjdGl2ZSA9PT0gJ2V2ZW50cycpIHJlbmRlckV2ZW50cygpO1xuICAgICAgICAgIGVsc2UgaWYgKGFjdGl2ZSA9PT0gJ292ZXJ2aWV3JykgcmVmcmVzaE92ZXJ2aWV3KCk7XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH0pO1xuICAgICAgc3NlU291cmNlLm9uZXJyb3IgPSAoKSA9PiB7IC8qIGJyb3dzZXIgYXV0by1yZWNvbm5lY3RzICovIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbc2VjdXJpdHldIFNTRSBmYWlsZWQ6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc3RvcExpdmVUYWlsKCkge1xuICAgIGlmIChzc2VTb3VyY2UpIHsgdHJ5IHsgc3NlU291cmNlLmNsb3NlKCk7IH0gY2F0Y2gge30gc3NlU291cmNlID0gbnVsbDsgfVxuICB9XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtbGl2ZS10YWlsJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGlmIChtb2RhbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSkgc3RhcnRMaXZlVGFpbCgpO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09IE9WRVJWSUVXID09PT09PT09PT09PT1cbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaE92ZXJ2aWV3KCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaW5jZSA9IG5ldyBEYXRlKERhdGUubm93KCkgLSAyNCo2MCo2MCoxMDAwKS50b0lTT1N0cmluZygpO1xuICAgICAgY29uc3QgW3N0YXRzUmVzLCBob3N0c1JlcywgZXZlbnRzUmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZmV0Y2goYC9hcGkvdjEvc2VjdXJpdHkvZXZlbnRzL3N0YXRzP3NpbmNlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNpbmNlKX1gKSxcbiAgICAgICAgZmV0Y2goJy9hcGkvdjEvc2VjdXJpdHkvaG9zdHMnKSxcbiAgICAgICAgZmV0Y2goYC9hcGkvdjEvc2VjdXJpdHkvZXZlbnRzP2xpbWl0PTEmc2luY2U9JHtlbmNvZGVVUklDb21wb25lbnQoc2luY2UpfWApLFxuICAgICAgXSk7XG4gICAgICBjb25zdCBzdGF0cyA9IChhd2FpdCBzdGF0c1Jlcy5qc29uKCkpLmRhdGEgfHwge307XG4gICAgICBjb25zdCBob3N0cyA9IChhd2FpdCBob3N0c1Jlcy5qc29uKCkpLmRhdGE/Lmhvc3RzIHx8IFtdO1xuICAgICAgY29uc3QgZXZlbnRzQ291bnQgPSAoYXdhaXQgZXZlbnRzUmVzLmpzb24oKSkuZGF0YT8udG90YWwgfHwgMDtcblxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlYy1zdGF0cyBbZGF0YS1rZXk9XCJ0b3RhbFwiXScpLnRleHRDb250ZW50ID0gYCR7ZXZlbnRzQ291bnR9IGV2ZW50cyAoMjRoKWA7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VjLXN0YXRzIFtkYXRhLWtleT1cIndhcm5cIl0nKS50ZXh0Q29udGVudCA9IGAke3N0YXRzLmJ5X3NldmVyaXR5Py53YXJuIHx8IDB9IHdhcm5pbmdzYDtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwiZXJyb3JcIl0nKS50ZXh0Q29udGVudCA9IGAke3N0YXRzLmJ5X3NldmVyaXR5Py5lcnJvciB8fCAwfSBlcnJvcnNgO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlYy1zdGF0cyBbZGF0YS1rZXk9XCJkZW5pZWRcIl0nKS50ZXh0Q29udGVudCA9IGAke3N0YXRzLmJ5X291dGNvbWU/LmRlbmllZCB8fCAwfSBkZW5pZWRgO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlYy1zdGF0cyBbZGF0YS1rZXk9XCJob3N0c1wiXScpLnRleHRDb250ZW50ID0gYCR7aG9zdHMubGVuZ3RofSBob3N0c2A7XG5cbiAgICAgIHJlbmRlclRvcExpc3QoJ3NlYy10b3AtYWN0b3JzJywgc3RhdHMudG9wX2FjdG9ycyB8fCBbXSk7XG4gICAgICByZW5kZXJUb3BMaXN0KCdzZWMtdG9wLXRhcmdldHMnLCBzdGF0cy50b3BfdGFyZ2V0cyB8fCBbXSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbc2VjdXJpdHldIHJlZnJlc2hPdmVydmlldyBmYWlsZWQ6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcmVuZGVyVG9wTGlzdChpZCwgaXRlbXMpIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgeyBlbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+Tm8gZGF0YTwvZGl2Pic7IHJldHVybjsgfVxuICAgIGVsLmlubmVySFRNTCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDoxMDAlO2ZvbnQtc2l6ZTowLjg1cmVtO1wiPicgK1xuICAgICAgaXRlbXMubWFwKGl0ID0+IGA8dHI+PHRkIHN0eWxlPVwicGFkZGluZzozcHggMDt3b3JkLWJyZWFrOmJyZWFrLWFsbDtcIj4ke2VzY2FwZUh0bWwoU3RyaW5nKGl0LmtleSkpfTwvdGQ+PHRkIHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodDtjb2xvcjp2YXIoLS1tdXRlZCk7XCI+JHtpdC5jb3VudH08L3RkPjwvdHI+YCkuam9pbignJykgK1xuICAgICAgJzwvdGFibGU+JztcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT0gRVZFTlRTID09PT09PT09PT09PT1cbiAgY29uc3QgZmlsdGVyU291cmNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1maWx0ZXItc291cmNlJyk7XG4gIGNvbnN0IGZpbHRlclNldmVyaXR5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1maWx0ZXItc2V2ZXJpdHknKTtcbiAgY29uc3QgZmlsdGVySG9zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtZmlsdGVyLWhvc3QnKTtcbiAgY29uc3QgZmlsdGVyQWN0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWZpbHRlci1hY3RvcicpO1xuICBjb25zdCByZWZyZXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1yZWZyZXNoLWJ0bicpO1xuXG4gIFtmaWx0ZXJTb3VyY2UsIGZpbHRlclNldmVyaXR5LCBmaWx0ZXJIb3N0XS5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHJlZnJlc2hFdmVudHMpKTtcbiAgZmlsdGVyQWN0b3IuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBkZWJvdW5jZShyZWZyZXNoRXZlbnRzLCAyNTApKTtcbiAgcmVmcmVzaEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlZnJlc2hFdmVudHMpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hFdmVudHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgIHBhcmFtcy5zZXQoJ2xpbWl0JywgJzIwMCcpO1xuICAgICAgaWYgKGZpbHRlclNvdXJjZS52YWx1ZSkgIHBhcmFtcy5zZXQoJ3NvdXJjZV90eXBlJywgZmlsdGVyU291cmNlLnZhbHVlKTtcbiAgICAgIGlmIChmaWx0ZXJTZXZlcml0eS52YWx1ZSkgcGFyYW1zLnNldCgnc2V2ZXJpdHknLCBmaWx0ZXJTZXZlcml0eS52YWx1ZSk7XG4gICAgICBpZiAoZmlsdGVySG9zdC52YWx1ZSkgICAgcGFyYW1zLnNldCgnc291cmNlX2hvc3QnLCBmaWx0ZXJIb3N0LnZhbHVlKTtcbiAgICAgIGlmIChmaWx0ZXJBY3Rvci52YWx1ZSkgICBwYXJhbXMuc2V0KCdhY3Rvcl9wcmVmaXgnLCBmaWx0ZXJBY3Rvci52YWx1ZSk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cz8ke3BhcmFtc31gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzLmpzb24oKSkuZGF0YTtcbiAgICAgIGFsbEV2ZW50cyA9IGRhdGEuZXZlbnRzIHx8IFtdO1xuICAgICAgcmVuZGVyRXZlbnRzKCk7XG5cbiAgICAgIC8vIFJlZnJlc2ggaG9zdCBkcm9wZG93biBpZiB3ZSBkb24ndCBoYXZlIGl0IHlldFxuICAgICAgaWYgKCFmaWx0ZXJIb3N0Lm9wdGlvbnMubGVuZ3RoIHx8IGZpbHRlckhvc3Qub3B0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgYXdhaXQgcmVmcmVzaEhvc3RGaWx0ZXIoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWV2ZW50cy1jb250YWluZXInKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+TG9hZCBmYWlsZWQ6ICcrZXNjYXBlSHRtbChlLm1lc3NhZ2UpKyc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckV2ZW50cygpIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtZXZlbnRzLWNvbnRhaW5lcicpO1xuICAgIGlmICghYWxsRXZlbnRzLmxlbmd0aCkgeyBlbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+Tm8gZXZlbnRzPC9kaXY+JzsgcmV0dXJuOyB9XG4gICAgZWwuaW5uZXJIVE1MID0gYWxsRXZlbnRzLnNsaWNlKDAsIDIwMCkubWFwKHJlbmRlckV2ZW50Um93KS5qb2luKCcnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckV2ZW50Um93KGV2KSB7XG4gICAgY29uc3Qgc2V2ID0gZXYuc2V2ZXJpdHkgfHwgJ2luZm8nO1xuICAgIGNvbnN0IHNldkNvbG9yID0ge1xuICAgICAgY3JpdGljYWw6ICcjYzAzOTJiJywgZXJyb3I6ICcjZTc0YzNjJywgd2FybjogJyNmMzljMTInLFxuICAgICAgbm90aWNlOiAnIzM0OThkYicsIGluZm86ICcjN2Y4YzhkJyxcbiAgICB9W3Nldl0gfHwgJyM3ZjhjOGQnO1xuICAgIGNvbnN0IHRpbWUgPSBldi50cyA/IG5ldyBEYXRlKGV2LnRzKS50b0xvY2FsZVRpbWVTdHJpbmcoKSA6ICcnO1xuICAgIGNvbnN0IHNvdXJjZSA9IGV2LnNvdXJjZV90eXBlIHx8ICcnO1xuICAgIGNvbnN0IGFjdG9yID0gZXYuYWN0b3IgfHwgJ1x1MjAxNCc7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXYudGFyZ2V0IHx8ICcnO1xuICAgIGNvbnN0IGFjdGlvbiA9IGV2LmFjdGlvbiB8fCAnJztcbiAgICBjb25zdCBvdXRjb21lID0gZXYub3V0Y29tZSB8fCAnJztcbiAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJzZWMtZXZlbnQtcm93XCIgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjg0cHggODBweCAxZnIgMWZyIDEwMHB4IDkwcHg7Z2FwOjhweDtwYWRkaW5nOjVweCA4cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKTtmb250LXNpemU6MC44MnJlbTthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiR7c2V2Q29sb3J9O2ZvbnQtd2VpZ2h0OjYwMDtcIj4ke2VzY2FwZUh0bWwoc2V2KX08L3NwYW4+XG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MC43NXJlbTtcIj4ke2VzY2FwZUh0bWwoc291cmNlKX08L3NwYW4+XG4gICAgICA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChhY3Rvcil9XCIgc3R5bGU9XCJvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtlc2NhcGVIdG1sKGFjdG9yKX08L3NwYW4+XG4gICAgICA8c3BhbiB0aXRsZT1cIiR7ZXNjYXBlSHRtbCh0YXJnZXQpfVwiIHN0eWxlPVwib3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjYXBlSHRtbChhY3Rpb24pfSAke2VzY2FwZUh0bWwodGFyZ2V0KX08L3NwYW4+XG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MC43NXJlbTtcIj4ke2VzY2FwZUh0bWwob3V0Y29tZSl9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuNzVyZW07dGV4dC1hbGlnbjpyaWdodDtcIj4ke2VzY2FwZUh0bWwodGltZSl9PC9zcGFuPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoSG9zdEZpbHRlcigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2VjdXJpdHkvaG9zdHMnKTtcbiAgICAgIGNvbnN0IGhvc3RzID0gKGF3YWl0IHJlcy5qc29uKCkpLmRhdGE/Lmhvc3RzIHx8IFtdO1xuICAgICAgY29uc3QgY3VycmVudCA9IGZpbHRlckhvc3QudmFsdWU7XG4gICAgICBmaWx0ZXJIb3N0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+QWxsIGhvc3RzPC9vcHRpb24+JyArXG4gICAgICAgIGhvc3RzLm1hcChoID0+IGA8b3B0aW9uIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGguaWQpfVwiPiR7ZXNjYXBlSHRtbChoLmxhYmVsIHx8IGguaWQpfTwvb3B0aW9uPmApLmpvaW4oJycpO1xuICAgICAgaWYgKGN1cnJlbnQpIGZpbHRlckhvc3QudmFsdWUgPSBjdXJyZW50O1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT0gSE9TVFMgPT09PT09PT09PT09PVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWhvc3QtcmVnaXN0ZXItYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZWdpc3Rlckhvc3RQcm9tcHQpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWhvc3RzLXJlZnJlc2gnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlZnJlc2hIb3N0cyk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEhvc3RzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zZWN1cml0eS9ob3N0cycpO1xuICAgICAgY29uc3QgaG9zdHMgPSAoYXdhaXQgcmVzLmpzb24oKSkuZGF0YT8uaG9zdHMgfHwgW107XG4gICAgICBhbGxIb3N0cyA9IGhvc3RzO1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWhvc3RzLWNvbnRhaW5lcicpO1xuICAgICAgaWYgKCFob3N0cy5sZW5ndGgpIHsgZWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPk5vIGhvc3RzIHJlZ2lzdGVyZWQuIENsaWNrIFx1Mjc5NSBSZWdpc3RlciBIb3N0IHRvIGFkZCBvbmUuPC9kaXY+JzsgcmV0dXJuOyB9XG4gICAgICBlbC5pbm5lckhUTUwgPSBob3N0cy5tYXAoaCA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9ICFoLmVuYWJsZWQgPyAnXHVEODNEXHVERDM0IGRpc2FibGVkJ1xuICAgICAgICAgICAgICAgICAgICAgOiAhaC5sYXN0X3NlZW5fYXQgPyAnXHUyNkFBIHJlZ2lzdGVyZWQnXG4gICAgICAgICAgICAgICAgICAgICA6IChEYXRlLm5vdygpIC0gRGF0ZS5wYXJzZShoLmxhc3Rfc2Vlbl9hdCkgPiAzMCo2MCoxMDAwKSA/ICdcdUQ4M0RcdURGRTEgc3RhbGUnXG4gICAgICAgICAgICAgICAgICAgICA6ICdcdUQ4M0RcdURGRTIgb25saW5lJztcbiAgICAgICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwicGFkZGluZzoxMHB4IDEycHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKTtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO1wiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8c3Ryb25nPiR7ZXNjYXBlSHRtbChoLmxhYmVsIHx8IGguaWQpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7bWFyZ2luLWxlZnQ6OHB4O2ZvbnQtc2l6ZTowLjhyZW07XCI+JHtlc2NhcGVIdG1sKGgudHlwZSl9PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MC43OHJlbTttYXJnaW4tdG9wOjJweDtcIj5cbiAgICAgICAgICAgICAgaWQ6ICR7ZXNjYXBlSHRtbChoLmlkKX0gXHUwMEI3XG4gICAgICAgICAgICAgIHJlZ2lzdGVyZWQgJHtuZXcgRGF0ZShoLnJlZ2lzdGVyZWRfYXQpLnRvTG9jYWxlRGF0ZVN0cmluZygpfSBcdTAwQjdcbiAgICAgICAgICAgICAgbGFzdCBzZWVuICR7aC5sYXN0X3NlZW5fYXQgPyBuZXcgRGF0ZShoLmxhc3Rfc2Vlbl9hdCkudG9Mb2NhbGVTdHJpbmcoKSA6ICduZXZlcid9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MC44NXJlbTttYXJnaW4tcmlnaHQ6MTJweDtcIj4ke3N0YXR1c308L3NwYW4+XG4gICAgICAgICAgICAke2guaWQgPT09ICdzZWxmJyA/ICcnIDogYDxidXR0b24gY2xhc3M9XCJidG4tc20gc2VjLWhvc3QtZGVsXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChoLmlkKX1cIiBzdHlsZT1cImNvbG9yOnZhcigtLWJhZC1mZyk7XCI+UmVtb3ZlPC9idXR0b24+YH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIH0pLmpvaW4oJycpO1xuXG4gICAgICBlbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VjLWhvc3QtZGVsJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtKGBSZW1vdmUgaG9zdCAke2J0bi5kYXRhc2V0LmlkfT8gRXZlbnRzIGFscmVhZHkgcmVjZWl2ZWQgd2lsbCByZW1haW4gaW4gdGhlIHN0b3JlLmApKSByZXR1cm47XG4gICAgICAgICAgYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2VjdXJpdHkvaG9zdHMvJHtlbmNvZGVVUklDb21wb25lbnQoYnRuLmRhdGFzZXQuaWQpfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgICAgICByZWZyZXNoSG9zdHMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWhvc3RzLWNvbnRhaW5lcicpLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5Mb2FkIGZhaWxlZDogJytlc2NhcGVIdG1sKGUubWVzc2FnZSkrJzwvZGl2Pic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJIb3N0UHJvbXB0KCkge1xuICAgIGNvbnN0IGlkID0gcHJvbXB0KCdIb3N0IGlkIChsb3dlcmNhc2UsIG5vIHNwYWNlcyk6Jyk7XG4gICAgaWYgKCFpZCkgcmV0dXJuO1xuICAgIGNvbnN0IGxhYmVsID0gcHJvbXB0KCdEaXNwbGF5IGxhYmVsOicsIGlkKSB8fCBpZDtcbiAgICBjb25zdCB0eXBlICA9IHByb21wdCgnVHlwZSAoXCJkYXNoY2FkZHlcIiwgXCJzZXJ2aWNlXCIsIG9yIFwiYWdlbnRcIik6JywgJ2FnZW50JykgfHwgJ2FnZW50JztcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2VjdXJpdHkvaG9zdHMnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpZCwgbGFiZWwsIHR5cGUgfSksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFyZXMub2spIHsgYWxlcnQoJ0ZhaWxlZDogJyArIChkYXRhPy5lcnJvcj8ubWVzc2FnZSB8fCByZXMuc3RhdHVzVGV4dCkpOyByZXR1cm47IH1cbiAgICAgIC8vIFNob3cgdGhlIGFwaV9rZXkgT05DRSBpbiBhIGRpYWxvZ1xuICAgICAgYWxlcnQoYFx1MjcwNSBIb3N0IHJlZ2lzdGVyZWQhXFxuXFxuaWQ6ICR7ZGF0YS5kYXRhLmhvc3QuaWR9XFxubGFiZWw6ICR7ZGF0YS5kYXRhLmhvc3QubGFiZWx9XFxudHlwZTogJHtkYXRhLmRhdGEuaG9zdC50eXBlfVxcblxcblx1RDgzRFx1REQxMSBBUEkgS0VZIChzYXZlIHRoaXMgTk9XIFx1MjAxNCB3b24ndCBiZSBzaG93biBhZ2Fpbik6XFxuXFxuJHtkYXRhLmRhdGEuYXBpX2tleX1cXG5cXG5TZW5kIHRoaXMga2V5IGFzOiBBdXRob3JpemF0aW9uOiBCZWFyZXIgPGFwaV9rZXk+XFxuVG8gZW5kcG9pbnQ6IFBPU1QgL2FwaS92MS9zZWN1cml0eS9ldmVudHMvaW5nZXN0IG9yIC9ldmVudHMvYmF0Y2hgKTtcbiAgICAgIHJlZnJlc2hIb3N0cygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGFsZXJ0KCdGYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT0gSEVMUEVSUyA9PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIGVzY2FwZUh0bWwocykge1xuICAgIHJldHVybiBTdHJpbmcocykucmVwbGFjZSgvWyY8PlwiJ10vZywgYyA9PiAoeycmJzonJmFtcDsnLCc8JzonJmx0OycsJz4nOicmZ3Q7JywnXCInOicmcXVvdDsnLFwiJ1wiOicmIzM5Oyd9W2NdKSk7XG4gIH1cbiAgZnVuY3Rpb24gZGVib3VuY2UoZm4sIG1zKSB7XG4gICAgbGV0IHQ7IHJldHVybiBmdW5jdGlvbigpIHsgY2xlYXJUaW1lb3V0KHQpOyB0ID0gc2V0VGltZW91dCgoKSA9PiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBtcyk7IH07XG4gIH1cbn0pKCk7O1xuLy8gPT09PT09PT09PSBXRUFUSEVSIFdJREdFVCA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ3dlYXRoZXItbW9kYWwnLCBgPGRpdiBpZD1cIndlYXRoZXItbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj48ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCI+PGgzPldlYXRoZXIgU2V0dGluZ3M8L2gzPlxuICAgIDxsYWJlbCBmb3I9XCJ3ZWF0aGVyLWxvY2F0aW9uLWlucHV0XCI+TG9jYXRpb246PC9sYWJlbD5cbiAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIndlYXRoZXItbG9jYXRpb24taW5wdXRcIiBwbGFjZWhvbGRlcj1cIkNpdHkgbmFtZSBvciBaSVAgKGUuZy4sIEhhbWJ1cmcsIDkwMjEwKVwiIG1heGxlbmd0aD1cIjEwMFwiPlxuICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj5FbnRlciBhIGNpdHkgbmFtZSwgcG9zdGFsIGNvZGUsIG9yICZsZHF1bztDaXR5LCBDb3VudHJ5JnJkcXVvOzwvZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNHB4OyBwYWRkaW5nLXRvcDogMTJweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogOHB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tZmcpO1wiPlVuaXRzPC9sYWJlbD5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwid2VhdGhlci11bml0LW9wdGlvblwiPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwid2VhdGhlci11bml0LXJhZGlvXCIgdmFsdWU9XCJpbXBlcmlhbFwiPjxzcGFuIGNsYXNzPVwid2VhdGhlci11bml0LWNhcmRcIj4mZGVnO0YgLyBtcGg8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwid2VhdGhlci11bml0LW9wdGlvblwiPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwid2VhdGhlci11bml0LXJhZGlvXCIgdmFsdWU9XCJtZXRyaWNcIj48c3BhbiBjbGFzcz1cIndlYXRoZXItdW5pdC1jYXJkXCI+JmRlZztDIC8ga20vaDwvc3Bhbj48L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiPjxidXR0b24gaWQ9XCJ3ZWF0aGVyLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPjxidXR0b24gaWQ9XCJ3ZWF0aGVyLXNhdmVcIj5TYXZlPC9idXR0b24+PC9kaXY+PC9kaXY+PC9kaXY+YCk7XG5cbiAgLyogV2VhdGhlciBXaWRnZXQgXHUyMDE0IHBvd2VyZWQgYnkgT3Blbi1NZXRlbyAoZnJlZSwgbm8gQVBJIGtleSkgKi9cbiAgY29uc3QgTE9DQVRJT05fS0VZID0gJ3dlYXRoZXItbG9jYXRpb24nO1xuICBjb25zdCBMRUdBQ1lfS0VZID0gJ3dlYXRoZXItemlwJztcbiAgY29uc3QgR0VPX0NBQ0hFX0tFWSA9ICd3ZWF0aGVyLWdlbyc7XG4gIGNvbnN0IFVOSVRfS0VZID0gJ3dlYXRoZXItdW5pdCc7XG5cbiAgLy8gTWlncmF0ZSBmcm9tIG9sZCBaSVAtb25seSBrZXlcbiAgaWYgKCFzYWZlR2V0KExPQ0FUSU9OX0tFWSkgJiYgc2FmZUdldChMRUdBQ1lfS0VZKSkge1xuICAgIHNhZmVTZXQoTE9DQVRJT05fS0VZLCBzYWZlR2V0KExFR0FDWV9LRVkpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFVuaXQoKSB7XG4gICAgcmV0dXJuIHNhZmVHZXQoVU5JVF9LRVkpIHx8ICdpbXBlcmlhbCc7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRXZWF0aGVyRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGljb246IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53ZWF0aGVyLWljb24nKSxcbiAgICAgIHRlbXA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53ZWF0aGVyLXRlbXAnKSxcbiAgICAgIGNvbmRpdGlvbjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItY29uZGl0aW9uJyksXG4gICAgICBsb2NhdGlvbjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItbG9jYXRpb24nKSxcbiAgICAgIHdpbmQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53ZWF0aGVyLXdpbmQnKVxuICAgIH07XG4gIH1cblxuICAvLyBXTU8gV2VhdGhlciBDb2RlIG1hcHBpbmdcbiAgY29uc3Qgd21vRGVzY3JpcHRpb25zID0ge1xuICAgIDA6ICdDbGVhciBza3knLCAxOiAnTWFpbmx5IGNsZWFyJywgMjogJ1BhcnRseSBjbG91ZHknLCAzOiAnT3ZlcmNhc3QnLFxuICAgIDQ1OiAnRm9nJywgNDg6ICdSaW1lIGZvZycsXG4gICAgNTE6ICdMaWdodCBkcml6emxlJywgNTM6ICdEcml6emxlJywgNTU6ICdEZW5zZSBkcml6emxlJyxcbiAgICA1NjogJ0ZyZWV6aW5nIGRyaXp6bGUnLCA1NzogJ0RlbnNlIGZyZWV6aW5nIGRyaXp6bGUnLFxuICAgIDYxOiAnTGlnaHQgcmFpbicsIDYzOiAnTW9kZXJhdGUgcmFpbicsIDY1OiAnSGVhdnkgcmFpbicsXG4gICAgNjY6ICdMaWdodCBmcmVlemluZyByYWluJywgNjc6ICdIZWF2eSBmcmVlemluZyByYWluJyxcbiAgICA3MTogJ0xpZ2h0IHNub3cnLCA3MzogJ01vZGVyYXRlIHNub3cnLCA3NTogJ0hlYXZ5IHNub3cnLCA3NzogJ1Nub3cgZ3JhaW5zJyxcbiAgICA4MDogJ0xpZ2h0IHNob3dlcnMnLCA4MTogJ01vZGVyYXRlIHNob3dlcnMnLCA4MjogJ1Zpb2xlbnQgc2hvd2VycycsXG4gICAgODU6ICdMaWdodCBzbm93IHNob3dlcnMnLCA4NjogJ0hlYXZ5IHNub3cgc2hvd2VycycsXG4gICAgOTU6ICdUaHVuZGVyc3Rvcm0nLCA5NjogJ1RodW5kZXJzdG9ybSB3aXRoIGhhaWwnLCA5OTogJ1NldmVyZSB0aHVuZGVyc3Rvcm0nXG4gIH07XG5cbiAgY29uc3Qgd21vSWNvbnMgPSB7XG4gICAgMDogJ1x1MjYwMFx1RkUwRicsIDE6ICdcdUQ4M0NcdURGMjRcdUZFMEYnLCAyOiAnXHUyNkM1JywgMzogJ1x1MjYwMVx1RkUwRicsXG4gICAgNDU6ICdcdUQ4M0NcdURGMkJcdUZFMEYnLCA0ODogJ1x1RDgzQ1x1REYyQlx1RkUwRicsXG4gICAgNTE6ICdcdUQ4M0NcdURGMjZcdUZFMEYnLCA1MzogJ1x1RDgzQ1x1REYyNlx1RkUwRicsIDU1OiAnXHVEODNDXHVERjI2XHVGRTBGJyxcbiAgICA1NjogJ1x1RDgzQ1x1REYyOFx1RkUwRicsIDU3OiAnXHVEODNDXHVERjI4XHVGRTBGJyxcbiAgICA2MTogJ1x1RDgzQ1x1REYyNlx1RkUwRicsIDYzOiAnXHVEODNDXHVERjI3XHVGRTBGJywgNjU6ICdcdUQ4M0NcdURGMjdcdUZFMEYnLFxuICAgIDY2OiAnXHVEODNDXHVERjI4XHVGRTBGJywgNjc6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLFxuICAgIDcxOiAnXHVEODNDXHVERjI4XHVGRTBGJywgNzM6ICdcdTI3NDRcdUZFMEYnLCA3NTogJ1x1Mjc0NFx1RkUwRicsIDc3OiAnXHUyNzQ0XHVGRTBGJyxcbiAgICA4MDogJ1x1RDgzQ1x1REYyNlx1RkUwRicsIDgxOiAnXHVEODNDXHVERjI3XHVGRTBGJywgODI6ICdcdUQ4M0NcdURGMjdcdUZFMEYnLFxuICAgIDg1OiAnXHVEODNDXHVERjI4XHVGRTBGJywgODY6ICdcdTI3NDRcdUZFMEYnLFxuICAgIDk1OiAnXHUyNkM4XHVGRTBGJywgOTY6ICdcdTI2QzhcdUZFMEYnLCA5OTogJ1x1MjZDOFx1RkUwRidcbiAgfTtcblxuICAvLyBXaW5kIGRpcmVjdGlvbiBmcm9tIGRlZ3JlZXNcbiAgY29uc3Qgd2luZERpcnMgPSBbJ04nLCdOTkUnLCdORScsJ0VORScsJ0UnLCdFU0UnLCdTRScsJ1NTRScsJ1MnLCdTU1cnLCdTVycsJ1dTVycsJ1cnLCdXTlcnLCdOVycsJ05OVyddO1xuICBmdW5jdGlvbiBkZWdUb0RpcihkZWcpIHtcbiAgICByZXR1cm4gd2luZERpcnNbTWF0aC5yb3VuZChkZWcgLyAyMi41KSAlIDE2XTtcbiAgfVxuXG4gIC8vIEdlb2NvZGUgbG9jYXRpb24gdmlhIE9wZW4tTWV0ZW8sIHdpdGggbG9jYWxTdG9yYWdlIGNhY2hlXG4gIGFzeW5jIGZ1bmN0aW9uIGdlb2NvZGVMb2NhdGlvbihxdWVyeSkge1xuICAgIGNvbnN0IGNhY2hlZCA9IHNhZmVHZXQoR0VPX0NBQ0hFX0tFWSk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZ2VvID0gSlNPTi5wYXJzZShjYWNoZWQpO1xuICAgICAgICBpZiAoZ2VvLnF1ZXJ5ID09PSBxdWVyeSkgcmV0dXJuIGdlbztcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKGBodHRwczovL2dlb2NvZGluZy1hcGkub3Blbi1tZXRlby5jb20vdjEvc2VhcmNoP25hbWU9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfSZjb3VudD0xJmxhbmd1YWdlPWVuJmZvcm1hdD1qc29uYCk7XG4gICAgaWYgKCFyZXNwLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ0dlb2NvZGluZyBmYWlsZWQnKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgaWYgKCFkYXRhLnJlc3VsdHMgfHwgIWRhdGEucmVzdWx0cy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignTG9jYXRpb24gbm90IGZvdW5kJyk7XG4gICAgY29uc3QgciA9IGRhdGEucmVzdWx0c1swXTtcbiAgICBjb25zdCBnZW8gPSB7XG4gICAgICBxdWVyeSxcbiAgICAgIGxhdDogci5sYXRpdHVkZSxcbiAgICAgIGxvbjogci5sb25naXR1ZGUsXG4gICAgICBjaXR5OiByLm5hbWUsXG4gICAgICBzdGF0ZTogci5hZG1pbjEgfHwgJycsXG4gICAgICBjb3VudHJ5OiByLmNvdW50cnkgfHwgJycsXG4gICAgICBjb3VudHJ5Q29kZTogci5jb3VudHJ5X2NvZGUgfHwgJydcbiAgICB9O1xuICAgIHNhZmVTZXQoR0VPX0NBQ0hFX0tFWSwgSlNPTi5zdHJpbmdpZnkoZ2VvKSk7XG4gICAgcmV0dXJuIGdlbztcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdExvY2F0aW9uKGdlbykge1xuICAgIC8vIEZvciBVUyBsb2NhdGlvbnMgc2hvdyBcIkNpdHksIFN0YXRlXCIsIGZvciBvdGhlcnMgc2hvdyBcIkNpdHksIENvdW50cnlcIlxuICAgIGlmIChnZW8uY291bnRyeUNvZGUgPT09ICdVUycgJiYgZ2VvLnN0YXRlKSB7XG4gICAgICByZXR1cm4gYCR7Z2VvLmNpdHl9LCAke2dlby5zdGF0ZX1gO1xuICAgIH1cbiAgICBpZiAoZ2VvLmNvdW50cnkpIHtcbiAgICAgIHJldHVybiBgJHtnZW8uY2l0eX0sICR7Z2VvLmNvdW50cnl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGdlby5jaXR5O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hXZWF0aGVyKGxvY2F0aW9uKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdlbyA9IGF3YWl0IGdlb2NvZGVMb2NhdGlvbihsb2NhdGlvbik7XG4gICAgICBjb25zdCB1bml0ID0gZ2V0VW5pdCgpO1xuICAgICAgY29uc3QgdGVtcFVuaXQgPSB1bml0ID09PSAnbWV0cmljJyA/ICdjZWxzaXVzJyA6ICdmYWhyZW5oZWl0JztcbiAgICAgIGNvbnN0IHdpbmRVbml0ID0gdW5pdCA9PT0gJ21ldHJpYycgPyAna21oJyA6ICdtcGgnO1xuICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXBpLm9wZW4tbWV0ZW8uY29tL3YxL2ZvcmVjYXN0P2xhdGl0dWRlPSR7Z2VvLmxhdH0mbG9uZ2l0dWRlPSR7Z2VvLmxvbn0mY3VycmVudD10ZW1wZXJhdHVyZV8ybSx3ZWF0aGVyX2NvZGUsd2luZF9zcGVlZF8xMG0sd2luZF9kaXJlY3Rpb25fMTBtJnRlbXBlcmF0dXJlX3VuaXQ9JHt0ZW1wVW5pdH0md2luZF9zcGVlZF91bml0PSR7d2luZFVuaXR9YDtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgaWYgKCFyZXNwLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ1dlYXRoZXIgZmV0Y2ggZmFpbGVkJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBjb25zdCBjID0gZGF0YS5jdXJyZW50O1xuICAgICAgY29uc3QgY29kZSA9IGMud2VhdGhlcl9jb2RlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVtcDogTWF0aC5yb3VuZChjLnRlbXBlcmF0dXJlXzJtKSxcbiAgICAgICAgY29uZGl0aW9uOiB3bW9EZXNjcmlwdGlvbnNbY29kZV0gfHwgJ1Vua25vd24nLFxuICAgICAgICBpY29uOiB3bW9JY29uc1tjb2RlXSB8fCAnXHVEODNDXHVERjI0XHVGRTBGJyxcbiAgICAgICAgbG9jYXRpb25TdHI6IGZvcm1hdExvY2F0aW9uKGdlbyksXG4gICAgICAgIHdpbmRTcGVlZDogTWF0aC5yb3VuZChjLndpbmRfc3BlZWRfMTBtKSxcbiAgICAgICAgd2luZERpcjogZGVnVG9EaXIoYy53aW5kX2RpcmVjdGlvbl8xMG0pLFxuICAgICAgICB1bml0XG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1dlYXRoZXIgZmV0Y2ggZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVdlYXRoZXIoKSB7XG4gICAgY29uc3Qgd2VhdGhlcldpZGdldCA9IGdldFdlYXRoZXJFbGVtZW50cygpO1xuICAgIGlmICghd2VhdGhlcldpZGdldC5pY29uIHx8ICF3ZWF0aGVyV2lkZ2V0LnRlbXAgfHwgIXdlYXRoZXJXaWRnZXQuY29uZGl0aW9uIHx8ICF3ZWF0aGVyV2lkZ2V0LmxvY2F0aW9uIHx8ICF3ZWF0aGVyV2lkZ2V0LndpbmQpIHtcbiAgICAgIGNvbnNvbGUud2FybignV2VhdGhlciB3aWRnZXQgZWxlbWVudHMgbm90IGZvdW5kJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbG9jYXRpb24gPSBzYWZlR2V0KExPQ0FUSU9OX0tFWSk7XG4gICAgaWYgKCFsb2NhdGlvbikge1xuICAgICAgd2VhdGhlcldpZGdldC5sb2NhdGlvbi50ZXh0Q29udGVudCA9ICdTZXQgTG9jYXRpb24nO1xuICAgICAgd2VhdGhlcldpZGdldC50ZW1wLnRleHRDb250ZW50ID0gJy0tXFx1MDBCMCc7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LmNvbmRpdGlvbi50ZXh0Q29udGVudCA9ICdDbGljayBcXHUyNjk5XFx1RkUwRiB0byBjb25maWd1cmUnO1xuICAgICAgd2VhdGhlcldpZGdldC53aW5kLnRleHRDb250ZW50ID0gJy0tJztcbiAgICAgIHdlYXRoZXJXaWRnZXQuaWNvbi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJ3ZWF0aGVyLWVtb2ppXCI+XFx1RDgzQ1xcdURGMjRcXHVGRTBGPC9zcGFuPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlYXRoZXIgPSBhd2FpdCBmZXRjaFdlYXRoZXIobG9jYXRpb24pO1xuICAgICAgaWYgKHdlYXRoZXIpIHtcbiAgICAgICAgY29uc3QgdGVtcFN1ZmZpeCA9IHdlYXRoZXIudW5pdCA9PT0gJ21ldHJpYycgPyAnXFx1MDBCMEMnIDogJ1xcdTAwQjBGJztcbiAgICAgICAgY29uc3Qgd2luZExhYmVsID0gd2VhdGhlci51bml0ID09PSAnbWV0cmljJyA/ICdrbS9oJyA6ICdtcGgnO1xuICAgICAgICB3ZWF0aGVyV2lkZ2V0LmxvY2F0aW9uLnRleHRDb250ZW50ID0gd2VhdGhlci5sb2NhdGlvblN0cjtcbiAgICAgICAgd2VhdGhlcldpZGdldC50ZW1wLnRleHRDb250ZW50ID0gYCR7d2VhdGhlci50ZW1wfSR7dGVtcFN1ZmZpeH1gO1xuICAgICAgICB3ZWF0aGVyV2lkZ2V0LmNvbmRpdGlvbi50ZXh0Q29udGVudCA9IHdlYXRoZXIuY29uZGl0aW9uO1xuICAgICAgICB3ZWF0aGVyV2lkZ2V0LndpbmQudGV4dENvbnRlbnQgPSBgV2luZDogJHt3ZWF0aGVyLndpbmRTcGVlZH0gJHt3aW5kTGFiZWx9ICR7d2VhdGhlci53aW5kRGlyfWA7XG4gICAgICAgIHdlYXRoZXJXaWRnZXQuaWNvbi5pbm5lckhUTUwgPSBgPHNwYW4gY2xhc3M9XCJ3ZWF0aGVyLWVtb2ppXCI+JHtlc2NhcGVIdG1sKHdlYXRoZXIuaWNvbil9PC9zcGFuPmA7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1dlYXRoZXJdIFVwZGF0ZSBFcnJvcicsIGVycm9yLCB7IGZ1bmN0aW9uOiAndXBkYXRlV2VhdGhlcicgfSk7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LmxvY2F0aW9uLnRleHRDb250ZW50ID0gJ1dlYXRoZXIgRXJyb3InO1xuICAgICAgd2VhdGhlcldpZGdldC50ZW1wLnRleHRDb250ZW50ID0gJ0Vycm9yJztcbiAgICAgIHdlYXRoZXJXaWRnZXQuY29uZGl0aW9uLnRleHRDb250ZW50ID0gJ0ZhaWxlZCB0byBsb2FkJztcbiAgICAgIHdlYXRoZXJXaWRnZXQud2luZC50ZXh0Q29udGVudCA9ICctLSc7XG4gICAgfVxuICB9XG5cbiAgLy8gV2VhdGhlciBzZXR0aW5ncyBtb2RhbFxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWF0aGVyLW1vZGFsJyk7XG4gIGNvbnN0IGxvY2F0aW9uSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VhdGhlci1sb2NhdGlvbi1pbnB1dCcpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWF0aGVyLXNldHRpbmdzJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvY2F0aW9uSW5wdXQudmFsdWUgPSBzYWZlR2V0KExPQ0FUSU9OX0tFWSkgfHwgJyc7XG4gICAgLy8gU2V0IHVuaXQgcmFkaW9cbiAgICBjb25zdCB1bml0ID0gZ2V0VW5pdCgpO1xuICAgIGNvbnN0IHJhZGlvID0gbW9kYWwucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT1cIndlYXRoZXItdW5pdC1yYWRpb1wiXVt2YWx1ZT1cIiR7dW5pdH1cIl1gKTtcbiAgICBpZiAocmFkaW8pIHJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2NhdGlvbklucHV0LmZvY3VzKCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWF0aGVyLWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWF0aGVyLXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY29uc3QgbG9jID0gbG9jYXRpb25JbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYgKGxvYykge1xuICAgICAgLy8gQ2xlYXIgZ2VvIGNhY2hlIHdoZW4gbG9jYXRpb24gY2hhbmdlcyBzbyBpdCByZS1nZW9jb2Rlc1xuICAgICAgY29uc3Qgb2xkTG9jID0gc2FmZUdldChMT0NBVElPTl9LRVkpO1xuICAgICAgaWYgKG9sZExvYyAhPT0gbG9jKSBzYWZlU2V0KEdFT19DQUNIRV9LRVksICcnKTtcbiAgICAgIHNhZmVTZXQoTE9DQVRJT05fS0VZLCBsb2MpO1xuICAgICAgLy8gU2F2ZSB1bml0IHByZWZlcmVuY2VcbiAgICAgIGNvbnN0IHVuaXRSYWRpbyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJ3ZWF0aGVyLXVuaXQtcmFkaW9cIl06Y2hlY2tlZCcpO1xuICAgICAgY29uc3QgbmV3VW5pdCA9IHVuaXRSYWRpbyA/IHVuaXRSYWRpby52YWx1ZSA6ICdpbXBlcmlhbCc7XG4gICAgICBjb25zdCBvbGRVbml0ID0gZ2V0VW5pdCgpO1xuICAgICAgc2FmZVNldChVTklUX0tFWSwgbmV3VW5pdCk7XG4gICAgICAvLyBDbGVhciBnZW8gY2FjaGUgaWYgdW5pdCBjaGFuZ2VkIChuZWVkIGZyZXNoIHdlYXRoZXIgZGF0YSlcbiAgICAgIGlmIChvbGRVbml0ICE9PSBuZXdVbml0KSBzYWZlU2V0KEdFT19DQUNIRV9LRVksICcnKTtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIHVwZGF0ZVdlYXRoZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgbG9jYXRpb24gKGUuZy4sIEhhbWJ1cmcsIExvbmRvbiwgOTAyMTApJywgJ3dhcm5pbmcnKTtcbiAgICB9XG4gIH0pO1xuXG4gIHdpcmVNb2RhbChtb2RhbCk7XG5cbiAgLy8gQ2xvc2UgbW9kYWwgb24gRXNjYXBlIGtleVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIG1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSB7XG4gICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBJbml0aWFsaXplIHdlYXRoZXJcbiAgdXBkYXRlV2VhdGhlcigpO1xuICAvLyBVcGRhdGUgd2VhdGhlciBldmVyeSAxMCBtaW51dGVzXG4gIHNldEludGVydmFsKHVwZGF0ZVdlYXRoZXIsIERDLlBPTEwuV0VBVEhFUik7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBESUdJVEFMIENMT0NLIFdJREdFVCA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IHdpZGdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay13aWRnZXQnKTtcbiAgY29uc3QgcmVuZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb2NrLXJlbmRlcicpO1xuICBpZiAoIXdpZGdldCB8fCAhcmVuZGVyKSByZXR1cm47XG5cbiAgY29uc3QgREFZUyA9IFsnU3VuZGF5JywnTW9uZGF5JywnVHVlc2RheScsJ1dlZG5lc2RheScsJ1RodXJzZGF5JywnRnJpZGF5JywnU2F0dXJkYXknXTtcbiAgY29uc3QgTU9OVEhTID0gWydKYW51YXJ5JywnRmVicnVhcnknLCdNYXJjaCcsJ0FwcmlsJywnTWF5JywnSnVuZScsJ0p1bHknLCdBdWd1c3QnLCdTZXB0ZW1iZXInLCdPY3RvYmVyJywnTm92ZW1iZXInLCdEZWNlbWJlciddO1xuICBjb25zdCBST01BTiA9IFsnWElJJywnSScsJ0lJJywnSUlJJywnSVYnLCdWJywnVkknLCdWSUknLCdWSUlJJywnSVgnLCdYJywnWEknXTtcblxuICBsZXQgY3VycmVudFN0eWxlID0gc2FmZUdldCgnY2xvY2stc3R5bGUnKSB8fCAnZGVmYXVsdCc7XG4gIGxldCBsYXN0Q2hpbWVIb3VyID0gLTE7XG4gIGxldCBjaGltZVBsYXlpbmcgPSBmYWxzZTtcbiAgbGV0IHByZXZGbGlwRGlnaXRzID0gJyc7XG4gIGxldCBhY3RpdmVMYXlvdXQgPSAnJztcbiAgbGV0IGRpZ2l0YWxSZWZzID0gbnVsbDtcbiAgbGV0IHRpY2tUaW1lciA9IG51bGw7XG5cbiAgLy8gPT09PT0gQ0hJTUVTID09PT09XG4gIGZ1bmN0aW9uIHBsYXlDaGltZXMoY291bnQpIHtcbiAgICBpZiAoY2hpbWVQbGF5aW5nKSByZXR1cm47XG4gICAgaWYgKHNhZmVHZXQoJ2Nsb2NrLWNoaW1lcycpICE9PSAndHJ1ZScpIHJldHVybjtcbiAgICBjaGltZVBsYXlpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHZvbCA9IHBhcnNlSW50KHNhZmVHZXQoJ2Nsb2NrLWNoaW1lLXZvbHVtZScpIHx8ICc1MCcsIDEwKSAvIDEwMDtcbiAgICBsZXQgaSA9IDA7XG4gICAgZnVuY3Rpb24gc3RyaWtlKCkge1xuICAgICAgaWYgKGkgPj0gY291bnQpIHsgY2hpbWVQbGF5aW5nID0gZmFsc2U7IHJldHVybjsgfVxuICAgICAgY29uc3QgYmVsbCA9IG5ldyBBdWRpbygnL2Fzc2V0cy9zb3VuZHMvY2h1cmNoLWJlbGwubXAzJyk7XG4gICAgICBiZWxsLnZvbHVtZSA9IHZvbDtcbiAgICAgIGJlbGwucGxheSgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIGkrKztcbiAgICAgIGlmIChpIDwgY291bnQpIHNldFRpbWVvdXQoc3RyaWtlLCAyNTAwKTtcbiAgICAgIGVsc2Ugc2V0VGltZW91dCgoKSA9PiB7IGNoaW1lUGxheWluZyA9IGZhbHNlOyB9LCAyNTAwKTtcbiAgICB9XG4gICAgc3RyaWtlKCk7XG4gIH1cblxuICAvLyA9PT09PSBEQVRFIFNUUklORyA9PT09PVxuICBmdW5jdGlvbiBkYXRlU3RyKG5vdykge1xuICAgIHJldHVybiBEQVlTW25vdy5nZXREYXkoKV0gKyAnLCAnICsgTU9OVEhTW25vdy5nZXRNb250aCgpXSArICcgJyArIG5vdy5nZXREYXRlKCkgKyAnLCAnICsgbm93LmdldEZ1bGxZZWFyKCk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFJlbmRlckxheW91dCgpIHtcbiAgICBhY3RpdmVMYXlvdXQgPSAnJztcbiAgICBkaWdpdGFsUmVmcyA9IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBlbnN1cmVEaWdpdGFsTGF5b3V0KCkge1xuICAgIGlmIChhY3RpdmVMYXlvdXQgIT09ICdkaWdpdGFsJykge1xuICAgICAgcmVuZGVyLmlubmVySFRNTCA9XG4gICAgICAgICc8ZGl2IGNsYXNzPVwiY2xvY2stdGltZVwiPjxzcGFuIGNsYXNzPVwiY2xvY2stbWFpblwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cImNsb2NrLXNlY29uZHNcIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJjbG9jay1hbXBtXCI+PC9zcGFuPjwvZGl2PicgK1xuICAgICAgICAnPGRpdiBjbGFzcz1cImNsb2NrLWRhdGVcIj48L2Rpdj4nO1xuICAgICAgZGlnaXRhbFJlZnMgPSB7XG4gICAgICAgIG1haW46IHJlbmRlci5xdWVyeVNlbGVjdG9yKCcuY2xvY2stbWFpbicpLFxuICAgICAgICBzZWNvbmRzOiByZW5kZXIucXVlcnlTZWxlY3RvcignLmNsb2NrLXNlY29uZHMnKSxcbiAgICAgICAgYW1wbTogcmVuZGVyLnF1ZXJ5U2VsZWN0b3IoJy5jbG9jay1hbXBtJyksXG4gICAgICAgIGRhdGU6IHJlbmRlci5xdWVyeVNlbGVjdG9yKCcuY2xvY2stZGF0ZScpXG4gICAgICB9O1xuICAgICAgYWN0aXZlTGF5b3V0ID0gJ2RpZ2l0YWwnO1xuICAgIH1cbiAgICByZXR1cm4gZGlnaXRhbFJlZnM7XG4gIH1cblxuICAvLyA9PT09PSBTVFlMRSBSRU5ERVJFUlMgPT09PT1cblxuICBmdW5jdGlvbiByZW5kZXJEZWZhdWx0KG5vdykge1xuICAgIGNvbnN0IGgyNCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3QgYW1wbSA9IGgyNCA+PSAxMiA/ICdQTScgOiAnQU0nO1xuICAgIGNvbnN0IGggPSBoMjQgJSAxMiB8fCAxMjtcbiAgICBjb25zdCByZWZzID0gZW5zdXJlRGlnaXRhbExheW91dCgpO1xuICAgIHJlZnMubWFpbi50ZXh0Q29udGVudCA9IGAke2h9OiR7U3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKX1gO1xuICAgIHJlZnMuc2Vjb25kcy50ZXh0Q29udGVudCA9IGA6JHtTdHJpbmcocykucGFkU3RhcnQoMiwnMCcpfWA7XG4gICAgcmVmcy5hbXBtLnRleHRDb250ZW50ID0gYW1wbTtcbiAgICByZWZzLmRhdGUudGV4dENvbnRlbnQgPSBkYXRlU3RyKG5vdyk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJMY2Qobm93LCBjbHMpIHtcbiAgICBjb25zdCBoMjQgPSBub3cuZ2V0SG91cnMoKSwgbSA9IG5vdy5nZXRNaW51dGVzKCksIHMgPSBub3cuZ2V0U2Vjb25kcygpO1xuICAgIGNvbnN0IGFtcG0gPSBoMjQgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICBjb25zdCBoID0gaDI0ICUgMTIgfHwgMTI7XG4gICAgY29uc3QgcmVmcyA9IGVuc3VyZURpZ2l0YWxMYXlvdXQoKTtcbiAgICByZWZzLm1haW4udGV4dENvbnRlbnQgPSBgJHtTdHJpbmcoaCkucGFkU3RhcnQoMiwnMCcpfToke1N0cmluZyhtKS5wYWRTdGFydCgyLCcwJyl9YDtcbiAgICByZWZzLnNlY29uZHMudGV4dENvbnRlbnQgPSBgOiR7U3RyaW5nKHMpLnBhZFN0YXJ0KDIsJzAnKX1gO1xuICAgIHJlZnMuYW1wbS50ZXh0Q29udGVudCA9IGFtcG07XG4gICAgcmVmcy5kYXRlLnRleHRDb250ZW50ID0gZGF0ZVN0cihub3cpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyRmxpcChub3cpIHtcbiAgICBjb25zdCBoMjQgPSBub3cuZ2V0SG91cnMoKSwgbSA9IG5vdy5nZXRNaW51dGVzKCksIHMgPSBub3cuZ2V0U2Vjb25kcygpO1xuICAgIGNvbnN0IGFtcG0gPSBoMjQgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICBjb25zdCBoID0gaDI0ICUgMTIgfHwgMTI7XG4gICAgY29uc3QgZGlnaXRzID0gU3RyaW5nKGgpLnBhZFN0YXJ0KDIsJyAnKSArIFN0cmluZyhtKS5wYWRTdGFydCgyLCcwJykgKyBTdHJpbmcocykucGFkU3RhcnQoMiwnMCcpO1xuXG4gICAgbGV0IGh0bWwgPSAnPGRpdiBjbGFzcz1cImZsaXAtY2xvY2stcm93XCI+JztcbiAgICAvLyBIb3Vyc1xuICAgIGh0bWwgKz0gZmxpcENhcmQoZGlnaXRzWzBdLCAwKTtcbiAgICBodG1sICs9IGZsaXBDYXJkKGRpZ2l0c1sxXSwgMSk7XG4gICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9XCJmbGlwLWNvbG9uXCI+Ojwvc3Bhbj4nO1xuICAgIC8vIE1pbnV0ZXNcbiAgICBodG1sICs9IGZsaXBDYXJkKGRpZ2l0c1syXSwgMik7XG4gICAgaHRtbCArPSBmbGlwQ2FyZChkaWdpdHNbM10sIDMpO1xuICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPVwiZmxpcC1jb2xvblwiPjo8L3NwYW4+JztcbiAgICAvLyBTZWNvbmRzXG4gICAgaHRtbCArPSBmbGlwQ2FyZChkaWdpdHNbNF0sIDQpO1xuICAgIGh0bWwgKz0gZmxpcENhcmQoZGlnaXRzWzVdLCA1KTtcbiAgICBodG1sICs9IGA8c3BhbiBjbGFzcz1cImZsaXAtYW1wbVwiPiR7YW1wbX08L3NwYW4+YDtcbiAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJjbG9jay1kYXRlXCI+JHtkYXRlU3RyKG5vdyl9PC9kaXY+YDtcbiAgICByZW5kZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBhY3RpdmVMYXlvdXQgPSAnZmxpcCc7XG5cbiAgICAvLyBUcmlnZ2VyIGZsaXAgYW5pbWF0aW9uIG9uIGNoYW5nZWQgZGlnaXRzXG4gICAgaWYgKHByZXZGbGlwRGlnaXRzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICBpZiAoZGlnaXRzW2ldICE9PSBwcmV2RmxpcERpZ2l0c1tpXSkge1xuICAgICAgICAgIGNvbnN0IGNhcmQgPSByZW5kZXIucXVlcnlTZWxlY3RvcihgLmZsaXAtY2FyZFtkYXRhLWlkeD1cIiR7aX1cIl1gKTtcbiAgICAgICAgICBpZiAoY2FyZCkgY2FyZC5jbGFzc0xpc3QuYWRkKCdmbGlwcGluZycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXZGbGlwRGlnaXRzID0gZGlnaXRzO1xuICB9XG5cbiAgZnVuY3Rpb24gZmxpcENhcmQoZGlnaXQsIGlkeCkge1xuICAgIGNvbnN0IGQgPSBkaWdpdCA9PT0gJyAnID8gJycgOiBkaWdpdDtcbiAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJmbGlwLWNhcmRcIiBkYXRhLWlkeD1cIiR7aWR4fVwiPjxkaXYgY2xhc3M9XCJmbGlwLXRvcFwiPiR7ZH08L2Rpdj48ZGl2IGNsYXNzPVwiZmxpcC1ib3R0b21cIj4ke2R9PC9kaXY+PC9kaXY+YDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckJpbmFyeShub3cpIHtcbiAgICBjb25zdCBoMjQgPSBub3cuZ2V0SG91cnMoKSwgbSA9IG5vdy5nZXRNaW51dGVzKCksIHMgPSBub3cuZ2V0U2Vjb25kcygpO1xuICAgIGNvbnN0IGggPSBoMjQgJSAxMiB8fCAxMjtcbiAgICBjb25zdCBhbXBtID0gaDI0ID49IDEyID8gJ1BNJyA6ICdBTSc7XG4gICAgLy8gNiBjb2x1bW5zOiBIIHRlbnMsIEggb25lcywgTSB0ZW5zLCBNIG9uZXMsIFMgdGVucywgUyBvbmVzXG4gICAgY29uc3QgY29scyA9IFtcbiAgICAgIE1hdGguZmxvb3IoaCAvIDEwKSwgaCAlIDEwLFxuICAgICAgTWF0aC5mbG9vcihtIC8gMTApLCBtICUgMTAsXG4gICAgICBNYXRoLmZsb29yKHMgLyAxMCksIHMgJSAxMFxuICAgIF07XG5cbiAgICBsZXQgaHRtbCA9ICc8ZGl2IGNsYXNzPVwiYmluYXJ5LWNsb2NrXCI+JztcbiAgICAvLyBMYWJlbHNcbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYmluYXJ5LWxhYmVsc1wiPjxzcGFuPkg8L3NwYW4+PHNwYW4+SDwvc3Bhbj48c3Bhbj5NPC9zcGFuPjxzcGFuPk08L3NwYW4+PHNwYW4+Uzwvc3Bhbj48c3Bhbj5TPC9zcGFuPjwvZGl2Pic7XG4gICAgLy8gNCByb3dzIGZvciBiaXRzIDgsNCwyLDFcbiAgICBmb3IgKGxldCBiaXQgPSAzOyBiaXQgPj0gMDsgYml0LS0pIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJiaW5hcnktcm93XCI+JztcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IDY7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IG9uID0gKGNvbHNbY29sXSA+PiBiaXQpICYgMTtcbiAgICAgICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cImJpbmFyeS1kb3QgJHtvbiA/ICdvbicgOiAnJ31cIj48L2Rpdj5gO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICB9XG4gICAgLy8gVmFsdWUgcm93XG4gICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImJpbmFyeS12YWx1ZXNcIj4nO1xuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IDY7IGNvbCsrKSB7XG4gICAgICBodG1sICs9IGA8c3Bhbj4ke2NvbHNbY29sXX08L3NwYW4+YDtcbiAgICB9XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiYmluYXJ5LWFtcG1cIj4ke2FtcG19PC9kaXY+YDtcbiAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJjbG9jay1kYXRlXCI+JHtkYXRlU3RyKG5vdyl9PC9kaXY+YDtcbiAgICByZW5kZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBhY3RpdmVMYXlvdXQgPSAnYmluYXJ5JztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckFuYWxvZyhub3csIHVzZVJvbWFuKSB7XG4gICAgY29uc3QgaCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3Qgc2l6ZSA9IDEyMDtcbiAgICBjb25zdCBjeCA9IHNpemUgLyAyLCBjeSA9IHNpemUgLyAyO1xuXG4gICAgLy8gQW5nbGVzXG4gICAgY29uc3Qgc0FuZ2xlID0gKHMgLyA2MCkgKiAzNjAgLSA5MDtcbiAgICBjb25zdCBtQW5nbGUgPSAoKG0gKyBzIC8gNjApIC8gNjApICogMzYwIC0gOTA7XG4gICAgY29uc3QgaEFuZ2xlID0gKCgoaCAlIDEyKSArIG0gLyA2MCkgLyAxMikgKiAzNjAgLSA5MDtcblxuICAgIC8vIE51bWJlciBsYWJlbHNcbiAgICBsZXQgbGFiZWxzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgICAgY29uc3QgYW5nbGUgPSAoaSAvIDEyKSAqIDIgKiBNYXRoLlBJIC0gTWF0aC5QSSAvIDI7XG4gICAgICBjb25zdCByID0gNDc7XG4gICAgICBjb25zdCB4ID0gY3ggKyByICogTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgY29uc3QgeSA9IGN5ICsgciAqIE1hdGguc2luKGFuZ2xlKTtcbiAgICAgIGNvbnN0IGxhYmVsID0gdXNlUm9tYW4gPyBST01BTltpICUgMTJdIDogaTtcbiAgICAgIGNvbnN0IGZzID0gdXNlUm9tYW4gPyAnNycgOiAnOSc7XG4gICAgICBsYWJlbHMgKz0gYDx0ZXh0IHg9XCIke3h9XCIgeT1cIiR7eX1cIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiIGRvbWluYW50LWJhc2VsaW5lPVwiY2VudHJhbFwiIGZpbGw9XCJ2YXIoLS1mZylcIiBmb250LXNpemU9XCIke2ZzfVwiIGZvbnQtd2VpZ2h0PVwiNjAwXCIgZm9udC1mYW1pbHk9XCInU2FtaSBHcm90ZXNrJyxzYW5zLXNlcmlmXCI+JHtsYWJlbH08L3RleHQ+YDtcbiAgICB9XG5cbiAgICAvLyBUaWNrIG1hcmtzXG4gICAgbGV0IHRpY2tzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2MDsgaSsrKSB7XG4gICAgICBjb25zdCBhbmdsZSA9IChpIC8gNjApICogMiAqIE1hdGguUEkgLSBNYXRoLlBJIC8gMjtcbiAgICAgIGNvbnN0IG91dGVyID0gNTY7XG4gICAgICBjb25zdCBpbm5lciA9IGkgJSA1ID09PSAwID8gNTIgOiA1NDtcbiAgICAgIGNvbnN0IHgxID0gY3ggKyBpbm5lciAqIE1hdGguY29zKGFuZ2xlKTtcbiAgICAgIGNvbnN0IHkxID0gY3kgKyBpbm5lciAqIE1hdGguc2luKGFuZ2xlKTtcbiAgICAgIGNvbnN0IHgyID0gY3ggKyBvdXRlciAqIE1hdGguY29zKGFuZ2xlKTtcbiAgICAgIGNvbnN0IHkyID0gY3kgKyBvdXRlciAqIE1hdGguc2luKGFuZ2xlKTtcbiAgICAgIGNvbnN0IHcgPSBpICUgNSA9PT0gMCA/IDEuNSA6IDAuNTtcbiAgICAgIHRpY2tzICs9IGA8bGluZSB4MT1cIiR7eDF9XCIgeTE9XCIke3kxfVwiIHgyPVwiJHt4Mn1cIiB5Mj1cIiR7eTJ9XCIgc3Ryb2tlPVwidmFyKC0tbXV0ZWQpXCIgc3Ryb2tlLXdpZHRoPVwiJHt3fVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+YDtcbiAgICB9XG5cbiAgICBjb25zdCBzdmcgPSBgPHN2ZyBjbGFzcz1cImFuYWxvZy1jbG9jay1zdmdcIiB2aWV3Qm94PVwiMCAwICR7c2l6ZX0gJHtzaXplfVwiIHdpZHRoPVwiJHtzaXplfVwiIGhlaWdodD1cIiR7c2l6ZX1cIj5cbiAgICAgIDxjaXJjbGUgY3g9XCIke2N4fVwiIGN5PVwiJHtjeX1cIiByPVwiNThcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cInZhcigtLWJvcmRlcilcIiBzdHJva2Utd2lkdGg9XCIyXCIvPlxuICAgICAgJHt0aWNrc31cbiAgICAgICR7bGFiZWxzfVxuICAgICAgPGxpbmUgeDE9XCIke2N4fVwiIHkxPVwiJHtjeX1cIiB4Mj1cIiR7Y3ggKyAyOCAqIE1hdGguY29zKGhBbmdsZSAqIE1hdGguUEkgLyAxODApfVwiIHkyPVwiJHtjeSArIDI4ICogTWF0aC5zaW4oaEFuZ2xlICogTWF0aC5QSSAvIDE4MCl9XCIgc3Ryb2tlPVwidmFyKC0tZmcpXCIgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICA8bGluZSB4MT1cIiR7Y3h9XCIgeTE9XCIke2N5fVwiIHgyPVwiJHtjeCArIDM4ICogTWF0aC5jb3MobUFuZ2xlICogTWF0aC5QSSAvIDE4MCl9XCIgeTI9XCIke2N5ICsgMzggKiBNYXRoLnNpbihtQW5nbGUgKiBNYXRoLlBJIC8gMTgwKX1cIiBzdHJva2U9XCJ2YXIoLS1mZylcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgIDxsaW5lIHgxPVwiJHtjeH1cIiB5MT1cIiR7Y3l9XCIgeDI9XCIke2N4ICsgNDIgKiBNYXRoLmNvcyhzQW5nbGUgKiBNYXRoLlBJIC8gMTgwKX1cIiB5Mj1cIiR7Y3kgKyA0MiAqIE1hdGguc2luKHNBbmdsZSAqIE1hdGguUEkgLyAxODApfVwiIHN0cm9rZT1cIiNlNzRjM2NcIiBzdHJva2Utd2lkdGg9XCIxXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgIDxjaXJjbGUgY3g9XCIke2N4fVwiIGN5PVwiJHtjeX1cIiByPVwiM1wiIGZpbGw9XCJ2YXIoLS1mZylcIi8+XG4gICAgPC9zdmc+YDtcblxuICAgIGNvbnN0IGFtcG0gPSBub3cuZ2V0SG91cnMoKSA+PSAxMiA/ICdQTScgOiAnQU0nO1xuICAgIHJlbmRlci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cImFuYWxvZy1jbG9jay13cmFwXCI+JHtzdmd9PGRpdiBjbGFzcz1cImFuYWxvZy1pbmZvXCI+PHNwYW4gY2xhc3M9XCJhbmFsb2ctZGlnaXRhbFwiPiR7KG5vdy5nZXRIb3VycygpICUgMTIgfHwgMTIpfToke1N0cmluZyhtKS5wYWRTdGFydCgyLCcwJyl9ICR7YW1wbX08L3NwYW4+PHNwYW4gY2xhc3M9XCJhbmFsb2ctZGF0ZS1zbVwiPiR7ZGF0ZVN0cihub3cpfTwvc3Bhbj48L2Rpdj48L2Rpdj5gO1xuICAgIGFjdGl2ZUxheW91dCA9ICdhbmFsb2cnO1xuICB9XG5cbiAgLy8gPT09PT0gTUFJTiBUSUNLID09PT09XG4gIGZ1bmN0aW9uIHRpY2soKSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBoID0gbm93LmdldEhvdXJzKCkgJSAxMiB8fCAxMjtcbiAgICBjb25zdCBtID0gbm93LmdldE1pbnV0ZXMoKTtcbiAgICBjb25zdCBzID0gbm93LmdldFNlY29uZHMoKTtcblxuICAgIC8vIFNldCBzdHlsZSBjbGFzcyBvbiB3aWRnZXRcbiAgICBjb25zdCBuZXh0Q2xhc3NOYW1lID0gJ2Nsb2NrLXdpZGdldCcgKyAoY3VycmVudFN0eWxlICE9PSAnZGVmYXVsdCcgPyAnICcgKyBjdXJyZW50U3R5bGUgOiAnJyk7XG4gICAgaWYgKHdpZGdldC5jbGFzc05hbWUgIT09IG5leHRDbGFzc05hbWUpIHtcbiAgICAgIHdpZGdldC5jbGFzc05hbWUgPSBuZXh0Q2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY3VycmVudFN0eWxlKSB7XG4gICAgICBjYXNlICdsY2QnOiByZW5kZXJMY2Qobm93KTsgYnJlYWs7XG4gICAgICBjYXNlICdsY2QtYmx1ZSc6IHJlbmRlckxjZChub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2xjZC1hbWJlcic6IHJlbmRlckxjZChub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2xjZC1yZXRybyc6IHJlbmRlckxjZChub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2xjZC10YXhpJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnZmxpcCc6IHJlbmRlckZsaXAobm93KTsgYnJlYWs7XG4gICAgICBjYXNlICdiaW5hcnknOiByZW5kZXJCaW5hcnkobm93KTsgYnJlYWs7XG4gICAgICBjYXNlICdhbmFsb2cnOiByZW5kZXJBbmFsb2cobm93LCBmYWxzZSk7IGJyZWFrO1xuICAgICAgY2FzZSAncm9tYW4nOiByZW5kZXJBbmFsb2cobm93LCB0cnVlKTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiByZW5kZXJEZWZhdWx0KG5vdyk7XG4gICAgfVxuXG4gICAgLy8gSG91cmx5IGNoaW1lc1xuICAgIGlmIChtID09PSAwICYmIHMgPT09IDAgJiYgaCAhPT0gbGFzdENoaW1lSG91cikge1xuICAgICAgbGFzdENoaW1lSG91ciA9IGg7XG4gICAgICBwbGF5Q2hpbWVzKGgpO1xuICAgIH1cbiAgICBpZiAobSAhPT0gMCkgbGFzdENoaW1lSG91ciA9IC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGVOZXh0VGljaygpIHtcbiAgICBjbGVhclRpbWVvdXQodGlja1RpbWVyKTtcbiAgICBjb25zdCBpbnRlcnZhbCA9IGRvY3VtZW50LmhpZGRlbiA/IDYwMDAwIDogMTAwMDtcbiAgICBjb25zdCBkZWxheSA9IGludGVydmFsIC0gKERhdGUubm93KCkgJSBpbnRlcnZhbCkgKyAyNTtcbiAgICB0aWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRpY2soKTtcbiAgICAgIHNjaGVkdWxlTmV4dFRpY2soKTtcbiAgICB9LCBkZWxheSk7XG4gIH1cblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKCkgPT4ge1xuICAgIHByZXZGbGlwRGlnaXRzID0gJyc7XG4gICAgcmVzZXRSZW5kZXJMYXlvdXQoKTtcbiAgICB0aWNrKCk7XG4gICAgc2NoZWR1bGVOZXh0VGljaygpO1xuICB9KTtcblxuICB0aWNrKCk7XG4gIHNjaGVkdWxlTmV4dFRpY2soKTtcblxuICAvLyA9PT09PSBTRVRUSU5HUyBNT0RBTCA9PT09PVxuICBjb25zdCBTVFlMRVMgPSBbXG4gICAgeyBpZDogJ2RlZmF1bHQnLCBsYWJlbDogJ0RlZmF1bHQnLCBpY29uOiAnXHVEODNEXHVERDUwJyB9LFxuICAgIHsgaWQ6ICdsY2QnLCBsYWJlbDogJ0xDRCBHcmVlbicsIGljb246ICdcdUQ4M0RcdURDOUEnIH0sXG4gICAgeyBpZDogJ2xjZC1ibHVlJywgbGFiZWw6ICdMQ0QgQmx1ZScsIGljb246ICdcdUQ4M0RcdURDOTknIH0sXG4gICAgeyBpZDogJ2xjZC1hbWJlcicsIGxhYmVsOiAnTENEIEFtYmVyJywgaWNvbjogJ1x1RDgzRFx1REZFMCcgfSxcbiAgICB7IGlkOiAnbGNkLXJldHJvJywgbGFiZWw6ICdMQ0QgUmV0cm8nLCBpY29uOiAnXHVEODNEXHVERkU5JyB9LFxuICAgIHsgaWQ6ICdsY2QtdGF4aScsIGxhYmVsOiAnTENEIFRheGknLCBpY29uOiAnXHVEODNEXHVERkUxJyB9LFxuICAgIHsgaWQ6ICdmbGlwJywgbGFiZWw6ICdGbGlwIENsb2NrJywgaWNvbjogJ1x1RDgzRFx1RENERicgfSxcbiAgICB7IGlkOiAnYmluYXJ5JywgbGFiZWw6ICdCaW5hcnknLCBpY29uOiAnXHVEODNEXHVEQ0JCJyB9LFxuICAgIHsgaWQ6ICdhbmFsb2cnLCBsYWJlbDogJ0FuYWxvZycsIGljb246ICdcdTIzRjAnIH0sXG4gICAgeyBpZDogJ3JvbWFuJywgbGFiZWw6ICdSb21hbicsIGljb246ICdcdUQ4M0NcdURGREJcdUZFMEYnIH0sXG4gIF07XG5cbiAgbGV0IHN0eWxlT3B0aW9uc0h0bWwgPSAnPGRpdiBjbGFzcz1cImNsb2NrLXN0eWxlLWdyaWRcIj4nO1xuICBTVFlMRVMuZm9yRWFjaChzID0+IHtcbiAgICBzdHlsZU9wdGlvbnNIdG1sICs9IGA8bGFiZWwgY2xhc3M9XCJjbG9jay1zdHlsZS1vcHRpb25cIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiY2xvY2stc3R5bGUtcmFkaW9cIiB2YWx1ZT1cIiR7cy5pZH1cIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY2xvY2stc3R5bGUtY2FyZFwiPjxzcGFuIGNsYXNzPVwiY2xvY2stc3R5bGUtaWNvblwiPiR7cy5pY29ufTwvc3Bhbj48c3BhbiBjbGFzcz1cImNsb2NrLXN0eWxlLWxhYmVsXCI+JHtzLmxhYmVsfTwvc3Bhbj48L3NwYW4+XG4gICAgPC9sYWJlbD5gO1xuICB9KTtcbiAgc3R5bGVPcHRpb25zSHRtbCArPSAnPC9kaXY+JztcblxuICBpbmplY3RNb2RhbCgnY2xvY2stc2V0dGluZ3MtbW9kYWwnLCBgPGRpdiBpZD1cImNsb2NrLXNldHRpbmdzLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWF4LXdpZHRoOiA0MjBweDtcIj5cbiAgICAgIDxoMz5DbG9jayBTZXR0aW5nczwvaDM+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDtcIj5cbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDhweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLWZnKTtcIj5TdHlsZTwvbGFiZWw+XG4gICAgICAgICR7c3R5bGVPcHRpb25zSHRtbH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmctdG9wOiAxMnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLWZnKTtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJjbG9jay1jaGltZXMtdG9nZ2xlXCI+IEhvdXJseSBjaHVyY2ggYmVsbCBjaGltZXNcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4OyBtYXJnaW4tbGVmdDogMjRweDtcIj5cbiAgICAgICAgICBTdHJpa2VzIHRoZSBudW1iZXIgb2YgdGhlIGhvdXIgKGUuZy4sIDMgYmVsbHMgYXQgMzowMClcbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4O1wiIGlkPVwiY2xvY2stdm9sdW1lLXNlY3Rpb25cIj5cbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDZweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLWZnKTtcIj5Wb2x1bWU8L2xhYmVsPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtO1wiPlx1RDgzRFx1REQwODwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgaWQ9XCJjbG9jay1jaGltZS12b2x1bWVcIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgdmFsdWU9XCI1MFwiIHN0eWxlPVwiZmxleDogMTsgYWNjZW50LWNvbG9yOiB2YXIoLS1vay1mZyk7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07XCI+XHVEODNEXHVERDBBPC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjbG9jay1jaGltZS10ZXN0XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtOyBib3JkZXItcmFkaXVzOiA0cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5UZXN0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJjbG9jay1zZXR0aW5ncy1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsb2NrLXNldHRpbmdzLXNhdmVcIj5TYXZlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stc2V0dGluZ3MtbW9kYWwnKTtcbiAgY29uc3QgY2hpbWVzVG9nZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb2NrLWNoaW1lcy10b2dnbGUnKTtcbiAgY29uc3Qgdm9sdW1lU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb2NrLWNoaW1lLXZvbHVtZScpO1xuICBjb25zdCB2b2x1bWVTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb2NrLXZvbHVtZS1zZWN0aW9uJyk7XG5cbiAgZnVuY3Rpb24gbG9hZFNldHRpbmdzKCkge1xuICAgIGNvbnN0IHN0eWxlID0gc2FmZUdldCgnY2xvY2stc3R5bGUnKSB8fCAnZGVmYXVsdCc7XG4gICAgY29uc3QgcmFkaW8gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKGBpbnB1dFt2YWx1ZT1cIiR7c3R5bGV9XCJdYCk7XG4gICAgaWYgKHJhZGlvKSByYWRpby5jaGVja2VkID0gdHJ1ZTtcbiAgICBjaGltZXNUb2dnbGUuY2hlY2tlZCA9IHNhZmVHZXQoJ2Nsb2NrLWNoaW1lcycpID09PSAndHJ1ZSc7XG4gICAgdm9sdW1lU2xpZGVyLnZhbHVlID0gc2FmZUdldCgnY2xvY2stY2hpbWUtdm9sdW1lJykgfHwgJzUwJztcbiAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLm9wYWNpdHkgPSBjaGltZXNUb2dnbGUuY2hlY2tlZCA/ICcxJyA6ICcwLjQnO1xuICB9XG5cbiAgY2hpbWVzVG9nZ2xlPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgdm9sdW1lU2VjdGlvbi5zdHlsZS5vcGFjaXR5ID0gY2hpbWVzVG9nZ2xlLmNoZWNrZWQgPyAnMScgOiAnMC40JztcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb2NrLXNldHRpbmdzJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvYWRTZXR0aW5ncygpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb2NrLWNoaW1lLXRlc3QnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY29uc3Qgdm9sID0gcGFyc2VJbnQodm9sdW1lU2xpZGVyLnZhbHVlLCAxMCkgLyAxMDA7XG4gICAgY29uc3QgYmVsbCA9IG5ldyBBdWRpbygnL2Fzc2V0cy9zb3VuZHMvY2h1cmNoLWJlbGwubXAzJyk7XG4gICAgYmVsbC52b2x1bWUgPSB2b2w7XG4gICAgYmVsbC5wbGF5KCkuY2F0Y2goKCkgPT4ge30pO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stc2V0dGluZ3Mtc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCByYWRpbyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJjbG9jay1zdHlsZS1yYWRpb1wiXTpjaGVja2VkJyk7XG4gICAgY29uc3Qgc3R5bGUgPSByYWRpbyA/IHJhZGlvLnZhbHVlIDogJ2RlZmF1bHQnO1xuICAgIHNhZmVTZXQoJ2Nsb2NrLXN0eWxlJywgc3R5bGUpO1xuICAgIHNhZmVTZXQoJ2Nsb2NrLWNoaW1lcycsIFN0cmluZyhjaGltZXNUb2dnbGUuY2hlY2tlZCkpO1xuICAgIHNhZmVTZXQoJ2Nsb2NrLWNoaW1lLXZvbHVtZScsIHZvbHVtZVNsaWRlci52YWx1ZSk7XG4gICAgY3VycmVudFN0eWxlID0gc3R5bGU7XG4gICAgcHJldkZsaXBEaWdpdHMgPSAnJztcbiAgICByZXNldFJlbmRlckxheW91dCgpO1xuICAgIHRpY2soKTtcbiAgICBzY2hlZHVsZU5leHRUaWNrKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHNob3dOb3RpZmljYXRpb24oJ0Nsb2NrIHNldHRpbmdzIHNhdmVkJywgJ3N1Y2Nlc3MnLCAyMDAwKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb2NrLXNldHRpbmdzLWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH0pO1xuXG4gIHdpcmVNb2RhbChtb2RhbCk7XG5cbiAgLy8gTGl2ZSBwcmV2aWV3IHdoZW4gY2xpY2tpbmcgc3R5bGUgb3B0aW9uc1xuICBtb2RhbD8ucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT1cImNsb2NrLXN0eWxlLXJhZGlvXCJdJykuZm9yRWFjaChyYWRpbyA9PiB7XG4gICAgcmFkaW8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgY3VycmVudFN0eWxlID0gcmFkaW8udmFsdWU7XG4gICAgICBwcmV2RmxpcERpZ2l0cyA9ICcnO1xuICAgICAgcmVzZXRSZW5kZXJMYXlvdXQoKTtcbiAgICAgIHRpY2soKTtcbiAgICB9KTtcbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBDQVJEIEhFQUxUSCAmIFVQREFURSBCQURHRVMgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBGZXRjaCBoZWFsdGggZGF0YSBhbmQgdXBkYXRlIGNhcmQgVUlcbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaENhcmRIZWFsdGgoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2hlYWx0aC1jaGVja3Mvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFkYXRhLnN0YXR1cykgcmV0dXJuO1xuXG4gICAgICBmb3IgKGNvbnN0IFtzZXJ2aWNlSWQsIHN2Y10gb2YgT2JqZWN0LmVudHJpZXMoZGF0YS5zdGF0dXMpKSB7XG4gICAgICAgIGNvbnN0IHVwdGltZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwdGltZS0nICsgc2VydmljZUlkKTtcbiAgICAgICAgY29uc3QgYmFyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXB0aW1lLWJhci0nICsgc2VydmljZUlkKTtcbiAgICAgICAgaWYgKCF1cHRpbWVFbCkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgdXB0aW1lMjQgPSBzdmMudXB0aW1lPy5bJzI0aCddO1xuICAgICAgICBpZiAodXB0aW1lMjQgIT09IHVuZGVmaW5lZCAmJiB1cHRpbWUyNCAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHBjdCA9IHVwdGltZTI0LnRvRml4ZWQoMSk7XG4gICAgICAgICAgdXB0aW1lRWwudGV4dENvbnRlbnQgPSBgJHtwY3R9JSB1cHRpbWVgO1xuICAgICAgICAgIC8vIENvbG9yIGNsYXNzXG4gICAgICAgICAgdXB0aW1lRWwuY2xhc3NOYW1lID0gJ3VwdGltZS1jaGlwJztcbiAgICAgICAgICBpZiAodXB0aW1lMjQgPj0gOTkuOSkgdXB0aW1lRWwuY2xhc3NMaXN0LmFkZCgnZXhjZWxsZW50Jyk7XG4gICAgICAgICAgZWxzZSBpZiAodXB0aW1lMjQgPj0gOTkpIHVwdGltZUVsLmNsYXNzTGlzdC5hZGQoJ2dvb2QnKTtcbiAgICAgICAgICBlbHNlIGlmICh1cHRpbWUyNCA+PSA5NSkgdXB0aW1lRWwuY2xhc3NMaXN0LmFkZCgnZGVncmFkZWQnKTtcbiAgICAgICAgICBlbHNlIHVwdGltZUVsLmNsYXNzTGlzdC5hZGQoJ3Bvb3InKTtcblxuICAgICAgICAgIGlmIChiYXJFbCkgYmFyRWwuc3R5bGUud2lkdGggPSBwY3QgKyAnJSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAvKiBIZWFsdGggY2hlY2sgQVBJIHVuYXZhaWxhYmxlIFx1MjAxNCB1cHRpbWUgY2hpcHMgc3RheSBoaWRkZW4gKi9cbiAgICAgIGNvbnNvbGUud2FybignW0NhcmQgQmFkZ2VzXSBIZWFsdGggY2hlY2sgQVBJIHVuYXZhaWxhYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gVHJhY2sgZGlzbWlzc2VkIHVwZGF0ZXMgKHBlciBzZXNzaW9uKVxuICBsZXQgZGlzbWlzc2VkVXBkYXRlcztcbiAgdHJ5IHtcbiAgICBkaXNtaXNzZWRVcGRhdGVzID0gbmV3IFNldChKU09OLnBhcnNlKHNhZmVTZXNzaW9uR2V0KCdkaXNtaXNzZWQtdXBkYXRlcycpIHx8ICdbXScpKTtcbiAgfSBjYXRjaCAoXykge1xuICAgIC8qIFNlc3Npb24gc3RvcmFnZSB1bmF2YWlsYWJsZSAqL1xuICAgIGRpc21pc3NlZFVwZGF0ZXMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICAvLyBUcmFjayBnbG9iYWwgdXBkYXRlIHN0YXRlIGZvciBjcm9zcy1jb21wb25lbnQgYWNjZXNzXG4gIGxldCBrbm93blVwZGF0ZXMgPSBbXTtcblxuICAvLyBGZXRjaCB1cGRhdGUgZGF0YSBhbmQgc2hvdyBiYWRnZXNcbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaENhcmRVcGRhdGVzKG5vdGlmeU5ldykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS91cGRhdGVzL2F2YWlsYWJsZScpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgcmV0dXJuO1xuXG4gICAgICAvLyBDbGVhciBhbGwgdXBkYXRlIGJhZGdlcyBmaXJzdFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVwZGF0ZS1hdmFpbGFibGUtYmFkZ2UnKS5mb3JFYWNoKGVsID0+IGVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKSk7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZXMgPSBkYXRhLnVwZGF0ZXMgfHwgW107XG4gICAgICBrbm93blVwZGF0ZXMgPSB1cGRhdGVzOyAvLyBzdG9yZSBnbG9iYWxseVxuXG4gICAgICAvLyBOb3RpZnkgaWYgbmV3IHVwZGF0ZXMgYXBwZWFyZWQgKHBlcmlvZGljIGNoZWNrIHdpdGggbm90aWZpY2F0aW9uKVxuICAgICAgaWYgKG5vdGlmeU5ldyAmJiB1cGRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcHJldiA9IHdpbmRvdy5fbGFzdEtub3duVXBkYXRlQ291bnQgfHwgMDtcbiAgICAgICAgaWYgKHByZXYgPiAwICYmIHVwZGF0ZXMubGVuZ3RoID4gcHJldikge1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oYCR7dXBkYXRlcy5sZW5ndGh9IGNvbnRhaW5lciB1cGRhdGUocykgYXZhaWxhYmxlIFx1MjAxNCBjbGljayBVcGRhdGUgTWFuYWdlbWVudCB0byByZXZpZXcuYCwgJ2luZm8nKTtcbiAgICAgICAgfVxuICAgICAgICB3aW5kb3cuX2xhc3RLbm93blVwZGF0ZUNvdW50ID0gdXBkYXRlcy5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICghdXBkYXRlcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgZm9yIChjb25zdCB1cGQgb2YgdXBkYXRlcykge1xuICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggYnkgY29udGFpbmVyIG5hbWUgdG8gc2VydmljZSBpZFxuICAgICAgICBjb25zdCBhcHBzID0gd2luZG93LkFQUFMgfHwgW107XG4gICAgICAgIGZvciAoY29uc3QgYXBwIG9mIGFwcHMpIHtcbiAgICAgICAgICBpZiAoYXBwLmNvbnRhaW5lcklkID09PSB1cGQuY29udGFpbmVySWQgfHwgYXBwLmlkID09PSB1cGQuY29udGFpbmVyTmFtZSB8fCBhcHAubmFtZSA9PT0gdXBkLmNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgICAgIC8vIFNraXAgZGlzbWlzc2VkIHVwZGF0ZXNcbiAgICAgICAgICAgIGlmIChkaXNtaXNzZWRVcGRhdGVzLmhhcyhhcHAuaWQpKSBicmVhaztcbiAgICAgICAgICAgIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZS1iYWRnZS0nICsgYXBwLmlkKTtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGUtYnRuLScgKyBhcHAuaWQpO1xuICAgICAgICAgICAgaWYgKGJhZGdlKSB7XG4gICAgICAgICAgICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTtcbiAgICAgICAgICAgICAgYmFkZ2UudGl0bGUgPSBgVXBkYXRlIGF2YWlsYWJsZSBcdTIwMTQgY2xpY2sgdG8gb3BlbiBVcGRhdGUgTWFuYWdlbWVudC5gO1xuICAgICAgICAgICAgICBiYWRnZS5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgICAgICAgICAgIGJhZGdlLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgLy8gT3BlbiBVcGRhdGUgTWFuYWdlbWVudCBtb2RhbCBmb2N1c2VkIG9uIHRoaXMgYXBwXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5vcGVuVXBkYXRlTW9kYWwpIHdpbmRvdy5vcGVuVXBkYXRlTW9kYWwoYXBwLmlkKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhpZ2hsaWdodCB1cGRhdGUgYnV0dG9uIGlmIHVwZGF0ZSBpcyBhdmFpbGFibGVcbiAgICAgICAgICAgIGlmICh1cGRhdGVCdG4pIHtcbiAgICAgICAgICAgICAgdXBkYXRlQnRuLnN0eWxlLmJhY2tncm91bmQgPSAnI2Y5NzMxNic7XG4gICAgICAgICAgICAgIHVwZGF0ZUJ0bi5zdHlsZS5ib3JkZXJDb2xvciA9ICcjZjk3MzE2JztcbiAgICAgICAgICAgICAgdXBkYXRlQnRuLnN0eWxlLmJveFNoYWRvdyA9ICcwIDAgNnB4ICNmOTczMTY4OCc7XG4gICAgICAgICAgICAgIHVwZGF0ZUJ0bi50aXRsZSA9IGBVcGRhdGUgYXZhaWxhYmxlIFx1MjAxNCBjbGljayB0byBvcGVuIFVwZGF0ZSBNYW5hZ2VtZW50LmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAvKiBVcGRhdGVzIEFQSSB1bmF2YWlsYWJsZSBcdTIwMTQgYmFkZ2VzIHN0YXkgaGlkZGVuICovXG4gICAgICBjb25zb2xlLndhcm4oJ1tDYXJkIEJhZGdlc10gVXBkYXRlcyBBUEkgdW5hdmFpbGFibGUnKTtcbiAgICB9XG4gIH1cblxuICAvLyBSdW4gaGVhbHRoIGFuZCB1cGRhdGUgY2hlY2tzIGFmdGVyIG1haW4gcmVmcmVzaCwgYW5kIHBlcmlvZGljYWxseVxuICBmdW5jdGlvbiBzY2hlZHVsZUNhcmRFbmhhbmNlbWVudHMoKSB7XG4gICAgLy8gSW5pdGlhbCBsb2FkIChkZWxheWVkIHRvIG5vdCBjb21wZXRlIHdpdGggbWFpbiBwcm9iZSBjaGVja3MpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICByZWZyZXNoQ2FyZEhlYWx0aCgpO1xuICAgICAgcmVmcmVzaENhcmRVcGRhdGVzKCk7XG4gICAgfSwgNTAwMCk7XG5cbiAgICAvLyBQZXJpb2RpYyByZWZyZXNoIGV2ZXJ5IDYwIHNlY29uZHMgXHUyMDE0IG5vdGlmeSBvbiBuZXcgdXBkYXRlcyBkZXRlY3RlZFxuICAgIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHJlZnJlc2hDYXJkSGVhbHRoKCk7XG4gICAgICByZWZyZXNoQ2FyZFVwZGF0ZXModHJ1ZSk7IC8vIHRydWUgPSBub3RpZnkgaWYgbmV3IHVwZGF0ZXMgZm91bmRcbiAgICB9LCA2MDAwMCk7XG4gIH1cblxuICAvLyBIb29rIGludG8gbWFpbiByZWZyZXNoIGN5Y2xlXG4gIGNvbnN0IG9yaWdSZWZyZXNoQWxsID0gd2luZG93LnJlZnJlc2hBbGw7XG4gIGlmIChvcmlnUmVmcmVzaEFsbCkge1xuICAgIHdpbmRvdy5yZWZyZXNoQWxsID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBvcmlnUmVmcmVzaEFsbCgpO1xuICAgICAgICAvLyBSZWZyZXNoIGhlYWx0aCBkYXRhIGFmdGVyIG1haW4gc3RhdHVzIGNoZWNrXG4gICAgICAgIHNldFRpbWVvdXQocmVmcmVzaENhcmRIZWFsdGgsIDEwMDApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tDYXJkIEJhZGdlc10gRXJyb3IgaW4gcmVmcmVzaEFsbCBob29rOicsIGUubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNjaGVkdWxlQ2FyZEVuaGFuY2VtZW50cygpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gVEhFTUUgUElDS0VSICsgVEhFTUUgQlVJTERFUiA9PT09PT09PT09XG4oZnVuY3Rpb24gKCkge1xuICB2YXIgdGhlbWVCZWZvcmVCdWlsZGVyID0gbnVsbDtcbiAgdmFyIGVkaXRpbmdTbHVnID0gbnVsbDtcbiAgdmFyIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307IC8vIHRyYWNrcyB3aGljaCBhZHZhbmNlZCBmaWVsZHMgdXNlciBtYW51YWxseSBjaGFuZ2VkXG5cbiAgLy8gRGlzcGxheSBuYW1lcyBmb3IgYnVpbHQtaW4gdGhlbWVzXG4gIHZhciBUSEVNRV9MQUJFTFMgPSB7XG4gICAgZGFyazogJ0RhcmsnLFxuICAgIGxpZ2h0OiAnTGlnaHQnLFxuICAgIGJsdWU6ICdCbHVlJyxcbiAgICBibGFjazogJ0JsYWNrJyxcbiAgICBub3JkOiAnTm9yZCcsXG4gICAgZHJhY3VsYTogJ0RyYWN1bGEnLFxuICAgICdzb2xhcml6ZWQtZGFyayc6ICdTb2xhcml6ZWQgRGFyaycsXG4gICAgJ3NvbGFyaXplZC1saWdodCc6ICdTb2xhcml6ZWQgTGlnaHQnLFxuICAgIHRheGk6ICdUYXhpJyxcbiAgICBvY2VhbjogJ09jZWFuJyxcbiAgfTtcblxuICAvLyBDb2xvciBwaWNrZXIgZmllbGQgZGVmaW5pdGlvbnM6IFtjc3MtcHJvcCwgbGFiZWwsIHNlY3Rpb25dXG4gIHZhciBGSUVMRFMgPSBbXG4gICAgWydiZycsICAgICAgICAgICAgJ0JhY2tncm91bmQnLCAgICAnYmFzZSddLFxuICAgIFsnY2FyZC1iYXNlJywgICAgICdDYXJkJywgICAgICAgICAgJ2Jhc2UnXSxcbiAgICBbJ2ZnJywgICAgICAgICAgICAnVGV4dCcsICAgICAgICAgICdiYXNlJ10sXG4gICAgWydtdXRlZCcsICAgICAgICAgJ011dGVkIFRleHQnLCAgICAnYmFzZSddLFxuICAgIFsnYm9yZGVyJywgICAgICAgICdCb3JkZXInLCAgICAgICAgJ2Jhc2UnXSxcbiAgICBbJ2FjY2VudCcsICAgICAgICAnQWNjZW50JywgICAgICAgICdhY2NlbnQnXSxcbiAgICBbJ2FjY2VudC1zdHJvbmcnLCAnQWNjZW50IFN0cm9uZycsICdhY2NlbnQnXSxcbiAgICBbJ29rLWJnJywgICAgICAgICAnT0sgQmFja2dyb3VuZCcsICdzdGF0dXMnXSxcbiAgICBbJ29rLWZnJywgICAgICAgICAnT0sgVGV4dCcsICAgICAgICdzdGF0dXMnXSxcbiAgICBbJ2JhZC1iZycsICAgICAgICAnRXJyb3IgQmcnLCAgICAgICdzdGF0dXMnXSxcbiAgICBbJ2JhZC1mZycsICAgICAgICAnRXJyb3IgVGV4dCcsICAgICdzdGF0dXMnXSxcbiAgICBbJ2RvdC1vaycsICAgICAgICAnRG90IE9LJywgICAgICAgICdzdGF0dXMnXSxcbiAgICBbJ2RvdC1iYWQnLCAgICAgICAnRG90IEVycm9yJywgICAgICdzdGF0dXMnXSxcbiAgICBbJ3VwdGltZScsICAgICAgICAnVXB0aW1lIEJhcicsICAgICdzdGF0dXMnXSxcbiAgICBbJ2hvdmVyJywgICAgICAgICAnSG92ZXInLCAgICAgICAgICdhZHZhbmNlZCddLFxuICAgIFsnY2FyZC1ob3ZlcicsICAgICdDYXJkIEhvdmVyJywgICAgJ2FkdmFuY2VkJ10sXG4gICAgWydiYXNlJywgICAgICAgICAgJ1RhZ3MvQmFkZ2VzJywgICAnYWR2YW5jZWQnXSxcbiAgICBbJ2ZnLW11dGVkJywgICAgICAnRGltIFRleHQnLCAgICAgICdhZHZhbmNlZCddLFxuICAgIFsnc3VjY2VzcycsICAgICAgICdTdWNjZXNzJywgICAgICAgJ2FkdmFuY2VkJ10sXG4gICAgWydlcnJvcicsICAgICAgICAgJ0Vycm9yJywgICAgICAgICAnYWR2YW5jZWQnXSxcbiAgICBbJ3dhcm5pbmcnLCAgICAgICAnV2FybmluZycsICAgICAgICdhZHZhbmNlZCddLFxuICBdO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGVtZSBDeWNsZSBCdXR0b24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgdmFyIHRoZW1lQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lJyk7XG4gIGlmICghdGhlbWVCdG4pIHJldHVybjtcbiAgdmFyIHRoZW1lTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtbGFiZWwnKTtcblxuICBmdW5jdGlvbiBnZXRMYWJlbEZvcih0KSB7XG4gICAgaWYgKFRIRU1FX0xBQkVMU1t0XSkgcmV0dXJuIFRIRU1FX0xBQkVMU1t0XTtcbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICBpZiAodXNlclRoZW1lc1t0XSkgcmV0dXJuIHVzZXJUaGVtZXNbdF0ubmFtZSB8fCB0O1xuICAgIHJldHVybiB0O1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlTGFiZWwoKSB7XG4gICAgaWYgKHRoZW1lTGFiZWwpIHRoZW1lTGFiZWwudGV4dENvbnRlbnQgPSBnZXRMYWJlbEZvcih3aW5kb3cuZ2V0QWN0aXZlVGhlbWUoKSk7XG4gIH1cblxuICB0aGVtZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGlzdCA9IHdpbmRvdy5USEVNRVMuc2xpY2UoKTtcbiAgICB2YXIgY3VycmVudCA9IHdpbmRvdy5nZXRBY3RpdmVUaGVtZSgpO1xuICAgIHZhciBpZHggPSBsaXN0LmluZGV4T2YoY3VycmVudCk7XG4gICAgdmFyIG5leHQgPSBsaXN0WyhpZHggKyAxKSAlIGxpc3QubGVuZ3RoXTtcbiAgICB3aW5kb3cuYXBwbHlUaGVtZShuZXh0KTtcbiAgICB1cGRhdGVMYWJlbCgpO1xuICB9KTtcblxuICB1cGRhdGVMYWJlbCgpO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGVtZSBCdWlsZGVyIE1vZGFsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGJ1aWxkRmllbGRzSFRNTCgpIHtcbiAgICB2YXIgc2VjdGlvbnMgPSB7IGJhc2U6ICdCYXNlIENvbG9ycycsIGFjY2VudDogJ0FjY2VudCcsIHN0YXR1czogJ1N0YXR1cycsIGFkdmFuY2VkOiAnQWR2YW5jZWQgKGF1dG8tZGVyaXZlZCknIH07XG4gICAgdmFyIGdyb3VwZWQgPSB7fTtcbiAgICBGSUVMRFMuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuICAgICAgaWYgKCFncm91cGVkW2ZbMl1dKSBncm91cGVkW2ZbMl1dID0gW107XG4gICAgICBncm91cGVkW2ZbMl1dLnB1c2goZik7XG4gICAgfSk7XG5cbiAgICB2YXIgaHRtbCA9ICcnO1xuICAgIE9iamVjdC5rZXlzKHNlY3Rpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdhZHZhbmNlZCcpIHtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBpZD1cInRoZW1lLWJ1aWxkZXItYWR2YW5jZWQtdG9nZ2xlXCIgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLWFkdmFuY2VkLXRvZ2dsZVwiIHN0eWxlPVwibWFyZ2luOjEycHggMCA0cHg7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6dmFyKC0tYWNjZW50KTtmb250LXNpemU6Ljg1cmVtO3VzZXItc2VsZWN0Om5vbmU7XCI+U2hvdyBhZHZhbmNlZCBjb2xvcnMgJiM5NjYwOzwvZGl2Pic7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgaWQ9XCJ0aGVtZS1idWlsZGVyLWFkdmFuY2VkXCIgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItc2VjdGlvblwiPic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwidGhlbWUtYnVpbGRlci1zZWN0aW9uLXRpdGxlXCI+JyArIHNlY3Rpb25zW2tleV0gKyAnPC9kaXY+JztcbiAgICAgIChncm91cGVkW2tleV0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItcm93XCI+JyArXG4gICAgICAgICAgJzxzcGFuIGNsYXNzPVwidGhlbWUtYnVpbGRlci1sYWJlbFwiPicgKyBmWzFdICsgJzwvc3Bhbj4nICtcbiAgICAgICAgICAnPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwidGhlbWUtYnVpbGRlci1jb2xvclwiIGRhdGEtcHJvcD1cIicgKyBmWzBdICsgJ1wiJyArIChrZXkgPT09ICdhZHZhbmNlZCcgPyAnIGRhdGEtYWR2YW5jZWQ9XCIxXCInIDogJycpICsgJyB2YWx1ZT1cIiMwMDAwMDBcIiAvPicgK1xuICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItaGV4XCIgZGF0YS1oZXg9XCInICsgZlswXSArICdcIj4jMDAwMDAwPC9zcGFuPicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgfSk7XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIH0pO1xuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRTdGFydEZyb21PcHRpb25zKCkge1xuICAgIHJldHVybiB3aW5kb3cuVEhFTUVTLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuICc8b3B0aW9uIHZhbHVlPVwiJyArIHQgKyAnXCI+JyArIGdldExhYmVsRm9yKHQpICsgJzwvb3B0aW9uPic7XG4gICAgfSkuam9pbignJyk7XG4gIH1cblxuICB2YXIgbW9kYWxIVE1MID0gJzxkaXYgaWQ9XCJ0aGVtZS1idWlsZGVyLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDo0MjBweDttYXgtd2lkdGg6NTYwcHg7XCI+JyArXG4gICAgJzxoMz5UaGVtZSBCdWlsZGVyPC9oMz4nICtcblxuICAgIC8vIEVkaXQgZXhpc3RpbmcgdXNlciB0aGVtZXMgZHJvcGRvd25cbiAgICAnPGRpdiBpZD1cInRoZW1lLWJ1aWxkZXItZXhpc3RpbmdcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTZweDtkaXNwbGF5Om5vbmU7XCI+JyArXG4gICAgJzxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTouODVyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1yaWdodDo4cHg7XCI+RWRpdDo8L2xhYmVsPicgK1xuICAgICc8c2VsZWN0IGlkPVwidGhlbWUtYnVpbGRlci1lZGl0LXNlbGVjdFwiIHN0eWxlPVwicGFkZGluZzo2cHggMTBweDtiYWNrZ3JvdW5kOnZhcigtLWNhcmQtYmcpO2NvbG9yOnZhcigtLWZnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOi44NXJlbTttYXJnaW4tcmlnaHQ6OHB4O1wiPicgK1xuICAgICc8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IE5ldyBUaGVtZSBcdTIwMTQ8L29wdGlvbj4nICtcbiAgICAnPC9zZWxlY3Q+JyArXG4gICAgJzxidXR0b24gaWQ9XCJ0aGVtZS1idWlsZGVyLWRlbGV0ZVwiIHN0eWxlPVwicGFkZGluZzo0cHggMTBweDtiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLHZhcigtLWJhZC1mZykgMTUlLHRyYW5zcGFyZW50KTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJhZC1mZyk7Y29sb3I6dmFyKC0tYmFkLWZnKTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6LjhyZW07Y3Vyc29yOnBvaW50ZXI7XCI+RGVsZXRlPC9idXR0b24+JyArXG4gICAgJzwvZGl2PicgK1xuXG4gICAgJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCI+JyArXG4gICAgJzxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTouODVyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1yaWdodDo4cHg7XCI+TmFtZTo8L2xhYmVsPicgK1xuICAgICc8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRoZW1lLWJ1aWxkZXItbmFtZVwiIG1heGxlbmd0aD1cIjIwXCIgcGxhY2Vob2xkZXI9XCJNeSBUaGVtZVwiICcgK1xuICAgICdzdHlsZT1cInBhZGRpbmc6NnB4IDEwcHg7YmFja2dyb3VuZDp2YXIoLS1jYXJkLWJnKTtjb2xvcjp2YXIoLS1mZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTouODVyZW07d2lkdGg6MTQwcHg7XCIgLz4nICtcbiAgICAnPC9kaXY+JyArXG5cbiAgICAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTZweDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO1wiPicgK1xuICAgICc8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6Ljg1cmVtO2NvbG9yOnZhcigtLW11dGVkKTttYXJnaW4tcmlnaHQ6OHB4O2N1cnNvcjpwb2ludGVyO1wiIGZvcj1cInRoZW1lLWJ1aWxkZXItbGlnaHRiZ1wiPicgK1xuICAgICc8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ0aGVtZS1idWlsZGVyLWxpZ2h0YmdcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo2cHg7Y3Vyc29yOnBvaW50ZXI7dmVydGljYWwtYWxpZ246bWlkZGxlO1wiIC8+JyArXG4gICAgJ0xpZ2h0IGJhY2tncm91bmQgKHVzZSBkYXJrIGxvZ28pPC9sYWJlbD4nICtcbiAgICAnPC9kaXY+JyArXG5cbiAgICAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTZweDtcIj4nICtcbiAgICAnPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOi44NXJlbTtjb2xvcjp2YXIoLS1tdXRlZCk7bWFyZ2luLXJpZ2h0OjhweDtcIj5TdGFydCBmcm9tOjwvbGFiZWw+JyArXG4gICAgJzxzZWxlY3QgaWQ9XCJ0aGVtZS1idWlsZGVyLXN0YXJ0XCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxMHB4O2JhY2tncm91bmQ6dmFyKC0tY2FyZC1iZyk7Y29sb3I6dmFyKC0tZmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6Ljg1cmVtO1wiPicgK1xuICAgIGJ1aWxkU3RhcnRGcm9tT3B0aW9ucygpICtcbiAgICAnPC9zZWxlY3Q+JyArXG4gICAgJzwvZGl2PicgK1xuXG4gICAgJzxkaXYgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLXByZXZpZXdcIiBpZD1cInRoZW1lLWJ1aWxkZXItcHJldmlld1wiPicgK1xuICAgICc8ZGl2IGNsYXNzPVwidGhlbWUtYnVpbGRlci1jYXJkXCIgaWQ9XCJ0aGVtZS1wcmV2aWV3LWNhcmRcIj4nICtcbiAgICAnPGRpdiBjbGFzcz1cInByZXZpZXctdGl0bGVcIj5TYW1wbGUgQ2FyZDwvZGl2PicgK1xuICAgICc8ZGl2IGNsYXNzPVwicHJldmlldy1tdXRlZFwiPlNlY29uZGFyeSB0ZXh0IHByZXZpZXc8L2Rpdj4nICtcbiAgICAnPGRpdiBjbGFzcz1cInByZXZpZXctYmFkZ2VzXCI+JyArXG4gICAgJzxzcGFuIGNsYXNzPVwicHJldmlldy1iYWRnZVwiIGlkPVwicHJldmlldy1iYWRnZS1va1wiPk9OPC9zcGFuPicgK1xuICAgICc8c3BhbiBjbGFzcz1cInByZXZpZXctYmFkZ2VcIiBpZD1cInByZXZpZXctYmFkZ2UtYmFkXCI+T0ZGPC9zcGFuPicgK1xuICAgICc8L2Rpdj4nICtcbiAgICAnPGRpdiBjbGFzcz1cInByZXZpZXctZG90c1wiPicgK1xuICAgICc8c3Bhbj48c3BhbiBjbGFzcz1cInByZXZpZXctZG90XCIgaWQ9XCJwcmV2aWV3LWRvdC1va1wiPjwvc3Bhbj4gT25saW5lPC9zcGFuPicgK1xuICAgICc8c3Bhbj48c3BhbiBjbGFzcz1cInByZXZpZXctZG90XCIgaWQ9XCJwcmV2aWV3LWRvdC1iYWRcIj48L3NwYW4+IE9mZmxpbmU8L3NwYW4+JyArXG4gICAgJzwvZGl2PicgK1xuICAgICc8YnV0dG9uIGNsYXNzPVwicHJldmlldy1idG5cIiBpZD1cInByZXZpZXctYWNjZW50LWJ0blwiPkFjY2VudCBCdXR0b248L2J1dHRvbj4nICtcbiAgICAnPC9kaXY+JyArXG4gICAgJzwvZGl2PicgK1xuXG4gICAgYnVpbGRGaWVsZHNIVE1MKCkgK1xuXG4gICAgJzxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIj4nICtcbiAgICAnPGJ1dHRvbiBpZD1cInRoZW1lLWJ1aWxkZXItY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+JyArXG4gICAgJzxidXR0b24gaWQ9XCJ0aGVtZS1idWlsZGVyLWltcG9ydFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6YXV0bztcIiB0aXRsZT1cIkltcG9ydCB0aGVtZSBmcm9tIEpTT04gZmlsZVwiPkltcG9ydDwvYnV0dG9uPicgK1xuICAgICc8YnV0dG9uIGlkPVwidGhlbWUtYnVpbGRlci1leHBvcnRcIiB0aXRsZT1cIkV4cG9ydCB0aGVtZSBhcyBKU09OIGZpbGVcIj5FeHBvcnQ8L2J1dHRvbj4nICtcbiAgICAnPGJ1dHRvbiBpZD1cInRoZW1lLWJ1aWxkZXItc2F2ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiPlNhdmUgVGhlbWU8L2J1dHRvbj4nICtcbiAgICAnPC9kaXY+JyArXG4gICAgJzwvZGl2PjwvZGl2Pic7XG5cbiAgaW5qZWN0TW9kYWwoJ3RoZW1lLWJ1aWxkZXItbW9kYWwnLCBtb2RhbEhUTUwpO1xuXG4gIHZhciBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLW1vZGFsJyk7XG4gIHZhciBzdGFydFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLXN0YXJ0Jyk7XG4gIHZhciBuYW1lSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1uYW1lJyk7XG4gIHZhciBlZGl0U2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItZWRpdC1zZWxlY3QnKTtcbiAgdmFyIGV4aXN0aW5nU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWV4aXN0aW5nJyk7XG4gIHZhciBsaWdodEJnQ2hlY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1saWdodGJnJyk7XG4gIHZhciBwaWNrZXJzID0gbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnRoZW1lLWJ1aWxkZXItY29sb3InKTtcbiAgdmFyIGFkdmFuY2VkU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWFkdmFuY2VkJyk7XG4gIHZhciBhZHZhbmNlZFRvZ2dsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWFkdmFuY2VkLXRvZ2dsZScpO1xuICB2YXIgZXhwb3J0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItZXhwb3J0Jyk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEFkdmFuY2VkIHRvZ2dsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICB2YXIgYWR2YW5jZWRWaXNpYmxlID0gZmFsc2U7XG4gIGFkdmFuY2VkVG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGFkdmFuY2VkVmlzaWJsZSA9ICFhZHZhbmNlZFZpc2libGU7XG4gICAgYWR2YW5jZWRTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBhZHZhbmNlZFZpc2libGUgPyAnJyA6ICdub25lJztcbiAgICBhZHZhbmNlZFRvZ2dsZS5pbm5lckhUTUwgPSBhZHZhbmNlZFZpc2libGVcbiAgICAgID8gJ0hpZGUgYWR2YW5jZWQgY29sb3JzICYjOTY1MDsnXG4gICAgICA6ICdTaG93IGFkdmFuY2VkIGNvbG9ycyAmIzk2NjA7JztcbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENvbG9yIHBpY2tlciBoZWxwZXJzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGdldEN1cnJlbnRDb2xvcnMoKSB7XG4gICAgdmFyIGNvbG9ycyA9IHt9O1xuICAgIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgY29sb3JzW3AuZGF0YXNldC5wcm9wXSA9IHAudmFsdWU7XG4gICAgfSk7XG4gICAgY29sb3JzWydjYXJkLWJnJ10gPSBjb2xvcnNbJ2NhcmQtYmFzZSddO1xuICAgIHJldHVybiBjb2xvcnM7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCYXNlQ29sb3JzKCkge1xuICAgIHZhciBjb2xvcnMgPSB7fTtcbiAgICBwaWNrZXJzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIGlmICghcC5kYXRhc2V0LmFkdmFuY2VkKSBjb2xvcnNbcC5kYXRhc2V0LnByb3BdID0gcC52YWx1ZTtcbiAgICB9KTtcbiAgICBjb2xvcnNbJ2NhcmQtYmcnXSA9IGNvbG9yc1snY2FyZC1iYXNlJ107XG4gICAgaWYgKGxpZ2h0QmdDaGVjay5jaGVja2VkKSBjb2xvcnMubGlnaHRCZyA9IHRydWU7XG4gICAgcmV0dXJuIGNvbG9ycztcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUFkdmFuY2VkRnJvbURlcml2ZWQoKSB7XG4gICAgdmFyIGJhc2UgPSBnZXRCYXNlQ29sb3JzKCk7XG4gICAgdmFyIGRlcml2ZWQgPSB3aW5kb3cuZGVyaXZlRXh0ZW5kZWRDb2xvcnMgPyB3aW5kb3cuZGVyaXZlRXh0ZW5kZWRDb2xvcnMoYmFzZSkgOiB7fTtcbiAgICBwaWNrZXJzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIGlmIChwLmRhdGFzZXQuYWR2YW5jZWQgJiYgIWFkdmFuY2VkT3ZlcnJpZGVzW3AuZGF0YXNldC5wcm9wXSkge1xuICAgICAgICB2YXIgdmFsID0gZGVyaXZlZFtwLmRhdGFzZXQucHJvcF0gfHwgJyMzMzMzMzMnO1xuICAgICAgICBwLnZhbHVlID0gdmFsO1xuICAgICAgICB2YXIgaGV4ID0gbW9kYWwucXVlcnlTZWxlY3RvcignW2RhdGEtaGV4PVwiJyArIHAuZGF0YXNldC5wcm9wICsgJ1wiXScpO1xuICAgICAgICBpZiAoaGV4KSBoZXgudGV4dENvbnRlbnQgPSB2YWwudG9VcHBlckNhc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWRUaGVtZUludG9QaWNrZXJzKHRoZW1lTmFtZSkge1xuICAgIHZhciBjb2xvcnMgPSB3aW5kb3cuVEhFTUVfQ09MT1JTW3RoZW1lTmFtZV07XG4gICAgaWYgKCFjb2xvcnMpIHJldHVybjtcbiAgICBhZHZhbmNlZE92ZXJyaWRlcyA9IHt9O1xuICAgIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgdmFyIHZhbCA9IGNvbG9yc1twLmRhdGFzZXQucHJvcF0gfHwgJyMwMDAwMDAnO1xuICAgICAgaWYgKHZhbC5zdGFydHNXaXRoKCdyZ2JhJykgfHwgdmFsLnN0YXJ0c1dpdGgoJ2NvbG9yLW1peCcpKSB2YWwgPSAnIzMzMzMzMyc7XG4gICAgICBwLnZhbHVlID0gdmFsO1xuICAgICAgdmFyIGhleCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhleD1cIicgKyBwLmRhdGFzZXQucHJvcCArICdcIl0nKTtcbiAgICAgIGlmIChoZXgpIGhleC50ZXh0Q29udGVudCA9IHZhbC50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuICAgIGxpZ2h0QmdDaGVjay5jaGVja2VkID0gISFjb2xvcnMubGlnaHRCZztcbiAgICB1cGRhdGVQcmV2aWV3KCk7XG4gIH1cblxuICBmdW5jdGlvbiBsb2FkVXNlclRoZW1lSW50b1BpY2tlcnMoc2x1Zykge1xuICAgIHZhciB1c2VyVGhlbWVzID0gc2FmZUdldEpTT04od2luZG93LlVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIHZhciB0aGVtZSA9IHVzZXJUaGVtZXNbc2x1Z107XG4gICAgaWYgKCF0aGVtZSkgcmV0dXJuO1xuICAgIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307XG4gICAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICB2YXIgdmFsID0gdGhlbWVbcC5kYXRhc2V0LnByb3BdIHx8ICcjMDAwMDAwJztcbiAgICAgIHAudmFsdWUgPSB2YWw7XG4gICAgICB2YXIgaGV4ID0gbW9kYWwucXVlcnlTZWxlY3RvcignW2RhdGEtaGV4PVwiJyArIHAuZGF0YXNldC5wcm9wICsgJ1wiXScpO1xuICAgICAgaWYgKGhleCkgaGV4LnRleHRDb250ZW50ID0gdmFsLnRvVXBwZXJDYXNlKCk7XG4gICAgICAvLyBJZiB0aGVtZSBoYXMgZXhwbGljaXQgYWR2YW5jZWQgdmFsdWVzLCBtYXJrIGFzIG92ZXJyaWRkZW5cbiAgICAgIGlmIChwLmRhdGFzZXQuYWR2YW5jZWQgJiYgdGhlbWVbcC5kYXRhc2V0LnByb3BdKSB7XG4gICAgICAgIGFkdmFuY2VkT3ZlcnJpZGVzW3AuZGF0YXNldC5wcm9wXSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbmFtZUlucHV0LnZhbHVlID0gdGhlbWUubmFtZSB8fCAnJztcbiAgICBsaWdodEJnQ2hlY2suY2hlY2tlZCA9ICEhdGhlbWUubGlnaHRCZztcbiAgICAvLyBGaWxsIGFueSBtaXNzaW5nIGFkdmFuY2VkIGZpZWxkcyBmcm9tIGRlcml2YXRpb25cbiAgICB1cGRhdGVBZHZhbmNlZEZyb21EZXJpdmVkKCk7XG4gICAgdXBkYXRlUHJldmlldygpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlUHJldmlldygpIHtcbiAgICB2YXIgYyA9IGdldEN1cnJlbnRDb2xvcnMoKTtcbiAgICB2YXIgcHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLXByZXZpZXcnKTtcbiAgICB2YXIgY2FyZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1wcmV2aWV3LWNhcmQnKTtcbiAgICB2YXIgdGl0bGUgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5wcmV2aWV3LXRpdGxlJyk7XG4gICAgdmFyIG11dGVkID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcucHJldmlldy1tdXRlZCcpO1xuICAgIHZhciBiYWRnZU9rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctYmFkZ2Utb2snKTtcbiAgICB2YXIgYmFkZ2VCYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldy1iYWRnZS1iYWQnKTtcbiAgICB2YXIgZG90T2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldy1kb3Qtb2snKTtcbiAgICB2YXIgZG90QmFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctZG90LWJhZCcpO1xuICAgIHZhciBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldy1hY2NlbnQtYnRuJyk7XG4gICAgdmFyIGRvdHMgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5wcmV2aWV3LWRvdHMnKTtcblxuICAgIHByZXZpZXcuc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2JnJ107XG4gICAgY2FyZC5zdHlsZS5iYWNrZ3JvdW5kID0gY1snY2FyZC1iYXNlJ107XG4gICAgY2FyZC5zdHlsZS5ib3JkZXJDb2xvciA9IGNbJ2JvcmRlciddO1xuICAgIHRpdGxlLnN0eWxlLmNvbG9yID0gY1snZmcnXTtcbiAgICBtdXRlZC5zdHlsZS5jb2xvciA9IGNbJ211dGVkJ107XG4gICAgYmFkZ2VPay5zdHlsZS5iYWNrZ3JvdW5kID0gY1snb2stYmcnXTtcbiAgICBiYWRnZU9rLnN0eWxlLmNvbG9yID0gY1snb2stZmcnXTtcbiAgICBiYWRnZUJhZC5zdHlsZS5iYWNrZ3JvdW5kID0gY1snYmFkLWJnJ107XG4gICAgYmFkZ2VCYWQuc3R5bGUuY29sb3IgPSBjWydiYWQtZmcnXTtcbiAgICBkb3RPay5zdHlsZS5iYWNrZ3JvdW5kID0gY1snZG90LW9rJ107XG4gICAgZG90QmFkLnN0eWxlLmJhY2tncm91bmQgPSBjWydkb3QtYmFkJ107XG4gICAgZG90cy5zdHlsZS5jb2xvciA9IGNbJ2ZnJ107XG4gICAgYnRuLnN0eWxlLmJhY2tncm91bmQgPSBjWydhY2NlbnQnXTtcbiAgICBidG4uc3R5bGUuY29sb3IgPSBjWydiZyddO1xuICB9XG5cbiAgZnVuY3Rpb24gYXBwbHlDb2xvcnNMaXZlKGNvbG9ycykge1xuICAgIC8vIEluY2x1ZGUgZGVyaXZlZCBjb2xvcnMgZm9yIGZ1bGwgbGl2ZSBwcmV2aWV3XG4gICAgdmFyIGRlcml2ZWQgPSB3aW5kb3cuZGVyaXZlRXh0ZW5kZWRDb2xvcnMgPyB3aW5kb3cuZGVyaXZlRXh0ZW5kZWRDb2xvcnMoY29sb3JzKSA6IHt9O1xuICAgIHdpbmRvdy5USEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICB2YXIgdmFsID0gY29sb3JzW3Byb3BdIHx8IGRlcml2ZWRbcHJvcF07XG4gICAgICBpZiAodmFsKSB7XG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS0nICsgcHJvcCwgdmFsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFdpcmUgdXAgY29sb3IgcGlja2Vyc1xuICBwaWNrZXJzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICBwLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGhleCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhleD1cIicgKyBwLmRhdGFzZXQucHJvcCArICdcIl0nKTtcbiAgICAgIGlmIChoZXgpIGhleC50ZXh0Q29udGVudCA9IHAudmFsdWUudG9VcHBlckNhc2UoKTtcblxuICAgICAgLy8gVHJhY2sgbWFudWFsIGFkdmFuY2VkIG92ZXJyaWRlc1xuICAgICAgaWYgKHAuZGF0YXNldC5hZHZhbmNlZCkge1xuICAgICAgICBhZHZhbmNlZE92ZXJyaWRlc1twLmRhdGFzZXQucHJvcF0gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQmFzZSBjb2xvciBjaGFuZ2VkIFx1MjAxNCByZS1kZXJpdmUgYWR2YW5jZWQgdmFsdWVzICh1bmxlc3Mgb3ZlcnJpZGRlbilcbiAgICAgICAgdXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCgpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVQcmV2aWV3KCk7XG4gICAgICBhcHBseUNvbG9yc0xpdmUoZ2V0Q3VycmVudENvbG9ycygpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gTGlnaHQtYmcgY2hlY2tib3ggc2hvdWxkIHJlLWRlcml2ZSBhZHZhbmNlZCBjb2xvcnNcbiAgbGlnaHRCZ0NoZWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICB1cGRhdGVBZHZhbmNlZEZyb21EZXJpdmVkKCk7XG4gICAgdXBkYXRlUHJldmlldygpO1xuICAgIGFwcGx5Q29sb3JzTGl2ZShnZXRDdXJyZW50Q29sb3JzKCkpO1xuICB9KTtcblxuICBzdGFydFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTtcbiAgICBsb2FkVGhlbWVJbnRvUGlja2VycyhzdGFydFNlbGVjdC52YWx1ZSk7XG4gICAgYXBwbHlDb2xvcnNMaXZlKGdldEN1cnJlbnRDb2xvcnMoKSk7XG4gIH0pO1xuXG4gIC8vIFBvcHVsYXRlIGFuZCByZWZyZXNoIHRoZSBlZGl0LWV4aXN0aW5nIGRyb3Bkb3duXG4gIGZ1bmN0aW9uIHJlZnJlc2hFZGl0RHJvcGRvd24oKSB7XG4gICAgdmFyIHVzZXJUaGVtZXMgPSBzYWZlR2V0SlNPTih3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgdmFyIHNsdWdzID0gT2JqZWN0LmtleXModXNlclRoZW1lcyk7XG4gICAgZWRpdFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPlx1MjAxNCBOZXcgVGhlbWUgXHUyMDE0PC9vcHRpb24+JztcbiAgICBzbHVncy5mb3JFYWNoKGZ1bmN0aW9uIChzbHVnKSB7XG4gICAgICB2YXIgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICBvcHQudmFsdWUgPSBzbHVnO1xuICAgICAgb3B0LnRleHRDb250ZW50ID0gdXNlclRoZW1lc1tzbHVnXS5uYW1lIHx8IHNsdWc7XG4gICAgICBlZGl0U2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgfSk7XG4gICAgZXhpc3RpbmdTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBzbHVncy5sZW5ndGggPyAnJyA6ICdub25lJztcbiAgfVxuXG4gIC8vIEFsc28gcmVmcmVzaCBcIlN0YXJ0IGZyb21cIiBvcHRpb25zXG4gIGZ1bmN0aW9uIHJlZnJlc2hTdGFydEZyb20oKSB7XG4gICAgc3RhcnRTZWxlY3QuaW5uZXJIVE1MID0gYnVpbGRTdGFydEZyb21PcHRpb25zKCk7XG4gIH1cblxuICAvLyBFZGl0IGRyb3Bkb3duIGNoYW5nZVxuICBlZGl0U2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2x1ZyA9IHRoaXMudmFsdWU7XG4gICAgaWYgKHNsdWcpIHtcbiAgICAgIGVkaXRpbmdTbHVnID0gc2x1ZztcbiAgICAgIGxvYWRVc2VyVGhlbWVJbnRvUGlja2VycyhzbHVnKTtcbiAgICAgIGFwcGx5Q29sb3JzTGl2ZShnZXRDdXJyZW50Q29sb3JzKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlZGl0aW5nU2x1ZyA9IG51bGw7XG4gICAgICBhZHZhbmNlZE92ZXJyaWRlcyA9IHt9O1xuICAgICAgbmFtZUlucHV0LnZhbHVlID0gJyc7XG4gICAgICBzdGFydFNlbGVjdC52YWx1ZSA9IHdpbmRvdy5nZXRBY3RpdmVUaGVtZSgpO1xuICAgICAgbG9hZFRoZW1lSW50b1BpY2tlcnMoc3RhcnRTZWxlY3QudmFsdWUpO1xuICAgIH1cbiAgICBleHBvcnRCdG4uc3R5bGUuZGlzcGxheSA9IGVkaXRpbmdTbHVnID8gJycgOiAnbm9uZSc7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIG9wZW5CdWlsZGVyKCkge1xuICAgIHRoZW1lQmVmb3JlQnVpbGRlciA9IHdpbmRvdy5nZXRBY3RpdmVUaGVtZSgpO1xuICAgIGVkaXRpbmdTbHVnID0gbnVsbDtcbiAgICBhZHZhbmNlZE92ZXJyaWRlcyA9IHt9O1xuXG4gICAgLy8gUmVzZXQgYWR2YW5jZWQgc2VjdGlvbiB0byBjb2xsYXBzZWRcbiAgICBhZHZhbmNlZFZpc2libGUgPSBmYWxzZTtcbiAgICBhZHZhbmNlZFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBhZHZhbmNlZFRvZ2dsZS5pbm5lckhUTUwgPSAnU2hvdyBhZHZhbmNlZCBjb2xvcnMgJiM5NjYwOyc7XG5cbiAgICByZWZyZXNoRWRpdERyb3Bkb3duKCk7XG4gICAgcmVmcmVzaFN0YXJ0RnJvbSgpO1xuXG4gICAgdmFyIHVzZXJUaGVtZXMgPSBzYWZlR2V0SlNPTih3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgaWYgKHVzZXJUaGVtZXNbdGhlbWVCZWZvcmVCdWlsZGVyXSkge1xuICAgICAgLy8gQWN0aXZlIHRoZW1lIGlzIGEgdXNlciB0aGVtZSBcdTIwMTQgb3BlbiBpdCBmb3IgZWRpdGluZ1xuICAgICAgZWRpdFNlbGVjdC52YWx1ZSA9IHRoZW1lQmVmb3JlQnVpbGRlcjtcbiAgICAgIGVkaXRpbmdTbHVnID0gdGhlbWVCZWZvcmVCdWlsZGVyO1xuICAgICAgbG9hZFVzZXJUaGVtZUludG9QaWNrZXJzKHRoZW1lQmVmb3JlQnVpbGRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVkaXRTZWxlY3QudmFsdWUgPSAnJztcbiAgICAgIG5hbWVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgc3RhcnRTZWxlY3QudmFsdWUgPSB0aGVtZUJlZm9yZUJ1aWxkZXI7XG4gICAgICBsb2FkVGhlbWVJbnRvUGlja2Vycyh0aGVtZUJlZm9yZUJ1aWxkZXIpO1xuICAgIH1cblxuICAgIGV4cG9ydEJ0bi5zdHlsZS5kaXNwbGF5ID0gZWRpdGluZ1NsdWcgPyAnJyA6ICdub25lJztcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH1cblxuICB2YXIgY3VzdG9taXplQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWN1c3RvbWl6ZS1idG4nKTtcbiAgaWYgKGN1c3RvbWl6ZUJ0bikge1xuICAgIGN1c3RvbWl6ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgb3BlbkJ1aWxkZXIoKTsgfSk7XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgU2F2ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1zYXZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbG9ycyA9IGdldEN1cnJlbnRDb2xvcnMoKTtcbiAgICB2YXIgbmFtZSA9IG5hbWVJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgYSB0aGVtZSBuYW1lJywgJ3dhcm5pbmcnLCAzMDAwKTtcbiAgICAgIG5hbWVJbnB1dC5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB1c2VyVGhlbWVzID0gc2FmZUdldEpTT04od2luZG93LlVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIHZhciBzbHVnO1xuICAgIHZhciBvbGRTbHVnID0gbnVsbDtcblxuICAgIGlmIChlZGl0aW5nU2x1Zykge1xuICAgICAgc2x1ZyA9IGVkaXRpbmdTbHVnO1xuICAgICAgLy8gSWYgbmFtZSBjaGFuZ2VkLCByZS1zbHVnaWZ5IGFuZCBwb3RlbnRpYWxseSByZW5hbWVcbiAgICAgIHZhciBuZXdTbHVnID0gd2luZG93LnNsdWdpZnlUaGVtZU5hbWUobmFtZSwgZWRpdGluZ1NsdWcpO1xuICAgICAgaWYgKG5ld1NsdWcgIT09IGVkaXRpbmdTbHVnKSB7XG4gICAgICAgIG9sZFNsdWcgPSBlZGl0aW5nU2x1ZztcbiAgICAgICAgZGVsZXRlIHVzZXJUaGVtZXNbZWRpdGluZ1NsdWddO1xuICAgICAgICB2YXIgaWR4ID0gd2luZG93LlRIRU1FUy5pbmRleE9mKGVkaXRpbmdTbHVnKTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHdpbmRvdy5USEVNRVMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIGRlbGV0ZSB3aW5kb3cuVEhFTUVfQ09MT1JTW2VkaXRpbmdTbHVnXTtcbiAgICAgICAgc2x1ZyA9IG5ld1NsdWc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNsdWcgPSB3aW5kb3cuc2x1Z2lmeVRoZW1lTmFtZShuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCB0aGVtZSBkYXRhIHdpdGggQUxMIGNvbG9yIHByb3BlcnRpZXNcbiAgICB2YXIgdGhlbWVEYXRhID0geyBuYW1lOiBuYW1lIH07XG4gICAgaWYgKGxpZ2h0QmdDaGVjay5jaGVja2VkKSB0aGVtZURhdGEubGlnaHRCZyA9IHRydWU7XG4gICAgd2luZG93LlRIRU1FX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIGlmIChjb2xvcnNbcF0pIHRoZW1lRGF0YVtwXSA9IGNvbG9yc1twXTtcbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBsb2NhbFN0b3JhZ2UgY2FjaGUgaW1tZWRpYXRlbHkgZm9yIGluc3RhbnQgVUlcbiAgICB1c2VyVGhlbWVzW3NsdWddID0gdGhlbWVEYXRhO1xuICAgIHNhZmVTZXQod2luZG93LlVTRVJfVEhFTUVTX0tFWSwgSlNPTi5zdHJpbmdpZnkodXNlclRoZW1lcykpO1xuXG4gICAgLy8gQ2xlYXIgaW5saW5lIHByZXZpZXcgcHJvcGVydGllc1xuICAgIHdpbmRvdy5jbGVhckN1c3RvbVByb3BlcnRpZXMoKTtcblxuICAgIC8vIFJlLWluamVjdCBDU1MgYW5kIGFwcGx5XG4gICAgd2luZG93LmluamVjdFVzZXJUaGVtZVN0eWxlcygpO1xuICAgIHdpbmRvdy5hcHBseVRoZW1lKHNsdWcpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICB1cGRhdGVMYWJlbCgpO1xuXG4gICAgLy8gU2F2ZSB0byBzZXJ2ZXIgKHNvdXJjZSBvZiB0cnV0aClcbiAgICB2YXIgYXBpQ29sb3JzID0ge307XG4gICAgd2luZG93LlRIRU1FX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHApIHsgaWYgKGNvbG9yc1twXSkgYXBpQ29sb3JzW3BdID0gY29sb3JzW3BdOyB9KTtcblxuICAgIC8vIElmIHNsdWcgY2hhbmdlZCwgZGVsZXRlIHRoZSBvbGQgb25lIGZyb20gc2VydmVyXG4gICAgaWYgKG9sZFNsdWcpIHtcbiAgICAgIHNlY3VyZUZldGNoKCcvYXBpL3YxL3RoZW1lcy8nICsgb2xkU2x1ZywgeyBtZXRob2Q6ICdERUxFVEUnIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbiAgICB9XG5cbiAgICBzZWN1cmVGZXRjaCgnL2FwaS92MS90aGVtZXMvJyArIHNsdWcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IG5hbWUsIGNvbG9yczogYXBpQ29sb3JzLCBsaWdodEJnOiBsaWdodEJnQ2hlY2suY2hlY2tlZCB9KVxuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihuYW1lICsgJyB0aGVtZSBzYXZlZCcsICdzdWNjZXNzJywgMzAwMCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihuYW1lICsgJyB0aGVtZSBzYXZlZCBsb2NhbGx5IChzZXJ2ZXIgc3luYyBmYWlsZWQpJywgJ3dhcm5pbmcnLCAzMDAwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENhbmNlbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1jYW5jZWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgd2luZG93LmNsZWFyQ3VzdG9tUHJvcGVydGllcygpO1xuICAgIGlmICh0aGVtZUJlZm9yZUJ1aWxkZXIpIHtcbiAgICAgIHdpbmRvdy5hcHBseVRoZW1lKHRoZW1lQmVmb3JlQnVpbGRlcik7XG4gICAgfVxuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgRGVsZXRlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWRlbGV0ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghZWRpdGluZ1NsdWcpIHJldHVybjtcblxuICAgIHZhciB1c2VyVGhlbWVzID0gc2FmZUdldEpTT04od2luZG93LlVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIHZhciBuYW1lID0gdXNlclRoZW1lc1tlZGl0aW5nU2x1Z10gPyB1c2VyVGhlbWVzW2VkaXRpbmdTbHVnXS5uYW1lIDogZWRpdGluZ1NsdWc7XG5cbiAgICBpZiAoIWNvbmZpcm0oJ0RlbGV0ZSBcIicgKyBuYW1lICsgJ1wiIHRoZW1lPycpKSByZXR1cm47XG5cbiAgICB2YXIgc2x1Z1RvRGVsZXRlID0gZWRpdGluZ1NsdWc7XG5cbiAgICAvLyBVcGRhdGUgbG9jYWxTdG9yYWdlIGNhY2hlIGltbWVkaWF0ZWx5XG4gICAgZGVsZXRlIHVzZXJUaGVtZXNbc2x1Z1RvRGVsZXRlXTtcbiAgICBzYWZlU2V0KHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIEpTT04uc3RyaW5naWZ5KHVzZXJUaGVtZXMpKTtcblxuICAgIC8vIFJlbW92ZSBmcm9tIHJ1bnRpbWVcbiAgICB2YXIgaWR4ID0gd2luZG93LlRIRU1FUy5pbmRleE9mKHNsdWdUb0RlbGV0ZSk7XG4gICAgaWYgKGlkeCAhPT0gLTEpIHdpbmRvdy5USEVNRVMuc3BsaWNlKGlkeCwgMSk7XG4gICAgZGVsZXRlIHdpbmRvdy5USEVNRV9DT0xPUlNbc2x1Z1RvRGVsZXRlXTtcblxuICAgIHdpbmRvdy5jbGVhckN1c3RvbVByb3BlcnRpZXMoKTtcbiAgICB3aW5kb3cuaW5qZWN0VXNlclRoZW1lU3R5bGVzKCk7XG5cbiAgICB2YXIgZmFsbGJhY2sgPSB0aGVtZUJlZm9yZUJ1aWxkZXIgJiYgdGhlbWVCZWZvcmVCdWlsZGVyICE9PSBzbHVnVG9EZWxldGUgPyB0aGVtZUJlZm9yZUJ1aWxkZXIgOiAnZGFyayc7XG4gICAgd2luZG93LmFwcGx5VGhlbWUoZmFsbGJhY2spO1xuXG4gICAgZWRpdGluZ1NsdWcgPSBudWxsO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICB1cGRhdGVMYWJlbCgpO1xuXG4gICAgLy8gRGVsZXRlIGZyb20gc2VydmVyXG4gICAgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdGhlbWVzLycgKyBzbHVnVG9EZWxldGUsIHsgbWV0aG9kOiAnREVMRVRFJyB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24obmFtZSArICcgdGhlbWUgZGVsZXRlZCcsICdzdWNjZXNzJywgMzAwMCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihuYW1lICsgJyB0aGVtZSBkZWxldGVkIGxvY2FsbHkgKHNlcnZlciBzeW5jIGZhaWxlZCknLCAnd2FybmluZycsIDMwMDApO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgRXhwb3J0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWV4cG9ydCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghZWRpdGluZ1NsdWcpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1NhdmUgdGhlIHRoZW1lIGZpcnN0LCB0aGVuIGV4cG9ydCcsICd3YXJuaW5nJywgMzAwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB1c2VyVGhlbWVzID0gc2FmZUdldEpTT04od2luZG93LlVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIHZhciB0aGVtZSA9IHVzZXJUaGVtZXNbZWRpdGluZ1NsdWddO1xuICAgIGlmICghdGhlbWUpIHJldHVybjtcblxuICAgIHZhciBleHBvcnREYXRhID0ge1xuICAgICAgX2Rhc2hjYWRkeV90aGVtZTogdHJ1ZSxcbiAgICAgIHZlcnNpb246ICcxLjAnLFxuICAgICAgZXhwb3J0RGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgc2x1ZzogZWRpdGluZ1NsdWcsXG4gICAgICBuYW1lOiB0aGVtZS5uYW1lLFxuICAgICAgbGlnaHRCZzogdGhlbWUubGlnaHRCZyB8fCBmYWxzZSxcbiAgICAgIGNvbG9yczoge31cbiAgICB9O1xuICAgIHdpbmRvdy5USEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAodGhlbWVbcF0pIGV4cG9ydERhdGEuY29sb3JzW3BdID0gdGhlbWVbcF07XG4gICAgfSk7XG5cbiAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShleHBvcnREYXRhLCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDtcbiAgICBhLmRvd25sb2FkID0gZWRpdGluZ1NsdWcgKyAnLXRoZW1lLmpzb24nO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgYS5jbGljaygpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgIHNob3dOb3RpZmljYXRpb24oJ1RoZW1lIGV4cG9ydGVkIGFzICcgKyBlZGl0aW5nU2x1ZyArICctdGhlbWUuanNvbicsICdzdWNjZXNzJywgMzAwMCk7XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBJbXBvcnQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItaW1wb3J0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBpbnB1dC50eXBlID0gJ2ZpbGUnO1xuICAgIGlucHV0LmFjY2VwdCA9ICcuanNvbic7XG4gICAgaW5wdXQub25jaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcbiAgICAgIGlmICghZmlsZSkgcmV0dXJuO1xuICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKGV2LnRhcmdldC5yZXN1bHQpO1xuXG4gICAgICAgICAgLy8gU3VwcG9ydCBib3RoIHdyYXBwZWQgZm9ybWF0IGFuZCByYXcgdGhlbWUgZm9ybWF0XG4gICAgICAgICAgdmFyIHRoZW1lTmFtZSwgdGhlbWVDb2xvcnMsIHRoZW1lTGlnaHRCZztcbiAgICAgICAgICBpZiAoZGF0YS5fZGFzaGNhZGR5X3RoZW1lICYmIGRhdGEuY29sb3JzKSB7XG4gICAgICAgICAgICAvLyBXcmFwcGVkIGV4cG9ydCBmb3JtYXRcbiAgICAgICAgICAgIHRoZW1lTmFtZSA9IGRhdGEubmFtZSB8fCAnSW1wb3J0ZWQnO1xuICAgICAgICAgICAgdGhlbWVDb2xvcnMgPSBkYXRhLmNvbG9ycztcbiAgICAgICAgICAgIHRoZW1lTGlnaHRCZyA9IGRhdGEubGlnaHRCZyB8fCBmYWxzZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEubmFtZSAmJiAoZGF0YS5iZyB8fCBkYXRhWydjYXJkLWJhc2UnXSkpIHtcbiAgICAgICAgICAgIC8vIFJhdyB0aGVtZSBKU09OIChzYW1lIGZvcm1hdCBhcyBzZXJ2ZXIgZmlsZXMpXG4gICAgICAgICAgICB0aGVtZU5hbWUgPSBkYXRhLm5hbWU7XG4gICAgICAgICAgICB0aGVtZUNvbG9ycyA9IHt9O1xuICAgICAgICAgICAgd2luZG93LlRIRU1FX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHApIHsgaWYgKGRhdGFbcF0pIHRoZW1lQ29sb3JzW3BdID0gZGF0YVtwXTsgfSk7XG4gICAgICAgICAgICB0aGVtZUxpZ2h0QmcgPSBkYXRhLmxpZ2h0QmcgfHwgZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgdmFsaWQgRGFzaENhZGR5IHRoZW1lIGZpbGUnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBMb2FkIGludG8gYnVpbGRlclxuICAgICAgICAgIG5hbWVJbnB1dC52YWx1ZSA9IHRoZW1lTmFtZTtcbiAgICAgICAgICBsaWdodEJnQ2hlY2suY2hlY2tlZCA9ICEhdGhlbWVMaWdodEJnO1xuICAgICAgICAgIGVkaXRpbmdTbHVnID0gbnVsbDtcbiAgICAgICAgICBlZGl0U2VsZWN0LnZhbHVlID0gJyc7XG4gICAgICAgICAgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTtcblxuICAgICAgICAgIC8vIEFwcGx5IGNvbG9ycyB0byBwaWNrZXJzXG4gICAgICAgICAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gdGhlbWVDb2xvcnNbcC5kYXRhc2V0LnByb3BdIHx8ICcjMDAwMDAwJztcbiAgICAgICAgICAgIHAudmFsdWUgPSB2YWw7XG4gICAgICAgICAgICB2YXIgaGV4ID0gbW9kYWwucXVlcnlTZWxlY3RvcignW2RhdGEtaGV4PVwiJyArIHAuZGF0YXNldC5wcm9wICsgJ1wiXScpO1xuICAgICAgICAgICAgaWYgKGhleCkgaGV4LnRleHRDb250ZW50ID0gdmFsLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAocC5kYXRhc2V0LmFkdmFuY2VkICYmIHRoZW1lQ29sb3JzW3AuZGF0YXNldC5wcm9wXSkge1xuICAgICAgICAgICAgICBhZHZhbmNlZE92ZXJyaWRlc1twLmRhdGFzZXQucHJvcF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRmlsbCBhbnkgbWlzc2luZyBhZHZhbmNlZCBmaWVsZHNcbiAgICAgICAgICB1cGRhdGVBZHZhbmNlZEZyb21EZXJpdmVkKCk7XG4gICAgICAgICAgdXBkYXRlUHJldmlldygpO1xuICAgICAgICAgIGFwcGx5Q29sb3JzTGl2ZShnZXRDdXJyZW50Q29sb3JzKCkpO1xuICAgICAgICAgIGV4cG9ydEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1wiJyArIHRoZW1lTmFtZSArICdcIiBsb2FkZWQgaW50byBidWlsZGVyLiBDbGljayBTYXZlIHRvIGtlZXAgaXQuJywgJ3N1Y2Nlc3MnLCA1MDAwKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignSW1wb3J0IGZhaWxlZDogJyArIGVyci5tZXNzYWdlLCAnZXJyb3InLCA1MDAwKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xuICAgIH07XG4gICAgaW5wdXQuY2xpY2soKTtcbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIE1vZGFsIGNsb3NlIGhhbmRsaW5nIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIHdpcmVNb2RhbChtb2RhbCk7XG5cbiAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIHtcbiAgICAgIHdpbmRvdy5jbGVhckN1c3RvbVByb3BlcnRpZXMoKTtcbiAgICAgIGlmICh0aGVtZUJlZm9yZUJ1aWxkZXIpIHdpbmRvdy5hcHBseVRoZW1lKHRoZW1lQmVmb3JlQnVpbGRlcik7XG4gICAgfVxuICB9KTtcbn0pKCk7XG47XG4vLyBMaWNlbnNlIE1hbmFnZW1lbnQgVUlcbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IGxpY2Vuc2UgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnbGljZW5zZS1tb2RhbCcsIGA8ZGl2IGlkPVwibGljZW5zZS1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDIwcHg7IG1heC13aWR0aDogNTIwcHg7XCI+XG4gICAgICA8aDM+RGFzaENhZGR5IExpY2Vuc2U8L2gzPlxuICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDE2cHg7XCI+XG4gICAgICAgIEFjdGl2YXRlIGEgbGljZW5zZSBjb2RlIHRvIHVubG9jayBwcmVtaXVtIGZlYXR1cmVzLlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IGlkPVwibGljZW5zZS1zdGF0dXMtc2VjdGlvblwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDtcIj5cbiAgICAgICAgPGRpdiBpZD1cImxpY2Vuc2UtYmFkZ2VcIiBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgcGFkZGluZzogNnB4IDE0cHg7IGJvcmRlci1yYWRpdXM6IDIwcHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICA8c3BhbiBpZD1cImxpY2Vuc2UtYmFkZ2UtaWNvblwiPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBpZD1cImxpY2Vuc2UtYmFkZ2UtdGV4dFwiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLWRldGFpbHNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbGluZS1oZWlnaHQ6IDEuNjtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwibGljZW5zZS1hY3RpdmF0ZS1zZWN0aW9uXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPkxpY2Vuc2UgQ29kZTo8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImxpY2Vuc2UtY29kZS1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiREMtWFhYWFgtWFhYWFgtWFhYWFgtWFhYWFgtWFhYWFhcIlxuICAgICAgICAgIG1heGxlbmd0aD1cIjM1XCIgc3BlbGxjaGVjaz1cImZhbHNlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4IDEycHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMXJlbTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgbGV0dGVyLXNwYWNpbmc6IDFweDtcIiAvPlxuICAgICAgICA8cCBjbGFzcz1cInRpbnktaGludFwiPkVudGVyIHlvdXIgbGljZW5zZSBjb2RlIHRvIGFjdGl2YXRlIHByZW1pdW0gZmVhdHVyZXM8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxpY2Vuc2UtZmVhdHVyZXNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogOHB4OyBkaXNwbGF5OiBibG9jaztcIj5QcmVtaXVtIEZlYXR1cmVzOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLWZlYXR1cmUtbGlzdFwiIHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiA4cHg7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxpY2Vuc2UtZXJyb3JcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJvcmRlci1yYWRpdXM6IDRweDsgYmFja2dyb3VuZDogcmdiYSgyMzEsNzYsNjAsMC4xNSk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICA8ZGl2IGlkPVwibGljZW5zZS1zdWNjZXNzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHJnYmEoNDYsMjA0LDExMywwLjE1KTsgY29sb3I6IHZhcigtLW9rLWZnKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwibGljZW5zZS1jYW5jZWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwibGljZW5zZS1kZWFjdGl2YXRlXCIgY2xhc3M9XCJidG4tYWNjZW50XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYWQtYmcpOyBib3JkZXItY29sb3I6IHZhcigtLWJhZC1mZyk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkRlYWN0aXZhdGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImxpY2Vuc2UtYWN0aXZhdGVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5BY3RpdmF0ZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtbW9kYWwnKTtcbiAgY29uc3QgY29kZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtY29kZS1pbnB1dCcpO1xuICBjb25zdCBhY3RpdmF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWFjdGl2YXRlJyk7XG4gIGNvbnN0IGRlYWN0aXZhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1kZWFjdGl2YXRlJyk7XG4gIGNvbnN0IGVycm9yRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1lcnJvcicpO1xuICBjb25zdCBzdWNjZXNzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1zdWNjZXNzJyk7XG4gIGNvbnN0IGJhZGdlSWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWJhZGdlLWljb24nKTtcbiAgY29uc3QgYmFkZ2VUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtYmFkZ2UtdGV4dCcpO1xuICBjb25zdCBiYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWJhZGdlJyk7XG4gIGNvbnN0IGRldGFpbHNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWRldGFpbHMnKTtcbiAgY29uc3QgZmVhdHVyZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1mZWF0dXJlLWxpc3QnKTtcbiAgY29uc3QgYWN0aXZhdGVTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtYWN0aXZhdGUtc2VjdGlvbicpO1xuXG4gIGxldCBjdXJyZW50U3RhdHVzID0gbnVsbDtcblxuICBmdW5jdGlvbiBoaWRlTWVzc2FnZXMoKSB7XG4gICAgZXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHN1Y2Nlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd0Vycm9yKG1zZykge1xuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgZXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dTdWNjZXNzKG1zZykge1xuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIHN1Y2Nlc3NFbC50ZXh0Q29udGVudCA9IG1zZztcbiAgICBzdWNjZXNzRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJTdGF0dXMoc3RhdHVzKSB7XG4gICAgY3VycmVudFN0YXR1cyA9IHN0YXR1cztcblxuICAgIGlmIChzdGF0dXMuYWN0aXZlKSB7XG4gICAgICBiYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoNDYsMjA0LDExMywwLjE1KSc7XG4gICAgICBiYWRnZS5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZyknO1xuICAgICAgYmFkZ2VJY29uLnRleHRDb250ZW50ID0gJ1xcdTI2MDUnO1xuICAgICAgYmFkZ2VUZXh0LnRleHRDb250ZW50ID0gJ1ByZW1pdW0gQWN0aXZlJztcbiAgICAgIGNvbnN0IGV4cGlyeUxpbmUgPSBzdGF0dXMubGlmZXRpbWVcbiAgICAgICAgPyAnPGRpdj5MaWNlbnNlOiA8c3Ryb25nPkxJRkVUSU1FPC9zdHJvbmc+PC9kaXY+J1xuICAgICAgICA6IGA8ZGl2PkV4cGlyZXM6IDxzdHJvbmc+JHtuZXcgRGF0ZShzdGF0dXMuZXhwaXJlc0F0KS50b0xvY2FsZURhdGVTdHJpbmcoKX08L3N0cm9uZz4gKCR7c3RhdHVzLmRheXNSZW1haW5pbmd9IGRheXMgcmVtYWluaW5nKTwvZGl2PmA7XG4gICAgICBkZXRhaWxzRWwuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2PkNvZGU6IDxjb2RlIHN0eWxlPVwiZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj4ke3N0YXR1cy5jb2RlIHx8ICcqKionfTwvY29kZT48L2Rpdj5cbiAgICAgICAgJHtleHBpcnlMaW5lfVxuICAgICAgYDtcbiAgICAgIGFjdGl2YXRlU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgYWN0aXZhdGVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGRlYWN0aXZhdGVCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoMTQ5LDE2NSwxNjYsMC4xNSknO1xuICAgICAgYmFkZ2Uuc3R5bGUuY29sb3IgPSAndmFyKC0tbXV0ZWQpJztcbiAgICAgIGJhZGdlSWNvbi50ZXh0Q29udGVudCA9ICdcXHUyNjA2JztcbiAgICAgIGJhZGdlVGV4dC50ZXh0Q29udGVudCA9IHN0YXR1cy5leHBpcmVkID8gJ0xpY2Vuc2UgRXhwaXJlZCcgOiAnRnJlZSBUaWVyJztcbiAgICAgIGRldGFpbHNFbC5pbm5lckhUTUwgPSBzdGF0dXMuZXhwaXJlZFxuICAgICAgICA/ICc8ZGl2PllvdXIgbGljZW5zZSBoYXMgZXhwaXJlZC4gRW50ZXIgYSBuZXcgY29kZSB0byByZW5ldy48L2Rpdj4nXG4gICAgICAgIDogJzxkaXY+RW50ZXIgYSBsaWNlbnNlIGNvZGUgdG8gdW5sb2NrIHByZW1pdW0gZmVhdHVyZXMuPC9kaXY+JztcbiAgICAgIGFjdGl2YXRlU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBhY3RpdmF0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBkZWFjdGl2YXRlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIGZlYXR1cmUgbGlzdFxuICAgIGNvbnN0IGZlYXR1cmVzID0gc3RhdHVzLnByZW1pdW1GZWF0dXJlcyB8fCB7fTtcbiAgICBjb25zdCBhY3RpdmVGZWF0dXJlcyA9IG5ldyBTZXQoc3RhdHVzLmZlYXR1cmVzIHx8IFtdKTtcbiAgICBmZWF0dXJlTGlzdC5pbm5lckhUTUwgPSBPYmplY3QuZW50cmllcyhmZWF0dXJlcykubWFwKChba2V5LCBpbmZvXSkgPT4ge1xuICAgICAgY29uc3QgYWN0aXZlID0gYWN0aXZlRmVhdHVyZXMuaGFzKGtleSk7XG4gICAgICByZXR1cm4gYDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgcGFkZGluZzogOHB4IDEycHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxLjFyZW07XCI+JHthY3RpdmUgPyAnXFx1MjcwNScgOiAnXFx1RDgzRFxcdUREMTInfTwvc3Bhbj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JHtpbmZvLm5hbWV9PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2luZm8uZGVzY3JpcHRpb259PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgICB9KS5qb2luKCcnKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRTdGF0dXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9saWNlbnNlL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICByZW5kZXJTdGF0dXMoZGF0YS5saWNlbnNlKTtcbiAgICAgICAgdXBkYXRlSGVhZGVyQmFkZ2UoZGF0YS5saWNlbnNlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBsb2FkIGxpY2Vuc2Ugc3RhdHVzOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVMaWNlbnNlKCkge1xuICAgIGNvbnN0IGNvZGUgPSBjb2RlSW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGlmICghY29kZSkge1xuICAgICAgc2hvd0Vycm9yKCdQbGVhc2UgZW50ZXIgYSBsaWNlbnNlIGNvZGUuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgYWN0aXZhdGVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGFjdGl2YXRlQnRuLnRleHRDb250ZW50ID0gJ0FjdGl2YXRpbmcuLi4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9saWNlbnNlL2FjdGl2YXRlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY29kZSB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd1N1Y2Nlc3MoZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgY29kZUlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgIHJlbmRlclN0YXR1cyhkYXRhLmxpY2Vuc2UpO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdMaWNlbnNlIGFjdGl2YXRlZCEgUHJlbWl1bSBmZWF0dXJlcyB1bmxvY2tlZC4nLCAnc3VjY2VzcycsIDUwMDApO1xuICAgICAgICB1cGRhdGVIZWFkZXJCYWRnZShkYXRhLmxpY2Vuc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd0Vycm9yKGRhdGEuZXJyb3IgfHwgJ0FjdGl2YXRpb24gZmFpbGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd0Vycm9yKCdOZXR3b3JrIGVycm9yOiAnICsgZS5tZXNzYWdlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYWN0aXZhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGFjdGl2YXRlQnRuLnRleHRDb250ZW50ID0gJ0FjdGl2YXRlJztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkZWFjdGl2YXRlTGljZW5zZSgpIHtcbiAgICBpZiAoIWNvbmZpcm0oJ0RlYWN0aXZhdGUgeW91ciBsaWNlbnNlPyBZb3UgY2FuIHJldXNlIHRoZSBjb2RlIG9uIGFub3RoZXIgbWFjaGluZS4nKSkgcmV0dXJuO1xuXG4gICAgZGVhY3RpdmF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgZGVhY3RpdmF0ZUJ0bi50ZXh0Q29udGVudCA9ICdEZWFjdGl2YXRpbmcuLi4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9saWNlbnNlL2RlYWN0aXZhdGUnLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dTdWNjZXNzKGRhdGEubWVzc2FnZSk7XG4gICAgICAgIGF3YWl0IGxvYWRTdGF0dXMoKTtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignTGljZW5zZSBkZWFjdGl2YXRlZC4nLCAnaW5mbycsIDMwMDApO1xuICAgICAgICB1cGRhdGVIZWFkZXJCYWRnZSh7IGFjdGl2ZTogZmFsc2UgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93RXJyb3IoZGF0YS5lcnJvciB8fCAnRGVhY3RpdmF0aW9uIGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dFcnJvcignTmV0d29yayBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRlYWN0aXZhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGRlYWN0aXZhdGVCdG4udGV4dENvbnRlbnQgPSAnRGVhY3RpdmF0ZSc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlSGVhZGVyQmFkZ2Uoc3RhdHVzKSB7XG4gICAgY29uc3QgdG9wYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2Utc3RhdHVzLXRvcGJhcicpO1xuICAgIGNvbnN0IGljb25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXRvcGJhci1pY29uJyk7XG4gICAgY29uc3QgdGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtdG9wYmFyLXRleHQnKTtcbiAgICBjb25zdCB0aW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS10b3BiYXItdGltZScpO1xuICAgIGlmICghdG9wYmFyKSByZXR1cm47XG5cbiAgICB0b3BiYXIuY2xhc3NOYW1lID0gJ2xpY2Vuc2Utc3RhdHVzLXRvcGJhciAnICsgKHN0YXR1cy5hY3RpdmUgPyAncHJlbWl1bScgOiAnZnJlZScpO1xuXG4gICAgaWYgKHN0YXR1cy5hY3RpdmUpIHtcbiAgICAgIGljb25FbC50ZXh0Q29udGVudCA9ICdcXHUyNjA1JztcbiAgICAgIHRleHRFbC50ZXh0Q29udGVudCA9ICdQUkVNSVVNJztcbiAgICAgIGlmIChzdGF0dXMubGlmZXRpbWUpIHtcbiAgICAgICAgdGltZUVsLnRleHRDb250ZW50ID0gJ1xcdTAwYjcgTElGRVRJTUUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGF5cyA9IHN0YXR1cy5kYXlzUmVtYWluaW5nO1xuICAgICAgICB0aW1lRWwudGV4dENvbnRlbnQgPSBkYXlzICE9IG51bGwgPyAnXFx1MDBiNyAnICsgZGF5cyArICdkIHJlbWFpbmluZycgOiAnJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWNvbkVsLnRleHRDb250ZW50ID0gJ1xcdTI2MDYnO1xuICAgICAgdGV4dEVsLnRleHRDb250ZW50ID0gc3RhdHVzLmV4cGlyZWQgPyAnRVhQSVJFRCcgOiAnRlJFRSBUSUVSJztcbiAgICAgIHRpbWVFbC50ZXh0Q29udGVudCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5MaWNlbnNlTW9kYWwoKSB7XG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgbG9hZFN0YXR1cygpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfVxuXG4gIC8vIEZvcm1hdCBjb2RlIGlucHV0IGFzIHVzZXIgdHlwZXMgKGF1dG8tYWRkIGRhc2hlcylcbiAgY29kZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24oKSB7XG4gICAgbGV0IHZhbCA9IHRoaXMudmFsdWUudG9VcHBlckNhc2UoKS5yZXBsYWNlKC9bXkEtWjAtOS1dL2csICcnKTtcbiAgICAvLyBEb24ndCBhdXRvLWZvcm1hdCBpZiB1c2VyIGlzIGRlbGV0aW5nXG4gICAgaWYgKHZhbC5sZW5ndGggPiB0aGlzLl9wcmV2TGVuZ3RoKSB7XG4gICAgICB2YWwgPSB2YWwucmVwbGFjZSgvLS9nLCAnJyk7XG4gICAgICBpZiAodmFsLmxlbmd0aCA+IDIgJiYgIXZhbC5zdGFydHNXaXRoKCdEQycpKSB7XG4gICAgICAgIHZhbCA9ICdEQycgKyB2YWw7XG4gICAgICB9XG4gICAgICAvLyBBZGQgZGFzaGVzIGFmdGVyIERDIGFuZCBldmVyeSA1IGNoYXJzXG4gICAgICBpZiAodmFsLnN0YXJ0c1dpdGgoJ0RDJykgJiYgdmFsLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBbJ0RDJ107XG4gICAgICAgIGNvbnN0IHJlc3QgPSB2YWwuc3Vic3RyaW5nKDIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3QubGVuZ3RoOyBpICs9IDUpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKHJlc3Quc3Vic3RyaW5nKGksIGkgKyA1KSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsID0gcGFydHMuam9pbignLScpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9wcmV2TGVuZ3RoID0gdmFsLmxlbmd0aDtcbiAgICB0aGlzLnZhbHVlID0gdmFsO1xuICB9KTtcblxuICAvLyBXaXJlIHVwIGV2ZW50c1xuICBhY3RpdmF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFjdGl2YXRlTGljZW5zZSk7XG4gIGRlYWN0aXZhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkZWFjdGl2YXRlTGljZW5zZSk7XG4gIGNvZGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIGFjdGl2YXRlTGljZW5zZSgpO1xuICB9KTtcbiAgd2lyZU1vZGFsKG1vZGFsLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1jYW5jZWwnKSk7XG4gIGNvbnN0IHRvcGJhckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2Utc3RhdHVzLXRvcGJhcicpO1xuICBpZiAodG9wYmFyRWwpIHRvcGJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gd2luZG93Lm9wZW5MaWNlbnNlTW9kYWwgJiYgd2luZG93Lm9wZW5MaWNlbnNlTW9kYWwoKSk7XG5cbiAgLy8gRXhwb3NlIGZvciBvdGhlciBtb2R1bGVzIHRvIG9wZW5cbiAgd2luZG93Lm9wZW5MaWNlbnNlTW9kYWwgPSBvcGVuTGljZW5zZU1vZGFsO1xuXG4gIC8vIEV4cG9zZSBmZWF0dXJlIGNoZWNrIGZvciBmcm9udGVuZCBnYXRpbmdcbiAgd2luZG93LmNoZWNrUHJlbWl1bUZlYXR1cmUgPSBhc3luYyBmdW5jdGlvbihmZWF0dXJlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9saWNlbnNlL2ZlYXR1cmUvJHtmZWF0dXJlfWApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgcmV0dXJuIGRhdGEuYXZhaWxhYmxlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvLyBMb2FkIHN0YXR1cyBvbiBwYWdlIGxvYWRcbiAgbG9hZFN0YXR1cygpLnRoZW4oc3RhdHVzID0+IHtcbiAgICBpZiAoY3VycmVudFN0YXR1cykgdXBkYXRlSGVhZGVyQmFkZ2UoY3VycmVudFN0YXR1cyk7XG4gIH0pO1xufSkoKTtcbjtcbi8vIFNoYXJlIE1vZGFsIFx1MjAxNCBEQy0wNThcbi8vXG4vLyBBZG1pbiBVSSBmb3IgREMtMDUzIHNoYXJlIHJvdXRlcy4gT3BlbmVkIGZyb20gdGhlIFwiU2hhcmVcIiBidXR0b24gb24gZWFjaFxuLy8gc2VydmljZSBjYXJkIChhZGRlZCBpbiBjb3JlL2dyaWQuanMgbmV4dCB0byB0aGUgZXhpc3Rpbmcgb3B0aW9ucy9kZWxldGVcbi8vIGJ1dHRvbnMpLiBUd28gdGFiczpcbi8vICAgLSBQdWJsaWMgbGluazogcGljayBhIFRUTCAoMWgvMjRoLzdkKSwgUE9TVCAvYXBpL3YxL3NoYXJlLCByZW5kZXIgdGhlXG4vLyAgICAgcmV0dXJuZWQgdXJsUGF0aCB3aXRoIGEgY29weSBidXR0b24gKyByZXZva2UgY29udHJvbC5cbi8vICAgLSBUYWlsc2NhbGUgaW52aXRlOiBlbnRlciBhbiBlbWFpbCwgUE9TVCAvYXBpL3YxL3NoYXJlL3RhaWxzY2FsZSwgcmVuZGVyXG4vLyAgICAgZGVsaXZlcmVkIHN0YXR1cyAoaW5ib3ggdnMgZGV2LWNvbnNvbGUgZmFsbGJhY2sgdnMgVVJMIGZhbGxiYWNrKS5cbi8vXG4vLyBNb2RhbCBhbHNvIGxpc3RzIG91dHN0YW5kaW5nIHNoYXJlcyBmb3IgdGhlIHNlbGVjdGVkIHNlcnZpY2UgKEdFVCAvYXBpL3YxL3NoYXJlKVxuLy8gd2l0aCByZXZva2UgYnV0dG9ucy4gVGhlIGxpc3QgcmVmcmVzaGVzIGFmdGVyIGV2ZXJ5IGlzc3VlL3Jldm9rZS5cbi8vXG4vLyBCb3RoIGlzc3VlIGVuZHBvaW50cyBhcmUgUHJvLWdhdGVkIG9uIHRoZSBzZXJ2ZXIgXHUyMDE0IHRoZSBtb2RhbCBzdXJmYWNlcyBhIDQwMlxuLy8gYXMgYW4gdXBncmFkZSBwcm9tcHQgKFwiU2hhcmUgaXMgYSBQcm8gZmVhdHVyZS4gQWN0aXZhdGUgYSBsaWNlbnNlIHRvIHVubG9jay5cIikuXG4vLyBUYWlsc2NhbGUgaW52aXRlcyBhZGRpdGlvbmFsbHkgcmVxdWlyZSB0YWlsc2NhbGVDb29yZCBjb25maWd1cmVkIG9uIHRoZSBob3N0O1xuLy8gdGhlIHNlcnZlciByZXR1cm5zIDQwMCB3aXRoIGEgY2xlYXIgbWVzc2FnZSB3aGVuIG1pc3NpbmcuXG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGlmICh3aW5kb3cuX19kY18wNThfc2hhcmVfbW9kYWxfbG9hZGVkKSByZXR1cm47XG4gIHdpbmRvdy5fX2RjXzA1OF9zaGFyZV9tb2RhbF9sb2FkZWQgPSB0cnVlO1xuXG4gIGNvbnN0IFRUTF9PUFRJT05TID0gW1xuICAgIHsgbXM6IDYwICogNjAgKiAxMDAwLCBsYWJlbDogJzEgaG91cicgfSxcbiAgICB7IG1zOiAyNCAqIDYwICogNjAgKiAxMDAwLCBsYWJlbDogJzI0IGhvdXJzJyB9LFxuICAgIHsgbXM6IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwLCBsYWJlbDogJzcgZGF5cycgfSxcbiAgXTtcblxuICBpbmplY3RNb2RhbCgnc2hhcmUtbW9kYWwnLCBgXG4gICAgPGRpdiBpZD1cInNoYXJlLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWxsZWRieT1cInNoYXJlLW1vZGFsLXRpdGxlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDQ2MHB4OyBtYXgtd2lkdGg6IDU4MHB4O1wiPlxuICAgICAgICA8aDMgaWQ9XCJzaGFyZS1tb2RhbC10aXRsZVwiPlNoYXJlIDxzcGFuIGlkPVwic2hhcmUtbW9kYWwtc2VydmljZS1uYW1lXCI+XHUyMDI2PC9zcGFuPjwvaDM+XG4gICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNnB4O1wiPlxuICAgICAgICAgIENyZWF0ZSBhIHB1YmxpYyBsaW5rIG9yIFRhaWxzY2FsZSBpbnZpdGUgc28gc29tZW9uZSBvdXRzaWRlIHlvdXIgbmV0d29yayBjYW4gYWNjZXNzIHRoaXMgc2VydmljZS5cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGFyZS10YWJzXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDRweDsgbWFyZ2luLWJvdHRvbTogMTZweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNoYXJlLXRhYiBhY3RpdmVcIiBkYXRhLXRhYj1cInB1YmxpY1wiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiAwOyBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tYWNjZW50KTsgcGFkZGluZzogOHB4IDE0cHg7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtd2VpZ2h0OiA2MDA7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIFB1YmxpYyBsaW5rXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNoYXJlLXRhYlwiIGRhdGEtdGFiPVwidGFpbHNjYWxlXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBib3JkZXI6IDA7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB0cmFuc3BhcmVudDsgcGFkZGluZzogOHB4IDE0cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIFRhaWxzY2FsZSBpbnZpdGVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNoYXJlLXRhYi1wYW5lbFwiIGRhdGEtcGFuZWw9XCJwdWJsaWNcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIiBmb3I9XCJzaGFyZS1wdWJsaWMtdHRsXCI+TGluayBkdXJhdGlvbjo8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzaGFyZS1wdWJsaWMtdHRsXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEwcHg7IG1hcmdpbjogNnB4IDAgMTJweDsgYmFja2dyb3VuZDogdmFyKC0taW5wdXQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XG4gICAgICAgICAgICAke1RUTF9PUFRJT05TLm1hcChvID0+IGA8b3B0aW9uIHZhbHVlPVwiJHtvLm1zfVwiPiR7by5sYWJlbH08L29wdGlvbj5gKS5qb2luKCcnKX1cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2hhcmUtcHVibGljLWNyZWF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6ICMwNDE0MWY7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXdlaWdodDogNjAwOyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBDcmVhdGUgc2hhcmUgbGlua1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hhcmUtdGFiLXBhbmVsXCIgZGF0YS1wYW5lbD1cInRhaWxzY2FsZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIiBmb3I9XCJzaGFyZS10cy1lbWFpbFwiPlJlY2lwaWVudCBlbWFpbDo8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCBpZD1cInNoYXJlLXRzLWVtYWlsXCIgdHlwZT1cImVtYWlsXCIgcGxhY2Vob2xkZXI9XCJhbGljZUBleGFtcGxlLmNvbVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4IDEycHg7IG1hcmdpbjogNnB4IDAgMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjk1cmVtO1wiIC8+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTJweDtcIj5cbiAgICAgICAgICAgIEEgc2luZ2xlLXVzZSBUYWlsc2NhbGUgcHJlLWF1dGgga2V5IGlzIGdlbmVyYXRlZCBhbmQgZW1haWxlZC4gVGhlIGRldmljZSBqb2lucyB5b3VyIHRhaWxuZXQgYW5kIGlzIHJvdXRlZCB0byB0aGlzIHNlcnZpY2UgdmlhIENhZGR5LlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2hhcmUtdHMtY3JlYXRlXCIgY2xhc3M9XCJidG4tYWNjZW50XCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogIzA0MTQxZjsgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIENyZWF0ZSBUYWlsc2NhbGUgaW52aXRlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJzaGFyZS1pc3N1ZWRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+U2hhcmUgbGluazo8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA2cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICA8aW5wdXQgaWQ9XCJzaGFyZS1pc3N1ZWQtdXJsXCIgdHlwZT1cInRleHRcIiByZWFkb25seVxuICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDhweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjg1cmVtO1wiIC8+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic2hhcmUtaXNzdWVkLWNvcHlcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTRweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6ICMwNDE0MWY7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXdlaWdodDogNjAwOyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgIENvcHlcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJzaGFyZS1pc3N1ZWQtbWV0YVwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDhweDtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cInNoYXJlLWVycm9yXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHJnYmEoMjMxLDc2LDYwLDAuMTUpOyBjb2xvcjogdmFyKC0tYmFkLWZnKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic2hhcmUtc3VjY2Vzc1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDQ2LDIwNCwxMTMsMC4xNSk7IGNvbG9yOiB2YXIoLS1vay1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwic2hhcmUtb3V0c3RhbmRpbmdcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1ib2xkXCI+T3V0c3RhbmRpbmcgc2hhcmVzIGZvciB0aGlzIHNlcnZpY2U8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgaWQ9XCJzaGFyZS1vdXRzdGFuZGluZy1saXN0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMThweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2hhcmUtY2FuY2VsXCIgdHlwZT1cImJ1dHRvblwiPkNsb3NlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLW1vZGFsJyk7XG4gIGNvbnN0IHNlcnZpY2VOYW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtbW9kYWwtc2VydmljZS1uYW1lJyk7XG4gIGNvbnN0IGlzc3VlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLWlzc3VlZCcpO1xuICBjb25zdCBpc3N1ZWRVcmxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1pc3N1ZWQtdXJsJyk7XG4gIGNvbnN0IGlzc3VlZENvcHlCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtaXNzdWVkLWNvcHknKTtcbiAgY29uc3QgaXNzdWVkTWV0YUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLWlzc3VlZC1tZXRhJyk7XG4gIGNvbnN0IGVycm9yRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtZXJyb3InKTtcbiAgY29uc3Qgc3VjY2Vzc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLXN1Y2Nlc3MnKTtcbiAgY29uc3Qgb3V0c3RhbmRpbmdMaXN0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtb3V0c3RhbmRpbmctbGlzdCcpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtY2FuY2VsJyk7XG4gIGNvbnN0IHB1YmxpY0NyZWF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1wdWJsaWMtY3JlYXRlJyk7XG4gIGNvbnN0IHRzQ3JlYXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLXRzLWNyZWF0ZScpO1xuICBjb25zdCB0c0VtYWlsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtdHMtZW1haWwnKTtcbiAgY29uc3QgcHVibGljVHRsU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLXB1YmxpYy10dGwnKTtcblxuICBsZXQgY3VycmVudFNlcnZpY2UgPSBudWxsOyAvLyB7IGlkLCBuYW1lIH1cbiAgbGV0IGFjdGl2ZVRhYiA9ICdwdWJsaWMnO1xuXG4gIGZ1bmN0aW9uIGhpZGVNZXNzYWdlcygpIHtcbiAgICBlcnJvckVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgc3VjY2Vzc0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgaXNzdWVkRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dFcnJvcihtc2cpIHtcbiAgICBzdWNjZXNzRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpc3N1ZWRFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgZXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dTdWNjZXNzKG1zZykge1xuICAgIGVycm9yRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdWNjZXNzRWwudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgc3VjY2Vzc0VsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9XG5cbiAgZnVuY3Rpb24gX29yaWdpbkZyb21QYWdlKCkge1xuICAgIC8vIEJ1aWxkIHRoZSBhYnNvbHV0ZSBzaGFyZSBVUkwgZnJvbSB0aGUgcGFnZSdzIGN1cnJlbnQgb3JpZ2luIHNvIHRoZVxuICAgIC8vIGxpbmsgaXMgY29ycmVjdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHVzZXIgaXMgb24gaHR0cDovL2xvY2FsaG9zdFxuICAgIC8vIChkZXYpIG9yIGh0dHBzOi8vc3RhdHVzLnNhbWkgKHByb2QpLiBUaGUgdXJsUGF0aCByZXR1cm5lZCBieSB0aGUgQVBJXG4gICAgLy8gaXMgYSBwYXRoLW9ubHkgc3RyaW5nIHN0YXJ0aW5nIHdpdGggL3NoYXJlLy5cbiAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9hYnNVcmwodXJsUGF0aCkge1xuICAgIGlmICh1cmxQYXRoLnN0YXJ0c1dpdGgoJ2h0dHAnKSkgcmV0dXJuIHVybFBhdGg7XG4gICAgcmV0dXJuIF9vcmlnaW5Gcm9tUGFnZSgpICsgdXJsUGF0aDtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9mb3JtYXRFeHBpcnkoaXNvKSB7XG4gICAgaWYgKCFpc28pIHJldHVybiAnJztcbiAgICBjb25zdCBkID0gbmV3IERhdGUoaXNvKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuICcnO1xuICAgIHJldHVybiBkLnRvTG9jYWxlU3RyaW5nKCk7XG4gIH1cblxuICBmdW5jdGlvbiBfZm9ybWF0UmVtYWluaW5nKG1zKSB7XG4gICAgaWYgKG1zIDw9IDApIHJldHVybiAnZXhwaXJlZCc7XG4gICAgY29uc3QgaCA9IE1hdGguZmxvb3IobXMgLyAzNjAwMDAwKTtcbiAgICBpZiAoaCA+PSAyNCkgcmV0dXJuIGAke01hdGguZmxvb3IoaCAvIDI0KX1kICR7aCAlIDI0fWggbGVmdGA7XG4gICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKG1zICUgMzYwMDAwMCkgLyA2MDAwMCk7XG4gICAgcmV0dXJuIGAke2h9aCAke219bSBsZWZ0YDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEFjdGl2ZVRhYihuYW1lKSB7XG4gICAgYWN0aXZlVGFiID0gbmFtZTtcbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hhcmUtdGFiJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgY29uc3QgaXNBY3RpdmUgPSBidG4uZGF0YXNldC50YWIgPT09IG5hbWU7XG4gICAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgaXNBY3RpdmUpO1xuICAgICAgYnRuLnN0eWxlLmJvcmRlckJvdHRvbUNvbG9yID0gaXNBY3RpdmUgPyAndmFyKC0tYWNjZW50KScgOiAndHJhbnNwYXJlbnQnO1xuICAgICAgYnRuLnN0eWxlLmNvbG9yID0gaXNBY3RpdmUgPyAndmFyKC0tZmcpJyA6ICd2YXIoLS1tdXRlZCknO1xuICAgICAgYnRuLnN0eWxlLmZvbnRXZWlnaHQgPSBpc0FjdGl2ZSA/ICc2MDAnIDogJzQwMCc7XG4gICAgfSk7XG4gICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnNoYXJlLXRhYi1wYW5lbCcpLmZvckVhY2gocCA9PiB7XG4gICAgICBwLnN0eWxlLmRpc3BsYXkgPSBwLmRhdGFzZXQucGFuZWwgPT09IG5hbWUgPyAnJyA6ICdub25lJztcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRPdXRzdGFuZGluZygpIHtcbiAgICBvdXRzdGFuZGluZ0xpc3RFbC5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkxvYWRpbmdcdTIwMjY8L3NwYW4+JztcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NoYXJlJywgeyBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyB9KTtcbiAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICBvdXRzdGFuZGluZ0xpc3RFbC5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk5vIHNoYXJlcyBsaXN0ZWQuPC9zcGFuPic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGNvbnN0IGxpc3QgPSAoYm9keSAmJiBib2R5LmRhdGEpIHx8IFtdO1xuICAgICAgY29uc3QgZmlsdGVyZWQgPSBsaXN0LmZpbHRlcihzID0+IHMuc2VydmljZUlkID09PSBjdXJyZW50U2VydmljZS5pZCk7XG4gICAgICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG91dHN0YW5kaW5nTGlzdEVsLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gb3V0c3RhbmRpbmcgc2hhcmVzIGZvciB0aGlzIHNlcnZpY2UuPC9zcGFuPic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG91dHN0YW5kaW5nTGlzdEVsLmlubmVySFRNTCA9IGZpbHRlcmVkLm1hcChzID0+IHtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nID0gcy5leHBpcmVzQXQgPyBfZm9ybWF0UmVtYWluaW5nKG5ldyBEYXRlKHMuZXhwaXJlc0F0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpKSA6ICcnO1xuICAgICAgICByZXR1cm4gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGFyZS1yb3dcIiBkYXRhLXNoYXJlLWlkPVwiJHtlc2NhcGVIdG1sKHMuaWQpfVwiXG4gICAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBwYWRkaW5nOiA2cHggMDsgYm9yZGVyLWJvdHRvbTogMXB4IGRhc2hlZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OiAxO1wiPlxuICAgICAgICAgICAgICA8c3Ryb25nPiR7cy5raW5kID09PSAndGFpbHNjYWxlJyA/ICdUYWlsc2NhbGUnIDogJ1B1YmxpYyd9PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4gXHUwMEI3IGV4cGlyZXMgJHtlc2NhcGVIdG1sKF9mb3JtYXRFeHBpcnkocy5leHBpcmVzQXQpKX0gKCR7cmVtYWluaW5nfSk8L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2hhcmUtcmV2b2tlXCIgZGF0YS1zaGFyZS1pZD1cIiR7ZXNjYXBlSHRtbChzLmlkKX1cIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWQtZmcpOyBib3JkZXItcmFkaXVzOiA0cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjhyZW07XCI+XG4gICAgICAgICAgICAgIFJldm9rZVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICAgIG91dHN0YW5kaW5nTGlzdEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaGFyZS1yZXZva2UnKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHJldm9rZVNoYXJlKGJ0bi5kYXRhc2V0LnNoYXJlSWQpKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG91dHN0YW5kaW5nTGlzdEVsLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q291bGQgbm90IGxvYWQgb3V0c3RhbmRpbmcgc2hhcmVzLjwvc3Bhbj4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJldm9rZVNoYXJlKGlkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zaGFyZS8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YCwge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwLm9rKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgICAgc2hvd0Vycm9yKGJvZHkgJiYgYm9keS5lcnJvciB8fCBgUmV2b2tlIGZhaWxlZCAoSFRUUCAke3Jlc3Auc3RhdHVzfSkuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNob3dTdWNjZXNzKCdTaGFyZSByZXZva2VkLicpO1xuICAgICAgbG9hZE91dHN0YW5kaW5nKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd0Vycm9yKCdOZXR3b3JrIGVycm9yIHdoaWxlIHJldm9raW5nLicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGlzc3VlUHVibGljKCkge1xuICAgIGlmICghY3VycmVudFNlcnZpY2UpIHJldHVybjtcbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBwdWJsaWNDcmVhdGVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gcHVibGljQ3JlYXRlQnRuLnRleHRDb250ZW50O1xuICAgIHB1YmxpY0NyZWF0ZUJ0bi50ZXh0Q29udGVudCA9ICdDcmVhdGluZ1x1MjAyNic7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHR0bE1zID0gcGFyc2VJbnQocHVibGljVHRsU2VsZWN0LnZhbHVlLCAxMCk7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2hhcmUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmljZUlkOiBjdXJyZW50U2VydmljZS5pZCwgdHRsTXMgfSksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgIGlmICghcmVzcC5vayB8fCAhYm9keS5zdWNjZXNzKSB7XG4gICAgICAgIF9yZW5kZXJBcGlFcnJvcihyZXNwLnN0YXR1cywgYm9keSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVybFBhdGggPSBib2R5LmRhdGEudXJsUGF0aDtcbiAgICAgIGlzc3VlZFVybElucHV0LnZhbHVlID0gX2Fic1VybCh1cmxQYXRoKTtcbiAgICAgIGlzc3VlZE1ldGFFbC50ZXh0Q29udGVudCA9IGBQdWJsaWMgbGluayBcdTAwQjcgZXhwaXJlcyAke19mb3JtYXRFeHBpcnkoYm9keS5kYXRhLmV4cGlyZXNBdCl9YDtcbiAgICAgIGlzc3VlZEVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgc2hvd1N1Y2Nlc3MoJ1NoYXJlIGxpbmsgY3JlYXRlZC4nKTtcbiAgICAgIGxvYWRPdXRzdGFuZGluZygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dFcnJvcignTmV0d29yayBlcnJvciB3aGlsZSBjcmVhdGluZyBzaGFyZS4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHVibGljQ3JlYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBwdWJsaWNDcmVhdGVCdG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBpc3N1ZVRhaWxzY2FsZSgpIHtcbiAgICBpZiAoIWN1cnJlbnRTZXJ2aWNlKSByZXR1cm47XG4gICAgY29uc3QgZW1haWwgPSAodHNFbWFpbElucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgaWYgKCFlbWFpbCB8fCAhZW1haWwuaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgc2hvd0Vycm9yKCdBIHZhbGlkIHJlY2lwaWVudCBlbWFpbCBpcyByZXF1aXJlZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgdHNDcmVhdGVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gdHNDcmVhdGVCdG4udGV4dENvbnRlbnQ7XG4gICAgdHNDcmVhdGVCdG4udGV4dENvbnRlbnQgPSAnQ3JlYXRpbmdcdTIwMjYnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2hhcmUvdGFpbHNjYWxlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlcnZpY2VJZDogY3VycmVudFNlcnZpY2UuaWQsIGVtYWlsIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBpZiAoIXJlc3Aub2sgfHwgIWJvZHkuc3VjY2Vzcykge1xuICAgICAgICBfcmVuZGVyQXBpRXJyb3IocmVzcC5zdGF0dXMsIGJvZHkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBUYWlsc2NhbGUgc2hhcmVzIHNob3cgdGhlIHJhdyB1cmxQYXRoICh3aGljaCBpcyB0aGUgc2hhcmUgVVJMKSBpZlxuICAgICAgLy8gZW1haWwgZGVsaXZlcnkgZmFpbGVkLiBUaGUgc2hhcmUgaXRzZWxmIGlzIG9uZS1zaG90IHNvIHRoZSBhZG1pblxuICAgICAgLy8gY2FuIG1hbnVhbGx5IHBhc3RlIHRoZSBsaW5rIGludG8gYSBjaGF0IGlmIFNNVFAgZmFpbGVkLlxuICAgICAgY29uc3QgZmFsbGJhY2sgPSBib2R5LmRhdGEgJiYgYm9keS5kYXRhLnVybFBhdGg7XG4gICAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgICAgaXNzdWVkVXJsSW5wdXQudmFsdWUgPSBfYWJzVXJsKGZhbGxiYWNrKTtcbiAgICAgICAgaXNzdWVkTWV0YUVsLnRleHRDb250ZW50ID0gYFRhaWxzY2FsZSBpbnZpdGUgXHUwMEI3IGVtYWlsZWQgdG8gJHtlbWFpbH0gKG9yIHVzZSB0aGlzIFVSTCBtYW51YWxseSBpZiBkZWxpdmVyeSBmYWlsZWQpLmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc3N1ZWRVcmxJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICBpc3N1ZWRNZXRhRWwudGV4dENvbnRlbnQgPSBgVGFpbHNjYWxlIGludml0ZSBzZW50IHRvICR7ZW1haWx9LmA7XG4gICAgICB9XG4gICAgICBpc3N1ZWRFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHNob3dTdWNjZXNzKCdUYWlsc2NhbGUgaW52aXRlIGNyZWF0ZWQuJyk7XG4gICAgICB0c0VtYWlsSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIGxvYWRPdXRzdGFuZGluZygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dFcnJvcignTmV0d29yayBlcnJvciB3aGlsZSBjcmVhdGluZyBUYWlsc2NhbGUgaW52aXRlLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0c0NyZWF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgdHNDcmVhdGVCdG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfcmVuZGVyQXBpRXJyb3Ioc3RhdHVzLCBib2R5KSB7XG4gICAgY29uc3QgZXJyID0gKGJvZHkgJiYgYm9keS5lcnJvcikgfHwgJyc7XG4gICAgaWYgKHN0YXR1cyA9PT0gNDAyKSB7XG4gICAgICBzaG93RXJyb3IoJ1NoYXJlIGlzIGEgUHJvIGZlYXR1cmUuIEFjdGl2YXRlIGEgbGljZW5zZSB0byB1bmxvY2suJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IDQwMCAmJiAvdGFpbHNjYWxlL2kudGVzdChlcnIpKSB7XG4gICAgICBzaG93RXJyb3IoJ1RhaWxzY2FsZSBpcyBub3QgY29uZmlndXJlZCBvbiB0aGlzIGhvc3QuIFNldCB1cCBUYWlsc2NhbGUgaW4gdGhlIGRhc2hib2FyZCBmaXJzdC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICBzaG93RXJyb3IoJ1lvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHNoYXJlIHNlcnZpY2VzLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgIHNob3dFcnJvcignU2VydmljZSBub3QgZm91bmQuIEl0IG1heSBoYXZlIGJlZW4gZGVsZXRlZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2hvd0Vycm9yKGVyciB8fCBgUmVxdWVzdCBmYWlsZWQgKEhUVFAgJHtzdGF0dXN9KS5gKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5TaGFyZU1vZGFsKHNlcnZpY2UpIHtcbiAgICBpZiAoIXNlcnZpY2UgfHwgIXNlcnZpY2UuaWQpIHJldHVybjtcbiAgICBjdXJyZW50U2VydmljZSA9IHsgaWQ6IHNlcnZpY2UuaWQsIG5hbWU6IHNlcnZpY2UubmFtZSB8fCBzZXJ2aWNlLmlkIH07XG4gICAgc2VydmljZU5hbWVFbC50ZXh0Q29udGVudCA9IGN1cnJlbnRTZXJ2aWNlLm5hbWU7XG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgc2V0QWN0aXZlVGFiKCdwdWJsaWMnKTtcbiAgICB0c0VtYWlsSW5wdXQudmFsdWUgPSAnJztcbiAgICBwdWJsaWNUdGxTZWxlY3QudmFsdWUgPSBTdHJpbmcoVFRMX09QVElPTlNbMV0ubXMpOyAvLyAyNGggZGVmYXVsdFxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkT3V0c3RhbmRpbmcoKTtcbiAgfVxuXG4gIC8vIFdpcmUgZXZlbnRzXG4gIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaGFyZS10YWInKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2V0QWN0aXZlVGFiKGJ0bi5kYXRhc2V0LnRhYikpO1xuICB9KTtcbiAgcHVibGljQ3JlYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaXNzdWVQdWJsaWMpO1xuICB0c0NyZWF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGlzc3VlVGFpbHNjYWxlKTtcbiAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpKTtcbiAgd2lyZU1vZGFsKG1vZGFsLCBjYW5jZWxCdG4pO1xuXG4gIC8vIENvcHktdG8tY2xpcGJvYXJkIGZvciB0aGUgaXNzdWVkIHNoYXJlIFVSTFxuICBpc3N1ZWRDb3B5QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVybCA9IGlzc3VlZFVybElucHV0LnZhbHVlO1xuICAgIGlmICghdXJsKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7XG4gICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHVybCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGYWxsYmFjayBmb3Igb2xkZXIgYnJvd3NlcnMgLyB1bnNhZmUgY29udGV4dHNcbiAgICAgICAgaXNzdWVkVXJsSW5wdXQuc2VsZWN0KCk7XG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IGlzc3VlZENvcHlCdG4udGV4dENvbnRlbnQ7XG4gICAgICBpc3N1ZWRDb3B5QnRuLnRleHRDb250ZW50ID0gJ0NvcGllZCEnO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlzc3VlZENvcHlCdG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbDsgfSwgMTIwMCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd0Vycm9yKCdDb3VsZCBub3QgY29weSB0byBjbGlwYm9hcmQuIFNlbGVjdCB0aGUgVVJMIG1hbnVhbGx5LicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gRXhwb3NlIGZvciBvdGhlciBtb2R1bGVzIHRvIG9wZW5cbiAgd2luZG93Lm9wZW5TaGFyZU1vZGFsID0gb3BlblNoYXJlTW9kYWw7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QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0F5TDVCLEVBRVAsTUFB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LEVBQWUsTUFDM0IsR0FBSzN5QixFQUNMLEdBQUksQ0FDRSxVQUFVLFdBQWEsVUFBVSxVQUFVLFVBQzdDLE1BQU0sVUFBVSxVQUFVLFVBQVVBLENBQUcsR0FHdkMyeUIsRUFBZSxPQUFPLEVBQ3RCLFNBQVMsWUFBWSxNQUFNLEdBRTdCLE1BQU1zQixFQUFXckIsRUFBYyxZQUMvQkEsRUFBYyxZQUFjLFVBQzVCLFdBQVcsSUFBTSxDQUFFQSxFQUFjLFlBQWNxQixDQUFVLEVBQUcsSUFBSSxDQUNsRSxNQUFZLENBQ1Y1QyxFQUFVLHVEQUF1RCxDQUNuRSxDQUNGLENBQUMsRUFHRCxPQUFPLGVBQWlCZ0QsQ0FDMUIsR0FBRyIsCiAgIm5hbWVzIjogWyJsb2dvTW9kYWwiLCAicHJldmlld0RhcmsiLCAicHJldmlld0xpZ2h0IiwgImxvZ29TdGF0dXMiLCAic2FtZUJvdGhDaGVja2JveCIsICJkdWFsVXBsb2FkcyIsICJzaW5nbGVVcGxvYWQiLCAidXBsb2FkRGFyayIsICJ1cGxvYWRMaWdodCIsICJ1cGxvYWRTaW5nbGUiLCAiYnJhbmRMb2dvRGFyayIsICJicmFuZExvZ29MaWdodCIsICJ0b3BSb3ciLCAiZGFzaGJvYXJkVGl0bGVJbnB1dCIsICJERUZBVUxUX1RJVExFIiwgInBlbmRpbmdEYXJrRGF0YSIsICJwZW5kaW5nTGlnaHREYXRhIiwgInBlbmRpbmdTaW5nbGVEYXRhIiwgImN1cnJlbnRQb3NpdGlvbiIsICJjdXJyZW50VGl0bGUiLCAicmVhZEZpbGVBc0RhdGFVUkwiLCAiZmlsZSIsICJjYWxsYmFjayIsICJyZWFkZXIiLCAiZSIsICJkYXRhIiwgImFwcGx5TG9nb1Bvc2l0aW9uIiwgInBvcyIsICJidG4iLCAiYXBwbHlEYXNoYm9hcmRUaXRsZSIsICJ0aXRsZSIsICJoZWFkZXJUaXRsZSIsICJsb2FkQ3VzdG9tTG9nbyIsICJyZXNwb25zZSIsICJlcnJvciIsICJpc0N1c3RvbSIsICJuZXdUaXRsZSIsICJwYXlsb2FkIiwgInQiLCAiZmF2aWNvbkxpbmsiLCAiZmF2aWNvblByZXZpZXciLCAiZmF2aWNvblN0YXR1cyIsICJwZW5kaW5nRmF2aWNvbkRhdGEiLCAiZmF2aWNvblVwbG9hZCIsICJsb2FkQ3VzdG9tRmF2aWNvbiIsICJldmVudCIsICJzZXR0aW5nc1R6U2VsZWN0IiwgImN1cnJlbnRUeiIsICJyZXMiLCAidHoiLCAiY2ZnIiwgInNlbGVjdEVsIiwgInNlbGVjdGVkVHoiLCAidGltZXpvbmVzIiwgImRldGVjdGVkIiwgIm9wdCIsICJjdXJyZW50Q29uZmlnVHlwZSIsICJzZXJ2ZXJDb25maWciLCAiY2hlY2tTZXJ2ZXJDb25maWciLCAic2V0dXBUelNlbGVjdCIsICJzaG93U3RlcCIsICJzdGVwSWQiLCAic3RlcCIsICJ0YXJnZXRTdGVwIiwgInNob3dTdW1tYXJ5IiwgInN1bW1hcnlDb250ZW50IiwgImh0bWwiLCAidGxkIiwgImNhTmFtZSIsICJkbnNJUCIsICJkbnNQb3J0IiwgImlwIiwgImRvbWFpbiIsICJlbWFpbCIsICJyb3V0aW5nTW9kZSIsICJleGFtcGxlVXJscyIsICJzYXZlQ29uZmlnVG9TZXJ2ZXIiLCAiY29uZmlnIiwgImZpbmlzaFNldHVwIiwgInNlbGVjdGVkUHJvdmlkZXIiLCAic2F2ZWRUb1NlcnZlciIsICJjb25maWdOYW1lIiwgInNhdmVMb2NhdGlvbiIsICJzdGVwMU5leHQiLCAic2VsZWN0ZWQiLCAic2tpcEJ0biIsICJ0bGRJbnB1dCIsICJwcmV2aWV3MSIsICJwcmV2aWV3MiIsICJob21lbGFiQmFjayIsICJob21lbGFiTmV4dCIsICJzaW1wbGVCYWNrIiwgInNpbXBsZU5leHQiLCAicmFkaW8iLCAibm90ZSIsICJwdWJsaWNCYWNrIiwgInB1YmxpY05leHQiLCAic3VtbWFyeUJhY2siLCAic3VtbWFyeU5leHQiLCAiZGlza1NhZmV0eUJhY2siLCAiZmluaXNoQnRuIiwgImNvbmZpZ1N0ciIsICJlcnJvckhhbmRsZXIiLCAiQVBQU19LRVkiLCAiYXBpVGVtcGxhdGVzIiwgImFwaUNhdGVnb3JpZXMiLCAibW9kYWwiLCAiZ3JpZCIsICJmZXRjaEFwcFRlbXBsYXRlcyIsICJjaGVja1BvcnRBdmFpbGFiaWxpdHkiLCAicG9ydCIsICJnZXRTdWdnZXN0ZWRQb3J0IiwgImJhc2VQb3J0IiwgImJ1aWxkQXBwU2VsZWN0b3IiLCAiYnlDYXRlZ29yeSIsICJhcHBJZCIsICJ0ZW1wbGF0ZSIsICJjYXRlZ29yeSIsICJjYXRlZ29yeU9yZGVyIiwgImFwcHMiLCAiYSIsICJiIiwgImhlYWRlciIsICJjYXRlZ29yeUluZm8iLCAiYXBwIiwgIm9wdGlvbiIsICJpc1dpZGdldCIsICJ3aWRnZXRFbmFibGVkIiwgIndpZGdldEJhZGdlIiwgImRpZmZpY3VsdHlCYWRnZSIsICJ0b2dnbGVEYXNoYm9hcmRXaWRnZXQiLCAic2hvd0RlcGxveUNvbmZpZyIsICJvcHRpb25FbCIsICJrZXkiLCAibmV3U3RhdGUiLCAic2VsZWN0b3IiLCAiZWwiLCAiYmFkZ2UiLCAiYXBwVGVtcGxhdGUiLCAiZGVwbG95TW9kYWwiLCAic3ViZG9tYWluSW5wdXQiLCAidXJsUHJldmlldyIsICJpcElucHV0IiwgInBvcnRJbnB1dCIsICJ0YWlsc2NhbGVDaGVja2JveCIsICJ0YWlsc2NhbGVTdGF0dXMiLCAiY2hlY2tSZXN1bHQiLCAiY29udGFpbmVyIiwgImRlZmF1bHRTdWJkb21haW4iLCAic3VicGF0aFdhcm5pbmciLCAic3VwcG9ydCIsICJjZmdEbnNUeXBlIiwgImNmZ1NzbFR5cGUiLCAiZG5zUmFkaW8iLCAic3NsUmFkaW8iLCAiZG5zU2VjdGlvbiIsICJhZHZhbmNlZERldGFpbHMiLCAiYWR2YW5jZWRDb250ZW50IiwgImRuc1NlY3Rpb25FbCIsICJzc2xTZWN0aW9uRWwiLCAibWVkaWFQYXRoU2VjdGlvbiIsICJtZWRpYVBhdGhJbnB1dCIsICJtZWRpYVBhdGhEZXNjcmlwdGlvbiIsICJkZXRlY3RlZE1vdW50c0NvbnRhaW5lciIsICJkZXRlY3RlZE1vdW50c0xpc3QiLCAibW91bnRzUmVzdWx0IiwgImF1dG9QYXRocyIsICJtIiwgIm1vdW50IiwgImlzU2VsZWN0ZWQiLCAiY3VycmVudFBhdGhzIiwgInAiLCAiaWR4IiwgInBsZXhDbGFpbVNlY3Rpb24iLCAidm9sdW1lU2VjdGlvbiIsICJ2b2x1bWVMaXN0IiwgIm1lZGlhQ29udGFpbmVyUGF0aCIsICJub25NZWRpYVZvbHVtZXMiLCAidiIsICJ2b2wiLCAiaSIsICJob3N0RGVmYXVsdCIsICJjb250YWluZXJQYXRoIiwgInJvdyIsICJpbnB1dCIsICJkZWZhdWx0UG9ydCIsICJwb3J0U3RhdHVzIiwgImNoZWNrQW5kVXBkYXRlUG9ydFN0YXR1cyIsICJwb3J0VG9DaGVjayIsICJyZXN1bHQiLCAic3VnZ2VzdGVkUG9ydCIsICJ1c2VCdG4iLCAicG9ydENoZWNrVGltZW91dCIsICJ1cGRhdGVVcmxQcmV2aWV3IiwgInN1YmRvbWFpbiIsICJkbnNUeXBlIiwgInNzbFR5cGUiLCAidXJsIiwgInByb3RvY29sIiwgImFkZEFwcFRvR3JpZCIsICJkZXBsb3lDb25maWciLCAiY3VzdG9tQXBwcyIsICJ1c2luZ0V4aXN0aW5nIiwgImV4aXN0aW5nQXBwIiwgImluZGV4IiwgInBvcnRUb1VzZSIsICJwb3J0Q2hlY2siLCAiYXBpRGVwbG95Q29uZmlnIiwgIm5ld0FwcCIsICJtZXNzYWdlIiwgImNoZWNrU1NMQ2VydGlmaWNhdGUiLCAiaW5zdHJ1Y3Rpb25zIiwgImFwcE5hbWUiLCAiYXR0ZW1wdHMiLCAibWF4QXR0ZW1wdHMiLCAiY2hlY2tDZXJ0IiwgImxvYWRDdXN0b21BcHBzIiwgIm1lZGlhUGF0aCIsICJjdXN0b21Wb2x1bWVzIiwgImZvbGRlckJyb3dzZXJNb2RhbCIsICJmb2xkZXJCcm93c2VyUGF0aCIsICJmb2xkZXJCcm93c2VyTGlzdCIsICJmb2xkZXJCcm93c2VyU2VsZWN0ZWQiLCAiZm9sZGVyQnJvd3NlclNlbGVjdGVkTGlzdCIsICJjdXJyZW50QnJvd3NlclBhdGgiLCAic2VsZWN0ZWRGb2xkZXJzIiwgInRhcmdldE1lZGlhSW5wdXQiLCAibWVkaWFJbnB1dCIsICJ1cGRhdGVTZWxlY3RlZEZvbGRlcnNEaXNwbGF5IiwgImxvYWRGb2xkZXJDb250ZW50cyIsICJwYXRoIiwgIml0ZW0iLCAiaWNvbiIsICJzZWxlY3RlZFN0eWxlIiwgInJlY2lwZVRlbXBsYXRlcyIsICJyZWNpcGVDYXRlZ29yaWVzIiwgImN1cnJlbnRSZWNpcGUiLCAiY3VycmVudFN0ZXAiLCAiaXNQcmVtaXVtIiwgImNhbmNlbEJ0biIsICJwcmV2QnRuIiwgIm5leHRCdG4iLCAiZmV0Y2hSZWNpcGVUZW1wbGF0ZXMiLCAicmVzcCIsICJjaGVja1JlY2lwZVByZW1pdW0iLCAicmVjaXBlcyIsICJnZXRQcmV2aWV3UmVjaXBlcyIsICJyZWNpcGVMaXN0IiwgInJlY2lwZSIsICJjb21wb25lbnRCYWRnZSIsICJsb2NrT3ZlcmxheSIsICJvcGVuUmVjaXBlRGVwbG95V2l6YXJkIiwgImFwcFNlbGVjdG9yTW9kYWwiLCAidXBkYXRlU3RlcFVJIiwgInJlbmRlclN0ZXAxIiwgInBhbmVsIiwgImxpc3QiLCAiY29tcG9uZW50cyIsICJjb21wIiwgImlzUmVxdWlyZWQiLCAiaXNJbnRlcm5hbCIsICJyZW5kZXJTdGVwMiIsICJzaGFyZWRWb2x1bWVzIiwgInJlbmRlclN0ZXAzIiwgImNvbnRlbnQiLCAic2VsZWN0ZWRDb21wb25lbnRzIiwgImdldFNlbGVjdGVkQ29tcG9uZW50cyIsICJ2b2x1bWVJbnB1dHMiLCAidm9sdW1lcyIsICJ0YWlsc2NhbGUiLCAiYyIsICJrIiwgImNoZWNrYm94ZXMiLCAic2VsZWN0ZWRJZHMiLCAiY2IiLCAiZXhlY3V0ZURlcGxveSIsICJwcm9ncmVzc0xpc3QiLCAicmVzdWx0RWwiLCAidXBkYXRlUHJvZ3Jlc3NJdGVtIiwgImRlcGxveWVkIiwgImVyciIsICJzIiwgImNvbXBvbmVudElkIiwgInN0YXR1cyIsICJ0ZXh0IiwgInN0YXR1c0VsIiwgImNhcmRzIiwgImdyb3VwcyIsICJjYXJkIiwgInJlY2lwZUlkIiwgImdyb3VwQ2FyZHMiLCAibGFiZWwiLCAiYWN0aW9uIiwgImVuZHBvaW50IiwgIm1ldGhvZCIsICJyIiwgInN0eWxlIiwgImJ1dHRvbiIsICJvcmlnaW5hbFRleHQiLCAidmlld0J0biIsICJyZWZyZXNoQnRuIiwgImNsZWFyQnRuIiwgImNsb3NlQnRuIiwgImxldmVsU2VsIiwgImNvbnRleHRTZWwiLCAic2VhcmNoSW5wdXQiLCAic2luY2VJbnB1dCIsICJ1bnRpbElucHV0IiwgImxvYWRNb3JlQnRuIiwgInRvdGFsU3BhbiIsICJQQUdFX1NJWkUiLCAiY3VycmVudE9mZnNldCIsICJpbmZsaWdodCIsICJmaWx0ZXJOb25jZSIsICJrbm93bkNvbnRleHRzIiwgInRvSXNvIiwgImxvY2FsRHRWYWx1ZSIsICJkIiwgInJlZnJlc2hDb250ZXh0cyIsICJjdXJyZW50VmFsdWUiLCAiYnVpbGRRdWVyeSIsICJwYXJhbXMiLCAic2luY2UiLCAidW50aWwiLCAic2VhcmNoIiwgImxvYWRMb2dzIiwgImFwcGVuZCIsICJteU5vbmNlIiwgImxvZ3MiLCAicmVhc29uIiwgImxvZyIsICJsZXZlbCIsICJsZXZlbENvbG9yIiwgInRzIiwgImN0eCIsICJtc2ciLCAidGFibGUiLCAiZGV0YWlsIiwgImNsZWFyTG9ncyIsICJzZWFyY2hEZWJvdW5jZSIsICJ3aXJlRmlsdGVycyIsICJkYXRlRGVib3VuY2UiLCAiY29udGFpbmVyU2VsZWN0IiwgImxvZ0NvbnRlbnQiLCAibG9nU2VhcmNoIiwgImxvZ1RhaWwiLCAic3RyZWFtQnRuIiwgImRvd25sb2FkQnRuIiwgImNsZWFyU2VhcmNoQnRuIiwgImNsb3NlQnRuMiIsICJzdHJlYW1TdGF0dXMiLCAic3RyZWFtSW5kaWNhdG9yIiwgInN0cmVhbVRleHQiLCAibGluZUNvdW50IiwgImZpbHRlckNvdW50IiwgImltYWdlRWwiLCAiY3JlYXRlZEVsIiwgImN1cnJlbnRDb250YWluZXJJZCIsICJjdXJyZW50TG9ncyIsICJmaWx0ZXJlZExvZ3MiLCAiZXZlbnRTb3VyY2UiLCAiaXNTdHJlYW1pbmciLCAic2VhcmNoVGltZW91dCIsICJmb3JtYXREYXRlIiwgImRhdGVTdHIiLCAiZXNjYXBlSHRtbCIsICJzdHIiLCAiZGl2IiwgImZvcm1hdExvZ0VudHJ5IiwgInN0cmVhbUNsYXNzIiwgInN0cmVhbUljb24iLCAicmVuZGVyTG9ncyIsICJzZWFyY2hUZXJtIiwgImxvYWRDb250YWluZXJzIiwgImNvbnRhaW5lcnMiLCAiY3VycmVudFZhbCIsICJsb2FkQ29udGFpbmVySW5mbyIsICJjb250YWluZXJJZCIsICJzdG9wU3RyZWFtIiwgInRhaWwiLCAic3RhcnRTdHJlYW0iLCAiZW50cnkiLCAiZW50cnlEaXYiLCAiZG93bmxvYWRMb2dzIiwgImNvbnRhaW5lck5hbWUiLCAidGltZXN0YW1wIiwgImZpbGVuYW1lIiwgInN0cmVhbSIsICJibG9iIiwgImNsb3NlTW9kYWwiLCAiVU5JVF9QUkVTRVRTIiwgInVuaXRTZWxlY3QiLCAidGFpbElucHV0IiwgImNsZWFyU2VhcmNoIiwgIm92ZXJmbG93SGludCIsICJ1bml0RGlzcGxheSIsICJzdHJlYW1TdGF0ZSIsICJhdmFpbGFibGUiLCAibGluZXMiLCAic3RyZWFtaW5nIiwgInNlYXJjaFRpbWVyIiwgInNldEF2YWlsYWJsZSIsICJpc0F2YWlsYWJsZSIsICJwcm9iZUF2YWlsYWJsZSIsICJyZW5kZXJMaW5lcyIsICJ0ZXJtIiwgImZpbHRlcmVkIiwgImwiLCAibGluZSIsICJsb2FkVGFpbCIsICJ1bml0IiwgImV2IiwgImNsb3NlIiwgIm9wZW5Kb3VybmFsZE1vZGFsIiwgIm9wZW5CdG4iLCAiZGV0YWlsc0RpdiIsICJjcmVhdGVCdG4iLCAiY3JlYXRlU3RhdHVzIiwgInNob3dDb250YWluZXJEZXRhaWxzIiwgImNyZWF0ZVNuYXBzaG90IiwgIm5hbWUiLCAibGVhdmVSdW5uaW5nIiwgIm9wZW5Nb2RhbCIsICJ0YWIiLCAiY29ubmVjdEJ0biIsICJwaGFzZURldGVjdCIsICJwaGFzZUNyZWRlbnRpYWxzIiwgInBoYXNlUHJvZ3Jlc3MiLCAicGhhc2VSZXN1bHRzIiwgImRldGVjdFJlc3VsdHMiLCAiY3JlZGVudGlhbElucHV0cyIsICJwcm9ncmVzc1N0ZXBzIiwgInJlc3VsdHNDb250ZW50IiwgInBsZXhMaWJyYXJpZXMiLCAicmV0cnlCdG4iLCAiZGV0ZWN0ZWREYXRhIiwgInNlcnZpY2VJY29ucyIsICJzZXJ2aWNlTGFiZWxzIiwgInNob3dQaGFzZSIsICJwaGFzZSIsICJzdGF0dXNCYWRnZSIsICJjb2xvcnMiLCAic21hcnREZXRlY3QiLCAic3ZjIiwgImluZm8iLCAic291cmNlIiwgInZlcnNpb24iLCAia2V5U2F2ZWQiLCAiYnVpbGRDcmVkZW50aWFsSW5wdXRzIiwgInNlcnZpY2VzIiwgImFyclNlcnZpY2VzIiwgImlzQ29ubmVjdGVkIiwgInBsZXgiLCAicGxleENvbm5lY3RlZCIsICJzZWVyciIsICJzZWVyck9rIiwgImNvbmZpZ3VyZWRIdG1sIiwgImNzIiwgInNlcnZpY2UiLCAidXJsSW5wdXQiLCAia2V5SW5wdXQiLCAic3RhdHVzU3BhbiIsICJhcGlLZXkiLCAic21hcnRDb25uZWN0IiwgInN0ZXBzSHRtbCIsICJkZXRhaWxDb2xvciIsICJzaG93UmVzdWx0cyIsICJhbGxHb29kIiwgImhlYWRlckNvbG9yIiwgImhlYWRlckljb24iLCAiaGVhZGVyVGV4dCIsICJzdCIsICJmZXRjaFBsZXhMaWJyYXJpZXMiLCAibGliIiwgInR5cGVJY29uIiwgInNhdmVCdG4iLCAicHJvdmlkZXIiLCAiY2hlY2tib3giLCAiaGVhbHRoQ2hlY2tFbmFibGVkIiwgImhlYWx0aENoZWNrQ29uZmlnIiwgImxvYWROb3RpZmljYXRpb25Db25maWciLCAibG9hZE5vdGlmaWNhdGlvbkhpc3RvcnkiLCAiZGF0ZSIsICJzYXZlTm90aWZpY2F0aW9uQ29uZmlnIiwgInRlc3RQcm92aWRlciIsICJsb2FkTm90aWZpY2F0aW9uU3RhdHVzIiwgImxhc3RTZW50RWwiLCAicGFuZWxJZCIsICJ0YWJCYXIiLCAibW9kYWxDb250ZW50IiwgInRhcmdldCIsICJCUk9XU0VSX1NUQVRFX0tFWVMiLCAiY29sbGVjdEJyb3dzZXJTdGF0ZSIsICJzdGF0ZSIsICJ2YWwiLCAiaiIsICJyZXN0b3JlQnJvd3NlclN0YXRlIiwgImJyb3dzZXJTdGF0ZSIsICJjb3VudCIsICJpc0xlZ2FjeUZvcm1hdCIsICJyZXN0b3JlTGVnYWN5Rm9ybWF0IiwgInNsdWciLCAiZXhwb3J0QnRuIiwgInNlbGVjdEZpbGVCdG4iLCAiZmlsZUlucHV0IiwgImZpbGVOYW1lRGl2IiwgInByZXZpZXdEaXYiLCAicHJldmlld0NvbnRlbnQiLCAicmVzdG9yZUJ0biIsICJyZXN1bHREaXYiLCAic2NoZWR1bGVDb250YWluZXIiLCAiaGlzdG9yeUNvbnRhaW5lciIsICJkaXNrQ29udGFpbmVyIiwgInBvaW50aW50aW1lQ29udGFpbmVyIiwgInNlbGVjdGVkQmFja3VwIiwgInN0YXRlQ291bnQiLCAidGhlbWVDb3VudCIsICJiYWNrdXAiLCAicHJldmlldyIsICJyZWxvYWRDYWRkeSIsICJicm93c2VyQ291bnQiLCAibG9hZFNjaGVkdWxlc1RhYiIsICJzY2hlZHVsZXMiLCAic2NoIiwgIm5leHRSdW5TdHIiLCAibGFzdFJ1blN0ciIsICJ0b2dnbGUiLCAidXBkYXRlU2NoZWR1bGUiLCAic2VsIiwgImlucCIsICJydW5CYWNrdXBOb3ciLCAiZGVsZXRlU2NoZWR1bGUiLCAiYWRkTmV3U2NoZWR1bGUiLCAidXBkYXRlcyIsICJpbnRlcnZhbCIsICJyZXRlbnRpb24iLCAiYXBwSWRJbnB1dCIsICJsb2FkRGlza0JhY2t1cHMiLCAiZmlsZXMiLCAiYnlBcHAiLCAiZiIsICJhcHBJZHMiLCAiYXBwRmlsZXMiLCAiY29tcGFyZUJhY2t1cEZpbGUiLCAicmVzdG9yZUJhY2t1cEZpbGUiLCAibG9hZEJhY2t1cEhpc3RvcnkiLCAiYmsiLCAic2l6ZU1CIiwgImJhY2t1cElkIiwgImxvYWRQb2ludEluVGltZVRhYiIsICJsaWNlbnNlUmVzIiwgImxpY2Vuc2VEYXRhIiwgInNlcnZpY2VzUmVzIiwgInNlcnZpY2VzRGF0YSIsICJsb2FkUG9pbnRJblRpbWVCYWNrdXBzIiwgImxpc3RFbCIsICJkaWZmIiwgInN2Y0NoYW5nZWQiLCAiY2ZnQ2hhbmdlZCIsICJhdXRvUmVmcmVzaENoZWNrYm94IiwgImFnZ3JlZ2F0ZWRDb250YWluZXIiLCAiYWxlcnRzQ29udGFpbmVyIiwgImxhc3RVcGRhdGVTcGFuIiwgInJlZnJlc2hJbnRlcnZhbCIsICJjYWNoZWRNb25pdG9yaW5nRGF0YSIsICJmb3JtYXRCeXRlcyIsICJieXRlcyIsICJzaXplcyIsICJnZXRDcHVDb2xvciIsICJwZXJjZW50IiwgImdldE1lbUNvbG9yIiwgImxvYWRTdGF0cyIsICJzdGF0cyIsICJpc05ld0FwaSIsICJpZCIsICJjdXIiLCAiY3B1IiwgIm1lbSIsICJjcHVDb2xvciIsICJtZW1Db2xvciIsICJtZW1Vc2VkIiwgIm1lbUxpbWl0IiwgIm5ldFJ4IiwgIm5ldFR4IiwgImFnZyIsICJsb2FkQWdncmVnYXRlZCIsICJsb2FkQWxlcnRzIiwgImFsZXJ0SGlzdG9yeSIsICJoZCIsICJhbGxDb25maWdzIiwgImNkIiwgImNvbnRhaW5lclJvd3MiLCAiaGlzdG9yeVJvd3MiLCAidGltZSIsICJub3RpZmllZE1hcmsiLCAiY29uZmlnU2VjdGlvbiIsICJjb25maWdzIiwgImNJZCIsICJzdG9wQXV0b1JlZnJlc2giLCAib3JpZyIsICJzdGFydEF1dG9SZWZyZXNoIiwgImhpc3RvcnlDb250YWluZXJTZWxlY3QiLCAiaGlzdG9yeUFyZWEiLCAicmFuZ2VCdXR0b25zIiwgImN1cnJlbnRSYW5nZSIsICJyYW5nZVRvTXMiLCAicmFuZ2UiLCAidGllckxhYmVsIiwgInRpZXIiLCAicmVuZGVyU3BhcmtsaW5lIiwgInNhbXBsZXMiLCAiYWNjZXNzb3IiLCAiY29sb3IiLCAidmFsdWVzIiwgIm1heCIsICJtaW4iLCAidyIsICJoIiwgInBhZCIsICJzdGVwWCIsICJwb2ludHMiLCAieCIsICJ5IiwgImxhc3QiLCAiYXZnIiwgInBvcHVsYXRlSGlzdG9yeUNvbnRhaW5lclNlbGVjdCIsICJwcmV2aW91cyIsICJlbnRyaWVzIiwgImxvYWRIaXN0b3J5IiwgImVuZFRpbWUiLCAic3RhcnRUaW1lIiwgImlzUmF3IiwgImNwdUFjY2Vzc29yIiwgIm1lbUFjY2Vzc29yIiwgIm5ldFJ4QWNjZXNzb3IiLCAibmV0VHhBY2Nlc3NvciIsICJzdGF0dXNDb250YWluZXIiLCAiaW5jaWRlbnRzQ29udGFpbmVyIiwgImNvbmZpZ0NvbnRhaW5lciIsICJhZGRCdG4iLCAiZm9ybUVsIiwgImZvcm1UaXRsZSIsICJmb3JtQ2FuY2VsIiwgImZvcm1TYXZlIiwgIkhFQUxUSF9TRVRUSU5HU19LRVkiLCAiSEVBTFRIX0RFRkFVTFRTIiwgImdsb2JhbFNhdmVCdG4iLCAiZ2xvYmFsUmVzZXRCdG4iLCAiZ2xvYmFsU3RhdHVzU3BhbiIsICJyZXRlbnRpb25JbnB1dCIsICJpbnRlcnZhbElucHV0IiwgInN0YXRzSW50ZXJ2YWxJbnB1dCIsICJtYXhFbnRyaWVzSW5wdXQiLCAiZGlza1RocmVzaG9sZElucHV0IiwgImxvYWRIZWFsdGhTZXR0aW5ncyIsICJyYXciLCAic2F2ZWQiLCAiYXBwbHlIZWFsdGhTZXR0aW5nc1RvVUkiLCAic2F2ZUhlYWx0aFNldHRpbmdzIiwgInNldHRpbmdzIiwgInJlc2V0SGVhbHRoU2V0dGluZ3MiLCAiZWRpdGluZ0lkIiwgInVwdGltZUNvbG9yIiwgInBjdCIsICJzZXZlcml0eUJhZGdlIiwgInNldiIsICJsb2FkU3RhdHVzIiwgImlzVXAiLCAiZG90Q29sb3IiLCAidTI0IiwgInU3ZCIsICJhdmdSdCIsICJsYXN0Q2hlY2siLCAiZGV0YWlsUm93IiwgInJ0IiwgImxvYWRJbmNpZGVudHMiLCAib3BlblJlcyIsICJoaXN0UmVzIiwgIm9wZW5EYXRhIiwgImhpc3REYXRhIiwgIm9wZW4iLCAiaW5jIiwgImhpc3RvcnkiLCAicmVzb2x2ZWQiLCAiZHVyIiwgImxvYWRDb25maWciLCAic2hvd0Zvcm0iLCAidGltZW91dCIsICJjb2RlcyIsICJzbGEiLCAic2xvdyIsICJoaWRlRm9ybSIsICJib2R5IiwgImNoZWNrQnRuIiwgImF2YWlsYWJsZUNvbnRhaW5lciIsICJhdXRvQ29udGFpbmVyIiwgImxhc3RDaGVja1NwYW4iLCAibG9hZEF2YWlsYWJsZSIsICJ1IiwgImNvdW50QmFkZ2UiLCAidXBkYXRlQWxsQnRuIiwgInVwZGF0ZUFsbENvbnRhaW5lcnMiLCAic3VjY2VzcyIsICJmYWlsZWQiLCAiY2hlY2tGb3JVcGRhdGVzIiwgIm9rIiwgImxvYWRBdXRvQ29uZmlnIiwgImNvbnRhaW5lcnNSZXMiLCAiY29uZmlnUmVzIiwgImNvbnRhaW5lcnNEYXRhIiwgImNvbmZpZ0RhdGEiLCAic2F2ZWRDb25maWciLCAiY2lkIiwgInNjaGVkdWxlVmFsIiwgInJvbGxiYWNrVmFsIiwgIndpbmRvd1ZhbCIsICJsYXN0UnVuIiwgInNjaGVkdWxlIiwgInJvbGxiYWNrIiwgIndpbmRvdyIsICJkY1ZlcnNpb25JbmZvIiwgImRjVXBkYXRlQmFkZ2UiLCAiZGNVcGRhdGVEZXRhaWxzIiwgImRjTmV3VmVyc2lvbiIsICJkY0NoYW5nZWxvZyIsICJkY0FwcGx5QnRuIiwgImRjQ2hlY2tCdG4iLCAiZGNSb2xsYmFja0J0biIsICJkY1N0YXR1c0JhciIsICJkY0hpc3RvcnlDb250YWluZXIiLCAiZGNMYXN0Q2hlY2siLCAiZGNTaG93U3RhdHVzIiwgInR5cGUiLCAiZGNMb2FkVmVyc2lvbiIsICJjb21taXQiLCAiZGNDaGVja0ZvclVwZGF0ZSIsICJzaWxlbnQiLCAidXBkYXRlc0J0biIsICJkb3QiLCAiZGNUYWIiLCAiZGNBcHBseVVwZGF0ZSIsICJkY0xvYWRIaXN0b3J5IiwgInN0Q29sb3IiLCAiZGNTaG93Um9sbGJhY2siLCAidmVyc2lvbnMiLCAiZm10Qnl0ZXMiLCAidW5pdHMiLCAibG9hZFZvbHVtZXMiLCAidm9scyIsICJpc1N5c3RlbSIsICJuYW1lSW5wdXQiLCAibG9hZE5ldHdvcmtzIiwgIm5ldHMiLCAibiIsICJkcml2ZXJTZWxlY3QiLCAibG9hZERpc2tVc2FnZSIsICJzZWN0aW9ucyIsICJwYXJzZWREYXRhIiwgInlhbWxTdHIiLCAic3RhY2tOYW1lIiwgIm9yaWdUZXh0IiwgInJlbmRlclByZXZpZXciLCAiYm9yZGVyQ29sb3IiLCAicGFydHMiLCAicHJvZ3Jlc3NFbCIsICJ0ZXJtRWwiLCAid3MiLCAiZml0QWRkb24iLCAiY2xlYW51cCIsICJvcGVuRXhlYyIsICJkaW1zIiwgImNvbHMiLCAicm93cyIsICJyZXNpemVIYW5kbGVyIiwgImZpbHRlclNlbGVjdCIsICJvdXRjb21lU2VsZWN0IiwgImxvYWRBdWRpdCIsICJvdXRjb21lIiwgImFjdG9yIiwgImFjdG9yTGFiZWwiLCAicm9sZSIsICJ0YWciLCAidGFicyIsICJwYW5lbHMiLCAiYWxsRXZlbnRzIiwgImFsbEhvc3RzIiwgInNzZVNvdXJjZSIsICJyZWZyZXNoT3ZlcnZpZXciLCAicmVmcmVzaEV2ZW50cyIsICJyZWZyZXNoSG9zdHMiLCAic3RhcnRMaXZlVGFpbCIsICJzdG9wTGl2ZVRhaWwiLCAicmVuZGVyRXZlbnRzIiwgImFjdGl2ZSIsICJzdGF0c1JlcyIsICJob3N0c1JlcyIsICJldmVudHNSZXMiLCAiaG9zdHMiLCAiZXZlbnRzQ291bnQiLCAicmVuZGVyVG9wTGlzdCIsICJpdGVtcyIsICJpdCIsICJmaWx0ZXJTb3VyY2UiLCAiZmlsdGVyU2V2ZXJpdHkiLCAiZmlsdGVySG9zdCIsICJmaWx0ZXJBY3RvciIsICJkZWJvdW5jZSIsICJyZWZyZXNoSG9zdEZpbHRlciIsICJyZW5kZXJFdmVudFJvdyIsICJzZXZDb2xvciIsICJjdXJyZW50IiwgInJlZ2lzdGVySG9zdFByb21wdCIsICJmbiIsICJtcyIsICJMT0NBVElPTl9LRVkiLCAiTEVHQUNZX0tFWSIsICJHRU9fQ0FDSEVfS0VZIiwgIlVOSVRfS0VZIiwgImdldFVuaXQiLCAiZ2V0V2VhdGhlckVsZW1lbnRzIiwgIndtb0Rlc2NyaXB0aW9ucyIsICJ3bW9JY29ucyIsICJ3aW5kRGlycyIsICJkZWdUb0RpciIsICJkZWciLCAiZ2VvY29kZUxvY2F0aW9uIiwgInF1ZXJ5IiwgImNhY2hlZCIsICJnZW8iLCAiZm9ybWF0TG9jYXRpb24iLCAiZmV0Y2hXZWF0aGVyIiwgImxvY2F0aW9uIiwgInRlbXBVbml0IiwgIndpbmRVbml0IiwgImNvZGUiLCAidXBkYXRlV2VhdGhlciIsICJ3ZWF0aGVyV2lkZ2V0IiwgIndlYXRoZXIiLCAidGVtcFN1ZmZpeCIsICJ3aW5kTGFiZWwiLCAibG9jYXRpb25JbnB1dCIsICJsb2MiLCAidW5pdFJhZGlvIiwgIm5ld1VuaXQiLCAib2xkVW5pdCIsICJ3aWRnZXQiLCAicmVuZGVyIiwgIkRBWVMiLCAiTU9OVEhTIiwgIlJPTUFOIiwgImN1cnJlbnRTdHlsZSIsICJsYXN0Q2hpbWVIb3VyIiwgImNoaW1lUGxheWluZyIsICJwcmV2RmxpcERpZ2l0cyIsICJhY3RpdmVMYXlvdXQiLCAiZGlnaXRhbFJlZnMiLCAidGlja1RpbWVyIiwgInBsYXlDaGltZXMiLCAic3RyaWtlIiwgImJlbGwiLCAibm93IiwgInJlc2V0UmVuZGVyTGF5b3V0IiwgImVuc3VyZURpZ2l0YWxMYXlvdXQiLCAicmVuZGVyRGVmYXVsdCIsICJoMjQiLCAiYW1wbSIsICJyZWZzIiwgInJlbmRlckxjZCIsICJjbHMiLCAicmVuZGVyRmxpcCIsICJkaWdpdHMiLCAiZmxpcENhcmQiLCAiZGlnaXQiLCAicmVuZGVyQmluYXJ5IiwgImJpdCIsICJjb2wiLCAib24iLCAicmVuZGVyQW5hbG9nIiwgInVzZVJvbWFuIiwgInNpemUiLCAiY3giLCAiY3kiLCAic0FuZ2xlIiwgIm1BbmdsZSIsICJoQW5nbGUiLCAibGFiZWxzIiwgImFuZ2xlIiwgInRpY2tzIiwgIm91dGVyIiwgImlubmVyIiwgIngxIiwgInkxIiwgIngyIiwgInkyIiwgInN2ZyIsICJ0aWNrIiwgIm5leHRDbGFzc05hbWUiLCAic2NoZWR1bGVOZXh0VGljayIsICJkZWxheSIsICJTVFlMRVMiLCAic3R5bGVPcHRpb25zSHRtbCIsICJjaGltZXNUb2dnbGUiLCAidm9sdW1lU2xpZGVyIiwgImxvYWRTZXR0aW5ncyIsICJyZWZyZXNoQ2FyZEhlYWx0aCIsICJzZXJ2aWNlSWQiLCAidXB0aW1lRWwiLCAiYmFyRWwiLCAidXB0aW1lMjQiLCAiZGlzbWlzc2VkVXBkYXRlcyIsICJrbm93blVwZGF0ZXMiLCAicmVmcmVzaENhcmRVcGRhdGVzIiwgIm5vdGlmeU5ldyIsICJwcmV2IiwgInVwZCIsICJ1cGRhdGVCdG4iLCAic2NoZWR1bGVDYXJkRW5oYW5jZW1lbnRzIiwgIm9yaWdSZWZyZXNoQWxsIiwgInRoZW1lQmVmb3JlQnVpbGRlciIsICJlZGl0aW5nU2x1ZyIsICJhZHZhbmNlZE92ZXJyaWRlcyIsICJUSEVNRV9MQUJFTFMiLCAiRklFTERTIiwgInRoZW1lQnRuIiwgInRoZW1lTGFiZWwiLCAiZ2V0TGFiZWxGb3IiLCAidXNlclRoZW1lcyIsICJ1cGRhdGVMYWJlbCIsICJuZXh0IiwgImJ1aWxkRmllbGRzSFRNTCIsICJncm91cGVkIiwgImJ1aWxkU3RhcnRGcm9tT3B0aW9ucyIsICJtb2RhbEhUTUwiLCAic3RhcnRTZWxlY3QiLCAiZWRpdFNlbGVjdCIsICJleGlzdGluZ1NlY3Rpb24iLCAibGlnaHRCZ0NoZWNrIiwgInBpY2tlcnMiLCAiYWR2YW5jZWRTZWN0aW9uIiwgImFkdmFuY2VkVG9nZ2xlIiwgImFkdmFuY2VkVmlzaWJsZSIsICJnZXRDdXJyZW50Q29sb3JzIiwgImdldEJhc2VDb2xvcnMiLCAidXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCIsICJiYXNlIiwgImRlcml2ZWQiLCAiaGV4IiwgImxvYWRUaGVtZUludG9QaWNrZXJzIiwgInRoZW1lTmFtZSIsICJ1cGRhdGVQcmV2aWV3IiwgImxvYWRVc2VyVGhlbWVJbnRvUGlja2VycyIsICJ0aGVtZSIsICJtdXRlZCIsICJiYWRnZU9rIiwgImJhZGdlQmFkIiwgImRvdE9rIiwgImRvdEJhZCIsICJkb3RzIiwgImFwcGx5Q29sb3JzTGl2ZSIsICJwcm9wIiwgInJlZnJlc2hFZGl0RHJvcGRvd24iLCAic2x1Z3MiLCAicmVmcmVzaFN0YXJ0RnJvbSIsICJvcGVuQnVpbGRlciIsICJjdXN0b21pemVCdG4iLCAib2xkU2x1ZyIsICJuZXdTbHVnIiwgInRoZW1lRGF0YSIsICJhcGlDb2xvcnMiLCAic2x1Z1RvRGVsZXRlIiwgImZhbGxiYWNrIiwgImV4cG9ydERhdGEiLCAidGhlbWVDb2xvcnMiLCAidGhlbWVMaWdodEJnIiwgImNvZGVJbnB1dCIsICJhY3RpdmF0ZUJ0biIsICJkZWFjdGl2YXRlQnRuIiwgImVycm9yRWwiLCAic3VjY2Vzc0VsIiwgImJhZGdlSWNvbiIsICJiYWRnZVRleHQiLCAiZGV0YWlsc0VsIiwgImZlYXR1cmVMaXN0IiwgImFjdGl2YXRlU2VjdGlvbiIsICJjdXJyZW50U3RhdHVzIiwgImhpZGVNZXNzYWdlcyIsICJzaG93RXJyb3IiLCAic2hvd1N1Y2Nlc3MiLCAicmVuZGVyU3RhdHVzIiwgImV4cGlyeUxpbmUiLCAiZmVhdHVyZXMiLCAiYWN0aXZlRmVhdHVyZXMiLCAidXBkYXRlSGVhZGVyQmFkZ2UiLCAiYWN0aXZhdGVMaWNlbnNlIiwgImRlYWN0aXZhdGVMaWNlbnNlIiwgInRvcGJhciIsICJpY29uRWwiLCAidGV4dEVsIiwgInRpbWVFbCIsICJkYXlzIiwgIm9wZW5MaWNlbnNlTW9kYWwiLCAicmVzdCIsICJ0b3BiYXJFbCIsICJmZWF0dXJlIiwgIlRUTF9PUFRJT05TIiwgIm8iLCAic2VydmljZU5hbWVFbCIsICJpc3N1ZWRFbCIsICJpc3N1ZWRVcmxJbnB1dCIsICJpc3N1ZWRDb3B5QnRuIiwgImlzc3VlZE1ldGFFbCIsICJvdXRzdGFuZGluZ0xpc3RFbCIsICJwdWJsaWNDcmVhdGVCdG4iLCAidHNDcmVhdGVCdG4iLCAidHNFbWFpbElucHV0IiwgInB1YmxpY1R0bFNlbGVjdCIsICJjdXJyZW50U2VydmljZSIsICJhY3RpdmVUYWIiLCAiX29yaWdpbkZyb21QYWdlIiwgIl9hYnNVcmwiLCAidXJsUGF0aCIsICJfZm9ybWF0RXhwaXJ5IiwgImlzbyIsICJfZm9ybWF0UmVtYWluaW5nIiwgInNldEFjdGl2ZVRhYiIsICJpc0FjdGl2ZSIsICJsb2FkT3V0c3RhbmRpbmciLCAicmVtYWluaW5nIiwgInJldm9rZVNoYXJlIiwgImlzc3VlUHVibGljIiwgIm9yaWdpbmFsIiwgInR0bE1zIiwgIl9yZW5kZXJBcGlFcnJvciIsICJpc3N1ZVRhaWxzY2FsZSIsICJvcGVuU2hhcmVNb2RhbCJdCn0K + `}).join(""),T.querySelectorAll(".share-revoke").forEach(i=>{i.addEventListener("click",()=>s(i.dataset.shareId))})}catch{T.innerHTML='Could not load outstanding shares.'}}async function s(t){try{const e=await fetch(`/api/v1/share/${encodeURIComponent(t)}`,{method:"DELETE",credentials:"same-origin"});if(!e.ok){const a=await e.json().catch(()=>({}));j(a&&a.error||`Revoke failed (HTTP ${e.status}).`);return}N("Share revoked."),b()}catch{j("Network error while revoking.")}}async function p(){if(!E)return;C(),H.disabled=!0;const t=H.textContent;H.textContent="Creating\u2026";try{const e=parseInt(w.value,10),a=await fetch("/api/v1/share",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceId:E.id,ttlMs:e})}),o=await a.json().catch(()=>({}));if(!a.ok||!o.success){m(a.status,o);return}const i=o.data.urlPath;z.value=u(i),M.textContent=`Public link \xB7 expires ${v(o.data.expiresAt)}`,I.style.display="block",N("Share link created."),b()}catch{j("Network error while creating share.")}finally{H.disabled=!1,H.textContent=t}}async function l(){if(!E)return;const t=($.value||"").trim();if(!t||!t.includes("@")){j("A valid recipient email is required.");return}C(),S.disabled=!0;const e=S.textContent;S.textContent="Creating\u2026";try{const a=await fetch("/api/v1/share/tailscale",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceId:E.id,email:t})}),o=await a.json().catch(()=>({}));if(!a.ok||!o.success){m(a.status,o);return}const i=o.data&&o.data.urlPath;i?(z.value=u(i),M.textContent=`Tailscale invite \xB7 emailed to ${t} (or use this URL manually if delivery failed).`):(z.value="",M.textContent=`Tailscale invite sent to ${t}.`),I.style.display="block",N("Tailscale invite created."),$.value="",b()}catch{j("Network error while creating Tailscale invite.")}finally{S.disabled=!1,S.textContent=e}}function m(t,e){const a=e&&e.error||"";if(t===402){j("Share is a Pro feature. Activate a license to unlock.");return}if(t===400&&/tailscale/i.test(a)){j("Tailscale is not configured on this host. Set up Tailscale in the dashboard first.");return}if(t===403){j("You do not have permission to share services.");return}if(t===404){j("Service not found. It may have been deleted.");return}j(a||`Request failed (HTTP ${t}).`)}function c(t){!t||!t.id||(E={id:t.id,name:t.name||t.id},A.textContent=E.name,C(),g("public"),$.value="",w.value=String(k[1].ms),B.classList.add("show"),b())}B.querySelectorAll(".share-tab").forEach(t=>{t.addEventListener("click",()=>g(t.dataset.tab))}),H.addEventListener("click",p),S.addEventListener("click",l),f.addEventListener("click",()=>B.classList.remove("show")),wireModal(B,f),P.addEventListener("click",async()=>{const t=z.value;if(t)try{navigator.clipboard&&navigator.clipboard.writeText?await navigator.clipboard.writeText(t):(z.select(),document.execCommand("copy"));const e=P.textContent;P.textContent="Copied!",setTimeout(()=>{P.textContent=e},1200)}catch{j("Could not copy to clipboard. Select the URL manually.")}}),window.openShareModal=c})(); +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gTG9nbyBDdXN0b21pemF0aW9uIFN5c3RlbVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnbG9nby1tb2RhbCcsIGA8ZGl2IGlkPVwibG9nby1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDAwcHg7IG1heC13aWR0aDogNTIwcHg7XCI+XG4gICAgICA8aDM+RGFzaGJvYXJkIFNldHRpbmdzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNnB4O1wiPlxuICAgICAgICBDdXN0b21pemUgeW91ciBkYXNoYm9hcmQncyBhcHBlYXJhbmNlIGFuZCBzeXN0ZW0gcHJlZmVyZW5jZXMuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiZGFzaGJvYXJkLXRpdGxlXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5EYXNoYm9hcmQgVGl0bGU6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkYXNoYm9hcmQtdGl0bGVcIiBwbGFjZWhvbGRlcj1cIkRhc2hDYWRkeVwiIG1heGxlbmd0aD1cIjUwXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDFyZW07XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJ0aW55LWhpbnRcIj5TaG93biBpbiBicm93c2VyIHRhYiBhbmQgaGVhZGVyIChtYXggNTAgY2hhcmFjdGVycyk8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGhyIGNsYXNzPVwiaHItZGl2aWRlclwiIC8+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5Mb2dvOjwvbGFiZWw+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAycHg7XCI+U2VwYXJhdGUgbG9nb3MgZm9yIGRhcmsgYW5kIGxpZ2h0IHRoZW1lcywgb3IgdXNlIHRoZSBzYW1lIGZvciBib3RoLjwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogIzFhMWEyZTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMSk7XCI+XG4gICAgICAgICAgPGltZyBpZD1cImxvZ28tcHJldmlldy1kYXJrXCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1kYXJrLnBuZ1wiIGFsdD1cIkRhcmsgdGhlbWUgbG9nb1wiIHN0eWxlPVwibWF4LWhlaWdodDogNjBweDsgbWF4LXdpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiAjOWFhNmJmOyBtYXJnaW4tdG9wOiA2cHg7XCI+RGFyayB0aGVtZXM8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogI2YwZjBmMDsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwuMSk7XCI+XG4gICAgICAgICAgPGltZyBpZD1cImxvZ28tcHJldmlldy1saWdodFwiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tbGlnaHQucG5nXCIgYWx0PVwiTGlnaHQgdGhlbWUgbG9nb1wiIHN0eWxlPVwibWF4LWhlaWdodDogNjBweDsgbWF4LXdpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiAjNWY2YjdhOyBtYXJnaW4tdG9wOiA2cHg7XCI+TGlnaHQgdGhlbWVzPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgaWQ9XCJsb2dvLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxMnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+VXNpbmcgZGVmYXVsdCBsb2dvczwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBmb250LXNpemU6IDAuODJyZW07IGN1cnNvcjogcG9pbnRlcjsgdXNlci1zZWxlY3Q6IG5vbmU7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwibG9nby1zYW1lLWJvdGhcIiAvPiBVc2Ugc2FtZSBsb2dvIGZvciBib3RoXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxvZ28tZHVhbC11cGxvYWRzXCIgY2xhc3M9XCJtYi0xNlwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwibG9nby11cGxvYWQtZGFya1wiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDZweDsgZm9udC1zaXplOiAwLjhyZW07XCI+RGFyayB0aGVtZSBsb2dvOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC1kYXJrXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIGNsYXNzPVwiaW5wdXQtY2FyZC1hbHRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImxvZ28tdXBsb2FkLWxpZ2h0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5MaWdodCB0aGVtZSBsb2dvOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC1saWdodFwiIGFjY2VwdD1cImltYWdlLypcIiBjbGFzcz1cImlucHV0LWNhcmQtYWx0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxvZ28tc2luZ2xlLXVwbG9hZFwiIGNsYXNzPVwibWItMTZcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJsb2dvLXVwbG9hZC1zaW5nbGVcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA2cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlVwbG9hZCBsb2dvOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwibG9nby11cGxvYWQtc2luZ2xlXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIGNsYXNzPVwiaW5wdXQtY2FyZC1hbHRcIiAvPlxuICAgICAgICA8cCBjbGFzcz1cInRpbnktaGludFwiPlRoaXMgbG9nbyB3aWxsIGJlIHVzZWQgb24gYWxsIHRoZW1lczwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItMTZcIj5cbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDhweDtcIj5Mb2dvIFBvc2l0aW9uOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJsb2dvLXBvc2l0aW9uLWJ0bnNcIiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtcG9zPVwibGVmdFwiIGNsYXNzPVwibG9nby1wb3MtYnRuIGJ0bi1vcHRpb25cIj5MZWZ0PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1wb3M9XCJjZW50ZXJcIiBjbGFzcz1cImxvZ28tcG9zLWJ0biBidG4tb3B0aW9uXCI+Q2VudGVyPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1wb3M9XCJyaWdodFwiIGNsYXNzPVwibG9nby1wb3MtYnRuIGJ0bi1vcHRpb25cIj5SaWdodDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8aHIgY2xhc3M9XCJoci1kaXZpZGVyXCIgLz5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPkZhdmljb24gKEJyb3dzZXIgVGFiIEljb24pOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJmYXZpY29uLXByZXZpZXctY29udGFpbmVyXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDhweDsgcGFkZGluZzogMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTtcIj5cbiAgICAgICAgICA8aW1nIGlkPVwiZmF2aWNvbi1wcmV2aWV3XCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktZmF2aWNvbi5pY29cIiBhbHQ9XCJDdXJyZW50IGZhdmljb25cIiBzdHlsZT1cIndpZHRoOiAzMnB4OyBoZWlnaHQ6IDMycHg7IGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkO1wiIG9uZXJyb3I9XCJ0aGlzLnNyYz0nZGF0YTppbWFnZS9zdmcreG1sLDxzdmcgeG1sbnM9JTIyaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjIgdmlld0JveD0lMjIwIDAgMzIgMzIlMjI+PHJlY3QgZmlsbD0lMjIlMjM2NjclMjIgd2lkdGg9JTIyMzIlMjIgaGVpZ2h0PSUyMjMyJTIyIHJ4PSUyMjQlMjIvPjwvc3ZnPidcIiAvPlxuICAgICAgICAgIDxzcGFuIGlkPVwiZmF2aWNvbi1zdGF0dXNcIiBjbGFzcz1cInRleHQtdGlueS1tdXRlZFwiPlVzaW5nIERhc2hDYWRkeSBmYXZpY29uPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJmYXZpY29uLXVwbG9hZFwiIGFjY2VwdD1cImltYWdlL3BuZyxpbWFnZS9zdmcreG1sXCIgY2xhc3M9XCJpbnB1dC1jYXJkLWFsdFwiIC8+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCI+VXBsb2FkIFBORyBvciBTVkcgLSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBJQ088L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGhyIGNsYXNzPVwiaHItZGl2aWRlclwiIC8+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwic2V0dGluZ3MtdGltZXpvbmVcIiBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPlRpbWV6b25lOjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJzZXR0aW5ncy10aW1lem9uZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAxcmVtO1wiPlxuICAgICAgICAgIDwhLS0gUG9wdWxhdGVkIGJ5IEpTIHdpdGggSUFOQSB0aW1lem9uZXMgLS0+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8cCBjbGFzcz1cInRpbnktaGludFwiPlVzZWQgYnkgYWxsIGRlcGxveWVkIGNvbnRhaW5lcnMuIENoYW5nZXMgYXBwbHkgdG8gbmV3IGRlcGxveW1lbnRzLjwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsb2dvLXJlc2V0XCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2VmNDQ0NCAyMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWNvbG9yOiAjZWY0NDQ0OyBjb2xvcjogI2VmNDQ0NDtcIj5SZXNldCB0byBEZWZhdWx0PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsb2dvLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwibG9nby1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IGxvZ29Nb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLW1vZGFsJyk7XG4gIGNvbnN0IHByZXZpZXdEYXJrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tcHJldmlldy1kYXJrJyk7XG4gIGNvbnN0IHByZXZpZXdMaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXByZXZpZXctbGlnaHQnKTtcbiAgY29uc3QgbG9nb1N0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXN0YXR1cycpO1xuICBjb25zdCBzYW1lQm90aENoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tc2FtZS1ib3RoJyk7XG4gIGNvbnN0IGR1YWxVcGxvYWRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tZHVhbC11cGxvYWRzJyk7XG4gIGNvbnN0IHNpbmdsZVVwbG9hZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXNpbmdsZS11cGxvYWQnKTtcbiAgY29uc3QgdXBsb2FkRGFyayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXVwbG9hZC1kYXJrJyk7XG4gIGNvbnN0IHVwbG9hZExpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tdXBsb2FkLWxpZ2h0Jyk7XG4gIGNvbnN0IHVwbG9hZFNpbmdsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXVwbG9hZC1zaW5nbGUnKTtcbiAgY29uc3QgYnJhbmRMb2dvRGFyayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNicmFuZCAuYnJhbmQtbG9nby1kYXJrJyk7XG4gIGNvbnN0IGJyYW5kTG9nb0xpZ2h0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JyYW5kIC5icmFuZC1sb2dvLWxpZ2h0Jyk7XG4gIGNvbnN0IHRvcFJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3Atcm93Jyk7XG4gIGNvbnN0IGRhc2hib2FyZFRpdGxlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGJvYXJkLXRpdGxlJyk7XG4gIGNvbnN0IERFRkFVTFRfVElUTEUgPSBEQy5OQU1FO1xuXG4gIGxldCBwZW5kaW5nRGFya0RhdGEgPSBudWxsO1xuICBsZXQgcGVuZGluZ0xpZ2h0RGF0YSA9IG51bGw7XG4gIGxldCBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gIGxldCBjdXJyZW50UG9zaXRpb24gPSAnbGVmdCc7XG4gIGxldCBjdXJyZW50VGl0bGUgPSBERUZBVUxUX1RJVExFO1xuXG4gIC8vIFRvZ2dsZSBiZXR3ZWVuIGR1YWwgYW5kIHNpbmdsZSB1cGxvYWQgbW9kZVxuICBzYW1lQm90aENoZWNrYm94Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKHNhbWVCb3RoQ2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgZHVhbFVwbG9hZHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHNpbmdsZVVwbG9hZC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAvLyBDbGVhciBpbmRpdmlkdWFsIHBlbmRpbmcgZGF0YVxuICAgICAgcGVuZGluZ0RhcmtEYXRhID0gbnVsbDtcbiAgICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBkdWFsVXBsb2Fkcy5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgc2luZ2xlVXBsb2FkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gICAgfVxuICB9KTtcblxuICAvLyBSZWFkIGZpbGUgYXMgZGF0YSBVUkwgaGVscGVyXG4gIGZ1bmN0aW9uIHJlYWRGaWxlQXNEYXRhVVJMKGZpbGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFmaWxlIHx8ICFmaWxlLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBzZWxlY3QgYW4gaW1hZ2UgZmlsZScsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiBjYWxsYmFjayhlLnRhcmdldC5yZXN1bHQpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9XG5cbiAgLy8gVXBsb2FkIGhhbmRsZXJzXG4gIHVwbG9hZERhcms/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgcmVhZEZpbGVBc0RhdGFVUkwoZS50YXJnZXQuZmlsZXNbMF0sIChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nRGFya0RhdGEgPSBkYXRhO1xuICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YTtcbiAgICAgIGxvZ29TdGF0dXMudGV4dENvbnRlbnQgPSAnTmV3IGRhcmsgbG9nbyByZWFkeSB0byBzYXZlJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgdXBsb2FkTGlnaHQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgcmVhZEZpbGVBc0RhdGFVUkwoZS50YXJnZXQuZmlsZXNbMF0sIChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nTGlnaHREYXRhID0gZGF0YTtcbiAgICAgIHByZXZpZXdMaWdodC5zcmMgPSBkYXRhO1xuICAgICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgbGlnaHQgbG9nbyByZWFkeSB0byBzYXZlJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgdXBsb2FkU2luZ2xlPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIHJlYWRGaWxlQXNEYXRhVVJMKGUudGFyZ2V0LmZpbGVzWzBdLCAoZGF0YSkgPT4ge1xuICAgICAgcGVuZGluZ1NpbmdsZURhdGEgPSBkYXRhO1xuICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YTtcbiAgICAgIHByZXZpZXdMaWdodC5zcmMgPSBkYXRhO1xuICAgICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgbG9nbyByZWFkeSB0byBzYXZlIChib3RoIHRoZW1lcyknO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBBcHBseSBsb2dvIHBvc2l0aW9uXG4gIGZ1bmN0aW9uIGFwcGx5TG9nb1Bvc2l0aW9uKHBvcykge1xuICAgIHRvcFJvdy5zZXRBdHRyaWJ1dGUoJ2RhdGEtbG9nby1wb3MnLCBwb3MpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sb2dvLXBvcy1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9IGJ0bi5kYXRhc2V0LnBvcyA9PT0gcG9zID8gJ3ZhcigtLWFjY2VudCknIDogJ3ZhcigtLWNhcmQtYmcpJztcbiAgICAgIGJ0bi5zdHlsZS5jb2xvciA9IGJ0bi5kYXRhc2V0LnBvcyA9PT0gcG9zID8gJ3doaXRlJyA6ICd2YXIoLS1mZyknO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQXBwbHkgZGFzaGJvYXJkIHRpdGxlXG4gIGZ1bmN0aW9uIGFwcGx5RGFzaGJvYXJkVGl0bGUodGl0bGUpIHtcbiAgICBjdXJyZW50VGl0bGUgPSB0aXRsZSB8fCBERUZBVUxUX1RJVExFO1xuICAgIGRvY3VtZW50LnRpdGxlID0gY3VycmVudFRpdGxlO1xuICAgIGNvbnN0IGhlYWRlclRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmRhc2hib2FyZC10aXRsZScpO1xuICAgIGlmIChoZWFkZXJUaXRsZSkgaGVhZGVyVGl0bGUudGV4dENvbnRlbnQgPSBjdXJyZW50VGl0bGU7XG4gIH1cblxuICAvLyBMb2FkIGN1c3RvbSBsb2dvLCBwb3NpdGlvbiwgYW5kIHRpdGxlIG9uIHN0YXJ0dXBcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEN1c3RvbUxvZ28oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbG9nbycpO1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIC8vIEFwcGx5IGRhcmsvbGlnaHQgdmFyaWFudHNcbiAgICAgICAgaWYgKGRhdGEuY3VzdG9tTG9nb0RhcmspIHtcbiAgICAgICAgICBicmFuZExvZ29EYXJrLnNyYyA9IGRhdGEuY3VzdG9tTG9nb0Rhcms7XG4gICAgICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YS5jdXN0b21Mb2dvRGFyaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5jdXN0b21Mb2dvTGlnaHQpIHtcbiAgICAgICAgICBicmFuZExvZ29MaWdodC5zcmMgPSBkYXRhLmN1c3RvbUxvZ29MaWdodDtcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvTGlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGVnYWN5IHNpbmdsZS1sb2dvIGZhbGxiYWNrXG4gICAgICAgIGlmICghZGF0YS5jdXN0b21Mb2dvRGFyayAmJiAhZGF0YS5jdXN0b21Mb2dvTGlnaHQgJiYgZGF0YS5jdXN0b21Mb2dvKSB7XG4gICAgICAgICAgYnJhbmRMb2dvRGFyay5zcmMgPSBkYXRhLmN1c3RvbUxvZ287XG4gICAgICAgICAgYnJhbmRMb2dvTGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvO1xuICAgICAgICAgIHByZXZpZXdEYXJrLnNyYyA9IGRhdGEuY3VzdG9tTG9nbztcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGF0YS5pc0RlZmF1bHQpIHtcbiAgICAgICAgICBsb2dvU3RhdHVzLnRleHRDb250ZW50ID0gJ1VzaW5nIGN1c3RvbSBsb2dvJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5wb3NpdGlvbikge1xuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IGRhdGEucG9zaXRpb247XG4gICAgICAgICAgYXBwbHlMb2dvUG9zaXRpb24oZGF0YS5wb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuZGFzaGJvYXJkVGl0bGUpIHtcbiAgICAgICAgICBhcHBseURhc2hib2FyZFRpdGxlKGRhdGEuZGFzaGJvYXJkVGl0bGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGxvYWQgY3VzdG9tIGxvZ286JywgZXJyb3IubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUG9zaXRpb24gYnV0dG9uIGhhbmRsZXJzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sb2dvLXBvcy1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY3VycmVudFBvc2l0aW9uID0gYnRuLmRhdGFzZXQucG9zO1xuICAgICAgYXBwbHlMb2dvUG9zaXRpb24oY3VycmVudFBvc2l0aW9uKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gT3BlbiBsb2dvIG1vZGFsIG9uIGJyYW5kIGNsaWNrXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdicmFuZCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBwZW5kaW5nRGFya0RhdGEgPSBudWxsO1xuICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgIHBlbmRpbmdTaW5nbGVEYXRhID0gbnVsbDtcbiAgICBpZiAodXBsb2FkRGFyaykgdXBsb2FkRGFyay52YWx1ZSA9ICcnO1xuICAgIGlmICh1cGxvYWRMaWdodCkgdXBsb2FkTGlnaHQudmFsdWUgPSAnJztcbiAgICBpZiAodXBsb2FkU2luZ2xlKSB1cGxvYWRTaW5nbGUudmFsdWUgPSAnJztcbiAgICAvLyBSZXNldCBjaGVja2JveCB0byBkdWFsIG1vZGVcbiAgICBpZiAoc2FtZUJvdGhDaGVja2JveCkgc2FtZUJvdGhDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgZHVhbFVwbG9hZHMuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBzaW5nbGVVcGxvYWQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAvLyBSZXNldCBwcmV2aWV3cyB0byBjdXJyZW50IGhlYWRlciBsb2dvc1xuICAgIHByZXZpZXdEYXJrLnNyYyA9IGJyYW5kTG9nb0Rhcmsuc3JjO1xuICAgIHByZXZpZXdMaWdodC5zcmMgPSBicmFuZExvZ29MaWdodC5zcmM7XG4gICAgY29uc3QgaXNDdXN0b20gPSBicmFuZExvZ29EYXJrLnNyYy5pbmNsdWRlcygnY3VzdG9tLWxvZ28nKSB8fCBicmFuZExvZ29MaWdodC5zcmMuaW5jbHVkZXMoJ2N1c3RvbS1sb2dvJyk7XG4gICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9IGlzQ3VzdG9tID8gJ1VzaW5nIGN1c3RvbSBsb2dvJyA6ICdVc2luZyBkZWZhdWx0IGxvZ29zJztcbiAgICBhcHBseUxvZ29Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24pO1xuICAgIGRhc2hib2FyZFRpdGxlSW5wdXQudmFsdWUgPSBjdXJyZW50VGl0bGU7XG4gICAgbG9nb01vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gU2F2ZSBsb2dvLCBwb3NpdGlvbiwgYW5kIHRpdGxlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5ld1RpdGxlID0gZGFzaGJvYXJkVGl0bGVJbnB1dC52YWx1ZS50cmltKCkgfHwgREVGQVVMVF9USVRMRTtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIHBvc2l0aW9uOiBjdXJyZW50UG9zaXRpb24sXG4gICAgICAgIGRhc2hib2FyZFRpdGxlOiBuZXdUaXRsZVxuICAgICAgfTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGxvZ28gZGF0YSB0byBzZW5kXG4gICAgICBpZiAoc2FtZUJvdGhDaGVja2JveD8uY2hlY2tlZCAmJiBwZW5kaW5nU2luZ2xlRGF0YSkge1xuICAgICAgICAvLyBTaW5nbGUgbG9nbyBmb3IgYm90aCB2YXJpYW50c1xuICAgICAgICBwYXlsb2FkLmRhdGFEYXJrID0gcGVuZGluZ1NpbmdsZURhdGE7XG4gICAgICAgIHBheWxvYWQuZGF0YUxpZ2h0ID0gcGVuZGluZ1NpbmdsZURhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocGVuZGluZ0RhcmtEYXRhKSBwYXlsb2FkLmRhdGFEYXJrID0gcGVuZGluZ0RhcmtEYXRhO1xuICAgICAgICBpZiAocGVuZGluZ0xpZ2h0RGF0YSkgcGF5bG9hZC5kYXRhTGlnaHQgPSBwZW5kaW5nTGlnaHREYXRhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2xvZ28nLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgY29uc3QgdCA9ICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGRhdGEucGF0aERhcmspIHtcbiAgICAgICAgICBicmFuZExvZ29EYXJrLnNyYyA9IGRhdGEucGF0aERhcmsgKyB0O1xuICAgICAgICAgIHByZXZpZXdEYXJrLnNyYyA9IGRhdGEucGF0aERhcmsgKyB0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLnBhdGhMaWdodCkge1xuICAgICAgICAgIGJyYW5kTG9nb0xpZ2h0LnNyYyA9IGRhdGEucGF0aExpZ2h0ICsgdDtcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5wYXRoTGlnaHQgKyB0O1xuICAgICAgICB9XG4gICAgICAgIGFwcGx5TG9nb1Bvc2l0aW9uKGN1cnJlbnRQb3NpdGlvbik7XG4gICAgICAgIGFwcGx5RGFzaGJvYXJkVGl0bGUobmV3VGl0bGUpO1xuICAgICAgICBsb2dvTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlOiAnICsgZXJyb3IuZXJyb3IsICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvciBzYXZpbmc6ICcgKyBlcnJvci5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFJlc2V0IGFsbCBicmFuZGluZyB0byBkZWZhdWx0c1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1yZXNldCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpcm0oJ1Jlc2V0IGFsbCBicmFuZGluZyB0byBEYXNoQ2FkZHkgZGVmYXVsdHM/XFxuXFxuVGhpcyB3aWxsIHJlc2V0IHRoZSBsb2dvLCBmYXZpY29uLCB0aXRsZSwgYW5kIHBvc2l0aW9uLicpKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9nb1Jlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbG9nbycsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIGlmIChsb2dvUmVzcG9uc2Uub2spIHtcbiAgICAgICAgYnJhbmRMb2dvRGFyay5zcmMgPSAnL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1kYXJrLnBuZyc7XG4gICAgICAgIGJyYW5kTG9nb0xpZ2h0LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZyc7XG4gICAgICAgIHByZXZpZXdEYXJrLnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWRhcmsucG5nJztcbiAgICAgICAgcHJldmlld0xpZ2h0LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZyc7XG4gICAgICAgIGxvZ29TdGF0dXMudGV4dENvbnRlbnQgPSAnVXNpbmcgZGVmYXVsdCBsb2dvcyc7XG4gICAgICAgIHBlbmRpbmdEYXJrRGF0YSA9IG51bGw7XG4gICAgICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgICAgICBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gICAgICAgIGRhc2hib2FyZFRpdGxlSW5wdXQudmFsdWUgPSBERUZBVUxUX1RJVExFO1xuICAgICAgICBhcHBseURhc2hib2FyZFRpdGxlKERFRkFVTFRfVElUTEUpO1xuICAgICAgICBjdXJyZW50UG9zaXRpb24gPSAnbGVmdCc7XG4gICAgICAgIGFwcGx5TG9nb1Bvc2l0aW9uKCdsZWZ0Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZhdmljb25SZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Zhdmljb24nLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICBpZiAoZmF2aWNvblJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGZhdmljb25MaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tyZWw9XCJpY29uXCJdJyk7XG4gICAgICAgIGNvbnN0IGZhdmljb25QcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zhdmljb24tcHJldmlldycpO1xuICAgICAgICBjb25zdCBmYXZpY29uU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zhdmljb24tc3RhdHVzJyk7XG4gICAgICAgIGlmIChmYXZpY29uTGluaykgZmF2aWNvbkxpbmsuaHJlZiA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1mYXZpY29uLmljbz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoZmF2aWNvblByZXZpZXcpIGZhdmljb25QcmV2aWV3LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1mYXZpY29uLmljbz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoZmF2aWNvblN0YXR1cykgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdVc2luZyBEYXNoQ2FkZHkgZmF2aWNvbic7XG4gICAgICAgIHBlbmRpbmdGYXZpY29uRGF0YSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yIHJlc2V0dGluZyBicmFuZGluZzogJyArIGVycm9yLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgd2lyZU1vZGFsKGxvZ29Nb2RhbCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tY2FuY2VsJykpO1xuXG4gIC8vID09PT09IEZBVklDT04gSEFORExJTkcgPT09PT1cbiAgY29uc3QgZmF2aWNvblByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmF2aWNvbi1wcmV2aWV3Jyk7XG4gIGNvbnN0IGZhdmljb25TdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmF2aWNvbi1zdGF0dXMnKTtcbiAgY29uc3QgZmF2aWNvblVwbG9hZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYXZpY29uLXVwbG9hZCcpO1xuICBjb25zdCBmYXZpY29uTGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwiaWNvblwiXScpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgbGV0IHBlbmRpbmdGYXZpY29uRGF0YSA9IG51bGw7XG5cbiAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW3JlbD1cImljb25cIl0nKSkge1xuICAgIGZhdmljb25MaW5rLnJlbCA9ICdpY29uJztcbiAgICBmYXZpY29uTGluay5ocmVmID0gJy9hc3NldHMvZGFzaGNhZGR5LWZhdmljb24uaWNvJztcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGZhdmljb25MaW5rKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRDdXN0b21GYXZpY29uKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Zhdmljb24nKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5jdXN0b21GYXZpY29uKSB7XG4gICAgICAgICAgZmF2aWNvbkxpbmsuaHJlZiA9IGRhdGEuY3VzdG9tRmF2aWNvbiArICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgICBmYXZpY29uUHJldmlldy5zcmMgPSBkYXRhLmN1c3RvbUZhdmljb24gKyAnP3Q9JyArIERhdGUubm93KCk7XG4gICAgICAgICAgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdVc2luZyBjdXN0b20gZmF2aWNvbic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgbG9hZCBjdXN0b20gZmF2aWNvbjonLCBlcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBmYXZpY29uVXBsb2FkPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBpZiAoIWZpbGUudHlwZS5tYXRjaCgvXmltYWdlXFwvKHBuZ3xzdmdcXCt4bWwpJC8pKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2Ugc2VsZWN0IGEgUE5HIG9yIFNWRyBmaWxlJywgJ3dhcm5pbmcnKTtcbiAgICAgIGZhdmljb25VcGxvYWQudmFsdWUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKGV2ZW50KSA9PiB7XG4gICAgICBwZW5kaW5nRmF2aWNvbkRhdGEgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgZmF2aWNvblByZXZpZXcuc3JjID0gcGVuZGluZ0Zhdmljb25EYXRhO1xuICAgICAgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgZmF2aWNvbiByZWFkeSB0byBzYXZlJztcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9KTtcblxuICAvLyBTYXZlIGZhdmljb24gYWxvbmdzaWRlIGxvZ28gc2F2ZVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChwZW5kaW5nRmF2aWNvbkRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZmF2aWNvbicsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRhdGE6IHBlbmRpbmdGYXZpY29uRGF0YSB9KVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICBmYXZpY29uTGluay5ocmVmID0gZGF0YS5wYXRoICsgJz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICAgIGZhdmljb25QcmV2aWV3LnNyYyA9IGRhdGEucGF0aCArICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgICBmYXZpY29uU3RhdHVzLnRleHRDb250ZW50ID0gJ1VzaW5nIGN1c3RvbSBmYXZpY29uJztcbiAgICAgICAgICBwZW5kaW5nRmF2aWNvbkRhdGEgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlIGZhdmljb246ICcgKyBlcnJvci5lcnJvciwgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yIHNhdmluZyBmYXZpY29uOiAnICsgZXJyb3IubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBsb2FkQ3VzdG9tRmF2aWNvbigpO1xuICBsb2FkQ3VzdG9tTG9nbygpO1xuXG4gIC8vID09PT09IFRJTUVaT05FIFNFVFRJTkcgPT09PT1cbiAgY29uc3Qgc2V0dGluZ3NUelNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy10aW1lem9uZScpO1xuICBpZiAoc2V0dGluZ3NUelNlbGVjdCkge1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKGxvZ29Nb2RhbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSAmJiBzZXR0aW5nc1R6U2VsZWN0Lm9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgbGV0IGN1cnJlbnRUejtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvY29uZmlnJyk7XG4gICAgICAgICAgICBpZiAocmVzLm9rKSB7IGNvbnN0IGNmZyA9IGF3YWl0IHJlcy5qc29uKCk7IGN1cnJlbnRUeiA9IGNmZy50aW1lem9uZTsgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICAgICAgICB3aW5kb3cucG9wdWxhdGVUaW1lem9uZVNlbGVjdChzZXR0aW5nc1R6U2VsZWN0LCBjdXJyZW50VHopO1xuICAgICAgICB9KSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUobG9nb01vZGFsLCB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR6ID0gc2V0dGluZ3NUelNlbGVjdC52YWx1ZTtcbiAgICAgIGlmICghdHopIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbmZpZycpO1xuICAgICAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgICAgICBjb25zdCBjZmcgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBjZmcudGltZXpvbmUgPSB0ejtcbiAgICAgICAgY2ZnLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNmZylcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgdGltZXpvbmU6JywgZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSkoKTtcbjtcbi8vIFNoYXJlZCB0aW1lem9uZSB1dGlsaXR5IFx1MjAxNCB1c2VkIGJ5IHNldHVwIHdpemFyZCBhbmQgc2V0dGluZ3MgbW9kYWxcbi8vIGVycm9ySGFuZGxlciBpcyBkZWNsYXJlZCBnbG9iYWxseSBpbiBnbG9iYWxzLmpzIChjb3JlLmpzIGJ1bmRsZSk7IHJldXNpbmcgaXRcbi8vIGhlcmUgc28gd2UgZG9uJ3QgZ2V0IFwicmVkZWNsYXJhdGlvbiBvZiBjb25zdCBlcnJvckhhbmRsZXJcIiBhdCBzY3JpcHQgc2NvcGUuXG5cbndpbmRvdy5wb3B1bGF0ZVRpbWV6b25lU2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0RWwsIHNlbGVjdGVkVHopIHtcbiAgY29uc3QgdGltZXpvbmVzID0gSW50bC5zdXBwb3J0ZWRWYWx1ZXNPZigndGltZVpvbmUnKTtcbiAgY29uc3QgZGV0ZWN0ZWQgPSBzZWxlY3RlZFR6IHx8IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCAnVVRDJztcbiAgc2VsZWN0RWwuaW5uZXJIVE1MID0gJyc7XG4gIGZvciAoY29uc3QgdHogb2YgdGltZXpvbmVzKSB7XG4gICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgb3B0LnZhbHVlID0gdHo7XG4gICAgb3B0LnRleHRDb250ZW50ID0gdHoucmVwbGFjZSgvXy9nLCAnICcpO1xuICAgIGlmICh0eiA9PT0gZGV0ZWN0ZWQpIG9wdC5zZWxlY3RlZCA9IHRydWU7XG4gICAgc2VsZWN0RWwuYXBwZW5kQ2hpbGQob3B0KTtcbiAgfVxufTtcblxuLy8gU2V0dXAgV2l6YXJkIFN5c3RlbSAtIFNlcnZlci1zaWRlIGNvbmZpZyBzdG9yYWdlXG4oZnVuY3Rpb24gKCkge1xuICBsZXQgY3VycmVudENvbmZpZ1R5cGUgPSAnaG9tZWxhYic7XG4gIGxldCBzZXJ2ZXJDb25maWcgPSBudWxsO1xuXG4gIC8vIENoZWNrIHNlcnZlciBmb3IgZXhpc3RpbmcgY29uZmlnIG9uIHBhZ2UgbG9hZFxuICBhc3luYyBmdW5jdGlvbiBjaGVja1NlcnZlckNvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBzZXJ2ZXJDb25maWcgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChzZXJ2ZXJDb25maWcgJiYgc2VydmVyQ29uZmlnLnNldHVwQ29tcGxldGUpIHtcbiAgICAgICAgICAvLyBDb25maWcgZXhpc3RzIG9uIHNlcnZlciAtIGRvbid0IHNob3cgd2l6YXJkXG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmV0Y2ggc2VydmVyIGNvbmZpZywgY2hlY2tpbmcgbG9jYWxTdG9yYWdlIGZhbGxiYWNrOicsIGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBjaGVjayBsb2NhbFN0b3JhZ2UgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgbG9jYWxTZXR1cCA9IHNhZmVHZXQoJ2Rhc2hjYWRkeS1zZXR1cCcpO1xuICAgIGlmIChsb2NhbFNldHVwKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtd2l6YXJkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIE5vIGNvbmZpZyBmb3VuZCAtIHNob3cgd2l6YXJkXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBvbiBwYWdlIGxvYWRcbiAgY2hlY2tTZXJ2ZXJDb25maWcoKTtcblxuICAvLyBQb3B1bGF0ZSB0aW1lem9uZSBkcm9wZG93biB3aXRoIGF1dG8tZGV0ZWN0aW9uXG4gIGNvbnN0IHNldHVwVHpTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKTtcbiAgaWYgKHNldHVwVHpTZWxlY3QpIHdpbmRvdy5wb3B1bGF0ZVRpbWV6b25lU2VsZWN0KHNldHVwVHpTZWxlY3QpO1xuXG4gIC8vIFN0ZXAgbmF2aWdhdGlvblxuICBmdW5jdGlvbiBzaG93U3RlcChzdGVwSWQpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2V0dXAtc3RlcCcpLmZvckVhY2goc3RlcCA9PiB7XG4gICAgICBzdGVwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0U3RlcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0ZXBJZCk7XG4gICAgaWYgKHRhcmdldFN0ZXApIHtcbiAgICAgIHRhcmdldFN0ZXAuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuICB9XG5cbiAgLy8gU2hvdyBzdW1tYXJ5XG4gIGZ1bmN0aW9uIHNob3dTdW1tYXJ5KCkge1xuICAgIGNvbnN0IHN1bW1hcnlDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXN1bW1hcnktY29udGVudCcpO1xuICAgIGlmICghc3VtbWFyeUNvbnRlbnQpIHJldHVybjtcblxuICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDIwcHg7XCI+JztcblxuICAgIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ2hvbWVsYWInKSB7XG4gICAgICBjb25zdCB0bGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGxkJyk/LnZhbHVlPy50cmltKCkgfHwgJy5ob21lJztcbiAgICAgIGNvbnN0IGNhTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1jYS1uYW1lJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBkbnNJUCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGRuc1BvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXBvcnQnKT8udmFsdWU/LnRyaW0oKSB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVDtcblxuICAgICAgaHRtbCArPSBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+SG9tZSBMYWIgQ29uZmlndXJhdGlvbjwvaDM+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTJweDsgZm9udC1zaXplOiAwLjk1cmVtO1wiPlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlRMRDo8L3N0cm9uZz4gJHt0bGR9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+Q2VydGlmaWNhdGUgQXV0aG9yaXR5Ojwvc3Ryb25nPiAke2NhTmFtZX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5ETlMgU2VydmVyOjwvc3Ryb25nPiAke2Ruc0lQfToke2Ruc1BvcnR9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+RXhhbXBsZSBVUkxzOjwvc3Ryb25nPiBodHRwczovL3VwdGltZSR7dGxkfSwgaHR0cHM6Ly9uZXh0Y2xvdWQke3RsZH08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdzaW1wbGUnKSB7XG4gICAgICBjb25zdCBpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zaW1wbGUtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnbG9jYWxob3N0JztcblxuICAgICAgaHRtbCArPSBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+U2ltcGxlIFNldHVwPC9oMz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4OyBmb250LXNpemU6IDAuOTVyZW07XCI+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+QWNjZXNzIE1ldGhvZDo8L3N0cm9uZz4gSVA6UG9ydCBvbmx5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+RGVmYXVsdCBJUDo8L3N0cm9uZz4gJHtpcH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5TU0w6PC9zdHJvbmc+IE5vbmUgKEhUVFAgb25seSk8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5FeGFtcGxlIFVSTHM6PC9zdHJvbmc+IGh0dHA6Ly8ke2lwfTo4MDgwLCBodHRwOi8vJHtpcH06MzAwMDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBlbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZW1haWwnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IHJvdXRpbmdNb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInJvdXRpbmctbW9kZVwiXTpjaGVja2VkJyk/LnZhbHVlIHx8ICdzdWJkaXJlY3RvcnknO1xuICAgICAgY29uc3QgZXhhbXBsZVVybHMgPSByb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeSdcbiAgICAgICAgPyBgaHR0cHM6Ly8ke2RvbWFpbn0vc29uYXJyLCBodHRwczovLyR7ZG9tYWlufS9ncmFmYW5hYFxuICAgICAgICA6IGBodHRwczovL3NvbmFyci4ke2RvbWFpbn0sIGh0dHBzOi8vZ3JhZmFuYS4ke2RvbWFpbn1gO1xuICAgICAgY29uc3Qgcm91dGluZ0xhYmVsID0gcm91dGluZ01vZGUgPT09ICdzdWJkaXJlY3RvcnknID8gJ1N1YmRpcmVjdG9yeSAoZG9tYWluLmNvbS9hcHApJyA6ICdTdWJkb21haW4gKGFwcC5kb21haW4uY29tKSc7XG5cbiAgICAgIGh0bWwgKz0gYFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjogMCAwIDEycHg7IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPlB1YmxpYyBTZXJ2ZXI8L2gzPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDEycHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5Eb21haW46PC9zdHJvbmc+ICR7ZG9tYWlufTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlNTTDo8L3N0cm9uZz4gTGV0J3MgRW5jcnlwdDwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPkVtYWlsOjwvc3Ryb25nPiAke2VtYWlsfTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlJvdXRpbmc6PC9zdHJvbmc+ICR7cm91dGluZ0xhYmVsfTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPkV4YW1wbGUgVVJMczo8L3N0cm9uZz4gJHtleGFtcGxlVXJsc308L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH1cblxuICAgIC8vIFRpbWV6b25lICh1bml2ZXJzYWwgYWNyb3NzIGFsbCBjb25maWcgdHlwZXMpXG4gICAgY29uc3QgdHogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKT8udmFsdWUgfHwgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8ICdVVEMnO1xuICAgIGh0bWwgKz0gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjk1cmVtO1wiPjxzdHJvbmc+VGltZXpvbmU6PC9zdHJvbmc+ICR7dHoucmVwbGFjZSgvXy9nLCAnICcpfTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgc3VtbWFyeUNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zdW1tYXJ5Jyk7XG4gIH1cblxuICAvLyBTYXZlIGNvbmZpZyB0byBzZXJ2ZXJcbiAgYXN5bmMgZnVuY3Rpb24gc2F2ZUNvbmZpZ1RvU2VydmVyKGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2NvbmZpZycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb25maWcpXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tTZXR1cFdpemFyZF0gU2F2ZSBDb25maWcnLCBuZXcgRXJyb3IoYFNlcnZlciByZXR1cm5lZCAke3Jlc3BvbnNlLnN0YXR1c31gKSwgeyBmdW5jdGlvbjogJ3NhdmVDb25maWdUb1NlcnZlcicgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbU2V0dXBXaXphcmRdIFNhdmUgQ29uZmlnJywgZXJyb3IsIHsgZnVuY3Rpb246ICdzYXZlQ29uZmlnVG9TZXJ2ZXInIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmlzaCBzZXR1cCBoYW5kbGVyXG4gIGFzeW5jIGZ1bmN0aW9uIGZpbmlzaFNldHVwKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHNldHVwQ29tcGxldGU6IHRydWUsXG4gICAgICBjb25maWd1cmF0aW9uVHlwZTogY3VycmVudENvbmZpZ1R5cGUsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRpbWV6b25lOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKT8udmFsdWUgfHwgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8ICdVVEMnXG4gICAgfTtcblxuICAgIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ2hvbWVsYWInKSB7XG4gICAgICBjb25maWcudGxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXRsZCcpPy52YWx1ZT8udHJpbSgpIHx8ICcuaG9tZSc7XG4gICAgICBjb25maWcuY2FOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWNhLW5hbWUnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IHNlbGVjdGVkUHJvdmlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXByb3ZpZGVyJyk/LnZhbHVlIHx8ICd0ZWNobml0aXVtJztcbiAgICAgIGNvbmZpZy5kbnMgPSB7XG4gICAgICAgIHByb3ZpZGVyOiBzZWxlY3RlZFByb3ZpZGVyLFxuICAgICAgICBpcDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRucy1pcCcpPy52YWx1ZT8udHJpbSgpIHx8ICcnLFxuICAgICAgICBwb3J0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXBvcnQnKT8udmFsdWU/LnRyaW0oKSB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVCxcbiAgICAgICAgdG9rZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtdG9rZW4nKT8udmFsdWU/LnRyaW0oKSB8fCAnJ1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5kZWZhdWx0cyA9IHtcbiAgICAgICAgZG5zVHlwZTogJ3ByaXZhdGUnLFxuICAgICAgICBzc2xUeXBlOiAnaW50ZXJuYWwnLFxuICAgICAgICB0YXJnZXRJUDogJ2xvY2FsaG9zdCdcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgIGNvbmZpZy5kZWZhdWx0SVAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc2ltcGxlLWlwJyk/LnZhbHVlPy50cmltKCkgfHwgJ2xvY2FsaG9zdCc7XG4gICAgICBjb25maWcuZGVmYXVsdHMgPSB7XG4gICAgICAgIGRuc1R5cGU6ICdub25lJyxcbiAgICAgICAgc3NsVHlwZTogJ25vbmUnLFxuICAgICAgICB0YXJnZXRJUDogY29uZmlnLmRlZmF1bHRJUFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAncHVibGljJykge1xuICAgICAgY29uZmlnLmRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25maWcuZW1haWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtcHVibGljLWVtYWlsJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25maWcucm91dGluZ01vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwicm91dGluZy1tb2RlXCJdOmNoZWNrZWQnKT8udmFsdWUgfHwgJ3N1YmRpcmVjdG9yeSc7XG4gICAgICBjb25maWcuZGVmYXVsdHMgPSB7XG4gICAgICAgIGRuc1R5cGU6IGNvbmZpZy5yb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeScgPyAnbm9uZScgOiAncHVibGljJyxcbiAgICAgICAgc3NsVHlwZTogJ2xldHNlbmNyeXB0JyxcbiAgICAgICAgdGFyZ2V0SVA6ICdsb2NhbGhvc3QnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNhdmUgdG8gc2VydmVyIChwcmltYXJ5KSBhbmQgbG9jYWxTdG9yYWdlIChmYWxsYmFjaylcbiAgICBjb25zdCBzYXZlZFRvU2VydmVyID0gYXdhaXQgc2F2ZUNvbmZpZ1RvU2VydmVyKGNvbmZpZyk7XG4gICAgc2FmZVNldCgnZGFzaGNhZGR5LWNvbmZpZycsIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuICAgIHNhZmVTZXQoJ2Rhc2hjYWRkeS1zZXR1cCcsICdjb21wbGV0ZWQnKTtcblxuICAgIC8vIEhpZGUgd2l6YXJkXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAvLyBTaG93IHN1Y2Nlc3Mgbm90aWZpY2F0aW9uXG4gICAgY29uc3QgY29uZmlnTmFtZSA9IGN1cnJlbnRDb25maWdUeXBlID09PSAnaG9tZWxhYicgPyAnUHJvZmVzc2lvbmFsIEhvbWUgTGFiJyA6XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbmZpZ1R5cGUgPT09ICdzaW1wbGUnID8gJ1NpbXBsZSBTZXR1cCcgOiAnUHVibGljIFNlcnZlcic7XG4gICAgY29uc3Qgc2F2ZUxvY2F0aW9uID0gc2F2ZWRUb1NlcnZlciA/ICdzZXJ2ZXIgKHNoYXJlZCBhY3Jvc3MgYWxsIGRldmljZXMpJyA6ICdsb2NhbGx5ICh0aGlzIGJyb3dzZXIgb25seSknO1xuXG4gICAgc2hvd05vdGlmaWNhdGlvbihgU2V0dXAgQ29tcGxldGUhIENvbmZpZ3VyZWQgZm9yOiAke2NvbmZpZ05hbWV9LiBTZXR0aW5ncyBzYXZlZCB0bzogJHtzYXZlTG9jYXRpb259YCwgJ3N1Y2Nlc3MnLCA1MDAwKTtcblxuICAgIC8vIFJlbG9hZCBwYWdlIHRvIGFwcGx5IGNvbmZpZ3VyYXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IGxvY2F0aW9uLnJlbG9hZCgpLCA1MDApO1xuICB9XG5cbiAgLy8gPT09PT0gRXZlbnQgSGFuZGxlcnMgdXNpbmcgZGlyZWN0IG9uY2xpY2sgZm9yIHJlbGlhYmlsaXR5ID09PT09XG5cbiAgLy8gU3RlcCAxOiBDb250aW51ZSBidXR0b25cbiAgY29uc3Qgc3RlcDFOZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXN0ZXAtMS1uZXh0Jyk7XG4gIGlmIChzdGVwMU5leHQpIHtcbiAgICBzdGVwMU5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImNvbmZpZy10eXBlXCJdOmNoZWNrZWQnKTtcbiAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBjdXJyZW50Q29uZmlnVHlwZSA9IHNlbGVjdGVkLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnaG9tZWxhYicpIHtcbiAgICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtaG9tZWxhYicpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtc2ltcGxlJyk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAncHVibGljJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1wdWJsaWMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLWhvbWVsYWInKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gU2tpcCBzZXR1cCBidXR0b25cbiAgY29uc3Qgc2tpcEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1za2lwJyk7XG4gIGlmIChza2lwQnRuKSB7XG4gICAgc2tpcEJ0bi5vbmNsaWNrID0gYXN5bmMgZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGNvbmZpcm0oJ1NraXAgc2V0dXA/IFlvdSBjYW4gcnVuIGl0IGxhdGVyIGZyb20gU2V0dGluZ3MuJykpIHtcbiAgICAgICAgLy8gU2F2ZSBza2lwIHN0YXR1cyB0byBzZXJ2ZXJcbiAgICAgICAgYXdhaXQgc2F2ZUNvbmZpZ1RvU2VydmVyKHsgc2V0dXBDb21wbGV0ZTogdHJ1ZSwgc2tpcHBlZDogdHJ1ZSwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSk7XG4gICAgICAgIHNhZmVTZXQoJ2Rhc2hjYWRkeS1zZXR1cCcsICdza2lwcGVkJyk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC13aXphcmQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBIb21lIExhYjogVExEIFByZXZpZXdcbiAgY29uc3QgdGxkSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGxkJyk7XG4gIGlmICh0bGRJbnB1dCkge1xuICAgIHRsZElucHV0Lm9uaW5wdXQgPSBmdW5jdGlvbihlKSB7XG4gICAgICBjb25zdCB0bGQgPSBlLnRhcmdldC52YWx1ZSB8fCAnLmhvbWUnO1xuICAgICAgY29uc3QgcHJldmlldzEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGxkLXByZXZpZXcnKTtcbiAgICAgIGNvbnN0IHByZXZpZXcyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RsZC1wcmV2aWV3LTInKTtcbiAgICAgIGlmIChwcmV2aWV3MSkgcHJldmlldzEudGV4dENvbnRlbnQgPSB0bGQ7XG4gICAgICBpZiAocHJldmlldzIpIHByZXZpZXcyLnRleHRDb250ZW50ID0gdGxkO1xuICAgIH07XG4gIH1cblxuICAvLyBIb21lIExhYiBuYXZpZ2F0aW9uXG4gIGNvbnN0IGhvbWVsYWJCYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWhvbWVsYWItYmFjaycpO1xuICBpZiAoaG9tZWxhYkJhY2spIHtcbiAgICBob21lbGFiQmFjay5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtMScpO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBob21lbGFiTmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1ob21lbGFiLW5leHQnKTtcbiAgaWYgKGhvbWVsYWJOZXh0KSB7XG4gICAgaG9tZWxhYk5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHRsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC10bGQnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGNhTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1jYS1uYW1lJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBkbnNJUCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcblxuICAgICAgaWYgKCF0bGQgfHwgIXRsZC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgdmFsaWQgVExEIHN0YXJ0aW5nIHdpdGggYSBkb3QgKGUuZy4sIC5ob21lKScsICd3YXJuaW5nJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghY2FOYW1lKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIENlcnRpZmljYXRlIEF1dGhvcml0eSBuYW1lJywgJ3dhcm5pbmcnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFkbnNJUCkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgeW91ciBETlMgc2VydmVyIElQIGFkZHJlc3MnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93U3VtbWFyeSgpO1xuICAgIH07XG4gIH1cblxuICAvLyBTaW1wbGUgbmF2aWdhdGlvblxuICBjb25zdCBzaW1wbGVCYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXNpbXBsZS1iYWNrJyk7XG4gIGlmIChzaW1wbGVCYWNrKSB7XG4gICAgc2ltcGxlQmFjay5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtMScpO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBzaW1wbGVOZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXNpbXBsZS1uZXh0Jyk7XG4gIGlmIChzaW1wbGVOZXh0KSB7XG4gICAgc2ltcGxlTmV4dC5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N1bW1hcnkoKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gUHVibGljIHJvdXRpbmcgbW9kZSB0b2dnbGUgXHUyMDE0IHVwZGF0ZSByZXF1aXJlbWVudCB0ZXh0XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9XCJyb3V0aW5nLW1vZGVcIl0nKS5mb3JFYWNoKGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgcmFkaW8ub25jaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBub3RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1yZXF1aXJlbWVudC1ub3RlJyk7XG4gICAgICBpZiAobm90ZSkge1xuICAgICAgICBub3RlLnRleHRDb250ZW50ID0gdGhpcy52YWx1ZSA9PT0gJ3N1YmRpcmVjdG9yeSdcbiAgICAgICAgICA/ICdPbmx5IG9uZSBETlMgcmVjb3JkIG5lZWRlZCAoZm9yIHRoZSBtYWluIGRvbWFpbiknXG4gICAgICAgICAgOiAnWW91XFwnbGwgbmVlZCB0byBjb25maWd1cmUgRE5TIG1hbnVhbGx5IGZvciBlYWNoIHN1YmRvbWFpbic7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gUHVibGljIG5hdmlnYXRpb25cbiAgY29uc3QgcHVibGljQmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtYmFjaycpO1xuICBpZiAocHVibGljQmFjaykge1xuICAgIHB1YmxpY0JhY2sub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLTEnKTtcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcHVibGljTmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtbmV4dCcpO1xuICBpZiAocHVibGljTmV4dCkge1xuICAgIHB1YmxpY05leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBlbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZW1haWwnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcblxuICAgICAgaWYgKCFkb21haW4pIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIHlvdXIgZG9tYWluIG5hbWUnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWVtYWlsIHx8ICFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93U3VtbWFyeSgpO1xuICAgIH07XG4gIH1cblxuICAvLyBTdW1tYXJ5IG5hdmlnYXRpb25cbiAgY29uc3Qgc3VtbWFyeUJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc3VtbWFyeS1iYWNrJyk7XG4gIGlmIChzdW1tYXJ5QmFjaykge1xuICAgIHN1bW1hcnlCYWNrLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdob21lbGFiJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1ob21lbGFiJyk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnc2ltcGxlJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zaW1wbGUnKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLXB1YmxpYycpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBTdW1tYXJ5IFwiQ29udGludWUgXHUyMTkyXCIgXHUyMDE0IGFkdmFuY2UgdG8gdGhlIGRpc2stc2FmZXR5IHdhcm5pbmcgc3RlcFxuICBjb25zdCBzdW1tYXJ5TmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zdW1tYXJ5LW5leHQnKTtcbiAgaWYgKHN1bW1hcnlOZXh0KSB7XG4gICAgc3VtbWFyeU5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLWRpc2stc2FmZXR5Jyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIERpc2stc2FmZXR5IHN0ZXAgbmF2aWdhdGlvblxuICBjb25zdCBkaXNrU2FmZXR5QmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kaXNrLXNhZmV0eS1iYWNrJyk7XG4gIGlmIChkaXNrU2FmZXR5QmFjaykge1xuICAgIGRpc2tTYWZldHlCYWNrLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zdW1tYXJ5Jyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIEZpbmlzaCBzZXR1cCBidXR0b24gKG5vdyBvbiB0aGUgZGlzay1zYWZldHkgc3RlcClcbiAgY29uc3QgZmluaXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRpc2stc2FmZXR5LWZpbmlzaCcpO1xuICBpZiAoZmluaXNoQnRuKSB7XG4gICAgZmluaXNoQnRuLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBmaW5pc2hTZXR1cCgpO1xuICAgIH07XG4gIH1cblxuICAvLyBFeHBvc2UgZnVuY3Rpb24gdG8gZ2V0IGdsb2JhbCBjb25maWcgKGZyb20gc2VydmVyIG9yIGxvY2FsU3RvcmFnZSlcbiAgd2luZG93LmdldEdsb2JhbENvbmZpZyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIC8vIFRyeSBzZXJ2ZXIgZmlyc3RcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnNldHVwQ29tcGxldGUpIHtcbiAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmV0Y2ggY29uZmlnIGZyb20gc2VydmVyJyk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gbG9jYWxTdG9yYWdlXG4gICAgY29uc3QgY29uZmlnU3RyID0gc2FmZUdldCgnZGFzaGNhZGR5LWNvbmZpZycpO1xuICAgIGlmIChjb25maWdTdHIpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGNvbmZpZ1N0cik7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGRlZmF1bHQgY29uZmlnIGlmIG5vdCBzZXRcbiAgICByZXR1cm4ge1xuICAgICAgc2V0dXBDb21wbGV0ZTogZmFsc2UsXG4gICAgICBjb25maWd1cmF0aW9uVHlwZTogJ2hvbWVsYWInLFxuICAgICAgdGxkOiAnLmhvbWUnLFxuICAgICAgY2FOYW1lOiAnJyxcbiAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGRuc1R5cGU6ICdwcml2YXRlJyxcbiAgICAgICAgc3NsVHlwZTogJ2ludGVybmFsJyxcbiAgICAgICAgdGFyZ2V0SVA6ICdsb2NhbGhvc3QnXG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBFeHBvc2UgcmVzZXQgZnVuY3Rpb24gZm9yIHNldHRpbmdzXG4gIHdpbmRvdy5yZXNldFNldHVwV2l6YXJkID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgaWYgKGNvbmZpcm0oJ1Jlc2V0IERhc2hDYWRkeSBjb25maWd1cmF0aW9uPyBUaGlzIHdpbGwgc2hvdyB0aGUgc2V0dXAgd2l6YXJkIGFnYWluLicpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jb25maWcnLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGRlbGV0ZSBzZXJ2ZXIgY29uZmlnJyk7XG4gICAgICB9XG4gICAgICBzYWZlUmVtb3ZlKCdkYXNoY2FkZHktc2V0dXAnKTtcbiAgICAgIHNhZmVSZW1vdmUoJ2Rhc2hjYWRkeS1jb25maWcnKTtcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cbiAgfTtcbn0pKCk7XG47XG4vLyBBcHAgU2VsZWN0b3IgU3lzdGVtXG4oZnVuY3Rpb24gKCkge1xuICBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG4gIGluamVjdE1vZGFsKCdhcHAtc2VsZWN0b3ItbW9kYWwnLCBgPGRpdiBpZD1cImFwcC1zZWxlY3Rvci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJhcHAtc2VsZWN0b3ItY29udGVudFwiPlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luOiAwIDAgMjRweDsgY29sb3I6IHZhcigtLWZnKTsgdGV4dC1hbGlnbjogY2VudGVyO1wiPkNob29zZSBhbiBBcHA8L2gyPlxuICAgICAgPGRpdiBpZD1cImFwcC1zZWxlY3Rvci1ncmlkXCIgY2xhc3M9XCJhcHAtc2VsZWN0b3ItZ3JpZFwiPjwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogMjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImFwcC1zZWxlY3Rvci1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBpbmplY3RNb2RhbCgnYXBwLWRlcGxveS1tb2RhbCcsIGA8ZGl2IGlkPVwiYXBwLWRlcGxveS1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjAwcHg7IG1heC13aWR0aDogNzAwcHg7XCI+XG4gICAgICA8aDMgaWQ9XCJhcHAtZGVwbG95LXRpdGxlXCI+RGVwbG95IEFwcGxpY2F0aW9uPC9oMz5cblxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDwhLS0gU3ViZG9tYWluL0RvbWFpbiAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZGVwbG95LXN1YmRvbWFpblwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cbiAgICAgICAgICAgIFx1RDgzQ1x1REYxMCBTdWJkb21haW4gb3IgRG9tYWluXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRlcGxveS1zdWJkb21haW5cIiBwbGFjZWhvbGRlcj1cInVwdGltZVwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWhpbnQtc21cIj5cbiAgICAgICAgICAgIFlvdXIgYXBwIHdpbGwgYmUgYXZhaWxhYmxlIGF0OiA8c3BhbiBpZD1cImRlcGxveS11cmwtcHJldmlld1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+dXB0aW1lLmhvbWU8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInN1YnBhdGgtY29tcGF0LXdhcm5pbmdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDhweCAxMnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZmY5ODAwIDEwJSwgdmFyKC0tY2FyZC1iZykpOyBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgI2ZmOTgwMCAzMCUsIHRyYW5zcGFyZW50KTsgbWFyZ2luLXRvcDogOHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRE5TIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnRcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1RERDMlx1RkUwRiBETlMgQ29uZmlndXJhdGlvblxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sLWdhcFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicmFkaW8tb3B0aW9uXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZG5zLXR5cGVcIiB2YWx1ZT1cInByaXZhdGVcIiBjaGVja2VkIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPlByaXZhdGUgRE5TIChUZWNobml0aXVtKTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5Vc2UgeW91ciBsb2NhbCBETlMgc2VydmVyIHdpdGggY3VzdG9tIFRMRCAoLnNhbWksIC5ob21lLCBldGMuKTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJkbnMtdHlwZVwiIHZhbHVlPVwicHVibGljXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+UHVibGljIEROUzwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5Vc2UgYSByZWFsIGRvbWFpbiAoZXhhbXBsZS5jb20pIC0gcmVxdWlyZXMgRE5TIHByb3ZpZGVyIHNldHVwPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImRucy10eXBlXCIgdmFsdWU9XCJub25lXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+Tm8gRE5TIChJUDpQb3J0IG9ubHkpPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPkFjY2VzcyB2aWEgSVAgYWRkcmVzcyBhbmQgcG9ydCAtIG5vIGRvbWFpbiBzZXR1cDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gU1NMIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnRcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1REQxMiBTU0wvVExTIENlcnRpZmljYXRlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtZ2FwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzc2wtdHlwZVwiIHZhbHVlPVwiaW50ZXJuYWxcIiBjaGVja2VkIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPkludGVybmFsIENBPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlVzZSBDYWRkeSdzIGludGVybmFsIGNlcnRpZmljYXRlIGF1dGhvcml0eSAoc2VsZi1zaWduZWQpPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInNzbC10eXBlXCIgdmFsdWU9XCJsZXRzZW5jcnlwdFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPkxldCdzIEVuY3J5cHQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1oaW50XCI+RnJlZSBwdWJsaWMgU1NMIGNlcnRpZmljYXRlIChyZXF1aXJlcyBwdWJsaWMgZG9tYWluKTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzc2wtdHlwZVwiIHZhbHVlPVwibm9uZVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPk5vIFNTTCAoSFRUUCBvbmx5KTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5cdTI2QTBcdUZFMEYgTm90IHJlY29tbWVuZGVkIC0gdHJhZmZpYyB3aWxsIGJlIHVuZW5jcnlwdGVkPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBNZWRpYSBMaWJyYXJ5IFBhdGggKHNob3duIGZvciBtZWRpYSBhcHBzKSAtLT5cbiAgICAgICAgPGRpdiBpZD1cIm1lZGlhLXBhdGgtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudFwiPlxuICAgICAgICAgICAgXHVEODNEXHVEQ0MxIE1lZGlhIExpYnJhcnkgTG9jYXRpb25cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgICA8IS0tIERldGVjdGVkIG1vdW50cyBmcm9tIGV4aXN0aW5nIG1lZGlhIHNlcnZlcnMgLS0+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZGV0ZWN0ZWQtbW91bnRzLWNvbnRhaW5lclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+XG4gICAgICAgICAgICAgICAgXHUyNzEzIERldGVjdGVkIGZyb20gZXhpc3RpbmcgbWVkaWEgc2VydmVyczpcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJkZXRlY3RlZC1tb3VudHMtbGlzdFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZsZXgtd3JhcDogd3JhcDtcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBhdGggaW5wdXQgd2l0aCBicm93c2UgYnV0dG9uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRlcGxveS1tZWRpYS1wYXRoXCIgcGxhY2Vob2xkZXI9XCIvbWVkaWEvTW92aWVzLCAvbWVkaWEvVFZTaG93c1wiXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWZsZXhcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC45NXJlbTtcIiAvPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImJyb3dzZS1tZWRpYS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgICAgIFx1RDgzRFx1RENDMiBCcm93c2VcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBpZD1cIm1lZGlhLXBhdGgtZGVzY3JpcHRpb25cIiBjbGFzcz1cInRleHQtaGludFwiPlxuICAgICAgICAgICAgICBTZWxlY3QgZm9sZGVycyBmcm9tIGV4aXN0aW5nIHNlcnZlcnMsIGJyb3dzZSwgb3IgdHlwZSBwYXRocyBtYW51YWxseS4gU2VwYXJhdGUgbXVsdGlwbGUgd2l0aCBjb21tYXMuXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBTZWxlY3RlZCBwYXRocyBkaXNwbGF5IC0tPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNlbGVjdGVkLW1lZGlhLXBhdGhzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNnB4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFBsZXggQ2xhaW0gVG9rZW4gKHNob3duIG9ubHkgZm9yIFBsZXggZGVwbG95bWVudHMpIC0tPlxuICAgICAgICA8ZGl2IGlkPVwicGxleC1jbGFpbS1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50XCI+XG4gICAgICAgICAgICBcdUQ4M0RcdUREMTEgUGxleCBDbGFpbSBUb2tlblxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkZXBsb3ktcGxleC1jbGFpbVwiIHBsYWNlaG9sZGVyPVwiY2xhaW0teHh4eHh4eHh4eHh4eHh4eHh4eHhcIlxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmxleFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjk1cmVtO1wiIC8+XG4gICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9wbGV4LnR2L2NsYWltXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogI2U1YTAwZDsgY29sb3I6ICMwMDA7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgR2V0IFRva2VuXG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogI2U1YTAwZDsgbWFyZ2luLXRvcDogNHB4O1wiPlxuICAgICAgICAgICAgVG9rZW4gZXhwaXJlcyBpbiA0IG1pbnV0ZXMhIEdldCBpdCByaWdodCBiZWZvcmUgY2xpY2tpbmcgRGVwbG95LiBMZWF2ZSBlbXB0eSB0byBjb25maWd1cmUgUGxleCBtYW51YWxseSBsYXRlci5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUYWlsc2NhbGUgU2VjdXJpdHkgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJ0YWlsc2NhbGUtc2VjdGlvblwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50XCI+XG4gICAgICAgICAgICBcdUQ4M0RcdUREMTAgVGFpbHNjYWxlIFNlY3VyaXR5XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtZ2FwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZGVwbG95LXRhaWxzY2FsZS1vbmx5XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7IHdpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+VGFpbHNjYWxlLU9ubHkgQWNjZXNzPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlJlc3RyaWN0IHRoaXMgc2VydmljZSB0byBUYWlsc2NhbGUgdXNlcnMgb25seSAoMTAwLngueC54IElQcyk8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBpZD1cInRhaWxzY2FsZS1zdGF0dXNcIiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DaGVja2luZyBUYWlsc2NhbGUgc3RhdHVzLi4uPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQWR2YW5jZWQgT3B0aW9ucyAoQ29sbGFwc2libGUpIC0tPlxuICAgICAgICA8ZGV0YWlscz5cbiAgICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtd2VpZ2h0OiA1MDA7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2OTlcdUZFMEYgQWR2YW5jZWQgT3B0aW9uczwvc3VtbWFyeT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1wb3J0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPkN1c3RvbSBQb3J0IChvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZGVwbG95LXBvcnRcIiBwbGFjZWhvbGRlcj1cIkxlYXZlIGVtcHR5IGZvciBkZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1pbnB1dC1jYXJkXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1pcFwiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDZweDtcIj5UYXJnZXQgSVAgQWRkcmVzczwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZGVwbG95LWlwXCIgdmFsdWU9XCJsb2NhbGhvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWlucHV0LWNhcmRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+XG4gICAgICAgICAgICAgICAgVXNlICdsb2NhbGhvc3QnIGZvciBzYW1lLWhvc3QgY29udGFpbmVycywgb3Igc3BlY2lmaWMgSVAgZm9yIHJlbW90ZSBzZXJ2aWNlc1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBpZD1cInZvbHVtZS1tb3VudHMtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cdUQ4M0RcdURDQzIgVm9sdW1lIE1vdW50czwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgICAgIEN1c3RvbWl6ZSB3aGVyZSBjb250YWluZXIgZGF0YSBpcyBzdG9yZWQgb24gdGhlIGhvc3QuIE1lZGlhIHZvbHVtZXMgYXJlIGNvbmZpZ3VyZWQgYWJvdmUuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwidm9sdW1lLW1vdW50cy1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDhweDtcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XHUyNjk5XHVGRTBGIFJlc291cmNlIExpbWl0czwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgICAgIE9wdGlvbmFsIENQVSBhbmQgbWVtb3J5IGNvbnN0cmFpbnRzLiBMZWF2ZSBhdCAwIGZvciB1bmxpbWl0ZWQuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJkZXBsb3ktY3B1LWxpbWl0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+Q1BVIENvcmVzPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJkZXBsb3ktY3B1LWxpbWl0XCIgdmFsdWU9XCIwXCIgbWluPVwiMFwiIG1heD1cIjY0XCIgc3RlcD1cIjAuMjVcIiBjbGFzcz1cImZvcm0taW5wdXQtY2FyZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgcGxhY2Vob2xkZXI9XCIwID0gdW5saW1pdGVkXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1tZW1vcnktbGltaXRcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDtcIj5NZW1vcnkgKE1CKTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZGVwbG95LW1lbW9yeS1saW1pdFwiIHZhbHVlPVwiMFwiIG1pbj1cIjBcIiBtYXg9XCIxMzEwNzJcIiBzdGVwPVwiNjRcIiBjbGFzcz1cImZvcm0taW5wdXQtY2FyZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgcGxhY2Vob2xkZXI9XCIwID0gdW5saW1pdGVkXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDI0cHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhcHAtZGVwbG95LWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXBwLWRlcGxveS1jb25maXJtXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+XG4gICAgICAgICAgXHVEODNEXHVERTgwIERlcGxveVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBBUFBTX0tFWSA9ICdjdXN0b20tYXBwcyc7XG5cbiAgLy8gQ2FjaGUgZm9yIEFQSSB0ZW1wbGF0ZXNcbiAgbGV0IGFwaVRlbXBsYXRlcyA9IG51bGw7XG4gIGxldCBhcGlDYXRlZ29yaWVzID0gbnVsbDtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItbW9kYWwnKTtcbiAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItZ3JpZCcpO1xuXG4gIC8vIEZldGNoIGFwcCB0ZW1wbGF0ZXMgZnJvbSBBUElcbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hBcHBUZW1wbGF0ZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYXBwcy90ZW1wbGF0ZXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGFwaVRlbXBsYXRlcyA9IGRhdGEudGVtcGxhdGVzO1xuICAgICAgICBhcGlDYXRlZ29yaWVzID0gZGF0YS5jYXRlZ29yaWVzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gRmV0Y2ggVGVtcGxhdGVzJywgZSwgeyBmdW5jdGlvbjogJ2ZldGNoQXBpVGVtcGxhdGVzJyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgcG9ydCBhdmFpbGFiaWxpdHlcbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tQb3J0QXZhaWxhYmlsaXR5KHBvcnQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcHBzL3BvcnRzLyR7cG9ydH0vY2hlY2tgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gQ2hlY2sgUG9ydCcsIGUsIHsgZnVuY3Rpb246ICdjaGVja1BvcnRBdmFpbGFiaWxpdHknIH0pO1xuICAgICAgcmV0dXJuIHsgYXZhaWxhYmxlOiB0cnVlIH07IC8vIEFzc3VtZSBhdmFpbGFibGUgb24gZXJyb3JcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgc3VnZ2VzdGVkIGF2YWlsYWJsZSBwb3J0XG4gIGFzeW5jIGZ1bmN0aW9uIGdldFN1Z2dlc3RlZFBvcnQoYmFzZVBvcnQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcHBzL3BvcnRzLyR7YmFzZVBvcnR9L3N1Z2dlc3RgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnN1Z2dlc3RlZFBvcnQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbQXBwU2VsZWN0b3JdIEdldCBTdWdnZXN0ZWQgUG9ydCcsIGUsIHsgZnVuY3Rpb246ICdnZXRTdWdnZXN0ZWRQb3J0JyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2VQb3J0O1xuICB9XG5cbiAgLy8gQnVpbGQgYXBwIHNlbGVjdG9yIGdyaWQgZnJvbSBBUEkgdGVtcGxhdGVzXG4gIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQXBwU2VsZWN0b3IoKSB7XG4gICAgZ3JpZC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Mb2FkaW5nIGFwcCB0ZW1wbGF0ZXMuLi48L2Rpdj4nO1xuXG4gICAgLy8gRmV0Y2ggdGVtcGxhdGVzIGlmIG5vdCBjYWNoZWRcbiAgICBpZiAoIWFwaVRlbXBsYXRlcykge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGZldGNoQXBwVGVtcGxhdGVzKCk7XG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgZ3JpZC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLWVycm9yKTtcIj5GYWlsZWQgdG8gbG9hZCBhcHAgdGVtcGxhdGVzLiBQbGVhc2UgdHJ5IGFnYWluLjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBncmlkLmlubmVySFRNTCA9ICcnO1xuXG4gICAgLy8gR3JvdXAgdGVtcGxhdGVzIGJ5IGNhdGVnb3J5XG4gICAgY29uc3QgYnlDYXRlZ29yeSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2FwcElkLCB0ZW1wbGF0ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXBpVGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSB0ZW1wbGF0ZS5jYXRlZ29yeSB8fCAnT3RoZXInO1xuICAgICAgaWYgKCFieUNhdGVnb3J5W2NhdGVnb3J5XSkge1xuICAgICAgICBieUNhdGVnb3J5W2NhdGVnb3J5XSA9IFtdO1xuICAgICAgfVxuICAgICAgYnlDYXRlZ29yeVtjYXRlZ29yeV0ucHVzaCh7IGlkOiBhcHBJZCwgLi4udGVtcGxhdGUgfSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBjYXRlZ29yaWVzIGJ5IHRoZSBvcmRlciBpbiBhcGlDYXRlZ29yaWVzIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNhdGVnb3J5T3JkZXIgPSBhcGlDYXRlZ29yaWVzID8gT2JqZWN0LmtleXMoYXBpQ2F0ZWdvcmllcykgOiBPYmplY3Qua2V5cyhieUNhdGVnb3J5KS5zb3J0KCk7XG5cbiAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIGNhdGVnb3J5T3JkZXIpIHtcbiAgICAgIGNvbnN0IGFwcHMgPSBieUNhdGVnb3J5W2NhdGVnb3J5XTtcbiAgICAgIGlmICghYXBwcyB8fCBhcHBzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgIC8vIFNvcnQgYXBwcyBieSBwb3B1bGFyaXR5IChkZXNjZW5kaW5nKVxuICAgICAgYXBwcy5zb3J0KChhLCBiKSA9PiAoYi5wb3B1bGFyaXR5IHx8IDApIC0gKGEucG9wdWxhcml0eSB8fCAwKSk7XG5cbiAgICAgIC8vIENhdGVnb3J5IGhlYWRlciB3aXRoIGljb24gYW5kIGNvbG9yIGZyb20gQVBJXG4gICAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhlYWRlci5jbGFzc05hbWUgPSAnYXBwLWNhdGVnb3J5LWhlYWRlcic7XG4gICAgICBjb25zdCBjYXRlZ29yeUluZm8gPSBhcGlDYXRlZ29yaWVzPy5bY2F0ZWdvcnldIHx8IHt9O1xuICAgICAgaGVhZGVyLmlubmVySFRNTCA9IGAke2VzY2FwZUh0bWwoY2F0ZWdvcnlJbmZvLmljb24gfHwgJycpfSAke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfWA7XG4gICAgICBpZiAoY2F0ZWdvcnlJbmZvLmNvbG9yKSB7XG4gICAgICAgIGhlYWRlci5zdHlsZS5ib3JkZXJCb3R0b21Db2xvciA9IGNhdGVnb3J5SW5mby5jb2xvcjtcbiAgICAgIH1cbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcblxuICAgICAgLy8gQXBwIG9wdGlvbnNcbiAgICAgIGFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgb3B0aW9uLmNsYXNzTmFtZSA9ICdhcHAtb3B0aW9uJztcblxuICAgICAgICAvLyBXaWRnZXQgZW5hYmxlZCBiYWRnZVxuICAgICAgICBjb25zdCBpc1dpZGdldCA9IGFwcC5pc0Rhc2hib2FyZFdpZGdldDtcbiAgICAgICAgY29uc3Qgd2lkZ2V0RW5hYmxlZCA9IGlzV2lkZ2V0ICYmIHNhZmVHZXQoJ3dpZGdldC0nICsgYXBwLmlkICsgJy1lbmFibGVkJykgIT09ICdmYWxzZSc7XG4gICAgICAgIGNvbnN0IHdpZGdldEJhZGdlID0gaXNXaWRnZXRcbiAgICAgICAgICA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjY1cmVtOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi10b3A6IDRweDsgYmFja2dyb3VuZDogJHt3aWRnZXRFbmFibGVkID8gJyMyZWNjNzEzMCcgOiAnI2U3NGMzYzMwJ307IGNvbG9yOiAke3dpZGdldEVuYWJsZWQgPyAnIzJlY2M3MScgOiAnI2U3NGMzYyd9OyBmb250LXdlaWdodDogNjAwO1wiPiR7d2lkZ2V0RW5hYmxlZCA/ICdPTicgOiAnT0ZGJ308L2Rpdj5gXG4gICAgICAgICAgOiAnJztcblxuICAgICAgICAvLyBTaG93IGRpZmZpY3VsdHkgYmFkZ2UgKG5vbi13aWRnZXRzIG9ubHkpXG4gICAgICAgIGNvbnN0IGRpZmZpY3VsdHlCYWRnZSA9ICFpc1dpZGdldCAmJiBhcHAuZGlmZmljdWx0eSA/XG4gICAgICAgICAgYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXRvcDogNHB4OyBiYWNrZ3JvdW5kOiAke1xuICAgICAgICAgICAgYXBwLmRpZmZpY3VsdHkgPT09ICdFYXN5JyA/ICcjMmVjYzcxJyA6XG4gICAgICAgICAgICBhcHAuZGlmZmljdWx0eSA9PT0gJ0ludGVybWVkaWF0ZScgPyAnI2YzOWMxMicgOiAnI2U3NGMzYydcbiAgICAgICAgICB9MjA7IGNvbG9yOiAke1xuICAgICAgICAgICAgYXBwLmRpZmZpY3VsdHkgPT09ICdFYXN5JyA/ICcjMmVjYzcxJyA6XG4gICAgICAgICAgICBhcHAuZGlmZmljdWx0eSA9PT0gJ0ludGVybWVkaWF0ZScgPyAnI2YzOWMxMicgOiAnI2U3NGMzYydcbiAgICAgICAgICB9O1wiPiR7ZXNjYXBlSHRtbChhcHAuZGlmZmljdWx0eSl9PC9kaXY+YCA6ICcnO1xuXG4gICAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24taWNvblwiPiR7ZXNjYXBlSHRtbChhcHAuaWNvbiB8fCAnXHVEODNEXHVEQ0U2Jyl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24tbmFtZVwiPiR7ZXNjYXBlSHRtbChhcHAubmFtZSl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24tZGVzY1wiPiR7ZXNjYXBlSHRtbChhcHAuZGVzY3JpcHRpb24gfHwgJycpfTwvZGl2PlxuICAgICAgICAgICR7d2lkZ2V0QmFkZ2V9JHtkaWZmaWN1bHR5QmFkZ2V9XG4gICAgICAgIGA7XG5cbiAgICAgICAgaWYgKGlzV2lkZ2V0KSB7XG4gICAgICAgICAgb3B0aW9uLm9uY2xpY2sgPSAoKSA9PiB0b2dnbGVEYXNoYm9hcmRXaWRnZXQoYXBwLCBvcHRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbi5vbmNsaWNrID0gKCkgPT4gc2hvd0RlcGxveUNvbmZpZyhhcHApO1xuICAgICAgICB9XG4gICAgICAgIGdyaWQuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciByZWNpcGUgY2FyZHMgYXQgdGhlIGVuZCBvZiB0aGUgZ3JpZFxuICAgIGlmICh3aW5kb3cucmVuZGVyUmVjaXBlQ2FyZHMpIHtcbiAgICAgIGF3YWl0IHdpbmRvdy5yZW5kZXJSZWNpcGVDYXJkcyhncmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBUb2dnbGUgYSBkYXNoYm9hcmQgd2lkZ2V0IG9uL29mZlxuICBmdW5jdGlvbiB0b2dnbGVEYXNoYm9hcmRXaWRnZXQoYXBwLCBvcHRpb25FbCkge1xuICAgIGNvbnN0IGtleSA9ICd3aWRnZXQtJyArIGFwcC5pZCArICctZW5hYmxlZCc7XG4gICAgY29uc3QgY3VycmVudGx5RW5hYmxlZCA9IHNhZmVHZXQoa2V5KSAhPT0gJ2ZhbHNlJztcbiAgICBjb25zdCBuZXdTdGF0ZSA9ICFjdXJyZW50bHlFbmFibGVkO1xuICAgIHNhZmVTZXQoa2V5LCBTdHJpbmcobmV3U3RhdGUpKTtcblxuICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5IGltbWVkaWF0ZWx5XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBhcHAud2lkZ2V0U2VsZWN0b3I7XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgaWYgKGVsKSBlbC5zdHlsZS5kaXNwbGF5ID0gbmV3U3RhdGUgPyAnJyA6ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGJhZGdlIGluIHRoZSBhcHAgc2VsZWN0b3IgY2FyZFxuICAgIGNvbnN0IGJhZGdlID0gb3B0aW9uRWwucXVlcnlTZWxlY3RvcignZGl2W3N0eWxlKj1cImJvcmRlci1yYWRpdXM6IDRweFwiXScpO1xuICAgIGlmIChiYWRnZSkge1xuICAgICAgYmFkZ2UudGV4dENvbnRlbnQgPSBuZXdTdGF0ZSA/ICdPTicgOiAnT0ZGJztcbiAgICAgIGJhZGdlLnN0eWxlLmJhY2tncm91bmQgPSBuZXdTdGF0ZSA/ICcjMmVjYzcxMzAnIDogJyNlNzRjM2MzMCc7XG4gICAgICBiYWRnZS5zdHlsZS5jb2xvciA9IG5ld1N0YXRlID8gJyMyZWNjNzEnIDogJyNlNzRjM2MnO1xuICAgIH1cblxuICAgIHNob3dOb3RpZmljYXRpb24oYCR7YXBwLm5hbWV9IHdpZGdldCAke25ld1N0YXRlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gLCAnc3VjY2VzcycsIDIwMDApO1xuICB9XG5cbiAgLy8gU2hvdyBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24gbW9kYWxcbiAgYXN5bmMgZnVuY3Rpb24gc2hvd0RlcGxveUNvbmZpZyhhcHBUZW1wbGF0ZSkge1xuICAgIGNvbnN0IGRlcGxveU1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcC1kZXBsb3ktbW9kYWwnKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LXRpdGxlJyk7XG4gICAgY29uc3Qgc3ViZG9tYWluSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXN1YmRvbWFpbicpO1xuICAgIGNvbnN0IHVybFByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXVybC1wcmV2aWV3Jyk7XG4gICAgY29uc3QgaXBJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktaXAnKTtcbiAgICBjb25zdCBwb3J0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBvcnQnKTtcbiAgICBjb25zdCB0YWlsc2NhbGVDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktdGFpbHNjYWxlLW9ubHknKTtcbiAgICBjb25zdCB0YWlsc2NhbGVTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFpbHNjYWxlLXN0YXR1cycpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIGNvbnRhaW5lciB3aXRoIHNhbWUgaW1hZ2VcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hlY2tSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2FwcHMvY2hlY2stZXhpc3RpbmcnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhcHBJZDogYXBwVGVtcGxhdGUuaWQgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCBjaGVja1Jlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKGNoZWNrUmVzdWx0LnN1Y2Nlc3MgJiYgY2hlY2tSZXN1bHQuZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNoZWNrUmVzdWx0LmNvbnRhaW5lcjtcbiAgICAgICAgY29uc3QgdXNlRXhpc3RpbmcgPSBjb25maXJtKFxuICAgICAgICAgIGBGb3VuZCBleGlzdGluZyAke2FwcFRlbXBsYXRlLm5hbWV9IGNvbnRhaW5lcjpcXG5cXG5gICtcbiAgICAgICAgICBgQ29udGFpbmVyOiAke2NvbnRhaW5lci5uYW1lfVxcbmAgK1xuICAgICAgICAgIGBTdGF0dXM6ICR7Y29udGFpbmVyLnN0YXR1c31cXG5gICtcbiAgICAgICAgICBgUG9ydDogJHtjb250YWluZXIucHJpbWFyeVBvcnQgfHwgJ04vQSd9XFxuXFxuYCArXG4gICAgICAgICAgYFdvdWxkIHlvdSBsaWtlIHRvIHVzZSB0aGlzIGV4aXN0aW5nIGNvbnRhaW5lcj9cXG5cXG5gICtcbiAgICAgICAgICBgQ2xpY2sgT0sgdG8gY29uZmlndXJlIEROUy9DYWRkeSBmb3IgdGhlIGV4aXN0aW5nIGNvbnRhaW5lci5cXG5gICtcbiAgICAgICAgICBgQ2xpY2sgQ2FuY2VsIHRvIGRlcGxveSBhIG5ldyBjb250YWluZXIuYFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh1c2VFeGlzdGluZykge1xuICAgICAgICAgIC8vIFN0b3JlIGV4aXN0aW5nIGNvbnRhaW5lciBpbmZvIGZvciBkZXBsb3ltZW50XG4gICAgICAgICAgYXBwVGVtcGxhdGUuX3VzZUV4aXN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBhcHBUZW1wbGF0ZS5fZXhpc3RpbmdDb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZ25vcmUgY29udGFpbmVyIGNoZWNrIGVycm9yc1xuICAgIH1cblxuICAgIC8vIFNldCB0aXRsZSB3aXRoIGFwcCBpbmZvXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBgRGVwbG95ICR7YXBwVGVtcGxhdGUubmFtZX1gO1xuXG4gICAgLy8gUHJlLWZpbGwgc3ViZG9tYWluIGZyb20gdGVtcGxhdGUgb3IgYXBwIElEXG4gICAgY29uc3QgZGVmYXVsdFN1YmRvbWFpbiA9IGFwcFRlbXBsYXRlLnN1YmRvbWFpbiB8fCBhcHBUZW1wbGF0ZS5pZC5yZXBsYWNlKC8tL2csICcnKTtcbiAgICBzdWJkb21haW5JbnB1dC52YWx1ZSA9IGRlZmF1bHRTdWJkb21haW47XG5cbiAgICAvLyBTaG93IHN1YnBhdGggY29tcGF0aWJpbGl0eSB3YXJuaW5nIGluIHN1YmRpcmVjdG9yeSBtb2RlXG4gICAgY29uc3Qgc3VicGF0aFdhcm5pbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VicGF0aC1jb21wYXQtd2FybmluZycpO1xuICAgIGlmIChzdWJwYXRoV2FybmluZykge1xuICAgICAgaWYgKFNJVEUucm91dGluZ01vZGUgPT09ICdzdWJkaXJlY3RvcnknKSB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnQgPSBhcHBUZW1wbGF0ZS5zdWJwYXRoU3VwcG9ydCB8fCAnc3RyaXAnO1xuICAgICAgICBpZiAoc3VwcG9ydCA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjk4MDA7XCI+JiM5ODg4OyA8c3Ryb25nPicgKyBhcHBUZW1wbGF0ZS5uYW1lICsgJzwvc3Ryb25nPiBkb2VzIG5vdCBzdXBwb3J0IHN1YmRpcmVjdG9yeSBtb2RlLiBJdCBtYXkgbm90IHdvcmsgY29ycmVjdGx5IGF0IGEgc3VicGF0aC48L3NwYW4+JztcbiAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0ID09PSAnc3RyaXAnKSB7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4mIzk0MzI7ICcgKyBhcHBUZW1wbGF0ZS5uYW1lICsgJyBoYXMgdW52ZXJpZmllZCBzdWJkaXJlY3Rvcnkgc3VwcG9ydC4gSXQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uLjwvc3Bhbj4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1YnBhdGhXYXJuaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnBhdGhXYXJuaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJlLXNlbGVjdCBETlMvU1NMIGZyb20gc2l0ZSBjb25maWcgKHNldCBkdXJpbmcgc2V0dXAgd2l6YXJkKVxuICAgIGNvbnN0IGNmZ0Ruc1R5cGUgPSBTSVRFLmRlZmF1bHRzLmRuc1R5cGUgfHwgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnID8gJ3B1YmxpYycgOiAncHJpdmF0ZScpO1xuICAgIGNvbnN0IGNmZ1NzbFR5cGUgPSBTSVRFLmRlZmF1bHRzLnNzbFR5cGUgfHwgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnID8gJ2xldHNlbmNyeXB0JyA6ICdpbnRlcm5hbCcpO1xuICAgIGNvbnN0IGRuc1JhZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT1cImRucy10eXBlXCJdW3ZhbHVlPVwiJHtjZmdEbnNUeXBlfVwiXWApO1xuICAgIGNvbnN0IHNzbFJhZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT1cInNzbC10eXBlXCJdW3ZhbHVlPVwiJHtjZmdTc2xUeXBlfVwiXWApO1xuICAgIGlmIChkbnNSYWRpbykgZG5zUmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgZWxzZSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl1bdmFsdWU9XCJwcml2YXRlXCJdJykuY2hlY2tlZCA9IHRydWU7XG4gICAgaWYgKHNzbFJhZGlvKSBzc2xSYWRpby5jaGVja2VkID0gdHJ1ZTtcbiAgICBlbHNlIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzc2wtdHlwZVwiXVt2YWx1ZT1cImludGVybmFsXCJdJykuY2hlY2tlZCA9IHRydWU7XG4gICAgaXBJbnB1dC52YWx1ZSA9IFNJVEUuZGVmYXVsdHMudGFyZ2V0SVAgfHwgJ2xvY2FsaG9zdCc7XG4gICAgdGFpbHNjYWxlQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuXG4gICAgLy8gTW92ZSBETlMvU1NMIGludG8gQWR2YW5jZWQgc2VjdGlvbiB3aGVuIGFscmVhZHkgY29uZmlndXJlZFxuICAgIGNvbnN0IGRuc1NlY3Rpb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXBwLWRlcGxveS1tb2RhbCAuZmxleC1jb2wtZ2FwJyk/LmNsb3Nlc3QoJ2RpdicpO1xuICAgIGNvbnN0IGFkdmFuY2VkRGV0YWlscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhcHAtZGVwbG95LW1vZGFsIGRldGFpbHMnKTtcbiAgICBjb25zdCBhZHZhbmNlZENvbnRlbnQgPSBhZHZhbmNlZERldGFpbHM/LnF1ZXJ5U2VsZWN0b3IoJ2RpdicpO1xuICAgIGlmIChhZHZhbmNlZERldGFpbHMgJiYgYWR2YW5jZWRDb250ZW50ICYmIChTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID09PSAncHVibGljJyB8fCBTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID09PSAnaG9tZWxhYicpKSB7XG4gICAgICAvLyBNb3ZlIEROUyBhbmQgU1NMIHNlY3Rpb25zIGluc2lkZSBBZHZhbmNlZFxuICAgICAgY29uc3QgZG5zU2VjdGlvbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2FwcC1kZXBsb3ktbW9kYWwgaW5wdXRbbmFtZT1cImRucy10eXBlXCJdJylbMF0/LmNsb3Nlc3QoJ2Rpdi5mbGV4LWNvbC1nYXAnKT8ucGFyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHNzbFNlY3Rpb25FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNhcHAtZGVwbG95LW1vZGFsIGlucHV0W25hbWU9XCJzc2wtdHlwZVwiXScpWzBdPy5jbG9zZXN0KCdkaXYuZmxleC1jb2wtZ2FwJyk/LnBhcmVudEVsZW1lbnQ7XG4gICAgICBpZiAoZG5zU2VjdGlvbkVsICYmICFkbnNTZWN0aW9uRWwuZGF0YXNldC5tb3ZlZCkge1xuICAgICAgICBhZHZhbmNlZENvbnRlbnQuYXBwZW5kQ2hpbGQoZG5zU2VjdGlvbkVsKTtcbiAgICAgICAgZG5zU2VjdGlvbkVsLmRhdGFzZXQubW92ZWQgPSAnMSc7XG4gICAgICB9XG4gICAgICBpZiAoc3NsU2VjdGlvbkVsICYmICFzc2xTZWN0aW9uRWwuZGF0YXNldC5tb3ZlZCkge1xuICAgICAgICBhZHZhbmNlZENvbnRlbnQuYXBwZW5kQ2hpbGQoc3NsU2VjdGlvbkVsKTtcbiAgICAgICAgc3NsU2VjdGlvbkVsLmRhdGFzZXQubW92ZWQgPSAnMSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG1lZGlhIHBhdGggc2VjdGlvbiBmb3IgbWVkaWEgYXBwc1xuICAgIGNvbnN0IG1lZGlhUGF0aFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVkaWEtcGF0aC1zZWN0aW9uJyk7XG4gICAgY29uc3QgbWVkaWFQYXRoSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LW1lZGlhLXBhdGgnKTtcbiAgICBjb25zdCBtZWRpYVBhdGhEZXNjcmlwdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZWRpYS1wYXRoLWRlc2NyaXB0aW9uJyk7XG5cbiAgICBpZiAoYXBwVGVtcGxhdGUubWVkaWFNb3VudCkge1xuICAgICAgbWVkaWFQYXRoU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIG1lZGlhUGF0aElucHV0LnZhbHVlID0gJyc7XG4gICAgICBtZWRpYVBhdGhJbnB1dC5wbGFjZWhvbGRlciA9ICcvbWVkaWEvTW92aWVzLCAvbWVkaWEvVFZTaG93cyBvciBjbGljayBCcm93c2UnO1xuXG4gICAgICAvLyBGZXRjaCBkZXRlY3RlZCBtb3VudHMgZnJvbSBleGlzdGluZyBtZWRpYSBzZXJ2ZXJzXG4gICAgICBjb25zdCBkZXRlY3RlZE1vdW50c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXRlY3RlZC1tb3VudHMtY29udGFpbmVyJyk7XG4gICAgICBjb25zdCBkZXRlY3RlZE1vdW50c0xpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGV0ZWN0ZWQtbW91bnRzLWxpc3QnKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbW91bnRzUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9tZWRpYS9kZXRlY3RlZC1tb3VudHMnKTtcbiAgICAgICAgY29uc3QgbW91bnRzUmVzdWx0ID0gYXdhaXQgbW91bnRzUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgIGlmIChtb3VudHNSZXN1bHQuc3VjY2VzcyAmJiBtb3VudHNSZXN1bHQubW91bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkZXRlY3RlZE1vdW50c0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICBkZXRlY3RlZE1vdW50c0xpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAvLyBBdXRvLWZpbGwgbWVkaWEgcGF0aCB3aXRoIGFsbCBkZXRlY3RlZCBtb3VudHNcbiAgICAgICAgICBjb25zdCBhdXRvUGF0aHMgPSBbLi4ubmV3IFNldChtb3VudHNSZXN1bHQubW91bnRzLm1hcChtID0+IG0uaG9zdFBhdGgpKV07XG4gICAgICAgICAgbWVkaWFQYXRoSW5wdXQudmFsdWUgPSBhdXRvUGF0aHMuam9pbignLCAnKTtcblxuICAgICAgICAgIG1vdW50c1Jlc3VsdC5tb3VudHMuZm9yRWFjaChtb3VudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICAgIGJ0bi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYXV0b1BhdGhzLmluY2x1ZGVzKG1vdW50Lmhvc3RQYXRoKTtcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0gYHBhZGRpbmc6IDhweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSAke2lzU2VsZWN0ZWQgPyAnNDAlJyA6ICcxNSUnfSwgdmFyKC0tY2FyZC1iZykpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zdWNjZXNzKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiB2YXIoLS1mZyk7YDtcbiAgICAgICAgICAgIGJ0bi5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChtb3VudC5mb2xkZXJOYW1lKX08L3NwYW4+PGJyPjxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+ZnJvbSAke2VzY2FwZUh0bWwobW91bnQuc291cmNlSW1hZ2UpfTwvc3Bhbj5gO1xuICAgICAgICAgICAgYnRuLnRpdGxlID0gYCR7bW91bnQuaG9zdFBhdGh9IChmcm9tICR7bW91bnQuc291cmNlQ29udGFpbmVyfSlgO1xuICAgICAgICAgICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRocyA9IG1lZGlhUGF0aElucHV0LnZhbHVlLnNwbGl0KCcsJykubWFwKHAgPT4gcC50cmltKCkpLmZpbHRlcihwID0+IHApO1xuICAgICAgICAgICAgICBjb25zdCBpZHggPSBjdXJyZW50UGF0aHMuaW5kZXhPZihtb3VudC5ob3N0UGF0aCk7XG4gICAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRocy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMTUlLCB2YXIoLS1jYXJkLWJnKSknO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRocy5wdXNoKG1vdW50Lmhvc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgNDAlLCB2YXIoLS1jYXJkLWJnKSknO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1lZGlhUGF0aElucHV0LnZhbHVlID0gY3VycmVudFBhdGhzLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGV0ZWN0ZWRNb3VudHNMaXN0LmFwcGVuZENoaWxkKGJ0bik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGV0ZWN0ZWRNb3VudHNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkZXRlY3RlZE1vdW50c0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgYnJvd3NlIGJ1dHRvblxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Jyb3dzZS1tZWRpYS1idG4nKS5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICBvcGVuRm9sZGVyQnJvd3NlcihtZWRpYVBhdGhJbnB1dCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBtZWRpYVBhdGhTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBtZWRpYVBhdGhJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldGVjdGVkLW1vdW50cy1jb250YWluZXInKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIFNob3cgUGxleCBjbGFpbSB0b2tlbiBzZWN0aW9uIGZvciBQbGV4IGRlcGxveW1lbnRzXG4gICAgY29uc3QgcGxleENsYWltU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGV4LWNsYWltLXNlY3Rpb24nKTtcbiAgICBpZiAocGxleENsYWltU2VjdGlvbikge1xuICAgICAgaWYgKGFwcFRlbXBsYXRlLmlkID09PSAncGxleCcgfHwgYXBwVGVtcGxhdGUuY2xhaW1Ub2tlbikge1xuICAgICAgICBwbGV4Q2xhaW1TZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBsZXgtY2xhaW0nKS52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGxleENsYWltU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBvcHVsYXRlIHZvbHVtZSBtb3VudHMgaW4gQWR2YW5jZWQgT3B0aW9uc1xuICAgIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndm9sdW1lLW1vdW50cy1zZWN0aW9uJyk7XG4gICAgY29uc3Qgdm9sdW1lTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2b2x1bWUtbW91bnRzLWxpc3QnKTtcbiAgICB2b2x1bWVMaXN0LmlubmVySFRNTCA9ICcnO1xuXG4gICAgaWYgKGFwcFRlbXBsYXRlLmRvY2tlcj8udm9sdW1lcz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBtZWRpYUNvbnRhaW5lclBhdGggPSBhcHBUZW1wbGF0ZS5tZWRpYU1vdW50Py5jb250YWluZXJQYXRoO1xuICAgICAgY29uc3Qgbm9uTWVkaWFWb2x1bWVzID0gYXBwVGVtcGxhdGUuZG9ja2VyLnZvbHVtZXMuZmlsdGVyKHYgPT4gIXYuaW5jbHVkZXMoJ3t7TUVESUFfUEFUSH19JykgJiYgIShtZWRpYUNvbnRhaW5lclBhdGggJiYgdi5lbmRzV2l0aCgnOicgKyBtZWRpYUNvbnRhaW5lclBhdGgpKSk7XG5cbiAgICAgIGlmIChub25NZWRpYVZvbHVtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBub25NZWRpYVZvbHVtZXMuZm9yRWFjaCgodm9sLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgW2hvc3REZWZhdWx0LCBjb250YWluZXJQYXRoXSA9IHZvbC5zcGxpdCgnOicpO1xuICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHJvdy5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGZsZXg7IGdhcDogNnB4OyBhbGlnbi1pdGVtczogY2VudGVyOyc7XG4gICAgICAgICAgcm93LmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwidm9sLWhvc3QtcGF0aFwiIGRhdGEtY29udGFpbmVyLXBhdGg9XCIke2NvbnRhaW5lclBhdGh9XCIgdmFsdWU9XCIke2hvc3REZWZhdWx0fVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIiAvPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuODVyZW07IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XHUyMTkyICR7Y29udGFpbmVyUGF0aH08L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvbC1icm93c2UtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0RcdURDQzI8L2J1dHRvbj5cbiAgICAgICAgICBgO1xuICAgICAgICAgIHZvbHVtZUxpc3QuYXBwZW5kQ2hpbGQocm93KTtcbiAgICAgICAgICByb3cucXVlcnlTZWxlY3RvcignLnZvbC1icm93c2UtYnRuJykub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy52b2wtaG9zdC1wYXRoJyk7XG4gICAgICAgICAgICBvcGVuRm9sZGVyQnJvd3NlcihpbnB1dCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBwb3J0IGZyb20gdGVtcGxhdGUgYW5kIGNoZWNrIGF2YWlsYWJpbGl0eVxuICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gYXBwVGVtcGxhdGUuZGVmYXVsdFBvcnQgfHwgODA4MDtcbiAgICBwb3J0SW5wdXQudmFsdWUgPSAnJztcbiAgICBwb3J0SW5wdXQucGxhY2Vob2xkZXIgPSBgRGVmYXVsdDogJHtkZWZhdWx0UG9ydH1gO1xuXG4gICAgLy8gQWRkIHBvcnQgc3RhdHVzIGVsZW1lbnQgaWYgbm90IGV4aXN0c1xuICAgIGxldCBwb3J0U3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1wb3J0LXN0YXR1cycpO1xuICAgIGlmICghcG9ydFN0YXR1cykge1xuICAgICAgcG9ydFN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcG9ydFN0YXR1cy5pZCA9ICdkZXBsb3ktcG9ydC1zdGF0dXMnO1xuICAgICAgcG9ydFN0YXR1cy5zdHlsZS5jc3NUZXh0ID0gJ2ZvbnQtc2l6ZTogMC44cmVtOyBtYXJnaW4tdG9wOiA0cHg7JztcbiAgICAgIHBvcnRJbnB1dC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHBvcnRTdGF0dXMpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGRlZmF1bHQgcG9ydCBhdmFpbGFiaWxpdHlcbiAgICBhc3luYyBmdW5jdGlvbiBjaGVja0FuZFVwZGF0ZVBvcnRTdGF0dXMoKSB7XG4gICAgICBjb25zdCBwb3J0VG9DaGVjayA9IHBvcnRJbnB1dC52YWx1ZSB8fCBkZWZhdWx0UG9ydDtcbiAgICAgIHBvcnRTdGF0dXMuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DaGVja2luZyBwb3J0Li4uPC9zcGFuPic7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrUG9ydEF2YWlsYWJpbGl0eShwb3J0VG9DaGVjayk7XG4gICAgICBpZiAocmVzdWx0LmF2YWlsYWJsZSkge1xuICAgICAgICBwb3J0U3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNGNhZjUwO1wiPlBvcnQgJHtlc2NhcGVIdG1sKFN0cmluZyhwb3J0VG9DaGVjaykpfSBpcyBhdmFpbGFibGU8L3NwYW4+YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3RlZFBvcnQgPSBhd2FpdCBnZXRTdWdnZXN0ZWRQb3J0KGRlZmF1bHRQb3J0KTtcbiAgICAgICAgcG9ydFN0YXR1cy5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogI2U3NGMzYztcIj5Qb3J0ICR7ZXNjYXBlSHRtbChwb3J0VG9DaGVjayl9IGluIHVzZSBieSAke2VzY2FwZUh0bWwocmVzdWx0LmNvbmZsaWN0Py51c2VkQnkgfHwgJ3Vua25vd24nKX08L3NwYW4+XG4gICAgICAgIGA7XG4gICAgICAgIGNvbnN0IHVzZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICB1c2VCdG4udHlwZSA9ICdidXR0b24nO1xuICAgICAgICB1c2VCdG4udGV4dENvbnRlbnQgPSBgVXNlICR7c3VnZ2VzdGVkUG9ydH1gO1xuICAgICAgICB1c2VCdG4uc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tbGVmdDogOHB4OyBwYWRkaW5nOiAycHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGN1cnNvcjogcG9pbnRlcjsnO1xuICAgICAgICB1c2VCdG4ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBvcnQnKS52YWx1ZSA9IHN1Z2dlc3RlZFBvcnQ7XG4gICAgICAgICAgcG9ydFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzRjYWY1MDtcIj5Vc2luZyBzdWdnZXN0ZWQgcG9ydCAke2VzY2FwZUh0bWwoU3RyaW5nKHN1Z2dlc3RlZFBvcnQpKX08L3NwYW4+YDtcbiAgICAgICAgfTtcbiAgICAgICAgcG9ydFN0YXR1cy5hcHBlbmRDaGlsZCh1c2VCdG4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIHBvcnQgb24gaW5wdXQgY2hhbmdlIChkZWJvdW5jZWQpXG4gICAgbGV0IHBvcnRDaGVja1RpbWVvdXQ7XG4gICAgcG9ydElucHV0Lm9uaW5wdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGNsZWFyVGltZW91dChwb3J0Q2hlY2tUaW1lb3V0KTtcbiAgICAgIHBvcnRDaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrQW5kVXBkYXRlUG9ydFN0YXR1cywgNTAwKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbCBwb3J0IGNoZWNrXG4gICAgY2hlY2tBbmRVcGRhdGVQb3J0U3RhdHVzKCk7XG5cbiAgICAvLyBGZXRjaCBUYWlsc2NhbGUgc3RhdHVzXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdGFpbHNjYWxlL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5pbnN0YWxsZWQgJiYgZGF0YS5jb25uZWN0ZWQpIHtcbiAgICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNGNhZjUwO1wiPkNvbm5lY3RlZDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1sZWZ0OiA4cHg7XCI+JHtkYXRhLnNlbGY/Lmhvc3RuYW1lfSAoJHtkYXRhLnNlbGY/LmlwfSk8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogOHB4O1wiPnwgJHtkYXRhLmRldmljZUNvdW50fSBkZXZpY2VzPC9zcGFuPlxuICAgICAgICBgO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmluc3RhbGxlZCkge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjk4MDA7XCI+Tm90IGNvbm5lY3RlZDwvc3Bhbj5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm90IGF2YWlsYWJsZTwvc3Bhbj5gO1xuICAgICAgICB0YWlsc2NhbGVDaGVja2JveC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q291bGQgbm90IGNoZWNrIHN0YXR1czwvc3Bhbj5gO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBVUkwgcHJldmlldyBpbiByZWFsLXRpbWVcbiAgICBmdW5jdGlvbiB1cGRhdGVVcmxQcmV2aWV3KCkge1xuICAgICAgY29uc3Qgc3ViZG9tYWluID0gc3ViZG9tYWluSW5wdXQudmFsdWUgfHwgJ3N1YmRvbWFpbic7XG4gICAgICBjb25zdCBkbnNUeXBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImRucy10eXBlXCJdOmNoZWNrZWQnKS52YWx1ZTtcbiAgICAgIGNvbnN0IHNzbFR5cGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwic3NsLXR5cGVcIl06Y2hlY2tlZCcpLnZhbHVlO1xuXG4gICAgICBsZXQgdXJsID0gJyc7XG4gICAgICBpZiAoU0lURS5yb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeScgJiYgU0lURS5kb21haW4pIHtcbiAgICAgICAgLy8gU3ViZGlyZWN0b3J5IG1vZGU6IGRvbWFpbi5jb20vYXBwXG4gICAgICAgIHVybCA9IGBodHRwczovLyR7U0lURS5kb21haW59LyR7c3ViZG9tYWlufWA7XG4gICAgICB9IGVsc2UgaWYgKGRuc1R5cGUgPT09ICdwcml2YXRlJykge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNzbFR5cGUgPT09ICdub25lJyA/ICdodHRwJyA6ICdodHRwcyc7XG4gICAgICAgIHVybCA9IGAke3Byb3RvY29sfTovLyR7YnVpbGREb21haW4oc3ViZG9tYWluKX1gO1xuICAgICAgfSBlbHNlIGlmIChkbnNUeXBlID09PSAncHVibGljJykge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNzbFR5cGUgPT09ICdub25lJyA/ICdodHRwJyA6ICdodHRwcyc7XG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IFNJVEUuZG9tYWluIHx8IHN1YmRvbWFpbjtcbiAgICAgICAgdXJsID0gU0lURS5kb21haW4gPyBgJHtwcm90b2NvbH06Ly8ke3N1YmRvbWFpbn0uJHtTSVRFLmRvbWFpbn1gIDogYCR7cHJvdG9jb2x9Oi8vJHtzdWJkb21haW59YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBwb3J0SW5wdXQudmFsdWUgfHwgYXBwVGVtcGxhdGUuZGVmYXVsdFBvcnQgfHwgREMuREVGQVVMVFMuU0VSVklDRV9QT1JUO1xuICAgICAgICB1cmwgPSBgaHR0cDovLyR7aXBJbnB1dC52YWx1ZX06JHtwb3J0fWA7XG4gICAgICB9XG4gICAgICB1cmxQcmV2aWV3LnRleHRDb250ZW50ID0gdXJsO1xuICAgIH1cblxuICAgIC8vIEF0dGFjaCBsaXN0ZW5lcnNcbiAgICBzdWJkb21haW5JbnB1dC5vbmlucHV0ID0gdXBkYXRlVXJsUHJldmlldztcbiAgICBpcElucHV0Lm9uaW5wdXQgPSB1cGRhdGVVcmxQcmV2aWV3O1xuICAgIHBvcnRJbnB1dC5vbmlucHV0ID0gdXBkYXRlVXJsUHJldmlldztcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICAgIHJhZGlvLm9uY2hhbmdlID0gdXBkYXRlVXJsUHJldmlldztcbiAgICB9KTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwic3NsLXR5cGVcIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICAgIHJhZGlvLm9uY2hhbmdlID0gdXBkYXRlVXJsUHJldmlldztcbiAgICB9KTtcblxuICAgIHVwZGF0ZVVybFByZXZpZXcoKTtcblxuICAgIC8vIENsb3NlIGFwcCBzZWxlY3Rvciwgb3BlbiBkZXBsb3kgY29uZmlnXG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIGRlcGxveU1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIFN0b3JlIGFwcCB0ZW1wbGF0ZSBmb3IgZGVwbG95bWVudFxuICAgIGRlcGxveU1vZGFsLmRhdGFzZXQuYXBwVGVtcGxhdGUgPSBKU09OLnN0cmluZ2lmeShhcHBUZW1wbGF0ZSk7XG4gIH1cblxuICAvLyBBZGQgYXBwIHRvIGdyaWQgd2l0aCBmdWxsIERvY2tlciBkZXBsb3ltZW50XG4gIGFzeW5jIGZ1bmN0aW9uIGFkZEFwcFRvR3JpZChkZXBsb3lDb25maWcpIHtcbiAgICBjb25zdCBhcHBUZW1wbGF0ZSA9IGRlcGxveUNvbmZpZy5hcHBUZW1wbGF0ZTtcbiAgICBjb25zdCBjdXN0b21BcHBzID0gc2FmZUdldEpTT04oQVBQU19LRVksIFtdKTtcblxuICAgIC8vIENoZWNrIGlmIHVzaW5nIGV4aXN0aW5nIGNvbnRhaW5lclxuICAgIGNvbnN0IHVzaW5nRXhpc3RpbmcgPSBhcHBUZW1wbGF0ZS5fdXNlRXhpc3RpbmcgJiYgYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyO1xuXG4gICAgLy8gQ2hlY2sgaWYgYXBwIGFscmVhZHkgZXhpc3RzIC0gc2tpcCBpZiB1c2luZyBleGlzdGluZyBjb250YWluZXIgKHVzZXIgYWxyZWFkeSBjb25maXJtZWQpXG4gICAgY29uc3QgZXhpc3RpbmdBcHAgPSBjdXN0b21BcHBzLmZpbmQoYSA9PiBhLmlkID09PSBkZXBsb3lDb25maWcuc3ViZG9tYWluKTtcbiAgICBpZiAoZXhpc3RpbmdBcHAgJiYgIXVzaW5nRXhpc3RpbmcpIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGNvbmZpcm0oYEFuIGFwcCB3aXRoIHN1YmRvbWFpbiBcIiR7ZGVwbG95Q29uZmlnLnN1YmRvbWFpbn1cIiBhbHJlYWR5IGV4aXN0cy4gUmVkZXBsb3k/YCk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgZnJvbSBsb2NhbFN0b3JhZ2UgdG8gYWxsb3cgcmVkZXBsb3ltZW50L3VwZGF0ZVxuICAgIGlmIChleGlzdGluZ0FwcCkge1xuICAgICAgY29uc3QgaW5kZXggPSBjdXN0b21BcHBzLmluZGV4T2YoZXhpc3RpbmdBcHApO1xuICAgICAgY3VzdG9tQXBwcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgc2FmZVNldChBUFBTX0tFWSwgSlNPTi5zdHJpbmdpZnkoY3VzdG9tQXBwcykpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHBvcnQgYXZhaWxhYmlsaXR5IGJlZm9yZSBkZXBsb3ltZW50IChza2lwIGlmIHVzaW5nIGV4aXN0aW5nIGNvbnRhaW5lcilcbiAgICBpZiAoIXVzaW5nRXhpc3RpbmcpIHtcbiAgICAgIGNvbnN0IHBvcnRUb1VzZSA9IGRlcGxveUNvbmZpZy5wb3J0IHx8IGFwcFRlbXBsYXRlLmRlZmF1bHRQb3J0IHx8IDgwODA7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBDaGVja2luZyBwb3J0ICR7cG9ydFRvVXNlfSBhdmFpbGFiaWxpdHkuLi5gLCAnaW5mbycsIDApO1xuXG4gICAgICBjb25zdCBwb3J0Q2hlY2sgPSBhd2FpdCBjaGVja1BvcnRBdmFpbGFiaWxpdHkocG9ydFRvVXNlKTtcbiAgICAgIGlmICghcG9ydENoZWNrLmF2YWlsYWJsZSkge1xuICAgICAgICBjb25zdCBzdWdnZXN0ZWRQb3J0ID0gYXdhaXQgZ2V0U3VnZ2VzdGVkUG9ydChhcHBUZW1wbGF0ZS5kZWZhdWx0UG9ydCB8fCA4MDgwKTtcbiAgICAgICAgY29uc3QgdXNlQWx0ZXJuYXRlID0gY29uZmlybShcbiAgICAgICAgICBgUG9ydCAke3BvcnRUb1VzZX0gaXMgYWxyZWFkeSBpbiB1c2UgYnkgJHtwb3J0Q2hlY2suY29uZmxpY3Q/LnVzZWRCeSB8fCAnYW5vdGhlciBjb250YWluZXInfS5cXG5cXG5gICtcbiAgICAgICAgICBgV291bGQgeW91IGxpa2UgdG8gdXNlIHBvcnQgJHtzdWdnZXN0ZWRQb3J0fSBpbnN0ZWFkP2BcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHVzZUFsdGVybmF0ZSkge1xuICAgICAgICAgIGRlcGxveUNvbmZpZy5wb3J0ID0gc3VnZ2VzdGVkUG9ydDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdEZXBsb3ltZW50IGNhbmNlbGxlZCAtIHBvcnQgY29uZmxpY3QnLCAnZXJyb3InLCA1MDAwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIGV4aXN0aW5nIGNvbnRhaW5lcidzIHBvcnRcbiAgICAgIGRlcGxveUNvbmZpZy5wb3J0ID0gYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyLnByaW1hcnlQb3J0O1xuICAgIH1cbiAgICBzaG93Tm90aWZpY2F0aW9uKFxuICAgICAgdXNpbmdFeGlzdGluZ1xuICAgICAgICA/IGBDb25maWd1cmluZyAke2FwcFRlbXBsYXRlLm5hbWV9IHdpdGggZXhpc3RpbmcgY29udGFpbmVyLi4uYFxuICAgICAgICA6IGBEZXBsb3lpbmcgJHthcHBUZW1wbGF0ZS5uYW1lfS4uLmAsXG4gICAgICAnaW5mbycsIDBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFByZXBhcmUgZGVwbG95bWVudCBjb25maWcgZnJvbSB1c2VyJ3MgY2hvaWNlc1xuICAgICAgY29uc3QgYXBpRGVwbG95Q29uZmlnID0ge1xuICAgICAgICBhcHBJZDogYXBwVGVtcGxhdGUuaWQsXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIHN1YmRvbWFpbjogZGVwbG95Q29uZmlnLnN1YmRvbWFpbixcbiAgICAgICAgICBpcDogZGVwbG95Q29uZmlnLmlwLFxuICAgICAgICAgIGNyZWF0ZURuczogZGVwbG95Q29uZmlnLmRuc1R5cGUgPT09ICdwcml2YXRlJywgIC8vIE9ubHkgY3JlYXRlIEROUyBmb3IgcHJpdmF0ZVxuICAgICAgICAgIHBvcnQ6IGRlcGxveUNvbmZpZy5wb3J0IHx8IGFwcFRlbXBsYXRlLmRlZmF1bHRQb3J0IHx8IG51bGwsICAvLyBVc2UgY3VzdG9tLCB0ZW1wbGF0ZSBkZWZhdWx0LCBvciBudWxsXG4gICAgICAgICAgc3NsVHlwZTogZGVwbG95Q29uZmlnLnNzbFR5cGUsXG4gICAgICAgICAgZG5zVHlwZTogZGVwbG95Q29uZmlnLmRuc1R5cGUsXG4gICAgICAgICAgdGFpbHNjYWxlT25seTogZGVwbG95Q29uZmlnLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2UsICAvLyBUYWlsc2NhbGUtb25seSBhY2Nlc3MgcmVzdHJpY3Rpb25cbiAgICAgICAgICBtZWRpYVBhdGg6IGRlcGxveUNvbmZpZy5tZWRpYVBhdGggfHwgbnVsbCwgIC8vIE1lZGlhIGZvbGRlciBwYXRoIGZvciBtZWRpYSBhcHBzXG4gICAgICAgICAgcGxleENsYWltVG9rZW46IGRlcGxveUNvbmZpZy5wbGV4Q2xhaW1Ub2tlbiB8fCBudWxsLCAgLy8gUGxleCBjbGFpbSB0b2tlbiBmb3IgYXV0by1jbGFpbVxuICAgICAgICAgIGN1c3RvbVZvbHVtZXM6IGRlcGxveUNvbmZpZy5jdXN0b21Wb2x1bWVzIHx8IG51bGwgIC8vIEN1c3RvbSB2b2x1bWUgbW91bnQgb3ZlcnJpZGVzXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEFkZCBleGlzdGluZyBjb250YWluZXIgaW5mbyBpZiB1c2luZyBleGlzdGluZ1xuICAgICAgaWYgKHVzaW5nRXhpc3RpbmcpIHtcbiAgICAgICAgYXBpRGVwbG95Q29uZmlnLmNvbmZpZy51c2VFeGlzdGluZyA9IHRydWU7XG4gICAgICAgIGFwaURlcGxveUNvbmZpZy5jb25maWcuZXhpc3RpbmdDb250YWluZXJJZCA9IGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5pZDtcbiAgICAgICAgYXBpRGVwbG95Q29uZmlnLmNvbmZpZy5leGlzdGluZ1BvcnQgPSBhcHBUZW1wbGF0ZS5fZXhpc3RpbmdDb250YWluZXIucHJpbWFyeVBvcnQ7XG4gICAgICAgIC8vIFVzZSBleGlzdGluZyBjb250YWluZXIncyBwb3J0IGlmIG5vIGN1c3RvbSBwb3J0IHNwZWNpZmllZFxuICAgICAgICBpZiAoIWRlcGxveUNvbmZpZy5wb3J0ICYmIGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5wcmltYXJ5UG9ydCkge1xuICAgICAgICAgIGFwaURlcGxveUNvbmZpZy5jb25maWcucG9ydCA9IGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5wcmltYXJ5UG9ydDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDYWxsIGRlcGxveW1lbnQgQVBJXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2FwcHMvZGVwbG95Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGFwaURlcGxveUNvbmZpZylcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAvLyBBZGQgdG8gc2F2ZWQgYXBwcyAoc3RvcmUgSVAgZm9yIGxhdGVyIGRlbGV0aW9uKVxuICAgICAgICBjb25zdCBuZXdBcHAgPSB7XG4gICAgICAgICAgaWQ6IGRlcGxveUNvbmZpZy5zdWJkb21haW4sICAvLyBVc2Ugc3ViZG9tYWluIGFzIElEXG4gICAgICAgICAgbmFtZTogYXBwVGVtcGxhdGUubmFtZSxcbiAgICAgICAgICBsb2dvOiBgL2Fzc2V0cy8ke2FwcFRlbXBsYXRlLmlkfS5wbmdgLFxuICAgICAgICAgIGNvbnRhaW5lcklkOiByZXN1bHQuY29udGFpbmVySWQsXG4gICAgICAgICAgdXJsOiByZXN1bHQudXJsLFxuICAgICAgICAgIGlwOiBkZXBsb3lDb25maWcuaXAsICAvLyBTdG9yZSBJUCBmb3IgRE5TIHJlY29yZCBkZWxldGlvblxuICAgICAgICAgIGFwcFRlbXBsYXRlOiBhcHBUZW1wbGF0ZS5pZCwgIC8vIFN0b3JlIG9yaWdpbmFsIHRlbXBsYXRlIElEXG4gICAgICAgICAgdGFpbHNjYWxlT25seTogZGVwbG95Q29uZmlnLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2UgIC8vIFRhaWxzY2FsZSBwcm90ZWN0aW9uIHN0YXR1c1xuICAgICAgICB9O1xuICAgICAgICBjdXN0b21BcHBzLnB1c2gobmV3QXBwKTtcbiAgICAgICAgc2FmZVNldChBUFBTX0tFWSwgSlNPTi5zdHJpbmdpZnkoY3VzdG9tQXBwcykpO1xuXG4gICAgICAgIC8vIEFkZCB0byBBUFBTIGFycmF5IGFuZCByZWJ1aWxkIGdyaWRcbiAgICAgICAgLy8gQWNjZXNzIEFQUFMgZnJvbSBwYXJlbnQgc2NvcGUgdmlhIHdpbmRvd1xuICAgICAgICBpZiAod2luZG93LkFQUFMgJiYgIXdpbmRvdy5BUFBTLnNvbWUoYSA9PiBhLmlkID09PSBhcHBUZW1wbGF0ZS5pZCkpIHtcbiAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKG5ld0FwcCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuYnVpbGRHcmlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LnJlZnJlc2hBbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gd2luZG93LnJlZnJlc2hBbGwoKSwgNTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaG93IHN1Y2Nlc3Mgd2l0aCBVUkwgKGFuZCB3YXJuaW5nIGlmIEROUyBmYWlsZWQpXG4gICAgICAgIGxldCBtZXNzYWdlID0gcmVzdWx0LnVzZWRFeGlzdGluZ1xuICAgICAgICAgID8gYCR7YXBwVGVtcGxhdGUubmFtZX0gY29uZmlndXJlZCB3aXRoIGV4aXN0aW5nIGNvbnRhaW5lciFcXG5VUkw6ICR7cmVzdWx0LnVybH1gXG4gICAgICAgICAgOiBgJHthcHBUZW1wbGF0ZS5uYW1lfSBkZXBsb3llZCBzdWNjZXNzZnVsbHkhXFxuVVJMOiAke3Jlc3VsdC51cmx9YDtcbiAgICAgICAgaWYgKHJlc3VsdC53YXJuaW5nKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgXFxuXFxuXHUyNkEwIFdhcm5pbmc6ICR7cmVzdWx0Lndhcm5pbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3dOb3RpZmljYXRpb24obWVzc2FnZSwgJ3N1Y2Nlc3MnLCA4MDAwKTtcblxuICAgICAgICAvLyBDbGVhbiB1cCB0ZW1wb3JhcnkgcHJvcGVydGllc1xuICAgICAgICBkZWxldGUgYXBwVGVtcGxhdGUuX3VzZUV4aXN0aW5nO1xuICAgICAgICBkZWxldGUgYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyO1xuICAgICAgICBcbiAgICAgICAgLy8gRm9yIEhUVFBTIFVSTHMsIGNoZWNrIFNTTCBjZXJ0aWZpY2F0ZSBzdGF0dXNcbiAgICAgICAgaWYgKHJlc3VsdC51cmwgJiYgcmVzdWx0LnVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICAgICAgY2hlY2tTU0xDZXJ0aWZpY2F0ZShyZXN1bHQudXJsLCBhcHBUZW1wbGF0ZS5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNob3cgc2V0dXAgaW5zdHJ1Y3Rpb25zIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAocmVzdWx0LnNldHVwSW5zdHJ1Y3Rpb25zICYmIHJlc3VsdC5zZXR1cEluc3RydWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSByZXN1bHQuc2V0dXBJbnN0cnVjdGlvbnMuam9pbignXFxuJyk7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBTZXR1cCBJbnN0cnVjdGlvbnMgZm9yICR7YXBwVGVtcGxhdGUubmFtZX06ICR7aW5zdHJ1Y3Rpb25zfWAsICdpbmZvJywgMTAwMDApO1xuICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdEZXBsb3ltZW50IGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gRGVwbG95bWVudCcsIGVycm9yLCB7IGZ1bmN0aW9uOiAnZGVwbG95JyB9KTtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oXG4gICAgICAgIGBGYWlsZWQgdG8gZGVwbG95ICR7YXBwVGVtcGxhdGUubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICAnZXJyb3InLFxuICAgICAgICA4MDAwXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIFNTTCBjZXJ0aWZpY2F0ZSBzdGF0dXMgYW5kIG5vdGlmeSB3aGVuIHJlYWR5XG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrU1NMQ2VydGlmaWNhdGUodXJsLCBhcHBOYW1lKSB7XG4gICAgc2hvd05vdGlmaWNhdGlvbihgXHUyM0YzIEdlbmVyYXRpbmcgU1NMIGNlcnRpZmljYXRlIGZvciAke2FwcE5hbWV9Li4uYCwgJ3dhcm5pbmcnLCA2MDAwMCk7XG4gICAgXG4gICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICBjb25zdCBtYXhBdHRlbXB0cyA9IDEyOyAvLyA2MCBzZWNvbmRzIHRvdGFsICg1IHNlY29uZCBpbnRlcnZhbHMpXG4gICAgXG4gICAgY29uc3QgY2hlY2tDZXJ0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgYXR0ZW1wdHMrKztcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVHJ5IHRvIGZldGNoIHRoZSBVUkwgLSBpZiBTU0wgd29ya3MsIHRoaXMgd2lsbCBzdWNjZWVkXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IFxuICAgICAgICAgIG1ldGhvZDogJ0hFQUQnLFxuICAgICAgICAgIG1vZGU6ICduby1jb3JzJyAvLyBBdm9pZCBDT1JTIGlzc3Vlc1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIElmIHdlIGdldCBoZXJlLCBTU0wgaXMgd29ya2luZ1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBcdTI3MDUgJHthcHBOYW1lfSBpcyByZWFkeSEgU1NMIGNlcnRpZmljYXRlIGdlbmVyYXRlZC5gLCAnc3VjY2VzcycsIDUwMDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFNTTCBub3QgcmVhZHkgeWV0XG4gICAgICAgIGlmIChhdHRlbXB0cyA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgc2V0VGltZW91dChjaGVja0NlcnQsIDUwMDApOyAvLyBDaGVjayBhZ2FpbiBpbiA1IHNlY29uZHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgYFx1MjZBMFx1RkUwRiAke2FwcE5hbWV9IGRlcGxveWVkIGJ1dCBTU0wgY2VydGlmaWNhdGUgbWF5IHN0aWxsIGJlIGdlbmVyYXRpbmcuXFxuVHJ5IHJlZnJlc2hpbmcgaW4gYSBtb21lbnQgaWYgeW91IHNlZSBhIGNlcnRpZmljYXRlIGVycm9yLmAsXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAxMDAwMFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gU3RhcnQgY2hlY2tpbmcgYWZ0ZXIgMyBzZWNvbmRzIChnaXZlIENhZGR5IHRpbWUgdG8gc3RhcnQpXG4gICAgc2V0VGltZW91dChjaGVja0NlcnQsIDMwMDApO1xuICB9XG5cbiAgLy8gTG9hZCBjdXN0b20gYXBwcyBvbiBzdGFydHVwXG4gIGZ1bmN0aW9uIGxvYWRDdXN0b21BcHBzKCkge1xuICAgIGNvbnN0IGN1c3RvbUFwcHMgPSBzYWZlR2V0SlNPTihBUFBTX0tFWSwgW10pO1xuICAgIGN1c3RvbUFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgaWYgKCF3aW5kb3cuQVBQUy5zb21lKGEgPT4gYS5pZCA9PT0gYXBwLmlkKSkge1xuICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKGFwcCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBidWlsZEFwcFNlbGVjdG9yKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItY2FuY2VsJykpO1xuXG4gIC8vIERlcGxveSBtb2RhbCBldmVudCBsaXN0ZW5lcnNcbiAgY29uc3QgZGVwbG95TW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwLWRlcGxveS1tb2RhbCcpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBkZXBsb3lNb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LWNvbmZpcm0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgLy8gR2V0IHVzZXIgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGFwcFRlbXBsYXRlID0gSlNPTi5wYXJzZShkZXBsb3lNb2RhbC5kYXRhc2V0LmFwcFRlbXBsYXRlKTtcbiAgICBjb25zdCBtZWRpYVBhdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LW1lZGlhLXBhdGgnKS52YWx1ZS50cmltKCk7XG5cbiAgICAvLyBDb2xsZWN0IGN1c3RvbSB2b2x1bWUgb3ZlcnJpZGVzXG4gICAgY29uc3QgY3VzdG9tVm9sdW1lcyA9IFtdO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN2b2x1bWUtbW91bnRzLWxpc3QgLnZvbC1ob3N0LXBhdGgnKS5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgIGN1c3RvbVZvbHVtZXMucHVzaCh7IGhvc3RQYXRoOiBpbnB1dC52YWx1ZS50cmltKCksIGNvbnRhaW5lclBhdGg6IGlucHV0LmRhdGFzZXQuY29udGFpbmVyUGF0aCB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRlcGxveUNvbmZpZyA9IHtcbiAgICAgIGFwcFRlbXBsYXRlOiBhcHBUZW1wbGF0ZSxcbiAgICAgIHN1YmRvbWFpbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1zdWJkb21haW4nKS52YWx1ZS50cmltKCksXG4gICAgICBkbnNUeXBlOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl06Y2hlY2tlZCcpLnZhbHVlLFxuICAgICAgc3NsVHlwZTogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInNzbC10eXBlXCJdOmNoZWNrZWQnKS52YWx1ZSxcbiAgICAgIGlwOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LWlwJykudmFsdWUudHJpbSgpLFxuICAgICAgcG9ydDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1wb3J0JykudmFsdWUudHJpbSgpLFxuICAgICAgdGFpbHNjYWxlT25seTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS10YWlsc2NhbGUtb25seScpLmNoZWNrZWQsXG4gICAgICBtZWRpYVBhdGg6IG1lZGlhUGF0aCB8fCBudWxsLFxuICAgICAgcGxleENsYWltVG9rZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktcGxleC1jbGFpbScpPy52YWx1ZS50cmltKCkgfHwgbnVsbCxcbiAgICAgIGN1c3RvbVZvbHVtZXM6IGN1c3RvbVZvbHVtZXMubGVuZ3RoID4gMCA/IGN1c3RvbVZvbHVtZXMgOiBudWxsLFxuICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgIGNwdXM6IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1jcHUtbGltaXQnKS52YWx1ZSkgfHwgMCxcbiAgICAgICAgbWVtb3J5OiBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktbWVtb3J5LWxpbWl0JykudmFsdWUpIHx8IDAsXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFZhbGlkYXRlIHN1YmRvbWFpblxuICAgIGlmICghZGVwbG95Q29uZmlnLnN1YmRvbWFpbikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgc3ViZG9tYWluIG9yIGRvbWFpbiBuYW1lJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtZWRpYSBwYXRoIGZvciBtZWRpYSBhcHBzXG4gICAgaWYgKGFwcFRlbXBsYXRlLm1lZGlhTW91bnQ/LnJlcXVpcmVkICYmICFtZWRpYVBhdGgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIG1lZGlhIGxpYnJhcnkgcGF0aCBmb3IgdGhpcyBhcHBsaWNhdGlvbicsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgZGVwbG95IG1vZGFsXG4gICAgZGVwbG95TW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuXG4gICAgLy8gU3RhcnQgZGVwbG95bWVudFxuICAgIGFkZEFwcFRvR3JpZChkZXBsb3lDb25maWcpO1xuICB9KTtcblxuICB3aXJlTW9kYWwoZGVwbG95TW9kYWwpO1xuXG4gIC8vID09PT09IEZPTERFUiBCUk9XU0VSIEZVTkNUSU9OQUxJVFkgPT09PT1cbiAgY29uc3QgZm9sZGVyQnJvd3Nlck1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbGRlci1icm93c2VyLW1vZGFsJyk7XG4gIGNvbnN0IGZvbGRlckJyb3dzZXJQYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbGRlci1icm93c2VyLXBhdGgnKTtcbiAgY29uc3QgZm9sZGVyQnJvd3Nlckxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItbGlzdCcpO1xuICBjb25zdCBmb2xkZXJCcm93c2VyU2VsZWN0ZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItc2VsZWN0ZWQnKTtcbiAgY29uc3QgZm9sZGVyQnJvd3NlclNlbGVjdGVkTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb2xkZXItYnJvd3Nlci1zZWxlY3RlZC1saXN0Jyk7XG4gIGxldCBjdXJyZW50QnJvd3NlclBhdGggPSAnJztcbiAgbGV0IHNlbGVjdGVkRm9sZGVycyA9IFtdO1xuICBsZXQgdGFyZ2V0TWVkaWFJbnB1dCA9IG51bGw7XG5cbiAgd2luZG93Lm9wZW5Gb2xkZXJCcm93c2VyID0gZnVuY3Rpb24obWVkaWFJbnB1dCkge1xuICAgIHRhcmdldE1lZGlhSW5wdXQgPSBtZWRpYUlucHV0O1xuICAgIHNlbGVjdGVkRm9sZGVycyA9IG1lZGlhSW5wdXQudmFsdWUuc3BsaXQoJywnKS5tYXAocCA9PiBwLnRyaW0oKSkuZmlsdGVyKHAgPT4gcCk7XG4gICAgY3VycmVudEJyb3dzZXJQYXRoID0gJyc7XG4gICAgdXBkYXRlU2VsZWN0ZWRGb2xkZXJzRGlzcGxheSgpO1xuICAgIGxvYWRGb2xkZXJDb250ZW50cygnJyk7XG4gICAgZm9sZGVyQnJvd3Nlck1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfTtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkRm9sZGVyQ29udGVudHMocGF0aCkge1xuICAgIGZvbGRlckJyb3dzZXJQYXRoLnRleHRDb250ZW50ID0gcGF0aCB8fCAnU2VsZWN0IGEgZHJpdmUuLi4nO1xuICAgIGZvbGRlckJyb3dzZXJMaXN0LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkxvYWRpbmcuLi48L2Rpdj4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvYnJvd3NlL2RpcmVjdG9yaWVzP3BhdGg9JHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9YCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgZm9sZGVyQnJvd3Nlckxpc3QuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1lcnJvcik7XCI+RXJyb3I6ICR7ZXNjYXBlSHRtbChyZXN1bHQuZXJyb3IpfTwvZGl2PmA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudEJyb3dzZXJQYXRoID0gcmVzdWx0LnBhdGggfHwgJyc7XG4gICAgICBmb2xkZXJCcm93c2VyUGF0aC50ZXh0Q29udGVudCA9IGN1cnJlbnRCcm93c2VyUGF0aCB8fCAnU2VsZWN0IGEgZHJpdmUuLi4nO1xuXG4gICAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgICAvLyBBZGQgcGFyZW50IGZvbGRlciBuYXZpZ2F0aW9uXG4gICAgICBpZiAocmVzdWx0LnBhcmVudCAmJiByZXN1bHQucGFyZW50ICE9PSByZXN1bHQucGF0aCkge1xuICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiZm9sZGVyLWl0ZW1cIiBkYXRhLXBhdGg9XCIke2VzY2FwZUh0bWwocmVzdWx0LnBhcmVudCl9XCIgc3R5bGU9XCJwYWRkaW5nOiAxMnB4IDE2cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjdXJzb3I6IHBvaW50ZXI7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4ycmVtO1wiPlx1MkIwNlx1RkUwRjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Li4gUGFyZW50IERpcmVjdG9yeTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGZvbGRlcnNcbiAgICAgIGlmIChyZXN1bHQuaXRlbXMubGVuZ3RoID09PSAwICYmICFyZXN1bHQucGFyZW50KSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gYnJvd3NlYWJsZSBkcml2ZXMgY29uZmlndXJlZC4gQ2hlY2sgeW91ciBkb2NrZXItY29tcG9zZS55bWwgdm9sdW1lIG1vdW50cy48L2Rpdj4nO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQuaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gc3ViZm9sZGVycyBmb3VuZDwvZGl2Pic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBjb25zdCBpY29uID0gaXRlbS50eXBlID09PSAnZHJpdmUnID8gJ1x1RDgzRFx1RENCRScgOiAnXHVEODNEXHVEQ0MxJztcbiAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gc2VsZWN0ZWRGb2xkZXJzLmluY2x1ZGVzKGl0ZW0ucGF0aCk7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdHlsZSA9IGlzU2VsZWN0ZWQgPyAnYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXN1Y2Nlc3MpIDIwJSwgdHJhbnNwYXJlbnQpOycgOiAnJztcbiAgICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiZm9sZGVyLWl0ZW1cIiBkYXRhLXBhdGg9XCIke2VzY2FwZUh0bWwoaXRlbS5wYXRoKX1cIiBzdHlsZT1cInBhZGRpbmc6IDEycHggMTZweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyAke3NlbGVjdGVkU3R5bGV9XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4ycmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+JHtlc2NhcGVIdG1sKGl0ZW0ubmFtZSl9PC9zcGFuPlxuICAgICAgICAgICAgJHtpc1NlbGVjdGVkID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLXN1Y2Nlc3MpO1wiPlx1MjcxMzwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZvbGRlckJyb3dzZXJMaXN0LmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIC8vIEFkZCBjbGljayBoYW5kbGVyc1xuICAgICAgZm9sZGVyQnJvd3Nlckxpc3QucXVlcnlTZWxlY3RvckFsbCgnLmZvbGRlci1pdGVtJykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBsb2FkRm9sZGVyQ29udGVudHMoaXRlbS5kYXRhc2V0LnBhdGgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgICAgIGl0ZW0uc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1jYXJkLWJnKSc7XG4gICAgICAgIH0pO1xuICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkRm9sZGVycy5pbmNsdWRlcyhpdGVtLmRhdGFzZXQucGF0aCk7XG4gICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kID0gaXNTZWxlY3RlZCA/ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMjAlLCB0cmFuc3BhcmVudCknIDogJyc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZm9sZGVyQnJvd3Nlckxpc3QuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1lcnJvcik7XCI+RmFpbGVkIHRvIGxvYWQ6ICR7ZXNjYXBlSHRtbChlcnJvci5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGVkRm9sZGVyc0Rpc3BsYXkoKSB7XG4gICAgaWYgKHNlbGVjdGVkRm9sZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGZvbGRlckJyb3dzZXJTZWxlY3RlZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb2xkZXJCcm93c2VyU2VsZWN0ZWQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgZm9sZGVyQnJvd3NlclNlbGVjdGVkTGlzdC5pbm5lckhUTUwgPSBzZWxlY3RlZEZvbGRlcnMubWFwKHBhdGggPT4gYFxuICAgICAgPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA2cHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXN1Y2Nlc3MpOyBib3JkZXItcmFkaXVzOiA0cHg7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4O1wiPlxuICAgICAgICAke2VzY2FwZUh0bWwocGF0aCl9XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uY2xpY2s9XCJyZW1vdmVTZWxlY3RlZEZvbGRlcignJHtlc2NhcGVIdG1sKHBhdGgpfScpXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBub25lOyBib3JkZXI6IG5vbmU7IGN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLWVycm9yKTsgZm9udC1zaXplOiAxcmVtOyBwYWRkaW5nOiAwO1wiPlx1MDBENzwvYnV0dG9uPlxuICAgICAgPC9zcGFuPlxuICAgIGApLmpvaW4oJycpO1xuICB9XG5cbiAgd2luZG93LnJlbW92ZVNlbGVjdGVkRm9sZGVyID0gZnVuY3Rpb24ocGF0aCkge1xuICAgIHNlbGVjdGVkRm9sZGVycyA9IHNlbGVjdGVkRm9sZGVycy5maWx0ZXIocCA9PiBwICE9PSBwYXRoKTtcbiAgICB1cGRhdGVTZWxlY3RlZEZvbGRlcnNEaXNwbGF5KCk7XG4gICAgbG9hZEZvbGRlckNvbnRlbnRzKGN1cnJlbnRCcm93c2VyUGF0aCk7IC8vIFJlZnJlc2ggdG8gdXBkYXRlIGNoZWNrbWFya3NcbiAgfTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItc2VsZWN0LWN1cnJlbnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoY3VycmVudEJyb3dzZXJQYXRoICYmICFzZWxlY3RlZEZvbGRlcnMuaW5jbHVkZXMoY3VycmVudEJyb3dzZXJQYXRoKSkge1xuICAgICAgc2VsZWN0ZWRGb2xkZXJzLnB1c2goY3VycmVudEJyb3dzZXJQYXRoKTtcbiAgICAgIHVwZGF0ZVNlbGVjdGVkRm9sZGVyc0Rpc3BsYXkoKTtcbiAgICAgIGxvYWRGb2xkZXJDb250ZW50cyhjdXJyZW50QnJvd3NlclBhdGgpOyAvLyBSZWZyZXNoIHRvIHNob3cgY2hlY2ttYXJrXG4gICAgfVxuICB9KTtcblxuICB3aXJlTW9kYWwoZm9sZGVyQnJvd3Nlck1vZGFsLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItY2FuY2VsJykpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb2xkZXItYnJvd3Nlci1kb25lJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKHRhcmdldE1lZGlhSW5wdXQpIHtcbiAgICAgIHRhcmdldE1lZGlhSW5wdXQudmFsdWUgPSBzZWxlY3RlZEZvbGRlcnMuam9pbignLCAnKTtcbiAgICB9XG4gICAgZm9sZGVyQnJvd3Nlck1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gTG9hZCBjdXN0b20gYXBwcyBvbiBwYWdlIGxvYWRcbiAgbG9hZEN1c3RvbUFwcHMoKTtcbn0pKCk7XG47XG4vLyBSZWNpcGUgU3lzdGVtIFx1MjAxNCBtdWx0aS1jb250YWluZXIgc3RhY2sgZGVwbG95bWVudFxuKGZ1bmN0aW9uKCkge1xuICAvLyA9PT0gUkVDSVBFIERFUExPWSBXSVpBUkQgTU9EQUwgPT09XG4gIGluamVjdE1vZGFsKCdyZWNpcGUtZGVwbG95LW1vZGFsJywgYDxkaXYgaWQ9XCJyZWNpcGUtZGVwbG95LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA2MjBweDsgbWF4LXdpZHRoOiA3NDBweDtcIj5cbiAgICAgIDxoMyBpZD1cInJlY2lwZS1kZXBsb3ktdGl0bGVcIj5EZXBsb3kgUmVjaXBlPC9oMz5cblxuICAgICAgPCEtLSBTdGVwIGluZGljYXRvciAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcHNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4OyBtYXJnaW46IDE2cHggMCAyNHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVjaXBlLXN0ZXAgYWN0aXZlXCIgZGF0YS1zdGVwPVwiMVwiPjxzcGFuPjE8L3NwYW4+IENvbXBvbmVudHM8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY2lwZS1zdGVwXCIgZGF0YS1zdGVwPVwiMlwiPjxzcGFuPjI8L3NwYW4+IENvbmZpZ3VyYXRpb248L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY2lwZS1zdGVwXCIgZGF0YS1zdGVwPVwiM1wiPjxzcGFuPjM8L3NwYW4+IFJldmlldzwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVjaXBlLXN0ZXBcIiBkYXRhLXN0ZXA9XCI0XCI+PHNwYW4+NDwvc3Bhbj4gUHJvZ3Jlc3M8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgMTogQ29tcG9uZW50IFNlbGVjdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0xXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlNlbGVjdCBDb21wb25lbnRzOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtY29tcG9uZW50LWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgbWFyZ2luLXRvcDogOHB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RlcCAyOiBTaGFyZWQgQ29uZmlndXJhdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0yXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxNnB4O1wiPlxuICAgICAgICAgIDwhLS0gU2hhcmVkIHZvbHVtZXMgLS0+XG4gICAgICAgICAgPGRpdiBpZD1cInJlY2lwZS12b2x1bWVzLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+U2hhcmVkIFZvbHVtZXM6PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtdm9sdW1lLWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgbWFyZ2luLXRvcDogOHB4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBUaW1lem9uZSAtLT5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5UaW1lem9uZTo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJyZWNpcGUtdGltZXpvbmVcIiB2YWx1ZT1cIlVUQ1wiIHBsYWNlaG9sZGVyPVwiZS5nLiBBbWVyaWNhL05ld19Zb3JrXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVGFyZ2V0IElQIC0tPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlRhcmdldCBJUCBBZGRyZXNzOjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInJlY2lwZS1pcFwiIHZhbHVlPVwiaG9zdC5kb2NrZXIuaW50ZXJuYWxcIiBwbGFjZWhvbGRlcj1cImxvY2FsaG9zdCBvciBJUFwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+SVAgd2hlcmUgY29udGFpbmVycyBleHBvc2UgcG9ydHM8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVGFpbHNjYWxlIC0tPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJyZWNpcGUtdGFpbHNjYWxlXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPlJlc3RyaWN0IHRvIFRhaWxzY2FsZSBuZXR3b3JrIG9ubHk8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwIDM6IFJldmlldyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0zXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IGlkPVwicmVjaXBlLXJldmlldy1jb250ZW50XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOXJlbTsgbGluZS1oZWlnaHQ6IDEuNztcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgNDogUHJvZ3Jlc3MgLS0+XG4gICAgICA8ZGl2IGlkPVwicmVjaXBlLXN0ZXAtNFwiIGNsYXNzPVwicmVjaXBlLXN0ZXAtcGFuZWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cInJlY2lwZS1wcm9ncmVzcy1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDhweDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInJlY2lwZS1kZXBsb3ktcmVzdWx0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMjBweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlY2lwZS1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlY2lwZS1wcmV2XCIgY2xhc3M9XCJidG4tYWNjZW50XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+QmFjazwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVjaXBlLW5leHRcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIj5OZXh0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgLy8gPT09IFNUQVRFID09PVxuICBsZXQgcmVjaXBlVGVtcGxhdGVzID0gbnVsbDtcbiAgbGV0IHJlY2lwZUNhdGVnb3JpZXMgPSBudWxsO1xuICBsZXQgY3VycmVudFJlY2lwZSA9IG51bGw7XG4gIGxldCBjdXJyZW50U3RlcCA9IDE7XG4gIGxldCBpc1ByZW1pdW0gPSBmYWxzZTtcblxuICBjb25zdCBkZXBsb3lNb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtZGVwbG95LW1vZGFsJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtY2FuY2VsJyk7XG4gIGNvbnN0IHByZXZCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXByZXYnKTtcbiAgY29uc3QgbmV4dEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtbmV4dCcpO1xuXG4gIHdpcmVNb2RhbChkZXBsb3lNb2RhbCwgY2FuY2VsQnRuKTtcblxuICAvLyA9PT0gRkVUQ0ggUkVDSVBFIFRFTVBMQVRFUyA9PT1cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWNpcGVUZW1wbGF0ZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9yZWNpcGVzL3RlbXBsYXRlcycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICByZWNpcGVUZW1wbGF0ZXMgPSBkYXRhLnRlbXBsYXRlcztcbiAgICAgICAgcmVjaXBlQ2F0ZWdvcmllcyA9IGRhdGEuY2F0ZWdvcmllcztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvLyBQcmVtaXVtIHJlcXVpcmVkIFx1MjAxNCB0ZW1wbGF0ZXMgQVBJIGdhdGVkXG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICBpc1ByZW1pdW0gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGZldGNoIHJlY2lwZSB0ZW1wbGF0ZXM6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gPT09IENIRUNLIFBSRU1JVU0gPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrUmVjaXBlUHJlbWl1bSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xpY2Vuc2UvZmVhdHVyZS9yZWNpcGVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBpc1ByZW1pdW0gPSBkYXRhLmF2YWlsYWJsZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGlzUHJlbWl1bSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaXNQcmVtaXVtO1xuICB9XG5cbiAgLy8gPT09IFJFTkRFUiBSRUNJUEUgQ0FSRFMgSU5UTyBBUFAgU0VMRUNUT1IgPT09XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhcHAgc2VsZWN0b3IgdG8gaW5qZWN0IHJlY2lwZSBjYXJkc1xuICB3aW5kb3cucmVuZGVyUmVjaXBlQ2FyZHMgPSBhc3luYyBmdW5jdGlvbihncmlkKSB7XG4gICAgYXdhaXQgY2hlY2tSZWNpcGVQcmVtaXVtKCk7XG5cbiAgICAvLyBCdWlsZCByZWNpcGUgZGF0YSBcdTIwMTQgd2UgY2FuIHNob3cgY2FyZCBtZXRhZGF0YSBldmVuIHdpdGhvdXQgcHJlbWl1bVxuICAgIC8vIChjYXJkcyBqdXN0IHNob3cgYSBsb2NrIGFuZCBwcm9tcHQgdG8gdXBncmFkZSlcbiAgICBsZXQgcmVjaXBlcztcbiAgICBpZiAoaXNQcmVtaXVtICYmIHJlY2lwZVRlbXBsYXRlcykge1xuICAgICAgcmVjaXBlcyA9IHJlY2lwZVRlbXBsYXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2hvdyBoYXJkY29kZWQgcHJldmlldyBjYXJkcyB3aGVuIG5vdCBwcmVtaXVtXG4gICAgICByZWNpcGVzID0gZ2V0UHJldmlld1JlY2lwZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlY2lwZXMgfHwgcmVjaXBlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIENhdGVnb3J5IGhlYWRlclxuICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGhlYWRlci5jbGFzc05hbWUgPSAnYXBwLWNhdGVnb3J5LWhlYWRlcic7XG4gICAgaGVhZGVyLmlubmVySFRNTCA9IGBcXHVEODNFXFx1RERFQSBSZWNpcGVzYDtcbiAgICBoZWFkZXIuc3R5bGUuYm9yZGVyQm90dG9tQ29sb3IgPSAnIzhlNDRhZCc7XG4gICAgZ3JpZC5hcHBlbmRDaGlsZChoZWFkZXIpO1xuXG4gICAgY29uc3QgcmVjaXBlTGlzdCA9IEFycmF5LmlzQXJyYXkocmVjaXBlcykgPyByZWNpcGVzIDogT2JqZWN0LnZhbHVlcyhyZWNpcGVzKTtcbiAgICByZWNpcGVMaXN0LnNvcnQoKGEsIGIpID0+IChiLnBvcHVsYXJpdHkgfHwgMCkgLSAoYS5wb3B1bGFyaXR5IHx8IDApKTtcblxuICAgIGZvciAoY29uc3QgcmVjaXBlIG9mIHJlY2lwZUxpc3QpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgb3B0aW9uLmNsYXNzTmFtZSA9ICdhcHAtb3B0aW9uJztcbiAgICAgIG9wdGlvbi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICAgIGNvbnN0IGNvbXBvbmVudEJhZGdlID0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXRvcDogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDE0Miw2OCwxNzMsMC4yKTsgY29sb3I6ICNhODU1Zjc7XCI+JHtyZWNpcGUuY29tcG9uZW50Q291bnQgfHwgcmVjaXBlLmNvbXBvbmVudHM/Lmxlbmd0aCB8fCAnPyd9IGFwcHM8L2Rpdj5gO1xuXG4gICAgICBjb25zdCBsb2NrT3ZlcmxheSA9ICFpc1ByZW1pdW0gPyBgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA2cHg7IHJpZ2h0OiA2cHg7IGZvbnQtc2l6ZTogMC42NXJlbTsgcGFkZGluZzogMnB4IDhweDsgYm9yZGVyLXJhZGl1czogMTBweDsgYmFja2dyb3VuZDogcmdiYSgyNDEsMTk2LDE1LDAuMik7IGNvbG9yOiAjZjFjNDBmOyBmb250LXdlaWdodDogNjAwO1wiPlBSRU1JVU08L2Rpdj5gIDogJyc7XG5cbiAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgICR7bG9ja092ZXJsYXl9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtb3B0aW9uLWljb25cIj4ke2VzY2FwZUh0bWwocmVjaXBlLmljb24gfHwgJ1xcdUQ4M0VcXHVEREVBJyl9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtb3B0aW9uLW5hbWVcIj4ke2VzY2FwZUh0bWwocmVjaXBlLm5hbWUpfTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW9wdGlvbi1kZXNjXCI+JHtlc2NhcGVIdG1sKHJlY2lwZS5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG4gICAgICAgICR7Y29tcG9uZW50QmFkZ2V9XG4gICAgICBgO1xuXG4gICAgICBvcHRpb24ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFpc1ByZW1pdW0pIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZWNpcGVzIHJlcXVpcmUgYSBEYXNoQ2FkZHkgUHJlbWl1bSBsaWNlbnNlLiBDbGljayB0aGUgTGljZW5zZSBidXR0b24gdG8gYWN0aXZhdGUuJywgJ3dhcm5pbmcnLCA1MDAwKTtcbiAgICAgICAgICBpZiAod2luZG93Lm9wZW5MaWNlbnNlTW9kYWwpIHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9wZW5SZWNpcGVEZXBsb3lXaXphcmQocmVjaXBlKTtcbiAgICAgIH07XG5cbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0UHJldmlld1JlY2lwZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgaWQ6ICdodHBjLXN1aXRlJywgbmFtZTogJ0hUUEMgU3VpdGUnLCBpY29uOiAnXFx1RDgzQ1xcdURGQUMnLCBkZXNjcmlwdGlvbjogJ0NvbXBsZXRlIG1lZGlhIGF1dG9tYXRpb246IGZpbmQsIGRvd25sb2FkLCBvcmdhbml6ZSwgYW5kIHN0cmVhbScsIGNvbXBvbmVudENvdW50OiA2LCBwb3B1bGFyaXR5OiA5OCB9LFxuICAgICAgeyBpZDogJ25leHRjbG91ZC1jb21wbGV0ZScsIG5hbWU6ICdOZXh0Y2xvdWQgQ29tcGxldGUnLCBpY29uOiAnXFx1MjYwMVxcdUZFMEYnLCBkZXNjcmlwdGlvbjogJ0Z1bGwgcHJvZHVjdGl2aXR5IHN1aXRlOiBjbG91ZCBzdG9yYWdlLCBvZmZpY2UgZWRpdGluZywgYW5kIGNvbGxhYm9yYXRpb24nLCBjb21wb25lbnRDb3VudDogNCwgcG9wdWxhcml0eTogOTAgfSxcbiAgICAgIHsgaWQ6ICdzbWFydC1ob21lJywgbmFtZTogJ1NtYXJ0IEhvbWUgSHViJywgaWNvbjogJ1xcdUQ4M0NcXHVERkUwJywgZGVzY3JpcHRpb246ICdIb21lIGF1dG9tYXRpb246IGNvbnRyb2wsIGF1dG9tYXRlLCBhbmQgbW9uaXRvciBJb1QgZGV2aWNlcycsIGNvbXBvbmVudENvdW50OiA0LCBwb3B1bGFyaXR5OiA4OCB9LFxuICAgICAgeyBpZDogJ2Rldi1lbnZpcm9ubWVudCcsIG5hbWU6ICdEZXYgRW52aXJvbm1lbnQnLCBpY29uOiAnXFx1RDgzRFxcdURDQkInLCBkZXNjcmlwdGlvbjogJ1NlbGYtaG9zdGVkIGRldmVsb3BtZW50IHdvcmtmbG93OiBHaXQsIENJL0NELCBJREUsIGFuZCBkYXRhYmFzZScsIGNvbXBvbmVudENvdW50OiA0LCBwb3B1bGFyaXR5OiA4MiB9XG4gICAgXTtcbiAgfVxuXG4gIC8vID09PSBSRUNJUEUgREVQTE9ZIFdJWkFSRCA9PT1cbiAgZnVuY3Rpb24gb3BlblJlY2lwZURlcGxveVdpemFyZChyZWNpcGUpIHtcbiAgICBjdXJyZW50UmVjaXBlID0gcmVjaXBlO1xuICAgIGN1cnJlbnRTdGVwID0gMTtcblxuICAgIC8vIENsb3NlIGFwcCBzZWxlY3RvclxuICAgIGNvbnN0IGFwcFNlbGVjdG9yTW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwLXNlbGVjdG9yLW1vZGFsJyk7XG4gICAgaWYgKGFwcFNlbGVjdG9yTW9kYWwpIGFwcFNlbGVjdG9yTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1kZXBsb3ktdGl0bGUnKS50ZXh0Q29udGVudCA9IGBEZXBsb3kgJHtyZWNpcGUubmFtZX1gO1xuXG4gICAgLy8gUmVzZXQgc3RlcHNcbiAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICByZW5kZXJTdGVwMSgpO1xuXG4gICAgZGVwbG95TW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU3RlcFVJKCkge1xuICAgIC8vIFN0ZXAgaW5kaWNhdG9yc1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNyZWNpcGUtc3RlcHMgLnJlY2lwZS1zdGVwJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gcGFyc2VJbnQoZWwuZGF0YXNldC5zdGVwKTtcbiAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIHN0ZXAgPT09IGN1cnJlbnRTdGVwKTtcbiAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ2NvbXBsZXRlZCcsIHN0ZXAgPCBjdXJyZW50U3RlcCk7XG4gICAgfSk7XG5cbiAgICAvLyBTdGVwIHBhbmVsc1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDQ7IGkrKykge1xuICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcmVjaXBlLXN0ZXAtJHtpfWApO1xuICAgICAgaWYgKHBhbmVsKSBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gaSA9PT0gY3VycmVudFN0ZXAgPyAnJyA6ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBOYXZpZ2F0aW9uIGJ1dHRvbnNcbiAgICBwcmV2QnRuLnN0eWxlLmRpc3BsYXkgPSBjdXJyZW50U3RlcCA+IDEgJiYgY3VycmVudFN0ZXAgPCA0ID8gJycgOiAnbm9uZSc7XG4gICAgaWYgKGN1cnJlbnRTdGVwID09PSA0KSB7XG4gICAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBjYW5jZWxCdG4udGV4dENvbnRlbnQgPSAnQ2xvc2UnO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudFN0ZXAgPT09IDMpIHtcbiAgICAgIG5leHRCdG4udGV4dENvbnRlbnQgPSAnXFx1RDgzRFxcdURFODAgRGVwbG95JztcbiAgICAgIG5leHRCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgY2FuY2VsQnRuLnRleHRDb250ZW50ID0gJ0NhbmNlbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRCdG4udGV4dENvbnRlbnQgPSAnTmV4dCc7XG4gICAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdDYW5jZWwnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgMTogQ29tcG9uZW50IHNlbGVjdGlvblxuICBmdW5jdGlvbiByZW5kZXJTdGVwMSgpIHtcbiAgICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1jb21wb25lbnQtbGlzdCcpO1xuICAgIGxpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBjb25zdCBjb21wb25lbnRzID0gY3VycmVudFJlY2lwZS5jb21wb25lbnRzIHx8IFtdO1xuICAgIGZvciAoY29uc3QgY29tcCBvZiBjb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7JztcblxuICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IGNvbXAucmVxdWlyZWQ7XG4gICAgICBjb25zdCBpc0ludGVybmFsID0gY29tcC5pbnRlcm5hbDtcblxuICAgICAgZWwuaW5uZXJIVE1MID0gYFxuICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgJHtpc1JlcXVpcmVkID8gJ2NoZWNrZWQgZGlzYWJsZWQnIDogJ2NoZWNrZWQnfSBkYXRhLWNvbXBvbmVudC1pZD1cIiR7Y29tcC5pZH1cIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgYWNjZW50LWNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiIC8+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOXJlbTtcIj4ke2VzY2FwZUh0bWwoY29tcC5yb2xlIHx8IGNvbXAuaWQpfTwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICAke2NvbXAudGVtcGxhdGVSZWYgPyBlc2NhcGVIdG1sKGNvbXAudGVtcGxhdGVSZWYpIDogJ0J1aWx0LWluJ31cbiAgICAgICAgICAgICR7aXNSZXF1aXJlZCA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPlJlcXVpcmVkPC9zcGFuPicgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPk9wdGlvbmFsPC9zcGFuPid9XG4gICAgICAgICAgICAke2lzSW50ZXJuYWwgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPihJbnRlcm5hbCk8L3NwYW4+JyA6ICcnfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICR7Y29tcC5ub3RlID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS13YXJuLWZnKTsgbWFyZ2luLXRvcDogNHB4O1wiPlxcdTI2QTAgJHtlc2NhcGVIdG1sKGNvbXAubm90ZSl9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgICBsaXN0LmFwcGVuZENoaWxkKGVsKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGVwIDI6IFNoYXJlZCBjb25maWd1cmF0aW9uXG4gIGZ1bmN0aW9uIHJlbmRlclN0ZXAyKCkge1xuICAgIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXZvbHVtZXMtc2VjdGlvbicpO1xuICAgIGNvbnN0IHZvbHVtZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXZvbHVtZS1saXN0Jyk7XG5cbiAgICBjb25zdCBzaGFyZWRWb2x1bWVzID0gY3VycmVudFJlY2lwZS5zaGFyZWRWb2x1bWVzO1xuICAgIGlmIChzaGFyZWRWb2x1bWVzICYmIE9iamVjdC5rZXlzKHNoYXJlZFZvbHVtZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgdm9sdW1lTGlzdC5pbm5lckhUTUwgPSAnJztcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2b2xdIG9mIE9iamVjdC5lbnRyaWVzKHNoYXJlZFZvbHVtZXMpKSB7XG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGVsLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZ3JpZDsgZ2FwOiA0cHg7JztcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4ke2VzY2FwZUh0bWwodm9sLmxhYmVsIHx8IGtleSl9PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBkYXRhLXZvbHVtZS1rZXk9XCIke2tleX1cIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbCh2b2wuZGVmYXVsdFBhdGggfHwgJycpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiR7ZXNjYXBlSHRtbCh2b2wuZGVmYXVsdFBhdGggfHwgJy9wYXRoJyl9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuODVyZW07XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+JHtlc2NhcGVIdG1sKHZvbC5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG4gICAgICAgIGA7XG4gICAgICAgIHZvbHVtZUxpc3QuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RlcCAzOiBSZXZpZXdcbiAgZnVuY3Rpb24gcmVuZGVyU3RlcDMoKSB7XG4gICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtcmV2aWV3LWNvbnRlbnQnKTtcbiAgICBjb25zdCBzZWxlY3RlZENvbXBvbmVudHMgPSBnZXRTZWxlY3RlZENvbXBvbmVudHMoKTtcblxuICAgIGNvbnN0IHZvbHVtZUlucHV0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNyZWNpcGUtdm9sdW1lLWxpc3QgaW5wdXRbZGF0YS12b2x1bWUta2V5XScpO1xuICAgIGNvbnN0IHZvbHVtZXMgPSB7fTtcbiAgICB2b2x1bWVJbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICB2b2x1bWVzW2lucHV0LmRhdGFzZXQudm9sdW1lS2V5XSA9IGlucHV0LnZhbHVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdHogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXRpbWV6b25lJykudmFsdWUgfHwgJ1VUQyc7XG4gICAgY29uc3QgaXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLWlwJykudmFsdWUgfHwgJ2hvc3QuZG9ja2VyLmludGVybmFsJztcbiAgICBjb25zdCB0YWlsc2NhbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXRhaWxzY2FsZScpLmNoZWNrZWQ7XG5cbiAgICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDFyZW07IG1hcmdpbi1ib3R0b206IDEycHg7XCI+JHtlc2NhcGVIdG1sKGN1cnJlbnRSZWNpcGUubmFtZSl9PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogMTZweDtcIj4ke2VzY2FwZUh0bWwoY3VycmVudFJlY2lwZS5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8c3Ryb25nPkNvbXBvbmVudHMgKCR7c2VsZWN0ZWRDb21wb25lbnRzLmxlbmd0aH0pOjwvc3Ryb25nPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiA0cHg7IG1hcmdpbi10b3A6IDZweDtcIj5cbiAgICAgICAgICAke3NlbGVjdGVkQ29tcG9uZW50cy5tYXAoYyA9PiBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDRweCAwOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICBcXHUyMDIyIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGMucm9sZSB8fCBjLmlkKX08L3N0cm9uZz4gJHtjLmludGVybmFsID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpXCI+KGludGVybmFsKTwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgICR7T2JqZWN0LmtleXModm9sdW1lcykubGVuZ3RoID4gMCA/IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgPHN0cm9uZz5Wb2x1bWVzOjwvc3Ryb25nPlxuICAgICAgICAke09iamVjdC5lbnRyaWVzKHZvbHVtZXMpLm1hcCgoW2ssIHZdKSA9PiBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2t9OiAke2VzY2FwZUh0bWwodil9PC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgIFRpbWV6b25lOiAke2VzY2FwZUh0bWwodHopfSAmYnVsbDsgSVA6ICR7ZXNjYXBlSHRtbChpcCl9ICR7dGFpbHNjYWxlID8gJyZidWxsOyBUYWlsc2NhbGUgb25seScgOiAnJ31cbiAgICAgIDwvZGl2PlxuXG4gICAgICAke2N1cnJlbnRSZWNpcGUubmV0d29yayA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+RG9ja2VyIG5ldHdvcms6IDxjb2RlPiR7ZXNjYXBlSHRtbChjdXJyZW50UmVjaXBlLm5ldHdvcmsubmFtZSl9PC9jb2RlPjwvZGl2PmAgOiAnJ31cbiAgICBgO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnRzKCkge1xuICAgIGNvbnN0IGNoZWNrYm94ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmVjaXBlLWNvbXBvbmVudC1saXN0IGlucHV0W2RhdGEtY29tcG9uZW50LWlkXScpO1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gbmV3IFNldCgpO1xuICAgIGNoZWNrYm94ZXMuZm9yRWFjaChjYiA9PiB7XG4gICAgICBpZiAoY2IuY2hlY2tlZCkgc2VsZWN0ZWRJZHMuYWRkKGNiLmRhdGFzZXQuY29tcG9uZW50SWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQWx3YXlzIGluY2x1ZGUgcmVxdWlyZWQgY29tcG9uZW50c1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSBjdXJyZW50UmVjaXBlLmNvbXBvbmVudHMgfHwgW107XG4gICAgY29tcG9uZW50cy5maWx0ZXIoYyA9PiBjLnJlcXVpcmVkKS5mb3JFYWNoKGMgPT4gc2VsZWN0ZWRJZHMuYWRkKGMuaWQpKTtcblxuICAgIHJldHVybiBjb21wb25lbnRzLmZpbHRlcihjID0+IHNlbGVjdGVkSWRzLmhhcyhjLmlkKSk7XG4gIH1cblxuICAvLyBTdGVwIDQ6IERlcGxveVxuICBhc3luYyBmdW5jdGlvbiBleGVjdXRlRGVwbG95KCkge1xuICAgIGNvbnN0IHByb2dyZXNzTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtcHJvZ3Jlc3MtbGlzdCcpO1xuICAgIGNvbnN0IHJlc3VsdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1kZXBsb3ktcmVzdWx0Jyk7XG4gICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBwcm9ncmVzc0xpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBjb25zdCBzZWxlY3RlZENvbXBvbmVudHMgPSBnZXRTZWxlY3RlZENvbXBvbmVudHMoKTtcblxuICAgIC8vIFNob3cgcHJvZ3Jlc3MgaXRlbXNcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2Ygc2VsZWN0ZWRDb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZWwuaWQgPSBgcmVjaXBlLXByb2dyZXNzLSR7Y29tcC5pZH1gO1xuICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IHBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtOyc7XG4gICAgICBlbC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmVjaXBlLXByb2dyZXNzLWljb25cIiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPlxcdTIzRjM8L3NwYW4+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxOyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChjb21wLnJvbGUgfHwgY29tcC5pZCl9PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInJlY2lwZS1wcm9ncmVzcy1zdGF0dXNcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UXVldWVkPC9zcGFuPlxuICAgICAgYDtcbiAgICAgIHByb2dyZXNzTGlzdC5hcHBlbmRDaGlsZChlbCk7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdCBjb25maWdcbiAgICBjb25zdCB2b2x1bWVJbnB1dHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmVjaXBlLXZvbHVtZS1saXN0IGlucHV0W2RhdGEtdm9sdW1lLWtleV0nKTtcbiAgICBjb25zdCB2b2x1bWVzID0ge307XG4gICAgdm9sdW1lSW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgdm9sdW1lc1tpbnB1dC5kYXRhc2V0LnZvbHVtZUtleV0gPSBpbnB1dC52YWx1ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHNlbGVjdGVkQ29tcG9uZW50czogc2VsZWN0ZWRDb21wb25lbnRzLm1hcChjID0+IGMuaWQpLFxuICAgICAgc2hhcmVkQ29uZmlnOiB7XG4gICAgICAgIGlwOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLWlwJykudmFsdWUgfHwgJ2hvc3QuZG9ja2VyLmludGVybmFsJyxcbiAgICAgICAgdGltZXpvbmU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtdGltZXpvbmUnKS52YWx1ZSB8fCAnVVRDJyxcbiAgICAgICAgdGFpbHNjYWxlT25seTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS10YWlsc2NhbGUnKS5jaGVja2VkLFxuICAgICAgICB2b2x1bWVzXG4gICAgICB9LFxuICAgICAgY29tcG9uZW50T3ZlcnJpZGVzOiB7fVxuICAgIH07XG5cbiAgICAvLyBNYXJrIGFsbCBhcyBkZXBsb3lpbmdcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2Ygc2VsZWN0ZWRDb21wb25lbnRzKSB7XG4gICAgICB1cGRhdGVQcm9ncmVzc0l0ZW0oY29tcC5pZCwgJ2RlcGxveWluZycsICdEZXBsb3lpbmcuLi4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3JlY2lwZXMvZGVwbG95Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVjaXBlSWQ6IGN1cnJlbnRSZWNpcGUuaWQsIGNvbmZpZyB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gTWFyayBkZXBsb3llZCBjb21wb25lbnRzXG4gICAgICAgIGZvciAoY29uc3QgZGVwbG95ZWQgb2YgKGRhdGEuZGVwbG95ZWQgfHwgW10pKSB7XG4gICAgICAgICAgdXBkYXRlUHJvZ3Jlc3NJdGVtKGRlcGxveWVkLmlkLCAnc3VjY2VzcycsIGRlcGxveWVkLnVybCA/IGBSdW5uaW5nIFxcdTIxOTIgJHtkZXBsb3llZC51cmx9YCA6ICdSdW5uaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFyayBlcnJvcnNcbiAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgKGRhdGEuZXJyb3JzIHx8IFtdKSkge1xuICAgICAgICAgIHVwZGF0ZVByb2dyZXNzSXRlbShlcnIuY29tcG9uZW50SWQsICdlcnJvcicsIGVyci5lcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHRFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJlc3VsdEVsLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTRweDsgYm9yZGVyLXJhZGl1czogOHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDQ2LDIwNCwxMTMsMC4xKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSg0NiwyMDQsMTEzLDAuMyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLW9rLWZnKTsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPiR7ZXNjYXBlSHRtbChkYXRhLm1lc3NhZ2UgfHwgJ0RlcGxveWVkIScpfTwvZGl2PlxuICAgICAgICAgICAgJHtkYXRhLnNldHVwSW5zdHJ1Y3Rpb25zID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogOHB4O1wiPlxuICAgICAgICAgICAgICA8c3Ryb25nPlNldHVwIHRpcHM6PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjogNHB4IDAgMCAxNnB4OyBwYWRkaW5nOiAwO1wiPiR7ZGF0YS5zZXR1cEluc3RydWN0aW9ucy5tYXAocyA9PiBgPGxpPiR7ZXNjYXBlSHRtbChzKX08L2xpPmApLmpvaW4oJycpfTwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG5cbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtjdXJyZW50UmVjaXBlLm5hbWV9IHJlY2lwZSBkZXBsb3llZCBzdWNjZXNzZnVsbHkhYCwgJ3N1Y2Nlc3MnLCA1MDAwKTtcblxuICAgICAgICAvLyBSZWZyZXNoIGRhc2hib2FyZFxuICAgICAgICBpZiAod2luZG93LmxvYWRTZXJ2aWNlcykgd2luZG93LmxvYWRTZXJ2aWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE0cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogcmdiYSgyMzEsNzYsNjAsMC4xKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMzEsNzYsNjAsMC4zKTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgPHN0cm9uZz5EZXBsb3ltZW50IGZhaWxlZDo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKX1cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVjaXBlIGRlcGxveW1lbnQgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJywgNTAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgcmVzdWx0RWwuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHJnYmEoMjMxLDc2LDYwLDAuMSk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjMxLDc2LDYwLDAuMyk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICA8c3Ryb25nPk5ldHdvcmsgZXJyb3I6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfVxuICAgICAgPC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQcm9ncmVzc0l0ZW0oY29tcG9uZW50SWQsIHN0YXR1cywgdGV4dCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJlY2lwZS1wcm9ncmVzcy0ke2NvbXBvbmVudElkfWApO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBpY29uID0gZWwucXVlcnlTZWxlY3RvcignLnJlY2lwZS1wcm9ncmVzcy1pY29uJyk7XG4gICAgY29uc3Qgc3RhdHVzRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCcucmVjaXBlLXByb2dyZXNzLXN0YXR1cycpO1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gJ2RlcGxveWluZycpIHtcbiAgICAgIGljb24udGV4dENvbnRlbnQgPSAnXFx1MjNGMyc7XG4gICAgICBzdGF0dXNFbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1hY2NlbnQpJztcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICBpY29uLnRleHRDb250ZW50ID0gJ1xcdTI3MDUnO1xuICAgICAgc3RhdHVzRWwuc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcpJztcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgaWNvbi50ZXh0Q29udGVudCA9ICdcXHUyNzRDJztcbiAgICAgIHN0YXR1c0VsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgIH1cbiAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cblxuICAvLyA9PT0gU1RFUCBOQVZJR0FUSU9OID09PVxuICBuZXh0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMykge1xuICAgICAgY3VycmVudFN0ZXAgPSA0O1xuICAgICAgdXBkYXRlU3RlcFVJKCk7XG4gICAgICBleGVjdXRlRGVwbG95KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50U3RlcCA8IDMpIHtcbiAgICAgIGN1cnJlbnRTdGVwKys7XG4gICAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMikgcmVuZGVyU3RlcDIoKTtcbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMykgcmVuZGVyU3RlcDMoKTtcbiAgICB9XG4gIH0pO1xuXG4gIHByZXZCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnRTdGVwID4gMSAmJiBjdXJyZW50U3RlcCA8IDQpIHtcbiAgICAgIGN1cnJlbnRTdGVwLS07XG4gICAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PSBSRUNJUEUgQ0FSRCBHUk9VUElORyBPTiBEQVNIQk9BUkQgPT09XG4gIC8vIEFmdGVyIGRhc2hib2FyZCBsb2FkcywgZ3JvdXAgY2FyZHMgdGhhdCBzaGFyZSBhIHJlY2lwZUlkXG4gIHdpbmRvdy5ncm91cFJlY2lwZUNhcmRzID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VydmljZS1jYXJkW2RhdGEtcmVjaXBlLWlkXScpO1xuICAgIGlmIChjYXJkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGdyb3VwcyA9IHt9O1xuICAgIGNhcmRzLmZvckVhY2goY2FyZCA9PiB7XG4gICAgICBjb25zdCByZWNpcGVJZCA9IGNhcmQuZGF0YXNldC5yZWNpcGVJZDtcbiAgICAgIGlmICghZ3JvdXBzW3JlY2lwZUlkXSkgZ3JvdXBzW3JlY2lwZUlkXSA9IFtdO1xuICAgICAgZ3JvdXBzW3JlY2lwZUlkXS5wdXNoKGNhcmQpO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBbcmVjaXBlSWQsIGdyb3VwQ2FyZHNdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwcykpIHtcbiAgICAgIGlmIChncm91cENhcmRzLmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBBcHBseSBzdWJ0bGUgdmlzdWFsIGdyb3VwaW5nXG4gICAgICBncm91cENhcmRzLmZvckVhY2goKGNhcmQsIGkpID0+IHtcbiAgICAgICAgY2FyZC5zdHlsZS5ib3JkZXJMZWZ0ID0gJzNweCBzb2xpZCByZ2JhKDE0Miw2OCwxNzMsMC41KSc7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgLy8gQWRkIGEgcmVjaXBlIGxhYmVsIHRvIHRoZSBmaXJzdCBjYXJkXG4gICAgICAgICAgbGV0IGxhYmVsID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcucmVjaXBlLWdyb3VwLWxhYmVsJyk7XG4gICAgICAgICAgaWYgKCFsYWJlbCkge1xuICAgICAgICAgICAgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdyZWNpcGUtZ3JvdXAtbGFiZWwnO1xuICAgICAgICAgICAgbGFiZWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLThweDsgbGVmdDogMTJweDsgZm9udC1zaXplOiAwLjZyZW07IHBhZGRpbmc6IDFweCA4cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogcmdiYSgxNDIsNjgsMTczLDAuMyk7IGNvbG9yOiAjZDRhNWZmOyBmb250LXdlaWdodDogNjAwOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBsZXR0ZXItc3BhY2luZzogMC41cHg7JztcbiAgICAgICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gcmVjaXBlSWQucmVwbGFjZSgvLS9nLCAnICcpO1xuICAgICAgICAgICAgY2FyZC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgICBjYXJkLmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT0gUkVDSVBFIE1BTkFHRU1FTlQgQUNUSU9OUyA9PT1cbiAgd2luZG93Lm1hbmFnZVJlY2lwZSA9IGFzeW5jIGZ1bmN0aW9uKHJlY2lwZUlkLCBhY3Rpb24pIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IGAvYXBpL3YxL3JlY2lwZXMvJHtyZWNpcGVJZH0vJHthY3Rpb259YDtcbiAgICBjb25zdCBtZXRob2QgPSBhY3Rpb24gPT09ICdyZW1vdmUnID8gJ0RFTEVURScgOiAnUE9TVCc7XG4gICAgY29uc3QgdXJsID0gYWN0aW9uID09PSAncmVtb3ZlJyA/IGAvYXBpL3YxL3JlY2lwZXMvJHtyZWNpcGVJZH1gIDogZW5kcG9pbnQ7XG5cbiAgICBpZiAoYWN0aW9uID09PSAncmVtb3ZlJyAmJiAhY29uZmlybShgUmVtb3ZlIHRoZSBlbnRpcmUgJHtyZWNpcGVJZH0gcmVjaXBlPyBUaGlzIHdpbGwgZGVsZXRlIGFsbCBjb250YWluZXJzIGFuZCBjb25maWd1cmF0aW9uLmApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwsIHsgbWV0aG9kIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBSZWNpcGUgJHthY3Rpb259OiAke2RhdGEucmVzdWx0cz8uZmlsdGVyKHIgPT4gci5zdGF0dXMgIT09ICdmYWlsZWQnKS5sZW5ndGggfHwgMH0gY29tcG9uZW50cyBwcm9jZXNzZWRgLCAnc3VjY2VzcycsIDQwMDApO1xuICAgICAgICBpZiAod2luZG93LmxvYWRTZXJ2aWNlcykgd2luZG93LmxvYWRTZXJ2aWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVjaXBlICR7YWN0aW9ufSBmYWlsZWQ6ICR7ZGF0YS5lcnJvcn1gLCAnZXJyb3InLCA1MDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBOZXR3b3JrIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InLCA1MDAwKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09IElOSkVDVCBDU1MgPT09XG4gIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgLnJlY2lwZS1zdGVwIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiA4cHggNHB4O1xuICAgICAgZm9udC1zaXplOiAwLjc4cmVtO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XG4gICAgfVxuICAgIC5yZWNpcGUtc3RlcCBzcGFuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXIpO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgIH1cbiAgICAucmVjaXBlLXN0ZXAuYWN0aXZlIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tYWNjZW50KTtcbiAgICB9XG4gICAgLnJlY2lwZS1zdGVwLmFjdGl2ZSBzcGFuIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7XG4gICAgICBjb2xvcjogI2ZmZjtcbiAgICB9XG4gICAgLnJlY2lwZS1zdGVwLmNvbXBsZXRlZCB7XG4gICAgICBjb2xvcjogdmFyKC0tb2stZmcpO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tb2stZmcpO1xuICAgIH1cbiAgICAucmVjaXBlLXN0ZXAuY29tcGxldGVkIHNwYW4ge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tb2stZmcpO1xuICAgICAgY29sb3I6ICNmZmY7XG4gICAgfVxuICAgIC5yZWNpcGUtc3RlcC1wYW5lbCB7XG4gICAgICBtaW4taGVpZ2h0OiAxODBweDtcbiAgICB9XG4gIGA7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXG4gIC8vID09PSBJTklUID09PVxuICAvLyBQcmUtZmV0Y2ggcHJlbWl1bSBzdGF0dXMgb24gbG9hZFxuICBjaGVja1JlY2lwZVByZW1pdW0oKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENBRERZIFJFTE9BRCBCVVRUT04gPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBSZWxvYWQgQ2FkZHkgYnV0dG9uIGhhbmRsZXJcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidXR0b24udGV4dENvbnRlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1MjNGMyBSZWxvYWRpbmcuLi4nO1xuICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jYWRkeS9yZWxvYWQnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rICYmIHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTI3MDUgUmVsb2FkZWQhJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB9LCAyMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgJ1JlbG9hZCBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1Mjc0QyBGYWlsZWQnO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIHJlbG9hZCBDYWRkeTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9LCAyMDAwKTtcbiAgICB9XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gRVJST1IgTE9HIFZJRVdFUiAoREMtMDUyKSA9PT09PT09PT09XG4vLyBEQy0wNTI6IEFkZHMgTGV2ZWwgLyBDb250ZXh0IC8gU2VhcmNoIC8gVGltZS1yYW5nZSBmaWx0ZXJzLCBzZXJ2ZXItc2lkZVxuLy8gcGFnaW5hdGlvbiB3aXRoIExvYWQgTW9yZSwgY2xpY2stdG8tZXhwYW5kIHN0YWNrIGZyYW1lcywgYW5kIGEgZGlzdGluY3Rcbi8vIGNvbnRleHRzIGRyb3Bkb3duIGJhY2tlZCBieSAvYXBpL3YxL2Vycm9yLWxvZ3MvY29udGV4dHMuIE1pcnJvcnMgdGhlXG4vLyBhdWRpdC1sb2cgVVggKERDLTA1MCkgc28gb3BlcmF0b3JzIGNhbiBkcmlsbCBpbnRvIGEgc3Vic3lzdGVtIGFzIGVhc2lseVxuLy8gYXMgdGhleSBjYW4gYXVkaXQgd2hvLWRpZC13aGF0LlxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTC4gU2FtZSB3ZWF0aGVyLW1vZGFsIHNoZWxsIGFzIGF1ZGl0LWxvZyBzbyBzdHlsZXNcbiAgLy8gYXJlIHNoYXJlZDsgd2lkZXIgbWluLXdpZHRoIGJlY2F1c2UgZXJyb3Igc3RhY2tzIG5lZWQgcm9vbSB0byBicmVhdGhlLlxuICBpbmplY3RNb2RhbCgnZXJyb3ItbG9nLW1vZGFsJywgYDxkaXYgaWQ9XCJlcnJvci1sb2ctbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDk1MHB4OyBtYXgtd2lkdGg6IDExNTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQ0IgRXJyb3IgTG9nczwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIEVycm9ycyBhbmQgd2FybmluZ3MgZnJvbSB0aGUgRGFzaENhZGR5IEFQSS4gQ2xpY2sgYSByb3cgdG8gc2VlIHRoZSBmdWxsIHN0YWNrIHRyYWNlLlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBmbGV4LXdyYXA6IHdyYXA7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5MZXZlbDo8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwiZXJyb3ItbG9nLWxldmVsXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkVSUlwiPkVycm9yczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJXQVJOXCI+V2FybmluZ3M8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiSU5GT1wiPkluZm88L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiREVCVUdcIj5EZWJ1Zzwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkNvbnRleHQ6PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cImVycm9yLWxvZy1jb250ZXh0XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTsgbWF4LXdpZHRoOiAyMjBweDtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogOHB4O1wiPlNlYXJjaDo8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJlcnJvci1sb2ctc2VhcmNoXCIgdHlwZT1cInNlYXJjaFwiIHBsYWNlaG9sZGVyPVwibWVzc2FnZSAvIHN0YWNrIC8gaXBcIiBzdHlsZT1cInBhZGRpbmc6IDVweCA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODJyZW07IG1pbi13aWR0aDogMTgwcHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA4cHg7XCI+U2luY2U6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiZXJyb3ItbG9nLXNpbmNlXCIgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+VW50aWw6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiZXJyb3ItbG9nLXVudGlsXCIgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXJyb3ItbG9nLXJlZnJlc2hcIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj48L3NwYW4+XG4gICAgICAgIDxidXR0b24gaWQ9XCJlcnJvci1sb2ctY2xlYXJcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMnB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGJvcmRlci1jb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cdUQ4M0RcdURERDFcdUZFMEYgQ2xlYXIgTG9nPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImVycm9yLWxvZy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGVycm9yIGxvZ3MuLi48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXJyb3ItbG9nLWxvYWQtbW9yZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogNnB4IDE2cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPkxvYWQgTW9yZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwiZXJyb3ItbG9nLXRvdGFsXCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXJyb3ItbG9nLWNsb3NlXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctbW9kYWwnKTtcbiAgY29uc3Qgdmlld0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3LWVycm9yLWxvZ3MnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctcmVmcmVzaCcpO1xuICBjb25zdCBjbGVhckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctY2xlYXInKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLWNsb3NlJyk7XG4gIGNvbnN0IGxldmVsU2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1sZXZlbCcpO1xuICBjb25zdCBjb250ZXh0U2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1jb250ZXh0Jyk7XG4gIGNvbnN0IHNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1zZWFyY2gnKTtcbiAgY29uc3Qgc2luY2VJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctc2luY2UnKTtcbiAgY29uc3QgdW50aWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctdW50aWwnKTtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1jb250YWluZXInKTtcbiAgY29uc3QgbG9hZE1vcmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLWxvYWQtbW9yZScpO1xuICBjb25zdCB0b3RhbFNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLXRvdGFsJyk7XG5cbiAgY29uc3QgUEFHRV9TSVpFID0gNTA7XG4gIGxldCBjdXJyZW50T2Zmc2V0ID0gMDtcbiAgbGV0IGluZmxpZ2h0ID0gbnVsbDtcbiAgbGV0IGZpbHRlck5vbmNlID0gMDtcbiAgLy8gQ2FjaGVkIGRpc3RpbmN0IGNvbnRleHRzIHNvIHRoZSBkcm9wZG93biBpcyBwb3B1bGF0ZWQgb25jZSBwZXIgb3BlbiBhbmRcbiAgLy8gcmUtcG9wdWxhdGVkIGFmdGVyIGEgY2xlYXIgKHdoaWNoIHJlbW92ZXMgYWxsIGNvbnRleHRzKSBvciBhIHJlZnJlc2hcbiAgLy8gdGhhdCBzdXJmYWNlcyBhIG5ldyBzdWJzeXN0ZW0gZm9yIHRoZSBmaXJzdCB0aW1lLlxuICBsZXQga25vd25Db250ZXh0cyA9IFtdO1xuXG4gIC8vIGRhdGV0aW1lLWxvY2FsIGZpZWxkcyBhcmUgbmFpdmUgbG9jYWwgdGltZSBcdTIwMTQgY29udmVydCB0byBVVEMgSVNPIHNvIHRoZVxuICAvLyBzZXJ2ZXIgY29tcGFyZXMgY29ycmVjdGx5LiBTYW1lIHNoYXBlIGFzIGF1ZGl0LWxvZy5qcyBzbyB0aGUgb3BlcmF0b3JcbiAgLy8gc2VlcyBjb25zaXN0ZW50IGJlaGF2aW91ciBiZXR3ZWVuIHRoZSB0d28gbW9kYWxzLlxuICBmdW5jdGlvbiB0b0lzbyhsb2NhbER0VmFsdWUpIHtcbiAgICBpZiAoIWxvY2FsRHRWYWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGxvY2FsRHRWYWx1ZSk7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKTtcbiAgfVxuXG4gIC8vIFB1bGwgdGhlIGRpc3RpbmN0IGNvbnRleHRzIGxpc3Qgb25jZSBwZXIgb3Blbi4gRmFpbHVyZXMgYXJlIHNpbGVudFxuICAvLyAodGhlIGRyb3Bkb3duIHdpbGwganVzdCBzaG93IFwiQWxsXCIgb25seSkgc28gYSB0cmFuc2llbnQgYmFja2VuZCBoaWNjdXBcbiAgLy8gZG9lc24ndCBibG9jayB0aGUgb3BlcmF0b3IgZnJvbSBzZWVpbmcgdGhlIGFjdHVhbCBlcnJvciByb3dzLlxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoQ29udGV4dHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Vycm9yLWxvZ3MvY29udGV4dHMnKTtcbiAgICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFBcnJheS5pc0FycmF5KGRhdGEuY29udGV4dHMpKSByZXR1cm47XG4gICAgICBrbm93bkNvbnRleHRzID0gZGF0YS5jb250ZXh0cztcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbnRleHRTZWwudmFsdWU7XG4gICAgICBjb250ZXh0U2VsLmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+JztcbiAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhLmNvbnRleHRzKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQudmFsdWUgPSBjLm5hbWU7XG4gICAgICAgIG9wdC50ZXh0Q29udGVudCA9IGAke2MubmFtZX0gKCR7Yy5jb3VudH0pYDtcbiAgICAgICAgY29udGV4dFNlbC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgfVxuICAgICAgLy8gUmVzdG9yZSBwcmV2aW91cyBzZWxlY3Rpb24gaWYgc3RpbGwgcHJlc2VudC5cbiAgICAgIGlmIChjdXJyZW50VmFsdWUgJiYgZGF0YS5jb250ZXh0cy5zb21lKChjKSA9PiBjLm5hbWUgPT09IGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgY29udGV4dFNlbC52YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkUXVlcnkoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKFBBR0VfU0laRSkpO1xuICAgIHBhcmFtcy5zZXQoJ29mZnNldCcsIFN0cmluZyhjdXJyZW50T2Zmc2V0KSk7XG4gICAgaWYgKGxldmVsU2VsLnZhbHVlKSBwYXJhbXMuc2V0KCdsZXZlbCcsIGxldmVsU2VsLnZhbHVlKTtcbiAgICBpZiAoY29udGV4dFNlbC52YWx1ZSkgcGFyYW1zLnNldCgnY29udGV4dCcsIGNvbnRleHRTZWwudmFsdWUpO1xuICAgIGNvbnN0IHNpbmNlID0gdG9Jc28oc2luY2VJbnB1dC52YWx1ZSk7XG4gICAgY29uc3QgdW50aWwgPSB0b0lzbyh1bnRpbElucHV0LnZhbHVlKTtcbiAgICBpZiAoc2luY2UpIHBhcmFtcy5zZXQoJ3NpbmNlJywgc2luY2UpO1xuICAgIGlmICh1bnRpbCkgcGFyYW1zLnNldCgndW50aWwnLCB1bnRpbCk7XG4gICAgY29uc3Qgc2VhcmNoID0gKHNlYXJjaElucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgaWYgKHNlYXJjaCkgcGFyYW1zLnNldCgnc2VhcmNoJywgc2VhcmNoKTtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZExvZ3MoYXBwZW5kKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIGlmIChpbmZsaWdodCkgaW5mbGlnaHQuYWJvcnQoKTtcbiAgICAgICAgaW5mbGlnaHQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGN1cnJlbnRPZmZzZXQgPSAwO1xuICAgICAgICBmaWx0ZXJOb25jZSsrO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5mbGlnaHQpIGluZmxpZ2h0LmFib3J0KCk7XG4gICAgICAgIGluZmxpZ2h0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgfVxuICAgICAgY29uc3QgbXlOb25jZSA9IGZpbHRlck5vbmNlO1xuICAgICAgY29uc3QgcGFyYW1zID0gYnVpbGRRdWVyeSgpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9lcnJvci1sb2dzPycgKyBwYXJhbXMudG9TdHJpbmcoKSwge1xuICAgICAgICBzaWduYWw6IGluZmxpZ2h0LnNpZ25hbCxcbiAgICAgIH0pO1xuICAgICAgLy8gTWlycm9yIGF1ZGl0LWxvZzogc3VyZmFjZSA0eHgvNXh4IGV4cGxpY2l0bHkgaW5zdGVhZCBvZiBmYWxsaW5nXG4gICAgICAvLyB0aHJvdWdoIHRvIGEgbWlzbGVhZGluZyBcIm5vIGVudHJpZXMgeWV0XCIgZW1wdHkgc3RhdGUuXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiBIVFRQICR7cmVzLnN0YXR1c308L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0b3RhbFNwYW4udGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZGF0YS5lcnJvciB8fCAndW5rbm93bicpfTwvZGl2PmA7XG4gICAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHRvdGFsU3Bhbi50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTdGFsZS1yZXNwb25zZSBndWFyZDogYSBub24tYXBwZW5kIGxvYWQgaGFwcGVuZWQgYWZ0ZXIgdGhpcyBmZXRjaCxcbiAgICAgIC8vIGRpc2NhcmQgc28gd2UgZG9uJ3Qgc3BsaWNlIGludG8gdGhlIHdyb25nIERPTS5cbiAgICAgIGlmICghYXBwZW5kICYmIG15Tm9uY2UgIT09IGZpbHRlck5vbmNlKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGxvZ3MgPSBBcnJheS5pc0FycmF5KGRhdGEubG9ncykgPyBkYXRhLmxvZ3MgOiBbXTtcbiAgICAgIGlmIChsb2dzLmxlbmd0aCA9PT0gMCAmJiAhYXBwZW5kKSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IChkYXRhLmZpbHRlcnMgJiYgKGRhdGEuZmlsdGVycy5sZXZlbCB8fCBkYXRhLmZpbHRlcnMuY29udGV4dCB8fCBkYXRhLmZpbHRlcnMuc2VhcmNoIHx8IGRhdGEuZmlsdGVycy5zaW5jZSB8fCBkYXRhLmZpbHRlcnMudW50aWwpKVxuICAgICAgICAgID8gJ05vIGVycm9yIGxvZyBlbnRyaWVzIG1hdGNoIHlvdXIgZmlsdGVycy4nXG4gICAgICAgICAgOiAnXHUyNzA1IE5vIGVycm9ycyBsb2dnZWQhIEV2ZXJ5dGhpbmcgaXMgd29ya2luZyBzbW9vdGhseS4nO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQjwvc3Bhbj4ke2VzY2FwZUh0bWwocmVhc29uKX08L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0b3RhbFNwYW4udGV4dENvbnRlbnQgPSBkYXRhLnRvdGFsID8gYCR7ZGF0YS50b3RhbH0gdG90YWxgIDogJyc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxNjBweDtcIj5XaGVuPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiA4MHB4O1wiPkxldmVsPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxNDBweDtcIj5Db250ZXh0PC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+TWVzc2FnZTwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDogMTEwcHg7XCI+SVA8L3RoPic7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsb2cgb2YgbG9ncykge1xuICAgICAgICBjb25zdCBsZXZlbCA9IChsb2cubGV2ZWwgfHwgJz8nKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBjb25zdCBsZXZlbENvbG9yID0gbGV2ZWwgPT09ICdFUlInID8gJ3ZhcigtLWJhZC1mZyknIDogKGxldmVsID09PSAnV0FSTicgPyAndmFyKC0td2Fybi1mZywgI2YwYzY3NCknIDogJ3ZhcigtLW11dGVkKScpO1xuICAgICAgICBjb25zdCB0cyA9IGxvZy50aW1lc3RhbXAgPyBuZXcgRGF0ZShsb2cudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpIDogJ1x1MjAxNCc7XG4gICAgICAgIGNvbnN0IGN0eCA9IGxvZy5jb250ZXh0IHx8ICdcdTIwMTQnO1xuICAgICAgICBjb25zdCBtc2cgPSAobG9nLmVycm9yIHx8ICcnKS5zcGxpdCgnXFxuJylbMF07XG4gICAgICAgIGNvbnN0IGlwID0gKGxvZy5yZXF1ZXN0ICYmIGxvZy5yZXF1ZXN0LmlwKSB8fCAnJztcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjtcIiBjbGFzcz1cImVycm9yLWxvZy1yb3dcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwobG9nLnRpbWVzdGFtcCB8fCAnJyl9XCI+JHtlc2NhcGVIdG1sKHRzKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiAke2xldmVsQ29sb3J9OyBmb250LXdlaWdodDogNjAwO1wiPiR7ZXNjYXBlSHRtbChsZXZlbCl9PC9zcGFuPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuNzhyZW07XCI+JHtlc2NhcGVIdG1sKGN0eCl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtlc2NhcGVIdG1sKG1zZyl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC43OHJlbTtcIj4ke2VzY2FwZUh0bWwoaXApfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICBpZiAobG9nLmRldGFpbCkge1xuICAgICAgICAgIGh0bWwgKz0gYDx0ciBjbGFzcz1cImVycm9yLWxvZy1kZXRhaWxcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PHRkIGNvbHNwYW49XCI1XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggNnB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48cHJlIHN0eWxlPVwibWFyZ2luOiAwOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IG1heC1oZWlnaHQ6IDMyMHB4OyBvdmVyZmxvdzogYXV0bztcIj4ke2VzY2FwZUh0bWwobG9nLmRldGFpbCl9PC9wcmU+PC90ZD48L3RyPmA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XG4gICAgICAgIGlmICh0YWJsZSkgdGFibGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudE9mZnNldCArPSBsb2dzLmxlbmd0aDtcbiAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSBkYXRhLmhhc01vcmUgPyAnJyA6ICdub25lJztcbiAgICAgIHRvdGFsU3Bhbi50ZXh0Q29udGVudCA9IGAke2RhdGEudG90YWx9IHRvdGFsJHtkYXRhLmhhc01vcmUgPyAnIChzaG93aW5nICcgKyBjdXJyZW50T2Zmc2V0ICsgJyknIDogJyd9YDtcblxuICAgICAgLy8gVG9nZ2xlIGRldGFpbCByb3dzIG9uIGNsaWNrIFx1MjAxNCBzYW1lIHBhdHRlcm4gYXMgYXVkaXQtbG9nLmpzXG4gICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmVycm9yLWxvZy1yb3cnKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgaWYgKHJvdy5kYXRhc2V0LndpcmVkKSByZXR1cm47XG4gICAgICAgIHJvdy5kYXRhc2V0LndpcmVkID0gJ3RydWUnO1xuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGV0YWlsID0gcm93Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICBpZiAoZGV0YWlsICYmIGRldGFpbC5jbGFzc0xpc3QuY29udGFpbnMoJ2Vycm9yLWxvZy1kZXRhaWwnKSkge1xuICAgICAgICAgICAgZGV0YWlsLnN0eWxlLmRpc3BsYXkgPSBkZXRhaWwuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJycgOiAnbm9uZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlICYmIGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgICAgdG90YWxTcGFuLnRleHRDb250ZW50ID0gJyc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xlYXJMb2dzKCkge1xuICAgIGlmICghY29uZmlybSgnQ2xlYXIgdGhlIGVudGlyZSBlcnJvciBsb2c/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9lcnJvci1sb2dzJywge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb25maXJtOiAnQ0xFQVInIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gQWZ0ZXIgYSBjbGVhciwgdGhlIGNvbnRleHRzIGxpc3Qgd2lsbCBiZSBlbXB0eSBcdTIwMTQgcmUtZmV0Y2ggc28gdGhlXG4gICAgICAgIC8vIGRyb3Bkb3duIHJlZmxlY3RzIHJlYWxpdHkuIExvYWQgdGhlIG5vdy1lbXB0eSBwYWdlIGluIHBhcmFsbGVsLlxuICAgICAgICBhd2FpdCByZWZyZXNoQ29udGV4dHMoKTtcbiAgICAgICAgbG9hZExvZ3MoZmFsc2UpO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdcdTI3MDUgRXJyb3IgbG9ncyBjbGVhcmVkJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1x1Mjc0QyAnICsgKGRhdGEuZXJyb3IgfHwgJ0NsZWFyIGZhaWxlZCcpLCAnZXJyb3InLCA0MDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdcdTI3NEMgJyArIGUubWVzc2FnZSwgJ2Vycm9yJywgNDAwMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVib3VuY2UgdGV4dC1pbnB1dCBjaGFuZ2VzIHNvIHdlIGRvbid0IHJlZmV0Y2ggb24gZXZlcnkga2V5c3Ryb2tlLlxuICBsZXQgc2VhcmNoRGVib3VuY2U7XG4gIGZ1bmN0aW9uIHdpcmVGaWx0ZXJzKCkge1xuICAgIGxldmVsU2VsPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiBsb2FkTG9ncyhmYWxzZSkpO1xuICAgIGNvbnRleHRTZWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IGxvYWRMb2dzKGZhbHNlKSk7XG4gICAgc2VhcmNoSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHNlYXJjaERlYm91bmNlKTtcbiAgICAgIHNlYXJjaERlYm91bmNlID0gc2V0VGltZW91dCgoKSA9PiBsb2FkTG9ncyhmYWxzZSksIDI1MCk7XG4gICAgfSk7XG4gICAgbGV0IGRhdGVEZWJvdW5jZTtcbiAgICBbc2luY2VJbnB1dCwgdW50aWxJbnB1dF0uZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dChkYXRlRGVib3VuY2UpO1xuICAgICAgICBkYXRlRGVib3VuY2UgPSBzZXRUaW1lb3V0KCgpID0+IGxvYWRMb2dzKGZhbHNlKSwgMjUwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbG9hZExvZ3MoZmFsc2UpKTtcbiAgICBsb2FkTW9yZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBsb2FkTG9ncyh0cnVlKSk7XG4gICAgY2xlYXJCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xlYXJMb2dzKTtcbiAgICB3aXJlTW9kYWwobW9kYWwsIGNsb3NlQnRuKTtcbiAgfVxuXG4gIHZpZXdCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgYXdhaXQgcmVmcmVzaENvbnRleHRzKCk7XG4gICAgbG9hZExvZ3MoZmFsc2UpO1xuICB9KTtcbiAgd2lyZUZpbHRlcnMoKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENPTlRBSU5FUiBMT0cgVklFV0VSID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2NvbnRhaW5lci1sb2dzLW1vZGFsJywgYDxkaXYgaWQ9XCJjb250YWluZXItbG9ncy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiIHN0eWxlPVwiei1pbmRleDogMTAwMTtcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDkwMHB4OyBtYXgtd2lkdGg6IDk1dnc7IGhlaWdodDogODB2aDsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWhlYWRlclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBwYWRkaW5nLWJvdHRvbTogMTJweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwO1wiPlx1RDgzRFx1RENEQyBDb250YWluZXIgTG9nczwvaDM+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOiA0cHggMCAwIDA7IGZvbnQtc2l6ZTogMC44NXJlbTsgb3BhY2l0eTogMC43O1wiPlZpZXcgYW5kIHN0cmVhbSBEb2NrZXIgY29udGFpbmVyIGxvZ3M8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9ncy1jb250cm9sc1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImNsLWNvbnRhaW5lci1zZWxlY3RcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgbWluLXdpZHRoOiAyMDBweDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgYSBjb250YWluZXIuLi48L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNsLWxvZy1zZWFyY2hcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBsb2dzLi4uXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IHdpZHRoOiAxNTBweDtcIiAvPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJjbC1sb2ctdGFpbFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjUwXCI+TGFzdCA1MCBsaW5lczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEwMFwiIHNlbGVjdGVkPkxhc3QgMTAwIGxpbmVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiNTAwXCI+TGFzdCA1MDAgbGluZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMDAwXCI+TGFzdCAxMDAwIGxpbmVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWxsXCI+QWxsIGxvZ3M8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY2wtcmVmcmVzaFwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjbC1zdHJlYW1cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XHUyNUI2IFN0cmVhbTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjbC1kb3dubG9hZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdURDQkUgRG93bmxvYWQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY2wtY2xlYXItc2VhcmNoXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiIHRpdGxlPVwiQ2xlYXIgc2VhcmNoXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNsLWNsb3NlXCIgY2xhc3M9XCJjbG9zZS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4O1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGlkPVwiY2wtY29udGFpbmVyLWluZm9cIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMTZweDsgbWFyZ2luLWJvdHRvbTogMTJweDsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWJnLXNlY29uZGFyeSwgdmFyKC0tYmcpKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODJyZW07XCI+XG4gICAgICAgIDxzcGFuPjxzdHJvbmc+SW1hZ2U6PC9zdHJvbmc+IDxzcGFuIGlkPVwiY2wtaW1hZ2VcIj4tPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+PHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IDxzcGFuIGlkPVwiY2wtc3RhdHVzXCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICAgIDxzcGFuPjxzdHJvbmc+Q3JlYXRlZDo8L3N0cm9uZz4gPHNwYW4gaWQ9XCJjbC1jcmVhdGVkXCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBpZD1cImNsLWxvZy1jb250ZW50XCIgY2xhc3M9XCJsb2dzLWNvbnRlbnQgc2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwiZmxleDogMTsgbWluLWhlaWdodDogMDsgYmFja2dyb3VuZDogIzFhMWExYTsgYm9yZGVyLXJhZGl1czogNnB4OyBwYWRkaW5nOiAxMnB4OyBmb250LWZhbWlseTogJ01vbmFjbycsICdNZW5sbycsICdVYnVudHUgTW9ubycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjc4cmVtOyBvdmVyZmxvdzogYXV0bztcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGxvZ3M8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGlkPVwiY2wtc3RyZWFtLXN0YXR1c1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLW9rLWJnLCAjMWEzYTFhKTsgY29sb3I6IHZhcigtLW9rLWZnLCAjNGFkZTgwKTsgYm9yZGVyLXJhZGl1czogNnB4OyBtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJjbC1zdHJlYW0taW5kaWNhdG9yXCI+XHVEODNEXHVERDM0PC9zcGFuPiA8c3BhbiBpZD1cImNsLXN0cmVhbS10ZXh0XCI+RGlzY29ubmVjdGVkPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICA8c3BhbiBpZD1cImNsLWxpbmUtY291bnRcIj4wIGxpbmVzPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnw8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJjbC1maWx0ZXItY291bnRcIj4wIGZpbHRlcmVkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsLWNsb3NlLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyLWxvZ3MtbW9kYWwnKTtcbiAgY29uc3QgY29udGFpbmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbnRhaW5lci1zZWxlY3QnKTtcbiAgY29uc3QgbG9nQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sb2ctY29udGVudCcpO1xuICBjb25zdCBsb2dTZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtbG9nLXNlYXJjaCcpO1xuICBjb25zdCBsb2dUYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxvZy10YWlsJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtcmVmcmVzaCcpO1xuICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtc3RyZWFtJyk7XG4gIGNvbnN0IGRvd25sb2FkQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWRvd25sb2FkJyk7XG4gIGNvbnN0IGNsZWFyU2VhcmNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNsZWFyLXNlYXJjaCcpO1xuICBjb25zdCBjbG9zZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jbG9zZScpO1xuICBjb25zdCBjbG9zZUJ0bjIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY2xvc2UtYnRuJyk7XG4gIGNvbnN0IHN0cmVhbVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zdHJlYW0tc3RhdHVzJyk7XG4gIGNvbnN0IHN0cmVhbUluZGljYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zdHJlYW0taW5kaWNhdG9yJyk7XG4gIGNvbnN0IHN0cmVhbVRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtc3RyZWFtLXRleHQnKTtcbiAgY29uc3QgbGluZUNvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxpbmUtY291bnQnKTtcbiAgY29uc3QgZmlsdGVyQ291bnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtZmlsdGVyLWNvdW50Jyk7XG4gIFxuICAvLyBDb250YWluZXIgaW5mbyBlbGVtZW50c1xuICBjb25zdCBpbWFnZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWltYWdlJyk7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXN0YXR1cycpO1xuICBjb25zdCBjcmVhdGVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY3JlYXRlZCcpO1xuXG4gIGxldCBjdXJyZW50Q29udGFpbmVySWQgPSBudWxsO1xuICBsZXQgY3VycmVudExvZ3MgPSBbXTtcbiAgbGV0IGZpbHRlcmVkTG9ncyA9IFtdO1xuICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuICBsZXQgaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgbGV0IHNlYXJjaFRpbWVvdXQgPSBudWxsO1xuXG4gIC8vIEZvcm1hdCBkYXRlXG4gIGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZVN0cikge1xuICAgIGlmICghZGF0ZVN0cikgcmV0dXJuICctJztcbiAgICBjb25zdCBkID0gbmV3IERhdGUoZGF0ZVN0cik7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIGRhdGVTdHI7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoKTtcbiAgfVxuXG4gIC8vIEVzY2FwZSBIVE1MXG4gIGZ1bmN0aW9uIGVzY2FwZUh0bWwoc3RyKSB7XG4gICAgaWYgKCFzdHIpIHJldHVybiAnJztcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBzdHI7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICAvLyBGb3JtYXQgbG9nIGVudHJ5IGZvciBkaXNwbGF5XG4gIGZ1bmN0aW9uIGZvcm1hdExvZ0VudHJ5KGxvZywgaW5kZXgpIHtcbiAgICBjb25zdCBzdHJlYW1DbGFzcyA9IGxvZy5zdHJlYW0gPT09ICdzdGRlcnInID8gJ2xvZy1zdGRlcnInIDogJ2xvZy1zdGRvdXQnO1xuICAgIGNvbnN0IHN0cmVhbUljb24gPSBsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICdcdTI2QTBcdUZFMEYnIDogJ1x1RDgzRFx1RENFNCc7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJsb2ctZW50cnkgJHtzdHJlYW1DbGFzc31cIiBkYXRhLWluZGV4PVwiJHtpbmRleH1cIiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzMzOyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctbGluZS1udW1cIiBzdHlsZT1cImNvbG9yOiAjNjY2OyBtaW4td2lkdGg6IDQwcHg7IHRleHQtYWxpZ246IHJpZ2h0OyB1c2VyLXNlbGVjdDogbm9uZTtcIj4ke2luZGV4ICsgMX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLXN0cmVhbS1pY29uXCIgc3R5bGU9XCJjb2xvcjogJHtsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICcjZjU5ZTBiJyA6ICcjMjJjNTVlJ307XCI+JHtzdHJlYW1JY29ufTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctdGV4dFwiIHN0eWxlPVwiZmxleDogMTsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB3b3JkLWJyZWFrOiBicmVhay1hbGw7IGNvbG9yOiAjZTVlNWU1O1wiPiR7ZXNjYXBlSHRtbChsb2cudGV4dCl9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8vIFJlbmRlciBsb2dzIHRvIHRoZSBjb250ZW50IGFyZWFcbiAgZnVuY3Rpb24gcmVuZGVyTG9ncyhsb2dzLCBzZWFyY2hUZXJtID0gJycpIHtcbiAgICBpZiAoIWxvZ3MgfHwgbG9ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5ObyBsb2dzIGF2YWlsYWJsZTwvZGl2Pic7XG4gICAgICBsaW5lQ291bnQudGV4dENvbnRlbnQgPSAnMCBsaW5lcyc7XG4gICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9ICcwIGZpbHRlcmVkJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjdXJyZW50TG9ncyA9IGxvZ3M7XG4gICAgZmlsdGVyZWRMb2dzID0gc2VhcmNoVGVybSA/IGxvZ3MuZmlsdGVyKGxvZyA9PiBcbiAgICAgIGxvZy50ZXh0ICYmIGxvZy50ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKVxuICAgICkgOiBsb2dzO1xuXG4gICAgbGluZUNvdW50LnRleHRDb250ZW50ID0gYCR7bG9ncy5sZW5ndGh9IGxpbmVzYDtcbiAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9IHNlYXJjaFRlcm0gPyBgJHtmaWx0ZXJlZExvZ3MubGVuZ3RofSBvZiAke2xvZ3MubGVuZ3RofSBzaG93bmAgOiBgJHtsb2dzLmxlbmd0aH0gc2hvd25gO1xuXG4gICAgaWYgKGZpbHRlcmVkTG9ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5ObyBsb2dzIG1hdGNoIFwiJHtlc2NhcGVIdG1sKHNlYXJjaFRlcm0pfVwiPC9kaXY+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dDb250ZW50LmlubmVySFRNTCA9IGZpbHRlcmVkTG9ncy5tYXAoKGxvZywgaSkgPT4gZm9ybWF0TG9nRW50cnkobG9nLCBpKSkuam9pbignJyk7XG4gICAgXG4gICAgLy8gU2Nyb2xsIHRvIGJvdHRvbVxuICAgIGxvZ0NvbnRlbnQuc2Nyb2xsVG9wID0gbG9nQ29udGVudC5zY3JvbGxIZWlnaHQ7XG4gIH1cblxuICAvLyBMb2FkIGNvbnRhaW5lciBsaXN0XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRDb250YWluZXJzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0SlNPTignL2FwaS92MS9sb2dzL2NvbnRhaW5lcnMnKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBkYXRhLmNvbnRhaW5lcnMgfHwgW107XG4gICAgICBcbiAgICAgIC8vIFN0b3JlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICBjb25zdCBjdXJyZW50VmFsID0gY29udGFpbmVyU2VsZWN0LnZhbHVlO1xuICAgICAgXG4gICAgICBjb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgYSBjb250YWluZXIuLi48L29wdGlvbj4nO1xuICAgICAgXG4gICAgICBjb250YWluZXJzLmZvckVhY2goYyA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHRpb24udmFsdWUgPSBjLmlkO1xuICAgICAgICBvcHRpb24udGV4dENvbnRlbnQgPSBgJHtjLm5hbWV9ICgke2MuaW1hZ2Uuc3BsaXQoJzonKVswXX0pIC0gJHtjLnN0YXR1c31gO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5uYW1lID0gYy5uYW1lO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5pbWFnZSA9IGMuaW1hZ2U7XG4gICAgICAgIG9wdGlvbi5kYXRhc2V0LnN0YXR1cyA9IGMuc3RhdHVzO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5jcmVhdGVkID0gYy5jcmVhdGVkO1xuICAgICAgICBjb250YWluZXJTZWxlY3QuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXN0b3JlIHNlbGVjdGlvbiBpZiBzdGlsbCB2YWxpZFxuICAgICAgaWYgKGN1cnJlbnRWYWwgJiYgY29udGFpbmVyU2VsZWN0LnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7Y3VycmVudFZhbH1cIl1gKSkge1xuICAgICAgICBjb250YWluZXJTZWxlY3QudmFsdWUgPSBjdXJyZW50VmFsO1xuICAgICAgICBsb2FkQ29udGFpbmVySW5mbyhjdXJyZW50VmFsKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGNvbnRhaW5lcnM6JywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvLyBMb2FkIGNvbnRhaW5lciBpbmZvXG4gIGZ1bmN0aW9uIGxvYWRDb250YWluZXJJbmZvKGNvbnRhaW5lcklkKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gY29udGFpbmVyU2VsZWN0LnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7Y29udGFpbmVySWR9XCJdYCk7XG4gICAgaWYgKG9wdGlvbikge1xuICAgICAgaW1hZ2VFbC50ZXh0Q29udGVudCA9IG9wdGlvbi5kYXRhc2V0LmltYWdlIHx8ICctJztcbiAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gb3B0aW9uLmRhdGFzZXQuc3RhdHVzIHx8ICctJztcbiAgICAgIHN0YXR1c0VsLnN0eWxlLmNvbG9yID0gb3B0aW9uLmRhdGFzZXQuc3RhdHVzID09PSAncnVubmluZycgPyAndmFyKC0tb2stZmcsICM0YWRlODApJyA6ICd2YXIoLS1iYWQtZmcsICNlZjQ0NDQpJztcbiAgICAgIGNyZWF0ZWRFbC50ZXh0Q29udGVudCA9IGZvcm1hdERhdGUob3B0aW9uLmRhdGFzZXQuY3JlYXRlZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTG9hZCBsb2dzIGZvciBzZWxlY3RlZCBjb250YWluZXJcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZExvZ3MoKSB7XG4gICAgY29uc3QgY29udGFpbmVySWQgPSBjb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgaWYgKCFjb250YWluZXJJZCkge1xuICAgICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGxvZ3M8L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIHN0cmVhbVxuICAgIHN0b3BTdHJlYW0oKTtcblxuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IGNvbnRhaW5lcklkO1xuICAgIGxvYWRDb250YWluZXJJbmZvKGNvbnRhaW5lcklkKTtcblxuICAgIGNvbnN0IHRhaWwgPSBsb2dUYWlsLnZhbHVlO1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSBsb2dTZWFyY2gudmFsdWUudHJpbSgpO1xuXG4gICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPkxvYWRpbmcgbG9ncy4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gYC9hcGkvdjEvbG9ncy9jb250YWluZXIvJHtjb250YWluZXJJZH0ke3RhaWwgIT09ICdhbGwnID8gYD90YWlsPSR7dGFpbH1gIDogJyd9YDtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRKU09OKHVybCk7XG5cbiAgICAgIGlmIChkYXRhLmxvZ3MgJiYgZGF0YS5sb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVuZGVyTG9ncyhkYXRhLmxvZ3MsIHNlYXJjaFRlcm0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPk5vIGxvZ3MgZm91bmQgZm9yIHRoaXMgY29udGFpbmVyPC9kaXY+JztcbiAgICAgICAgbGluZUNvdW50LnRleHRDb250ZW50ID0gJzAgbGluZXMnO1xuICAgICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9ICcwIGZpbHRlcmVkJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+RXJyb3IgbG9hZGluZyBsb2dzOiAke2VzY2FwZUh0bWwoZXJyLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RhcnQgc3RyZWFtaW5nIGxvZ3NcbiAgZnVuY3Rpb24gc3RhcnRTdHJlYW0oKSB7XG4gICAgY29uc3QgY29udGFpbmVySWQgPSBjb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgaWYgKCFjb250YWluZXJJZCkgcmV0dXJuO1xuXG4gICAgLy8gU3RvcCBhbnkgZXhpc3Rpbmcgc3RyZWFtXG4gICAgc3RvcFN0cmVhbSgpO1xuXG4gICAgaXNTdHJlYW1pbmcgPSB0cnVlO1xuICAgIHN0cmVhbUJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjkgU3RvcCc7XG4gICAgc3RyZWFtU3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REZFMic7XG4gICAgc3RyZWFtVGV4dC50ZXh0Q29udGVudCA9ICdDb25uZWN0aW5nLi4uJztcblxuICAgIGNvbnN0IHVybCA9IGAvYXBpL3YxL2xvZ3Mvc3RyZWFtLyR7Y29udGFpbmVySWR9YDtcbiAgICBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gKCkgPT4ge1xuICAgICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REZFMic7XG4gICAgICBzdHJlYW1UZXh0LnRleHRDb250ZW50ID0gJ0Nvbm5lY3RlZCAtIHN0cmVhbWluZyBsb2dzJztcbiAgICB9O1xuXG4gICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBsb2cgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGxvZy5lcnJvcikge1xuICAgICAgICAgIHN0cmVhbUluZGljYXRvci50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMzQnO1xuICAgICAgICAgIHN0cmVhbVRleHQudGV4dENvbnRlbnQgPSBgRXJyb3I6ICR7bG9nLmVycm9yfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIGN1cnJlbnQgbG9nc1xuICAgICAgICBjdXJyZW50TG9ncy5wdXNoKGxvZyk7XG4gICAgICAgIGZpbHRlcmVkTG9ncy5wdXNoKGxvZyk7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgY291bnRzXG4gICAgICAgIGxpbmVDb3VudC50ZXh0Q29udGVudCA9IGAke2N1cnJlbnRMb2dzLmxlbmd0aH0gbGluZXNgO1xuICAgICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9IGAke2ZpbHRlcmVkTG9ncy5sZW5ndGh9IHNob3duYDtcbiAgICAgICAgXG4gICAgICAgIC8vIEFwcGVuZCBuZXcgbG9nIGVudHJ5XG4gICAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSBsb2dTZWFyY2gudmFsdWUudHJpbSgpO1xuICAgICAgICBpZiAoIXNlYXJjaFRlcm0gfHwgKGxvZy50ZXh0ICYmIGxvZy50ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKSkpIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIGVudHJ5LmlubmVySFRNTCA9IGZvcm1hdExvZ0VudHJ5KGxvZywgZmlsdGVyZWRMb2dzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgIGNvbnN0IGVudHJ5RGl2ID0gZW50cnkuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgZW50cnlEaXYuc3R5bGUuYmFja2dyb3VuZCA9ICcjMWEzYTFhJztcbiAgICAgICAgICBsb2dDb250ZW50LmFwcGVuZENoaWxkKGVudHJ5RGl2KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBBdXRvLXNjcm9sbCB0byBib3R0b21cbiAgICAgICAgICBsb2dDb250ZW50LnNjcm9sbFRvcCA9IGxvZ0NvbnRlbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgbG9nOicsIGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REQzNCc7XG4gICAgICBzdHJlYW1UZXh0LnRleHRDb250ZW50ID0gJ0Rpc2Nvbm5lY3RlZCc7XG4gICAgICBpc1N0cmVhbWluZyA9IGZhbHNlO1xuICAgICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1MjVCNiBTdHJlYW0nO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSB0aGUgRXZlbnRTb3VyY2UgZm9yIGNsZWFudXBcbiAgICBtb2RhbC5fZXZlbnRTb3VyY2UgPSBldmVudFNvdXJjZTtcbiAgfVxuXG4gIC8vIFN0b3Agc3RyZWFtaW5nIGxvZ3NcbiAgZnVuY3Rpb24gc3RvcFN0cmVhbSgpIHtcbiAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICBldmVudFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChtb2RhbC5fZXZlbnRTb3VyY2UpIHtcbiAgICAgIG1vZGFsLl9ldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgbW9kYWwuX2V2ZW50U291cmNlID0gbnVsbDtcbiAgICB9XG4gICAgaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgICBzdHJlYW1CdG4udGV4dENvbnRlbnQgPSAnXHUyNUI2IFN0cmVhbSc7XG4gICAgc3RyZWFtU3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICAvLyBEb3dubG9hZCBsb2dzIGFzIGZpbGVcbiAgZnVuY3Rpb24gZG93bmxvYWRMb2dzKCkge1xuICAgIGlmICghY3VycmVudExvZ3MgfHwgY3VycmVudExvZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdObyBsb2dzIHRvIGRvd25sb2FkJywgJ2Vycm9yJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyTmFtZSA9IGNvbnRhaW5lclNlbGVjdC5xdWVyeVNlbGVjdG9yKGBvcHRpb25bdmFsdWU9XCIke2N1cnJlbnRDb250YWluZXJJZH1cIl1gKT8uZGF0YXNldC5uYW1lIHx8IGN1cnJlbnRDb250YWluZXJJZDtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvWzouXS9nLCAnLScpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7Y29udGFpbmVyTmFtZX0tbG9ncy0ke3RpbWVzdGFtcH0udHh0YDtcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBjdXJyZW50TG9ncy5tYXAobG9nID0+IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IGxvZy50aW1lc3RhbXAgfHwgJyc7XG4gICAgICBjb25zdCBzdHJlYW0gPSBsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICdbRVJSXScgOiAnW09VVF0nO1xuICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcCA/IHRpbWVzdGFtcCArICcgJyA6ICcnfSR7c3RyZWFtfSAke2xvZy50ZXh0fWA7XG4gICAgfSkuam9pbignXFxuJyk7XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L3BsYWluJyB9KTtcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcblxuICAgIHNob3dOb3RpZmljYXRpb24oYERvd25sb2FkZWQgJHtjdXJyZW50TG9ncy5sZW5ndGh9IGxvZyBsaW5lc2AsICdzdWNjZXNzJyk7XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgY29udGFpbmVyU2VsZWN0Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgbG9hZExvZ3MoKTtcbiAgfSk7XG5cbiAgbG9nVGFpbD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIHN0cmVhbUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKGlzU3RyZWFtaW5nKSB7XG4gICAgICBzdG9wU3RyZWFtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0U3RyZWFtKCk7XG4gICAgfVxuICB9KTtcblxuICBkb3dubG9hZEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZG93bmxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIGNsZWFyU2VhcmNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBsb2dTZWFyY2gudmFsdWUgPSAnJztcbiAgICByZW5kZXJMb2dzKGN1cnJlbnRMb2dzLCAnJyk7XG4gIH0pO1xuXG4gIGxvZ1NlYXJjaD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgLy8gRGVib3VuY2Ugc2VhcmNoXG4gICAgY2xlYXJUaW1lb3V0KHNlYXJjaFRpbWVvdXQpO1xuICAgIHNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlbmRlckxvZ3MoY3VycmVudExvZ3MsIGxvZ1NlYXJjaC52YWx1ZS50cmltKCkpO1xuICAgIH0sIDMwMCk7XG4gIH0pO1xuXG4gIGxvZ1NlYXJjaD8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgbG9nU2VhcmNoLnZhbHVlID0gJyc7XG4gICAgICByZW5kZXJMb2dzKGN1cnJlbnRMb2dzLCAnJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBPcGVuIG1vZGFsXG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1jb250YWluZXItbG9ncycpO1xuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZENvbnRhaW5lcnMoKTtcbiAgfSk7XG5cbiAgLy8gQ2xvc2UgbW9kYWwgaGFuZGxlcnNcbiAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICBzdG9wU3RyZWFtKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9XG5cbiAgY2xvc2VCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VNb2RhbCk7XG4gIGNsb3NlQnRuMj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZU1vZGFsKTtcblxuICAvLyBDbG9zZSBvbiBlc2NhcGUga2V5XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgbW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcbiAgICAgIGNsb3NlTW9kYWwoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFdpcmUgYmFja2Ryb3AgY2xpY2sgdG8gY2xvc2VNb2RhbCBzbyB0aGUgbG9nIHN0cmVhbSBzdG9wcyB0b28uXG4gIC8vIChDYW4ndCB1c2Ugd2lyZU1vZGFsIGhlcmUgXHUyMDE0IGl0IG9ubHkgZG9lcyBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JylcbiAgLy8gb24gYmFja2Ryb3AgY2xpY2ssIHdoaWNoIHdvdWxkIGxlYWsgdGhlIFNTRS9zdHJlYW0gY29ubmVjdGlvbi4pXG4gIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgY2xvc2VNb2RhbCgpOyB9KTtcblxuICAvLyBFeHBvc2UgZm9yIHVzZSBieSBzZXJ2aWNlIGNhcmQgYnV0dG9ucyAoZ3JpZC5qcyBjYWxscyBvcGVuQ29udGFpbmVyTG9nc01vZGFsKVxuICB3aW5kb3cub3BlbkNvbnRhaW5lckxvZ3NNb2RhbCA9IGZ1bmN0aW9uKGNvbnRhaW5lcklkLCBjb250YWluZXJOYW1lKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRDb250YWluZXJzKCkudGhlbigoKSA9PiB7XG4gICAgICAvLyBUcnkgdG8gZmluZCBhbmQgc2VsZWN0IHRoZSBjb250YWluZXJcbiAgICAgIGNvbnN0IG9wdGlvbiA9IEFycmF5LmZyb20oY29udGFpbmVyU2VsZWN0Lm9wdGlvbnMpLmZpbmQob3B0ID0+IFxuICAgICAgICBvcHQudmFsdWUgPT09IGNvbnRhaW5lcklkIHx8IG9wdC5kYXRhc2V0Lm5hbWUgPT09IGNvbnRhaW5lck5hbWVcbiAgICAgICk7XG4gICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgIGNvbnRhaW5lclNlbGVjdC52YWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgbG9hZENvbnRhaW5lckluZm8ob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgbG9hZExvZ3MoKTtcbiAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVySWQpIHtcbiAgICAgICAgLy8gSWYgY29udGFpbmVyIG5vdCBmb3VuZCBpbiBsaXN0IGJ1dCB3ZSBoYXZlIGFuIElELCB0cnkgbG9hZGluZyBkaXJlY3RseVxuICAgICAgICBjdXJyZW50Q29udGFpbmVySWQgPSBjb250YWluZXJJZDtcbiAgICAgICAgaW1hZ2VFbC50ZXh0Q29udGVudCA9IGNvbnRhaW5lck5hbWUgfHwgY29udGFpbmVySWQ7XG4gICAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJy0nO1xuICAgICAgICBjcmVhdGVkRWwudGV4dENvbnRlbnQgPSAnLSc7XG4gICAgICAgIGxvYWRMb2dzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBjb250YWluZXIgSUQsIGp1c3Qgc2hvdyBtb2RhbCB3aXRoIGNvbnRhaW5lciBsaXN0XG4gICAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5TZWxlY3QgYSBjb250YWluZXIgdG8gdmlldyBsb2dzPC9kaXY+JztcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IERDLTA1NTogSE9TVCBKT1VSTkFMRCBMT0cgVklFV0VSID09PT09PT09PT1cbi8vIFN0cmVhbXMgaG9zdCBzZXJ2aWNlIGxvZ3MgKGNhZGR5LCBkYXNoY2FkZHktYXBpLCBkb2NrZXIsIHNzaCwgXHUyMDI2KSB2aWEgdGhlXG4vLyBqb3VybmFsY3RsIGJpbmQtbW91bnQgYWRkZWQgaW4gc3RhcnQuc2guIFNlcnZlci1TZW50IEV2ZW50cyBmb3IgbGl2ZVxuLy8gdGFpbGluZzsgYm91bmRlZCBub24tc3RyZWFtaW5nIHJlYWQgZm9yIGhpc3RvcmljYWwgdmlld3MuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBBbGxvdy1saXN0IG1pcnJvcnMgdGhlIGJhY2tlbmQncyBBTExPV0VEX1VOSVRTIHNvIHRoZSBkcm9wZG93biBzdGF5c1xuICAvLyBob25lc3Qgd2hlbiB0aGUgYmluZC1tb3VudCBpc24ndCBhdmFpbGFibGUuIFRoZSBzZXJ2ZXIgaXMgc3RpbGwgdGhlXG4gIC8vIHNvdXJjZSBvZiB0cnV0aCBcdTIwMTQgYW55dGhpbmcgbm90IGluIGl0cyBhbGxvdy1saXN0IHJldHVybnMgNDAwLlxuICBjb25zdCBVTklUX1BSRVNFVFMgPSBbXG4gICAgeyB1bml0OiAnY2FkZHknLCAgICAgICAgICBsYWJlbDogJ0NhZGR5IChyZXZlcnNlIHByb3h5KScgfSxcbiAgICB7IHVuaXQ6ICdkYXNoY2FkZHktYXBpJywgIGxhYmVsOiAnRGFzaENhZGR5IEFQSSAoaG9zdCBzeXN0ZW1kIHVuaXQsIG5vdCB0aGlzIGNvbnRhaW5lciknIH0sXG4gICAgeyB1bml0OiAnZG9ja2VyJywgICAgICAgICBsYWJlbDogJ0RvY2tlciBkYWVtb24nIH0sXG4gICAgeyB1bml0OiAnc3NoJywgICAgICAgICAgICBsYWJlbDogJ1NTSCBzZXJ2ZXInIH0sXG4gICAgeyB1bml0OiAnc3lzdGVtZC1qb3VybmFsZCcsIGxhYmVsOiAnc3lzdGVtZC1qb3VybmFsZCcgfSxcbiAgICB7IHVuaXQ6ICd0YWlsc2NhbGVkJywgICAgIGxhYmVsOiAnVGFpbHNjYWxlJyB9LFxuICAgIHsgdW5pdDogJ25ldHdvcmtkLWRpc3BhdGNoZXInLCBsYWJlbDogJ05ldHdvcmtkIGRpc3BhdGNoZXInIH0sXG4gIF07XG5cbiAgaW5qZWN0TW9kYWwoJ2pvdXJuYWxkLW1vZGFsJywgYFxuICAgIDxkaXYgaWQ9XCJqb3VybmFsZC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiIHN0eWxlPVwiei1pbmRleDogMTAwMjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogOTAwcHg7IG1heC13aWR0aDogOTV2dzsgaGVpZ2h0OiA4MHZoOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9ncy1oZWFkZXJcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgcGFkZGluZy1ib3R0b206IDEycHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDMgc3R5bGU9XCJtYXJnaW46IDA7XCI+XHVEODNEXHVERUYwXHVGRTBGIEhvc3QgTG9ncyAoam91cm5hbGQpPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIiBzdHlsZT1cIm1hcmdpbjogNHB4IDAgMCAwOyBmb250LXNpemU6IDAuODVyZW07IG9wYWNpdHk6IDAuNztcIj5cbiAgICAgICAgICAgICAgU3RyZWFtIGhvc3Qgc2VydmljZSBsb2dzIGZyb20gPGNvZGU+am91cm5hbGN0bDwvY29kZT4gKHJlYWQtb25seSBtb3VudCkuIERvY2tlciBjb250YWluZXIgbG9ncyBhcmUgc3RpbGwgaW4gdGhlIDxlbT5Db250YWluZXIgTG9nczwvZW0+IG1vZGFsLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWNvbnRyb2xzXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwOyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1wiPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cImpkLXVuaXQtc2VsZWN0XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IG1pbi13aWR0aDogMjIwcHg7XCI+PC9zZWxlY3Q+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImpkLXNlYXJjaFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGxvZ3MuLi5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgd2lkdGg6IDE2MHB4O1wiIC8+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiamQtdGFpbFwiIG1pbj1cIjFcIiBtYXg9XCI1MDAwXCIgdmFsdWU9XCIyMDBcIiB0aXRsZT1cIkxpbmVzIHRvIGxvYWQgKGhpc3RvcmljYWwgdmlldylcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgd2lkdGg6IDkwcHg7XCIgLz5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1yZWZyZXNoXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlx1RDgzRFx1REQwNCBMb2FkIHRhaWw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1zdHJlYW1cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XHUyNUI2IFN0cmVhbTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImpkLWNsZWFyLXNlYXJjaFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIiB0aXRsZT1cIkNsZWFyIHNlYXJjaFwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImpkLWNsb3NlXCIgY2xhc3M9XCJjbG9zZS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4O1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiamQtbWV0YVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxNnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBwYWRkaW5nOiA4cHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tYmctc2Vjb25kYXJ5LCB2YXIoLS1iZykpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44MnJlbTsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICAgIDxzcGFuPjxzdHJvbmc+U291cmNlOjwvc3Ryb25nPiA8c3BhbiBpZD1cImpkLXNvdXJjZVwiPmpvdXJuYWxkPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj48c3Ryb25nPlVuaXQ6PC9zdHJvbmc+IDxzcGFuIGlkPVwiamQtdW5pdC1kaXNwbGF5XCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PHN0cm9uZz5TdHJlYW06PC9zdHJvbmc+IDxzcGFuIGlkPVwiamQtc3RyZWFtLXN0YXRlXCI+ZGlzY29ubmVjdGVkPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cImpkLWNvbnRlbnRcIiBjbGFzcz1cImxvZ3MtY29udGVudCBzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJmbGV4OiAxOyBtaW4taGVpZ2h0OiAwOyBiYWNrZ3JvdW5kOiAjMWExYTFhOyBib3JkZXItcmFkaXVzOiA2cHg7IHBhZGRpbmc6IDEycHg7IGZvbnQtZmFtaWx5OiAnTW9uYWNvJywgJ01lbmxvJywgJ1VidW50dSBNb25vJywgbW9ub3NwYWNlOyBmb250LXNpemU6IDAuNzhyZW07IG92ZXJmbG93OiBhdXRvO1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5TZWxlY3QgYSB1bml0IGFuZCBjbGljayA8ZW0+TG9hZCB0YWlsPC9lbT4gb3IgPGVtPlN0cmVhbTwvZW0+LjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmctdG9wOiAxMnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiamQtbGluZS1jb3VudFwiPjAgbGluZXM8L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj58PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJqZC1maWx0ZXItY291bnRcIj4wIHNob3duPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+fDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiamQtb3ZlcmZsb3dcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IGNvbG9yOiB2YXIoLS13YXJuLWZnLCAjZmJiZjI0KTtcIj5cdTI2QTAgc3RyZWFtIG92ZXJmbG93IFx1MjAxNCByZS1sb2FkIHdpdGggbmFycm93ZXIgd2luZG93PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1jbG9zZS1idG5cIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgKTtcblxuICBjb25zdCBtb2RhbCAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam91cm5hbGQtbW9kYWwnKTtcbiAgY29uc3QgdW5pdFNlbGVjdCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXVuaXQtc2VsZWN0Jyk7XG4gIGNvbnN0IHNlYXJjaElucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1zZWFyY2gnKTtcbiAgY29uc3QgdGFpbElucHV0ICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXRhaWwnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXJlZnJlc2gnKTtcbiAgY29uc3Qgc3RyZWFtQnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXN0cmVhbScpO1xuICBjb25zdCBjbGVhclNlYXJjaCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtY2xlYXItc2VhcmNoJyk7XG4gIGNvbnN0IGNsb3NlQnRuICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1jbG9zZScpO1xuICBjb25zdCBjbG9zZUJ0bjIgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtY2xvc2UtYnRuJyk7XG4gIGNvbnN0IGNvbnRlbnQgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1jb250ZW50Jyk7XG4gIGNvbnN0IGxpbmVDb3VudCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1saW5lLWNvdW50Jyk7XG4gIGNvbnN0IGZpbHRlckNvdW50ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1maWx0ZXItY291bnQnKTtcbiAgY29uc3Qgb3ZlcmZsb3dIaW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLW92ZXJmbG93Jyk7XG4gIGNvbnN0IHVuaXREaXNwbGF5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC11bml0LWRpc3BsYXknKTtcbiAgY29uc3Qgc3RyZWFtU3RhdGUgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXN0cmVhbS1zdGF0ZScpO1xuXG4gIGxldCBhdmFpbGFibGUgPSBmYWxzZTsgICAgIC8vIC92YXIvbG9nL2pvdXJuYWwgbW91bnRlZD9cbiAgbGV0IGxpbmVzID0gW107ICAgICAgICAgICAgLy8gY3VycmVudCBidWZmZXIgKGFycmF5IG9mIHt0aW1lc3RhbXAsIHVuaXQsIHRleHR9KVxuICBsZXQgc3RyZWFtaW5nID0gZmFsc2U7XG4gIGxldCBldmVudFNvdXJjZSA9IG51bGw7XG4gIGxldCBzZWFyY2hUaW1lciA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZXNjYXBlSHRtbChzKSB7XG4gICAgLy8gTG9jYWwgcmUtZGVjbGFyYXRpb24gc28gd2UgZG9uJ3QgZGVwZW5kIG9uIGEgZ2xvYmFsOyBzYW1lIHNlbWFudGljc1xuICAgIC8vIGFzIHRoZSBoZWxwZXIgdXNlZCBieSBjb250YWluZXItbG9ncy5qcyBhbmQgZXJyb3ItbG9ncy5qcy5cbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBTdHJpbmcocyk7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRBdmFpbGFibGUoaXNBdmFpbGFibGUpIHtcbiAgICBhdmFpbGFibGUgPSBpc0F2YWlsYWJsZTtcbiAgICB1bml0U2VsZWN0LmlubmVySFRNTCA9ICcnO1xuICAgIFVOSVRfUFJFU0VUUy5mb3JFYWNoKHAgPT4ge1xuICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICBvcHQudmFsdWUgPSBwLnVuaXQ7XG4gICAgICBvcHQudGV4dENvbnRlbnQgPSBwLmxhYmVsICsgJyAoJyArIHAudW5pdCArICcpJztcbiAgICAgIHVuaXRTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICB9KTtcbiAgICB1bml0U2VsZWN0LmRpc2FibGVkID0gIWlzQXZhaWxhYmxlO1xuICAgIGlmICghaXNBdmFpbGFibGUpIHtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5qb3VybmFsZCBiaW5kLW1vdW50IG5vdCBhdmFpbGFibGUgaW4gdGhpcyBjb250YWluZXIuPGJyLz48c21hbGw+UmVxdWlyZXMgPGNvZGU+L3Zhci9sb2cvam91cm5hbDwvY29kZT4gKyA8Y29kZT4vdXNyL2Jpbi9qb3VybmFsY3RsPC9jb2RlPiBtb3VudGVkIChzdGFydC5zaCkuPC9zbWFsbD48L2Rpdj4nO1xuICAgICAgcmVmcmVzaEJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBzdHJlYW1CdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWZyZXNoQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBzdHJlYW1CdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBwcm9iZUF2YWlsYWJsZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xvZ3Mvam91cm5hbC91bml0cycpO1xuICAgICAgaWYgKCFyZXNwLm9rKSB7IHNldEF2YWlsYWJsZShmYWxzZSk7IHJldHVybjsgfVxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgc2V0QXZhaWxhYmxlKCEhZGF0YS5hdmFpbGFibGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNldEF2YWlsYWJsZShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyTGluZXMoKSB7XG4gICAgY29uc3QgdGVybSA9IChzZWFyY2hJbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0ZXJtID8gbGluZXMuZmlsdGVyKGwgPT4gKGwudGV4dENvbnRlbnQgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkpIDogbGluZXM7XG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPk5vIGVudHJpZXMnICsgKHRlcm0gPyBgIG1hdGNoaW5nICZxdW90OyR7ZXNjYXBlSHRtbCh0ZXJtKX0mcXVvdDtgIDogJycpICsgJzwvZGl2Pic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGh0bWwgPSBmaWx0ZXJlZC5tYXAobGluZSA9PiB7XG4gICAgICAgIGNvbnN0IHRzID0gbGluZS50aW1lc3RhbXAgPyBlc2NhcGVIdG1sKGxpbmUudGltZXN0YW1wKSA6ICdcdTIwMTQnO1xuICAgICAgICBjb25zdCB0ID0gZXNjYXBlSHRtbChsaW5lLnRleHRDb250ZW50KTtcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiamQtbGluZVwiIHN0eWxlPVwicGFkZGluZzogMXB4IDA7IGxpbmUtaGVpZ2h0OiAxLjQ7IGNvbG9yOiAjZDRkNGQ0O1wiPjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXJpZ2h0OiA4cHg7XCI+JHt0c308L3NwYW4+JHt0fTwvZGl2PmA7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIC8vIEF1dG8tc2Nyb2xsIG9ubHkgaWYgdXNlciBpcyBhbHJlYWR5IGF0IHRoZSBib3R0b20gKGRvbid0IGZpZ2h0IHRoZW0pLlxuICAgICAgY29uc3QgbmVhckJvdHRvbSA9IGNvbnRlbnQuc2Nyb2xsSGVpZ2h0IC0gY29udGVudC5zY3JvbGxUb3AgLSBjb250ZW50LmNsaWVudEhlaWdodCA8IDgwO1xuICAgICAgaWYgKG5lYXJCb3R0b20pIGNvbnRlbnQuc2Nyb2xsVG9wID0gY29udGVudC5zY3JvbGxIZWlnaHQ7XG4gICAgfVxuICAgIGxpbmVDb3VudC50ZXh0Q29udGVudCA9IGAke2xpbmVzLmxlbmd0aH0gZW50cmllc2A7XG4gICAgZmlsdGVyQ291bnQudGV4dENvbnRlbnQgPSB0ZXJtID8gYCR7ZmlsdGVyZWQubGVuZ3RofSBvZiAke2xpbmVzLmxlbmd0aH0gc2hvd25gIDogYCR7bGluZXMubGVuZ3RofSBzaG93bmA7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkVGFpbCgpIHtcbiAgICBpZiAoIWF2YWlsYWJsZSkgcmV0dXJuO1xuICAgIHN0b3BTdHJlYW0oKTtcbiAgICBjb25zdCB1bml0ID0gdW5pdFNlbGVjdC52YWx1ZTtcbiAgICBpZiAoIXVuaXQpIHJldHVybjtcbiAgICBjb25zdCB0YWlsID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oNTAwMCwgTnVtYmVyKHRhaWxJbnB1dC52YWx1ZSkgfHwgMjAwKSk7XG4gICAgY29uc3QgdGVybSA9IChzZWFyY2hJbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+JztcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCgnL2FwaS92MS9sb2dzL2pvdXJuYWwnLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCd1bml0JywgdW5pdCk7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndGFpbCcsIFN0cmluZyh0YWlsKSk7XG4gICAgICBpZiAodGVybSkgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3NlYXJjaCcsIHRlcm0pO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybC50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlmICghcmVzcC5vayB8fCAhZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbCgoZGF0YSAmJiBkYXRhLmVycm9yKSB8fCAoJ0hUVFAgJyArIHJlc3Auc3RhdHVzKSkgKyAnPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW5pdERpc3BsYXkudGV4dENvbnRlbnQgPSB1bml0O1xuICAgICAgbGluZXMgPSAoZGF0YS5lbnRyaWVzIHx8IFtdKS5tYXAoZSA9PiAoe1xuICAgICAgICB0aW1lc3RhbXA6IGUudGltZXN0YW1wLFxuICAgICAgICB1bml0OiBlLnVuaXQsXG4gICAgICAgIHRleHRDb250ZW50OiBlLnRleHQgfHwgJycsXG4gICAgICB9KSk7XG4gICAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHJlbmRlckxpbmVzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZywgI2VmNDQ0NCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5FcnJvcjogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0U3RyZWFtKCkge1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm47XG4gICAgc3RvcFN0cmVhbSgpO1xuICAgIGNvbnN0IHVuaXQgPSB1bml0U2VsZWN0LnZhbHVlO1xuICAgIGlmICghdW5pdCkgcmV0dXJuO1xuICAgIGNvbnN0IHRlcm0gPSAoc2VhcmNoSW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICB1bml0RGlzcGxheS50ZXh0Q29udGVudCA9IHVuaXQ7XG4gICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1MjNGOCBTdG9wJztcbiAgICBzdHJlYW1CdG4uY2xhc3NMaXN0LmFkZCgnc3RyZWFtaW5nJyk7XG4gICAgc3RyZWFtU3RhdGUudGV4dENvbnRlbnQgPSAnc3RyZWFtaW5nJztcbiAgICBzdHJlYW1TdGF0ZS5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZywgIzRhZGU4MCknO1xuICAgIGxpbmVzID0gW107XG4gICAgcmVuZGVyTGluZXMoKTtcbiAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKCcvYXBpL3YxL2xvZ3Mvam91cm5hbC9zdHJlYW0nLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndW5pdCcsIHVuaXQpO1xuICAgIGlmICh0ZXJtKSB1cmwuc2VhcmNoUGFyYW1zLnNldCgnc2VhcmNoJywgdGVybSk7XG4gICAgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsLnRvU3RyaW5nKCkpO1xuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IChldikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBKU09OLnBhcnNlKGV2LmRhdGEpO1xuICAgICAgICBpZiAoZW50cnkuZXJyb3IpIHtcbiAgICAgICAgICAvLyBPdmVyZmxvdyAvIHZhbGlkYXRpb24gLyBiaW5kLW1vdW50IGVycm9yc1xuICAgICAgICAgIGlmICgvc3RyZWFtIChleGNlZWRlZHxsaW5lIGNhcCkvLnRlc3QoZW50cnkuZXJyb3IpKSB7XG4gICAgICAgICAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgICAgc3RvcFN0cmVhbSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZW50LmlubmVySFRNTCArPSAnPGRpdiBjbGFzcz1cImpkLWxpbmVcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyBwYWRkaW5nOiA0cHggMDtcIj5cdTI2QTAgJyArIGVzY2FwZUh0bWwoZW50cnkuZXJyb3IpICsgJzwvZGl2Pic7XG4gICAgICAgICAgY29udGVudC5zY3JvbGxUb3AgPSBjb250ZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGluZXMucHVzaCh7XG4gICAgICAgICAgdGltZXN0YW1wOiBlbnRyeS50aW1lc3RhbXAsXG4gICAgICAgICAgdW5pdDogZW50cnkudW5pdCB8fCB1bml0LFxuICAgICAgICAgIHRleHRDb250ZW50OiBlbnRyeS50ZXh0IHx8ICcnLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSGFyZCBjYXAgdG8ga2VlcCBtZW1vcnkgYm91bmRlZCBpZiBvcGVyYXRvciBzdHJlYW1zIGZvcmV2ZXIuXG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiA1MDAwKSB7XG4gICAgICAgICAgbGluZXMgPSBsaW5lcy5zbGljZShsaW5lcy5sZW5ndGggLSA1MDAwKTtcbiAgICAgICAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlckxpbmVzKCk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIC8vIElnbm9yZSBtYWxmb3JtZWQgZXZlbnRzOyB0aGUgc2VydmVyIGlzIGF1dGhvcml0YXRpdmUuXG4gICAgICB9XG4gICAgfTtcbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgLy8gRXZlbnRTb3VyY2UgYXV0by1yZWNvbm5lY3RzOyBtYXJrIHRyYW5zaWVudCBpZiB3ZSB3ZXJlIGV4cGVjdGluZ1xuICAgICAgLy8gbW9yZSwgb3RoZXJ3aXNlIHdlIGNsb3NlZCBpdCBkZWxpYmVyYXRlbHkuXG4gICAgICBpZiAoIXN0cmVhbWluZykgcmV0dXJuO1xuICAgIH07XG4gICAgc3RyZWFtaW5nID0gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3BTdHJlYW0oKSB7XG4gICAgc3RyZWFtaW5nID0gZmFsc2U7XG4gICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICB0cnkgeyBldmVudFNvdXJjZS5jbG9zZSgpOyB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICBldmVudFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIHN0cmVhbUJ0bi50ZXh0Q29udGVudCA9ICdcdTI1QjYgU3RyZWFtJztcbiAgICBzdHJlYW1CdG4uY2xhc3NMaXN0LnJlbW92ZSgnc3RyZWFtaW5nJyk7XG4gICAgc3RyZWFtU3RhdGUudGV4dENvbnRlbnQgPSAnZGlzY29ubmVjdGVkJztcbiAgICBzdHJlYW1TdGF0ZS5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgc3RvcFN0cmVhbSgpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfVxuXG4gIC8vIFdpcmUgZXZlbnRzXG4gIHJlZnJlc2hCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkVGFpbCk7XG4gIHN0cmVhbUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN0cmVhbWluZyA/IHN0b3BTdHJlYW0oKSA6IHN0YXJ0U3RyZWFtKCkpO1xuICBjbGVhclNlYXJjaC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsgc2VhcmNoSW5wdXQudmFsdWUgPSAnJzsgcmVuZGVyTGluZXMoKTsgfSk7XG4gIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dChzZWFyY2hUaW1lcik7XG4gICAgc2VhcmNoVGltZXIgPSBzZXRUaW1lb3V0KHJlbmRlckxpbmVzLCAyMDApO1xuICB9KTtcbiAgc2VhcmNoSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBzZWFyY2hJbnB1dC52YWx1ZSA9ICcnOyByZW5kZXJMaW5lcygpOyB9XG4gIH0pO1xuICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlKTtcbiAgY2xvc2VCdG4yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIGNsb3NlKCk7IH0pO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIG1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSBjbG9zZSgpO1xuICB9KTtcbiAgLy8gUmVsb2FkIHRhaWwgYXV0b21hdGljYWxseSB3aGVuIHRoZSB1bml0IGRyb3Bkb3duIGNoYW5nZXMgKGlmIHdlIGhhdmVcbiAgLy8gZGF0YSBhbHJlYWR5IFx1MjAxNCBzYXZlcyBhIGNsaWNrKS5cbiAgdW5pdFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA+IDApIGxvYWRUYWlsKCk7XG4gIH0pO1xuXG4gIC8vIEhvb2sgaW50byB0aGUgZXhpc3RpbmcgXCJDb250YWluZXIgTG9nc1wiIG1vZGFsIGJ1dHRvbiBzbyBvcGVyYXRvcnMgZ2V0IGFcbiAgLy8gc2VwYXJhdGUgZW50cnkgcG9pbnQ7IG1pcnJvciB0aGUgb3BlbkNvbnRhaW5lckxvZ3NNb2RhbCBwYXR0ZXJuLlxuICBmdW5jdGlvbiBvcGVuSm91cm5hbGRNb2RhbCgpIHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgcHJvYmVBdmFpbGFibGUoKTtcbiAgfVxuICB3aW5kb3cub3BlbkpvdXJuYWxkTW9kYWwgPSBvcGVuSm91cm5hbGRNb2RhbDtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1qb3VybmFsZC1sb2dzJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlbkpvdXJuYWxkTW9kYWwpO1xufSkoKTs7XG4vLyA9PT09PT09PT09IENPTlRBSU5FUiBTTkFQU0hPVCAvIENIRUNLUE9JTlQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnc25hcHNob3QtbW9kYWwnLCBgPGRpdiBpZD1cInNuYXBzaG90LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA3MDBweDsgbWF4LXdpZHRoOiA4NTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQkUgQ29udGFpbmVyIFNuYXBzaG90czwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIENyZWF0ZSBhbmQgbWFuYWdlIERvY2tlciBjb250YWluZXIgY2hlY2twb2ludHMgZm9yIGluc3RhbnQgc3RhdGUgcmVjb3ZlcnkuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1jb250YWluZXItc2VsZWN0LXdyYXBwZXJcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5TZWxlY3QgQ29udGFpbmVyOjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJzbmFwc2hvdC1jb250YWluZXItc2VsZWN0XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEycHg7IG1hcmdpbi10b3A6IDRweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBTZWxlY3QgYSBjb250YWluZXIgLS08L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cInNuYXBzaG90LWRldGFpbHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3Zlcik7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+SW1hZ2U6PC9zcGFuPiA8c3BhbiBpZD1cInNuYXBzaG90LWltYWdlXCI+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlN0YXR1czo8L3NwYW4+IDxzcGFuIGlkPVwic25hcHNob3Qtc3RhdHVzXCI+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNyZWF0ZWQ6PC9zcGFuPiA8c3BhbiBpZD1cInNuYXBzaG90LWNyZWF0ZWRcIj48L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q29udGFpbmVyIElEOjwvc3Bhbj4gPHNwYW4gaWQ9XCJzbmFwc2hvdC1pZFwiIHN0eWxlPVwiZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj48L3NwYW4+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC10YWJzXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJzbmFwc2hvdC1jcmVhdGVcIj5DcmVhdGUgU25hcHNob3Q8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJzbmFwc2hvdC1saXN0XCI+TWFuYWdlIFNuYXBzaG90czwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1jcmVhdGVcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5TbmFwc2hvdCBOYW1lOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzbmFwc2hvdC1uYW1lXCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBiZWZvcmUtdXBkYXRlLTIwMjRcIiBcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBtYXJnaW4tdG9wOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuOXJlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNuYXBzaG90LWxlYXZlLXJ1bm5pbmdcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICBMZWF2ZSBjb250YWluZXIgcnVubmluZyBhZnRlciBjaGVja3BvaW50IChyZXN1bWUgd2l0aG91dCByZXN0YXJ0KVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGlkPVwic25hcHNob3QtY3JlYXRlLWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XHVEODNEXHVEQ0JFIENyZWF0ZSBTbmFwc2hvdDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGlkPVwic25hcHNob3QtY3JlYXRlLXN0YXR1c1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cInNuYXBzaG90LWxpc3RcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1saXN0LWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogMzAwcHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0JFPC9zcGFuPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGl0cyBzbmFwc2hvdHM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzbmFwc2hvdC1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1idG4nKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtY2xvc2UnKTtcbiAgY29uc3QgY29udGFpbmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWNvbnRhaW5lci1zZWxlY3QnKTtcbiAgY29uc3QgZGV0YWlsc0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1kZXRhaWxzJyk7XG4gIGNvbnN0IGNyZWF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGUtYnRuJyk7XG4gIGNvbnN0IGNyZWF0ZVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGUtc3RhdHVzJyk7XG5cbiAgbGV0IGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZENvbnRhaW5lcnMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbnRhaW5lcnMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEuY29udGFpbmVycykgcmV0dXJuO1xuICAgICAgXG4gICAgICBjb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBTZWxlY3QgYSBjb250YWluZXIgLS08L29wdGlvbj4nO1xuICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEuY29udGFpbmVycykge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gYy5pZDtcbiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gYCR7Yy5uYW1lIHx8IGMuaWR9ICgke2MuaW1hZ2UgfHwgJ3Vua25vd24nfSlgO1xuICAgICAgICBvcHQuZGF0YXNldC5uYW1lID0gYy5uYW1lO1xuICAgICAgICBvcHQuZGF0YXNldC5pbWFnZSA9IGMuaW1hZ2U7XG4gICAgICAgIG9wdC5kYXRhc2V0LnN0YXR1cyA9IGMuc3RhdHVzO1xuICAgICAgICBvcHQuZGF0YXNldC5jcmVhdGVkID0gYy5jcmVhdGVkO1xuICAgICAgICBjb250YWluZXJTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBjb250YWluZXJzOicsIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dDb250YWluZXJEZXRhaWxzKG9wdCkge1xuICAgIGlmICghb3B0IHx8ICFvcHQudmFsdWUpIHtcbiAgICAgIGRldGFpbHNEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG9wdC52YWx1ZTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtaW1hZ2UnKS50ZXh0Q29udGVudCA9IG9wdC5kYXRhc2V0LmltYWdlIHx8ICctJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3Qtc3RhdHVzJykudGV4dENvbnRlbnQgPSBvcHQuZGF0YXNldC5zdGF0dXMgfHwgJy0nO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGVkJykudGV4dENvbnRlbnQgPSBvcHQuZGF0YXNldC5jcmVhdGVkID8gbmV3IERhdGUob3B0LmRhdGFzZXQuY3JlYXRlZCAqIDEwMDApLnRvTG9jYWxlU3RyaW5nKCkgOiAnLSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWlkJykudGV4dENvbnRlbnQgPSBvcHQudmFsdWUuc3Vic3RyaW5nKDAsIDEyKTtcbiAgICBkZXRhaWxzRGl2LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNuYXBzaG90KCkge1xuICAgIGlmICghY3VycmVudENvbnRhaW5lcklkKSB7XG4gICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSAnUGxlYXNlIHNlbGVjdCBhIGNvbnRhaW5lciBmaXJzdCc7XG4gICAgICBjcmVhdGVTdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tYmFkLWZnKSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtbmFtZScpLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNyZWF0ZVN0YXR1cy50ZXh0Q29udGVudCA9ICdQbGVhc2UgZW50ZXIgYSBzbmFwc2hvdCBuYW1lJztcbiAgICAgIGNyZWF0ZVN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGVhdmVSdW5uaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWxlYXZlLXJ1bm5pbmcnKS5jaGVja2VkO1xuICAgIFxuICAgIGNyZWF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgY3JlYXRlQnRuLnRleHRDb250ZW50ID0gJ0NyZWF0aW5nLi4uJztcbiAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSAnJztcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvY29udGFpbmVycy8ke2VuY29kZVVSSUNvbXBvbmVudChjdXJyZW50Q29udGFpbmVySWQpfS9jaGVja3BvaW50YCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbmFtZSwgbGVhdmVSdW5uaW5nIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzEzIFNuYXBzaG90IFwiJHtuYW1lfVwiIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5YDtcbiAgICAgICAgY3JlYXRlU3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1uYW1lJykudmFsdWUgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNyZWF0ZVN0YXR1cy50ZXh0Q29udGVudCA9IGBcdTI3MTcgRmFpbGVkOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWA7XG4gICAgICAgIGNyZWF0ZVN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzE3IEVycm9yOiAke2UubWVzc2FnZX1gO1xuICAgICAgY3JlYXRlU3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGNyZWF0ZUJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgQ3JlYXRlIFNuYXBzaG90JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuTW9kYWwoKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRDb250YWluZXJzKCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZU1vZGFsKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBkZXRhaWxzRGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgY3VycmVudENvbnRhaW5lcklkID0gbnVsbDtcbiAgICBjb250YWluZXJTZWxlY3Quc2VsZWN0ZWRJbmRleCA9IDA7XG4gIH1cblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5Nb2RhbCk7XG4gIGNsb3NlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9kYWwpO1xuICB3aXJlTW9kYWwobW9kYWwsIGNsb3NlQnRuKTtcbiAgXG4gIGNvbnRhaW5lclNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICBjb25zdCBvcHQgPSBjb250YWluZXJTZWxlY3Qub3B0aW9uc1tjb250YWluZXJTZWxlY3Quc2VsZWN0ZWRJbmRleF07XG4gICAgc2hvd0NvbnRhaW5lckRldGFpbHMob3B0KTtcbiAgfSk7XG4gIFxuICBjcmVhdGVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY3JlYXRlU25hcHNob3QpO1xuICBcbiAgLy8gVGFiIHN3aXRjaGluZ1xuICBtb2RhbD8ucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXRhYicpLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcucGFuZWwtdGFiJykuZm9yRWFjaCh0ID0+IHQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXNlY3Rpb24nKS5mb3JFYWNoKHMgPT4gcy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgICB0YWIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKGAjJHt0YWIuZGF0YXNldC5wYW5lbH1gKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICB9KTtcbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTTUFSVCBBUlIgQ09OTkVDVCA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGluamVjdE1vZGFsKCdhcnItc2V0dXAtbW9kYWwnLCBgPGRpdiBpZD1cImFyci1zZXR1cC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjAwcHg7IG1heC13aWR0aDogNzIwcHg7XCI+XG4gICAgICA8aDM+XHVEODNDXHVERkFDIFNtYXJ0IEFyciBDb25uZWN0PC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTZweDsgZm9udC1zaXplOiAwLjlyZW07XCI+XG4gICAgICAgIEF1dG8tZGlzY292ZXIgYW5kIGNvbm5lY3QgeW91ciBlbnRpcmUgbWVkaWEgc3RhY2suXG4gICAgICA8L3A+XG5cbiAgICAgIDwhLS0gUGhhc2UgMTogRGV0ZWN0aW9uIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLWRldGVjdFwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjlyZW07XCI+U2Nhbm5pbmcgZm9yIHNlcnZpY2VzLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic21hcnQtZGV0ZWN0LXJlc3VsdHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQaGFzZSAyOiBDcmVkZW50aWFsIElucHV0IChvbmx5IGZvciBzZXJ2aWNlcyBuZWVkaW5nIGtleXMpIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLWNyZWRlbnRpYWxzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8aDQgY2xhc3M9XCJoZWFkaW5nLWFjY2VudC1zZWN0aW9uXCI+RW50ZXIgTWlzc2luZyBBUEkgS2V5czwvaDQ+XG4gICAgICAgIDxkaXYgaWQ9XCJzbWFydC1jcmVkZW50aWFsLWlucHV0c1wiPjwvZGl2PlxuXG4gICAgICAgIDwhLS0gQ29ubmVjdGlvbiBPcHRpb25zIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDEwcHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+Q29ubmVjdGlvbiBPcHRpb25zPC9oND5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJvcHRpb24tbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNtYXJ0LW9wdC1zZWVyclwiIGNoZWNrZWQgY2xhc3M9XCJjaGVja2JveC1zbVwiIC8+XG4gICAgICAgICAgICBDb25maWd1cmUgU2VlcnIgd2l0aCBSYWRhcnIgKyBTb25hcnJcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm9wdGlvbi1sYWJlbFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic21hcnQtb3B0LXBsZXhcIiBjaGVja2VkIGNsYXNzPVwiY2hlY2tib3gtc21cIiAvPlxuICAgICAgICAgICAgQ29ubmVjdCBQbGV4IHRvIFNlZXJyXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJvcHRpb24tbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNtYXJ0LW9wdC1wcm93bGFyclwiIGNoZWNrZWQgY2xhc3M9XCJjaGVja2JveC1zbVwiIC8+XG4gICAgICAgICAgICBDb25uZWN0IFByb3dsYXJyIHRvIFJhZGFyciArIFNvbmFyclxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic21hcnQtb3B0LXNhdmVcIiBjaGVja2VkIGNsYXNzPVwiY2hlY2tib3gtc21cIiAvPlxuICAgICAgICAgICAgU2F2ZSBBUEkga2V5cyBmb3Igb25lLWNsaWNrIHJlY29ubmVjdFxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxidXR0b24gaWQ9XCJzbWFydC1jb25uZWN0LWJ0blwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNlNzRjM2MgMCUsICM5YjU5YjYgMTAwJSk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDFyZW07IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIFNtYXJ0IENvbm5lY3RcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQaGFzZSAzOiBDb25uZWN0aW9uIFByb2dyZXNzIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLXByb2dyZXNzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8aDQgY2xhc3M9XCJoZWFkaW5nLWFjY2VudC1zZWN0aW9uXCI+Q29ubmVjdGluZyBFdmVyeXRoaW5nLi4uPC9oND5cbiAgICAgICAgPGRpdiBpZD1cInNtYXJ0LXByb2dyZXNzLXN0ZXBzXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFBoYXNlIDQ6IFJlc3VsdHMgLS0+XG4gICAgICA8ZGl2IGlkPVwic21hcnQtcGhhc2UtcmVzdWx0c1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cInNtYXJ0LXJlc3VsdHMtY29udGVudFwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic21hcnQtcGxleC1saWJyYXJpZXNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic21hcnQtcmV0cnktYnRuXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBmbGV4OiAxOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiAjZjM5YzEyOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IDUwMDsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBSZXRyeSBGYWlsZWQgU3RlcHNcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YSBpZD1cInNtYXJ0LW9wZW4tc2VlcnJcIiBocmVmPVwiI1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIE9wZW4gU2VlcnJcbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gSGVscCBUZXh0IC0tPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgNSUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgICA8c3Ryb25nPldoZXJlIHRvIGZpbmQgQVBJIGtleXM6PC9zdHJvbmc+PGJyPlxuICAgICAgICBSYWRhcnIvU29uYXJyL1Byb3dsYXJyOiBTZXR0aW5ncyAtPiBHZW5lcmFsIC0+IFNlY3VyaXR5IC0+IEFQSSBLZXlcbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIEJ1dHRvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXJyLXNldHVwLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLWNhbmNlbCcpO1xuICBjb25zdCBjb25uZWN0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LWNvbm5lY3QtYnRuJyk7XG5cbiAgLy8gUGhhc2UgZWxlbWVudHNcbiAgY29uc3QgcGhhc2VEZXRlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtZGV0ZWN0Jyk7XG4gIGNvbnN0IHBoYXNlQ3JlZGVudGlhbHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtY3JlZGVudGlhbHMnKTtcbiAgY29uc3QgcGhhc2VQcm9ncmVzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1waGFzZS1wcm9ncmVzcycpO1xuICBjb25zdCBwaGFzZVJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtcmVzdWx0cycpO1xuXG4gIGNvbnN0IGRldGVjdFJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtZGV0ZWN0LXJlc3VsdHMnKTtcbiAgY29uc3QgY3JlZGVudGlhbElucHV0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1jcmVkZW50aWFsLWlucHV0cycpO1xuICBjb25zdCBwcm9ncmVzc1N0ZXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXByb2dyZXNzLXN0ZXBzJyk7XG4gIGNvbnN0IHJlc3VsdHNDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXJlc3VsdHMtY29udGVudCcpO1xuICBjb25zdCBwbGV4TGlicmFyaWVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXBsZXgtbGlicmFyaWVzJyk7XG4gIGNvbnN0IHJldHJ5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXJldHJ5LWJ0bicpO1xuXG4gIGxldCBkZXRlY3RlZERhdGEgPSBudWxsOyAvLyBTdG9yZSBkZXRlY3Rpb24gcmVzdWx0cyBmb3Igc21hcnQtY29ubmVjdFxuXG4gIGNvbnN0IHNlcnZpY2VJY29ucyA9IHsgcGxleDogJ1x1RDgzQ1x1REZBQycsIHJhZGFycjogJ1x1RDgzQ1x1REZBQycsIHNvbmFycjogJ1x1RDgzRFx1RENGQScsIHByb3dsYXJyOiAnXHVEODNEXHVERDBEJywgc2VlcnI6ICdcdUQ4M0RcdURDQ0InIH07XG4gIGNvbnN0IHNlcnZpY2VMYWJlbHMgPSB7IHBsZXg6ICdQbGV4JywgcmFkYXJyOiAnUmFkYXJyIChNb3ZpZXMpJywgc29uYXJyOiAnU29uYXJyIChUViknLCBwcm93bGFycjogJ1Byb3dsYXJyIChJbmRleGVycyknLCBzZWVycjogJ1NlZXJyJyB9O1xuXG4gIGZ1bmN0aW9uIHNob3dQaGFzZShwaGFzZSkge1xuICAgIHBoYXNlRGV0ZWN0LnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ2RldGVjdCcgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIHBoYXNlQ3JlZGVudGlhbHMuc3R5bGUuZGlzcGxheSA9IHBoYXNlID09PSAnY3JlZGVudGlhbHMnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICBwaGFzZVByb2dyZXNzLnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ3Byb2dyZXNzJyA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgcGhhc2VSZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ3Jlc3VsdHMnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXR1c0JhZGdlKHN0YXR1cykge1xuICAgIGNvbnN0IGNvbG9ycyA9IHtcbiAgICAgIGNvbm5lY3RlZDogeyBiZzogJ3ZhcigtLW9rLWZnKScsIGljb246ICcmIzEwMDAzOycsIHRleHQ6ICdDb25uZWN0ZWQnIH0sXG4gICAgICBuZWVkc19rZXk6IHsgYmc6ICcjZjM5YzEyJywgaWNvbjogJyYjMTI4MjczOycsIHRleHQ6ICdOZWVkcyBBUEkgS2V5JyB9LFxuICAgICAgbm90X2ZvdW5kOiB7IGJnOiAndmFyKC0tbXV0ZWQpJywgaWNvbjogJyZtZGFzaDsnLCB0ZXh0OiAnTm90IEZvdW5kJyB9LFxuICAgICAgZXJyb3I6IHsgYmc6ICd2YXIoLS1iYWQtZmcpJywgaWNvbjogJyYjMTAwMDc7JywgdGV4dDogJ0Vycm9yJyB9XG4gICAgfTtcbiAgICBjb25zdCBjID0gY29sb3JzW3N0YXR1c10gfHwgY29sb3JzLm5vdF9mb3VuZDtcbiAgICByZXR1cm4gYDxzcGFuIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNHB4OyBwYWRkaW5nOiAycHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICR7Yy5iZ30gMjAlLCB0cmFuc3BhcmVudCk7IGNvbG9yOiAke2MuYmd9O1wiPiR7Yy5pY29ufSAke2MudGV4dH08L3NwYW4+YDtcbiAgfVxuXG4gIC8vIFBoYXNlIDE6IFNtYXJ0IERldGVjdGlvblxuICBhc3luYyBmdW5jdGlvbiBzbWFydERldGVjdCgpIHtcbiAgICBzaG93UGhhc2UoJ2RldGVjdCcpO1xuICAgIGRldGVjdFJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Fyci9zbWFydC1kZXRlY3QnKTtcbiAgICAgIGRldGVjdGVkRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKCFkZXRlY3RlZERhdGEuc3VjY2Vzcykge1xuICAgICAgICBkZXRlY3RSZXN1bHRzLmlubmVySFRNTCA9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGV0ZWN0aW9uIGZhaWxlZDogJHtlc2NhcGVIdG1sKGRldGVjdGVkRGF0YS5lcnJvcil9PC9kaXY+YDtcbiAgICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW5kZXIgZGV0ZWN0aW9uIHJlc3VsdHNcbiAgICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDtcIj4nO1xuXG4gICAgICBmb3IgKGNvbnN0IFtzdmMsIGluZm9dIG9mIE9iamVjdC5lbnRyaWVzKGRldGVjdGVkRGF0YS5zZXJ2aWNlcykpIHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHNlcnZpY2VJY29uc1tzdmNdIHx8ICdcdUQ4M0RcdURDRTYnO1xuICAgICAgICBjb25zdCBsYWJlbCA9IHNlcnZpY2VMYWJlbHNbc3ZjXSB8fCBzdmM7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGluZm8uc291cmNlID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBhZGRpbmc6IDFweCA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiAzcHg7XCI+JHtlc2NhcGVIdG1sKGluZm8uc291cmNlKX08L3NwYW4+YCA6ICcnO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gaW5mby52ZXJzaW9uID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+diR7ZXNjYXBlSHRtbChpbmZvLnZlcnNpb24pfTwvc3Bhbj5gIDogJyc7XG4gICAgICAgIGNvbnN0IGtleVNhdmVkID0gKGluZm8uaGFzQXBpS2V5IHx8IGluZm8uaGFzVG9rZW4pICYmIGluZm8uc3RhdHVzID09PSAnY29ubmVjdGVkJ1xuICAgICAgICAgID8gJzxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1vay1mZyk7XCI+S2V5IHNhdmVkPC9zcGFuPicgOiAnJztcblxuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyBwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JHtsYWJlbH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICAgICAgICAke3NvdXJjZX0gJHt2ZXJzaW9ufSAke2tleVNhdmVkfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgJHtzdGF0dXNCYWRnZShpbmZvLnN0YXR1cyl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICAgIC8vIFN1bW1hcnlcbiAgICAgIGNvbnN0IHMgPSBkZXRlY3RlZERhdGEuc3VtbWFyeTtcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSA4JSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgJHtlc2NhcGVIdG1sKFN0cmluZyhzLmZ1bGx5Q29ubmVjdGVkKSl9LyR7ZXNjYXBlSHRtbChTdHJpbmcocy50b3RhbERldGVjdGVkICsgKDUgLSBzLnRvdGFsRGV0ZWN0ZWQpKSl9IHNlcnZpY2VzIGRldGVjdGVkICZtaWRkb3Q7XG4gICAgICAgICR7ZXNjYXBlSHRtbChTdHJpbmcocy5mdWxseUNvbm5lY3RlZCkpfSBjb25uZWN0ZWQke3MubmVlZHNBcGlLZXkgPiAwID8gYCAmbWlkZG90OyA8c3Ryb25nPiR7ZXNjYXBlSHRtbChTdHJpbmcocy5uZWVkc0FwaUtleSkpfSBuZWVkcyBBUEkga2V5PC9zdHJvbmc+YCA6ICcnfVxuICAgICAgPC9kaXY+YDtcblxuICAgICAgZGV0ZWN0UmVzdWx0cy5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgLy8gQnVpbGQgY3JlZGVudGlhbCBpbnB1dHMgZm9yIHNlcnZpY2VzIHRoYXQgbmVlZCBrZXlzXG4gICAgICBidWlsZENyZWRlbnRpYWxJbnB1dHMoZGV0ZWN0ZWREYXRhKTtcblxuICAgICAgLy8gQXV0by1hZHZhbmNlIGFmdGVyIGEgc2hvcnQgZGVsYXlcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzaG93UGhhc2UoJ2NyZWRlbnRpYWxzJyk7XG4gICAgICB9LCA4MDApO1xuXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGV0ZWN0UmVzdWx0cy5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkVycm9yOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZCBjcmVkZW50aWFsIGlucHV0IGZpZWxkc1xuICBmdW5jdGlvbiBidWlsZENyZWRlbnRpYWxJbnB1dHMoZGF0YSkge1xuICAgIGxldCBodG1sID0gJyc7XG4gICAgY29uc3Qgc2VydmljZXMgPSBkYXRhLnNlcnZpY2VzO1xuICAgIGNvbnN0IGFyclNlcnZpY2VzID0gWydyYWRhcnInLCAnc29uYXJyJywgJ3Byb3dsYXJyJ107XG5cbiAgICBmb3IgKGNvbnN0IHN2YyBvZiBhcnJTZXJ2aWNlcykge1xuICAgICAgY29uc3QgaW5mbyA9IHNlcnZpY2VzW3N2Y107XG4gICAgICBpZiAoIWluZm8gfHwgaW5mby5zdGF0dXMgPT09ICdub3RfZm91bmQnICYmICFpbmZvLnVybCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGljb24gPSBzZXJ2aWNlSWNvbnNbc3ZjXTtcbiAgICAgIGNvbnN0IGxhYmVsID0gc2VydmljZUxhYmVsc1tzdmNdO1xuICAgICAgY29uc3QgaXNDb25uZWN0ZWQgPSBpbmZvLnN0YXR1cyA9PT0gJ2Nvbm5lY3RlZCc7XG4gICAgICBjb25zdCBib3JkZXJDb2xvciA9IGlzQ29ubmVjdGVkID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYm9yZGVyKSc7XG5cbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICR7Ym9yZGVyQ29sb3J9O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPiR7bGFiZWx9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGlkPVwic21hcnQtJHtzdmN9LXN0YXR1c1wiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IGF1dG87IGZvbnQtc2l6ZTogMC43NXJlbTtcIj5cbiAgICAgICAgICAgICR7aXNDb25uZWN0ZWQgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7IENvbm5lY3RlZDwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5VUkw6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic21hcnQtJHtzdmN9LXVybFwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGluZm8udXJsIHx8ICcnKX1cIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vc2VlZGJveC5jb20vJHtzdmN9L1wiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgZm9udC1zaXplOiAwLjg1cmVtOyBwYWRkaW5nOiA2cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5BUEkgS2V5OjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJzbWFydC0ke3N2Y30ta2V5XCIgcGxhY2Vob2xkZXI9XCIke2lzQ29ubmVjdGVkID8gJyhzYXZlZCknIDogJ1Bhc3RlIEFQSSBrZXknfVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgZm9udC1zaXplOiAwLjg1cmVtOyBwYWRkaW5nOiA2cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJzbWFydFRlc3RDb25uZWN0aW9uKCcke3N2Y30nKVwiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4OyBwYWRkaW5nOiA0cHggMTJweDsgZm9udC1zaXplOiAwLjc1cmVtOyBjdXJzb3I6IHBvaW50ZXI7XCI+VGVzdDwvYnV0dG9uPlxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICAvLyBQbGV4IHN0YXR1cyAobm9uLWVkaXRhYmxlLCBqdXN0IHNob3dzIHN0YXR1cylcbiAgICBjb25zdCBwbGV4ID0gc2VydmljZXMucGxleDtcbiAgICBpZiAocGxleCkge1xuICAgICAgY29uc3QgcGxleENvbm5lY3RlZCA9IHBsZXguc3RhdHVzID09PSAnY29ubmVjdGVkJztcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgJHtwbGV4Q29ubmVjdGVkID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYm9yZGVyKSd9OyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTtcIj5cdUQ4M0NcdURGQUM8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPlBsZXg8L3NwYW4+XG4gICAgICAgICAgJHtzdGF0dXNCYWRnZShwbGV4LnN0YXR1cyl9XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbChwbGV4LnNvdXJjZSB8fCAnJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgLy8gU2VlcnIgc3RhdHVzXG4gICAgY29uc3Qgc2VlcnIgPSBzZXJ2aWNlcy5zZWVycjtcbiAgICBpZiAoc2VlcnIpIHtcbiAgICAgIGNvbnN0IHNlZXJyT2sgPSBzZWVyci5zdGF0dXMgPT09ICdjb25uZWN0ZWQnO1xuICAgICAgbGV0IGNvbmZpZ3VyZWRIdG1sID0gJyc7XG4gICAgICBpZiAoc2VlcnIuY29uZmlndXJlZFNlcnZpY2VzKSB7XG4gICAgICAgIGNvbnN0IGNzID0gc2VlcnIuY29uZmlndXJlZFNlcnZpY2VzO1xuICAgICAgICBjb25maWd1cmVkSHRtbCA9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+XG4gICAgICAgICAgQ29uZmlndXJlZDogJHtjcy5yYWRhcnIgPyAnJiMxMDAwMzsgUmFkYXJyJyA6ICcmIzEwMDA3OyBSYWRhcnInfSAmbWlkZG90O1xuICAgICAgICAgICR7Y3Muc29uYXJyID8gJyYjMTAwMDM7IFNvbmFycicgOiAnJiMxMDAwNzsgU29uYXJyJ30gJm1pZGRvdDtcbiAgICAgICAgICAke2NzLnBsZXggPyAnJiMxMDAwMzsgUGxleCcgOiAnJiMxMDAwNzsgUGxleCd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICR7c2VlcnJPayA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJvcmRlciknfTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxLjFyZW07XCI+XHVEODNEXHVEQ0NCPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDtcIj5TZWVycjwvc3Bhbj5cbiAgICAgICAgICAke3N0YXR1c0JhZGdlKHNlZXJyLnN0YXR1cyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke2NvbmZpZ3VyZWRIdG1sfVxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICBjcmVkZW50aWFsSW5wdXRzLmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICAvLyBUZXN0IGNvbm5lY3Rpb24gKGdsb2JhbCBmb3Igb25jbGljaylcbiAgd2luZG93LnNtYXJ0VGVzdENvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbihzZXJ2aWNlKSB7XG4gICAgY29uc3QgdXJsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc21hcnQtJHtzZXJ2aWNlfS11cmxgKTtcbiAgICBjb25zdCBrZXlJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3NlcnZpY2V9LWtleWApO1xuICAgIGNvbnN0IHN0YXR1c1NwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc21hcnQtJHtzZXJ2aWNlfS1zdGF0dXNgKTtcblxuICAgIGNvbnN0IHVybCA9IHVybElucHV0Py52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgYXBpS2V5ID0ga2V5SW5wdXQ/LnZhbHVlLnRyaW0oKTtcblxuICAgIGlmICghdXJsIHx8ICFhcGlLZXkpIHtcbiAgICAgIHN0YXR1c1NwYW4uaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RW50ZXIgVVJMIGFuZCBBUEkga2V5PC9zcGFuPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hcnIvdGVzdC1jb25uZWN0aW9uJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmljZSwgdXJsLCBhcGlLZXkgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7ICR7ZXNjYXBlSHRtbChkYXRhLmFwcE5hbWUgfHwgJ0Nvbm5lY3RlZCcpfSB2JHtlc2NhcGVIdG1sKGRhdGEudmVyc2lvbiB8fCAnJyl9PC9zcGFuPmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXNTcGFuLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7ICR7ZXNjYXBlSHRtbChkYXRhLmVycm9yKX08L3NwYW4+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdGF0dXNTcGFuLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvc3Bhbj5gO1xuICAgIH1cbiAgfTtcblxuICAvLyBQaGFzZSAzOiBTbWFydCBDb25uZWN0XG4gIGFzeW5jIGZ1bmN0aW9uIHNtYXJ0Q29ubmVjdCgpIHtcbiAgICBzaG93UGhhc2UoJ3Byb2dyZXNzJyk7XG4gICAgcHJvZ3Jlc3NTdGVwcy5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+PGRpdiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDhweDtcIj5Db25uZWN0aW5nIHNlcnZpY2VzLi4uPC9kaXY+PC9kaXY+JztcblxuICAgIC8vIEdhdGhlciBpbnB1dFxuICAgIGNvbnN0IHNlcnZpY2VzID0ge307XG4gICAgZm9yIChjb25zdCBzdmMgb2YgWydyYWRhcnInLCAnc29uYXJyJywgJ3Byb3dsYXJyJ10pIHtcbiAgICAgIGNvbnN0IHVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3N2Y30tdXJsYCk/LnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IGFwaUtleSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3N2Y30ta2V5YCk/LnZhbHVlLnRyaW0oKTtcbiAgICAgIGlmIChhcGlLZXkgJiYgdXJsKSB7XG4gICAgICAgIHNlcnZpY2VzW3N2Y10gPSB7IGFwaUtleSwgdXJsIH07XG4gICAgICB9IGVsc2UgaWYgKGFwaUtleSkge1xuICAgICAgICAvLyBLZXkgcHJvdmlkZWQgd2l0aG91dCBVUkwgLSBsZXQgYmFja2VuZCByZXNvbHZlXG4gICAgICAgIHNlcnZpY2VzW3N2Y10gPSB7IGFwaUtleSB9O1xuICAgICAgfVxuICAgICAgLy8gSWYgbm8ga2V5IGVudGVyZWQgYnV0IHNlcnZpY2Ugd2FzIGFscmVhZHkgY29ubmVjdGVkLCBiYWNrZW5kIHVzZXMgc3RvcmVkIGNyZWRlbnRpYWxzXG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIHNlcnZpY2VzOiBPYmplY3Qua2V5cyhzZXJ2aWNlcykubGVuZ3RoID4gMCA/IHNlcnZpY2VzIDogdW5kZWZpbmVkLFxuICAgICAgY29uZmlndXJlUGxleDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1wbGV4Jyk/LmNoZWNrZWQsXG4gICAgICBjb25maWd1cmVQcm93bGFycjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1wcm93bGFycicpPy5jaGVja2VkLFxuICAgICAgY29uZmlndXJlU2VlcnI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1vcHQtc2VlcnInKT8uY2hlY2tlZCxcbiAgICAgIHNhdmVDcmVkZW50aWFsczogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1zYXZlJyk/LmNoZWNrZWRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXJyL3NtYXJ0LWNvbm5lY3QnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAvLyBSZW5kZXIgcHJvZ3Jlc3Mgc3RlcHNcbiAgICAgIGxldCBzdGVwc0h0bWwgPSAnJztcbiAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiAoZGF0YS5zdGVwcyB8fCBbXSkpIHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHN0ZXAuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7PC9zcGFuPidcbiAgICAgICAgICAgICAgICAgICA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7PC9zcGFuPic7XG4gICAgICAgIGNvbnN0IGRldGFpbENvbG9yID0gc3RlcC5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICd2YXIoLS1tdXRlZCknIDogJ3ZhcigtLWJhZC1mZyknO1xuICAgICAgICBzdGVwc0h0bWwgKz0gYDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgcGFkZGluZzogNnB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICR7aWNvbn1cbiAgICAgICAgICA8c3Bhbj4ke2VzY2FwZUh0bWwoc3RlcC5zdGVwKX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogJHtkZXRhaWxDb2xvcn07XCI+JHtlc2NhcGVIdG1sKHN0ZXAuZGV0YWlscyB8fCAnJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgICAgcHJvZ3Jlc3NTdGVwcy5pbm5lckhUTUwgPSBzdGVwc0h0bWw7XG5cbiAgICAgIC8vIFNob3cgcmVzdWx0cyBhZnRlciBicmllZiBkZWxheVxuICAgICAgc2V0VGltZW91dCgoKSA9PiBzaG93UmVzdWx0cyhkYXRhKSwgNTAwKTtcblxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHByb2dyZXNzU3RlcHMuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5Db25uZWN0aW9uIGVycm9yOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBoYXNlIDQ6IFJlc3VsdHNcbiAgZnVuY3Rpb24gc2hvd1Jlc3VsdHMoZGF0YSkge1xuICAgIHNob3dQaGFzZSgncmVzdWx0cycpO1xuXG4gICAgY29uc3QgcyA9IGRhdGEuc3VtbWFyeSB8fCB7fTtcbiAgICBjb25zdCBhbGxHb29kID0gcy5mYWlsZWQgPT09IDAgJiYgcy5zdWNjZWVkZWQgPiAwO1xuICAgIGNvbnN0IGhlYWRlckNvbG9yID0gYWxsR29vZCA/ICd2YXIoLS1vay1mZyknIDogJyNmMzljMTInO1xuICAgIGNvbnN0IGhlYWRlckljb24gPSBhbGxHb29kID8gJyYjMTAwMDM7JyA6ICcmIzk4ODg7JztcbiAgICBjb25zdCBoZWFkZXJUZXh0ID0gYWxsR29vZCA/ICdBbGwgQ29ubmVjdGVkIScgOiBgJHtlc2NhcGVIdG1sKFN0cmluZyhzLnN1Y2NlZWRlZCkpfS8ke2VzY2FwZUh0bWwoU3RyaW5nKHMudG90YWxTdGVwcykpfSBTdGVwcyBTdWNjZWVkZWRgO1xuXG4gICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMTZweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICR7aGVhZGVyQ29sb3J9IDEyJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCAke2hlYWRlckNvbG9yfTsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuNXJlbTsgY29sb3I6ICR7aGVhZGVyQ29sb3J9O1wiPiR7aGVhZGVySWNvbn08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICR7aGVhZGVyQ29sb3J9O1wiPiR7aGVhZGVyVGV4dH08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj4ke2VzY2FwZUh0bWwoU3RyaW5nKHMuc3VjY2VlZGVkKSl9IHN1Y2NlZWRlZCwgJHtlc2NhcGVIdG1sKFN0cmluZyhzLmZhaWxlZCkpfSBmYWlsZWQ8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gICAgLy8gU3RlcHMgZGV0YWlsXG4gICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNHB4O1wiPic7XG4gICAgZm9yIChjb25zdCBzdGVwIG9mIChkYXRhLnN0ZXBzIHx8IFtdKSkge1xuICAgICAgY29uc3QgaWNvbiA9IHN0ZXAuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7PC9zcGFuPidcbiAgICAgICAgICAgICAgICAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj4mIzEwMDA3Ozwvc3Bhbj4nO1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBwYWRkaW5nOiA0cHggOHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cbiAgICAgICAgJHtpY29ufSAke2VzY2FwZUh0bWwoc3RlcC5zdGVwKX0gPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjc1cmVtO1wiPiR7ZXNjYXBlSHRtbChzdGVwLmRldGFpbHMgfHwgJycpfTwvc3Bhbj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICByZXN1bHRzQ29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgLy8gU2hvdyByZXRyeSBidXR0b24gaWYgYW55IGZhaWx1cmVzXG4gICAgcmV0cnlCdG4uc3R5bGUuZGlzcGxheSA9IHMuZmFpbGVkID4gMCA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAvLyBGZXRjaCBQbGV4IGxpYnJhcmllcyBpZiBQbGV4IHdhcyBjb25uZWN0ZWRcbiAgICBpZiAoZGF0YS5zdGVwcz8uc29tZShzdCA9PiBzdC5zdGVwLmluY2x1ZGVzKCdQbGV4JykgJiYgc3Quc3RhdHVzID09PSAnc3VjY2VzcycpKSB7XG4gICAgICBmZXRjaFBsZXhMaWJyYXJpZXMoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFBsZXhMaWJyYXJpZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3BsZXgvbGlicmFyaWVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5saWJyYXJpZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+XHVEODNDXHVERkFDICR7ZXNjYXBlSHRtbChkYXRhLnNlcnZlck5hbWUpfSBMaWJyYXJpZXM8L2g0PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogOHB4O1wiPmA7XG4gICAgICAgIGZvciAoY29uc3QgbGliIG9mIGRhdGEubGlicmFyaWVzKSB7XG4gICAgICAgICAgY29uc3QgdHlwZUljb24gPSBsaWIudHlwZSA9PT0gJ21vdmllJyA/ICdcdUQ4M0NcdURGQUMnIDogbGliLnR5cGUgPT09ICdzaG93JyA/ICdcdUQ4M0RcdURDRkEnIDogJ1x1RDgzQ1x1REZCNSc7XG4gICAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICAke3R5cGVJY29ufSA8c3Ryb25nPiR7ZXNjYXBlSHRtbChsaWIudGl0bGUpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKFN0cmluZyhsaWIuY291bnQpKX0gaXRlbXM8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICAgICAgICBwbGV4TGlicmFyaWVzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHBsZXhMaWJyYXJpZXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIFBsZXggbGlicmFyeSBmZXRjaCBlcnJvcnNcbiAgICB9XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIHBsZXhMaWJyYXJpZXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzbWFydERldGVjdCgpO1xuICB9KTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG4gIGNvbm5lY3RCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc21hcnRDb25uZWN0KTtcbiAgcmV0cnlCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc21hcnRDb25uZWN0KTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IE5PVElGSUNBVElPTiBTRVRUSU5HUyA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ25vdGlmaWNhdGlvbnMtbW9kYWwnLCBgPGRpdiBpZD1cIm5vdGlmaWNhdGlvbnMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDU1MHB4OyBtYXgtd2lkdGg6IDY1MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1REQxNCBOb3RpZmljYXRpb24gU2V0dGluZ3M8L2gzPlxuXG4gICAgICA8IS0tIE1hc3RlciBUb2dnbGUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWNjZW50LWluZm8tYm94XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm5vdGlmaWNhdGlvbnMtZW5hYmxlZFwiIC8+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+RW5hYmxlIE5vdGlmaWNhdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10aW55LW11dGVkXCI+UmVjZWl2ZSBhbGVydHMgd2hlbiBjb250YWluZXJzIGdvIHVwL2Rvd248L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFByb3ZpZGVycyBTZWN0aW9uIC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+Tm90aWZpY2F0aW9uIFByb3ZpZGVyczwvaDQ+XG5cbiAgICAgIDwhLS0gRGlzY29yZCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tcHJvdmlkZXIgcHJvdmlkZXItY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvdmlkZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImRpc2NvcmQtZW5hYmxlZFwiIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LTUwMFwiPkRpc2NvcmQ8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZGlzY29yZC10ZXN0XCIgY2xhc3M9XCJ0ZXN0LWJ0biBidG4teHNcIj5UZXN0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZGlzY29yZC1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5XZWJob29rIFVSTDo8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZGlzY29yZC13ZWJob29rXCIgcGxhY2Vob2xkZXI9XCJodHRwczovL2Rpc2NvcmQuY29tL2FwaS92MS93ZWJob29rcy8uLi5cIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGVsZWdyYW0gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ0ZWxlZ3JhbS1lbmFibGVkXCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+VGVsZWdyYW08L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwidGVsZWdyYW0tdGVzdFwiIGNsYXNzPVwidGVzdC1idG4gYnRuLXhzXCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInRlbGVncmFtLWNvbmZpZ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC0yY29sXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPkJvdCBUb2tlbjo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRlbGVncmFtLWJvdC10b2tlblwiIHBsYWNlaG9sZGVyPVwiMTIzNDU2OkFCQy4uLlwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+Q2hhdCBJRDo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRlbGVncmFtLWNoYXQtaWRcIiBwbGFjZWhvbGRlcj1cIi0xMDAxMjM0NTY3ODkwXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIG50Znkuc2ggLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJudGZ5LWVuYWJsZWRcIiAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy01MDBcIj5udGZ5LnNoPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cIm50ZnktdGVzdFwiIGNsYXNzPVwidGVzdC1idG4gYnRuLXhzXCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cIm50ZnktY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDJmciAxZnI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5TZXJ2ZXIgVVJMOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwibnRmeS1zZXJ2ZXJcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vbnRmeS5zaFwiIHZhbHVlPVwiaHR0cHM6Ly9udGZ5LnNoXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5Ub3BpYzo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIm50ZnktdG9waWNcIiBwbGFjZWhvbGRlcj1cImRhc2hjYWRkeS1hbGVydHNcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRW1haWwgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJlbWFpbC1lbmFibGVkXCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+RW1haWwgKFNNVFApPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImVtYWlsLXRlc3RcIiBjbGFzcz1cInRlc3QtYnRuIGJ0bi14c1wiPlRlc3Q8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJlbWFpbC1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmcjsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+U01UUCBIb3N0OjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtaG9zdFwiIHBsYWNlaG9sZGVyPVwic210cC5nbWFpbC5jb21cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlBvcnQ6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVtYWlsLXBvcnRcIiB2YWx1ZT1cIjU4N1wiIHBsYWNlaG9sZGVyPVwiNTg3XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlVzZXJuYW1lOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtdXNlclwiIHBsYWNlaG9sZGVyPVwidXNlckBnbWFpbC5jb21cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlBhc3N3b3JkOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImVtYWlsLXBhc3NcIiBwbGFjZWhvbGRlcj1cImFwcCBwYXNzd29yZFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+RnJvbTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVtYWlsLWZyb21cIiBwbGFjZWhvbGRlcj1cIkRhc2hDYWRkeSAmbHQ7bm9yZXBseUBleGFtcGxlLmNvbSZndDtcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlRvOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtdG9cIiBwbGFjZWhvbGRlcj1cImFkbWluQGV4YW1wbGUuY29tXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZW1haWwtc2VjdXJlXCIgLz4gVXNlIFRMUyAocG9ydCA0NjUpXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIZWFsdGggQ2hlY2sgU2V0dGluZ3MgLS0+XG4gICAgICA8aDQgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj5IZWFsdGggTW9uaXRvcmluZzwvaDQ+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IGN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJoZWFsdGgtY2hlY2stZW5hYmxlZFwiIC8+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+RW5hYmxlIEhlYWx0aCBNb25pdG9yaW5nPC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtdGlueS1tdXRlZFwiPlBlcmlvZGljYWxseSBjaGVjayBjb250YWluZXIgc3RhdHVzPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY2hlY2stY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5DaGVjayBpbnRlcnZhbDo8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJoZWFsdGgtY2hlY2staW50ZXJ2YWxcIiBzdHlsZT1cIndpZHRoOiBhdXRvO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj4xIG1pbnV0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjVcIiBzZWxlY3RlZD41IG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxNVwiPjE1IG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIzMFwiPjMwIG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI2MFwiPjEgaG91cjwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtY2hlY2stbm93XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc1cmVtOyBtYXJnaW4tbGVmdDogYXV0bztcIj5DaGVjayBOb3c8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY2hlY2stc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDhweDtcIj5cbiAgICAgICAgICBMYXN0IGNoZWNrOiBOZXZlclxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEV2ZW50IFR5cGVzIC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+RXZlbnRzIHRvIE5vdGlmeTwvaDQ+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWNvbnRhaW5lci1kb3duXCIgY2hlY2tlZCAvPiBDb250YWluZXIgRG93blxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWNvbnRhaW5lci11cFwiIGNoZWNrZWQgLz4gQ29udGFpbmVyIFJlY292ZXJlZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWRlcGxveS1zdWNjZXNzXCIgY2hlY2tlZCAvPiBEZXBsb3ltZW50IFN1Y2Nlc3NcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWwtc21cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1kZXBsb3ktZmFpbGVkXCIgY2hlY2tlZCAvPiBEZXBsb3ltZW50IEZhaWxlZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiIHN0eWxlPVwiZ3JpZC1jb2x1bW46IDEgLyAtMTtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1yZXNvdXJjZS1hbGVydFwiIGNoZWNrZWQgLz4gUmVzb3VyY2UgQWxlcnRzXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIaXN0b3J5IC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+Tm90aWZpY2F0aW9uIEhpc3Rvcnk8L2g0PlxuICAgICAgPGRpdiBpZD1cIm5vdGlmaWNhdGlvbi1oaXN0b3J5XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAxNTBweDsgb3ZlcmZsb3cteTogYXV0bzsgcGFkZGluZzogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPk5vIG5vdGlmaWNhdGlvbnMgeWV0PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJsYXN0LW5vdGlmaWNhdGlvbi1zZW50XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogNnB4O1wiPjwvZGl2PlxuXG4gICAgICA8IS0tIEJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cIm5vdGlmaWNhdGlvbnMtc2VuZC10ZXN0XCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IGF1dG87XCI+U2VuZCBUZXN0PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJub3RpZmljYXRpb25zLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwibm90aWZpY2F0aW9ucy1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZSBTZXR0aW5nczwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW5hZ2Utbm90aWZpY2F0aW9ucycpO1xuICBjb25zdCBzYXZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtc2F2ZScpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9ucy1jYW5jZWwnKTtcblxuICAvLyBQcm92aWRlciB0b2dnbGUgaGFuZGxlcnNcbiAgWydkaXNjb3JkJywgJ3RlbGVncmFtJywgJ250ZnknLCAnZW1haWwnXS5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3Byb3ZpZGVyfS1lbmFibGVkYCk7XG4gICAgY29uc3QgY29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7cHJvdmlkZXJ9LWNvbmZpZ2ApO1xuXG4gICAgY2hlY2tib3g/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIGNvbmZpZy5zdHlsZS5kaXNwbGF5ID0gY2hlY2tib3guY2hlY2tlZCA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEhlYWx0aCBjaGVjayB0b2dnbGVcbiAgY29uc3QgaGVhbHRoQ2hlY2tFbmFibGVkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1lbmFibGVkJyk7XG4gIGNvbnN0IGhlYWx0aENoZWNrQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1jb25maWcnKTtcbiAgaGVhbHRoQ2hlY2tFbmFibGVkPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaGVhbHRoQ2hlY2tDb25maWcuc3R5bGUub3BhY2l0eSA9IGhlYWx0aENoZWNrRW5hYmxlZC5jaGVja2VkID8gJzEnIDogJzAuNSc7XG4gIH0pO1xuXG4gIC8vIExvYWQgbm90aWZpY2F0aW9uIGNvbmZpZyBmcm9tIEFQSVxuICBhc3luYyBmdW5jdGlvbiBsb2FkTm90aWZpY2F0aW9uQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvY29uZmlnJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGRhdGEuY29uZmlnO1xuXG4gICAgICAgIC8vIE1hc3RlciB0b2dnbGVcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcuZW5hYmxlZDtcblxuICAgICAgICAvLyBQcm92aWRlcnNcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc2NvcmQtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5kaXNjb3JkPy5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy50ZWxlZ3JhbT8uZW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5udGZ5Py5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5lbWFpbD8uZW5hYmxlZCB8fCBmYWxzZTtcblxuICAgICAgICAvLyBTaG93L2hpZGUgY29uZmlnIHNlY3Rpb25zXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3JkLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5kaXNjb3JkPy5lbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy50ZWxlZ3JhbT8uZW5hYmxlZCA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudGZ5LWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5udGZ5Py5lbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5lbWFpbD8uZW5hYmxlZCA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAgICAgLy8gbnRmeSBzZXJ2ZXIgVVJMXG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZXJzPy5udGZ5Py5zZXJ2ZXJVcmwpIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS1zZXJ2ZXInKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMubnRmeS5zZXJ2ZXJVcmw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbWFpbCBmaWVsZHMgXHUyMDE0IERDLTA5MjogcHJlZmlsbCB0aGUgRlVMTCBmb3JtIHNvIGEgc2F2ZSBkb2Vzbid0XG4gICAgICAgIC8vIHNpbGVudGx5IHdpcGUgZmllbGRzIHRoZSBHRVQgcmVzcG9uc2UgcHJldmlvdXNseSBvbWl0dGVkLiBQYXNzd29yZFxuICAgICAgICAvLyBpcyBuZXZlciByZXR1cm5lZDsgd2hlbiBvbmUgaXMgc3RvcmVkIHRoZSBmaWVsZCBzaG93cyBhIGtlZXAtaGludFxuICAgICAgICAvLyBhbmQgYW4gZW1wdHkgc3VibWl0IHByZXNlcnZlcyB0aGUgc3RvcmVkIGNyZWRlbnRpYWwgc2VydmVyLXNpZGUuXG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZXJzPy5lbWFpbD8uaG9zdCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLWhvc3QnKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMuZW1haWwuaG9zdDtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5mcm9tKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZnJvbScpLnZhbHVlID0gY29uZmlnLnByb3ZpZGVycy5lbWFpbC5mcm9tO1xuICAgICAgICBpZiAoY29uZmlnLnByb3ZpZGVycz8uZW1haWw/LnRvKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtdG8nKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMuZW1haWwudG87XG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZXJzPy5lbWFpbD8ucG9ydCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBvcnQnKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMuZW1haWwucG9ydDtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5zZWN1cmUgIT09IHVuZGVmaW5lZCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXNlY3VyZScpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzLmVtYWlsLnNlY3VyZSA9PT0gdHJ1ZTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy51c2VybmFtZSkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXVzZXInKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMuZW1haWwudXNlcm5hbWU7XG4gICAgICAgIGNvbnN0IGVtYWlsUGFzc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBhc3MnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5oYXNQYXNzd29yZCkge1xuICAgICAgICAgIGVtYWlsUGFzc0VsLnZhbHVlID0gJyc7XG4gICAgICAgICAgZW1haWxQYXNzRWwucGxhY2Vob2xkZXIgPSAnc2F2ZWQgXHUyMDE0IGxlYXZlIGJsYW5rIHRvIGtlZXAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVtYWlsUGFzc0VsLnBsYWNlaG9sZGVyID0gJ2FwcCBwYXNzd29yZCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIZWFsdGggY2hlY2tcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1lbmFibGVkJykuY2hlY2tlZCA9IGNvbmZpZy5oZWFsdGhDaGVjaz8uZW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgaWYgKGNvbmZpZy5oZWFsdGhDaGVjaz8uaW50ZXJ2YWxNaW51dGVzKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1pbnRlcnZhbCcpLnZhbHVlID0gY29uZmlnLmhlYWx0aENoZWNrLmludGVydmFsTWludXRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmhlYWx0aENoZWNrPy5sYXN0Q2hlY2spIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLXN0YXR1cycpLnRleHRDb250ZW50ID1cbiAgICAgICAgICAgIGBMYXN0IGNoZWNrOiAke25ldyBEYXRlKGNvbmZpZy5oZWFsdGhDaGVjay5sYXN0Q2hlY2spLnRvTG9jYWxlU3RyaW5nKCl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV2ZW50cyBcdTIwMTQgY2Fub25pY2FsIGtlYmFiLWNhc2Uga2V5cywgbWF0Y2hpbmcgdGhlIGJhY2tlbmQgc3RvcmVcbiAgICAgICAgLy8gKERDLTA5MjogcHJldmlvdXNseSByZWFkIGNhbWVsQ2FzZSBrZXlzIHRoYXQgbmV2ZXIgZXhpc3RlZCwgc29cbiAgICAgICAgLy8gZXZlcnkgdG9nZ2xlIHJlLXJlbmRlcmVkIGFzICdjaGVja2VkJyByZWdhcmRsZXNzIG9mIHN0b3JlZCBzdGF0ZSkuXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1jb250YWluZXItZG93bicpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2NvbnRhaW5lci1kb3duJ10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtY29udGFpbmVyLXVwJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LlsnY29udGFpbmVyLXVwJ10gPT09IHRydWU7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kZXBsb3ktc3VjY2VzcycpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2RlcGxveS1zdWNjZXNzJ10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZGVwbG95LWZhaWxlZCcpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2RlcGxveS1mYWlsZWQnXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1yZXNvdXJjZS1hbGVydCcpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2FsZXJ0J10gIT09IGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tOb3RpZmljYXRpb25zXSBMb2FkIENvbmZpZycsIGVycm9yLCB7IGZ1bmN0aW9uOiAnbG9hZENvbmZpZycgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTG9hZCBub3RpZmljYXRpb24gaGlzdG9yeVxuICBhc3luYyBmdW5jdGlvbiBsb2FkTm90aWZpY2F0aW9uSGlzdG9yeSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9ub3RpZmljYXRpb25zL2hpc3Rvcnk/bGltaXQ9MTAnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb24taGlzdG9yeScpO1xuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLmhpc3Rvcnk/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGRhdGEuaGlzdG9yeS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGl0ZW0udGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgICAgIGNvbnN0IHR5cGVDb2xvcnMgPSB7XG4gICAgICAgICAgICBzdWNjZXNzOiAndmFyKC0tb2stZmcpJyxcbiAgICAgICAgICAgIGVycm9yOiAndmFyKC0tYmFkLWZnKScsXG4gICAgICAgICAgICB3YXJuaW5nOiAnI2YzOWMxMicsXG4gICAgICAgICAgICBpbmZvOiAndmFyKC0tYWNjZW50KSdcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBgXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogNnB4IDhweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcIj5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogJHt0eXBlQ29sb3JzW2l0ZW0udHlwZV0gfHwgJ3ZhcigtLW11dGVkKSd9XCI+JHtpdGVtLnR5cGUgPT09ICdzdWNjZXNzJyA/ICdcdTI3MTMnIDogaXRlbS50eXBlID09PSAnZXJyb3InID8gJ1x1MjcxNycgOiAnXHUyMTM5J308L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBtaW4td2lkdGg6IDA7XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IHdoaXRlLXNwYWNlOiBub3dyYXA7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1wiPiR7ZXNjYXBlSHRtbChpdGVtLnRpdGxlKX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtkYXRlfTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIGA7XG4gICAgICAgIH0pLmpvaW4oJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPk5vIG5vdGlmaWNhdGlvbnMgeWV0PC9kaXY+JztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbTm90aWZpY2F0aW9uc10gTG9hZCBIaXN0b3J5JywgZXJyb3IsIHsgZnVuY3Rpb246ICdsb2FkSGlzdG9yeScgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2F2ZSBub3RpZmljYXRpb24gY29uZmlnXG4gIGFzeW5jIGZ1bmN0aW9uIHNhdmVOb3RpZmljYXRpb25Db25maWcoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgZW5hYmxlZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgIHByb3ZpZGVyczoge1xuICAgICAgICAgIGRpc2NvcmQ6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3JkLWVuYWJsZWQnKS5jaGVja2VkLFxuICAgICAgICAgICAgd2ViaG9va1VybDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc2NvcmQtd2ViaG9vaycpLnZhbHVlLnRyaW0oKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGVsZWdyYW06IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZWxlZ3JhbS1lbmFibGVkJykuY2hlY2tlZCxcbiAgICAgICAgICAgIGJvdFRva2VuOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tYm90LXRva2VuJykudmFsdWUudHJpbSgpLFxuICAgICAgICAgICAgY2hhdElkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tY2hhdC1pZCcpLnZhbHVlLnRyaW0oKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbnRmeToge1xuICAgICAgICAgICAgZW5hYmxlZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgICBzZXJ2ZXJVcmw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudGZ5LXNlcnZlcicpLnZhbHVlLnRyaW0oKSB8fCAnaHR0cHM6Ly9udGZ5LnNoJyxcbiAgICAgICAgICAgIHRvcGljOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS10b3BpYycpLnZhbHVlLnRyaW0oKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW1haWw6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1lbmFibGVkJykuY2hlY2tlZCxcbiAgICAgICAgICAgIGhvc3Q6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1ob3N0JykudmFsdWUudHJpbSgpLFxuICAgICAgICAgICAgcG9ydDogcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBvcnQnKS52YWx1ZSkgfHwgNTg3LFxuICAgICAgICAgICAgc2VjdXJlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtc2VjdXJlJykuY2hlY2tlZCxcbiAgICAgICAgICAgIHVzZXJuYW1lOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtdXNlcicpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtcGFzcycpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIGZyb206IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1mcm9tJykudmFsdWUudHJpbSgpLFxuICAgICAgICAgICAgdG86IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC10bycpLnZhbHVlLnRyaW0oKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgJ2NvbnRhaW5lci1kb3duJzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWNvbnRhaW5lci1kb3duJykuY2hlY2tlZCxcbiAgICAgICAgICAnY29udGFpbmVyLXVwJzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWNvbnRhaW5lci11cCcpLmNoZWNrZWQsXG4gICAgICAgICAgJ2RlcGxveS1zdWNjZXNzJzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWRlcGxveS1zdWNjZXNzJykuY2hlY2tlZCxcbiAgICAgICAgICAnZGVwbG95LWZhaWxlZCc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kZXBsb3ktZmFpbGVkJykuY2hlY2tlZCxcbiAgICAgICAgICAnYWxlcnQnOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtcmVzb3VyY2UtYWxlcnQnKS5jaGVja2VkXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWx0aENoZWNrOiB7XG4gICAgICAgICAgZW5hYmxlZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1lbmFibGVkJykuY2hlY2tlZCxcbiAgICAgICAgICBpbnRlcnZhbE1pbnV0ZXM6IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2staW50ZXJ2YWwnKS52YWx1ZSkgfHwgNVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvY29uZmlnJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNvbmZpZylcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdOb3RpZmljYXRpb24gc2V0dGluZ3Mgc2F2ZWQnLCAnc3VjY2VzcycsIDMwMDApO1xuICAgICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBGYWlsZWQgdG8gc2F2ZTogJHtkYXRhLmVycm9yfWAsICdlcnJvcicsIDMwMDApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIDMwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRlc3Qgbm90aWZpY2F0aW9uIGhhbmRsZXJzXG4gIGFzeW5jIGZ1bmN0aW9uIHRlc3RQcm92aWRlcihwcm92aWRlcikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvdGVzdCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHByb3ZpZGVyIH0pXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgVGVzdCAke3Byb3ZpZGVyfSBub3RpZmljYXRpb24gc2VudCFgLCAnc3VjY2VzcycsIDMwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgVGVzdCBmYWlsZWQ6ICR7ZGF0YS5lcnJvcn1gLCAnZXJyb3InLCAzMDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCAzMDAwKTtcbiAgICB9XG4gIH1cblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzY29yZC10ZXN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGVzdFByb3ZpZGVyKCdkaXNjb3JkJykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRlc3RQcm92aWRlcigndGVsZWdyYW0nKSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudGZ5LXRlc3QnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0ZXN0UHJvdmlkZXIoJ250ZnknKSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC10ZXN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGVzdFByb3ZpZGVyKCdlbWFpbCcpKTtcblxuICAvLyBIZWFsdGggY2hlY2sgbm93IGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLW5vdycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9ub3RpZmljYXRpb25zL2hlYWx0aC1jaGVjaycsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2stc3RhdHVzJykudGV4dENvbnRlbnQgPVxuICAgICAgICAgIGBMYXN0IGNoZWNrOiAke25ldyBEYXRlKGRhdGEubGFzdENoZWNrKS50b0xvY2FsZVN0cmluZygpfSAoJHtkYXRhLmNvbnRhaW5lcnNNb25pdG9yZWR9IGNvbnRhaW5lcnMpYDtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignSGVhbHRoIGNoZWNrIGNvbXBsZXRlZCcsICdzdWNjZXNzJywgMjAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBNb2RhbCBoYW5kbGVyc1xuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZE5vdGlmaWNhdGlvbkNvbmZpZygpO1xuICAgIGxvYWROb3RpZmljYXRpb25IaXN0b3J5KCk7XG4gIH0pO1xuXG4gIHNhdmVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2F2ZU5vdGlmaWNhdGlvbkNvbmZpZyk7XG5cbiAgLy8gU2VuZCBUZXN0IGJ1dHRvbiAtIHNlbmRzIHRlc3Qgbm90aWZpY2F0aW9uIHRvIGFsbCBlbmFibGVkIHByb3ZpZGVyc1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9ucy1zZW5kLXRlc3QnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtc2VuZC10ZXN0Jyk7XG4gICAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gYnRuLnRleHRDb250ZW50O1xuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdTZW5kaW5nLi4uJztcbiAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy9zZW5kJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgXG4gICAgICAgICAgZXZlbnQ6ICd0ZXN0JyxcbiAgICAgICAgICBkYXRhOiB7IG1lc3NhZ2U6ICdUaGlzIGlzIGEgdGVzdCBub3RpZmljYXRpb24gZnJvbSBEYXNoQ2FkZHkuJyB9LFxuICAgICAgICAgIHR5cGU6ICdpbmZvJ1xuICAgICAgICB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1Rlc3Qgbm90aWZpY2F0aW9uIHNlbnQhJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgICAgLy8gVXBkYXRlIGxhc3Qgc2VudCB0aW1lc3RhbXBcbiAgICAgICAgbG9hZE5vdGlmaWNhdGlvblN0YXR1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgVGVzdCBmYWlsZWQ6ICR7ZGF0YS5yZXN1bHRzPy5tYXAociA9PiBgJHtyLnByb3ZpZGVyfTogJHtyLmVycm9yIHx8ICdvayd9YCkuam9pbignLCAnKX1gLCAnZXJyb3InLCA1MDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCAzMDAwKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICAvLyBMb2FkIG5vdGlmaWNhdGlvbiBzdGF0dXMgKGxhc3Qgc2VudCB0aW1lc3RhbXApXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWROb3RpZmljYXRpb25TdGF0dXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy9zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzICYmIGRhdGEubGFzdFNlbnQpIHtcbiAgICAgICAgY29uc3QgbGFzdFNlbnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXN0LW5vdGlmaWNhdGlvbi1zZW50Jyk7XG4gICAgICAgIGlmIChsYXN0U2VudEVsKSB7XG4gICAgICAgICAgbGFzdFNlbnRFbC50ZXh0Q29udGVudCA9IGBMYXN0IHNlbnQ6ICR7bmV3IERhdGUoZGF0YS5sYXN0U2VudCkudG9Mb2NhbGVTdHJpbmcoKX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFNpbGVudGx5IGZhaWwgLSBzdGF0dXMgaXMgbm90IGNyaXRpY2FsXG4gICAgfVxuICB9XG5cbiAgd2lyZU1vZGFsKG1vZGFsLCBjYW5jZWxCdG4pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gUEFORUwgVEFCIFNXSVRDSElORyAoc2hhcmVkIHV0aWxpdHkpID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IHRhYiA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5wYW5lbC10YWInKTtcbiAgICBpZiAoIXRhYikgcmV0dXJuO1xuICAgIGNvbnN0IHBhbmVsSWQgPSB0YWIuZGF0YXNldC5wYW5lbDtcbiAgICBpZiAoIXBhbmVsSWQpIHJldHVybjtcbiAgICBjb25zdCB0YWJCYXIgPSB0YWIuY2xvc2VzdCgnLnBhbmVsLXRhYnMnKTtcbiAgICBjb25zdCBtb2RhbENvbnRlbnQgPSB0YWJCYXIuY2xvc2VzdCgnLndlYXRoZXItbW9kYWwtY29udGVudCcpO1xuICAgIHRhYkJhci5xdWVyeVNlbGVjdG9yQWxsKCcucGFuZWwtdGFiJykuZm9yRWFjaCh0ID0+IHQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgIHRhYi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICBtb2RhbENvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXNlY3Rpb24nKS5mb3JFYWNoKHMgPT4gcy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gbW9kYWxDb250ZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgcGFuZWxJZCk7XG4gICAgaWYgKHRhcmdldCkgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICB9KTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFVOSUZJRUQgQkFDS1VQL1JFU1RPUkUgdjIuMCA9PT09PT09PT09XG4vLyBTaW5nbGUgZmlsZSBjYXB0dXJlcyBldmVyeXRoaW5nOiBzZXJ2ZXIgY29uZmlnICsgYnJvd3NlciBzdGF0ZSArIHRoZW1lcyArIGVuY3J5cHRpb24ga2V5XG4oZnVuY3Rpb24oKSB7XG4gIC8vIEFsbCBEYXNoQ2FkZHkgbG9jYWxTdG9yYWdlIGtleXMgdG8gaW5jbHVkZSBpbiBiYWNrdXBcbiAgdmFyIEJST1dTRVJfU1RBVEVfS0VZUyA9IFtcbiAgICAnZGFzaGNhZGR5X3NpdGVfY29uZmlnJywgJ2Rhc2hjYWRkeV9vbmJvYXJkaW5nJywgJ2Rhc2hjYWRkeS1lbmNyeXB0aW9uLWtleScsXG4gICAgJ2Rhc2hjYWRkeS1zZXR1cCcsICdkYXNoY2FkZHktY29uZmlnJyxcbiAgICAndGhlbWUnLCAndXNlci10aGVtZXMnLCAnY3VzdG9tLXRoZW1lJyxcbiAgICAnY3VzdG9tLWFwcHMnLCAnY3VzdG9tLXNlcnZpY2VzJywgJ3Rvb2xiYXItc2VjdGlvbnMnLFxuICAgICd3ZWF0aGVyLWxvY2F0aW9uJywgJ3dlYXRoZXItemlwJywgJ3dlYXRoZXItZ2VvJywgJ3dlYXRoZXItdW5pdCcsXG4gICAgJ2Nsb2NrLXN0eWxlJywgJ2Nsb2NrLWNoaW1lcycsICdjbG9jay1jaGltZS12b2x1bWUnXG4gIF07XG5cbiAgLy8gQ29sbGVjdCBhbGwgRGFzaENhZGR5IGJyb3dzZXIgc3RhdGUgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgZnVuY3Rpb24gY29sbGVjdEJyb3dzZXJTdGF0ZSgpIHtcbiAgICB2YXIgc3RhdGUgPSB7fTtcbiAgICAvLyBHcmFiIGFsbCB3aGl0ZWxpc3RlZCBrZXlzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBCUk9XU0VSX1NUQVRFX0tFWVMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBCUk9XU0VSX1NUQVRFX0tFWVNbaV07XG4gICAgICB2YXIgdmFsID0gc2FmZUdldChrZXkpO1xuICAgICAgaWYgKHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCkgc3RhdGVba2V5XSA9IHZhbDtcbiAgICB9XG4gICAgLy8gR3JhYiBkeW5hbWljIHdpZGdldC0qLWVuYWJsZWQga2V5c1xuICAgIHRyeSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxvY2FsU3RvcmFnZS5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgayA9IGxvY2FsU3RvcmFnZS5rZXkoaik7XG4gICAgICAgIGlmICgvXndpZGdldC0uKy1lbmFibGVkJC8udGVzdChrKSkge1xuICAgICAgICAgIHN0YXRlW2tdID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IC8qIHByaXZhdGUgYnJvd3NpbmcgKi8gfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgYnJvd3NlciBzdGF0ZSBmcm9tIGJhY2t1cCBpbnRvIGxvY2FsU3RvcmFnZVxuICBmdW5jdGlvbiByZXN0b3JlQnJvd3NlclN0YXRlKGJyb3dzZXJTdGF0ZSkge1xuICAgIGlmICghYnJvd3NlclN0YXRlIHx8IHR5cGVvZiBicm93c2VyU3RhdGUgIT09ICdvYmplY3QnKSByZXR1cm4gMDtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIGZvciAodmFyIGtleSBpbiBicm93c2VyU3RhdGUpIHtcbiAgICAgIGlmICghYnJvd3NlclN0YXRlLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlO1xuICAgICAgc2FmZVNldChrZXksIGJyb3dzZXJTdGF0ZVtrZXldKTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBsZWdhY3kgdjEuMC4wIGltcG9ydC1leHBvcnQgZm9ybWF0IChwcmUtYmFja3VwIG1vZGFsKVxuICBmdW5jdGlvbiBpc0xlZ2FjeUZvcm1hdChkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEudmVyc2lvbiAmJiAhZGF0YS5maWxlcyAmJiBkYXRhLnNlcnZpY2VzO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzdG9yZUxlZ2FjeUZvcm1hdChkYXRhKSB7XG4gICAgLy8gTWFwIHRoZSBvbGQgZmxhdCBrZXlzIGludG8gYnJvd3NlclN0YXRlIGZvciBsb2NhbFN0b3JhZ2UgcmVzdG9yZVxuICAgIHZhciBicm93c2VyU3RhdGUgPSB7fTtcbiAgICBpZiAoZGF0YS5jdXN0b21TZXJ2aWNlcykgYnJvd3NlclN0YXRlWydjdXN0b20tc2VydmljZXMnXSA9IEpTT04uc3RyaW5naWZ5KGRhdGEuY3VzdG9tU2VydmljZXMpO1xuICAgIGlmIChkYXRhLmN1c3RvbUFwcHMpIGJyb3dzZXJTdGF0ZVsnY3VzdG9tLWFwcHMnXSA9IEpTT04uc3RyaW5naWZ5KGRhdGEuY3VzdG9tQXBwcyk7XG4gICAgaWYgKGRhdGEud2VhdGhlclppcCkgYnJvd3NlclN0YXRlWyd3ZWF0aGVyLXppcCddID0gZGF0YS53ZWF0aGVyWmlwO1xuICAgIGlmIChkYXRhLnRoZW1lKSBicm93c2VyU3RhdGVbJ3RoZW1lJ10gPSBkYXRhLnRoZW1lO1xuICAgIGlmIChkYXRhLnVzZXJUaGVtZXMgJiYgT2JqZWN0LmtleXMoZGF0YS51c2VyVGhlbWVzKS5sZW5ndGgpIGJyb3dzZXJTdGF0ZVsndXNlci10aGVtZXMnXSA9IEpTT04uc3RyaW5naWZ5KGRhdGEudXNlclRoZW1lcyk7XG4gICAgcmVzdG9yZUJyb3dzZXJTdGF0ZShicm93c2VyU3RhdGUpO1xuXG4gICAgLy8gUHVzaCBzZXJ2aWNlcyB0byBzZXJ2ZXIgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGRhdGEuc2VydmljZXMgJiYgQXJyYXkuaXNBcnJheShkYXRhLnNlcnZpY2VzKSkge1xuICAgICAgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc2VydmljZXMnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhLnNlcnZpY2VzKVxuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKSB7fSk7XG4gICAgfVxuXG4gICAgLy8gUHVzaCB0aGVtZXMgdG8gc2VydmVyIGlmIGF2YWlsYWJsZVxuICAgIGlmIChkYXRhLnVzZXJUaGVtZXMpIHtcbiAgICAgIE9iamVjdC5rZXlzKGRhdGEudXNlclRoZW1lcykuZm9yRWFjaChmdW5jdGlvbihzbHVnKSB7XG4gICAgICAgIHZhciB0ID0gZGF0YS51c2VyVGhlbWVzW3NsdWddO1xuICAgICAgICB2YXIgY29sb3JzID0ge307XG4gICAgICAgICh3aW5kb3cuVEhFTUVfUFJPUFMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24ocCkgeyBpZiAodFtwXSkgY29sb3JzW3BdID0gdFtwXTsgfSk7XG4gICAgICAgIHNlY3VyZUZldGNoKCcvYXBpL3YxL3RoZW1lcy8nICsgc2x1Zywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbmFtZTogdC5uYW1lIHx8IHNsdWcsIGNvbG9yczogY29sb3JzIH0pXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkge30pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2JhY2t1cC1tb2RhbCcsIGA8ZGl2IGlkPVwiYmFja3VwLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA1NTBweDsgbWF4LXdpZHRoOiA2NTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQkUgQmFja3VwICYgUmVzdG9yZTwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIEZ1bGwgYmFja3VwIG9mIHlvdXIgZW50aXJlIERhc2hDYWRkeSBzZXR1cCBcdTIwMTQgc2VydmVyIGNvbmZpZywgY3JlZGVudGlhbHMsIHRoZW1lcywgYW5kIGJyb3dzZXIgcHJlZmVyZW5jZXMgaW4gb25lIGZpbGUuXG4gICAgICA8L3A+XG5cbiAgICAgIDwhLS0gVGFiIGJhciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC10YWJzXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWIgYWN0aXZlXCIgZGF0YS1wYW5lbD1cImJhY2t1cC1tYW51YWxcIj5NYW51YWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJiYWNrdXAtc2NoZWR1bGVzLXRhYlwiPlNjaGVkdWxlczwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImJhY2t1cC1kaXNrLXRhYlwiPkJhY2t1cHMgb24gRGlzazwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImJhY2t1cC1wb2ludGludGltZS10YWJcIj5Qb2ludC1pbi1UaW1lPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiYmFja3VwLWhpc3RvcnktdGFiXCI+SGlzdG9yeTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBNYW51YWwgLS0+XG4gICAgICA8ZGl2IGlkPVwiYmFja3VwLW1hbnVhbFwiIGNsYXNzPVwicGFuZWwtc2VjdGlvbiBhY3RpdmVcIj5cbiAgICAgICAgPCEtLSBFeHBvcnQgU2VjdGlvbiAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDIwcHg7IHBhZGRpbmc6IDE2cHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIGNvbG9yLW1peChpbiBzcmdiLCAjMjdhZTYwIDE1JSwgdHJhbnNwYXJlbnQpLCBjb2xvci1taXgoaW4gc3JnYiwgIzJlY2M3MSAxMCUsIHRyYW5zcGFyZW50KSk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkICMyN2FlNjA7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgOHB4OyBjb2xvcjogIzJlY2M3MTsgZm9udC1zaXplOiAwLjk1cmVtO1wiPlx1RDgzRFx1RENFNCBFeHBvcnQgQmFja3VwPC9oND5cbiAgICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxMnB4O1wiPlxuICAgICAgICAgICAgRG93bmxvYWRzIGV2ZXJ5dGhpbmcgXHUyMDE0IHNlcnZpY2VzLCBDYWRkeWZpbGUsIGNyZWRlbnRpYWxzLCBlbmNyeXB0aW9uIGtleSwgdGhlbWVzLCBhbmQgYWxsIGJyb3dzZXIgcHJlZmVyZW5jZXMuXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJiYWNrdXAtZXhwb3J0LWJ0blwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICMyN2FlNjAgMCUsICMyZWNjNzEgMTAwJSk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogNjAwOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIFx1MkIwN1x1RkUwRiBEb3dubG9hZCBGdWxsIEJhY2t1cFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEltcG9ydCBTZWN0aW9uIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTZweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgY29sb3ItbWl4KGluIHNyZ2IsICMzNDk4ZGIgMTUlLCB0cmFuc3BhcmVudCksIGNvbG9yLW1peChpbiBzcmdiLCAjMjk4MGI5IDEwJSwgdHJhbnNwYXJlbnQpKTsgYm9yZGVyLXJhZGl1czogMTBweDsgYm9yZGVyOiAxcHggc29saWQgIzM0OThkYjtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCA4cHg7IGNvbG9yOiAjMzQ5OGRiOyBmb250LXNpemU6IDAuOTVyZW07XCI+XHVEODNEXHVEQ0U1IFJlc3RvcmUgQmFja3VwPC9oND5cbiAgICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxMnB4O1wiPlxuICAgICAgICAgICAgVXBsb2FkIGEgYmFja3VwIGZpbGUgdG8gcmVzdG9yZSB5b3VyIGVudGlyZSBjb25maWd1cmF0aW9uIFx1MjAxNCBkcmFnIGFuZCBkcm9wIHJlYWR5LlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImJhY2t1cC1maWxlLWlucHV0XCIgYWNjZXB0PVwiLmpzb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLXNlbGVjdC1maWxlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzM0OThkYiAwJSwgIzI5ODBiOSAxMDAlKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiA2MDA7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgXHVEODNEXHVEQ0MxIFNlbGVjdCBCYWNrdXAgRmlsZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtZmlsZS1uYW1lXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiA4cHg7IHBhZGRpbmc6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUHJldmlldyBTZWN0aW9uIChzaG93biBhZnRlciBmaWxlIHNlbGVjdGVkKSAtLT5cbiAgICAgICAgPGRpdiBpZD1cImJhY2t1cC1wcmV2aWV3XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDEycHg7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlx1RDgzRFx1RENDQiBCYWNrdXAgQ29udGVudHM8L2g0PlxuICAgICAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtcHJldmlldy1jb250ZW50XCIgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmctdG9wOiAxMnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCIgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImJhY2t1cC1yZWxvYWQtY2FkZHlcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICAgIFJlbG9hZCBDYWRkeSBhZnRlciByZXN0b3JlXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJiYWNrdXAtZG8tcmVzdG9yZS1idG5cIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZTc0YzNjIDAlLCAjYzAzOTJiIDEwMCUpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IDYwMDsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBcdTI2QTEgUmVzdG9yZSBFdmVyeXRoaW5nXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUmVzdWx0IE1lc3NhZ2UgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtcmVzdWx0XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBib3JkZXItcmFkaXVzOiA4cHg7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IFNjaGVkdWxlcyAoUHJlbWl1bSkgLS0+XG4gICAgICA8ZGl2IGlkPVwiYmFja3VwLXNjaGVkdWxlcy10YWJcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cImJhY2t1cC1zY2hlZHVsZXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTIzRjA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgc2NoZWR1bGVzLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBCYWNrdXBzIG9uIERpc2sgLS0+XG4gICAgICA8ZGl2IGlkPVwiYmFja3VwLWRpc2stdGFiXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtZGlzay1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENCRTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBiYWNrdXAgZmlsZXMuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IFBvaW50LWluLVRpbWUgUmVzdG9yZSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtcG9pbnRpbnRpbWUtdGFiXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJwb2ludGludGltZS1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1MjNFQTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogQmFja3VwIEhpc3RvcnkgLS0+XG4gICAgICA8ZGl2IGlkPVwiYmFja3VwLWhpc3RvcnktdGFiXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtaGlzdG9yeS1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDQwMHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0NCPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGJhY2t1cCBoaXN0b3J5Li4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ2xvc2UgQnV0dG9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJiYWNrdXAtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICB2YXIgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLW1vZGFsJyk7XG4gIHZhciBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1yZXN0b3JlLWJ0bicpO1xuICB2YXIgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1jYW5jZWwnKTtcbiAgdmFyIGV4cG9ydEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtZXhwb3J0LWJ0bicpO1xuICB2YXIgc2VsZWN0RmlsZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtc2VsZWN0LWZpbGUnKTtcbiAgdmFyIGZpbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtZmlsZS1pbnB1dCcpO1xuICB2YXIgZmlsZU5hbWVEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWZpbGUtbmFtZScpO1xuICB2YXIgcHJldmlld0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtcHJldmlldycpO1xuICB2YXIgcHJldmlld0NvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXByZXZpZXctY29udGVudCcpO1xuICB2YXIgcmVzdG9yZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtZG8tcmVzdG9yZS1idG4nKTtcbiAgdmFyIHJlc3VsdERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtcmVzdWx0Jyk7XG4gIHZhciBzY2hlZHVsZUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtc2NoZWR1bGVzLWNvbnRhaW5lcicpO1xuICB2YXIgaGlzdG9yeUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtaGlzdG9yeS1jb250YWluZXInKTtcbiAgdmFyIGRpc2tDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWRpc2stY29udGFpbmVyJyk7XG4gIHZhciBwb2ludGludGltZUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb2ludGludGltZS1jb250YWluZXInKTtcblxuICB2YXIgc2VsZWN0ZWRCYWNrdXAgPSBudWxsO1xuXG4gIC8vIE9wZW4gbW9kYWxcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgaWYgKHJlc3VsdERpdikgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgaWYgKHByZXZpZXdEaXYpIHByZXZpZXdEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAoZmlsZU5hbWVEaXYpIGZpbGVOYW1lRGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgc2VsZWN0ZWRCYWNrdXAgPSBudWxsO1xuICB9KTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG5cbiAgLy8gPT09IEVYUE9SVDogU2VydmVyIGJhY2t1cCArIGJyb3dzZXIgc3RhdGUgaW4gb25lIGZpbGUgPT09XG4gIGV4cG9ydEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyBmdW5jdGlvbigpIHtcbiAgICBleHBvcnRCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGV4cG9ydEJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBFeHBvcnRpbmcuLi4nO1xuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBzZXJ2ZXItc2lkZSBiYWNrdXAgKGNvbmZpZywgc2VydmljZXMsIGNhZGR5ZmlsZSwgY3JlZGVudGlhbHMsIGVuY3J5cHRpb24ga2V5LCB0aGVtZXMsIGV0Yy4pXG4gICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9iYWNrdXAvZXhwb3J0Jyk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgLy8gQWRkIGFsbCBicm93c2VyIGxvY2FsU3RvcmFnZSBzdGF0ZVxuICAgICAgZGF0YS5icm93c2VyU3RhdGUgPSBjb2xsZWN0QnJvd3NlclN0YXRlKCk7XG5cbiAgICAgIC8vIERvd25sb2FkIHVuaWZpZWQgYmFja3VwXG4gICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgICAgdmFyIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgIGEuaHJlZiA9IHVybDtcbiAgICAgIGEuZG93bmxvYWQgPSAnZGFzaGNhZGR5LWJhY2t1cC0nICsgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF0gKyAnLmpzb24nO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgIGEuY2xpY2soKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XG4gICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG5cbiAgICAgIHZhciBzdGF0ZUNvdW50ID0gT2JqZWN0LmtleXMoZGF0YS5icm93c2VyU3RhdGUpLmxlbmd0aDtcbiAgICAgIHZhciB0aGVtZUNvdW50ID0gZGF0YS50aGVtZXMgPyBPYmplY3Qua2V5cyhkYXRhLnRoZW1lcykubGVuZ3RoIDogMDtcbiAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnXHUyNzA1IEZ1bGwgYmFja3VwIGRvd25sb2FkZWQgXHUyMDE0IHNlcnZlciBjb25maWcgKyAnICsgc3RhdGVDb3VudCArICcgYnJvd3NlciBzZXR0aW5ncycgKyAodGhlbWVDb3VudCA/ICcgKyAnICsgdGhlbWVDb3VudCArICcgdGhlbWVzJyA6ICcnKTtcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1vay1mZykgMTUlLCB0cmFuc3BhcmVudCknO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgdmFyKC0tb2stZmcpJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gJ1x1Mjc0QyBFeHBvcnQgZmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWJhZC1mZykgMTUlLCB0cmFuc3BhcmVudCknO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgdmFyKC0tYmFkLWZnKSc7XG4gICAgfVxuICAgIGV4cG9ydEJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIGV4cG9ydEJ0bi5pbm5lckhUTUwgPSAnXHUyQjA3XHVGRTBGIERvd25sb2FkIEZ1bGwgQmFja3VwJztcbiAgfSk7XG5cbiAgLy8gU2VsZWN0IGZpbGUgYnV0dG9uXG4gIHNlbGVjdEZpbGVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IGZpbGVJbnB1dC5jbGljaygpOyB9KTtcblxuICAvLyA9PT0gRklMRSBTRUxFQ1RFRDogUHJldmlldyBjb250ZW50cyA9PT1cbiAgZmlsZUlucHV0Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBhc3luYyBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBmaWxlTmFtZURpdi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQzQgJyArIGZpbGUubmFtZTtcbiAgICBmaWxlTmFtZURpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0cnkge1xuICAgICAgdmFyIHRleHQgPSBhd2FpdCBmaWxlLnRleHQoKTtcbiAgICAgIHZhciBiYWNrdXAgPSBKU09OLnBhcnNlKHRleHQpO1xuXG4gICAgICAvLyBIYW5kbGUgbGVnYWN5IHYxLjAuMCBmb3JtYXQgKGZyb20gb2xkIGltcG9ydC1leHBvcnQuanMpXG4gICAgICBpZiAoaXNMZWdhY3lGb3JtYXQoYmFja3VwKSkge1xuICAgICAgICBzZWxlY3RlZEJhY2t1cCA9IGJhY2t1cDtcbiAgICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+TGVnYWN5IGZvcm1hdCAodicgKyBlc2NhcGVIdG1sKGJhY2t1cC52ZXJzaW9uKSArICcpPC9kaXY+JztcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiA2cHg7XCI+JztcbiAgICAgICAgaWYgKGJhY2t1cC5zZXJ2aWNlcz8ubGVuZ3RoKSBodG1sICs9ICc8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlx1RDgzRFx1RENDQiAnICsgYmFja3VwLnNlcnZpY2VzLmxlbmd0aCArICcgc2VydmljZXM8L3NwYW4+JztcbiAgICAgICAgaWYgKGJhY2t1cC5jdXN0b21BcHBzPy5sZW5ndGgpIGh0bWwgKz0gJzxzcGFuIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjhyZW07XCI+XHVEODNEXHVEQ0U2ICcgKyBiYWNrdXAuY3VzdG9tQXBwcy5sZW5ndGggKyAnIGN1c3RvbSBhcHBzPC9zcGFuPic7XG4gICAgICAgIGlmIChiYWNrdXAudGhlbWUpIGh0bWwgKz0gJzxzcGFuIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjhyZW07XCI+XHVEODNDXHVERkE4IFRoZW1lOiAnICsgZXNjYXBlSHRtbChiYWNrdXAudGhlbWUpICsgJzwvc3Bhbj4nO1xuICAgICAgICBpZiAoYmFja3VwLnVzZXJUaGVtZXMpIGh0bWwgKz0gJzxzcGFuIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjhyZW07XCI+XHVEODNDXHVERkE4ICcgKyBPYmplY3Qua2V5cyhiYWNrdXAudXNlclRoZW1lcykubGVuZ3RoICsgJyBjdXN0b20gdGhlbWVzPC9zcGFuPic7XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICAgIHByZXZpZXdDb250ZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHByZXZpZXdEaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gdjEuMSsgLyB2Mi4wIGZvcm1hdCBcdTIwMTQgc2VuZCB0byBzZXJ2ZXIgZm9yIHByZXZpZXdcbiAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cC9wcmV2aWV3Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJhY2t1cClcbiAgICAgIH0pO1xuICAgICAgdmFyIHByZXZpZXcgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAocHJldmlldy5zdWNjZXNzKSB7XG4gICAgICAgIHNlbGVjdGVkQmFja3VwID0gYmFja3VwO1xuICAgICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuOHJlbTtcIj5FeHBvcnRlZDogJyArIG5ldyBEYXRlKGJhY2t1cC5leHBvcnRlZEF0KS50b0xvY2FsZVN0cmluZygpICsgJyAodicgKyBlc2NhcGVIdG1sKGJhY2t1cC52ZXJzaW9uKSArICcpPC9kaXY+JztcblxuICAgICAgICAvLyBTZXJ2ZXIgZmlsZXNcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDZweDsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBsZXR0ZXItc3BhY2luZzogMC41cHg7XCI+U2VydmVyIENvbmZpZzwvZGl2Pic7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNnB4OyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPic7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBwcmV2aWV3LnByZXZpZXcuZmlsZXMpIHtcbiAgICAgICAgICB2YXIgaW5mbyA9IHByZXZpZXcucHJldmlldy5maWxlc1trZXldO1xuICAgICAgICAgIHZhciBpY29uID0gaW5mby5hY3Rpb24gPT09ICdjcmVhdGUnID8gJ1x1RDgzQ1x1REQ5NScgOiAnXHVEODNEXHVEQ0REJztcbiAgICAgICAgICBodG1sICs9ICc8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPicgKyBpY29uICsgJyAnICsgZXNjYXBlSHRtbChpbmZvLmRlc2NyaXB0aW9uKSArICc8L3NwYW4+JztcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuXG4gICAgICAgIC8vIFNlcnZpY2VzIGNvdW50XG4gICAgICAgIGlmIChwcmV2aWV3LnByZXZpZXcuc2VydmljZUNvdW50KSB7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPicgKyBwcmV2aWV3LnByZXZpZXcuc2VydmljZUNvdW50ICsgJyBzZXJ2aWNlczwvZGl2Pic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVtZXNcbiAgICAgICAgaWYgKHByZXZpZXcucHJldmlldy50aGVtZUNvdW50KSB7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPlx1RDgzQ1x1REZBOCAnICsgcHJldmlldy5wcmV2aWV3LnRoZW1lQ291bnQgKyAnIGN1c3RvbSB0aGVtZXM8L2Rpdj4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnJvd3NlciBzdGF0ZVxuICAgICAgICBpZiAocHJldmlldy5wcmV2aWV3LmJyb3dzZXJTdGF0ZUNvdW50KSB7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDZweDsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBsZXR0ZXItc3BhY2luZzogMC41cHg7XCI+QnJvd3NlciBQcmVmZXJlbmNlczwvZGl2Pic7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tYWNjZW50KTtcIj5cdUQ4M0RcdUREQTVcdUZFMEYgJyArIHByZXZpZXcucHJldmlldy5icm93c2VyU3RhdGVDb3VudCArICcgc2F2ZWQgc2V0dGluZ3MgKHRoZW1lLCB3ZWF0aGVyLCBjbG9jaywgd2lkZ2V0cywgZXRjLik8L2Rpdj4nO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlld0NvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgcHJldmlld0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnXHUyNkEwXHVGRTBGIEludmFsaWQgYmFja3VwIGZpbGU6ICcgKyBlc2NhcGVIdG1sKHByZXZpZXcuZXJyb3IpO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCAjZjM5YzEyIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2YzOWMxMic7XG4gICAgICAgIHByZXZpZXdEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gJ1x1Mjc0QyBDb3VsZCBub3QgcmVhZCBmaWxlOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWJhZC1mZykgMTUlLCB0cmFuc3BhcmVudCknO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgdmFyKC0tYmFkLWZnKSc7XG4gICAgICBwcmV2aWV3RGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9KTtcblxuICAvLyA9PT0gUkVTVE9SRTogU2VydmVyICsgYnJvd3NlciBzdGF0ZSA9PT1cbiAgcmVzdG9yZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXNlbGVjdGVkQmFja3VwKSByZXR1cm47XG4gICAgaWYgKCFjb25maXJtKCdUaGlzIHdpbGwgb3ZlcndyaXRlIHlvdXIgY3VycmVudCBjb25maWd1cmF0aW9uIGFuZCBicm93c2VyIHByZWZlcmVuY2VzLiBDb250aW51ZT8nKSkgcmV0dXJuO1xuICAgIHJlc3RvcmVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIHJlc3RvcmVCdG4uaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gUmVzdG9yaW5nLi4uJztcbiAgICB0cnkge1xuICAgICAgLy8gSGFuZGxlIGxlZ2FjeSBmb3JtYXRcbiAgICAgIGlmIChpc0xlZ2FjeUZvcm1hdChzZWxlY3RlZEJhY2t1cCkpIHtcbiAgICAgICAgcmVzdG9yZUxlZ2FjeUZvcm1hdChzZWxlY3RlZEJhY2t1cCk7XG4gICAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnXHUyNzA1IExlZ2FjeSBiYWNrdXAgcmVzdG9yZWQgXHUyMDE0IGJyb3dzZXIgc2V0dGluZ3MgYW5kIHNlcnZpY2VzIGltcG9ydGVkLic7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1vay1mZykgMTUlLCB0cmFuc3BhcmVudCknO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCB2YXIoLS1vay1mZyknO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGxvY2F0aW9uLnJlbG9hZCgpOyB9LCAyMDAwKTtcbiAgICAgICAgcmVzdG9yZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICByZXN0b3JlQnRuLmlubmVySFRNTCA9ICdcdTI2QTEgUmVzdG9yZSBFdmVyeXRoaW5nJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyB2MS4xKyAvIHYyLjAgXHUyMDE0IHJlc3RvcmUgc2VydmVyLXNpZGUgZmlyc3RcbiAgICAgIHZhciByZWxvYWRDYWRkeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtcmVsb2FkLWNhZGR5Jyk/LmNoZWNrZWQgPz8gdHJ1ZTtcbiAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cC9yZXN0b3JlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYmFja3VwOiBzZWxlY3RlZEJhY2t1cCwgb3B0aW9uczogeyByZWxvYWRDYWRkeTogcmVsb2FkQ2FkZHkgfSB9KVxuICAgICAgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgLy8gVGhlbiByZXN0b3JlIGJyb3dzZXIgc3RhdGVcbiAgICAgIHZhciBicm93c2VyQ291bnQgPSAwO1xuICAgICAgaWYgKHNlbGVjdGVkQmFja3VwLmJyb3dzZXJTdGF0ZSkge1xuICAgICAgICBicm93c2VyQ291bnQgPSByZXN0b3JlQnJvd3NlclN0YXRlKHNlbGVjdGVkQmFja3VwLmJyb3dzZXJTdGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgdmFyIG1zZyA9ICdcdTI3MDUgJyArIGRhdGEubWVzc2FnZTtcbiAgICAgICAgaWYgKGJyb3dzZXJDb3VudCA+IDApIG1zZyArPSAnPGJyPjxzbWFsbCBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIGJyb3dzZXJDb3VudCArICcgYnJvd3NlciBzZXR0aW5ncyByZXN0b3JlZDwvc21hbGw+JztcbiAgICAgICAgaWYgKGRhdGEucmVzdWx0cy5jYWRkeVJlbG9hZGVkKSBtc2cgKz0gJzxicj48c21hbGwgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNhZGR5IGNvbmZpZ3VyYXRpb24gcmVsb2FkZWQ8L3NtYWxsPic7XG4gICAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSBtc2c7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1vay1mZykgMTUlLCB0cmFuc3BhcmVudCknO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCB2YXIoLS1vay1mZyknO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBsb2NhdGlvbi5yZWxvYWQoKTsgfSwgMjAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gJ1x1MjZBMFx1RkUwRiAnICsgZXNjYXBlSHRtbChkYXRhLm1lc3NhZ2UpO1xuICAgICAgICBpZiAoYnJvd3NlckNvdW50ID4gMCkgcmVzdWx0RGl2LmlubmVySFRNTCArPSAnPGJyPjxzbWFsbCBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIGJyb3dzZXJDb3VudCArICcgYnJvd3NlciBzZXR0aW5ncyB3ZXJlIHJlc3RvcmVkPC9zbWFsbD4nO1xuICAgICAgICBpZiAoZGF0YS5yZXN1bHRzPy5lcnJvcnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXN1bHREaXYuaW5uZXJIVE1MICs9ICc8YnI+PHNtYWxsPicgKyBkYXRhLnJlc3VsdHMuZXJyb3JzLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiBlc2NhcGVIdG1sKGUuZmlsZSkgKyAnOiAnICsgZXNjYXBlSHRtbChlLmVycm9yKTsgfSkuam9pbignLCAnKSArICc8L3NtYWxsPic7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsICNmMzljMTIgMTUlLCB0cmFuc3BhcmVudCknO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjZjM5YzEyJztcbiAgICAgIH1cbiAgICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gJ1x1Mjc0QyBSZXN0b3JlIGZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKTtcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1iYWQtZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLWJhZC1mZyknO1xuICAgIH1cbiAgICByZXN0b3JlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgcmVzdG9yZUJ0bi5pbm5lckhUTUwgPSAnXHUyNkExIFJlc3RvcmUgRXZlcnl0aGluZyc7XG4gIH0pO1xuXG4gIC8vID09PSBTY2hlZHVsZXMgVGFiIChQcmVtaXVtKSA9PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFNjaGVkdWxlc1RhYigpIHtcbiAgICBpZiAoIXNjaGVkdWxlQ29udGFpbmVyKSByZXR1cm47XG4gICAgc2NoZWR1bGVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9iYWNrdXBzL3NjaGVkdWxlJyk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBcbiAgICAgIGlmIChkYXRhLnByZW1pdW1SZXF1aXJlZCkge1xuICAgICAgICBzY2hlZHVsZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJwYWRkaW5nOiAyNHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDJyZW07IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XHUyQjUwPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+UHJlbWl1bSBGZWF0dXJlPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+QXV0by1iYWNrdXAgc2NoZWR1bGluZyByZXF1aXJlcyBhIERhc2hDYWRkeSBQcmVtaXVtIHN1YnNjcmlwdGlvbi48L2Rpdj4nICtcbiAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPVwic2hvd05vdGlmaWNhdGlvbihcXCdVcGdyYWRlIHRvIFByZW1pdW0gdG8gZW5hYmxlIGF1dG8tYmFja3VwcyFcXCcsIFxcJ2luZm9cXCcpOyBzY3JvbGxUb1NlY3Rpb24oXFwnbGljZW5zZVxcJyk7XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiA4cHggMjBweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2YzOWMxMiwgI2U2N2UyMik7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDtcIj5VcGdyYWRlIHRvIFByZW1pdW08L2J1dHRvbj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkIHNjaGVkdWxlcycpO1xuICAgICAgXG4gICAgICB2YXIgc2NoZWR1bGVzID0gZGF0YS5zY2hlZHVsZXMgfHwgW107XG4gICAgICBcbiAgICAgIGlmIChzY2hlZHVsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHNjaGVkdWxlQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj4nICtcbiAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyM0YwPC9zcGFuPicgK1xuICAgICAgICAgICc8ZGl2Pk5vIGJhY2t1cCBzY2hlZHVsZXMgY29uZmlndXJlZDwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj5TZWxlY3QgYXBwcyBiZWxvdyB0byBlbmFibGUgYXV0by1iYWNrdXA8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA4cHg7XCI+JztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZWR1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzY2ggPSBzY2hlZHVsZXNbaV07XG4gICAgICAgIHZhciBuZXh0UnVuU3RyID0gc2NoLm5leHRSdW4gPyBuZXcgRGF0ZShzY2gubmV4dFJ1bikudG9Mb2NhbGVTdHJpbmcoKSA6ICdOb3Qgc2NoZWR1bGVkJztcbiAgICAgICAgdmFyIGxhc3RSdW5TdHIgPSBzY2gubGFzdFJ1biA/IG5ldyBEYXRlKHNjaC5sYXN0UnVuKS50b0xvY2FsZVN0cmluZygpIDogJ05ldmVyJztcbiAgICAgICAgXG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4IDE0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPicgK1xuICAgICAgICAgICcgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOXJlbTtcIj4nICsgZXNjYXBlSHRtbChzY2guYXBwSWQpICsgJzwvZGl2PicgK1xuICAgICAgICAgICcgIDxsYWJlbCBjbGFzcz1cInRvZ2dsZS1zd2l0Y2hcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4O1wiPicgK1xuICAgICAgICAgICcgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwic2NoZWR1bGUtdG9nZ2xlXCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKHNjaC5hcHBJZCkgKyAnXCInICsgKHNjaC5lbmFibGVkID8gJyBjaGVja2VkJyA6ICcnKSArICcgLz4nICtcbiAgICAgICAgICAnICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPicgKyAoc2NoLmVuYWJsZWQgPyAnT04nIDogJ09GRicpICsgJzwvc3Bhbj4nICtcbiAgICAgICAgICAnICA8L2xhYmVsPicgK1xuICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiA4cHg7IGZvbnQtc2l6ZTogMC44cmVtOyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPicgK1xuICAgICAgICAgICcgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlNjaGVkdWxlOjwvc3Bhbj4gPHNlbGVjdCBjbGFzcz1cInNjaGVkdWxlLXNlbGVjdFwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChzY2guYXBwSWQpICsgJ1wiIHN0eWxlPVwiYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDsgcGFkZGluZzogMnB4IDZweDtcIj4nICtcbiAgICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJob3VybHlcIicgKyAoc2NoLnNjaGVkdWxlID09PSAnaG91cmx5JyA/ICcgc2VsZWN0ZWQnIDogJycpICsgJz5Ib3VybHk8L29wdGlvbj4nICtcbiAgICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJkYWlseVwiJyArIChzY2guc2NoZWR1bGUgPT09ICdkYWlseScgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+RGFpbHk8L29wdGlvbj4nICtcbiAgICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJ3ZWVrbHlcIicgKyAoc2NoLnNjaGVkdWxlID09PSAnd2Vla2x5JyA/ICcgc2VsZWN0ZWQnIDogJycpICsgJz5XZWVrbHk8L29wdGlvbj4nICtcbiAgICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJtb250aGx5XCInICsgKHNjaC5zY2hlZHVsZSA9PT0gJ21vbnRobHknID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPk1vbnRobHk8L29wdGlvbj4nICtcbiAgICAgICAgICAnICA8L3NlbGVjdD48L2Rpdj4nICtcbiAgICAgICAgICAnICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5LZWVwIGxhc3Q6PC9zcGFuPiA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwicmV0ZW50aW9uLWlucHV0XCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKHNjaC5hcHBJZCkgKyAnXCIgdmFsdWU9XCInICsgKHNjaC5yZXRlbnRpb24/LmtlZXAgfHwgNykgKyAnXCIgbWluPVwiMVwiIG1heD1cIjEwMFwiIHN0eWxlPVwid2lkdGg6IDUwcHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDJweCA2cHg7XCIgLz48L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+JyArXG4gICAgICAgICAgJyAgPGRpdj5OZXh0IHJ1bjogJyArIGVzY2FwZUh0bWwobmV4dFJ1blN0cikgKyAnPC9kaXY+JyArXG4gICAgICAgICAgJyAgPGRpdj5MYXN0IHJ1bjogJyArIGVzY2FwZUh0bWwobGFzdFJ1blN0cikgKyAnPC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA2cHg7XCI+JyArXG4gICAgICAgICAgJyAgPGJ1dHRvbiBjbGFzcz1cInNjaGVkdWxlLXJ1bi1ub3dcIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoc2NoLmFwcElkKSArICdcIiBzdHlsZT1cInBhZGRpbmc6IDVweCAxMnB4OyBmb250LXNpemU6IDAuOHJlbTsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW9rLWZnKSAyMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tb2stZmcpOyBjb2xvcjogdmFyKC0tb2stZmcpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cdTI1QjZcdUZFMEYgUnVuIE5vdzwvYnV0dG9uPicgK1xuICAgICAgICAgICcgIDxidXR0b24gY2xhc3M9XCJzY2hlZHVsZS1kZWxldGVcIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoc2NoLmFwcElkKSArICdcIiBzdHlsZT1cInBhZGRpbmc6IDVweCAxMnB4OyBmb250LXNpemU6IDAuOHJlbTsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJhZC1mZyk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cdUQ4M0RcdURERDFcdUZFMEYgUmVtb3ZlPC9idXR0b24+JyArXG4gICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIFxuICAgICAgLy8gQWRkIFwiQWRkIFNjaGVkdWxlXCIgc2VjdGlvbiBhdCBib3R0b21cbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxNnB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSA1JSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBib3JkZXI6IDFweCBkYXNoZWQgdmFyKC0tYm9yZGVyKTtcIj4nICtcbiAgICAgICAgJzxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDEycHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cdTI3OTUgQWRkIE5ldyBTY2hlZHVsZTwvaDQ+JyArXG4gICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZsZXgtd3JhcDogd3JhcDtcIj4nICtcbiAgICAgICAgJyAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJuZXctc2NoZWR1bGUtYXBwaWRcIiBwbGFjZWhvbGRlcj1cIkFwcCBJRCAoZS5nLiwgcGxleCwgc29uYXJyKVwiIHN0eWxlPVwiZmxleDogMTsgbWluLXdpZHRoOiAxNTBweDsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpO1wiIC8+JyArXG4gICAgICAgICcgIDxzZWxlY3QgaWQ9XCJuZXctc2NoZWR1bGUtaW50ZXJ2YWxcIiBzdHlsZT1cInBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTtcIj4nICtcbiAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwiaG91cmx5XCI+SG91cmx5PC9vcHRpb24+JyArXG4gICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cImRhaWx5XCIgc2VsZWN0ZWQ+RGFpbHk8L29wdGlvbj4nICtcbiAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwid2Vla2x5XCI+V2Vla2x5PC9vcHRpb24+JyArXG4gICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIm1vbnRobHlcIj5Nb250aGx5PC9vcHRpb24+JyArXG4gICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIjZoXCI+RXZlcnkgNiBob3Vyczwvb3B0aW9uPicgK1xuICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCIzMG1cIj5FdmVyeSAzMCBtaW51dGVzPC9vcHRpb24+JyArXG4gICAgICAgICcgIDwvc2VsZWN0PicgK1xuICAgICAgICAnICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwibmV3LXNjaGVkdWxlLXJldGVudGlvblwiIHZhbHVlPVwiN1wiIG1pbj1cIjFcIiBtYXg9XCIxMDBcIiBwbGFjZWhvbGRlcj1cIktlZXBcIiBzdHlsZT1cIndpZHRoOiA3MHB4OyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7XCIgLz4nICtcbiAgICAgICAgJyAgPGJ1dHRvbiBpZD1cImFkZC1zY2hlZHVsZS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDhweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+QWRkIFNjaGVkdWxlPC9idXR0b24+JyArXG4gICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgJzwvZGl2Pic7XG4gICAgICBcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICBcbiAgICAgIC8vIFdpcmUgdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICBzY2hlZHVsZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuc2NoZWR1bGUtdG9nZ2xlJykuZm9yRWFjaChmdW5jdGlvbih0b2dnbGUpIHtcbiAgICAgICAgdG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyB1cGRhdGVTY2hlZHVsZSh0b2dnbGUuZGF0YXNldC5hcHBpZCwgeyBlbmFibGVkOiB0b2dnbGUuY2hlY2tlZCB9KTsgfSk7XG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zY2hlZHVsZS1zZWxlY3QnKS5mb3JFYWNoKGZ1bmN0aW9uKHNlbCkge1xuICAgICAgICBzZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oKSB7IHVwZGF0ZVNjaGVkdWxlKHNlbC5kYXRhc2V0LmFwcGlkLCB7IHNjaGVkdWxlOiBzZWwudmFsdWUgfSk7IH0pO1xuICAgICAgfSk7XG4gICAgICBzY2hlZHVsZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcucmV0ZW50aW9uLWlucHV0JykuZm9yRWFjaChmdW5jdGlvbihpbnApIHtcbiAgICAgICAgaW5wLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyB1cGRhdGVTY2hlZHVsZShpbnAuZGF0YXNldC5hcHBpZCwgeyByZXRlbnRpb246IHsga2VlcDogcGFyc2VJbnQoaW5wLnZhbHVlKSB8fCA3IH0gfSk7IH0pO1xuICAgICAgfSk7XG4gICAgICBzY2hlZHVsZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuc2NoZWR1bGUtcnVuLW5vdycpLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyBydW5CYWNrdXBOb3coYnRuLmRhdGFzZXQuYXBwaWQpOyB9KTtcbiAgICAgIH0pO1xuICAgICAgc2NoZWR1bGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnNjaGVkdWxlLWRlbGV0ZScpLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyBkZWxldGVTY2hlZHVsZShidG4uZGF0YXNldC5hcHBpZCk7IH0pO1xuICAgICAgfSk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLXNjaGVkdWxlLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFkZE5ld1NjaGVkdWxlKTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZCB0byBsb2FkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJzwvZGl2Pic7XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVTY2hlZHVsZShhcHBJZCwgdXBkYXRlcykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9zY2hlZHVsZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFwcElkLCAuLi51cGRhdGVzIH0pXG4gICAgICB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignU2NoZWR1bGUgdXBkYXRlZCBmb3IgJyArIGFwcElkLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignVXBkYXRlIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duJyksICdlcnJvcicpO1xuICAgICAgICBsb2FkU2NoZWR1bGVzVGFiKCk7IC8vIFJlZnJlc2ggb24gZmFpbHVyZVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGZ1bmN0aW9uIHJ1bkJhY2t1cE5vdyhhcHBJZCkge1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9iYWNrdXAvJyArIGVuY29kZVVSSUNvbXBvbmVudChhcHBJZCksIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9XG4gICAgICB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignQmFja3VwIHN0YXJ0ZWQgZm9yICcgKyBhcHBJZCArICchJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0JhY2t1cCBmYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93bicpLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBmdW5jdGlvbiBkZWxldGVTY2hlZHVsZShhcHBJZCkge1xuICAgIGlmICghY29uZmlybSgnUmVtb3ZlIGJhY2t1cCBzY2hlZHVsZSBmb3IgJyArIGFwcElkICsgJz8nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9zY2hlZHVsZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFwcElkKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdTY2hlZHVsZSByZW1vdmVkIGZvciAnICsgYXBwSWQsICdzdWNjZXNzJyk7XG4gICAgICAgIGxvYWRTY2hlZHVsZXNUYWIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0RlbGV0ZSBmYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93bicpLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBmdW5jdGlvbiBhZGROZXdTY2hlZHVsZSgpIHtcbiAgICB2YXIgYXBwSWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3LXNjaGVkdWxlLWFwcGlkJyk/LnZhbHVlPy50cmltKCk7XG4gICAgdmFyIGludGVydmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ldy1zY2hlZHVsZS1pbnRlcnZhbCcpPy52YWx1ZSB8fCAnZGFpbHknO1xuICAgIHZhciByZXRlbnRpb24gPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3LXNjaGVkdWxlLXJldGVudGlvbicpPy52YWx1ZSkgfHwgNztcbiAgICBcbiAgICBpZiAoIWFwcElkKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgYW4gQXBwIElEJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL3NjaGVkdWxlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYXBwSWQsIHNjaGVkdWxlOiBpbnRlcnZhbCwgcmV0ZW50aW9uOiB7IGtlZXA6IHJldGVudGlvbiB9LCBlbmFibGVkOiB0cnVlIH0pXG4gICAgICB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignU2NoZWR1bGUgY3JlYXRlZCBmb3IgJyArIGFwcElkLCAnc3VjY2VzcycpO1xuICAgICAgICBsb2FkU2NoZWR1bGVzVGFiKCk7XG4gICAgICAgIC8vIENsZWFyIGlucHV0c1xuICAgICAgICB2YXIgYXBwSWRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctc2NoZWR1bGUtYXBwaWQnKTtcbiAgICAgICAgaWYgKGFwcElkSW5wdXQpIGFwcElkSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duJyksICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8vID09PSBCYWNrdXBzIG9uIERpc2sgVGFiID09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkRGlza0JhY2t1cHMoKSB7XG4gICAgaWYgKCFkaXNrQ29udGFpbmVyKSByZXR1cm47XG4gICAgZGlza0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+JztcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2JhY2t1cHMvZmlsZXMnKTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQnKTtcblxuICAgICAgdmFyIGZpbGVzID0gZGF0YS5maWxlcyB8fCBbXTtcblxuICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkaXNrQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj4nICtcbiAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0JFPC9zcGFuPicgK1xuICAgICAgICAgICc8ZGl2Pk5vIGJhY2t1cCBmaWxlcyBvbiBkaXNrPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPlJ1biBhIGJhY2t1cCB0byBjcmVhdGUgYmFja3VwIGZpbGVzPC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gR3JvdXAgYnkgYXBwSWRcbiAgICAgIHZhciBieUFwcCA9IHt9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZiA9IGZpbGVzW2ldO1xuICAgICAgICB2YXIgYXBwSWQgPSBmLmFwcElkIHx8ICd1bmtub3duJztcbiAgICAgICAgaWYgKCFieUFwcFthcHBJZF0pIGJ5QXBwW2FwcElkXSA9IFtdO1xuICAgICAgICBieUFwcFthcHBJZF0ucHVzaChmKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj4nICsgZmlsZXMubGVuZ3RoICsgJyBiYWNrdXAgZmlsZShzKSBhY3Jvc3MgJyArIE9iamVjdC5rZXlzKGJ5QXBwKS5sZW5ndGggKyAnIGFwcChzKTwvZGl2Pic7XG4gICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMnB4O1wiPic7XG5cbiAgICAgIHZhciBhcHBJZHMgPSBPYmplY3Qua2V5cyhieUFwcCkuc29ydCgpO1xuICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBhcHBJZHMubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgdmFyIGFwcElkID0gYXBwSWRzW2FdO1xuICAgICAgICB2YXIgYXBwRmlsZXMgPSBieUFwcFthcHBJZF07XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IG92ZXJmbG93OiBoaWRkZW47XCI+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTJweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgOCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nICtcbiAgICAgICAgICBlc2NhcGVIdG1sKGFwcElkKSArICcgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogbm9ybWFsOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuNzVyZW07XCI+KCcgKyBhcHBGaWxlcy5sZW5ndGggKyAnIGJhY2t1cChzKSk8L3NwYW4+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhcHBGaWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHZhciBmID0gYXBwRmlsZXNbal07XG4gICAgICAgICAgdmFyIGRhdGVTdHIgPSBuZXcgRGF0ZShmLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMnB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj4nICtcbiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+JyArXG4gICAgICAgICAgICAnICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPicgKyBlc2NhcGVIdG1sKGYubmFtZSkgKyAnPC9kaXY+JyArXG4gICAgICAgICAgICAnICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPicgKyBmLnNpemVGb3JtYXR0ZWQgKyAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPicgKyBkYXRlU3RyICsgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDtcIj4nICtcbiAgICAgICAgICAgICcgIDxidXR0b24gY2xhc3M9XCJkaXNrLWNvbXBhcmUtYnRuXCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKGFwcElkKSArICdcIiBkYXRhLWZpbGVuYW1lPVwiJyArIGVzY2FwZUh0bWwoZi5uYW1lKSArICdcIiBzdHlsZT1cInBhZGRpbmc6IDNweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBib3JkZXItcmFkaXVzOiA1cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5Db21wYXJlPC9idXR0b24+JyArXG4gICAgICAgICAgICAnICA8YnV0dG9uIGNsYXNzPVwiZGlzay1yZXN0b3JlLWJ0blwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChhcHBJZCkgKyAnXCIgZGF0YS1maWxlbmFtZT1cIicgKyBlc2NhcGVIdG1sKGYubmFtZSkgKyAnXCIgc3R5bGU9XCJwYWRkaW5nOiAzcHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHZhcigtLW9rLWZnKSwgIzI3YWU2MCk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA1cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDUwMDtcIj5SZXN0b3JlPC9idXR0b24+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcblxuICAgICAgZGlza0NvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICAvLyBXaXJlIHVwIGJ1dHRvbnNcbiAgICAgIGRpc2tDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmRpc2stY29tcGFyZS1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bikge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgY29tcGFyZUJhY2t1cEZpbGUoYnRuLmRhdGFzZXQuYXBwaWQsIGJ0bi5kYXRhc2V0LmZpbGVuYW1lKTsgfSk7XG4gICAgICB9KTtcbiAgICAgIGRpc2tDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmRpc2stcmVzdG9yZS1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bikge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgcmVzdG9yZUJhY2t1cEZpbGUoYnRuLmRhdGFzZXQuYXBwaWQsIGJ0bi5kYXRhc2V0LmZpbGVuYW1lKTsgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkaXNrQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gPT09IEJhY2t1cCBIaXN0b3J5IFRhYiA9PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEJhY2t1cEhpc3RvcnkoKSB7XG4gICAgaWYgKCFoaXN0b3J5Q29udGFpbmVyKSByZXR1cm47XG4gICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+JztcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2JhY2t1cHMvaGlzdG9yeT9saW1pdD01MCcpO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEuaGlzdG9yeT8ubGVuZ3RoKSB7XG4gICAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQjwvc3Bhbj4gTm8gYmFja3VwIGhpc3RvcnkgeWV0PC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4O1wiPic7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuaGlzdG9yeS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYmsgPSBkYXRhLmhpc3RvcnlbaV07XG4gICAgICAgIHZhciBzaXplTUIgPSBiay5zaXplID8gKGJrLnNpemUgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgyKSA6ICc/JztcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuODVyZW07XCI+JztcbiAgICAgICAgaHRtbCArPSAnICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+JztcbiAgICAgICAgaHRtbCArPSAnICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDtcIj4nICsgZXNjYXBlSHRtbChiay5uYW1lIHx8ICdiYWNrdXAnKSArICc8L3NwYW4+JztcbiAgICAgICAgaHRtbCArPSAnICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDtcIj4nO1xuICAgICAgICBodG1sICs9ICcgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1iYWRnZSAnICsgKGJrLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnID8gJ3N1Y2Nlc3MnIDogJ2Rvd24nKSArICdcIj4nICsgZXNjYXBlSHRtbChiay5zdGF0dXMpICsgJzwvc3Bhbj4nO1xuICAgICAgICBpZiAoYmsuc3RhdHVzID09PSAnc3VjY2VzcycpIGh0bWwgKz0gJyAgICAgIDxidXR0b24gY2xhc3M9XCJiYWNrdXAtcmVzdG9yZS1idG5cIiBkYXRhLWJhY2t1cC1pZD1cIicgKyBlc2NhcGVIdG1sKGJrLmlkKSArICdcIiBzdHlsZT1cInBhZGRpbmc6IDNweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj5SZXN0b3JlPC9idXR0b24+JztcbiAgICAgICAgaHRtbCArPSAnICAgIDwvZGl2Pic7XG4gICAgICAgIGh0bWwgKz0gJyAgPC9kaXY+JztcbiAgICAgICAgaHRtbCArPSAnICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPic7XG4gICAgICAgIGh0bWwgKz0gJyAgICAnICsgbmV3IERhdGUoYmsudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpICsgJyB8ICcgKyBzaXplTUIgKyAnIE1CIHwgJyArIChiay5kdXJhdGlvbiA/IChiay5kdXJhdGlvbiAvIDEwMDApLnRvRml4ZWQoMSkgKyAncycgOiAnLS0nKTtcbiAgICAgICAgaWYgKGJrLmVuY3J5cHRlZCkgaHRtbCArPSAnIHwgXHVEODNEXHVERDEyJztcbiAgICAgICAgaHRtbCArPSAnICA8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGhpc3RvcnlDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmJhY2t1cC1yZXN0b3JlLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyB3aW5kb3cuX19yZXN0b3JlU2VydmVyQmFja3VwKGJ0bi5kYXRhc2V0LmJhY2t1cElkKTsgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIHdpbmRvdy5fX3Jlc3RvcmVTZXJ2ZXJCYWNrdXAgPSBhc3luYyBmdW5jdGlvbihiYWNrdXBJZCkge1xuICAgIGlmICghY29uZmlybSgnUmVzdG9yZSBmcm9tIHRoaXMgc2VydmVyIGJhY2t1cD8gVGhpcyB3aWxsIG92ZXJ3cml0ZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uJykpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cHMvcmVzdG9yZS8nICsgYmFja3VwSWQsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJlc3RvcmVTZXJ2aWNlczogdHJ1ZSwgcmVzdG9yZUNvbmZpZzogdHJ1ZSB9KVxuICAgICAgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1Jlc3RvcmUgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSEnLCAnc3VjY2VzcycpO1xuICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1Jlc3RvcmUgZmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyBzaG93Tm90aWZpY2F0aW9uKCdSZXN0b3JlIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTsgfVxuICB9O1xuXG4gIC8vIExhenktbG9hZCB0YWJzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiYmFja3VwLXNjaGVkdWxlcy10YWJcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkU2NoZWR1bGVzVGFiKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJiYWNrdXAtZGlzay10YWJcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkRGlza0JhY2t1cHMpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cImJhY2t1cC1wb2ludGludGltZS10YWJcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkUG9pbnRJblRpbWVUYWIpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cImJhY2t1cC1oaXN0b3J5LXRhYlwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRCYWNrdXBIaXN0b3J5KTtcblxuICAvLyA9PT09PSBQb2ludC1pbi1UaW1lIFJlc3RvcmUgVGFiID09PT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRQb2ludEluVGltZVRhYigpIHtcbiAgICBpZiAoIXBvaW50aW50aW1lQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBwcmVtaXVtXG4gICAgdHJ5IHtcbiAgICAgIHZhciBsaWNlbnNlUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbGljZW5zZS9zdGF0dXMnKTtcbiAgICAgIHZhciBsaWNlbnNlRGF0YSA9IGF3YWl0IGxpY2Vuc2VSZXMuanNvbigpO1xuICAgICAgaWYgKGxpY2Vuc2VEYXRhLnRpZXIgIT09ICdwcmVtaXVtJykge1xuICAgICAgICBwb2ludGludGltZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJwYWRkaW5nOiAyNHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDJyZW07IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XHUyQjUwPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+UHJlbWl1bSBGZWF0dXJlPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UG9pbnQtaW4tdGltZSByZXN0b3JlIHJlcXVpcmVzIERhc2hDYWRkeSBQcmVtaXVtIHdpdGggYXV0by1iYWNrdXAgZW5hYmxlZC48L2Rpdj4nICtcbiAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPVwic2hvd05vdGlmaWNhdGlvbihcXCdVcGdyYWRlIHRvIFByZW1pdW0gZm9yIHBvaW50LWluLXRpbWUgcmVzdG9yZSFcXCcsIFxcJ2luZm9cXCcpOyBzY3JvbGxUb1NlY3Rpb24oXFwnbGljZW5zZVxcJyk7XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiA4cHggMjBweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2YzOWMxMiwgI2U2N2UyMik7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDtcIj5VcGdyYWRlIHRvIFByZW1pdW08L2J1dHRvbj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cblxuICAgIHBvaW50aW50aW1lQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZldGNoIHNlcnZpY2VzIGZvciBkcm9wZG93blxuICAgICAgdmFyIHNlcnZpY2VzUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2VydmljZXMnKTtcbiAgICAgIHZhciBzZXJ2aWNlc0RhdGEgPSBhd2FpdCBzZXJ2aWNlc1Jlcy5qc29uKCk7XG4gICAgICB2YXIgc2VydmljZXMgPSBzZXJ2aWNlc0RhdGEuc2VydmljZXMgfHwgW107XG5cbiAgICAgIGlmIChzZXJ2aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcG9pbnRpbnRpbWVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENFNjwvc3Bhbj4gTm8gYXBwcyBkZXBsb3llZCB5ZXQ8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiA4cHggMCAxMnB4O1wiPicgK1xuICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPicgK1xuICAgICAgICAnICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+QXBwOjwvbGFiZWw+JyArXG4gICAgICAgICcgIDxzZWxlY3QgaWQ9XCJwaXQtYXBwLXNlbGVjdFwiIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBtYXgtd2lkdGg6IDI0MHB4O1wiPic7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGh0bWwgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgZXNjYXBlSHRtbChzZXJ2aWNlc1tpXS5pZCB8fCBzZXJ2aWNlc1tpXS5uYW1lIHx8ICcnKSArICdcIj4nICtcbiAgICAgICAgICBlc2NhcGVIdG1sKHNlcnZpY2VzW2ldLm5hbWUgfHwgc2VydmljZXNbaV0uaWQgfHwgJycpICsgJzwvb3B0aW9uPic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3NlbGVjdD4nICtcbiAgICAgICAgJyAgPGJ1dHRvbiBpZD1cInBpdC1sb2FkLWJ0blwiIHN0eWxlPVwicGFkZGluZzogOHB4IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDUwMDtcIj5Mb2FkIEJhY2t1cHM8L2J1dHRvbj4nICtcbiAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAnPGRpdiBpZD1cInBpdC1iYWNrdXBzLWxpc3RcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDMyMHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPjwvZGl2PicgK1xuICAgICAgICAnPC9kaXY+JztcblxuICAgICAgcG9pbnRpbnRpbWVDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpdC1sb2FkLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXBwSWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGl0LWFwcC1zZWxlY3QnKT8udmFsdWU7XG4gICAgICAgIGlmIChhcHBJZCkgbG9hZFBvaW50SW5UaW1lQmFja3VwcyhhcHBJZCk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBwb2ludGludGltZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkUG9pbnRJblRpbWVCYWNrdXBzKGFwcElkKSB7XG4gICAgdmFyIGxpc3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaXQtYmFja3Vwcy1saXN0Jyk7XG4gICAgaWYgKCFsaXN0RWwpIHJldHVybjtcblxuICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgYmFja3Vwcy4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2JhY2t1cHMvZmlsZXMvJyArIGVuY29kZVVSSUNvbXBvbmVudChhcHBJZCkpO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhZGF0YS5maWxlcyB8fCBkYXRhLmZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsaXN0RWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENCRTwvc3Bhbj4gTm8gYmFja3VwIGZpbGVzIGZvciAnICsgZXNjYXBlSHRtbChhcHBJZCkgKyAnPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+JyArIGRhdGEuZmlsZXMubGVuZ3RoICsgJyBiYWNrdXAocyk8L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDtcIj4nO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGYgPSBkYXRhLmZpbGVzW2ldO1xuICAgICAgICB2YXIgZGF0ZVN0ciA9IG5ldyBEYXRlKGYudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDRweDtcIj4nICtcbiAgICAgICAgICAnICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPicgKyBlc2NhcGVIdG1sKGYubmFtZSkgKyAnPC9kaXY+JyArXG4gICAgICAgICAgJyAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgZi5zaXplRm9ybWF0dGVkICsgJzwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPicgKyBkYXRlU3RyICsgJzwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA2cHg7XCI+JyArXG4gICAgICAgICAgJyAgPGJ1dHRvbiBjbGFzcz1cInBpdC1jb21wYXJlLWJ0blwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChhcHBJZCkgKyAnXCIgZGF0YS1maWxlbmFtZT1cIicgKyBlc2NhcGVIdG1sKGYubmFtZSkgKyAnXCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWFjY2VudCk7IGJvcmRlci1yYWRpdXM6IDVweDsgY3Vyc29yOiBwb2ludGVyO1wiPkNvbXBhcmU8L2J1dHRvbj4nICtcbiAgICAgICAgICAnICA8YnV0dG9uIGNsYXNzPVwicGl0LXJlc3RvcmUtYnRuXCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKGFwcElkKSArICdcIiBkYXRhLWZpbGVuYW1lPVwiJyArIGVzY2FwZUh0bWwoZi5uYW1lKSArICdcIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHZhcigtLW9rLWZnKSwgIzI3YWU2MCk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA1cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDUwMDtcIj5SZXN0b3JlPC9idXR0b24+JyArXG4gICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICAvLyBXaXJlIHVwIGJ1dHRvbnNcbiAgICAgIGxpc3RFbC5xdWVyeVNlbGVjdG9yQWxsKCcucGl0LWNvbXBhcmUtYnRuJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IGNvbXBhcmVCYWNrdXBGaWxlKGJ0bi5kYXRhc2V0LmFwcGlkLCBidG4uZGF0YXNldC5maWxlbmFtZSk7IH0pO1xuICAgICAgfSk7XG4gICAgICBsaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnLnBpdC1yZXN0b3JlLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyByZXN0b3JlQmFja3VwRmlsZShidG4uZGF0YXNldC5hcHBpZCwgYnRuLmRhdGFzZXQuZmlsZW5hbWUpOyB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjb21wYXJlQmFja3VwRmlsZShhcHBJZCwgZmlsZW5hbWUpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cHMvY29tcGFyZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKSwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHt9KVxuICAgICAgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdDb21wYXJlIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duJyksICdlcnJvcicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBkaWZmID0gZGF0YS5kaWZmO1xuICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBmaXhlZDsgdG9wOiAwOyBsZWZ0OiAwOyByaWdodDogMDsgYm90dG9tOiAwOyBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNSk7IHotaW5kZXg6IDEwMDAwOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIiBpZD1cImNvbXBhcmUtb3ZlcmxheVwiPicgK1xuICAgICAgICAnPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiAxMnB4OyBtYXgtd2lkdGg6IDYwMHB4OyB3aWR0aDogOTAlOyBtYXgtaGVpZ2h0OiA4MHZoOyBvdmVyZmxvdzogYXV0bzsgcGFkZGluZzogMjBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj4nICtcbiAgICAgICAgJzxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDE2cHg7XCI+XHVEODNEXHVEQ0NBIENvbXBhcmU6ICcgKyBlc2NhcGVIdG1sKGZpbGVuYW1lKSArICc8L2g0PicgK1xuICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlNpemU6ICcgKyAoZGlmZi5zaXplRm9ybWF0dGVkIHx8ICc/JykgKyAnIHwgQ3JlYXRlZDogJyArIG5ldyBEYXRlKGRpZmYudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpICsgJzwvZGl2Pic7XG5cbiAgICAgIGlmIChkaWZmLnNlcnZpY2VzKSB7XG4gICAgICAgIHZhciBzdmNDaGFuZ2VkID0gZGlmZi5zZXJ2aWNlcy5oYXNDaGFuZ2VzID8gJ1x1RDgzRFx1REQzNCcgOiAnXHVEODNEXHVERkUyJztcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC44NXJlbTsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPicgKyBzdmNDaGFuZ2VkICsgJyBTZXJ2aWNlcyAoYmFja3VwIHZzIGN1cnJlbnQpPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5CYWNrdXA6ICcgKyBkaWZmLnNlcnZpY2VzLmJhY2t1cENvdW50ICsgJyBzZXJ2aWNlcyB8IEN1cnJlbnQ6ICcgKyBkaWZmLnNlcnZpY2VzLmN1cnJlbnRDb3VudCArICcgc2VydmljZXM8L2Rpdj4nO1xuICAgICAgICBpZiAoZGlmZi5zZXJ2aWNlcy5oYXNDaGFuZ2VzKSB7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDZweDsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiAjZjM5YzEyO1wiPlNlcnZpY2VzIGRpZmZlciBcdTIwMTQgcmVzdG9yaW5nIHdpbGwgcmVwbGFjZSBjdXJyZW50IGNvbmZpZ3VyYXRpb248L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaWZmLmNvbmZpZykge1xuICAgICAgICB2YXIgY2ZnQ2hhbmdlZCA9IGRpZmYuY29uZmlnLmhhc0NoYW5nZXMgPyAnXHVEODNEXHVERDM0JyA6ICdcdUQ4M0RcdURGRTInO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+JyArIGNmZ0NoYW5nZWQgKyAnIENvbmZpZ3VyYXRpb248L2Rpdj4nO1xuICAgICAgICBpZiAoZGlmZi5jb25maWcuaGFzQ2hhbmdlcykge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6ICNmMzljMTI7XCI+Q29uZmlndXJhdGlvbiBkaWZmZXJzIFx1MjAxNCByZXN0b3Jpbmcgd2lsbCByZXBsYWNlIGN1cnJlbnQgc2V0dGluZ3M8L2Rpdj4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW9rLWZnKTtcIj5ObyBjaGFuZ2VzPC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgfVxuXG4gICAgICBodG1sICs9ICc8YnV0dG9uIGlkPVwiY29tcGFyZS1jbG9zZS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDhweCAyMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+Q2xvc2U8L2J1dHRvbj4nICtcbiAgICAgICAgJzwvZGl2PjwvZGl2Pic7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wYXJlLWNsb3NlLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcGFyZS1vdmVybGF5Jyk/LnJlbW92ZSgpO1xuICAgICAgfSk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcGFyZS1vdmVybGF5Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuICAgICAgICBpZiAoZS50YXJnZXQgPT09IHRoaXMpIHRoaXMucmVtb3ZlKCk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdDb21wYXJlIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZXN0b3JlQmFja3VwRmlsZShhcHBJZCwgZmlsZW5hbWUpIHtcbiAgICBpZiAoIWNvbmZpcm0oJ1Jlc3RvcmUgJyArIGZpbGVuYW1lICsgJyBmb3IgJyArIGFwcElkICsgJz9cXG5cXG5UaGlzIHdpbGwgcmVwbGFjZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24sIGNyZWRlbnRpYWxzLCBhbmQgZGF0YS4gQ29udGFpbmVycyB3aWxsIGJlIHJlc3RhcnRlZC4nKSkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hcHBzLycgKyBlbmNvZGVVUklDb21wb25lbnQoYXBwSWQpICsgJy9yZXZlcnQvJyArIGVuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSksIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJlc3RhcnRDb250YWluZXJzOiB0cnVlIH0pXG4gICAgICB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihhcHBJZCArICcgcmVzdG9yZWQgdG8gJyArIGZpbGVuYW1lLCAnc3VjY2VzcycpO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBsb2NhdGlvbi5yZWxvYWQoKTsgfSwgMTUwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZXN0b3JlIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duJyksICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1Jlc3RvcmUgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxufSkoKTtcbjtcbi8vID09PT09PT09PT0gUkVTT1VSQ0UgTU9OSVRPUiAoRW5oYW5jZWQpID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ3N0YXRzLW1vZGFsJywgYDxkaXYgaWQ9XCJzdGF0cy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNzUwcHg7IG1heC13aWR0aDogOTUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0NBIFJlc291cmNlIE1vbml0b3I8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlxuICAgICAgICBSZWFsLXRpbWUgYW5kIGhpc3RvcmljYWwgQ1BVLCBtZW1vcnksIG5ldHdvcmssIGFuZCBkaXNrIHVzYWdlIGZvciBjb250YWluZXJzLlxuICAgICAgPC9wPlxuXG4gICAgICA8IS0tIFRhYiBiYXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJzdGF0cy1saXZlXCI+TGl2ZSBTdGF0czwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cInN0YXRzLWFnZ3JlZ2F0ZWRcIj4yNGggU3VtbWFyeTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cInN0YXRzLWhpc3RvcnlcIj5IaXN0b3J5PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwic3RhdHMtYWxlcnRzXCI+QWxlcnRzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IExpdmUgU3RhdHMgLS0+XG4gICAgICA8ZGl2IGlkPVwic3RhdHMtbGl2ZVwiIGNsYXNzPVwicGFuZWwtc2VjdGlvbiBhY3RpdmVcIj5cbiAgICAgICAgPGRpdiBpZD1cInN0YXRzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgY29udGFpbmVyIHN0YXRzLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiAyNGggQWdncmVnYXRlZCBTdW1tYXJ5IC0tPlxuICAgICAgPGRpdiBpZD1cInN0YXRzLWFnZ3JlZ2F0ZWRcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cInN0YXRzLWFnZ3JlZ2F0ZWQtY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQzg8L3NwYW4+XG4gICAgICAgICAgICBMb2FkaW5nIDI0LWhvdXIgYWdncmVnYXRlZCBtZXRyaWNzLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBMb25nLXRlcm0gSGlzdG9yeSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdGF0cy1oaXN0b3J5XCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogMTJweDsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Db250YWluZXI6PC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic3RhdHMtaGlzdG9yeS1jb250YWluZXJcIiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjg1cmVtOyBmbGV4OiAxOyBtaW4td2lkdGg6IDE4MHB4O1wiPjwvc2VsZWN0PlxuICAgICAgICAgIDxkaXYgaWQ9XCJzdGF0cy1oaXN0b3J5LXJhbmdlLWJ1dHRvbnNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4O1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0YXRzLXJhbmdlLWJ0biBhY3RpdmVcIiBkYXRhLXJhbmdlPVwiMWhcIj4xaDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0YXRzLXJhbmdlLWJ0blwiIGRhdGEtcmFuZ2U9XCIyNGhcIj4yNGg8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdGF0cy1yYW5nZS1idG5cIiBkYXRhLXJhbmdlPVwiN2RcIj43ZDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0YXRzLXJhbmdlLWJ0blwiIGRhdGEtcmFuZ2U9XCIzMGRcIj4zMGQ8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdGF0cy1yYW5nZS1idG5cIiBkYXRhLXJhbmdlPVwiMXlcIj4xeTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInN0YXRzLWhpc3RvcnktY29udGFpbmVyLWFyZWFcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQTwvc3Bhbj5cbiAgICAgICAgICAgIENob29zZSBhIGNvbnRhaW5lciBhbmQgdGltZSByYW5nZSB0byB2aWV3IGhpc3RvcnkuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBBbGVydCBDb25maWd1cmF0aW9uIC0tPlxuICAgICAgPGRpdiBpZD1cInN0YXRzLWFsZXJ0c1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwic3RhdHMtYWxlcnRzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVERDE0PC9zcGFuPlxuICAgICAgICAgICAgTG9hZGluZyBhbGVydCBjb25maWd1cmF0aW9ucy4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEF1dG8tcmVmcmVzaCB0b2dnbGUgKGJvdHRvbSBiYXIpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvdHRvbS1iYXJcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJzdGF0cy1hdXRvLXJlZnJlc2hcIiBjaGVja2VkIC8+XG4gICAgICAgICAgQXV0by1yZWZyZXNoIGV2ZXJ5IDVzXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzdGF0cy1yZWZyZXNoLWJ0blwiIGNsYXNzPVwiYnRuLXNtXCI+XHVEODNEXHVERDA0IFJlZnJlc2ggTm93PC9idXR0b24+XG4gICAgICAgIDxzcGFuIGlkPVwic3RhdHMtbGFzdC11cGRhdGVcIiBjbGFzcz1cInRleHQtYXV0by1yaWdodFwiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIEJ1dHRvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwic3RhdHMtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lci1zdGF0cy1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWNhbmNlbCcpO1xuICBjb25zdCByZWZyZXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLXJlZnJlc2gtYnRuJyk7XG4gIGNvbnN0IGF1dG9SZWZyZXNoQ2hlY2tib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtYXV0by1yZWZyZXNoJyk7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1jb250YWluZXInKTtcbiAgY29uc3QgYWdncmVnYXRlZENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1hZ2dyZWdhdGVkLWNvbnRhaW5lcicpO1xuICBjb25zdCBhbGVydHNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtYWxlcnRzLWNvbnRhaW5lcicpO1xuICBjb25zdCBsYXN0VXBkYXRlU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1sYXN0LXVwZGF0ZScpO1xuXG4gIGxldCByZWZyZXNoSW50ZXJ2YWwgPSBudWxsO1xuICBsZXQgY2FjaGVkTW9uaXRvcmluZ0RhdGEgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGZvcm1hdEJ5dGVzKGJ5dGVzKSB7XG4gICAgaWYgKGJ5dGVzID09PSAwIHx8ICFieXRlcykgcmV0dXJuICcwIEInO1xuICAgIGNvbnN0IGsgPSAxMDI0O1xuICAgIGNvbnN0IHNpemVzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJ107XG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpO1xuICAgIHJldHVybiBwYXJzZUZsb2F0KChieXRlcyAvIE1hdGgucG93KGssIGkpKS50b0ZpeGVkKDEpKSArICcgJyArIHNpemVzW2ldO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q3B1Q29sb3IocGVyY2VudCkge1xuICAgIGlmIChwZXJjZW50IDwgMzApIHJldHVybiAnIzJlY2M3MSc7XG4gICAgaWYgKHBlcmNlbnQgPCA3MCkgcmV0dXJuICcjZjM5YzEyJztcbiAgICByZXR1cm4gJyNlNzRjM2MnO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWVtQ29sb3IocGVyY2VudCkge1xuICAgIGlmIChwZXJjZW50IDwgNTApIHJldHVybiAnIzJlY2M3MSc7XG4gICAgaWYgKHBlcmNlbnQgPCA4MCkgcmV0dXJuICcjZjM5YzEyJztcbiAgICByZXR1cm4gJyNlNzRjM2MnO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFN0YXRzKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgbmV3IG1vbml0b3JpbmcgQVBJIGZpcnN0LCBmYWxsIGJhY2sgdG8gb2xkXG4gICAgICBsZXQgc3RhdHMgPSBudWxsO1xuICAgICAgbGV0IGlzTmV3QXBpID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9tb25pdG9yaW5nL3N0YXRzJyk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzICYmIGRhdGEuc3RhdHMpIHsgc3RhdHMgPSBkYXRhLnN0YXRzOyBpc05ld0FwaSA9IHRydWU7IGNhY2hlZE1vbml0b3JpbmdEYXRhID0gZGF0YS5zdGF0czsgfVxuICAgICAgfSBjYXRjaCAoXykge31cblxuICAgICAgaWYgKCFpc05ld0FwaSkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3N0YXRzL2NvbnRhaW5lcnMnKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLnN0YXRzKSB7XG4gICAgICAgICAgLy8gQ29udmVydCBhcnJheSBmb3JtYXQgdG8gb2JqZWN0IGZvcm1hdFxuICAgICAgICAgIHN0YXRzID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBzIG9mIGRhdGEuc3RhdHMpIHtcbiAgICAgICAgICAgIHN0YXRzW3MubmFtZV0gPSB7IG5hbWU6IHMubmFtZSwgY3VycmVudDogeyBjcHU6IHMuY3B1LCBtZW1vcnk6IHsgcGVyY2VudDogcy5tZW1vcnkucGVyY2VudCwgdXNhZ2U6IHMubWVtb3J5LnVzZWQsIGxpbWl0OiBzLm1lbW9yeS5saW1pdCwgdXNhZ2VNQjogTWF0aC5yb3VuZChzLm1lbW9yeS51c2VkIC8gMTA0ODU3NiksIGxpbWl0TUI6IE1hdGgucm91bmQocy5tZW1vcnkubGltaXQgLyAxMDQ4NTc2KSB9LCBuZXR3b3JrOiB7IHJ4Qnl0ZXM6IHMubmV0d29yay5yeCwgdHhCeXRlczogcy5uZXR3b3JrLnR4LCByeE1COiAocy5uZXR3b3JrLnJ4IC8gMTA0ODU3NikudG9GaXhlZCgxKSwgdHhNQjogKHMubmV0d29yay50eCAvIDEwNDg1NzYpLnRvRml4ZWQoMSkgfSwgZGlzazogeyByZWFkTUI6IDAsIHdyaXRlTUI6IDAgfSB9LCBzdGF0dXM6IHMuc3RhdHVzIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhY2hlZE1vbml0b3JpbmdEYXRhID0gc3RhdHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFzdGF0cyB8fCBPYmplY3Qua2V5cyhzdGF0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5ObyBydW5uaW5nIGNvbnRhaW5lcnMgZm91bmQ8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDtcIj4nO1xuXG4gICAgICBmb3IgKGNvbnN0IFtpZCwgaW5mb10gb2YgT2JqZWN0LmVudHJpZXMoc3RhdHMpKSB7XG4gICAgICAgIGNvbnN0IGN1ciA9IGluZm8uY3VycmVudCB8fCBpbmZvO1xuICAgICAgICBjb25zdCBjcHUgPSBjdXIuY3B1Py5wZXJjZW50IHx8IDA7XG4gICAgICAgIGNvbnN0IG1lbSA9IGN1ci5tZW1vcnk/LnBlcmNlbnQgfHwgMDtcbiAgICAgICAgY29uc3QgY3B1Q29sb3IgPSBnZXRDcHVDb2xvcihjcHUpO1xuICAgICAgICBjb25zdCBtZW1Db2xvciA9IGdldE1lbUNvbG9yKG1lbSk7XG4gICAgICAgIGNvbnN0IG1lbVVzZWQgPSBjdXIubWVtb3J5Py51c2FnZSB8fCBjdXIubWVtb3J5Py51c2VkIHx8IDA7XG4gICAgICAgIGNvbnN0IG1lbUxpbWl0ID0gY3VyLm1lbW9yeT8ubGltaXQgfHwgMDtcbiAgICAgICAgY29uc3QgbmV0UnggPSBjdXIubmV0d29yaz8ucnhCeXRlcyB8fCBjdXIubmV0d29yaz8ucnggfHwgMDtcbiAgICAgICAgY29uc3QgbmV0VHggPSBjdXIubmV0d29yaz8udHhCeXRlcyB8fCBjdXIubmV0d29yaz8udHggfHwgMDtcbiAgICAgICAgY29uc3QgYWdnID0gaW5mby5hZ2dyZWdhdGVkO1xuXG4gICAgICAgIGh0bWwgKz0gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZsZXg6IDE7XCI+JHtpbmZvLm5hbWUgfHwgaWR9PC9zcGFuPlxuICAgICAgICAgICAgICAke2FnZyA/IGA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC42NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgcGFkZGluZzogMnB4IDZweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgMTAlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5hdmcgJHthZ2cuY3B1Py5hdmc/LnRvRml4ZWQoMCkgfHwgMH0lIGNwdTwvc3Bhbj5gIDogJyd9XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgcGFkZGluZzogMnB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4O1wiPiR7aW5mby5zdGF0dXMgfHwgJ3J1bm5pbmcnfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIDFmcik7IGdhcDogMTJweDtcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDtcIj5DUFU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgaGVpZ2h0OiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiAzcHg7IG92ZXJmbG93OiBoaWRkZW47XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7IHdpZHRoOiAke01hdGgubWluKGNwdSwgMTAwKX0lOyBiYWNrZ3JvdW5kOiAke2NwdUNvbG9yfTsgYm9yZGVyLXJhZGl1czogM3B4OyB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBmb250LXdlaWdodDogNTAwOyBjb2xvcjogJHtjcHVDb2xvcn07IG1pbi13aWR0aDogNDVweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+JHtjcHUudG9GaXhlZCgxKX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDtcIj5NZW1vcnk8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgaGVpZ2h0OiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiAzcHg7IG92ZXJmbG93OiBoaWRkZW47XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7IHdpZHRoOiAke01hdGgubWluKG1lbSwgMTAwKX0lOyBiYWNrZ3JvdW5kOiAke21lbUNvbG9yfTsgYm9yZGVyLXJhZGl1czogM3B4OyB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzO1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBmb250LXdlaWdodDogNTAwOyBjb2xvcjogJHttZW1Db2xvcn07IG1pbi13aWR0aDogNDVweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+JHttZW0udG9GaXhlZCgxKX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDJweDtcIj4ke2Zvcm1hdEJ5dGVzKG1lbVVzZWQpfSAvICR7Zm9ybWF0Qnl0ZXMobWVtTGltaXQpfTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDtcIj5OZXR3b3JrPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzM0OThkYjtcIj5cdTIxOTMgJHtmb3JtYXRCeXRlcyhuZXRSeCl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgNHB4O1wiPi88L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjZTc0YzNjO1wiPlx1MjE5MSAke2Zvcm1hdEJ5dGVzKG5ldFR4KX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGxhc3RVcGRhdGVTcGFuLnRleHRDb250ZW50ID0gJ1VwZGF0ZWQ6ICcgKyBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XHUyNzRDIEZhaWxlZCB0byBsb2FkIHN0YXRzOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PSAyNGggQWdncmVnYXRlZCBUYWIgPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRBZ2dyZWdhdGVkKCkge1xuICAgIGlmICghYWdncmVnYXRlZENvbnRhaW5lcikgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBjYWNoZWRNb25pdG9yaW5nRGF0YTtcbiAgICBpZiAoIWRhdGEgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBhZ2dyZWdhdGVkQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQzg8L3NwYW4+Tm8gbW9uaXRvcmluZyBkYXRhIGF2YWlsYWJsZS4gT3BlbiB0aGUgTGl2ZSBTdGF0cyB0YWIgZmlyc3QuPC9kaXY+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGh0bWwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTJweDtcIj4nO1xuICAgIGZvciAoY29uc3QgW2lkLCBpbmZvXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgY29uc3QgYWdnID0gaW5mby5hZ2dyZWdhdGVkO1xuICAgICAgaWYgKCFhZ2cpIGNvbnRpbnVlO1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+JHtpbmZvLm5hbWUgfHwgaWR9PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg0LCAxZnIpOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdC1taW5pLWNhcmRcIj48c3BhbiBjbGFzcz1cInN0YXQtdmFsXCI+JHthZ2cuY3B1Py5hdmc/LnRvRml4ZWQoMSkgfHwgMH0lPC9zcGFuPjxzcGFuIGNsYXNzPVwic3RhdC1sYmxcIj5BdmcgQ1BVPC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LW1pbmktY2FyZFwiPjxzcGFuIGNsYXNzPVwic3RhdC12YWxcIj4ke2FnZy5jcHU/Lm1heD8udG9GaXhlZCgxKSB8fCAwfSU8L3NwYW4+PHNwYW4gY2xhc3M9XCJzdGF0LWxibFwiPk1heCBDUFU8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXQtbWluaS1jYXJkXCI+PHNwYW4gY2xhc3M9XCJzdGF0LXZhbFwiPiR7YWdnLm1lbW9yeT8uYXZnPy50b0ZpeGVkKDEpIHx8IDB9JTwvc3Bhbj48c3BhbiBjbGFzcz1cInN0YXQtbGJsXCI+QXZnIE1lbTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdC1taW5pLWNhcmRcIj48c3BhbiBjbGFzcz1cInN0YXQtdmFsXCI+JHthZ2cubWVtb3J5Py5tYXg/LnRvRml4ZWQoMSkgfHwgMH0lPC9zcGFuPjxzcGFuIGNsYXNzPVwic3RhdC1sYmxcIj5NYXggTWVtPC9zcGFuPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHthZ2cuZGF0YVBvaW50cyA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDZweDtcIj4ke2FnZy5kYXRhUG9pbnRzfSBkYXRhIHBvaW50cyBvdmVyICR7YWdnLnRpbWVSYW5nZSB8fCAyNH1oPC9kaXY+YCA6ICcnfVxuICAgICAgPC9kaXY+YDtcbiAgICB9XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICBhZ2dyZWdhdGVkQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICAvLyA9PT0gQWxlcnRzIFRhYiA9PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEFsZXJ0cygpIHtcbiAgICBpZiAoIWFsZXJ0c0NvbnRhaW5lcikgcmV0dXJuO1xuICAgIGFsZXJ0c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGFsZXJ0cy4uLjwvZGl2Pic7XG5cbiAgICBjb25zdCBkYXRhID0gY2FjaGVkTW9uaXRvcmluZ0RhdGE7XG4gICAgaWYgKCFkYXRhIHx8IE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYWxlcnRzQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdUREMTQ8L3NwYW4+Tm8gY29udGFpbmVycyBmb3VuZC4gT3BlbiB0aGUgTGl2ZSBTdGF0cyB0YWIgZmlyc3QuPC9kaXY+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBwcmVtaXVtIHN0YXR1cyBmb3IgY29uZmlnIHNlY3Rpb24gdmlzaWJpbGl0eVxuICAgIGxldCBpc1ByZW1pdW0gPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xpY2Vuc2UvZmVhdHVyZS9yZXNvdXJjZS1hbGVydHMnKTtcbiAgICAgIGNvbnN0IGxkID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBpc1ByZW1pdW0gPSBsZC5hdmFpbGFibGU7XG4gICAgfSBjYXRjaCAoXykgeyBpc1ByZW1pdW0gPSBmYWxzZTsgfVxuXG4gICAgLy8gRmV0Y2ggYWxlcnQgaGlzdG9yeVxuICAgIGxldCBhbGVydEhpc3RvcnkgPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9tb25pdG9yaW5nL2FsZXJ0cz9saW1pdD01MCcpO1xuICAgICAgY29uc3QgaGQgPSBhd2FpdCBoci5qc29uKCk7XG4gICAgICBpZiAoaGQuc3VjY2VzcykgYWxlcnRIaXN0b3J5ID0gaGQuaGlzdG9yeSB8fCBbXTtcbiAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgLy8gRmV0Y2ggYWxsIGFsZXJ0IGNvbmZpZ3NcbiAgICBsZXQgYWxsQ29uZmlncyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjciA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL21vbml0b3JpbmcvYWxlcnRzL2NvbmZpZycpO1xuICAgICAgY29uc3QgY2QgPSBhd2FpdCBjci5qc29uKCk7XG4gICAgICBpZiAoY2Quc3VjY2VzcykgYWxsQ29uZmlncyA9IGNkLmNvbmZpZ3MgfHwge307XG4gICAgfSBjYXRjaCAoXykge31cblxuICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBPYmplY3QuZW50cmllcyhkYXRhKTtcbiAgICBjb25zdCBjb250YWluZXJSb3dzID0gY29udGFpbmVycy5tYXAoKFtpZCwgaW5mb10pID0+IHtcbiAgICAgIGNvbnN0IGNmZyA9IGFsbENvbmZpZ3NbaWRdIHx8IHsgY3B1VGhyZXNob2xkOiA4MCwgbWVtb3J5VGhyZXNob2xkOiA5MCwgZGlza0lPVGhyZXNob2xkOiA1MCwgYXV0b1Jlc3RhcnQ6IGZhbHNlLCBlbmFibGVkOiBmYWxzZSB9O1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgPHRyIGRhdGEtY29udGFpbmVyPVwiJHtpZH1cIj5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBwYWRkaW5nOiA4cHg7XCI+JHtpbmZvLm5hbWUgfHwgaWR9PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4O1wiPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJhbGVydC1jcHVcIiB2YWx1ZT1cIiR7Y2ZnLmNwdVRocmVzaG9sZCA/PyA4MH1cIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjBweDsgZm9udC1zaXplOiAwLjhyZW07IHBhZGRpbmc6IDJweCA0cHg7XCIgJHtpc1ByZW1pdW0gPyAnJyA6ICdkaXNhYmxlZCd9IC8+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4O1wiPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJhbGVydC1tZW1cIiB2YWx1ZT1cIiR7Y2ZnLm1lbW9yeVRocmVzaG9sZCA/PyA5MH1cIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNjBweDsgZm9udC1zaXplOiAwLjhyZW07IHBhZGRpbmc6IDJweCA0cHg7XCIgJHtpc1ByZW1pdW0gPyAnJyA6ICdkaXNhYmxlZCd9IC8+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4O1wiPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJhbGVydC1kaXNrXCIgdmFsdWU9XCIke2NmZy5kaXNrSU9UaHJlc2hvbGQgPz8gNTB9XCIgbWluPVwiMFwiIG1heD1cIjEwMDBcIiBzdHlsZT1cIndpZHRoOiA3MHB4OyBmb250LXNpemU6IDAuOHJlbTsgcGFkZGluZzogMnB4IDRweDtcIiAke2lzUHJlbWl1bSA/ICcnIDogJ2Rpc2FibGVkJ30gLz48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiYWxlcnQtYXV0b3Jlc3RhcnRcIiAke2NmZy5hdXRvUmVzdGFydCA/ICdjaGVja2VkJyA6ICcnfSAke2lzUHJlbWl1bSA/ICcnIDogJ2Rpc2FibGVkJ30gLz48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWxlcnQtdGVzdC1idG4gYnRuLXhzXCIgZGF0YS1jb250YWluZXI9XCIke2lkfVwiIGRhdGEtbmFtZT1cIiR7aW5mby5uYW1lIHx8IGlkfVwiIHN0eWxlPVwicGFkZGluZzogMnB4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5UZXN0PC9idXR0b24+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIGA7XG4gICAgfSkuam9pbignJyk7XG5cbiAgICBjb25zdCBoaXN0b3J5Um93cyA9IGFsZXJ0SGlzdG9yeS5tYXAoZW50cnkgPT4ge1xuICAgICAgY29uc3QgdGltZSA9IG5ldyBEYXRlKGVudHJ5LnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgIGNvbnN0IG5vdGlmaWVkTWFyayA9IGVudHJ5Lm5vdGlmaWVkID8gJ1x1MjcxMycgOiAnXHUyMDE0JztcbiAgICAgIHJldHVybiBgXG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke3RpbWV9PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZW50cnkuY29udGFpbmVyTmFtZSB8fCBlbnRyeS5jb250YWluZXJJZH08L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1wiPiR7ZW50cnkubWV0cmljIHx8IGVudHJ5LnR5cGV9PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4O1wiPiR7dHlwZW9mIGVudHJ5LnZhbHVlID09PSAnbnVtYmVyJyA/IGVudHJ5LnZhbHVlLnRvRml4ZWQoMSkgOiBlbnRyeS52YWx1ZX0ke2VudHJ5Lm1ldHJpYyA9PT0gJ2Rpc2snID8gJyBNQi9zJyA6ICclJ308L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4ke25vdGlmaWVkTWFya308L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6ICR7ZW50cnkuYXV0b1Jlc3RhcnRUcmlnZ2VyZWQgPyAnI2YzOWMxMicgOiAndmFyKC0tbXV0ZWQpJ307XCI+JHtlbnRyeS5hdXRvUmVzdGFydFRyaWdnZXJlZCA/ICdcdTIxQkInIDogJyd9PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIGA7XG4gICAgfSkuam9pbignJyk7XG5cbiAgICBjb25zdCBjb25maWdTZWN0aW9uID0gaXNQcmVtaXVtID8gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDIwcHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOiAwOyBmb250LXNpemU6IDAuOXJlbTtcIj5cdTI2OTlcdUZFMEYgQWxlcnQgQ29uZmlndXJhdGlvbjwvaDQ+XG4gICAgICAgICAgPGEgaHJlZj1cIiNcIiBpZD1cImdvLXRvLW5vdGlmaWNhdGlvbnNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgdGV4dC1kZWNvcmF0aW9uOiBub25lO1wiPkNvbmZpZ3VyZSBub3RpZmljYXRpb25zIFx1MjE5MjwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy14OiBhdXRvO1wiPlxuICAgICAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q29udGFpbmVyPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNQVSAlPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk1lbSAlPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkRpc2sgSS9PIE1CL3M8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5BdXRvLVJlc3RhcnQ8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7XCI+PC90aD5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+JHtjb250YWluZXJSb3dzfTwvdGJvZHk+XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJzYXZlLWFsbC1hbGVydHNcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNnB4OyBmb250LXNpemU6IDAuODVyZW07IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1iYXNlKTsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA0cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDtcIj5TYXZlIEFsbDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGAgOiBgXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMjBweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogcmdiYSgyNDEsMTk2LDE1LDAuMSk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjQxLDE5NiwxNSwwLjMpOyBib3JkZXItcmFkaXVzOiA4cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogI2YxYzQwZjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlx1MkI1MCBQcmVtaXVtIEZlYXR1cmU8L3NwYW4+XG4gICAgICAgIDxwIHN0eWxlPVwibWFyZ2luOiA2cHggMCAwOyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+VXBncmFkZSB0byBjb25maWd1cmUgcmVzb3VyY2UgYWxlcnQgdGhyZXNob2xkcyBwZXIgY29udGFpbmVyLjwvcD5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInVwZ3JhZGUtZm9yLWFsZXJ0c1wiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4OyBwYWRkaW5nOiA0cHggMTJweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiAjZjFjNDBmOyBjb2xvcjogIzAwMDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA0cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDtcIj5VcGdyYWRlIE5vdzwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIGFsZXJ0c0NvbnRhaW5lci5pbm5lckhUTUwgPSBgXG4gICAgICAke2NvbmZpZ1NlY3Rpb259XG4gICAgICA8ZGl2PlxuICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCAxMHB4OyBmb250LXNpemU6IDAuOXJlbTtcIj5cdUQ4M0RcdURDQ0IgUmVjZW50IEFsZXJ0czwvaDQ+XG4gICAgICAgICR7aGlzdG9yeVJvd3MgPyBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87XCI+XG4gICAgICAgICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjhyZW07XCI+XG4gICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+VGltZTwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNvbnRhaW5lcjwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk1ldHJpYzwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlZhbHVlPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cdTI3MTM/PC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7XCI+PC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICA8dGJvZHk+JHtoaXN0b3J5Um93c308L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCA6ICc8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPk5vIGFsZXJ0cyByZWNvcmRlZCB5ZXQuPC9kaXY+J31cbiAgICAgIDwvZGl2PlxuICAgIGA7XG5cbiAgICAvLyBXaXJlIHVwIHNhdmUtYWxsIGJ1dHRvblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlLWFsbC1hbGVydHMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb25maWdzID0ge307XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjc3RhdHMtYWxlcnRzLWNvbnRhaW5lciB0cltkYXRhLWNvbnRhaW5lcl0nKS5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgIGNvbnN0IGNJZCA9IHJvdy5kYXRhc2V0LmNvbnRhaW5lcjtcbiAgICAgICAgY29uZmlnc1tjSWRdID0ge1xuICAgICAgICAgIGNwdVRocmVzaG9sZDogcGFyc2VJbnQocm93LnF1ZXJ5U2VsZWN0b3IoJy5hbGVydC1jcHUnKT8udmFsdWUpIHx8IDgwLFxuICAgICAgICAgIG1lbW9yeVRocmVzaG9sZDogcGFyc2VJbnQocm93LnF1ZXJ5U2VsZWN0b3IoJy5hbGVydC1tZW0nKT8udmFsdWUpIHx8IDkwLFxuICAgICAgICAgIGRpc2tJT1RocmVzaG9sZDogcGFyc2VJbnQocm93LnF1ZXJ5U2VsZWN0b3IoJy5hbGVydC1kaXNrJyk/LnZhbHVlKSB8fCA1MCxcbiAgICAgICAgICBhdXRvUmVzdGFydDogISFyb3cucXVlcnlTZWxlY3RvcignLmFsZXJ0LWF1dG9yZXN0YXJ0Jyk/LmNoZWNrZWQsXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9tb25pdG9yaW5nL2FsZXJ0cy9jb25maWcnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb25maWdzIH0pXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NhdmUtYWxsLWFsZXJ0cycpO1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSBkLnN1Y2Nlc3MgPyAnXHUyNzA1IFNhdmVkJyA6ICdcdTI3NEMgRmFpbGVkJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdTYXZlIEFsbCc7IH0sIDIwMDApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZS1hbGwtYWxlcnRzJyk7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3NEMgRXJyb3InO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ1NhdmUgQWxsJzsgfSwgMjAwMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBXaXJlIHVwIG5vdGlmaWNhdGlvbiBzZXR0aW5ncyBsaW5rXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvLXRvLW5vdGlmaWNhdGlvbnMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgc3RvcEF1dG9SZWZyZXNoKCk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFuYWdlLW5vdGlmaWNhdGlvbnMnKT8uY2xpY2soKTtcbiAgICB9KTtcblxuICAgIC8vIFdpcmUgdXAgdGVzdCBidXR0b25zXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFsZXJ0LXRlc3QtYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvcmlnID0gYnRuLnRleHRDb250ZW50O1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnLi4uJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9tb25pdG9yaW5nL2FsZXJ0cy8ke2J0bi5kYXRhc2V0LmNvbnRhaW5lcn0vdGVzdGAsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSc7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignVGVzdCBhbGVydCBzZW50IGZvciAnICsgYnRuLmRhdGFzZXQubmFtZSwgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3NEMnO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSBvcmlnOyB9LCAyMDAwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gV2lyZSB1cCB1cGdyYWRlIGJ1dHRvblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGdyYWRlLWZvci1hbGVydHMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICBzdG9wQXV0b1JlZnJlc2goKTtcbiAgICAgIGlmICh0eXBlb2Ygb3BlbkxpY2Vuc2VNb2RhbCA9PT0gJ2Z1bmN0aW9uJykgb3BlbkxpY2Vuc2VNb2RhbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnRBdXRvUmVmcmVzaCgpIHtcbiAgICBpZiAocmVmcmVzaEludGVydmFsKSBjbGVhckludGVydmFsKHJlZnJlc2hJbnRlcnZhbCk7XG4gICAgaWYgKGF1dG9SZWZyZXNoQ2hlY2tib3g/LmNoZWNrZWQpIHtcbiAgICAgIHJlZnJlc2hJbnRlcnZhbCA9IHNldEludGVydmFsKGxvYWRTdGF0cywgREMuUE9MTC5TVEFUUyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcEF1dG9SZWZyZXNoKCkge1xuICAgIGlmIChyZWZyZXNoSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwocmVmcmVzaEludGVydmFsKTtcbiAgICAgIHJlZnJlc2hJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gT3BlbiBtb2RhbFxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZFN0YXRzKCk7XG4gICAgc3RhcnRBdXRvUmVmcmVzaCgpO1xuICB9KTtcblxuICAvLyBDbG9zZSBtb2RhbFxuICBjYW5jZWxCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBzdG9wQXV0b1JlZnJlc2goKTtcbiAgfSk7XG5cbiAgbW9kYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICBzdG9wQXV0b1JlZnJlc2goKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZFN0YXRzKTtcblxuICBhdXRvUmVmcmVzaENoZWNrYm94Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKGF1dG9SZWZyZXNoQ2hlY2tib3guY2hlY2tlZCkgc3RhcnRBdXRvUmVmcmVzaCgpO1xuICAgIGVsc2Ugc3RvcEF1dG9SZWZyZXNoKCk7XG4gIH0pO1xuXG4gIC8vIExhenktbG9hZCB0YWJzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwic3RhdHMtYWdncmVnYXRlZFwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRBZ2dyZWdhdGVkKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJzdGF0cy1hbGVydHNcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkQWxlcnRzKTtcblxuICAvLyA9PT0gSGlzdG9yeSBUYWIgPT09XG4gIGNvbnN0IGhpc3RvcnlDb250YWluZXJTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtaGlzdG9yeS1jb250YWluZXInKTtcbiAgY29uc3QgaGlzdG9yeUFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtaGlzdG9yeS1jb250YWluZXItYXJlYScpO1xuICBjb25zdCByYW5nZUJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RhdHMtcmFuZ2UtYnRuJyk7XG5cbiAgbGV0IGN1cnJlbnRSYW5nZSA9ICcxaCc7XG5cbiAgZnVuY3Rpb24gcmFuZ2VUb01zKHJhbmdlKSB7XG4gICAgc3dpdGNoIChyYW5nZSkge1xuICAgICAgY2FzZSAnMWgnOiAgcmV0dXJuIDYwICogNjAgKiAxMDAwO1xuICAgICAgY2FzZSAnMjRoJzogcmV0dXJuIDI0ICogNjAgKiA2MCAqIDEwMDA7XG4gICAgICBjYXNlICc3ZCc6ICByZXR1cm4gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG4gICAgICBjYXNlICczMGQnOiByZXR1cm4gMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgICAgY2FzZSAnMXknOiAgcmV0dXJuIDM2NSAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG4gICAgICBkZWZhdWx0OiAgICByZXR1cm4gNjAgKiA2MCAqIDEwMDA7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdGllckxhYmVsKHRpZXIpIHtcbiAgICBpZiAodGllciA9PT0gJ3JhdycpIHJldHVybiAnbGl2ZSAoMTBzIHNhbXBsZXMpJztcbiAgICBpZiAodGllciA9PT0gJ2hvdXJseScpIHJldHVybiAnaG91cmx5IGF2ZXJhZ2UnO1xuICAgIGlmICh0aWVyID09PSAnZGFpbHknKSByZXR1cm4gJ2RhaWx5IGF2ZXJhZ2UnO1xuICAgIHJldHVybiB0aWVyO1xuICB9XG5cbiAgLy8gU2ltcGxlIFNWRyBzcGFya2xpbmUgXHUyMDE0IG5vIGV4dGVybmFsIGxpYlxuICBmdW5jdGlvbiByZW5kZXJTcGFya2xpbmUoc2FtcGxlcywgYWNjZXNzb3IsIGNvbG9yLCBsYWJlbCwgdW5pdCkge1xuICAgIGlmICghc2FtcGxlcyB8fCBzYW1wbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBwYWRkaW5nOiAyMHB4O1wiPk5vIGRhdGEgZm9yICR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+YDtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gc2FtcGxlcy5tYXAoYWNjZXNzb3IpLmZpbHRlcih2ID0+IHYgIT0gbnVsbCk7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTsgcGFkZGluZzogMjBweDtcIj5ObyBkYXRhIGZvciAke2VzY2FwZUh0bWwobGFiZWwpfTwvZGl2PmA7XG4gICAgfVxuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KC4uLnZhbHVlcywgMSk7XG4gICAgY29uc3QgbWluID0gTWF0aC5taW4oLi4udmFsdWVzLCAwKTtcbiAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbiB8fCAxO1xuICAgIGNvbnN0IHcgPSA2MDAsIGggPSA4MCwgcGFkID0gNDtcbiAgICBjb25zdCBzdGVwWCA9ICh3IC0gcGFkICogMikgLyBNYXRoLm1heCh2YWx1ZXMubGVuZ3RoIC0gMSwgMSk7XG4gICAgY29uc3QgcG9pbnRzID0gdmFsdWVzLm1hcCgodiwgaSkgPT4ge1xuICAgICAgY29uc3QgeCA9IHBhZCArIGkgKiBzdGVwWDtcbiAgICAgIGNvbnN0IHkgPSBoIC0gcGFkIC0gKCh2IC0gbWluKSAvIHJhbmdlKSAqIChoIC0gcGFkICogMik7XG4gICAgICByZXR1cm4gYCR7eC50b0ZpeGVkKDEpfSwke3kudG9GaXhlZCgxKX1gO1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgICBjb25zdCBsYXN0ID0gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBhdmcgPSB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyB2YWx1ZXMubGVuZ3RoO1xuICAgIHJldHVybiBgXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTRweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBiYXNlbGluZTsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOXJlbTtcIj4ke2VzY2FwZUh0bWwobGFiZWwpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5sYXN0ICR7bGFzdC50b0ZpeGVkKDEpfSR7dW5pdH0gXHUwMEI3IGF2ZyAke2F2Zy50b0ZpeGVkKDEpfSR7dW5pdH0gXHUwMEI3IG1heCAke21heC50b0ZpeGVkKDEpfSR7dW5pdH08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgJHt3fSAke2h9XCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6ICR7aH1weDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cbiAgICAgICAgICA8cG9seWxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIke2NvbG9yfVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHBvaW50cz1cIiR7cG9pbnRzfVwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvcHVsYXRlSGlzdG9yeUNvbnRhaW5lclNlbGVjdCgpIHtcbiAgICBpZiAoIWhpc3RvcnlDb250YWluZXJTZWxlY3QpIHJldHVybjtcbiAgICBjb25zdCBkYXRhID0gY2FjaGVkTW9uaXRvcmluZ0RhdGEgfHwge307XG4gICAgY29uc3QgcHJldmlvdXMgPSBoaXN0b3J5Q29udGFpbmVyU2VsZWN0LnZhbHVlO1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhkYXRhKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGhpc3RvcnlDb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5ObyBjb250YWluZXJzPC9vcHRpb24+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaGlzdG9yeUNvbnRhaW5lclNlbGVjdC5pbm5lckhUTUwgPSBlbnRyaWVzXG4gICAgICAubWFwKChbaWQsIGluZm9dKSA9PiBgPG9wdGlvbiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChpZCl9XCI+JHtlc2NhcGVIdG1sKGluZm8ubmFtZSB8fCBpZCl9PC9vcHRpb24+YClcbiAgICAgIC5qb2luKCcnKTtcbiAgICBpZiAocHJldmlvdXMgJiYgZGF0YVtwcmV2aW91c10pIGhpc3RvcnlDb250YWluZXJTZWxlY3QudmFsdWUgPSBwcmV2aW91cztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRIaXN0b3J5KCkge1xuICAgIGlmICghaGlzdG9yeUFyZWEgfHwgIWhpc3RvcnlDb250YWluZXJTZWxlY3QpIHJldHVybjtcbiAgICBjb25zdCBjb250YWluZXJJZCA9IGhpc3RvcnlDb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgaWYgKCFjb250YWluZXJJZCkge1xuICAgICAgaGlzdG9yeUFyZWEuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQTwvc3Bhbj5ObyBjb250YWluZXIgc2VsZWN0ZWQuPC9kaXY+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gZW5kVGltZSAtIHJhbmdlVG9NcyhjdXJyZW50UmFuZ2UpO1xuICAgIGhpc3RvcnlBcmVhLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgaGlzdG9yeS4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvbW9uaXRvcmluZy9oaXN0b3J5LyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lcklkKX0/c3RhcnRUaW1lPSR7c3RhcnRUaW1lfSZlbmRUaW1lPSR7ZW5kVGltZX1gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBoaXN0b3J5Jyk7XG5cbiAgICAgIGNvbnN0IHNhbXBsZXMgPSBkYXRhLnNhbXBsZXMgfHwgW107XG4gICAgICBjb25zdCB0aWVyID0gZGF0YS50aWVyIHx8ICdyYXcnO1xuXG4gICAgICBpZiAoc2FtcGxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaGlzdG9yeUFyZWEuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQTwvc3Bhbj5ObyBkYXRhIGZvciB0aGUgbGFzdCAke2N1cnJlbnRSYW5nZX0uIFRpZXI6ICR7dGllckxhYmVsKHRpZXIpfS48L2Rpdj5gO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIERpZmZlcmVudCBzaGFwZSBiZXR3ZWVuIHJhdyB2cyByb2xsZWQtdXAgc2FtcGxlc1xuICAgICAgY29uc3QgaXNSYXcgPSB0aWVyID09PSAncmF3JztcbiAgICAgIGNvbnN0IGNwdUFjY2Vzc29yID0gaXNSYXcgPyAocykgPT4gcy5jcHU/LnBlcmNlbnQgOiAocykgPT4gcy5jcHU/LmF2ZztcbiAgICAgIGNvbnN0IG1lbUFjY2Vzc29yID0gaXNSYXcgPyAocykgPT4gcy5tZW1vcnk/LnBlcmNlbnQgOiAocykgPT4gcy5tZW1vcnk/LmF2Z1BlcmNlbnQ7XG4gICAgICBjb25zdCBuZXRSeEFjY2Vzc29yID0gaXNSYXcgPyAocykgPT4gKHMubmV0d29yaz8ucnhNQiB8fCAwKSA6IChzKSA9PiAocy5uZXR3b3JrPy5yeE1CIHx8IDApO1xuICAgICAgY29uc3QgbmV0VHhBY2Nlc3NvciA9IGlzUmF3ID8gKHMpID0+IChzLm5ldHdvcms/LnR4TUIgfHwgMCkgOiAocykgPT4gKHMubmV0d29yaz8udHhNQiB8fCAwKTtcblxuICAgICAgbGV0IGh0bWwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICAke3NhbXBsZXMubGVuZ3RofSBzYW1wbGVzIFx1MDBCNyAke2VzY2FwZUh0bWwodGllckxhYmVsKHRpZXIpKX0gXHUwMEI3ICR7bmV3IERhdGUoc3RhcnRUaW1lKS50b0xvY2FsZVN0cmluZygpfSBcdTIxOTIgJHtuZXcgRGF0ZShlbmRUaW1lKS50b0xvY2FsZVN0cmluZygpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgICBodG1sICs9IHJlbmRlclNwYXJrbGluZShzYW1wbGVzLCBjcHVBY2Nlc3NvciwgJyMyZWNjNzEnLCAnQ1BVJywgJyUnKTtcbiAgICAgIGh0bWwgKz0gcmVuZGVyU3BhcmtsaW5lKHNhbXBsZXMsIG1lbUFjY2Vzc29yLCAnIzM0OThkYicsICdNZW1vcnknLCAnJScpO1xuICAgICAgaHRtbCArPSByZW5kZXJTcGFya2xpbmUoc2FtcGxlcywgbmV0UnhBY2Nlc3NvciwgJyM5YjU5YjYnLCAnTmV0d29yayBSWCcsICcgTUInKTtcbiAgICAgIGh0bWwgKz0gcmVuZGVyU3BhcmtsaW5lKHNhbXBsZXMsIG5ldFR4QWNjZXNzb3IsICcjZTY3ZTIyJywgJ05ldHdvcmsgVFgnLCAnIE1CJyk7XG5cbiAgICAgIGhpc3RvcnlBcmVhLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGlzdG9yeUFyZWEuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1MjZBMFx1RkUwRjwvc3Bhbj5GYWlsZWQgdG8gbG9hZCBoaXN0b3J5OiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIHJhbmdlQnV0dG9ucy5mb3JFYWNoKGJ0biA9PiB7XG4gICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgcmFuZ2VCdXR0b25zLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgICAgIGJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGN1cnJlbnRSYW5nZSA9IGJ0bi5kYXRhc2V0LnJhbmdlO1xuICAgICAgbG9hZEhpc3RvcnkoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaGlzdG9yeUNvbnRhaW5lclNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgbG9hZEhpc3RvcnkpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwic3RhdHMtaGlzdG9yeVwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBwb3B1bGF0ZUhpc3RvcnlDb250YWluZXJTZWxlY3QoKTtcbiAgICBsb2FkSGlzdG9yeSgpO1xuICB9KTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IEhFQUxUSCBDSEVDSyBEQVNIQk9BUkQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnaGVhbHRoLW1vZGFsJywgYDxkaXYgaWQ9XCJoZWFsdGgtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDgwMHB4OyBtYXgtd2lkdGg6IDEwMDBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0NcdURGRTUgSGVhbHRoIENoZWNrIERhc2hib2FyZDwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIFNlcnZpY2UgdXB0aW1lIHRyYWNraW5nLCBTTEEgbW9uaXRvcmluZywgYW5kIGluY2lkZW50IG1hbmFnZW1lbnQuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC10YWJzXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWIgYWN0aXZlXCIgZGF0YS1wYW5lbD1cImhlYWx0aC1zdGF0dXNcIj5TdGF0dXM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJoZWFsdGgtaW5jaWRlbnRzXCI+SW5jaWRlbnRzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiaGVhbHRoLWNvbmZpZ1wiPkNvbmZpZ3VyZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBTdGF0dXMgLS0+XG4gICAgICA8ZGl2IGlkPVwiaGVhbHRoLXN0YXR1c1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvbiBhY3RpdmVcIj5cbiAgICAgICAgPGRpdiBpZD1cImhlYWx0aC1zdGF0dXMtY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGhlYWx0aCBzdGF0dXMuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEluY2lkZW50cyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtaW5jaWRlbnRzXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtaW5jaWRlbnRzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1REVBODwvc3Bhbj4gTG9hZGluZyBpbmNpZGVudHMuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IENvbmZpZ3VyZSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY29uZmlnXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY29uZmlnLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1MjY5OVx1RkUwRjwvc3Bhbj4gTG9hZGluZyBjb25maWd1cmF0aW9uLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gR2xvYmFsIFNldHRpbmdzOiByZXRlbnRpb24sIHBvbGxpbmcgaW50ZXJ2YWxzLCBtYXggZW50cmllcywgZGlzay11c2FnZSB0aHJlc2hvbGQgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtZ2xvYmFsLXNldHRpbmdzXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpOyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDRweDtcIj5cdUQ4M0NcdURGMEQgR2xvYmFsIFNldHRpbmdzPC9oND5cbiAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIiBzdHlsZT1cIm1hcmdpbjogMCAwIDEycHg7XCI+QXBwbGllcyB0byBhbGwgaGVhbHRoIGNoZWNrcy4gU2V0dGluZ3MgYXJlIHN0b3JlZCBsb2NhbGx5IGluIHRoaXMgYnJvd3Nlci48L3A+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkhlYWx0aCBDaGVjayBQb2xsaW5nIEludGVydmFsIChzZWNvbmRzKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtc2V0dGluZy1pbnRlcnZhbFwiIHZhbHVlPVwiNjBcIiBtaW49XCI1XCIgbWF4PVwiMzYwMFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDJweDtcIj5Ib3cgb2Z0ZW4gZWFjaCBzZXJ2aWNlJ3MgaGVhbHRoIGVuZHBvaW50IGlzIGNoZWNrZWQuPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5TdGF0cyBQb2xsaW5nIEludGVydmFsIChzZWNvbmRzKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtc2V0dGluZy1zdGF0cy1pbnRlcnZhbFwiIHZhbHVlPVwiMzBcIiBtaW49XCI1XCIgbWF4PVwiMzYwMFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDJweDtcIj5Ib3cgb2Z0ZW4gY29udGFpbmVyIHN0YXRpc3RpY3MgKENQVS9tZW1vcnkpIGFyZSBzYW1wbGVkLjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+TWF4IEVudHJpZXMgUGVyIFNlcnZpY2U8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLXNldHRpbmctbWF4LWVudHJpZXNcIiB2YWx1ZT1cIjUwMFwiIG1pbj1cIjEwXCIgbWF4PVwiMTAwMDAwXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4O1wiPkNhcCBvbiBzdG9yZWQgaGlzdG9yeSByZWNvcmRzIHBlciBzZXJ2aWNlLjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+RGF0YSBSZXRlbnRpb24gKGRheXMpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1zZXR0aW5nLXJldGVudGlvblwiIHZhbHVlPVwiMzBcIiBtaW49XCIxXCIgbWF4PVwiMzY1MFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDJweDtcIj5IZWFsdGggaGlzdG9yeSBvbGRlciB0aGFuIHRoaXMgaXMgcHJ1bmVkLjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+RGlzay1Vc2FnZSBXYXJuaW5nICglKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtc2V0dGluZy1kaXNrLXRocmVzaG9sZFwiIHZhbHVlPVwiODBcIiBtaW49XCI1MFwiIG1heD1cIjk5XCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4O1wiPldhcm4gd2hlbiBkaXNrIHVzYWdlIGV4Y2VlZHMgdGhpcyBsZXZlbC48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtZ2xvYmFsLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIj5TYXZlIEdsb2JhbCBTZXR0aW5nczwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1nbG9iYWwtcmVzZXRcIiBjbGFzcz1cImJ0bi1zbVwiPlJlc2V0IHRvIERlZmF1bHRzPC9idXR0b24+XG4gICAgICAgICAgICA8c3BhbiBpZD1cImhlYWx0aC1nbG9iYWwtc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQWRkL0VkaXQgSGVhbHRoIENoZWNrIEZvcm0gLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY29uZmlnLWZvcm1cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDE2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7XCI+XG4gICAgICAgICAgPGg0IGlkPVwiaGVhbHRoLWZvcm0tdGl0bGVcIiBzdHlsZT1cIm1hcmdpbjogMCAwIDEycHg7XCI+QWRkIEhlYWx0aCBDaGVjazwvaDQ+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlNlcnZpY2UgSUQ8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImhlYWx0aC1mb3JtLWlkXCIgcGxhY2Vob2xkZXI9XCJlLmcuIHBsZXhcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+RGlzcGxheSBOYW1lPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJoZWFsdGgtZm9ybS1uYW1lXCIgcGxhY2Vob2xkZXI9XCJlLmcuIFBsZXggTWVkaWEgU2VydmVyXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImdyaWQtY29sdW1uOiBzcGFuIDI7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5VUkw8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImhlYWx0aC1mb3JtLXVybFwiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9wbGV4LmhvbWVcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+VGltZW91dCAobXMpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1mb3JtLXRpbWVvdXRcIiB2YWx1ZT1cIjEwMDAwXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkV4cGVjdGVkIFN0YXR1cyBDb2RlczwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaGVhbHRoLWZvcm0tY29kZXNcIiB2YWx1ZT1cIjIwMFwiIHBsYWNlaG9sZGVyPVwiMjAwLCAzMDEsIDMwMlwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5TTEEgVGFyZ2V0ICglKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtZm9ybS1zbGFcIiB2YWx1ZT1cIjk5LjlcIiBzdGVwPVwiMC4xXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlNsb3cgUmVzcG9uc2UgVGhyZXNob2xkIChtcyk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLWZvcm0tc2xvd1wiIHZhbHVlPVwiNTAwMFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLWZvcm0tY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLWZvcm0tc2F2ZVwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1hZGQtYnRuXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCI+KyBBZGQgSGVhbHRoIENoZWNrPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib3R0b20tYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtcmVmcmVzaC1idG5cIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+XG4gICAgICAgIDxzcGFuIGlkPVwiaGVhbHRoLWxhc3QtdXBkYXRlXCIgY2xhc3M9XCJ0ZXh0LWF1dG8tcmlnaHRcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2stYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2FuY2VsJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXJlZnJlc2gtYnRuJyk7XG4gIGNvbnN0IHN0YXR1c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtc3RhdHVzLWNvbnRhaW5lcicpO1xuICBjb25zdCBpbmNpZGVudHNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWluY2lkZW50cy1jb250YWluZXInKTtcbiAgY29uc3QgY29uZmlnQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jb25maWctY29udGFpbmVyJyk7XG4gIGNvbnN0IGxhc3RVcGRhdGVTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1sYXN0LXVwZGF0ZScpO1xuICBjb25zdCBhZGRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWFkZC1idG4nKTtcbiAgY29uc3QgZm9ybUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jb25maWctZm9ybScpO1xuICBjb25zdCBmb3JtVGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tdGl0bGUnKTtcbiAgY29uc3QgZm9ybUNhbmNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1jYW5jZWwnKTtcbiAgY29uc3QgZm9ybVNhdmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tc2F2ZScpO1xuXG4gIC8vIC0tLS0gR2xvYmFsIGhlYWx0aCBzZXR0aW5ncyAocmV0ZW50aW9uLCBwb2xsaW5nIGludGVydmFscywgbWF4IGVudHJpZXMsIGRpc2sgdGhyZXNob2xkKSAtLS0tXG4gIGNvbnN0IEhFQUxUSF9TRVRUSU5HU19LRVkgPSAnZGFzaGNhZGR5LWhlYWx0aC1zZXR0aW5ncyc7XG4gIGNvbnN0IEhFQUxUSF9ERUZBVUxUUyA9IHsgcmV0ZW50aW9uRGF5czogMzAsIHBvbGxpbmdJbnRlcnZhbDogNjAsIHN0YXRzUG9sbGluZ0ludGVydmFsOiAzMCwgbWF4RW50cmllc1BlclNlcnZpY2U6IDUwMCwgZGlza1VzYWdlVGhyZXNob2xkOiA4MCB9O1xuICBjb25zdCBnbG9iYWxTYXZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1nbG9iYWwtc2F2ZScpO1xuICBjb25zdCBnbG9iYWxSZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZ2xvYmFsLXJlc2V0Jyk7XG4gIGNvbnN0IGdsb2JhbFN0YXR1c1NwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWdsb2JhbC1zdGF0dXMnKTtcbiAgY29uc3QgcmV0ZW50aW9uSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXNldHRpbmctcmV0ZW50aW9uJyk7XG4gIGNvbnN0IGludGVydmFsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXNldHRpbmctaW50ZXJ2YWwnKTtcbiAgY29uc3Qgc3RhdHNJbnRlcnZhbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1zZXR0aW5nLXN0YXRzLWludGVydmFsJyk7XG4gIGNvbnN0IG1heEVudHJpZXNJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtc2V0dGluZy1tYXgtZW50cmllcycpO1xuICBjb25zdCBkaXNrVGhyZXNob2xkSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXNldHRpbmctZGlzay10aHJlc2hvbGQnKTtcblxuICBmdW5jdGlvbiBsb2FkSGVhbHRoU2V0dGluZ3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IHNhZmVHZXQoSEVBTFRIX1NFVFRJTkdTX0tFWSk7XG4gICAgICBjb25zdCBzYXZlZCA9IHJhdyA/IEpTT04ucGFyc2UocmF3KSA6IHt9O1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIEhFQUxUSF9ERUZBVUxUUywgc2F2ZWQpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBIRUFMVEhfREVGQVVMVFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5SGVhbHRoU2V0dGluZ3NUb1VJKCkge1xuICAgIGNvbnN0IHMgPSBsb2FkSGVhbHRoU2V0dGluZ3MoKTtcbiAgICBpZiAocmV0ZW50aW9uSW5wdXQpIHJldGVudGlvbklucHV0LnZhbHVlID0gcy5yZXRlbnRpb25EYXlzO1xuICAgIGlmIChpbnRlcnZhbElucHV0KSBpbnRlcnZhbElucHV0LnZhbHVlID0gcy5wb2xsaW5nSW50ZXJ2YWw7XG4gICAgaWYgKHN0YXRzSW50ZXJ2YWxJbnB1dCkgc3RhdHNJbnRlcnZhbElucHV0LnZhbHVlID0gcy5zdGF0c1BvbGxpbmdJbnRlcnZhbDtcbiAgICBpZiAobWF4RW50cmllc0lucHV0KSBtYXhFbnRyaWVzSW5wdXQudmFsdWUgPSBzLm1heEVudHJpZXNQZXJTZXJ2aWNlO1xuICAgIGlmIChkaXNrVGhyZXNob2xkSW5wdXQpIGRpc2tUaHJlc2hvbGRJbnB1dC52YWx1ZSA9IHMuZGlza1VzYWdlVGhyZXNob2xkO1xuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUhlYWx0aFNldHRpbmdzKCkge1xuICAgIGNvbnN0IHNldHRpbmdzID0ge1xuICAgICAgcmV0ZW50aW9uRGF5czogTWF0aC5tYXgoMSwgTWF0aC5taW4oMzY1MCwgcGFyc2VJbnQocmV0ZW50aW9uSW5wdXQ/LnZhbHVlKSB8fCBIRUFMVEhfREVGQVVMVFMucmV0ZW50aW9uRGF5cykpLFxuICAgICAgcG9sbGluZ0ludGVydmFsOiBNYXRoLm1heCg1LCBNYXRoLm1pbigzNjAwLCBwYXJzZUludChpbnRlcnZhbElucHV0Py52YWx1ZSkgfHwgSEVBTFRIX0RFRkFVTFRTLnBvbGxpbmdJbnRlcnZhbCkpLFxuICAgICAgc3RhdHNQb2xsaW5nSW50ZXJ2YWw6IE1hdGgubWF4KDUsIE1hdGgubWluKDM2MDAsIHBhcnNlSW50KHN0YXRzSW50ZXJ2YWxJbnB1dD8udmFsdWUpIHx8IEhFQUxUSF9ERUZBVUxUUy5zdGF0c1BvbGxpbmdJbnRlcnZhbCkpLFxuICAgICAgbWF4RW50cmllc1BlclNlcnZpY2U6IE1hdGgubWF4KDEwLCBNYXRoLm1pbigxMDAwMDAsIHBhcnNlSW50KG1heEVudHJpZXNJbnB1dD8udmFsdWUpIHx8IEhFQUxUSF9ERUZBVUxUUy5tYXhFbnRyaWVzUGVyU2VydmljZSkpLFxuICAgICAgZGlza1VzYWdlVGhyZXNob2xkOiBNYXRoLm1heCg1MCwgTWF0aC5taW4oOTksIHBhcnNlSW50KGRpc2tUaHJlc2hvbGRJbnB1dD8udmFsdWUpIHx8IEhFQUxUSF9ERUZBVUxUUy5kaXNrVXNhZ2VUaHJlc2hvbGQpKVxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIHNhZmVTZXQoSEVBTFRIX1NFVFRJTkdTX0tFWSwgSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpKTtcbiAgICAgIGFwcGx5SGVhbHRoU2V0dGluZ3NUb1VJKCk7XG4gICAgICBpZiAoZ2xvYmFsU3RhdHVzU3Bhbikge1xuICAgICAgICBnbG9iYWxTdGF0dXNTcGFuLnRleHRDb250ZW50ID0gJ1NhdmVkIFx1MjcxMyc7XG4gICAgICAgIGdsb2JhbFN0YXR1c1NwYW4uc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcpJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChnbG9iYWxTdGF0dXNTcGFuKSBnbG9iYWxTdGF0dXNTcGFuLnRleHRDb250ZW50ID0gJyc7IH0sIDI1MDApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSBzaG93Tm90aWZpY2F0aW9uKCdHbG9iYWwgaGVhbHRoIHNldHRpbmdzIHNhdmVkJywgJ3N1Y2Nlc3MnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZ2xvYmFsU3RhdHVzU3BhbikgeyBnbG9iYWxTdGF0dXNTcGFuLnRleHRDb250ZW50ID0gJ1NhdmUgZmFpbGVkJzsgZ2xvYmFsU3RhdHVzU3Bhbi5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJzsgfVxuICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSBzaG93Tm90aWZpY2F0aW9uKCdGYWlsZWQgdG8gc2F2ZSBzZXR0aW5nczogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRIZWFsdGhTZXR0aW5ncygpIHtcbiAgICB0cnkge1xuICAgICAgc2FmZVNldChIRUFMVEhfU0VUVElOR1NfS0VZLCBKU09OLnN0cmluZ2lmeShIRUFMVEhfREVGQVVMVFMpKTtcbiAgICB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgYXBwbHlIZWFsdGhTZXR0aW5nc1RvVUkoKTtcbiAgICBpZiAoZ2xvYmFsU3RhdHVzU3Bhbikge1xuICAgICAgZ2xvYmFsU3RhdHVzU3Bhbi50ZXh0Q29udGVudCA9ICdSZXNldCB0byBkZWZhdWx0cyBcdTI3MTMnO1xuICAgICAgZ2xvYmFsU3RhdHVzU3Bhbi5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZyknO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChnbG9iYWxTdGF0dXNTcGFuKSBnbG9iYWxTdGF0dXNTcGFuLnRleHRDb250ZW50ID0gJyc7IH0sIDI1MDApO1xuICAgIH1cbiAgfVxuXG4gIGFwcGx5SGVhbHRoU2V0dGluZ3NUb1VJKCk7XG4gIGdsb2JhbFNhdmVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2F2ZUhlYWx0aFNldHRpbmdzKTtcbiAgZ2xvYmFsUmVzZXRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVzZXRIZWFsdGhTZXR0aW5ncyk7XG4gIC8vIC0tLS0gRW5kIGdsb2JhbCBoZWFsdGggc2V0dGluZ3MgLS0tLVxuXG4gIGxldCBlZGl0aW5nSWQgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHVwdGltZUNvbG9yKHBjdCkge1xuICAgIGlmIChwY3QgPj0gOTkuOSkgcmV0dXJuICd2YXIoLS1vay1mZyknO1xuICAgIGlmIChwY3QgPj0gOTUpIHJldHVybiAnI2YzOWMxMic7XG4gICAgcmV0dXJuICd2YXIoLS1iYWQtZmcpJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldmVyaXR5QmFkZ2Uoc2V2KSB7XG4gICAgY29uc3QgY29sb3JzID0geyBjcml0aWNhbDogJ3ZhcigtLWJhZC1mZyknLCBoaWdoOiAnI2ZmNmI2YicsIG1lZGl1bTogJyNmMzljMTInLCBsb3c6ICd2YXIoLS1tdXRlZCknIH07XG4gICAgcmV0dXJuIGA8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDJweCA4cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiAke2NvbG9yc1tzZXZdIHx8ICd2YXIoLS1tdXRlZCknfTIwOyBjb2xvcjogJHtjb2xvcnNbc2V2XSB8fCAndmFyKC0tbXV0ZWQpJ307XCI+JHtzZXZ9PC9zcGFuPmA7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkU3RhdHVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhZGF0YS5zdGF0dXMgfHwgT2JqZWN0LmtleXMoZGF0YS5zdGF0dXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzdGF0dXNDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzQ1x1REZFNTwvc3Bhbj5ObyBoZWFsdGggY2hlY2tzIGNvbmZpZ3VyZWQuIEdvIHRvIHRoZSBDb25maWd1cmUgdGFiIHRvIGFkZCBzZXJ2aWNlcy48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzZXJ2aWNlcyA9IE9iamVjdC52YWx1ZXMoZGF0YS5zdGF0dXMpO1xuICAgICAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGxlZnQ7XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5TZXJ2aWNlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+U3RhdHVzPC90aD4nO1xuICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPlVwdGltZSAyNGg8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5VcHRpbWUgN2Q8L3RoPic7XG4gICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+QXZnIFJlc3BvbnNlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+TGFzdCBDaGVjazwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCBzIG9mIHNlcnZpY2VzKSB7XG4gICAgICAgIGNvbnN0IGlzVXAgPSBzLnN0YXR1cyA9PT0gJ3VwJztcbiAgICAgICAgY29uc3QgZG90Q29sb3IgPSBpc1VwID8gJ3ZhcigtLWRvdC1vayknIDogJ3ZhcigtLWRvdC1iYWQpJztcbiAgICAgICAgY29uc3QgdTI0ID0gcy51cHRpbWU/LlsnMjRoJ10gPz8gJy0nO1xuICAgICAgICBjb25zdCB1N2QgPSBzLnVwdGltZT8uWyc3ZCddID8/ICctJztcbiAgICAgICAgY29uc3QgYXZnUnQgPSBzLmF2Z1Jlc3BvbnNlVGltZSAhPSBudWxsID8gTWF0aC5yb3VuZChzLmF2Z1Jlc3BvbnNlVGltZSkgKyAnbXMnIDogJy0nO1xuICAgICAgICBjb25zdCBsYXN0Q2hlY2sgPSBzLnRpbWVzdGFtcCA/IHRpbWVBZ28ocy50aW1lc3RhbXApIDogJy0nO1xuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY3Vyc29yOiBwb2ludGVyO1wiIGRhdGEtaGVhbHRoLWlkPVwiJHtlc2NhcGVIdG1sKHMuc2VydmljZUlkKX1cIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKHMubmFtZSB8fCBzLnNlcnZpY2VJZCl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+PHNwYW4gc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiA4cHg7IGhlaWdodDogOHB4OyBib3JkZXItcmFkaXVzOiA1MCU7IGJhY2tncm91bmQ6ICR7ZG90Q29sb3J9OyBtYXJnaW4tcmlnaHQ6IDZweDtcIj48L3NwYW4+JHtpc1VwID8gJ1VwJyA6ICdEb3duJ308L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgY29sb3I6ICR7dHlwZW9mIHUyNCA9PT0gJ251bWJlcicgPyB1cHRpbWVDb2xvcih1MjQpIDogJ3ZhcigtLW11dGVkKSd9O1wiPiR7dHlwZW9mIHUyNCA9PT0gJ251bWJlcicgPyB1MjQudG9GaXhlZCgxKSArICclJyA6IHUyNH08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgY29sb3I6ICR7dHlwZW9mIHU3ZCA9PT0gJ251bWJlcicgPyB1cHRpbWVDb2xvcih1N2QpIDogJ3ZhcigtLW11dGVkKSd9O1wiPiR7dHlwZW9mIHU3ZCA9PT0gJ251bWJlcicgPyB1N2QudG9GaXhlZCgxKSArICclJyA6IHU3ZH08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj4ke2F2Z1J0fTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7bGFzdENoZWNrfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICBodG1sICs9IGA8dHIgaWQ9XCJoZWFsdGgtZGV0YWlsLSR7ZXNjYXBlSHRtbChzLnNlcnZpY2VJZCl9XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjx0ZCBjb2xzcGFuPVwiNlwiIHN0eWxlPVwicGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj48ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgZGV0YWlscy4uLjwvZGl2PjwvdGQ+PC90cj5gO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgc3RhdHVzQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICBsYXN0VXBkYXRlU3Bhbi50ZXh0Q29udGVudCA9ICdVcGRhdGVkICcgKyBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpO1xuXG4gICAgICAvLyBSb3cgY2xpY2sgdG8gZXhwYW5kIGRldGFpbHNcbiAgICAgIHN0YXR1c0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCd0cltkYXRhLWhlYWx0aC1pZF0nKS5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgIHJvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IHJvdy5kYXRhc2V0LmhlYWx0aElkO1xuICAgICAgICAgIGNvbnN0IGRldGFpbFJvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZGV0YWlsLScgKyBpZCk7XG4gICAgICAgICAgaWYgKCFkZXRhaWxSb3cpIHJldHVybjtcbiAgICAgICAgICBpZiAoZGV0YWlsUm93LnN0eWxlLmRpc3BsYXkgIT09ICdub25lJykge1xuICAgICAgICAgICAgZGV0YWlsUm93LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGRldGFpbFJvdy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9oZWFsdGgtY2hlY2tzLyR7aWR9L3N0YXRzP2hvdXJzPTI0YCk7XG4gICAgICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgICAgICBpZiAoZC5zdWNjZXNzICYmIGQuc3RhdHMpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3QgPSBkLnN0YXRzO1xuICAgICAgICAgICAgICBjb25zdCBydCA9IHN0LnJlc3BvbnNlVGltZSB8fCB7fTtcbiAgICAgICAgICAgICAgZGV0YWlsUm93LnF1ZXJ5U2VsZWN0b3IoJ3RkJykuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg0LCAxZnIpOyBnYXA6IDEycHg7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlRvdGFsIENoZWNrczwvc3Bhbj48YnI+PHN0cm9uZz4ke3N0LnRvdGFsQ2hlY2tzIHx8IDB9PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5VcHRpbWU8L3NwYW4+PGJyPjxzdHJvbmcgc3R5bGU9XCJjb2xvcjogJHt1cHRpbWVDb2xvcihzdC51cHRpbWUgfHwgMCl9O1wiPiR7KHN0LnVwdGltZSB8fCAwKS50b0ZpeGVkKDIpfSU8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkF2ZyBSZXNwb25zZTwvc3Bhbj48YnI+PHN0cm9uZz4ke01hdGgucm91bmQocnQuYXZnIHx8IDApfW1zPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5QOTUgLyBQOTk8L3NwYW4+PGJyPjxzdHJvbmc+JHtNYXRoLnJvdW5kKHJ0LnA5NSB8fCAwKX1tcyAvICR7TWF0aC5yb3VuZChydC5wOTkgfHwgMCl9bXM8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk1pbiBSZXNwb25zZTwvc3Bhbj48YnI+PHN0cm9uZz4ke01hdGgucm91bmQocnQubWluIHx8IDApfW1zPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5NYXggUmVzcG9uc2U8L3NwYW4+PGJyPjxzdHJvbmc+JHtNYXRoLnJvdW5kKHJ0Lm1heCB8fCAwKX1tczwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+VXAgQ2hlY2tzPC9zcGFuPjxicj48c3Ryb25nIHN0eWxlPVwiY29sb3I6IHZhcigtLW9rLWZnKTtcIj4ke3N0LnVwQ2hlY2tzIHx8IDB9PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5Eb3duIENoZWNrczwvc3Bhbj48YnI+PHN0cm9uZyBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiR7c3QuZG93bkNoZWNrcyB8fCAwfTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZXRhaWxSb3cucXVlcnlTZWxlY3RvcigndGQnKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+Tm8gZGV0YWlsZWQgc3RhdHMgYXZhaWxhYmxlIGZvciB0aGlzIHBlcmlvZC48L2Rpdj4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRldGFpbFJvdy5xdWVyeVNlbGVjdG9yKCd0ZCcpLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RhdHVzQ29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZCB0byBsb2FkIGhlYWx0aCBzdGF0dXM6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEluY2lkZW50cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgW29wZW5SZXMsIGhpc3RSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL2luY2lkZW50cycpLFxuICAgICAgICBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL2luY2lkZW50cy9oaXN0b3J5P2xpbWl0PTUwJylcbiAgICAgIF0pO1xuICAgICAgY29uc3Qgb3BlbkRhdGEgPSBhd2FpdCBvcGVuUmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IGhpc3REYXRhID0gYXdhaXQgaGlzdFJlcy5qc29uKCk7XG4gICAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgICAvLyBPcGVuIGluY2lkZW50c1xuICAgICAgY29uc3Qgb3BlbiA9IChvcGVuRGF0YS5zdWNjZXNzICYmIG9wZW5EYXRhLmluY2lkZW50cykgPyBvcGVuRGF0YS5pbmNpZGVudHMgOiBbXTtcbiAgICAgIGlmIChvcGVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCI+PGg0IHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7IG1hcmdpbjogMCAwIDhweDtcIj5PcGVuIEluY2lkZW50cyAoJyArIG9wZW4ubGVuZ3RoICsgJyk8L2g0Pic7XG4gICAgICAgIGZvciAoY29uc3QgaW5jIG9mIG9wZW4pIHtcbiAgICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMnB4OyBtYXJnaW4tYm90dG9tOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJhZC1mZykzMDsgYm9yZGVyLXJhZGl1czogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYWQtYmcpO1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChpbmMuc2VydmljZUlkKX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPiR7c2V2ZXJpdHlCYWRnZShpbmMuc2V2ZXJpdHkpfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPiR7ZXNjYXBlSHRtbChpbmMubWVzc2FnZSl9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+U3RhcnRlZCAke3RpbWVBZ28oaW5jLmNyZWF0ZWRBdCl9IFx1MDBCNyAke2luYy5vY2N1cnJlbmNlcyB8fCAxfSBvY2N1cnJlbmNlKHMpPC9kaXY+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IG1hcmdpbi1ib3R0b206IDE2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW9rLWZnKTMwOyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLW9rLWJnKTsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tb2stZmcpOyBmb250LXNpemU6IDAuOXJlbTtcIj5BbGwgc2VydmljZXMgb3BlcmF0aW9uYWwgXHUyMDE0IG5vIG9wZW4gaW5jaWRlbnRzPC9kaXY+JztcbiAgICAgIH1cblxuICAgICAgLy8gSW5jaWRlbnQgaGlzdG9yeVxuICAgICAgY29uc3QgaGlzdG9yeSA9IChoaXN0RGF0YS5zdWNjZXNzICYmIGhpc3REYXRhLmhpc3RvcnkpID8gaGlzdERhdGEuaGlzdG9yeSA6IFtdO1xuICAgICAgaWYgKGhpc3RvcnkubGVuZ3RoID4gMCkge1xuICAgICAgICBodG1sICs9ICc8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+SW5jaWRlbnQgSGlzdG9yeTwvaDQ+JztcbiAgICAgICAgaHRtbCArPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U2VydmljZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlR5cGU8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TZXZlcml0eTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlN0YXR1czwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkR1cmF0aW9uPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+V2hlbjwvdGg+PC90cj4nO1xuICAgICAgICBmb3IgKGNvbnN0IGluYyBvZiBoaXN0b3J5KSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBpbmMuc3RhdHVzID09PSAncmVzb2x2ZWQnO1xuICAgICAgICAgIGNvbnN0IGR1ciA9IHJlc29sdmVkICYmIGluYy5kdXJhdGlvbiA/IChpbmMuZHVyYXRpb24gPCA2MDAwMCA/IE1hdGgucm91bmQoaW5jLmR1cmF0aW9uIC8gMTAwMCkgKyAncycgOiBNYXRoLnJvdW5kKGluYy5kdXJhdGlvbiAvIDYwMDAwKSArICdtJykgOiAnLSc7XG4gICAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+YDtcbiAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtlc2NhcGVIdG1sKGluYy5zZXJ2aWNlSWQpfTwvdGQ+YDtcbiAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtlc2NhcGVIdG1sKGluYy50eXBlKX08L3RkPmA7XG4gICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPiR7c2V2ZXJpdHlCYWRnZShpbmMuc2V2ZXJpdHkpfTwvdGQ+YDtcbiAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjogJHtyZXNvbHZlZCA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJhZC1mZyknfTtcIj4ke2luYy5zdGF0dXN9PC9zcGFuPjwvdGQ+YDtcbiAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtkdXJ9PC90ZD5gO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke3RpbWVBZ28oaW5jLmNyZWF0ZWRBdCl9PC90ZD5gO1xuICAgICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICB9XG5cbiAgICAgIGluY2lkZW50c0NvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sIHx8ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURFQTg8L3NwYW4+Tm8gaW5jaWRlbnRzIHJlY29yZGVkIHlldC48L2Rpdj4nO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGluY2lkZW50c0NvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZENvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgY29uc3Qgc2VydmljZXMgPSBkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5zdGF0dXMgPyBPYmplY3QudmFsdWVzKGRhdGEuc3RhdHVzKSA6IFtdO1xuICAgICAgaWYgKHNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25maWdDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1MjY5OVx1RkUwRjwvc3Bhbj5ObyBoZWFsdGggY2hlY2tzIGNvbmZpZ3VyZWQgeWV0LiBDbGljayBcIkFkZCBIZWFsdGggQ2hlY2tcIiBiZWxvdy48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U2VydmljZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlN0YXR1czwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlNMQSBUYXJnZXQ8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+QWN0aW9uczwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCBzIG9mIHNlcnZpY2VzKSB7XG4gICAgICAgIGNvbnN0IGlzVXAgPSBzLnN0YXR1cyA9PT0gJ3VwJztcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChzLm5hbWUgfHwgcy5zZXJ2aWNlSWQpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBjb2xvcjogJHtpc1VwID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYmFkLWZnKSd9O1wiPiR7aXNVcCA/ICdVcCcgOiAnRG93bid9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+JHtzLnNsYT8udGFyZ2V0ID8gcy5zbGEudGFyZ2V0ICsgJyUnIDogJy0nfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5gO1xuICAgICAgICBodG1sICs9IGA8YnV0dG9uIG9uY2xpY2s9XCJkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaGVhbHRoLWVkaXQnLCB7ZGV0YWlsOicke2VzY2FwZUh0bWwocy5zZXJ2aWNlSWQpfSd9KSlcIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07IG1hcmdpbi1yaWdodDogNHB4O1wiPkVkaXQ8L2J1dHRvbj5gO1xuICAgICAgICBodG1sICs9IGA8YnV0dG9uIG9uY2xpY2s9XCJkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaGVhbHRoLWRlbGV0ZScsIHtkZXRhaWw6JyR7ZXNjYXBlSHRtbChzLnNlcnZpY2VJZCl9J30pKVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGJvcmRlci1jb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5EZWxldGU8L2J1dHRvbj5gO1xuICAgICAgICBodG1sICs9ICc8L3RkPjwvdHI+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIGNvbmZpZ0NvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbmZpZ0NvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2hvd0Zvcm0oaWQsIG5hbWUsIHVybCwgdGltZW91dCwgY29kZXMsIHNsYSwgc2xvdykge1xuICAgIGVkaXRpbmdJZCA9IGlkIHx8IG51bGw7XG4gICAgZm9ybVRpdGxlLnRleHRDb250ZW50ID0gaWQgPyAnRWRpdCBIZWFsdGggQ2hlY2snIDogJ0FkZCBIZWFsdGggQ2hlY2snO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1pZCcpLnZhbHVlID0gaWQgfHwgJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWlkJykuZGlzYWJsZWQgPSAhIWlkO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1uYW1lJykudmFsdWUgPSBuYW1lIHx8ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS11cmwnKS52YWx1ZSA9IHVybCB8fCAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tdGltZW91dCcpLnZhbHVlID0gdGltZW91dCB8fCAxMDAwMDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tY29kZXMnKS52YWx1ZSA9IGNvZGVzIHx8ICcyMDAnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1zbGEnKS52YWx1ZSA9IHNsYSB8fCA5OS45O1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1zbG93JykudmFsdWUgPSBzbG93IHx8IDUwMDA7XG4gICAgZm9ybUVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBhZGRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZGVGb3JtKCkge1xuICAgIGZvcm1FbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGFkZEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgZWRpdGluZ0lkID0gbnVsbDtcbiAgfVxuXG4gIGFkZEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzaG93Rm9ybSgnJywgJycsICcnLCAxMDAwMCwgJzIwMCcsIDk5LjksIDUwMDApKTtcbiAgZm9ybUNhbmNlbD8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWRlRm9ybSk7XG5cbiAgZm9ybVNhdmU/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlkID0gZWRpdGluZ0lkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1pZCcpLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIWlkKSByZXR1cm4gc2hvd05vdGlmaWNhdGlvbignU2VydmljZSBJRCBpcyByZXF1aXJlZCcsICd3YXJuaW5nJyk7XG4gICAgY29uc3QgdXJsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXVybCcpLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIXVybCkgcmV0dXJuIHNob3dOb3RpZmljYXRpb24oJ1VSTCBpcyByZXF1aXJlZCcsICd3YXJuaW5nJyk7XG5cbiAgICBjb25zdCBjb2RlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1jb2RlcycpLnZhbHVlLnNwbGl0KCcsJykubWFwKGMgPT4gcGFyc2VJbnQoYy50cmltKCkpKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgYm9keSA9IHtcbiAgICAgIG5hbWU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1uYW1lJykudmFsdWUudHJpbSgpIHx8IGlkLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXRpbWVvdXQnKS52YWx1ZSkgfHwgMTAwMDAsXG4gICAgICBleHBlY3RlZFN0YXR1c0NvZGVzOiBjb2Rlcy5sZW5ndGggPyBjb2RlcyA6IFsyMDBdLFxuICAgICAgc2xhOiB7IHRhcmdldDogcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tc2xhJykudmFsdWUpIHx8IDk5LjkgfSxcbiAgICAgIHNsb3dSZXNwb25zZVRocmVzaG9sZDogcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXNsb3cnKS52YWx1ZSkgfHwgNTAwMFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgZm9ybVNhdmUudGV4dENvbnRlbnQgPSAnU2F2aW5nLi4uJztcbiAgICAgIGZvcm1TYXZlLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL2hlYWx0aC1jaGVja3MvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfS9jb25maWd1cmVgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ1NhdmUgZmFpbGVkJyk7XG4gICAgICBoaWRlRm9ybSgpO1xuICAgICAgbG9hZENvbmZpZygpO1xuICAgICAgbG9hZFN0YXR1cygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZm9ybVNhdmUudGV4dENvbnRlbnQgPSAnU2F2ZSc7XG4gICAgICBmb3JtU2F2ZS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaGVhbHRoLWVkaXQnLCBhc3luYyAoZSkgPT4ge1xuICAgIGNvbnN0IGlkID0gZS5kZXRhaWw7XG4gICAgLy8gTG9hZCBleGlzdGluZyBjb25maWcgdG8gcG9wdWxhdGUgZm9ybSBcdTIwMTQgdXNlIGN1cnJlbnQgc3RhdHVzIGRhdGEgYXMgZmFsbGJhY2tcbiAgICBzaG93Rm9ybShpZCwgJycsICcnLCAxMDAwMCwgJzIwMCcsIDk5LjksIDUwMDApO1xuICB9KTtcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdoZWFsdGgtZGVsZXRlJywgYXN5bmMgKGUpID0+IHtcbiAgICBjb25zdCBpZCA9IGUuZGV0YWlsO1xuICAgIGlmICghY29uZmlybShgRGVsZXRlIGhlYWx0aCBjaGVjayBmb3IgXCIke2lkfVwiP2ApKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL2hlYWx0aC1jaGVja3MvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfS9jb25maWd1cmVgLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvcik7XG4gICAgICBsb2FkQ29uZmlnKCk7XG4gICAgICBsb2FkU3RhdHVzKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIGVyci5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH0pO1xuXG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZFN0YXR1cygpO1xuICB9KTtcbiAgd2lyZU1vZGFsKG1vZGFsLCBjYW5jZWxCdG4pO1xuICByZWZyZXNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRTdGF0dXMpO1xuXG4gIC8vIExhenktbG9hZCB0YWJzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiaGVhbHRoLWluY2lkZW50c1wiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRJbmNpZGVudHMpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cImhlYWx0aC1jb25maWdcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkQ29uZmlnKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFVQREFURSBNQU5BR0VNRU5UID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ3VwZGF0ZXMtbW9kYWwnLCBgPGRpdiBpZD1cInVwZGF0ZXMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDc1MHB4OyBtYXgtd2lkdGg6IDk1MHB4O1wiPlxuICAgICAgPGgzPlx1MkIwNlx1RkUwRiBVcGRhdGUgTWFuYWdlbWVudDwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIENoZWNrIGZvciBjb250YWluZXIgaW1hZ2UgdXBkYXRlcywgYXBwbHkgdGhlbSwgYW5kIG1hbmFnZSByb2xsYmFja3MuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC10YWJzXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWIgYWN0aXZlXCIgZGF0YS1wYW5lbD1cInVwZGF0ZXMtYXZhaWxhYmxlXCI+QXZhaWxhYmxlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwidXBkYXRlcy1oaXN0b3J5XCI+SGlzdG9yeTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cInVwZGF0ZXMtYXV0b1wiPkF1dG8tVXBkYXRlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwidXBkYXRlcy1kYXNoY2FkZHlcIiBpZD1cInVwZGF0ZXMtZGFzaGNhZGR5LXRhYlwiPkRhc2hDYWRkeTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBBdmFpbGFibGUgVXBkYXRlcyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWF2YWlsYWJsZVwiIGNsYXNzPVwicGFuZWwtc2VjdGlvbiBhY3RpdmVcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJ1cGRhdGVzLWNoZWNrLWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiPlx1RDgzRFx1REQwRCBDaGVjayBmb3IgVXBkYXRlczwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJ1cGRhdGVzLXVwZGF0ZS1hbGwtYnRuXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjgycmVtOyBiYWNrZ3JvdW5kOiAjZjk3MzE2OyBjb2xvcjogI2ZmZjsgYm9yZGVyOiAxcHggc29saWQgI2Y5NzMxNjsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XHUyQjA2XHVGRTBGIFVwZGF0ZSBBbGw8L2J1dHRvbj5cbiAgICAgICAgICA8c3BhbiBpZD1cInVwZGF0ZXMtY291bnQtYmFkZ2VcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDRweCAxMHB4OyBib3JkZXItcmFkaXVzOiAxMnB4OyBmb250LXNpemU6IDAuNzhyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1iZyk7XCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInVwZGF0ZXMtYXZhaWxhYmxlLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogNDUwcHg7IG92ZXJmbG93LXk6IGF1dG87XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0U2PC9zcGFuPiBDbGljayBcIkNoZWNrIGZvciBVcGRhdGVzXCIgdG8gc2NhbiBjb250YWluZXJzLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogSGlzdG9yeSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWhpc3RvcnlcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cInVwZGF0ZXMtaGlzdG9yeS1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgdXBkYXRlIGhpc3RvcnkuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEF1dG8tVXBkYXRlIC0tPlxuICAgICAgPGRpdiBpZD1cInVwZGF0ZXMtYXV0b1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwidXBkYXRlcy1hdXRvLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRVx1REQxNjwvc3Bhbj4gTG9hZGluZyBhdXRvLXVwZGF0ZSBjb25maWd1cmF0aW9uLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBEYXNoQ2FkZHkgU2VsZi1VcGRhdGUgLS0+XG4gICAgICA8ZGl2IGlkPVwidXBkYXRlcy1kYXNoY2FkZHlcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cImRhc2hjYWRkeS12ZXJzaW9uLWluZm9cIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTZweDsgbWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZzogMTJweDsgYm9yZGVyLXJhZGl1czogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxcmVtO1wiPkRhc2hDYWRkeTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBpZD1cImRhc2hjYWRkeS1jdXJyZW50LXZlcnNpb25cIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5Mb2FkaW5nLi4uPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cImRhc2hjYWRkeS11cGRhdGUtYmFkZ2VcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDRweCAxMnB4OyBib3JkZXItcmFkaXVzOiAxMnB4OyBmb250LXNpemU6IDAuNzhyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1iZyk7XCI+VXBkYXRlIGF2YWlsYWJsZTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRhc2hjYWRkeS11cGRhdGUtZGV0YWlsc1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZzogMTJweDsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDtcIj5OZXcgdmVyc2lvbjogPHNwYW4gaWQ9XCJkYXNoY2FkZHktbmV3LXZlcnNpb25cIj48L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImRhc2hjYWRkeS1hcHBseS1idG5cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+VXBkYXRlIE5vdzwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJkYXNoY2FkZHktY2hhbmdlbG9nXCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWF4LWhlaWdodDogMTIwcHg7IG92ZXJmbG93LXk6IGF1dG87IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtbW9ubyk7IGxpbmUtaGVpZ2h0OiAxLjU7XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LXN0YXR1cy1iYXJcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyLXJhZGl1czogOHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJkYXNoY2FkZHktY2hlY2stYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjgycmVtO1wiPkNoZWNrIGZvciBVcGRhdGVzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImRhc2hjYWRkeS1yb2xsYmFjay1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODJyZW07IG1hcmdpbi1sZWZ0OiA2cHg7XCI+Um9sbGJhY2s8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkYXNoY2FkZHktaGlzdG9yeS1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDI1MHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENFNjwvc3Bhbj5ObyBzZWxmLXVwZGF0ZSBoaXN0b3J5LjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtYm90dG9tLWJhclwiPlxuICAgICAgICA8c3BhbiBpZD1cInVwZGF0ZXMtbGFzdC1jaGVja1wiIGNsYXNzPVwidGV4dC1hdXRvLXJpZ2h0XCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwidXBkYXRlcy1jYW5jZWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1jYW5jZWwnKTtcbiAgY29uc3QgY2hlY2tCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1jaGVjay1idG4nKTtcbiAgY29uc3QgYXZhaWxhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtYXZhaWxhYmxlLWNvbnRhaW5lcicpO1xuICBjb25zdCBoaXN0b3J5Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtaGlzdG9yeS1jb250YWluZXInKTtcbiAgY29uc3QgYXV0b0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWF1dG8tY29udGFpbmVyJyk7XG4gIGNvbnN0IGxhc3RDaGVja1NwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1sYXN0LWNoZWNrJyk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEF2YWlsYWJsZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdXBkYXRlcy9hdmFpbGFibGUnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yKTtcblxuICAgICAgY29uc3QgdXBkYXRlcyA9IGRhdGEudXBkYXRlcyB8fCBbXTtcbiAgICAgIGlmICh1cGRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBhdmFpbGFibGVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1MjcwNTwvc3Bhbj5BbGwgY29udGFpbmVycyBhcmUgdXAgdG8gZGF0ZS48L2Rpdj4nO1xuICAgICAgICBsYXN0Q2hlY2tTcGFuLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLXVwZGF0ZS1hbGwtYnRuJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtY291bnQtYmFkZ2UnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB3aW5kb3cuX3BlbmRpbmdVcGRhdGVzID0gW107XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkNvbnRhaW5lcjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkltYWdlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+Q3VycmVudDwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkxhdGVzdDwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5BY3Rpb25zPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IHUgb2YgdXBkYXRlcykge1xuICAgICAgICAvLyBNYXRjaCBhcHAgYnkgY29udGFpbmVySWQgZmlyc3QsIHRoZW4gbmFtZVxuICAgICAgICBjb25zdCBhcHBJZCA9ICgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXBwcyA9IHdpbmRvdy5BUFBTIHx8IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgYSBvZiBhcHBzKSB7XG4gICAgICAgICAgICBpZiAoYS5jb250YWluZXJJZCA9PT0gdS5jb250YWluZXJJZCB8fCBhLm5hbWUgPT09IHUuY29udGFpbmVyTmFtZSB8fCBhLmlkID09PSB1LmNvbnRhaW5lck5hbWUpIHJldHVybiBhLmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdS5jb250YWluZXJOYW1lO1xuICAgICAgICB9KSgpO1xuICAgICAgICBodG1sICs9IGA8dHIgZGF0YS1hcHAtaWQ9XCIke2VzY2FwZUh0bWwoYXBwSWQpfVwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbCh1LmNvbnRhaW5lck5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbCh1LmltYWdlTmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+PGNvZGUgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgcGFkZGluZzogMnB4IDZweDsgYm9yZGVyLXJhZGl1czogNHB4O1wiPiR7ZXNjYXBlSHRtbCh1LmN1cnJlbnREaWdlc3QpfTwvY29kZT48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj48Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgYmFja2dyb3VuZDogdmFyKC0tb2stYmcpOyBjb2xvcjogdmFyKC0tb2stZmcpOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+JHtlc2NhcGVIdG1sKHUubGF0ZXN0RGlnZXN0KX08L2NvZGU+PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDxidXR0b24gY2xhc3M9XCJ1cGRhdGUtbm93LWJ0blwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwodS5jb250YWluZXJJZCl9XCIgZGF0YS1uYW1lPVwiJHtlc2NhcGVIdG1sKHUuY29udGFpbmVyTmFtZSl9XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtOyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYmcpOyBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7IG1hcmdpbi1yaWdodDogNHB4O1wiPlVwZGF0ZTwvYnV0dG9uPmA7XG4gICAgICAgIGh0bWwgKz0gYDxidXR0b24gY2xhc3M9XCJyb2xsYmFjay1idG5cIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKHUuY29udGFpbmVySWQpfVwiIGRhdGEtbmFtZT1cIiR7ZXNjYXBlSHRtbCh1LmNvbnRhaW5lck5hbWUpfVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTtcIj5Sb2xsYmFjazwvYnV0dG9uPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvdGQ+PC90cj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgYXZhaWxhYmxlQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICBsYXN0Q2hlY2tTcGFuLnRleHRDb250ZW50ID0gdXBkYXRlcy5sZW5ndGggKyAnIHVwZGF0ZShzKSBhdmFpbGFibGUnO1xuXG4gICAgICAvLyBTaG93IGNvdW50IGJhZGdlIGFuZCBVcGRhdGUgQWxsIGJ1dHRvblxuICAgICAgY29uc3QgY291bnRCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWNvdW50LWJhZGdlJyk7XG4gICAgICBjb25zdCB1cGRhdGVBbGxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy11cGRhdGUtYWxsLWJ0bicpO1xuICAgICAgaWYgKGNvdW50QmFkZ2UpIHtcbiAgICAgICAgY291bnRCYWRnZS50ZXh0Q29udGVudCA9IHVwZGF0ZXMubGVuZ3RoICsgJyBwZW5kaW5nJztcbiAgICAgICAgY291bnRCYWRnZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlQWxsQnRuICYmIHVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB1cGRhdGVBbGxCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB1cGRhdGVzIGZvciBVcGRhdGUgQWxsIGJ1dHRvblxuICAgICAgd2luZG93Ll9wZW5kaW5nVXBkYXRlcyA9IHVwZGF0ZXM7XG5cbiAgICAgIC8vIFdpcmUgdXBkYXRlIGJ1dHRvbnNcbiAgICAgIGF2YWlsYWJsZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcudXBkYXRlLW5vdy1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGJ0bi5kYXRhc2V0LmlkO1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBidG4uZGF0YXNldC5uYW1lO1xuICAgICAgICAgIGlmICghY29uZmlybShgVXBkYXRlIFwiJHtuYW1lfVwiIHRvIHRoZSBsYXRlc3QgdmVyc2lvbj8gVGhlIGNvbnRhaW5lciB3aWxsIHJlc3RhcnQuYCkpIHJldHVybjtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnVXBkYXRpbmcuLi4nO1xuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS91cGRhdGVzL3VwZGF0ZS8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YCwge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYXV0b1JvbGxiYWNrOiB0cnVlIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgICAgIGlmIChkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ0RvbmUhJztcbiAgICAgICAgICAgICAgYnRuLnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tb2stZmcpJztcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBsb2FkQXZhaWxhYmxlKCksIDIwMDApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGQuZXJyb3IgfHwgJ1VwZGF0ZSBmYWlsZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnRmFpbGVkJztcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1VwZGF0ZSBlcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ1VwZGF0ZSc7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyBidG4uc3R5bGUuY29sb3IgPSAnJzsgYnRuLnN0eWxlLmJhY2tncm91bmQgPSAnJzsgfSwgMzAwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBXaXJlIHJvbGxiYWNrIGJ1dHRvbnNcbiAgICAgIGF2YWlsYWJsZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcucm9sbGJhY2stYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBidG4uZGF0YXNldC5pZDtcbiAgICAgICAgICBjb25zdCBuYW1lID0gYnRuLmRhdGFzZXQubmFtZTtcbiAgICAgICAgICBpZiAoIWNvbmZpcm0oYFJvbGxiYWNrIFwiJHtuYW1lfVwiIHRvIGl0cyBwcmV2aW91cyB2ZXJzaW9uP2ApKSByZXR1cm47XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1JvbGxpbmcgYmFjay4uLic7XG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgciA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3VwZGF0ZXMvcm9sbGJhY2svJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfWAsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgICAgICBpZiAoZC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdSb2xsZWQgYmFjayEnO1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGxvYWRBdmFpbGFibGUoKSwgMjAwMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZC5lcnJvciB8fCAnUm9sbGJhY2sgZmFpbGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ0ZhaWxlZCc7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdSb2xsYmFjayBlcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ1JvbGxiYWNrJzsgYnRuLmRpc2FibGVkID0gZmFsc2U7IH0sIDMwMDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhdmFpbGFibGVDb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFVwZGF0ZSBBbGwgXHUyMDE0IHNlcXVlbnRpYWxseSwgc2tpcCBmYWlsdXJlc1xuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVBbGxDb250YWluZXJzKCkge1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB3aW5kb3cuX3BlbmRpbmdVcGRhdGVzIHx8IFtdO1xuICAgIGlmICghdXBkYXRlcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy11cGRhdGUtYWxsLWJ0bicpO1xuICAgIGlmICghY29uZmlybShgVXBkYXRlIGFsbCAke3VwZGF0ZXMubGVuZ3RofSBjb250YWluZXJzPyBFYWNoIHdpbGwgcmVzdGFydC5gKSkgcmV0dXJuO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjMgVXBkYXRpbmcuLi4nO1xuICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgbGV0IHN1Y2Nlc3MgPSAwLCBmYWlsZWQgPSAwO1xuICAgIGZvciAoY29uc3QgdSBvZiB1cGRhdGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvdXBkYXRlcy91cGRhdGUvJHtlbmNvZGVVUklDb21wb25lbnQodS5jb250YWluZXJJZCl9YCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYXV0b1JvbGxiYWNrOiB0cnVlIH0pXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgIGlmIChkLnN1Y2Nlc3MpIHN1Y2Nlc3MrKztcbiAgICAgICAgZWxzZSBmYWlsZWQrKztcbiAgICAgIH0gY2F0Y2ggKF8pIHsgZmFpbGVkKys7IH1cbiAgICB9XG4gICAgYnRuLnRleHRDb250ZW50ID0gYFx1MjcwNSBEb25lYDtcbiAgICBzaG93Tm90aWZpY2F0aW9uKGBVcGRhdGUgYWxsOiAke3N1Y2Nlc3N9IHN1Y2NlZWRlZCwgJHtmYWlsZWR9IGZhaWxlZC5gLCBzdWNjZXNzID4gMCAmJiBmYWlsZWQgPT09IDAgPyAnc3VjY2VzcycgOiAnZXJyb3InKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTJCMDZcdUZFMEYgVXBkYXRlIEFsbCc7XG4gICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGxvYWRBdmFpbGFibGUoKTtcbiAgICB9LCAzMDAwKTtcbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLXVwZGF0ZS1hbGwtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdXBkYXRlQWxsQ29udGFpbmVycyk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tGb3JVcGRhdGVzKCkge1xuICAgIGNoZWNrQnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REQwRCBDaGVja2luZy4uLic7XG4gICAgY2hlY2tCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS91cGRhdGVzL2NoZWNrJywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yKTtcbiAgICAgIGNoZWNrQnRuLnRleHRDb250ZW50ID0gJ1x1MjcwNSBEb25lISc7XG4gICAgICBhd2FpdCBsb2FkQXZhaWxhYmxlKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY2hlY2tCdG4udGV4dENvbnRlbnQgPSAnXHUyNzRDIEZhaWxlZCc7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdDaGVjayBlcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4geyBjaGVja0J0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMEQgQ2hlY2sgZm9yIFVwZGF0ZXMnOyBjaGVja0J0bi5kaXNhYmxlZCA9IGZhbHNlOyB9LCAzMDAwKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRIaXN0b3J5KCkge1xuICAgIHRyeSB7XG4gICAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdXBkYXRlcy9oaXN0b3J5P2xpbWl0PTUwJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IGhpc3RvcnkgPSBkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5oaXN0b3J5ID8gZGF0YS5oaXN0b3J5IDogW107XG4gICAgICBpZiAoaGlzdG9yeS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0NCPC9zcGFuPk5vIHVwZGF0ZSBoaXN0b3J5IHlldC48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+V2hlbjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkNvbnRhaW5lcjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkltYWdlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+RHVyYXRpb248L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TdGF0dXM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgaCBvZiBoaXN0b3J5KSB7XG4gICAgICAgIGNvbnN0IG9rID0gaC5zdGF0dXMgPT09ICdzdWNjZXNzJztcbiAgICAgICAgY29uc3QgZHVyID0gaC5kdXJhdGlvbiA/IChoLmR1cmF0aW9uIDwgMTAwMCA/IGguZHVyYXRpb24gKyAnbXMnIDogTWF0aC5yb3VuZChoLmR1cmF0aW9uIC8gMTAwMCkgKyAncycpIDogJy0nO1xuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHt0aW1lQWdvKGgudGltZXN0YW1wKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwoaC5jb250YWluZXJOYW1lKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2VzY2FwZUh0bWwoaC5pbWFnZU5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPiR7ZHVyfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPjxzcGFuIHN0eWxlPVwiY29sb3I6ICR7b2sgPyAndmFyKC0tb2stZmcpJyA6ICd2YXIoLS1iYWQtZmcpJ307XCI+JHtvayA/ICdcdTI3MTMgc3VjY2VzcycgOiAnXHUyNzE3IGZhaWxlZCd9PC9zcGFuPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICBpZiAoIW9rICYmIGguZXJyb3IpIHtcbiAgICAgICAgICBodG1sICs9IGA8dHI+PHRkIGNvbHNwYW49XCI1XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggNnB4IDhweDsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj4ke2VzY2FwZUh0bWwoaC5lcnJvcil9PC90ZD48L3RyPmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkQXV0b0NvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgYXV0b0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+JztcblxuICAgICAgLy8gRmV0Y2ggY29udGFpbmVycyBhbmQgc2F2ZWQgYXV0by11cGRhdGUgY29uZmlnIGluIHBhcmFsbGVsXG4gICAgICBjb25zdCBbY29udGFpbmVyc1JlcywgY29uZmlnUmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZmV0Y2goJy9hcGkvdjEvc3RhdHMvY29udGFpbmVycycpLFxuICAgICAgICBmZXRjaCgnL2FwaS92MS91cGRhdGVzL2F1dG8tdXBkYXRlJylcbiAgICAgIF0pO1xuICAgICAgY29uc3QgY29udGFpbmVyc0RhdGEgPSBhd2FpdCBjb250YWluZXJzUmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IGNvbmZpZ0RhdGEgPSBhd2FpdCBjb25maWdSZXMuanNvbigpO1xuXG4gICAgICBjb25zdCBjb250YWluZXJzID0gY29udGFpbmVyc0RhdGEuc3VjY2VzcyAmJiBjb250YWluZXJzRGF0YS5zdGF0cyA/IGNvbnRhaW5lcnNEYXRhLnN0YXRzIDogW107XG4gICAgICBjb25zdCBzYXZlZENvbmZpZyA9IGNvbmZpZ0RhdGEuc3VjY2VzcyAmJiBjb25maWdEYXRhLmNvbmZpZyA/IGNvbmZpZ0RhdGEuY29uZmlnIDoge307XG5cbiAgICAgIGlmIChjb250YWluZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBhdXRvQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0VcdUREMTY8L3NwYW4+Tm8gcnVubmluZyBjb250YWluZXJzIGZvdW5kLjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGh0bWwgPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7IGZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkF1dG8tdXBkYXRlcyBydW4gZHVyaW5nIG1haW50ZW5hbmNlIHdpbmRvdyAoZGVmYXVsdCAyQU0tNEFNKS4gRGFpbHkgPSBldmVyeSBkYXksIFdlZWtseSA9IFN1bmRheXMsIE1vbnRobHkgPSAxc3Qgb2YgbW9udGguPC9kaXY+JztcbiAgICAgIGh0bWwgKz0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODVyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5Db250YWluZXI8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TY2hlZHVsZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPldpbmRvdzwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlJvbGxiYWNrPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+TGFzdCBSdW48L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+QWN0aW9uczwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCBjIG9mIGNvbnRhaW5lcnMpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGMubmFtZSB8fCBjLk5hbWVzPy5bMF0/LnJlcGxhY2UoL15cXC8vLCAnJykgfHwgYy5JZD8uc3Vic3RyaW5nKDAsIDEyKTtcbiAgICAgICAgY29uc3QgY2lkID0gYy5jb250YWluZXJJZCB8fCBjLklkO1xuICAgICAgICBjb25zdCBzYXZlZCA9IHNhdmVkQ29uZmlnW2NpZF0gfHwge307XG4gICAgICAgIGNvbnN0IHNjaGVkdWxlVmFsID0gc2F2ZWQuZW5hYmxlZCA/IChzYXZlZC5zY2hlZHVsZSB8fCAnd2Vla2x5JykgOiAnJztcbiAgICAgICAgY29uc3Qgcm9sbGJhY2tWYWwgPSBzYXZlZC5hdXRvUm9sbGJhY2sgIT09IGZhbHNlO1xuICAgICAgICBjb25zdCB3aW5kb3dWYWwgPSBzYXZlZC5tYWludGVuYW5jZVdpbmRvdyB8fCAnJztcbiAgICAgICAgY29uc3QgbGFzdFJ1biA9IHNhdmVkLmxhc3RBdXRvVXBkYXRlID8gdGltZUFnbyhzYXZlZC5sYXN0QXV0b1VwZGF0ZSkgOiAnTmV2ZXInO1xuXG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiIGRhdGEtY29udGFpbmVyLWlkPVwiJHtlc2NhcGVIdG1sKGNpZCl9XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChuYW1lKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5cbiAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiYXV0by1zY2hlZHVsZVwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwoY2lkKX1cIiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODJyZW07XCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIkeyFzY2hlZHVsZVZhbCA/ICcgc2VsZWN0ZWQnIDogJyd9PkRpc2FibGVkPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZGFpbHlcIiR7c2NoZWR1bGVWYWwgPT09ICdkYWlseScgPyAnIHNlbGVjdGVkJyA6ICcnfT5EYWlseTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIndlZWtseVwiJHtzY2hlZHVsZVZhbCA9PT0gJ3dlZWtseScgPyAnIHNlbGVjdGVkJyA6ICcnfT5XZWVrbHk8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtb250aGx5XCIke3NjaGVkdWxlVmFsID09PSAnbW9udGhseScgPyAnIHNlbGVjdGVkJyA6ICcnfT5Nb250aGx5PC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhdXRvLXdpbmRvd1wiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwoY2lkKX1cIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbCh3aW5kb3dWYWwpfVwiIHBsYWNlaG9sZGVyPVwiMDI6MDAtMDQ6MDBcIiBzdHlsZT1cIndpZHRoOiA5MHB4OyBwYWRkaW5nOiAzcHggNnB4OyBmb250LXNpemU6IDAuNzhyZW07IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiIC8+PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiYXV0by1yb2xsYmFja1wiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwoY2lkKX1cIiR7cm9sbGJhY2tWYWwgPyAnIGNoZWNrZWQnIDogJyd9IC8+PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2xhc3RSdW59PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPjxidXR0b24gY2xhc3M9XCJzYXZlLWF1dG8tYnRuXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChjaWQpfVwiIGRhdGEtbmFtZT1cIiR7ZXNjYXBlSHRtbChuYW1lKX1cIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07XCI+U2F2ZTwvYnV0dG9uPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgYXV0b0NvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICAvLyBXaXJlIHNhdmUgYnV0dG9uc1xuICAgICAgYXV0b0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuc2F2ZS1hdXRvLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gYnRuLmRhdGFzZXQuaWQ7XG4gICAgICAgICAgY29uc3Qgcm93ID0gYnRuLmNsb3Nlc3QoJ3RyJyk7XG4gICAgICAgICAgY29uc3Qgc2NoZWR1bGUgPSByb3cucXVlcnlTZWxlY3RvcignLmF1dG8tc2NoZWR1bGUnKS52YWx1ZTtcbiAgICAgICAgICBjb25zdCByb2xsYmFjayA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuYXV0by1yb2xsYmFjaycpLmNoZWNrZWQ7XG4gICAgICAgICAgY29uc3Qgd2luZG93ID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5hdXRvLXdpbmRvdycpLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnU2F2aW5nLi4uJztcbiAgICAgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvdXBkYXRlcy9hdXRvLXVwZGF0ZS8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YCwge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZW5hYmxlZDogISFzY2hlZHVsZSwgc2NoZWR1bGU6IHNjaGVkdWxlIHx8ICd3ZWVrbHknLCBhdXRvUm9sbGJhY2s6IHJvbGxiYWNrLCBtYWludGVuYW5jZVdpbmRvdzogd2luZG93IHx8IHVuZGVmaW5lZCB9KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgICAgICBpZiAoZC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MTMgU2F2ZWQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGQuZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MTcgRXJyb3InO1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignU2F2ZSBlcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnU2F2ZSc7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyB9LCAyMDAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhdXRvQ29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBEQVNIQ0FERFkgU0VMRi1VUERBVEUgPT09PT1cblxuICBjb25zdCBkY1ZlcnNpb25JbmZvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1jdXJyZW50LXZlcnNpb24nKTtcbiAgY29uc3QgZGNVcGRhdGVCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktdXBkYXRlLWJhZGdlJyk7XG4gIGNvbnN0IGRjVXBkYXRlRGV0YWlscyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktdXBkYXRlLWRldGFpbHMnKTtcbiAgY29uc3QgZGNOZXdWZXJzaW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1uZXctdmVyc2lvbicpO1xuICBjb25zdCBkY0NoYW5nZWxvZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktY2hhbmdlbG9nJyk7XG4gIGNvbnN0IGRjQXBwbHlCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LWFwcGx5LWJ0bicpO1xuICBjb25zdCBkY0NoZWNrQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1jaGVjay1idG4nKTtcbiAgY29uc3QgZGNSb2xsYmFja0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktcm9sbGJhY2stYnRuJyk7XG4gIGNvbnN0IGRjU3RhdHVzQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1zdGF0dXMtYmFyJyk7XG4gIGNvbnN0IGRjSGlzdG9yeUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktaGlzdG9yeS1jb250YWluZXInKTtcblxuICBsZXQgZGNMYXN0Q2hlY2sgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGRjU2hvd1N0YXR1cyhtc2csIHR5cGUpIHtcbiAgICBpZiAoIWRjU3RhdHVzQmFyKSByZXR1cm47XG4gICAgZGNTdGF0dXNCYXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgZGNTdGF0dXNCYXIuc3R5bGUuYmFja2dyb3VuZCA9IHR5cGUgPT09ICdlcnJvcicgPyAndmFyKC0tYmFkLWJnKScgOiB0eXBlID09PSAnc3VjY2VzcycgPyAndmFyKC0tb2stYmcpJyA6ICd2YXIoLS1iZyknO1xuICAgIGRjU3RhdHVzQmFyLnN0eWxlLmNvbG9yID0gdHlwZSA9PT0gJ2Vycm9yJyA/ICd2YXIoLS1iYWQtZmcpJyA6IHR5cGUgPT09ICdzdWNjZXNzJyA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWZnKSc7XG4gICAgZGNTdGF0dXNCYXIudGV4dENvbnRlbnQgPSBtc2c7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkY0xvYWRWZXJzaW9uKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zeXN0ZW0vdmVyc2lvbicpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IGNvbW1pdCA9IGRhdGEuY29tbWl0ICYmIGRhdGEuY29tbWl0ICE9PSAndW5rbm93bicgPyBkYXRhLmNvbW1pdCA6IG51bGw7XG4gICAgICAgIGRjVmVyc2lvbkluZm8udGV4dENvbnRlbnQgPSAndicgKyBkYXRhLnZlcnNpb24gKyAoY29tbWl0ID8gJyAoJyArIGNvbW1pdC5zdWJzdHJpbmcoMCwgNykgKyAnKScgOiAnJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgZGNWZXJzaW9uSW5mby50ZXh0Q29udGVudCA9ICdVbmFibGUgdG8gZmV0Y2ggdmVyc2lvbic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGNDaGVja0ZvclVwZGF0ZShzaWxlbnQpIHtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgZGNDaGVja0J0bi50ZXh0Q29udGVudCA9ICdDaGVja2luZy4uLic7XG4gICAgICBkY0NoZWNrQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3N5c3RlbS91cGRhdGUtY2hlY2snKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgZGNMYXN0Q2hlY2sgPSBkYXRhO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzICYmIGRhdGEuYXZhaWxhYmxlICYmIGRhdGEucmVtb3RlKSB7XG4gICAgICAgIGRjVXBkYXRlQmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICBkY1VwZGF0ZURldGFpbHMuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICBkY05ld1ZlcnNpb24udGV4dENvbnRlbnQgPSAndicgKyBkYXRhLnJlbW90ZS52ZXJzaW9uO1xuICAgICAgICBkY0NoYW5nZWxvZy50ZXh0Q29udGVudCA9IGRhdGEucmVtb3RlLmNoYW5nZWxvZyB8fCAnTm8gY2hhbmdlbG9nIGF2YWlsYWJsZS4nO1xuXG4gICAgICAgIC8vIEFkZCBub3RpZmljYXRpb24gZG90IHRvIHRoZSBVcGRhdGVzIGJ1dHRvblxuICAgICAgICBjb25zdCB1cGRhdGVzQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtYnRuJyk7XG4gICAgICAgIGlmICh1cGRhdGVzQnRuICYmICF1cGRhdGVzQnRuLnF1ZXJ5U2VsZWN0b3IoJy51cGRhdGUtZG90JykpIHtcbiAgICAgICAgICBjb25zdCBkb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgZG90LmNsYXNzTmFtZSA9ICd1cGRhdGUtZG90JztcbiAgICAgICAgICBkb3Quc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MnB4O3JpZ2h0OjJweDt3aWR0aDo4cHg7aGVpZ2h0OjhweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOnZhcigtLWFjY2VudCk7JztcbiAgICAgICAgICB1cGRhdGVzQnRuLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgICAgICB1cGRhdGVzQnRuLmFwcGVuZENoaWxkKGRvdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxzbyBhZGQgZG90IHRvIHRoZSBEYXNoQ2FkZHkgdGFiXG4gICAgICAgIGNvbnN0IGRjVGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtZGFzaGNhZGR5LXRhYicpO1xuICAgICAgICBpZiAoZGNUYWIgJiYgIWRjVGFiLnF1ZXJ5U2VsZWN0b3IoJy51cGRhdGUtZG90JykpIHtcbiAgICAgICAgICBjb25zdCBkb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgZG90LmNsYXNzTmFtZSA9ICd1cGRhdGUtZG90JztcbiAgICAgICAgICBkb3Quc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDo2cHg7aGVpZ2h0OjZweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOnZhcigtLWFjY2VudCk7bWFyZ2luLWxlZnQ6NHB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsnO1xuICAgICAgICAgIGRjVGFiLmFwcGVuZENoaWxkKGRvdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRjVXBkYXRlQmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZGNVcGRhdGVEZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGF3YWl0IGRjTG9hZFZlcnNpb24oKTtcbiAgICAgICAgaWYgKCFzaWxlbnQpIGRjU2hvd1N0YXR1cygnWW91IGFyZSBydW5uaW5nIHRoZSBsYXRlc3QgdmVyc2lvbi4nLCAnc3VjY2VzcycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICBkY0NoZWNrQnRuLnRleHRDb250ZW50ID0gJ0NoZWNrIGZvciBVcGRhdGVzJztcbiAgICAgICAgZGNDaGVja0J0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIGRjU2hvd1N0YXR1cygnRmFpbGVkIHRvIGNoZWNrOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgZGNDaGVja0J0bi50ZXh0Q29udGVudCA9ICdDaGVjayBmb3IgVXBkYXRlcyc7XG4gICAgICAgIGRjQ2hlY2tCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkY0FwcGx5VXBkYXRlKCkge1xuICAgIGlmICghY29uZmlybSgnQXBwbHkgRGFzaENhZGR5IHVwZGF0ZT8gVGhlIEFQSSBjb250YWluZXIgd2lsbCByZXN0YXJ0LicpKSByZXR1cm4gZmFsc2U7XG4gICAgZGNBcHBseUJ0bi50ZXh0Q29udGVudCA9ICdVcGRhdGluZy4uLic7XG4gICAgZGNBcHBseUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgZGNTaG93U3RhdHVzKCdEb3dubG9hZGluZyBhbmQgYXBwbHlpbmcgdXBkYXRlLi4uJywgJ2luZm8nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc3lzdGVtL3VwZGF0ZS1hcHBseScsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZGNTaG93U3RhdHVzKCdVcGRhdGUgaW5pdGlhdGVkOiB2JyArIChkYXRhLmZyb21WZXJzaW9uIHx8ICc/JykgKyAnIFx1MjE5MiB2JyArIChkYXRhLnRvVmVyc2lvbiB8fCAnPycpICsgJy4gVGhlIGNvbnRhaW5lciB3aWxsIHJlc3RhcnQgc2hvcnRseS4nLCAnc3VjY2VzcycpO1xuICAgICAgICBkY0FwcGx5QnRuLnRleHRDb250ZW50ID0gJ0FwcGxpZWQhJztcbiAgICAgICAgLy8gUmVtb3ZlIG5vdGlmaWNhdGlvbiBkb3RzXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy51cGRhdGUtZG90JykuZm9yRWFjaChkID0+IGQucmVtb3ZlKCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdVcGRhdGUgZmFpbGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGNTaG93U3RhdHVzKCdVcGRhdGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgIGRjQXBwbHlCdG4udGV4dENvbnRlbnQgPSAnVXBkYXRlIE5vdyc7XG4gICAgICBkY0FwcGx5QnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRjTG9hZEhpc3RvcnkoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3N5c3RlbS91cGRhdGUtaGlzdG9yeScpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBjb25zdCBoaXN0b3J5ID0gZGF0YS5zdWNjZXNzICYmIGRhdGEuaGlzdG9yeSA/IGRhdGEuaGlzdG9yeSA6IFtdO1xuICAgICAgaWYgKGhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRjSGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0U2PC9zcGFuPk5vIHNlbGYtdXBkYXRlIGhpc3RvcnkuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPldoZW48L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5WZXJzaW9uPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+RnJvbTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlN0YXR1czwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCBoIG9mIGhpc3RvcnkpIHtcbiAgICAgICAgY29uc3Qgc3QgPSBoLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnID8gJ1x1MjcxMyBzdWNjZXNzJyA6IGguc3RhdHVzID09PSAncGVuZGluZycgPyAnXHUyM0YzIHBlbmRpbmcnIDogaC5zdGF0dXMgPT09ICdwYXJ0aWFsJyA/ICdcdTI2QTAgcGFydGlhbCcgOiAnXHUyNzE3ICcgKyBoLnN0YXR1cztcbiAgICAgICAgY29uc3Qgc3RDb2xvciA9IGguc3RhdHVzID09PSAnc3VjY2VzcycgPyAndmFyKC0tb2stZmcpJyA6IGguc3RhdHVzID09PSAncGVuZGluZycgPyAndmFyKC0tbXV0ZWQpJyA6ICd2YXIoLS1iYWQtZmcpJztcbiAgICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+JztcbiAgICAgICAgaHRtbCArPSAnPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPicgKyB0aW1lQWdvKGgudGltZXN0YW1wKSArICc8L3RkPic7XG4gICAgICAgIGh0bWwgKz0gJzx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj52JyArIGVzY2FwZUh0bWwoaC52ZXJzaW9uKSArIChoLnJvbGxiYWNrID8gJyAocm9sbGJhY2spJyA6ICcnKSArICc8L3RkPic7XG4gICAgICAgIGh0bWwgKz0gJzx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj52JyArIGVzY2FwZUh0bWwoaC5mcm9tVmVyc2lvbiB8fCAnPycpICsgJzwvdGQ+JztcbiAgICAgICAgaHRtbCArPSAnPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPjxzcGFuIHN0eWxlPVwiY29sb3I6ICcgKyBzdENvbG9yICsgJztcIj4nICsgc3QgKyAnPC9zcGFuPjwvdGQ+JztcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICBpZiAoaC5lcnJvcikge1xuICAgICAgICAgIGh0bWwgKz0gJzx0cj48dGQgY29sc3Bhbj1cIjRcIiBzdHlsZT1cInBhZGRpbmc6IDRweCA2cHggOHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPicgKyBlc2NhcGVIdG1sKGguZXJyb3IpICsgJzwvdGQ+PC90cj4nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoLm5vdGUpIHtcbiAgICAgICAgICBodG1sICs9ICc8dHI+PHRkIGNvbHNwYW49XCI0XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggNnB4IDhweDsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPicgKyBlc2NhcGVIdG1sKGgubm90ZSkgKyAnPC90ZD48L3RyPic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIGRjSGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRjSGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkY1Nob3dSb2xsYmFjaygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc3lzdGVtL3JvbGxiYWNrLXZlcnNpb25zJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IHZlcnNpb25zID0gZGF0YS5zdWNjZXNzICYmIGRhdGEudmVyc2lvbnMgPyBkYXRhLnZlcnNpb25zIDogW107XG4gICAgICBpZiAodmVyc2lvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ05vIHJvbGxiYWNrIHZlcnNpb25zIGF2YWlsYWJsZS4nLCAnaW5mbycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB2ZXJzaW9uID0gcHJvbXB0KCdBdmFpbGFibGUgcm9sbGJhY2sgdmVyc2lvbnM6XFxuJyArIHZlcnNpb25zLmpvaW4oJ1xcbicpICsgJ1xcblxcbkVudGVyIHZlcnNpb24gdG8gcm9sbGJhY2sgdG86Jyk7XG4gICAgICBpZiAoIXZlcnNpb24pIHJldHVybjtcbiAgICAgIGlmICghdmVyc2lvbnMuaW5jbHVkZXModmVyc2lvbikpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignSW52YWxpZCB2ZXJzaW9uOiAnICsgdmVyc2lvbiwgJ2Vycm9yJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghY29uZmlybSgnUm9sbGJhY2sgRGFzaENhZGR5IHRvIHYnICsgdmVyc2lvbiArICc/IFRoZSBjb250YWluZXIgd2lsbCByZXN0YXJ0LicpKSByZXR1cm47XG4gICAgICBkY1Nob3dTdGF0dXMoJ1JvbGxpbmcgYmFjayB0byB2JyArIHZlcnNpb24gKyAnLi4uJywgJ2luZm8nKTtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zeXN0ZW0vcm9sbGJhY2snLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB2ZXJzaW9uIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgIGlmIChkLnN1Y2Nlc3MpIHtcbiAgICAgICAgZGNTaG93U3RhdHVzKCdSb2xsYmFjayB0byB2JyArIHZlcnNpb24gKyAnIGluaXRpYXRlZC4gQ29udGFpbmVyIHdpbGwgcmVzdGFydC4nLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGQuZXJyb3IgfHwgJ1JvbGxiYWNrIGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRjU2hvd1N0YXR1cygnUm9sbGJhY2sgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICBkY0NoZWNrQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGRjQ2hlY2tGb3JVcGRhdGUoZmFsc2UpKTtcbiAgZGNBcHBseUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBkY0FwcGx5VXBkYXRlKCkuY2F0Y2goKCkgPT4ge30pKTtcbiAgZGNSb2xsYmFja0J0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkY1Nob3dSb2xsYmFjayk7XG5cbiAgY2hlY2tCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2hlY2tGb3JVcGRhdGVzKTtcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkQXZhaWxhYmxlKCk7XG4gIH0pO1xuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG5cbiAgLy8gT3BlbiBVcGRhdGUgTWFuYWdlbWVudCBtb2RhbCwgb3B0aW9uYWxseSBzY3JvbGxlZCB0byBhIHNwZWNpZmljIGFwcFxuICB3aW5kb3cub3BlblVwZGF0ZU1vZGFsID0gZnVuY3Rpb24oYXBwSWQpIHtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRBdmFpbGFibGUoKS50aGVuKCgpID0+IHtcbiAgICAgIGlmICghYXBwSWQpIHJldHVybjtcbiAgICAgIC8vIFNjcm9sbCB0byBhbmQgaGlnaGxpZ2h0IHRoZSBtYXRjaGluZyByb3dcbiAgICAgIGNvbnN0IHJvdyA9IGF2YWlsYWJsZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHAtaWQ9XCIke2FwcElkfVwiXWApO1xuICAgICAgaWYgKHJvdykge1xuICAgICAgICByb3cuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICAgICAgcm93LnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSgyNDksMTE1LDIyLDAuMTUpJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHJvdy5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7IH0sIDMwMDApO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIExhenktbG9hZCB0YWJzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwidXBkYXRlcy1oaXN0b3J5XCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEhpc3RvcnkpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cInVwZGF0ZXMtYXV0b1wiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRBdXRvQ29uZmlnKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJ1cGRhdGVzLWRhc2hjYWRkeVwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBkY0xvYWRWZXJzaW9uKCk7XG4gICAgZGNMb2FkSGlzdG9yeSgpO1xuICAgIGlmICghZGNMYXN0Q2hlY2spIGRjQ2hlY2tGb3JVcGRhdGUodHJ1ZSk7XG4gIH0pO1xuXG4gIHdpbmRvdy5kY0FwcGx5VXBkYXRlID0gZGNBcHBseVVwZGF0ZTtcbiAgd2luZG93LmRjQ2hlY2tGb3JVcGRhdGUgPSBkY0NoZWNrRm9yVXBkYXRlO1xuXG4gIC8vIE5vbi1ibG9ja2luZyBjaGVjayBvbiBwYWdlIGxvYWQgXHUyMDE0IGp1c3QgYWRkcyBub3RpZmljYXRpb24gZG90IGlmIHVwZGF0ZSBhdmFpbGFibGVcbiAgc2V0VGltZW91dCgoKSA9PiBkY0NoZWNrRm9yVXBkYXRlKHRydWUpLCA1MDAwKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IERPQ0tFUiBSRVNPVVJDRVMgKFZvbHVtZXMsIE5ldHdvcmtzLCBEaXNrIFVzYWdlKSA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGluamVjdE1vZGFsKCdkb2NrZXItcmVzb3VyY2VzLW1vZGFsJywgYDxkaXYgaWQ9XCJkb2NrZXItcmVzb3VyY2VzLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA3NTBweDsgbWF4LXdpZHRoOiA5NTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDMzMgRG9ja2VyIFJlc291cmNlczwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+TWFuYWdlIHZvbHVtZXMsIG5ldHdvcmtzLCBhbmQgdmlldyBkaXNrIHVzYWdlLjwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXRhYnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYiBhY3RpdmVcIiBkYXRhLXBhbmVsPVwiZHItdm9sdW1lc1wiPlZvbHVtZXM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJkci1uZXR3b3Jrc1wiPk5ldHdvcmtzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiZHItZGlza1wiPkRpc2sgVXNhZ2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFZvbHVtZXMgLS0+XG4gICAgICA8ZGl2IGlkPVwiZHItdm9sdW1lc1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvbiBhY3RpdmVcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZHItdm9sLW5hbWVcIiBwbGFjZWhvbGRlcj1cIlZvbHVtZSBuYW1lXCIgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7XCIgLz5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZHItdm9sLWNyZWF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5DcmVhdGU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkci12b2wtbGlzdFwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogNDAwcHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTmV0d29ya3MgLS0+XG4gICAgICA8ZGl2IGlkPVwiZHItbmV0d29ya3NcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZHItbmV0LW5hbWVcIiBwbGFjZWhvbGRlcj1cIk5ldHdvcmsgbmFtZVwiIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogNnB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiIC8+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImRyLW5ldC1kcml2ZXJcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJicmlkZ2VcIj5icmlkZ2U8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJvdmVybGF5XCI+b3ZlcmxheTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImhvc3RcIj5ob3N0PC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImRyLW5ldC1jcmVhdGVcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODJyZW07XCI+Q3JlYXRlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZHItbmV0LWxpc3RcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDQwMHB4O1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIERpc2sgVXNhZ2UgLS0+XG4gICAgICA8ZGl2IGlkPVwiZHItZGlza1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiZHItZGlzay1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZHItY2xvc2VcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY2tlci1yZXNvdXJjZXMtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2NrZXItcmVzb3VyY2VzLWJ0bicpO1xuICBjb25zdCBjbG9zZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci1jbG9zZScpO1xuXG4gIGZ1bmN0aW9uIGZtdEJ5dGVzKGJ5dGVzKSB7XG4gICAgaWYgKCFieXRlcyB8fCBieXRlcyA9PT0gMCkgcmV0dXJuICcwIEInO1xuICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coTWF0aC5hYnMoYnl0ZXMpKSAvIE1hdGgubG9nKDEwMjQpKTtcbiAgICByZXR1cm4gKGJ5dGVzIC8gTWF0aC5wb3coMTAyNCwgaSkpLnRvRml4ZWQoMSkgKyAnICcgKyB1bml0c1tpXTtcbiAgfVxuXG4gIC8vID09PT09IFZPTFVNRVMgPT09PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFZvbHVtZXMoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLXZvbC1saXN0Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRKU09OKCcvYXBpL3YxL2RvY2tlci92b2x1bWVzJyk7XG4gICAgICBjb25zdCB2b2xzID0gZGF0YS52b2x1bWVzIHx8IFtdO1xuICAgICAgaWYgKHZvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0U2PC9zcGFuPk5vIHZvbHVtZXMgZm91bmQuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPk5hbWU8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj5Ecml2ZXI8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj5TY29wZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5BY3Rpb25zPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IHYgb2Ygdm9scykge1xuICAgICAgICBjb25zdCBpc1N5c3RlbSA9IHYubmFtZSA9PT0gJ2J1aWxka2l0JyB8fCB2Lm5hbWUubGVuZ3RoID09PSA2NDtcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LXdlaWdodDogNTAwOyBtYXgtd2lkdGg6IDMwMHB4OyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbCh2Lm5hbWUpfVwiPiR7ZXNjYXBlSHRtbCh2Lm5hbWUubGVuZ3RoID4gNDAgPyB2Lm5hbWUuc3Vic3RyaW5nKDAsIDM3KSArICcuLi4nIDogdi5uYW1lKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbCh2LmRyaXZlcil9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2VzY2FwZUh0bWwodi5zY29wZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPmA7XG4gICAgICAgIGlmICghaXNTeXN0ZW0pIHtcbiAgICAgICAgICBodG1sICs9IGA8YnV0dG9uIGNsYXNzPVwiZHItdm9sLWRlbFwiIGRhdGEtbmFtZT1cIiR7ZXNjYXBlSHRtbCh2Lm5hbWUpfVwiIHN0eWxlPVwicGFkZGluZzogM3B4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5EZWxldGU8L2J1dHRvbj5gO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gYDwvdGQ+PC90cj5gO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuZHItdm9sLWRlbCcpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlybShgRGVsZXRlIHZvbHVtZSBcIiR7YnRuLmRhdGFzZXQubmFtZX1cIj8gRGF0YSB3aWxsIGJlIGxvc3QuYCkpIHJldHVybjtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnLi4uJztcbiAgICAgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBkZWxldGVBUEkoYC9hcGkvdjEvZG9ja2VyL3ZvbHVtZXMvJHtlbmNvZGVVUklDb21wb25lbnQoYnRuLmRhdGFzZXQubmFtZSl9P2ZvcmNlPXRydWVgKTtcbiAgICAgICAgICAgIGxvYWRWb2x1bWVzKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignRGVsZXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnRGVsZXRlJztcbiAgICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci12b2wtY3JlYXRlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5hbWVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci12b2wtbmFtZScpO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lSW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGlmICghbmFtZSkgeyBzaG93Tm90aWZpY2F0aW9uKCdFbnRlciBhIHZvbHVtZSBuYW1lJywgJ3dhcm5pbmcnKTsgcmV0dXJuOyB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHBvc3RKU09OKCcvYXBpL3YxL2RvY2tlci92b2x1bWVzJywgeyBuYW1lIH0pO1xuICAgICAgbmFtZUlucHV0LnZhbHVlID0gJyc7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBWb2x1bWUgXCIke25hbWV9XCIgY3JlYXRlZGAsICdzdWNjZXNzJyk7XG4gICAgICBsb2FkVm9sdW1lcygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0NyZWF0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gPT09PT0gTkVUV09SS1MgPT09PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZE5ldHdvcmtzKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci1uZXQtbGlzdCcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0SlNPTignL2FwaS92MS9kb2NrZXIvbmV0d29ya3MnKTtcbiAgICAgIGNvbnN0IG5ldHMgPSBkYXRhLm5ldHdvcmtzIHx8IFtdO1xuICAgICAgaWYgKG5ldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNDXHVERjEwPC9zcGFuPk5vIG5ldHdvcmtzIGZvdW5kLjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODJyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5OYW1lPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+RHJpdmVyPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+U2NvcGU8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj5Db250YWluZXJzPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPkFjdGlvbnM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgbiBvZiBuZXRzKSB7XG4gICAgICAgIGNvbnN0IGlzU3lzdGVtID0gWydicmlkZ2UnLCAnaG9zdCcsICdub25lJ10uaW5jbHVkZXMobi5uYW1lKTtcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChuLm5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKG4uZHJpdmVyKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbChuLnNjb3BlKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPiR7bi5jb250YWluZXJzfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5gO1xuICAgICAgICBpZiAoIWlzU3lzdGVtKSB7XG4gICAgICAgICAgaHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cImRyLW5ldC1kZWxcIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKG4uaWQpfVwiIGRhdGEtbmFtZT1cIiR7ZXNjYXBlSHRtbChuLm5hbWUpfVwiIHN0eWxlPVwicGFkZGluZzogM3B4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5EZWxldGU8L2J1dHRvbj5gO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gYDwvdGQ+PC90cj5gO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuZHItbmV0LWRlbCcpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlybShgRGVsZXRlIG5ldHdvcmsgXCIke2J0bi5kYXRhc2V0Lm5hbWV9XCI/YCkpIHJldHVybjtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnLi4uJztcbiAgICAgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBkZWxldGVBUEkoYC9hcGkvdjEvZG9ja2VyL25ldHdvcmtzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGJ0bi5kYXRhc2V0LmlkKX1gKTtcbiAgICAgICAgICAgIGxvYWROZXR3b3JrcygpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0RlbGV0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ0RlbGV0ZSc7XG4gICAgICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItbmV0LWNyZWF0ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBuYW1lSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItbmV0LW5hbWUnKTtcbiAgICBjb25zdCBkcml2ZXJTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItbmV0LWRyaXZlcicpO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lSW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGlmICghbmFtZSkgeyBzaG93Tm90aWZpY2F0aW9uKCdFbnRlciBhIG5ldHdvcmsgbmFtZScsICd3YXJuaW5nJyk7IHJldHVybjsgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwb3N0SlNPTignL2FwaS92MS9kb2NrZXIvbmV0d29ya3MnLCB7IG5hbWUsIGRyaXZlcjogZHJpdmVyU2VsZWN0LnZhbHVlIH0pO1xuICAgICAgbmFtZUlucHV0LnZhbHVlID0gJyc7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBOZXR3b3JrIFwiJHtuYW1lfVwiIGNyZWF0ZWRgLCAnc3VjY2VzcycpO1xuICAgICAgbG9hZE5ldHdvcmtzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ3JlYXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyA9PT09PSBESVNLIFVTQUdFID09PT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWREaXNrVXNhZ2UoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLWRpc2stY29udGVudCcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0SlNPTignL2FwaS92MS9kb2NrZXIvZGlzay11c2FnZScpO1xuICAgICAgY29uc3Qgc2VjdGlvbnMgPSBbXG4gICAgICAgIHsgbGFiZWw6ICdJbWFnZXMnLCBpY29uOiAnXHVEODNEXHVEQ0MwJywgY291bnQ6IGRhdGEuaW1hZ2VzLmNvdW50LCBzaXplOiBkYXRhLmltYWdlcy5zaXplLCByZWNsYWltYWJsZTogZGF0YS5pbWFnZXMucmVjbGFpbWFibGUgfSxcbiAgICAgICAgeyBsYWJlbDogJ0NvbnRhaW5lcnMnLCBpY29uOiAnXHVEODNEXHVEQ0U2JywgY291bnQ6IGRhdGEuY29udGFpbmVycy5jb3VudCwgc2l6ZTogZGF0YS5jb250YWluZXJzLnNpemUsIGV4dHJhOiBgJHtkYXRhLmNvbnRhaW5lcnMucnVubmluZ30gcnVubmluZ2AgfSxcbiAgICAgICAgeyBsYWJlbDogJ1ZvbHVtZXMnLCBpY29uOiAnXHVEODNEXHVEQ0JFJywgY291bnQ6IGRhdGEudm9sdW1lcy5jb3VudCwgc2l6ZTogZGF0YS52b2x1bWVzLnNpemUsIHJlY2xhaW1hYmxlOiBkYXRhLnZvbHVtZXMucmVjbGFpbWFibGUgfSxcbiAgICAgICAgeyBsYWJlbDogJ0J1aWxkIENhY2hlJywgaWNvbjogJ1x1RDgzRFx1REQyNycsIGNvdW50OiBkYXRhLmJ1aWxkQ2FjaGUuY291bnQsIHNpemU6IGRhdGEuYnVpbGRDYWNoZS5zaXplLCByZWNsYWltYWJsZTogZGF0YS5idWlsZENhY2hlLnJlY2xhaW1hYmxlIH0sXG4gICAgICBdO1xuXG4gICAgICBsZXQgaHRtbCA9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxLjFyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDE2cHg7XCI+VG90YWw6ICR7Zm10Qnl0ZXMoZGF0YS50b3RhbFNpemUpfTwvZGl2PmA7XG4gICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDEycHg7XCI+JztcbiAgICAgIGZvciAoY29uc3QgcyBvZiBzZWN0aW9ucykge1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTRweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDZweDtcIj4ke3MuaWNvbn0gJHtzLmxhYmVsfSA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtd2VpZ2h0OiA0MDA7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4oJHtzLmNvdW50fSk8L3NwYW4+PC9kaXY+YDtcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtOyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tYWNjZW50KTtcIj4ke2ZtdEJ5dGVzKHMuc2l6ZSl9PC9kaXY+YDtcbiAgICAgICAgaWYgKHMucmVjbGFpbWFibGUgPiAwKSBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlJlY2xhaW1hYmxlOiAke2ZtdEJ5dGVzKHMucmVjbGFpbWFibGUpfTwvZGl2PmA7XG4gICAgICAgIGlmIChzLmV4dHJhKSBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7cy5leHRyYX08L2Rpdj5gO1xuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gTW9kYWwgZXZlbnRzXG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZFZvbHVtZXMoKTtcbiAgfSk7XG4gIHdpcmVNb2RhbChtb2RhbCwgY2xvc2VCdG4pO1xuXG4gIC8vIExhenktbG9hZCB0YWJzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiZHItbmV0d29ya3NcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkTmV0d29ya3MpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cImRyLWRpc2tcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkRGlza1VzYWdlKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IERPQ0tFUiBDT01QT1NFIElNUE9SVCA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGluamVjdE1vZGFsKCdjb21wb3NlLWltcG9ydC1tb2RhbCcsIGA8ZGl2IGlkPVwiY29tcG9zZS1pbXBvcnQtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDY1MHB4OyBtYXgtd2lkdGg6IDgwMHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1RENFNiBJbXBvcnQgRG9ja2VyIENvbXBvc2U8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlBhc3RlIGEgZG9ja2VyLWNvbXBvc2UueW1sIHRvIGltcG9ydCBhbmQgZGVwbG95IHNlcnZpY2VzLjwvcD5cblxuICAgICAgPCEtLSBTdGVwIDE6IFBhc3RlIFlBTUwgLS0+XG4gICAgICA8ZGl2IGlkPVwiY29tcG9zZS1zdGVwLXBhc3RlXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+U3RhY2sgTmFtZTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjb21wb3NlLXN0YWNrLW5hbWVcIiBwbGFjZWhvbGRlcj1cIm15LXN0YWNrXCIgdmFsdWU9XCJcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+ZG9ja2VyLWNvbXBvc2UueW1sPC9sYWJlbD5cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJjb21wb3NlLXlhbWxcIiByb3dzPVwiMTRcIiBwbGFjZWhvbGRlcj1cInZlcnNpb246ICczJyYjMTA7c2VydmljZXM6JiMxMDsgIHdlYjomIzEwOyAgICBpbWFnZTogbmdpbng6bGF0ZXN0JiMxMDsgICAgcG9ydHM6JiMxMDsgICAgICAtICc4MDgwOjgwJ1wiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC44MnJlbTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IHJlc2l6ZTogdmVydGljYWw7XCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogNnB4O1wiPlxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJjb21wb3NlLWZpbGUtdXBsb2FkXCIgYWNjZXB0PVwiLnltbCwueWFtbFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAvPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1wiPm9yIHVwbG9hZCBhIGZpbGU8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbXBvc2UtcGFyc2UtYnRuXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMjBweDtcIj5QYXJzZSAmIFByZXZpZXc8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY29tcG9zZS1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwIDI6IFByZXZpZXcgLS0+XG4gICAgICA8ZGl2IGlkPVwiY29tcG9zZS1zdGVwLXByZXZpZXdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJjb21wb3NlLXByZXZpZXctY29udGVudFwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbXBvc2UtZGVwbG95LWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogOHB4IDIwcHg7XCI+RGVwbG95IEFsbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjb21wb3NlLWJhY2stYnRuXCI+QmFjazwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgMzogUHJvZ3Jlc3MgLS0+XG4gICAgICA8ZGl2IGlkPVwiY29tcG9zZS1zdGVwLXByb2dyZXNzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8ZGl2IGlkPVwiY29tcG9zZS1wcm9ncmVzcy1jb250ZW50XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1pbXBvcnQtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWltcG9ydC1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtY2FuY2VsJyk7XG5cbiAgd2lyZU1vZGFsKG1vZGFsLCBjYW5jZWxCdG4pO1xuXG4gIGxldCBwYXJzZWREYXRhID0gbnVsbDtcblxuICBmdW5jdGlvbiBzaG93U3RlcChzdGVwKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2Utc3RlcC1wYXN0ZScpLnN0eWxlLmRpc3BsYXkgPSBzdGVwID09PSAncGFzdGUnID8gJycgOiAnbm9uZSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2Utc3RlcC1wcmV2aWV3Jykuc3R5bGUuZGlzcGxheSA9IHN0ZXAgPT09ICdwcmV2aWV3JyA/ICcnIDogJ25vbmUnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXN0ZXAtcHJvZ3Jlc3MnKS5zdHlsZS5kaXNwbGF5ID0gc3RlcCA9PT0gJ3Byb2dyZXNzJyA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgc2hvd1N0ZXAoJ3Bhc3RlJyk7XG4gICAgcGFyc2VkRGF0YSA9IG51bGw7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UteWFtbCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2Utc3RhY2stbmFtZScpLnZhbHVlID0gJyc7XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gRmlsZSB1cGxvYWRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtZmlsZS11cGxvYWQnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICBjb25zdCBmaWxlID0gZS50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKCFmaWxlKSByZXR1cm47XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4geyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS15YW1sJykudmFsdWUgPSByZWFkZXIucmVzdWx0OyB9O1xuICAgIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xuICB9KTtcblxuICAvLyBQYXJzZVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1wYXJzZS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFtbFN0ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXlhbWwnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3Qgc3RhY2tOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2Utc3RhY2stbmFtZScpLnZhbHVlLnRyaW0oKSB8fCAnc3RhY2snO1xuICAgIGlmICgheWFtbFN0cikgeyBzaG93Tm90aWZpY2F0aW9uKCdQYXN0ZSBhIGRvY2tlci1jb21wb3NlLnltbCcsICd3YXJuaW5nJyk7IHJldHVybjsgfVxuXG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtcGFyc2UtYnRuJyk7XG4gICAgY29uc3Qgb3JpZ1RleHQgPSBidG4udGV4dENvbnRlbnQ7XG4gICAgYnRuLnRleHRDb250ZW50ID0gJ1BhcnNpbmcuLi4nO1xuICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHBvc3RKU09OKCcvYXBpL3YxL2FwcHMvaW1wb3J0LWNvbXBvc2UnLCB7IHlhbWw6IHlhbWxTdHIsIHN0YWNrTmFtZSB9KTtcbiAgICAgIHBhcnNlZERhdGEgPSBkYXRhO1xuICAgICAgcGFyc2VkRGF0YS5zdGFja05hbWUgPSBzdGFja05hbWU7XG4gICAgICByZW5kZXJQcmV2aWV3KGRhdGEpO1xuICAgICAgc2hvd1N0ZXAoJ3ByZXZpZXcnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQYXJzZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSBvcmlnVGV4dDtcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gcmVuZGVyUHJldmlldyhkYXRhKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtcHJldmlldy1jb250ZW50Jyk7XG4gICAgbGV0IGh0bWwgPSAnJztcblxuICAgIGlmIChkYXRhLm5ldHdvcmtzICYmIGRhdGEubmV0d29ya3MubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7IGZvbnQtc2l6ZTogMC44MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5OZXR3b3JrczogJHtkYXRhLm5ldHdvcmtzLm1hcChuID0+IGA8Y29kZT4ke2VzY2FwZUh0bWwobil9PC9jb2RlPmApLmpvaW4oJywgJyl9PC9kaXY+YDtcbiAgICB9XG4gICAgaWYgKGRhdGEudm9sdW1lcyAmJiBkYXRhLnZvbHVtZXMubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7IGZvbnQtc2l6ZTogMC44MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Wb2x1bWVzOiAke2RhdGEudm9sdW1lcy5tYXAodiA9PiBgPGNvZGU+JHtlc2NhcGVIdG1sKHYpfTwvY29kZT5gKS5qb2luKCcsICcpfTwvZGl2PmA7XG4gICAgfVxuXG4gICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDhweDtcIj4ke2RhdGEuc2VydmljZXMubGVuZ3RofSBzZXJ2aWNlKHMpPC9kaXY+YDtcbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogMzUwcHg7XCI+JztcblxuICAgIGZvciAoY29uc3Qgc3ZjIG9mIGRhdGEuc2VydmljZXMpIHtcbiAgICAgIGNvbnN0IGJvcmRlckNvbG9yID0gc3ZjLnNraXAgPyAndmFyKC0tYmFkLWZnKScgOiAndmFyKC0tYm9yZGVyKSc7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxNHB4OyBib3JkZXI6IDFweCBzb2xpZCAke2JvcmRlckNvbG9yfTsgYm9yZGVyLXJhZGl1czogOHB4OyBtYXJnaW4tYm90dG9tOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTtcIj5gO1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC45cmVtO1wiPiR7ZXNjYXBlSHRtbChzdmMubmFtZSl9YDtcbiAgICAgIGlmIChzdmMuc2tpcCkgaHRtbCArPSBgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7IGZvbnQtd2VpZ2h0OiA0MDA7IGZvbnQtc2l6ZTogMC43OHJlbTtcIj5cdTIwMTQgc2tpcHBlZDogJHtlc2NhcGVIdG1sKHN2Yy5yZWFzb24pfTwvc3Bhbj5gO1xuICAgICAgaHRtbCArPSBgPC9kaXY+YDtcblxuICAgICAgaWYgKCFzdmMuc2tpcCkge1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj5JbWFnZTogPGNvZGU+JHtlc2NhcGVIdG1sKHN2Yy5pbWFnZSl9PC9jb2RlPjwvZGl2PmA7XG4gICAgICAgIGlmIChzdmMucG9ydHM/Lmxlbmd0aCkgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlBvcnRzOiAke3N2Yy5wb3J0cy5tYXAocCA9PiBgJHtwLmhvc3R9OiR7cC5jb250YWluZXJ9YCkuam9pbignLCAnKX08L2Rpdj5gO1xuICAgICAgICBpZiAoc3ZjLnZvbHVtZXM/Lmxlbmd0aCkgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlZvbHVtZXM6ICR7c3ZjLnZvbHVtZXMubGVuZ3RofTwvZGl2PmA7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzdmMuZW52aXJvbm1lbnQgfHwge30pLmxlbmd0aCkgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkVudiB2YXJzOiAke09iamVjdC5rZXlzKHN2Yy5lbnZpcm9ubWVudCkubGVuZ3RofTwvZGl2PmA7XG4gICAgICAgIGlmIChzdmMuZW52RmlsZVdhcm5pbmcpIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlx1MjZBMCAke2VzY2FwZUh0bWwoc3ZjLmVudkZpbGVXYXJuaW5nKX08L2Rpdj5gO1xuICAgICAgICBpZiAoc3ZjLnJlc291cmNlcz8uY3B1cyB8fCBzdmMucmVzb3VyY2VzPy5tZW1vcnkpIHtcbiAgICAgICAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgICAgICAgIGlmIChzdmMucmVzb3VyY2VzLmNwdXMpIHBhcnRzLnB1c2goYENQVTogJHtzdmMucmVzb3VyY2VzLmNwdXN9YCk7XG4gICAgICAgICAgaWYgKHN2Yy5yZXNvdXJjZXMubWVtb3J5KSBwYXJ0cy5wdXNoKGBNZW06ICR7c3ZjLnJlc291cmNlcy5tZW1vcnl9TUJgKTtcbiAgICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TGltaXRzOiAke3BhcnRzLmpvaW4oJywgJyl9PC9kaXY+YDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIH1cbiAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICB9XG5cbiAgLy8gQmFjayBidXR0b25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtYmFjay1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzaG93U3RlcCgncGFzdGUnKSk7XG5cbiAgLy8gRGVwbG95XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWRlcGxveS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFwYXJzZWREYXRhKSByZXR1cm47XG5cbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1kZXBsb3ktYnRuJyk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gJ0RlcGxveWluZy4uLic7XG4gICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBzaG93U3RlcCgncHJvZ3Jlc3MnKTtcblxuICAgIGNvbnN0IHByb2dyZXNzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1wcm9ncmVzcy1jb250ZW50Jyk7XG4gICAgcHJvZ3Jlc3NFbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBEZXBsb3lpbmcgc2VydmljZXMuLi48L2Rpdj4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBvc3RKU09OKCcvYXBpL3YxL2FwcHMvZGVwbG95LWNvbXBvc2UnLCB7XG4gICAgICAgIHNlcnZpY2VzOiBwYXJzZWREYXRhLnNlcnZpY2VzLFxuICAgICAgICBuZXR3b3JrczogcGFyc2VkRGF0YS5uZXR3b3JrcyxcbiAgICAgICAgc3RhY2tOYW1lOiBwYXJzZWREYXRhLnN0YWNrTmFtZVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBodG1sID0gYDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlN0YWNrIFwiJHtlc2NhcGVIdG1sKHJlc3VsdC5zdGFja05hbWUpfVwiIFx1MjAxNCBEZXBsb3ltZW50IENvbXBsZXRlPC9kaXY+YDtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAzNTBweDtcIj4nO1xuXG4gICAgICBmb3IgKGNvbnN0IHIgb2YgcmVzdWx0LnJlc3VsdHMpIHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHIuc3RhdHVzID09PSAnZGVwbG95ZWQnIHx8IHIuc3RhdHVzID09PSAnY3JlYXRlZCcgPyAnXHUyNzA1JyA6IHIuc3RhdHVzID09PSAnZXhpc3RzJyA/ICdcdTI2QTEnIDogci5zdGF0dXMgPT09ICdza2lwcGVkJyA/ICdcdTIzRUQnIDogJ1x1Mjc0Qyc7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTJweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5gO1xuICAgICAgICBodG1sICs9IGAke2ljb259IDxzdHJvbmc+JHtlc2NhcGVIdG1sKHIubmFtZSl9PC9zdHJvbmc+ICgke3IudHlwZX0pIFx1MjAxNCAke2VzY2FwZUh0bWwoci5zdGF0dXMpfWA7XG4gICAgICAgIGlmIChyLmVycm9yKSBodG1sICs9IGAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj4ke2VzY2FwZUh0bWwoci5lcnJvcil9PC9zcGFuPmA7XG4gICAgICAgIGlmIChyLnN1YmRvbWFpbikgaHRtbCArPSBgIFx1MjE5MiA8Y29kZT4ke2VzY2FwZUh0bWwoci5zdWJkb21haW4pfTwvY29kZT5gO1xuICAgICAgICBpZiAoci5yZWFzb24pIGh0bWwgKz0gYCA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+KCR7ZXNjYXBlSHRtbChyLnJlYXNvbil9KTwvc3Bhbj5gO1xuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj48YnV0dG9uIGlkPVwiY29tcG9zZS1kb25lLWJ0blwiPkRvbmU8L2J1dHRvbj48L2Rpdj4nO1xuXG4gICAgICBwcm9ncmVzc0VsLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1kb25lLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgbW9kYWw/LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubG9hZFNlcnZpY2VzID09PSAnZnVuY3Rpb24nKSB3aW5kb3cubG9hZFNlcnZpY2VzKCkudGhlbigoKSA9PiB7IGlmICh0eXBlb2Ygd2luZG93LmJ1aWxkR3JpZCA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LmJ1aWxkR3JpZCgpOyB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBTdGFjayBcIiR7cmVzdWx0LnN0YWNrTmFtZX1cIiBkZXBsb3llZGAsICdzdWNjZXNzJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcHJvZ3Jlc3NFbC5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5EZXBsb3ltZW50IGZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj48YnV0dG9uIGlkPVwiY29tcG9zZS1yZXRyeS1idG5cIj5CYWNrPC9idXR0b24+PC9kaXY+YDtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXJldHJ5LWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNob3dTdGVwKCdwYXN0ZScpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ0RlcGxveSBBbGwnO1xuICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9KTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENPTlRBSU5FUiBFWEVDIC8gU0hFTEwgKFdlYlNvY2tldCArIHh0ZXJtLmpzKSA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGluamVjdE1vZGFsKCdleGVjLW1vZGFsJywgYDxkaXYgaWQ9XCJleGVjLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA3MDBweDsgbWF4LXdpZHRoOiA5MDBweDsgcGFkZGluZy1ib3R0b206IDA7XCI+XG4gICAgICA8aDMgaWQ9XCJleGVjLXRpdGxlXCI+VGVybWluYWw8L2gzPlxuICAgICAgPGRpdiBpZD1cImV4ZWMtdGVybWluYWxcIiBzdHlsZT1cImhlaWdodDogNDIwcHg7IGJvcmRlci1yYWRpdXM6IDZweDsgb3ZlcmZsb3c6IGhpZGRlbjsgYmFja2dyb3VuZDogIzFlMWUxZTtcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4OyBwYWRkaW5nLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImV4ZWMtY2xvc2VcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4ZWMtbW9kYWwnKTtcbiAgY29uc3QgdGVybUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4ZWMtdGVybWluYWwnKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhlYy1jbG9zZScpO1xuXG4gIGxldCB0ZXJtID0gbnVsbDtcbiAgbGV0IHdzID0gbnVsbDtcbiAgbGV0IGZpdEFkZG9uID0gbnVsbDtcblxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGlmICh3cykgeyB0cnkgeyB3cy5jbG9zZSgpOyB9IGNhdGNoIChfKSB7fSB3cyA9IG51bGw7IH1cbiAgICBpZiAodGVybSkgeyB0cnkgeyB0ZXJtLmRpc3Bvc2UoKTsgfSBjYXRjaCAoXykge30gdGVybSA9IG51bGw7IH1cbiAgICBmaXRBZGRvbiA9IG51bGw7XG4gICAgdGVybUVsLmlubmVySFRNTCA9ICcnO1xuICB9XG5cbiAgZnVuY3Rpb24gb3BlbkV4ZWMoY29udGFpbmVySWQsIGNvbnRhaW5lck5hbWUpIHtcbiAgICBjbGVhbnVwKCk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhlYy10aXRsZScpLnRleHRDb250ZW50ID0gYFRlcm1pbmFsIFx1MjAxNCAke2NvbnRhaW5lck5hbWUgfHwgY29udGFpbmVySWR9YDtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuXG4gICAgLy8gRW5zdXJlIHh0ZXJtIGlzIGF2YWlsYWJsZVxuICAgIGlmICh0eXBlb2YgVGVybWluYWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0ZXJtRWwuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJjb2xvcjogI2Y0NDsgcGFkZGluZzogMjBweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj54dGVybS5qcyBub3QgbG9hZGVkPC9kaXY+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0ZXJtID0gbmV3IFRlcm1pbmFsKHtcbiAgICAgIGN1cnNvckJsaW5rOiB0cnVlLFxuICAgICAgZm9udFNpemU6IDE0LFxuICAgICAgZm9udEZhbWlseTogXCInQ2FzY2FkaWEgQ29kZScsICdGaXJhIENvZGUnLCAnQ29uc29sYXMnLCBtb25vc3BhY2VcIixcbiAgICAgIHRoZW1lOiB7XG4gICAgICAgIGJhY2tncm91bmQ6ICcjMWUxZTFlJyxcbiAgICAgICAgZm9yZWdyb3VuZDogJyNkNGQ0ZDQnLFxuICAgICAgICBjdXJzb3I6ICcjYWVhZmFkJyxcbiAgICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZDogJyMyNjRmNzgnLFxuICAgICAgfSxcbiAgICAgIHNjcm9sbGJhY2s6IDUwMDAsXG4gICAgfSk7XG5cbiAgICAvLyBGaXQgYWRkb25cbiAgICBpZiAodHlwZW9mIEZpdEFkZG9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZml0QWRkb24gPSBuZXcgRml0QWRkb24uRml0QWRkb24oKTtcbiAgICAgIHRlcm0ubG9hZEFkZG9uKGZpdEFkZG9uKTtcbiAgICB9XG5cbiAgICB0ZXJtLm9wZW4odGVybUVsKTtcbiAgICBpZiAoZml0QWRkb24pIHtcbiAgICAgIC8vIFNtYWxsIGRlbGF5IGZvciBET00gdG8gc2V0dGxlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGZpdEFkZG9uLmZpdCgpLCA1MCk7XG4gICAgfVxuXG4gICAgLy8gQ29ubmVjdCBXZWJTb2NrZXRcbiAgICBjb25zdCBwcm90b2NvbCA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3M6JyA6ICd3czonO1xuICAgIHdzID0gbmV3IFdlYlNvY2tldChgJHtwcm90b2NvbH0vLyR7bG9jYXRpb24uaG9zdH0vd3MvZXhlYy8ke2VuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJJZCl9YCk7XG4gICAgd3MuYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7XG5cbiAgICB3cy5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICB0ZXJtLndyaXRlbG4oJ1xceDFiWzMybUNvbm5lY3RpbmcuLi5cXHgxYlswbScpO1xuICAgICAgLy8gU2VuZCBpbml0aWFsIHJlc2l6ZVxuICAgICAgaWYgKGZpdEFkZG9uKSB7XG4gICAgICAgIGNvbnN0IGRpbXMgPSBmaXRBZGRvbi5wcm9wb3NlRGltZW5zaW9ucygpO1xuICAgICAgICBpZiAoZGltcykge1xuICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAncmVzaXplJywgY29sczogZGltcy5jb2xzLCByb3dzOiBkaW1zLnJvd3MgfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdzLm9ubWVzc2FnZSA9IChlKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGUuZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgICAgaWYgKG1zZy50eXBlID09PSAnY29ubmVjdGVkJykge1xuICAgICAgICAgICAgdGVybS53cml0ZWxuKGBcXHgxYlszMm1Db25uZWN0ZWQgKCR7bXNnLnNoZWxsfSlcXHgxYlswbVxcclxcbmApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobXNnLnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHRlcm0ud3JpdGVsbihgXFx4MWJbMzFtRXJyb3I6ICR7bXNnLm1lc3NhZ2V9XFx4MWJbMG1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1zZy50eXBlID09PSAnZXhpdCcpIHtcbiAgICAgICAgICAgIHRlcm0ud3JpdGVsbignXFxyXFxuXFx4MWJbMzNtU2Vzc2lvbiBlbmRlZC5cXHgxYlswbScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgLy8gUGxhaW4gdGV4dFxuICAgICAgICB0ZXJtLndyaXRlKGUuZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCaW5hcnkgZGF0YVxuICAgICAgICB0ZXJtLndyaXRlKG5ldyBVaW50OEFycmF5KGUuZGF0YSkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3cy5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgaWYgKHRlcm0pIHRlcm0ud3JpdGVsbignXFxyXFxuXFx4MWJbMzNtRGlzY29ubmVjdGVkLlxceDFiWzBtJyk7XG4gICAgfTtcblxuICAgIHdzLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICBpZiAodGVybSkgdGVybS53cml0ZWxuKCdcXHJcXG5cXHgxYlszMW1Db25uZWN0aW9uIGVycm9yLlxceDFiWzBtJyk7XG4gICAgfTtcblxuICAgIC8vIFRlcm1pbmFsIGlucHV0IFx1MjE5MiBXZWJTb2NrZXRcbiAgICB0ZXJtLm9uRGF0YSgoZGF0YSkgPT4ge1xuICAgICAgaWYgKHdzICYmIHdzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgIHdzLnNlbmQoZGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgcmVzaXplXG4gICAgdGVybS5vblJlc2l6ZSgoeyBjb2xzLCByb3dzIH0pID0+IHtcbiAgICAgIGlmICh3cyAmJiB3cy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3Jlc2l6ZScsIGNvbHMsIHJvd3MgfSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gUmUtZml0IG9uIHdpbmRvdyByZXNpemVcbiAgICBjb25zdCByZXNpemVIYW5kbGVyID0gKCkgPT4geyBpZiAoZml0QWRkb24pIGZpdEFkZG9uLmZpdCgpOyB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNpemVIYW5kbGVyKTtcblxuICAgIC8vIFN0b3JlIGhhbmRsZXIgZm9yIGNsZWFudXBcbiAgICBtb2RhbC5fcmVzaXplSGFuZGxlciA9IHJlc2l6ZUhhbmRsZXI7XG4gIH1cblxuICBjbG9zZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY2xlYW51cCgpO1xuICAgIGlmIChtb2RhbC5fcmVzaXplSGFuZGxlcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG1vZGFsLl9yZXNpemVIYW5kbGVyKTtcbiAgICB9XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gQWxzbyBjbG9zZSBvbiBiYWNrZHJvcCBjbGlja1xuICBtb2RhbD8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIGlmIChtb2RhbC5fcmVzaXplSGFuZGxlcikge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgbW9kYWwuX3Jlc2l6ZUhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgbW9kYWw/LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEV4cG9ydFxuICB3aW5kb3cub3BlbkV4ZWNNb2RhbCA9IG9wZW5FeGVjO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gQVVESVQgTE9HIFZJRVdFUiA9PT09PT09PT09XG4vLyBEQy0wNTA6IHN1cmZhY2UgYXV0aGVudGljYXRlZCB1c2VyIGlkZW50aXR5ICh1c2VyRW1haWwgLyB1c2VyUm9sZSBmcm9tXG4vLyBhdWRpdExvZ2dlci5kZXRhaWxzKSwgYWRkIG91dGNvbWUgZmlsdGVyLCBwYXNzIGNvbmZpcm09Q0xFQVIgYm9keSBmb3Jcbi8vIGRlc3RydWN0aXZlIERFTEVURS5cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2F1ZGl0LW1vZGFsJywgYDxkaXYgaWQ9XCJhdWRpdC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogOTUwcHg7IG1heC13aWR0aDogMTE1MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1RENEQyBBdWRpdCBMb2c8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlxuICAgICAgICBUcmFjayBhbGwgYWN0aW9ucyBwZXJmb3JtZWQgdGhyb3VnaCB0aGUgQVBJLlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBmbGV4LXdyYXA6IHdyYXA7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5DYXRlZ29yeTo8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwiYXVkaXQtZmlsdGVyXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNlcnZpY2VcIj5TZXJ2aWNlczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjb250YWluZXJcIj5Db250YWluZXJzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNhZGR5XCI+Q2FkZHk8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZG5zXCI+RE5TPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJhY2t1cFwiPkJhY2t1cHM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY29uZmlnXCI+Q29uZmlnPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImF1dGhcIj5BdXRoPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+UmVzdWx0OjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJhdWRpdC1vdXRjb21lLWZpbHRlclwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFueTwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzdWNjZXNzXCI+XHUyNzEzIFN1Y2Nlc3M8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZmFpbHVyZVwiPlx1MjcxNyBGYWlsdXJlPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogOHB4O1wiPlNpbmNlOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImF1ZGl0LXNpbmNlXCIgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+VW50aWw6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiYXVkaXQtdW50aWxcIiB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBzdHlsZT1cInBhZGRpbmc6IDVweCA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODJyZW07XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhdWRpdC1yZWZyZXNoLWJ0blwiIGNsYXNzPVwiYnRuLXNtXCI+XHVEODNEXHVERDA0IFJlZnJlc2g8L2J1dHRvbj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OiAxO1wiPjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImF1ZGl0LWNsZWFyLWJ0blwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEycHg7IGZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tYmFkLWZnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlx1RDgzRFx1REREMVx1RkUwRiBDbGVhciBMb2c8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwiYXVkaXQtbG9nLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgYXVkaXQgbG9nLi4uPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImF1ZGl0LWxvYWQtbW9yZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogNnB4IDE2cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPkxvYWQgTW9yZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXVkaXQtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LWxvZy1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LWNhbmNlbCcpO1xuICBjb25zdCByZWZyZXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LXJlZnJlc2gtYnRuJyk7XG4gIGNvbnN0IGNsZWFyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LWNsZWFyLWJ0bicpO1xuICBjb25zdCBmaWx0ZXJTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtZmlsdGVyJyk7XG4gIGNvbnN0IG91dGNvbWVTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtb3V0Y29tZS1maWx0ZXInKTtcbiAgY29uc3Qgc2luY2VJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1zaW5jZScpO1xuICBjb25zdCB1bnRpbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LXVudGlsJyk7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1sb2ctY29udGFpbmVyJyk7XG4gIGNvbnN0IGxvYWRNb3JlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LWxvYWQtbW9yZScpO1xuICBsZXQgY3VycmVudE9mZnNldCA9IDA7XG4gIGxldCBpbmZsaWdodCA9IG51bGw7IC8vIEFib3J0Q29udHJvbGxlciBmb3IgdGhlIGluLWZsaWdodCByZXF1ZXN0XG4gIGxldCBmaWx0ZXJOb25jZSA9IDA7IC8vIGluY3JlbWVudHMgb24gZXZlcnkgZnJlc2ggKG5vbi1hcHBlbmQpIGxvYWQ7IGxldHNcbiAgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gaW4tZmxpZ2h0IGFwcGVuZCBkZXRlY3QgdGhlIGZpbHRlciBoYXMgY2hhbmdlZFxuICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgc2tpcCBpdHMgRE9NIHNwbGljZS5cbiAgY29uc3QgUEFHRV9TSVpFID0gNTA7XG5cbiAgLy8gZGF0ZXRpbWUtbG9jYWwgZmllbGRzIGNhcnJ5IG5vIHRpbWV6b25lIG9mZnNldCBcdTIwMTQgY29udmVydCB0byBJU08gODYwMVxuICAvLyB3aXRoIHRoZSBsb2NhbCBvZmZzZXQgc28gdGhlIHNlcnZlciBjYW4gY29tcGFyZSBjb3JyZWN0bHkuXG4gIGZ1bmN0aW9uIHRvSXNvKGxvY2FsRHRWYWx1ZSkge1xuICAgIGlmICghbG9jYWxEdFZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICAvLyBCcm93c2VycyBleHBvc2UgZGF0ZXRpbWUtbG9jYWwgYXMgbmFpdmUgbG9jYWwgdGltZS4gbmV3IERhdGUoKSBvblxuICAgIC8vIHRoYXQgc3RyaW5nIHBhcnNlcyBpdCBhcyBMT0NBTCwgc28gdG9JU09TdHJpbmcoKSB5aWVsZHMgdGhlIFVUQ1xuICAgIC8vIGVxdWl2YWxlbnQgdGhlIHNlcnZlciBleHBlY3RzLlxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShsb2NhbER0VmFsdWUpO1xuICAgIGlmIChpc05hTihkLmdldFRpbWUoKSkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkQXVkaXQoYXBwZW5kKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIC8vIENhbmNlbCBhbnkgcGVuZGluZyByZXF1ZXN0IGFuZCBidW1wIHRoZSBmaWx0ZXIgbm9uY2Ugc28gYW55XG4gICAgICAgIC8vIGFwcGVuZGluZyBmZXRjaCAoc3RpbGwgaW4gZmxpZ2h0KSBrbm93cyB0byBkaXNjYXJkIGl0cyByZXNwb25zZS5cbiAgICAgICAgaWYgKGluZmxpZ2h0KSBpbmZsaWdodC5hYm9ydCgpO1xuICAgICAgICBpbmZsaWdodCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgY3VycmVudE9mZnNldCA9IDA7XG4gICAgICAgIGZpbHRlck5vbmNlKys7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpbmZsaWdodCkgaW5mbGlnaHQuYWJvcnQoKTtcbiAgICAgICAgaW5mbGlnaHQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBteU5vbmNlID0gZmlsdGVyTm9uY2U7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICBwYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhQQUdFX1NJWkUpKTtcbiAgICAgIHBhcmFtcy5zZXQoJ29mZnNldCcsIFN0cmluZyhjdXJyZW50T2Zmc2V0KSk7XG4gICAgICBjb25zdCBhY3Rpb24gPSBmaWx0ZXJTZWxlY3QudmFsdWU7XG4gICAgICBjb25zdCBvdXRjb21lID0gb3V0Y29tZVNlbGVjdC52YWx1ZTtcbiAgICAgIGNvbnN0IHNpbmNlID0gdG9Jc28oc2luY2VJbnB1dC52YWx1ZSk7XG4gICAgICBjb25zdCB1bnRpbCA9IHRvSXNvKHVudGlsSW5wdXQudmFsdWUpO1xuICAgICAgaWYgKGFjdGlvbikgcGFyYW1zLnNldCgnYWN0aW9uJywgYWN0aW9uKTtcbiAgICAgIGlmIChvdXRjb21lKSBwYXJhbXMuc2V0KCdvdXRjb21lJywgb3V0Y29tZSk7XG4gICAgICBpZiAoc2luY2UpIHBhcmFtcy5zZXQoJ3NpbmNlJywgc2luY2UpO1xuICAgICAgaWYgKHVudGlsKSBwYXJhbXMuc2V0KCd1bnRpbCcsIHVudGlsKTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYXVkaXQtbG9ncz8nICsgcGFyYW1zLnRvU3RyaW5nKCksIHtcbiAgICAgICAgc2lnbmFsOiBpbmZsaWdodC5zaWduYWwsXG4gICAgICB9KTtcbiAgICAgIC8vIFN1cmZhY2UgNDAxLzQwMy81MDAgZXhwbGljaXRseSBcdTIwMTQgdGhlIGRhc2hib2FyZCB1c2VkIHRvIHJlbmRlciBhbnlcbiAgICAgIC8vIG5vbi1zdWNjZXNzIHJlc3BvbnNlIGFzIFwibm8gYXVkaXQgbG9nIGVudHJpZXMgeWV0LFwiIHdoaWNoIGlzXG4gICAgICAvLyBtaXNsZWFkaW5nIGZvciBhbiBleHBpcmVkIHNlc3Npb24uXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiBIVFRQICR7cmVzLnN0YXR1c308L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChkYXRhLmVycm9yIHx8ICd1bmtub3duJyl9PC9kaXY+YDtcbiAgICAgICAgbG9hZE1vcmVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gSWYgYSBub24tYXBwZW5kIGxvYWQgaGFwcGVuZWQgYWZ0ZXIgdGhpcyBmZXRjaCB3YXMgaXNzdWVkLCB0aGVcbiAgICAgIC8vIG9wZXJhdG9yIGNoYW5nZWQgZmlsdGVyczsgZGlzY2FyZCB0aGUgbm93LXN0YWxlIHJlc3BvbnNlLlxuICAgICAgaWYgKCFhcHBlbmQgJiYgbXlOb25jZSAhPT0gZmlsdGVyTm9uY2UpIHJldHVybjtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5pc0FycmF5KGRhdGEuZW50cmllcykgPyBkYXRhLmVudHJpZXMgOiBbXTtcblxuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwICYmICFhcHBlbmQpIHtcbiAgICAgICAgY29uc3QgcmVhc29uID0gZGF0YS5maWx0ZXJzICYmIChkYXRhLmZpbHRlcnMuYWN0aW9uIHx8IGRhdGEuZmlsdGVycy5vdXRjb21lIHx8IGRhdGEuZmlsdGVycy5zaW5jZSB8fCBkYXRhLmZpbHRlcnMudW50aWwpXG4gICAgICAgICAgPyAnTm8gZW50cmllcyBtYXRjaCB5b3VyIGZpbHRlcnMuJ1xuICAgICAgICAgIDogJ05vIGF1ZGl0IGxvZyBlbnRyaWVzIHlldC4gQWN0aW9ucyB3aWxsIGJlIGxvZ2dlZCBhdXRvbWF0aWNhbGx5Lic7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0RDPC9zcGFuPiR7ZXNjYXBlSHRtbChyZWFzb24pfTwvZGl2PmA7XG4gICAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+V2hlbjwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkFjdG9yPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+SVA8L3RoPic7XG4gICAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5BY3Rpb248L3RoPic7XG4gICAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5SZXNvdXJjZTwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlJlc3VsdDwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBvayA9IGUub3V0Y29tZSA9PT0gJ3N1Y2Nlc3MnO1xuICAgICAgICBjb25zdCBhY3RvciA9IGFjdG9yTGFiZWwoZSk7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjdXJzb3I6IHBvaW50ZXI7XCIgY2xhc3M9XCJhdWRpdC1yb3dcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwoZS50aW1lc3RhbXAgfHwgJycpfVwiPiR7dGltZUFnbyhlLnRpbWVzdGFtcCl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtc2l6ZTogMC43OHJlbTtcIj4ke2FjdG9yfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuNzhyZW07XCI+JHtlc2NhcGVIdG1sKGUuaXAgfHwgJy0nKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwoZS5hY3Rpb24gfHwgJy0nKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj4ke2VzY2FwZUh0bWwoZS5yZXNvdXJjZSB8fCAnLScpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPjxzcGFuIHN0eWxlPVwiY29sb3I6ICR7b2sgPyAndmFyKC0tb2stZmcpJyA6ICd2YXIoLS1iYWQtZmcpJ307XCI+JHtvayA/ICdcdTI3MTMnIDogJ1x1MjcxNyd9ICR7ZXNjYXBlSHRtbChlLm91dGNvbWUgfHwgJycpfTwvc3Bhbj48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgICAgaWYgKGUuZGV0YWlscyAmJiBPYmplY3Qua2V5cyhlLmRldGFpbHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBodG1sICs9IGA8dHIgY2xhc3M9XCJhdWRpdC1kZXRhaWxcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PHRkIGNvbHNwYW49XCI2XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggNnB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48cHJlIHN0eWxlPVwibWFyZ2luOiAwOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XCI+JHtlc2NhcGVIdG1sKEpTT04uc3RyaW5naWZ5KGUuZGV0YWlscywgbnVsbCwgMikpfTwvcHJlPjwvdGQ+PC90cj5gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0YWJsZSA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCd0YWJsZScpO1xuICAgICAgICBpZiAodGFibGUpIHRhYmxlLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRPZmZzZXQgKz0gZW50cmllcy5sZW5ndGg7XG4gICAgICAvLyBoYXNNb3JlIGlzIHJlcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIgKHBvc3QtZmlsdGVyIHRvdGFsKSwgc28gdGhlXG4gICAgICAvLyBMb2FkIE1vcmUgYnV0dG9uIHN0YXlzIGFjY3VyYXRlIHdoZW4gZmlsdGVycyBjaGFuZ2UgbWlkLXNjcm9sbC5cbiAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSBkYXRhLmhhc01vcmUgPyAnJyA6ICdub25lJztcblxuICAgICAgLy8gVG9nZ2xlIGRldGFpbCByb3dzIG9uIGNsaWNrXG4gICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmF1ZGl0LXJvdycpLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgaWYgKHJvdy5kYXRhc2V0LndpcmVkKSByZXR1cm47XG4gICAgICAgIHJvdy5kYXRhc2V0LndpcmVkID0gJ3RydWUnO1xuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGV0YWlsID0gcm93Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICBpZiAoZGV0YWlsICYmIGRldGFpbC5jbGFzc0xpc3QuY29udGFpbnMoJ2F1ZGl0LWRldGFpbCcpKSB7XG4gICAgICAgICAgICBkZXRhaWwuc3R5bGUuZGlzcGxheSA9IGRldGFpbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6ICdub25lJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gQWJvcnRFcnJvciBpcyBleHBlY3RlZCB3aGVuIHdlIGRlbGliZXJhdGVseSBjYW5jZWwgYW4gaW4tZmxpZ2h0XG4gICAgICAvLyByZXF1ZXN0IChlLmcuIHRoZSBvcGVyYXRvciBjaGFuZ2VkIGZpbHRlcnMgbWlkLWZldGNoKSBcdTIwMTQgZG9uJ3RcbiAgICAgIC8vIGZsYXNoIGEgXCJGYWlsZWQ6IFRoZSB1c2VyIGFib3J0ZWQgYSByZXF1ZXN0XCIgbWVzc2FnZSBvdmVyIHRoZVxuICAgICAgLy8gbG9hZGluZyBzcGlubmVyLiBUaGUgbmV3IGZldGNoIGhhcyBhbHJlYWR5IGtpY2tlZCBvZmYuXG4gICAgICBpZiAoZSAmJiBlLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuO1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICAvLyBSZW5kZXIgdGhlIGh1bWFuLXJlYWRhYmxlIGFjdG9yOiBwcmVmZXIgdXNlckVtYWlsLCBmYWxsIGJhY2sgdG9cbiAgLy8gdXNlcklkLCBmYWxsIGJhY2sgdG8gYmFyZSBJUC4gSWYgbm8gdXNlciBhdHRyaWJ1dGlvbiwgbWFyayBhc1xuICAvLyBcInN5c3RlbVwiIHNvIHRoZSBvcGVyYXRvciBrbm93cyB0aGUgZW50cnkgY2FtZSBmcm9tIGFuIHVuYXV0aGVudGljYXRlZFxuICAvLyBvciBzZXJ2aWNlIHBhdGggKGUuZy4gY3Jvbi1kcml2ZW4gYmFja3VwcykuXG4gIGZ1bmN0aW9uIGFjdG9yTGFiZWwoZW50cnkpIHtcbiAgICBjb25zdCBkID0gZW50cnkuZGV0YWlscyB8fCB7fTtcbiAgICBjb25zdCBlbWFpbCA9IGQudXNlckVtYWlsO1xuICAgIGNvbnN0IGlkID0gZC51c2VySWQ7XG4gICAgY29uc3Qgcm9sZSA9IGQudXNlclJvbGU7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBkLnZpYVByb3ZpZGVyO1xuICAgIGlmIChlbWFpbCkge1xuICAgICAgY29uc3QgdGFnID0gcm9sZSA/IGAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuNzJyZW07XCI+WyR7ZXNjYXBlSHRtbChyb2xlKX0ke3Byb3ZpZGVyID8gJy8nICsgZXNjYXBlSHRtbChwcm92aWRlcikgOiAnJ31dPC9zcGFuPmAgOiAnJztcbiAgICAgIHJldHVybiBgJHtlc2NhcGVIdG1sKGVtYWlsKX0ke3RhZ31gO1xuICAgIH1cbiAgICBpZiAoaWQpIHJldHVybiBgPHNwYW4gc3R5bGU9XCJmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbChpZCl9PC9zcGFuPmA7XG4gICAgaWYgKCFlbnRyeS5pcCkgcmV0dXJuICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+c3lzdGVtPC9zcGFuPic7XG4gICAgcmV0dXJuICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+YW5vbjwvc3Bhbj4nO1xuICB9XG5cbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkQXVkaXQoZmFsc2UpO1xuICB9KTtcbiAgd2lyZU1vZGFsKG1vZGFsLCBjYW5jZWxCdG4pO1xuICByZWZyZXNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGxvYWRBdWRpdChmYWxzZSkpO1xuICBmaWx0ZXJTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IGxvYWRBdWRpdChmYWxzZSkpO1xuICBvdXRjb21lU2VsZWN0Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiBsb2FkQXVkaXQoZmFsc2UpKTtcbiAgLy8gUmUtZmV0Y2ggb24gZGF0ZSBjaGFuZ2Ugb25seSB3aGVuIGJvdGggZmllbGRzIGhhdmUgYSB2YWx1ZSBvciBib3RoIGFyZVxuICAvLyBlbXB0eSBcdTIwMTQgdHlwaW5nIG9uZSBjaGFyYWN0ZXIgc2hvdWxkbid0IHRyaWdnZXIgYSBmZXRjaCBmb3IgZXZlcnkga2V5c3Ryb2tlLlxuICBsZXQgZGF0ZURlYm91bmNlO1xuICBbc2luY2VJbnB1dCwgdW50aWxJbnB1dF0uZm9yRWFjaCgoZWwpID0+IHtcbiAgICBlbD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KGRhdGVEZWJvdW5jZSk7XG4gICAgICBkYXRlRGVib3VuY2UgPSBzZXRUaW1lb3V0KCgpID0+IGxvYWRBdWRpdChmYWxzZSksIDI1MCk7XG4gICAgfSk7XG4gIH0pO1xuICBsb2FkTW9yZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBsb2FkQXVkaXQodHJ1ZSkpO1xuXG4gIGNsZWFyQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpcm0oJ0NsZWFyIHRoZSBlbnRpcmUgYXVkaXQgbG9nPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJykpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXVkaXQtbG9ncycsIHtcbiAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY29uZmlybTogJ0NMRUFSJyB9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSBsb2FkQXVkaXQoZmFsc2UpO1xuICAgICAgZWxzZSBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIChkYXRhLmVycm9yIHx8ICdDbGVhciBmYWlsZWQnKSwgJ2Vycm9yJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG59KSgpOztcbi8vID09PT09PT09PT0gU0VDVVJJVFkgQ0VOVEVSID09PT09PT09PT1cbi8vIE11bHRpLXNvdXJjZSBzZWN1cml0eSBldmVudCB2aWV3ZXIgKyBob3N0IHJlZ2lzdHJ5IFVJLlxuLy9cbi8vIFNob3dzIGxpdmUgZXZlbnRzIGZyb20gYW55IHNvdXJjZSAoQVBJIGF1ZGl0LCBDYWRkeSBhY2Nlc3MgbG9nLCBmYWlsMmJhbixcbi8vIHNoYXJlZF9iYW5zKSBvbiBhbnkgcmVnaXN0ZXJlZCBob3N0ICh0aGlzIERhc2hDYWRkeSwgZnV0dXJlIHJlbW90ZSBhZ2VudHMpLlxuLy9cbi8vIExpdmUtdGFpbCB1c2VzIFNTRSAoL2FwaS92MS9zZWN1cml0eS9ldmVudHMvc3RyZWFtKS5cbihmdW5jdGlvbigpIHtcbiAgaW5qZWN0TW9kYWwoJ3NlY3VyaXR5LW1vZGFsJywgYDxkaXYgaWQ9XCJzZWN1cml0eS1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogOTgwcHg7IG1heC13aWR0aDogMTI4MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1REVFMVx1RkUwRiBTZWN1cml0eSBDZW50ZXI8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlxuICAgICAgICBMaXZlIGV2ZW50cyBmcm9tIEFQSSwgQ2FkZHksIGZhaWwyYmFuICYgc2hhcmVkX2JhbnMuIExpdmUtdGFpbCB2aWEgU1NFLlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwic2VjLXRhYnNcIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O21hcmdpbi1ib3R0b206MTRweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VjLXRhYiBhY3RpdmVcIiBkYXRhLXRhYj1cIm92ZXJ2aWV3XCI+T3ZlcnZpZXc8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlYy10YWJcIiBkYXRhLXRhYj1cImV2ZW50c1wiPkV2ZW50czwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VjLXRhYlwiIGRhdGEtdGFiPVwiaG9zdHNcIj5Ib3N0czwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gT1ZFUlZJRVcgVEFCIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNlYy1wYW5lbFwiIGRhdGEtcGFuZWw9XCJvdmVydmlld1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VjLXN0YXRzXCIgaWQ9XCJzZWMtc3RhdHNcIiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KGF1dG8tZml0LG1pbm1heCgxODBweCwxZnIpKTtnYXA6MTJweDttYXJnaW4tYm90dG9tOjE4cHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlYy1zdGF0XCIgZGF0YS1rZXk9XCJ0b3RhbFwiPlx1MjAxNCBldmVudHM8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjLXN0YXRcIiBkYXRhLWtleT1cIndhcm5cIj5cdTIwMTQgd2FybmluZ3M8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjLXN0YXRcIiBkYXRhLWtleT1cImVycm9yXCI+XHUyMDE0IGVycm9yczwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdFwiIGRhdGEta2V5PVwiZGVuaWVkXCI+XHUyMDE0IGRlbmllZDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdFwiIGRhdGEta2V5PVwiaG9zdHNcIj5cdTIwMTQgaG9zdHM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjE0cHg7XCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjo4cHggMCA2cHg7XCI+VG9wIEFjdG9ycyAoMjRoKTwvaDQ+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic2VjLXRvcC1hY3RvcnNcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6MjQwcHg7XCI+XHUyMDE0PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjo4cHggMCA2cHg7XCI+VG9wIFRhcmdldHMgKDI0aCk8L2g0PlxuICAgICAgICAgICAgPGRpdiBpZD1cInNlYy10b3AtdGFyZ2V0c1wiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDoyNDBweDtcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBFVkVOVFMgVEFCIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNlYy1wYW5lbFwiIGRhdGEtcGFuZWw9XCJldmVudHNcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O21hcmdpbi1ib3R0b206MTJweDthbGlnbi1pdGVtczpjZW50ZXI7ZmxleC13cmFwOndyYXA7XCI+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInNlYy1maWx0ZXItc291cmNlXCIgY2xhc3M9XCJzZWMtZmlsdGVyXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsIHNvdXJjZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhcGlcIj5BUEk8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjYWRkeVwiPkNhZGR5PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZmFpbDJiYW5cIj5mYWlsMmJhbjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNoYXJlZC1iYW5zXCI+c2hhcmVkX2JhbnM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhZ2VudFwiPkFnZW50PC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInNlYy1maWx0ZXItc2V2ZXJpdHlcIiBjbGFzcz1cInNlYy1maWx0ZXJcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGwgc2V2ZXJpdGllczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNyaXRpY2FsXCI+Y3JpdGljYWw8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJlcnJvclwiPmVycm9yPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwid2FyblwiPndhcm48L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJub3RpY2VcIj5ub3RpY2U8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJpbmZvXCI+aW5mbzwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzZWMtZmlsdGVyLWhvc3RcIiBjbGFzcz1cInNlYy1maWx0ZXJcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGwgaG9zdHM8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8aW5wdXQgaWQ9XCJzZWMtZmlsdGVyLWFjdG9yXCIgY2xhc3M9XCJzZWMtZmlsdGVyXCIgcGxhY2Vob2xkZXI9XCJhY3RvciAoSVAgb3IgdXNlcilcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDEwcHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNlYy1yZWZyZXNoLWJ0blwiIGNsYXNzPVwiYnRuLXNtXCI+XHVEODNEXHVERDA0IFJlZnJlc2g8L2J1dHRvbj5cbiAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJtYXJnaW4tbGVmdDphdXRvO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNlYy1saXZlLXRhaWxcIiBjaGVja2VkPlxuICAgICAgICAgICAgPHNwYW4+TGl2ZSB0YWlsPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic2VjLWV2ZW50cy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6NDgwcHg7XCI+TG9hZGluZ1x1MjAyNjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gSE9TVFMgVEFCIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNlYy1wYW5lbFwiIGRhdGEtcGFuZWw9XCJob3N0c1wiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7bWFyZ2luLWJvdHRvbToxMnB4O1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJzZWMtaG9zdC1yZWdpc3Rlci1idG5cIiBjbGFzcz1cImJ0bi1zbVwiPlx1Mjc5NSBSZWdpc3RlciBIb3N0PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNlYy1ob3N0cy1yZWZyZXNoXCIgY2xhc3M9XCJidG4tc21cIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInNlYy1ob3N0cy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6NDgwcHg7XCI+TG9hZGluZ1x1MjAyNjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwic2VjLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgLy8gPT09PT09PT09PT09PSBTVEFURSA9PT09PT09PT09PT09XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3VyaXR5LW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdXJpdHktY2VudGVyLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWNhbmNlbCcpO1xuICBjb25zdCB0YWJzID0gbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnNlYy10YWInKTtcbiAgY29uc3QgcGFuZWxzID0gbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnNlYy1wYW5lbCcpO1xuXG4gIGxldCBhbGxFdmVudHMgPSBbXTsgLy8gbmV3ZXN0IGZpcnN0XG4gIGxldCBhbGxIb3N0cyA9IFtdO1xuICBsZXQgc3NlU291cmNlID0gbnVsbDtcblxuICAvLyA9PT09PT09PT09PT09IFRBQiBTV0lUQ0hJTkcgPT09PT09PT09PT09PVxuICB0YWJzLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB0YWJzLmZvckVhY2godCA9PiB0LmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIHQgPT09IHRhYikpO1xuICAgICAgcGFuZWxzLmZvckVhY2gocCA9PiBwLnN0eWxlLmRpc3BsYXkgPSBwLmRhdGFzZXQucGFuZWwgPT09IHRhYi5kYXRhc2V0LnRhYiA/ICcnIDogJ25vbmUnKTtcbiAgICAgIGlmICh0YWIuZGF0YXNldC50YWIgPT09ICdvdmVydmlldycpIHJlZnJlc2hPdmVydmlldygpO1xuICAgICAgaWYgKHRhYi5kYXRhc2V0LnRhYiA9PT0gJ2V2ZW50cycpIHJlZnJlc2hFdmVudHMoKTtcbiAgICAgIGlmICh0YWIuZGF0YXNldC50YWIgPT09ICdob3N0cycpIHJlZnJlc2hIb3N0cygpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09IE9QRU4vQ0xPU0UgPT09PT09PT09PT09PVxuICBpZiAob3BlbkJ0bikge1xuICAgIG9wZW5CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgICByZWZyZXNoT3ZlcnZpZXcoKTtcbiAgICAgIHN0YXJ0TGl2ZVRhaWwoKTtcbiAgICB9KTtcbiAgfVxuICBjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZU1vZGFsKTtcbiAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgY2xvc2VNb2RhbCgpOyB9KTtcbiAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgc3RvcExpdmVUYWlsKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09IExJVkUgVEFJTCAoU1NFKSA9PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIHN0YXJ0TGl2ZVRhaWwoKSB7XG4gICAgc3RvcExpdmVUYWlsKCk7XG4gICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWxpdmUtdGFpbCcpLmNoZWNrZWQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIEV2ZW50U291cmNlID09PSAndW5kZWZpbmVkJykgcmV0dXJuOyAvLyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydFxuICAgIHRyeSB7XG4gICAgICBzc2VTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9hcGkvdjEvc2VjdXJpdHkvZXZlbnRzL3N0cmVhbScpO1xuICAgICAgc3NlU291cmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2luaXQnLCAoZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgICAgYWxsRXZlbnRzID0gZGF0YS5ldmVudHMgfHwgW107XG4gICAgICAgICAgcmVuZGVyRXZlbnRzKCk7XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH0pO1xuICAgICAgc3NlU291cmNlLmFkZEV2ZW50TGlzdGVuZXIoJ3NlY3VyaXR5JywgKGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBldiA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgICBhbGxFdmVudHMudW5zaGlmdChldik7XG4gICAgICAgICAgaWYgKGFsbEV2ZW50cy5sZW5ndGggPiA1MDApIGFsbEV2ZW50cy5sZW5ndGggPSA1MDA7XG4gICAgICAgICAgLy8gQXV0by1yZWZyZXNoIHdoaWNoZXZlciBwYW5lbCBpcyBzaG93aW5nXG4gICAgICAgICAgY29uc3QgYWN0aXZlID0gbW9kYWwucXVlcnlTZWxlY3RvcignLnNlYy10YWIuYWN0aXZlJyk/LmRhdGFzZXQ/LnRhYjtcbiAgICAgICAgICBpZiAoYWN0aXZlID09PSAnZXZlbnRzJykgcmVuZGVyRXZlbnRzKCk7XG4gICAgICAgICAgZWxzZSBpZiAoYWN0aXZlID09PSAnb3ZlcnZpZXcnKSByZWZyZXNoT3ZlcnZpZXcoKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfSk7XG4gICAgICBzc2VTb3VyY2Uub25lcnJvciA9ICgpID0+IHsgLyogYnJvd3NlciBhdXRvLXJlY29ubmVjdHMgKi8gfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tzZWN1cml0eV0gU1NFIGZhaWxlZDonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzdG9wTGl2ZVRhaWwoKSB7XG4gICAgaWYgKHNzZVNvdXJjZSkgeyB0cnkgeyBzc2VTb3VyY2UuY2xvc2UoKTsgfSBjYXRjaCB7fSBzc2VTb3VyY2UgPSBudWxsOyB9XG4gIH1cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1saXZlLXRhaWwnKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKG1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSBzdGFydExpdmVUYWlsKCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT0gT1ZFUlZJRVcgPT09PT09PT09PT09PVxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoT3ZlcnZpZXcoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpbmNlID0gbmV3IERhdGUoRGF0ZS5ub3coKSAtIDI0KjYwKjYwKjEwMDApLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCBbc3RhdHNSZXMsIGhvc3RzUmVzLCBldmVudHNSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBmZXRjaChgL2FwaS92MS9zZWN1cml0eS9ldmVudHMvc3RhdHM/c2luY2U9JHtlbmNvZGVVUklDb21wb25lbnQoc2luY2UpfWApLFxuICAgICAgICBmZXRjaCgnL2FwaS92MS9zZWN1cml0eS9ob3N0cycpLFxuICAgICAgICBmZXRjaChgL2FwaS92MS9zZWN1cml0eS9ldmVudHM/bGltaXQ9MSZzaW5jZT0ke2VuY29kZVVSSUNvbXBvbmVudChzaW5jZSl9YCksXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHN0YXRzID0gKGF3YWl0IHN0YXRzUmVzLmpzb24oKSkuZGF0YSB8fCB7fTtcbiAgICAgIGNvbnN0IGhvc3RzID0gKGF3YWl0IGhvc3RzUmVzLmpzb24oKSkuZGF0YT8uaG9zdHMgfHwgW107XG4gICAgICBjb25zdCBldmVudHNDb3VudCA9IChhd2FpdCBldmVudHNSZXMuanNvbigpKS5kYXRhPy50b3RhbCB8fCAwO1xuXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VjLXN0YXRzIFtkYXRhLWtleT1cInRvdGFsXCJdJykudGV4dENvbnRlbnQgPSBgJHtldmVudHNDb3VudH0gZXZlbnRzICgyNGgpYDtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwid2FyblwiXScpLnRleHRDb250ZW50ID0gYCR7c3RhdHMuYnlfc2V2ZXJpdHk/Lndhcm4gfHwgMH0gd2FybmluZ3NgO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlYy1zdGF0cyBbZGF0YS1rZXk9XCJlcnJvclwiXScpLnRleHRDb250ZW50ID0gYCR7c3RhdHMuYnlfc2V2ZXJpdHk/LmVycm9yIHx8IDB9IGVycm9yc2A7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VjLXN0YXRzIFtkYXRhLWtleT1cImRlbmllZFwiXScpLnRleHRDb250ZW50ID0gYCR7c3RhdHMuYnlfb3V0Y29tZT8uZGVuaWVkIHx8IDB9IGRlbmllZGA7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VjLXN0YXRzIFtkYXRhLWtleT1cImhvc3RzXCJdJykudGV4dENvbnRlbnQgPSBgJHtob3N0cy5sZW5ndGh9IGhvc3RzYDtcblxuICAgICAgcmVuZGVyVG9wTGlzdCgnc2VjLXRvcC1hY3RvcnMnLCBzdGF0cy50b3BfYWN0b3JzIHx8IFtdKTtcbiAgICAgIHJlbmRlclRvcExpc3QoJ3NlYy10b3AtdGFyZ2V0cycsIHN0YXRzLnRvcF90YXJnZXRzIHx8IFtdKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tzZWN1cml0eV0gcmVmcmVzaE92ZXJ2aWV3IGZhaWxlZDonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiByZW5kZXJUb3BMaXN0KGlkLCBpdGVtcykge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmICghaXRlbXMubGVuZ3RoKSB7IGVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5ObyBkYXRhPC9kaXY+JzsgcmV0dXJuOyB9XG4gICAgZWwuaW5uZXJIVE1MID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOjEwMCU7Zm9udC1zaXplOjAuODVyZW07XCI+JyArXG4gICAgICBpdGVtcy5tYXAoaXQgPT4gYDx0cj48dGQgc3R5bGU9XCJwYWRkaW5nOjNweCAwO3dvcmQtYnJlYWs6YnJlYWstYWxsO1wiPiR7ZXNjYXBlSHRtbChTdHJpbmcoaXQua2V5KSl9PC90ZD48dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOnJpZ2h0O2NvbG9yOnZhcigtLW11dGVkKTtcIj4ke2l0LmNvdW50fTwvdGQ+PC90cj5gKS5qb2luKCcnKSArXG4gICAgICAnPC90YWJsZT4nO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PSBFVkVOVFMgPT09PT09PT09PT09PVxuICBjb25zdCBmaWx0ZXJTb3VyY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWZpbHRlci1zb3VyY2UnKTtcbiAgY29uc3QgZmlsdGVyU2V2ZXJpdHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWZpbHRlci1zZXZlcml0eScpO1xuICBjb25zdCBmaWx0ZXJIb3N0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1maWx0ZXItaG9zdCcpO1xuICBjb25zdCBmaWx0ZXJBY3RvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtZmlsdGVyLWFjdG9yJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLXJlZnJlc2gtYnRuJyk7XG5cbiAgW2ZpbHRlclNvdXJjZSwgZmlsdGVyU2V2ZXJpdHksIGZpbHRlckhvc3RdLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgcmVmcmVzaEV2ZW50cykpO1xuICBmaWx0ZXJBY3Rvci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGRlYm91bmNlKHJlZnJlc2hFdmVudHMsIDI1MCkpO1xuICByZWZyZXNoQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVmcmVzaEV2ZW50cyk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEV2ZW50cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgcGFyYW1zLnNldCgnbGltaXQnLCAnMjAwJyk7XG4gICAgICBpZiAoZmlsdGVyU291cmNlLnZhbHVlKSAgcGFyYW1zLnNldCgnc291cmNlX3R5cGUnLCBmaWx0ZXJTb3VyY2UudmFsdWUpO1xuICAgICAgaWYgKGZpbHRlclNldmVyaXR5LnZhbHVlKSBwYXJhbXMuc2V0KCdzZXZlcml0eScsIGZpbHRlclNldmVyaXR5LnZhbHVlKTtcbiAgICAgIGlmIChmaWx0ZXJIb3N0LnZhbHVlKSAgICBwYXJhbXMuc2V0KCdzb3VyY2VfaG9zdCcsIGZpbHRlckhvc3QudmFsdWUpO1xuICAgICAgaWYgKGZpbHRlckFjdG9yLnZhbHVlKSAgIHBhcmFtcy5zZXQoJ2FjdG9yX3ByZWZpeCcsIGZpbHRlckFjdG9yLnZhbHVlKTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2VjdXJpdHkvZXZlbnRzPyR7cGFyYW1zfWApO1xuICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKS5kYXRhO1xuICAgICAgYWxsRXZlbnRzID0gZGF0YS5ldmVudHMgfHwgW107XG4gICAgICByZW5kZXJFdmVudHMoKTtcblxuICAgICAgLy8gUmVmcmVzaCBob3N0IGRyb3Bkb3duIGlmIHdlIGRvbid0IGhhdmUgaXQgeWV0XG4gICAgICBpZiAoIWZpbHRlckhvc3Qub3B0aW9ucy5sZW5ndGggfHwgZmlsdGVySG9zdC5vcHRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBhd2FpdCByZWZyZXNoSG9zdEZpbHRlcigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtZXZlbnRzLWNvbnRhaW5lcicpLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5Mb2FkIGZhaWxlZDogJytlc2NhcGVIdG1sKGUubWVzc2FnZSkrJzwvZGl2Pic7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyRXZlbnRzKCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ldmVudHMtY29udGFpbmVyJyk7XG4gICAgaWYgKCFhbGxFdmVudHMubGVuZ3RoKSB7IGVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5ObyBldmVudHM8L2Rpdj4nOyByZXR1cm47IH1cbiAgICBlbC5pbm5lckhUTUwgPSBhbGxFdmVudHMuc2xpY2UoMCwgMjAwKS5tYXAocmVuZGVyRXZlbnRSb3cpLmpvaW4oJycpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyRXZlbnRSb3coZXYpIHtcbiAgICBjb25zdCBzZXYgPSBldi5zZXZlcml0eSB8fCAnaW5mbyc7XG4gICAgY29uc3Qgc2V2Q29sb3IgPSB7XG4gICAgICBjcml0aWNhbDogJyNjMDM5MmInLCBlcnJvcjogJyNlNzRjM2MnLCB3YXJuOiAnI2YzOWMxMicsXG4gICAgICBub3RpY2U6ICcjMzQ5OGRiJywgaW5mbzogJyM3ZjhjOGQnLFxuICAgIH1bc2V2XSB8fCAnIzdmOGM4ZCc7XG4gICAgY29uc3QgdGltZSA9IGV2LnRzID8gbmV3IERhdGUoZXYudHMpLnRvTG9jYWxlVGltZVN0cmluZygpIDogJyc7XG4gICAgY29uc3Qgc291cmNlID0gZXYuc291cmNlX3R5cGUgfHwgJyc7XG4gICAgY29uc3QgYWN0b3IgPSBldi5hY3RvciB8fCAnXHUyMDE0JztcbiAgICBjb25zdCB0YXJnZXQgPSBldi50YXJnZXQgfHwgJyc7XG4gICAgY29uc3QgYWN0aW9uID0gZXYuYWN0aW9uIHx8ICcnO1xuICAgIGNvbnN0IG91dGNvbWUgPSBldi5vdXRjb21lIHx8ICcnO1xuICAgIHJldHVybiBgPGRpdiBjbGFzcz1cInNlYy1ldmVudC1yb3dcIiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6ODRweCA4MHB4IDFmciAxZnIgMTAwcHggOTBweDtnYXA6OHB4O3BhZGRpbmc6NXB4IDhweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2ZvbnQtc2l6ZTowLjgycmVtO2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6JHtzZXZDb2xvcn07Zm9udC13ZWlnaHQ6NjAwO1wiPiR7ZXNjYXBlSHRtbChzZXYpfTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTowLjc1cmVtO1wiPiR7ZXNjYXBlSHRtbChzb3VyY2UpfTwvc3Bhbj5cbiAgICAgIDxzcGFuIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGFjdG9yKX1cIiBzdHlsZT1cIm92ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2VzY2FwZUh0bWwoYWN0b3IpfTwvc3Bhbj5cbiAgICAgIDxzcGFuIHRpdGxlPVwiJHtlc2NhcGVIdG1sKHRhcmdldCl9XCIgc3R5bGU9XCJvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXA7XCI+JHtlc2NhcGVIdG1sKGFjdGlvbil9ICR7ZXNjYXBlSHRtbCh0YXJnZXQpfTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTowLjc1cmVtO1wiPiR7ZXNjYXBlSHRtbChvdXRjb21lKX08L3NwYW4+XG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MC43NXJlbTt0ZXh0LWFsaWduOnJpZ2h0O1wiPiR7ZXNjYXBlSHRtbCh0aW1lKX08L3NwYW4+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hIb3N0RmlsdGVyKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zZWN1cml0eS9ob3N0cycpO1xuICAgICAgY29uc3QgaG9zdHMgPSAoYXdhaXQgcmVzLmpzb24oKSkuZGF0YT8uaG9zdHMgfHwgW107XG4gICAgICBjb25zdCBjdXJyZW50ID0gZmlsdGVySG9zdC52YWx1ZTtcbiAgICAgIGZpbHRlckhvc3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5BbGwgaG9zdHM8L29wdGlvbj4nICtcbiAgICAgICAgaG9zdHMubWFwKGggPT4gYDxvcHRpb24gdmFsdWU9XCIke2VzY2FwZUh0bWwoaC5pZCl9XCI+JHtlc2NhcGVIdG1sKGgubGFiZWwgfHwgaC5pZCl9PC9vcHRpb24+YCkuam9pbignJyk7XG4gICAgICBpZiAoY3VycmVudCkgZmlsdGVySG9zdC52YWx1ZSA9IGN1cnJlbnQ7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PSBIT1NUUyA9PT09PT09PT09PT09XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtaG9zdC1yZWdpc3Rlci1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlZ2lzdGVySG9zdFByb21wdCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtaG9zdHMtcmVmcmVzaCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVmcmVzaEhvc3RzKTtcblxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoSG9zdHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlY3VyaXR5L2hvc3RzJyk7XG4gICAgICBjb25zdCBob3N0cyA9IChhd2FpdCByZXMuanNvbigpKS5kYXRhPy5ob3N0cyB8fCBbXTtcbiAgICAgIGFsbEhvc3RzID0gaG9zdHM7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtaG9zdHMtY29udGFpbmVyJyk7XG4gICAgICBpZiAoIWhvc3RzLmxlbmd0aCkgeyBlbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+Tm8gaG9zdHMgcmVnaXN0ZXJlZC4gQ2xpY2sgXHUyNzk1IFJlZ2lzdGVyIEhvc3QgdG8gYWRkIG9uZS48L2Rpdj4nOyByZXR1cm47IH1cbiAgICAgIGVsLmlubmVySFRNTCA9IGhvc3RzLm1hcChoID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gIWguZW5hYmxlZCA/ICdcdUQ4M0RcdUREMzQgZGlzYWJsZWQnXG4gICAgICAgICAgICAgICAgICAgICA6ICFoLmxhc3Rfc2Vlbl9hdCA/ICdcdTI2QUEgcmVnaXN0ZXJlZCdcbiAgICAgICAgICAgICAgICAgICAgIDogKERhdGUubm93KCkgLSBEYXRlLnBhcnNlKGgubGFzdF9zZWVuX2F0KSA+IDMwKjYwKjEwMDApID8gJ1x1RDgzRFx1REZFMSBzdGFsZSdcbiAgICAgICAgICAgICAgICAgICAgIDogJ1x1RDgzRFx1REZFMiBvbmxpbmUnO1xuICAgICAgICByZXR1cm4gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOjEwcHggMTJweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7XCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGgubGFiZWwgfHwgaC5pZCl9PC9zdHJvbmc+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOnZhcigtLW11dGVkKTttYXJnaW4tbGVmdDo4cHg7Zm9udC1zaXplOjAuOHJlbTtcIj4ke2VzY2FwZUh0bWwoaC50eXBlKX08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTowLjc4cmVtO21hcmdpbi10b3A6MnB4O1wiPlxuICAgICAgICAgICAgICBpZDogJHtlc2NhcGVIdG1sKGguaWQpfSBcdTAwQjdcbiAgICAgICAgICAgICAgcmVnaXN0ZXJlZCAke25ldyBEYXRlKGgucmVnaXN0ZXJlZF9hdCkudG9Mb2NhbGVEYXRlU3RyaW5nKCl9IFx1MDBCN1xuICAgICAgICAgICAgICBsYXN0IHNlZW4gJHtoLmxhc3Rfc2Vlbl9hdCA/IG5ldyBEYXRlKGgubGFzdF9zZWVuX2F0KS50b0xvY2FsZVN0cmluZygpIDogJ25ldmVyJ31cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjg1cmVtO21hcmdpbi1yaWdodDoxMnB4O1wiPiR7c3RhdHVzfTwvc3Bhbj5cbiAgICAgICAgICAgICR7aC5pZCA9PT0gJ3NlbGYnID8gJycgOiBgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zbSBzZWMtaG9zdC1kZWxcIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKGguaWQpfVwiIHN0eWxlPVwiY29sb3I6dmFyKC0tYmFkLWZnKTtcIj5SZW1vdmU8L2J1dHRvbj5gfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgfSkuam9pbignJyk7XG5cbiAgICAgIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWMtaG9zdC1kZWwnKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbmZpcm0oYFJlbW92ZSBob3N0ICR7YnRuLmRhdGFzZXQuaWR9PyBFdmVudHMgYWxyZWFkeSByZWNlaXZlZCB3aWxsIHJlbWFpbiBpbiB0aGUgc3RvcmUuYCkpIHJldHVybjtcbiAgICAgICAgICBhd2FpdCBmZXRjaChgL2FwaS92MS9zZWN1cml0eS9ob3N0cy8ke2VuY29kZVVSSUNvbXBvbmVudChidG4uZGF0YXNldC5pZCl9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgICAgIHJlZnJlc2hIb3N0cygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtaG9zdHMtY29udGFpbmVyJykuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPkxvYWQgZmFpbGVkOiAnK2VzY2FwZUh0bWwoZS5tZXNzYWdlKSsnPC9kaXY+JztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWdpc3Rlckhvc3RQcm9tcHQoKSB7XG4gICAgY29uc3QgaWQgPSBwcm9tcHQoJ0hvc3QgaWQgKGxvd2VyY2FzZSwgbm8gc3BhY2VzKTonKTtcbiAgICBpZiAoIWlkKSByZXR1cm47XG4gICAgY29uc3QgbGFiZWwgPSBwcm9tcHQoJ0Rpc3BsYXkgbGFiZWw6JywgaWQpIHx8IGlkO1xuICAgIGNvbnN0IHR5cGUgID0gcHJvbXB0KCdUeXBlIChcImRhc2hjYWRkeVwiLCBcInNlcnZpY2VcIiwgb3IgXCJhZ2VudFwiKTonLCAnYWdlbnQnKSB8fCAnYWdlbnQnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zZWN1cml0eS9ob3N0cycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGlkLCBsYWJlbCwgdHlwZSB9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIXJlcy5vaykgeyBhbGVydCgnRmFpbGVkOiAnICsgKGRhdGE/LmVycm9yPy5tZXNzYWdlIHx8IHJlcy5zdGF0dXNUZXh0KSk7IHJldHVybjsgfVxuICAgICAgLy8gU2hvdyB0aGUgYXBpX2tleSBPTkNFIGluIGEgZGlhbG9nXG4gICAgICBhbGVydChgXHUyNzA1IEhvc3QgcmVnaXN0ZXJlZCFcXG5cXG5pZDogJHtkYXRhLmRhdGEuaG9zdC5pZH1cXG5sYWJlbDogJHtkYXRhLmRhdGEuaG9zdC5sYWJlbH1cXG50eXBlOiAke2RhdGEuZGF0YS5ob3N0LnR5cGV9XFxuXFxuXHVEODNEXHVERDExIEFQSSBLRVkgKHNhdmUgdGhpcyBOT1cgXHUyMDE0IHdvbid0IGJlIHNob3duIGFnYWluKTpcXG5cXG4ke2RhdGEuZGF0YS5hcGlfa2V5fVxcblxcblNlbmQgdGhpcyBrZXkgYXM6IEF1dGhvcml6YXRpb246IEJlYXJlciA8YXBpX2tleT5cXG5UbyBlbmRwb2ludDogUE9TVCAvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cy9pbmdlc3Qgb3IgL2V2ZW50cy9iYXRjaGApO1xuICAgICAgcmVmcmVzaEhvc3RzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYWxlcnQoJ0ZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PSBIRUxQRVJTID09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gZXNjYXBlSHRtbChzKSB7XG4gICAgcmV0dXJuIFN0cmluZyhzKS5yZXBsYWNlKC9bJjw+XCInXS9nLCBjID0+ICh7JyYnOicmYW1wOycsJzwnOicmbHQ7JywnPic6JyZndDsnLCdcIic6JyZxdW90OycsXCInXCI6JyYjMzk7J31bY10pKTtcbiAgfVxuICBmdW5jdGlvbiBkZWJvdW5jZShmbiwgbXMpIHtcbiAgICBsZXQgdDsgcmV0dXJuIGZ1bmN0aW9uKCkgeyBjbGVhclRpbWVvdXQodCk7IHQgPSBzZXRUaW1lb3V0KCgpID0+IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIG1zKTsgfTtcbiAgfVxufSkoKTs7XG4vLyA9PT09PT09PT09IFdFQVRIRVIgV0lER0VUID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnd2VhdGhlci1tb2RhbCcsIGA8ZGl2IGlkPVwid2VhdGhlci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPjxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIj48aDM+V2VhdGhlciBTZXR0aW5nczwvaDM+XG4gICAgPGxhYmVsIGZvcj1cIndlYXRoZXItbG9jYXRpb24taW5wdXRcIj5Mb2NhdGlvbjo8L2xhYmVsPlxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwid2VhdGhlci1sb2NhdGlvbi1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiQ2l0eSBuYW1lIG9yIFpJUCAoZS5nLiwgSGFtYnVyZywgOTAyMTApXCIgbWF4bGVuZ3RoPVwiMTAwXCI+XG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPkVudGVyIGEgY2l0eSBuYW1lLCBwb3N0YWwgY29kZSwgb3IgJmxkcXVvO0NpdHksIENvdW50cnkmcmRxdW87PC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDE0cHg7IHBhZGRpbmctdG9wOiAxMnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA4cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1mZyk7XCI+VW5pdHM8L2xhYmVsPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ3ZWF0aGVyLXVuaXQtb3B0aW9uXCI+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ3ZWF0aGVyLXVuaXQtcmFkaW9cIiB2YWx1ZT1cImltcGVyaWFsXCI+PHNwYW4gY2xhc3M9XCJ3ZWF0aGVyLXVuaXQtY2FyZFwiPiZkZWc7RiAvIG1waDwvc3Bhbj48L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ3ZWF0aGVyLXVuaXQtb3B0aW9uXCI+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ3ZWF0aGVyLXVuaXQtcmFkaW9cIiB2YWx1ZT1cIm1ldHJpY1wiPjxzcGFuIGNsYXNzPVwid2VhdGhlci11bml0LWNhcmRcIj4mZGVnO0MgLyBrbS9oPC9zcGFuPjwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCI+PGJ1dHRvbiBpZD1cIndlYXRoZXItY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+PGJ1dHRvbiBpZD1cIndlYXRoZXItc2F2ZVwiPlNhdmU8L2J1dHRvbj48L2Rpdj48L2Rpdj48L2Rpdj5gKTtcblxuICAvKiBXZWF0aGVyIFdpZGdldCBcdTIwMTQgcG93ZXJlZCBieSBPcGVuLU1ldGVvIChmcmVlLCBubyBBUEkga2V5KSAqL1xuICBjb25zdCBMT0NBVElPTl9LRVkgPSAnd2VhdGhlci1sb2NhdGlvbic7XG4gIGNvbnN0IExFR0FDWV9LRVkgPSAnd2VhdGhlci16aXAnO1xuICBjb25zdCBHRU9fQ0FDSEVfS0VZID0gJ3dlYXRoZXItZ2VvJztcbiAgY29uc3QgVU5JVF9LRVkgPSAnd2VhdGhlci11bml0JztcblxuICAvLyBNaWdyYXRlIGZyb20gb2xkIFpJUC1vbmx5IGtleVxuICBpZiAoIXNhZmVHZXQoTE9DQVRJT05fS0VZKSAmJiBzYWZlR2V0KExFR0FDWV9LRVkpKSB7XG4gICAgc2FmZVNldChMT0NBVElPTl9LRVksIHNhZmVHZXQoTEVHQUNZX0tFWSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VW5pdCgpIHtcbiAgICByZXR1cm4gc2FmZUdldChVTklUX0tFWSkgfHwgJ2ltcGVyaWFsJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFdlYXRoZXJFbGVtZW50cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWNvbjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItaWNvbicpLFxuICAgICAgdGVtcDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItdGVtcCcpLFxuICAgICAgY29uZGl0aW9uOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2VhdGhlci1jb25kaXRpb24nKSxcbiAgICAgIGxvY2F0aW9uOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2VhdGhlci1sb2NhdGlvbicpLFxuICAgICAgd2luZDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItd2luZCcpXG4gICAgfTtcbiAgfVxuXG4gIC8vIFdNTyBXZWF0aGVyIENvZGUgbWFwcGluZ1xuICBjb25zdCB3bW9EZXNjcmlwdGlvbnMgPSB7XG4gICAgMDogJ0NsZWFyIHNreScsIDE6ICdNYWlubHkgY2xlYXInLCAyOiAnUGFydGx5IGNsb3VkeScsIDM6ICdPdmVyY2FzdCcsXG4gICAgNDU6ICdGb2cnLCA0ODogJ1JpbWUgZm9nJyxcbiAgICA1MTogJ0xpZ2h0IGRyaXp6bGUnLCA1MzogJ0RyaXp6bGUnLCA1NTogJ0RlbnNlIGRyaXp6bGUnLFxuICAgIDU2OiAnRnJlZXppbmcgZHJpenpsZScsIDU3OiAnRGVuc2UgZnJlZXppbmcgZHJpenpsZScsXG4gICAgNjE6ICdMaWdodCByYWluJywgNjM6ICdNb2RlcmF0ZSByYWluJywgNjU6ICdIZWF2eSByYWluJyxcbiAgICA2NjogJ0xpZ2h0IGZyZWV6aW5nIHJhaW4nLCA2NzogJ0hlYXZ5IGZyZWV6aW5nIHJhaW4nLFxuICAgIDcxOiAnTGlnaHQgc25vdycsIDczOiAnTW9kZXJhdGUgc25vdycsIDc1OiAnSGVhdnkgc25vdycsIDc3OiAnU25vdyBncmFpbnMnLFxuICAgIDgwOiAnTGlnaHQgc2hvd2VycycsIDgxOiAnTW9kZXJhdGUgc2hvd2VycycsIDgyOiAnVmlvbGVudCBzaG93ZXJzJyxcbiAgICA4NTogJ0xpZ2h0IHNub3cgc2hvd2VycycsIDg2OiAnSGVhdnkgc25vdyBzaG93ZXJzJyxcbiAgICA5NTogJ1RodW5kZXJzdG9ybScsIDk2OiAnVGh1bmRlcnN0b3JtIHdpdGggaGFpbCcsIDk5OiAnU2V2ZXJlIHRodW5kZXJzdG9ybSdcbiAgfTtcblxuICBjb25zdCB3bW9JY29ucyA9IHtcbiAgICAwOiAnXHUyNjAwXHVGRTBGJywgMTogJ1x1RDgzQ1x1REYyNFx1RkUwRicsIDI6ICdcdTI2QzUnLCAzOiAnXHUyNjAxXHVGRTBGJyxcbiAgICA0NTogJ1x1RDgzQ1x1REYyQlx1RkUwRicsIDQ4OiAnXHVEODNDXHVERjJCXHVGRTBGJyxcbiAgICA1MTogJ1x1RDgzQ1x1REYyNlx1RkUwRicsIDUzOiAnXHVEODNDXHVERjI2XHVGRTBGJywgNTU6ICdcdUQ4M0NcdURGMjZcdUZFMEYnLFxuICAgIDU2OiAnXHVEODNDXHVERjI4XHVGRTBGJywgNTc6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLFxuICAgIDYxOiAnXHVEODNDXHVERjI2XHVGRTBGJywgNjM6ICdcdUQ4M0NcdURGMjdcdUZFMEYnLCA2NTogJ1x1RDgzQ1x1REYyN1x1RkUwRicsXG4gICAgNjY6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLCA2NzogJ1x1RDgzQ1x1REYyOFx1RkUwRicsXG4gICAgNzE6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLCA3MzogJ1x1Mjc0NFx1RkUwRicsIDc1OiAnXHUyNzQ0XHVGRTBGJywgNzc6ICdcdTI3NDRcdUZFMEYnLFxuICAgIDgwOiAnXHVEODNDXHVERjI2XHVGRTBGJywgODE6ICdcdUQ4M0NcdURGMjdcdUZFMEYnLCA4MjogJ1x1RDgzQ1x1REYyN1x1RkUwRicsXG4gICAgODU6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLCA4NjogJ1x1Mjc0NFx1RkUwRicsXG4gICAgOTU6ICdcdTI2QzhcdUZFMEYnLCA5NjogJ1x1MjZDOFx1RkUwRicsIDk5OiAnXHUyNkM4XHVGRTBGJ1xuICB9O1xuXG4gIC8vIFdpbmQgZGlyZWN0aW9uIGZyb20gZGVncmVlc1xuICBjb25zdCB3aW5kRGlycyA9IFsnTicsJ05ORScsJ05FJywnRU5FJywnRScsJ0VTRScsJ1NFJywnU1NFJywnUycsJ1NTVycsJ1NXJywnV1NXJywnVycsJ1dOVycsJ05XJywnTk5XJ107XG4gIGZ1bmN0aW9uIGRlZ1RvRGlyKGRlZykge1xuICAgIHJldHVybiB3aW5kRGlyc1tNYXRoLnJvdW5kKGRlZyAvIDIyLjUpICUgMTZdO1xuICB9XG5cbiAgLy8gR2VvY29kZSBsb2NhdGlvbiB2aWEgT3Blbi1NZXRlbywgd2l0aCBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgYXN5bmMgZnVuY3Rpb24gZ2VvY29kZUxvY2F0aW9uKHF1ZXJ5KSB7XG4gICAgY29uc3QgY2FjaGVkID0gc2FmZUdldChHRU9fQ0FDSEVfS0VZKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBnZW8gPSBKU09OLnBhcnNlKGNhY2hlZCk7XG4gICAgICAgIGlmIChnZW8ucXVlcnkgPT09IHF1ZXJ5KSByZXR1cm4gZ2VvO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vZ2VvY29kaW5nLWFwaS5vcGVuLW1ldGVvLmNvbS92MS9zZWFyY2g/bmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9JmNvdW50PTEmbGFuZ3VhZ2U9ZW4mZm9ybWF0PWpzb25gKTtcbiAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcignR2VvY29kaW5nIGZhaWxlZCcpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICBpZiAoIWRhdGEucmVzdWx0cyB8fCAhZGF0YS5yZXN1bHRzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdMb2NhdGlvbiBub3QgZm91bmQnKTtcbiAgICBjb25zdCByID0gZGF0YS5yZXN1bHRzWzBdO1xuICAgIGNvbnN0IGdlbyA9IHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgbGF0OiByLmxhdGl0dWRlLFxuICAgICAgbG9uOiByLmxvbmdpdHVkZSxcbiAgICAgIGNpdHk6IHIubmFtZSxcbiAgICAgIHN0YXRlOiByLmFkbWluMSB8fCAnJyxcbiAgICAgIGNvdW50cnk6IHIuY291bnRyeSB8fCAnJyxcbiAgICAgIGNvdW50cnlDb2RlOiByLmNvdW50cnlfY29kZSB8fCAnJ1xuICAgIH07XG4gICAgc2FmZVNldChHRU9fQ0FDSEVfS0VZLCBKU09OLnN0cmluZ2lmeShnZW8pKTtcbiAgICByZXR1cm4gZ2VvO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0TG9jYXRpb24oZ2VvKSB7XG4gICAgLy8gRm9yIFVTIGxvY2F0aW9ucyBzaG93IFwiQ2l0eSwgU3RhdGVcIiwgZm9yIG90aGVycyBzaG93IFwiQ2l0eSwgQ291bnRyeVwiXG4gICAgaWYgKGdlby5jb3VudHJ5Q29kZSA9PT0gJ1VTJyAmJiBnZW8uc3RhdGUpIHtcbiAgICAgIHJldHVybiBgJHtnZW8uY2l0eX0sICR7Z2VvLnN0YXRlfWA7XG4gICAgfVxuICAgIGlmIChnZW8uY291bnRyeSkge1xuICAgICAgcmV0dXJuIGAke2dlby5jaXR5fSwgJHtnZW8uY291bnRyeX1gO1xuICAgIH1cbiAgICByZXR1cm4gZ2VvLmNpdHk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFdlYXRoZXIobG9jYXRpb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZ2VvID0gYXdhaXQgZ2VvY29kZUxvY2F0aW9uKGxvY2F0aW9uKTtcbiAgICAgIGNvbnN0IHVuaXQgPSBnZXRVbml0KCk7XG4gICAgICBjb25zdCB0ZW1wVW5pdCA9IHVuaXQgPT09ICdtZXRyaWMnID8gJ2NlbHNpdXMnIDogJ2ZhaHJlbmhlaXQnO1xuICAgICAgY29uc3Qgd2luZFVuaXQgPSB1bml0ID09PSAnbWV0cmljJyA/ICdrbWgnIDogJ21waCc7XG4gICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9hcGkub3Blbi1tZXRlby5jb20vdjEvZm9yZWNhc3Q/bGF0aXR1ZGU9JHtnZW8ubGF0fSZsb25naXR1ZGU9JHtnZW8ubG9ufSZjdXJyZW50PXRlbXBlcmF0dXJlXzJtLHdlYXRoZXJfY29kZSx3aW5kX3NwZWVkXzEwbSx3aW5kX2RpcmVjdGlvbl8xMG0mdGVtcGVyYXR1cmVfdW5pdD0ke3RlbXBVbml0fSZ3aW5kX3NwZWVkX3VuaXQ9JHt3aW5kVW5pdH1gO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcignV2VhdGhlciBmZXRjaCBmYWlsZWQnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGNvbnN0IGMgPSBkYXRhLmN1cnJlbnQ7XG4gICAgICBjb25zdCBjb2RlID0gYy53ZWF0aGVyX2NvZGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZW1wOiBNYXRoLnJvdW5kKGMudGVtcGVyYXR1cmVfMm0pLFxuICAgICAgICBjb25kaXRpb246IHdtb0Rlc2NyaXB0aW9uc1tjb2RlXSB8fCAnVW5rbm93bicsXG4gICAgICAgIGljb246IHdtb0ljb25zW2NvZGVdIHx8ICdcdUQ4M0NcdURGMjRcdUZFMEYnLFxuICAgICAgICBsb2NhdGlvblN0cjogZm9ybWF0TG9jYXRpb24oZ2VvKSxcbiAgICAgICAgd2luZFNwZWVkOiBNYXRoLnJvdW5kKGMud2luZF9zcGVlZF8xMG0pLFxuICAgICAgICB3aW5kRGlyOiBkZWdUb0RpcihjLndpbmRfZGlyZWN0aW9uXzEwbSksXG4gICAgICAgIHVuaXRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignV2VhdGhlciBmZXRjaCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlV2VhdGhlcigpIHtcbiAgICBjb25zdCB3ZWF0aGVyV2lkZ2V0ID0gZ2V0V2VhdGhlckVsZW1lbnRzKCk7XG4gICAgaWYgKCF3ZWF0aGVyV2lkZ2V0Lmljb24gfHwgIXdlYXRoZXJXaWRnZXQudGVtcCB8fCAhd2VhdGhlcldpZGdldC5jb25kaXRpb24gfHwgIXdlYXRoZXJXaWRnZXQubG9jYXRpb24gfHwgIXdlYXRoZXJXaWRnZXQud2luZCkge1xuICAgICAgY29uc29sZS53YXJuKCdXZWF0aGVyIHdpZGdldCBlbGVtZW50cyBub3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhdGlvbiA9IHNhZmVHZXQoTE9DQVRJT05fS0VZKTtcbiAgICBpZiAoIWxvY2F0aW9uKSB7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LmxvY2F0aW9uLnRleHRDb250ZW50ID0gJ1NldCBMb2NhdGlvbic7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LnRlbXAudGV4dENvbnRlbnQgPSAnLS1cXHUwMEIwJztcbiAgICAgIHdlYXRoZXJXaWRnZXQuY29uZGl0aW9uLnRleHRDb250ZW50ID0gJ0NsaWNrIFxcdTI2OTlcXHVGRTBGIHRvIGNvbmZpZ3VyZSc7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LndpbmQudGV4dENvbnRlbnQgPSAnLS0nO1xuICAgICAgd2VhdGhlcldpZGdldC5pY29uLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cIndlYXRoZXItZW1vamlcIj5cXHVEODNDXFx1REYyNFxcdUZFMEY8L3NwYW4+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2VhdGhlciA9IGF3YWl0IGZldGNoV2VhdGhlcihsb2NhdGlvbik7XG4gICAgICBpZiAod2VhdGhlcikge1xuICAgICAgICBjb25zdCB0ZW1wU3VmZml4ID0gd2VhdGhlci51bml0ID09PSAnbWV0cmljJyA/ICdcXHUwMEIwQycgOiAnXFx1MDBCMEYnO1xuICAgICAgICBjb25zdCB3aW5kTGFiZWwgPSB3ZWF0aGVyLnVuaXQgPT09ICdtZXRyaWMnID8gJ2ttL2gnIDogJ21waCc7XG4gICAgICAgIHdlYXRoZXJXaWRnZXQubG9jYXRpb24udGV4dENvbnRlbnQgPSB3ZWF0aGVyLmxvY2F0aW9uU3RyO1xuICAgICAgICB3ZWF0aGVyV2lkZ2V0LnRlbXAudGV4dENvbnRlbnQgPSBgJHt3ZWF0aGVyLnRlbXB9JHt0ZW1wU3VmZml4fWA7XG4gICAgICAgIHdlYXRoZXJXaWRnZXQuY29uZGl0aW9uLnRleHRDb250ZW50ID0gd2VhdGhlci5jb25kaXRpb247XG4gICAgICAgIHdlYXRoZXJXaWRnZXQud2luZC50ZXh0Q29udGVudCA9IGBXaW5kOiAke3dlYXRoZXIud2luZFNwZWVkfSAke3dpbmRMYWJlbH0gJHt3ZWF0aGVyLndpbmREaXJ9YDtcbiAgICAgICAgd2VhdGhlcldpZGdldC5pY29uLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cIndlYXRoZXItZW1vamlcIj4ke2VzY2FwZUh0bWwod2VhdGhlci5pY29uKX08L3NwYW4+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbV2VhdGhlcl0gVXBkYXRlIEVycm9yJywgZXJyb3IsIHsgZnVuY3Rpb246ICd1cGRhdGVXZWF0aGVyJyB9KTtcbiAgICAgIHdlYXRoZXJXaWRnZXQubG9jYXRpb24udGV4dENvbnRlbnQgPSAnV2VhdGhlciBFcnJvcic7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LnRlbXAudGV4dENvbnRlbnQgPSAnRXJyb3InO1xuICAgICAgd2VhdGhlcldpZGdldC5jb25kaXRpb24udGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQnO1xuICAgICAgd2VhdGhlcldpZGdldC53aW5kLnRleHRDb250ZW50ID0gJy0tJztcbiAgICB9XG4gIH1cblxuICAvLyBXZWF0aGVyIHNldHRpbmdzIG1vZGFsXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItbW9kYWwnKTtcbiAgY29uc3QgbG9jYXRpb25JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWF0aGVyLWxvY2F0aW9uLWlucHV0Jyk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItc2V0dGluZ3MnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbG9jYXRpb25JbnB1dC52YWx1ZSA9IHNhZmVHZXQoTE9DQVRJT05fS0VZKSB8fCAnJztcbiAgICAvLyBTZXQgdW5pdCByYWRpb1xuICAgIGNvbnN0IHVuaXQgPSBnZXRVbml0KCk7XG4gICAgY29uc3QgcmFkaW8gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKGBpbnB1dFtuYW1lPVwid2VhdGhlci11bml0LXJhZGlvXCJdW3ZhbHVlPVwiJHt1bml0fVwiXWApO1xuICAgIGlmIChyYWRpbykgcmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvY2F0aW9uSW5wdXQuZm9jdXMoKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBsb2MgPSBsb2NhdGlvbklucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAobG9jKSB7XG4gICAgICAvLyBDbGVhciBnZW8gY2FjaGUgd2hlbiBsb2NhdGlvbiBjaGFuZ2VzIHNvIGl0IHJlLWdlb2NvZGVzXG4gICAgICBjb25zdCBvbGRMb2MgPSBzYWZlR2V0KExPQ0FUSU9OX0tFWSk7XG4gICAgICBpZiAob2xkTG9jICE9PSBsb2MpIHNhZmVTZXQoR0VPX0NBQ0hFX0tFWSwgJycpO1xuICAgICAgc2FmZVNldChMT0NBVElPTl9LRVksIGxvYyk7XG4gICAgICAvLyBTYXZlIHVuaXQgcHJlZmVyZW5jZVxuICAgICAgY29uc3QgdW5pdFJhZGlvID0gbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cIndlYXRoZXItdW5pdC1yYWRpb1wiXTpjaGVja2VkJyk7XG4gICAgICBjb25zdCBuZXdVbml0ID0gdW5pdFJhZGlvID8gdW5pdFJhZGlvLnZhbHVlIDogJ2ltcGVyaWFsJztcbiAgICAgIGNvbnN0IG9sZFVuaXQgPSBnZXRVbml0KCk7XG4gICAgICBzYWZlU2V0KFVOSVRfS0VZLCBuZXdVbml0KTtcbiAgICAgIC8vIENsZWFyIGdlbyBjYWNoZSBpZiB1bml0IGNoYW5nZWQgKG5lZWQgZnJlc2ggd2VhdGhlciBkYXRhKVxuICAgICAgaWYgKG9sZFVuaXQgIT09IG5ld1VuaXQpIHNhZmVTZXQoR0VPX0NBQ0hFX0tFWSwgJycpO1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgdXBkYXRlV2VhdGhlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgYSBsb2NhdGlvbiAoZS5nLiwgSGFtYnVyZywgTG9uZG9uLCA5MDIxMCknLCAnd2FybmluZycpO1xuICAgIH1cbiAgfSk7XG5cbiAgd2lyZU1vZGFsKG1vZGFsKTtcblxuICAvLyBDbG9zZSBtb2RhbCBvbiBFc2NhcGUga2V5XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgbW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEluaXRpYWxpemUgd2VhdGhlclxuICB1cGRhdGVXZWF0aGVyKCk7XG4gIC8vIFVwZGF0ZSB3ZWF0aGVyIGV2ZXJ5IDEwIG1pbnV0ZXNcbiAgc2V0SW50ZXJ2YWwodXBkYXRlV2VhdGhlciwgREMuUE9MTC5XRUFUSEVSKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IERJR0lUQUwgQ0xPQ0sgV0lER0VUID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3Qgd2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb2NrLXdpZGdldCcpO1xuICBjb25zdCByZW5kZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stcmVuZGVyJyk7XG4gIGlmICghd2lkZ2V0IHx8ICFyZW5kZXIpIHJldHVybjtcblxuICBjb25zdCBEQVlTID0gWydTdW5kYXknLCdNb25kYXknLCdUdWVzZGF5JywnV2VkbmVzZGF5JywnVGh1cnNkYXknLCdGcmlkYXknLCdTYXR1cmRheSddO1xuICBjb25zdCBNT05USFMgPSBbJ0phbnVhcnknLCdGZWJydWFyeScsJ01hcmNoJywnQXByaWwnLCdNYXknLCdKdW5lJywnSnVseScsJ0F1Z3VzdCcsJ1NlcHRlbWJlcicsJ09jdG9iZXInLCdOb3ZlbWJlcicsJ0RlY2VtYmVyJ107XG4gIGNvbnN0IFJPTUFOID0gWydYSUknLCdJJywnSUknLCdJSUknLCdJVicsJ1YnLCdWSScsJ1ZJSScsJ1ZJSUknLCdJWCcsJ1gnLCdYSSddO1xuXG4gIGxldCBjdXJyZW50U3R5bGUgPSBzYWZlR2V0KCdjbG9jay1zdHlsZScpIHx8ICdkZWZhdWx0JztcbiAgbGV0IGxhc3RDaGltZUhvdXIgPSAtMTtcbiAgbGV0IGNoaW1lUGxheWluZyA9IGZhbHNlO1xuICBsZXQgcHJldkZsaXBEaWdpdHMgPSAnJztcbiAgbGV0IGFjdGl2ZUxheW91dCA9ICcnO1xuICBsZXQgZGlnaXRhbFJlZnMgPSBudWxsO1xuICBsZXQgdGlja1RpbWVyID0gbnVsbDtcblxuICAvLyA9PT09PSBDSElNRVMgPT09PT1cbiAgZnVuY3Rpb24gcGxheUNoaW1lcyhjb3VudCkge1xuICAgIGlmIChjaGltZVBsYXlpbmcpIHJldHVybjtcbiAgICBpZiAoc2FmZUdldCgnY2xvY2stY2hpbWVzJykgIT09ICd0cnVlJykgcmV0dXJuO1xuICAgIGNoaW1lUGxheWluZyA9IHRydWU7XG4gICAgY29uc3Qgdm9sID0gcGFyc2VJbnQoc2FmZUdldCgnY2xvY2stY2hpbWUtdm9sdW1lJykgfHwgJzUwJywgMTApIC8gMTAwO1xuICAgIGxldCBpID0gMDtcbiAgICBmdW5jdGlvbiBzdHJpa2UoKSB7XG4gICAgICBpZiAoaSA+PSBjb3VudCkgeyBjaGltZVBsYXlpbmcgPSBmYWxzZTsgcmV0dXJuOyB9XG4gICAgICBjb25zdCBiZWxsID0gbmV3IEF1ZGlvKCcvYXNzZXRzL3NvdW5kcy9jaHVyY2gtYmVsbC5tcDMnKTtcbiAgICAgIGJlbGwudm9sdW1lID0gdm9sO1xuICAgICAgYmVsbC5wbGF5KCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgaSsrO1xuICAgICAgaWYgKGkgPCBjb3VudCkgc2V0VGltZW91dChzdHJpa2UsIDI1MDApO1xuICAgICAgZWxzZSBzZXRUaW1lb3V0KCgpID0+IHsgY2hpbWVQbGF5aW5nID0gZmFsc2U7IH0sIDI1MDApO1xuICAgIH1cbiAgICBzdHJpa2UoKTtcbiAgfVxuXG4gIC8vID09PT09IERBVEUgU1RSSU5HID09PT09XG4gIGZ1bmN0aW9uIGRhdGVTdHIobm93KSB7XG4gICAgcmV0dXJuIERBWVNbbm93LmdldERheSgpXSArICcsICcgKyBNT05USFNbbm93LmdldE1vbnRoKCldICsgJyAnICsgbm93LmdldERhdGUoKSArICcsICcgKyBub3cuZ2V0RnVsbFllYXIoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0UmVuZGVyTGF5b3V0KCkge1xuICAgIGFjdGl2ZUxheW91dCA9ICcnO1xuICAgIGRpZ2l0YWxSZWZzID0gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuc3VyZURpZ2l0YWxMYXlvdXQoKSB7XG4gICAgaWYgKGFjdGl2ZUxheW91dCAhPT0gJ2RpZ2l0YWwnKSB7XG4gICAgICByZW5kZXIuaW5uZXJIVE1MID1cbiAgICAgICAgJzxkaXYgY2xhc3M9XCJjbG9jay10aW1lXCI+PHNwYW4gY2xhc3M9XCJjbG9jay1tYWluXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwiY2xvY2stc2Vjb25kc1wiPjwvc3Bhbj48c3BhbiBjbGFzcz1cImNsb2NrLWFtcG1cIj48L3NwYW4+PC9kaXY+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwiY2xvY2stZGF0ZVwiPjwvZGl2Pic7XG4gICAgICBkaWdpdGFsUmVmcyA9IHtcbiAgICAgICAgbWFpbjogcmVuZGVyLnF1ZXJ5U2VsZWN0b3IoJy5jbG9jay1tYWluJyksXG4gICAgICAgIHNlY29uZHM6IHJlbmRlci5xdWVyeVNlbGVjdG9yKCcuY2xvY2stc2Vjb25kcycpLFxuICAgICAgICBhbXBtOiByZW5kZXIucXVlcnlTZWxlY3RvcignLmNsb2NrLWFtcG0nKSxcbiAgICAgICAgZGF0ZTogcmVuZGVyLnF1ZXJ5U2VsZWN0b3IoJy5jbG9jay1kYXRlJylcbiAgICAgIH07XG4gICAgICBhY3RpdmVMYXlvdXQgPSAnZGlnaXRhbCc7XG4gICAgfVxuICAgIHJldHVybiBkaWdpdGFsUmVmcztcbiAgfVxuXG4gIC8vID09PT09IFNUWUxFIFJFTkRFUkVSUyA9PT09PVxuXG4gIGZ1bmN0aW9uIHJlbmRlckRlZmF1bHQobm93KSB7XG4gICAgY29uc3QgaDI0ID0gbm93LmdldEhvdXJzKCksIG0gPSBub3cuZ2V0TWludXRlcygpLCBzID0gbm93LmdldFNlY29uZHMoKTtcbiAgICBjb25zdCBhbXBtID0gaDI0ID49IDEyID8gJ1BNJyA6ICdBTSc7XG4gICAgY29uc3QgaCA9IGgyNCAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IHJlZnMgPSBlbnN1cmVEaWdpdGFsTGF5b3V0KCk7XG4gICAgcmVmcy5tYWluLnRleHRDb250ZW50ID0gYCR7aH06JHtTdHJpbmcobSkucGFkU3RhcnQoMiwnMCcpfWA7XG4gICAgcmVmcy5zZWNvbmRzLnRleHRDb250ZW50ID0gYDoke1N0cmluZyhzKS5wYWRTdGFydCgyLCcwJyl9YDtcbiAgICByZWZzLmFtcG0udGV4dENvbnRlbnQgPSBhbXBtO1xuICAgIHJlZnMuZGF0ZS50ZXh0Q29udGVudCA9IGRhdGVTdHIobm93KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckxjZChub3csIGNscykge1xuICAgIGNvbnN0IGgyNCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3QgYW1wbSA9IGgyNCA+PSAxMiA/ICdQTScgOiAnQU0nO1xuICAgIGNvbnN0IGggPSBoMjQgJSAxMiB8fCAxMjtcbiAgICBjb25zdCByZWZzID0gZW5zdXJlRGlnaXRhbExheW91dCgpO1xuICAgIHJlZnMubWFpbi50ZXh0Q29udGVudCA9IGAke1N0cmluZyhoKS5wYWRTdGFydCgyLCcwJyl9OiR7U3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKX1gO1xuICAgIHJlZnMuc2Vjb25kcy50ZXh0Q29udGVudCA9IGA6JHtTdHJpbmcocykucGFkU3RhcnQoMiwnMCcpfWA7XG4gICAgcmVmcy5hbXBtLnRleHRDb250ZW50ID0gYW1wbTtcbiAgICByZWZzLmRhdGUudGV4dENvbnRlbnQgPSBkYXRlU3RyKG5vdyk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJGbGlwKG5vdykge1xuICAgIGNvbnN0IGgyNCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3QgYW1wbSA9IGgyNCA+PSAxMiA/ICdQTScgOiAnQU0nO1xuICAgIGNvbnN0IGggPSBoMjQgJSAxMiB8fCAxMjtcbiAgICBjb25zdCBkaWdpdHMgPSBTdHJpbmcoaCkucGFkU3RhcnQoMiwnICcpICsgU3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKSArIFN0cmluZyhzKS5wYWRTdGFydCgyLCcwJyk7XG5cbiAgICBsZXQgaHRtbCA9ICc8ZGl2IGNsYXNzPVwiZmxpcC1jbG9jay1yb3dcIj4nO1xuICAgIC8vIEhvdXJzXG4gICAgaHRtbCArPSBmbGlwQ2FyZChkaWdpdHNbMF0sIDApO1xuICAgIGh0bWwgKz0gZmxpcENhcmQoZGlnaXRzWzFdLCAxKTtcbiAgICBodG1sICs9ICc8c3BhbiBjbGFzcz1cImZsaXAtY29sb25cIj46PC9zcGFuPic7XG4gICAgLy8gTWludXRlc1xuICAgIGh0bWwgKz0gZmxpcENhcmQoZGlnaXRzWzJdLCAyKTtcbiAgICBodG1sICs9IGZsaXBDYXJkKGRpZ2l0c1szXSwgMyk7XG4gICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9XCJmbGlwLWNvbG9uXCI+Ojwvc3Bhbj4nO1xuICAgIC8vIFNlY29uZHNcbiAgICBodG1sICs9IGZsaXBDYXJkKGRpZ2l0c1s0XSwgNCk7XG4gICAgaHRtbCArPSBmbGlwQ2FyZChkaWdpdHNbNV0sIDUpO1xuICAgIGh0bWwgKz0gYDxzcGFuIGNsYXNzPVwiZmxpcC1hbXBtXCI+JHthbXBtfTwvc3Bhbj5gO1xuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cImNsb2NrLWRhdGVcIj4ke2RhdGVTdHIobm93KX08L2Rpdj5gO1xuICAgIHJlbmRlci5pbm5lckhUTUwgPSBodG1sO1xuICAgIGFjdGl2ZUxheW91dCA9ICdmbGlwJztcblxuICAgIC8vIFRyaWdnZXIgZmxpcCBhbmltYXRpb24gb24gY2hhbmdlZCBkaWdpdHNcbiAgICBpZiAocHJldkZsaXBEaWdpdHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgIGlmIChkaWdpdHNbaV0gIT09IHByZXZGbGlwRGlnaXRzW2ldKSB7XG4gICAgICAgICAgY29uc3QgY2FyZCA9IHJlbmRlci5xdWVyeVNlbGVjdG9yKGAuZmxpcC1jYXJkW2RhdGEtaWR4PVwiJHtpfVwiXWApO1xuICAgICAgICAgIGlmIChjYXJkKSBjYXJkLmNsYXNzTGlzdC5hZGQoJ2ZsaXBwaW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJldkZsaXBEaWdpdHMgPSBkaWdpdHM7XG4gIH1cblxuICBmdW5jdGlvbiBmbGlwQ2FyZChkaWdpdCwgaWR4KSB7XG4gICAgY29uc3QgZCA9IGRpZ2l0ID09PSAnICcgPyAnJyA6IGRpZ2l0O1xuICAgIHJldHVybiBgPGRpdiBjbGFzcz1cImZsaXAtY2FyZFwiIGRhdGEtaWR4PVwiJHtpZHh9XCI+PGRpdiBjbGFzcz1cImZsaXAtdG9wXCI+JHtkfTwvZGl2PjxkaXYgY2xhc3M9XCJmbGlwLWJvdHRvbVwiPiR7ZH08L2Rpdj48L2Rpdj5gO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQmluYXJ5KG5vdykge1xuICAgIGNvbnN0IGgyNCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3QgaCA9IGgyNCAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IGFtcG0gPSBoMjQgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICAvLyA2IGNvbHVtbnM6IEggdGVucywgSCBvbmVzLCBNIHRlbnMsIE0gb25lcywgUyB0ZW5zLCBTIG9uZXNcbiAgICBjb25zdCBjb2xzID0gW1xuICAgICAgTWF0aC5mbG9vcihoIC8gMTApLCBoICUgMTAsXG4gICAgICBNYXRoLmZsb29yKG0gLyAxMCksIG0gJSAxMCxcbiAgICAgIE1hdGguZmxvb3IocyAvIDEwKSwgcyAlIDEwXG4gICAgXTtcblxuICAgIGxldCBodG1sID0gJzxkaXYgY2xhc3M9XCJiaW5hcnktY2xvY2tcIj4nO1xuICAgIC8vIExhYmVsc1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJiaW5hcnktbGFiZWxzXCI+PHNwYW4+SDwvc3Bhbj48c3Bhbj5IPC9zcGFuPjxzcGFuPk08L3NwYW4+PHNwYW4+TTwvc3Bhbj48c3Bhbj5TPC9zcGFuPjxzcGFuPlM8L3NwYW4+PC9kaXY+JztcbiAgICAvLyA0IHJvd3MgZm9yIGJpdHMgOCw0LDIsMVxuICAgIGZvciAobGV0IGJpdCA9IDM7IGJpdCA+PSAwOyBiaXQtLSkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImJpbmFyeS1yb3dcIj4nO1xuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgNjsgY29sKyspIHtcbiAgICAgICAgY29uc3Qgb24gPSAoY29sc1tjb2xdID4+IGJpdCkgJiAxO1xuICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiYmluYXJ5LWRvdCAke29uID8gJ29uJyA6ICcnfVwiPjwvZGl2PmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIH1cbiAgICAvLyBWYWx1ZSByb3dcbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYmluYXJ5LXZhbHVlc1wiPic7XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgNjsgY29sKyspIHtcbiAgICAgIGh0bWwgKz0gYDxzcGFuPiR7Y29sc1tjb2xdfTwvc3Bhbj5gO1xuICAgIH1cbiAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJiaW5hcnktYW1wbVwiPiR7YW1wbX08L2Rpdj5gO1xuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cImNsb2NrLWRhdGVcIj4ke2RhdGVTdHIobm93KX08L2Rpdj5gO1xuICAgIHJlbmRlci5pbm5lckhUTUwgPSBodG1sO1xuICAgIGFjdGl2ZUxheW91dCA9ICdiaW5hcnknO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQW5hbG9nKG5vdywgdXNlUm9tYW4pIHtcbiAgICBjb25zdCBoID0gbm93LmdldEhvdXJzKCksIG0gPSBub3cuZ2V0TWludXRlcygpLCBzID0gbm93LmdldFNlY29uZHMoKTtcbiAgICBjb25zdCBzaXplID0gMTIwO1xuICAgIGNvbnN0IGN4ID0gc2l6ZSAvIDIsIGN5ID0gc2l6ZSAvIDI7XG5cbiAgICAvLyBBbmdsZXNcbiAgICBjb25zdCBzQW5nbGUgPSAocyAvIDYwKSAqIDM2MCAtIDkwO1xuICAgIGNvbnN0IG1BbmdsZSA9ICgobSArIHMgLyA2MCkgLyA2MCkgKiAzNjAgLSA5MDtcbiAgICBjb25zdCBoQW5nbGUgPSAoKChoICUgMTIpICsgbSAvIDYwKSAvIDEyKSAqIDM2MCAtIDkwO1xuXG4gICAgLy8gTnVtYmVyIGxhYmVsc1xuICAgIGxldCBsYWJlbHMgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAxMjsgaSsrKSB7XG4gICAgICBjb25zdCBhbmdsZSA9IChpIC8gMTIpICogMiAqIE1hdGguUEkgLSBNYXRoLlBJIC8gMjtcbiAgICAgIGNvbnN0IHIgPSA0NztcbiAgICAgIGNvbnN0IHggPSBjeCArIHIgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICBjb25zdCB5ID0gY3kgKyByICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgY29uc3QgbGFiZWwgPSB1c2VSb21hbiA/IFJPTUFOW2kgJSAxMl0gOiBpO1xuICAgICAgY29uc3QgZnMgPSB1c2VSb21hbiA/ICc3JyA6ICc5JztcbiAgICAgIGxhYmVscyArPSBgPHRleHQgeD1cIiR7eH1cIiB5PVwiJHt5fVwiIHRleHQtYW5jaG9yPVwibWlkZGxlXCIgZG9taW5hbnQtYmFzZWxpbmU9XCJjZW50cmFsXCIgZmlsbD1cInZhcigtLWZnKVwiIGZvbnQtc2l6ZT1cIiR7ZnN9XCIgZm9udC13ZWlnaHQ9XCI2MDBcIiBmb250LWZhbWlseT1cIidTYW1pIEdyb3Rlc2snLHNhbnMtc2VyaWZcIj4ke2xhYmVsfTwvdGV4dD5gO1xuICAgIH1cblxuICAgIC8vIFRpY2sgbWFya3NcbiAgICBsZXQgdGlja3MgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDYwOyBpKyspIHtcbiAgICAgIGNvbnN0IGFuZ2xlID0gKGkgLyA2MCkgKiAyICogTWF0aC5QSSAtIE1hdGguUEkgLyAyO1xuICAgICAgY29uc3Qgb3V0ZXIgPSA1NjtcbiAgICAgIGNvbnN0IGlubmVyID0gaSAlIDUgPT09IDAgPyA1MiA6IDU0O1xuICAgICAgY29uc3QgeDEgPSBjeCArIGlubmVyICogTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgY29uc3QgeTEgPSBjeSArIGlubmVyICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgY29uc3QgeDIgPSBjeCArIG91dGVyICogTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgY29uc3QgeTIgPSBjeSArIG91dGVyICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgY29uc3QgdyA9IGkgJSA1ID09PSAwID8gMS41IDogMC41O1xuICAgICAgdGlja3MgKz0gYDxsaW5lIHgxPVwiJHt4MX1cIiB5MT1cIiR7eTF9XCIgeDI9XCIke3gyfVwiIHkyPVwiJHt5Mn1cIiBzdHJva2U9XCJ2YXIoLS1tdXRlZClcIiBzdHJva2Utd2lkdGg9XCIke3d9XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5gO1xuICAgIH1cblxuICAgIGNvbnN0IHN2ZyA9IGA8c3ZnIGNsYXNzPVwiYW5hbG9nLWNsb2NrLXN2Z1wiIHZpZXdCb3g9XCIwIDAgJHtzaXplfSAke3NpemV9XCIgd2lkdGg9XCIke3NpemV9XCIgaGVpZ2h0PVwiJHtzaXplfVwiPlxuICAgICAgPGNpcmNsZSBjeD1cIiR7Y3h9XCIgY3k9XCIke2N5fVwiIHI9XCI1OFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwidmFyKC0tYm9yZGVyKVwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XG4gICAgICAke3RpY2tzfVxuICAgICAgJHtsYWJlbHN9XG4gICAgICA8bGluZSB4MT1cIiR7Y3h9XCIgeTE9XCIke2N5fVwiIHgyPVwiJHtjeCArIDI4ICogTWF0aC5jb3MoaEFuZ2xlICogTWF0aC5QSSAvIDE4MCl9XCIgeTI9XCIke2N5ICsgMjggKiBNYXRoLnNpbihoQW5nbGUgKiBNYXRoLlBJIC8gMTgwKX1cIiBzdHJva2U9XCJ2YXIoLS1mZylcIiBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgIDxsaW5lIHgxPVwiJHtjeH1cIiB5MT1cIiR7Y3l9XCIgeDI9XCIke2N4ICsgMzggKiBNYXRoLmNvcyhtQW5nbGUgKiBNYXRoLlBJIC8gMTgwKX1cIiB5Mj1cIiR7Y3kgKyAzOCAqIE1hdGguc2luKG1BbmdsZSAqIE1hdGguUEkgLyAxODApfVwiIHN0cm9rZT1cInZhcigtLWZnKVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgPGxpbmUgeDE9XCIke2N4fVwiIHkxPVwiJHtjeX1cIiB4Mj1cIiR7Y3ggKyA0MiAqIE1hdGguY29zKHNBbmdsZSAqIE1hdGguUEkgLyAxODApfVwiIHkyPVwiJHtjeSArIDQyICogTWF0aC5zaW4oc0FuZ2xlICogTWF0aC5QSSAvIDE4MCl9XCIgc3Ryb2tlPVwiI2U3NGMzY1wiIHN0cm9rZS13aWR0aD1cIjFcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgPGNpcmNsZSBjeD1cIiR7Y3h9XCIgY3k9XCIke2N5fVwiIHI9XCIzXCIgZmlsbD1cInZhcigtLWZnKVwiLz5cbiAgICA8L3N2Zz5gO1xuXG4gICAgY29uc3QgYW1wbSA9IG5vdy5nZXRIb3VycygpID49IDEyID8gJ1BNJyA6ICdBTSc7XG4gICAgcmVuZGVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwiYW5hbG9nLWNsb2NrLXdyYXBcIj4ke3N2Z308ZGl2IGNsYXNzPVwiYW5hbG9nLWluZm9cIj48c3BhbiBjbGFzcz1cImFuYWxvZy1kaWdpdGFsXCI+JHsobm93LmdldEhvdXJzKCkgJSAxMiB8fCAxMil9OiR7U3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKX0gJHthbXBtfTwvc3Bhbj48c3BhbiBjbGFzcz1cImFuYWxvZy1kYXRlLXNtXCI+JHtkYXRlU3RyKG5vdyl9PC9zcGFuPjwvZGl2PjwvZGl2PmA7XG4gICAgYWN0aXZlTGF5b3V0ID0gJ2FuYWxvZyc7XG4gIH1cblxuICAvLyA9PT09PSBNQUlOIFRJQ0sgPT09PT1cbiAgZnVuY3Rpb24gdGljaygpIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGggPSBub3cuZ2V0SG91cnMoKSAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IG0gPSBub3cuZ2V0TWludXRlcygpO1xuICAgIGNvbnN0IHMgPSBub3cuZ2V0U2Vjb25kcygpO1xuXG4gICAgLy8gU2V0IHN0eWxlIGNsYXNzIG9uIHdpZGdldFxuICAgIGNvbnN0IG5leHRDbGFzc05hbWUgPSAnY2xvY2std2lkZ2V0JyArIChjdXJyZW50U3R5bGUgIT09ICdkZWZhdWx0JyA/ICcgJyArIGN1cnJlbnRTdHlsZSA6ICcnKTtcbiAgICBpZiAod2lkZ2V0LmNsYXNzTmFtZSAhPT0gbmV4dENsYXNzTmFtZSkge1xuICAgICAgd2lkZ2V0LmNsYXNzTmFtZSA9IG5leHRDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjdXJyZW50U3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xjZCc6IHJlbmRlckxjZChub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2xjZC1ibHVlJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnbGNkLWFtYmVyJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnbGNkLXJldHJvJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnbGNkLXRheGknOiByZW5kZXJMY2Qobm93KTsgYnJlYWs7XG4gICAgICBjYXNlICdmbGlwJzogcmVuZGVyRmxpcChub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2JpbmFyeSc6IHJlbmRlckJpbmFyeShub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2FuYWxvZyc6IHJlbmRlckFuYWxvZyhub3csIGZhbHNlKTsgYnJlYWs7XG4gICAgICBjYXNlICdyb21hbic6IHJlbmRlckFuYWxvZyhub3csIHRydWUpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHJlbmRlckRlZmF1bHQobm93KTtcbiAgICB9XG5cbiAgICAvLyBIb3VybHkgY2hpbWVzXG4gICAgaWYgKG0gPT09IDAgJiYgcyA9PT0gMCAmJiBoICE9PSBsYXN0Q2hpbWVIb3VyKSB7XG4gICAgICBsYXN0Q2hpbWVIb3VyID0gaDtcbiAgICAgIHBsYXlDaGltZXMoaCk7XG4gICAgfVxuICAgIGlmIChtICE9PSAwKSBsYXN0Q2hpbWVIb3VyID0gLTE7XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZU5leHRUaWNrKCkge1xuICAgIGNsZWFyVGltZW91dCh0aWNrVGltZXIpO1xuICAgIGNvbnN0IGludGVydmFsID0gZG9jdW1lbnQuaGlkZGVuID8gNjAwMDAgOiAxMDAwO1xuICAgIGNvbnN0IGRlbGF5ID0gaW50ZXJ2YWwgLSAoRGF0ZS5ub3coKSAlIGludGVydmFsKSArIDI1O1xuICAgIHRpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGljaygpO1xuICAgICAgc2NoZWR1bGVOZXh0VGljaygpO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7XG4gICAgcHJldkZsaXBEaWdpdHMgPSAnJztcbiAgICByZXNldFJlbmRlckxheW91dCgpO1xuICAgIHRpY2soKTtcbiAgICBzY2hlZHVsZU5leHRUaWNrKCk7XG4gIH0pO1xuXG4gIHRpY2soKTtcbiAgc2NoZWR1bGVOZXh0VGljaygpO1xuXG4gIC8vID09PT09IFNFVFRJTkdTIE1PREFMID09PT09XG4gIGNvbnN0IFNUWUxFUyA9IFtcbiAgICB7IGlkOiAnZGVmYXVsdCcsIGxhYmVsOiAnRGVmYXVsdCcsIGljb246ICdcdUQ4M0RcdURENTAnIH0sXG4gICAgeyBpZDogJ2xjZCcsIGxhYmVsOiAnTENEIEdyZWVuJywgaWNvbjogJ1x1RDgzRFx1REM5QScgfSxcbiAgICB7IGlkOiAnbGNkLWJsdWUnLCBsYWJlbDogJ0xDRCBCbHVlJywgaWNvbjogJ1x1RDgzRFx1REM5OScgfSxcbiAgICB7IGlkOiAnbGNkLWFtYmVyJywgbGFiZWw6ICdMQ0QgQW1iZXInLCBpY29uOiAnXHVEODNEXHVERkUwJyB9LFxuICAgIHsgaWQ6ICdsY2QtcmV0cm8nLCBsYWJlbDogJ0xDRCBSZXRybycsIGljb246ICdcdUQ4M0RcdURGRTknIH0sXG4gICAgeyBpZDogJ2xjZC10YXhpJywgbGFiZWw6ICdMQ0QgVGF4aScsIGljb246ICdcdUQ4M0RcdURGRTEnIH0sXG4gICAgeyBpZDogJ2ZsaXAnLCBsYWJlbDogJ0ZsaXAgQ2xvY2snLCBpY29uOiAnXHVEODNEXHVEQ0RGJyB9LFxuICAgIHsgaWQ6ICdiaW5hcnknLCBsYWJlbDogJ0JpbmFyeScsIGljb246ICdcdUQ4M0RcdURDQkInIH0sXG4gICAgeyBpZDogJ2FuYWxvZycsIGxhYmVsOiAnQW5hbG9nJywgaWNvbjogJ1x1MjNGMCcgfSxcbiAgICB7IGlkOiAncm9tYW4nLCBsYWJlbDogJ1JvbWFuJywgaWNvbjogJ1x1RDgzQ1x1REZEQlx1RkUwRicgfSxcbiAgXTtcblxuICBsZXQgc3R5bGVPcHRpb25zSHRtbCA9ICc8ZGl2IGNsYXNzPVwiY2xvY2stc3R5bGUtZ3JpZFwiPic7XG4gIFNUWUxFUy5mb3JFYWNoKHMgPT4ge1xuICAgIHN0eWxlT3B0aW9uc0h0bWwgKz0gYDxsYWJlbCBjbGFzcz1cImNsb2NrLXN0eWxlLW9wdGlvblwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJjbG9jay1zdHlsZS1yYWRpb1wiIHZhbHVlPVwiJHtzLmlkfVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjbG9jay1zdHlsZS1jYXJkXCI+PHNwYW4gY2xhc3M9XCJjbG9jay1zdHlsZS1pY29uXCI+JHtzLmljb259PC9zcGFuPjxzcGFuIGNsYXNzPVwiY2xvY2stc3R5bGUtbGFiZWxcIj4ke3MubGFiZWx9PC9zcGFuPjwvc3Bhbj5cbiAgICA8L2xhYmVsPmA7XG4gIH0pO1xuICBzdHlsZU9wdGlvbnNIdG1sICs9ICc8L2Rpdj4nO1xuXG4gIGluamVjdE1vZGFsKCdjbG9jay1zZXR0aW5ncy1tb2RhbCcsIGA8ZGl2IGlkPVwiY2xvY2stc2V0dGluZ3MtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtYXgtd2lkdGg6IDQyMHB4O1wiPlxuICAgICAgPGgzPkNsb2NrIFNldHRpbmdzPC9oMz5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogOHB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tZmcpO1wiPlN0eWxlPC9sYWJlbD5cbiAgICAgICAgJHtzdHlsZU9wdGlvbnNIdG1sfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tZmcpO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImNsb2NrLWNoaW1lcy10b2dnbGVcIj4gSG91cmx5IGNodXJjaCBiZWxsIGNoaW1lc1xuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7IG1hcmdpbi1sZWZ0OiAyNHB4O1wiPlxuICAgICAgICAgIFN0cmlrZXMgdGhlIG51bWJlciBvZiB0aGUgaG91ciAoZS5nLiwgMyBiZWxscyBhdCAzOjAwKVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCIgaWQ9XCJjbG9jay12b2x1bWUtc2VjdGlvblwiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tZmcpO1wiPlZvbHVtZTwvbGFiZWw+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07XCI+XHVEODNEXHVERDA4PC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBpZD1cImNsb2NrLWNoaW1lLXZvbHVtZVwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiB2YWx1ZT1cIjUwXCIgc3R5bGU9XCJmbGV4OiAxOyBhY2NlbnQtY29sb3I6IHZhcigtLW9rLWZnKTtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdUREMEE8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNsb2NrLWNoaW1lLXRlc3RcIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyO1wiPlRlc3Q8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsb2NrLXNldHRpbmdzLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2xvY2stc2V0dGluZ3Mtc2F2ZVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1zZXR0aW5ncy1tb2RhbCcpO1xuICBjb25zdCBjaGltZXNUb2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stY2hpbWVzLXRvZ2dsZScpO1xuICBjb25zdCB2b2x1bWVTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stY2hpbWUtdm9sdW1lJyk7XG4gIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stdm9sdW1lLXNlY3Rpb24nKTtcblxuICBmdW5jdGlvbiBsb2FkU2V0dGluZ3MoKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBzYWZlR2V0KCdjbG9jay1zdHlsZScpIHx8ICdkZWZhdWx0JztcbiAgICBjb25zdCByYWRpbyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoYGlucHV0W3ZhbHVlPVwiJHtzdHlsZX1cIl1gKTtcbiAgICBpZiAocmFkaW8pIHJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgIGNoaW1lc1RvZ2dsZS5jaGVja2VkID0gc2FmZUdldCgnY2xvY2stY2hpbWVzJykgPT09ICd0cnVlJztcbiAgICB2b2x1bWVTbGlkZXIudmFsdWUgPSBzYWZlR2V0KCdjbG9jay1jaGltZS12b2x1bWUnKSB8fCAnNTAnO1xuICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUub3BhY2l0eSA9IGNoaW1lc1RvZ2dsZS5jaGVja2VkID8gJzEnIDogJzAuNCc7XG4gIH1cblxuICBjaGltZXNUb2dnbGU/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLm9wYWNpdHkgPSBjaGltZXNUb2dnbGUuY2hlY2tlZCA/ICcxJyA6ICcwLjQnO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stc2V0dGluZ3MnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbG9hZFNldHRpbmdzKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stY2hpbWUtdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCB2b2wgPSBwYXJzZUludCh2b2x1bWVTbGlkZXIudmFsdWUsIDEwKSAvIDEwMDtcbiAgICBjb25zdCBiZWxsID0gbmV3IEF1ZGlvKCcvYXNzZXRzL3NvdW5kcy9jaHVyY2gtYmVsbC5tcDMnKTtcbiAgICBiZWxsLnZvbHVtZSA9IHZvbDtcbiAgICBiZWxsLnBsYXkoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1zZXR0aW5ncy1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImNsb2NrLXN0eWxlLXJhZGlvXCJdOmNoZWNrZWQnKTtcbiAgICBjb25zdCBzdHlsZSA9IHJhZGlvID8gcmFkaW8udmFsdWUgOiAnZGVmYXVsdCc7XG4gICAgc2FmZVNldCgnY2xvY2stc3R5bGUnLCBzdHlsZSk7XG4gICAgc2FmZVNldCgnY2xvY2stY2hpbWVzJywgU3RyaW5nKGNoaW1lc1RvZ2dsZS5jaGVja2VkKSk7XG4gICAgc2FmZVNldCgnY2xvY2stY2hpbWUtdm9sdW1lJywgdm9sdW1lU2xpZGVyLnZhbHVlKTtcbiAgICBjdXJyZW50U3R5bGUgPSBzdHlsZTtcbiAgICBwcmV2RmxpcERpZ2l0cyA9ICcnO1xuICAgIHJlc2V0UmVuZGVyTGF5b3V0KCk7XG4gICAgdGljaygpO1xuICAgIHNjaGVkdWxlTmV4dFRpY2soKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgc2hvd05vdGlmaWNhdGlvbignQ2xvY2sgc2V0dGluZ3Mgc2F2ZWQnLCAnc3VjY2VzcycsIDIwMDApO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stc2V0dGluZ3MtY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgd2lyZU1vZGFsKG1vZGFsKTtcblxuICAvLyBMaXZlIHByZXZpZXcgd2hlbiBjbGlja2luZyBzdHlsZSBvcHRpb25zXG4gIG1vZGFsPy5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwiY2xvY2stc3R5bGUtcmFkaW9cIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICByYWRpby5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjdXJyZW50U3R5bGUgPSByYWRpby52YWx1ZTtcbiAgICAgIHByZXZGbGlwRGlnaXRzID0gJyc7XG4gICAgICByZXNldFJlbmRlckxheW91dCgpO1xuICAgICAgdGljaygpO1xuICAgIH0pO1xuICB9KTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENBUkQgSEVBTFRIICYgVVBEQVRFIEJBREdFUyA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIC8vIEZldGNoIGhlYWx0aCBkYXRhIGFuZCB1cGRhdGUgY2FyZCBVSVxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoQ2FyZEhlYWx0aCgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEuc3RhdHVzKSByZXR1cm47XG5cbiAgICAgIGZvciAoY29uc3QgW3NlcnZpY2VJZCwgc3ZjXSBvZiBPYmplY3QuZW50cmllcyhkYXRhLnN0YXR1cykpIHtcbiAgICAgICAgY29uc3QgdXB0aW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXB0aW1lLScgKyBzZXJ2aWNlSWQpO1xuICAgICAgICBjb25zdCBiYXJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cHRpbWUtYmFyLScgKyBzZXJ2aWNlSWQpO1xuICAgICAgICBpZiAoIXVwdGltZUVsKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCB1cHRpbWUyNCA9IHN2Yy51cHRpbWU/LlsnMjRoJ107XG4gICAgICAgIGlmICh1cHRpbWUyNCAhPT0gdW5kZWZpbmVkICYmIHVwdGltZTI0ICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgcGN0ID0gdXB0aW1lMjQudG9GaXhlZCgxKTtcbiAgICAgICAgICB1cHRpbWVFbC50ZXh0Q29udGVudCA9IGAke3BjdH0lIHVwdGltZWA7XG4gICAgICAgICAgLy8gQ29sb3IgY2xhc3NcbiAgICAgICAgICB1cHRpbWVFbC5jbGFzc05hbWUgPSAndXB0aW1lLWNoaXAnO1xuICAgICAgICAgIGlmICh1cHRpbWUyNCA+PSA5OS45KSB1cHRpbWVFbC5jbGFzc0xpc3QuYWRkKCdleGNlbGxlbnQnKTtcbiAgICAgICAgICBlbHNlIGlmICh1cHRpbWUyNCA+PSA5OSkgdXB0aW1lRWwuY2xhc3NMaXN0LmFkZCgnZ29vZCcpO1xuICAgICAgICAgIGVsc2UgaWYgKHVwdGltZTI0ID49IDk1KSB1cHRpbWVFbC5jbGFzc0xpc3QuYWRkKCdkZWdyYWRlZCcpO1xuICAgICAgICAgIGVsc2UgdXB0aW1lRWwuY2xhc3NMaXN0LmFkZCgncG9vcicpO1xuXG4gICAgICAgICAgaWYgKGJhckVsKSBiYXJFbC5zdHlsZS53aWR0aCA9IHBjdCArICclJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIC8qIEhlYWx0aCBjaGVjayBBUEkgdW5hdmFpbGFibGUgXHUyMDE0IHVwdGltZSBjaGlwcyBzdGF5IGhpZGRlbiAqL1xuICAgICAgY29uc29sZS53YXJuKCdbQ2FyZCBCYWRnZXNdIEhlYWx0aCBjaGVjayBBUEkgdW5hdmFpbGFibGUnKTtcbiAgICB9XG4gIH1cblxuICAvLyBUcmFjayBkaXNtaXNzZWQgdXBkYXRlcyAocGVyIHNlc3Npb24pXG4gIGxldCBkaXNtaXNzZWRVcGRhdGVzO1xuICB0cnkge1xuICAgIGRpc21pc3NlZFVwZGF0ZXMgPSBuZXcgU2V0KEpTT04ucGFyc2Uoc2FmZVNlc3Npb25HZXQoJ2Rpc21pc3NlZC11cGRhdGVzJykgfHwgJ1tdJykpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgLyogU2Vzc2lvbiBzdG9yYWdlIHVuYXZhaWxhYmxlICovXG4gICAgZGlzbWlzc2VkVXBkYXRlcyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIC8vIFRyYWNrIGdsb2JhbCB1cGRhdGUgc3RhdGUgZm9yIGNyb3NzLWNvbXBvbmVudCBhY2Nlc3NcbiAgbGV0IGtub3duVXBkYXRlcyA9IFtdO1xuXG4gIC8vIEZldGNoIHVwZGF0ZSBkYXRhIGFuZCBzaG93IGJhZGdlc1xuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoQ2FyZFVwZGF0ZXMobm90aWZ5TmV3KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3VwZGF0ZXMvYXZhaWxhYmxlJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSByZXR1cm47XG5cbiAgICAgIC8vIENsZWFyIGFsbCB1cGRhdGUgYmFkZ2VzIGZpcnN0XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXBkYXRlLWF2YWlsYWJsZS1iYWRnZScpLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpKTtcblxuICAgICAgY29uc3QgdXBkYXRlcyA9IGRhdGEudXBkYXRlcyB8fCBbXTtcbiAgICAgIGtub3duVXBkYXRlcyA9IHVwZGF0ZXM7IC8vIHN0b3JlIGdsb2JhbGx5XG5cbiAgICAgIC8vIE5vdGlmeSBpZiBuZXcgdXBkYXRlcyBhcHBlYXJlZCAocGVyaW9kaWMgY2hlY2sgd2l0aCBub3RpZmljYXRpb24pXG4gICAgICBpZiAobm90aWZ5TmV3ICYmIHVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gd2luZG93Ll9sYXN0S25vd25VcGRhdGVDb3VudCB8fCAwO1xuICAgICAgICBpZiAocHJldiA+IDAgJiYgdXBkYXRlcy5sZW5ndGggPiBwcmV2KSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHt1cGRhdGVzLmxlbmd0aH0gY29udGFpbmVyIHVwZGF0ZShzKSBhdmFpbGFibGUgXHUyMDE0IGNsaWNrIFVwZGF0ZSBNYW5hZ2VtZW50IHRvIHJldmlldy5gLCAnaW5mbycpO1xuICAgICAgICB9XG4gICAgICAgIHdpbmRvdy5fbGFzdEtub3duVXBkYXRlQ291bnQgPSB1cGRhdGVzLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKCF1cGRhdGVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICBmb3IgKGNvbnN0IHVwZCBvZiB1cGRhdGVzKSB7XG4gICAgICAgIC8vIFRyeSB0byBtYXRjaCBieSBjb250YWluZXIgbmFtZSB0byBzZXJ2aWNlIGlkXG4gICAgICAgIGNvbnN0IGFwcHMgPSB3aW5kb3cuQVBQUyB8fCBbXTtcbiAgICAgICAgZm9yIChjb25zdCBhcHAgb2YgYXBwcykge1xuICAgICAgICAgIGlmIChhcHAuY29udGFpbmVySWQgPT09IHVwZC5jb250YWluZXJJZCB8fCBhcHAuaWQgPT09IHVwZC5jb250YWluZXJOYW1lIHx8IGFwcC5uYW1lID09PSB1cGQuY29udGFpbmVyTmFtZSkge1xuICAgICAgICAgICAgLy8gU2tpcCBkaXNtaXNzZWQgdXBkYXRlc1xuICAgICAgICAgICAgaWYgKGRpc21pc3NlZFVwZGF0ZXMuaGFzKGFwcC5pZCkpIGJyZWFrO1xuICAgICAgICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlLWJhZGdlLScgKyBhcHAuaWQpO1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZS1idG4tJyArIGFwcC5pZCk7XG4gICAgICAgICAgICBpZiAoYmFkZ2UpIHtcbiAgICAgICAgICAgICAgYmFkZ2UuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuICAgICAgICAgICAgICBiYWRnZS50aXRsZSA9IGBVcGRhdGUgYXZhaWxhYmxlIFx1MjAxNCBjbGljayB0byBvcGVuIFVwZGF0ZSBNYW5hZ2VtZW50LmA7XG4gICAgICAgICAgICAgIGJhZGdlLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgICAgICAgICAgICAgYmFkZ2Uub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAvLyBPcGVuIFVwZGF0ZSBNYW5hZ2VtZW50IG1vZGFsIGZvY3VzZWQgb24gdGhpcyBhcHBcbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lm9wZW5VcGRhdGVNb2RhbCkgd2luZG93Lm9wZW5VcGRhdGVNb2RhbChhcHAuaWQpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGlnaGxpZ2h0IHVwZGF0ZSBidXR0b24gaWYgdXBkYXRlIGlzIGF2YWlsYWJsZVxuICAgICAgICAgICAgaWYgKHVwZGF0ZUJ0bikge1xuICAgICAgICAgICAgICB1cGRhdGVCdG4uc3R5bGUuYmFja2dyb3VuZCA9ICcjZjk3MzE2JztcbiAgICAgICAgICAgICAgdXBkYXRlQnRuLnN0eWxlLmJvcmRlckNvbG9yID0gJyNmOTczMTYnO1xuICAgICAgICAgICAgICB1cGRhdGVCdG4uc3R5bGUuYm94U2hhZG93ID0gJzAgMCA2cHggI2Y5NzMxNjg4JztcbiAgICAgICAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gYFVwZGF0ZSBhdmFpbGFibGUgXHUyMDE0IGNsaWNrIHRvIG9wZW4gVXBkYXRlIE1hbmFnZW1lbnQuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIC8qIFVwZGF0ZXMgQVBJIHVuYXZhaWxhYmxlIFx1MjAxNCBiYWRnZXMgc3RheSBoaWRkZW4gKi9cbiAgICAgIGNvbnNvbGUud2FybignW0NhcmQgQmFkZ2VzXSBVcGRhdGVzIEFQSSB1bmF2YWlsYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJ1biBoZWFsdGggYW5kIHVwZGF0ZSBjaGVja3MgYWZ0ZXIgbWFpbiByZWZyZXNoLCBhbmQgcGVyaW9kaWNhbGx5XG4gIGZ1bmN0aW9uIHNjaGVkdWxlQ2FyZEVuaGFuY2VtZW50cygpIHtcbiAgICAvLyBJbml0aWFsIGxvYWQgKGRlbGF5ZWQgdG8gbm90IGNvbXBldGUgd2l0aCBtYWluIHByb2JlIGNoZWNrcylcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlZnJlc2hDYXJkSGVhbHRoKCk7XG4gICAgICByZWZyZXNoQ2FyZFVwZGF0ZXMoKTtcbiAgICB9LCA1MDAwKTtcblxuICAgIC8vIFBlcmlvZGljIHJlZnJlc2ggZXZlcnkgNjAgc2Vjb25kcyBcdTIwMTQgbm90aWZ5IG9uIG5ldyB1cGRhdGVzIGRldGVjdGVkXG4gICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgcmVmcmVzaENhcmRIZWFsdGgoKTtcbiAgICAgIHJlZnJlc2hDYXJkVXBkYXRlcyh0cnVlKTsgLy8gdHJ1ZSA9IG5vdGlmeSBpZiBuZXcgdXBkYXRlcyBmb3VuZFxuICAgIH0sIDYwMDAwKTtcbiAgfVxuXG4gIC8vIEhvb2sgaW50byBtYWluIHJlZnJlc2ggY3ljbGVcbiAgY29uc3Qgb3JpZ1JlZnJlc2hBbGwgPSB3aW5kb3cucmVmcmVzaEFsbDtcbiAgaWYgKG9yaWdSZWZyZXNoQWxsKSB7XG4gICAgd2luZG93LnJlZnJlc2hBbGwgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9yaWdSZWZyZXNoQWxsKCk7XG4gICAgICAgIC8vIFJlZnJlc2ggaGVhbHRoIGRhdGEgYWZ0ZXIgbWFpbiBzdGF0dXMgY2hlY2tcbiAgICAgICAgc2V0VGltZW91dChyZWZyZXNoQ2FyZEhlYWx0aCwgMTAwMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW0NhcmQgQmFkZ2VzXSBFcnJvciBpbiByZWZyZXNoQWxsIGhvb2s6JywgZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc2NoZWR1bGVDYXJkRW5oYW5jZW1lbnRzKCk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBUSEVNRSBQSUNLRVIgKyBUSEVNRSBCVUlMREVSID09PT09PT09PT1cbihmdW5jdGlvbiAoKSB7XG4gIHZhciB0aGVtZUJlZm9yZUJ1aWxkZXIgPSBudWxsO1xuICB2YXIgZWRpdGluZ1NsdWcgPSBudWxsO1xuICB2YXIgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTsgLy8gdHJhY2tzIHdoaWNoIGFkdmFuY2VkIGZpZWxkcyB1c2VyIG1hbnVhbGx5IGNoYW5nZWRcblxuICAvLyBEaXNwbGF5IG5hbWVzIGZvciBidWlsdC1pbiB0aGVtZXNcbiAgdmFyIFRIRU1FX0xBQkVMUyA9IHtcbiAgICBkYXJrOiAnRGFyaycsXG4gICAgbGlnaHQ6ICdMaWdodCcsXG4gICAgYmx1ZTogJ0JsdWUnLFxuICAgIGJsYWNrOiAnQmxhY2snLFxuICAgIG5vcmQ6ICdOb3JkJyxcbiAgICBkcmFjdWxhOiAnRHJhY3VsYScsXG4gICAgJ3NvbGFyaXplZC1kYXJrJzogJ1NvbGFyaXplZCBEYXJrJyxcbiAgICAnc29sYXJpemVkLWxpZ2h0JzogJ1NvbGFyaXplZCBMaWdodCcsXG4gICAgdGF4aTogJ1RheGknLFxuICAgIG9jZWFuOiAnT2NlYW4nLFxuICB9O1xuXG4gIC8vIENvbG9yIHBpY2tlciBmaWVsZCBkZWZpbml0aW9uczogW2Nzcy1wcm9wLCBsYWJlbCwgc2VjdGlvbl1cbiAgdmFyIEZJRUxEUyA9IFtcbiAgICBbJ2JnJywgICAgICAgICAgICAnQmFja2dyb3VuZCcsICAgICdiYXNlJ10sXG4gICAgWydjYXJkLWJhc2UnLCAgICAgJ0NhcmQnLCAgICAgICAgICAnYmFzZSddLFxuICAgIFsnZmcnLCAgICAgICAgICAgICdUZXh0JywgICAgICAgICAgJ2Jhc2UnXSxcbiAgICBbJ211dGVkJywgICAgICAgICAnTXV0ZWQgVGV4dCcsICAgICdiYXNlJ10sXG4gICAgWydib3JkZXInLCAgICAgICAgJ0JvcmRlcicsICAgICAgICAnYmFzZSddLFxuICAgIFsnYWNjZW50JywgICAgICAgICdBY2NlbnQnLCAgICAgICAgJ2FjY2VudCddLFxuICAgIFsnYWNjZW50LXN0cm9uZycsICdBY2NlbnQgU3Ryb25nJywgJ2FjY2VudCddLFxuICAgIFsnb2stYmcnLCAgICAgICAgICdPSyBCYWNrZ3JvdW5kJywgJ3N0YXR1cyddLFxuICAgIFsnb2stZmcnLCAgICAgICAgICdPSyBUZXh0JywgICAgICAgJ3N0YXR1cyddLFxuICAgIFsnYmFkLWJnJywgICAgICAgICdFcnJvciBCZycsICAgICAgJ3N0YXR1cyddLFxuICAgIFsnYmFkLWZnJywgICAgICAgICdFcnJvciBUZXh0JywgICAgJ3N0YXR1cyddLFxuICAgIFsnZG90LW9rJywgICAgICAgICdEb3QgT0snLCAgICAgICAgJ3N0YXR1cyddLFxuICAgIFsnZG90LWJhZCcsICAgICAgICdEb3QgRXJyb3InLCAgICAgJ3N0YXR1cyddLFxuICAgIFsndXB0aW1lJywgICAgICAgICdVcHRpbWUgQmFyJywgICAgJ3N0YXR1cyddLFxuICAgIFsnaG92ZXInLCAgICAgICAgICdIb3ZlcicsICAgICAgICAgJ2FkdmFuY2VkJ10sXG4gICAgWydjYXJkLWhvdmVyJywgICAgJ0NhcmQgSG92ZXInLCAgICAnYWR2YW5jZWQnXSxcbiAgICBbJ2Jhc2UnLCAgICAgICAgICAnVGFncy9CYWRnZXMnLCAgICdhZHZhbmNlZCddLFxuICAgIFsnZmctbXV0ZWQnLCAgICAgICdEaW0gVGV4dCcsICAgICAgJ2FkdmFuY2VkJ10sXG4gICAgWydzdWNjZXNzJywgICAgICAgJ1N1Y2Nlc3MnLCAgICAgICAnYWR2YW5jZWQnXSxcbiAgICBbJ2Vycm9yJywgICAgICAgICAnRXJyb3InLCAgICAgICAgICdhZHZhbmNlZCddLFxuICAgIFsnd2FybmluZycsICAgICAgICdXYXJuaW5nJywgICAgICAgJ2FkdmFuY2VkJ10sXG4gIF07XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFRoZW1lIEN5Y2xlIEJ1dHRvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICB2YXIgdGhlbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUnKTtcbiAgaWYgKCF0aGVtZUJ0bikgcmV0dXJuO1xuICB2YXIgdGhlbWVMYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1sYWJlbCcpO1xuXG4gIGZ1bmN0aW9uIGdldExhYmVsRm9yKHQpIHtcbiAgICBpZiAoVEhFTUVfTEFCRUxTW3RdKSByZXR1cm4gVEhFTUVfTEFCRUxTW3RdO1xuICAgIHZhciB1c2VyVGhlbWVzID0gc2FmZUdldEpTT04od2luZG93LlVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIGlmICh1c2VyVGhlbWVzW3RdKSByZXR1cm4gdXNlclRoZW1lc1t0XS5uYW1lIHx8IHQ7XG4gICAgcmV0dXJuIHQ7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVMYWJlbCgpIHtcbiAgICBpZiAodGhlbWVMYWJlbCkgdGhlbWVMYWJlbC50ZXh0Q29udGVudCA9IGdldExhYmVsRm9yKHdpbmRvdy5nZXRBY3RpdmVUaGVtZSgpKTtcbiAgfVxuXG4gIHRoZW1lQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBsaXN0ID0gd2luZG93LlRIRU1FUy5zbGljZSgpO1xuICAgIHZhciBjdXJyZW50ID0gd2luZG93LmdldEFjdGl2ZVRoZW1lKCk7XG4gICAgdmFyIGlkeCA9IGxpc3QuaW5kZXhPZihjdXJyZW50KTtcbiAgICB2YXIgbmV4dCA9IGxpc3RbKGlkeCArIDEpICUgbGlzdC5sZW5ndGhdO1xuICAgIHdpbmRvdy5hcHBseVRoZW1lKG5leHQpO1xuICAgIHVwZGF0ZUxhYmVsKCk7XG4gIH0pO1xuXG4gIHVwZGF0ZUxhYmVsKCk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFRoZW1lIEJ1aWxkZXIgTW9kYWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gYnVpbGRGaWVsZHNIVE1MKCkge1xuICAgIHZhciBzZWN0aW9ucyA9IHsgYmFzZTogJ0Jhc2UgQ29sb3JzJywgYWNjZW50OiAnQWNjZW50Jywgc3RhdHVzOiAnU3RhdHVzJywgYWR2YW5jZWQ6ICdBZHZhbmNlZCAoYXV0by1kZXJpdmVkKScgfTtcbiAgICB2YXIgZ3JvdXBlZCA9IHt9O1xuICAgIEZJRUxEUy5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4gICAgICBpZiAoIWdyb3VwZWRbZlsyXV0pIGdyb3VwZWRbZlsyXV0gPSBbXTtcbiAgICAgIGdyb3VwZWRbZlsyXV0ucHVzaChmKTtcbiAgICB9KTtcblxuICAgIHZhciBodG1sID0gJyc7XG4gICAgT2JqZWN0LmtleXMoc2VjdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgaWYgKGtleSA9PT0gJ2FkdmFuY2VkJykge1xuICAgICAgICBodG1sICs9ICc8ZGl2IGlkPVwidGhlbWUtYnVpbGRlci1hZHZhbmNlZC10b2dnbGVcIiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItYWR2YW5jZWQtdG9nZ2xlXCIgc3R5bGU9XCJtYXJnaW46MTJweCAwIDRweDtjdXJzb3I6cG9pbnRlcjtjb2xvcjp2YXIoLS1hY2NlbnQpO2ZvbnQtc2l6ZTouODVyZW07dXNlci1zZWxlY3Q6bm9uZTtcIj5TaG93IGFkdmFuY2VkIGNvbG9ycyAmIzk2NjA7PC9kaXY+JztcbiAgICAgICAgaHRtbCArPSAnPGRpdiBpZD1cInRoZW1lLWJ1aWxkZXItYWR2YW5jZWRcIiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwidGhlbWUtYnVpbGRlci1zZWN0aW9uXCI+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLXNlY3Rpb24tdGl0bGVcIj4nICsgc2VjdGlvbnNba2V5XSArICc8L2Rpdj4nO1xuICAgICAgKGdyb3VwZWRba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwidGhlbWUtYnVpbGRlci1yb3dcIj4nICtcbiAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0aGVtZS1idWlsZGVyLWxhYmVsXCI+JyArIGZbMV0gKyAnPC9zcGFuPicgK1xuICAgICAgICAgICc8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLWNvbG9yXCIgZGF0YS1wcm9wPVwiJyArIGZbMF0gKyAnXCInICsgKGtleSA9PT0gJ2FkdmFuY2VkJyA/ICcgZGF0YS1hZHZhbmNlZD1cIjFcIicgOiAnJykgKyAnIHZhbHVlPVwiIzAwMDAwMFwiIC8+JyArXG4gICAgICAgICAgJzxzcGFuIGNsYXNzPVwidGhlbWUtYnVpbGRlci1oZXhcIiBkYXRhLWhleD1cIicgKyBmWzBdICsgJ1wiPiMwMDAwMDA8L3NwYW4+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICB9KTtcbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgfSk7XG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFN0YXJ0RnJvbU9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5USEVNRVMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gJzxvcHRpb24gdmFsdWU9XCInICsgdCArICdcIj4nICsgZ2V0TGFiZWxGb3IodCkgKyAnPC9vcHRpb24+JztcbiAgICB9KS5qb2luKCcnKTtcbiAgfVxuXG4gIHZhciBtb2RhbEhUTUwgPSAnPGRpdiBpZD1cInRoZW1lLWJ1aWxkZXItbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj4nICtcbiAgICAnPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOjQyMHB4O21heC13aWR0aDo1NjBweDtcIj4nICtcbiAgICAnPGgzPlRoZW1lIEJ1aWxkZXI8L2gzPicgK1xuXG4gICAgLy8gRWRpdCBleGlzdGluZyB1c2VyIHRoZW1lcyBkcm9wZG93blxuICAgICc8ZGl2IGlkPVwidGhlbWUtYnVpbGRlci1leGlzdGluZ1wiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O2Rpc3BsYXk6bm9uZTtcIj4nICtcbiAgICAnPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOi44NXJlbTtjb2xvcjp2YXIoLS1tdXRlZCk7bWFyZ2luLXJpZ2h0OjhweDtcIj5FZGl0OjwvbGFiZWw+JyArXG4gICAgJzxzZWxlY3QgaWQ9XCJ0aGVtZS1idWlsZGVyLWVkaXQtc2VsZWN0XCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxMHB4O2JhY2tncm91bmQ6dmFyKC0tY2FyZC1iZyk7Y29sb3I6dmFyKC0tZmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6Ljg1cmVtO21hcmdpbi1yaWdodDo4cHg7XCI+JyArXG4gICAgJzxvcHRpb24gdmFsdWU9XCJcIj5cdTIwMTQgTmV3IFRoZW1lIFx1MjAxNDwvb3B0aW9uPicgK1xuICAgICc8L3NlbGVjdD4nICtcbiAgICAnPGJ1dHRvbiBpZD1cInRoZW1lLWJ1aWxkZXItZGVsZXRlXCIgc3R5bGU9XCJwYWRkaW5nOjRweCAxMHB4O2JhY2tncm91bmQ6Y29sb3ItbWl4KGluIHNyZ2IsdmFyKC0tYmFkLWZnKSAxNSUsdHJhbnNwYXJlbnQpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYmFkLWZnKTtjb2xvcjp2YXIoLS1iYWQtZmcpO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTouOHJlbTtjdXJzb3I6cG9pbnRlcjtcIj5EZWxldGU8L2J1dHRvbj4nICtcbiAgICAnPC9kaXY+JyArXG5cbiAgICAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTZweDtcIj4nICtcbiAgICAnPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOi44NXJlbTtjb2xvcjp2YXIoLS1tdXRlZCk7bWFyZ2luLXJpZ2h0OjhweDtcIj5OYW1lOjwvbGFiZWw+JyArXG4gICAgJzxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwidGhlbWUtYnVpbGRlci1uYW1lXCIgbWF4bGVuZ3RoPVwiMjBcIiBwbGFjZWhvbGRlcj1cIk15IFRoZW1lXCIgJyArXG4gICAgJ3N0eWxlPVwicGFkZGluZzo2cHggMTBweDtiYWNrZ3JvdW5kOnZhcigtLWNhcmQtYmcpO2NvbG9yOnZhcigtLWZnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOi44NXJlbTt3aWR0aDoxNDBweDtcIiAvPicgK1xuICAgICc8L2Rpdj4nICtcblxuICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7XCI+JyArXG4gICAgJzxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTouODVyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1yaWdodDo4cHg7Y3Vyc29yOnBvaW50ZXI7XCIgZm9yPVwidGhlbWUtYnVpbGRlci1saWdodGJnXCI+JyArXG4gICAgJzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInRoZW1lLWJ1aWxkZXItbGlnaHRiZ1wiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjZweDtjdXJzb3I6cG9pbnRlcjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCIgLz4nICtcbiAgICAnTGlnaHQgYmFja2dyb3VuZCAodXNlIGRhcmsgbG9nbyk8L2xhYmVsPicgK1xuICAgICc8L2Rpdj4nICtcblxuICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPicgK1xuICAgICc8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6Ljg1cmVtO2NvbG9yOnZhcigtLW11dGVkKTttYXJnaW4tcmlnaHQ6OHB4O1wiPlN0YXJ0IGZyb206PC9sYWJlbD4nICtcbiAgICAnPHNlbGVjdCBpZD1cInRoZW1lLWJ1aWxkZXItc3RhcnRcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDEwcHg7YmFja2dyb3VuZDp2YXIoLS1jYXJkLWJnKTtjb2xvcjp2YXIoLS1mZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTouODVyZW07XCI+JyArXG4gICAgYnVpbGRTdGFydEZyb21PcHRpb25zKCkgK1xuICAgICc8L3NlbGVjdD4nICtcbiAgICAnPC9kaXY+JyArXG5cbiAgICAnPGRpdiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItcHJldmlld1wiIGlkPVwidGhlbWUtYnVpbGRlci1wcmV2aWV3XCI+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLWNhcmRcIiBpZD1cInRoZW1lLXByZXZpZXctY2FyZFwiPicgK1xuICAgICc8ZGl2IGNsYXNzPVwicHJldmlldy10aXRsZVwiPlNhbXBsZSBDYXJkPC9kaXY+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwcmV2aWV3LW11dGVkXCI+U2Vjb25kYXJ5IHRleHQgcHJldmlldzwvZGl2PicgK1xuICAgICc8ZGl2IGNsYXNzPVwicHJldmlldy1iYWRnZXNcIj4nICtcbiAgICAnPHNwYW4gY2xhc3M9XCJwcmV2aWV3LWJhZGdlXCIgaWQ9XCJwcmV2aWV3LWJhZGdlLW9rXCI+T048L3NwYW4+JyArXG4gICAgJzxzcGFuIGNsYXNzPVwicHJldmlldy1iYWRnZVwiIGlkPVwicHJldmlldy1iYWRnZS1iYWRcIj5PRkY8L3NwYW4+JyArXG4gICAgJzwvZGl2PicgK1xuICAgICc8ZGl2IGNsYXNzPVwicHJldmlldy1kb3RzXCI+JyArXG4gICAgJzxzcGFuPjxzcGFuIGNsYXNzPVwicHJldmlldy1kb3RcIiBpZD1cInByZXZpZXctZG90LW9rXCI+PC9zcGFuPiBPbmxpbmU8L3NwYW4+JyArXG4gICAgJzxzcGFuPjxzcGFuIGNsYXNzPVwicHJldmlldy1kb3RcIiBpZD1cInByZXZpZXctZG90LWJhZFwiPjwvc3Bhbj4gT2ZmbGluZTwvc3Bhbj4nICtcbiAgICAnPC9kaXY+JyArXG4gICAgJzxidXR0b24gY2xhc3M9XCJwcmV2aWV3LWJ0blwiIGlkPVwicHJldmlldy1hY2NlbnQtYnRuXCI+QWNjZW50IEJ1dHRvbjwvYnV0dG9uPicgK1xuICAgICc8L2Rpdj4nICtcbiAgICAnPC9kaXY+JyArXG5cbiAgICBidWlsZEZpZWxkc0hUTUwoKSArXG5cbiAgICAnPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiPicgK1xuICAgICc8YnV0dG9uIGlkPVwidGhlbWUtYnVpbGRlci1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj4nICtcbiAgICAnPGJ1dHRvbiBpZD1cInRoZW1lLWJ1aWxkZXItaW1wb3J0XCIgc3R5bGU9XCJtYXJnaW4tbGVmdDphdXRvO1wiIHRpdGxlPVwiSW1wb3J0IHRoZW1lIGZyb20gSlNPTiBmaWxlXCI+SW1wb3J0PC9idXR0b24+JyArXG4gICAgJzxidXR0b24gaWQ9XCJ0aGVtZS1idWlsZGVyLWV4cG9ydFwiIHRpdGxlPVwiRXhwb3J0IHRoZW1lIGFzIEpTT04gZmlsZVwiPkV4cG9ydDwvYnV0dG9uPicgK1xuICAgICc8YnV0dG9uIGlkPVwidGhlbWUtYnVpbGRlci1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZSBUaGVtZTwvYnV0dG9uPicgK1xuICAgICc8L2Rpdj4nICtcbiAgICAnPC9kaXY+PC9kaXY+JztcblxuICBpbmplY3RNb2RhbCgndGhlbWUtYnVpbGRlci1tb2RhbCcsIG1vZGFsSFRNTCk7XG5cbiAgdmFyIG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItbW9kYWwnKTtcbiAgdmFyIHN0YXJ0U2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItc3RhcnQnKTtcbiAgdmFyIG5hbWVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLW5hbWUnKTtcbiAgdmFyIGVkaXRTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1lZGl0LXNlbGVjdCcpO1xuICB2YXIgZXhpc3RpbmdTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItZXhpc3RpbmcnKTtcbiAgdmFyIGxpZ2h0QmdDaGVjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWxpZ2h0YmcnKTtcbiAgdmFyIHBpY2tlcnMgPSBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlbWUtYnVpbGRlci1jb2xvcicpO1xuICB2YXIgYWR2YW5jZWRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItYWR2YW5jZWQnKTtcbiAgdmFyIGFkdmFuY2VkVG9nZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItYWR2YW5jZWQtdG9nZ2xlJyk7XG4gIHZhciBleHBvcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1leHBvcnQnKTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQWR2YW5jZWQgdG9nZ2xlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIHZhciBhZHZhbmNlZFZpc2libGUgPSBmYWxzZTtcbiAgYWR2YW5jZWRUb2dnbGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgYWR2YW5jZWRWaXNpYmxlID0gIWFkdmFuY2VkVmlzaWJsZTtcbiAgICBhZHZhbmNlZFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9IGFkdmFuY2VkVmlzaWJsZSA/ICcnIDogJ25vbmUnO1xuICAgIGFkdmFuY2VkVG9nZ2xlLmlubmVySFRNTCA9IGFkdmFuY2VkVmlzaWJsZVxuICAgICAgPyAnSGlkZSBhZHZhbmNlZCBjb2xvcnMgJiM5NjUwOydcbiAgICAgIDogJ1Nob3cgYWR2YW5jZWQgY29sb3JzICYjOTY2MDsnO1xuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ29sb3IgcGlja2VyIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2V0Q3VycmVudENvbG9ycygpIHtcbiAgICB2YXIgY29sb3JzID0ge307XG4gICAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBjb2xvcnNbcC5kYXRhc2V0LnByb3BdID0gcC52YWx1ZTtcbiAgICB9KTtcbiAgICBjb2xvcnNbJ2NhcmQtYmcnXSA9IGNvbG9yc1snY2FyZC1iYXNlJ107XG4gICAgcmV0dXJuIGNvbG9ycztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJhc2VDb2xvcnMoKSB7XG4gICAgdmFyIGNvbG9ycyA9IHt9O1xuICAgIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKCFwLmRhdGFzZXQuYWR2YW5jZWQpIGNvbG9yc1twLmRhdGFzZXQucHJvcF0gPSBwLnZhbHVlO1xuICAgIH0pO1xuICAgIGNvbG9yc1snY2FyZC1iZyddID0gY29sb3JzWydjYXJkLWJhc2UnXTtcbiAgICBpZiAobGlnaHRCZ0NoZWNrLmNoZWNrZWQpIGNvbG9ycy5saWdodEJnID0gdHJ1ZTtcbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCgpIHtcbiAgICB2YXIgYmFzZSA9IGdldEJhc2VDb2xvcnMoKTtcbiAgICB2YXIgZGVyaXZlZCA9IHdpbmRvdy5kZXJpdmVFeHRlbmRlZENvbG9ycyA/IHdpbmRvdy5kZXJpdmVFeHRlbmRlZENvbG9ycyhiYXNlKSA6IHt9O1xuICAgIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKHAuZGF0YXNldC5hZHZhbmNlZCAmJiAhYWR2YW5jZWRPdmVycmlkZXNbcC5kYXRhc2V0LnByb3BdKSB7XG4gICAgICAgIHZhciB2YWwgPSBkZXJpdmVkW3AuZGF0YXNldC5wcm9wXSB8fCAnIzMzMzMzMyc7XG4gICAgICAgIHAudmFsdWUgPSB2YWw7XG4gICAgICAgIHZhciBoZXggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZXg9XCInICsgcC5kYXRhc2V0LnByb3AgKyAnXCJdJyk7XG4gICAgICAgIGlmIChoZXgpIGhleC50ZXh0Q29udGVudCA9IHZhbC50b1VwcGVyQ2FzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9hZFRoZW1lSW50b1BpY2tlcnModGhlbWVOYW1lKSB7XG4gICAgdmFyIGNvbG9ycyA9IHdpbmRvdy5USEVNRV9DT0xPUlNbdGhlbWVOYW1lXTtcbiAgICBpZiAoIWNvbG9ycykgcmV0dXJuO1xuICAgIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307XG4gICAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICB2YXIgdmFsID0gY29sb3JzW3AuZGF0YXNldC5wcm9wXSB8fCAnIzAwMDAwMCc7XG4gICAgICBpZiAodmFsLnN0YXJ0c1dpdGgoJ3JnYmEnKSB8fCB2YWwuc3RhcnRzV2l0aCgnY29sb3ItbWl4JykpIHZhbCA9ICcjMzMzMzMzJztcbiAgICAgIHAudmFsdWUgPSB2YWw7XG4gICAgICB2YXIgaGV4ID0gbW9kYWwucXVlcnlTZWxlY3RvcignW2RhdGEtaGV4PVwiJyArIHAuZGF0YXNldC5wcm9wICsgJ1wiXScpO1xuICAgICAgaWYgKGhleCkgaGV4LnRleHRDb250ZW50ID0gdmFsLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gICAgbGlnaHRCZ0NoZWNrLmNoZWNrZWQgPSAhIWNvbG9ycy5saWdodEJnO1xuICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWRVc2VyVGhlbWVJbnRvUGlja2VycyhzbHVnKSB7XG4gICAgdmFyIHVzZXJUaGVtZXMgPSBzYWZlR2V0SlNPTih3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgdmFyIHRoZW1lID0gdXNlclRoZW1lc1tzbHVnXTtcbiAgICBpZiAoIXRoZW1lKSByZXR1cm47XG4gICAgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTtcbiAgICBwaWNrZXJzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIHZhciB2YWwgPSB0aGVtZVtwLmRhdGFzZXQucHJvcF0gfHwgJyMwMDAwMDAnO1xuICAgICAgcC52YWx1ZSA9IHZhbDtcbiAgICAgIHZhciBoZXggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZXg9XCInICsgcC5kYXRhc2V0LnByb3AgKyAnXCJdJyk7XG4gICAgICBpZiAoaGV4KSBoZXgudGV4dENvbnRlbnQgPSB2YWwudG9VcHBlckNhc2UoKTtcbiAgICAgIC8vIElmIHRoZW1lIGhhcyBleHBsaWNpdCBhZHZhbmNlZCB2YWx1ZXMsIG1hcmsgYXMgb3ZlcnJpZGRlblxuICAgICAgaWYgKHAuZGF0YXNldC5hZHZhbmNlZCAmJiB0aGVtZVtwLmRhdGFzZXQucHJvcF0pIHtcbiAgICAgICAgYWR2YW5jZWRPdmVycmlkZXNbcC5kYXRhc2V0LnByb3BdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuYW1lSW5wdXQudmFsdWUgPSB0aGVtZS5uYW1lIHx8ICcnO1xuICAgIGxpZ2h0QmdDaGVjay5jaGVja2VkID0gISF0aGVtZS5saWdodEJnO1xuICAgIC8vIEZpbGwgYW55IG1pc3NpbmcgYWR2YW5jZWQgZmllbGRzIGZyb20gZGVyaXZhdGlvblxuICAgIHVwZGF0ZUFkdmFuY2VkRnJvbURlcml2ZWQoKTtcbiAgICB1cGRhdGVQcmV2aWV3KCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQcmV2aWV3KCkge1xuICAgIHZhciBjID0gZ2V0Q3VycmVudENvbG9ycygpO1xuICAgIHZhciBwcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItcHJldmlldycpO1xuICAgIHZhciBjYXJkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLXByZXZpZXctY2FyZCcpO1xuICAgIHZhciB0aXRsZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLnByZXZpZXctdGl0bGUnKTtcbiAgICB2YXIgbXV0ZWQgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5wcmV2aWV3LW11dGVkJyk7XG4gICAgdmFyIGJhZGdlT2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldy1iYWRnZS1vaycpO1xuICAgIHZhciBiYWRnZUJhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LWJhZGdlLWJhZCcpO1xuICAgIHZhciBkb3RPayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LWRvdC1vaycpO1xuICAgIHZhciBkb3RCYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldy1kb3QtYmFkJyk7XG4gICAgdmFyIGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LWFjY2VudC1idG4nKTtcbiAgICB2YXIgZG90cyA9IGNhcmQucXVlcnlTZWxlY3RvcignLnByZXZpZXctZG90cycpO1xuXG4gICAgcHJldmlldy5zdHlsZS5iYWNrZ3JvdW5kID0gY1snYmcnXTtcbiAgICBjYXJkLnN0eWxlLmJhY2tncm91bmQgPSBjWydjYXJkLWJhc2UnXTtcbiAgICBjYXJkLnN0eWxlLmJvcmRlckNvbG9yID0gY1snYm9yZGVyJ107XG4gICAgdGl0bGUuc3R5bGUuY29sb3IgPSBjWydmZyddO1xuICAgIG11dGVkLnN0eWxlLmNvbG9yID0gY1snbXV0ZWQnXTtcbiAgICBiYWRnZU9rLnN0eWxlLmJhY2tncm91bmQgPSBjWydvay1iZyddO1xuICAgIGJhZGdlT2suc3R5bGUuY29sb3IgPSBjWydvay1mZyddO1xuICAgIGJhZGdlQmFkLnN0eWxlLmJhY2tncm91bmQgPSBjWydiYWQtYmcnXTtcbiAgICBiYWRnZUJhZC5zdHlsZS5jb2xvciA9IGNbJ2JhZC1mZyddO1xuICAgIGRvdE9rLnN0eWxlLmJhY2tncm91bmQgPSBjWydkb3Qtb2snXTtcbiAgICBkb3RCYWQuc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2RvdC1iYWQnXTtcbiAgICBkb3RzLnN0eWxlLmNvbG9yID0gY1snZmcnXTtcbiAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2FjY2VudCddO1xuICAgIGJ0bi5zdHlsZS5jb2xvciA9IGNbJ2JnJ107XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseUNvbG9yc0xpdmUoY29sb3JzKSB7XG4gICAgLy8gSW5jbHVkZSBkZXJpdmVkIGNvbG9ycyBmb3IgZnVsbCBsaXZlIHByZXZpZXdcbiAgICB2YXIgZGVyaXZlZCA9IHdpbmRvdy5kZXJpdmVFeHRlbmRlZENvbG9ycyA/IHdpbmRvdy5kZXJpdmVFeHRlbmRlZENvbG9ycyhjb2xvcnMpIDoge307XG4gICAgd2luZG93LlRIRU1FX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHZhciB2YWwgPSBjb2xvcnNbcHJvcF0gfHwgZGVyaXZlZFtwcm9wXTtcbiAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLScgKyBwcm9wLCB2YWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gV2lyZSB1cCBjb2xvciBwaWNrZXJzXG4gIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgIHAuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaGV4ID0gbW9kYWwucXVlcnlTZWxlY3RvcignW2RhdGEtaGV4PVwiJyArIHAuZGF0YXNldC5wcm9wICsgJ1wiXScpO1xuICAgICAgaWYgKGhleCkgaGV4LnRleHRDb250ZW50ID0gcC52YWx1ZS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAvLyBUcmFjayBtYW51YWwgYWR2YW5jZWQgb3ZlcnJpZGVzXG4gICAgICBpZiAocC5kYXRhc2V0LmFkdmFuY2VkKSB7XG4gICAgICAgIGFkdmFuY2VkT3ZlcnJpZGVzW3AuZGF0YXNldC5wcm9wXSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCYXNlIGNvbG9yIGNoYW5nZWQgXHUyMDE0IHJlLWRlcml2ZSBhZHZhbmNlZCB2YWx1ZXMgKHVubGVzcyBvdmVycmlkZGVuKVxuICAgICAgICB1cGRhdGVBZHZhbmNlZEZyb21EZXJpdmVkKCk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgICAgIGFwcGx5Q29sb3JzTGl2ZShnZXRDdXJyZW50Q29sb3JzKCkpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBMaWdodC1iZyBjaGVja2JveCBzaG91bGQgcmUtZGVyaXZlIGFkdmFuY2VkIGNvbG9yc1xuICBsaWdodEJnQ2hlY2suYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZUFkdmFuY2VkRnJvbURlcml2ZWQoKTtcbiAgICB1cGRhdGVQcmV2aWV3KCk7XG4gICAgYXBwbHlDb2xvcnNMaXZlKGdldEN1cnJlbnRDb2xvcnMoKSk7XG4gIH0pO1xuXG4gIHN0YXJ0U2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICBhZHZhbmNlZE92ZXJyaWRlcyA9IHt9O1xuICAgIGxvYWRUaGVtZUludG9QaWNrZXJzKHN0YXJ0U2VsZWN0LnZhbHVlKTtcbiAgICBhcHBseUNvbG9yc0xpdmUoZ2V0Q3VycmVudENvbG9ycygpKTtcbiAgfSk7XG5cbiAgLy8gUG9wdWxhdGUgYW5kIHJlZnJlc2ggdGhlIGVkaXQtZXhpc3RpbmcgZHJvcGRvd25cbiAgZnVuY3Rpb24gcmVmcmVzaEVkaXREcm9wZG93bigpIHtcbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgc2x1Z3MgPSBPYmplY3Qua2V5cyh1c2VyVGhlbWVzKTtcbiAgICBlZGl0U2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IE5ldyBUaGVtZSBcdTIwMTQ8L29wdGlvbj4nO1xuICAgIHNsdWdzLmZvckVhY2goZnVuY3Rpb24gKHNsdWcpIHtcbiAgICAgIHZhciBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgIG9wdC52YWx1ZSA9IHNsdWc7XG4gICAgICBvcHQudGV4dENvbnRlbnQgPSB1c2VyVGhlbWVzW3NsdWddLm5hbWUgfHwgc2x1ZztcbiAgICAgIGVkaXRTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICB9KTtcbiAgICBleGlzdGluZ1NlY3Rpb24uc3R5bGUuZGlzcGxheSA9IHNsdWdzLmxlbmd0aCA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgLy8gQWxzbyByZWZyZXNoIFwiU3RhcnQgZnJvbVwiIG9wdGlvbnNcbiAgZnVuY3Rpb24gcmVmcmVzaFN0YXJ0RnJvbSgpIHtcbiAgICBzdGFydFNlbGVjdC5pbm5lckhUTUwgPSBidWlsZFN0YXJ0RnJvbU9wdGlvbnMoKTtcbiAgfVxuXG4gIC8vIEVkaXQgZHJvcGRvd24gY2hhbmdlXG4gIGVkaXRTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBzbHVnID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoc2x1Zykge1xuICAgICAgZWRpdGluZ1NsdWcgPSBzbHVnO1xuICAgICAgbG9hZFVzZXJUaGVtZUludG9QaWNrZXJzKHNsdWcpO1xuICAgICAgYXBwbHlDb2xvcnNMaXZlKGdldEN1cnJlbnRDb2xvcnMoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVkaXRpbmdTbHVnID0gbnVsbDtcbiAgICAgIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307XG4gICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHN0YXJ0U2VsZWN0LnZhbHVlID0gd2luZG93LmdldEFjdGl2ZVRoZW1lKCk7XG4gICAgICBsb2FkVGhlbWVJbnRvUGlja2VycyhzdGFydFNlbGVjdC52YWx1ZSk7XG4gICAgfVxuICAgIGV4cG9ydEJ0bi5zdHlsZS5kaXNwbGF5ID0gZWRpdGluZ1NsdWcgPyAnJyA6ICdub25lJztcbiAgfSk7XG5cbiAgZnVuY3Rpb24gb3BlbkJ1aWxkZXIoKSB7XG4gICAgdGhlbWVCZWZvcmVCdWlsZGVyID0gd2luZG93LmdldEFjdGl2ZVRoZW1lKCk7XG4gICAgZWRpdGluZ1NsdWcgPSBudWxsO1xuICAgIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307XG5cbiAgICAvLyBSZXNldCBhZHZhbmNlZCBzZWN0aW9uIHRvIGNvbGxhcHNlZFxuICAgIGFkdmFuY2VkVmlzaWJsZSA9IGZhbHNlO1xuICAgIGFkdmFuY2VkU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGFkdmFuY2VkVG9nZ2xlLmlubmVySFRNTCA9ICdTaG93IGFkdmFuY2VkIGNvbG9ycyAmIzk2NjA7JztcblxuICAgIHJlZnJlc2hFZGl0RHJvcGRvd24oKTtcbiAgICByZWZyZXNoU3RhcnRGcm9tKCk7XG5cbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICBpZiAodXNlclRoZW1lc1t0aGVtZUJlZm9yZUJ1aWxkZXJdKSB7XG4gICAgICAvLyBBY3RpdmUgdGhlbWUgaXMgYSB1c2VyIHRoZW1lIFx1MjAxNCBvcGVuIGl0IGZvciBlZGl0aW5nXG4gICAgICBlZGl0U2VsZWN0LnZhbHVlID0gdGhlbWVCZWZvcmVCdWlsZGVyO1xuICAgICAgZWRpdGluZ1NsdWcgPSB0aGVtZUJlZm9yZUJ1aWxkZXI7XG4gICAgICBsb2FkVXNlclRoZW1lSW50b1BpY2tlcnModGhlbWVCZWZvcmVCdWlsZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRpdFNlbGVjdC52YWx1ZSA9ICcnO1xuICAgICAgbmFtZUlucHV0LnZhbHVlID0gJyc7XG4gICAgICBzdGFydFNlbGVjdC52YWx1ZSA9IHRoZW1lQmVmb3JlQnVpbGRlcjtcbiAgICAgIGxvYWRUaGVtZUludG9QaWNrZXJzKHRoZW1lQmVmb3JlQnVpbGRlcik7XG4gICAgfVxuXG4gICAgZXhwb3J0QnRuLnN0eWxlLmRpc3BsYXkgPSBlZGl0aW5nU2x1ZyA/ICcnIDogJ25vbmUnO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfVxuXG4gIHZhciBjdXN0b21pemVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtY3VzdG9taXplLWJ0bicpO1xuICBpZiAoY3VzdG9taXplQnRuKSB7XG4gICAgY3VzdG9taXplQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBvcGVuQnVpbGRlcigpOyB9KTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTYXZlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLXNhdmUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29sb3JzID0gZ2V0Q3VycmVudENvbG9ycygpO1xuICAgIHZhciBuYW1lID0gbmFtZUlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIHRoZW1lIG5hbWUnLCAnd2FybmluZycsIDMwMDApO1xuICAgICAgbmFtZUlucHV0LmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHVzZXJUaGVtZXMgPSBzYWZlR2V0SlNPTih3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgdmFyIHNsdWc7XG4gICAgdmFyIG9sZFNsdWcgPSBudWxsO1xuXG4gICAgaWYgKGVkaXRpbmdTbHVnKSB7XG4gICAgICBzbHVnID0gZWRpdGluZ1NsdWc7XG4gICAgICAvLyBJZiBuYW1lIGNoYW5nZWQsIHJlLXNsdWdpZnkgYW5kIHBvdGVudGlhbGx5IHJlbmFtZVxuICAgICAgdmFyIG5ld1NsdWcgPSB3aW5kb3cuc2x1Z2lmeVRoZW1lTmFtZShuYW1lLCBlZGl0aW5nU2x1Zyk7XG4gICAgICBpZiAobmV3U2x1ZyAhPT0gZWRpdGluZ1NsdWcpIHtcbiAgICAgICAgb2xkU2x1ZyA9IGVkaXRpbmdTbHVnO1xuICAgICAgICBkZWxldGUgdXNlclRoZW1lc1tlZGl0aW5nU2x1Z107XG4gICAgICAgIHZhciBpZHggPSB3aW5kb3cuVEhFTUVTLmluZGV4T2YoZWRpdGluZ1NsdWcpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSkgd2luZG93LlRIRU1FUy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgZGVsZXRlIHdpbmRvdy5USEVNRV9DT0xPUlNbZWRpdGluZ1NsdWddO1xuICAgICAgICBzbHVnID0gbmV3U2x1ZztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2x1ZyA9IHdpbmRvdy5zbHVnaWZ5VGhlbWVOYW1lKG5hbWUpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHRoZW1lIGRhdGEgd2l0aCBBTEwgY29sb3IgcHJvcGVydGllc1xuICAgIHZhciB0aGVtZURhdGEgPSB7IG5hbWU6IG5hbWUgfTtcbiAgICBpZiAobGlnaHRCZ0NoZWNrLmNoZWNrZWQpIHRoZW1lRGF0YS5saWdodEJnID0gdHJ1ZTtcbiAgICB3aW5kb3cuVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKGNvbG9yc1twXSkgdGhlbWVEYXRhW3BdID0gY29sb3JzW3BdO1xuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIGxvY2FsU3RvcmFnZSBjYWNoZSBpbW1lZGlhdGVseSBmb3IgaW5zdGFudCBVSVxuICAgIHVzZXJUaGVtZXNbc2x1Z10gPSB0aGVtZURhdGE7XG4gICAgc2FmZVNldCh3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCBKU09OLnN0cmluZ2lmeSh1c2VyVGhlbWVzKSk7XG5cbiAgICAvLyBDbGVhciBpbmxpbmUgcHJldmlldyBwcm9wZXJ0aWVzXG4gICAgd2luZG93LmNsZWFyQ3VzdG9tUHJvcGVydGllcygpO1xuXG4gICAgLy8gUmUtaW5qZWN0IENTUyBhbmQgYXBwbHlcbiAgICB3aW5kb3cuaW5qZWN0VXNlclRoZW1lU3R5bGVzKCk7XG4gICAgd2luZG93LmFwcGx5VGhlbWUoc2x1Zyk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHVwZGF0ZUxhYmVsKCk7XG5cbiAgICAvLyBTYXZlIHRvIHNlcnZlciAoc291cmNlIG9mIHRydXRoKVxuICAgIHZhciBhcGlDb2xvcnMgPSB7fTtcbiAgICB3aW5kb3cuVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAoY29sb3JzW3BdKSBhcGlDb2xvcnNbcF0gPSBjb2xvcnNbcF07IH0pO1xuXG4gICAgLy8gSWYgc2x1ZyBjaGFuZ2VkLCBkZWxldGUgdGhlIG9sZCBvbmUgZnJvbSBzZXJ2ZXJcbiAgICBpZiAob2xkU2x1Zykge1xuICAgICAgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdGhlbWVzLycgKyBvbGRTbHVnLCB7IG1ldGhvZDogJ0RFTEVURScgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuICAgIH1cblxuICAgIHNlY3VyZUZldGNoKCcvYXBpL3YxL3RoZW1lcy8nICsgc2x1Zywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbmFtZTogbmFtZSwgY29sb3JzOiBhcGlDb2xvcnMsIGxpZ2h0Qmc6IGxpZ2h0QmdDaGVjay5jaGVja2VkIH0pXG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKG5hbWUgKyAnIHRoZW1lIHNhdmVkJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKG5hbWUgKyAnIHRoZW1lIHNhdmVkIGxvY2FsbHkgKHNlcnZlciBzeW5jIGZhaWxlZCknLCAnd2FybmluZycsIDMwMDApO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ2FuY2VsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWNhbmNlbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICB3aW5kb3cuY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG4gICAgaWYgKHRoZW1lQmVmb3JlQnVpbGRlcikge1xuICAgICAgd2luZG93LmFwcGx5VGhlbWUodGhlbWVCZWZvcmVCdWlsZGVyKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBEZWxldGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItZGVsZXRlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFlZGl0aW5nU2x1ZykgcmV0dXJuO1xuXG4gICAgdmFyIHVzZXJUaGVtZXMgPSBzYWZlR2V0SlNPTih3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgdmFyIG5hbWUgPSB1c2VyVGhlbWVzW2VkaXRpbmdTbHVnXSA/IHVzZXJUaGVtZXNbZWRpdGluZ1NsdWddLm5hbWUgOiBlZGl0aW5nU2x1ZztcblxuICAgIGlmICghY29uZmlybSgnRGVsZXRlIFwiJyArIG5hbWUgKyAnXCIgdGhlbWU/JykpIHJldHVybjtcblxuICAgIHZhciBzbHVnVG9EZWxldGUgPSBlZGl0aW5nU2x1ZztcblxuICAgIC8vIFVwZGF0ZSBsb2NhbFN0b3JhZ2UgY2FjaGUgaW1tZWRpYXRlbHlcbiAgICBkZWxldGUgdXNlclRoZW1lc1tzbHVnVG9EZWxldGVdO1xuICAgIHNhZmVTZXQod2luZG93LlVTRVJfVEhFTUVTX0tFWSwgSlNPTi5zdHJpbmdpZnkodXNlclRoZW1lcykpO1xuXG4gICAgLy8gUmVtb3ZlIGZyb20gcnVudGltZVxuICAgIHZhciBpZHggPSB3aW5kb3cuVEhFTUVTLmluZGV4T2Yoc2x1Z1RvRGVsZXRlKTtcbiAgICBpZiAoaWR4ICE9PSAtMSkgd2luZG93LlRIRU1FUy5zcGxpY2UoaWR4LCAxKTtcbiAgICBkZWxldGUgd2luZG93LlRIRU1FX0NPTE9SU1tzbHVnVG9EZWxldGVdO1xuXG4gICAgd2luZG93LmNsZWFyQ3VzdG9tUHJvcGVydGllcygpO1xuICAgIHdpbmRvdy5pbmplY3RVc2VyVGhlbWVTdHlsZXMoKTtcblxuICAgIHZhciBmYWxsYmFjayA9IHRoZW1lQmVmb3JlQnVpbGRlciAmJiB0aGVtZUJlZm9yZUJ1aWxkZXIgIT09IHNsdWdUb0RlbGV0ZSA/IHRoZW1lQmVmb3JlQnVpbGRlciA6ICdkYXJrJztcbiAgICB3aW5kb3cuYXBwbHlUaGVtZShmYWxsYmFjayk7XG5cbiAgICBlZGl0aW5nU2x1ZyA9IG51bGw7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHVwZGF0ZUxhYmVsKCk7XG5cbiAgICAvLyBEZWxldGUgZnJvbSBzZXJ2ZXJcbiAgICBzZWN1cmVGZXRjaCgnL2FwaS92MS90aGVtZXMvJyArIHNsdWdUb0RlbGV0ZSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihuYW1lICsgJyB0aGVtZSBkZWxldGVkJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKG5hbWUgKyAnIHRoZW1lIGRlbGV0ZWQgbG9jYWxseSAoc2VydmVyIHN5bmMgZmFpbGVkKScsICd3YXJuaW5nJywgMzAwMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBFeHBvcnQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItZXhwb3J0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFlZGl0aW5nU2x1Zykge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignU2F2ZSB0aGUgdGhlbWUgZmlyc3QsIHRoZW4gZXhwb3J0JywgJ3dhcm5pbmcnLCAzMDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHVzZXJUaGVtZXMgPSBzYWZlR2V0SlNPTih3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgdmFyIHRoZW1lID0gdXNlclRoZW1lc1tlZGl0aW5nU2x1Z107XG4gICAgaWYgKCF0aGVtZSkgcmV0dXJuO1xuXG4gICAgdmFyIGV4cG9ydERhdGEgPSB7XG4gICAgICBfZGFzaGNhZGR5X3RoZW1lOiB0cnVlLFxuICAgICAgdmVyc2lvbjogJzEuMCcsXG4gICAgICBleHBvcnREYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBzbHVnOiBlZGl0aW5nU2x1ZyxcbiAgICAgIG5hbWU6IHRoZW1lLm5hbWUsXG4gICAgICBsaWdodEJnOiB0aGVtZS5saWdodEJnIHx8IGZhbHNlLFxuICAgICAgY29sb3JzOiB7fVxuICAgIH07XG4gICAgd2luZG93LlRIRU1FX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIGlmICh0aGVtZVtwXSkgZXhwb3J0RGF0YS5jb2xvcnNbcF0gPSB0aGVtZVtwXTtcbiAgICB9KTtcblxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGV4cG9ydERhdGEsIG51bGwsIDIpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gICAgdmFyIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSBlZGl0aW5nU2x1ZyArICctdGhlbWUuanNvbic7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICBhLmNsaWNrKCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgc2hvd05vdGlmaWNhdGlvbignVGhlbWUgZXhwb3J0ZWQgYXMgJyArIGVkaXRpbmdTbHVnICsgJy10aGVtZS5qc29uJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEltcG9ydCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1pbXBvcnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGlucHV0LnR5cGUgPSAnZmlsZSc7XG4gICAgaW5wdXQuYWNjZXB0ID0gJy5qc29uJztcbiAgICBpbnB1dC5vbmNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgZmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdO1xuICAgICAgaWYgKCFmaWxlKSByZXR1cm47XG4gICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoZXYudGFyZ2V0LnJlc3VsdCk7XG5cbiAgICAgICAgICAvLyBTdXBwb3J0IGJvdGggd3JhcHBlZCBmb3JtYXQgYW5kIHJhdyB0aGVtZSBmb3JtYXRcbiAgICAgICAgICB2YXIgdGhlbWVOYW1lLCB0aGVtZUNvbG9ycywgdGhlbWVMaWdodEJnO1xuICAgICAgICAgIGlmIChkYXRhLl9kYXNoY2FkZHlfdGhlbWUgJiYgZGF0YS5jb2xvcnMpIHtcbiAgICAgICAgICAgIC8vIFdyYXBwZWQgZXhwb3J0IGZvcm1hdFxuICAgICAgICAgICAgdGhlbWVOYW1lID0gZGF0YS5uYW1lIHx8ICdJbXBvcnRlZCc7XG4gICAgICAgICAgICB0aGVtZUNvbG9ycyA9IGRhdGEuY29sb3JzO1xuICAgICAgICAgICAgdGhlbWVMaWdodEJnID0gZGF0YS5saWdodEJnIHx8IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5uYW1lICYmIChkYXRhLmJnIHx8IGRhdGFbJ2NhcmQtYmFzZSddKSkge1xuICAgICAgICAgICAgLy8gUmF3IHRoZW1lIEpTT04gKHNhbWUgZm9ybWF0IGFzIHNlcnZlciBmaWxlcylcbiAgICAgICAgICAgIHRoZW1lTmFtZSA9IGRhdGEubmFtZTtcbiAgICAgICAgICAgIHRoZW1lQ29sb3JzID0ge307XG4gICAgICAgICAgICB3aW5kb3cuVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAoZGF0YVtwXSkgdGhlbWVDb2xvcnNbcF0gPSBkYXRhW3BdOyB9KTtcbiAgICAgICAgICAgIHRoZW1lTGlnaHRCZyA9IGRhdGEubGlnaHRCZyB8fCBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSB2YWxpZCBEYXNoQ2FkZHkgdGhlbWUgZmlsZScpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIExvYWQgaW50byBidWlsZGVyXG4gICAgICAgICAgbmFtZUlucHV0LnZhbHVlID0gdGhlbWVOYW1lO1xuICAgICAgICAgIGxpZ2h0QmdDaGVjay5jaGVja2VkID0gISF0aGVtZUxpZ2h0Qmc7XG4gICAgICAgICAgZWRpdGluZ1NsdWcgPSBudWxsO1xuICAgICAgICAgIGVkaXRTZWxlY3QudmFsdWUgPSAnJztcbiAgICAgICAgICBhZHZhbmNlZE92ZXJyaWRlcyA9IHt9O1xuXG4gICAgICAgICAgLy8gQXBwbHkgY29sb3JzIHRvIHBpY2tlcnNcbiAgICAgICAgICBwaWNrZXJzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSB0aGVtZUNvbG9yc1twLmRhdGFzZXQucHJvcF0gfHwgJyMwMDAwMDAnO1xuICAgICAgICAgICAgcC52YWx1ZSA9IHZhbDtcbiAgICAgICAgICAgIHZhciBoZXggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZXg9XCInICsgcC5kYXRhc2V0LnByb3AgKyAnXCJdJyk7XG4gICAgICAgICAgICBpZiAoaGV4KSBoZXgudGV4dENvbnRlbnQgPSB2YWwudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChwLmRhdGFzZXQuYWR2YW5jZWQgJiYgdGhlbWVDb2xvcnNbcC5kYXRhc2V0LnByb3BdKSB7XG4gICAgICAgICAgICAgIGFkdmFuY2VkT3ZlcnJpZGVzW3AuZGF0YXNldC5wcm9wXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBGaWxsIGFueSBtaXNzaW5nIGFkdmFuY2VkIGZpZWxkc1xuICAgICAgICAgIHVwZGF0ZUFkdmFuY2VkRnJvbURlcml2ZWQoKTtcbiAgICAgICAgICB1cGRhdGVQcmV2aWV3KCk7XG4gICAgICAgICAgYXBwbHlDb2xvcnNMaXZlKGdldEN1cnJlbnRDb2xvcnMoKSk7XG4gICAgICAgICAgZXhwb3J0QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignXCInICsgdGhlbWVOYW1lICsgJ1wiIGxvYWRlZCBpbnRvIGJ1aWxkZXIuIENsaWNrIFNhdmUgdG8ga2VlcCBpdC4nLCAnc3VjY2VzcycsIDUwMDApO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdJbXBvcnQgZmFpbGVkOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicsIDUwMDApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XG4gICAgfTtcbiAgICBpbnB1dC5jbGljaygpO1xuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgTW9kYWwgY2xvc2UgaGFuZGxpbmcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgd2lyZU1vZGFsKG1vZGFsKTtcblxuICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkge1xuICAgICAgd2luZG93LmNsZWFyQ3VzdG9tUHJvcGVydGllcygpO1xuICAgICAgaWYgKHRoZW1lQmVmb3JlQnVpbGRlcikgd2luZG93LmFwcGx5VGhlbWUodGhlbWVCZWZvcmVCdWlsZGVyKTtcbiAgICB9XG4gIH0pO1xufSkoKTtcbjtcbi8vIExpY2Vuc2UgTWFuYWdlbWVudCBVSVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbGljZW5zZSBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdsaWNlbnNlLW1vZGFsJywgYDxkaXYgaWQ9XCJsaWNlbnNlLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0MjBweDsgbWF4LXdpZHRoOiA1MjBweDtcIj5cbiAgICAgIDxoMz5EYXNoQ2FkZHkgTGljZW5zZTwvaDM+XG4gICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTZweDtcIj5cbiAgICAgICAgQWN0aXZhdGUgYSBsaWNlbnNlIGNvZGUgdG8gdW5sb2NrIHByZW1pdW0gZmVhdHVyZXMuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLXN0YXR1cy1zZWN0aW9uXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlxuICAgICAgICA8ZGl2IGlkPVwibGljZW5zZS1iYWRnZVwiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBwYWRkaW5nOiA2cHggMTRweDsgYm9yZGVyLXJhZGl1czogMjBweDsgZm9udC1zaXplOiAwLjg1cmVtOyBmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxzcGFuIGlkPVwibGljZW5zZS1iYWRnZS1pY29uXCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGlkPVwibGljZW5zZS1iYWRnZS10ZXh0XCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImxpY2Vuc2UtZGV0YWlsc1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBsaW5lLWhlaWdodDogMS42O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLWFjdGl2YXRlLXNlY3Rpb25cIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1ib2xkXCI+TGljZW5zZSBDb2RlOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwibGljZW5zZS1jb2RlLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJEQy1YWFhYWC1YWFhYWC1YWFhYWC1YWFhYWC1YWFhYWFwiXG4gICAgICAgICAgbWF4bGVuZ3RoPVwiMzVcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIiBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAxcmVtOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBsZXR0ZXItc3BhY2luZzogMXB4O1wiIC8+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCI+RW50ZXIgeW91ciBsaWNlbnNlIGNvZGUgdG8gYWN0aXZhdGUgcHJlbWl1bSBmZWF0dXJlczwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwibGljZW5zZS1mZWF0dXJlc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1ib2xkXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA4cHg7IGRpc3BsYXk6IGJsb2NrO1wiPlByZW1pdW0gRmVhdHVyZXM6PC9sYWJlbD5cbiAgICAgICAgPGRpdiBpZD1cImxpY2Vuc2UtZmVhdHVyZS1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDhweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwibGljZW5zZS1lcnJvclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDIzMSw3Niw2MCwwLjE1KTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLXN1Y2Nlc3NcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJvcmRlci1yYWRpdXM6IDRweDsgYmFja2dyb3VuZDogcmdiYSg0NiwyMDQsMTEzLDAuMTUpOyBjb2xvcjogdmFyKC0tb2stZmcpOyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsaWNlbnNlLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsaWNlbnNlLWRlYWN0aXZhdGVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IGJhY2tncm91bmQ6IHZhcigtLWJhZC1iZyk7IGJvcmRlci1jb2xvcjogdmFyKC0tYmFkLWZnKTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGVhY3RpdmF0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwibGljZW5zZS1hY3RpdmF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiPkFjdGl2YXRlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1tb2RhbCcpO1xuICBjb25zdCBjb2RlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1jb2RlLWlucHV0Jyk7XG4gIGNvbnN0IGFjdGl2YXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtYWN0aXZhdGUnKTtcbiAgY29uc3QgZGVhY3RpdmF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWRlYWN0aXZhdGUnKTtcbiAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWVycm9yJyk7XG4gIGNvbnN0IHN1Y2Nlc3NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXN1Y2Nlc3MnKTtcbiAgY29uc3QgYmFkZ2VJY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtYmFkZ2UtaWNvbicpO1xuICBjb25zdCBiYWRnZVRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1iYWRnZS10ZXh0Jyk7XG4gIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtYmFkZ2UnKTtcbiAgY29uc3QgZGV0YWlsc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtZGV0YWlscycpO1xuICBjb25zdCBmZWF0dXJlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWZlYXR1cmUtbGlzdCcpO1xuICBjb25zdCBhY3RpdmF0ZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1hY3RpdmF0ZS1zZWN0aW9uJyk7XG5cbiAgbGV0IGN1cnJlbnRTdGF0dXMgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGhpZGVNZXNzYWdlcygpIHtcbiAgICBlcnJvckVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgc3VjY2Vzc0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93RXJyb3IobXNnKSB7XG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IG1zZztcbiAgICBlcnJvckVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1N1Y2Nlc3MobXNnKSB7XG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgc3VjY2Vzc0VsLnRleHRDb250ZW50ID0gbXNnO1xuICAgIHN1Y2Nlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlclN0YXR1cyhzdGF0dXMpIHtcbiAgICBjdXJyZW50U3RhdHVzID0gc3RhdHVzO1xuXG4gICAgaWYgKHN0YXR1cy5hY3RpdmUpIHtcbiAgICAgIGJhZGdlLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSg0NiwyMDQsMTEzLDAuMTUpJztcbiAgICAgIGJhZGdlLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgICBiYWRnZUljb24udGV4dENvbnRlbnQgPSAnXFx1MjYwNSc7XG4gICAgICBiYWRnZVRleHQudGV4dENvbnRlbnQgPSAnUHJlbWl1bSBBY3RpdmUnO1xuICAgICAgY29uc3QgZXhwaXJ5TGluZSA9IHN0YXR1cy5saWZldGltZVxuICAgICAgICA/ICc8ZGl2PkxpY2Vuc2U6IDxzdHJvbmc+TElGRVRJTUU8L3N0cm9uZz48L2Rpdj4nXG4gICAgICAgIDogYDxkaXY+RXhwaXJlczogPHN0cm9uZz4ke25ldyBEYXRlKHN0YXR1cy5leHBpcmVzQXQpLnRvTG9jYWxlRGF0ZVN0cmluZygpfTwvc3Ryb25nPiAoJHtzdGF0dXMuZGF5c1JlbWFpbmluZ30gZGF5cyByZW1haW5pbmcpPC9kaXY+YDtcbiAgICAgIGRldGFpbHNFbC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXY+Q29kZTogPGNvZGUgc3R5bGU9XCJmb250LWZhbWlseTogbW9ub3NwYWNlO1wiPiR7c3RhdHVzLmNvZGUgfHwgJyoqKid9PC9jb2RlPjwvZGl2PlxuICAgICAgICAke2V4cGlyeUxpbmV9XG4gICAgICBgO1xuICAgICAgYWN0aXZhdGVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBhY3RpdmF0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgZGVhY3RpdmF0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhZGdlLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSgxNDksMTY1LDE2NiwwLjE1KSc7XG4gICAgICBiYWRnZS5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICAgICAgYmFkZ2VJY29uLnRleHRDb250ZW50ID0gJ1xcdTI2MDYnO1xuICAgICAgYmFkZ2VUZXh0LnRleHRDb250ZW50ID0gc3RhdHVzLmV4cGlyZWQgPyAnTGljZW5zZSBFeHBpcmVkJyA6ICdGcmVlIFRpZXInO1xuICAgICAgZGV0YWlsc0VsLmlubmVySFRNTCA9IHN0YXR1cy5leHBpcmVkXG4gICAgICAgID8gJzxkaXY+WW91ciBsaWNlbnNlIGhhcyBleHBpcmVkLiBFbnRlciBhIG5ldyBjb2RlIHRvIHJlbmV3LjwvZGl2PidcbiAgICAgICAgOiAnPGRpdj5FbnRlciBhIGxpY2Vuc2UgY29kZSB0byB1bmxvY2sgcHJlbWl1bSBmZWF0dXJlcy48L2Rpdj4nO1xuICAgICAgYWN0aXZhdGVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGFjdGl2YXRlQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGRlYWN0aXZhdGVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgZmVhdHVyZSBsaXN0XG4gICAgY29uc3QgZmVhdHVyZXMgPSBzdGF0dXMucHJlbWl1bUZlYXR1cmVzIHx8IHt9O1xuICAgIGNvbnN0IGFjdGl2ZUZlYXR1cmVzID0gbmV3IFNldChzdGF0dXMuZmVhdHVyZXMgfHwgW10pO1xuICAgIGZlYXR1cmVMaXN0LmlubmVySFRNTCA9IE9iamVjdC5lbnRyaWVzKGZlYXR1cmVzKS5tYXAoKFtrZXksIGluZm9dKSA9PiB7XG4gICAgICBjb25zdCBhY3RpdmUgPSBhY3RpdmVGZWF0dXJlcy5oYXMoa2V5KTtcbiAgICAgIHJldHVybiBgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBwYWRkaW5nOiA4cHggMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTtcIj4ke2FjdGl2ZSA/ICdcXHUyNzA1JyA6ICdcXHVEODNEXFx1REQxMid9PC9zcGFuPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOXJlbTtcIj4ke2luZm8ubmFtZX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7aW5mby5kZXNjcmlwdGlvbn08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFN0YXR1cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xpY2Vuc2Uvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHJlbmRlclN0YXR1cyhkYXRhLmxpY2Vuc2UpO1xuICAgICAgICB1cGRhdGVIZWFkZXJCYWRnZShkYXRhLmxpY2Vuc2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgbGljZW5zZSBzdGF0dXM6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZUxpY2Vuc2UoKSB7XG4gICAgY29uc3QgY29kZSA9IGNvZGVJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFjb2RlKSB7XG4gICAgICBzaG93RXJyb3IoJ1BsZWFzZSBlbnRlciBhIGxpY2Vuc2UgY29kZS4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBhY3RpdmF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgYWN0aXZhdGVCdG4udGV4dENvbnRlbnQgPSAnQWN0aXZhdGluZy4uLic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2xpY2Vuc2UvYWN0aXZhdGUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb2RlIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcblxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93U3VjY2VzcyhkYXRhLm1lc3NhZ2UpO1xuICAgICAgICBjb2RlSW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgcmVuZGVyU3RhdHVzKGRhdGEubGljZW5zZSk7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0xpY2Vuc2UgYWN0aXZhdGVkISBQcmVtaXVtIGZlYXR1cmVzIHVubG9ja2VkLicsICdzdWNjZXNzJywgNTAwMCk7XG4gICAgICAgIHVwZGF0ZUhlYWRlckJhZGdlKGRhdGEubGljZW5zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93RXJyb3IoZGF0YS5lcnJvciB8fCAnQWN0aXZhdGlvbiBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ05ldHdvcmsgZXJyb3I6ICcgKyBlLm1lc3NhZ2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhY3RpdmF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYWN0aXZhdGVCdG4udGV4dENvbnRlbnQgPSAnQWN0aXZhdGUnO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRlYWN0aXZhdGVMaWNlbnNlKCkge1xuICAgIGlmICghY29uZmlybSgnRGVhY3RpdmF0ZSB5b3VyIGxpY2Vuc2U/IFlvdSBjYW4gcmV1c2UgdGhlIGNvZGUgb24gYW5vdGhlciBtYWNoaW5lLicpKSByZXR1cm47XG5cbiAgICBkZWFjdGl2YXRlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBkZWFjdGl2YXRlQnRuLnRleHRDb250ZW50ID0gJ0RlYWN0aXZhdGluZy4uLic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2xpY2Vuc2UvZGVhY3RpdmF0ZScsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd1N1Y2Nlc3MoZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgYXdhaXQgbG9hZFN0YXR1cygpO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdMaWNlbnNlIGRlYWN0aXZhdGVkLicsICdpbmZvJywgMzAwMCk7XG4gICAgICAgIHVwZGF0ZUhlYWRlckJhZGdlKHsgYWN0aXZlOiBmYWxzZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dFcnJvcihkYXRhLmVycm9yIHx8ICdEZWFjdGl2YXRpb24gZmFpbGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd0Vycm9yKCdOZXR3b3JrIGVycm9yOiAnICsgZS5tZXNzYWdlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGVhY3RpdmF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgZGVhY3RpdmF0ZUJ0bi50ZXh0Q29udGVudCA9ICdEZWFjdGl2YXRlJztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVIZWFkZXJCYWRnZShzdGF0dXMpIHtcbiAgICBjb25zdCB0b3BiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1zdGF0dXMtdG9wYmFyJyk7XG4gICAgY29uc3QgaWNvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtdG9wYmFyLWljb24nKTtcbiAgICBjb25zdCB0ZXh0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS10b3BiYXItdGV4dCcpO1xuICAgIGNvbnN0IHRpbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXRvcGJhci10aW1lJyk7XG4gICAgaWYgKCF0b3BiYXIpIHJldHVybjtcblxuICAgIHRvcGJhci5jbGFzc05hbWUgPSAnbGljZW5zZS1zdGF0dXMtdG9wYmFyICcgKyAoc3RhdHVzLmFjdGl2ZSA/ICdwcmVtaXVtJyA6ICdmcmVlJyk7XG5cbiAgICBpZiAoc3RhdHVzLmFjdGl2ZSkge1xuICAgICAgaWNvbkVsLnRleHRDb250ZW50ID0gJ1xcdTI2MDUnO1xuICAgICAgdGV4dEVsLnRleHRDb250ZW50ID0gJ1BSRU1JVU0nO1xuICAgICAgaWYgKHN0YXR1cy5saWZldGltZSkge1xuICAgICAgICB0aW1lRWwudGV4dENvbnRlbnQgPSAnXFx1MDBiNyBMSUZFVElNRSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkYXlzID0gc3RhdHVzLmRheXNSZW1haW5pbmc7XG4gICAgICAgIHRpbWVFbC50ZXh0Q29udGVudCA9IGRheXMgIT0gbnVsbCA/ICdcXHUwMGI3ICcgKyBkYXlzICsgJ2QgcmVtYWluaW5nJyA6ICcnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpY29uRWwudGV4dENvbnRlbnQgPSAnXFx1MjYwNic7XG4gICAgICB0ZXh0RWwudGV4dENvbnRlbnQgPSBzdGF0dXMuZXhwaXJlZCA/ICdFWFBJUkVEJyA6ICdGUkVFIFRJRVInO1xuICAgICAgdGltZUVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbkxpY2Vuc2VNb2RhbCgpIHtcbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBsb2FkU3RhdHVzKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG5cbiAgLy8gRm9ybWF0IGNvZGUgaW5wdXQgYXMgdXNlciB0eXBlcyAoYXV0by1hZGQgZGFzaGVzKVxuICBjb2RlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbigpIHtcbiAgICBsZXQgdmFsID0gdGhpcy52YWx1ZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoL1teQS1aMC05LV0vZywgJycpO1xuICAgIC8vIERvbid0IGF1dG8tZm9ybWF0IGlmIHVzZXIgaXMgZGVsZXRpbmdcbiAgICBpZiAodmFsLmxlbmd0aCA+IHRoaXMuX3ByZXZMZW5ndGgpIHtcbiAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKC8tL2csICcnKTtcbiAgICAgIGlmICh2YWwubGVuZ3RoID4gMiAmJiAhdmFsLnN0YXJ0c1dpdGgoJ0RDJykpIHtcbiAgICAgICAgdmFsID0gJ0RDJyArIHZhbDtcbiAgICAgIH1cbiAgICAgIC8vIEFkZCBkYXNoZXMgYWZ0ZXIgREMgYW5kIGV2ZXJ5IDUgY2hhcnNcbiAgICAgIGlmICh2YWwuc3RhcnRzV2l0aCgnREMnKSAmJiB2YWwubGVuZ3RoID4gMikge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IFsnREMnXTtcbiAgICAgICAgY29uc3QgcmVzdCA9IHZhbC5zdWJzdHJpbmcoMik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdC5sZW5ndGg7IGkgKz0gNSkge1xuICAgICAgICAgIHBhcnRzLnB1c2gocmVzdC5zdWJzdHJpbmcoaSwgaSArIDUpKTtcbiAgICAgICAgfVxuICAgICAgICB2YWwgPSBwYXJ0cy5qb2luKCctJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3ByZXZMZW5ndGggPSB2YWwubGVuZ3RoO1xuICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gIH0pO1xuXG4gIC8vIFdpcmUgdXAgZXZlbnRzXG4gIGFjdGl2YXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWN0aXZhdGVMaWNlbnNlKTtcbiAgZGVhY3RpdmF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGRlYWN0aXZhdGVMaWNlbnNlKTtcbiAgY29kZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgYWN0aXZhdGVMaWNlbnNlKCk7XG4gIH0pO1xuICB3aXJlTW9kYWwobW9kYWwsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWNhbmNlbCcpKTtcbiAgY29uc3QgdG9wYmFyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1zdGF0dXMtdG9wYmFyJyk7XG4gIGlmICh0b3BiYXJFbCkgdG9wYmFyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB3aW5kb3cub3BlbkxpY2Vuc2VNb2RhbCAmJiB3aW5kb3cub3BlbkxpY2Vuc2VNb2RhbCgpKTtcblxuICAvLyBFeHBvc2UgZm9yIG90aGVyIG1vZHVsZXMgdG8gb3BlblxuICB3aW5kb3cub3BlbkxpY2Vuc2VNb2RhbCA9IG9wZW5MaWNlbnNlTW9kYWw7XG5cbiAgLy8gRXhwb3NlIGZlYXR1cmUgY2hlY2sgZm9yIGZyb250ZW5kIGdhdGluZ1xuICB3aW5kb3cuY2hlY2tQcmVtaXVtRmVhdHVyZSA9IGFzeW5jIGZ1bmN0aW9uKGZlYXR1cmUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2xpY2Vuc2UvZmVhdHVyZS8ke2ZlYXR1cmV9YCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICByZXR1cm4gZGF0YS5hdmFpbGFibGU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIC8vIExvYWQgc3RhdHVzIG9uIHBhZ2UgbG9hZFxuICBsb2FkU3RhdHVzKCkudGhlbihzdGF0dXMgPT4ge1xuICAgIGlmIChjdXJyZW50U3RhdHVzKSB1cGRhdGVIZWFkZXJCYWRnZShjdXJyZW50U3RhdHVzKTtcbiAgfSk7XG59KSgpO1xuO1xuLy8gU2hhcmUgTW9kYWwgXHUyMDE0IERDLTA1OFxuLy9cbi8vIEFkbWluIFVJIGZvciBEQy0wNTMgc2hhcmUgcm91dGVzLiBPcGVuZWQgZnJvbSB0aGUgXCJTaGFyZVwiIGJ1dHRvbiBvbiBlYWNoXG4vLyBzZXJ2aWNlIGNhcmQgKGFkZGVkIGluIGNvcmUvZ3JpZC5qcyBuZXh0IHRvIHRoZSBleGlzdGluZyBvcHRpb25zL2RlbGV0ZVxuLy8gYnV0dG9ucykuIFR3byB0YWJzOlxuLy8gICAtIFB1YmxpYyBsaW5rOiBwaWNrIGEgVFRMICgxaC8yNGgvN2QpLCBQT1NUIC9hcGkvdjEvc2hhcmUsIHJlbmRlciB0aGVcbi8vICAgICByZXR1cm5lZCB1cmxQYXRoIHdpdGggYSBjb3B5IGJ1dHRvbiArIHJldm9rZSBjb250cm9sLlxuLy8gICAtIFRhaWxzY2FsZSBpbnZpdGU6IGVudGVyIGFuIGVtYWlsLCBQT1NUIC9hcGkvdjEvc2hhcmUvdGFpbHNjYWxlLCByZW5kZXJcbi8vICAgICBkZWxpdmVyZWQgc3RhdHVzIChpbmJveCB2cyBkZXYtY29uc29sZSBmYWxsYmFjayB2cyBVUkwgZmFsbGJhY2spLlxuLy9cbi8vIE1vZGFsIGFsc28gbGlzdHMgb3V0c3RhbmRpbmcgc2hhcmVzIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZSAoR0VUIC9hcGkvdjEvc2hhcmUpXG4vLyB3aXRoIHJldm9rZSBidXR0b25zLiBUaGUgbGlzdCByZWZyZXNoZXMgYWZ0ZXIgZXZlcnkgaXNzdWUvcmV2b2tlLlxuLy9cbi8vIEJvdGggaXNzdWUgZW5kcG9pbnRzIGFyZSBQcm8tZ2F0ZWQgb24gdGhlIHNlcnZlciBcdTIwMTQgdGhlIG1vZGFsIHN1cmZhY2VzIGEgNDAyXG4vLyBhcyBhbiB1cGdyYWRlIHByb21wdCAoXCJTaGFyZSBpcyBhIFBybyBmZWF0dXJlLiBBY3RpdmF0ZSBhIGxpY2Vuc2UgdG8gdW5sb2NrLlwiKS5cbi8vIFRhaWxzY2FsZSBpbnZpdGVzIGFkZGl0aW9uYWxseSByZXF1aXJlIHRhaWxzY2FsZUNvb3JkIGNvbmZpZ3VyZWQgb24gdGhlIGhvc3Q7XG4vLyB0aGUgc2VydmVyIHJldHVybnMgNDAwIHdpdGggYSBjbGVhciBtZXNzYWdlIHdoZW4gbWlzc2luZy5cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgaWYgKHdpbmRvdy5fX2RjXzA1OF9zaGFyZV9tb2RhbF9sb2FkZWQpIHJldHVybjtcbiAgd2luZG93Ll9fZGNfMDU4X3NoYXJlX21vZGFsX2xvYWRlZCA9IHRydWU7XG5cbiAgY29uc3QgVFRMX09QVElPTlMgPSBbXG4gICAgeyBtczogNjAgKiA2MCAqIDEwMDAsIGxhYmVsOiAnMSBob3VyJyB9LFxuICAgIHsgbXM6IDI0ICogNjAgKiA2MCAqIDEwMDAsIGxhYmVsOiAnMjQgaG91cnMnIH0sXG4gICAgeyBtczogNyAqIDI0ICogNjAgKiA2MCAqIDEwMDAsIGxhYmVsOiAnNyBkYXlzJyB9LFxuICBdO1xuXG4gIGluamVjdE1vZGFsKCdzaGFyZS1tb2RhbCcsIGBcbiAgICA8ZGl2IGlkPVwic2hhcmUtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwic2hhcmUtbW9kYWwtdGl0bGVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDYwcHg7IG1heC13aWR0aDogNTgwcHg7XCI+XG4gICAgICAgIDxoMyBpZD1cInNoYXJlLW1vZGFsLXRpdGxlXCI+U2hhcmUgPHNwYW4gaWQ9XCJzaGFyZS1tb2RhbC1zZXJ2aWNlLW5hbWVcIj5cdTIwMjY8L3NwYW4+PC9oMz5cbiAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDE2cHg7XCI+XG4gICAgICAgICAgQ3JlYXRlIGEgcHVibGljIGxpbmsgb3IgVGFpbHNjYWxlIGludml0ZSBzbyBzb21lb25lIG91dHNpZGUgeW91ciBuZXR3b3JrIGNhbiBhY2Nlc3MgdGhpcyBzZXJ2aWNlLlxuICAgICAgICA8L3A+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNoYXJlLXRhYnNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4OyBtYXJnaW4tYm90dG9tOiAxNnB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2hhcmUtdGFiIGFjdGl2ZVwiIGRhdGEtdGFiPVwicHVibGljXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBib3JkZXI6IDA7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1hY2NlbnQpOyBwYWRkaW5nOiA4cHggMTRweDsgY29sb3I6IHZhcigtLWZnKTsgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgUHVibGljIGxpbmtcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2hhcmUtdGFiXCIgZGF0YS10YWI9XCJ0YWlsc2NhbGVcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGJvcmRlcjogMDsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHRyYW5zcGFyZW50OyBwYWRkaW5nOiA4cHggMTRweDsgY29sb3I6IHZhcigtLW11dGVkKTsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgVGFpbHNjYWxlIGludml0ZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hhcmUtdGFiLXBhbmVsXCIgZGF0YS1wYW5lbD1cInB1YmxpY1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiIGZvcj1cInNoYXJlLXB1YmxpYy10dGxcIj5MaW5rIGR1cmF0aW9uOjwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInNoYXJlLXB1YmxpYy10dGxcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTBweDsgbWFyZ2luOiA2cHggMCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1pbnB1dC1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cbiAgICAgICAgICAgICR7VFRMX09QVElPTlMubWFwKG8gPT4gYDxvcHRpb24gdmFsdWU9XCIke28ubXN9XCI+JHtvLmxhYmVsfTwvb3B0aW9uPmApLmpvaW4oJycpfVxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJzaGFyZS1wdWJsaWMtY3JlYXRlXCIgY2xhc3M9XCJidG4tYWNjZW50XCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogIzA0MTQxZjsgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIENyZWF0ZSBzaGFyZSBsaW5rXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGFyZS10YWItcGFuZWxcIiBkYXRhLXBhbmVsPVwidGFpbHNjYWxlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiIGZvcj1cInNoYXJlLXRzLWVtYWlsXCI+UmVjaXBpZW50IGVtYWlsOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IGlkPVwic2hhcmUtdHMtZW1haWxcIiB0eXBlPVwiZW1haWxcIiBwbGFjZWhvbGRlcj1cImFsaWNlQGV4YW1wbGUuY29tXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHggMTJweDsgbWFyZ2luOiA2cHggMCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOTVyZW07XCIgLz5cbiAgICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxMnB4O1wiPlxuICAgICAgICAgICAgQSBzaW5nbGUtdXNlIFRhaWxzY2FsZSBwcmUtYXV0aCBrZXkgaXMgZ2VuZXJhdGVkIGFuZCBlbWFpbGVkLiBUaGUgZGV2aWNlIGpvaW5zIHlvdXIgdGFpbG5ldCBhbmQgaXMgcm91dGVkIHRvIHRoaXMgc2VydmljZSB2aWEgQ2FkZHkuXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJzaGFyZS10cy1jcmVhdGVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiAjMDQxNDFmOyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgQ3JlYXRlIFRhaWxzY2FsZSBpbnZpdGVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cInNoYXJlLWlzc3VlZFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDZweDtcIj5TaGFyZSBsaW5rOjwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIDxpbnB1dCBpZD1cInNoYXJlLWlzc3VlZC11cmxcIiB0eXBlPVwidGV4dFwiIHJlYWRvbmx5XG4gICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogOHB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuODVyZW07XCIgLz5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzaGFyZS1pc3N1ZWQtY29weVwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogIzA0MTQxZjsgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgQ29weVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInNoYXJlLWlzc3VlZC1tZXRhXCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogOHB4O1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwic2hhcmUtZXJyb3JcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJvcmRlci1yYWRpdXM6IDRweDsgYmFja2dyb3VuZDogcmdiYSgyMzEsNzYsNjAsMC4xNSk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJzaGFyZS1zdWNjZXNzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHJnYmEoNDYsMjA0LDExMywwLjE1KTsgY29sb3I6IHZhcigtLW9rLWZnKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJzaGFyZS1vdXRzdGFuZGluZ1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5PdXRzdGFuZGluZyBzaGFyZXMgZm9yIHRoaXMgc2VydmljZTwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBpZD1cInNoYXJlLW91dHN0YW5kaW5nLWxpc3RcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxOHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJzaGFyZS1jYW5jZWxcIiB0eXBlPVwiYnV0dG9uXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtbW9kYWwnKTtcbiAgY29uc3Qgc2VydmljZU5hbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1tb2RhbC1zZXJ2aWNlLW5hbWUnKTtcbiAgY29uc3QgaXNzdWVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtaXNzdWVkJyk7XG4gIGNvbnN0IGlzc3VlZFVybElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLWlzc3VlZC11cmwnKTtcbiAgY29uc3QgaXNzdWVkQ29weUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1pc3N1ZWQtY29weScpO1xuICBjb25zdCBpc3N1ZWRNZXRhRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtaXNzdWVkLW1ldGEnKTtcbiAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1lcnJvcicpO1xuICBjb25zdCBzdWNjZXNzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtc3VjY2VzcycpO1xuICBjb25zdCBvdXRzdGFuZGluZ0xpc3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1vdXRzdGFuZGluZy1saXN0Jyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1jYW5jZWwnKTtcbiAgY29uc3QgcHVibGljQ3JlYXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLXB1YmxpYy1jcmVhdGUnKTtcbiAgY29uc3QgdHNDcmVhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtdHMtY3JlYXRlJyk7XG4gIGNvbnN0IHRzRW1haWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS10cy1lbWFpbCcpO1xuICBjb25zdCBwdWJsaWNUdGxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtcHVibGljLXR0bCcpO1xuXG4gIGxldCBjdXJyZW50U2VydmljZSA9IG51bGw7IC8vIHsgaWQsIG5hbWUgfVxuICBsZXQgYWN0aXZlVGFiID0gJ3B1YmxpYyc7XG5cbiAgZnVuY3Rpb24gaGlkZU1lc3NhZ2VzKCkge1xuICAgIGVycm9yRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdWNjZXNzRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpc3N1ZWRFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd0Vycm9yKG1zZykge1xuICAgIHN1Y2Nlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlzc3VlZEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IG1zZztcbiAgICBlcnJvckVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1N1Y2Nlc3MobXNnKSB7XG4gICAgZXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHN1Y2Nlc3NFbC50ZXh0Q29udGVudCA9IG1zZztcbiAgICBzdWNjZXNzRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH1cblxuICBmdW5jdGlvbiBfb3JpZ2luRnJvbVBhZ2UoKSB7XG4gICAgLy8gQnVpbGQgdGhlIGFic29sdXRlIHNoYXJlIFVSTCBmcm9tIHRoZSBwYWdlJ3MgY3VycmVudCBvcmlnaW4gc28gdGhlXG4gICAgLy8gbGluayBpcyBjb3JyZWN0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdXNlciBpcyBvbiBodHRwOi8vbG9jYWxob3N0XG4gICAgLy8gKGRldikgb3IgaHR0cHM6Ly9zdGF0dXMuc2FtaSAocHJvZCkuIFRoZSB1cmxQYXRoIHJldHVybmVkIGJ5IHRoZSBBUElcbiAgICAvLyBpcyBhIHBhdGgtb25seSBzdHJpbmcgc3RhcnRpbmcgd2l0aCAvc2hhcmUvLlxuICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICB9XG5cbiAgZnVuY3Rpb24gX2Fic1VybCh1cmxQYXRoKSB7XG4gICAgaWYgKHVybFBhdGguc3RhcnRzV2l0aCgnaHR0cCcpKSByZXR1cm4gdXJsUGF0aDtcbiAgICByZXR1cm4gX29yaWdpbkZyb21QYWdlKCkgKyB1cmxQYXRoO1xuICB9XG5cbiAgZnVuY3Rpb24gX2Zvcm1hdEV4cGlyeShpc28pIHtcbiAgICBpZiAoIWlzbykgcmV0dXJuICcnO1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShpc28pO1xuICAgIGlmIChOdW1iZXIuaXNOYU4oZC5nZXRUaW1lKCkpKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9mb3JtYXRSZW1haW5pbmcobXMpIHtcbiAgICBpZiAobXMgPD0gMCkgcmV0dXJuICdleHBpcmVkJztcbiAgICBjb25zdCBoID0gTWF0aC5mbG9vcihtcyAvIDM2MDAwMDApO1xuICAgIGlmIChoID49IDI0KSByZXR1cm4gYCR7TWF0aC5mbG9vcihoIC8gMjQpfWQgJHtoICUgMjR9aCBsZWZ0YDtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigobXMgJSAzNjAwMDAwKSAvIDYwMDAwKTtcbiAgICByZXR1cm4gYCR7aH1oICR7bX1tIGxlZnRgO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0QWN0aXZlVGFiKG5hbWUpIHtcbiAgICBhY3RpdmVUYWIgPSBuYW1lO1xuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaGFyZS10YWInKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IGJ0bi5kYXRhc2V0LnRhYiA9PT0gbmFtZTtcbiAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCBpc0FjdGl2ZSk7XG4gICAgICBidG4uc3R5bGUuYm9yZGVyQm90dG9tQ29sb3IgPSBpc0FjdGl2ZSA/ICd2YXIoLS1hY2NlbnQpJyA6ICd0cmFuc3BhcmVudCc7XG4gICAgICBidG4uc3R5bGUuY29sb3IgPSBpc0FjdGl2ZSA/ICd2YXIoLS1mZyknIDogJ3ZhcigtLW11dGVkKSc7XG4gICAgICBidG4uc3R5bGUuZm9udFdlaWdodCA9IGlzQWN0aXZlID8gJzYwMCcgOiAnNDAwJztcbiAgICB9KTtcbiAgICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hhcmUtdGFiLXBhbmVsJykuZm9yRWFjaChwID0+IHtcbiAgICAgIHAuc3R5bGUuZGlzcGxheSA9IHAuZGF0YXNldC5wYW5lbCA9PT0gbmFtZSA/ICcnIDogJ25vbmUnO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZE91dHN0YW5kaW5nKCkge1xuICAgIG91dHN0YW5kaW5nTGlzdEVsLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TG9hZGluZ1x1MjAyNjwvc3Bhbj4nO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2hhcmUnLCB7IGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nIH0pO1xuICAgICAgaWYgKCFyZXNwLm9rKSB7XG4gICAgICAgIG91dHN0YW5kaW5nTGlzdEVsLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gc2hhcmVzIGxpc3RlZC48L3NwYW4+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgY29uc3QgbGlzdCA9IChib2R5ICYmIGJvZHkuZGF0YSkgfHwgW107XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IGxpc3QuZmlsdGVyKHMgPT4gcy5zZXJ2aWNlSWQgPT09IGN1cnJlbnRTZXJ2aWNlLmlkKTtcbiAgICAgIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgb3V0c3RhbmRpbmdMaXN0RWwuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5ObyBvdXRzdGFuZGluZyBzaGFyZXMgZm9yIHRoaXMgc2VydmljZS48L3NwYW4+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3V0c3RhbmRpbmdMaXN0RWwuaW5uZXJIVE1MID0gZmlsdGVyZWQubWFwKHMgPT4ge1xuICAgICAgICBjb25zdCByZW1haW5pbmcgPSBzLmV4cGlyZXNBdCA/IF9mb3JtYXRSZW1haW5pbmcobmV3IERhdGUocy5leHBpcmVzQXQpLmdldFRpbWUoKSAtIERhdGUubm93KCkpIDogJyc7XG4gICAgICAgIHJldHVybiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNoYXJlLXJvd1wiIGRhdGEtc2hhcmUtaWQ9XCIke2VzY2FwZUh0bWwocy5pZCl9XCJcbiAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IHBhZGRpbmc6IDZweCAwOyBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgICAgIDxzdHJvbmc+JHtzLmtpbmQgPT09ICd0YWlsc2NhbGUnID8gJ1RhaWxzY2FsZScgOiAnUHVibGljJ308L3N0cm9uZz5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiBcdTAwQjcgZXhwaXJlcyAke2VzY2FwZUh0bWwoX2Zvcm1hdEV4cGlyeShzLmV4cGlyZXNBdCkpfSAoJHtyZW1haW5pbmd9KTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaGFyZS1yZXZva2VcIiBkYXRhLXNoYXJlLWlkPVwiJHtlc2NhcGVIdG1sKHMuaWQpfVwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJhZC1mZyk7IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuOHJlbTtcIj5cbiAgICAgICAgICAgICAgUmV2b2tlXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYDtcbiAgICAgIH0pLmpvaW4oJycpO1xuICAgICAgb3V0c3RhbmRpbmdMaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnLnNoYXJlLXJldm9rZScpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gcmV2b2tlU2hhcmUoYnRuLmRhdGFzZXQuc2hhcmVJZCkpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb3V0c3RhbmRpbmdMaXN0RWwuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5Db3VsZCBub3QgbG9hZCBvdXRzdGFuZGluZyBzaGFyZXMuPC9zcGFuPic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmV2b2tlU2hhcmUoaWQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL3NoYXJlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLCB7XG4gICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgICBzaG93RXJyb3IoYm9keSAmJiBib2R5LmVycm9yIHx8IGBSZXZva2UgZmFpbGVkIChIVFRQICR7cmVzcC5zdGF0dXN9KS5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2hvd1N1Y2Nlc3MoJ1NoYXJlIHJldm9rZWQuJyk7XG4gICAgICBsb2FkT3V0c3RhbmRpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ05ldHdvcmsgZXJyb3Igd2hpbGUgcmV2b2tpbmcuJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaXNzdWVQdWJsaWMoKSB7XG4gICAgaWYgKCFjdXJyZW50U2VydmljZSkgcmV0dXJuO1xuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIHB1YmxpY0NyZWF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBwdWJsaWNDcmVhdGVCdG4udGV4dENvbnRlbnQ7XG4gICAgcHVibGljQ3JlYXRlQnRuLnRleHRDb250ZW50ID0gJ0NyZWF0aW5nXHUyMDI2JztcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHRsTXMgPSBwYXJzZUludChwdWJsaWNUdGxTZWxlY3QudmFsdWUsIDEwKTtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zaGFyZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXJ2aWNlSWQ6IGN1cnJlbnRTZXJ2aWNlLmlkLCB0dGxNcyB9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgaWYgKCFyZXNwLm9rIHx8ICFib2R5LnN1Y2Nlc3MpIHtcbiAgICAgICAgX3JlbmRlckFwaUVycm9yKHJlc3Auc3RhdHVzLCBib2R5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdXJsUGF0aCA9IGJvZHkuZGF0YS51cmxQYXRoO1xuICAgICAgaXNzdWVkVXJsSW5wdXQudmFsdWUgPSBfYWJzVXJsKHVybFBhdGgpO1xuICAgICAgaXNzdWVkTWV0YUVsLnRleHRDb250ZW50ID0gYFB1YmxpYyBsaW5rIFx1MDBCNyBleHBpcmVzICR7X2Zvcm1hdEV4cGlyeShib2R5LmRhdGEuZXhwaXJlc0F0KX1gO1xuICAgICAgaXNzdWVkRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICBzaG93U3VjY2VzcygnU2hhcmUgbGluayBjcmVhdGVkLicpO1xuICAgICAgbG9hZE91dHN0YW5kaW5nKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd0Vycm9yKCdOZXR3b3JrIGVycm9yIHdoaWxlIGNyZWF0aW5nIHNoYXJlLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBwdWJsaWNDcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHB1YmxpY0NyZWF0ZUJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGlzc3VlVGFpbHNjYWxlKCkge1xuICAgIGlmICghY3VycmVudFNlcnZpY2UpIHJldHVybjtcbiAgICBjb25zdCBlbWFpbCA9ICh0c0VtYWlsSW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIWVtYWlsIHx8ICFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICBzaG93RXJyb3IoJ0EgdmFsaWQgcmVjaXBpZW50IGVtYWlsIGlzIHJlcXVpcmVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICB0c0NyZWF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSB0c0NyZWF0ZUJ0bi50ZXh0Q29udGVudDtcbiAgICB0c0NyZWF0ZUJ0bi50ZXh0Q29udGVudCA9ICdDcmVhdGluZ1x1MjAyNic7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zaGFyZS90YWlsc2NhbGUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmljZUlkOiBjdXJyZW50U2VydmljZS5pZCwgZW1haWwgfSksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgIGlmICghcmVzcC5vayB8fCAhYm9keS5zdWNjZXNzKSB7XG4gICAgICAgIF9yZW5kZXJBcGlFcnJvcihyZXNwLnN0YXR1cywgYm9keSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFRhaWxzY2FsZSBzaGFyZXMgc2hvdyB0aGUgcmF3IHVybFBhdGggKHdoaWNoIGlzIHRoZSBzaGFyZSBVUkwpIGlmXG4gICAgICAvLyBlbWFpbCBkZWxpdmVyeSBmYWlsZWQuIFRoZSBzaGFyZSBpdHNlbGYgaXMgb25lLXNob3Qgc28gdGhlIGFkbWluXG4gICAgICAvLyBjYW4gbWFudWFsbHkgcGFzdGUgdGhlIGxpbmsgaW50byBhIGNoYXQgaWYgU01UUCBmYWlsZWQuXG4gICAgICBjb25zdCBmYWxsYmFjayA9IGJvZHkuZGF0YSAmJiBib2R5LmRhdGEudXJsUGF0aDtcbiAgICAgIGlmIChmYWxsYmFjaykge1xuICAgICAgICBpc3N1ZWRVcmxJbnB1dC52YWx1ZSA9IF9hYnNVcmwoZmFsbGJhY2spO1xuICAgICAgICBpc3N1ZWRNZXRhRWwudGV4dENvbnRlbnQgPSBgVGFpbHNjYWxlIGludml0ZSBcdTAwQjcgZW1haWxlZCB0byAke2VtYWlsfSAob3IgdXNlIHRoaXMgVVJMIG1hbnVhbGx5IGlmIGRlbGl2ZXJ5IGZhaWxlZCkuYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzc3VlZFVybElucHV0LnZhbHVlID0gJyc7XG4gICAgICAgIGlzc3VlZE1ldGFFbC50ZXh0Q29udGVudCA9IGBUYWlsc2NhbGUgaW52aXRlIHNlbnQgdG8gJHtlbWFpbH0uYDtcbiAgICAgIH1cbiAgICAgIGlzc3VlZEVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgc2hvd1N1Y2Nlc3MoJ1RhaWxzY2FsZSBpbnZpdGUgY3JlYXRlZC4nKTtcbiAgICAgIHRzRW1haWxJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgbG9hZE91dHN0YW5kaW5nKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd0Vycm9yKCdOZXR3b3JrIGVycm9yIHdoaWxlIGNyZWF0aW5nIFRhaWxzY2FsZSBpbnZpdGUuJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRzQ3JlYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB0c0NyZWF0ZUJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJBcGlFcnJvcihzdGF0dXMsIGJvZHkpIHtcbiAgICBjb25zdCBlcnIgPSAoYm9keSAmJiBib2R5LmVycm9yKSB8fCAnJztcbiAgICBpZiAoc3RhdHVzID09PSA0MDIpIHtcbiAgICAgIHNob3dFcnJvcignU2hhcmUgaXMgYSBQcm8gZmVhdHVyZS4gQWN0aXZhdGUgYSBsaWNlbnNlIHRvIHVubG9jay4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gNDAwICYmIC90YWlsc2NhbGUvaS50ZXN0KGVycikpIHtcbiAgICAgIHNob3dFcnJvcignVGFpbHNjYWxlIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgaG9zdC4gU2V0IHVwIFRhaWxzY2FsZSBpbiB0aGUgZGFzaGJvYXJkIGZpcnN0LicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgIHNob3dFcnJvcignWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gc2hhcmUgc2VydmljZXMuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgc2hvd0Vycm9yKCdTZXJ2aWNlIG5vdCBmb3VuZC4gSXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzaG93RXJyb3IoZXJyIHx8IGBSZXF1ZXN0IGZhaWxlZCAoSFRUUCAke3N0YXR1c30pLmApO1xuICB9XG5cbiAgZnVuY3Rpb24gb3BlblNoYXJlTW9kYWwoc2VydmljZSkge1xuICAgIGlmICghc2VydmljZSB8fCAhc2VydmljZS5pZCkgcmV0dXJuO1xuICAgIGN1cnJlbnRTZXJ2aWNlID0geyBpZDogc2VydmljZS5pZCwgbmFtZTogc2VydmljZS5uYW1lIHx8IHNlcnZpY2UuaWQgfTtcbiAgICBzZXJ2aWNlTmFtZUVsLnRleHRDb250ZW50ID0gY3VycmVudFNlcnZpY2UubmFtZTtcbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBzZXRBY3RpdmVUYWIoJ3B1YmxpYycpO1xuICAgIHRzRW1haWxJbnB1dC52YWx1ZSA9ICcnO1xuICAgIHB1YmxpY1R0bFNlbGVjdC52YWx1ZSA9IFN0cmluZyhUVExfT1BUSU9OU1sxXS5tcyk7IC8vIDI0aCBkZWZhdWx0XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRPdXRzdGFuZGluZygpO1xuICB9XG5cbiAgLy8gV2lyZSBldmVudHNcbiAgbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnNoYXJlLXRhYicpLmZvckVhY2goYnRuID0+IHtcbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRBY3RpdmVUYWIoYnRuLmRhdGFzZXQudGFiKSk7XG4gIH0pO1xuICBwdWJsaWNDcmVhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBpc3N1ZVB1YmxpYyk7XG4gIHRzQ3JlYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaXNzdWVUYWlsc2NhbGUpO1xuICBjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG5cbiAgLy8gQ29weS10by1jbGlwYm9hcmQgZm9yIHRoZSBpc3N1ZWQgc2hhcmUgVVJMXG4gIGlzc3VlZENvcHlCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdXJsID0gaXNzdWVkVXJsSW5wdXQudmFsdWU7XG4gICAgaWYgKCF1cmwpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIHtcbiAgICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGZvciBvbGRlciBicm93c2VycyAvIHVuc2FmZSBjb250ZXh0c1xuICAgICAgICBpc3N1ZWRVcmxJbnB1dC5zZWxlY3QoKTtcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gaXNzdWVkQ29weUJ0bi50ZXh0Q29udGVudDtcbiAgICAgIGlzc3VlZENvcHlCdG4udGV4dENvbnRlbnQgPSAnQ29waWVkISc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgaXNzdWVkQ29weUJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsOyB9LCAxMjAwKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ0NvdWxkIG5vdCBjb3B5IHRvIGNsaXBib2FyZC4gU2VsZWN0IHRoZSBVUkwgbWFudWFsbHkuJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBFeHBvc2UgZm9yIG90aGVyIG1vZHVsZXMgdG8gb3BlblxuICB3aW5kb3cub3BlblNoYXJlTW9kYWwgPSBvcGVuU2hhcmVNb2RhbDtcbn0pKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiQ0FDQyxVQUFXLENBRVYsWUFBWSxhQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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QzdCLFNBQVMsT0FBTyxDQUNsQixDQUNGLENBQ0YsR0FBRyxHQUdGLFVBQVksQ0FDWCxNQUFNQyxFQUFlLElBQUksYUFDekIsWUFBWSxxQkFBc0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBUTNCLEVBRVAsWUFBWSxtQkFBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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QUFVLFVBQzdDLE1BQU0sVUFBVSxVQUFVLFVBQVVBLENBQUcsR0FHdkM0eUIsRUFBZSxPQUFPLEVBQ3RCLFNBQVMsWUFBWSxNQUFNLEdBRTdCLE1BQU1zQixFQUFXckIsRUFBYyxZQUMvQkEsRUFBYyxZQUFjLFVBQzVCLFdBQVcsSUFBTSxDQUFFQSxFQUFjLFlBQWNxQixDQUFVLEVBQUcsSUFBSSxDQUNsRSxNQUFZLENBQ1Y1QyxFQUFVLHVEQUF1RCxDQUNuRSxDQUNGLENBQUMsRUFHRCxPQUFPLGVBQWlCZ0QsQ0FDMUIsR0FBRyIsCiAgIm5hbWVzIjogWyJsb2dvTW9kYWwiLCAicHJldmlld0RhcmsiLCAicHJldmlld0xpZ2h0IiwgImxvZ29TdGF0dXMiLCAic2FtZUJvdGhDaGVja2JveCIsICJkdWFsVXBsb2FkcyIsICJzaW5nbGVVcGxvYWQiLCAidXBsb2FkRGFyayIsICJ1cGxvYWRMaWdodCIsICJ1cGxvYWRTaW5nbGUiLCAiYnJhbmRMb2dvRGFyayIsICJicmFuZExvZ29MaWdodCIsICJ0b3BSb3ciLCAiZGFzaGJvYXJkVGl0bGVJbnB1dCIsICJERUZBVUxUX1RJVExFIiwgInBlbmRpbmdEYXJrRGF0YSIsICJwZW5kaW5nTGlnaHREYXRhIiwgInBlbmRpbmdTaW5nbGVEYXRhIiwgImN1cnJlbnRQb3NpdGlvbiIsICJjdXJyZW50VGl0bGUiLCAicmVhZEZpbGVBc0RhdGFVUkwiLCAiZmlsZSIsICJjYWxsYmFjayIsICJyZWFkZXIiLCAiZSIsICJkYXRhIiwgImFwcGx5TG9nb1Bvc2l0aW9uIiwgInBvcyIsICJidG4iLCAiYXBwbHlEYXNoYm9hcmRUaXRsZSIsICJ0aXRsZSIsICJoZWFkZXJUaXRsZSIsICJsb2FkQ3VzdG9tTG9nbyIsICJyZXNwb25zZSIsICJlcnJvciIsICJpc0N1c3RvbSIsICJuZXdUaXRsZSIsICJwYXlsb2FkIiwgInQiLCAiZmF2aWNvbkxpbmsiLCAiZmF2aWNvblByZXZpZXciLCAiZmF2aWNvblN0YXR1cyIsICJwZW5kaW5nRmF2aWNvbkRhdGEiLCAiZmF2aWNvblVwbG9hZCIsICJsb2FkQ3VzdG9tRmF2aWNvbiIsICJldmVudCIsICJzZXR0aW5nc1R6U2VsZWN0IiwgImN1cnJlbnRUeiIsICJyZXMiLCAidHoiLCAiY2ZnIiwgInNlbGVjdEVsIiwgInNlbGVjdGVkVHoiLCAidGltZXpvbmVzIiwgImRldGVjdGVkIiwgIm9wdCIsICJjdXJyZW50Q29uZmlnVHlwZSIsICJzZXJ2ZXJDb25maWciLCAiY2hlY2tTZXJ2ZXJDb25maWciLCAic2V0dXBUelNlbGVjdCIsICJzaG93U3RlcCIsICJzdGVwSWQiLCAic3RlcCIsICJ0YXJnZXRTdGVwIiwgInNob3dTdW1tYXJ5IiwgInN1bW1hcnlDb250ZW50IiwgImh0bWwiLCAidGxkIiwgImNhTmFtZSIsICJkbnNJUCIsICJkbnNQb3J0IiwgImlwIiwgImRvbWFpbiIsICJlbWFpbCIsICJyb3V0aW5nTW9kZSIsICJleGFtcGxlVXJscyIsICJzYXZlQ29uZmlnVG9TZXJ2ZXIiLCAiY29uZmlnIiwgImZpbmlzaFNldHVwIiwgInNlbGVjdGVkUHJvdmlkZXIiLCAic2F2ZWRUb1NlcnZlciIsICJjb25maWdOYW1lIiwgInNhdmVMb2NhdGlvbiIsICJzdGVwMU5leHQiLCAic2VsZWN0ZWQiLCAic2tpcEJ0biIsICJ0bGRJbnB1dCIsICJwcmV2aWV3MSIsICJwcmV2aWV3MiIsICJob21lbGFiQmFjayIsICJob21lbGFiTmV4dCIsICJzaW1wbGVCYWNrIiwgInNpbXBsZU5leHQiLCAicmFkaW8iLCAibm90ZSIsICJwdWJsaWNCYWNrIiwgInB1YmxpY05leHQiLCAic3VtbWFyeUJhY2siLCAic3VtbWFyeU5leHQiLCAiZGlza1NhZmV0eUJhY2siLCAiZmluaXNoQnRuIiwgImNvbmZpZ1N0ciIsICJlcnJvckhhbmRsZXIiLCAiQVBQU19LRVkiLCAiYXBpVGVtcGxhdGVzIiwgImFwaUNhdGVnb3JpZXMiLCAibW9kYWwiLCAiZ3JpZCIsICJmZXRjaEFwcFRlbXBsYXRlcyIsICJjaGVja1BvcnRBdmFpbGFiaWxpdHkiLCAicG9ydCIsICJnZXRTdWdnZXN0ZWRQb3J0IiwgImJhc2VQb3J0IiwgImJ1aWxkQXBwU2VsZWN0b3IiLCAiYnlDYXRlZ29yeSIsICJhcHBJZCIsICJ0ZW1wbGF0ZSIsICJjYXRlZ29yeSIsICJjYXRlZ29yeU9yZGVyIiwgImFwcHMiLCAiYSIsICJiIiwgImhlYWRlciIsICJjYXRlZ29yeUluZm8iLCAiYXBwIiwgIm9wdGlvbiIsICJpc1dpZGdldCIsICJ3aWRnZXRFbmFibGVkIiwgIndpZGdldEJhZGdlIiwgImRpZmZpY3VsdHlCYWRnZSIsICJ0b2dnbGVEYXNoYm9hcmRXaWRnZXQiLCAic2hvd0RlcGxveUNvbmZpZyIsICJvcHRpb25FbCIsICJrZXkiLCAibmV3U3RhdGUiLCAic2VsZWN0b3IiLCAiZWwiLCAiYmFkZ2UiLCAiYXBwVGVtcGxhdGUiLCAiZGVwbG95TW9kYWwiLCAic3ViZG9tYWluSW5wdXQiLCAidXJsUHJldmlldyIsICJpcElucHV0IiwgInBvcnRJbnB1dCIsICJ0YWlsc2NhbGVDaGVja2JveCIsICJ0YWlsc2NhbGVTdGF0dXMiLCAiY2hlY2tSZXN1bHQiLCAiY29udGFpbmVyIiwgImRlZmF1bHRTdWJkb21haW4iLCAic3VicGF0aFdhcm5pbmciLCAic3VwcG9ydCIsICJjZmdEbnNUeXBlIiwgImNmZ1NzbFR5cGUiLCAiZG5zUmFkaW8iLCAic3NsUmFkaW8iLCAiZG5zU2VjdGlvbiIsICJhZHZhbmNlZERldGFpbHMiLCAiYWR2YW5jZWRDb250ZW50IiwgImRuc1NlY3Rpb25FbCIsICJzc2xTZWN0aW9uRWwiLCAibWVkaWFQYXRoU2VjdGlvbiIsICJtZWRpYVBhdGhJbnB1dCIsICJtZWRpYVBhdGhEZXNjcmlwdGlvbiIsICJkZXRlY3RlZE1vdW50c0NvbnRhaW5lciIsICJkZXRlY3RlZE1vdW50c0xpc3QiLCAibW91bnRzUmVzdWx0IiwgImF1dG9QYXRocyIsICJtIiwgIm1vdW50IiwgImlzU2VsZWN0ZWQiLCAiY3VycmVudFBhdGhzIiwgInAiLCAiaWR4IiwgInBsZXhDbGFpbVNlY3Rpb24iLCAidm9sdW1lU2VjdGlvbiIsICJ2b2x1bWVMaXN0IiwgIm1lZGlhQ29udGFpbmVyUGF0aCIsICJub25NZWRpYVZvbHVtZXMiLCAidiIsICJ2b2wiLCAiaSIsICJob3N0RGVmYXVsdCIsICJjb250YWluZXJQYXRoIiwgInJvdyIsICJpbnB1dCIsICJkZWZhdWx0UG9ydCIsICJwb3J0U3RhdHVzIiwgImNoZWNrQW5kVXBkYXRlUG9ydFN0YXR1cyIsICJwb3J0VG9DaGVjayIsICJyZXN1bHQiLCAic3VnZ2VzdGVkUG9ydCIsICJ1c2VCdG4iLCAicG9ydENoZWNrVGltZW91dCIsICJ1cGRhdGVVcmxQcmV2aWV3IiwgInN1YmRvbWFpbiIsICJkbnNUeXBlIiwgInNzbFR5cGUiLCAidXJsIiwgInByb3RvY29sIiwgImFkZEFwcFRvR3JpZCIsICJkZXBsb3lDb25maWciLCAiY3VzdG9tQXBwcyIsICJ1c2luZ0V4aXN0aW5nIiwgImV4aXN0aW5nQXBwIiwgImluZGV4IiwgInBvcnRUb1VzZSIsICJwb3J0Q2hlY2siLCAiYXBpRGVwbG95Q29uZmlnIiwgIm5ld0FwcCIsICJtZXNzYWdlIiwgImNoZWNrU1NMQ2VydGlmaWNhdGUiLCAiaW5zdHJ1Y3Rpb25zIiwgImFwcE5hbWUiLCAiYXR0ZW1wdHMiLCAibWF4QXR0ZW1wdHMiLCAiY2hlY2tDZXJ0IiwgImxvYWRDdXN0b21BcHBzIiwgIm1lZGlhUGF0aCIsICJjdXN0b21Wb2x1bWVzIiwgImZvbGRlckJyb3dzZXJNb2RhbCIsICJmb2xkZXJCcm93c2VyUGF0aCIsICJmb2xkZXJCcm93c2VyTGlzdCIsICJmb2xkZXJCcm93c2VyU2VsZWN0ZWQiLCAiZm9sZGVyQnJvd3NlclNlbGVjdGVkTGlzdCIsICJjdXJyZW50QnJvd3NlclBhdGgiLCAic2VsZWN0ZWRGb2xkZXJzIiwgInRhcmdldE1lZGlhSW5wdXQiLCAibWVkaWFJbnB1dCIsICJ1cGRhdGVTZWxlY3RlZEZvbGRlcnNEaXNwbGF5IiwgImxvYWRGb2xkZXJDb250ZW50cyIsICJwYXRoIiwgIml0ZW0iLCAiaWNvbiIsICJzZWxlY3RlZFN0eWxlIiwgInJlY2lwZVRlbXBsYXRlcyIsICJyZWNpcGVDYXRlZ29yaWVzIiwgImN1cnJlbnRSZWNpcGUiLCAiY3VycmVudFN0ZXAiLCAiaXNQcmVtaXVtIiwgImNhbmNlbEJ0biIsICJwcmV2QnRuIiwgIm5leHRCdG4iLCAiZmV0Y2hSZWNpcGVUZW1wbGF0ZXMiLCAicmVzcCIsICJjaGVja1JlY2lwZVByZW1pdW0iLCAicmVjaXBlcyIsICJnZXRQcmV2aWV3UmVjaXBlcyIsICJyZWNpcGVMaXN0IiwgInJlY2lwZSIsICJjb21wb25lbnRCYWRnZSIsICJsb2NrT3ZlcmxheSIsICJvcGVuUmVjaXBlRGVwbG95V2l6YXJkIiwgImFwcFNlbGVjdG9yTW9kYWwiLCAidXBkYXRlU3RlcFVJIiwgInJlbmRlclN0ZXAxIiwgInBhbmVsIiwgImxpc3QiLCAiY29tcG9uZW50cyIsICJjb21wIiwgImlzUmVxdWlyZWQiLCAiaXNJbnRlcm5hbCIsICJyZW5kZXJTdGVwMiIsICJzaGFyZWRWb2x1bWVzIiwgInJlbmRlclN0ZXAzIiwgImNvbnRlbnQiLCAic2VsZWN0ZWRDb21wb25lbnRzIiwgImdldFNlbGVjdGVkQ29tcG9uZW50cyIsICJ2b2x1bWVJbnB1dHMiLCAidm9sdW1lcyIsICJ0YWlsc2NhbGUiLCAiYyIsICJrIiwgImNoZWNrYm94ZXMiLCAic2VsZWN0ZWRJZHMiLCAiY2IiLCAiZXhlY3V0ZURlcGxveSIsICJwcm9ncmVzc0xpc3QiLCAicmVzdWx0RWwiLCAidXBkYXRlUHJvZ3Jlc3NJdGVtIiwgImRlcGxveWVkIiwgImVyciIsICJzIiwgImNvbXBvbmVudElkIiwgInN0YXR1cyIsICJ0ZXh0IiwgInN0YXR1c0VsIiwgImNhcmRzIiwgImdyb3VwcyIsICJjYXJkIiwgInJlY2lwZUlkIiwgImdyb3VwQ2FyZHMiLCAibGFiZWwiLCAiYWN0aW9uIiwgImVuZHBvaW50IiwgIm1ldGhvZCIsICJyIiwgInN0eWxlIiwgImJ1dHRvbiIsICJvcmlnaW5hbFRleHQiLCAidmlld0J0biIsICJyZWZyZXNoQnRuIiwgImNsZWFyQnRuIiwgImNsb3NlQnRuIiwgImxldmVsU2VsIiwgImNvbnRleHRTZWwiLCAic2VhcmNoSW5wdXQiLCAic2luY2VJbnB1dCIsICJ1bnRpbElucHV0IiwgImxvYWRNb3JlQnRuIiwgInRvdGFsU3BhbiIsICJQQUdFX1NJWkUiLCAiY3VycmVudE9mZnNldCIsICJpbmZsaWdodCIsICJmaWx0ZXJOb25jZSIsICJrbm93bkNvbnRleHRzIiwgInRvSXNvIiwgImxvY2FsRHRWYWx1ZSIsICJkIiwgInJlZnJlc2hDb250ZXh0cyIsICJjdXJyZW50VmFsdWUiLCAiYnVpbGRRdWVyeSIsICJwYXJhbXMiLCAic2luY2UiLCAidW50aWwiLCAic2VhcmNoIiwgImxvYWRMb2dzIiwgImFwcGVuZCIsICJteU5vbmNlIiwgImxvZ3MiLCAicmVhc29uIiwgImxvZyIsICJsZXZlbCIsICJsZXZlbENvbG9yIiwgInRzIiwgImN0eCIsICJtc2ciLCAidGFibGUiLCAiZGV0YWlsIiwgImNsZWFyTG9ncyIsICJzZWFyY2hEZWJvdW5jZSIsICJ3aXJlRmlsdGVycyIsICJkYXRlRGVib3VuY2UiLCAiY29udGFpbmVyU2VsZWN0IiwgImxvZ0NvbnRlbnQiLCAibG9nU2VhcmNoIiwgImxvZ1RhaWwiLCAic3RyZWFtQnRuIiwgImRvd25sb2FkQnRuIiwgImNsZWFyU2VhcmNoQnRuIiwgImNsb3NlQnRuMiIsICJzdHJlYW1TdGF0dXMiLCAic3RyZWFtSW5kaWNhdG9yIiwgInN0cmVhbVRleHQiLCAibGluZUNvdW50IiwgImZpbHRlckNvdW50IiwgImltYWdlRWwiLCAiY3JlYXRlZEVsIiwgImN1cnJlbnRDb250YWluZXJJZCIsICJjdXJyZW50TG9ncyIsICJmaWx0ZXJlZExvZ3MiLCAiZXZlbnRTb3VyY2UiLCAiaXNTdHJlYW1pbmciLCAic2VhcmNoVGltZW91dCIsICJmb3JtYXREYXRlIiwgImRhdGVTdHIiLCAiZXNjYXBlSHRtbCIsICJzdHIiLCAiZGl2IiwgImZvcm1hdExvZ0VudHJ5IiwgInN0cmVhbUNsYXNzIiwgInN0cmVhbUljb24iLCAicmVuZGVyTG9ncyIsICJzZWFyY2hUZXJtIiwgImxvYWRDb250YWluZXJzIiwgImNvbnRhaW5lcnMiLCAiY3VycmVudFZhbCIsICJsb2FkQ29udGFpbmVySW5mbyIsICJjb250YWluZXJJZCIsICJzdG9wU3RyZWFtIiwgInRhaWwiLCAic3RhcnRTdHJlYW0iLCAiZW50cnkiLCAiZW50cnlEaXYiLCAiZG93bmxvYWRMb2dzIiwgImNvbnRhaW5lck5hbWUiLCAidGltZXN0YW1wIiwgImZpbGVuYW1lIiwgInN0cmVhbSIsICJibG9iIiwgImNsb3NlTW9kYWwiLCAiVU5JVF9QUkVTRVRTIiwgInVuaXRTZWxlY3QiLCAidGFpbElucHV0IiwgImNsZWFyU2VhcmNoIiwgIm92ZXJmbG93SGludCIsICJ1bml0RGlzcGxheSIsICJzdHJlYW1TdGF0ZSIsICJhdmFpbGFibGUiLCAibGluZXMiLCAic3RyZWFtaW5nIiwgInNlYXJjaFRpbWVyIiwgInNldEF2YWlsYWJsZSIsICJpc0F2YWlsYWJsZSIsICJwcm9iZUF2YWlsYWJsZSIsICJyZW5kZXJMaW5lcyIsICJ0ZXJtIiwgImZpbHRlcmVkIiwgImwiLCAibGluZSIsICJsb2FkVGFpbCIsICJ1bml0IiwgImV2IiwgImNsb3NlIiwgIm9wZW5Kb3VybmFsZE1vZGFsIiwgIm9wZW5CdG4iLCAiZGV0YWlsc0RpdiIsICJjcmVhdGVCdG4iLCAiY3JlYXRlU3RhdHVzIiwgInNob3dDb250YWluZXJEZXRhaWxzIiwgImNyZWF0ZVNuYXBzaG90IiwgIm5hbWUiLCAibGVhdmVSdW5uaW5nIiwgIm9wZW5Nb2RhbCIsICJ0YWIiLCAiY29ubmVjdEJ0biIsICJwaGFzZURldGVjdCIsICJwaGFzZUNyZWRlbnRpYWxzIiwgInBoYXNlUHJvZ3Jlc3MiLCAicGhhc2VSZXN1bHRzIiwgImRldGVjdFJlc3VsdHMiLCAiY3JlZGVudGlhbElucHV0cyIsICJwcm9ncmVzc1N0ZXBzIiwgInJlc3VsdHNDb250ZW50IiwgInBsZXhMaWJyYXJpZXMiLCAicmV0cnlCdG4iLCAiZGV0ZWN0ZWREYXRhIiwgInNlcnZpY2VJY29ucyIsICJzZXJ2aWNlTGFiZWxzIiwgInNob3dQaGFzZSIsICJwaGFzZSIsICJzdGF0dXNCYWRnZSIsICJjb2xvcnMiLCAic21hcnREZXRlY3QiLCAic3ZjIiwgImluZm8iLCAic291cmNlIiwgInZlcnNpb24iLCAia2V5U2F2ZWQiLCAiYnVpbGRDcmVkZW50aWFsSW5wdXRzIiwgInNlcnZpY2VzIiwgImFyclNlcnZpY2VzIiwgImlzQ29ubmVjdGVkIiwgInBsZXgiLCAicGxleENvbm5lY3RlZCIsICJzZWVyciIsICJzZWVyck9rIiwgImNvbmZpZ3VyZWRIdG1sIiwgImNzIiwgInNlcnZpY2UiLCAidXJsSW5wdXQiLCAia2V5SW5wdXQiLCAic3RhdHVzU3BhbiIsICJhcGlLZXkiLCAic21hcnRDb25uZWN0IiwgInN0ZXBzSHRtbCIsICJkZXRhaWxDb2xvciIsICJzaG93UmVzdWx0cyIsICJhbGxHb29kIiwgImhlYWRlckNvbG9yIiwgImhlYWRlckljb24iLCAiaGVhZGVyVGV4dCIsICJzdCIsICJmZXRjaFBsZXhMaWJyYXJpZXMiLCAibGliIiwgInR5cGVJY29uIiwgInNhdmVCdG4iLCAicHJvdmlkZXIiLCAiY2hlY2tib3giLCAiaGVhbHRoQ2hlY2tFbmFibGVkIiwgImhlYWx0aENoZWNrQ29uZmlnIiwgImxvYWROb3RpZmljYXRpb25Db25maWciLCAiZW1haWxQYXNzRWwiLCAibG9hZE5vdGlmaWNhdGlvbkhpc3RvcnkiLCAiZGF0ZSIsICJzYXZlTm90aWZpY2F0aW9uQ29uZmlnIiwgInRlc3RQcm92aWRlciIsICJsb2FkTm90aWZpY2F0aW9uU3RhdHVzIiwgImxhc3RTZW50RWwiLCAicGFuZWxJZCIsICJ0YWJCYXIiLCAibW9kYWxDb250ZW50IiwgInRhcmdldCIsICJCUk9XU0VSX1NUQVRFX0tFWVMiLCAiY29sbGVjdEJyb3dzZXJTdGF0ZSIsICJzdGF0ZSIsICJ2YWwiLCAiaiIsICJyZXN0b3JlQnJvd3NlclN0YXRlIiwgImJyb3dzZXJTdGF0ZSIsICJjb3VudCIsICJpc0xlZ2FjeUZvcm1hdCIsICJyZXN0b3JlTGVnYWN5Rm9ybWF0IiwgInNsdWciLCAiZXhwb3J0QnRuIiwgInNlbGVjdEZpbGVCdG4iLCAiZmlsZUlucHV0IiwgImZpbGVOYW1lRGl2IiwgInByZXZpZXdEaXYiLCAicHJldmlld0NvbnRlbnQiLCAicmVzdG9yZUJ0biIsICJyZXN1bHREaXYiLCAic2NoZWR1bGVDb250YWluZXIiLCAiaGlzdG9yeUNvbnRhaW5lciIsICJkaXNrQ29udGFpbmVyIiwgInBvaW50aW50aW1lQ29udGFpbmVyIiwgInNlbGVjdGVkQmFja3VwIiwgInN0YXRlQ291bnQiLCAidGhlbWVDb3VudCIsICJiYWNrdXAiLCAicHJldmlldyIsICJyZWxvYWRDYWRkeSIsICJicm93c2VyQ291bnQiLCAibG9hZFNjaGVkdWxlc1RhYiIsICJzY2hlZHVsZXMiLCAic2NoIiwgIm5leHRSdW5TdHIiLCAibGFzdFJ1blN0ciIsICJ0b2dnbGUiLCAidXBkYXRlU2NoZWR1bGUiLCAic2VsIiwgImlucCIsICJydW5CYWNrdXBOb3ciLCAiZGVsZXRlU2NoZWR1bGUiLCAiYWRkTmV3U2NoZWR1bGUiLCAidXBkYXRlcyIsICJpbnRlcnZhbCIsICJyZXRlbnRpb24iLCAiYXBwSWRJbnB1dCIsICJsb2FkRGlza0JhY2t1cHMiLCAiZmlsZXMiLCAiYnlBcHAiLCAiZiIsICJhcHBJZHMiLCAiYXBwRmlsZXMiLCAiY29tcGFyZUJhY2t1cEZpbGUiLCAicmVzdG9yZUJhY2t1cEZpbGUiLCAibG9hZEJhY2t1cEhpc3RvcnkiLCAiYmsiLCAic2l6ZU1CIiwgImJhY2t1cElkIiwgImxvYWRQb2ludEluVGltZVRhYiIsICJsaWNlbnNlUmVzIiwgImxpY2Vuc2VEYXRhIiwgInNlcnZpY2VzUmVzIiwgInNlcnZpY2VzRGF0YSIsICJsb2FkUG9pbnRJblRpbWVCYWNrdXBzIiwgImxpc3RFbCIsICJkaWZmIiwgInN2Y0NoYW5nZWQiLCAiY2ZnQ2hhbmdlZCIsICJhdXRvUmVmcmVzaENoZWNrYm94IiwgImFnZ3JlZ2F0ZWRDb250YWluZXIiLCAiYWxlcnRzQ29udGFpbmVyIiwgImxhc3RVcGRhdGVTcGFuIiwgInJlZnJlc2hJbnRlcnZhbCIsICJjYWNoZWRNb25pdG9yaW5nRGF0YSIsICJmb3JtYXRCeXRlcyIsICJieXRlcyIsICJzaXplcyIsICJnZXRDcHVDb2xvciIsICJwZXJjZW50IiwgImdldE1lbUNvbG9yIiwgImxvYWRTdGF0cyIsICJzdGF0cyIsICJpc05ld0FwaSIsICJpZCIsICJjdXIiLCAiY3B1IiwgIm1lbSIsICJjcHVDb2xvciIsICJtZW1Db2xvciIsICJtZW1Vc2VkIiwgIm1lbUxpbWl0IiwgIm5ldFJ4IiwgIm5ldFR4IiwgImFnZyIsICJsb2FkQWdncmVnYXRlZCIsICJsb2FkQWxlcnRzIiwgImFsZXJ0SGlzdG9yeSIsICJoZCIsICJhbGxDb25maWdzIiwgImNkIiwgImNvbnRhaW5lclJvd3MiLCAiaGlzdG9yeVJvd3MiLCAidGltZSIsICJub3RpZmllZE1hcmsiLCAiY29uZmlnU2VjdGlvbiIsICJjb25maWdzIiwgImNJZCIsICJzdG9wQXV0b1JlZnJlc2giLCAib3JpZyIsICJzdGFydEF1dG9SZWZyZXNoIiwgImhpc3RvcnlDb250YWluZXJTZWxlY3QiLCAiaGlzdG9yeUFyZWEiLCAicmFuZ2VCdXR0b25zIiwgImN1cnJlbnRSYW5nZSIsICJyYW5nZVRvTXMiLCAicmFuZ2UiLCAidGllckxhYmVsIiwgInRpZXIiLCAicmVuZGVyU3BhcmtsaW5lIiwgInNhbXBsZXMiLCAiYWNjZXNzb3IiLCAiY29sb3IiLCAidmFsdWVzIiwgIm1heCIsICJtaW4iLCAidyIsICJoIiwgInBhZCIsICJzdGVwWCIsICJwb2ludHMiLCAieCIsICJ5IiwgImxhc3QiLCAiYXZnIiwgInBvcHVsYXRlSGlzdG9yeUNvbnRhaW5lclNlbGVjdCIsICJwcmV2aW91cyIsICJlbnRyaWVzIiwgImxvYWRIaXN0b3J5IiwgImVuZFRpbWUiLCAic3RhcnRUaW1lIiwgImlzUmF3IiwgImNwdUFjY2Vzc29yIiwgIm1lbUFjY2Vzc29yIiwgIm5ldFJ4QWNjZXNzb3IiLCAibmV0VHhBY2Nlc3NvciIsICJzdGF0dXNDb250YWluZXIiLCAiaW5jaWRlbnRzQ29udGFpbmVyIiwgImNvbmZpZ0NvbnRhaW5lciIsICJhZGRCdG4iLCAiZm9ybUVsIiwgImZvcm1UaXRsZSIsICJmb3JtQ2FuY2VsIiwgImZvcm1TYXZlIiwgIkhFQUxUSF9TRVRUSU5HU19LRVkiLCAiSEVBTFRIX0RFRkFVTFRTIiwgImdsb2JhbFNhdmVCdG4iLCAiZ2xvYmFsUmVzZXRCdG4iLCAiZ2xvYmFsU3RhdHVzU3BhbiIsICJyZXRlbnRpb25JbnB1dCIsICJpbnRlcnZhbElucHV0IiwgInN0YXRzSW50ZXJ2YWxJbnB1dCIsICJtYXhFbnRyaWVzSW5wdXQiLCAiZGlza1RocmVzaG9sZElucHV0IiwgImxvYWRIZWFsdGhTZXR0aW5ncyIsICJyYXciLCAic2F2ZWQiLCAiYXBwbHlIZWFsdGhTZXR0aW5nc1RvVUkiLCAic2F2ZUhlYWx0aFNldHRpbmdzIiwgInNldHRpbmdzIiwgInJlc2V0SGVhbHRoU2V0dGluZ3MiLCAiZWRpdGluZ0lkIiwgInVwdGltZUNvbG9yIiwgInBjdCIsICJzZXZlcml0eUJhZGdlIiwgInNldiIsICJsb2FkU3RhdHVzIiwgImlzVXAiLCAiZG90Q29sb3IiLCAidTI0IiwgInU3ZCIsICJhdmdSdCIsICJsYXN0Q2hlY2siLCAiZGV0YWlsUm93IiwgInJ0IiwgImxvYWRJbmNpZGVudHMiLCAib3BlblJlcyIsICJoaXN0UmVzIiwgIm9wZW5EYXRhIiwgImhpc3REYXRhIiwgIm9wZW4iLCAiaW5jIiwgImhpc3RvcnkiLCAicmVzb2x2ZWQiLCAiZHVyIiwgImxvYWRDb25maWciLCAic2hvd0Zvcm0iLCAidGltZW91dCIsICJjb2RlcyIsICJzbGEiLCAic2xvdyIsICJoaWRlRm9ybSIsICJib2R5IiwgImNoZWNrQnRuIiwgImF2YWlsYWJsZUNvbnRhaW5lciIsICJhdXRvQ29udGFpbmVyIiwgImxhc3RDaGVja1NwYW4iLCAibG9hZEF2YWlsYWJsZSIsICJ1IiwgImNvdW50QmFkZ2UiLCAidXBkYXRlQWxsQnRuIiwgInVwZGF0ZUFsbENvbnRhaW5lcnMiLCAic3VjY2VzcyIsICJmYWlsZWQiLCAiY2hlY2tGb3JVcGRhdGVzIiwgIm9rIiwgImxvYWRBdXRvQ29uZmlnIiwgImNvbnRhaW5lcnNSZXMiLCAiY29uZmlnUmVzIiwgImNvbnRhaW5lcnNEYXRhIiwgImNvbmZpZ0RhdGEiLCAic2F2ZWRDb25maWciLCAiY2lkIiwgInNjaGVkdWxlVmFsIiwgInJvbGxiYWNrVmFsIiwgIndpbmRvd1ZhbCIsICJsYXN0UnVuIiwgInNjaGVkdWxlIiwgInJvbGxiYWNrIiwgIndpbmRvdyIsICJkY1ZlcnNpb25JbmZvIiwgImRjVXBkYXRlQmFkZ2UiLCAiZGNVcGRhdGVEZXRhaWxzIiwgImRjTmV3VmVyc2lvbiIsICJkY0NoYW5nZWxvZyIsICJkY0FwcGx5QnRuIiwgImRjQ2hlY2tCdG4iLCAiZGNSb2xsYmFja0J0biIsICJkY1N0YXR1c0JhciIsICJkY0hpc3RvcnlDb250YWluZXIiLCAiZGNMYXN0Q2hlY2siLCAiZGNTaG93U3RhdHVzIiwgInR5cGUiLCAiZGNMb2FkVmVyc2lvbiIsICJjb21taXQiLCAiZGNDaGVja0ZvclVwZGF0ZSIsICJzaWxlbnQiLCAidXBkYXRlc0J0biIsICJkb3QiLCAiZGNUYWIiLCAiZGNBcHBseVVwZGF0ZSIsICJkY0xvYWRIaXN0b3J5IiwgInN0Q29sb3IiLCAiZGNTaG93Um9sbGJhY2siLCAidmVyc2lvbnMiLCAiZm10Qnl0ZXMiLCAidW5pdHMiLCAibG9hZFZvbHVtZXMiLCAidm9scyIsICJpc1N5c3RlbSIsICJuYW1lSW5wdXQiLCAibG9hZE5ldHdvcmtzIiwgIm5ldHMiLCAibiIsICJkcml2ZXJTZWxlY3QiLCAibG9hZERpc2tVc2FnZSIsICJzZWN0aW9ucyIsICJwYXJzZWREYXRhIiwgInlhbWxTdHIiLCAic3RhY2tOYW1lIiwgIm9yaWdUZXh0IiwgInJlbmRlclByZXZpZXciLCAiYm9yZGVyQ29sb3IiLCAicGFydHMiLCAicHJvZ3Jlc3NFbCIsICJ0ZXJtRWwiLCAid3MiLCAiZml0QWRkb24iLCAiY2xlYW51cCIsICJvcGVuRXhlYyIsICJkaW1zIiwgImNvbHMiLCAicm93cyIsICJyZXNpemVIYW5kbGVyIiwgImZpbHRlclNlbGVjdCIsICJvdXRjb21lU2VsZWN0IiwgImxvYWRBdWRpdCIsICJvdXRjb21lIiwgImFjdG9yIiwgImFjdG9yTGFiZWwiLCAicm9sZSIsICJ0YWciLCAidGFicyIsICJwYW5lbHMiLCAiYWxsRXZlbnRzIiwgImFsbEhvc3RzIiwgInNzZVNvdXJjZSIsICJyZWZyZXNoT3ZlcnZpZXciLCAicmVmcmVzaEV2ZW50cyIsICJyZWZyZXNoSG9zdHMiLCAic3RhcnRMaXZlVGFpbCIsICJzdG9wTGl2ZVRhaWwiLCAicmVuZGVyRXZlbnRzIiwgImFjdGl2ZSIsICJzdGF0c1JlcyIsICJob3N0c1JlcyIsICJldmVudHNSZXMiLCAiaG9zdHMiLCAiZXZlbnRzQ291bnQiLCAicmVuZGVyVG9wTGlzdCIsICJpdGVtcyIsICJpdCIsICJmaWx0ZXJTb3VyY2UiLCAiZmlsdGVyU2V2ZXJpdHkiLCAiZmlsdGVySG9zdCIsICJmaWx0ZXJBY3RvciIsICJkZWJvdW5jZSIsICJyZWZyZXNoSG9zdEZpbHRlciIsICJyZW5kZXJFdmVudFJvdyIsICJzZXZDb2xvciIsICJjdXJyZW50IiwgInJlZ2lzdGVySG9zdFByb21wdCIsICJmbiIsICJtcyIsICJMT0NBVElPTl9LRVkiLCAiTEVHQUNZX0tFWSIsICJHRU9fQ0FDSEVfS0VZIiwgIlVOSVRfS0VZIiwgImdldFVuaXQiLCAiZ2V0V2VhdGhlckVsZW1lbnRzIiwgIndtb0Rlc2NyaXB0aW9ucyIsICJ3bW9JY29ucyIsICJ3aW5kRGlycyIsICJkZWdUb0RpciIsICJkZWciLCAiZ2VvY29kZUxvY2F0aW9uIiwgInF1ZXJ5IiwgImNhY2hlZCIsICJnZW8iLCAiZm9ybWF0TG9jYXRpb24iLCAiZmV0Y2hXZWF0aGVyIiwgImxvY2F0aW9uIiwgInRlbXBVbml0IiwgIndpbmRVbml0IiwgImNvZGUiLCAidXBkYXRlV2VhdGhlciIsICJ3ZWF0aGVyV2lkZ2V0IiwgIndlYXRoZXIiLCAidGVtcFN1ZmZpeCIsICJ3aW5kTGFiZWwiLCAibG9jYXRpb25JbnB1dCIsICJsb2MiLCAidW5pdFJhZGlvIiwgIm5ld1VuaXQiLCAib2xkVW5pdCIsICJ3aWRnZXQiLCAicmVuZGVyIiwgIkRBWVMiLCAiTU9OVEhTIiwgIlJPTUFOIiwgImN1cnJlbnRTdHlsZSIsICJsYXN0Q2hpbWVIb3VyIiwgImNoaW1lUGxheWluZyIsICJwcmV2RmxpcERpZ2l0cyIsICJhY3RpdmVMYXlvdXQiLCAiZGlnaXRhbFJlZnMiLCAidGlja1RpbWVyIiwgInBsYXlDaGltZXMiLCAic3RyaWtlIiwgImJlbGwiLCAibm93IiwgInJlc2V0UmVuZGVyTGF5b3V0IiwgImVuc3VyZURpZ2l0YWxMYXlvdXQiLCAicmVuZGVyRGVmYXVsdCIsICJoMjQiLCAiYW1wbSIsICJyZWZzIiwgInJlbmRlckxjZCIsICJjbHMiLCAicmVuZGVyRmxpcCIsICJkaWdpdHMiLCAiZmxpcENhcmQiLCAiZGlnaXQiLCAicmVuZGVyQmluYXJ5IiwgImJpdCIsICJjb2wiLCAib24iLCAicmVuZGVyQW5hbG9nIiwgInVzZVJvbWFuIiwgInNpemUiLCAiY3giLCAiY3kiLCAic0FuZ2xlIiwgIm1BbmdsZSIsICJoQW5nbGUiLCAibGFiZWxzIiwgImFuZ2xlIiwgInRpY2tzIiwgIm91dGVyIiwgImlubmVyIiwgIngxIiwgInkxIiwgIngyIiwgInkyIiwgInN2ZyIsICJ0aWNrIiwgIm5leHRDbGFzc05hbWUiLCAic2NoZWR1bGVOZXh0VGljayIsICJkZWxheSIsICJTVFlMRVMiLCAic3R5bGVPcHRpb25zSHRtbCIsICJjaGltZXNUb2dnbGUiLCAidm9sdW1lU2xpZGVyIiwgImxvYWRTZXR0aW5ncyIsICJyZWZyZXNoQ2FyZEhlYWx0aCIsICJzZXJ2aWNlSWQiLCAidXB0aW1lRWwiLCAiYmFyRWwiLCAidXB0aW1lMjQiLCAiZGlzbWlzc2VkVXBkYXRlcyIsICJrbm93blVwZGF0ZXMiLCAicmVmcmVzaENhcmRVcGRhdGVzIiwgIm5vdGlmeU5ldyIsICJwcmV2IiwgInVwZCIsICJ1cGRhdGVCdG4iLCAic2NoZWR1bGVDYXJkRW5oYW5jZW1lbnRzIiwgIm9yaWdSZWZyZXNoQWxsIiwgInRoZW1lQmVmb3JlQnVpbGRlciIsICJlZGl0aW5nU2x1ZyIsICJhZHZhbmNlZE92ZXJyaWRlcyIsICJUSEVNRV9MQUJFTFMiLCAiRklFTERTIiwgInRoZW1lQnRuIiwgInRoZW1lTGFiZWwiLCAiZ2V0TGFiZWxGb3IiLCAidXNlclRoZW1lcyIsICJ1cGRhdGVMYWJlbCIsICJuZXh0IiwgImJ1aWxkRmllbGRzSFRNTCIsICJncm91cGVkIiwgImJ1aWxkU3RhcnRGcm9tT3B0aW9ucyIsICJtb2RhbEhUTUwiLCAic3RhcnRTZWxlY3QiLCAiZWRpdFNlbGVjdCIsICJleGlzdGluZ1NlY3Rpb24iLCAibGlnaHRCZ0NoZWNrIiwgInBpY2tlcnMiLCAiYWR2YW5jZWRTZWN0aW9uIiwgImFkdmFuY2VkVG9nZ2xlIiwgImFkdmFuY2VkVmlzaWJsZSIsICJnZXRDdXJyZW50Q29sb3JzIiwgImdldEJhc2VDb2xvcnMiLCAidXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCIsICJiYXNlIiwgImRlcml2ZWQiLCAiaGV4IiwgImxvYWRUaGVtZUludG9QaWNrZXJzIiwgInRoZW1lTmFtZSIsICJ1cGRhdGVQcmV2aWV3IiwgImxvYWRVc2VyVGhlbWVJbnRvUGlja2VycyIsICJ0aGVtZSIsICJtdXRlZCIsICJiYWRnZU9rIiwgImJhZGdlQmFkIiwgImRvdE9rIiwgImRvdEJhZCIsICJkb3RzIiwgImFwcGx5Q29sb3JzTGl2ZSIsICJwcm9wIiwgInJlZnJlc2hFZGl0RHJvcGRvd24iLCAic2x1Z3MiLCAicmVmcmVzaFN0YXJ0RnJvbSIsICJvcGVuQnVpbGRlciIsICJjdXN0b21pemVCdG4iLCAib2xkU2x1ZyIsICJuZXdTbHVnIiwgInRoZW1lRGF0YSIsICJhcGlDb2xvcnMiLCAic2x1Z1RvRGVsZXRlIiwgImZhbGxiYWNrIiwgImV4cG9ydERhdGEiLCAidGhlbWVDb2xvcnMiLCAidGhlbWVMaWdodEJnIiwgImNvZGVJbnB1dCIsICJhY3RpdmF0ZUJ0biIsICJkZWFjdGl2YXRlQnRuIiwgImVycm9yRWwiLCAic3VjY2Vzc0VsIiwgImJhZGdlSWNvbiIsICJiYWRnZVRleHQiLCAiZGV0YWlsc0VsIiwgImZlYXR1cmVMaXN0IiwgImFjdGl2YXRlU2VjdGlvbiIsICJjdXJyZW50U3RhdHVzIiwgImhpZGVNZXNzYWdlcyIsICJzaG93RXJyb3IiLCAic2hvd1N1Y2Nlc3MiLCAicmVuZGVyU3RhdHVzIiwgImV4cGlyeUxpbmUiLCAiZmVhdHVyZXMiLCAiYWN0aXZlRmVhdHVyZXMiLCAidXBkYXRlSGVhZGVyQmFkZ2UiLCAiYWN0aXZhdGVMaWNlbnNlIiwgImRlYWN0aXZhdGVMaWNlbnNlIiwgInRvcGJhciIsICJpY29uRWwiLCAidGV4dEVsIiwgInRpbWVFbCIsICJkYXlzIiwgIm9wZW5MaWNlbnNlTW9kYWwiLCAicmVzdCIsICJ0b3BiYXJFbCIsICJmZWF0dXJlIiwgIlRUTF9PUFRJT05TIiwgIm8iLCAic2VydmljZU5hbWVFbCIsICJpc3N1ZWRFbCIsICJpc3N1ZWRVcmxJbnB1dCIsICJpc3N1ZWRDb3B5QnRuIiwgImlzc3VlZE1ldGFFbCIsICJvdXRzdGFuZGluZ0xpc3RFbCIsICJwdWJsaWNDcmVhdGVCdG4iLCAidHNDcmVhdGVCdG4iLCAidHNFbWFpbElucHV0IiwgInB1YmxpY1R0bFNlbGVjdCIsICJjdXJyZW50U2VydmljZSIsICJhY3RpdmVUYWIiLCAiX29yaWdpbkZyb21QYWdlIiwgIl9hYnNVcmwiLCAidXJsUGF0aCIsICJfZm9ybWF0RXhwaXJ5IiwgImlzbyIsICJfZm9ybWF0UmVtYWluaW5nIiwgInNldEFjdGl2ZVRhYiIsICJpc0FjdGl2ZSIsICJsb2FkT3V0c3RhbmRpbmciLCAicmVtYWluaW5nIiwgInJldm9rZVNoYXJlIiwgImlzc3VlUHVibGljIiwgIm9yaWdpbmFsIiwgInR0bE1zIiwgIl9yZW5kZXJBcGlFcnJvciIsICJpc3N1ZVRhaWxzY2FsZSIsICJvcGVuU2hhcmVNb2RhbCJdCn0K diff --git a/status/js/notification-settings.js b/status/js/notification-settings.js index 1b6f79a..60b1d70 100644 --- a/status/js/notification-settings.js +++ b/status/js/notification-settings.js @@ -240,9 +240,23 @@ document.getElementById('ntfy-server').value = config.providers.ntfy.serverUrl; } - // email fields + // email fields — DC-092: prefill the FULL form so a save doesn't + // silently wipe fields the GET response previously omitted. Password + // is never returned; when one is stored the field shows a keep-hint + // and an empty submit preserves the stored credential server-side. if (config.providers?.email?.host) document.getElementById('email-host').value = config.providers.email.host; if (config.providers?.email?.from) document.getElementById('email-from').value = config.providers.email.from; + if (config.providers?.email?.to) document.getElementById('email-to').value = config.providers.email.to; + if (config.providers?.email?.port) document.getElementById('email-port').value = config.providers.email.port; + if (config.providers?.email?.secure !== undefined) document.getElementById('email-secure').checked = config.providers.email.secure === true; + if (config.providers?.email?.username) document.getElementById('email-user').value = config.providers.email.username; + const emailPassEl = document.getElementById('email-pass'); + if (config.providers?.email?.hasPassword) { + emailPassEl.value = ''; + emailPassEl.placeholder = 'saved — leave blank to keep'; + } else { + emailPassEl.placeholder = 'app password'; + } // Health check document.getElementById('health-check-enabled').checked = config.healthCheck?.enabled || false; @@ -254,12 +268,14 @@ `Last check: ${new Date(config.healthCheck.lastCheck).toLocaleString()}`; } - // Events - document.getElementById('event-container-down').checked = config.events?.containerDown !== false; - document.getElementById('event-container-up').checked = config.events?.containerUp !== false; - document.getElementById('event-deploy-success').checked = config.events?.deploymentSuccess !== false; - document.getElementById('event-deploy-failed').checked = config.events?.deploymentFailed !== false; - document.getElementById('event-resource-alert').checked = config.events?.resourceAlert !== false; + // Events — canonical kebab-case keys, matching the backend store + // (DC-092: previously read camelCase keys that never existed, so + // every toggle re-rendered as 'checked' regardless of stored state). + document.getElementById('event-container-down').checked = config.events?.['container-down'] !== false; + document.getElementById('event-container-up').checked = config.events?.['container-up'] === true; + document.getElementById('event-deploy-success').checked = config.events?.['deploy-success'] !== false; + document.getElementById('event-deploy-failed').checked = config.events?.['deploy-failed'] !== false; + document.getElementById('event-resource-alert').checked = config.events?.['alert'] !== false; } } catch (error) { errorHandler.logError('[Notifications] Load Config', error, { function: 'loadConfig' }); @@ -325,18 +341,18 @@ host: document.getElementById('email-host').value.trim(), port: parseInt(document.getElementById('email-port').value) || 587, secure: document.getElementById('email-secure').checked, - user: document.getElementById('email-user').value.trim(), - pass: document.getElementById('email-pass').value.trim(), + username: document.getElementById('email-user').value.trim(), + password: document.getElementById('email-pass').value.trim(), from: document.getElementById('email-from').value.trim(), to: document.getElementById('email-to').value.trim() } }, events: { - containerDown: document.getElementById('event-container-down').checked, - containerUp: document.getElementById('event-container-up').checked, - deploymentSuccess: document.getElementById('event-deploy-success').checked, - deploymentFailed: document.getElementById('event-deploy-failed').checked, - resourceAlert: document.getElementById('event-resource-alert').checked + 'container-down': document.getElementById('event-container-down').checked, + 'container-up': document.getElementById('event-container-up').checked, + 'deploy-success': document.getElementById('event-deploy-success').checked, + 'deploy-failed': document.getElementById('event-deploy-failed').checked, + 'alert': document.getElementById('event-resource-alert').checked }, healthCheck: { enabled: document.getElementById('health-check-enabled').checked, diff --git a/status/sw.js b/status/sw.js index 31f9f5b..0bd09d6 100644 --- a/status/sw.js +++ b/status/sw.js @@ -1,4 +1,4 @@ -const CACHE = 'dashcaddy-shell-497e1f671c'; +const CACHE = 'dashcaddy-shell-3354f5fd96'; const PRECACHE = [ '/', '/index.html',