@dbx-tools/tunnel 0.6.108 → 0.6.112

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/gate.d.ts CHANGED
@@ -54,6 +54,8 @@ export interface GateOptions {
54
54
  * here so they are gated too. Login routes (`AUTH_PREFIX`) are always open.
55
55
  */
56
56
  gatePaths?: readonly string[];
57
+ /** Product name displayed by the hosted login page. */
58
+ brandName?: string;
57
59
  }
58
60
  /**
59
61
  * True when the request's `Host` is one of the tunnel's public domains - i.e. it
package/lib/src/gate.js CHANGED
@@ -23,6 +23,7 @@
23
23
  */
24
24
  import { log, token } from "@dbx-tools/shared-core";
25
25
  import { toHeaderPolicy } from "./headers.js";
26
+ import { loginPageHtml } from "./login-page.js";
26
27
  const logger = log.logger("tunnel:gate");
27
28
  export const AUTH_PREFIX = "/api/email/auth";
28
29
  /**
@@ -226,7 +227,7 @@ export function wantsLoginPage(req) {
226
227
  * not under the plugin's `/api/authGate` base.
227
228
  */
228
229
  export function mountGate(opts, _addRoute, addMiddleware) {
229
- const { gate, publicDomain, forwardHeaders, gatePaths } = opts;
230
+ const { gate, publicDomain, forwardHeaders, gatePaths, brandName } = opts;
230
231
  const headerPolicy = toHeaderPolicy(forwardHeaders);
231
232
  logger.debug("gate mounted", { publicDomain, forward: headerPolicy.patterns, gatePaths });
232
233
  // Better Auth and the compatibility routes share one fetch-compatible
@@ -248,11 +249,14 @@ export function mountGate(opts, _addRoute, addMiddleware) {
248
249
  // --- The gate middleware (runs before static + the app's /api handlers) ---
249
250
  const gateMiddleware = (async (req, res, next) => {
250
251
  const action = await gateRequest(req, { gate, publicDomain, headerPolicy, gatePaths });
251
- if (action === "deny")
252
+ if (action === "deny" && wantsLoginPage(req)) {
253
+ res.status(401).type("html").send(loginPageHtml({ brandName: brandName ?? "Databricks App" }));
254
+ }
255
+ else if (action === "deny")
252
256
  res.status(401).json(UNAUTHORIZED_BODY);
253
257
  else
254
258
  next();
255
259
  });
256
260
  addMiddleware("/", gateMiddleware);
257
261
  }
258
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBR0gsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsY0FBYyxFQUFxQixNQUFNLGNBQWMsQ0FBQztBQUdqRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBT3pDLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQztBQTRCN0M7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQzFCLEdBQW9CLEVBQ3BCLFlBQW9EO0lBRXBELElBQUksQ0FBQyxZQUFZO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDakYsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsR0FBb0I7SUFDM0MsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7U0FDL0UsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNWLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzVCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQixPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsSUFBSSxTQUFTLENBQUM7QUFDL0QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEdBQW9CO0lBQzlDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQy9CLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTztJQUNqQixNQUFNLElBQUksR0FBRyxHQUFHO1NBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNWLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3BCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFDL0YsSUFBSSxJQUFJLENBQUMsTUFBTTtRQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O1FBQ2pELE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxHQUFvQixFQUFFLEtBQWE7SUFDekQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9DLENBQUM7QUFFRDs0RUFDNEU7QUFDNUUsU0FBUyxRQUFRLENBQUMsR0FBb0I7SUFDcEMsNEVBQTRFO0lBQzVFLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNoRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsR0FBb0I7SUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUM5QixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN4RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsQ0FBQzthQUFNLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDeEMsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsVUFBVSxDQUFDLEdBQW9CO0lBQ25ELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQztJQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ25ELE1BQU0sUUFBUSxHQUFHLFFBQVEsS0FBSyxXQUFXLElBQUksUUFBUSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDekYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25ELE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxLQUFLLElBQUksTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRixPQUFPLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDbEYsTUFBTTtRQUNOLE9BQU8sRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQ3hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUMxQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsR0FBYSxFQUFFLFFBQTZCO0lBQ2hGLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDdkQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssWUFBWTtZQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2hELElBQUksT0FBTyxDQUFDLE1BQU07UUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDdkQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFjRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUMvQixHQUFvQixFQUNwQixPQUFzRDtJQUV0RCxNQUFNLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUN2QywyRUFBMkU7SUFDM0UsNERBQTREO0lBQzVELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBRXBELE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO0lBQ25ELDJFQUEyRTtJQUMzRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFFaEQsbUVBQW1FO0lBQ25FLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxZQUFZLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5RSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFrQyxDQUFDLENBQUM7SUFDckUsSUFBSSxPQUFPLENBQUMsTUFBTTtRQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRTFFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO0lBQzFDLDZFQUE2RTtJQUM3RSw4QkFBOEI7SUFDOUIsTUFBTSxLQUFLLEdBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDeEIsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRS9FLDhFQUE4RTtJQUM5RSx1RUFBdUU7SUFDdkUsNEVBQTRFO0lBQzVFLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UscUNBQXFDO0lBQ3JDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sUUFBUSxHQUFHLEtBQUssSUFBSSxDQUFDLFNBQVMsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQscURBQXFEO0lBQ3JELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzFCLGNBQWMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDM0Isa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEIsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixLQUFLLEVBQUUseUJBQXlCO0lBQ2hDLFNBQVMsRUFBRSxXQUFXO0NBQ2QsQ0FBQztBQUVYOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQW9CO0lBQ2pELE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuRCxJQUFJLE1BQU0sS0FBSyxLQUFLLElBQUksTUFBTSxLQUFLLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN4RCxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUNuRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDL0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUN2QixJQUFpQixFQUNqQixTQUFrRixFQUNsRixhQUE4RDtJQUU5RCxNQUFNLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQy9ELE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNwRCxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBRTFGLHNFQUFzRTtJQUN0RSxpQ0FBaUM7SUFDakMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUM7WUFDbkQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLENBQUM7aUJBQU0sQ0FBQztnQkFDTixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sZUFBZSxDQUFDLEdBQUcsRUFBRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUMsQ0FBbUIsQ0FBQztJQUNyQixhQUFhLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXhDLDZFQUE2RTtJQUU3RSxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQy9DLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdkYsSUFBSSxNQUFNLEtBQUssTUFBTTtZQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7O1lBQzFELElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQyxDQUFtQixDQUFDO0lBRXJCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIHR1bm5lbCdzIGluLWFwcCBBVVRIIEdBVEUgLSBFeHByZXNzIG1pZGRsZXdhcmUgKyBsb2dpbiByb3V0ZXMgdGhlXG4gKiB7QGxpbmsgQXV0aEdhdGVQbHVnaW59IHJlZ2lzdGVycyBvbiB0aGUgYXBwJ3MgT1dOIHNlcnZlciB2aWEgYHRoaXMuY29udGV4dGAuXG4gKlxuICogVGhlIGdhdGUgaXMgTUlERExFV0FSRSwgbm90IGEgcmV2ZXJzZSBwcm94eSAtIHRoZSBhcHAgaXMgdGhlIHByb2Nlc3MsIHNvIHRoZXJlIGlzXG4gKiBub3RoaW5nIHRvIGZvcndhcmQgdG8uIEl0IGVpdGhlciBzaG9ydC1jaXJjdWl0cyAoNDAxLCBvciBhbnN3ZXJzIHRoZSBvcGVuIGxvZ2luXG4gKiByb3V0ZXMpIG9yIGNhbGxzIGBuZXh0KClgIHRvIGxldCB0aGUgYXBwJ3MgcmVhbCBoYW5kbGVycyBydW4uIEl0IGlzIHRoZVxuICogXCJzdGFuZHMgaW4gZm9yIEFwcEtpdCBhdXRoXCIgcGF0aDpcbiAqIGEgcG9ydHIgY2FsbGVyIGF1dGhlbnRpY2F0ZXMgd2l0aCBCZXR0ZXIgQXV0aCBPVFAgb3IgYSBwYXNza2V5LCBhbmQgb25cbiAqIHN1Y2Nlc3MgdGhlIGdhdGUgaW5qZWN0cyB0aGUgaWRlbnRpdHkgaGVhZGVycyBBcHBLaXQgcmVhZHMuXG4gKlxuICogV0hJQ0ggVFJBRkZJQyBJUyBHQVRFRCAtIHRoZSBgSG9zdGAgaGVhZGVyLCBub3QgdGhlIHNvY2tldC4gcG9ydHIncyBjbGllbnRcbiAqIGZvcndhcmRzIHdpdGggR28ncyBgaHR0cHV0aWwuTmV3U2luZ2xlSG9zdFJldmVyc2VQcm94eWAgYW5kIGEgYERpcmVjdG9yYCB0aGF0XG4gKiBQUkVTRVJWRVMgdGhlIG9yaWdpbmFsIGBIb3N0YCwgc28gdHVubmVsIHJlcXVlc3RzIGFycml2ZSB3aXRoXG4gKiBgSG9zdDogPHN1YmRvbWFpbj4uPHNlcnZlcj5gICh0aGUgcHVibGljIGRvbWFpbikuIEEgbG9jYWwgcHJvY2VzcyBoaXR0aW5nIHRoZVxuICogYXBwIGRpcmVjdGx5IHNlbmRzIGBIb3N0OiAxMjcuMC4wLjE6PHBvcnQ+YCAvIGBsb2NhbGhvc3RgLiBTbyBPTkxZIHJlcXVlc3RzIHdob3NlXG4gKiBgSG9zdGAgbWF0Y2hlcyB0aGUgY29uZmlndXJlZCBwdWJsaWMgZG9tYWluIGFyZSBnYXRlZDsgdGhlIHBsYXRmb3JtIGZyb250IGRvb3JcbiAqIGFuZCBhbnkgb3RoZXIgbG9jYWwgY2xpZW50IHBhc3MgdGhyb3VnaCB1bnRvdWNoZWQuIFRoZXJlIGlzIG5vIHBvcnRyLWluamVjdGVkXG4gKiBpZGVudGlmeWluZyBoZWFkZXIgYW5kIG5vIFRDUC9zb3VyY2UtSVAgc2lnbmFsIHRvIHVzZSBpbnN0ZWFkICh0aGUgY2xpZW50IGRpYWxzXG4gKiB0aGUgdGFyZ2V0IG92ZXIgcGxhaW4gbG9vcGJhY2spLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEluY29taW5nTWVzc2FnZSB9IGZyb20gXCJub2RlOmh0dHBcIjtcbmltcG9ydCB7IGxvZywgdG9rZW4gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SGFuZGxlciwgUmVzcG9uc2UgfSBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHsgdG9IZWFkZXJQb2xpY3ksIHR5cGUgSGVhZGVyUG9saWN5IH0gZnJvbSBcIi4vaGVhZGVycy50c1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoR2F0ZUFwaSB9IGZyb20gXCIuL3BsdWdpbi50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwidHVubmVsOmdhdGVcIik7XG5cbnR5cGUgV2ViUmVxdWVzdElucHV0ID0gSW5jb21pbmdNZXNzYWdlICYge1xuICBib2R5PzogdW5rbm93bjtcbiAgb3JpZ2luYWxVcmw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgQVVUSF9QUkVGSVggPSBcIi9hcGkvZW1haWwvYXV0aFwiO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIG1vdW50R2F0ZX0uICovXG5leHBvcnQgaW50ZXJmYWNlIEdhdGVPcHRpb25zIHtcbiAgLyoqIFRoZSBpbi1wcm9jZXNzIGdhdGUgQVBJIChzZXNzaW9uL3JlcXVlc3QvdmVyaWZ5L3N0YXR1cykuICovXG4gIGdhdGU6IEF1dGhHYXRlQXBpO1xuICAvKipcbiAgICogVGhlIHB1YmxpYyBgPHN1YmRvbWFpbj4uPHNlcnZlcj5gIHRoYXQgaWRlbnRpZmllcyBwb3J0ciB0cmFmZmljIGJ5IGBIb3N0YC5cbiAgICogV2hlbiBhYnNlbnQsIG5vIHJlcXVlc3QgaXMgZXZlciBjbGFzc2lmaWVkIGFzIHR1bm5lbCB0cmFmZmljIGFuZCB0aGUgZ2F0ZSBpc1xuICAgKiBpbmVydCAoZXZlcnl0aGluZyBwYXNzZXMgdGhyb3VnaCkgLSBhIHR1bm5lbCB3aXRoIG5vIHB1YmxpYyBkb21haW4gZ2F0ZXNcbiAgICogbm90aGluZy5cbiAgICovXG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogRXh0cmEgYHgtYCByZXF1ZXN0IGhlYWRlcnMgdHVubmVsIHRyYWZmaWMgbWF5IGZvcndhcmQgKHVuaW9uZWQgd2l0aCB0aGVcbiAgICogYnVpbHQtaW4gYWxsb3ctbGlzdCkuIEV2ZXJ5IG90aGVyIGB4LWAgaGVhZGVyIGlzIHN0cmlwcGVkIGZyb20gdHVubmVsIHRyYWZmaWMuXG4gICAqL1xuICBmb3J3YXJkSGVhZGVycz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogUGF0aCBwcmVmaXhlcyB0aGF0IHJlcXVpcmUgYSB2YWxpZCBzZXNzaW9uLCBiZXlvbmQgdGhlIGJ1aWx0LWluIGAvYXBpL2AuXG4gICAqIFRoZSBkZWZhdWx0IGdhdGluZyBtb2RlbCBhc3N1bWVzIGEgc2VsZi1wcm90ZWN0aW5nIFNQQTogc3RhdGljIGxvYWRzIGZyZWVseVxuICAgKiBzbyB0aGUgYXBwIGNhbiByZW5kZXIsIGFuZCBvbmx5IGAvYXBpLypgIGlzIGdhdGVkLiBBbiBhcHAgd2hvc2UgcHJpdmlsZWdlZFxuICAgKiBzdXJmYWNlIGlzIE5PVCB1bmRlciBgL2FwaS9gIChlLmcuIGEgV2ViU29ja2V0IGF0IGAvd3NgKSBsaXN0cyB0aG9zZSBwcmVmaXhlc1xuICAgKiBoZXJlIHNvIHRoZXkgYXJlIGdhdGVkIHRvby4gTG9naW4gcm91dGVzIChgQVVUSF9QUkVGSVhgKSBhcmUgYWx3YXlzIG9wZW4uXG4gICAqL1xuICBnYXRlUGF0aHM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUcnVlIHdoZW4gdGhlIHJlcXVlc3QncyBgSG9zdGAgaXMgb25lIG9mIHRoZSB0dW5uZWwncyBwdWJsaWMgZG9tYWlucyAtIGkuZS4gaXRcbiAqIGNhbWUgaW4gb3ZlciBQb3J0ciBvciBGUlAuIENhc2UtaW5zZW5zaXRpdmU7IHRoZSBvcHRpb25hbCBgOnBvcnRgIGlzIGlnbm9yZWQuXG4gKiBXaGVuIG5vIHB1YmxpYyBkb21haW4gaXMgY29uZmlndXJlZCwgbm90aGluZyBpcyB0dW5uZWwgdHJhZmZpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHVubmVsSG9zdChcbiAgcmVxOiBJbmNvbWluZ01lc3NhZ2UsXG4gIHB1YmxpY0RvbWFpbjogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgaWYgKCFwdWJsaWNEb21haW4pIHJldHVybiBmYWxzZTtcbiAgY29uc3QgaG9zdCA9IChyZXEuaGVhZGVycy5ob3N0ID8/IFwiXCIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCI6XCIpWzBdO1xuICBjb25zdCBkb21haW5zID0gdHlwZW9mIHB1YmxpY0RvbWFpbiA9PT0gXCJzdHJpbmdcIiA/IFtwdWJsaWNEb21haW5dIDogcHVibGljRG9tYWluO1xuICByZXR1cm4gZG9tYWlucy5zb21lKChkb21haW4pID0+IGhvc3QgPT09IGRvbWFpbi50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiOlwiKVswXSk7XG59XG5cbi8qKlxuICogQ2xpZW50IElQIGZvciByYXRlLWxpbWl0aW5nOiB0aGUgUklHSFRNT1NUIGB4LWZvcndhcmRlZC1mb3JgIGVudHJ5ICh0aGUgdmFsdWVcbiAqIHRoZSBuZWFyZXN0IHRydXN0ZWQgaG9wIC0gcG9ydHIgLSB3cm90ZSksIGVsc2UgdGhlIHNvY2tldCBhZGRyZXNzLiBSZWFkaW5nIHRoZVxuICogcmlnaHRtb3N0LCBub3QgdGhlIGxlZnRtb3N0LCBzdG9wcyBhIGNhbGxlciBtaW50aW5nIGEgZnJlc2ggcmF0ZS1saW1pdCBidWNrZXQgYnlcbiAqIHZhcnlpbmcgdGhlIGhlYWRlci4gQ2FsbGVkIGJlZm9yZSB7QGxpbmsgc3RyaXBIZWFkZXJzfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsaWVudElwKHJlcTogSW5jb21pbmdNZXNzYWdlKTogc3RyaW5nIHtcbiAgY29uc3QgZm9yd2FyZGVkID0gcmVxLmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1mb3JcIl07XG4gIGNvbnN0IGNoYWluID0gKEFycmF5LmlzQXJyYXkoZm9yd2FyZGVkKSA/IGZvcndhcmRlZC5qb2luKFwiLFwiKSA6IChmb3J3YXJkZWQgPz8gXCJcIikpXG4gICAgLnNwbGl0KFwiLFwiKVxuICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeS50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIGNoYWluLmF0KC0xKSA/PyByZXEuc29ja2V0LnJlbW90ZUFkZHJlc3MgPz8gXCJ1bmtub3duXCI7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBnYXRlJ3Mgc2Vzc2lvbiBjb29raWUgZnJvbSB0aGUgYENvb2tpZWAgaGVhZGVyIGJlZm9yZSB0aGUgYXBwJ3NcbiAqIGhhbmRsZXJzIHJ1biwgc28gdGhlIGFwcCBuZXZlciBzZWVzIGBkYnhfYXV0aGAgKGl0IGlzIHRoZSBnYXRlJ3MgY29uY2VybikuXG4gKiBQcmVzZXJ2ZXMgb3RoZXIgY29va2llczsgZGVsZXRlcyB0aGUgaGVhZGVyIHdoZW4gaXQgYmVjb21lcyBlbXB0eS5cbiAqL1xuZnVuY3Rpb24gc3RyaXBTZXNzaW9uQ29va2llKHJlcTogSW5jb21pbmdNZXNzYWdlKTogdm9pZCB7XG4gIGNvbnN0IHJhdyA9IHJlcS5oZWFkZXJzLmNvb2tpZTtcbiAgaWYgKCFyYXcpIHJldHVybjtcbiAgY29uc3Qga2VwdCA9IHJhd1xuICAgIC5zcGxpdChcIjtcIilcbiAgICAubWFwKChjKSA9PiBjLnRyaW0oKSlcbiAgICAuZmlsdGVyKChjKSA9PiBjICYmICFjLnN0YXJ0c1dpdGgoXCJkYngtdG9vbHMtYXV0aD1cIikgJiYgIWMuc3RhcnRzV2l0aChcImRieC10b29scy1wYXNza2V5PVwiKSk7XG4gIGlmIChrZXB0Lmxlbmd0aCkgcmVxLmhlYWRlcnMuY29va2llID0ga2VwdC5qb2luKFwiOyBcIik7XG4gIGVsc2UgZGVsZXRlIHJlcS5oZWFkZXJzLmNvb2tpZTtcbn1cblxuLyoqXG4gKiBQcmVzZW50IGEgcGFzc3dvcmRsZXNzLWF1dGhlbnRpY2F0ZWQgY2FsbGVyIHRvIHRoZSBhcHAgdGhlIFNBTUUgd2F5IGEgcGxhdGZvcm0gZnJvbnRcbiAqIGRvb3IgZG9lczogc2V0IHRoZSBmcm9udC1kb29yIGlkZW50aXR5IGhlYWRlcnMgdG8gdGhlIHZlcmlmaWVkIGFkZHJlc3MgKEFwcEtpdFxuICogcmVhZHMge0BsaW5rIHRva2VuLlVTRVJfSURfSEVBREVSfSBmb3IgdGhlIE9CTyB1c2VyIGlkKSwgc28gdGhlIGFwcCBuZWVkcyBub1xuICogZ2F0ZS1zcGVjaWZpYyBjb2RlIHBhdGguXG4gKlxuICogV2hhdCB0aGUgZ2F0ZSBDQU5OT1Qgc2V0IGlzIHtAbGluayB0b2tlbi5BQ0NFU1NfVE9LRU5fSEVBREVSfTogYW4gYXV0aCBzZXNzaW9uXG4gKiBwcm92ZXMgYW4gZW1haWwsIG5vdCBwb3NzZXNzaW9uIG9mIGEgRGF0YWJyaWNrcyBjcmVkZW50aWFsLiBJdHMgYWJzZW5jZSBpcyB3aGF0XG4gKiBgQGRieC10b29scy9hcHBraXRgJ3MgYGlkZW50aXR5OiBcImF1dG9cImAgZGV0ZWN0cywgc28gYSBnYXRlZCByZXF1ZXN0IHJ1bnMgYXMgdGhlXG4gKiBhcHAgc2VydmljZSBwcmluY2lwYWwgaW5zdGVhZCBvZiB0aHJvd2luZy5cbiAqL1xuZnVuY3Rpb24gaW5qZWN0SWRlbnRpdHkocmVxOiBJbmNvbWluZ01lc3NhZ2UsIGVtYWlsOiBzdHJpbmcpOiB2b2lkIHtcbiAgcmVxLmhlYWRlcnNbdG9rZW4uVVNFUl9JRF9IRUFERVJdID0gZW1haWw7XG4gIHJlcS5oZWFkZXJzW3Rva2VuLlVTRVJfRU1BSUxfSEVBREVSXSA9IGVtYWlsO1xufVxuXG4vKiogUmVhZCB0aGUgcmF3IHJlcXVlc3QgYm9keSBhcyB0ZXh0IChBcHBLaXQgcGFyc2VzIEpTT04sIGJ1dCB0aGUgZ2F0ZSByb3V0ZXNcbiAqIGFyZSBtb3VudGVkIGJlZm9yZSB0aGF0IHJ1bnMgZm9yIHR1bm5lbCB0cmFmZmljLCBzbyByZWFkIGRlZmVuc2l2ZWx5KS4gKi9cbmZ1bmN0aW9uIHJlYWRCb2R5KHJlcTogV2ViUmVxdWVzdElucHV0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8gQXBwS2l0J3MganNvbiBib2R5LXBhcnNlciBtYXkgaGF2ZSBhbHJlYWR5IHBvcHVsYXRlZCByZXEuYm9keTsgcHJlZmVyIGl0LlxuICBpZiAocmVxLmJvZHkgIT09IHVuZGVmaW5lZCAmJiByZXEuYm9keSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHlwZW9mIHJlcS5ib2R5ID09PSBcInN0cmluZ1wiID8gcmVxLmJvZHkgOiBKU09OLnN0cmluZ2lmeShyZXEuYm9keSkpO1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGxldCBkYXRhID0gXCJcIjtcbiAgICByZXEub24oXCJkYXRhXCIsIChjaHVuaykgPT4gKGRhdGEgKz0gY2h1bmspKTtcbiAgICByZXEub24oXCJlbmRcIiwgKCkgPT4gcmVzb2x2ZShkYXRhKSk7XG4gICAgcmVxLm9uKFwiZXJyb3JcIiwgKCkgPT4gcmVzb2x2ZShkYXRhKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2ViSGVhZGVycyhyZXE6IEluY29taW5nTWVzc2FnZSk6IEhlYWRlcnMge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcS5oZWFkZXJzKSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSBoZWFkZXJzLmFwcGVuZChuYW1lLCBpdGVtKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgaGVhZGVycy5zZXQoXCJ4LXJlYWwtaXBcIiwgY2xpZW50SXAocmVxKSk7XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2ViUmVxdWVzdChyZXE6IFdlYlJlcXVlc3RJbnB1dCk6IFByb21pc2U8Z2xvYmFsVGhpcy5SZXF1ZXN0PiB7XG4gIGNvbnN0IGhvc3QgPSByZXEuaGVhZGVycy5ob3N0ID8/IFwibG9jYWxob3N0XCI7XG4gIGNvbnN0IGhvc3RuYW1lID0gaG9zdC5zcGxpdChcIjpcIilbMF0/LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHByb3RvY29sID0gaG9zdG5hbWUgPT09IFwibG9jYWxob3N0XCIgfHwgaG9zdG5hbWUgPT09IFwiMTI3LjAuMC4xXCIgPyBcImh0dHBcIiA6IFwiaHR0cHNcIjtcbiAgY29uc3QgbWV0aG9kID0gKHJlcS5tZXRob2QgPz8gXCJHRVRcIikudG9VcHBlckNhc2UoKTtcbiAgY29uc3QgYm9keSA9IG1ldGhvZCA9PT0gXCJHRVRcIiB8fCBtZXRob2QgPT09IFwiSEVBRFwiID8gdW5kZWZpbmVkIDogYXdhaXQgcmVhZEJvZHkocmVxKTtcbiAgcmV0dXJuIG5ldyBnbG9iYWxUaGlzLlJlcXVlc3QoYCR7cHJvdG9jb2x9Oi8vJHtob3N0fSR7cmVxLm9yaWdpbmFsVXJsIHx8IHJlcS51cmx9YCwge1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzOiB3ZWJIZWFkZXJzKHJlcSksXG4gICAgLi4uKGJvZHkgPyB7IGJvZHkgfSA6IHt9KSxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kV2ViUmVzcG9uc2UocmVzOiBSZXNwb25zZSwgcmVzcG9uc2U6IGdsb2JhbFRoaXMuUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHJlc3BvbnNlLmhlYWRlcnMuZW50cmllcygpKSB7XG4gICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJzZXQtY29va2llXCIpIHJlcy5zZXRIZWFkZXIobmFtZSwgdmFsdWUpO1xuICB9XG4gIGNvbnN0IGNvb2tpZXMgPSByZXNwb25zZS5oZWFkZXJzLmdldFNldENvb2tpZSgpO1xuICBpZiAoY29va2llcy5sZW5ndGgpIHJlcy5zZXRIZWFkZXIoXCJzZXQtY29va2llXCIsIGNvb2tpZXMpO1xuICBjb25zdCBib2R5ID0gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gIHJlcy5zdGF0dXMocmVzcG9uc2Uuc3RhdHVzKS5zZW5kKGJvZHkpO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIGNhbGxlciBzaG91bGQgZG8gd2l0aCBhIHJlcXVlc3QsIGZyb20ge0BsaW5rIGdhdGVSZXF1ZXN0fS5cbiAqXG4gKiAgIC0gYHBhc3NgIC0gbm90IHR1bm5lbCB0cmFmZmljLCBvciBhbiBvcGVuIGxvZ2luIHJvdXRlLiBGb3J3YXJkIHVudG91Y2hlZC5cbiAqICAgLSBgYWxsb3dgIC0gdHVubmVsIHRyYWZmaWMgdGhhdCBpcyBhdXRob3JpemVkLiBUaGUgcmVxdWVzdCdzIGhlYWRlcnMgaGF2ZVxuICogICAgIEFMUkVBRFkgYmVlbiByZXdyaXR0ZW4gKHBvbGljeSBhcHBsaWVkLCBpZGVudGl0eSBpbmplY3RlZCwgc2Vzc2lvbiBjb29raWVcbiAqICAgICBzdHJpcHBlZCksIHNvIGZvcndhcmQgaXQgYXMgaXQgbm93IHN0YW5kcy5cbiAqICAgLSBgZGVueWAgLSB0dW5uZWwgdHJhZmZpYyB3aXRoIG5vIHZhbGlkIHNlc3Npb24uIEFuc3dlciBgNDAxYCB3aXRoXG4gKiAgICAge0BsaW5rIEFVVEhfUFJFRklYfSBhcyB0aGUgbG9naW4gcGF0aC5cbiAqL1xuZXhwb3J0IHR5cGUgR2F0ZUFjdGlvbiA9IFwicGFzc1wiIHwgXCJhbGxvd1wiIHwgXCJkZW55XCI7XG5cbi8qKlxuICogVEhFIGdhdGluZyBkZWNpc2lvbiwgZm9yIG9uZSByZXF1ZXN0LCBpbmRlcGVuZGVudCBvZiBob3cgaXQgd2lsbCBiZSBhbnN3ZXJlZC5cbiAqXG4gKiBCb3RoIHBhdGhzIGNhbGwgdGhpczogdGhlIEV4cHJlc3MgbWlkZGxld2FyZSBiZWxvdyAod2hlcmUgdGhlIGFwcCBpcyB0aGVcbiAqIHByb2Nlc3MpIGFuZCBgQGRieC10b29scy9jbGktdHVubmVsYCdzIHJldmVyc2UgcHJveHkgKHdoZXJlIHRoZSBhcHAgaXMgYSBjaGlsZFxuICogcHJvY2VzcyBvbiBhIHByaXZhdGUgcG9ydCkuIEEgZGl2ZXJnZW5jZSBiZXR3ZWVuIHRoZW0gd291bGQgYmUgYSBzZWN1cml0eSBidWdcbiAqIHRoZSBzZWNvbmQgcGF0aCBjb3VsZCBub3QgYmUgdGVzdGVkIGludG8gYWdyZWVtZW50IC0gb25lIHBhdGggZm9yZ2V0dGluZyB0b1xuICogc3RyaXAgYHgtZm9yd2FyZGVkLWFjY2Vzcy10b2tlbmAgaXMgZW5vdWdoIC0gc28gdGhlIGRlY2lzaW9uLCB0aGUgaGVhZGVyXG4gKiByZXdyaXRpbmcsIGFuZCB0aGUgaWRlbnRpdHkgaW5qZWN0aW9uIGxpdmUgaGVyZSBvbmNlIGFuZCB0aGUgdHJhbnNwb3J0cyBvbmx5XG4gKiBkaWZmZXIgaW4gaG93IHRoZXkgV1JJVEUgdGhlIG91dGNvbWUuXG4gKlxuICogTXV0YXRlcyBgcmVxLmhlYWRlcnNgIG9uIHRoZSBgYWxsb3dgL2BwYXNzYC13aXRoLWNvb2tpZSBwYXRocywgd2hpY2ggaXMgZXhhY3RseVxuICogd2hhdCBib3RoIGNhbGxlcnMgd2FudDogRXhwcmVzcyBoYW5kcyB0aGUgc2FtZSBvYmplY3QgdG8gdGhlIGFwcCdzIGhhbmRsZXJzLCBhbmRcbiAqIHRoZSBwcm94eSBmb3J3YXJkcyBpdCB1cHN0cmVhbS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdhdGVSZXF1ZXN0KFxuICByZXE6IEluY29taW5nTWVzc2FnZSxcbiAgb3B0aW9uczogR2F0ZU9wdGlvbnMgJiB7IGhlYWRlclBvbGljeT86IEhlYWRlclBvbGljeSB9LFxuKTogUHJvbWlzZTxHYXRlQWN0aW9uPiB7XG4gIGNvbnN0IHsgZ2F0ZSwgcHVibGljRG9tYWluIH0gPSBvcHRpb25zO1xuICAvLyBOb3QgdHVubmVsIHRyYWZmaWMgKHBsYXRmb3JtIGZyb250IGRvb3IsIG9yIGFueSBvdGhlciBsb2NhbCBjYWxsZXIpOiB0aGVcbiAgLy8gcmVxdWVzdCBpcyBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQsIG9yIGlzIG5vdCBvdXJzIHRvIGdhdGUuXG4gIGlmICghaXNUdW5uZWxIb3N0KHJlcSwgcHVibGljRG9tYWluKSkgcmV0dXJuIFwicGFzc1wiO1xuXG4gIGNvbnN0IHBhdGggPSAocmVxLnVybCA/PyBcIi9cIikuc3BsaXQoXCI/XCIpWzBdID8/IFwiL1wiO1xuICAvLyBUaGUgbG9naW4gZmxvdyBpcyBvcGVuIHNvIHRoZSBicm93c2VyIGNhbiByZW5kZXIgPEF1dGhHYXRlPiBhbmQgc2lnbiBpbi5cbiAgaWYgKHBhdGguc3RhcnRzV2l0aChBVVRIX1BSRUZJWCkpIHJldHVybiBcInBhc3NcIjtcblxuICAvLyBBbnRpLXNwb29mOiBvbmx5IHRoZSBnYXRlIG1heSBhc3NlcnQgaWRlbnRpdHkgb24gdHVubmVsIHRyYWZmaWMuXG4gIGNvbnN0IHBvbGljeSA9IG9wdGlvbnMuaGVhZGVyUG9saWN5ID8/IHRvSGVhZGVyUG9saWN5KG9wdGlvbnMuZm9yd2FyZEhlYWRlcnMpO1xuICBjb25zdCByZW1vdmVkID0gcG9saWN5LmFwcGx5KHJlcS5oZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgaWYgKHJlbW92ZWQubGVuZ3RoKSBsb2dnZXIuZGVidWcoXCJzdHJpcHBlZCBpbmJvdW5kIGhlYWRlcnNcIiwgeyByZW1vdmVkIH0pO1xuXG4gIGNvbnN0IGdhdGVQYXRocyA9IG9wdGlvbnMuZ2F0ZVBhdGhzID8/IFtdO1xuICAvLyBBIHBhdGggaXMgZ2F0ZWQgaWYgaXQgaXMgdW5kZXIgYC9hcGkvYCBvciBhbnkgY2FsbGVyLXN1cHBsaWVkIHByZWZpeCAoZS5nLlxuICAvLyBgL3dzYCBmb3IgYSBXZWJTb2NrZXQgYXBwKS5cbiAgY29uc3QgZ2F0ZWQgPVxuICAgIHBhdGguc3RhcnRzV2l0aChcIi9hcGkvXCIpIHx8XG4gICAgZ2F0ZVBhdGhzLnNvbWUoKHByZWZpeCkgPT4gcGF0aCA9PT0gcHJlZml4IHx8IHBhdGguc3RhcnRzV2l0aChgJHtwcmVmaXh9L2ApKTtcblxuICAvLyBBcHAtZ2F0aW5nIG1vZGU6IHdoZW4gYGdhdGVQYXRoc2AgaXMgc2V0IHRoZSBjYWxsZXIgaXMgZnJvbnRpbmcgYSB3aG9sZSBhcHBcbiAgLy8gKG5vdCBhIHNlbGYtcHJvdGVjdGluZyBTUEEpLCBzbyBhbiB1bmF1dGhlbnRpY2F0ZWQgdG9wLWxldmVsIGJyb3dzZXJcbiAgLy8gbmF2aWdhdGlvbiBpcyBkZW5pZWQgdG9vIOKAlCB0aGUgdHJhbnNwb3J0IGFuc3dlcnMgaXQgd2l0aCB0aGUgaG9zdGVkIGxvZ2luXG4gIC8vIHBhZ2UsIHB1dHRpbmcgc2lnbi1pbiBpbiBmcm9udCBvZiB0aGUgYXBwIGluc3RlYWQgb2YgbG9hZGluZyBpdHMgc2hlbGwgd2l0aFxuICAvLyBhIGRlYWQgZ2F0ZWQgcmVxdWVzdC4gTm9uLW5hdmlnYXRpb24gc3RhdGljIChhc3NldHMpIHN0aWxsIGxvYWRzIGZyZWVseSBzb1xuICAvLyB0aGUgbG9naW4gcGFnZSBhbmQgYXBwIGNhbiByZW5kZXIuXG4gIGNvbnN0IGFwcEdhdGluZyA9IGdhdGVQYXRocy5sZW5ndGggPiAwO1xuICBjb25zdCBtdXN0QXV0aCA9IGdhdGVkIHx8IChhcHBHYXRpbmcgJiYgd2FudHNMb2dpblBhZ2UocmVxKSk7XG4gIGlmICghbXVzdEF1dGgpIHtcbiAgICBzdHJpcFNlc3Npb25Db29raWUocmVxKTtcbiAgICByZXR1cm4gXCJwYXNzXCI7XG4gIH1cblxuICAvLyBBIGdhdGVkIHJlcXVlc3QgbmVlZHMgYSB2YWxpZCBCZXR0ZXIgQXV0aCBzZXNzaW9uLlxuICBjb25zdCBlbWFpbCA9IGF3YWl0IGdhdGUuc2Vzc2lvbih3ZWJIZWFkZXJzKHJlcSkpO1xuICBpZiAoIWVtYWlsKSByZXR1cm4gXCJkZW55XCI7XG4gIGluamVjdElkZW50aXR5KHJlcSwgZW1haWwpO1xuICBzdHJpcFNlc3Npb25Db29raWUocmVxKTtcbiAgcmV0dXJuIFwiYWxsb3dcIjtcbn1cblxuLyoqIFRoZSBib2R5IG9mIGEgYGRlbnlgLCBzaGFyZWQgc28gYm90aCBwYXRocyBhbnN3ZXIgYSA0MDEgaWRlbnRpY2FsbHkuICovXG5leHBvcnQgY29uc3QgVU5BVVRIT1JJWkVEX0JPRFkgPSB7XG4gIGVycm9yOiBcImF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkXCIsXG4gIGxvZ2luUGF0aDogQVVUSF9QUkVGSVgsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFdoZXRoZXIgYSBkZW5pZWQgcmVxdWVzdCBpcyBhIHRvcC1sZXZlbCBCUk9XU0VSIE5BVklHQVRJT04gdGhhdCBzaG91bGQgYmVcbiAqIGFuc3dlcmVkIHdpdGggdGhlIGhvc3RlZCBsb2dpbiBwYWdlIHJhdGhlciB0aGFuIGEgNDAxLlxuICpcbiAqIEFuIGFwcCBmcm9udGVkIGJ5IHRoZSBnYXRlICh2aWEgYGdhdGVQYXRoc2ApIG1heSBzZXJ2ZSBpdHMgb3duIEhUTUwgZnJvbSBhblxuICogdW5nYXRlZCBwYXRoIHdoaWxlIGl0cyBwcml2aWxlZ2VkIHN1cmZhY2UgKGAvd3NgLCBgL2FwaWApIGlzIGdhdGVkLiBBIGJyb3dzZXJcbiAqIG5hdmlnYXRpbmcgdG8gaXQgd291bGQgb3RoZXJ3aXNlIGxvYWQgdGhlIGFwcCBzaGVsbCBhbmQgb25seSBzZWUgdGhlIGdhdGVkXG4gKiByZXF1ZXN0IGZhaWwsIHdpdGggbm8gd2F5IHRvIHNpZ24gaW4uIFNlcnZpbmcgdGhlIGxvZ2luIHBhZ2Ugb24gdGhlIG5hdmlnYXRpb25cbiAqIGl0c2VsZiBwdXRzIHNpZ24taW4gaW4gZnJvbnQgb2YgdGhlIGFwcC4gQXBwbGllcyBvbmx5IHRvIEdFVCByZXF1ZXN0cyB0aGF0XG4gKiBhY2NlcHQgSFRNTCBhbmQgYXJlIG5vdCBhc2tpbmcgZm9yIHRoZSBsb2dpbiBBUEkgb3IgYW4gYXNzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YW50c0xvZ2luUGFnZShyZXE6IEluY29taW5nTWVzc2FnZSk6IGJvb2xlYW4ge1xuICBjb25zdCBtZXRob2QgPSAocmVxLm1ldGhvZCA/PyBcIkdFVFwiKS50b1VwcGVyQ2FzZSgpO1xuICBpZiAobWV0aG9kICE9PSBcIkdFVFwiICYmIG1ldGhvZCAhPT0gXCJIRUFEXCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcGF0aCA9IChyZXEudXJsID8/IFwiL1wiKS5zcGxpdChcIj9cIilbMF0gPz8gXCIvXCI7XG4gIGlmIChwYXRoLnN0YXJ0c1dpdGgoQVVUSF9QUkVGSVgpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGFjY2VwdCA9IFN0cmluZyhyZXEuaGVhZGVycy5hY2NlcHQgPz8gXCJcIik7XG4gIHJldHVybiBhY2NlcHQuaW5jbHVkZXMoXCJ0ZXh0L2h0bWxcIik7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIGxvZ2luIHJvdXRlcyBhbmQgdGhlIGdhdGluZyBtaWRkbGV3YXJlIG9uIHRoZSBhcHAncyBFeHByZXNzXG4gKiBpbnN0YW5jZS4gQ2FsbGVkIGZyb20ge0BsaW5rIEF1dGhHYXRlUGx1Z2lufSB3aXRoIHRoZSByb3V0ZXIgQXBwS2l0IGhhbmRzXG4gKiBgaW5qZWN0Um91dGVzYCwgcGx1cyBgdGhpcy5jb250ZXh0LmFkZE1pZGRsZXdhcmVgIGZvciB0aGUgZ2xvYmFsIGdhdGUuXG4gKlxuICogYGFkZFJvdXRlYC9gYWRkTWlkZGxld2FyZWAgYXJlIHVzZWQgKHZpYSB0aGUgcGFzc2VkIGNhbGxiYWNrcykgYmVjYXVzZSB0aGUgbG9naW5cbiAqIHJvdXRlcyBsaXZlIGF0IGFuIEFCU09MVVRFIHBhdGggKGAvYXBpL2VtYWlsL2F1dGgvKmAsIHRoZSBjbGllbnQncyBjb250cmFjdCksXG4gKiBub3QgdW5kZXIgdGhlIHBsdWdpbidzIGAvYXBpL2F1dGhHYXRlYCBiYXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW91bnRHYXRlKFxuICBvcHRzOiBHYXRlT3B0aW9ucyxcbiAgX2FkZFJvdXRlOiAobWV0aG9kOiBcImdldFwiIHwgXCJwb3N0XCIsIHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpID0+IHZvaWQsXG4gIGFkZE1pZGRsZXdhcmU6IChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGNvbnN0IHsgZ2F0ZSwgcHVibGljRG9tYWluLCBmb3J3YXJkSGVhZGVycywgZ2F0ZVBhdGhzIH0gPSBvcHRzO1xuICBjb25zdCBoZWFkZXJQb2xpY3kgPSB0b0hlYWRlclBvbGljeShmb3J3YXJkSGVhZGVycyk7XG4gIGxvZ2dlci5kZWJ1ZyhcImdhdGUgbW91bnRlZFwiLCB7IHB1YmxpY0RvbWFpbiwgZm9yd2FyZDogaGVhZGVyUG9saWN5LnBhdHRlcm5zLCBnYXRlUGF0aHMgfSk7XG5cbiAgLy8gQmV0dGVyIEF1dGggYW5kIHRoZSBjb21wYXRpYmlsaXR5IHJvdXRlcyBzaGFyZSBvbmUgZmV0Y2gtY29tcGF0aWJsZVxuICAvLyBoYW5kbGVyIGluIGJvdGggaG9zdGluZyBtb2Rlcy5cbiAgY29uc3QgYXV0aEhhbmRsZXIgPSAoYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgaWYgKCFpc1R1bm5lbEhvc3QocmVxLCBwdWJsaWNEb21haW4pKSB7XG4gICAgICBjb25zdCBwYXRoID0gKHJlcS51cmwgPz8gXCIvXCIpLnNwbGl0KFwiP1wiKVswXSA/PyBcIi9cIjtcbiAgICAgIGlmIChwYXRoLmVuZHNXaXRoKFwiL3N0YXR1c1wiKSkge1xuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7IGF1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBlbmFibGVkOiBmYWxzZSwgcGFzc2tleXNFbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IFwibm90IGZvdW5kXCIgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHNlbmRXZWJSZXNwb25zZShyZXMsIGF3YWl0IGdhdGUuaGFuZGxlcihhd2FpdCB3ZWJSZXF1ZXN0KHJlcSkpKTtcbiAgfSkgYXMgUmVxdWVzdEhhbmRsZXI7XG4gIGFkZE1pZGRsZXdhcmUoQVVUSF9QUkVGSVgsIGF1dGhIYW5kbGVyKTtcblxuICAvLyAtLS0gVGhlIGdhdGUgbWlkZGxld2FyZSAocnVucyBiZWZvcmUgc3RhdGljICsgdGhlIGFwcCdzIC9hcGkgaGFuZGxlcnMpIC0tLVxuXG4gIGNvbnN0IGdhdGVNaWRkbGV3YXJlID0gKGFzeW5jIChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgIGNvbnN0IGFjdGlvbiA9IGF3YWl0IGdhdGVSZXF1ZXN0KHJlcSwgeyBnYXRlLCBwdWJsaWNEb21haW4sIGhlYWRlclBvbGljeSwgZ2F0ZVBhdGhzIH0pO1xuICAgIGlmIChhY3Rpb24gPT09IFwiZGVueVwiKSByZXMuc3RhdHVzKDQwMSkuanNvbihVTkFVVEhPUklaRURfQk9EWSk7XG4gICAgZWxzZSBuZXh0KCk7XG4gIH0pIGFzIFJlcXVlc3RIYW5kbGVyO1xuXG4gIGFkZE1pZGRsZXdhcmUoXCIvXCIsIGdhdGVNaWRkbGV3YXJlKTtcbn1cbiJdfQ==
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBR0gsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsY0FBYyxFQUFxQixNQUFNLGNBQWMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHaEQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQU96QyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUM7QUE4QjdDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixHQUFvQixFQUNwQixZQUFvRDtJQUVwRCxJQUFJLENBQUMsWUFBWTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sT0FBTyxHQUFHLE9BQU8sWUFBWSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO0lBQ2pGLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLEdBQW9CO0lBQzNDLE1BQU0sU0FBUyxH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QyxDQUFDO0FBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSB0dW5uZWwncyBpbi1hcHAgQVVUSCBHQVRFIC0gRXhwcmVzcyBtaWRkbGV3YXJlICsgbG9naW4gcm91dGVzIHRoZVxuICoge0BsaW5rIEF1dGhHYXRlUGx1Z2lufSByZWdpc3RlcnMgb24gdGhlIGFwcCdzIE9XTiBzZXJ2ZXIgdmlhIGB0aGlzLmNvbnRleHRgLlxuICpcbiAqIFRoZSBnYXRlIGlzIE1JRERMRVdBUkUsIG5vdCBhIHJldmVyc2UgcHJveHkgLSB0aGUgYXBwIGlzIHRoZSBwcm9jZXNzLCBzbyB0aGVyZSBpc1xuICogbm90aGluZyB0byBmb3J3YXJkIHRvLiBJdCBlaXRoZXIgc2hvcnQtY2lyY3VpdHMgKDQwMSwgb3IgYW5zd2VycyB0aGUgb3BlbiBsb2dpblxuICogcm91dGVzKSBvciBjYWxscyBgbmV4dCgpYCB0byBsZXQgdGhlIGFwcCdzIHJlYWwgaGFuZGxlcnMgcnVuLiBJdCBpcyB0aGVcbiAqIFwic3RhbmRzIGluIGZvciBBcHBLaXQgYXV0aFwiIHBhdGg6XG4gKiBhIHBvcnRyIGNhbGxlciBhdXRoZW50aWNhdGVzIHdpdGggQmV0dGVyIEF1dGggT1RQIG9yIGEgcGFzc2tleSwgYW5kIG9uXG4gKiBzdWNjZXNzIHRoZSBnYXRlIGluamVjdHMgdGhlIGlkZW50aXR5IGhlYWRlcnMgQXBwS2l0IHJlYWRzLlxuICpcbiAqIFdISUNIIFRSQUZGSUMgSVMgR0FURUQgLSB0aGUgYEhvc3RgIGhlYWRlciwgbm90IHRoZSBzb2NrZXQuIHBvcnRyJ3MgY2xpZW50XG4gKiBmb3J3YXJkcyB3aXRoIEdvJ3MgYGh0dHB1dGlsLk5ld1NpbmdsZUhvc3RSZXZlcnNlUHJveHlgIGFuZCBhIGBEaXJlY3RvcmAgdGhhdFxuICogUFJFU0VSVkVTIHRoZSBvcmlnaW5hbCBgSG9zdGAsIHNvIHR1bm5lbCByZXF1ZXN0cyBhcnJpdmUgd2l0aFxuICogYEhvc3Q6IDxzdWJkb21haW4+LjxzZXJ2ZXI+YCAodGhlIHB1YmxpYyBkb21haW4pLiBBIGxvY2FsIHByb2Nlc3MgaGl0dGluZyB0aGVcbiAqIGFwcCBkaXJlY3RseSBzZW5kcyBgSG9zdDogMTI3LjAuMC4xOjxwb3J0PmAgLyBgbG9jYWxob3N0YC4gU28gT05MWSByZXF1ZXN0cyB3aG9zZVxuICogYEhvc3RgIG1hdGNoZXMgdGhlIGNvbmZpZ3VyZWQgcHVibGljIGRvbWFpbiBhcmUgZ2F0ZWQ7IHRoZSBwbGF0Zm9ybSBmcm9udCBkb29yXG4gKiBhbmQgYW55IG90aGVyIGxvY2FsIGNsaWVudCBwYXNzIHRocm91Z2ggdW50b3VjaGVkLiBUaGVyZSBpcyBubyBwb3J0ci1pbmplY3RlZFxuICogaWRlbnRpZnlpbmcgaGVhZGVyIGFuZCBubyBUQ1Avc291cmNlLUlQIHNpZ25hbCB0byB1c2UgaW5zdGVhZCAodGhlIGNsaWVudCBkaWFsc1xuICogdGhlIHRhcmdldCBvdmVyIHBsYWluIGxvb3BiYWNrKS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ01lc3NhZ2UgfSBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgeyBsb2csIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdEhhbmRsZXIsIFJlc3BvbnNlIH0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB7IHRvSGVhZGVyUG9saWN5LCB0eXBlIEhlYWRlclBvbGljeSB9IGZyb20gXCIuL2hlYWRlcnMudHNcIjtcbmltcG9ydCB7IGxvZ2luUGFnZUh0bWwgfSBmcm9tIFwiLi9sb2dpbi1wYWdlLnRzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhHYXRlQXBpIH0gZnJvbSBcIi4vcGx1Z2luLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWw6Z2F0ZVwiKTtcblxudHlwZSBXZWJSZXF1ZXN0SW5wdXQgPSBJbmNvbWluZ01lc3NhZ2UgJiB7XG4gIGJvZHk/OiB1bmtub3duO1xuICBvcmlnaW5hbFVybD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBBVVRIX1BSRUZJWCA9IFwiL2FwaS9lbWFpbC9hdXRoXCI7XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgbW91bnRHYXRlfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2F0ZU9wdGlvbnMge1xuICAvKiogVGhlIGluLXByb2Nlc3MgZ2F0ZSBBUEkgKHNlc3Npb24vcmVxdWVzdC92ZXJpZnkvc3RhdHVzKS4gKi9cbiAgZ2F0ZTogQXV0aEdhdGVBcGk7XG4gIC8qKlxuICAgKiBUaGUgcHVibGljIGA8c3ViZG9tYWluPi48c2VydmVyPmAgdGhhdCBpZGVudGlmaWVzIHBvcnRyIHRyYWZmaWMgYnkgYEhvc3RgLlxuICAgKiBXaGVuIGFic2VudCwgbm8gcmVxdWVzdCBpcyBldmVyIGNsYXNzaWZpZWQgYXMgdHVubmVsIHRyYWZmaWMgYW5kIHRoZSBnYXRlIGlzXG4gICAqIGluZXJ0IChldmVyeXRoaW5nIHBhc3NlcyB0aHJvdWdoKSAtIGEgdHVubmVsIHdpdGggbm8gcHVibGljIGRvbWFpbiBnYXRlc1xuICAgKiBub3RoaW5nLlxuICAgKi9cbiAgcHVibGljRG9tYWluPzogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBFeHRyYSBgeC1gIHJlcXVlc3QgaGVhZGVycyB0dW5uZWwgdHJhZmZpYyBtYXkgZm9yd2FyZCAodW5pb25lZCB3aXRoIHRoZVxuICAgKiBidWlsdC1pbiBhbGxvdy1saXN0KS4gRXZlcnkgb3RoZXIgYHgtYCBoZWFkZXIgaXMgc3RyaXBwZWQgZnJvbSB0dW5uZWwgdHJhZmZpYy5cbiAgICovXG4gIGZvcndhcmRIZWFkZXJzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBQYXRoIHByZWZpeGVzIHRoYXQgcmVxdWlyZSBhIHZhbGlkIHNlc3Npb24sIGJleW9uZCB0aGUgYnVpbHQtaW4gYC9hcGkvYC5cbiAgICogVGhlIGRlZmF1bHQgZ2F0aW5nIG1vZGVsIGFzc3VtZXMgYSBzZWxmLXByb3RlY3RpbmcgU1BBOiBzdGF0aWMgbG9hZHMgZnJlZWx5XG4gICAqIHNvIHRoZSBhcHAgY2FuIHJlbmRlciwgYW5kIG9ubHkgYC9hcGkvKmAgaXMgZ2F0ZWQuIEFuIGFwcCB3aG9zZSBwcml2aWxlZ2VkXG4gICAqIHN1cmZhY2UgaXMgTk9UIHVuZGVyIGAvYXBpL2AgKGUuZy4gYSBXZWJTb2NrZXQgYXQgYC93c2ApIGxpc3RzIHRob3NlIHByZWZpeGVzXG4gICAqIGhlcmUgc28gdGhleSBhcmUgZ2F0ZWQgdG9vLiBMb2dpbiByb3V0ZXMgKGBBVVRIX1BSRUZJWGApIGFyZSBhbHdheXMgb3Blbi5cbiAgICovXG4gIGdhdGVQYXRocz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogUHJvZHVjdCBuYW1lIGRpc3BsYXllZCBieSB0aGUgaG9zdGVkIGxvZ2luIHBhZ2UuICovXG4gIGJyYW5kTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUcnVlIHdoZW4gdGhlIHJlcXVlc3QncyBgSG9zdGAgaXMgb25lIG9mIHRoZSB0dW5uZWwncyBwdWJsaWMgZG9tYWlucyAtIGkuZS4gaXRcbiAqIGNhbWUgaW4gb3ZlciBQb3J0ciBvciBGUlAuIENhc2UtaW5zZW5zaXRpdmU7IHRoZSBvcHRpb25hbCBgOnBvcnRgIGlzIGlnbm9yZWQuXG4gKiBXaGVuIG5vIHB1YmxpYyBkb21haW4gaXMgY29uZmlndXJlZCwgbm90aGluZyBpcyB0dW5uZWwgdHJhZmZpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHVubmVsSG9zdChcbiAgcmVxOiBJbmNvbWluZ01lc3NhZ2UsXG4gIHB1YmxpY0RvbWFpbjogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgaWYgKCFwdWJsaWNEb21haW4pIHJldHVybiBmYWxzZTtcbiAgY29uc3QgaG9zdCA9IChyZXEuaGVhZGVycy5ob3N0ID8/IFwiXCIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCI6XCIpWzBdO1xuICBjb25zdCBkb21haW5zID0gdHlwZW9mIHB1YmxpY0RvbWFpbiA9PT0gXCJzdHJpbmdcIiA/IFtwdWJsaWNEb21haW5dIDogcHVibGljRG9tYWluO1xuICByZXR1cm4gZG9tYWlucy5zb21lKChkb21haW4pID0+IGhvc3QgPT09IGRvbWFpbi50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiOlwiKVswXSk7XG59XG5cbi8qKlxuICogQ2xpZW50IElQIGZvciByYXRlLWxpbWl0aW5nOiB0aGUgUklHSFRNT1NUIGB4LWZvcndhcmRlZC1mb3JgIGVudHJ5ICh0aGUgdmFsdWVcbiAqIHRoZSBuZWFyZXN0IHRydXN0ZWQgaG9wIC0gcG9ydHIgLSB3cm90ZSksIGVsc2UgdGhlIHNvY2tldCBhZGRyZXNzLiBSZWFkaW5nIHRoZVxuICogcmlnaHRtb3N0LCBub3QgdGhlIGxlZnRtb3N0LCBzdG9wcyBhIGNhbGxlciBtaW50aW5nIGEgZnJlc2ggcmF0ZS1saW1pdCBidWNrZXQgYnlcbiAqIHZhcnlpbmcgdGhlIGhlYWRlci4gQ2FsbGVkIGJlZm9yZSB7QGxpbmsgc3RyaXBIZWFkZXJzfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsaWVudElwKHJlcTogSW5jb21pbmdNZXNzYWdlKTogc3RyaW5nIHtcbiAgY29uc3QgZm9yd2FyZGVkID0gcmVxLmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1mb3JcIl07XG4gIGNvbnN0IGNoYWluID0gKEFycmF5LmlzQXJyYXkoZm9yd2FyZGVkKSA/IGZvcndhcmRlZC5qb2luKFwiLFwiKSA6IChmb3J3YXJkZWQgPz8gXCJcIikpXG4gICAgLnNwbGl0KFwiLFwiKVxuICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeS50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIGNoYWluLmF0KC0xKSA/PyByZXEuc29ja2V0LnJlbW90ZUFkZHJlc3MgPz8gXCJ1bmtub3duXCI7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBnYXRlJ3Mgc2Vzc2lvbiBjb29raWUgZnJvbSB0aGUgYENvb2tpZWAgaGVhZGVyIGJlZm9yZSB0aGUgYXBwJ3NcbiAqIGhhbmRsZXJzIHJ1biwgc28gdGhlIGFwcCBuZXZlciBzZWVzIGBkYnhfYXV0aGAgKGl0IGlzIHRoZSBnYXRlJ3MgY29uY2VybikuXG4gKiBQcmVzZXJ2ZXMgb3RoZXIgY29va2llczsgZGVsZXRlcyB0aGUgaGVhZGVyIHdoZW4gaXQgYmVjb21lcyBlbXB0eS5cbiAqL1xuZnVuY3Rpb24gc3RyaXBTZXNzaW9uQ29va2llKHJlcTogSW5jb21pbmdNZXNzYWdlKTogdm9pZCB7XG4gIGNvbnN0IHJhdyA9IHJlcS5oZWFkZXJzLmNvb2tpZTtcbiAgaWYgKCFyYXcpIHJldHVybjtcbiAgY29uc3Qga2VwdCA9IHJhd1xuICAgIC5zcGxpdChcIjtcIilcbiAgICAubWFwKChjKSA9PiBjLnRyaW0oKSlcbiAgICAuZmlsdGVyKChjKSA9PiBjICYmICFjLnN0YXJ0c1dpdGgoXCJkYngtdG9vbHMtYXV0aD1cIikgJiYgIWMuc3RhcnRzV2l0aChcImRieC10b29scy1wYXNza2V5PVwiKSk7XG4gIGlmIChrZXB0Lmxlbmd0aCkgcmVxLmhlYWRlcnMuY29va2llID0ga2VwdC5qb2luKFwiOyBcIik7XG4gIGVsc2UgZGVsZXRlIHJlcS5oZWFkZXJzLmNvb2tpZTtcbn1cblxuLyoqXG4gKiBQcmVzZW50IGEgcGFzc3dvcmRsZXNzLWF1dGhlbnRpY2F0ZWQgY2FsbGVyIHRvIHRoZSBhcHAgdGhlIFNBTUUgd2F5IGEgcGxhdGZvcm0gZnJvbnRcbiAqIGRvb3IgZG9lczogc2V0IHRoZSBmcm9udC1kb29yIGlkZW50aXR5IGhlYWRlcnMgdG8gdGhlIHZlcmlmaWVkIGFkZHJlc3MgKEFwcEtpdFxuICogcmVhZHMge0BsaW5rIHRva2VuLlVTRVJfSURfSEVBREVSfSBmb3IgdGhlIE9CTyB1c2VyIGlkKSwgc28gdGhlIGFwcCBuZWVkcyBub1xuICogZ2F0ZS1zcGVjaWZpYyBjb2RlIHBhdGguXG4gKlxuICogV2hhdCB0aGUgZ2F0ZSBDQU5OT1Qgc2V0IGlzIHtAbGluayB0b2tlbi5BQ0NFU1NfVE9LRU5fSEVBREVSfTogYW4gYXV0aCBzZXNzaW9uXG4gKiBwcm92ZXMgYW4gZW1haWwsIG5vdCBwb3NzZXNzaW9uIG9mIGEgRGF0YWJyaWNrcyBjcmVkZW50aWFsLiBJdHMgYWJzZW5jZSBpcyB3aGF0XG4gKiBgQGRieC10b29scy9hcHBraXRgJ3MgYGlkZW50aXR5OiBcImF1dG9cImAgZGV0ZWN0cywgc28gYSBnYXRlZCByZXF1ZXN0IHJ1bnMgYXMgdGhlXG4gKiBhcHAgc2VydmljZSBwcmluY2lwYWwgaW5zdGVhZCBvZiB0aHJvd2luZy5cbiAqL1xuZnVuY3Rpb24gaW5qZWN0SWRlbnRpdHkocmVxOiBJbmNvbWluZ01lc3NhZ2UsIGVtYWlsOiBzdHJpbmcpOiB2b2lkIHtcbiAgcmVxLmhlYWRlcnNbdG9rZW4uVVNFUl9JRF9IRUFERVJdID0gZW1haWw7XG4gIHJlcS5oZWFkZXJzW3Rva2VuLlVTRVJfRU1BSUxfSEVBREVSXSA9IGVtYWlsO1xufVxuXG4vKiogUmVhZCB0aGUgcmF3IHJlcXVlc3QgYm9keSBhcyB0ZXh0IChBcHBLaXQgcGFyc2VzIEpTT04sIGJ1dCB0aGUgZ2F0ZSByb3V0ZXNcbiAqIGFyZSBtb3VudGVkIGJlZm9yZSB0aGF0IHJ1bnMgZm9yIHR1bm5lbCB0cmFmZmljLCBzbyByZWFkIGRlZmVuc2l2ZWx5KS4gKi9cbmZ1bmN0aW9uIHJlYWRCb2R5KHJlcTogV2ViUmVxdWVzdElucHV0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8gQXBwS2l0J3MganNvbiBib2R5LXBhcnNlciBtYXkgaGF2ZSBhbHJlYWR5IHBvcHVsYXRlZCByZXEuYm9keTsgcHJlZmVyIGl0LlxuICBpZiAocmVxLmJvZHkgIT09IHVuZGVmaW5lZCAmJiByZXEuYm9keSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHlwZW9mIHJlcS5ib2R5ID09PSBcInN0cmluZ1wiID8gcmVxLmJvZHkgOiBKU09OLnN0cmluZ2lmeShyZXEuYm9keSkpO1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGxldCBkYXRhID0gXCJcIjtcbiAgICByZXEub24oXCJkYXRhXCIsIChjaHVuaykgPT4gKGRhdGEgKz0gY2h1bmspKTtcbiAgICByZXEub24oXCJlbmRcIiwgKCkgPT4gcmVzb2x2ZShkYXRhKSk7XG4gICAgcmVxLm9uKFwiZXJyb3JcIiwgKCkgPT4gcmVzb2x2ZShkYXRhKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2ViSGVhZGVycyhyZXE6IEluY29taW5nTWVzc2FnZSk6IEhlYWRlcnMge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcS5oZWFkZXJzKSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSBoZWFkZXJzLmFwcGVuZChuYW1lLCBpdGVtKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgaGVhZGVycy5zZXQoXCJ4LXJlYWwtaXBcIiwgY2xpZW50SXAocmVxKSk7XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2ViUmVxdWVzdChyZXE6IFdlYlJlcXVlc3RJbnB1dCk6IFByb21pc2U8Z2xvYmFsVGhpcy5SZXF1ZXN0PiB7XG4gIGNvbnN0IGhvc3QgPSByZXEuaGVhZGVycy5ob3N0ID8/IFwibG9jYWxob3N0XCI7XG4gIGNvbnN0IGhvc3RuYW1lID0gaG9zdC5zcGxpdChcIjpcIilbMF0/LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHByb3RvY29sID0gaG9zdG5hbWUgPT09IFwibG9jYWxob3N0XCIgfHwgaG9zdG5hbWUgPT09IFwiMTI3LjAuMC4xXCIgPyBcImh0dHBcIiA6IFwiaHR0cHNcIjtcbiAgY29uc3QgbWV0aG9kID0gKHJlcS5tZXRob2QgPz8gXCJHRVRcIikudG9VcHBlckNhc2UoKTtcbiAgY29uc3QgYm9keSA9IG1ldGhvZCA9PT0gXCJHRVRcIiB8fCBtZXRob2QgPT09IFwiSEVBRFwiID8gdW5kZWZpbmVkIDogYXdhaXQgcmVhZEJvZHkocmVxKTtcbiAgcmV0dXJuIG5ldyBnbG9iYWxUaGlzLlJlcXVlc3QoYCR7cHJvdG9jb2x9Oi8vJHtob3N0fSR7cmVxLm9yaWdpbmFsVXJsIHx8IHJlcS51cmx9YCwge1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzOiB3ZWJIZWFkZXJzKHJlcSksXG4gICAgLi4uKGJvZHkgPyB7IGJvZHkgfSA6IHt9KSxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kV2ViUmVzcG9uc2UocmVzOiBSZXNwb25zZSwgcmVzcG9uc2U6IGdsb2JhbFRoaXMuUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHJlc3BvbnNlLmhlYWRlcnMuZW50cmllcygpKSB7XG4gICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJzZXQtY29va2llXCIpIHJlcy5zZXRIZWFkZXIobmFtZSwgdmFsdWUpO1xuICB9XG4gIGNvbnN0IGNvb2tpZXMgPSByZXNwb25zZS5oZWFkZXJzLmdldFNldENvb2tpZSgpO1xuICBpZiAoY29va2llcy5sZW5ndGgpIHJlcy5zZXRIZWFkZXIoXCJzZXQtY29va2llXCIsIGNvb2tpZXMpO1xuICBjb25zdCBib2R5ID0gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gIHJlcy5zdGF0dXMocmVzcG9uc2Uuc3RhdHVzKS5zZW5kKGJvZHkpO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIGNhbGxlciBzaG91bGQgZG8gd2l0aCBhIHJlcXVlc3QsIGZyb20ge0BsaW5rIGdhdGVSZXF1ZXN0fS5cbiAqXG4gKiAgIC0gYHBhc3NgIC0gbm90IHR1bm5lbCB0cmFmZmljLCBvciBhbiBvcGVuIGxvZ2luIHJvdXRlLiBGb3J3YXJkIHVudG91Y2hlZC5cbiAqICAgLSBgYWxsb3dgIC0gdHVubmVsIHRyYWZmaWMgdGhhdCBpcyBhdXRob3JpemVkLiBUaGUgcmVxdWVzdCdzIGhlYWRlcnMgaGF2ZVxuICogICAgIEFMUkVBRFkgYmVlbiByZXdyaXR0ZW4gKHBvbGljeSBhcHBsaWVkLCBpZGVudGl0eSBpbmplY3RlZCwgc2Vzc2lvbiBjb29raWVcbiAqICAgICBzdHJpcHBlZCksIHNvIGZvcndhcmQgaXQgYXMgaXQgbm93IHN0YW5kcy5cbiAqICAgLSBgZGVueWAgLSB0dW5uZWwgdHJhZmZpYyB3aXRoIG5vIHZhbGlkIHNlc3Npb24uIEFuc3dlciBgNDAxYCB3aXRoXG4gKiAgICAge0BsaW5rIEFVVEhfUFJFRklYfSBhcyB0aGUgbG9naW4gcGF0aC5cbiAqL1xuZXhwb3J0IHR5cGUgR2F0ZUFjdGlvbiA9IFwicGFzc1wiIHwgXCJhbGxvd1wiIHwgXCJkZW55XCI7XG5cbi8qKlxuICogVEhFIGdhdGluZyBkZWNpc2lvbiwgZm9yIG9uZSByZXF1ZXN0LCBpbmRlcGVuZGVudCBvZiBob3cgaXQgd2lsbCBiZSBhbnN3ZXJlZC5cbiAqXG4gKiBCb3RoIHBhdGhzIGNhbGwgdGhpczogdGhlIEV4cHJlc3MgbWlkZGxld2FyZSBiZWxvdyAod2hlcmUgdGhlIGFwcCBpcyB0aGVcbiAqIHByb2Nlc3MpIGFuZCBgQGRieC10b29scy9jbGktdHVubmVsYCdzIHJldmVyc2UgcHJveHkgKHdoZXJlIHRoZSBhcHAgaXMgYSBjaGlsZFxuICogcHJvY2VzcyBvbiBhIHByaXZhdGUgcG9ydCkuIEEgZGl2ZXJnZW5jZSBiZXR3ZWVuIHRoZW0gd291bGQgYmUgYSBzZWN1cml0eSBidWdcbiAqIHRoZSBzZWNvbmQgcGF0aCBjb3VsZCBub3QgYmUgdGVzdGVkIGludG8gYWdyZWVtZW50IC0gb25lIHBhdGggZm9yZ2V0dGluZyB0b1xuICogc3RyaXAgYHgtZm9yd2FyZGVkLWFjY2Vzcy10b2tlbmAgaXMgZW5vdWdoIC0gc28gdGhlIGRlY2lzaW9uLCB0aGUgaGVhZGVyXG4gKiByZXdyaXRpbmcsIGFuZCB0aGUgaWRlbnRpdHkgaW5qZWN0aW9uIGxpdmUgaGVyZSBvbmNlIGFuZCB0aGUgdHJhbnNwb3J0cyBvbmx5XG4gKiBkaWZmZXIgaW4gaG93IHRoZXkgV1JJVEUgdGhlIG91dGNvbWUuXG4gKlxuICogTXV0YXRlcyBgcmVxLmhlYWRlcnNgIG9uIHRoZSBgYWxsb3dgL2BwYXNzYC13aXRoLWNvb2tpZSBwYXRocywgd2hpY2ggaXMgZXhhY3RseVxuICogd2hhdCBib3RoIGNhbGxlcnMgd2FudDogRXhwcmVzcyBoYW5kcyB0aGUgc2FtZSBvYmplY3QgdG8gdGhlIGFwcCdzIGhhbmRsZXJzLCBhbmRcbiAqIHRoZSBwcm94eSBmb3J3YXJkcyBpdCB1cHN0cmVhbS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdhdGVSZXF1ZXN0KFxuICByZXE6IEluY29taW5nTWVzc2FnZSxcbiAgb3B0aW9uczogR2F0ZU9wdGlvbnMgJiB7IGhlYWRlclBvbGljeT86IEhlYWRlclBvbGljeSB9LFxuKTogUHJvbWlzZTxHYXRlQWN0aW9uPiB7XG4gIGNvbnN0IHsgZ2F0ZSwgcHVibGljRG9tYWluIH0gPSBvcHRpb25zO1xuICAvLyBOb3QgdHVubmVsIHRyYWZmaWMgKHBsYXRmb3JtIGZyb250IGRvb3IsIG9yIGFueSBvdGhlciBsb2NhbCBjYWxsZXIpOiB0aGVcbiAgLy8gcmVxdWVzdCBpcyBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQsIG9yIGlzIG5vdCBvdXJzIHRvIGdhdGUuXG4gIGlmICghaXNUdW5uZWxIb3N0KHJlcSwgcHVibGljRG9tYWluKSkgcmV0dXJuIFwicGFzc1wiO1xuXG4gIGNvbnN0IHBhdGggPSAocmVxLnVybCA/PyBcIi9cIikuc3BsaXQoXCI/XCIpWzBdID8/IFwiL1wiO1xuICAvLyBUaGUgbG9naW4gZmxvdyBpcyBvcGVuIHNvIHRoZSBicm93c2VyIGNhbiByZW5kZXIgPEF1dGhHYXRlPiBhbmQgc2lnbiBpbi5cbiAgaWYgKHBhdGguc3RhcnRzV2l0aChBVVRIX1BSRUZJWCkpIHJldHVybiBcInBhc3NcIjtcblxuICAvLyBBbnRpLXNwb29mOiBvbmx5IHRoZSBnYXRlIG1heSBhc3NlcnQgaWRlbnRpdHkgb24gdHVubmVsIHRyYWZmaWMuXG4gIGNvbnN0IHBvbGljeSA9IG9wdGlvbnMuaGVhZGVyUG9saWN5ID8/IHRvSGVhZGVyUG9saWN5KG9wdGlvbnMuZm9yd2FyZEhlYWRlcnMpO1xuICBjb25zdCByZW1vdmVkID0gcG9saWN5LmFwcGx5KHJlcS5oZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgaWYgKHJlbW92ZWQubGVuZ3RoKSBsb2dnZXIuZGVidWcoXCJzdHJpcHBlZCBpbmJvdW5kIGhlYWRlcnNcIiwgeyByZW1vdmVkIH0pO1xuXG4gIGNvbnN0IGdhdGVQYXRocyA9IG9wdGlvbnMuZ2F0ZVBhdGhzID8/IFtdO1xuICAvLyBBIHBhdGggaXMgZ2F0ZWQgaWYgaXQgaXMgdW5kZXIgYC9hcGkvYCBvciBhbnkgY2FsbGVyLXN1cHBsaWVkIHByZWZpeCAoZS5nLlxuICAvLyBgL3dzYCBmb3IgYSBXZWJTb2NrZXQgYXBwKS5cbiAgY29uc3QgZ2F0ZWQgPVxuICAgIHBhdGguc3RhcnRzV2l0aChcIi9hcGkvXCIpIHx8XG4gICAgZ2F0ZVBhdGhzLnNvbWUoKHByZWZpeCkgPT4gcGF0aCA9PT0gcHJlZml4IHx8IHBhdGguc3RhcnRzV2l0aChgJHtwcmVmaXh9L2ApKTtcblxuICAvLyBBcHAtZ2F0aW5nIG1vZGU6IHdoZW4gYGdhdGVQYXRoc2AgaXMgc2V0IHRoZSBjYWxsZXIgaXMgZnJvbnRpbmcgYSB3aG9sZSBhcHBcbiAgLy8gKG5vdCBhIHNlbGYtcHJvdGVjdGluZyBTUEEpLCBzbyBhbiB1bmF1dGhlbnRpY2F0ZWQgdG9wLWxldmVsIGJyb3dzZXJcbiAgLy8gbmF2aWdhdGlvbiBpcyBkZW5pZWQgdG9vIOKAlCB0aGUgdHJhbnNwb3J0IGFuc3dlcnMgaXQgd2l0aCB0aGUgaG9zdGVkIGxvZ2luXG4gIC8vIHBhZ2UsIHB1dHRpbmcgc2lnbi1pbiBpbiBmcm9udCBvZiB0aGUgYXBwIGluc3RlYWQgb2YgbG9hZGluZyBpdHMgc2hlbGwgd2l0aFxuICAvLyBhIGRlYWQgZ2F0ZWQgcmVxdWVzdC4gTm9uLW5hdmlnYXRpb24gc3RhdGljIChhc3NldHMpIHN0aWxsIGxvYWRzIGZyZWVseSBzb1xuICAvLyB0aGUgbG9naW4gcGFnZSBhbmQgYXBwIGNhbiByZW5kZXIuXG4gIGNvbnN0IGFwcEdhdGluZyA9IGdhdGVQYXRocy5sZW5ndGggPiAwO1xuICBjb25zdCBtdXN0QXV0aCA9IGdhdGVkIHx8IChhcHBHYXRpbmcgJiYgd2FudHNMb2dpblBhZ2UocmVxKSk7XG4gIGlmICghbXVzdEF1dGgpIHtcbiAgICBzdHJpcFNlc3Npb25Db29raWUocmVxKTtcbiAgICByZXR1cm4gXCJwYXNzXCI7XG4gIH1cblxuICAvLyBBIGdhdGVkIHJlcXVlc3QgbmVlZHMgYSB2YWxpZCBCZXR0ZXIgQXV0aCBzZXNzaW9uLlxuICBjb25zdCBlbWFpbCA9IGF3YWl0IGdhdGUuc2Vzc2lvbih3ZWJIZWFkZXJzKHJlcSkpO1xuICBpZiAoIWVtYWlsKSByZXR1cm4gXCJkZW55XCI7XG4gIGluamVjdElkZW50aXR5KHJlcSwgZW1haWwpO1xuICBzdHJpcFNlc3Npb25Db29raWUocmVxKTtcbiAgcmV0dXJuIFwiYWxsb3dcIjtcbn1cblxuLyoqIFRoZSBib2R5IG9mIGEgYGRlbnlgLCBzaGFyZWQgc28gYm90aCBwYXRocyBhbnN3ZXIgYSA0MDEgaWRlbnRpY2FsbHkuICovXG5leHBvcnQgY29uc3QgVU5BVVRIT1JJWkVEX0JPRFkgPSB7XG4gIGVycm9yOiBcImF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkXCIsXG4gIGxvZ2luUGF0aDogQVVUSF9QUkVGSVgsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFdoZXRoZXIgYSBkZW5pZWQgcmVxdWVzdCBpcyBhIHRvcC1sZXZlbCBCUk9XU0VSIE5BVklHQVRJT04gdGhhdCBzaG91bGQgYmVcbiAqIGFuc3dlcmVkIHdpdGggdGhlIGhvc3RlZCBsb2dpbiBwYWdlIHJhdGhlciB0aGFuIGEgNDAxLlxuICpcbiAqIEFuIGFwcCBmcm9udGVkIGJ5IHRoZSBnYXRlICh2aWEgYGdhdGVQYXRoc2ApIG1heSBzZXJ2ZSBpdHMgb3duIEhUTUwgZnJvbSBhblxuICogdW5nYXRlZCBwYXRoIHdoaWxlIGl0cyBwcml2aWxlZ2VkIHN1cmZhY2UgKGAvd3NgLCBgL2FwaWApIGlzIGdhdGVkLiBBIGJyb3dzZXJcbiAqIG5hdmlnYXRpbmcgdG8gaXQgd291bGQgb3RoZXJ3aXNlIGxvYWQgdGhlIGFwcCBzaGVsbCBhbmQgb25seSBzZWUgdGhlIGdhdGVkXG4gKiByZXF1ZXN0IGZhaWwsIHdpdGggbm8gd2F5IHRvIHNpZ24gaW4uIFNlcnZpbmcgdGhlIGxvZ2luIHBhZ2Ugb24gdGhlIG5hdmlnYXRpb25cbiAqIGl0c2VsZiBwdXRzIHNpZ24taW4gaW4gZnJvbnQgb2YgdGhlIGFwcC4gQXBwbGllcyBvbmx5IHRvIEdFVCByZXF1ZXN0cyB0aGF0XG4gKiBhY2NlcHQgSFRNTCBhbmQgYXJlIG5vdCBhc2tpbmcgZm9yIHRoZSBsb2dpbiBBUEkgb3IgYW4gYXNzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YW50c0xvZ2luUGFnZShyZXE6IEluY29taW5nTWVzc2FnZSk6IGJvb2xlYW4ge1xuICBjb25zdCBtZXRob2QgPSAocmVxLm1ldGhvZCA/PyBcIkdFVFwiKS50b1VwcGVyQ2FzZSgpO1xuICBpZiAobWV0aG9kICE9PSBcIkdFVFwiICYmIG1ldGhvZCAhPT0gXCJIRUFEXCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcGF0aCA9IChyZXEudXJsID8/IFwiL1wiKS5zcGxpdChcIj9cIilbMF0gPz8gXCIvXCI7XG4gIGlmIChwYXRoLnN0YXJ0c1dpdGgoQVVUSF9QUkVGSVgpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGFjY2VwdCA9IFN0cmluZyhyZXEuaGVhZGVycy5hY2NlcHQgPz8gXCJcIik7XG4gIHJldHVybiBhY2NlcHQuaW5jbHVkZXMoXCJ0ZXh0L2h0bWxcIik7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIGxvZ2luIHJvdXRlcyBhbmQgdGhlIGdhdGluZyBtaWRkbGV3YXJlIG9uIHRoZSBhcHAncyBFeHByZXNzXG4gKiBpbnN0YW5jZS4gQ2FsbGVkIGZyb20ge0BsaW5rIEF1dGhHYXRlUGx1Z2lufSB3aXRoIHRoZSByb3V0ZXIgQXBwS2l0IGhhbmRzXG4gKiBgaW5qZWN0Um91dGVzYCwgcGx1cyBgdGhpcy5jb250ZXh0LmFkZE1pZGRsZXdhcmVgIGZvciB0aGUgZ2xvYmFsIGdhdGUuXG4gKlxuICogYGFkZFJvdXRlYC9gYWRkTWlkZGxld2FyZWAgYXJlIHVzZWQgKHZpYSB0aGUgcGFzc2VkIGNhbGxiYWNrcykgYmVjYXVzZSB0aGUgbG9naW5cbiAqIHJvdXRlcyBsaXZlIGF0IGFuIEFCU09MVVRFIHBhdGggKGAvYXBpL2VtYWlsL2F1dGgvKmAsIHRoZSBjbGllbnQncyBjb250cmFjdCksXG4gKiBub3QgdW5kZXIgdGhlIHBsdWdpbidzIGAvYXBpL2F1dGhHYXRlYCBiYXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW91bnRHYXRlKFxuICBvcHRzOiBHYXRlT3B0aW9ucyxcbiAgX2FkZFJvdXRlOiAobWV0aG9kOiBcImdldFwiIHwgXCJwb3N0XCIsIHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpID0+IHZvaWQsXG4gIGFkZE1pZGRsZXdhcmU6IChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGNvbnN0IHsgZ2F0ZSwgcHVibGljRG9tYWluLCBmb3J3YXJkSGVhZGVycywgZ2F0ZVBhdGhzLCBicmFuZE5hbWUgfSA9IG9wdHM7XG4gIGNvbnN0IGhlYWRlclBvbGljeSA9IHRvSGVhZGVyUG9saWN5KGZvcndhcmRIZWFkZXJzKTtcbiAgbG9nZ2VyLmRlYnVnKFwiZ2F0ZSBtb3VudGVkXCIsIHsgcHVibGljRG9tYWluLCBmb3J3YXJkOiBoZWFkZXJQb2xpY3kucGF0dGVybnMsIGdhdGVQYXRocyB9KTtcblxuICAvLyBCZXR0ZXIgQXV0aCBhbmQgdGhlIGNvbXBhdGliaWxpdHkgcm91dGVzIHNoYXJlIG9uZSBmZXRjaC1jb21wYXRpYmxlXG4gIC8vIGhhbmRsZXIgaW4gYm90aCBob3N0aW5nIG1vZGVzLlxuICBjb25zdCBhdXRoSGFuZGxlciA9IChhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBpZiAoIWlzVHVubmVsSG9zdChyZXEsIHB1YmxpY0RvbWFpbikpIHtcbiAgICAgIGNvbnN0IHBhdGggPSAocmVxLnVybCA/PyBcIi9cIikuc3BsaXQoXCI/XCIpWzBdID8/IFwiL1wiO1xuICAgICAgaWYgKHBhdGguZW5kc1dpdGgoXCIvc3RhdHVzXCIpKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgYXV0aGVudGljYXRlZDogZmFsc2UsIGVuYWJsZWQ6IGZhbHNlLCBwYXNza2V5c0VuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogXCJub3QgZm91bmRcIiB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgc2VuZFdlYlJlc3BvbnNlKHJlcywgYXdhaXQgZ2F0ZS5oYW5kbGVyKGF3YWl0IHdlYlJlcXVlc3QocmVxKSkpO1xuICB9KSBhcyBSZXF1ZXN0SGFuZGxlcjtcbiAgYWRkTWlkZGxld2FyZShBVVRIX1BSRUZJWCwgYXV0aEhhbmRsZXIpO1xuXG4gIC8vIC0tLSBUaGUgZ2F0ZSBtaWRkbGV3YXJlIChydW5zIGJlZm9yZSBzdGF0aWMgKyB0aGUgYXBwJ3MgL2FwaSBoYW5kbGVycykgLS0tXG5cbiAgY29uc3QgZ2F0ZU1pZGRsZXdhcmUgPSAoYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgY29uc3QgYWN0aW9uID0gYXdhaXQgZ2F0ZVJlcXVlc3QocmVxLCB7IGdhdGUsIHB1YmxpY0RvbWFpbiwgaGVhZGVyUG9saWN5LCBnYXRlUGF0aHMgfSk7XG4gICAgaWYgKGFjdGlvbiA9PT0gXCJkZW55XCIgJiYgd2FudHNMb2dpblBhZ2UocmVxKSkge1xuICAgICAgcmVzLnN0YXR1cyg0MDEpLnR5cGUoXCJodG1sXCIpLnNlbmQobG9naW5QYWdlSHRtbCh7IGJyYW5kTmFtZTogYnJhbmROYW1lID8/IFwiRGF0YWJyaWNrcyBBcHBcIiB9KSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09IFwiZGVueVwiKSByZXMuc3RhdHVzKDQwMSkuanNvbihVTkFVVEhPUklaRURfQk9EWSk7XG4gICAgZWxzZSBuZXh0KCk7XG4gIH0pIGFzIFJlcXVlc3RIYW5kbGVyO1xuXG4gIGFkZE1pZGRsZXdhcmUoXCIvXCIsIGdhdGVNaWRkbGV3YXJlKTtcbn1cbiJdfQ==
package/lib/src/plugin.js CHANGED
@@ -226,6 +226,7 @@ export class AuthGatePlugin extends Plugin {
226
226
  publicDomain: this.resolved.publicDomains,
227
227
  forwardHeaders: this.resolved.forwardHeaders,
228
228
  gatePaths: this.resolved.gatePaths,
229
+ brandName: this.resolved.brandName,
229
230
  });
