@dbx-tools/tunnel 0.6.89 → 0.6.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/plugin.js CHANGED
@@ -1,12 +1,11 @@
1
1
  /**
2
- * `authGate()` - the AppKit plugin behind the tunnel's email-OTP gate.
2
+ * `authGate()` - the AppKit adapter around `@dbx-tools/auth`.
3
3
  *
4
4
  * It has NO routes of its own: the tunnel PROXY (not an HTTP server) calls the
5
5
  * handlers this plugin exposes via {@link AuthGatePlugin.exports}. The plugin
6
- * owns the allow-list, the per-email/per-IP rate limiters, the CacheManager-backed
7
- * one-time-code store, and the session JWT. `createApp` (with no `server()`) is
8
- * used only to auto-init `CacheManager` + prime the sibling `email` transport;
9
- * this plugin is where the gate logic lives.
6
+ * owns tunnel authorization, AppKit Lakebase discovery, email delivery, and
7
+ * transport mounting. Better Auth owns users, OTPs, sessions, rate limits, and
8
+ * passkeys. `createApp` can run this plugin with or without `server()`.
10
9
  *
11
10
  * Options come from CLI flags OR env, with sensible defaults - see
12
11
  * {@link resolveAuthGateConfig}. The one runtime dependency the plugin can't
@@ -15,14 +14,14 @@
15
14
  *
16
15
  * @module
17
16
  */
18
- import { Plugin, toPlugin } from "@databricks/appkit";
17
+ import { lakebase, Plugin, toPlugin, ResourceType, } from "@databricks/appkit";
18
+ import { plugin as appkitPlugin } from "@dbx-tools/appkit";
19
+ import { auth as passwordlessAuth, storage as authStorage, } from "@dbx-tools/auth";
19
20
  import { config as coreConfig } from "@dbx-tools/core";
20
- import { brand, log, object, string } from "@dbx-tools/shared-core";
21
+ import { brand, log, string } from "@dbx-tools/shared-core";
21
22
  import { TUNNEL_CONFIG } from "./_config.js";
22
23
  import { looksLikeEmail, matchesAllowlist } from "./allowlist.js";
23
24
  import { mountGate } from "./gate.js";
24
- import { CodeStore, signSession, verifySession } from "./otp.js";
25
- import { RateLimiter } from "./rate-limit.js";
26
25
  import { ensureEmailAvailable, sendCode as defaultSendCode } from "./send-code.js";
27
26
  import { KEY_TTL_SECONDS, resolveSessionCutoff, signingKey } from "./signing-key.js";
28
27
  const logger = log.logger("tunnel:auth");
@@ -60,6 +59,11 @@ const DEFAULTS = {
60
59
  };
61
60
  /** Merge {@link AuthGateConfig} over env over defaults into a resolved config. */
62
61
  export function resolveAuthGateConfig(config) {
62
+ const storage = authStorage.resolveAuthStorageConfig({
63
+ storage: config.storage ??
64
+ coreConfig.text("AUTH_STORAGE", TUNNEL_CONFIG),
65
+ sqlitePath: config.sqlitePath ?? coreConfig.text("AUTH_SQLITE_PATH", TUNNEL_CONFIG),
66
+ });
63
67
  return {
64
68
  // Both sources are unioned rather than one overriding: a deployment-wide
65
69
  // TUNNEL_AUTH_ALLOW and a per-invocation `--allow` should both grant access.
@@ -82,10 +86,12 @@ export function resolveAuthGateConfig(config) {
82
86
  ...string.parseList(coreConfig.text("FORWARD_HEADERS", TUNNEL_CONFIG)),
83
87
  ],
84
88
  insecure: coreConfig.boolean(config.insecure, "INSECURE", TUNNEL_CONFIG) ?? false,
89
+ storage: storage.mode,
90
+ sqlitePath: storage.sqlitePath,
85
91
  };
86
92
  }
87
93
  /**
88
- * AppKit plugin owning the email-OTP gate. On `setup()` it registers the login
94
+ * AppKit plugin adapting `@dbx-tools/auth` to tunnel traffic. On `setup()` it registers the login
89
95
  * routes (`/api/email/auth/*`) and a gating middleware on the app's OWN Express
90
96
  * server via `this.context`, so a public portr caller must prove an email before
91
97
  * reaching the app's `/api/*` - see `./gate`. Front-door (platform) traffic and
@@ -95,27 +101,69 @@ export class AuthGatePlugin extends Plugin {
95
101
  static manifest = {
96
102
  name: "authGate",
97
103
  displayName: "Auth Gate",
98
- description: "Email one-time-password access gate for a public tunnel.",
104
+ description: "Better Auth email OTP and passkey access gate for a public tunnel.",
99
105
  stability: "beta",
100
- resources: { required: [], optional: [] },
106
+ resources: {
107
+ required: [],
108
+ optional: [
109
+ {
110
+ type: ResourceType.POSTGRES,
111
+ alias: "auth",
112
+ resourceKey: "auth-database",
113
+ description: "Durable users, sessions, OTP records, and passkeys.",
114
+ permission: "CAN_CONNECT_AND_CREATE",
115
+ fields: {
116
+ instance_name: { env: "LAKEBASE_INSTANCE_NAME" },
117
+ database_name: { env: "PGDATABASE" },
118
+ },
119
+ },
120
+ ],
121
+ },
101
122
  };
102
123
  resolved;
103
- codes;
104
- // Requesting a code is email-spam-prone; verifying is a brute-force surface.
105
- // Per-email AND per-IP so neither axis alone is a bypass.
106
- requestLimiter = new RateLimiter(5, 15 * 60 * 1000);
107
- verifyLimiter = new RateLimiter(10, 15 * 60 * 1000);
124
+ runtime;
125
+ static getResourceRequirements(config) {
126
+ if (authStorage.resolveAuthStorageConfig(config).mode !== "lakebase")
127
+ return [];
128
+ return [
129
+ {
130
+ type: ResourceType.POSTGRES,
131
+ alias: "auth",
132
+ resourceKey: "auth-database",
133
+ description: "Durable users, sessions, OTP records, and passkeys.",
134
+ permission: "CAN_CONNECT_AND_CREATE",
135
+ fields: {
136
+ instance_name: { env: "LAKEBASE_INSTANCE_NAME" },
137
+ database_name: { env: "PGDATABASE" },
138
+ },
139
+ required: true,
140
+ },
141
+ ];
142
+ }
108
143
  async setup() {
109
144
  this.resolved = resolveAuthGateConfig(this.config);
110
- this.codes = new CodeStore(this.resolved.codeTtlSeconds, this.resolved.maxAttempts);
111
- // Resolve the signing key HERE rather than lazily on the first sign-in, so a
112
- // cache that cannot hold it (and the resulting "sessions won't survive a
113
- // restart" warning) shows up in the startup log, not hours later.
114
- const { cutoffMs } = await signingKey(this.resolved.sessionCutoffMs);
115
145
  if (this.resolved.insecure) {
116
- logger.warn("insecure mode - the tunnel runs OPEN with no email-OTP gate");
146
+ logger.warn("insecure mode - the tunnel runs OPEN with no auth gate");
117
147
  }
118
148
  else {
149
+ const lakebasePlugin = appkitPlugin.instance(this.context, lakebase);
150
+ const storage = await authStorage.createAuthStorage(this.resolved, lakebasePlugin?.exports().pool);
151
+ const { key } = await signingKey(this.resolved.sessionCutoffMs);
152
+ this.runtime = await passwordlessAuth.createPasswordlessAuth({
153
+ storage,
154
+ baseURL: authOrigin(this.resolved.publicDomain),
155
+ basePath: "/api/email/auth",
156
+ appName: this.resolved.brandName,
157
+ secret: Buffer.from(key).toString("base64url"),
158
+ sessionTtlSeconds: this.resolved.sessionTtlSeconds,
159
+ sessionCutoffMs: this.resolved.sessionCutoffMs,
160
+ codeTtlSeconds: this.resolved.codeTtlSeconds,
161
+ maxAttempts: this.resolved.maxAttempts,
162
+ authorizeIdentity: (email) => this.authorizeIdentity(email),
163
+ sendCode: (email, code, options) => this.sendCode(email, code, options),
164
+ subject: this.resolved.subject,
165
+ message: this.resolved.message,
166
+ });
119
167
  // `server()` is deferred, so it does not exist during this plugin's setup.
120
168
  // At `setup:complete` the Express app exists but has not injected plugin
121
169
  // routes or static handling yet, which is the one point the gate can mount
@@ -124,7 +172,8 @@ export class AuthGatePlugin extends Plugin {
124
172
  this.mountGateRoutes();
125
173
  // Fail fast once the sibling email plugin has primed its transport: a
126
174
  // gate that cannot email a code lets nobody in.
127
- await ensureEmailAvailable();
175
+ if (!this.config.sendCode)
176
+ await ensureEmailAvailable();
128
177
  });
129
178
  }
130
179
  logger.info("ready", {
@@ -132,9 +181,15 @@ export class AuthGatePlugin extends Plugin {
132
181
  sessionTtlSeconds: this.resolved.sessionTtlSeconds,
133
182
  publicDomain: this.resolved.publicDomain ?? null,
134
183
  insecure: this.resolved.insecure,
135
- ...object.optional("sessionCutoff", cutoffMs > 0 ? new Date(cutoffMs).toISOString() : null),
184
+ storage: this.resolved.storage,
185
+ sessionCutoff: this.resolved.sessionCutoffMs > 0
186
+ ? new Date(this.resolved.sessionCutoffMs).toISOString()
187
+ : null,
136
188
  });
137
189
  }
190
+ async shutdown() {
191
+ await this.runtime?.close();
192
+ }
138
193
  /**
139
194
  * Register the login routes (`/api/email/auth/*`) and the gating middleware on
140
195
  * the app's OWN Express server. At `setup:complete`, the deferred server plugin
@@ -145,7 +200,7 @@ export class AuthGatePlugin extends Plugin {
145
200
  mountGateRoutes() {
146
201
  const context = this.context;
147
202
  if (!context) {
148
- logger.warn("no plugin context - the OTP gate cannot mount its routes");
203
+ logger.warn("no plugin context - the auth gate cannot mount its routes");
149
204
  return;
150
205
  }
151
206
  mountGateOnContext(context, {
@@ -158,56 +213,33 @@ export class AuthGatePlugin extends Plugin {
158
213
  get sendCode() {
159
214
  return this.config.sendCode ?? defaultSendCode;
160
215
  }
216
+ authorizeIdentity(email) {
217
+ if (this.config.authorizeIdentity)
218
+ return this.config.authorizeIdentity(email);
219
+ return looksLikeEmail(email) && matchesAllowlist(email, this.resolved.allow);
220
+ }
161
221
  exports() {
222
+ const runtime = this.runtime;
162
223
  return {
163
- sessionTtlSeconds: this.resolved.sessionTtlSeconds,
164
- request: (email, ip) => this.handleRequest(email, ip),
165
- verify: (email, code, ip) => this.handleVerify(email, code, ip),
166
- session: (token) => verifySession(token),
167
- status: async (token) => ({
168
- authenticated: Boolean(await verifySession(token)),
169
- email: (await verifySession(token)) ?? undefined,
170
- enabled: true,
171
- }),
224
+ passkeysEnabled: runtime?.passkeysEnabled ?? false,
225
+ handler: (request) => runtime?.handler(request) ?? Promise.resolve(new Response("Not Found", { status: 404 })),
226
+ session: (headers) => runtime?.session(headers) ?? Promise.resolve(undefined),
227
+ status: (headers) => runtime?.status(headers) ??
228
+ Promise.resolve({ authenticated: false, enabled: false, passkeysEnabled: false }),
229
+ close: () => runtime?.close() ?? Promise.resolve(),
172
230
  };
173
231
  }
174
- async handleRequest(email, ip) {
175
- const address = email.trim().toLowerCase();
176
- const byIp = this.requestLimiter.hit(`ip:${ip}`);
177
- const byEmail = this.requestLimiter.hit(`email:${address}`);
178
- if (!byIp.allowed || !byEmail.allowed) {
179
- return { ok: true, retryAfter: byIp.retryAfter ?? byEmail.retryAfter };
180
- }
181
- if (looksLikeEmail(address) && matchesAllowlist(address, this.resolved.allow)) {
182
- const code = await this.codes.issue(address);
183
- try {
184
- await this.sendCode(address, code, {
185
- subject: this.resolved.subject,
186
- brandName: this.resolved.brandName,
187
- message: this.resolved.message,
188
- codeTtlSeconds: this.resolved.codeTtlSeconds,
189
- });
190
- }
191
- catch (error) {
192
- logger.warn("failed to send OTP email", { error });
193
- }
194
- }
195
- return { ok: true };
196
- }
197
- async handleVerify(email, code, ip) {
198
- const address = email.trim().toLowerCase();
199
- const byIp = this.verifyLimiter.hit(`ip:${ip}`);
200
- const byEmail = this.verifyLimiter.hit(`email:${address}`);
201
- if (!byIp.allowed || !byEmail.allowed) {
202
- return { ok: false, retryAfter: byIp.retryAfter ?? byEmail.retryAfter };
203
- }
204
- if ((await this.codes.verify(address, code.trim())) !== "ok")
205
- return { ok: false };
206
- this.requestLimiter.reset(`email:${address}`);
207
- this.verifyLimiter.reset(`email:${address}`);
208
- return { ok: true, token: await signSession(address, this.resolved.sessionTtlSeconds) };
209
- }
232
+ }
233
+ function authOrigin(publicDomain) {
234
+ const value = string.trimToNull(publicDomain);
235
+ if (!value)
236
+ return "http://localhost";
237
+ if (/^https?:\/\//i.test(value))
238
+ return new URL(value).origin;
239
+ const host = value.split("/")[0];
240
+ const local = host === "localhost" || host.startsWith("localhost:");
241
+ return `${local ? "http" : "https"}://${host}`;
210
242
  }
211
243
  /** Factory: `authGate({ allow, subject, ... })` for an AppKit `plugins` array. */
212
244
  export const authGate = toPlugin(AuthGatePlugin);
213
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUE4QyxNQUFNLG9CQUFvQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxTQUFTLEVBQW9CLE1BQU0sV0FBVyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsSUFBSSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFjekMsU0FBUyxpQkFBaUIsQ0FBQyxPQUF5QjtJQUNsRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FDb0IsQ0FBQztJQUNyRSxNQUFNLFdBQVcsR0FBRyxNQUFNLEVBQUUsaUJBQWlCLENBQUM7SUFDOUMsT0FBTyxXQUFXO1FBQ2hCLE9BQU8sV0FBVyxDQUFDLEdBQUcsS0FBSyxVQUFVO1FBQ3JDLE9BQU8sV0FBVyxDQUFDLElBQUksS0FBSyxVQUFVO1FBQ3RDLE9BQU8sV0FBVyxDQUFDLEdBQUcsS0FBSyxVQUFVO1FBQ3JDLENBQUMsQ0FBRSxXQUFxQztRQUN4QyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsT0FBeUIsRUFBRSxPQUFvQjtJQUNoRixNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2hCLFNBQVMsQ0FDUCxPQUFPLEVBQ1AsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFDN0QsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FDbEQsQ0FBQztRQUNGLE9BQU87SUFDVCxDQUFDO0lBQ0QsU0FBUyxDQUNQLE9BQU8sRUFDUCxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQ2xFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQ3hELENBQUM7QUFDSixDQUFDO0FBcUhELE1BQU0sUUFBUSxHQUFHO0lBQ2YsT0FBTyxFQUFFLHdCQUF3QjtJQUNqQyw4RUFBOEU7SUFDOUUsK0VBQStFO0lBQy9FLGtFQUFrRTtJQUNsRSxnRkFBZ0Y7SUFDaEYsOENBQThDO0lBQzlDLFNBQVMsRUFBRSxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBSTtJQUN6QyxPQUFPLEVBQUUsNEJBQTRCO0lBQ3JDLHVFQUF1RTtJQUN2RSxpQkFBaUIsRUFBRSxlQUFlO0lBQ2xDLGNBQWMsRUFBRSxHQUFHO0lBQ25CLFdBQVcsRUFBRSxDQUFDO0NBQ2YsQ0FBQztBQUVGLGtGQUFrRjtBQUNsRixNQUFNLFVBQVUscUJBQXFCLENBQUMsTUFBc0I7SUFDMUQsT0FBTztRQUNMLHlFQUF5RTtRQUN6RSw2RUFBNkU7UUFDN0UsMEVBQTBFO1FBQzFFLHFDQUFxQztRQUNyQyxLQUFLLEVBQUU7WUFDTCxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNqQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ3hGO1FBQ0QsT0FBTyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU87UUFDN0YsU0FBUyxFQUNQLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLENBQUMsSUFBSSxRQUFRLENBQUMsU0FBUztRQUM3RixPQUFPLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTztRQUM3RixpQkFBaUIsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUN2QyxNQUFNLENBQUMsaUJBQWlCLEVBQ3hCLGtCQUFrQixFQUNsQixRQUFRLENBQUMsaUJBQWlCLEVBQzFCLGFBQWEsQ0FDZDtRQUNELGNBQWMsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUNwQyxNQUFNLENBQUMsY0FBYyxFQUNyQixlQUFlLEVBQ2YsUUFBUSxDQUFDLGNBQWMsRUFDdkIsYUFBYSxDQUNkO1FBQ0QsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLElBQUksUUFBUSxDQUFDLFdBQVc7UUFDdkQsZUFBZSxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDM0QsWUFBWSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDO1FBQ3BGLGNBQWMsRUFBRTtZQUNkLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBQzFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ3ZFO1FBQ0QsUUFBUSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLElBQUksS0FBSztLQUNsRixDQUFDO0FBQ0osQ0FBQztBQW9CRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLE1BQXNCO0lBQ3hELE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsSUFBSSxFQUFFLFVBQVU7UUFDaEIsV0FBVyxFQUFFLFdBQVc7UUFDeEIsV0FBVyxFQUFFLDBEQUEwRDtRQUN2RSxTQUFTLEVBQUUsTUFBTTtRQUNqQixTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7S0FDTCxDQUFDO0lBRS9CLFFBQVEsQ0FBMEI7SUFDbEMsS0FBSyxDQUFhO0lBQzFCLDZFQUE2RTtJQUM3RSwwREFBMEQ7SUFDekMsY0FBYyxHQUFHLElBQUksV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3BELGFBQWEsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUU1RCxLQUFLLENBQUMsS0FBSztRQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEYsNkVBQTZFO1FBQzdFLHlFQUF5RTtRQUN6RSxrRUFBa0U7UUFDbEUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFckUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUM3RSxDQUFDO2FBQU0sQ0FBQztZQUNOLDJFQUEyRTtZQUMzRSx5RUFBeUU7WUFDekUsMkVBQTJFO1lBQzNFLGtDQUFrQztZQUNsQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDckQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN2QixzRUFBc0U7Z0JBQ3RFLGdEQUFnRDtnQkFDaEQsTUFBTSxvQkFBb0IsRUFBRSxDQUFDO1lBQy9CLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ25CLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQ3BDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCO1lBQ2xELFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksSUFBSSxJQUFJO1lBQ2hELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVE7WUFDaEMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQzVGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxlQUFlO1FBQ3JCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1lBQ3hFLE9BQU87UUFDVCxDQUFDO1FBQ0Qsa0JBQWtCLENBQUMsT0FBTyxFQUFFO1lBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3BCLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVk7WUFDeEMsY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYztTQUM3QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQscUZBQXFGO0lBQ3JGLElBQVksUUFBUTtRQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLGVBQWUsQ0FBQztJQUNqRCxDQUFDO0lBRVEsT0FBTztRQUNkLE9BQU87WUFDTCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQjtZQUNsRCxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDckQsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7WUFDL0QsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQ3hDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QixhQUFhLEVBQUUsT0FBTyxDQUFDLE1BQU0sYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsRCxLQUFLLEVBQUUsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLFNBQVM7Z0JBQ2hELE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQztTQUNILENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FDekIsS0FBYSxFQUNiLEVBQVU7UUFFVixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QyxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekUsQ0FBQztRQUNELElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUUsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7b0JBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU87b0JBQzlCLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVM7b0JBQ2xDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU87b0JBQzlCLGNBQWMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWM7aUJBQzdDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FDeEIsS0FBYSxFQUNiLElBQVksRUFDWixFQUFVO1FBRVYsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzNDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEMsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzFFLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJO1lBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNuRixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxTQUFTLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7SUFDMUYsQ0FBQzs7QUFHSCxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYGF1dGhHYXRlKClgIC0gdGhlIEFwcEtpdCBwbHVnaW4gYmVoaW5kIHRoZSB0dW5uZWwncyBlbWFpbC1PVFAgZ2F0ZS5cbiAqXG4gKiBJdCBoYXMgTk8gcm91dGVzIG9mIGl0cyBvd246IHRoZSB0dW5uZWwgUFJPWFkgKG5vdCBhbiBIVFRQIHNlcnZlcikgY2FsbHMgdGhlXG4gKiBoYW5kbGVycyB0aGlzIHBsdWdpbiBleHBvc2VzIHZpYSB7QGxpbmsgQXV0aEdhdGVQbHVnaW4uZXhwb3J0c30uIFRoZSBwbHVnaW5cbiAqIG93bnMgdGhlIGFsbG93LWxpc3QsIHRoZSBwZXItZW1haWwvcGVyLUlQIHJhdGUgbGltaXRlcnMsIHRoZSBDYWNoZU1hbmFnZXItYmFja2VkXG4gKiBvbmUtdGltZS1jb2RlIHN0b3JlLCBhbmQgdGhlIHNlc3Npb24gSldULiBgY3JlYXRlQXBwYCAod2l0aCBubyBgc2VydmVyKClgKSBpc1xuICogdXNlZCBvbmx5IHRvIGF1dG8taW5pdCBgQ2FjaGVNYW5hZ2VyYCArIHByaW1lIHRoZSBzaWJsaW5nIGBlbWFpbGAgdHJhbnNwb3J0O1xuICogdGhpcyBwbHVnaW4gaXMgd2hlcmUgdGhlIGdhdGUgbG9naWMgbGl2ZXMuXG4gKlxuICogT3B0aW9ucyBjb21lIGZyb20gQ0xJIGZsYWdzIE9SIGVudiwgd2l0aCBzZW5zaWJsZSBkZWZhdWx0cyAtIHNlZVxuICoge0BsaW5rIHJlc29sdmVBdXRoR2F0ZUNvbmZpZ30uIFRoZSBvbmUgcnVudGltZSBkZXBlbmRlbmN5IHRoZSBwbHVnaW4gY2FuJ3RcbiAqIHJlc29sdmUgaXRzZWxmIGlzIEhPVyB0byBlbWFpbCB0aGUgY29kZSwgc28gaXQgdGFrZXMgYSBgc2VuZENvZGVgIGNhbGxiYWNrIHRoZVxuICogYXBwIHdpcmVzIHRvIHRoZSBlbWFpbCBwbHVnaW4uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFBsdWdpbiwgdG9QbHVnaW4sIHR5cGUgQmFzZVBsdWdpbkNvbmZpZywgdHlwZSBQbHVnaW5NYW5pZmVzdCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGNvbmZpZyBhcyBjb3JlQ29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgYnJhbmQsIGxvZywgb2JqZWN0LCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBdXRoU3RhdHVzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWVtYWlsXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RIYW5kbGVyIH0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB7IFRVTk5FTF9DT05GSUcgfSBmcm9tIFwiLi9fY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBsb29rc0xpa2VFbWFpbCwgbWF0Y2hlc0FsbG93bGlzdCB9IGZyb20gXCIuL2FsbG93bGlzdC50c1wiO1xuaW1wb3J0IHsgbW91bnRHYXRlLCB0eXBlIEdhdGVPcHRpb25zIH0gZnJvbSBcIi4vZ2F0ZS50c1wiO1xuaW1wb3J0IHsgQ29kZVN0b3JlLCBzaWduU2Vzc2lvbiwgdmVyaWZ5U2Vzc2lvbiB9IGZyb20gXCIuL290cC50c1wiO1xuaW1wb3J0IHsgUmF0ZUxpbWl0ZXIgfSBmcm9tIFwiLi9yYXRlLWxpbWl0LnRzXCI7XG5pbXBvcnQgeyBlbnN1cmVFbWFpbEF2YWlsYWJsZSwgc2VuZENvZGUgYXMgZGVmYXVsdFNlbmRDb2RlIH0gZnJvbSBcIi4vc2VuZC1jb2RlLnRzXCI7XG5pbXBvcnQgeyBLRVlfVFRMX1NFQ09ORFMsIHJlc29sdmVTZXNzaW9uQ3V0b2ZmLCBzaWduaW5nS2V5IH0gZnJvbSBcIi4vc2lnbmluZy1rZXkudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInR1bm5lbDphdXRoXCIpO1xuXG5pbnRlcmZhY2UgR2F0ZVNlcnZlckFwcGxpY2F0aW9uIHtcbiAgZ2V0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB1bmtub3duO1xuICBwb3N0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB1bmtub3duO1xuICB1c2UocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHVua25vd247XG59XG5cbmludGVyZmFjZSBHYXRlTW91bnRDb250ZXh0IHtcbiAgYWRkUm91dGUobWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB2b2lkO1xuICBhZGRNaWRkbGV3YXJlKHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB2b2lkO1xuICBnZXRQbHVnaW5zKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgdW5rbm93bj47XG59XG5cbmZ1bmN0aW9uIHNlcnZlckFwcGxpY2F0aW9uKGNvbnRleHQ6IEdhdGVNb3VudENvbnRleHQpOiBHYXRlU2VydmVyQXBwbGljYXRpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBzZXJ2ZXIgPSBjb250ZXh0LmdldFBsdWdpbnMoKS5nZXQoXCJzZXJ2ZXJcIikgYXNcbiAgICB7IHNlcnZlckFwcGxpY2F0aW9uPzogUGFydGlhbDxHYXRlU2VydmVyQXBwbGljYXRpb24+IH0gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGFwcGxpY2F0aW9uID0gc2VydmVyPy5zZXJ2ZXJBcHBsaWNhdGlvbjtcbiAgcmV0dXJuIGFwcGxpY2F0aW9uICYmXG4gICAgdHlwZW9mIGFwcGxpY2F0aW9uLmdldCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIGFwcGxpY2F0aW9uLnBvc3QgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiBhcHBsaWNhdGlvbi51c2UgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gKGFwcGxpY2F0aW9uIGFzIEdhdGVTZXJ2ZXJBcHBsaWNhdGlvbilcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vdW50R2F0ZU9uQ29udGV4dChjb250ZXh0OiBHYXRlTW91bnRDb250ZXh0LCBvcHRpb25zOiBHYXRlT3B0aW9ucyk6IHZvaWQge1xuICBjb25zdCBhcHBsaWNhdGlvbiA9IHNlcnZlckFwcGxpY2F0aW9uKGNvbnRleHQpO1xuICBpZiAoYXBwbGljYXRpb24pIHtcbiAgICBtb3VudEdhdGUoXG4gICAgICBvcHRpb25zLFxuICAgICAgKG1ldGhvZCwgcGF0aCwgaGFuZGxlcikgPT4gYXBwbGljYXRpb25bbWV0aG9kXShwYXRoLCBoYW5kbGVyKSxcbiAgICAgIChwYXRoLCBoYW5kbGVyKSA9PiBhcHBsaWNhdGlvbi51c2UocGF0aCwgaGFuZGxlciksXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbW91bnRHYXRlKFxuICAgIG9wdGlvbnMsXG4gICAgKG1ldGhvZCwgcGF0aCwgaGFuZGxlcikgPT4gY29udGV4dC5hZGRSb3V0ZShtZXRob2QsIHBhdGgsIGhhbmRsZXIpLFxuICAgIChwYXRoLCBoYW5kbGVyKSA9PiBjb250ZXh0LmFkZE1pZGRsZXdhcmUocGF0aCwgaGFuZGxlciksXG4gICk7XG59XG5cbi8qKiBPcHRpb25zIGZvciB0aGUge0BsaW5rIGF1dGhHYXRlfSBwbHVnaW4gKGFsbCByZXNvbHZhYmxlIGZyb20gZW52IC0gc2VlIGJlbG93KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdhdGVDb25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgLyoqIEFsbG93LWxpc3QgcGF0dGVybnMgKGRvbWFpbiAvIGdsb2IgLyBgL3JlZ2V4L2ApLiBFbXB0eSA9IGFsbG93IG5vYm9keS4gRW52IFRVTk5FTF9BVVRIX0FMTE9XLiAqL1xuICBhbGxvdz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogU3ViamVjdCBsaW5lIGZvciB0aGUgY29kZSBlbWFpbC4gRW52IFRVTk5FTF9BVVRIX1NVQkpFQ1QuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFwiWW91ciB2ZXJpZmljYXRpb24gY29kZVwiLiBUaGUgd29yZGluZyBvZiB0aGUgc3ViamVjdCBhbmRcbiAgICoge0BsaW5rIG1lc3NhZ2V9IGlzIGRlbGliZXJhdGVseSB0aGUgY29udmVudGlvbmFsIHBocmFzaW5nIHJhdGhlciB0aGFuXG4gICAqIGFueXRoaW5nIGJyYW5kZWQ6IGlPUywgR21haWwsIE91dGxvb2ssIGFuZCBBbmRyb2lkIGFsbCBkZXRlY3QgYSBvbmUtdGltZVxuICAgKiBjb2RlIGZyb20gdGhpcyBzaGFwZSBhbmQgb2ZmZXIgdG8gYXV0b2ZpbGwgaXQsIGFuZCBhIG5vdmVsIHBocmFzaW5nIGlzIHdoYXRcbiAgICogYnJlYWtzIHRoYXQgZGV0ZWN0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBzdWJqZWN0IFRFTVBMQVRFLCBub3QgdGhlIGxpdGVyYWwgbGluZSBzZW50OiB0aGUgY29kZSBpcyBzcGxpY2VkXG4gICAqIGludG8gaXQgKGBcIjEyMzQ1NiBpcyB5b3VyIHZlcmlmaWNhdGlvbiBjb2RlXCJgKSBiZWNhdXNlIGEgcHVzaCBub3RpZmljYXRpb25cbiAgICogc2hvd3Mgb25seSB0aGUgc3ViamVjdCBhbmQgcHJlaGVhZGVyLCBhbmQgdGhhdCBub3RpZmljYXRpb24gaXMgd2hhdCBtb2JpbGVcbiAgICogYXV0b2ZpbGwgcmVhZHMuIFNlZSBgY29kZUVtYWlsU3ViamVjdGAgaW4gYC4vY29kZS1lbWFpbC50c2AuXG4gICAqL1xuICBzdWJqZWN0Pzogc3RyaW5nO1xuICAvKipcbiAgICogRGlzcGxheSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgZW1haWwgY29weS4gRW52IFRVTk5FTF9BVVRIX0JSQU5EX05BTUUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBicmFuZCBjb250ZXh0J3MgYG5hbWVgIC0gdGhlIGFwcCdzIG93biBgYnJhbmRpbmcvYnJhbmQueWFtbGBcbiAgICogd2hlbiBpdCBoYXMgb25lLCBlbHNlIHRoZSBkYngtdG9vbHMgZGVmYXVsdC4gU2V0IHRoaXMgb25seSB0byBvdmVycmlkZSB0aGVcbiAgICogYnJhbmQgZm9yIHRoaXMgZ2F0ZS5cbiAgICovXG4gIGJyYW5kTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIExpbmUgc2hvd24gaW1tZWRpYXRlbHkgYWJvdmUgdGhlIGNvZGUgaW4gdGhlIGVtYWlsLiBFbnYgVFVOTkVMX0FVVEhfTUVTU0FHRS5cbiAgICpcbiAgICogS2VlcCB0aGUgY29kZSBvbiBpdHMgT1dOIGxpbmUgZGlyZWN0bHkgYWZ0ZXIgdGhpcyB0ZXh0IC0gdGhhdCBhZGphY2VuY3kgaXNcbiAgICogd2hhdCB0aGUgcGxhdGZvcm0gY29kZS1kZXRlY3Rpb24gaGV1cmlzdGljcyBrZXkgb24uXG4gICAqL1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICAvKipcbiAgICogU2Vzc2lvbiBsaWZldGltZSAoc2Vjb25kcykuIEVudiBUVU5ORUxfQVVUSF9TRVNTSU9OX1RUTC4gRGVmYXVsdCAyNTkyMDAwICgzMGQpLlxuICAgKlxuICAgKiBNYXRjaGVkIHRvIHRoZSBjYWNoZS1iYWNrZWQgc2lnbmluZyBrZXkncyBvd24gMzAtZGF5IFRUTCAoc2VlXG4gICAqIGAuL3NpZ25pbmcta2V5LnRzYCk6IHRoZSBjb29raWUgYW5kIHRoZSBrZXkgdGhhdCB2YWxpZGF0ZXMgaXQgc2hvdWxkIGV4cGlyZVxuICAgKiB0b2dldGhlciwgb3Igb25lIHNpbGVudGx5IG91dGxpdmVzIHRoZSBvdGhlci5cbiAgICovXG4gIHNlc3Npb25UdGxTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogT25lLXRpbWUtY29kZSBsaWZldGltZSAoc2Vjb25kcykuIEVudiBUVU5ORUxfQVVUSF9DT0RFX1RUTC4gRGVmYXVsdCA2MDAgKDEwbSkuICovXG4gIGNvZGVUdGxTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogTWF4IHZlcmlmeSBhdHRlbXB0cyBwZXIgaXNzdWVkIGNvZGUuIERlZmF1bHQgNS4gKi9cbiAgbWF4QXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGb3JjZS1jbGVhciBjdXRvZmY6IGV2ZXJ5IHNlc3Npb24gaXNzdWVkIEJFRk9SRSBpdCBzdG9wcyB2ZXJpZnlpbmcsIHNvIG1vdmluZ1xuICAgKiBpdCBmb3J3YXJkIHNpZ25zIGV2ZXJ5b25lIG91dC4gRW52IFRVTk5FTF9BVVRIX1NFU1NJT05fQ1VUT0ZGLlxuICAgKlxuICAgKiBBbnl0aGluZyBgb2JqZWN0LnRvRGF0ZWAgYWNjZXB0czogYSBgRGF0ZWAsIGAyMDI2LTA4LTAyYCwgYW4gSVNPIGluc3RhbnQsXG4gICAqIGVwb2NoIHNlY29uZHMvbWlsbGlzLCBvciBhIHJlbGF0aXZlIGR1cmF0aW9uIChgLTMwZGAsIGA3IGRheXMgYWdvYCkuIFVuc2V0XG4gICAqIG1lYW5zIG5vIGN1dG9mZi5cbiAgICovXG4gIHNlc3Npb25DdXRvZmY/OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlO1xuICAvKipcbiAgICogRGVsaXZlciBhIGNvZGUgdG8gYW4gYWRkcmVzcy4gRGVmYXVsdHMgdG8gc2VuZGluZyB0aHJvdWdoIHRoZSBob3N0IGFwcCdzXG4gICAqIHNoYXJlZCBgQGRieC10b29scy9lbWFpbGAgdHJhbnNwb3J0IChzZWUgYC4vc2VuZC1jb2RlYCk7IG92ZXJyaWRlIHRvIHdpcmUgYVxuICAgKiBkaWZmZXJlbnQgZGVsaXZlcnkgcGF0aC5cbiAgICovXG4gIHNlbmRDb2RlPzogKGVtYWlsOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgb3B0czogU2VuZENvZGVPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIHB1YmxpYyBgPHN1YmRvbWFpbj4uPHNlcnZlcj5gIHRoYXQgaWRlbnRpZmllcyBwb3J0ciB0cmFmZmljIGJ5IGl0cyBgSG9zdGBcbiAgICogaGVhZGVyLiBPbmx5IHJlcXVlc3RzIHdob3NlIGBIb3N0YCBtYXRjaGVzIHRoaXMgYXJlIGdhdGVkOyBldmVyeXRoaW5nIGVsc2VcbiAgICogKHRoZSBwbGF0Zm9ybSBmcm9udCBkb29yLCBvdGhlciBsb2NhbCBjYWxsZXJzKSBwYXNzZXMgdGhyb3VnaC4gRW52XG4gICAqIGBUVU5ORUxfUFVCTElDX0RPTUFJTmAuIFdoZW4gYWJzZW50LCB0aGUgZ2F0ZSBpcyBpbmVydCAobm90aGluZyBpcyB0dW5uZWxcbiAgICogdHJhZmZpYykuXG4gICAqL1xuICBwdWJsaWNEb21haW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeHRyYSBgeC1gIHJlcXVlc3QgaGVhZGVycyB0dW5uZWwgdHJhZmZpYyBtYXkgZm9yd2FyZCAobGl0ZXJhbCAvIGdsb2IgL1xuICAgKiBgL3JlZ2V4L2ApLCB1bmlvbmVkIHdpdGggdGhlIGJ1aWx0LWluIGFsbG93LWxpc3QuIEVudiBgVFVOTkVMX0ZPUldBUkRfSEVBREVSU2AuXG4gICAqL1xuICBmb3J3YXJkSGVhZGVycz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogUnVuIE9QRU4gd2l0aCBubyBnYXRlIChlbnYgYFRVTk5FTF9JTlNFQ1VSRT10cnVlYCkuIFRoZSBsb2dpbiByb3V0ZXMgYW5kIGdhdGVcbiAgICogbWlkZGxld2FyZSBhcmUgbm90IG1vdW50ZWQsIGFuZCB0aGUgU01UUCBmYWlsLWZhc3QgaXMgc2tpcHBlZC4gVXNlIG9ubHkgd2hlblxuICAgKiB0aGUgdHVubmVsIGlzIGRlbGliZXJhdGVseSBwdWJsaWMuXG4gICAqL1xuICBpbnNlY3VyZT86IGJvb2xlYW47XG59XG5cbi8qKiBCcmFuZGluZy9tZXNzYWdpbmcgcGFzc2VkIHRvIHtAbGluayBBdXRoR2F0ZUNvbmZpZy5zZW5kQ29kZX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRDb2RlT3B0aW9ucyB7XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYnJhbmROYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqXG4gICAqIExpZmV0aW1lIG9mIHRoZSBjb2RlIGJlaW5nIHNlbnQsIGluIHNlY29uZHMgLSB0aGUgUkVTT0xWRURcbiAgICoge0BsaW5rIEF1dGhHYXRlQ29uZmlnLmNvZGVUdGxTZWNvbmRzfSwgc28gdGhlIGVtYWlsIGNhbiBzdGF0ZSB0aGUgcmVhbFxuICAgKiBleHBpcnkgKFwiVGhpcyBjb2RlIGV4cGlyZXMgaW4gMTAgbWludXRlc1wiKSBpbnN0ZWFkIG9mIGEgdmFndWUgXCJzaG9ydGx5XCJcbiAgICogdGhhdCBkcmlmdHMgZnJvbSB0aGUgY29uZmlndXJlZCBUVEwuXG4gICAqL1xuICBjb2RlVHRsU2Vjb25kczogbnVtYmVyO1xufVxuXG4vKiogUmVzb2x2ZWQgZ2F0ZSBjb25maWcgd2l0aCBlbnYgZmFsbGJhY2tzICsgZGVmYXVsdHMgYXBwbGllZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRBdXRoR2F0ZUNvbmZpZyB7XG4gIGFsbG93OiBzdHJpbmdbXTtcbiAgc3ViamVjdDogc3RyaW5nO1xuICBicmFuZE5hbWU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzZXNzaW9uVHRsU2Vjb25kczogbnVtYmVyO1xuICBjb2RlVHRsU2Vjb25kczogbnVtYmVyO1xuICBtYXhBdHRlbXB0czogbnVtYmVyO1xuICAvKiogRm9yY2UtY2xlYXIgY3V0b2ZmIGluIGVwb2NoIG1zOyBgMGAgd2hlbiB1bnNldC4gKi9cbiAgc2Vzc2lvbkN1dG9mZk1zOiBudW1iZXI7XG4gIC8qKiBQdWJsaWMgZG9tYWluIHRoYXQgaWRlbnRpZmllcyBwb3J0ciB0cmFmZmljIGJ5IGBIb3N0YDsgYHVuZGVmaW5lZGAgPSBpbmVydC4gKi9cbiAgcHVibGljRG9tYWluPzogc3RyaW5nO1xuICAvKiogRXh0cmEgYHgtYCBoZWFkZXJzIHR1bm5lbCB0cmFmZmljIG1heSBmb3J3YXJkICh1bmlvbmVkIHdpdGggdGhlIGRlZmF1bHRzKS4gKi9cbiAgZm9yd2FyZEhlYWRlcnM6IHN0cmluZ1tdO1xuICAvKiogUnVuIE9QRU4gd2l0aCBubyBnYXRlLiAqL1xuICBpbnNlY3VyZTogYm9vbGVhbjtcbn1cblxuY29uc3QgREVGQVVMVFMgPSB7XG4gIHN1YmplY3Q6IFwiWW91ciB2ZXJpZmljYXRpb24gY29kZVwiLFxuICAvLyBUaGUgcmVwby13aWRlIGJyYW5kIGNvbnRleHQncyBkaXNwbGF5IG5hbWUsIE5PVCBhIGhhcmRjb2RlZCBwcm9kdWN0IHN0cmluZzpcbiAgLy8gdGhpcyBuYW1lIGlzIHdoYXQgdGhlIHJlY2lwaWVudCByZWFkcyBpbiB0aGUgY29kZSBlbWFpbCwgc28gaXQgaGFzIHRvIGJlIHRoZVxuICAvLyBzYW1lIGlkZW50aXR5IHRoZSByZXN0IG9mIHRoZSBhcHAgcHJlc2VudHMuIEEgaG9zdCB3aXRoIGl0cyBvd25cbiAgLy8gYGJyYW5kaW5nL2JyYW5kLnlhbWxgIG92ZXJyaWRlcyBpdCBieSBwYXNzaW5nIGBicmFuZE5hbWVgOyB0aGUgc2hhcmVkIGRlZmF1bHRcbiAgLy8gaXMgdGhlIGZhbGxiYWNrIHdoZW4gbm90aGluZyBpcyBjb25maWd1cmVkLlxuICBicmFuZE5hbWU6IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQubmFtZSxcbiAgbWVzc2FnZTogXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlIGlzOlwiLFxuICAvLyAzMCBkYXlzLCB0aGUgc2FtZSB3aW5kb3cgdGhlIGNhY2hlLWJhY2tlZCBzaWduaW5nIGtleSBpcyBzdG9yZWQgZm9yLlxuICBzZXNzaW9uVHRsU2Vjb25kczogS0VZX1RUTF9TRUNPTkRTLFxuICBjb2RlVHRsU2Vjb25kczogNjAwLFxuICBtYXhBdHRlbXB0czogNSxcbn07XG5cbi8qKiBNZXJnZSB7QGxpbmsgQXV0aEdhdGVDb25maWd9IG92ZXIgZW52IG92ZXIgZGVmYXVsdHMgaW50byBhIHJlc29sdmVkIGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXV0aEdhdGVDb25maWcoY29uZmlnOiBBdXRoR2F0ZUNvbmZpZyk6IFJlc29sdmVkQXV0aEdhdGVDb25maWcge1xuICByZXR1cm4ge1xuICAgIC8vIEJvdGggc291cmNlcyBhcmUgdW5pb25lZCByYXRoZXIgdGhhbiBvbmUgb3ZlcnJpZGluZzogYSBkZXBsb3ltZW50LXdpZGVcbiAgICAvLyBUVU5ORUxfQVVUSF9BTExPVyBhbmQgYSBwZXItaW52b2NhdGlvbiBgLS1hbGxvd2Agc2hvdWxkIGJvdGggZ3JhbnQgYWNjZXNzLlxuICAgIC8vIEhlbmNlIGBwYXJzZUxpc3RgIG9uIGVhY2ggcmF0aGVyIHRoYW4gYGNvbmZpZy5saXN0YCwgd2hpY2ggc3RvcHMgYXQgdGhlXG4gICAgLy8gZmlyc3Qgc291cmNlIHRoYXQgeWllbGRzIGFueXRoaW5nLlxuICAgIGFsbG93OiBbXG4gICAgICAuLi5zdHJpbmcucGFyc2VMaXN0KGNvbmZpZy5hbGxvdyksXG4gICAgICAuLi5zdHJpbmcucGFyc2VMaXN0KGNvcmVDb25maWcudGV4dChbXCJBVVRIX0FMTE9XXCIsIFwiRU1BSUxfQVVUSF9BTExPV1wiXSwgVFVOTkVMX0NPTkZJRykpLFxuICAgIF0sXG4gICAgc3ViamVjdDogY29yZUNvbmZpZy5zdHJpbmcoY29uZmlnLnN1YmplY3QsIFwiQVVUSF9TVUJKRUNUXCIsIFRVTk5FTF9DT05GSUcpID8/IERFRkFVTFRTLnN1YmplY3QsXG4gICAgYnJhbmROYW1lOlxuICAgICAgY29yZUNvbmZpZy5zdHJpbmcoY29uZmlnLmJyYW5kTmFtZSwgXCJBVVRIX0JSQU5EX05BTUVcIiwgVFVOTkVMX0NPTkZJRykgPz8gREVGQVVMVFMuYnJhbmROYW1lLFxuICAgIG1lc3NhZ2U6IGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5tZXNzYWdlLCBcIkFVVEhfTUVTU0FHRVwiLCBUVU5ORUxfQ09ORklHKSA/PyBERUZBVUxUUy5tZXNzYWdlLFxuICAgIHNlc3Npb25UdGxTZWNvbmRzOiBjb3JlQ29uZmlnLnBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLnNlc3Npb25UdGxTZWNvbmRzLFxuICAgICAgXCJBVVRIX1NFU1NJT05fVFRMXCIsXG4gICAgICBERUZBVUxUUy5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIFRVTk5FTF9DT05GSUcsXG4gICAgKSxcbiAgICBjb2RlVHRsU2Vjb25kczogY29yZUNvbmZpZy5wb3NpdGl2ZUludChcbiAgICAgIGNvbmZpZy5jb2RlVHRsU2Vjb25kcyxcbiAgICAgIFwiQVVUSF9DT0RFX1RUTFwiLFxuICAgICAgREVGQVVMVFMuY29kZVR0bFNlY29uZHMsXG4gICAgICBUVU5ORUxfQ09ORklHLFxuICAgICksXG4gICAgbWF4QXR0ZW1wdHM6IGNvbmZpZy5tYXhBdHRlbXB0cyA/PyBERUZBVUxUUy5tYXhBdHRlbXB0cyxcbiAgICBzZXNzaW9uQ3V0b2ZmTXM6IHJlc29sdmVTZXNzaW9uQ3V0b2ZmKGNvbmZpZy5zZXNzaW9uQ3V0b2ZmKSxcbiAgICBwdWJsaWNEb21haW46IGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5wdWJsaWNEb21haW4sIFwiUFVCTElDX0RPTUFJTlwiLCBUVU5ORUxfQ09ORklHKSxcbiAgICBmb3J3YXJkSGVhZGVyczogW1xuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb25maWcuZm9yd2FyZEhlYWRlcnMpLFxuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb3JlQ29uZmlnLnRleHQoXCJGT1JXQVJEX0hFQURFUlNcIiwgVFVOTkVMX0NPTkZJRykpLFxuICAgIF0sXG4gICAgaW5zZWN1cmU6IGNvcmVDb25maWcuYm9vbGVhbihjb25maWcuaW5zZWN1cmUsIFwiSU5TRUNVUkVcIiwgVFVOTkVMX0NPTkZJRykgPz8gZmFsc2UsXG4gIH07XG59XG5cbi8qKiBUaGUgaGFuZGxlcnMgdGhlIGdhdGUgbWlkZGxld2FyZSBjYWxscyBpbi1wcm9jZXNzIChyZXR1cm5lZCBieSB7QGxpbmsgQXV0aEdhdGVQbHVnaW4uZXhwb3J0c30pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2F0ZUFwaSB7XG4gIC8qKiBIYW5kbGUgYSBjb2RlIHJlcXVlc3QuIEFsd2F5cyByZXNvbHZlcyBgeyBvazogdHJ1ZSB9YCAoYW50aS1lbnVtZXJhdGlvbikuICovXG4gIHJlcXVlc3QoZW1haWw6IHN0cmluZywgaXA6IHN0cmluZyk6IFByb21pc2U8eyBvazogdHJ1ZTsgcmV0cnlBZnRlcj86IG51bWJlciB9PjtcbiAgLyoqIEhhbmRsZSBhIGNvZGUgdmVyaWZpY2F0aW9uLiBPbiBzdWNjZXNzIHJldHVybnMgdGhlIHNlc3Npb24gdG9rZW4gdG8gY29va2llLiAqL1xuICB2ZXJpZnkoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgaXA6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IG9rOiBib29sZWFuOyB0b2tlbj86IHN0cmluZzsgcmV0cnlBZnRlcj86IG51bWJlciB9PjtcbiAgLyoqIFJlc29sdmUgdGhlIGF1dGhlbnRpY2F0ZWQgZW1haWwgZm9yIGEgc2Vzc2lvbiB0b2tlbiwgb3IgdW5kZWZpbmVkLiAqL1xuICBzZXNzaW9uKHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIC8qKiBTZXNzaW9uIFRUTCBpbiBzZWNvbmRzIChmb3IgdGhlIGNvb2tpZSBNYXgtQWdlKS4gKi9cbiAgcmVhZG9ubHkgc2Vzc2lvblR0bFNlY29uZHM6IG51bWJlcjtcbiAgLyoqIFRoZSBnYXRlIHN0YXR1cyBwYXlsb2FkIChgZW5hYmxlZGAgaXMgYWx3YXlzIHRydWUgd2hlbiB0aGlzIHBsdWdpbiBydW5zKS4gKi9cbiAgc3RhdHVzKHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPEF1dGhTdGF0dXM+O1xufVxuXG4vKipcbiAqIEFwcEtpdCBwbHVnaW4gb3duaW5nIHRoZSBlbWFpbC1PVFAgZ2F0ZS4gT24gYHNldHVwKClgIGl0IHJlZ2lzdGVycyB0aGUgbG9naW5cbiAqIHJvdXRlcyAoYC9hcGkvZW1haWwvYXV0aC8qYCkgYW5kIGEgZ2F0aW5nIG1pZGRsZXdhcmUgb24gdGhlIGFwcCdzIE9XTiBFeHByZXNzXG4gKiBzZXJ2ZXIgdmlhIGB0aGlzLmNvbnRleHRgLCBzbyBhIHB1YmxpYyBwb3J0ciBjYWxsZXIgbXVzdCBwcm92ZSBhbiBlbWFpbCBiZWZvcmVcbiAqIHJlYWNoaW5nIHRoZSBhcHAncyBgL2FwaS8qYCAtIHNlZSBgLi9nYXRlYC4gRnJvbnQtZG9vciAocGxhdGZvcm0pIHRyYWZmaWMgYW5kXG4gKiBvdGhlciBsb2NhbCBjYWxsZXJzIHBhc3MgdGhyb3VnaCB1bnRvdWNoZWQgKHRoZSBnYXRlIGtleXMgb24gdGhlIGBIb3N0YCBoZWFkZXIpLlxuICovXG5leHBvcnQgY2xhc3MgQXV0aEdhdGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW48QXV0aEdhdGVDb25maWc+IHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwiYXV0aEdhdGVcIixcbiAgICBkaXNwbGF5TmFtZTogXCJBdXRoIEdhdGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJFbWFpbCBvbmUtdGltZS1wYXNzd29yZCBhY2Nlc3MgZ2F0ZSBmb3IgYSBwdWJsaWMgdHVubmVsLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7IHJlcXVpcmVkOiBbXSwgb3B0aW9uYWw6IFtdIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwiYXV0aEdhdGVcIj47XG5cbiAgcHJpdmF0ZSByZXNvbHZlZCE6IFJlc29sdmVkQXV0aEdhdGVDb25maWc7XG4gIHByaXZhdGUgY29kZXMhOiBDb2RlU3RvcmU7XG4gIC8vIFJlcXVlc3RpbmcgYSBjb2RlIGlzIGVtYWlsLXNwYW0tcHJvbmU7IHZlcmlmeWluZyBpcyBhIGJydXRlLWZvcmNlIHN1cmZhY2UuXG4gIC8vIFBlci1lbWFpbCBBTkQgcGVyLUlQIHNvIG5laXRoZXIgYXhpcyBhbG9uZSBpcyBhIGJ5cGFzcy5cbiAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0TGltaXRlciA9IG5ldyBSYXRlTGltaXRlcig1LCAxNSAqIDYwICogMTAwMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmVyaWZ5TGltaXRlciA9IG5ldyBSYXRlTGltaXRlcigxMCwgMTUgKiA2MCAqIDEwMDApO1xuXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVzb2x2ZWQgPSByZXNvbHZlQXV0aEdhdGVDb25maWcodGhpcy5jb25maWcpO1xuICAgIHRoaXMuY29kZXMgPSBuZXcgQ29kZVN0b3JlKHRoaXMucmVzb2x2ZWQuY29kZVR0bFNlY29uZHMsIHRoaXMucmVzb2x2ZWQubWF4QXR0ZW1wdHMpO1xuICAgIC8vIFJlc29sdmUgdGhlIHNpZ25pbmcga2V5IEhFUkUgcmF0aGVyIHRoYW4gbGF6aWx5IG9uIHRoZSBmaXJzdCBzaWduLWluLCBzbyBhXG4gICAgLy8gY2FjaGUgdGhhdCBjYW5ub3QgaG9sZCBpdCAoYW5kIHRoZSByZXN1bHRpbmcgXCJzZXNzaW9ucyB3b24ndCBzdXJ2aXZlIGFcbiAgICAvLyByZXN0YXJ0XCIgd2FybmluZykgc2hvd3MgdXAgaW4gdGhlIHN0YXJ0dXAgbG9nLCBub3QgaG91cnMgbGF0ZXIuXG4gICAgY29uc3QgeyBjdXRvZmZNcyB9ID0gYXdhaXQgc2lnbmluZ0tleSh0aGlzLnJlc29sdmVkLnNlc3Npb25DdXRvZmZNcyk7XG5cbiAgICBpZiAodGhpcy5yZXNvbHZlZC5pbnNlY3VyZSkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJpbnNlY3VyZSBtb2RlIC0gdGhlIHR1bm5lbCBydW5zIE9QRU4gd2l0aCBubyBlbWFpbC1PVFAgZ2F0ZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHNlcnZlcigpYCBpcyBkZWZlcnJlZCwgc28gaXQgZG9lcyBub3QgZXhpc3QgZHVyaW5nIHRoaXMgcGx1Z2luJ3Mgc2V0dXAuXG4gICAgICAvLyBBdCBgc2V0dXA6Y29tcGxldGVgIHRoZSBFeHByZXNzIGFwcCBleGlzdHMgYnV0IGhhcyBub3QgaW5qZWN0ZWQgcGx1Z2luXG4gICAgICAvLyByb3V0ZXMgb3Igc3RhdGljIGhhbmRsaW5nIHlldCwgd2hpY2ggaXMgdGhlIG9uZSBwb2ludCB0aGUgZ2F0ZSBjYW4gbW91bnRcbiAgICAgIC8vIGFoZWFkIG9mIGV2ZXJ5IHByb3RlY3RlZCByb3V0ZS5cbiAgICAgIHRoaXMuY29udGV4dD8ub25MaWZlY3ljbGUoXCJzZXR1cDpjb21wbGV0ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMubW91bnRHYXRlUm91dGVzKCk7XG4gICAgICAgIC8vIEZhaWwgZmFzdCBvbmNlIHRoZSBzaWJsaW5nIGVtYWlsIHBsdWdpbiBoYXMgcHJpbWVkIGl0cyB0cmFuc3BvcnQ6IGFcbiAgICAgICAgLy8gZ2F0ZSB0aGF0IGNhbm5vdCBlbWFpbCBhIGNvZGUgbGV0cyBub2JvZHkgaW4uXG4gICAgICAgIGF3YWl0IGVuc3VyZUVtYWlsQXZhaWxhYmxlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIHBhdHRlcm5zOiB0aGlzLnJlc29sdmVkLmFsbG93Lmxlbmd0aCxcbiAgICAgIHNlc3Npb25UdGxTZWNvbmRzOiB0aGlzLnJlc29sdmVkLnNlc3Npb25UdGxTZWNvbmRzLFxuICAgICAgcHVibGljRG9tYWluOiB0aGlzLnJlc29sdmVkLnB1YmxpY0RvbWFpbiA/PyBudWxsLFxuICAgICAgaW5zZWN1cmU6IHRoaXMucmVzb2x2ZWQuaW5zZWN1cmUsXG4gICAgICAuLi5vYmplY3Qub3B0aW9uYWwoXCJzZXNzaW9uQ3V0b2ZmXCIsIGN1dG9mZk1zID4gMCA/IG5ldyBEYXRlKGN1dG9mZk1zKS50b0lTT1N0cmluZygpIDogbnVsbCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdGhlIGxvZ2luIHJvdXRlcyAoYC9hcGkvZW1haWwvYXV0aC8qYCkgYW5kIHRoZSBnYXRpbmcgbWlkZGxld2FyZSBvblxuICAgKiB0aGUgYXBwJ3MgT1dOIEV4cHJlc3Mgc2VydmVyLiBBdCBgc2V0dXA6Y29tcGxldGVgLCB0aGUgZGVmZXJyZWQgc2VydmVyIHBsdWdpblxuICAgKiBoYXMgY29uc3RydWN0ZWQgaXRzIEV4cHJlc3MgYXBwIGJ1dCBoYXMgbm90IGluamVjdGVkIHBsdWdpbiByb3V0ZXMgb3Igc3RhdGljXG4gICAqIGhhbmRsaW5nLCBzbyBkaXJlY3QgcmVnaXN0cmF0aW9uIHB1dHMgdGhlIGdhdGUgZmlyc3QuIFRoZSBjb250ZXh0J3MgYnVmZmVyZWRcbiAgICogcm91dGUgQVBJIHJlbWFpbnMgYSBmYWxsYmFjayBmb3IgY29tcGF0aWJsZSBub24tc3RhbmRhcmQgc2VydmVyIHBsdWdpbnMuXG4gICAqL1xuICBwcml2YXRlIG1vdW50R2F0ZVJvdXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJubyBwbHVnaW4gY29udGV4dCAtIHRoZSBPVFAgZ2F0ZSBjYW5ub3QgbW91bnQgaXRzIHJvdXRlc1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbW91bnRHYXRlT25Db250ZXh0KGNvbnRleHQsIHtcbiAgICAgIGdhdGU6IHRoaXMuZXhwb3J0cygpLFxuICAgICAgcHVibGljRG9tYWluOiB0aGlzLnJlc29sdmVkLnB1YmxpY0RvbWFpbixcbiAgICAgIGZvcndhcmRIZWFkZXJzOiB0aGlzLnJlc29sdmVkLmZvcndhcmRIZWFkZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBjb2RlIHNlbmRlcjogdGhlIGNvbmZpZ3VyZWQgYHNlbmRDb2RlYCwgZWxzZSB0aGUgc2hhcmVkLXRyYW5zcG9ydCBkZWZhdWx0LiAqL1xuICBwcml2YXRlIGdldCBzZW5kQ29kZSgpOiBOb25OdWxsYWJsZTxBdXRoR2F0ZUNvbmZpZ1tcInNlbmRDb2RlXCJdPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnNlbmRDb2RlID8/IGRlZmF1bHRTZW5kQ29kZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKTogQXV0aEdhdGVBcGkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXNzaW9uVHRsU2Vjb25kczogdGhpcy5yZXNvbHZlZC5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIHJlcXVlc3Q6IChlbWFpbCwgaXApID0+IHRoaXMuaGFuZGxlUmVxdWVzdChlbWFpbCwgaXApLFxuICAgICAgdmVyaWZ5OiAoZW1haWwsIGNvZGUsIGlwKSA9PiB0aGlzLmhhbmRsZVZlcmlmeShlbWFpbCwgY29kZSwgaXApLFxuICAgICAgc2Vzc2lvbjogKHRva2VuKSA9PiB2ZXJpZnlTZXNzaW9uKHRva2VuKSxcbiAgICAgIHN0YXR1czogYXN5bmMgKHRva2VuKSA9PiAoe1xuICAgICAgICBhdXRoZW50aWNhdGVkOiBCb29sZWFuKGF3YWl0IHZlcmlmeVNlc3Npb24odG9rZW4pKSxcbiAgICAgICAgZW1haWw6IChhd2FpdCB2ZXJpZnlTZXNzaW9uKHRva2VuKSkgPz8gdW5kZWZpbmVkLFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUmVxdWVzdChcbiAgICBlbWFpbDogc3RyaW5nLFxuICAgIGlwOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBvazogdHJ1ZTsgcmV0cnlBZnRlcj86IG51bWJlciB9PiB7XG4gICAgY29uc3QgYWRkcmVzcyA9IGVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGJ5SXAgPSB0aGlzLnJlcXVlc3RMaW1pdGVyLmhpdChgaXA6JHtpcH1gKTtcbiAgICBjb25zdCBieUVtYWlsID0gdGhpcy5yZXF1ZXN0TGltaXRlci5oaXQoYGVtYWlsOiR7YWRkcmVzc31gKTtcbiAgICBpZiAoIWJ5SXAuYWxsb3dlZCB8fCAhYnlFbWFpbC5hbGxvd2VkKSB7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgcmV0cnlBZnRlcjogYnlJcC5yZXRyeUFmdGVyID8/IGJ5RW1haWwucmV0cnlBZnRlciB9O1xuICAgIH1cbiAgICBpZiAobG9va3NMaWtlRW1haWwoYWRkcmVzcykgJiYgbWF0Y2hlc0FsbG93bGlzdChhZGRyZXNzLCB0aGlzLnJlc29sdmVkLmFsbG93KSkge1xuICAgICAgY29uc3QgY29kZSA9IGF3YWl0IHRoaXMuY29kZXMuaXNzdWUoYWRkcmVzcyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRDb2RlKGFkZHJlc3MsIGNvZGUsIHtcbiAgICAgICAgICBzdWJqZWN0OiB0aGlzLnJlc29sdmVkLnN1YmplY3QsXG4gICAgICAgICAgYnJhbmROYW1lOiB0aGlzLnJlc29sdmVkLmJyYW5kTmFtZSxcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLnJlc29sdmVkLm1lc3NhZ2UsXG4gICAgICAgICAgY29kZVR0bFNlY29uZHM6IHRoaXMucmVzb2x2ZWQuY29kZVR0bFNlY29uZHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJmYWlsZWQgdG8gc2VuZCBPVFAgZW1haWxcIiwgeyBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgb2s6IHRydWUgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlVmVyaWZ5KFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgY29kZTogc3RyaW5nLFxuICAgIGlwOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBvazogYm9vbGVhbjsgdG9rZW4/OiBzdHJpbmc7IHJldHJ5QWZ0ZXI/OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBlbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBieUlwID0gdGhpcy52ZXJpZnlMaW1pdGVyLmhpdChgaXA6JHtpcH1gKTtcbiAgICBjb25zdCBieUVtYWlsID0gdGhpcy52ZXJpZnlMaW1pdGVyLmhpdChgZW1haWw6JHthZGRyZXNzfWApO1xuICAgIGlmICghYnlJcC5hbGxvd2VkIHx8ICFieUVtYWlsLmFsbG93ZWQpIHtcbiAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmV0cnlBZnRlcjogYnlJcC5yZXRyeUFmdGVyID8/IGJ5RW1haWwucmV0cnlBZnRlciB9O1xuICAgIH1cbiAgICBpZiAoKGF3YWl0IHRoaXMuY29kZXMudmVyaWZ5KGFkZHJlc3MsIGNvZGUudHJpbSgpKSkgIT09IFwib2tcIikgcmV0dXJuIHsgb2s6IGZhbHNlIH07XG4gICAgdGhpcy5yZXF1ZXN0TGltaXRlci5yZXNldChgZW1haWw6JHthZGRyZXNzfWApO1xuICAgIHRoaXMudmVyaWZ5TGltaXRlci5yZXNldChgZW1haWw6JHthZGRyZXNzfWApO1xuICAgIHJldHVybiB7IG9rOiB0cnVlLCB0b2tlbjogYXdhaXQgc2lnblNlc3Npb24oYWRkcmVzcywgdGhpcy5yZXNvbHZlZC5zZXNzaW9uVHRsU2Vjb25kcykgfTtcbiAgfVxufVxuXG4vKiogRmFjdG9yeTogYGF1dGhHYXRlKHsgYWxsb3csIHN1YmplY3QsIC4uLiB9KWAgZm9yIGFuIEFwcEtpdCBgcGx1Z2luc2AgYXJyYXkuICovXG5leHBvcnQgY29uc3QgYXV0aEdhdGUgPSB0b1BsdWdpbihBdXRoR2F0ZVBsdWdpbik7XG4iXX0=
245
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEVBSVIsWUFBWSxHQUNiLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sSUFBSSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsSUFBSSxJQUFJLGdCQUFnQixFQUN4QixPQUFPLElBQUksV0FBVyxHQUt2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxXQUFXLENBQUM7QUFDeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsSUFBSSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFjekMsU0FBUyxpQkFBaUIsQ0FBQyxPQUF5QjtJQUNsRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FDb0IsQ0FBQztJQUNyRSxNQUFNLFdBQVcsR0FBRyxNQUFNLEVB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bnRlbnQiOlsiLyoqXG4gKiBgYXV0aEdhdGUoKWAgLSB0aGUgQXBwS2l0IGFkYXB0ZXIgYXJvdW5kIGBAZGJ4LXRvb2xzL2F1dGhgLlxuICpcbiAqIEl0IGhhcyBOTyByb3V0ZXMgb2YgaXRzIG93bjogdGhlIHR1bm5lbCBQUk9YWSAobm90IGFuIEhUVFAgc2VydmVyKSBjYWxscyB0aGVcbiAqIGhhbmRsZXJzIHRoaXMgcGx1Z2luIGV4cG9zZXMgdmlhIHtAbGluayBBdXRoR2F0ZVBsdWdpbi5leHBvcnRzfS4gVGhlIHBsdWdpblxuICogb3ducyB0dW5uZWwgYXV0aG9yaXphdGlvbiwgQXBwS2l0IExha2ViYXNlIGRpc2NvdmVyeSwgZW1haWwgZGVsaXZlcnksIGFuZFxuICogdHJhbnNwb3J0IG1vdW50aW5nLiBCZXR0ZXIgQXV0aCBvd25zIHVzZXJzLCBPVFBzLCBzZXNzaW9ucywgcmF0ZSBsaW1pdHMsIGFuZFxuICogcGFzc2tleXMuIGBjcmVhdGVBcHBgIGNhbiBydW4gdGhpcyBwbHVnaW4gd2l0aCBvciB3aXRob3V0IGBzZXJ2ZXIoKWAuXG4gKlxuICogT3B0aW9ucyBjb21lIGZyb20gQ0xJIGZsYWdzIE9SIGVudiwgd2l0aCBzZW5zaWJsZSBkZWZhdWx0cyAtIHNlZVxuICoge0BsaW5rIHJlc29sdmVBdXRoR2F0ZUNvbmZpZ30uIFRoZSBvbmUgcnVudGltZSBkZXBlbmRlbmN5IHRoZSBwbHVnaW4gY2FuJ3RcbiAqIHJlc29sdmUgaXRzZWxmIGlzIEhPVyB0byBlbWFpbCB0aGUgY29kZSwgc28gaXQgdGFrZXMgYSBgc2VuZENvZGVgIGNhbGxiYWNrIHRoZVxuICogYXBwIHdpcmVzIHRvIHRoZSBlbWFpbCBwbHVnaW4uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGxha2ViYXNlLFxuICBQbHVnaW4sXG4gIHRvUGx1Z2luLFxuICB0eXBlIEJhc2VQbHVnaW5Db25maWcsXG4gIHR5cGUgUGx1Z2luTWFuaWZlc3QsXG4gIHR5cGUgUmVzb3VyY2VSZXF1aXJlbWVudCxcbiAgUmVzb3VyY2VUeXBlLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW4gYXMgYXBwa2l0UGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQge1xuICBhdXRoIGFzIHBhc3N3b3JkbGVzc0F1dGgsXG4gIHN0b3JhZ2UgYXMgYXV0aFN0b3JhZ2UsXG4gIHR5cGUgQXV0aG9yaXplSWRlbnRpdHksXG4gIHR5cGUgQXV0aFN0b3JhZ2VDb25maWcsXG4gIHR5cGUgQXV0aFN0b3JhZ2VNb2RlLFxuICB0eXBlIFBhc3N3b3JkbGVzc0F1dGhSdW50aW1lLFxufSBmcm9tIFwiQGRieC10b29scy9hdXRoXCI7XG5pbXBvcnQgeyBjb25maWcgYXMgY29yZUNvbmZpZyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgQXV0aFN0YXR1cyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoXCI7XG5pbXBvcnQgeyBicmFuZCwgbG9nLCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SGFuZGxlciB9IGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQgeyBUVU5ORUxfQ09ORklHIH0gZnJvbSBcIi4vX2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgbG9va3NMaWtlRW1haWwsIG1hdGNoZXNBbGxvd2xpc3QgfSBmcm9tIFwiLi9hbGxvd2xpc3QudHNcIjtcbmltcG9ydCB7IG1vdW50R2F0ZSwgdHlwZSBHYXRlT3B0aW9ucyB9IGZyb20gXCIuL2dhdGUudHNcIjtcbmltcG9ydCB7IGVuc3VyZUVtYWlsQXZhaWxhYmxlLCBzZW5kQ29kZSBhcyBkZWZhdWx0U2VuZENvZGUgfSBmcm9tIFwiLi9zZW5kLWNvZGUudHNcIjtcbmltcG9ydCB7IEtFWV9UVExfU0VDT05EUywgcmVzb2x2ZVNlc3Npb25DdXRvZmYsIHNpZ25pbmdLZXkgfSBmcm9tIFwiLi9zaWduaW5nLWtleS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwidHVubmVsOmF1dGhcIik7XG5cbmludGVyZmFjZSBHYXRlU2VydmVyQXBwbGljYXRpb24ge1xuICBnZXQocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHVua25vd247XG4gIHBvc3QocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHVua25vd247XG4gIHVzZShwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIEdhdGVNb3VudENvbnRleHQge1xuICBhZGRSb3V0ZShtZXRob2Q6IHN0cmluZywgcGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHZvaWQ7XG4gIGFkZE1pZGRsZXdhcmUocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHZvaWQ7XG4gIGdldFBsdWdpbnMoKTogUmVhZG9ubHlNYXA8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZnVuY3Rpb24gc2VydmVyQXBwbGljYXRpb24oY29udGV4dDogR2F0ZU1vdW50Q29udGV4dCk6IEdhdGVTZXJ2ZXJBcHBsaWNhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlcnZlciA9IGNvbnRleHQuZ2V0UGx1Z2lucygpLmdldChcInNlcnZlclwiKSBhc1xuICAgIHsgc2VydmVyQXBwbGljYXRpb24/OiBQYXJ0aWFsPEdhdGVTZXJ2ZXJBcHBsaWNhdGlvbj4gfSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYXBwbGljYXRpb24gPSBzZXJ2ZXI/LnNlcnZlckFwcGxpY2F0aW9uO1xuICByZXR1cm4gYXBwbGljYXRpb24gJiZcbiAgICB0eXBlb2YgYXBwbGljYXRpb24uZ2V0ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgYXBwbGljYXRpb24ucG9zdCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIGFwcGxpY2F0aW9uLnVzZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyAoYXBwbGljYXRpb24gYXMgR2F0ZVNlcnZlckFwcGxpY2F0aW9uKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW91bnRHYXRlT25Db250ZXh0KGNvbnRleHQ6IEdhdGVNb3VudENvbnRleHQsIG9wdGlvbnM6IEdhdGVPcHRpb25zKTogdm9pZCB7XG4gIGNvbnN0IGFwcGxpY2F0aW9uID0gc2VydmVyQXBwbGljYXRpb24oY29udGV4dCk7XG4gIGlmIChhcHBsaWNhdGlvbikge1xuICAgIG1vdW50R2F0ZShcbiAgICAgIG9wdGlvbnMsXG4gICAgICAobWV0aG9kLCBwYXRoLCBoYW5kbGVyKSA9PiBhcHBsaWNhdGlvblttZXRob2RdKHBhdGgsIGhhbmRsZXIpLFxuICAgICAgKHBhdGgsIGhhbmRsZXIpID0+IGFwcGxpY2F0aW9uLnVzZShwYXRoLCBoYW5kbGVyKSxcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBtb3VudEdhdGUoXG4gICAgb3B0aW9ucyxcbiAgICAobWV0aG9kLCBwYXRoLCBoYW5kbGVyKSA9PiBjb250ZXh0LmFkZFJvdXRlKG1ldGhvZCwgcGF0aCwgaGFuZGxlciksXG4gICAgKHBhdGgsIGhhbmRsZXIpID0+IGNvbnRleHQuYWRkTWlkZGxld2FyZShwYXRoLCBoYW5kbGVyKSxcbiAgKTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgYXV0aEdhdGV9IHBsdWdpbiAoYWxsIHJlc29sdmFibGUgZnJvbSBlbnYgLSBzZWUgYmVsb3cpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2F0ZUNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcsIEF1dGhTdG9yYWdlQ29uZmlnIHtcbiAgLyoqIEFsbG93LWxpc3QgcGF0dGVybnMgKGRvbWFpbiAvIGdsb2IgLyBgL3JlZ2V4L2ApLiBFbXB0eSA9IGFsbG93IG5vYm9keS4gRW52IFRVTk5FTF9BVVRIX0FMTE9XLiAqL1xuICBhbGxvdz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogU3ViamVjdCBsaW5lIGZvciB0aGUgY29kZSBlbWFpbC4gRW52IFRVTk5FTF9BVVRIX1NVQkpFQ1QuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFwiWW91ciB2ZXJpZmljYXRpb24gY29kZVwiLiBUaGUgd29yZGluZyBvZiB0aGUgc3ViamVjdCBhbmRcbiAgICoge0BsaW5rIG1lc3NhZ2V9IGlzIGRlbGliZXJhdGVseSB0aGUgY29udmVudGlvbmFsIHBocmFzaW5nIHJhdGhlciB0aGFuXG4gICAqIGFueXRoaW5nIGJyYW5kZWQ6IGlPUywgR21haWwsIE91dGxvb2ssIGFuZCBBbmRyb2lkIGFsbCBkZXRlY3QgYSBvbmUtdGltZVxuICAgKiBjb2RlIGZyb20gdGhpcyBzaGFwZSBhbmQgb2ZmZXIgdG8gYXV0b2ZpbGwgaXQsIGFuZCBhIG5vdmVsIHBocmFzaW5nIGlzIHdoYXRcbiAgICogYnJlYWtzIHRoYXQgZGV0ZWN0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBzdWJqZWN0IFRFTVBMQVRFLCBub3QgdGhlIGxpdGVyYWwgbGluZSBzZW50OiB0aGUgY29kZSBpcyBzcGxpY2VkXG4gICAqIGludG8gaXQgKGBcIjEyMzQ1NiBpcyB5b3VyIHZlcmlmaWNhdGlvbiBjb2RlXCJgKSBiZWNhdXNlIGEgcHVzaCBub3RpZmljYXRpb25cbiAgICogc2hvd3Mgb25seSB0aGUgc3ViamVjdCBhbmQgcHJlaGVhZGVyLCBhbmQgdGhhdCBub3RpZmljYXRpb24gaXMgd2hhdCBtb2JpbGVcbiAgICogYXV0b2ZpbGwgcmVhZHMuIFNlZSBgY29kZUVtYWlsU3ViamVjdGAgaW4gYC4vY29kZS1lbWFpbC50c2AuXG4gICAqL1xuICBzdWJqZWN0Pzogc3RyaW5nO1xuICAvKipcbiAgICogRGlzcGxheSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgZW1haWwgY29weS4gRW52IFRVTk5FTF9BVVRIX0JSQU5EX05BTUUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBicmFuZCBjb250ZXh0J3MgYG5hbWVgIC0gdGhlIGFwcCdzIG93biBgYnJhbmRpbmcvYnJhbmQueWFtbGBcbiAgICogd2hlbiBpdCBoYXMgb25lLCBlbHNlIHRoZSBkYngtdG9vbHMgZGVmYXVsdC4gU2V0IHRoaXMgb25seSB0byBvdmVycmlkZSB0aGVcbiAgICogYnJhbmQgZm9yIHRoaXMgZ2F0ZS5cbiAgICovXG4gIGJyYW5kTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIExpbmUgc2hvd24gaW1tZWRpYXRlbHkgYWJvdmUgdGhlIGNvZGUgaW4gdGhlIGVtYWlsLiBFbnYgVFVOTkVMX0FVVEhfTUVTU0FHRS5cbiAgICpcbiAgICogS2VlcCB0aGUgY29kZSBvbiBpdHMgT1dOIGxpbmUgZGlyZWN0bHkgYWZ0ZXIgdGhpcyB0ZXh0IC0gdGhhdCBhZGphY2VuY3kgaXNcbiAgICogd2hhdCB0aGUgcGxhdGZvcm0gY29kZS1kZXRlY3Rpb24gaGV1cmlzdGljcyBrZXkgb24uXG4gICAqL1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICAvKipcbiAgICogU2Vzc2lvbiBsaWZldGltZSAoc2Vjb25kcykuIEVudiBUVU5ORUxfQVVUSF9TRVNTSU9OX1RUTC4gRGVmYXVsdCAyNTkyMDAwICgzMGQpLlxuICAgKlxuICAgKiBNYXRjaGVkIHRvIHRoZSBjYWNoZS1iYWNrZWQgc2lnbmluZyBrZXkncyBvd24gMzAtZGF5IFRUTCAoc2VlXG4gICAqIGAuL3NpZ25pbmcta2V5LnRzYCk6IHRoZSBjb29raWUgYW5kIHRoZSBrZXkgdGhhdCB2YWxpZGF0ZXMgaXQgc2hvdWxkIGV4cGlyZVxuICAgKiB0b2dldGhlciwgb3Igb25lIHNpbGVudGx5IG91dGxpdmVzIHRoZSBvdGhlci5cbiAgICovXG4gIHNlc3Npb25UdGxTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogT25lLXRpbWUtY29kZSBsaWZldGltZSAoc2Vjb25kcykuIEVudiBUVU5ORUxfQVVUSF9DT0RFX1RUTC4gRGVmYXVsdCA2MDAgKDEwbSkuICovXG4gIGNvZGVUdGxTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogTWF4IHZlcmlmeSBhdHRlbXB0cyBwZXIgaXNzdWVkIGNvZGUuIERlZmF1bHQgNS4gKi9cbiAgbWF4QXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGb3JjZS1jbGVhciBjdXRvZmY6IGV2ZXJ5IHNlc3Npb24gaXNzdWVkIEJFRk9SRSBpdCBzdG9wcyB2ZXJpZnlpbmcsIHNvIG1vdmluZ1xuICAgKiBpdCBmb3J3YXJkIHNpZ25zIGV2ZXJ5b25lIG91dC4gRW52IFRVTk5FTF9BVVRIX1NFU1NJT05fQ1VUT0ZGLlxuICAgKlxuICAgKiBBbnl0aGluZyBgb2JqZWN0LnRvRGF0ZWAgYWNjZXB0czogYSBgRGF0ZWAsIGAyMDI2LTA4LTAyYCwgYW4gSVNPIGluc3RhbnQsXG4gICAqIGVwb2NoIHNlY29uZHMvbWlsbGlzLCBvciBhIHJlbGF0aXZlIGR1cmF0aW9uIChgLTMwZGAsIGA3IGRheXMgYWdvYCkuIFVuc2V0XG4gICAqIG1lYW5zIG5vIGN1dG9mZi5cbiAgICovXG4gIHNlc3Npb25DdXRvZmY/OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlO1xuICAvKipcbiAgICogRGVsaXZlciBhIGNvZGUgdG8gYW4gYWRkcmVzcy4gRGVmYXVsdHMgdG8gc2VuZGluZyB0aHJvdWdoIHRoZSBob3N0IGFwcCdzXG4gICAqIHNoYXJlZCBgQGRieC10b29scy9lbWFpbGAgdHJhbnNwb3J0IChzZWUgYC4vc2VuZC1jb2RlYCk7IG92ZXJyaWRlIHRvIHdpcmUgYVxuICAgKiBkaWZmZXJlbnQgZGVsaXZlcnkgcGF0aC5cbiAgICovXG4gIHNlbmRDb2RlPzogKGVtYWlsOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgb3B0czogU2VuZENvZGVPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogSWRlbnRpdHkgYXV0aG9yaXphdGlvbiBpbmRlcGVuZGVudCBvZiBhdXRoZW50aWNhdGlvbi4gRGVmYXVsdHMgdG8gdGhlXG4gICAqIGNvbmZpZ3VyZWQgYWxsb3ctbGlzdCBhbmQgaXMgcmUtZXZhbHVhdGVkIGZvciBldmVyeSBhY2NlcHRlZCBzZXNzaW9uLlxuICAgKi9cbiAgYXV0aG9yaXplSWRlbnRpdHk/OiBBdXRob3JpemVJZGVudGl0eTtcbiAgLyoqXG4gICAqIFRoZSBwdWJsaWMgYDxzdWJkb21haW4+LjxzZXJ2ZXI+YCB0aGF0IGlkZW50aWZpZXMgcG9ydHIgdHJhZmZpYyBieSBpdHMgYEhvc3RgXG4gICAqIGhlYWRlci4gT25seSByZXF1ZXN0cyB3aG9zZSBgSG9zdGAgbWF0Y2hlcyB0aGlzIGFyZSBnYXRlZDsgZXZlcnl0aGluZyBlbHNlXG4gICAqICh0aGUgcGxhdGZvcm0gZnJvbnQgZG9vciwgb3RoZXIgbG9jYWwgY2FsbGVycykgcGFzc2VzIHRocm91Z2guIEVudlxuICAgKiBgVFVOTkVMX1BVQkxJQ19ET01BSU5gLiBXaGVuIGFic2VudCwgdGhlIGdhdGUgaXMgaW5lcnQgKG5vdGhpbmcgaXMgdHVubmVsXG4gICAqIHRyYWZmaWMpLlxuICAgKi9cbiAgcHVibGljRG9tYWluPzogc3RyaW5nO1xuICAvKipcbiAgICogRXh0cmEgYHgtYCByZXF1ZXN0IGhlYWRlcnMgdHVubmVsIHRyYWZmaWMgbWF5IGZvcndhcmQgKGxpdGVyYWwgLyBnbG9iIC9cbiAgICogYC9yZWdleC9gKSwgdW5pb25lZCB3aXRoIHRoZSBidWlsdC1pbiBhbGxvdy1saXN0LiBFbnYgYFRVTk5FTF9GT1JXQVJEX0hFQURFUlNgLlxuICAgKi9cbiAgZm9yd2FyZEhlYWRlcnM/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFJ1biBPUEVOIHdpdGggbm8gZ2F0ZSAoZW52IGBUVU5ORUxfSU5TRUNVUkU9dHJ1ZWApLiBUaGUgbG9naW4gcm91dGVzIGFuZCBnYXRlXG4gICAqIG1pZGRsZXdhcmUgYXJlIG5vdCBtb3VudGVkLCBhbmQgdGhlIFNNVFAgZmFpbC1mYXN0IGlzIHNraXBwZWQuIFVzZSBvbmx5IHdoZW5cbiAgICogdGhlIHR1bm5lbCBpcyBkZWxpYmVyYXRlbHkgcHVibGljLlxuICAgKi9cbiAgaW5zZWN1cmU/OiBib29sZWFuO1xufVxuXG4vKiogQnJhbmRpbmcvbWVzc2FnaW5nIHBhc3NlZCB0byB7QGxpbmsgQXV0aEdhdGVDb25maWcuc2VuZENvZGV9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZW5kQ29kZU9wdGlvbnMge1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGJyYW5kTmFtZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMaWZldGltZSBvZiB0aGUgY29kZSBiZWluZyBzZW50LCBpbiBzZWNvbmRzIC0gdGhlIFJFU09MVkVEXG4gICAqIHtAbGluayBBdXRoR2F0ZUNvbmZpZy5jb2RlVHRsU2Vjb25kc30sIHNvIHRoZSBlbWFpbCBjYW4gc3RhdGUgdGhlIHJlYWxcbiAgICogZXhwaXJ5IChcIlRoaXMgY29kZSBleHBpcmVzIGluIDEwIG1pbnV0ZXNcIikgaW5zdGVhZCBvZiBhIHZhZ3VlIFwic2hvcnRseVwiXG4gICAqIHRoYXQgZHJpZnRzIGZyb20gdGhlIGNvbmZpZ3VyZWQgVFRMLlxuICAgKi9cbiAgY29kZVR0bFNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqIFJlc29sdmVkIGdhdGUgY29uZmlnIHdpdGggZW52IGZhbGxiYWNrcyArIGRlZmF1bHRzIGFwcGxpZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQXV0aEdhdGVDb25maWcge1xuICBhbGxvdzogc3RyaW5nW107XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYnJhbmROYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc2Vzc2lvblR0bFNlY29uZHM6IG51bWJlcjtcbiAgY29kZVR0bFNlY29uZHM6IG51bWJlcjtcbiAgbWF4QXR0ZW1wdHM6IG51bWJlcjtcbiAgLyoqIEZvcmNlLWNsZWFyIGN1dG9mZiBpbiBlcG9jaCBtczsgYDBgIHdoZW4gdW5zZXQuICovXG4gIHNlc3Npb25DdXRvZmZNczogbnVtYmVyO1xuICAvKiogUHVibGljIGRvbWFpbiB0aGF0IGlkZW50aWZpZXMgcG9ydHIgdHJhZmZpYyBieSBgSG9zdGA7IGB1bmRlZmluZWRgID0gaW5lcnQuICovXG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgLyoqIEV4dHJhIGB4LWAgaGVhZGVycyB0dW5uZWwgdHJhZmZpYyBtYXkgZm9yd2FyZCAodW5pb25lZCB3aXRoIHRoZSBkZWZhdWx0cykuICovXG4gIGZvcndhcmRIZWFkZXJzOiBzdHJpbmdbXTtcbiAgLyoqIFJ1biBPUEVOIHdpdGggbm8gZ2F0ZS4gKi9cbiAgaW5zZWN1cmU6IGJvb2xlYW47XG4gIHN0b3JhZ2U6IEF1dGhTdG9yYWdlTW9kZTtcbiAgc3FsaXRlUGF0aD86IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVFMgPSB7XG4gIHN1YmplY3Q6IFwiWW91ciB2ZXJpZmljYXRpb24gY29kZVwiLFxuICAvLyBUaGUgcmVwby13aWRlIGJyYW5kIGNvbnRleHQncyBkaXNwbGF5IG5hbWUsIE5PVCBhIGhhcmRjb2RlZCBwcm9kdWN0IHN0cmluZzpcbiAgLy8gdGhpcyBuYW1lIGlzIHdoYXQgdGhlIHJlY2lwaWVudCByZWFkcyBpbiB0aGUgY29kZSBlbWFpbCwgc28gaXQgaGFzIHRvIGJlIHRoZVxuICAvLyBzYW1lIGlkZW50aXR5IHRoZSByZXN0IG9mIHRoZSBhcHAgcHJlc2VudHMuIEEgaG9zdCB3aXRoIGl0cyBvd25cbiAgLy8gYGJyYW5kaW5nL2JyYW5kLnlhbWxgIG92ZXJyaWRlcyBpdCBieSBwYXNzaW5nIGBicmFuZE5hbWVgOyB0aGUgc2hhcmVkIGRlZmF1bHRcbiAgLy8gaXMgdGhlIGZhbGxiYWNrIHdoZW4gbm90aGluZyBpcyBjb25maWd1cmVkLlxuICBicmFuZE5hbWU6IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQubmFtZSxcbiAgbWVzc2FnZTogXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlIGlzOlwiLFxuICAvLyAzMCBkYXlzLCB0aGUgc2FtZSB3aW5kb3cgdGhlIGNhY2hlLWJhY2tlZCBzaWduaW5nIGtleSBpcyBzdG9yZWQgZm9yLlxuICBzZXNzaW9uVHRsU2Vjb25kczogS0VZX1RUTF9TRUNPTkRTLFxuICBjb2RlVHRsU2Vjb25kczogNjAwLFxuICBtYXhBdHRlbXB0czogNSxcbn07XG5cbi8qKiBNZXJnZSB7QGxpbmsgQXV0aEdhdGVDb25maWd9IG92ZXIgZW52IG92ZXIgZGVmYXVsdHMgaW50byBhIHJlc29sdmVkIGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXV0aEdhdGVDb25maWcoY29uZmlnOiBBdXRoR2F0ZUNvbmZpZyk6IFJlc29sdmVkQXV0aEdhdGVDb25maWcge1xuICBjb25zdCBzdG9yYWdlID0gYXV0aFN0b3JhZ2UucmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKHtcbiAgICBzdG9yYWdlOlxuICAgICAgY29uZmlnLnN0b3JhZ2UgPz9cbiAgICAgIChjb3JlQ29uZmlnLnRleHQoXCJBVVRIX1NUT1JBR0VcIiwgVFVOTkVMX0NPTkZJRykgYXMgQXV0aFN0b3JhZ2VNb2RlIHwgdW5kZWZpbmVkKSxcbiAgICBzcWxpdGVQYXRoOiBjb25maWcuc3FsaXRlUGF0aCA/PyBjb3JlQ29uZmlnLnRleHQoXCJBVVRIX1NRTElURV9QQVRIXCIsIFRVTk5FTF9DT05GSUcpLFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICAvLyBCb3RoIHNvdXJjZXMgYXJlIHVuaW9uZWQgcmF0aGVyIHRoYW4gb25lIG92ZXJyaWRpbmc6IGEgZGVwbG95bWVudC13aWRlXG4gICAgLy8gVFVOTkVMX0FVVEhfQUxMT1cgYW5kIGEgcGVyLWludm9jYXRpb24gYC0tYWxsb3dgIHNob3VsZCBib3RoIGdyYW50IGFjY2Vzcy5cbiAgICAvLyBIZW5jZSBgcGFyc2VMaXN0YCBvbiBlYWNoIHJhdGhlciB0aGFuIGBjb25maWcubGlzdGAsIHdoaWNoIHN0b3BzIGF0IHRoZVxuICAgIC8vIGZpcnN0IHNvdXJjZSB0aGF0IHlpZWxkcyBhbnl0aGluZy5cbiAgICBhbGxvdzogW1xuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb25maWcuYWxsb3cpLFxuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb3JlQ29uZmlnLnRleHQoW1wiQVVUSF9BTExPV1wiLCBcIkVNQUlMX0FVVEhfQUxMT1dcIl0sIFRVTk5FTF9DT05GSUcpKSxcbiAgICBdLFxuICAgIHN1YmplY3Q6IGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5zdWJqZWN0LCBcIkFVVEhfU1VCSkVDVFwiLCBUVU5ORUxfQ09ORklHKSA/PyBERUZBVUxUUy5zdWJqZWN0LFxuICAgIGJyYW5kTmFtZTpcbiAgICAgIGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5icmFuZE5hbWUsIFwiQVVUSF9CUkFORF9OQU1FXCIsIFRVTk5FTF9DT05GSUcpID8/IERFRkFVTFRTLmJyYW5kTmFtZSxcbiAgICBtZXNzYWdlOiBjb3JlQ29uZmlnLnN0cmluZyhjb25maWcubWVzc2FnZSwgXCJBVVRIX01FU1NBR0VcIiwgVFVOTkVMX0NPTkZJRykgPz8gREVGQVVMVFMubWVzc2FnZSxcbiAgICBzZXNzaW9uVHRsU2Vjb25kczogY29yZUNvbmZpZy5wb3NpdGl2ZUludChcbiAgICAgIGNvbmZpZy5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIFwiQVVUSF9TRVNTSU9OX1RUTFwiLFxuICAgICAgREVGQVVMVFMuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICBUVU5ORUxfQ09ORklHLFxuICAgICksXG4gICAgY29kZVR0bFNlY29uZHM6IGNvcmVDb25maWcucG9zaXRpdmVJbnQoXG4gICAgICBjb25maWcuY29kZVR0bFNlY29uZHMsXG4gICAgICBcIkFVVEhfQ09ERV9UVExcIixcbiAgICAgIERFRkFVTFRTLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgVFVOTkVMX0NPTkZJRyxcbiAgICApLFxuICAgIG1heEF0dGVtcHRzOiBjb25maWcubWF4QXR0ZW1wdHMgPz8gREVGQVVMVFMubWF4QXR0ZW1wdHMsXG4gICAgc2Vzc2lvbkN1dG9mZk1zOiByZXNvbHZlU2Vzc2lvbkN1dG9mZihjb25maWcuc2Vzc2lvbkN1dG9mZiksXG4gICAgcHVibGljRG9tYWluOiBjb3JlQ29uZmlnLnN0cmluZyhjb25maWcucHVibGljRG9tYWluLCBcIlBVQkxJQ19ET01BSU5cIiwgVFVOTkVMX0NPTkZJRyksXG4gICAgZm9yd2FyZEhlYWRlcnM6IFtcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29uZmlnLmZvcndhcmRIZWFkZXJzKSxcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29yZUNvbmZpZy50ZXh0KFwiRk9SV0FSRF9IRUFERVJTXCIsIFRVTk5FTF9DT05GSUcpKSxcbiAgICBdLFxuICAgIGluc2VjdXJlOiBjb3JlQ29uZmlnLmJvb2xlYW4oY29uZmlnLmluc2VjdXJlLCBcIklOU0VDVVJFXCIsIFRVTk5FTF9DT05GSUcpID8/IGZhbHNlLFxuICAgIHN0b3JhZ2U6IHN0b3JhZ2UubW9kZSxcbiAgICBzcWxpdGVQYXRoOiBzdG9yYWdlLnNxbGl0ZVBhdGgsXG4gIH07XG59XG5cbi8qKiBUaGUgaGFuZGxlcnMgdGhlIGdhdGUgbWlkZGxld2FyZSBjYWxscyBpbi1wcm9jZXNzIChyZXR1cm5lZCBieSB7QGxpbmsgQXV0aEdhdGVQbHVnaW4uZXhwb3J0c30pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2F0ZUFwaSB7XG4gIC8qKiBCZXR0ZXIgQXV0aCBhbmQgY29tcGF0aWJpbGl0eSByb3V0ZXMgdW5kZXIgYC9hcGkvZW1haWwvYXV0aC8qYC4gKi9cbiAgaGFuZGxlcihyZXF1ZXN0OiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT47XG4gIC8qKiBSZXNvbHZlIHRoZSBhdXRob3JpemVkIGVtYWlsIGZvciByZXF1ZXN0IGhlYWRlcnMsIG9yIHVuZGVmaW5lZC4gKi9cbiAgc2Vzc2lvbihoZWFkZXJzOiBIZWFkZXJzKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICAvKiogVGhlIGdhdGUgc3RhdHVzIHBheWxvYWQuICovXG4gIHN0YXR1cyhoZWFkZXJzOiBIZWFkZXJzKTogUHJvbWlzZTxBdXRoU3RhdHVzPjtcbiAgLyoqIFdoZXRoZXIgdGhlIHJ1bnRpbWUgZXhwb3NlcyBwYXNza2V5IGVucm9sbG1lbnQgYW5kIGF1dGhlbnRpY2F0aW9uLiAqL1xuICByZWFkb25seSBwYXNza2V5c0VuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKiBDbG9zZSBhdXRoIHN0b3JhZ2Ugb3duZWQgYnkgdGhpcyBydW50aW1lLiAqL1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEFwcEtpdCBwbHVnaW4gYWRhcHRpbmcgYEBkYngtdG9vbHMvYXV0aGAgdG8gdHVubmVsIHRyYWZmaWMuIE9uIGBzZXR1cCgpYCBpdCByZWdpc3RlcnMgdGhlIGxvZ2luXG4gKiByb3V0ZXMgKGAvYXBpL2VtYWlsL2F1dGgvKmApIGFuZCBhIGdhdGluZyBtaWRkbGV3YXJlIG9uIHRoZSBhcHAncyBPV04gRXhwcmVzc1xuICogc2VydmVyIHZpYSBgdGhpcy5jb250ZXh0YCwgc28gYSBwdWJsaWMgcG9ydHIgY2FsbGVyIG11c3QgcHJvdmUgYW4gZW1haWwgYmVmb3JlXG4gKiByZWFjaGluZyB0aGUgYXBwJ3MgYC9hcGkvKmAgLSBzZWUgYC4vZ2F0ZWAuIEZyb250LWRvb3IgKHBsYXRmb3JtKSB0cmFmZmljIGFuZFxuICogb3RoZXIgbG9jYWwgY2FsbGVycyBwYXNzIHRocm91Z2ggdW50b3VjaGVkICh0aGUgZ2F0ZSBrZXlzIG9uIHRoZSBgSG9zdGAgaGVhZGVyKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhHYXRlUGx1Z2luIGV4dGVuZHMgUGx1Z2luPEF1dGhHYXRlQ29uZmlnPiB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImF1dGhHYXRlXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQXV0aCBHYXRlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQmV0dGVyIEF1dGggZW1haWwgT1RQIGFuZCBwYXNza2V5IGFjY2VzcyBnYXRlIGZvciBhIHB1YmxpYyB0dW5uZWwuXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIHJlcXVpcmVkOiBbXSxcbiAgICAgIG9wdGlvbmFsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBSZXNvdXJjZVR5cGUuUE9TVEdSRVMsXG4gICAgICAgICAgYWxpYXM6IFwiYXV0aFwiLFxuICAgICAgICAgIHJlc291cmNlS2V5OiBcImF1dGgtZGF0YWJhc2VcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJEdXJhYmxlIHVzZXJzLCBzZXNzaW9ucywgT1RQIHJlY29yZHMsIGFuZCBwYXNza2V5cy5cIixcbiAgICAgICAgICBwZXJtaXNzaW9uOiBcIkNBTl9DT05ORUNUX0FORF9DUkVBVEVcIixcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIGluc3RhbmNlX25hbWU6IHsgZW52OiBcIkxBS0VCQVNFX0lOU1RBTkNFX05BTUVcIiB9LFxuICAgICAgICAgICAgZGF0YWJhc2VfbmFtZTogeyBlbnY6IFwiUEdEQVRBQkFTRVwiIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSBzYXRpc2ZpZXMgUGx1Z2luTWFuaWZlc3Q8XCJhdXRoR2F0ZVwiPjtcblxuICBwcml2YXRlIHJlc29sdmVkITogUmVzb2x2ZWRBdXRoR2F0ZUNvbmZpZztcbiAgcHJpdmF0ZSBydW50aW1lPzogUGFzc3dvcmRsZXNzQXV0aFJ1bnRpbWU7XG5cbiAgc3RhdGljIGdldFJlc291cmNlUmVxdWlyZW1lbnRzKGNvbmZpZzogQXV0aEdhdGVDb25maWcpOiBSZXNvdXJjZVJlcXVpcmVtZW50W10ge1xuICAgIGlmIChhdXRoU3RvcmFnZS5yZXNvbHZlQXV0aFN0b3JhZ2VDb25maWcoY29uZmlnKS5tb2RlICE9PSBcImxha2ViYXNlXCIpIHJldHVybiBbXTtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0eXBlOiBSZXNvdXJjZVR5cGUuUE9TVEdSRVMsXG4gICAgICAgIGFsaWFzOiBcImF1dGhcIixcbiAgICAgICAgcmVzb3VyY2VLZXk6IFwiYXV0aC1kYXRhYmFzZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJEdXJhYmxlIHVzZXJzLCBzZXNzaW9ucywgT1RQIHJlY29yZHMsIGFuZCBwYXNza2V5cy5cIixcbiAgICAgICAgcGVybWlzc2lvbjogXCJDQU5fQ09OTkVDVF9BTkRfQ1JFQVRFXCIsXG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIGluc3RhbmNlX25hbWU6IHsgZW52OiBcIkxBS0VCQVNFX0lOU1RBTkNFX05BTUVcIiB9LFxuICAgICAgICAgIGRhdGFiYXNlX25hbWU6IHsgZW52OiBcIlBHREFUQUJBU0VcIiB9LFxuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVzb2x2ZWQgPSByZXNvbHZlQXV0aEdhdGVDb25maWcodGhpcy5jb25maWcpO1xuXG4gICAgaWYgKHRoaXMucmVzb2x2ZWQuaW5zZWN1cmUpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiaW5zZWN1cmUgbW9kZSAtIHRoZSB0dW5uZWwgcnVucyBPUEVOIHdpdGggbm8gYXV0aCBnYXRlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsYWtlYmFzZVBsdWdpbiA9IGFwcGtpdFBsdWdpbi5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKTtcbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCBhdXRoU3RvcmFnZS5jcmVhdGVBdXRoU3RvcmFnZShcbiAgICAgICAgdGhpcy5yZXNvbHZlZCxcbiAgICAgICAgbGFrZWJhc2VQbHVnaW4/LmV4cG9ydHMoKS5wb29sLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsga2V5IH0gPSBhd2FpdCBzaWduaW5nS2V5KHRoaXMucmVzb2x2ZWQuc2Vzc2lvbkN1dG9mZk1zKTtcbiAgICAgIHRoaXMucnVudGltZSA9IGF3YWl0IHBhc3N3b3JkbGVzc0F1dGguY3JlYXRlUGFzc3dvcmRsZXNzQXV0aCh7XG4gICAgICAgIHN0b3JhZ2UsXG4gICAgICAgIGJhc2VVUkw6IGF1dGhPcmlnaW4odGhpcy5yZXNvbHZlZC5wdWJsaWNEb21haW4pLFxuICAgICAgICBiYXNlUGF0aDogXCIvYXBpL2VtYWlsL2F1dGhcIixcbiAgICAgICAgYXBwTmFtZTogdGhpcy5yZXNvbHZlZC5icmFuZE5hbWUsXG4gICAgICAgIHNlY3JldDogQnVmZmVyLmZyb20oa2V5KS50b1N0cmluZyhcImJhc2U2NHVybFwiKSxcbiAgICAgICAgc2Vzc2lvblR0bFNlY29uZHM6IHRoaXMucmVzb2x2ZWQuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICAgIHNlc3Npb25DdXRvZmZNczogdGhpcy5yZXNvbHZlZC5zZXNzaW9uQ3V0b2ZmTXMsXG4gICAgICAgIGNvZGVUdGxTZWNvbmRzOiB0aGlzLnJlc29sdmVkLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgICBtYXhBdHRlbXB0czogdGhpcy5yZXNvbHZlZC5tYXhBdHRlbXB0cyxcbiAgICAgICAgYXV0aG9yaXplSWRlbnRpdHk6IChlbWFpbCkgPT4gdGhpcy5hdXRob3JpemVJZGVudGl0eShlbWFpbCksXG4gICAgICAgIHNlbmRDb2RlOiAoZW1haWwsIGNvZGUsIG9wdGlvbnMpID0+IHRoaXMuc2VuZENvZGUoZW1haWwsIGNvZGUsIG9wdGlvbnMpLFxuICAgICAgICBzdWJqZWN0OiB0aGlzLnJlc29sdmVkLnN1YmplY3QsXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMucmVzb2x2ZWQubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgLy8gYHNlcnZlcigpYCBpcyBkZWZlcnJlZCwgc28gaXQgZG9lcyBub3QgZXhpc3QgZHVyaW5nIHRoaXMgcGx1Z2luJ3Mgc2V0dXAuXG4gICAgICAvLyBBdCBgc2V0dXA6Y29tcGxldGVgIHRoZSBFeHByZXNzIGFwcCBleGlzdHMgYnV0IGhhcyBub3QgaW5qZWN0ZWQgcGx1Z2luXG4gICAgICAvLyByb3V0ZXMgb3Igc3RhdGljIGhhbmRsaW5nIHlldCwgd2hpY2ggaXMgdGhlIG9uZSBwb2ludCB0aGUgZ2F0ZSBjYW4gbW91bnRcbiAgICAgIC8vIGFoZWFkIG9mIGV2ZXJ5IHByb3RlY3RlZCByb3V0ZS5cbiAgICAgIHRoaXMuY29udGV4dD8ub25MaWZlY3ljbGUoXCJzZXR1cDpjb21wbGV0ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMubW91bnRHYXRlUm91dGVzKCk7XG4gICAgICAgIC8vIEZhaWwgZmFzdCBvbmNlIHRoZSBzaWJsaW5nIGVtYWlsIHBsdWdpbiBoYXMgcHJpbWVkIGl0cyB0cmFuc3BvcnQ6IGFcbiAgICAgICAgLy8gZ2F0ZSB0aGF0IGNhbm5vdCBlbWFpbCBhIGNvZGUgbGV0cyBub2JvZHkgaW4uXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuc2VuZENvZGUpIGF3YWl0IGVuc3VyZUVtYWlsQXZhaWxhYmxlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIHBhdHRlcm5zOiB0aGlzLnJlc29sdmVkLmFsbG93Lmxlbmd0aCxcbiAgICAgIHNlc3Npb25UdGxTZWNvbmRzOiB0aGlzLnJlc29sdmVkLnNlc3Npb25UdGxTZWNvbmRzLFxuICAgICAgcHVibGljRG9tYWluOiB0aGlzLnJlc29sdmVkLnB1YmxpY0RvbWFpbiA/PyBudWxsLFxuICAgICAgaW5zZWN1cmU6IHRoaXMucmVzb2x2ZWQuaW5zZWN1cmUsXG4gICAgICBzdG9yYWdlOiB0aGlzLnJlc29sdmVkLnN0b3JhZ2UsXG4gICAgICBzZXNzaW9uQ3V0b2ZmOlxuICAgICAgICB0aGlzLnJlc29sdmVkLnNlc3Npb25DdXRvZmZNcyA+IDBcbiAgICAgICAgICA/IG5ldyBEYXRlKHRoaXMucmVzb2x2ZWQuc2Vzc2lvbkN1dG9mZk1zKS50b0lTT1N0cmluZygpXG4gICAgICAgICAgOiBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5ydW50aW1lPy5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHRoZSBsb2dpbiByb3V0ZXMgKGAvYXBpL2VtYWlsL2F1dGgvKmApIGFuZCB0aGUgZ2F0aW5nIG1pZGRsZXdhcmUgb25cbiAgICogdGhlIGFwcCdzIE9XTiBFeHByZXNzIHNlcnZlci4gQXQgYHNldHVwOmNvbXBsZXRlYCwgdGhlIGRlZmVycmVkIHNlcnZlciBwbHVnaW5cbiAgICogaGFzIGNvbnN0cnVjdGVkIGl0cyBFeHByZXNzIGFwcCBidXQgaGFzIG5vdCBpbmplY3RlZCBwbHVnaW4gcm91dGVzIG9yIHN0YXRpY1xuICAgKiBoYW5kbGluZywgc28gZGlyZWN0IHJlZ2lzdHJhdGlvbiBwdXRzIHRoZSBnYXRlIGZpcnN0LiBUaGUgY29udGV4dCdzIGJ1ZmZlcmVkXG4gICAqIHJvdXRlIEFQSSByZW1haW5zIGEgZmFsbGJhY2sgZm9yIGNvbXBhdGlibGUgbm9uLXN0YW5kYXJkIHNlcnZlciBwbHVnaW5zLlxuICAgKi9cbiAgcHJpdmF0ZSBtb3VudEdhdGVSb3V0ZXMoKTogdm9pZCB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwibm8gcGx1Z2luIGNvbnRleHQgLSB0aGUgYXV0aCBnYXRlIGNhbm5vdCBtb3VudCBpdHMgcm91dGVzXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBtb3VudEdhdGVPbkNvbnRleHQoY29udGV4dCwge1xuICAgICAgZ2F0ZTogdGhpcy5leHBvcnRzKCksXG4gICAgICBwdWJsaWNEb21haW46IHRoaXMucmVzb2x2ZWQucHVibGljRG9tYWluLFxuICAgICAgZm9yd2FyZEhlYWRlcnM6IHRoaXMucmVzb2x2ZWQuZm9yd2FyZEhlYWRlcnMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogVGhlIGNvZGUgc2VuZGVyOiB0aGUgY29uZmlndXJlZCBgc2VuZENvZGVgLCBlbHNlIHRoZSBzaGFyZWQtdHJhbnNwb3J0IGRlZmF1bHQuICovXG4gIHByaXZhdGUgZ2V0IHNlbmRDb2RlKCk6IE5vbk51bGxhYmxlPEF1dGhHYXRlQ29uZmlnW1wic2VuZENvZGVcIl0+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuc2VuZENvZGUgPz8gZGVmYXVsdFNlbmRDb2RlO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRob3JpemVJZGVudGl0eShlbWFpbDogc3RyaW5nKTogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmNvbmZpZy5hdXRob3JpemVJZGVudGl0eSkgcmV0dXJuIHRoaXMuY29uZmlnLmF1dGhvcml6ZUlkZW50aXR5KGVtYWlsKTtcbiAgICByZXR1cm4gbG9va3NMaWtlRW1haWwoZW1haWwpICYmIG1hdGNoZXNBbGxvd2xpc3QoZW1haWwsIHRoaXMucmVzb2x2ZWQuYWxsb3cpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZXhwb3J0cygpOiBBdXRoR2F0ZUFwaSB7XG4gICAgY29uc3QgcnVudGltZSA9IHRoaXMucnVudGltZTtcbiAgICByZXR1cm4ge1xuICAgICAgcGFzc2tleXNFbmFibGVkOiBydW50aW1lPy5wYXNza2V5c0VuYWJsZWQgPz8gZmFsc2UsXG4gICAgICBoYW5kbGVyOiAocmVxdWVzdCkgPT5cbiAgICAgICAgcnVudGltZT8uaGFuZGxlcihyZXF1ZXN0KSA/PyBQcm9taXNlLnJlc29sdmUobmV3IFJlc3BvbnNlKFwiTm90IEZvdW5kXCIsIHsgc3RhdHVzOiA0MDQgfSkpLFxuICAgICAgc2Vzc2lvbjogKGhlYWRlcnMpID0+IHJ1bnRpbWU/LnNlc3Npb24oaGVhZGVycykgPz8gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCksXG4gICAgICBzdGF0dXM6IChoZWFkZXJzKSA9PlxuICAgICAgICBydW50aW1lPy5zdGF0dXMoaGVhZGVycykgPz9cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHsgYXV0aGVudGljYXRlZDogZmFsc2UsIGVuYWJsZWQ6IGZhbHNlLCBwYXNza2V5c0VuYWJsZWQ6IGZhbHNlIH0pLFxuICAgICAgY2xvc2U6ICgpID0+IHJ1bnRpbWU/LmNsb3NlKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdXRoT3JpZ2luKHB1YmxpY0RvbWFpbj86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gc3RyaW5nLnRyaW1Ub051bGwocHVibGljRG9tYWluKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiaHR0cDovL2xvY2FsaG9zdFwiO1xuICBpZiAoL15odHRwcz86XFwvXFwvL2kudGVzdCh2YWx1ZSkpIHJldHVybiBuZXcgVVJMKHZhbHVlKS5vcmlnaW47XG4gIGNvbnN0IGhvc3QgPSB2YWx1ZS5zcGxpdChcIi9cIilbMF0hO1xuICBjb25zdCBsb2NhbCA9IGhvc3QgPT09IFwibG9jYWxob3N0XCIgfHwgaG9zdC5zdGFydHNXaXRoKFwibG9jYWxob3N0OlwiKTtcbiAgcmV0dXJuIGAke2xvY2FsID8gXCJodHRwXCIgOiBcImh0dHBzXCJ9Oi8vJHtob3N0fWA7XG59XG5cbi8qKiBGYWN0b3J5OiBgYXV0aEdhdGUoeyBhbGxvdywgc3ViamVjdCwgLi4uIH0pYCBmb3IgYW4gQXBwS2l0IGBwbHVnaW5zYCBhcnJheS4gKi9cbmV4cG9ydCBjb25zdCBhdXRoR2F0ZSA9IHRvUGx1Z2luKEF1dGhHYXRlUGx1Z2luKTtcbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The gate's HS256 session-signing key, persisted in AppKit's cache.
2
+ * The gate's Better Auth secret, persisted in AppKit's cache.
3
3
  *