230
231
  }
231
232
  /** The code sender: the configured `sendCode`, else the shared-transport default. */
@@ -261,4 +262,4 @@ function authOrigin(publicDomain) {
261
262
  }
262
263
  /** Factory: `authGate({ allow, subject, ... })` for an AppKit `plugins` array. */
263
264
  export const authGate = toPlugin(AuthGatePlugin);
264
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEVBSVIsWUFBWSxHQUNiLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sSUFBSSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsSUFBSSxJQUFJLGdCQUFnQixFQUN4QixPQUFPLElBQUksV0FBVyxHQUt2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxXQUFXLENBQUM7QUFDeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsSUFBSSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFjekMsU0FBUyxpQkFBaUIsQ0FBQyxPQUF5QjtJQUNsRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FDb0IsQ0FBQztJQUNyRSxNQUFNLFdBQVcsR0FBRyxNQUFNLEVB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QUFDLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUNuRixLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7U0FDbkQsQ0FBQztJQUNKLENBQUM7O0FBR0gsU0FBUyxVQUFVLENBQUMsWUFBcUI7SUFDdkMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sa0JBQWtCLENBQUM7SUFDdEMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUM7SUFDbEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ2pELENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYGF1dGhHYXRlKClgIC0gdGhlIEFwcEtpdCBhZGFwdGVyIGFyb3VuZCBgQGRieC10b29scy9hdXRoYC5cbiAqXG4gKiBJdCBoYXMgTk8gcm91dGVzIG9mIGl0cyBvd246IHRoZSB0dW5uZWwgUFJPWFkgKG5vdCBhbiBIVFRQIHNlcnZlcikgY2FsbHMgdGhlXG4gKiBoYW5kbGVycyB0aGlzIHBsdWdpbiBleHBvc2VzIHZpYSB7QGxpbmsgQXV0aEdhdGVQbHVnaW4uZXhwb3J0c30uIFRoZSBwbHVnaW5cbiAqIG93bnMgdHVubmVsIGF1dGhvcml6YXRpb24sIEFwcEtpdCBMYWtlYmFzZSBkaXNjb3ZlcnksIGVtYWlsIGRlbGl2ZXJ5LCBhbmRcbiAqIHRyYW5zcG9ydCBtb3VudGluZy4gQmV0dGVyIEF1dGggb3ducyB1c2VycywgT1RQcywgc2Vzc2lvbnMsIHJhdGUgbGltaXRzLCBhbmRcbiAqIHBhc3NrZXlzLiBgY3JlYXRlQXBwYCBjYW4gcnVuIHRoaXMgcGx1Z2luIHdpdGggb3Igd2l0aG91dCBgc2VydmVyKClgLlxuICpcbiAqIE9wdGlvbnMgY29tZSBmcm9tIENMSSBmbGFncyBPUiBlbnYsIHdpdGggc2Vuc2libGUgZGVmYXVsdHMgLSBzZWVcbiAqIHtAbGluayByZXNvbHZlQXV0aEdhdGVDb25maWd9LiBUaGUgb25lIHJ1bnRpbWUgZGVwZW5kZW5jeSB0aGUgcGx1Z2luIGNhbid0XG4gKiByZXNvbHZlIGl0c2VsZiBpcyBIT1cgdG8gZW1haWwgdGhlIGNvZGUsIHNvIGl0IHRha2VzIGEgYHNlbmRDb2RlYCBjYWxsYmFjayB0aGVcbiAqIGFwcCB3aXJlcyB0byB0aGUgZW1haWwgcGx1Z2luLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBsYWtlYmFzZSxcbiAgUGx1Z2luLFxuICB0b1BsdWdpbixcbiAgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxuICB0eXBlIFJlc291cmNlUmVxdWlyZW1lbnQsXG4gIFJlc291cmNlVHlwZSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgcGx1Z2luIGFzIGFwcGtpdFBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgYXV0aCBhcyBwYXNzd29yZGxlc3NBdXRoLFxuICBzdG9yYWdlIGFzIGF1dGhTdG9yYWdlLFxuICB0eXBlIEF1dGhvcml6ZUlkZW50aXR5LFxuICB0eXBlIEF1dGhTdG9yYWdlQ29uZmlnLFxuICB0eXBlIEF1dGhTdG9yYWdlTW9kZSxcbiAgdHlwZSBQYXNzd29yZGxlc3NBdXRoUnVudGltZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXV0aFwiO1xuaW1wb3J0IHsgY29uZmlnIGFzIGNvcmVDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhTdGF0dXMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtYXV0aFwiO1xuaW1wb3J0IHsgYnJhbmQsIGxvZywgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdEhhbmRsZXIgfSBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHsgVFVOTkVMX0NPTkZJRyB9IGZyb20gXCIuL19jb25maWcudHNcIjtcbmltcG9ydCB7IGxvb2tzTGlrZUVtYWlsLCBtYXRjaGVzQWxsb3dsaXN0IH0gZnJvbSBcIi4vYWxsb3dsaXN0LnRzXCI7XG5pbXBvcnQgeyBtb3VudEdhdGUsIHR5cGUgR2F0ZU9wdGlvbnMgfSBmcm9tIFwiLi9nYXRlLnRzXCI7XG5pbXBvcnQgeyBlbnN1cmVFbWFpbEF2YWlsYWJsZSwgc2VuZENvZGUgYXMgZGVmYXVsdFNlbmRDb2RlIH0gZnJvbSBcIi4vc2VuZC1jb2RlLnRzXCI7XG5pbXBvcnQgeyBLRVlfVFRMX1NFQ09ORFMsIHJlc29sdmVTZXNzaW9uQ3V0b2ZmLCBzaWduaW5nS2V5IH0gZnJvbSBcIi4vc2lnbmluZy1rZXkudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInR1bm5lbDphdXRoXCIpO1xuXG5pbnRlcmZhY2UgR2F0ZVNlcnZlckFwcGxpY2F0aW9uIHtcbiAgZ2V0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB1bmtub3duO1xuICBwb3N0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB1bmtub3duO1xuICB1c2UocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHVua25vd247XG59XG5cbmludGVyZmFjZSBHYXRlTW91bnRDb250ZXh0IHtcbiAgYWRkUm91dGUobWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB2b2lkO1xuICBhZGRNaWRkbGV3YXJlKHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB2b2lkO1xuICBnZXRQbHVnaW5zKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgdW5rbm93bj47XG59XG5cbmZ1bmN0aW9uIHNlcnZlckFwcGxpY2F0aW9uKGNvbnRleHQ6IEdhdGVNb3VudENvbnRleHQpOiBHYXRlU2VydmVyQXBwbGljYXRpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBzZXJ2ZXIgPSBjb250ZXh0LmdldFBsdWdpbnMoKS5nZXQoXCJzZXJ2ZXJcIikgYXNcbiAgICB7IHNlcnZlckFwcGxpY2F0aW9uPzogUGFydGlhbDxHYXRlU2VydmVyQXBwbGljYXRpb24+IH0gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGFwcGxpY2F0aW9uID0gc2VydmVyPy5zZXJ2ZXJBcHBsaWNhdGlvbjtcbiAgcmV0dXJuIGFwcGxpY2F0aW9uICYmXG4gICAgdHlwZW9mIGFwcGxpY2F0aW9uLmdldCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIGFwcGxpY2F0aW9uLnBvc3QgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiBhcHBsaWNhdGlvbi51c2UgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gKGFwcGxpY2F0aW9uIGFzIEdhdGVTZXJ2ZXJBcHBsaWNhdGlvbilcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vdW50R2F0ZU9uQ29udGV4dChjb250ZXh0OiBHYXRlTW91bnRDb250ZXh0LCBvcHRpb25zOiBHYXRlT3B0aW9ucyk6IHZvaWQge1xuICBjb25zdCBhcHBsaWNhdGlvbiA9IHNlcnZlckFwcGxpY2F0aW9uKGNvbnRleHQpO1xuICBpZiAoYXBwbGljYXRpb24pIHtcbiAgICBtb3VudEdhdGUoXG4gICAgICBvcHRpb25zLFxuICAgICAgKG1ldGhvZCwgcGF0aCwgaGFuZGxlcikgPT4gYXBwbGljYXRpb25bbWV0aG9kXShwYXRoLCBoYW5kbGVyKSxcbiAgICAgIChwYXRoLCBoYW5kbGVyKSA9PiBhcHBsaWNhdGlvbi51c2UocGF0aCwgaGFuZGxlciksXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbW91bnRHYXRlKFxuICAgIG9wdGlvbnMsXG4gICAgKG1ldGhvZCwgcGF0aCwgaGFuZGxlcikgPT4gY29udGV4dC5hZGRSb3V0ZShtZXRob2QsIHBhdGgsIGhhbmRsZXIpLFxuICAgIChwYXRoLCBoYW5kbGVyKSA9PiBjb250ZXh0LmFkZE1pZGRsZXdhcmUocGF0aCwgaGFuZGxlciksXG4gICk7XG59XG5cbi8qKiBPcHRpb25zIGZvciB0aGUge0BsaW5rIGF1dGhHYXRlfSBwbHVnaW4gKGFsbCByZXNvbHZhYmxlIGZyb20gZW52IC0gc2VlIGJlbG93KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdhdGVDb25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnLCBBdXRoU3RvcmFnZUNvbmZpZyB7XG4gIC8qKiBBbGxvdy1saXN0IHBhdHRlcm5zIChkb21haW4gLyBnbG9iIC8gYC9yZWdleC9gKS4gRW1wdHkgPSBhbGxvdyBub2JvZHkuIEVudiBUVU5ORUxfQVVUSF9BTExPVy4gKi9cbiAgYWxsb3c/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFN1YmplY3QgbGluZSBmb3IgdGhlIGNvZGUgZW1haWwuIEVudiBUVU5ORUxfQVVUSF9TVUJKRUNULlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBcIllvdXIgdmVyaWZpY2F0aW9uIGNvZGVcIi4gVGhlIHdvcmRpbmcgb2YgdGhlIHN1YmplY3QgYW5kXG4gICAqIHtAbGluayBtZXNzYWdlfSBpcyBkZWxpYmVyYXRlbHkgdGhlIGNvbnZlbnRpb25hbCBwaHJhc2luZyByYXRoZXIgdGhhblxuICAgKiBhbnl0aGluZyBicmFuZGVkOiBpT1MsIEdtYWlsLCBPdXRsb29rLCBhbmQgQW5kcm9pZCBhbGwgZGV0ZWN0IGEgb25lLXRpbWVcbiAgICogY29kZSBmcm9tIHRoaXMgc2hhcGUgYW5kIG9mZmVyIHRvIGF1dG9maWxsIGl0LCBhbmQgYSBub3ZlbCBwaHJhc2luZyBpcyB3aGF0XG4gICAqIGJyZWFrcyB0aGF0IGRldGVjdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgc3ViamVjdCBURU1QTEFURSwgbm90IHRoZSBsaXRlcmFsIGxpbmUgc2VudDogdGhlIGNvZGUgaXMgc3BsaWNlZFxuICAgKiBpbnRvIGl0IChgXCIxMjM0NTYgaXMgeW91ciB2ZXJpZmljYXRpb24gY29kZVwiYCkgYmVjYXVzZSBhIHB1c2ggbm90aWZpY2F0aW9uXG4gICAqIHNob3dzIG9ubHkgdGhlIHN1YmplY3QgYW5kIHByZWhlYWRlciwgYW5kIHRoYXQgbm90aWZpY2F0aW9uIGlzIHdoYXQgbW9iaWxlXG4gICAqIGF1dG9maWxsIHJlYWRzLiBTZWUgYGNvZGVFbWFpbFN1YmplY3RgIGluIGAuL2NvZGUtZW1haWwudHNgLlxuICAgKi9cbiAgc3ViamVjdD86IHN0cmluZztcbiAgLyoqXG4gICAqIERpc3BsYXkgbmFtZSB1c2VkIGluIHRoZSBjb2RlIGVtYWlsIGNvcHkuIEVudiBUVU5ORUxfQVVUSF9CUkFORF9OQU1FLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0aGUgYnJhbmQgY29udGV4dCdzIGBuYW1lYCAtIHRoZSBhcHAncyBvd24gYGJyYW5kaW5nL2JyYW5kLnlhbWxgXG4gICAqIHdoZW4gaXQgaGFzIG9uZSwgZWxzZSB0aGUgZGJ4LXRvb2xzIGRlZmF1bHQuIFNldCB0aGlzIG9ubHkgdG8gb3ZlcnJpZGUgdGhlXG4gICAqIGJyYW5kIGZvciB0aGlzIGdhdGUuXG4gICAqL1xuICBicmFuZE5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMaW5lIHNob3duIGltbWVkaWF0ZWx5IGFib3ZlIHRoZSBjb2RlIGluIHRoZSBlbWFpbC4gRW52IFRVTk5FTF9BVVRIX01FU1NBR0UuXG4gICAqXG4gICAqIEtlZXAgdGhlIGNvZGUgb24gaXRzIE9XTiBsaW5lIGRpcmVjdGx5IGFmdGVyIHRoaXMgdGV4dCAtIHRoYXQgYWRqYWNlbmN5IGlzXG4gICAqIHdoYXQgdGhlIHBsYXRmb3JtIGNvZGUtZGV0ZWN0aW9uIGhldXJpc3RpY3Mga2V5IG9uLlxuICAgKi9cbiAgbWVzc2FnZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFNlc3Npb24gbGlmZXRpbWUgKHNlY29uZHMpLiBFbnYgVFVOTkVMX0FVVEhfU0VTU0lPTl9UVEwuIERlZmF1bHQgMjU5MjAwMCAoMzBkKS5cbiAgICpcbiAgICogTWF0Y2hlZCB0byB0aGUgY2FjaGUtYmFja2VkIHNpZ25pbmcga2V5J3Mgb3duIDMwLWRheSBUVEwgKHNlZVxuICAgKiBgLi9zaWduaW5nLWtleS50c2ApOiB0aGUgY29va2llIGFuZCB0aGUga2V5IHRoYXQgdmFsaWRhdGVzIGl0IHNob3VsZCBleHBpcmVcbiAgICogdG9nZXRoZXIsIG9yIG9uZSBzaWxlbnRseSBvdXRsaXZlcyB0aGUgb3RoZXIuXG4gICAqL1xuICBzZXNzaW9uVHRsU2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIE9uZS10aW1lLWNvZGUgbGlmZXRpbWUgKHNlY29uZHMpLiBFbnYgVFVOTkVMX0FVVEhfQ09ERV9UVEwuIERlZmF1bHQgNjAwICgxMG0pLiAqL1xuICBjb2RlVHRsU2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIE1heCB2ZXJpZnkgYXR0ZW1wdHMgcGVyIGlzc3VlZCBjb2RlLiBEZWZhdWx0IDUuICovXG4gIG1heEF0dGVtcHRzPzogbnVtYmVyO1xuICAvKipcbiAgICogRm9yY2UtY2xlYXIgY3V0b2ZmOiBldmVyeSBzZXNzaW9uIGlzc3VlZCBCRUZPUkUgaXQgc3RvcHMgdmVyaWZ5aW5nLCBzbyBtb3ZpbmdcbiAgICogaXQgZm9yd2FyZCBzaWducyBldmVyeW9uZSBvdXQuIEVudiBUVU5ORUxfQVVUSF9TRVNTSU9OX0NVVE9GRi5cbiAgICpcbiAgICogQW55dGhpbmcgYG9iamVjdC50b0RhdGVgIGFjY2VwdHM6IGEgYERhdGVgLCBgMjAyNi0wOC0wMmAsIGFuIElTTyBpbnN0YW50LFxuICAgKiBlcG9jaCBzZWNvbmRzL21pbGxpcywgb3IgYSByZWxhdGl2ZSBkdXJhdGlvbiAoYC0zMGRgLCBgNyBkYXlzIGFnb2ApLiBVbnNldFxuICAgKiBtZWFucyBubyBjdXRvZmYuXG4gICAqL1xuICBzZXNzaW9uQ3V0b2ZmPzogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZTtcbiAgLyoqXG4gICAqIFNhbWUtb3JpZ2luIHBhdGggcmV0dXJuZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGxvZ291dC4gRW52XG4gICAqIGBUVU5ORUxfQVVUSF9MT0dPVVRfUkVESVJFQ1RgLiBEZWZhdWx0cyB0byBgL2AsIHdoZXJlIHRoZSBBdXRoR2F0ZSBwcmVzZW50c1xuICAgKiBsb2dpbiBhZ2Fpbi5cbiAgICovXG4gIGxvZ291dFJlZGlyZWN0UGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIERlbGl2ZXIgYSBjb2RlIHRvIGFuIGFkZHJlc3MuIERlZmF1bHRzIHRvIHNlbmRpbmcgdGhyb3VnaCB0aGUgaG9zdCBhcHAnc1xuICAgKiBzaGFyZWQgYEBkYngtdG9vbHMvZW1haWxgIHRyYW5zcG9ydCAoc2VlIGAuL3NlbmQtY29kZWApOyBvdmVycmlkZSB0byB3aXJlIGFcbiAgICogZGlmZmVyZW50IGRlbGl2ZXJ5IHBhdGguXG4gICAqL1xuICBzZW5kQ29kZT86IChlbWFpbDogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIG9wdHM6IFNlbmRDb2RlT3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIElkZW50aXR5IGF1dGhvcml6YXRpb24gaW5kZXBlbmRlbnQgb2YgYXV0aGVudGljYXRpb24uIERlZmF1bHRzIHRvIHRoZVxuICAgKiBjb25maWd1cmVkIGFsbG93LWxpc3QgYW5kIGlzIHJlLWV2YWx1YXRlZCBmb3IgZXZlcnkgYWNjZXB0ZWQgc2Vzc2lvbi5cbiAgICovXG4gIGF1dGhvcml6ZUlkZW50aXR5PzogQXV0aG9yaXplSWRlbnRpdHk7XG4gIC8qKlxuICAgKiBUaGUgcHVibGljIGA8c3ViZG9tYWluPi48c2VydmVyPmAgdGhhdCBpZGVudGlmaWVzIHBvcnRyIHRyYWZmaWMgYnkgaXRzIGBIb3N0YFxuICAgKiBoZWFkZXIuIE9ubHkgcmVxdWVzdHMgd2hvc2UgYEhvc3RgIG1hdGNoZXMgdGhpcyBhcmUgZ2F0ZWQ7IGV2ZXJ5dGhpbmcgZWxzZVxuICAgKiAodGhlIHBsYXRmb3JtIGZyb250IGRvb3IsIG90aGVyIGxvY2FsIGNhbGxlcnMpIHBhc3NlcyB0aHJvdWdoLiBFbnZcbiAgICogYFRVTk5FTF9QVUJMSUNfRE9NQUlOYC4gV2hlbiBhYnNlbnQsIHRoZSBnYXRlIGlzIGluZXJ0IChub3RoaW5nIGlzIHR1bm5lbFxuICAgKiB0cmFmZmljKS5cbiAgICovXG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgLyoqIEFkZGl0aW9uYWwgcHVibGljIHR1bm5lbCBkb21haW5zIGFjY2VwdGVkIGJ5IHRoZSBnYXRlLiAqL1xuICBwdWJsaWNEb21haW5zPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBFeHRyYSBgeC1gIHJlcXVlc3QgaGVhZGVycyB0dW5uZWwgdHJhZmZpYyBtYXkgZm9yd2FyZCAobGl0ZXJhbCAvIGdsb2IgL1xuICAgKiBgL3JlZ2V4L2ApLCB1bmlvbmVkIHdpdGggdGhlIGJ1aWx0LWluIGFsbG93LWxpc3QuIEVudiBgVFVOTkVMX0ZPUldBUkRfSEVBREVSU2AuXG4gICAqL1xuICBmb3J3YXJkSGVhZGVycz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogUGF0aCBwcmVmaXhlcyB0byBnYXRlIGJleW9uZCB0aGUgYnVpbHQtaW4gYC9hcGkvYCAobGl0ZXJhbCBwcmVmaXhlcywgY29tbWEtXG4gICAqIG9yIHNwYWNlLXNlcGFyYXRlZCBhcyBhIHN0cmluZykuIEZvciBhbiBhcHAgd2hvc2UgcHJpdmlsZWdlZCBzdXJmYWNlIGlzIG5vdFxuICAgKiB1bmRlciBgL2FwaS9gIOKAlCBlLmcuIGEgV2ViU29ja2V0IGF0IGAvd3NgIOKAlCBsaXN0IHRob3NlIHByZWZpeGVzIHNvIHRoZXlcbiAgICogcmVxdWlyZSBhIHNlc3Npb24gdG9vLiBFbnYgYFRVTk5FTF9HQVRFX1BBVEhTYC5cbiAgICovXG4gIGdhdGVQYXRocz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogUnVuIE9QRU4gd2l0aCBubyBnYXRlIChlbnYgYFRVTk5FTF9JTlNFQ1VSRT10cnVlYCkuIFRoZSBsb2dpbiByb3V0ZXMgYW5kIGdhdGVcbiAgICogbWlkZGxld2FyZSBhcmUgbm90IG1vdW50ZWQsIGFuZCB0aGUgU01UUCBmYWlsLWZhc3QgaXMgc2tpcHBlZC4gVXNlIG9ubHkgd2hlblxuICAgKiB0aGUgdHVubmVsIGlzIGRlbGliZXJhdGVseSBwdWJsaWMuXG4gICAqL1xuICBpbnNlY3VyZT86IGJvb2xlYW47XG59XG5cbi8qKiBCcmFuZGluZy9tZXNzYWdpbmcgcGFzc2VkIHRvIHtAbGluayBBdXRoR2F0ZUNvbmZpZy5zZW5kQ29kZX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRDb2RlT3B0aW9ucyB7XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYnJhbmROYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqXG4gICAqIExpZmV0aW1lIG9mIHRoZSBjb2RlIGJlaW5nIHNlbnQsIGluIHNlY29uZHMgLSB0aGUgUkVTT0xWRURcbiAgICoge0BsaW5rIEF1dGhHYXRlQ29uZmlnLmNvZGVUdGxTZWNvbmRzfSwgc28gdGhlIGVtYWlsIGNhbiBzdGF0ZSB0aGUgcmVhbFxuICAgKiBleHBpcnkgKFwiVGhpcyBjb2RlIGV4cGlyZXMgaW4gMTAgbWludXRlc1wiKSBpbnN0ZWFkIG9mIGEgdmFndWUgXCJzaG9ydGx5XCJcbiAgICogdGhhdCBkcmlmdHMgZnJvbSB0aGUgY29uZmlndXJlZCBUVEwuXG4gICAqL1xuICBjb2RlVHRsU2Vjb25kczogbnVtYmVyO1xufVxuXG4vKiogUmVzb2x2ZWQgZ2F0ZSBjb25maWcgd2l0aCBlbnYgZmFsbGJhY2tzICsgZGVmYXVsdHMgYXBwbGllZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRBdXRoR2F0ZUNvbmZpZyB7XG4gIGFsbG93OiBzdHJpbmdbXTtcbiAgc3ViamVjdDogc3RyaW5nO1xuICBicmFuZE5hbWU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzZXNzaW9uVHRsU2Vjb25kczogbnVtYmVyO1xuICBjb2RlVHRsU2Vjb25kczogbnVtYmVyO1xuICBtYXhBdHRlbXB0czogbnVtYmVyO1xuICAvKiogRm9yY2UtY2xlYXIgY3V0b2ZmIGluIGVwb2NoIG1zOyBgMGAgd2hlbiB1bnNldC4gKi9cbiAgc2Vzc2lvbkN1dG9mZk1zOiBudW1iZXI7XG4gIC8qKiBTYW1lLW9yaWdpbiBwYXRoIHJldHVybmVkIGFmdGVyIGxvZ291dC4gKi9cbiAgbG9nb3V0UmVkaXJlY3RQYXRoOiBzdHJpbmc7XG4gIC8qKiBQcmltYXJ5IHB1YmxpYyBkb21haW47IGB1bmRlZmluZWRgIHdoZW4gUG9ydHIgaXMgbm90IGNvbmZpZ3VyZWQuICovXG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgLyoqIEFsbCBwdWJsaWMgdHVubmVsIGRvbWFpbnMgYWNjZXB0ZWQgYnkgdGhlIGdhdGUuICovXG4gIHB1YmxpY0RvbWFpbnM6IHN0cmluZ1tdO1xuICAvKiogRXh0cmEgYHgtYCBoZWFkZXJzIHR1bm5lbCB0cmFmZmljIG1heSBmb3J3YXJkICh1bmlvbmVkIHdpdGggdGhlIGRlZmF1bHRzKS4gKi9cbiAgZm9yd2FyZEhlYWRlcnM6IHN0cmluZ1tdO1xuICAvKiogUGF0aCBwcmVmaXhlcyB0byBnYXRlIGJleW9uZCBgL2FwaS9gIChlLmcuIGAvd3NgKS4gKi9cbiAgZ2F0ZVBhdGhzOiBzdHJpbmdbXTtcbiAgLyoqIFJ1biBPUEVOIHdpdGggbm8gZ2F0ZS4gKi9cbiAgaW5zZWN1cmU6IGJvb2xlYW47XG4gIHN0b3JhZ2U6IEF1dGhTdG9yYWdlTW9kZTtcbiAgc3FsaXRlUGF0aD86IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVFMgPSB7XG4gIHN1YmplY3Q6IFwiWW91ciB2ZXJpZmljYXRpb24gY29kZVwiLFxuICAvLyBUaGUgcmVwby13aWRlIGJyYW5kIGNvbnRleHQncyBkaXNwbGF5IG5hbWUsIE5PVCBhIGhhcmRjb2RlZCBwcm9kdWN0IHN0cmluZzpcbiAgLy8gdGhpcyBuYW1lIGlzIHdoYXQgdGhlIHJlY2lwaWVudCByZWFkcyBpbiB0aGUgY29kZSBlbWFpbCwgc28gaXQgaGFzIHRvIGJlIHRoZVxuICAvLyBzYW1lIGlkZW50aXR5IHRoZSByZXN0IG9mIHRoZSBhcHAgcHJlc2VudHMuIEEgaG9zdCB3aXRoIGl0cyBvd25cbiAgLy8gYGJyYW5kaW5nL2JyYW5kLnlhbWxgIG92ZXJyaWRlcyBpdCBieSBwYXNzaW5nIGBicmFuZE5hbWVgOyB0aGUgc2hhcmVkIGRlZmF1bHRcbiAgLy8gaXMgdGhlIGZhbGxiYWNrIHdoZW4gbm90aGluZyBpcyBjb25maWd1cmVkLlxuICBicmFuZE5hbWU6IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQubmFtZSxcbiAgbWVzc2FnZTogXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlIGlzOlwiLFxuICAvLyAzMCBkYXlzLCB0aGUgc2FtZSB3aW5kb3cgdGhlIGNhY2hlLWJhY2tlZCBzaWduaW5nIGtleSBpcyBzdG9yZWQgZm9yLlxuICBzZXNzaW9uVHRsU2Vjb25kczogS0VZX1RUTF9TRUNPTkRTLFxuICBjb2RlVHRsU2Vjb25kczogNjAwLFxuICBtYXhBdHRlbXB0czogNSxcbiAgbG9nb3V0UmVkaXJlY3RQYXRoOiBcIi9cIixcbn07XG5cbi8qKiBNZXJnZSB7QGxpbmsgQXV0aEdhdGVDb25maWd9IG92ZXIgZW52IG92ZXIgZGVmYXVsdHMgaW50byBhIHJlc29sdmVkIGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXV0aEdhdGVDb25maWcoY29uZmlnOiBBdXRoR2F0ZUNvbmZpZyk6IFJlc29sdmVkQXV0aEdhdGVDb25maWcge1xuICBjb25zdCBzdG9yYWdlID0gYXV0aFN0b3JhZ2UucmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKHtcbiAgICBzdG9yYWdlOlxuICAgICAgY29uZmlnLnN0b3JhZ2UgPz9cbiAgICAgIChjb3JlQ29uZmlnLnRleHQoXCJBVVRIX1NUT1JBR0VcIiwgVFVOTkVMX0NPTkZJRykgYXMgQXV0aFN0b3JhZ2VNb2RlIHwgdW5kZWZpbmVkKSxcbiAgICBzcWxpdGVQYXRoOiBjb25maWcuc3FsaXRlUGF0aCA/PyBjb3JlQ29uZmlnLnRleHQoXCJBVVRIX1NRTElURV9QQVRIXCIsIFRVTk5FTF9DT05GSUcpLFxuICB9KTtcbiAgY29uc3QgcHVibGljRG9tYWluID0gY29yZUNvbmZpZy5zdHJpbmcoY29uZmlnLnB1YmxpY0RvbWFpbiwgXCJQVUJMSUNfRE9NQUlOXCIsIFRVTk5FTF9DT05GSUcpO1xuICBjb25zdCBmcnBQdWJsaWNEb21haW4gPSBjb3JlQ29uZmlnLnRleHQoXCJGUlBfUFVCTElDX0RPTUFJTlwiLCBUVU5ORUxfQ09ORklHKTtcbiAgcmV0dXJuIHtcbiAgICAvLyBCb3RoIHNvdXJjZXMgYXJlIHVuaW9uZWQgcmF0aGVyIHRoYW4gb25lIG92ZXJyaWRpbmc6IGEgZGVwbG95bWVudC13aWRlXG4gICAgLy8gVFVOTkVMX0FVVEhfQUxMT1cgYW5kIGEgcGVyLWludm9jYXRpb24gYC0tYWxsb3dgIHNob3VsZCBib3RoIGdyYW50IGFjY2Vzcy5cbiAgICAvLyBIZW5jZSBgcGFyc2VMaXN0YCBvbiBlYWNoIHJhdGhlciB0aGFuIGBjb25maWcubGlzdGAsIHdoaWNoIHN0b3BzIGF0IHRoZVxuICAgIC8vIGZpcnN0IHNvdXJjZSB0aGF0IHlpZWxkcyBhbnl0aGluZy5cbiAgICBhbGxvdzogW1xuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb25maWcuYWxsb3cpLFxuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb3JlQ29uZmlnLnRleHQoW1wiQVVUSF9BTExPV1wiLCBcIkVNQUlMX0FVVEhfQUxMT1dcIl0sIFRVTk5FTF9DT05GSUcpKSxcbiAgICBdLFxuICAgIHN1YmplY3Q6IGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5zdWJqZWN0LCBcIkFVVEhfU1VCSkVDVFwiLCBUVU5ORUxfQ09ORklHKSA/PyBERUZBVUxUUy5zdWJqZWN0LFxuICAgIGJyYW5kTmFtZTpcbiAgICAgIGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5icmFuZE5hbWUsIFwiQVVUSF9CUkFORF9OQU1FXCIsIFRVTk5FTF9DT05GSUcpID8/IERFRkFVTFRTLmJyYW5kTmFtZSxcbiAgICBtZXNzYWdlOiBjb3JlQ29uZmlnLnN0cmluZyhjb25maWcubWVzc2FnZSwgXCJBVVRIX01FU1NBR0VcIiwgVFVOTkVMX0NPTkZJRykgPz8gREVGQVVMVFMubWVzc2FnZSxcbiAgICBzZXNzaW9uVHRsU2Vjb25kczogY29yZUNvbmZpZy5wb3NpdGl2ZUludChcbiAgICAgIGNvbmZpZy5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIFwiQVVUSF9TRVNTSU9OX1RUTFwiLFxuICAgICAgREVGQVVMVFMuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICBUVU5ORUxfQ09ORklHLFxuICAgICksXG4gICAgY29kZVR0bFNlY29uZHM6IGNvcmVDb25maWcucG9zaXRpdmVJbnQoXG4gICAgICBjb25maWcuY29kZVR0bFNlY29uZHMsXG4gICAgICBcIkFVVEhfQ09ERV9UVExcIixcbiAgICAgIERFRkFVTFRTLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgVFVOTkVMX0NPTkZJRyxcbiAgICApLFxuICAgIG1heEF0dGVtcHRzOiBjb25maWcubWF4QXR0ZW1wdHMgPz8gREVGQVVMVFMubWF4QXR0ZW1wdHMsXG4gICAgc2Vzc2lvbkN1dG9mZk1zOiByZXNvbHZlU2Vzc2lvbkN1dG9mZihjb25maWcuc2Vzc2lvbkN1dG9mZiksXG4gICAgbG9nb3V0UmVkaXJlY3RQYXRoOiBwYXNzd29yZGxlc3NBdXRoLm5vcm1hbGl6ZUxvZ291dFJlZGlyZWN0UGF0aChcbiAgICAgIGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5sb2dvdXRSZWRpcmVjdFBhdGgsIFwiQVVUSF9MT0dPVVRfUkVESVJFQ1RcIiwgVFVOTkVMX0NPTkZJRykgPz9cbiAgICAgICAgREVGQVVMVFMubG9nb3V0UmVkaXJlY3RQYXRoLFxuICAgICksXG4gICAgcHVibGljRG9tYWluLFxuICAgIHB1YmxpY0RvbWFpbnM6IFtcbiAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgIFtcbiAgICAgICAgICBwdWJsaWNEb21haW4sXG4gICAgICAgICAgZnJwUHVibGljRG9tYWluLFxuICAgICAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29uZmlnLnB1YmxpY0RvbWFpbnMpLFxuICAgICAgICBdLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gISF2YWx1ZSksXG4gICAgICApLFxuICAgIF0sXG4gICAgZm9yd2FyZEhlYWRlcnM6IFtcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29uZmlnLmZvcndhcmRIZWFkZXJzKSxcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29yZUNvbmZpZy50ZXh0KFwiRk9SV0FSRF9IRUFERVJTXCIsIFRVTk5FTF9DT05GSUcpKSxcbiAgICBdLFxuICAgIGdhdGVQYXRoczogW1xuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb25maWcuZ2F0ZVBhdGhzKSxcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29yZUNvbmZpZy50ZXh0KFwiR0FURV9QQVRIU1wiLCBUVU5ORUxfQ09ORklHKSksXG4gICAgXSxcbiAgICBpbnNlY3VyZTogY29yZUNvbmZpZy5ib29sZWFuKGNvbmZpZy5pbnNlY3VyZSwgXCJJTlNFQ1VSRVwiLCBUVU5ORUxfQ09ORklHKSA/PyBmYWxzZSxcbiAgICBzdG9yYWdlOiBzdG9yYWdlLm1vZGUsXG4gICAgc3FsaXRlUGF0aDogc3RvcmFnZS5zcWxpdGVQYXRoLFxuICB9O1xufVxuXG4vKiogVGhlIGhhbmRsZXJzIHRoZSBnYXRlIG1pZGRsZXdhcmUgY2FsbHMgaW4tcHJvY2VzcyAocmV0dXJuZWQgYnkge0BsaW5rIEF1dGhHYXRlUGx1Z2luLmV4cG9ydHN9KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdhdGVBcGkge1xuICAvKiogQmV0dGVyIEF1dGggYW5kIGNvbXBhdGliaWxpdHkgcm91dGVzIHVuZGVyIGAvYXBpL2VtYWlsL2F1dGgvKmAuICovXG4gIGhhbmRsZXIocmVxdWVzdDogUmVxdWVzdCk6IFByb21pc2U8UmVzcG9uc2U+O1xuICAvKiogUmVzb2x2ZSB0aGUgYXV0aG9yaXplZCBlbWFpbCBmb3IgcmVxdWVzdCBoZWFkZXJzLCBvciB1bmRlZmluZWQuICovXG4gIHNlc3Npb24oaGVhZGVyczogSGVhZGVycyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgLyoqIFRoZSBnYXRlIHN0YXR1cyBwYXlsb2FkLiAqL1xuICBzdGF0dXMoaGVhZGVyczogSGVhZGVycyk6IFByb21pc2U8QXV0aFN0YXR1cz47XG4gIC8qKiBXaGV0aGVyIHRoZSBydW50aW1lIGV4cG9zZXMgcGFzc2tleSBlbnJvbGxtZW50IGFuZCBhdXRoZW50aWNhdGlvbi4gKi9cbiAgcmVhZG9ubHkgcGFzc2tleXNFbmFibGVkOiBib29sZWFuO1xuICAvKiogQ2xvc2UgYXV0aCBzdG9yYWdlIG93bmVkIGJ5IHRoaXMgcnVudGltZS4gKi9cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBcHBLaXQgcGx1Z2luIGFkYXB0aW5nIGBAZGJ4LXRvb2xzL2F1dGhgIHRvIHR1bm5lbCB0cmFmZmljLiBPbiBgc2V0dXAoKWAgaXQgcmVnaXN0ZXJzIHRoZSBsb2dpblxuICogcm91dGVzIChgL2FwaS9lbWFpbC9hdXRoLypgKSBhbmQgYSBnYXRpbmcgbWlkZGxld2FyZSBvbiB0aGUgYXBwJ3MgT1dOIEV4cHJlc3NcbiAqIHNlcnZlciB2aWEgYHRoaXMuY29udGV4dGAsIHNvIGEgcHVibGljIHBvcnRyIGNhbGxlciBtdXN0IHByb3ZlIGFuIGVtYWlsIGJlZm9yZVxuICogcmVhY2hpbmcgdGhlIGFwcCdzIGAvYXBpLypgIC0gc2VlIGAuL2dhdGVgLiBGcm9udC1kb29yIChwbGF0Zm9ybSkgdHJhZmZpYyBhbmRcbiAqIG90aGVyIGxvY2FsIGNhbGxlcnMgcGFzcyB0aHJvdWdoIHVudG91Y2hlZCAodGhlIGdhdGUga2V5cyBvbiB0aGUgYEhvc3RgIGhlYWRlcikuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoR2F0ZVBsdWdpbiBleHRlbmRzIFBsdWdpbjxBdXRoR2F0ZUNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJhdXRoR2F0ZVwiLFxuICAgIGRpc3BsYXlOYW1lOiBcIkF1dGggR2F0ZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJldHRlciBBdXRoIGVtYWlsIE9UUCBhbmQgcGFzc2tleSBhY2Nlc3MgZ2F0ZSBmb3IgYSBwdWJsaWMgdHVubmVsLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogUmVzb3VyY2VUeXBlLlBPU1RHUkVTLFxuICAgICAgICAgIGFsaWFzOiBcImF1dGhcIixcbiAgICAgICAgICByZXNvdXJjZUtleTogXCJhdXRoLWRhdGFiYXNlXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiRHVyYWJsZSB1c2Vycywgc2Vzc2lvbnMsIE9UUCByZWNvcmRzLCBhbmQgcGFzc2tleXMuXCIsXG4gICAgICAgICAgcGVybWlzc2lvbjogXCJDQU5fQ09OTkVDVF9BTkRfQ1JFQVRFXCIsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBpbnN0YW5jZV9uYW1lOiB7IGVudjogXCJMQUtFQkFTRV9JTlNUQU5DRV9OQU1FXCIgfSxcbiAgICAgICAgICAgIGRhdGFiYXNlX25hbWU6IHsgZW52OiBcIlBHREFUQUJBU0VcIiB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwiYXV0aEdhdGVcIj47XG5cbiAgcHJpdmF0ZSByZXNvbHZlZCE6IFJlc29sdmVkQXV0aEdhdGVDb25maWc7XG4gIHByaXZhdGUgcnVudGltZT86IFBhc3N3b3JkbGVzc0F1dGhSdW50aW1lO1xuXG4gIHN0YXRpYyBnZXRSZXNvdXJjZVJlcXVpcmVtZW50cyhjb25maWc6IEF1dGhHYXRlQ29uZmlnKTogUmVzb3VyY2VSZXF1aXJlbWVudFtdIHtcbiAgICBpZiAoYXV0aFN0b3JhZ2UucmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKGNvbmZpZykubW9kZSAhPT0gXCJsYWtlYmFzZVwiKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogUmVzb3VyY2VUeXBlLlBPU1RHUkVTLFxuICAgICAgICBhbGlhczogXCJhdXRoXCIsXG4gICAgICAgIHJlc291cmNlS2V5OiBcImF1dGgtZGF0YWJhc2VcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiRHVyYWJsZSB1c2Vycywgc2Vzc2lvbnMsIE9UUCByZWNvcmRzLCBhbmQgcGFzc2tleXMuXCIsXG4gICAgICAgIHBlcm1pc3Npb246IFwiQ0FOX0NPTk5FQ1RfQU5EX0NSRUFURVwiLFxuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBpbnN0YW5jZV9uYW1lOiB7IGVudjogXCJMQUtFQkFTRV9JTlNUQU5DRV9OQU1FXCIgfSxcbiAgICAgICAgICBkYXRhYmFzZV9uYW1lOiB7IGVudjogXCJQR0RBVEFCQVNFXCIgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlc29sdmVkID0gcmVzb2x2ZUF1dGhHYXRlQ29uZmlnKHRoaXMuY29uZmlnKTtcblxuICAgIGlmICh0aGlzLnJlc29sdmVkLmluc2VjdXJlKSB7XG4gICAgICBsb2dnZXIud2FybihcImluc2VjdXJlIG1vZGUgLSB0aGUgdHVubmVsIHJ1bnMgT1BFTiB3aXRoIG5vIGF1dGggZ2F0ZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGFrZWJhc2VQbHVnaW4gPSBhcHBraXRQbHVnaW4uaW5zdGFuY2UodGhpcy5jb250ZXh0LCBsYWtlYmFzZSk7XG4gICAgICBjb25zdCBzdG9yYWdlID0gYXdhaXQgYXV0aFN0b3JhZ2UuY3JlYXRlQXV0aFN0b3JhZ2UoXG4gICAgICAgIHRoaXMucmVzb2x2ZWQsXG4gICAgICAgIGxha2ViYXNlUGx1Z2luPy5leHBvcnRzKCkucG9vbCxcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGtleSB9ID0gYXdhaXQgc2lnbmluZ0tleSh0aGlzLnJlc29sdmVkLnNlc3Npb25DdXRvZmZNcyk7XG4gICAgICB0aGlzLnJ1bnRpbWUgPSBhd2FpdCBwYXNzd29yZGxlc3NBdXRoLmNyZWF0ZVBhc3N3b3JkbGVzc0F1dGgoe1xuICAgICAgICBzdG9yYWdlLFxuICAgICAgICBiYXNlVVJMOiBhdXRoT3JpZ2luKHRoaXMucmVzb2x2ZWQucHVibGljRG9tYWluKSxcbiAgICAgICAgYmFzZVBhdGg6IFwiL2FwaS9lbWFpbC9hdXRoXCIsXG4gICAgICAgIGFwcE5hbWU6IHRoaXMucmVzb2x2ZWQuYnJhbmROYW1lLFxuICAgICAgICBzZWNyZXQ6IEJ1ZmZlci5mcm9tKGtleSkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIiksXG4gICAgICAgIHNlc3Npb25UdGxTZWNvbmRzOiB0aGlzLnJlc29sdmVkLnNlc3Npb25UdGxTZWNvbmRzLFxuICAgICAgICBzZXNzaW9uQ3V0b2ZmTXM6IHRoaXMucmVzb2x2ZWQuc2Vzc2lvbkN1dG9mZk1zLFxuICAgICAgICBsb2dvdXRSZWRpcmVjdFBhdGg6IHRoaXMucmVzb2x2ZWQubG9nb3V0UmVkaXJlY3RQYXRoLFxuICAgICAgICBjb2RlVHRsU2Vjb25kczogdGhpcy5yZXNvbHZlZC5jb2RlVHRsU2Vjb25kcyxcbiAgICAgICAgbWF4QXR0ZW1wdHM6IHRoaXMucmVzb2x2ZWQubWF4QXR0ZW1wdHMsXG4gICAgICAgIGF1dGhvcml6ZUlkZW50aXR5OiAoZW1haWwpID0+IHRoaXMuYXV0aG9yaXplSWRlbnRpdHkoZW1haWwpLFxuICAgICAgICBzZW5kQ29kZTogKGVtYWlsLCBjb2RlLCBvcHRpb25zKSA9PiB0aGlzLnNlbmRDb2RlKGVtYWlsLCBjb2RlLCBvcHRpb25zKSxcbiAgICAgICAgc3ViamVjdDogdGhpcy5yZXNvbHZlZC5zdWJqZWN0LFxuICAgICAgICBtZXNzYWdlOiB0aGlzLnJlc29sdmVkLm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIC8vIGBzZXJ2ZXIoKWAgaXMgZGVmZXJyZWQsIHNvIGl0IGRvZXMgbm90IGV4aXN0IGR1cmluZyB0aGlzIHBsdWdpbidzIHNldHVwLlxuICAgICAgLy8gQXQgYHNldHVwOmNvbXBsZXRlYCB0aGUgRXhwcmVzcyBhcHAgZXhpc3RzIGJ1dCBoYXMgbm90IGluamVjdGVkIHBsdWdpblxuICAgICAgLy8gcm91dGVzIG9yIHN0YXRpYyBoYW5kbGluZyB5ZXQsIHdoaWNoIGlzIHRoZSBvbmUgcG9pbnQgdGhlIGdhdGUgY2FuIG1vdW50XG4gICAgICAvLyBhaGVhZCBvZiBldmVyeSBwcm90ZWN0ZWQgcm91dGUuXG4gICAgICB0aGlzLmNvbnRleHQ/Lm9uTGlmZWN5Y2xlKFwic2V0dXA6Y29tcGxldGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLm1vdW50R2F0ZVJvdXRlcygpO1xuICAgICAgICAvLyBGYWlsIGZhc3Qgb25jZSB0aGUgc2libGluZyBlbWFpbCBwbHVnaW4gaGFzIHByaW1lZCBpdHMgdHJhbnNwb3J0OiBhXG4gICAgICAgIC8vIGdhdGUgdGhhdCBjYW5ub3QgZW1haWwgYSBjb2RlIGxldHMgbm9ib2R5IGluLlxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnNlbmRDb2RlKSBhd2FpdCBlbnN1cmVFbWFpbEF2YWlsYWJsZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBwYXR0ZXJuczogdGhpcy5yZXNvbHZlZC5hbGxvdy5sZW5ndGgsXG4gICAgICBzZXNzaW9uVHRsU2Vjb25kczogdGhpcy5yZXNvbHZlZC5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIHB1YmxpY0RvbWFpbnM6IHRoaXMucmVzb2x2ZWQucHVibGljRG9tYWlucyxcbiAgICAgIGluc2VjdXJlOiB0aGlzLnJlc29sdmVkLmluc2VjdXJlLFxuICAgICAgc3RvcmFnZTogdGhpcy5yZXNvbHZlZC5zdG9yYWdlLFxuICAgICAgbG9nb3V0UmVkaXJlY3RQYXRoOiB0aGlzLnJlc29sdmVkLmxvZ291dFJlZGlyZWN0UGF0aCxcbiAgICAgIHNlc3Npb25DdXRvZmY6XG4gICAgICAgIHRoaXMucmVzb2x2ZWQuc2Vzc2lvbkN1dG9mZk1zID4gMFxuICAgICAgICAgID8gbmV3IERhdGUodGhpcy5yZXNvbHZlZC5zZXNzaW9uQ3V0b2ZmTXMpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICA6IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bnRpbWU/LmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdGhlIGxvZ2luIHJvdXRlcyAoYC9hcGkvZW1haWwvYXV0aC8qYCkgYW5kIHRoZSBnYXRpbmcgbWlkZGxld2FyZSBvblxuICAgKiB0aGUgYXBwJ3MgT1dOIEV4cHJlc3Mgc2VydmVyLiBBdCBgc2V0dXA6Y29tcGxldGVgLCB0aGUgZGVmZXJyZWQgc2VydmVyIHBsdWdpblxuICAgKiBoYXMgY29uc3RydWN0ZWQgaXRzIEV4cHJlc3MgYXBwIGJ1dCBoYXMgbm90IGluamVjdGVkIHBsdWdpbiByb3V0ZXMgb3Igc3RhdGljXG4gICAqIGhhbmRsaW5nLCBzbyBkaXJlY3QgcmVnaXN0cmF0aW9uIHB1dHMgdGhlIGdhdGUgZmlyc3QuIFRoZSBjb250ZXh0J3MgYnVmZmVyZWRcbiAgICogcm91dGUgQVBJIHJlbWFpbnMgYSBmYWxsYmFjayBmb3IgY29tcGF0aWJsZSBub24tc3RhbmRhcmQgc2VydmVyIHBsdWdpbnMuXG4gICAqL1xuICBwcml2YXRlIG1vdW50R2F0ZVJvdXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJubyBwbHVnaW4gY29udGV4dCAtIHRoZSBhdXRoIGdhdGUgY2Fubm90IG1vdW50IGl0cyByb3V0ZXNcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1vdW50R2F0ZU9uQ29udGV4dChjb250ZXh0LCB7XG4gICAgICBnYXRlOiB0aGlzLmV4cG9ydHMoKSxcbiAgICAgIHB1YmxpY0RvbWFpbjogdGhpcy5yZXNvbHZlZC5wdWJsaWNEb21haW5zLFxuICAgICAgZm9yd2FyZEhlYWRlcnM6IHRoaXMucmVzb2x2ZWQuZm9yd2FyZEhlYWRlcnMsXG4gICAgICBnYXRlUGF0aHM6IHRoaXMucmVzb2x2ZWQuZ2F0ZVBhdGhzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBjb2RlIHNlbmRlcjogdGhlIGNvbmZpZ3VyZWQgYHNlbmRDb2RlYCwgZWxzZSB0aGUgc2hhcmVkLXRyYW5zcG9ydCBkZWZhdWx0LiAqL1xuICBwcml2YXRlIGdldCBzZW5kQ29kZSgpOiBOb25OdWxsYWJsZTxBdXRoR2F0ZUNvbmZpZ1tcInNlbmRDb2RlXCJdPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnNlbmRDb2RlID8/IGRlZmF1bHRTZW5kQ29kZTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0aG9yaXplSWRlbnRpdHkoZW1haWw6IHN0cmluZyk6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5jb25maWcuYXV0aG9yaXplSWRlbnRpdHkpIHJldHVybiB0aGlzLmNvbmZpZy5hdXRob3JpemVJZGVudGl0eShlbWFpbCk7XG4gICAgcmV0dXJuIGxvb2tzTGlrZUVtYWlsKGVtYWlsKSAmJiBtYXRjaGVzQWxsb3dsaXN0KGVtYWlsLCB0aGlzLnJlc29sdmVkLmFsbG93KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKTogQXV0aEdhdGVBcGkge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnJ1bnRpbWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhc3NrZXlzRW5hYmxlZDogcnVudGltZT8ucGFzc2tleXNFbmFibGVkID8/IGZhbHNlLFxuICAgICAgaGFuZGxlcjogKHJlcXVlc3QpID0+XG4gICAgICAgIHJ1bnRpbWU/LmhhbmRsZXIocmVxdWVzdCkgPz8gUHJvbWlzZS5yZXNvbHZlKG5ldyBSZXNwb25zZShcIk5vdCBGb3VuZFwiLCB7IHN0YXR1czogNDA0IH0pKSxcbiAgICAgIHNlc3Npb246IChoZWFkZXJzKSA9PiBydW50aW1lPy5zZXNzaW9uKGhlYWRlcnMpID8/IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpLFxuICAgICAgc3RhdHVzOiAoaGVhZGVycykgPT5cbiAgICAgICAgcnVudGltZT8uc3RhdHVzKGhlYWRlcnMpID8/XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh7IGF1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBlbmFibGVkOiBmYWxzZSwgcGFzc2tleXNFbmFibGVkOiBmYWxzZSB9KSxcbiAgICAgIGNsb3NlOiAoKSA9PiBydW50aW1lPy5jbG9zZSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gYXV0aE9yaWdpbihwdWJsaWNEb21haW4/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9IHN0cmluZy50cmltVG9OdWxsKHB1YmxpY0RvbWFpbik7XG4gIGlmICghdmFsdWUpIHJldHVybiBcImh0dHA6Ly9sb2NhbGhvc3RcIjtcbiAgaWYgKC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QodmFsdWUpKSByZXR1cm4gbmV3IFVSTCh2YWx1ZSkub3JpZ2luO1xuICBjb25zdCBob3N0ID0gdmFsdWUuc3BsaXQoXCIvXCIpWzBdITtcbiAgY29uc3QgbG9jYWwgPSBob3N0ID09PSBcImxvY2FsaG9zdFwiIHx8IGhvc3Quc3RhcnRzV2l0aChcImxvY2FsaG9zdDpcIik7XG4gIHJldHVybiBgJHtsb2NhbCA/IFwiaHR0cFwiIDogXCJodHRwc1wifTovLyR7aG9zdH1gO1xufVxuXG4vKiogRmFjdG9yeTogYGF1dGhHYXRlKHsgYWxsb3csIHN1YmplY3QsIC4uLiB9KWAgZm9yIGFuIEFwcEtpdCBgcGx1Z2luc2AgYXJyYXkuICovXG5leHBvcnQgY29uc3QgYXV0aEdhdGUgPSB0b1BsdWdpbihBdXRoR2F0ZVBsdWdpbik7XG4iXX0=
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEVBSVIsWUFBWSxHQUNiLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sSUFBSSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsSUFBSSxJQUFJLGdCQUFnQixFQUN4QixPQUFPLElBQUksV0FBVyxHQUt2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxXQUFXLENBQUM7QUFDeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsSUFBSSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFjekMsU0FBUyxpQkFBaUIsQ0FBQyxPQUF5QjtJQUNsRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FDb0IsQ0FBQztJQUNyRSxNQUFNLFdBQVcsR0FBRyxNQUFNLEVB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QU0sQ0FBQyxPQUFPLENBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ25GLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtTQUNuRCxDQUFDO0lBQ0osQ0FBQzs7QUFHSCxTQUFTLFVBQVUsQ0FBQyxZQUFxQjtJQUN2QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxrQkFBa0IsQ0FBQztJQUN0QyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEUsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDakQsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgYXV0aEdhdGUoKWAgLSB0aGUgQXBwS2l0IGFkYXB0ZXIgYXJvdW5kIGBAZGJ4LXRvb2xzL2F1dGhgLlxuICpcbiAqIEl0IGhhcyBOTyByb3V0ZXMgb2YgaXRzIG93bjogdGhlIHR1bm5lbCBQUk9YWSAobm90IGFuIEhUVFAgc2VydmVyKSBjYWxscyB0aGVcbiAqIGhhbmRsZXJzIHRoaXMgcGx1Z2luIGV4cG9zZXMgdmlhIHtAbGluayBBdXRoR2F0ZVBsdWdpbi5leHBvcnRzfS4gVGhlIHBsdWdpblxuICogb3ducyB0dW5uZWwgYXV0aG9yaXphdGlvbiwgQXBwS2l0IExha2ViYXNlIGRpc2NvdmVyeSwgZW1haWwgZGVsaXZlcnksIGFuZFxuICogdHJhbnNwb3J0IG1vdW50aW5nLiBCZXR0ZXIgQXV0aCBvd25zIHVzZXJzLCBPVFBzLCBzZXNzaW9ucywgcmF0ZSBsaW1pdHMsIGFuZFxuICogcGFzc2tleXMuIGBjcmVhdGVBcHBgIGNhbiBydW4gdGhpcyBwbHVnaW4gd2l0aCBvciB3aXRob3V0IGBzZXJ2ZXIoKWAuXG4gKlxuICogT3B0aW9ucyBjb21lIGZyb20gQ0xJIGZsYWdzIE9SIGVudiwgd2l0aCBzZW5zaWJsZSBkZWZhdWx0cyAtIHNlZVxuICoge0BsaW5rIHJlc29sdmVBdXRoR2F0ZUNvbmZpZ30uIFRoZSBvbmUgcnVudGltZSBkZXBlbmRlbmN5IHRoZSBwbHVnaW4gY2FuJ3RcbiAqIHJlc29sdmUgaXRzZWxmIGlzIEhPVyB0byBlbWFpbCB0aGUgY29kZSwgc28gaXQgdGFrZXMgYSBgc2VuZENvZGVgIGNhbGxiYWNrIHRoZVxuICogYXBwIHdpcmVzIHRvIHRoZSBlbWFpbCBwbHVnaW4uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGxha2ViYXNlLFxuICBQbHVnaW4sXG4gIHRvUGx1Z2luLFxuICB0eXBlIEJhc2VQbHVnaW5Db25maWcsXG4gIHR5cGUgUGx1Z2luTWFuaWZlc3QsXG4gIHR5cGUgUmVzb3VyY2VSZXF1aXJlbWVudCxcbiAgUmVzb3VyY2VUeXBlLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW4gYXMgYXBwa2l0UGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQge1xuICBhdXRoIGFzIHBhc3N3b3JkbGVzc0F1dGgsXG4gIHN0b3JhZ2UgYXMgYXV0aFN0b3JhZ2UsXG4gIHR5cGUgQXV0aG9yaXplSWRlbnRpdHksXG4gIHR5cGUgQXV0aFN0b3JhZ2VDb25maWcsXG4gIHR5cGUgQXV0aFN0b3JhZ2VNb2RlLFxuICB0eXBlIFBhc3N3b3JkbGVzc0F1dGhSdW50aW1lLFxufSBmcm9tIFwiQGRieC10b29scy9hdXRoXCI7XG5pbXBvcnQgeyBjb25maWcgYXMgY29yZUNvbmZpZyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgQXV0aFN0YXR1cyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoXCI7XG5pbXBvcnQgeyBicmFuZCwgbG9nLCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SGFuZGxlciB9IGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQgeyBUVU5ORUxfQ09ORklHIH0gZnJvbSBcIi4vX2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgbG9va3NMaWtlRW1haWwsIG1hdGNoZXNBbGxvd2xpc3QgfSBmcm9tIFwiLi9hbGxvd2xpc3QudHNcIjtcbmltcG9ydCB7IG1vdW50R2F0ZSwgdHlwZSBHYXRlT3B0aW9ucyB9IGZyb20gXCIuL2dhdGUudHNcIjtcbmltcG9ydCB7IGVuc3VyZUVtYWlsQXZhaWxhYmxlLCBzZW5kQ29kZSBhcyBkZWZhdWx0U2VuZENvZGUgfSBmcm9tIFwiLi9zZW5kLWNvZGUudHNcIjtcbmltcG9ydCB7IEtFWV9UVExfU0VDT05EUywgcmVzb2x2ZVNlc3Npb25DdXRvZmYsIHNpZ25pbmdLZXkgfSBmcm9tIFwiLi9zaWduaW5nLWtleS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwidHVubmVsOmF1dGhcIik7XG5cbmludGVyZmFjZSBHYXRlU2VydmVyQXBwbGljYXRpb24ge1xuICBnZXQocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHVua25vd247XG4gIHBvc3QocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHVua25vd247XG4gIHVzZShwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIEdhdGVNb3VudENvbnRleHQge1xuICBhZGRSb3V0ZShtZXRob2Q6IHN0cmluZywgcGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHZvaWQ7XG4gIGFkZE1pZGRsZXdhcmUocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHZvaWQ7XG4gIGdldFBsdWdpbnMoKTogUmVhZG9ubHlNYXA8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZnVuY3Rpb24gc2VydmVyQXBwbGljYXRpb24oY29udGV4dDogR2F0ZU1vdW50Q29udGV4dCk6IEdhdGVTZXJ2ZXJBcHBsaWNhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlcnZlciA9IGNvbnRleHQuZ2V0UGx1Z2lucygpLmdldChcInNlcnZlclwiKSBhc1xuICAgIHsgc2VydmVyQXBwbGljYXRpb24/OiBQYXJ0aWFsPEdhdGVTZXJ2ZXJBcHBsaWNhdGlvbj4gfSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYXBwbGljYXRpb24gPSBzZXJ2ZXI/LnNlcnZlckFwcGxpY2F0aW9uO1xuICByZXR1cm4gYXBwbGljYXRpb24gJiZcbiAgICB0eXBlb2YgYXBwbGljYXRpb24uZ2V0ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgYXBwbGljYXRpb24ucG9zdCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIGFwcGxpY2F0aW9uLnVzZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyAoYXBwbGljYXRpb24gYXMgR2F0ZVNlcnZlckFwcGxpY2F0aW9uKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW91bnRHYXRlT25Db250ZXh0KGNvbnRleHQ6IEdhdGVNb3VudENvbnRleHQsIG9wdGlvbnM6IEdhdGVPcHRpb25zKTogdm9pZCB7XG4gIGNvbnN0IGFwcGxpY2F0aW9uID0gc2VydmVyQXBwbGljYXRpb24oY29udGV4dCk7XG4gIGlmIChhcHBsaWNhdGlvbikge1xuICAgIG1vdW50R2F0ZShcbiAgICAgIG9wdGlvbnMsXG4gICAgICAobWV0aG9kLCBwYXRoLCBoYW5kbGVyKSA9PiBhcHBsaWNhdGlvblttZXRob2RdKHBhdGgsIGhhbmRsZXIpLFxuICAgICAgKHBhdGgsIGhhbmRsZXIpID0+IGFwcGxpY2F0aW9uLnVzZShwYXRoLCBoYW5kbGVyKSxcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBtb3VudEdhdGUoXG4gICAgb3B0aW9ucyxcbiAgICAobWV0aG9kLCBwYXRoLCBoYW5kbGVyKSA9PiBjb250ZXh0LmFkZFJvdXRlKG1ldGhvZCwgcGF0aCwgaGFuZGxlciksXG4gICAgKHBhdGgsIGhhbmRsZXIpID0+IGNvbnRleHQuYWRkTWlkZGxld2FyZShwYXRoLCBoYW5kbGVyKSxcbiAgKTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgYXV0aEdhdGV9IHBsdWdpbiAoYWxsIHJlc29sdmFibGUgZnJvbSBlbnYgLSBzZWUgYmVsb3cpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2F0ZUNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcsIEF1dGhTdG9yYWdlQ29uZmlnIHtcbiAgLyoqIEFsbG93LWxpc3QgcGF0dGVybnMgKGRvbWFpbiAvIGdsb2IgLyBgL3JlZ2V4L2ApLiBFbXB0eSA9IGFsbG93IG5vYm9keS4gRW52IFRVTk5FTF9BVVRIX0FMTE9XLiAqL1xuICBhbGxvdz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogU3ViamVjdCBsaW5lIGZvciB0aGUgY29kZSBlbWFpbC4gRW52IFRVTk5FTF9BVVRIX1NVQkpFQ1QuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFwiWW91ciB2ZXJpZmljYXRpb24gY29kZVwiLiBUaGUgd29yZGluZyBvZiB0aGUgc3ViamVjdCBhbmRcbiAgICoge0BsaW5rIG1lc3NhZ2V9IGlzIGRlbGliZXJhdGVseSB0aGUgY29udmVudGlvbmFsIHBocmFzaW5nIHJhdGhlciB0aGFuXG4gICAqIGFueXRoaW5nIGJyYW5kZWQ6IGlPUywgR21haWwsIE91dGxvb2ssIGFuZCBBbmRyb2lkIGFsbCBkZXRlY3QgYSBvbmUtdGltZVxuICAgKiBjb2RlIGZyb20gdGhpcyBzaGFwZSBhbmQgb2ZmZXIgdG8gYXV0b2ZpbGwgaXQsIGFuZCBhIG5vdmVsIHBocmFzaW5nIGlzIHdoYXRcbiAgICogYnJlYWtzIHRoYXQgZGV0ZWN0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBzdWJqZWN0IFRFTVBMQVRFLCBub3QgdGhlIGxpdGVyYWwgbGluZSBzZW50OiB0aGUgY29kZSBpcyBzcGxpY2VkXG4gICAqIGludG8gaXQgKGBcIjEyMzQ1NiBpcyB5b3VyIHZlcmlmaWNhdGlvbiBjb2RlXCJgKSBiZWNhdXNlIGEgcHVzaCBub3RpZmljYXRpb25cbiAgICogc2hvd3Mgb25seSB0aGUgc3ViamVjdCBhbmQgcHJlaGVhZGVyLCBhbmQgdGhhdCBub3RpZmljYXRpb24gaXMgd2hhdCBtb2JpbGVcbiAgICogYXV0b2ZpbGwgcmVhZHMuIFNlZSBgY29kZUVtYWlsU3ViamVjdGAgaW4gYC4vY29kZS1lbWFpbC50c2AuXG4gICAqL1xuICBzdWJqZWN0Pzogc3RyaW5nO1xuICAvKipcbiAgICogRGlzcGxheSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgZW1haWwgY29weS4gRW52IFRVTk5FTF9BVVRIX0JSQU5EX05BTUUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBicmFuZCBjb250ZXh0J3MgYG5hbWVgIC0gdGhlIGFwcCdzIG93biBgYnJhbmRpbmcvYnJhbmQueWFtbGBcbiAgICogd2hlbiBpdCBoYXMgb25lLCBlbHNlIHRoZSBkYngtdG9vbHMgZGVmYXVsdC4gU2V0IHRoaXMgb25seSB0byBvdmVycmlkZSB0aGVcbiAgICogYnJhbmQgZm9yIHRoaXMgZ2F0ZS5cbiAgICovXG4gIGJyYW5kTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIExpbmUgc2hvd24gaW1tZWRpYXRlbHkgYWJvdmUgdGhlIGNvZGUgaW4gdGhlIGVtYWlsLiBFbnYgVFVOTkVMX0FVVEhfTUVTU0FHRS5cbiAgICpcbiAgICogS2VlcCB0aGUgY29kZSBvbiBpdHMgT1dOIGxpbmUgZGlyZWN0bHkgYWZ0ZXIgdGhpcyB0ZXh0IC0gdGhhdCBhZGphY2VuY3kgaXNcbiAgICogd2hhdCB0aGUgcGxhdGZvcm0gY29kZS1kZXRlY3Rpb24gaGV1cmlzdGljcyBrZXkgb24uXG4gICAqL1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICAvKipcbiAgICogU2Vzc2lvbiBsaWZldGltZSAoc2Vjb25kcykuIEVudiBUVU5ORUxfQVVUSF9TRVNTSU9OX1RUTC4gRGVmYXVsdCAyNTkyMDAwICgzMGQpLlxuICAgKlxuICAgKiBNYXRjaGVkIHRvIHRoZSBjYWNoZS1iYWNrZWQgc2lnbmluZyBrZXkncyBvd24gMzAtZGF5IFRUTCAoc2VlXG4gICAqIGAuL3NpZ25pbmcta2V5LnRzYCk6IHRoZSBjb29raWUgYW5kIHRoZSBrZXkgdGhhdCB2YWxpZGF0ZXMgaXQgc2hvdWxkIGV4cGlyZVxuICAgKiB0b2dldGhlciwgb3Igb25lIHNpbGVudGx5IG91dGxpdmVzIHRoZSBvdGhlci5cbiAgICovXG4gIHNlc3Npb25UdGxTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogT25lLXRpbWUtY29kZSBsaWZldGltZSAoc2Vjb25kcykuIEVudiBUVU5ORUxfQVVUSF9DT0RFX1RUTC4gRGVmYXVsdCA2MDAgKDEwbSkuICovXG4gIGNvZGVUdGxTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogTWF4IHZlcmlmeSBhdHRlbXB0cyBwZXIgaXNzdWVkIGNvZGUuIERlZmF1bHQgNS4gKi9cbiAgbWF4QXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGb3JjZS1jbGVhciBjdXRvZmY6IGV2ZXJ5IHNlc3Npb24gaXNzdWVkIEJFRk9SRSBpdCBzdG9wcyB2ZXJpZnlpbmcsIHNvIG1vdmluZ1xuICAgKiBpdCBmb3J3YXJkIHNpZ25zIGV2ZXJ5b25lIG91dC4gRW52IFRVTk5FTF9BVVRIX1NFU1NJT05fQ1VUT0ZGLlxuICAgKlxuICAgKiBBbnl0aGluZyBgb2JqZWN0LnRvRGF0ZWAgYWNjZXB0czogYSBgRGF0ZWAsIGAyMDI2LTA4LTAyYCwgYW4gSVNPIGluc3RhbnQsXG4gICAqIGVwb2NoIHNlY29uZHMvbWlsbGlzLCBvciBhIHJlbGF0aXZlIGR1cmF0aW9uIChgLTMwZGAsIGA3IGRheXMgYWdvYCkuIFVuc2V0XG4gICAqIG1lYW5zIG5vIGN1dG9mZi5cbiAgICovXG4gIHNlc3Npb25DdXRvZmY/OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlO1xuICAvKipcbiAgICogU2FtZS1vcmlnaW4gcGF0aCByZXR1cm5lZCBhZnRlciBhIHN1Y2Nlc3NmdWwgbG9nb3V0LiBFbnZcbiAgICogYFRVTk5FTF9BVVRIX0xPR09VVF9SRURJUkVDVGAuIERlZmF1bHRzIHRvIGAvYCwgd2hlcmUgdGhlIEF1dGhHYXRlIHByZXNlbnRzXG4gICAqIGxvZ2luIGFnYWluLlxuICAgKi9cbiAgbG9nb3V0UmVkaXJlY3RQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogRGVsaXZlciBhIGNvZGUgdG8gYW4gYWRkcmVzcy4gRGVmYXVsdHMgdG8gc2VuZGluZyB0aHJvdWdoIHRoZSBob3N0IGFwcCdzXG4gICAqIHNoYXJlZCBgQGRieC10b29scy9lbWFpbGAgdHJhbnNwb3J0IChzZWUgYC4vc2VuZC1jb2RlYCk7IG92ZXJyaWRlIHRvIHdpcmUgYVxuICAgKiBkaWZmZXJlbnQgZGVsaXZlcnkgcGF0aC5cbiAgICovXG4gIHNlbmRDb2RlPzogKGVtYWlsOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgb3B0czogU2VuZENvZGVPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogSWRlbnRpdHkgYXV0aG9yaXphdGlvbiBpbmRlcGVuZGVudCBvZiBhdXRoZW50aWNhdGlvbi4gRGVmYXVsdHMgdG8gdGhlXG4gICAqIGNvbmZpZ3VyZWQgYWxsb3ctbGlzdCBhbmQgaXMgcmUtZXZhbHVhdGVkIGZvciBldmVyeSBhY2NlcHRlZCBzZXNzaW9uLlxuICAgKi9cbiAgYXV0aG9yaXplSWRlbnRpdHk/OiBBdXRob3JpemVJZGVudGl0eTtcbiAgLyoqXG4gICAqIFRoZSBwdWJsaWMgYDxzdWJkb21haW4+LjxzZXJ2ZXI+YCB0aGF0IGlkZW50aWZpZXMgcG9ydHIgdHJhZmZpYyBieSBpdHMgYEhvc3RgXG4gICAqIGhlYWRlci4gT25seSByZXF1ZXN0cyB3aG9zZSBgSG9zdGAgbWF0Y2hlcyB0aGlzIGFyZSBnYXRlZDsgZXZlcnl0aGluZyBlbHNlXG4gICAqICh0aGUgcGxhdGZvcm0gZnJvbnQgZG9vciwgb3RoZXIgbG9jYWwgY2FsbGVycykgcGFzc2VzIHRocm91Z2guIEVudlxuICAgKiBgVFVOTkVMX1BVQkxJQ19ET01BSU5gLiBXaGVuIGFic2VudCwgdGhlIGdhdGUgaXMgaW5lcnQgKG5vdGhpbmcgaXMgdHVubmVsXG4gICAqIHRyYWZmaWMpLlxuICAgKi9cbiAgcHVibGljRG9tYWluPzogc3RyaW5nO1xuICAvKiogQWRkaXRpb25hbCBwdWJsaWMgdHVubmVsIGRvbWFpbnMgYWNjZXB0ZWQgYnkgdGhlIGdhdGUuICovXG4gIHB1YmxpY0RvbWFpbnM/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEV4dHJhIGB4LWAgcmVxdWVzdCBoZWFkZXJzIHR1bm5lbCB0cmFmZmljIG1heSBmb3J3YXJkIChsaXRlcmFsIC8gZ2xvYiAvXG4gICAqIGAvcmVnZXgvYCksIHVuaW9uZWQgd2l0aCB0aGUgYnVpbHQtaW4gYWxsb3ctbGlzdC4gRW52IGBUVU5ORUxfRk9SV0FSRF9IRUFERVJTYC5cbiAgICovXG4gIGZvcndhcmRIZWFkZXJzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBQYXRoIHByZWZpeGVzIHRvIGdhdGUgYmV5b25kIHRoZSBidWlsdC1pbiBgL2FwaS9gIChsaXRlcmFsIHByZWZpeGVzLCBjb21tYS1cbiAgICogb3Igc3BhY2Utc2VwYXJhdGVkIGFzIGEgc3RyaW5nKS4gRm9yIGFuIGFwcCB3aG9zZSBwcml2aWxlZ2VkIHN1cmZhY2UgaXMgbm90XG4gICAqIHVuZGVyIGAvYXBpL2Ag4oCUIGUuZy4gYSBXZWJTb2NrZXQgYXQgYC93c2Ag4oCUIGxpc3QgdGhvc2UgcHJlZml4ZXMgc28gdGhleVxuICAgKiByZXF1aXJlIGEgc2Vzc2lvbiB0b28uIEVudiBgVFVOTkVMX0dBVEVfUEFUSFNgLlxuICAgKi9cbiAgZ2F0ZVBhdGhzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBSdW4gT1BFTiB3aXRoIG5vIGdhdGUgKGVudiBgVFVOTkVMX0lOU0VDVVJFPXRydWVgKS4gVGhlIGxvZ2luIHJvdXRlcyBhbmQgZ2F0ZVxuICAgKiBtaWRkbGV3YXJlIGFyZSBub3QgbW91bnRlZCwgYW5kIHRoZSBTTVRQIGZhaWwtZmFzdCBpcyBza2lwcGVkLiBVc2Ugb25seSB3aGVuXG4gICAqIHRoZSB0dW5uZWwgaXMgZGVsaWJlcmF0ZWx5IHB1YmxpYy5cbiAgICovXG4gIGluc2VjdXJlPzogYm9vbGVhbjtcbn1cblxuLyoqIEJyYW5kaW5nL21lc3NhZ2luZyBwYXNzZWQgdG8ge0BsaW5rIEF1dGhHYXRlQ29uZmlnLnNlbmRDb2RlfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VuZENvZGVPcHRpb25zIHtcbiAgc3ViamVjdDogc3RyaW5nO1xuICBicmFuZE5hbWU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKipcbiAgICogTGlmZXRpbWUgb2YgdGhlIGNvZGUgYmVpbmcgc2VudCwgaW4gc2Vjb25kcyAtIHRoZSBSRVNPTFZFRFxuICAgKiB7QGxpbmsgQXV0aEdhdGVDb25maWcuY29kZVR0bFNlY29uZHN9LCBzbyB0aGUgZW1haWwgY2FuIHN0YXRlIHRoZSByZWFsXG4gICAqIGV4cGlyeSAoXCJUaGlzIGNvZGUgZXhwaXJlcyBpbiAxMCBtaW51dGVzXCIpIGluc3RlYWQgb2YgYSB2YWd1ZSBcInNob3J0bHlcIlxuICAgKiB0aGF0IGRyaWZ0cyBmcm9tIHRoZSBjb25maWd1cmVkIFRUTC5cbiAgICovXG4gIGNvZGVUdGxTZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKiBSZXNvbHZlZCBnYXRlIGNvbmZpZyB3aXRoIGVudiBmYWxsYmFja3MgKyBkZWZhdWx0cyBhcHBsaWVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEF1dGhHYXRlQ29uZmlnIHtcbiAgYWxsb3c6IHN0cmluZ1tdO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGJyYW5kTmFtZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHNlc3Npb25UdGxTZWNvbmRzOiBudW1iZXI7XG4gIGNvZGVUdGxTZWNvbmRzOiBudW1iZXI7XG4gIG1heEF0dGVtcHRzOiBudW1iZXI7XG4gIC8qKiBGb3JjZS1jbGVhciBjdXRvZmYgaW4gZXBvY2ggbXM7IGAwYCB3aGVuIHVuc2V0LiAqL1xuICBzZXNzaW9uQ3V0b2ZmTXM6IG51bWJlcjtcbiAgLyoqIFNhbWUtb3JpZ2luIHBhdGggcmV0dXJuZWQgYWZ0ZXIgbG9nb3V0LiAqL1xuICBsb2dvdXRSZWRpcmVjdFBhdGg6IHN0cmluZztcbiAgLyoqIFByaW1hcnkgcHVibGljIGRvbWFpbjsgYHVuZGVmaW5lZGAgd2hlbiBQb3J0ciBpcyBub3QgY29uZmlndXJlZC4gKi9cbiAgcHVibGljRG9tYWluPzogc3RyaW5nO1xuICAvKiogQWxsIHB1YmxpYyB0dW5uZWwgZG9tYWlucyBhY2NlcHRlZCBieSB0aGUgZ2F0ZS4gKi9cbiAgcHVibGljRG9tYWluczogc3RyaW5nW107XG4gIC8qKiBFeHRyYSBgeC1gIGhlYWRlcnMgdHVubmVsIHRyYWZmaWMgbWF5IGZvcndhcmQgKHVuaW9uZWQgd2l0aCB0aGUgZGVmYXVsdHMpLiAqL1xuICBmb3J3YXJkSGVhZGVyczogc3RyaW5nW107XG4gIC8qKiBQYXRoIHByZWZpeGVzIHRvIGdhdGUgYmV5b25kIGAvYXBpL2AgKGUuZy4gYC93c2ApLiAqL1xuICBnYXRlUGF0aHM6IHN0cmluZ1tdO1xuICAvKiogUnVuIE9QRU4gd2l0aCBubyBnYXRlLiAqL1xuICBpbnNlY3VyZTogYm9vbGVhbjtcbiAgc3RvcmFnZTogQXV0aFN0b3JhZ2VNb2RlO1xuICBzcWxpdGVQYXRoPzogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUUyA9IHtcbiAgc3ViamVjdDogXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlXCIsXG4gIC8vIFRoZSByZXBvLXdpZGUgYnJhbmQgY29udGV4dCdzIGRpc3BsYXkgbmFtZSwgTk9UIGEgaGFyZGNvZGVkIHByb2R1Y3Qgc3RyaW5nOlxuICAvLyB0aGlzIG5hbWUgaXMgd2hhdCB0aGUgcmVjaXBpZW50IHJlYWRzIGluIHRoZSBjb2RlIGVtYWlsLCBzbyBpdCBoYXMgdG8gYmUgdGhlXG4gIC8vIHNhbWUgaWRlbnRpdHkgdGhlIHJlc3Qgb2YgdGhlIGFwcCBwcmVzZW50cy4gQSBob3N0IHdpdGggaXRzIG93blxuICAvLyBgYnJhbmRpbmcvYnJhbmQueWFtbGAgb3ZlcnJpZGVzIGl0IGJ5IHBhc3NpbmcgYGJyYW5kTmFtZWA7IHRoZSBzaGFyZWQgZGVmYXVsdFxuICAvLyBpcyB0aGUgZmFsbGJhY2sgd2hlbiBub3RoaW5nIGlzIGNvbmZpZ3VyZWQuXG4gIGJyYW5kTmFtZTogYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5uYW1lLFxuICBtZXNzYWdlOiBcIllvdXIgdmVyaWZpY2F0aW9uIGNvZGUgaXM6XCIsXG4gIC8vIDMwIGRheXMsIHRoZSBzYW1lIHdpbmRvdyB0aGUgY2FjaGUtYmFja2VkIHNpZ25pbmcga2V5IGlzIHN0b3JlZCBmb3IuXG4gIHNlc3Npb25UdGxTZWNvbmRzOiBLRVlfVFRMX1NFQ09ORFMsXG4gIGNvZGVUdGxTZWNvbmRzOiA2MDAsXG4gIG1heEF0dGVtcHRzOiA1LFxuICBsb2dvdXRSZWRpcmVjdFBhdGg6IFwiL1wiLFxufTtcblxuLyoqIE1lcmdlIHtAbGluayBBdXRoR2F0ZUNvbmZpZ30gb3ZlciBlbnYgb3ZlciBkZWZhdWx0cyBpbnRvIGEgcmVzb2x2ZWQgY29uZmlnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBdXRoR2F0ZUNvbmZpZyhjb25maWc6IEF1dGhHYXRlQ29uZmlnKTogUmVzb2x2ZWRBdXRoR2F0ZUNvbmZpZyB7XG4gIGNvbnN0IHN0b3JhZ2UgPSBhdXRoU3RvcmFnZS5yZXNvbHZlQXV0aFN0b3JhZ2VDb25maWcoe1xuICAgIHN0b3JhZ2U6XG4gICAgICBjb25maWcuc3RvcmFnZSA/P1xuICAgICAgKGNvcmVDb25maWcudGV4dChcIkFVVEhfU1RPUkFHRVwiLCBUVU5ORUxfQ09ORklHKSBhcyBBdXRoU3RvcmFnZU1vZGUgfCB1bmRlZmluZWQpLFxuICAgIHNxbGl0ZVBhdGg6IGNvbmZpZy5zcWxpdGVQYXRoID8/IGNvcmVDb25maWcudGV4dChcIkFVVEhfU1FMSVRFX1BBVEhcIiwgVFVOTkVMX0NPTkZJRyksXG4gIH0pO1xuICBjb25zdCBwdWJsaWNEb21haW4gPSBjb3JlQ29uZmlnLnN0cmluZyhjb25maWcucHVibGljRG9tYWluLCBcIlBVQkxJQ19ET01BSU5cIiwgVFVOTkVMX0NPTkZJRyk7XG4gIGNvbnN0IGZycFB1YmxpY0RvbWFpbiA9IGNvcmVDb25maWcudGV4dChcIkZSUF9QVUJMSUNfRE9NQUlOXCIsIFRVTk5FTF9DT05GSUcpO1xuICByZXR1cm4ge1xuICAgIC8vIEJvdGggc291cmNlcyBhcmUgdW5pb25lZCByYXRoZXIgdGhhbiBvbmUgb3ZlcnJpZGluZzogYSBkZXBsb3ltZW50LXdpZGVcbiAgICAvLyBUVU5ORUxfQVVUSF9BTExPVyBhbmQgYSBwZXItaW52b2NhdGlvbiBgLS1hbGxvd2Agc2hvdWxkIGJvdGggZ3JhbnQgYWNjZXNzLlxuICAgIC8vIEhlbmNlIGBwYXJzZUxpc3RgIG9uIGVhY2ggcmF0aGVyIHRoYW4gYGNvbmZpZy5saXN0YCwgd2hpY2ggc3RvcHMgYXQgdGhlXG4gICAgLy8gZmlyc3Qgc291cmNlIHRoYXQgeWllbGRzIGFueXRoaW5nLlxuICAgIGFsbG93OiBbXG4gICAgICAuLi5zdHJpbmcucGFyc2VMaXN0KGNvbmZpZy5hbGxvdyksXG4gICAgICAuLi5zdHJpbmcucGFyc2VMaXN0KGNvcmVDb25maWcudGV4dChbXCJBVVRIX0FMTE9XXCIsIFwiRU1BSUxfQVVUSF9BTExPV1wiXSwgVFVOTkVMX0NPTkZJRykpLFxuICAgIF0sXG4gICAgc3ViamVjdDogY29yZUNvbmZpZy5zdHJpbmcoY29uZmlnLnN1YmplY3QsIFwiQVVUSF9TVUJKRUNUXCIsIFRVTk5FTF9DT05GSUcpID8/IERFRkFVTFRTLnN1YmplY3QsXG4gICAgYnJhbmROYW1lOlxuICAgICAgY29yZUNvbmZpZy5zdHJpbmcoY29uZmlnLmJyYW5kTmFtZSwgXCJBVVRIX0JSQU5EX05BTUVcIiwgVFVOTkVMX0NPTkZJRykgPz8gREVGQVVMVFMuYnJhbmROYW1lLFxuICAgIG1lc3NhZ2U6IGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5tZXNzYWdlLCBcIkFVVEhfTUVTU0FHRVwiLCBUVU5ORUxfQ09ORklHKSA/PyBERUZBVUxUUy5tZXNzYWdlLFxuICAgIHNlc3Npb25UdGxTZWNvbmRzOiBjb3JlQ29uZmlnLnBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLnNlc3Npb25UdGxTZWNvbmRzLFxuICAgICAgXCJBVVRIX1NFU1NJT05fVFRMXCIsXG4gICAgICBERUZBVUxUUy5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIFRVTk5FTF9DT05GSUcsXG4gICAgKSxcbiAgICBjb2RlVHRsU2Vjb25kczogY29yZUNvbmZpZy5wb3NpdGl2ZUludChcbiAgICAgIGNvbmZpZy5jb2RlVHRsU2Vjb25kcyxcbiAgICAgIFwiQVVUSF9DT0RFX1RUTFwiLFxuICAgICAgREVGQVVMVFMuY29kZVR0bFNlY29uZHMsXG4gICAgICBUVU5ORUxfQ09ORklHLFxuICAgICksXG4gICAgbWF4QXR0ZW1wdHM6IGNvbmZpZy5tYXhBdHRlbXB0cyA/PyBERUZBVUxUUy5tYXhBdHRlbXB0cyxcbiAgICBzZXNzaW9uQ3V0b2ZmTXM6IHJlc29sdmVTZXNzaW9uQ3V0b2ZmKGNvbmZpZy5zZXNzaW9uQ3V0b2ZmKSxcbiAgICBsb2dvdXRSZWRpcmVjdFBhdGg6IHBhc3N3b3JkbGVzc0F1dGgubm9ybWFsaXplTG9nb3V0UmVkaXJlY3RQYXRoKFxuICAgICAgY29yZUNvbmZpZy5zdHJpbmcoY29uZmlnLmxvZ291dFJlZGlyZWN0UGF0aCwgXCJBVVRIX0xPR09VVF9SRURJUkVDVFwiLCBUVU5ORUxfQ09ORklHKSA/P1xuICAgICAgICBERUZBVUxUUy5sb2dvdXRSZWRpcmVjdFBhdGgsXG4gICAgKSxcbiAgICBwdWJsaWNEb21haW4sXG4gICAgcHVibGljRG9tYWluczogW1xuICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgW1xuICAgICAgICAgIHB1YmxpY0RvbWFpbixcbiAgICAgICAgICBmcnBQdWJsaWNEb21haW4sXG4gICAgICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb25maWcucHVibGljRG9tYWlucyksXG4gICAgICAgIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiAhIXZhbHVlKSxcbiAgICAgICksXG4gICAgXSxcbiAgICBmb3J3YXJkSGVhZGVyczogW1xuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb25maWcuZm9yd2FyZEhlYWRlcnMpLFxuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb3JlQ29uZmlnLnRleHQoXCJGT1JXQVJEX0hFQURFUlNcIiwgVFVOTkVMX0NPTkZJRykpLFxuICAgIF0sXG4gICAgZ2F0ZVBhdGhzOiBbXG4gICAgICAuLi5zdHJpbmcucGFyc2VMaXN0KGNvbmZpZy5nYXRlUGF0aHMpLFxuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb3JlQ29uZmlnLnRleHQoXCJHQVRFX1BBVEhTXCIsIFRVTk5FTF9DT05GSUcpKSxcbiAgICBdLFxuICAgIGluc2VjdXJlOiBjb3JlQ29uZmlnLmJvb2xlYW4oY29uZmlnLmluc2VjdXJlLCBcIklOU0VDVVJFXCIsIFRVTk5FTF9DT05GSUcpID8/IGZhbHNlLFxuICAgIHN0b3JhZ2U6IHN0b3JhZ2UubW9kZSxcbiAgICBzcWxpdGVQYXRoOiBzdG9yYWdlLnNxbGl0ZVBhdGgsXG4gIH07XG59XG5cbi8qKiBUaGUgaGFuZGxlcnMgdGhlIGdhdGUgbWlkZGxld2FyZSBjYWxscyBpbi1wcm9jZXNzIChyZXR1cm5lZCBieSB7QGxpbmsgQXV0aEdhdGVQbHVnaW4uZXhwb3J0c30pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2F0ZUFwaSB7XG4gIC8qKiBCZXR0ZXIgQXV0aCBhbmQgY29tcGF0aWJpbGl0eSByb3V0ZXMgdW5kZXIgYC9hcGkvZW1haWwvYXV0aC8qYC4gKi9cbiAgaGFuZGxlcihyZXF1ZXN0OiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT47XG4gIC8qKiBSZXNvbHZlIHRoZSBhdXRob3JpemVkIGVtYWlsIGZvciByZXF1ZXN0IGhlYWRlcnMsIG9yIHVuZGVmaW5lZC4gKi9cbiAgc2Vzc2lvbihoZWFkZXJzOiBIZWFkZXJzKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICAvKiogVGhlIGdhdGUgc3RhdHVzIHBheWxvYWQuICovXG4gIHN0YXR1cyhoZWFkZXJzOiBIZWFkZXJzKTogUHJvbWlzZTxBdXRoU3RhdHVzPjtcbiAgLyoqIFdoZXRoZXIgdGhlIHJ1bnRpbWUgZXhwb3NlcyBwYXNza2V5IGVucm9sbG1lbnQgYW5kIGF1dGhlbnRpY2F0aW9uLiAqL1xuICByZWFkb25seSBwYXNza2V5c0VuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKiBDbG9zZSBhdXRoIHN0b3JhZ2Ugb3duZWQgYnkgdGhpcyBydW50aW1lLiAqL1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEFwcEtpdCBwbHVnaW4gYWRhcHRpbmcgYEBkYngtdG9vbHMvYXV0aGAgdG8gdHVubmVsIHRyYWZmaWMuIE9uIGBzZXR1cCgpYCBpdCByZWdpc3RlcnMgdGhlIGxvZ2luXG4gKiByb3V0ZXMgKGAvYXBpL2VtYWlsL2F1dGgvKmApIGFuZCBhIGdhdGluZyBtaWRkbGV3YXJlIG9uIHRoZSBhcHAncyBPV04gRXhwcmVzc1xuICogc2VydmVyIHZpYSBgdGhpcy5jb250ZXh0YCwgc28gYSBwdWJsaWMgcG9ydHIgY2FsbGVyIG11c3QgcHJvdmUgYW4gZW1haWwgYmVmb3JlXG4gKiByZWFjaGluZyB0aGUgYXBwJ3MgYC9hcGkvKmAgLSBzZWUgYC4vZ2F0ZWAuIEZyb250LWRvb3IgKHBsYXRmb3JtKSB0cmFmZmljIGFuZFxuICogb3RoZXIgbG9jYWwgY2FsbGVycyBwYXNzIHRocm91Z2ggdW50b3VjaGVkICh0aGUgZ2F0ZSBrZXlzIG9uIHRoZSBgSG9zdGAgaGVhZGVyKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhHYXRlUGx1Z2luIGV4dGVuZHMgUGx1Z2luPEF1dGhHYXRlQ29uZmlnPiB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImF1dGhHYXRlXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQXV0aCBHYXRlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQmV0dGVyIEF1dGggZW1haWwgT1RQIGFuZCBwYXNza2V5IGFjY2VzcyBnYXRlIGZvciBhIHB1YmxpYyB0dW5uZWwuXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIHJlcXVpcmVkOiBbXSxcbiAgICAgIG9wdGlvbmFsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBSZXNvdXJjZVR5cGUuUE9TVEdSRVMsXG4gICAgICAgICAgYWxpYXM6IFwiYXV0aFwiLFxuICAgICAgICAgIHJlc291cmNlS2V5OiBcImF1dGgtZGF0YWJhc2VcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJEdXJhYmxlIHVzZXJzLCBzZXNzaW9ucywgT1RQIHJlY29yZHMsIGFuZCBwYXNza2V5cy5cIixcbiAgICAgICAgICBwZXJtaXNzaW9uOiBcIkNBTl9DT05ORUNUX0FORF9DUkVBVEVcIixcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIGluc3RhbmNlX25hbWU6IHsgZW52OiBcIkxBS0VCQVNFX0lOU1RBTkNFX05BTUVcIiB9LFxuICAgICAgICAgICAgZGF0YWJhc2VfbmFtZTogeyBlbnY6IFwiUEdEQVRBQkFTRVwiIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSBzYXRpc2ZpZXMgUGx1Z2luTWFuaWZlc3Q8XCJhdXRoR2F0ZVwiPjtcblxuICBwcml2YXRlIHJlc29sdmVkITogUmVzb2x2ZWRBdXRoR2F0ZUNvbmZpZztcbiAgcHJpdmF0ZSBydW50aW1lPzogUGFzc3dvcmRsZXNzQXV0aFJ1bnRpbWU7XG5cbiAgc3RhdGljIGdldFJlc291cmNlUmVxdWlyZW1lbnRzKGNvbmZpZzogQXV0aEdhdGVDb25maWcpOiBSZXNvdXJjZVJlcXVpcmVtZW50W10ge1xuICAgIGlmIChhdXRoU3RvcmFnZS5yZXNvbHZlQXV0aFN0b3JhZ2VDb25maWcoY29uZmlnKS5tb2RlICE9PSBcImxha2ViYXNlXCIpIHJldHVybiBbXTtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0eXBlOiBSZXNvdXJjZVR5cGUuUE9TVEdSRVMsXG4gICAgICAgIGFsaWFzOiBcImF1dGhcIixcbiAgICAgICAgcmVzb3VyY2VLZXk6IFwiYXV0aC1kYXRhYmFzZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJEdXJhYmxlIHVzZXJzLCBzZXNzaW9ucywgT1RQIHJlY29yZHMsIGFuZCBwYXNza2V5cy5cIixcbiAgICAgICAgcGVybWlzc2lvbjogXCJDQU5fQ09OTkVDVF9BTkRfQ1JFQVRFXCIsXG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIGluc3RhbmNlX25hbWU6IHsgZW52OiBcIkxBS0VCQVNFX0lOU1RBTkNFX05BTUVcIiB9LFxuICAgICAgICAgIGRhdGFiYXNlX25hbWU6IHsgZW52OiBcIlBHREFUQUJBU0VcIiB9LFxuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVzb2x2ZWQgPSByZXNvbHZlQXV0aEdhdGVDb25maWcodGhpcy5jb25maWcpO1xuXG4gICAgaWYgKHRoaXMucmVzb2x2ZWQuaW5zZWN1cmUpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiaW5zZWN1cmUgbW9kZSAtIHRoZSB0dW5uZWwgcnVucyBPUEVOIHdpdGggbm8gYXV0aCBnYXRlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsYWtlYmFzZVBsdWdpbiA9IGFwcGtpdFBsdWdpbi5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKTtcbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCBhdXRoU3RvcmFnZS5jcmVhdGVBdXRoU3RvcmFnZShcbiAgICAgICAgdGhpcy5yZXNvbHZlZCxcbiAgICAgICAgbGFrZWJhc2VQbHVnaW4/LmV4cG9ydHMoKS5wb29sLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsga2V5IH0gPSBhd2FpdCBzaWduaW5nS2V5KHRoaXMucmVzb2x2ZWQuc2Vzc2lvbkN1dG9mZk1zKTtcbiAgICAgIHRoaXMucnVudGltZSA9IGF3YWl0IHBhc3N3b3JkbGVzc0F1dGguY3JlYXRlUGFzc3dvcmRsZXNzQXV0aCh7XG4gICAgICAgIHN0b3JhZ2UsXG4gICAgICAgIGJhc2VVUkw6IGF1dGhPcmlnaW4odGhpcy5yZXNvbHZlZC5wdWJsaWNEb21haW4pLFxuICAgICAgICBiYXNlUGF0aDogXCIvYXBpL2VtYWlsL2F1dGhcIixcbiAgICAgICAgYXBwTmFtZTogdGhpcy5yZXNvbHZlZC5icmFuZE5hbWUsXG4gICAgICAgIHNlY3JldDogQnVmZmVyLmZyb20oa2V5KS50b1N0cmluZyhcImJhc2U2NHVybFwiKSxcbiAgICAgICAgc2Vzc2lvblR0bFNlY29uZHM6IHRoaXMucmVzb2x2ZWQuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICAgIHNlc3Npb25DdXRvZmZNczogdGhpcy5yZXNvbHZlZC5zZXNzaW9uQ3V0b2ZmTXMsXG4gICAgICAgIGxvZ291dFJlZGlyZWN0UGF0aDogdGhpcy5yZXNvbHZlZC5sb2dvdXRSZWRpcmVjdFBhdGgsXG4gICAgICAgIGNvZGVUdGxTZWNvbmRzOiB0aGlzLnJlc29sdmVkLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgICBtYXhBdHRlbXB0czogdGhpcy5yZXNvbHZlZC5tYXhBdHRlbXB0cyxcbiAgICAgICAgYXV0aG9yaXplSWRlbnRpdHk6IChlbWFpbCkgPT4gdGhpcy5hdXRob3JpemVJZGVudGl0eShlbWFpbCksXG4gICAgICAgIHNlbmRDb2RlOiAoZW1haWwsIGNvZGUsIG9wdGlvbnMpID0+IHRoaXMuc2VuZENvZGUoZW1haWwsIGNvZGUsIG9wdGlvbnMpLFxuICAgICAgICBzdWJqZWN0OiB0aGlzLnJlc29sdmVkLnN1YmplY3QsXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMucmVzb2x2ZWQubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgLy8gYHNlcnZlcigpYCBpcyBkZWZlcnJlZCwgc28gaXQgZG9lcyBub3QgZXhpc3QgZHVyaW5nIHRoaXMgcGx1Z2luJ3Mgc2V0dXAuXG4gICAgICAvLyBBdCBgc2V0dXA6Y29tcGxldGVgIHRoZSBFeHByZXNzIGFwcCBleGlzdHMgYnV0IGhhcyBub3QgaW5qZWN0ZWQgcGx1Z2luXG4gICAgICAvLyByb3V0ZXMgb3Igc3RhdGljIGhhbmRsaW5nIHlldCwgd2hpY2ggaXMgdGhlIG9uZSBwb2ludCB0aGUgZ2F0ZSBjYW4gbW91bnRcbiAgICAgIC8vIGFoZWFkIG9mIGV2ZXJ5IHByb3RlY3RlZCByb3V0ZS5cbiAgICAgIHRoaXMuY29udGV4dD8ub25MaWZlY3ljbGUoXCJzZXR1cDpjb21wbGV0ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMubW91bnRHYXRlUm91dGVzKCk7XG4gICAgICAgIC8vIEZhaWwgZmFzdCBvbmNlIHRoZSBzaWJsaW5nIGVtYWlsIHBsdWdpbiBoYXMgcHJpbWVkIGl0cyB0cmFuc3BvcnQ6IGFcbiAgICAgICAgLy8gZ2F0ZSB0aGF0IGNhbm5vdCBlbWFpbCBhIGNvZGUgbGV0cyBub2JvZHkgaW4uXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuc2VuZENvZGUpIGF3YWl0IGVuc3VyZUVtYWlsQXZhaWxhYmxlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIHBhdHRlcm5zOiB0aGlzLnJlc29sdmVkLmFsbG93Lmxlbmd0aCxcbiAgICAgIHNlc3Npb25UdGxTZWNvbmRzOiB0aGlzLnJlc29sdmVkLnNlc3Npb25UdGxTZWNvbmRzLFxuICAgICAgcHVibGljRG9tYWluczogdGhpcy5yZXNvbHZlZC5wdWJsaWNEb21haW5zLFxuICAgICAgaW5zZWN1cmU6IHRoaXMucmVzb2x2ZWQuaW5zZWN1cmUsXG4gICAgICBzdG9yYWdlOiB0aGlzLnJlc29sdmVkLnN0b3JhZ2UsXG4gICAgICBsb2dvdXRSZWRpcmVjdFBhdGg6IHRoaXMucmVzb2x2ZWQubG9nb3V0UmVkaXJlY3RQYXRoLFxuICAgICAgc2Vzc2lvbkN1dG9mZjpcbiAgICAgICAgdGhpcy5yZXNvbHZlZC5zZXNzaW9uQ3V0b2ZmTXMgPiAwXG4gICAgICAgICAgPyBuZXcgRGF0ZSh0aGlzLnJlc29sdmVkLnNlc3Npb25DdXRvZmZNcykudG9JU09TdHJpbmcoKVxuICAgICAgICAgIDogbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVudGltZT8uY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGUgbG9naW4gcm91dGVzIChgL2FwaS9lbWFpbC9hdXRoLypgKSBhbmQgdGhlIGdhdGluZyBtaWRkbGV3YXJlIG9uXG4gICAqIHRoZSBhcHAncyBPV04gRXhwcmVzcyBzZXJ2ZXIuIEF0IGBzZXR1cDpjb21wbGV0ZWAsIHRoZSBkZWZlcnJlZCBzZXJ2ZXIgcGx1Z2luXG4gICAqIGhhcyBjb25zdHJ1Y3RlZCBpdHMgRXhwcmVzcyBhcHAgYnV0IGhhcyBub3QgaW5qZWN0ZWQgcGx1Z2luIHJvdXRlcyBvciBzdGF0aWNcbiAgICogaGFuZGxpbmcsIHNvIGRpcmVjdCByZWdpc3RyYXRpb24gcHV0cyB0aGUgZ2F0ZSBmaXJzdC4gVGhlIGNvbnRleHQncyBidWZmZXJlZFxuICAgKiByb3V0ZSBBUEkgcmVtYWlucyBhIGZhbGxiYWNrIGZvciBjb21wYXRpYmxlIG5vbi1zdGFuZGFyZCBzZXJ2ZXIgcGx1Z2lucy5cbiAgICovXG4gIHByaXZhdGUgbW91bnRHYXRlUm91dGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICBsb2dnZXIud2FybihcIm5vIHBsdWdpbiBjb250ZXh0IC0gdGhlIGF1dGggZ2F0ZSBjYW5ub3QgbW91bnQgaXRzIHJvdXRlc1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbW91bnRHYXRlT25Db250ZXh0KGNvbnRleHQsIHtcbiAgICAgIGdhdGU6IHRoaXMuZXhwb3J0cygpLFxuICAgICAgcHVibGljRG9tYWluOiB0aGlzLnJlc29sdmVkLnB1YmxpY0RvbWFpbnMsXG4gICAgICBmb3J3YXJkSGVhZGVyczogdGhpcy5yZXNvbHZlZC5mb3J3YXJkSGVhZGVycyxcbiAgICAgIGdhdGVQYXRoczogdGhpcy5yZXNvbHZlZC5nYXRlUGF0aHMsXG4gICAgICBicmFuZE5hbWU6IHRoaXMucmVzb2x2ZWQuYnJhbmROYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBjb2RlIHNlbmRlcjogdGhlIGNvbmZpZ3VyZWQgYHNlbmRDb2RlYCwgZWxzZSB0aGUgc2hhcmVkLXRyYW5zcG9ydCBkZWZhdWx0LiAqL1xuICBwcml2YXRlIGdldCBzZW5kQ29kZSgpOiBOb25OdWxsYWJsZTxBdXRoR2F0ZUNvbmZpZ1tcInNlbmRDb2RlXCJdPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnNlbmRDb2RlID8/IGRlZmF1bHRTZW5kQ29kZTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0aG9yaXplSWRlbnRpdHkoZW1haWw6IHN0cmluZyk6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5jb25maWcuYXV0aG9yaXplSWRlbnRpdHkpIHJldHVybiB0aGlzLmNvbmZpZy5hdXRob3JpemVJZGVudGl0eShlbWFpbCk7XG4gICAgcmV0dXJuIGxvb2tzTGlrZUVtYWlsKGVtYWlsKSAmJiBtYXRjaGVzQWxsb3dsaXN0KGVtYWlsLCB0aGlzLnJlc29sdmVkLmFsbG93KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKTogQXV0aEdhdGVBcGkge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnJ1bnRpbWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhc3NrZXlzRW5hYmxlZDogcnVudGltZT8ucGFzc2tleXNFbmFibGVkID8/IGZhbHNlLFxuICAgICAgaGFuZGxlcjogKHJlcXVlc3QpID0+XG4gICAgICAgIHJ1bnRpbWU/LmhhbmRsZXIocmVxdWVzdCkgPz8gUHJvbWlzZS5yZXNvbHZlKG5ldyBSZXNwb25zZShcIk5vdCBGb3VuZFwiLCB7IHN0YXR1czogNDA0IH0pKSxcbiAgICAgIHNlc3Npb246IChoZWFkZXJzKSA9PiBydW50aW1lPy5zZXNzaW9uKGhlYWRlcnMpID8/IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpLFxuICAgICAgc3RhdHVzOiAoaGVhZGVycykgPT5cbiAgICAgICAgcnVudGltZT8uc3RhdHVzKGhlYWRlcnMpID8/XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh7IGF1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBlbmFibGVkOiBmYWxzZSwgcGFzc2tleXNFbmFibGVkOiBmYWxzZSB9KSxcbiAgICAgIGNsb3NlOiAoKSA9PiBydW50aW1lPy5jbG9zZSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gYXV0aE9yaWdpbihwdWJsaWNEb21haW4/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9IHN0cmluZy50cmltVG9OdWxsKHB1YmxpY0RvbWFpbik7XG4gIGlmICghdmFsdWUpIHJldHVybiBcImh0dHA6Ly9sb2NhbGhvc3RcIjtcbiAgaWYgKC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QodmFsdWUpKSByZXR1cm4gbmV3IFVSTCh2YWx1ZSkub3JpZ2luO1xuICBjb25zdCBob3N0ID0gdmFsdWUuc3BsaXQoXCIvXCIpWzBdITtcbiAgY29uc3QgbG9jYWwgPSBob3N0ID09PSBcImxvY2FsaG9zdFwiIHx8IGhvc3Quc3RhcnRzV2l0aChcImxvY2FsaG9zdDpcIik7XG4gIHJldHVybiBgJHtsb2NhbCA/IFwiaHR0cFwiIDogXCJodHRwc1wifTovLyR7aG9zdH1gO1xufVxuXG4vKiogRmFjdG9yeTogYGF1dGhHYXRlKHsgYWxsb3csIHN1YmplY3QsIC4uLiB9KWAgZm9yIGFuIEFwcEtpdCBgcGx1Z2luc2AgYXJyYXkuICovXG5leHBvcnQgY29uc3QgYXV0aEdhdGUgPSB0b1BsdWdpbihBdXRoR2F0ZVBsdWdpbik7XG4iXX0=
package/package.json CHANGED
@@ -18,21 +18,21 @@
18
18
  "projen": "projen"