4
4
  * The key decides whether a session COOKIE still verifies, so it must OUTLIVE the
5
5
  * process: a per-process `randomBytes(32)` would invalidate every outstanding cookie
@@ -75,7 +75,7 @@ export interface SigningKey {
75
75
  * plugin's `setup()` passes its resolved value there, before any request can
76
76
  * reach the lazy path.
77
77
  *
78
- * `TUNNEL_AUTH_JWT_SECRET` when set, else the cache-backed key. A cache that is
78
+ * `TUNNEL_AUTH_JWT_SECRET` when set, else the cache-backed secret. A cache that is
79
79
  * unavailable degrades to an ephemeral per-process key (the previous behaviour)
80
80
  * rather than refusing to sign: the key only validates an ALREADY-issued session,
81
81
  * so losing it costs sessions, never admission - a caller still needs a code
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The gate's HS256 session-signing key, persisted in AppKit's cache.
2
+ * The gate's Better Auth secret, persisted in AppKit's cache.
3
3
  *
4
4
  * The key decides whether a session COOKIE still verifies, so it must OUTLIVE the
5
5
  * process: a per-process `randomBytes(32)` would invalidate every outstanding cookie
@@ -57,7 +57,7 @@ const logger = log.logger("tunnel:signing-key");
57
57
  export const KEY_TTL_SECONDS = 30 * 24 * 60 * 60;
58
58
  /** Cache-key prefix for the signing key, namespaced away from other cache use. */
59
59
  const KEY_PREFIX = "tunnel:auth:signing-key:";
60
- /** Bytes of entropy in a generated key (256-bit, matching HS256's hash width). */
60
+ /** Bytes of entropy in a generated Better Auth secret. */
61
61
  const KEY_BYTES = 32;
62
62
  /**
63
63
  * Resolve the force-clear cutoff as epoch MILLISECONDS, or `0` when unset.
@@ -143,7 +143,7 @@ let pending;
143
143
  * plugin's `setup()` passes its resolved value there, before any request can
144
144
  * reach the lazy path.
145
145
  *
146
- * `TUNNEL_AUTH_JWT_SECRET` when set, else the cache-backed key. A cache that is
146
+ * `TUNNEL_AUTH_JWT_SECRET` when set, else the cache-backed secret. A cache that is
147
147
  * unavailable degrades to an ephemeral per-process key (the previous behaviour)
148
148
  * rather than refusing to sign: the key only validates an ALREADY-issued session,
149
149
  * so losing it costs sessions, never admission - a caller still needs a code
@@ -170,4 +170,4 @@ export function signingKey(configuredCutoff) {
170
170
  export function resetSigningKey() {
171
171
  pending = undefined;
172
172
  }
173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmluZy1rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2lnbmluZy1rZXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRWhEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFakQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxHQUFHLDBCQUEwQixDQUFDO0FBRTlDLGtGQUFrRjtBQUNsRixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFVckI7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsVUFBbUM7SUFDdEUsTUFBTSxHQUFHLEdBQ1AsVUFBVSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzFGLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFFOUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FB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Q0FBQztBQUU3Qzs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLGdCQUF5QztJQUNsRSxPQUFPLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN0QixNQUFNLFFBQVEsR0FBRyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDakUsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDakUsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDMUQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsSUFBSSxDQUNULE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxhQUFhLENBQUMseUdBQXlHLEVBQzVKLEVBQUUsS0FBSyxFQUFFLENBQ1YsQ0FBQztZQUNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDTCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxlQUFlO0lBQzdCLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGdhdGUncyBIUzI1NiBzZXNzaW9uLXNpZ25pbmcga2V5LCBwZXJzaXN0ZWQgaW4gQXBwS2l0J3MgY2FjaGUuXG4gKlxuICogVGhlIGtleSBkZWNpZGVzIHdoZXRoZXIgYSBzZXNzaW9uIENPT0tJRSBzdGlsbCB2ZXJpZmllcywgc28gaXQgbXVzdCBPVVRMSVZFIHRoZVxuICogcHJvY2VzczogYSBwZXItcHJvY2VzcyBgcmFuZG9tQnl0ZXMoMzIpYCB3b3VsZCBpbnZhbGlkYXRlIGV2ZXJ5IG91dHN0YW5kaW5nIGNvb2tpZVxuICogb24gcmVzdGFydCBhbmQgbWFrZSBlYWNoIHNpZ25lZC1pbiB1c2VyIHJlcXVlc3QgYSBuZXcgY29kZSAtIHBhaW5mdWwgZm9yIGEgdHVubmVsLFxuICogd2hpY2ggcmVzdGFydHMgd2hlbmV2ZXIgdGhlIGFwcCBpdCB3cmFwcyBkb2VzLiBTbyB0aGUga2V5IGlzIHN0b3JlZCBpbiB0aGUgY2FjaGVcbiAqIEFwcEtpdCBhbHJlYWR5IGNvbmZpZ3VyZWQgKG1lbW9yeSwgb3IgTGFrZWJhc2Ugd2hlbiB0aGUgaG9zdCB3aXJlcyBhIHBlcnNpc3RlbnRcbiAqIGBDYWNoZVN0b3JhZ2VgKSwgYW5kIHdpdGggcGVyc2lzdGVudCBzdG9yYWdlIGEgcmVzdGFydCBrZWVwcyBzZXNzaW9ucyBhbGl2ZSBmb3JcbiAqIHtAbGluayBLRVlfVFRMX1NFQ09ORFN9LlxuICpcbiAqIEFuIGV4cGxpY2l0bHkgY29uZmlndXJlZCBgVFVOTkVMX0FVVEhfSldUX1NFQ1JFVGAgc3RpbGwgd2lucyBvdXRyaWdodC4gVGhhdCBpc1xuICogdGhlIHJpZ2h0IGFuc3dlciBmb3IgYSBmbGVldDogYW4gb3BlcmF0b3ItaGVsZCBzZWNyZXQgbmVlZHMgbm8gc2hhcmVkIGNhY2hlIGFuZFxuICogbm8gY29udmVyZ2VuY2UsIGFuZCBpdCBzdXJ2aXZlcyBhIGNhY2hlIGZsdXNoLlxuICpcbiAqICMjIGdldCAvIGdlbmVyYXRlIC8gZ2V0XG4gKlxuICogVHdvIGluc3RhbmNlcyBib290aW5nIGF0IG9uY2UgYm90aCBtaXNzLCBzbyBib3RoIHdvdWxkIGdlbmVyYXRlIC0gYW5kIHRoZSBsb3NlclxuICogd291bGQgc2lnbiBjb29raWVzIHdpdGggYSBrZXkgdGhlIHdpbm5lciByZWplY3RzLiBSZXNvbHV0aW9uIGlzIGEgcmUtUkVBRCBhZnRlclxuICogdGhlIHdyaXRlOiB3aGF0ZXZlciB0aGUgY2FjaGUgaG9sZHMgYWZ0ZXJ3YXJkcyBpcyB0aGUga2V5IGV2ZXJ5b25lIGFkb3B0cywgc29cbiAqIHRoZSBpbnN0YW5jZXMgY29udmVyZ2Ugb24gT05FIHZhbHVlIGluc3RlYWQgb2YgdHJ1c3RpbmcgdGhlIG9uZSB0aGV5IG1pbnRlZC5cbiAqIChgc2V0YCBpcyBub3QgY29uZGl0aW9uYWwgaW4gdGhlIGNhY2hlIEFQSSAtIHRoZXJlIGlzIG5vIGBzZXRueGAgdG8gbGVhbiBvbiAtXG4gKiBhbmQgdGhpcyBydW5zIG9uY2UgcGVyIHByb2Nlc3MsIHNvIHRoZSBleHRyYSByb3VuZC10cmlwIGlzIGZyZWUuKVxuICpcbiAqIEEgcGF0aG9sb2dpY2FsIGludGVybGVhdmUgY2FuIHN0aWxsIGNvc3QgYSBrZXk6IGlmIEEgd3JpdGVzIGJldHdlZW4gQidzIHdyaXRlXG4gKiBhbmQgQidzIHJlLXJlYWQsIEIgYWRvcHRzIEEncyBrZXkgd2hpbGUgQSBhZG9wdHMgaXRzIG93bi4gVGhlIGNvc3QgaXMgYm91bmRlZCAtXG4gKiBhIGNvb2tpZSBtaW50ZWQgaW4gdGhhdCB3aW5kb3cgZmFpbHMgdG8gdmVyaWZ5IGFuZCB0aGUgaG9sZGVyIHNpZ25zIGluIGFnYWluIC1cbiAqIGFuZCBpdCBjYW5ub3QgcHJvZHVjZSBhIGtleSBvbmUgaW5zdGFuY2UgVFJVU1RTIGJ1dCBhbm90aGVyIHJlamVjdHMgZm9yIGxvbmdlclxuICogdGhhbiB0aGUgd2luZG93IGl0c2VsZi4gU2V0IGBUVU5ORUxfQVVUSF9KV1RfU0VDUkVUYCB0byByZW1vdmUgdGhlIHJhY2VcbiAqIGVudGlyZWx5LlxuICpcbiAqICMjIEZvcmNpbmcgZXZlcnkgc2Vzc2lvbiB0byBlbmRcbiAqXG4gKiB7QGxpbmsgcmVzb2x2ZVNlc3Npb25DdXRvZmZ9IHJlYWRzIGEgZGF0ZSBmcm9tIGBUVU5ORUxfQVVUSF9TRVNTSU9OX0NVVE9GRmAgKG9yXG4gKiBgLS1zZXNzaW9uLWN1dG9mZmApLCBhbmQgdGhhdCBkYXRlIGlzIHBhcnQgb2YgdGhlIGNhY2hlIEtFWS4gTW92aW5nIGl0IGZvcndhcmRcbiAqIG1ha2VzIGV2ZXJ5IHByaW9yIGtleSB1bnJlYWNoYWJsZSwgc28gZXZlcnkgY29va2llIHNpZ25lZCBhZ2FpbnN0IGl0IHN0b3BzXG4gKiB2ZXJpZnlpbmcgLSB0aGUgbG9nLWV2ZXJ5b25lLW91dCBzd2l0Y2gsIHdpdGhvdXQgaGF2aW5nIHRvIGZpbmQgYW5kIGZsdXNoIGFcbiAqIGNhY2hlIGVudHJ5LiBUaGUgY3V0b2ZmIGlzIGFsc28gYXNzZXJ0ZWQgYWdhaW5zdCBlYWNoIHRva2VuJ3MgYGlhdGAsIHNvIGFcbiAqIGNvb2tpZSB0aGF0IHByZWRhdGVzIGl0IGlzIHJlZnVzZWQgZXZlbiBpZiBpdCB3YXMgc2lnbmVkIHdpdGggdGhlIGtleSB0aGF0IGlzXG4gKiBzb21laG93IHN0aWxsIGN1cnJlbnQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBDYWNoZU1hbmFnZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBsb2csIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBUVU5ORUxfQ09ORklHIH0gZnJvbSBcIi4vX2NvbmZpZy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwidHVubmVsOnNpZ25pbmcta2V5XCIpO1xuXG4vKipcbiAqIEhvdyBsb25nIGEgY2FjaGVkIHNpZ25pbmcga2V5IGxpdmVzOiAzMCBkYXlzLlxuICpcbiAqIFRoaXMgaXMgdGhlIGNlaWxpbmcgb24gaG93IGxvbmcgYSBzZXNzaW9uIGNvb2tpZSBjYW4gc3RheSB2YWxpZCBhY3Jvc3NcbiAqIHJlc3RhcnRzLCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgPj0gdGhlIGRlZmF1bHQgc2Vzc2lvbiBUVEwgLSBhIGtleSB0aGF0IGV4cGlyZWRcbiAqIGJlZm9yZSB0aGUgY29va2llcyBpdCBzaWduZWQgd291bGQgbG9nIGV2ZXJ5b25lIG91dCBmb3Igbm8gcmVhc29uLlxuICovXG5leHBvcnQgY29uc3QgS0VZX1RUTF9TRUNPTkRTID0gMzAgKiAyNCAqIDYwICogNjA7XG5cbi8qKiBDYWNoZS1rZXkgcHJlZml4IGZvciB0aGUgc2lnbmluZyBrZXksIG5hbWVzcGFjZWQgYXdheSBmcm9tIG90aGVyIGNhY2hlIHVzZS4gKi9cbmNvbnN0IEtFWV9QUkVGSVggPSBcInR1bm5lbDphdXRoOnNpZ25pbmcta2V5OlwiO1xuXG4vKiogQnl0ZXMgb2YgZW50cm9weSBpbiBhIGdlbmVyYXRlZCBrZXkgKDI1Ni1iaXQsIG1hdGNoaW5nIEhTMjU2J3MgaGFzaCB3aWR0aCkuICovXG5jb25zdCBLRVlfQllURVMgPSAzMjtcblxuLyoqIFdoYXQgdGhlIGNhY2hlIHN0b3JlczogdGhlIGtleSBwbHVzIHdoZW4gaXQgd2FzIG1pbnRlZCwgZm9yIG9ic2VydmFiaWxpdHkuICovXG5pbnRlcmZhY2UgU3RvcmVkS2V5IHtcbiAgLyoqIEJhc2U2NHVybCBvZiB0aGUgcmF3IGtleSBieXRlcy4gKi9cbiAgc2VjcmV0OiBzdHJpbmc7XG4gIC8qKiBXaGVuIHRoaXMga2V5IHdhcyBnZW5lcmF0ZWQsIElTTy04NjAxLiAqL1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBmb3JjZS1jbGVhciBjdXRvZmYgYXMgZXBvY2ggTUlMTElTRUNPTkRTLCBvciBgMGAgd2hlbiB1bnNldC5cbiAqXG4gKiBBY2NlcHRzIHdoYXRldmVyIGBvYmplY3QudG9EYXRlYCBhY2NlcHRzIC0gYSBgRGF0ZWAsIGAyMDI2LTA4LTAyYCwgYW4gSVNPXG4gKiBpbnN0YW50LCBlcG9jaCBzZWNvbmRzIG9yIG1pbGxpcyBmcm9tIGBkYXRlICslc2AsIG9yIGEgcmVsYXRpdmUgZHVyYXRpb25cbiAqIChgLTMwZGAsIGA3IGRheXMgYWdvYCksIHdoaWNoIGlzIHRoZSBzcGVsbGluZyBhbiBvcGVyYXRvciByZWFjaGluZyBmb3IgdGhpc1xuICogdXN1YWxseSB3YW50czogc2lnbiBvdXQgZXZlcnlvbmUgd2hvIHNpZ25lZCBpbiBtb3JlIHRoYW4gYSBtb250aCBhZ28uXG4gKlxuICogQW4gVU5QQVJTRUFCTEUgdmFsdWUgaXMgaWdub3JlZCB3aXRoIGEgd2FybmluZyByYXRoZXIgdGhhbiB0aHJvd2luZzogdGhpcyBpc1xuICogdGhlIHN3aXRjaCB0aGF0IGxvZ3MgYSBmbGVldCBiYWNrIGluLCBhbmQgZmFpbGluZyB0byBib290IG92ZXIgYSB0eXBvIGlzIHdvcnNlXG4gKiB0aGFuIG5vdCByb3RhdGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTZXNzaW9uQ3V0b2ZmKGNvbmZpZ3VyZWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKTogbnVtYmVyIHtcbiAgY29uc3QgcmF3ID1cbiAgICBjb25maWd1cmVkID8/IGNvbmZpZy50ZXh0KFtcIkFVVEhfU0VTU0lPTl9DVVRPRkZcIiwgXCJBVVRIX1NFU1NJT05fRVBPQ0hcIl0sIFRVTk5FTF9DT05GSUcpO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBudWxsIHx8IHJhdyA9PT0gXCJcIikgcmV0dXJuIDA7XG5cbiAgY29uc3QgZGF0ZSA9IG9iamVjdC50b0RhdGUocmF3KTtcbiAgaWYgKCFkYXRlKSB7XG4gICAgbG9nZ2VyLndhcm4oYGlnbm9yaW5nIHVucGFyc2VhYmxlICR7Y29uZmlnLm5hbWUoXCJBVVRIX1NFU1NJT05fQ1VUT0ZGXCIsIFRVTk5FTF9DT05GSUcpfWAsIHtcbiAgICAgIHZhbHVlOiBTdHJpbmcocmF3KSxcbiAgICB9KTtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gY2xhbXBUb1Bhc3QoZGF0ZS5nZXRUaW1lKCkpO1xufVxuXG4vKipcbiAqIEhvbGQgdGhlIGN1dG9mZiBhdCBcIm5vd1wiLCBiZWNhdXNlIGEgRlVUVVJFIGN1dG9mZiB3b3VsZCByZWZ1c2UgdGhlIHNlc3Npb25zIGl0XG4gKiBpcyBhYm91dCB0byBtaW50IGFzIHdlbGwgYXMgdGhlIG9sZCBvbmVzIC0gYW4gYXBwIG5vYm9keSBjYW4gc2lnbiBpbiB0bywgZnJvbSBhXG4gKiBtaXN0eXBlZCB5ZWFyLCB3aXRoIHRoZSBmaXggaGlkZGVuIGJlaGluZCB1bmRlcnN0YW5kaW5nIHRoaXMgZmxhZy4gQ2xhbXBlZCwgYVxuICogZnV0dXJlIGRhdGUgbWVhbnMgd2hhdCBhbiBvcGVyYXRvciBzZXR0aW5nIGl0IGFsd2F5cyBtZWFudDogY2xlYXIgZXZlcnl0aGluZ1xuICogb3V0c3RhbmRpbmcsIHRoZW4gY2Fycnkgb24uXG4gKi9cbmZ1bmN0aW9uIGNsYW1wVG9QYXN0KGN1dG9mZk1zOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAoY3V0b2ZmTXMgPD0gbm93KSByZXR1cm4gY3V0b2ZmTXM7XG4gIGxvZ2dlci53YXJuKFxuICAgIGAke2NvbmZpZy5uYW1lKFwiQVVUSF9TRVNTSU9OX0NVVE9GRlwiLCBUVU5ORUxfQ09ORklHKX0gaXMgaW4gdGhlIGZ1dHVyZSAtIGNsYW1waW5nIHRvIG5vd2AsXG4gICAge1xuICAgICAgY29uZmlndXJlZDogbmV3IERhdGUoY3V0b2ZmTXMpLnRvSVNPU3RyaW5nKCksXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIG5vdztcbn1cblxuLyoqIFRoZSBjYWNoZSBrZXkgZm9yIG9uZSBjdXRvZmYsIHNvIG1vdmluZyB0aGUgY3V0b2ZmIG9ycGhhbnMgZXZlcnkgZWFybGllciBrZXkuICovXG5mdW5jdGlvbiBjYWNoZUtleShjdXRvZmZNczogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke0tFWV9QUkVGSVh9JHtjdXRvZmZNc31gO1xufVxuXG5mdW5jdGlvbiBkZWNvZGUoc3RvcmVkOiBTdG9yZWRLZXkpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHN0b3JlZC5zZWNyZXQsIFwiYmFzZTY0dXJsXCIpKTtcbn1cblxuLyoqXG4gKiBMb2FkIHRoZSBzaWduaW5nIGtleSBmb3IgYGN1dG9mZk1zYCBmcm9tIHRoZSBjYWNoZSwgbWludGluZyBhbmQgc3RvcmluZyBvbmVcbiAqIHdoZW4gYWJzZW50LiBTZWUgdGhlIG1vZHVsZSBkb2NzIGZvciB3aHkgdGhlIHdyaXRlIGlzIGZvbGxvd2VkIGJ5IGEgcmUtcmVhZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZEZyb21DYWNoZShjdXRvZmZNczogbnVtYmVyKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IGNhY2hlID0gQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpO1xuICBjb25zdCBrZXkgPSBjYWNoZUtleShjdXRvZmZNcyk7XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBjYWNoZS5nZXQ8U3RvcmVkS2V5PihrZXkpO1xuICBpZiAoZXhpc3Rpbmc/LnNlY3JldCkge1xuICAgIGxvZ2dlci5pbmZvKFwicmV1c2luZyBjYWNoZWQgc2lnbmluZyBrZXlcIiwgeyBjcmVhdGVkQXQ6IGV4aXN0aW5nLmNyZWF0ZWRBdCB9KTtcbiAgICByZXR1cm4gZGVjb2RlKGV4aXN0aW5nKTtcbiAgfVxuXG4gIGNvbnN0IG1pbnRlZDogU3RvcmVkS2V5ID0ge1xuICAgIHNlY3JldDogQnVmZmVyLmZyb20ocmFuZG9tQnl0ZXMoS0VZX0JZVEVTKSkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIiksXG4gICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gIH07XG4gIGF3YWl0IGNhY2hlLnNldChrZXksIG1pbnRlZCwgeyB0dGw6IEtFWV9UVExfU0VDT05EUyB9KTtcblxuICAvLyBSZS1yZWFkIHJhdGhlciB0aGFuIHRydXN0aW5nIGBtaW50ZWRgOiBhbm90aGVyIGluc3RhbmNlIHRoYXQgcmFjZWQgdGhpcyBib290XG4gIC8vIG1heSBoYXZlIHdyaXR0ZW4gZmlyc3QsIGFuZCBhZG9wdGluZyB3aGF0ZXZlciBpcyBzdG9yZWQgaXMgd2hhdCBtYWtlcyB0aGUgdHdvXG4gIC8vIGNvbnZlcmdlIG9uIG9uZSBrZXkuXG4gIGNvbnN0IHNldHRsZWQgPSAoYXdhaXQgY2FjaGUuZ2V0PFN0b3JlZEtleT4oa2V5KSkgPz8gbWludGVkO1xuICBsb2dnZXIuaW5mbyhcInN0b3JlZCBhIG5ldyBzaWduaW5nIGtleVwiLCB7XG4gICAgY3JlYXRlZEF0OiBzZXR0bGVkLmNyZWF0ZWRBdCxcbiAgICB0dGxTZWNvbmRzOiBLRVlfVFRMX1NFQ09ORFMsXG4gICAgYWRvcHRlZDogc2V0dGxlZC5jcmVhdGVkQXQgPT09IG1pbnRlZC5jcmVhdGVkQXQgPyBcIm93blwiIDogXCJjb25jdXJyZW50LWluc3RhbmNlXCIsXG4gIH0pO1xuICByZXR1cm4gZGVjb2RlKHNldHRsZWQpO1xufVxuXG4vKiogQSByZXNvbHZlZCBrZXkgcGx1cyB0aGUgY3V0b2ZmIGl0IGlzIHNjb3BlZCB0by4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmluZ0tleSB7XG4gIGtleTogVWludDhBcnJheTtcbiAgLyoqIEZvcmNlLWNsZWFyIGN1dG9mZiBpbiBtczsgYDBgIHdoZW4gdW5zZXQuIFRva2VucyBvbGRlciB0aGFuIHRoaXMgYXJlIHJlZnVzZWQuICovXG4gIGN1dG9mZk1zOiBudW1iZXI7XG59XG5cbmxldCBwZW5kaW5nOiBQcm9taXNlPFNpZ25pbmdLZXk+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBzaWduaW5nIGtleSBmb3IgdGhpcyBnYXRlLCByZXNvbHZlZCBvbmNlIHBlciBwcm9jZXNzLlxuICpcbiAqIFJlc29sdmVkIE9OQ0UsIHNvIGBjb25maWd1cmVkQ3V0b2ZmYCBpcyBob25vdXJlZCBvbmx5IG9uIHRoZSBmaXJzdCBjYWxsIC0gdGhlXG4gKiBwbHVnaW4ncyBgc2V0dXAoKWAgcGFzc2VzIGl0cyByZXNvbHZlZCB2YWx1ZSB0aGVyZSwgYmVmb3JlIGFueSByZXF1ZXN0IGNhblxuICogcmVhY2ggdGhlIGxhenkgcGF0aC5cbiAqXG4gKiBgVFVOTkVMX0FVVEhfSldUX1NFQ1JFVGAgd2hlbiBzZXQsIGVsc2UgdGhlIGNhY2hlLWJhY2tlZCBrZXkuIEEgY2FjaGUgdGhhdCBpc1xuICogdW5hdmFpbGFibGUgZGVncmFkZXMgdG8gYW4gZXBoZW1lcmFsIHBlci1wcm9jZXNzIGtleSAodGhlIHByZXZpb3VzIGJlaGF2aW91cilcbiAqIHJhdGhlciB0aGFuIHJlZnVzaW5nIHRvIHNpZ246IHRoZSBrZXkgb25seSB2YWxpZGF0ZXMgYW4gQUxSRUFEWS1pc3N1ZWQgc2Vzc2lvbixcbiAqIHNvIGxvc2luZyBpdCBjb3N0cyBzZXNzaW9ucywgbmV2ZXIgYWRtaXNzaW9uIC0gYSBjYWxsZXIgc3RpbGwgbmVlZHMgYSBjb2RlXG4gKiBkZWxpdmVyZWQgdG8gYW4gYWxsb3ctbGlzdGVkIGFkZHJlc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduaW5nS2V5KGNvbmZpZ3VyZWRDdXRvZmY/OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKTogUHJvbWlzZTxTaWduaW5nS2V5PiB7XG4gIHBlbmRpbmcgPz89IChhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY3V0b2ZmTXMgPSByZXNvbHZlU2Vzc2lvbkN1dG9mZihjb25maWd1cmVkQ3V0b2ZmKTtcbiAgICBjb25zdCBjb25maWd1cmVkID0gY29uZmlnLnRleHQoXCJBVVRIX0pXVF9TRUNSRVRcIiwgVFVOTkVMX0NPTkZJRyk7XG4gICAgaWYgKGNvbmZpZ3VyZWQpIHtcbiAgICAgIHJldHVybiB7IGtleTogbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGNvbmZpZ3VyZWQpLCBjdXRvZmZNcyB9O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsga2V5OiBhd2FpdCBsb2FkRnJvbUNhY2hlKGN1dG9mZk1zKSwgY3V0b2ZmTXMgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBubyAke2NvbmZpZy5uYW1lKFwiQVVUSF9KV1RfU0VDUkVUXCIsIFRVTk5FTF9DT05GSUcpfSBhbmQgdGhlIGNhY2hlIGlzIHVuYXZhaWxhYmxlIC0gdXNpbmcgYW4gZXBoZW1lcmFsIHBlci1wcm9jZXNzIGtleTsgc2Vzc2lvbnMgd2lsbCBub3Qgc3Vydml2ZSBhIHJlc3RhcnRgLFxuICAgICAgICB7IGVycm9yIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIHsga2V5OiBuZXcgVWludDhBcnJheShyYW5kb21CeXRlcyhLRVlfQllURVMpKSwgY3V0b2ZmTXMgfTtcbiAgICB9XG4gIH0pKCk7XG4gIHJldHVybiBwZW5kaW5nO1xufVxuXG4vKiogUmVzZXQgdGhlIHBlci1wcm9jZXNzIGtleSAodGVzdHMsIG9yIGFmdGVyIGNoYW5naW5nIHRoZSBlbnYgaW4tcHJvY2VzcykuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRTaWduaW5nS2V5KCk6IHZvaWQge1xuICBwZW5kaW5nID0gdW5kZWZpbmVkO1xufVxuIl19
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmluZy1rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2lnbmluZy1rZXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRWhEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFakQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxHQUFHLDBCQUEwQixDQUFDO0FBRTlDLDBEQUEwRDtBQUMxRCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFVckI7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsVUFBbUM7SUFDdEUsTUFBTSxHQUFHLEdBQ1AsVUFBVSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzFGLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFFOUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FB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Q0FBQztBQUU3Qzs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLGdCQUF5QztJQUNsRSxPQUFPLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN0QixNQUFNLFFBQVEsR0FBRyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDakUsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDakUsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDMUQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsSUFBSSxDQUNULE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxhQUFhLENBQUMseUdBQXlHLEVBQzVKLEVBQUUsS0FBSyxFQUFFLENBQ1YsQ0FBQztZQUNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDTCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxlQUFlO0lBQzdCLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGdhdGUncyBCZXR0ZXIgQXV0aCBzZWNyZXQsIHBlcnNpc3RlZCBpbiBBcHBLaXQncyBjYWNoZS5cbiAqXG4gKiBUaGUga2V5IGRlY2lkZXMgd2hldGhlciBhIHNlc3Npb24gQ09PS0lFIHN0aWxsIHZlcmlmaWVzLCBzbyBpdCBtdXN0IE9VVExJVkUgdGhlXG4gKiBwcm9jZXNzOiBhIHBlci1wcm9jZXNzIGByYW5kb21CeXRlcygzMilgIHdvdWxkIGludmFsaWRhdGUgZXZlcnkgb3V0c3RhbmRpbmcgY29va2llXG4gKiBvbiByZXN0YXJ0IGFuZCBtYWtlIGVhY2ggc2lnbmVkLWluIHVzZXIgcmVxdWVzdCBhIG5ldyBjb2RlIC0gcGFpbmZ1bCBmb3IgYSB0dW5uZWwsXG4gKiB3aGljaCByZXN0YXJ0cyB3aGVuZXZlciB0aGUgYXBwIGl0IHdyYXBzIGRvZXMuIFNvIHRoZSBrZXkgaXMgc3RvcmVkIGluIHRoZSBjYWNoZVxuICogQXBwS2l0IGFscmVhZHkgY29uZmlndXJlZCAobWVtb3J5LCBvciBMYWtlYmFzZSB3aGVuIHRoZSBob3N0IHdpcmVzIGEgcGVyc2lzdGVudFxuICogYENhY2hlU3RvcmFnZWApLCBhbmQgd2l0aCBwZXJzaXN0ZW50IHN0b3JhZ2UgYSByZXN0YXJ0IGtlZXBzIHNlc3Npb25zIGFsaXZlIGZvclxuICoge0BsaW5rIEtFWV9UVExfU0VDT05EU30uXG4gKlxuICogQW4gZXhwbGljaXRseSBjb25maWd1cmVkIGBUVU5ORUxfQVVUSF9KV1RfU0VDUkVUYCBzdGlsbCB3aW5zIG91dHJpZ2h0LiBUaGF0IGlzXG4gKiB0aGUgcmlnaHQgYW5zd2VyIGZvciBhIGZsZWV0OiBhbiBvcGVyYXRvci1oZWxkIHNlY3JldCBuZWVkcyBubyBzaGFyZWQgY2FjaGUgYW5kXG4gKiBubyBjb252ZXJnZW5jZSwgYW5kIGl0IHN1cnZpdmVzIGEgY2FjaGUgZmx1c2guXG4gKlxuICogIyMgZ2V0IC8gZ2VuZXJhdGUgLyBnZXRcbiAqXG4gKiBUd28gaW5zdGFuY2VzIGJvb3RpbmcgYXQgb25jZSBib3RoIG1pc3MsIHNvIGJvdGggd291bGQgZ2VuZXJhdGUgLSBhbmQgdGhlIGxvc2VyXG4gKiB3b3VsZCBzaWduIGNvb2tpZXMgd2l0aCBhIGtleSB0aGUgd2lubmVyIHJlamVjdHMuIFJlc29sdXRpb24gaXMgYSByZS1SRUFEIGFmdGVyXG4gKiB0aGUgd3JpdGU6IHdoYXRldmVyIHRoZSBjYWNoZSBob2xkcyBhZnRlcndhcmRzIGlzIHRoZSBrZXkgZXZlcnlvbmUgYWRvcHRzLCBzb1xuICogdGhlIGluc3RhbmNlcyBjb252ZXJnZSBvbiBPTkUgdmFsdWUgaW5zdGVhZCBvZiB0cnVzdGluZyB0aGUgb25lIHRoZXkgbWludGVkLlxuICogKGBzZXRgIGlzIG5vdCBjb25kaXRpb25hbCBpbiB0aGUgY2FjaGUgQVBJIC0gdGhlcmUgaXMgbm8gYHNldG54YCB0byBsZWFuIG9uIC1cbiAqIGFuZCB0aGlzIHJ1bnMgb25jZSBwZXIgcHJvY2Vzcywgc28gdGhlIGV4dHJhIHJvdW5kLXRyaXAgaXMgZnJlZS4pXG4gKlxuICogQSBwYXRob2xvZ2ljYWwgaW50ZXJsZWF2ZSBjYW4gc3RpbGwgY29zdCBhIGtleTogaWYgQSB3cml0ZXMgYmV0d2VlbiBCJ3Mgd3JpdGVcbiAqIGFuZCBCJ3MgcmUtcmVhZCwgQiBhZG9wdHMgQSdzIGtleSB3aGlsZSBBIGFkb3B0cyBpdHMgb3duLiBUaGUgY29zdCBpcyBib3VuZGVkIC1cbiAqIGEgY29va2llIG1pbnRlZCBpbiB0aGF0IHdpbmRvdyBmYWlscyB0byB2ZXJpZnkgYW5kIHRoZSBob2xkZXIgc2lnbnMgaW4gYWdhaW4gLVxuICogYW5kIGl0IGNhbm5vdCBwcm9kdWNlIGEga2V5IG9uZSBpbnN0YW5jZSBUUlVTVFMgYnV0IGFub3RoZXIgcmVqZWN0cyBmb3IgbG9uZ2VyXG4gKiB0aGFuIHRoZSB3aW5kb3cgaXRzZWxmLiBTZXQgYFRVTk5FTF9BVVRIX0pXVF9TRUNSRVRgIHRvIHJlbW92ZSB0aGUgcmFjZVxuICogZW50aXJlbHkuXG4gKlxuICogIyMgRm9yY2luZyBldmVyeSBzZXNzaW9uIHRvIGVuZFxuICpcbiAqIHtAbGluayByZXNvbHZlU2Vzc2lvbkN1dG9mZn0gcmVhZHMgYSBkYXRlIGZyb20gYFRVTk5FTF9BVVRIX1NFU1NJT05fQ1VUT0ZGYCAob3JcbiAqIGAtLXNlc3Npb24tY3V0b2ZmYCksIGFuZCB0aGF0IGRhdGUgaXMgcGFydCBvZiB0aGUgY2FjaGUgS0VZLiBNb3ZpbmcgaXQgZm9yd2FyZFxuICogbWFrZXMgZXZlcnkgcHJpb3Iga2V5IHVucmVhY2hhYmxlLCBzbyBldmVyeSBjb29raWUgc2lnbmVkIGFnYWluc3QgaXQgc3RvcHNcbiAqIHZlcmlmeWluZyAtIHRoZSBsb2ctZXZlcnlvbmUtb3V0IHN3aXRjaCwgd2l0aG91dCBoYXZpbmcgdG8gZmluZCBhbmQgZmx1c2ggYVxuICogY2FjaGUgZW50cnkuIFRoZSBjdXRvZmYgaXMgYWxzbyBhc3NlcnRlZCBhZ2FpbnN0IGVhY2ggdG9rZW4ncyBgaWF0YCwgc28gYVxuICogY29va2llIHRoYXQgcHJlZGF0ZXMgaXQgaXMgcmVmdXNlZCBldmVuIGlmIGl0IHdhcyBzaWduZWQgd2l0aCB0aGUga2V5IHRoYXQgaXNcbiAqIHNvbWVob3cgc3RpbGwgY3VycmVudC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IENhY2hlTWFuYWdlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGxvZywgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IFRVTk5FTF9DT05GSUcgfSBmcm9tIFwiLi9fY29uZmlnLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWw6c2lnbmluZy1rZXlcIik7XG5cbi8qKlxuICogSG93IGxvbmcgYSBjYWNoZWQgc2lnbmluZyBrZXkgbGl2ZXM6IDMwIGRheXMuXG4gKlxuICogVGhpcyBpcyB0aGUgY2VpbGluZyBvbiBob3cgbG9uZyBhIHNlc3Npb24gY29va2llIGNhbiBzdGF5IHZhbGlkIGFjcm9zc1xuICogcmVzdGFydHMsIHNvIGl0IGlzIGRlbGliZXJhdGVseSA+PSB0aGUgZGVmYXVsdCBzZXNzaW9uIFRUTCAtIGEga2V5IHRoYXQgZXhwaXJlZFxuICogYmVmb3JlIHRoZSBjb29raWVzIGl0IHNpZ25lZCB3b3VsZCBsb2cgZXZlcnlvbmUgb3V0IGZvciBubyByZWFzb24uXG4gKi9cbmV4cG9ydCBjb25zdCBLRVlfVFRMX1NFQ09ORFMgPSAzMCAqIDI0ICogNjAgKiA2MDtcblxuLyoqIENhY2hlLWtleSBwcmVmaXggZm9yIHRoZSBzaWduaW5nIGtleSwgbmFtZXNwYWNlZCBhd2F5IGZyb20gb3RoZXIgY2FjaGUgdXNlLiAqL1xuY29uc3QgS0VZX1BSRUZJWCA9IFwidHVubmVsOmF1dGg6c2lnbmluZy1rZXk6XCI7XG5cbi8qKiBCeXRlcyBvZiBlbnRyb3B5IGluIGEgZ2VuZXJhdGVkIEJldHRlciBBdXRoIHNlY3JldC4gKi9cbmNvbnN0IEtFWV9CWVRFUyA9IDMyO1xuXG4vKiogV2hhdCB0aGUgY2FjaGUgc3RvcmVzOiB0aGUga2V5IHBsdXMgd2hlbiBpdCB3YXMgbWludGVkLCBmb3Igb2JzZXJ2YWJpbGl0eS4gKi9cbmludGVyZmFjZSBTdG9yZWRLZXkge1xuICAvKiogQmFzZTY0dXJsIG9mIHRoZSByYXcga2V5IGJ5dGVzLiAqL1xuICBzZWNyZXQ6IHN0cmluZztcbiAgLyoqIFdoZW4gdGhpcyBrZXkgd2FzIGdlbmVyYXRlZCwgSVNPLTg2MDEuICovXG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGZvcmNlLWNsZWFyIGN1dG9mZiBhcyBlcG9jaCBNSUxMSVNFQ09ORFMsIG9yIGAwYCB3aGVuIHVuc2V0LlxuICpcbiAqIEFjY2VwdHMgd2hhdGV2ZXIgYG9iamVjdC50b0RhdGVgIGFjY2VwdHMgLSBhIGBEYXRlYCwgYDIwMjYtMDgtMDJgLCBhbiBJU09cbiAqIGluc3RhbnQsIGVwb2NoIHNlY29uZHMgb3IgbWlsbGlzIGZyb20gYGRhdGUgKyVzYCwgb3IgYSByZWxhdGl2ZSBkdXJhdGlvblxuICogKGAtMzBkYCwgYDcgZGF5cyBhZ29gKSwgd2hpY2ggaXMgdGhlIHNwZWxsaW5nIGFuIG9wZXJhdG9yIHJlYWNoaW5nIGZvciB0aGlzXG4gKiB1c3VhbGx5IHdhbnRzOiBzaWduIG91dCBldmVyeW9uZSB3aG8gc2lnbmVkIGluIG1vcmUgdGhhbiBhIG1vbnRoIGFnby5cbiAqXG4gKiBBbiBVTlBBUlNFQUJMRSB2YWx1ZSBpcyBpZ25vcmVkIHdpdGggYSB3YXJuaW5nIHJhdGhlciB0aGFuIHRocm93aW5nOiB0aGlzIGlzXG4gKiB0aGUgc3dpdGNoIHRoYXQgbG9ncyBhIGZsZWV0IGJhY2sgaW4sIGFuZCBmYWlsaW5nIHRvIGJvb3Qgb3ZlciBhIHR5cG8gaXMgd29yc2VcbiAqIHRoYW4gbm90IHJvdGF0aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNlc3Npb25DdXRvZmYoY29uZmlndXJlZD86IHN0cmluZyB8IG51bWJlciB8IERhdGUpOiBudW1iZXIge1xuICBjb25zdCByYXcgPVxuICAgIGNvbmZpZ3VyZWQgPz8gY29uZmlnLnRleHQoW1wiQVVUSF9TRVNTSU9OX0NVVE9GRlwiLCBcIkFVVEhfU0VTU0lPTl9FUE9DSFwiXSwgVFVOTkVMX0NPTkZJRyk7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09IG51bGwgfHwgcmF3ID09PSBcIlwiKSByZXR1cm4gMDtcblxuICBjb25zdCBkYXRlID0gb2JqZWN0LnRvRGF0ZShyYXcpO1xuICBpZiAoIWRhdGUpIHtcbiAgICBsb2dnZXIud2FybihgaWdub3JpbmcgdW5wYXJzZWFibGUgJHtjb25maWcubmFtZShcIkFVVEhfU0VTU0lPTl9DVVRPRkZcIiwgVFVOTkVMX0NPTkZJRyl9YCwge1xuICAgICAgdmFsdWU6IFN0cmluZyhyYXcpLFxuICAgIH0pO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBjbGFtcFRvUGFzdChkYXRlLmdldFRpbWUoKSk7XG59XG5cbi8qKlxuICogSG9sZCB0aGUgY3V0b2ZmIGF0IFwibm93XCIsIGJlY2F1c2UgYSBGVVRVUkUgY3V0b2ZmIHdvdWxkIHJlZnVzZSB0aGUgc2Vzc2lvbnMgaXRcbiAqIGlzIGFib3V0IHRvIG1pbnQgYXMgd2VsbCBhcyB0aGUgb2xkIG9uZXMgLSBhbiBhcHAgbm9ib2R5IGNhbiBzaWduIGluIHRvLCBmcm9tIGFcbiAqIG1pc3R5cGVkIHllYXIsIHdpdGggdGhlIGZpeCBoaWRkZW4gYmVoaW5kIHVuZGVyc3RhbmRpbmcgdGhpcyBmbGFnLiBDbGFtcGVkLCBhXG4gKiBmdXR1cmUgZGF0ZSBtZWFucyB3aGF0IGFuIG9wZXJhdG9yIHNldHRpbmcgaXQgYWx3YXlzIG1lYW50OiBjbGVhciBldmVyeXRoaW5nXG4gKiBvdXRzdGFuZGluZywgdGhlbiBjYXJyeSBvbi5cbiAqL1xuZnVuY3Rpb24gY2xhbXBUb1Bhc3QoY3V0b2ZmTXM6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGlmIChjdXRvZmZNcyA8PSBub3cpIHJldHVybiBjdXRvZmZNcztcbiAgbG9nZ2VyLndhcm4oXG4gICAgYCR7Y29uZmlnLm5hbWUoXCJBVVRIX1NFU1NJT05fQ1VUT0ZGXCIsIFRVTk5FTF9DT05GSUcpfSBpcyBpbiB0aGUgZnV0dXJlIC0gY2xhbXBpbmcgdG8gbm93YCxcbiAgICB7XG4gICAgICBjb25maWd1cmVkOiBuZXcgRGF0ZShjdXRvZmZNcykudG9JU09TdHJpbmcoKSxcbiAgICB9LFxuICApO1xuICByZXR1cm4gbm93O1xufVxuXG4vKiogVGhlIGNhY2hlIGtleSBmb3Igb25lIGN1dG9mZiwgc28gbW92aW5nIHRoZSBjdXRvZmYgb3JwaGFucyBldmVyeSBlYXJsaWVyIGtleS4gKi9cbmZ1bmN0aW9uIGNhY2hlS2V5KGN1dG9mZk1zOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7S0VZX1BSRUZJWH0ke2N1dG9mZk1zfWA7XG59XG5cbmZ1bmN0aW9uIGRlY29kZShzdG9yZWQ6IFN0b3JlZEtleSk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oc3RvcmVkLnNlY3JldCwgXCJiYXNlNjR1cmxcIikpO1xufVxuXG4vKipcbiAqIExvYWQgdGhlIHNpZ25pbmcga2V5IGZvciBgY3V0b2ZmTXNgIGZyb20gdGhlIGNhY2hlLCBtaW50aW5nIGFuZCBzdG9yaW5nIG9uZVxuICogd2hlbiBhYnNlbnQuIFNlZSB0aGUgbW9kdWxlIGRvY3MgZm9yIHdoeSB0aGUgd3JpdGUgaXMgZm9sbG93ZWQgYnkgYSByZS1yZWFkLlxuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkRnJvbUNhY2hlKGN1dG9mZk1zOiBudW1iZXIpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgY2FjaGUgPSBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCk7XG4gIGNvbnN0IGtleSA9IGNhY2hlS2V5KGN1dG9mZk1zKTtcblxuICBjb25zdCBleGlzdGluZyA9IGF3YWl0IGNhY2hlLmdldDxTdG9yZWRLZXk+KGtleSk7XG4gIGlmIChleGlzdGluZz8uc2VjcmV0KSB7XG4gICAgbG9nZ2VyLmluZm8oXCJyZXVzaW5nIGNhY2hlZCBzaWduaW5nIGtleVwiLCB7IGNyZWF0ZWRBdDogZXhpc3RpbmcuY3JlYXRlZEF0IH0pO1xuICAgIHJldHVybiBkZWNvZGUoZXhpc3RpbmcpO1xuICB9XG5cbiAgY29uc3QgbWludGVkOiBTdG9yZWRLZXkgPSB7XG4gICAgc2VjcmV0OiBCdWZmZXIuZnJvbShyYW5kb21CeXRlcyhLRVlfQllURVMpKS50b1N0cmluZyhcImJhc2U2NHVybFwiKSxcbiAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgfTtcbiAgYXdhaXQgY2FjaGUuc2V0KGtleSwgbWludGVkLCB7IHR0bDogS0VZX1RUTF9TRUNPTkRTIH0pO1xuXG4gIC8vIFJlLXJlYWQgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYG1pbnRlZGA6IGFub3RoZXIgaW5zdGFuY2UgdGhhdCByYWNlZCB0aGlzIGJvb3RcbiAgLy8gbWF5IGhhdmUgd3JpdHRlbiBmaXJzdCwgYW5kIGFkb3B0aW5nIHdoYXRldmVyIGlzIHN0b3JlZCBpcyB3aGF0IG1ha2VzIHRoZSB0d29cbiAgLy8gY29udmVyZ2Ugb24gb25lIGtleS5cbiAgY29uc3Qgc2V0dGxlZCA9IChhd2FpdCBjYWNoZS5nZXQ8U3RvcmVkS2V5PihrZXkpKSA/PyBtaW50ZWQ7XG4gIGxvZ2dlci5pbmZvKFwic3RvcmVkIGEgbmV3IHNpZ25pbmcga2V5XCIsIHtcbiAgICBjcmVhdGVkQXQ6IHNldHRsZWQuY3JlYXRlZEF0LFxuICAgIHR0bFNlY29uZHM6IEtFWV9UVExfU0VDT05EUyxcbiAgICBhZG9wdGVkOiBzZXR0bGVkLmNyZWF0ZWRBdCA9PT0gbWludGVkLmNyZWF0ZWRBdCA/IFwib3duXCIgOiBcImNvbmN1cnJlbnQtaW5zdGFuY2VcIixcbiAgfSk7XG4gIHJldHVybiBkZWNvZGUoc2V0dGxlZCk7XG59XG5cbi8qKiBBIHJlc29sdmVkIGtleSBwbHVzIHRoZSBjdXRvZmYgaXQgaXMgc2NvcGVkIHRvLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduaW5nS2V5IHtcbiAga2V5OiBVaW50OEFycmF5O1xuICAvKiogRm9yY2UtY2xlYXIgY3V0b2ZmIGluIG1zOyBgMGAgd2hlbiB1bnNldC4gVG9rZW5zIG9sZGVyIHRoYW4gdGhpcyBhcmUgcmVmdXNlZC4gKi9cbiAgY3V0b2ZmTXM6IG51bWJlcjtcbn1cblxubGV0IHBlbmRpbmc6IFByb21pc2U8U2lnbmluZ0tleT4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIHNpZ25pbmcga2V5IGZvciB0aGlzIGdhdGUsIHJlc29sdmVkIG9uY2UgcGVyIHByb2Nlc3MuXG4gKlxuICogUmVzb2x2ZWQgT05DRSwgc28gYGNvbmZpZ3VyZWRDdXRvZmZgIGlzIGhvbm91cmVkIG9ubHkgb24gdGhlIGZpcnN0IGNhbGwgLSB0aGVcbiAqIHBsdWdpbidzIGBzZXR1cCgpYCBwYXNzZXMgaXRzIHJlc29sdmVkIHZhbHVlIHRoZXJlLCBiZWZvcmUgYW55IHJlcXVlc3QgY2FuXG4gKiByZWFjaCB0aGUgbGF6eSBwYXRoLlxuICpcbiAqIGBUVU5ORUxfQVVUSF9KV1RfU0VDUkVUYCB3aGVuIHNldCwgZWxzZSB0aGUgY2FjaGUtYmFja2VkIHNlY3JldC4gQSBjYWNoZSB0aGF0IGlzXG4gKiB1bmF2YWlsYWJsZSBkZWdyYWRlcyB0byBhbiBlcGhlbWVyYWwgcGVyLXByb2Nlc3Mga2V5ICh0aGUgcHJldmlvdXMgYmVoYXZpb3VyKVxuICogcmF0aGVyIHRoYW4gcmVmdXNpbmcgdG8gc2lnbjogdGhlIGtleSBvbmx5IHZhbGlkYXRlcyBhbiBBTFJFQURZLWlzc3VlZCBzZXNzaW9uLFxuICogc28gbG9zaW5nIGl0IGNvc3RzIHNlc3Npb25zLCBuZXZlciBhZG1pc3Npb24gLSBhIGNhbGxlciBzdGlsbCBuZWVkcyBhIGNvZGVcbiAqIGRlbGl2ZXJlZCB0byBhbiBhbGxvdy1saXN0ZWQgYWRkcmVzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25pbmdLZXkoY29uZmlndXJlZEN1dG9mZj86IHN0cmluZyB8IG51bWJlciB8IERhdGUpOiBQcm9taXNlPFNpZ25pbmdLZXk+IHtcbiAgcGVuZGluZyA/Pz0gKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjdXRvZmZNcyA9IHJlc29sdmVTZXNzaW9uQ3V0b2ZmKGNvbmZpZ3VyZWRDdXRvZmYpO1xuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSBjb25maWcudGV4dChcIkFVVEhfSldUX1NFQ1JFVFwiLCBUVU5ORUxfQ09ORklHKTtcbiAgICBpZiAoY29uZmlndXJlZCkge1xuICAgICAgcmV0dXJuIHsga2V5OiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoY29uZmlndXJlZCksIGN1dG9mZk1zIH07XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyBrZXk6IGF3YWl0IGxvYWRGcm9tQ2FjaGUoY3V0b2ZmTXMpLCBjdXRvZmZNcyB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYG5vICR7Y29uZmlnLm5hbWUoXCJBVVRIX0pXVF9TRUNSRVRcIiwgVFVOTkVMX0NPTkZJRyl9IGFuZCB0aGUgY2FjaGUgaXMgdW5hdmFpbGFibGUgLSB1c2luZyBhbiBlcGhlbWVyYWwgcGVyLXByb2Nlc3Mga2V5OyBzZXNzaW9ucyB3aWxsIG5vdCBzdXJ2aXZlIGEgcmVzdGFydGAsXG4gICAgICAgIHsgZXJyb3IgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyBrZXk6IG5ldyBVaW50OEFycmF5KHJhbmRvbUJ5dGVzKEtFWV9CWVRFUykpLCBjdXRvZmZNcyB9O1xuICAgIH1cbiAgfSkoKTtcbiAgcmV0dXJuIHBlbmRpbmc7XG59XG5cbi8qKiBSZXNldCB0aGUgcGVyLXByb2Nlc3Mga2V5ICh0ZXN0cywgb3IgYWZ0ZXIgY2hhbmdpbmcgdGhlIGVudiBpbi1wcm9jZXNzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldFNpZ25pbmdLZXkoKTogdm9pZCB7XG4gIHBlbmRpbmcgPSB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"root":["../src/_config.ts","../src/allowlist.ts","../src/code-email.ts","../src/gate.ts","../src/headers.ts","../src/interceptor.ts","../src/otp.ts","../src/plugin.ts","../src/portr.ts","../src/rate-limit.ts","../src/send-code.ts","../src/signing-key.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/_config.ts","../src/allowlist.ts","../src/code-email.ts","../src/gate.ts","../src/headers.ts","../src/interceptor.ts","../src/plugin.ts","../src/portr.ts","../src/send-code.ts","../src/signing-key.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -18,21 +18,21 @@
18
18
  "projen": "projen"
19
19
  },
20
20
  "devDependencies": {
21
- "@dbx-tools/email": "0.6.89",
21
+ "@dbx-tools/email": "0.6.91",
22
22
  "@types/bun": "^1.3.14",
23
23
  "@types/node": "^24.6.0",
24
24
  "typescript": "^5.9.3"
25
25
  },
26
26
  "peerDependencies": {
27
- "@dbx-tools/email": "0.6.89"
27
+ "@dbx-tools/email": "0.6.91"
28
28
  },
29
29
  "dependencies": {
30
30
  "@databricks/appkit": "^0.43.0",
31
- "@dbx-tools/appkit": "0.6.89",
32
- "@dbx-tools/core": "0.6.89",
33
- "@dbx-tools/shared-core": "0.6.89",
34
- "@dbx-tools/shared-email": "0.6.89",
35
- "jose": "^6.2.3"
31
+ "@dbx-tools/appkit": "0.6.91",
32
+ "@dbx-tools/auth": "0.6.91",
33
+ "@dbx-tools/core": "0.6.91",
34
+ "@dbx-tools/shared-auth": "0.6.91",
35
+ "@dbx-tools/shared-core": "0.6.91"
36
36
  },
37
37
  "main": "./lib/index.js",
38
38
  "license": "UNLICENSED",
@@ -48,7 +48,7 @@
48
48
  "./package.json": "./package.json"
49
49
  }
50
50
  },
51
- "version": "0.6.89",
51
+ "version": "0.6.91",
52
52
  "types": "./lib/index.d.ts",
53
53
  "type": "module",
54
54
  "exports": {
package/src/allowlist.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Unified access allow-list matching for the email-OTP gate.
2
+ * Unified identity authorization matching for the passwordless gate.
3
3
  *
4
4
  * Each pattern in the configured list is one of three shapes:
5
5
  *