19
19
  },
20
20
  "devDependencies": {
21
- "@dbx-tools/email": "0.6.108",
21
+ "@dbx-tools/email": "0.6.112",
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.108"
27
+ "@dbx-tools/email": "0.6.112"
28
28
  },
29
29
  "dependencies": {
30
- "@databricks/appkit": "^0.43.0",
31
- "@dbx-tools/appkit": "0.6.108",
32
- "@dbx-tools/auth": "0.6.108",
33
- "@dbx-tools/core": "0.6.108",
34
- "@dbx-tools/shared-auth": "0.6.108",
35
- "@dbx-tools/shared-core": "0.6.108"
30
+ "@databricks/appkit": "^0.60.0",
31
+ "@dbx-tools/appkit": "0.6.112",
32
+ "@dbx-tools/auth": "0.6.112",
33
+ "@dbx-tools/core": "0.6.112",
34
+ "@dbx-tools/shared-auth": "0.6.112",
35
+ "@dbx-tools/shared-core": "0.6.112"
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.108",
51
+ "version": "0.6.112",
52
52
  "types": "./lib/index.d.ts",
53
53
  "type": "module",
54
54
  "exports": {
package/src/gate.ts CHANGED
@@ -26,6 +26,7 @@ import type { IncomingMessage } from "node:http";
26
26
  import { log, token } from "@dbx-tools/shared-core";
27
27
  import type { RequestHandler, Response } from "express";
28
28
  import { toHeaderPolicy, type HeaderPolicy } from "./headers.ts";
29
+ import { loginPageHtml } from "./login-page.ts";
29
30
  import type { AuthGateApi } from "./plugin.ts";
30
31
 
31
32
  const logger = log.logger("tunnel:gate");
@@ -61,6 +62,8 @@ export interface GateOptions {
61
62
  * here so they are gated too. Login routes (`AUTH_PREFIX`) are always open.
62
63
  */
63
64
  gatePaths?: readonly string[];
65
+ /** Product name displayed by the hosted login page. */
66
+ brandName?: string;
64
67
  }
65
68
 
66
69
  /**
@@ -289,7 +292,7 @@ export function mountGate(
289
292
  _addRoute: (method: "get" | "post", path: string, handler: RequestHandler) => void,
290
293
  addMiddleware: (path: string, handler: RequestHandler) => void,
291
294
  ): void {
292
- const { gate, publicDomain, forwardHeaders, gatePaths } = opts;
295
+ const { gate, publicDomain, forwardHeaders, gatePaths, brandName } = opts;
293
296
  const headerPolicy = toHeaderPolicy(forwardHeaders);
294
297
  logger.debug("gate mounted", { publicDomain, forward: headerPolicy.patterns, gatePaths });
295
298
 
@@ -313,7 +316,9 @@ export function mountGate(
313
316
 
314
317
  const gateMiddleware = (async (req, res, next) => {
315
318
  const action = await gateRequest(req, { gate, publicDomain, headerPolicy, gatePaths });
316
- if (action === "deny") res.status(401).json(UNAUTHORIZED_BODY);
319
+ if (action === "deny" && wantsLoginPage(req)) {
320
+ res.status(401).type("html").send(loginPageHtml({ brandName: brandName ?? "Databricks App" }));
321
+ } else if (action === "deny") res.status(401).json(UNAUTHORIZED_BODY);
317
322
  else next();
318
323
  }) as RequestHandler;
319
324
 
package/src/plugin.ts CHANGED
@@ -452,6 +452,7 @@ export class AuthGatePlugin extends Plugin<AuthGateConfig> {
452
452
  publicDomain: this.resolved.publicDomains,
453
453
  forwardHeaders: this.resolved.forwardHeaders,
454
454
  gatePaths: this.resolved.gatePaths,
455
+ brandName: this.resolved.brandName,
455
456
  });
456
457
  }
457
458