@pipeline-builder/api-core 5.2.9 → 5.2.11

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.
@@ -44,6 +44,20 @@ export interface RequireAuthOptions {
44
44
  * is being asked.
45
45
  */
46
46
  maxAge?: number;
47
+ /**
48
+ * Out-of-cluster service signers this route trusts (`OPT_IN_SERVICE_SIGNERS`
49
+ * in `services/service-keys.ts` — today only `'deploy-bootstrap'`, whose
50
+ * private key lives on the operator / CI host rather than in any pod).
51
+ *
52
+ * By default EVERY route refuses such a token with **401 `TOKEN_INVALID`**,
53
+ * exactly as if its key were not in the bundle — the deploy key's public half
54
+ * is mounted everywhere, so trusting it must be a per-route decision, not an
55
+ * inherited one. Opting in admits the token as a plain service principal: it
56
+ * still carries no superadmin or org-admin authority (no service token does),
57
+ * so the route must gate on its NAME (`isServicePrincipalNamed`) and/or its
58
+ * explicit `permissions` claim.
59
+ */
60
+ acceptServices?: readonly string[];
47
61
  }
48
62
  /** JWT auth middleware. Use directly or call with options. */
49
63
  export declare function requireAuth(req: Request, res: Response, next: NextFunction): void;
@@ -89,7 +89,7 @@ async function verifyAndAttach(options, rawToken, req, res, next) {
89
89
  // declare itself a service principal. Both pin the algorithm (no
90
90
  // alg-confusion, no `alg:none`) and both apply the optional issuer/audience
91
91
  // binding.
92
- const decoded = await verifyBearerToken(rawToken);
92
+ const decoded = await verifyBearerToken(rawToken, options.acceptServices ? { acceptServices: options.acceptServices } : {});
93
93
  if (decoded.type !== 'access') {
94
94
  return sendError(res, HttpStatus.UNAUTHORIZED, 'Only access tokens can be used for API requests', ErrorCode.TOKEN_INVALID);
95
95
  }
@@ -137,7 +137,10 @@ async function verifyAndAttach(options, rawToken, req, res, next) {
137
137
  // here so that even a route which mistakenly enables `allowOrgHeaderOverride`
138
138
  // can NEVER let an ordinary authenticated user spoof another tenant's org via
139
139
  // the header — defence-in-depth against the cross-tenant break this caused.
140
- if (options.allowOrgHeaderOverride && decoded.isSuperAdmin === true) {
140
+ // A SERVICE principal never reaches it: its `isSuperAdmin` is stripped at
141
+ // verification, and the principal-type check keeps it that way if that ever
142
+ // regressed.
143
+ if (options.allowOrgHeaderOverride && decoded.isSuperAdmin === true && decoded.principalType !== 'service') {
141
144
  const headerOrgId = getHeaderString(req.headers['x-org-id']);
142
145
  const headerOrgName = getHeaderString(req.headers['x-org-name']);
143
146
  if (headerOrgId)
@@ -200,4 +203,4 @@ async function verifyAndAttach(options, rawToken, req, res, next) {
200
203
  return sendError(res, HttpStatus.UNAUTHORIZED, 'Authentication failed', ErrorCode.UNAUTHORIZED);
201
204
  }
202
205
  }
203
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZGRsZXdhcmUvYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBUXRDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSwyQkFBMkIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBdUIsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUF3QixNQUFNLHNC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LFVBQVUsQ0FBQyxZQUFZLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xHLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogYHJlcXVpcmVBdXRoYDogYmVhcmVyIC8gYWNjZXNzLWtleSBhdXRoZW50aWNhdGlvbiwgdGhlIGNoZWNrcyBldmVyeVxuICogdmVyaWZpZWQgcmVxdWVzdCBwYXNzZXMsIGFuZCB0aGUgdGVuYW50IGlkZW50aXR5IGl0IGF0dGFjaGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UsIE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGp3dCBmcm9tICdqc29ud2VidG9rZW4nO1xuaW1wb3J0IHsgcmVmdXNlRm9yQXNzdXJhbmNlIH0gZnJvbSAnLi9hc3N1cmFuY2UuanMnO1xuaW1wb3J0IHsgY2xpZW50VmVyc2lvbk9mIH0gZnJvbSAnLi9jbGllbnQtdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBydW5EZWZlcnJlZFF1b3RhQ2hlY2sgfSBmcm9tICcuL2RlZmVycmVkLXF1b3RhLWNoZWNrLmpzJztcbmltcG9ydCB7IGhhc1ZhbGlkSWRlbnRpdHlDbGFpbXMsIHZlcmlmeUJlYXJlclRva2VuIH0gZnJvbSAnLi9qd3QtdmVyaWZ5LmpzJztcbmltcG9ydCB7IHJlY29yZEF1dGh6RGVuaWFsIH0gZnJvbSAnLi9wZXJtaXNzaW9uLWdhdGVzLmpzJztcbmltcG9ydCB7IGNoZWNrUmV2b2NhdGlvbiwgaXNJbXBlcnNvbmF0aW9uV3JpdGVCbG9ja2VkLCBuZWVkc1Jldm9jYXRpb25DaGVjayB9IGZyb20gJy4vcmV2b2NhdGlvbi5qcyc7XG5pbXBvcnQgeyB0YWdSb3V0ZUdhdGUgfSBmcm9tICcuL3JvdXRlLXRhYmxlLmpzJztcbmltcG9ydCB7IGlzU2VydmljZVRva2VuRGVuaWVkLCBzZXJ2aWNlTmFtZU9mIH0gZnJvbSAnLi9zZXJ2aWNlLXRva2Vucy5qcyc7XG5pbXBvcnQgeyBIdHRwU3RhdHVzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2h0dHAtc3RhdHVzLmpzJztcbmltcG9ydCB7IEp3a3NVbmF2YWlsYWJsZUVycm9yLCBVbmtub3duS2lkRXJyb3IgfSBmcm9tICcuLi9zZXJ2aWNlcy9qd2tzLWNhY2hlLmpzJztcbmltcG9ydCB7IFNlcnZpY2VLZXlFcnJvciwgc2VydmljZUlkZW50aXR5IH0gZnJvbSAnLi4vc2VydmljZXMvc2VydmljZS1rZXlzLmpzJztcbmltcG9ydCB7IHR5cGUgQXNzdXJhbmNlTGV2ZWwgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3ItY29kZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBIdHRwUmVxdWVzdCB9IGZyb20gJy4uL3R5cGVzL2h0dHAuanMnO1xuaW1wb3J0IHsgaXNPcGFxdWVBcGlLZXkgfSBmcm9tICcuLi91dGlscy9hcGkta2V5LmpzJztcbmltcG9ydCB7IGdldEhlYWRlclN0cmluZyB9IGZyb20gJy4uL3V0aWxzL2hlYWRlcnMuanMnO1xuaW1wb3J0IHsgZ2V0SWRlbnRpdHksIHR5cGUgUmVxdWVzdElkZW50aXR5IH0gZnJvbSAnLi4vdXRpbHMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgc2VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2F1dGgtbWlkZGxld2FyZScpO1xuZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlQXV0aE9wdGlvbnMge1xuICAvKipcbiAgICogQWxsb3cgeC1vcmctaWQveC1vcmctbmFtZSBoZWFkZXJzIHRvIG92ZXJyaWRlIHRoZSBKV1QncyBvcmdhbml6YXRpb24gZmllbGRzLlxuICAgKlxuICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBgeC1vcmctaWRgL2B4LW9yZy1uYW1lYCBoZWFkZXJzIG92ZXJyaWRlIHRoZSBjYWxsZXIncyBvcmdcbiAgICog4oCUIGJ1dCBPTkxZIGZvciBhIHZlcmlmaWVkIFNZUy1BRE1JTiAoYGlzU3VwZXJBZG1pbmAgY2xhaW0pLiBGb3IgYW55IG9yZGluYXJ5XG4gICAqIGF1dGhlbnRpY2F0ZWQgdXNlciB0aGUgaGVhZGVycyBhcmUgaWdub3JlZCwgc28gZW5hYmxpbmcgdGhpcyBjYW4gbmV2ZXIgbGV0IGFcbiAgICogbm9ybWFsIHVzZXIgaW1wZXJzb25hdGUgYW5vdGhlciB0ZW5hbnQncyBvcmcuIFVzZSBmb3IgY3Jvc3Mtb3JnIGFkbWluIHRvb2xpbmdcbiAgICogKGUuZy4gYSBzeXNhZG1pbiBtYW5hZ2luZyBhIGdpdmVuIG9yZydzIGJpbGxpbmcpLiBJZiB1bnN1cmUsIGxlYXZlIGl0IGRpc2FibGVkLlxuICAgKi9cbiAgYWxsb3dPcmdIZWFkZXJPdmVycmlkZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBEZW1hbmQgdGhhdCB0aGUgd2hvbGUgU0VTU0lPTiBiZSBhdCBsZWFzdCB0aGlzIGFzc3VyYW5jZSBsZXZlbC5cbiAgICpcbiAgICogYG1pbkFzc3VyYW5jZTogMmAgbWVhbnMgdGhlIHBlcnNvbiBhdXRoZW50aWNhdGVkIHdpdGggYSBzZWNvbmQgZmFjdG9yIOKAlCBhXG4gICAqIHBhc3NrZXkgd2l0aCB1c2VyIHZlcmlmaWNhdGlvbiwgYSBwYXNzd29yZCBwbHVzIGFuIGF1dGhlbnRpY2F0b3IgY29kZSwgb3JcbiAgICogU1NPIHRocm91Z2ggYW4gSWRQIHRoZSBvcmcgbWFya2VkIGFzIGVuZm9yY2luZyBNRkEuIEEgd2Vha2VyIHRva2VuIGdldHNcbiAgICogKio0MDEgYE1GQV9SRVFVSVJFRGAqKiwgd2hpY2ggdGhlIGNsaWVudCBhbnN3ZXJzIGJ5IHNlbmRpbmcgdGhlIHBlcnNvbiB0b1xuICAgKiBlbnJvbG1lbnQgb3IgdG8gYSBzdHJvbmdlciBzaWduLWluOyByZWZyZXNoaW5nIGNhbm5vdCBoZWxwLCBiZWNhdXNlIGBhYWxgXG4gICAqIGxpdmVzIG9uIHRoZSBzZXNzaW9uIHNsb3QgYW5kIGEgcmVmcmVzaCBuZXZlciByYWlzZXMgaXQuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIFNFU1NJT04tbGV2ZWwgY291bnRlcnBhcnQgdG8ge0BsaW5rIHJlcXVpcmVTdGVwVXB9LCB3aGljaCBzdGF5c1xuICAgKiBhIGZyZXNoLCBwZXItYWN0aW9uIGNvbmZpcm1hdGlvbi4gVXNlIGJvdGggb24gdGhlIG1vc3QgZGFuZ2Vyb3VzIHJvdXRlcy5cbiAgICpcbiAgICogTUFDSElORVMgTkVWRVIgU0FUSVNGWSBJVC4gQSBzZXJ2aWNlIHByaW5jaXBhbCwgYW4gb3JnIHNlcnZpY2UgYWNjb3VudCBhbmRcbiAgICogYW4gZXhjaGFuZ2VkIGFjY2VzcyBrZXkgYWxsIGdldCAqKjQwMyBgSFVNQU5fU0VTU0lPTl9SRVFVSVJFRGAqKiDigJQgdGhlcmUgaXNcbiAgICogbm8gcGVyc29uIGJlaGluZCB0aGVtIHRvIGhhdmUgcHJlc2VudGVkIGEgZmFjdG9yLCBzbyBcImFzc3VyYW5jZVwiIGlzIG5vdCBhXG4gICAqIHF1ZXN0aW9uIHRoZWlyIGNyZWRlbnRpYWwgY2FuIGFuc3dlci4gVGhhdCBpcyBkZWxpYmVyYXRlbHkgbm90IGEgc2lsZW50XG4gICAqIHBhc3MtdGhyb3VnaCBmb3IgaW50ZXJuYWwgc2VydmljZXM6IGEgcm91dGUgdGhhdCBkZW1hbmRzIE1GQSBpcyBhIHJvdXRlIGFcbiAgICogaHVtYW4gaXMgZG9pbmcgc29tZXRoaW5nIGRhbmdlcm91cyBvbi5cbiAgICovXG4gIG1pbkFzc3VyYW5jZT86IEFzc3VyYW5jZUxldmVsO1xuICAvKipcbiAgICogV2l0aCB7QGxpbmsgbWluQXNzdXJhbmNlfSwgYWRkaXRpb25hbGx5IGJvdW5kIGhvdyBsb25nIGFnbyB0aGF0IHNpZ24taW5cbiAgICogaGFwcGVuZWQgKHNlY29uZHMsIGNvbXBhcmVkIGFnYWluc3QgdGhlIHRva2VuJ3MgYGF1dGhfdGltZWApLiBBIHNlc3Npb24gdGhhdFxuICAgKiBpcyBNRkEtZ3JhZGUgYnV0IG9sZGVyIHRoYW4gdGhpcyBnZXRzICoqNDAxIGBSRUFVVEhfUkVRVUlSRURgKiouIElnbm9yZWRcbiAgICogd2l0aG91dCBgbWluQXNzdXJhbmNlYCDigJQgXCJob3cgcmVjZW50XCIgaXMgb25seSBtZWFuaW5nZnVsIG9uY2UgXCJob3cgc3Ryb25nXCJcbiAgICogaXMgYmVpbmcgYXNrZWQuXG4gICAqL1xuICBtYXhBZ2U/OiBudW1iZXI7XG59XG5cbi8qKiBKV1QgYXV0aCBtaWRkbGV3YXJlLiBVc2UgZGlyZWN0bHkgb3IgY2FsbCB3aXRoIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgb3B0aW9ucz86IFJlcXVpcmVBdXRoT3B0aW9ucyxcbik6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgcmVxT3JPcHRpb25zPzogUmVxdWVzdCB8IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVzPzogUmVzcG9uc2UsXG4gIG5leHQ/OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHwgKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZCkge1xuICBpZiAocmVxT3JPcHRpb25zICYmIHJlcyAmJiBuZXh0ICYmICdoZWFkZXJzJyBpbiByZXFPck9wdGlvbnMpIHtcbiAgICByZXR1cm4gX3JlcXVpcmVBdXRoKHt9LCByZXFPck9wdGlvbnMgYXMgUmVxdWVzdCwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSAocmVxT3JPcHRpb25zIGFzIFJlcXVpcmVBdXRoT3B0aW9ucykgfHwge307XG4gIGNvbnN0IGdhdGUgPSB0YWdSb3V0ZUdhdGUoKHJlcTogUmVxdWVzdCwgcmVzSW5uZXI6IFJlc3BvbnNlLCBuZXh0SW5uZXI6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIF9yZXF1aXJlQXV0aChvcHRpb25zLCByZXEsIHJlc0lubmVyLCBuZXh0SW5uZXIpO1xuICB9LCB7IGtpbmQ6ICdhdXRoJyB9KTtcbiAgaWYgKG9wdGlvbnMubWluQXNzdXJhbmNlKSB7XG4gICAgdGFnUm91dGVHYXRlKGdhdGUsIHsga2luZDogJ2Fzc3VyYW5jZScsIG1pbkFzc3VyYW5jZTogb3B0aW9ucy5taW5Bc3N1cmFuY2UsIC4uLihvcHRpb25zLm1heEFnZSAhPT0gdW5kZWZpbmVkID8geyBtYXhBZ2U6IG9wdGlvbnMubWF4QWdlIH0gOiB7fSkgfSk7XG4gIH1cbiAgcmV0dXJuIGdhdGU7XG59XG50YWdSb3V0ZUdhdGUocmVxdWlyZUF1dGgsIHsga2luZDogJ2F1dGgnIH0pO1xuXG5mdW5jdGlvbiBfcmVxdWlyZUF1dGgoXG4gIG9wdGlvbnM6IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgY29uc3QgYXV0aEhlYWRlciA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb247XG5cbiAgaWYgKCFhdXRoSGVhZGVyKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aG9yaXphdGlvbiBoZWFkZXIgcmVxdWlyZWQnLCBFcnJvckNvZGUuVE9LRU5fTUlTU0lORyk7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IGF1dGhIZWFkZXIuc3BsaXQoJyAnKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMiB8fCBwYXJ0c1swXSAhPT0gJ0JlYXJlcicpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdJbnZhbGlkIGF1dGhvcml6YXRpb24gZm9ybWF0LiBVc2U6IEJlYXJlciA8dG9rZW4+JywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICB9XG5cbiAgLy8gQW4gT1BBUVVFIEFDQ0VTUyBLRVkgKGBwYl9wYXRf4oCmYCAvIGBwYl9zYV/igKZgKSBjYXJyaWVzIG5vIGNsYWltcyBhbmQgbm9cbiAgLy8gc2lnbmF0dXJlLCBzbyBpdCBjYW5ub3QgYmUgdmVyaWZpZWQgaGVyZS4gVHJhZGUgaXQgYXQgcGxhdGZvcm0gZm9yIGFcbiAgLy8gc2hvcnQtbGl2ZWQgSldUIChjYWNoZWQgaW4tcHJvY2VzcyB1bnRpbCBpdCBleHBpcmVzKSBhbmQgdGhlbiB2ZXJpZnkgdGhhdFxuICAvLyBKV1Qgb24gdGhlIG5vcm1hbCBwYXRoIOKAlCBzZXJ2aWNlcyBuZXZlciByZWFkIGEga2V5IGhhc2guIFNlZVxuICAvLyBgc2VydmljZXMvYXBpLWtleS1leGNoYW5nZS50c2AuXG4gIGlmIChpc09wYXF1ZUFwaUtleShwYXJ0c1sxXSkpIHtcbiAgICB2b2lkIHJlc29sdmVBcGlLZXkob3B0aW9ucywgcGFydHNbMV0sIHJlcSwgcmVzLCBuZXh0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBgLmNhdGNoKG5leHQpYCBmb3J3YXJkcyBhIERPV05TVFJFQU0gc3luY2hyb25vdXMgdGhyb3cgZnJvbSBgbmV4dCgpYCB0b1xuICAvLyBFeHByZXNzJ3MgZXJyb3IgbWlkZGxld2FyZSDigJQgdmVyaWZpY2F0aW9uIGl0c2VsZiBuZXZlciByZWplY3RzIChpdCBtYXBzXG4gIC8vIGV2ZXJ5IGZhaWx1cmUgdG8gYSByZXNwb25zZSkuXG4gIHZvaWQgdmVyaWZ5QW5kQXR0YWNoKG9wdGlvbnMsIHBhcnRzWzFdLCByZXEsIHJlcywgbmV4dCkuY2F0Y2gobmV4dCk7XG59XG5cbi8qKlxuICogRXhjaGFuZ2UgYW4gb3BhcXVlIGtleSBmb3IgYSBKV1QsIHRoZW4gY29udGludWUgb24gdGhlIG5vcm1hbCB2ZXJpZmljYXRpb25cbiAqIHBhdGguIEEgcmVmdXNlZCBrZXkgaXMgYSA0MDE7IGFuIHVucmVhY2hhYmxlIHBsYXRmb3JtIGlzIGEgNTAzIChuZXZlciBhIHBhc3Mg4oCUXG4gKiBhbiB1bnZlcmlmaWFibGUgY3JlZGVudGlhbCBpcyBub3QgYW4gaWRlbnRpdHkpLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQXBpS2V5KFxuICBvcHRpb25zOiBSZXF1aXJlQXV0aE9wdGlvbnMsXG4gIGtleTogc3RyaW5nLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBMb2FkZWQgTEFaSUxZLCBvbiB0aGUgZmlyc3Qga2V5IGV2ZXIgcHJlc2VudGVkLiBBIHN0YXRpYyBpbXBvcnQgd291bGQgcHV0XG4gIC8vIHRoZSBIVFRQIGNsaWVudCAoYW5kIHBsYXRmb3JtJ3MgYWRkcmVzcykgaW50byB0aGUgaW1wb3J0IGdyYXBoIG9mIGV2ZXJ5XG4gIC8vIG1vZHVsZSB0aGF0IG1lcmVseSB1c2VzIGByZXF1aXJlQXV0aGAsIHdoaWNoIGJvdGggd2lkZW5zIHRoZSBib290IGdyYXBoIGFuZFxuICAvLyBicmVha3MgYW55IHRlc3QgdGhhdCBtb2NrcyBgaHR0cC1jbGllbnQuanNgIHdpdGggYSBwYXJ0aWFsIG1vZHVsZS5cbiAgY29uc3QgeyBleGNoYW5nZUFwaUtleSwgQXBpS2V5RXhjaGFuZ2VVbmF2YWlsYWJsZUVycm9yIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZpY2VzL2FwaS1rZXktZXhjaGFuZ2UuanMnKTtcbiAgbGV0IHRva2VuOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgdG9rZW4gPSBhd2FpdCBleGNoYW5nZUFwaUtleShrZXksIGNsaWVudFZlcnNpb25PZihyZXEpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICAgICAnQWNjZXNzLWtleSB2ZXJpZmljYXRpb24gaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGU7IHBsZWFzZSByZXRyeScsXG4gICAgICAgIEVycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnSW52YWxpZCBvciByZXZva2VkIGFjY2VzcyBrZXknLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gIH1cbiAgYXdhaXQgdmVyaWZ5QW5kQXR0YWNoKG9wdGlvbnMsIHRva2VuLCByZXEsIHJlcywgbmV4dCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUFuZEF0dGFjaChcbiAgb3B0aW9uczogUmVxdWlyZUF1dGhPcHRpb25zLFxuICByYXdUb2tlbjogc3RyaW5nLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIFR3byBjaGFpbnMsIG9uZSBlbnRyeSBwb2ludCAoc2VlIGB2ZXJpZnlCZWFyZXJUb2tlbmApOiBhIHVzZXIgdG9rZW4gbXVzdFxuICAgIC8vIGJlIEVTMjU2IHNpZ25lZCBieSBwbGF0Zm9ybSBhbmQgdmVyaWZpZWQgYWdhaW5zdCBpdHMgcHVibGlzaGVkIEpXS1M7IGFuXG4gICAgLy8gaW50ZXJuYWwgc2VydmljZSB0b2tlbiBtdXN0IGJlIEVTMjU2IHNpZ25lZCBieSB0aGF0IHNlcnZpY2UncyBPV04ga2V5IGFuZFxuICAgIC8vIGRlY2xhcmUgaXRzZWxmIGEgc2VydmljZSBwcmluY2lwYWwuIEJvdGggcGluIHRoZSBhbGdvcml0aG0gKG5vXG4gICAgLy8gYWxnLWNvbmZ1c2lvbiwgbm8gYGFsZzpub25lYCkgYW5kIGJvdGggYXBwbHkgdGhlIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZVxuICAgIC8vIGJpbmRpbmcuXG4gICAgY29uc3QgZGVjb2RlZCA9IGF3YWl0IHZlcmlmeUJlYXJlclRva2VuKHJhd1Rva2VuKTtcblxuICAgIGlmIChkZWNvZGVkLnR5cGUgIT09ICdhY2Nlc3MnKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdPbmx5IGFjY2VzcyB0b2tlbnMgY2FuIGJlIHVzZWQgZm9yIEFQSSByZXF1ZXN0cycsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICBpZiAoIWRlY29kZWQuc3ViIHx8ICFkZWNvZGVkLnJvbGUgfHwgIWhhc1ZhbGlkSWRlbnRpdHlDbGFpbXMoZGVjb2RlZCkpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIC8vIFNlcnZpY2UtdG9rZW4ga2lsbC1zd2l0Y2g6IHJlamVjdCBhIHNlcnZpY2UgcHJpbmNpcGFsIHdob3NlIHNlcnZpY2UgaGFzXG4gICAgLy8gYmVlbiBhZGRlZCB0byB0aGUgZGVueWxpc3QuIE90aGVyd2lzZSB0aGUgb25seSB3YXkgdG8gaW52YWxpZGF0ZSBhXG4gICAgLy8gc2VydmljZSdzIHRva2VucyBiZWZvcmUgdGhlaXIgKHNob3J0KSBUVEwgaXMgcm90YXRpbmcgdGhhdCBzZXJ2aWNlJ3NcbiAgICAvLyBzaWduaW5nIGtleTsgdGhpcyBjdXRzIG9uZSBjb21wcm9taXNlZC9yb2d1ZSBzZXJ2aWNlIG9mZiBpbW1lZGlhdGVseS4gTygxKSBTZXQgbG9va3VwLCB6ZXJvIGNvc3Qgd2hlbiB0aGUgZGVueWxpc3RcbiAgICAvLyBpcyBlbXB0eSAodGhlIGRlZmF1bHQpLCBzbyBpdCBuZXZlciB0YXhlcyB0aGUgUzJTIGhvdCBwYXRoIHVubGVzcyBhcm1lZC5cbiAgICBpZiAoaXNTZXJ2aWNlVG9rZW5EZW5pZWQoZGVjb2RlZCkpIHtcbiAgICAgIGVtaXRDb3VudGVyKCdzZXJ2aWNlX3Rva2VuX2RlbmllZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZU5hbWVPZihkZWNvZGVkKSA/PyAndW5rbm93bicgfSk7XG4gICAgICBsb2dnZXIud2FybignUmVqZWN0ZWQgZGVueWxpc3RlZCBzZXJ2aWNlIHRva2VuJywgeyBzdWI6IGRlY29kZWQuc3ViIH0pO1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnU2VydmljZSB0b2tlbiByZXZva2VkJywgRXJyb3JDb2RlLlRPS0VOX1JFVk9LRUQpO1xuICAgIH1cblxuICAgIHJlcS51c2VyID0geyAuLi5kZWNvZGVkIH07XG5cbiAgICAvLyBSRUFELU9OTFkgSU1QRVJTT05BVElPTi4gVGhlIHRva2VuIG5hbWVzIHRoZSBvcGVyYXRvciBBTkQgc2F5cyBpdCBtYXkgb25seVxuICAgIC8vIGxvb2s6IGV2ZXJ5IHNlcnZpY2UgcmVmdXNlcyBhIHN0YXRlIGNoYW5nZSB1bmRlciBpdCwgbm90IG9ubHkgcGxhdGZvcm0g4oCUXG4gICAgLy8gYSBzdXBwb3J0IHNlc3Npb24gdGhhdCBjb3VsZCB3cml0ZSB0byBwbHVnaW4vY29tcGxpYW5jZS9iaWxsaW5nIGlzIG5vdFxuICAgIC8vIHJlYWQtb25seS4gQ2hlY2tlZCBiZWZvcmUgYW55IG90aGVyIGdhdGUgc28gbm8gcm91dGUgY2FuIGZvcmdldCBpdC5cbiAgICBpZiAoaXNJbXBlcnNvbmF0aW9uV3JpdGVCbG9ja2VkKHJlcS5tZXRob2QsIGRlY29kZWQpKSB7XG4gICAgICBpZiAocmVxLm1ldGhvZCkgcmVjb3JkQXV0aHpEZW5pYWwocmVxLCAnaW1wZXJzb25hdGlvbi1yZWFkLW9ubHknKTtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICAgICdXcml0ZSByZXF1ZXN0cyBhcmUgZGlzYWJsZWQgZHVyaW5nIHJlYWQtb25seSBpbXBlcnNvbmF0aW9uLiBTdG9wIGltcGVyc29uYXRpbmcgdG8gbWFrZSBjaGFuZ2VzLicsXG4gICAgICAgIEVycm9yQ29kZS5JTVBFUlNPTkFUSU9OX1JFQURfT05MWSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQk9PVFNUUkFQLUFETUlOIEVOUk9MTUVOVCBTRVNTSU9OLiBTdWNoIGEgdG9rZW4gZXhpc3RzIHNvXG4gICAgLy8gdGhlIGluc3RhbGwncyBvbmx5IGFkbWluIGNhbiBlbnJvbCBhIGZhY3RvcjsgaXQgaXMgYGFhbDogMWAgYW5kIG11c3Qgbm90XG4gICAgLy8gcmVhY2ggYW55dGhpbmcgZWxzZS4gUGxhdGZvcm0g4oCUIHdoaWNoIG93bnMgdGhlIGV4Y2VwdGlvbiBhbmQga25vd3Mgd2hpY2hcbiAgICAvLyBvZiBpdHMgb3duIHJvdXRlcyBgaW5pdC1wbGF0Zm9ybS5zaGAgY2FsbHMg4oCUIGFsbG93cyBhbiBleHBsaWNpdCBmZXcgYmVmb3JlXG4gICAgLy8gdGhpcyBwb2ludCAoc2VlIGl0cyBvd24gYHJlcXVpcmVBdXRoYCk7IGluIEVWRVJZIG90aGVyIHNlcnZpY2UgdGhlIGFuc3dlclxuICAgIC8vIGlzIHNpbXBseSBubywgc28gdGhlIHJlYWNoIHJlc3RyaWN0aW9uIGhvbGRzIHdpdGhvdXQgYSBwZXItc2VydmljZVxuICAgIC8vIGFsbG93bGlzdCB0byBrZWVwIGluIHN5bmMuXG4gICAgaWYgKGRlY29kZWQubWZhRW5yb2xsbWVudFBlbmRpbmcgPT09IHRydWUpIHtcbiAgICAgIGVtaXRDb3VudGVyKCdtZmFfZW5mb3JjZW1lbnRfcmVmdXNlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZUlkZW50aXR5KCksIHJlYXNvbjogJ2Jvb3RzdHJhcF9zZXNzaW9uJyB9KTtcbiAgICAgIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgJ21mYS1lbnJvbG1lbnQnKTtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICAgICdGaW5pc2ggc2V0dGluZyB1cCB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIGJlZm9yZSB1c2luZyB0aGUgcmVzdCBvZiBQaXBlbGluZSBCdWlsZGVyJyxcbiAgICAgICAgRXJyb3JDb2RlLk1GQV9FTlJPTExNRU5UX1JFUVVJUkVELFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTZXNzaW9uLWxldmVsIGFzc3VyYW5jZSAoYHJlcXVpcmVBdXRoKHsgbWluQXNzdXJhbmNlLCBtYXhBZ2UgfSlgKS5cbiAgICBpZiAob3B0aW9ucy5taW5Bc3N1cmFuY2VcbiAgICAgICYmIHJlZnVzZUZvckFzc3VyYW5jZSh7IG1pbkFzc3VyYW5jZTogb3B0aW9ucy5taW5Bc3N1cmFuY2UsIC4uLihvcHRpb25zLm1heEFnZSAhPT0gdW5kZWZpbmVkID8geyBtYXhBZ2U6IG9wdGlvbnMubWF4QWdlIH0gOiB7fSkgfSwgZGVjb2RlZCwgcmVxLCByZXMpKSByZXR1cm47XG5cbiAgICAvLyBUaGUgeC1vcmctaWQveC1vcmctbmFtZSBvdmVycmlkZSBsZXRzIGEgU1lTLUFETUlOIGFjdCBvbiBhIGNob3NlbiBvcmdcbiAgICAvLyAoY3Jvc3Mtb3JnIGFkbWluIHRvb2xpbmcpLiBJdCBpcyBnYXRlZCBvbiB0aGUgdmVyaWZpZWQgYGlzU3VwZXJBZG1pbmAgY2xhaW1cbiAgICAvLyBoZXJlIHNvIHRoYXQgZXZlbiBhIHJvdXRlIHdoaWNoIG1pc3Rha2VubHkgZW5hYmxlcyBgYWxsb3dPcmdIZWFkZXJPdmVycmlkZWBcbiAgICAvLyBjYW4gTkVWRVIgbGV0IGFuIG9yZGluYXJ5IGF1dGhlbnRpY2F0ZWQgdXNlciBzcG9vZiBhbm90aGVyIHRlbmFudCdzIG9yZyB2aWFcbiAgICAvLyB0aGUgaGVhZGVyIOKAlCBkZWZlbmNlLWluLWRlcHRoIGFnYWluc3QgdGhlIGNyb3NzLXRlbmFudCBicmVhayB0aGlzIGNhdXNlZC5cbiAgICBpZiAob3B0aW9ucy5hbGxvd09yZ0hlYWRlck92ZXJyaWRlICYmIGRlY29kZWQuaXNTdXBlckFkbWluID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBoZWFkZXJPcmdJZCA9IGdldEhlYWRlclN0cmluZyhyZXEuaGVhZGVyc1sneC1vcmctaWQnXSk7XG4gICAgICBjb25zdCBoZWFkZXJPcmdOYW1lID0gZ2V0SGVhZGVyU3RyaW5nKHJlcS5oZWFkZXJzWyd4LW9yZy1uYW1lJ10pO1xuICAgICAgaWYgKGhlYWRlck9yZ0lkKSByZXEudXNlci5vcmdhbml6YXRpb25JZCA9IGhlYWRlck9yZ0lkO1xuICAgICAgaWYgKGhlYWRlck9yZ05hbWUpIHJlcS51c2VyLm9yZ2FuaXphdGlvbk5hbWUgPSBoZWFkZXJPcmdOYW1lO1xuICAgIH1cblxuICAgIC8vIFJlLWRlcml2ZSB0aGUgcmVxdWVzdCdzIHRlbmFudCBpZGVudGl0eSBmcm9tIHRoZSBOT1ctdmVyaWZpZWQgSldULlxuICAgIC8vXG4gICAgLy8gYGF0dGFjaFJlcXVlc3RDb250ZXh0YCBydW5zIGFzIGEgZ2xvYmFsIG1pZGRsZXdhcmUgQkVGT1JFIHRoaXMgcGVyLXJvdXRlXG4gICAgLy8gYHJlcXVpcmVBdXRoYCwgc28gaXQgY2FwdHVyZWQgYHJlcS5jb250ZXh0LmlkZW50aXR5YCB3aGlsZSBgcmVxLnVzZXJgIHdhc1xuICAgIC8vIHN0aWxsIHVuZGVmaW5lZCDigJQgYXQgd2hpY2ggcG9pbnQgYGdldElkZW50aXR5YCBmYWxscyBiYWNrIHRvIHRoZSByYXcsXG4gICAgLy8gY2xpZW50LXNldHRhYmxlIGB4LW9yZy1pZGAvYHgtdXNlci1pZGAgaGVhZGVycy4gRXZlcnkgZG93bnN0cmVhbSB0ZW5hbnQtXG4gICAgLy8gYXV0aG9yaXR5IGNvbnN1bWVyIChyZXF1aXJlT3JnSWQsIHdpdGhUZW5hbnRDb250ZXh0J3MgUkxTIHNjb3BlLCBjaGVja1F1b3RhLFxuICAgIC8vIHdpdGhSb3V0ZSwgYW5kIHRoZSBpZGVtcG90ZW5jeSBuYW1lc3BhY2UpIHJlYWRzIGByZXEuY29udGV4dC5pZGVudGl0eWAsIHNvXG4gICAgLy8gdGhhdCBmcm96ZW4gaGVhZGVyLWRlcml2ZWQgdmFsdWUg4oCUIG5vdCB0aGUgSldUIOKAlCB3YXMgZ292ZXJuaW5nIHRlbmFuY3kgb25cbiAgICAvLyBhbnkgbm9uLW5naW54IHBhdGguIFJlY29tcHV0aW5nIGhlcmUsIGF0IHRoZSBzaW5nbGUgcG9zdC12ZXJpZmljYXRpb24gY2hva2VcbiAgICAvLyBwb2ludCwgbWFrZXMgYGdldElkZW50aXR5YCBwcmVmZXIgdGhlIHZlcmlmaWVkIGByZXEudXNlcmAgKHNlZSBpZGVudGl0eS50cylcbiAgICAvLyBzbyB0ZW5hbmN5IGlzIEpXVC1hdXRob3JpdGF0aXZlLiBUaGUgbmdpbnggYHgtb3JnLWlkYCBvdmVyd3JpdGUgc3RheXMgYXNcbiAgICAvLyBkZWZlbmNlLWluLWRlcHRoLiBHdWFyZGVkIG9uIGByZXEuY29udGV4dGAgc28gc2VydmljZXMvcGF0aHMgdGhhdCBuZXZlclxuICAgIC8vIGF0dGFjaCBhIGNvbnRleHQgKG9yIHJ1biByZXF1aXJlQXV0aCBwcmUtY29udGV4dCkgYXJlIHVuYWZmZWN0ZWQuXG4gICAgY29uc3QgcmVxQ3R4ID0gKHJlcSBhcyBSZXF1ZXN0ICYgeyBjb250ZXh0PzogeyBpZGVudGl0eTogUmVxdWVzdElkZW50aXR5IH0gfSkuY29udGV4dDtcbiAgICBpZiAocmVxQ3R4KSB7XG4gICAgICByZXFDdHguaWRlbnRpdHkgPSBnZXRJZGVudGl0eShyZXEgYXMgdW5rbm93biBhcyBIdHRwUmVxdWVzdCk7XG4gICAgfVxuXG4gICAgLy8gU2Vzc2lvbiBpbnZhbGlkYXRpb24gKHRva2VuLXZlcnNpb24gc3RvcmUgKyBpbXBlcnNvbmF0aW9uLXNlc3Npb25cbiAgICAvLyBsaXZlbmVzcykuIE5vIHN0b3JlIHJlZ2lzdGVyZWQg4oeSIG9ubHkgaW1wZXJzb25hdGlvbiBzZXNzaW9ucyBhcmUgY2hlY2tlZC5cbiAgICBpZiAobmVlZHNSZXZvY2F0aW9uQ2hlY2soZGVjb2RlZCkpIHtcbiAgICAgIC8vIGAuY2F0Y2gobmV4dClgIGZvcndhcmRzIGEgRE9XTlNUUkVBTSBzeW5jaHJvbm91cyB0aHJvdyBmcm9tIGBuZXh0KClgIHRvXG4gICAgICAvLyBFeHByZXNzJ3MgZXJyb3IgbWlkZGxld2FyZSDigJQgdGhpcyBgbmV4dCgpYCBydW5zIGluIGEgbWljcm90YXNrLCBvdXRzaWRlXG4gICAgICAvLyB0aGUgc3Vycm91bmRpbmcgdHJ5L2NhdGNoLiBUaGUgY2hlY2sgaXRzZWxmIG5ldmVyIHJlamVjdHMuXG4gICAgICBjaGVja1Jldm9jYXRpb24oZGVjb2RlZCkudGhlbigocmVmdXNhbCkgPT4ge1xuICAgICAgICBpZiAocmVmdXNhbCkgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCByZWZ1c2FsLCBFcnJvckNvZGUuVE9LRU5fUkVWT0tFRCk7XG4gICAgICAgIHJ1bkRlZmVycmVkUXVvdGFDaGVjayhyZXEsIHJlcywgbmV4dCk7XG4gICAgICB9KS5jYXRjaChuZXh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgYXBpQ2FsbHMgY2hlY2sgYSBtb3VudCBhcm1lZCAoYXBpLXNlcnZlciBgYXBpQ2FsbHNRdW90YWApIHJ1bnMgaGVyZSxcbiAgICAvLyBub3cgdGhhdCB0ZW5hbmN5IGlzIEpXVC1hdXRob3JpdGF0aXZlOyBhIHBsYWluIG5leHQoKSB3aGVyZSBub25lIHdhcyBhcm1lZC5cbiAgICBydW5EZWZlcnJlZFF1b3RhQ2hlY2socmVxLCByZXMsIG5leHQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIGp3dC5Ub2tlbkV4cGlyZWRFcnJvcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnVG9rZW4gaGFzIGV4cGlyZWQnLCBFcnJvckNvZGUuVE9LRU5fRVhQSVJFRCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNpZ25pbmcga2V5cyBjb3VsZG4ndCBiZSBmZXRjaGVkLCBzbyB0aGUgdG9rZW4ncyB2YWxpZGl0eSBpcyBVTktOT1dOLlxuICAgIC8vIEZhaWwgQ0xPU0VEIHdpdGggYSByZXRyeWFibGUgNTAzIOKAlCBuZXZlciBhIHBhc3MsIGFuZCBuZXZlciBhIDQwMSB0aGF0XG4gICAgLy8gd291bGQgc2VuZCBhIGxlZ2l0aW1hdGUgY2xpZW50IG9mZiB0byByZS1hdXRoZW50aWNhdGUgb3ZlciBvdXIgb3V0YWdlLlxuICAgIC8vIFNhbWUgcmVhc29uaW5nIGZvciB0aGUgU0VSVklDRSBjaGFpbjogbm8gcmVhZGFibGUga2V5IGJ1bmRsZSBtZWFucyBubyB3YXlcbiAgICAvLyB0byB0ZWxsIGEgcGVlcidzIHRva2VuIGZyb20gYSBmb3JnZXJ5LCBzbyB0aGUgcmVxdWVzdCBpcyByZWZ1c2VkIHdpdGggYVxuICAgIC8vIHJldHJ5YWJsZSA1MDMgcmF0aGVyIHRoYW4gYWRtaXR0ZWQgb3IgYm91bmNlZCB0byByZS1hdXRoZW50aWNhdGUuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSndrc1VuYXZhaWxhYmxlRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBTZXJ2aWNlS2V5RXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZWplY3RpbmcgcmVxdWVzdDogdG9rZW4gc2lnbmluZyBrZXlzIHVuYXZhaWxhYmxlJywgeyBlcnJvcjogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICAgICAnVG9rZW4gdmVyaWZpY2F0aW9uIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlOyBwbGVhc2UgcmV0cnknLFxuICAgICAgICBFcnJvckNvZGUuU0VSVklDRV9VTkFWQUlMQUJMRSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5rbm93bktpZEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2Ygand0Lkpzb25XZWJUb2tlbkVycm9yKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdJbnZhbGlkIHRva2VuJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICB9XG59XG5cbiJdfQ==
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZGRsZXdhcmUvYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBUXRDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSwyQkFBMkIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBdUIsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUF3QixNQUFNLHNC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QUFZLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQy9FLE9BQU8sU0FBUyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsWUFBWSxFQUFFLHVCQUF1QixFQUFFLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIGByZXF1aXJlQXV0aGA6IGJlYXJlciAvIGFjY2Vzcy1rZXkgYXV0aGVudGljYXRpb24sIHRoZSBjaGVja3MgZXZlcnlcbiAqIHZlcmlmaWVkIHJlcXVlc3QgcGFzc2VzLCBhbmQgdGhlIHRlbmFudCBpZGVudGl0eSBpdCBhdHRhY2hlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBqd3QgZnJvbSAnanNvbndlYnRva2VuJztcbmltcG9ydCB7IHJlZnVzZUZvckFzc3VyYW5jZSB9IGZyb20gJy4vYXNzdXJhbmNlLmpzJztcbmltcG9ydCB7IGNsaWVudFZlcnNpb25PZiB9IGZyb20gJy4vY2xpZW50LXZlcnNpb24uanMnO1xuaW1wb3J0IHsgcnVuRGVmZXJyZWRRdW90YUNoZWNrIH0gZnJvbSAnLi9kZWZlcnJlZC1xdW90YS1jaGVjay5qcyc7XG5pbXBvcnQgeyBoYXNWYWxpZElkZW50aXR5Q2xhaW1zLCB2ZXJpZnlCZWFyZXJUb2tlbiB9IGZyb20gJy4vand0LXZlcmlmeS5qcyc7XG5pbXBvcnQgeyByZWNvcmRBdXRoekRlbmlhbCB9IGZyb20gJy4vcGVybWlzc2lvbi1nYXRlcy5qcyc7XG5pbXBvcnQgeyBjaGVja1Jldm9jYXRpb24sIGlzSW1wZXJzb25hdGlvbldyaXRlQmxvY2tlZCwgbmVlZHNSZXZvY2F0aW9uQ2hlY2sgfSBmcm9tICcuL3Jldm9jYXRpb24uanMnO1xuaW1wb3J0IHsgdGFnUm91dGVHYXRlIH0gZnJvbSAnLi9yb3V0ZS10YWJsZS5qcyc7XG5pbXBvcnQgeyBpc1NlcnZpY2VUb2tlbkRlbmllZCwgc2VydmljZU5hbWVPZiB9IGZyb20gJy4vc2VydmljZS10b2tlbnMuanMnO1xuaW1wb3J0IHsgSHR0cFN0YXR1cyB9IGZyb20gJy4uL2NvbnN0YW50cy9odHRwLXN0YXR1cy5qcyc7XG5pbXBvcnQgeyBKd2tzVW5hdmFpbGFibGVFcnJvciwgVW5rbm93bktpZEVycm9yIH0gZnJvbSAnLi4vc2VydmljZXMvandrcy1jYWNoZS5qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlS2V5RXJyb3IsIHNlcnZpY2VJZGVudGl0eSB9IGZyb20gJy4uL3NlcnZpY2VzL3NlcnZpY2Uta2V5cy5qcyc7XG5pbXBvcnQgeyB0eXBlIEFzc3VyYW5jZUxldmVsIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJy4uL3R5cGVzL2Vycm9yLWNvZGVzLmpzJztcbmltcG9ydCB0eXBlIHsgSHR0cFJlcXVlc3QgfSBmcm9tICcuLi90eXBlcy9odHRwLmpzJztcbmltcG9ydCB7IGlzT3BhcXVlQXBpS2V5IH0gZnJvbSAnLi4vdXRpbHMvYXBpLWtleS5qcyc7XG5pbXBvcnQgeyBnZXRIZWFkZXJTdHJpbmcgfSBmcm9tICcuLi91dGlscy9oZWFkZXJzLmpzJztcbmltcG9ydCB7IGdldElkZW50aXR5LCB0eXBlIFJlcXVlc3RJZGVudGl0eSB9IGZyb20gJy4uL3V0aWxzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcbmltcG9ydCB7IHNlbmRFcnJvciB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdhdXRoLW1pZGRsZXdhcmUnKTtcbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWlyZUF1dGhPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFsbG93IHgtb3JnLWlkL3gtb3JnLW5hbWUgaGVhZGVycyB0byBvdmVycmlkZSB0aGUgSldUJ3Mgb3JnYW5pemF0aW9uIGZpZWxkcy5cbiAgICpcbiAgICogV2hlbiBlbmFibGVkLCB0aGUgYHgtb3JnLWlkYC9geC1vcmctbmFtZWAgaGVhZGVycyBvdmVycmlkZSB0aGUgY2FsbGVyJ3Mgb3JnXG4gICAqIOKAlCBidXQgT05MWSBmb3IgYSB2ZXJpZmllZCBTWVMtQURNSU4gKGBpc1N1cGVyQWRtaW5gIGNsYWltKS4gRm9yIGFueSBvcmRpbmFyeVxuICAgKiBhdXRoZW50aWNhdGVkIHVzZXIgdGhlIGhlYWRlcnMgYXJlIGlnbm9yZWQsIHNvIGVuYWJsaW5nIHRoaXMgY2FuIG5ldmVyIGxldCBhXG4gICAqIG5vcm1hbCB1c2VyIGltcGVyc29uYXRlIGFub3RoZXIgdGVuYW50J3Mgb3JnLiBVc2UgZm9yIGNyb3NzLW9yZyBhZG1pbiB0b29saW5nXG4gICAqIChlLmcuIGEgc3lzYWRtaW4gbWFuYWdpbmcgYSBnaXZlbiBvcmcncyBiaWxsaW5nKS4gSWYgdW5zdXJlLCBsZWF2ZSBpdCBkaXNhYmxlZC5cbiAgICovXG4gIGFsbG93T3JnSGVhZGVyT3ZlcnJpZGU/OiBib29sZWFuO1xuICAvKipcbiAgICogRGVtYW5kIHRoYXQgdGhlIHdob2xlIFNFU1NJT04gYmUgYXQgbGVhc3QgdGhpcyBhc3N1cmFuY2UgbGV2ZWwuXG4gICAqXG4gICAqIGBtaW5Bc3N1cmFuY2U6IDJgIG1lYW5zIHRoZSBwZXJzb24gYXV0aGVudGljYXRlZCB3aXRoIGEgc2Vjb25kIGZhY3RvciDigJQgYVxuICAgKiBwYXNza2V5IHdpdGggdXNlciB2ZXJpZmljYXRpb24sIGEgcGFzc3dvcmQgcGx1cyBhbiBhdXRoZW50aWNhdG9yIGNvZGUsIG9yXG4gICAqIFNTTyB0aHJvdWdoIGFuIElkUCB0aGUgb3JnIG1hcmtlZCBhcyBlbmZvcmNpbmcgTUZBLiBBIHdlYWtlciB0b2tlbiBnZXRzXG4gICAqICoqNDAxIGBNRkFfUkVRVUlSRURgKiosIHdoaWNoIHRoZSBjbGllbnQgYW5zd2VycyBieSBzZW5kaW5nIHRoZSBwZXJzb24gdG9cbiAgICogZW5yb2xtZW50IG9yIHRvIGEgc3Ryb25nZXIgc2lnbi1pbjsgcmVmcmVzaGluZyBjYW5ub3QgaGVscCwgYmVjYXVzZSBgYWFsYFxuICAgKiBsaXZlcyBvbiB0aGUgc2Vzc2lvbiBzbG90IGFuZCBhIHJlZnJlc2ggbmV2ZXIgcmFpc2VzIGl0LlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBTRVNTSU9OLWxldmVsIGNvdW50ZXJwYXJ0IHRvIHtAbGluayByZXF1aXJlU3RlcFVwfSwgd2hpY2ggc3RheXNcbiAgICogYSBmcmVzaCwgcGVyLWFjdGlvbiBjb25maXJtYXRpb24uIFVzZSBib3RoIG9uIHRoZSBtb3N0IGRhbmdlcm91cyByb3V0ZXMuXG4gICAqXG4gICAqIE1BQ0hJTkVTIE5FVkVSIFNBVElTRlkgSVQuIEEgc2VydmljZSBwcmluY2lwYWwsIGFuIG9yZyBzZXJ2aWNlIGFjY291bnQgYW5kXG4gICAqIGFuIGV4Y2hhbmdlZCBhY2Nlc3Mga2V5IGFsbCBnZXQgKio0MDMgYEhVTUFOX1NFU1NJT05fUkVRVUlSRURgKiog4oCUIHRoZXJlIGlzXG4gICAqIG5vIHBlcnNvbiBiZWhpbmQgdGhlbSB0byBoYXZlIHByZXNlbnRlZCBhIGZhY3Rvciwgc28gXCJhc3N1cmFuY2VcIiBpcyBub3QgYVxuICAgKiBxdWVzdGlvbiB0aGVpciBjcmVkZW50aWFsIGNhbiBhbnN3ZXIuIFRoYXQgaXMgZGVsaWJlcmF0ZWx5IG5vdCBhIHNpbGVudFxuICAgKiBwYXNzLXRocm91Z2ggZm9yIGludGVybmFsIHNlcnZpY2VzOiBhIHJvdXRlIHRoYXQgZGVtYW5kcyBNRkEgaXMgYSByb3V0ZSBhXG4gICAqIGh1bWFuIGlzIGRvaW5nIHNvbWV0aGluZyBkYW5nZXJvdXMgb24uXG4gICAqL1xuICBtaW5Bc3N1cmFuY2U/OiBBc3N1cmFuY2VMZXZlbDtcbiAgLyoqXG4gICAqIFdpdGgge0BsaW5rIG1pbkFzc3VyYW5jZX0sIGFkZGl0aW9uYWxseSBib3VuZCBob3cgbG9uZyBhZ28gdGhhdCBzaWduLWluXG4gICAqIGhhcHBlbmVkIChzZWNvbmRzLCBjb21wYXJlZCBhZ2FpbnN0IHRoZSB0b2tlbidzIGBhdXRoX3RpbWVgKS4gQSBzZXNzaW9uIHRoYXRcbiAgICogaXMgTUZBLWdyYWRlIGJ1dCBvbGRlciB0aGFuIHRoaXMgZ2V0cyAqKjQwMSBgUkVBVVRIX1JFUVVJUkVEYCoqLiBJZ25vcmVkXG4gICAqIHdpdGhvdXQgYG1pbkFzc3VyYW5jZWAg4oCUIFwiaG93IHJlY2VudFwiIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbmNlIFwiaG93IHN0cm9uZ1wiXG4gICAqIGlzIGJlaW5nIGFza2VkLlxuICAgKi9cbiAgbWF4QWdlPzogbnVtYmVyO1xuICAvKipcbiAgICogT3V0LW9mLWNsdXN0ZXIgc2VydmljZSBzaWduZXJzIHRoaXMgcm91dGUgdHJ1c3RzIChgT1BUX0lOX1NFUlZJQ0VfU0lHTkVSU2BcbiAgICogaW4gYHNlcnZpY2VzL3NlcnZpY2Uta2V5cy50c2Ag4oCUIHRvZGF5IG9ubHkgYCdkZXBsb3ktYm9vdHN0cmFwJ2AsIHdob3NlXG4gICAqIHByaXZhdGUga2V5IGxpdmVzIG9uIHRoZSBvcGVyYXRvciAvIENJIGhvc3QgcmF0aGVyIHRoYW4gaW4gYW55IHBvZCkuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQgRVZFUlkgcm91dGUgcmVmdXNlcyBzdWNoIGEgdG9rZW4gd2l0aCAqKjQwMSBgVE9LRU5fSU5WQUxJRGAqKixcbiAgICogZXhhY3RseSBhcyBpZiBpdHMga2V5IHdlcmUgbm90IGluIHRoZSBidW5kbGUg4oCUIHRoZSBkZXBsb3kga2V5J3MgcHVibGljIGhhbGZcbiAgICogaXMgbW91bnRlZCBldmVyeXdoZXJlLCBzbyB0cnVzdGluZyBpdCBtdXN0IGJlIGEgcGVyLXJvdXRlIGRlY2lzaW9uLCBub3QgYW5cbiAgICogaW5oZXJpdGVkIG9uZS4gT3B0aW5nIGluIGFkbWl0cyB0aGUgdG9rZW4gYXMgYSBwbGFpbiBzZXJ2aWNlIHByaW5jaXBhbDogaXRcbiAgICogc3RpbGwgY2FycmllcyBubyBzdXBlcmFkbWluIG9yIG9yZy1hZG1pbiBhdXRob3JpdHkgKG5vIHNlcnZpY2UgdG9rZW4gZG9lcyksXG4gICAqIHNvIHRoZSByb3V0ZSBtdXN0IGdhdGUgb24gaXRzIE5BTUUgKGBpc1NlcnZpY2VQcmluY2lwYWxOYW1lZGApIGFuZC9vciBpdHNcbiAgICogZXhwbGljaXQgYHBlcm1pc3Npb25zYCBjbGFpbS5cbiAgICovXG4gIGFjY2VwdFNlcnZpY2VzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKiBKV1QgYXV0aCBtaWRkbGV3YXJlLiBVc2UgZGlyZWN0bHkgb3IgY2FsbCB3aXRoIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgb3B0aW9ucz86IFJlcXVpcmVBdXRoT3B0aW9ucyxcbik6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgcmVxT3JPcHRpb25zPzogUmVxdWVzdCB8IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVzPzogUmVzcG9uc2UsXG4gIG5leHQ/OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHwgKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZCkge1xuICBpZiAocmVxT3JPcHRpb25zICYmIHJlcyAmJiBuZXh0ICYmICdoZWFkZXJzJyBpbiByZXFPck9wdGlvbnMpIHtcbiAgICByZXR1cm4gX3JlcXVpcmVBdXRoKHt9LCByZXFPck9wdGlvbnMgYXMgUmVxdWVzdCwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSAocmVxT3JPcHRpb25zIGFzIFJlcXVpcmVBdXRoT3B0aW9ucykgfHwge307XG4gIGNvbnN0IGdhdGUgPSB0YWdSb3V0ZUdhdGUoKHJlcTogUmVxdWVzdCwgcmVzSW5uZXI6IFJlc3BvbnNlLCBuZXh0SW5uZXI6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIF9yZXF1aXJlQXV0aChvcHRpb25zLCByZXEsIHJlc0lubmVyLCBuZXh0SW5uZXIpO1xuICB9LCB7IGtpbmQ6ICdhdXRoJyB9KTtcbiAgaWYgKG9wdGlvbnMubWluQXNzdXJhbmNlKSB7XG4gICAgdGFnUm91dGVHYXRlKGdhdGUsIHsga2luZDogJ2Fzc3VyYW5jZScsIG1pbkFzc3VyYW5jZTogb3B0aW9ucy5taW5Bc3N1cmFuY2UsIC4uLihvcHRpb25zLm1heEFnZSAhPT0gdW5kZWZpbmVkID8geyBtYXhBZ2U6IG9wdGlvbnMubWF4QWdlIH0gOiB7fSkgfSk7XG4gIH1cbiAgcmV0dXJuIGdhdGU7XG59XG50YWdSb3V0ZUdhdGUocmVxdWlyZUF1dGgsIHsga2luZDogJ2F1dGgnIH0pO1xuXG5mdW5jdGlvbiBfcmVxdWlyZUF1dGgoXG4gIG9wdGlvbnM6IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgY29uc3QgYXV0aEhlYWRlciA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb247XG5cbiAgaWYgKCFhdXRoSGVhZGVyKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aG9yaXphdGlvbiBoZWFkZXIgcmVxdWlyZWQnLCBFcnJvckNvZGUuVE9LRU5fTUlTU0lORyk7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IGF1dGhIZWFkZXIuc3BsaXQoJyAnKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMiB8fCBwYXJ0c1swXSAhPT0gJ0JlYXJlcicpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdJbnZhbGlkIGF1dGhvcml6YXRpb24gZm9ybWF0LiBVc2U6IEJlYXJlciA8dG9rZW4+JywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICB9XG5cbiAgLy8gQW4gT1BBUVVFIEFDQ0VTUyBLRVkgKGBwYl9wYXRf4oCmYCAvIGBwYl9zYV/igKZgKSBjYXJyaWVzIG5vIGNsYWltcyBhbmQgbm9cbiAgLy8gc2lnbmF0dXJlLCBzbyBpdCBjYW5ub3QgYmUgdmVyaWZpZWQgaGVyZS4gVHJhZGUgaXQgYXQgcGxhdGZvcm0gZm9yIGFcbiAgLy8gc2hvcnQtbGl2ZWQgSldUIChjYWNoZWQgaW4tcHJvY2VzcyB1bnRpbCBpdCBleHBpcmVzKSBhbmQgdGhlbiB2ZXJpZnkgdGhhdFxuICAvLyBKV1Qgb24gdGhlIG5vcm1hbCBwYXRoIOKAlCBzZXJ2aWNlcyBuZXZlciByZWFkIGEga2V5IGhhc2guIFNlZVxuICAvLyBgc2VydmljZXMvYXBpLWtleS1leGNoYW5nZS50c2AuXG4gIGlmIChpc09wYXF1ZUFwaUtleShwYXJ0c1sxXSkpIHtcbiAgICB2b2lkIHJlc29sdmVBcGlLZXkob3B0aW9ucywgcGFydHNbMV0sIHJlcSwgcmVzLCBuZXh0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBgLmNhdGNoKG5leHQpYCBmb3J3YXJkcyBhIERPV05TVFJFQU0gc3luY2hyb25vdXMgdGhyb3cgZnJvbSBgbmV4dCgpYCB0b1xuICAvLyBFeHByZXNzJ3MgZXJyb3IgbWlkZGxld2FyZSDigJQgdmVyaWZpY2F0aW9uIGl0c2VsZiBuZXZlciByZWplY3RzIChpdCBtYXBzXG4gIC8vIGV2ZXJ5IGZhaWx1cmUgdG8gYSByZXNwb25zZSkuXG4gIHZvaWQgdmVyaWZ5QW5kQXR0YWNoKG9wdGlvbnMsIHBhcnRzWzFdLCByZXEsIHJlcywgbmV4dCkuY2F0Y2gobmV4dCk7XG59XG5cbi8qKlxuICogRXhjaGFuZ2UgYW4gb3BhcXVlIGtleSBmb3IgYSBKV1QsIHRoZW4gY29udGludWUgb24gdGhlIG5vcm1hbCB2ZXJpZmljYXRpb25cbiAqIHBhdGguIEEgcmVmdXNlZCBrZXkgaXMgYSA0MDE7IGFuIHVucmVhY2hhYmxlIHBsYXRmb3JtIGlzIGEgNTAzIChuZXZlciBhIHBhc3Mg4oCUXG4gKiBhbiB1bnZlcmlmaWFibGUgY3JlZGVudGlhbCBpcyBub3QgYW4gaWRlbnRpdHkpLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQXBpS2V5KFxuICBvcHRpb25zOiBSZXF1aXJlQXV0aE9wdGlvbnMsXG4gIGtleTogc3RyaW5nLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBMb2FkZWQgTEFaSUxZLCBvbiB0aGUgZmlyc3Qga2V5IGV2ZXIgcHJlc2VudGVkLiBBIHN0YXRpYyBpbXBvcnQgd291bGQgcHV0XG4gIC8vIHRoZSBIVFRQIGNsaWVudCAoYW5kIHBsYXRmb3JtJ3MgYWRkcmVzcykgaW50byB0aGUgaW1wb3J0IGdyYXBoIG9mIGV2ZXJ5XG4gIC8vIG1vZHVsZSB0aGF0IG1lcmVseSB1c2VzIGByZXF1aXJlQXV0aGAsIHdoaWNoIGJvdGggd2lkZW5zIHRoZSBib290IGdyYXBoIGFuZFxuICAvLyBicmVha3MgYW55IHRlc3QgdGhhdCBtb2NrcyBgaHR0cC1jbGllbnQuanNgIHdpdGggYSBwYXJ0aWFsIG1vZHVsZS5cbiAgY29uc3QgeyBleGNoYW5nZUFwaUtleSwgQXBpS2V5RXhjaGFuZ2VVbmF2YWlsYWJsZUVycm9yIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZpY2VzL2FwaS1rZXktZXhjaGFuZ2UuanMnKTtcbiAgbGV0IHRva2VuOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgdG9rZW4gPSBhd2FpdCBleGNoYW5nZUFwaUtleShrZXksIGNsaWVudFZlcnNpb25PZihyZXEpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICAgICAnQWNjZXNzLWtleSB2ZXJpZmljYXRpb24gaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGU7IHBsZWFzZSByZXRyeScsXG4gICAgICAgIEVycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnSW52YWxpZCBvciByZXZva2VkIGFjY2VzcyBrZXknLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gIH1cbiAgYXdhaXQgdmVyaWZ5QW5kQXR0YWNoKG9wdGlvbnMsIHRva2VuLCByZXEsIHJlcywgbmV4dCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUFuZEF0dGFjaChcbiAgb3B0aW9uczogUmVxdWlyZUF1dGhPcHRpb25zLFxuICByYXdUb2tlbjogc3RyaW5nLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIFR3byBjaGFpbnMsIG9uZSBlbnRyeSBwb2ludCAoc2VlIGB2ZXJpZnlCZWFyZXJUb2tlbmApOiBhIHVzZXIgdG9rZW4gbXVzdFxuICAgIC8vIGJlIEVTMjU2IHNpZ25lZCBieSBwbGF0Zm9ybSBhbmQgdmVyaWZpZWQgYWdhaW5zdCBpdHMgcHVibGlzaGVkIEpXS1M7IGFuXG4gICAgLy8gaW50ZXJuYWwgc2VydmljZSB0b2tlbiBtdXN0IGJlIEVTMjU2IHNpZ25lZCBieSB0aGF0IHNlcnZpY2UncyBPV04ga2V5IGFuZFxuICAgIC8vIGRlY2xhcmUgaXRzZWxmIGEgc2VydmljZSBwcmluY2lwYWwuIEJvdGggcGluIHRoZSBhbGdvcml0aG0gKG5vXG4gICAgLy8gYWxnLWNvbmZ1c2lvbiwgbm8gYGFsZzpub25lYCkgYW5kIGJvdGggYXBwbHkgdGhlIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZVxuICAgIC8vIGJpbmRpbmcuXG4gICAgY29uc3QgZGVjb2RlZCA9IGF3YWl0IHZlcmlmeUJlYXJlclRva2VuKFxuICAgICAgcmF3VG9rZW4sXG4gICAgICBvcHRpb25zLmFjY2VwdFNlcnZpY2VzID8geyBhY2NlcHRTZXJ2aWNlczogb3B0aW9ucy5hY2NlcHRTZXJ2aWNlcyB9IDoge30sXG4gICAgKTtcblxuICAgIGlmIChkZWNvZGVkLnR5cGUgIT09ICdhY2Nlc3MnKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdPbmx5IGFjY2VzcyB0b2tlbnMgY2FuIGJlIHVzZWQgZm9yIEFQSSByZXF1ZXN0cycsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICBpZiAoIWRlY29kZWQuc3ViIHx8ICFkZWNvZGVkLnJvbGUgfHwgIWhhc1ZhbGlkSWRlbnRpdHlDbGFpbXMoZGVjb2RlZCkpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIC8vIFNlcnZpY2UtdG9rZW4ga2lsbC1zd2l0Y2g6IHJlamVjdCBhIHNlcnZpY2UgcHJpbmNpcGFsIHdob3NlIHNlcnZpY2UgaGFzXG4gICAgLy8gYmVlbiBhZGRlZCB0byB0aGUgZGVueWxpc3QuIE90aGVyd2lzZSB0aGUgb25seSB3YXkgdG8gaW52YWxpZGF0ZSBhXG4gICAgLy8gc2VydmljZSdzIHRva2VucyBiZWZvcmUgdGhlaXIgKHNob3J0KSBUVEwgaXMgcm90YXRpbmcgdGhhdCBzZXJ2aWNlJ3NcbiAgICAvLyBzaWduaW5nIGtleTsgdGhpcyBjdXRzIG9uZSBjb21wcm9taXNlZC9yb2d1ZSBzZXJ2aWNlIG9mZiBpbW1lZGlhdGVseS4gTygxKSBTZXQgbG9va3VwLCB6ZXJvIGNvc3Qgd2hlbiB0aGUgZGVueWxpc3RcbiAgICAvLyBpcyBlbXB0eSAodGhlIGRlZmF1bHQpLCBzbyBpdCBuZXZlciB0YXhlcyB0aGUgUzJTIGhvdCBwYXRoIHVubGVzcyBhcm1lZC5cbiAgICBpZiAoaXNTZXJ2aWNlVG9rZW5EZW5pZWQoZGVjb2RlZCkpIHtcbiAgICAgIGVtaXRDb3VudGVyKCdzZXJ2aWNlX3Rva2VuX2RlbmllZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZU5hbWVPZihkZWNvZGVkKSA/PyAndW5rbm93bicgfSk7XG4gICAgICBsb2dnZXIud2FybignUmVqZWN0ZWQgZGVueWxpc3RlZCBzZXJ2aWNlIHRva2VuJywgeyBzdWI6IGRlY29kZWQuc3ViIH0pO1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnU2VydmljZSB0b2tlbiByZXZva2VkJywgRXJyb3JDb2RlLlRPS0VOX1JFVk9LRUQpO1xuICAgIH1cblxuICAgIHJlcS51c2VyID0geyAuLi5kZWNvZGVkIH07XG5cbiAgICAvLyBSRUFELU9OTFkgSU1QRVJTT05BVElPTi4gVGhlIHRva2VuIG5hbWVzIHRoZSBvcGVyYXRvciBBTkQgc2F5cyBpdCBtYXkgb25seVxuICAgIC8vIGxvb2s6IGV2ZXJ5IHNlcnZpY2UgcmVmdXNlcyBhIHN0YXRlIGNoYW5nZSB1bmRlciBpdCwgbm90IG9ubHkgcGxhdGZvcm0g4oCUXG4gICAgLy8gYSBzdXBwb3J0IHNlc3Npb24gdGhhdCBjb3VsZCB3cml0ZSB0byBwbHVnaW4vY29tcGxpYW5jZS9iaWxsaW5nIGlzIG5vdFxuICAgIC8vIHJlYWQtb25seS4gQ2hlY2tlZCBiZWZvcmUgYW55IG90aGVyIGdhdGUgc28gbm8gcm91dGUgY2FuIGZvcmdldCBpdC5cbiAgICBpZiAoaXNJbXBlcnNvbmF0aW9uV3JpdGVCbG9ja2VkKHJlcS5tZXRob2QsIGRlY29kZWQpKSB7XG4gICAgICBpZiAocmVxLm1ldGhvZCkgcmVjb3JkQXV0aHpEZW5pYWwocmVxLCAnaW1wZXJzb25hdGlvbi1yZWFkLW9ubHknKTtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICAgICdXcml0ZSByZXF1ZXN0cyBhcmUgZGlzYWJsZWQgZHVyaW5nIHJlYWQtb25seSBpbXBlcnNvbmF0aW9uLiBTdG9wIGltcGVyc29uYXRpbmcgdG8gbWFrZSBjaGFuZ2VzLicsXG4gICAgICAgIEVycm9yQ29kZS5JTVBFUlNPTkFUSU9OX1JFQURfT05MWSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQk9PVFNUUkFQLUFETUlOIEVOUk9MTUVOVCBTRVNTSU9OLiBTdWNoIGEgdG9rZW4gZXhpc3RzIHNvXG4gICAgLy8gdGhlIGluc3RhbGwncyBvbmx5IGFkbWluIGNhbiBlbnJvbCBhIGZhY3RvcjsgaXQgaXMgYGFhbDogMWAgYW5kIG11c3Qgbm90XG4gICAgLy8gcmVhY2ggYW55dGhpbmcgZWxzZS4gUGxhdGZvcm0g4oCUIHdoaWNoIG93bnMgdGhlIGV4Y2VwdGlvbiBhbmQga25vd3Mgd2hpY2hcbiAgICAvLyBvZiBpdHMgb3duIHJvdXRlcyBgaW5pdC1wbGF0Zm9ybS5zaGAgY2FsbHMg4oCUIGFsbG93cyBhbiBleHBsaWNpdCBmZXcgYmVmb3JlXG4gICAgLy8gdGhpcyBwb2ludCAoc2VlIGl0cyBvd24gYHJlcXVpcmVBdXRoYCk7IGluIEVWRVJZIG90aGVyIHNlcnZpY2UgdGhlIGFuc3dlclxuICAgIC8vIGlzIHNpbXBseSBubywgc28gdGhlIHJlYWNoIHJlc3RyaWN0aW9uIGhvbGRzIHdpdGhvdXQgYSBwZXItc2VydmljZVxuICAgIC8vIGFsbG93bGlzdCB0byBrZWVwIGluIHN5bmMuXG4gICAgaWYgKGRlY29kZWQubWZhRW5yb2xsbWVudFBlbmRpbmcgPT09IHRydWUpIHtcbiAgICAgIGVtaXRDb3VudGVyKCdtZmFfZW5mb3JjZW1lbnRfcmVmdXNlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZUlkZW50aXR5KCksIHJlYXNvbjogJ2Jvb3RzdHJhcF9zZXNzaW9uJyB9KTtcbiAgICAgIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgJ21mYS1lbnJvbG1lbnQnKTtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICAgICdGaW5pc2ggc2V0dGluZyB1cCB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIGJlZm9yZSB1c2luZyB0aGUgcmVzdCBvZiBQaXBlbGluZSBCdWlsZGVyJyxcbiAgICAgICAgRXJyb3JDb2RlLk1GQV9FTlJPTExNRU5UX1JFUVVJUkVELFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTZXNzaW9uLWxldmVsIGFzc3VyYW5jZSAoYHJlcXVpcmVBdXRoKHsgbWluQXNzdXJhbmNlLCBtYXhBZ2UgfSlgKS5cbiAgICBpZiAob3B0aW9ucy5taW5Bc3N1cmFuY2VcbiAgICAgICYmIHJlZnVzZUZvckFzc3VyYW5jZSh7IG1pbkFzc3VyYW5jZTogb3B0aW9ucy5taW5Bc3N1cmFuY2UsIC4uLihvcHRpb25zLm1heEFnZSAhPT0gdW5kZWZpbmVkID8geyBtYXhBZ2U6IG9wdGlvbnMubWF4QWdlIH0gOiB7fSkgfSwgZGVjb2RlZCwgcmVxLCByZXMpKSByZXR1cm47XG5cbiAgICAvLyBUaGUgeC1vcmctaWQveC1vcmctbmFtZSBvdmVycmlkZSBsZXRzIGEgU1lTLUFETUlOIGFjdCBvbiBhIGNob3NlbiBvcmdcbiAgICAvLyAoY3Jvc3Mtb3JnIGFkbWluIHRvb2xpbmcpLiBJdCBpcyBnYXRlZCBvbiB0aGUgdmVyaWZpZWQgYGlzU3VwZXJBZG1pbmAgY2xhaW1cbiAgICAvLyBoZXJlIHNvIHRoYXQgZXZlbiBhIHJvdXRlIHdoaWNoIG1pc3Rha2VubHkgZW5hYmxlcyBgYWxsb3dPcmdIZWFkZXJPdmVycmlkZWBcbiAgICAvLyBjYW4gTkVWRVIgbGV0IGFuIG9yZGluYXJ5IGF1dGhlbnRpY2F0ZWQgdXNlciBzcG9vZiBhbm90aGVyIHRlbmFudCdzIG9yZyB2aWFcbiAgICAvLyB0aGUgaGVhZGVyIOKAlCBkZWZlbmNlLWluLWRlcHRoIGFnYWluc3QgdGhlIGNyb3NzLXRlbmFudCBicmVhayB0aGlzIGNhdXNlZC5cbiAgICAvLyBBIFNFUlZJQ0UgcHJpbmNpcGFsIG5ldmVyIHJlYWNoZXMgaXQ6IGl0cyBgaXNTdXBlckFkbWluYCBpcyBzdHJpcHBlZCBhdFxuICAgIC8vIHZlcmlmaWNhdGlvbiwgYW5kIHRoZSBwcmluY2lwYWwtdHlwZSBjaGVjayBrZWVwcyBpdCB0aGF0IHdheSBpZiB0aGF0IGV2ZXJcbiAgICAvLyByZWdyZXNzZWQuXG4gICAgaWYgKG9wdGlvbnMuYWxsb3dPcmdIZWFkZXJPdmVycmlkZSAmJiBkZWNvZGVkLmlzU3VwZXJBZG1pbiA9PT0gdHJ1ZSAmJiBkZWNvZGVkLnByaW5jaXBhbFR5cGUgIT09ICdzZXJ2aWNlJykge1xuICAgICAgY29uc3QgaGVhZGVyT3JnSWQgPSBnZXRIZWFkZXJTdHJpbmcocmVxLmhlYWRlcnNbJ3gtb3JnLWlkJ10pO1xuICAgICAgY29uc3QgaGVhZGVyT3JnTmFtZSA9IGdldEhlYWRlclN0cmluZyhyZXEuaGVhZGVyc1sneC1vcmctbmFtZSddKTtcbiAgICAgIGlmIChoZWFkZXJPcmdJZCkgcmVxLnVzZXIub3JnYW5pemF0aW9uSWQgPSBoZWFkZXJPcmdJZDtcbiAgICAgIGlmIChoZWFkZXJPcmdOYW1lKSByZXEudXNlci5vcmdhbml6YXRpb25OYW1lID0gaGVhZGVyT3JnTmFtZTtcbiAgICB9XG5cbiAgICAvLyBSZS1kZXJpdmUgdGhlIHJlcXVlc3QncyB0ZW5hbnQgaWRlbnRpdHkgZnJvbSB0aGUgTk9XLXZlcmlmaWVkIEpXVC5cbiAgICAvL1xuICAgIC8vIGBhdHRhY2hSZXF1ZXN0Q29udGV4dGAgcnVucyBhcyBhIGdsb2JhbCBtaWRkbGV3YXJlIEJFRk9SRSB0aGlzIHBlci1yb3V0ZVxuICAgIC8vIGByZXF1aXJlQXV0aGAsIHNvIGl0IGNhcHR1cmVkIGByZXEuY29udGV4dC5pZGVudGl0eWAgd2hpbGUgYHJlcS51c2VyYCB3YXNcbiAgICAvLyBzdGlsbCB1bmRlZmluZWQg4oCUIGF0IHdoaWNoIHBvaW50IGBnZXRJZGVudGl0eWAgZmFsbHMgYmFjayB0byB0aGUgcmF3LFxuICAgIC8vIGNsaWVudC1zZXR0YWJsZSBgeC1vcmctaWRgL2B4LXVzZXItaWRgIGhlYWRlcnMuIEV2ZXJ5IGRvd25zdHJlYW0gdGVuYW50LVxuICAgIC8vIGF1dGhvcml0eSBjb25zdW1lciAocmVxdWlyZU9yZ0lkLCB3aXRoVGVuYW50Q29udGV4dCdzIFJMUyBzY29wZSwgY2hlY2tRdW90YSxcbiAgICAvLyB3aXRoUm91dGUsIGFuZCB0aGUgaWRlbXBvdGVuY3kgbmFtZXNwYWNlKSByZWFkcyBgcmVxLmNvbnRleHQuaWRlbnRpdHlgLCBzb1xuICAgIC8vIHRoYXQgZnJvemVuIGhlYWRlci1kZXJpdmVkIHZhbHVlIOKAlCBub3QgdGhlIEpXVCDigJQgd2FzIGdvdmVybmluZyB0ZW5hbmN5IG9uXG4gICAgLy8gYW55IG5vbi1uZ2lueCBwYXRoLiBSZWNvbXB1dGluZyBoZXJlLCBhdCB0aGUgc2luZ2xlIHBvc3QtdmVyaWZpY2F0aW9uIGNob2tlXG4gICAgLy8gcG9pbnQsIG1ha2VzIGBnZXRJZGVudGl0eWAgcHJlZmVyIHRoZSB2ZXJpZmllZCBgcmVxLnVzZXJgIChzZWUgaWRlbnRpdHkudHMpXG4gICAgLy8gc28gdGVuYW5jeSBpcyBKV1QtYXV0aG9yaXRhdGl2ZS4gVGhlIG5naW54IGB4LW9yZy1pZGAgb3ZlcndyaXRlIHN0YXlzIGFzXG4gICAgLy8gZGVmZW5jZS1pbi1kZXB0aC4gR3VhcmRlZCBvbiBgcmVxLmNvbnRleHRgIHNvIHNlcnZpY2VzL3BhdGhzIHRoYXQgbmV2ZXJcbiAgICAvLyBhdHRhY2ggYSBjb250ZXh0IChvciBydW4gcmVxdWlyZUF1dGggcHJlLWNvbnRleHQpIGFyZSB1bmFmZmVjdGVkLlxuICAgIGNvbnN0IHJlcUN0eCA9IChyZXEgYXMgUmVxdWVzdCAmIHsgY29udGV4dD86IHsgaWRlbnRpdHk6IFJlcXVlc3RJZGVudGl0eSB9IH0pLmNvbnRleHQ7XG4gICAgaWYgKHJlcUN0eCkge1xuICAgICAgcmVxQ3R4LmlkZW50aXR5ID0gZ2V0SWRlbnRpdHkocmVxIGFzIHVua25vd24gYXMgSHR0cFJlcXVlc3QpO1xuICAgIH1cblxuICAgIC8vIFNlc3Npb24gaW52YWxpZGF0aW9uICh0b2tlbi12ZXJzaW9uIHN0b3JlICsgaW1wZXJzb25hdGlvbi1zZXNzaW9uXG4gICAgLy8gbGl2ZW5lc3MpLiBObyBzdG9yZSByZWdpc3RlcmVkIOKHkiBvbmx5IGltcGVyc29uYXRpb24gc2Vzc2lvbnMgYXJlIGNoZWNrZWQuXG4gICAgaWYgKG5lZWRzUmV2b2NhdGlvbkNoZWNrKGRlY29kZWQpKSB7XG4gICAgICAvLyBgLmNhdGNoKG5leHQpYCBmb3J3YXJkcyBhIERPV05TVFJFQU0gc3luY2hyb25vdXMgdGhyb3cgZnJvbSBgbmV4dCgpYCB0b1xuICAgICAgLy8gRXhwcmVzcydzIGVycm9yIG1pZGRsZXdhcmUg4oCUIHRoaXMgYG5leHQoKWAgcnVucyBpbiBhIG1pY3JvdGFzaywgb3V0c2lkZVxuICAgICAgLy8gdGhlIHN1cnJvdW5kaW5nIHRyeS9jYXRjaC4gVGhlIGNoZWNrIGl0c2VsZiBuZXZlciByZWplY3RzLlxuICAgICAgY2hlY2tSZXZvY2F0aW9uKGRlY29kZWQpLnRoZW4oKHJlZnVzYWwpID0+IHtcbiAgICAgICAgaWYgKHJlZnVzYWwpIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgcmVmdXNhbCwgRXJyb3JDb2RlLlRPS0VOX1JFVk9LRUQpO1xuICAgICAgICBydW5EZWZlcnJlZFF1b3RhQ2hlY2socmVxLCByZXMsIG5leHQpO1xuICAgICAgfSkuY2F0Y2gobmV4dCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIGFwaUNhbGxzIGNoZWNrIGEgbW91bnQgYXJtZWQgKGFwaS1zZXJ2ZXIgYGFwaUNhbGxzUXVvdGFgKSBydW5zIGhlcmUsXG4gICAgLy8gbm93IHRoYXQgdGVuYW5jeSBpcyBKV1QtYXV0aG9yaXRhdGl2ZTsgYSBwbGFpbiBuZXh0KCkgd2hlcmUgbm9uZSB3YXMgYXJtZWQuXG4gICAgcnVuRGVmZXJyZWRRdW90YUNoZWNrKHJlcSwgcmVzLCBuZXh0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBqd3QuVG9rZW5FeHBpcmVkRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIGhhcyBleHBpcmVkJywgRXJyb3JDb2RlLlRPS0VOX0VYUElSRUQpO1xuICAgIH1cblxuICAgIC8vIFRoZSBzaWduaW5nIGtleXMgY291bGRuJ3QgYmUgZmV0Y2hlZCwgc28gdGhlIHRva2VuJ3MgdmFsaWRpdHkgaXMgVU5LTk9XTi5cbiAgICAvLyBGYWlsIENMT1NFRCB3aXRoIGEgcmV0cnlhYmxlIDUwMyDigJQgbmV2ZXIgYSBwYXNzLCBhbmQgbmV2ZXIgYSA0MDEgdGhhdFxuICAgIC8vIHdvdWxkIHNlbmQgYSBsZWdpdGltYXRlIGNsaWVudCBvZmYgdG8gcmUtYXV0aGVudGljYXRlIG92ZXIgb3VyIG91dGFnZS5cbiAgICAvLyBTYW1lIHJlYXNvbmluZyBmb3IgdGhlIFNFUlZJQ0UgY2hhaW46IG5vIHJlYWRhYmxlIGtleSBidW5kbGUgbWVhbnMgbm8gd2F5XG4gICAgLy8gdG8gdGVsbCBhIHBlZXIncyB0b2tlbiBmcm9tIGEgZm9yZ2VyeSwgc28gdGhlIHJlcXVlc3QgaXMgcmVmdXNlZCB3aXRoIGFcbiAgICAvLyByZXRyeWFibGUgNTAzIHJhdGhlciB0aGFuIGFkbWl0dGVkIG9yIGJvdW5jZWQgdG8gcmUtYXV0aGVudGljYXRlLlxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEp3a3NVbmF2YWlsYWJsZUVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgU2VydmljZUtleUVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignUmVqZWN0aW5nIHJlcXVlc3Q6IHRva2VuIHNpZ25pbmcga2V5cyB1bmF2YWlsYWJsZScsIHsgZXJyb3I6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSxcbiAgICAgICAgJ1Rva2VuIHZlcmlmaWNhdGlvbiBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZTsgcGxlYXNlIHJldHJ5JyxcbiAgICAgICAgRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEUsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVua25vd25LaWRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIGp3dC5Kc29uV2ViVG9rZW5FcnJvcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnSW52YWxpZCB0b2tlbicsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiBmYWlsZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgfVxufVxuXG4iXX0=
@@ -37,8 +37,15 @@ export declare function verifyUserJwt<T = JwtPayload>(token: string): Promise<T>
37
37
  *
38
38
  * Anything that is not ES256 with a `kid` fails in both chains, which is what
39
39
  * makes "no HS256 token is accepted anywhere" a property of the code.
40
+ *
41
+ * A service token comes back with its authority claims reduced (no
42
+ * `isSuperAdmin`, no org-admin `role`/`isAdmin` — see
43
+ * `withoutServiceAuthorityClaims`), and one from an out-of-cluster signer
44
+ * (`deploy-bootstrap`) is refused unless `options.acceptServices` names it.
40
45
  */
41
- export declare function verifyBearerToken(token: string): Promise<JwtPayload>;
46
+ export declare function verifyBearerToken(token: string, options?: {
47
+ acceptServices?: readonly string[];
48
+ }): Promise<JwtPayload>;
42
49
  /**
43
50
  * Whether a verified token carries a well-formed identity: a known
44
51
  * `principalType` and `token_use`, and the claims that kind of principal must
@@ -57,13 +57,22 @@ export async function verifyUserJwt(token) {
57
57
  *
58
58
  * Anything that is not ES256 with a `kid` fails in both chains, which is what
59
59
  * makes "no HS256 token is accepted anywhere" a property of the code.
60
+ *
61
+ * A service token comes back with its authority claims reduced (no
62
+ * `isSuperAdmin`, no org-admin `role`/`isAdmin` — see
63
+ * `withoutServiceAuthorityClaims`), and one from an out-of-cluster signer
64
+ * (`deploy-bootstrap`) is refused unless `options.acceptServices` names it.
60
65
  */
61
- export async function verifyBearerToken(token) {
66
+ export async function verifyBearerToken(token, options = {}) {
62
67
  const header = decodeJwtHeader(token);
63
68
  if (!header?.alg)
64
69
  throw new jwt.JsonWebTokenError('Malformed token header');
65
70
  if (header.kid && isServiceKid(header.kid)) {
66
- const claims = verifyServiceJwt(token, { kid: header.kid, ...issuerAudienceOptions() });
71
+ const claims = verifyServiceJwt(token, {
72
+ kid: header.kid,
73
+ ...issuerAudienceOptions(),
74
+ ...(options.acceptServices ? { acceptServices: options.acceptServices } : {}),
75
+ });
67
76
  if (claims.principalType !== 'service') {
68
77
  emitCounter('service_key_non_service_token_rejected_total', { alg: header.alg });
69
78
  throw new jwt.JsonWebTokenError('A service signing key may only mint a service principal');
@@ -102,4 +111,4 @@ export function hasValidIdentityClaims(decoded) {
102
111
  && (decoded.aal === 1 || decoded.aal === 2)
103
112
  && typeof decoded.auth_time === 'number';
104
113
  }
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LXZlcmlmeS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZGRsZXdhcmUvand0LXZlcmlmeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7R0FHRztBQUVILE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckcsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFtQixNQUFNLG9CQUFvQixDQUFDO0FBQ2hHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsMkZBQTJGO0FBQzNGLE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTztRQUNMLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzVFLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FBaUIsS0FBYTtJQUMvRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsSUFBSSxNQUFNLEVBQUUs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SUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztXQUN4QyxPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBCZWFyZXItdG9rZW4gdmVyaWZpY2F0aW9uOiB0aGUgdXNlciBjaGFpbiAoRVMyNTYgYWdhaW5zdCBwbGF0Zm9ybSdzIEpXS1MpIGFuZFxuICogdGhlIGlkZW50aXR5LWNsYWltIHNoYXBlIGV2ZXJ5IGdhdGUgcmVhc29ucyBhYm91dC5cbiAqL1xuXG5pbXBvcnQgand0IGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgeyBwbGF0Zm9ybUp3a3NDYWNoZSB9IGZyb20gJy4uL3NlcnZpY2VzL2p3a3MtY2FjaGUuanMnO1xuaW1wb3J0IHsgU0VSVklDRV9TVUJKRUNUX1BSRUZJWCwgaXNTZXJ2aWNlS2lkLCB2ZXJpZnlTZXJ2aWNlSnd0IH0gZnJvbSAnLi4vc2VydmljZXMvc2VydmljZS1rZXlzLmpzJztcbmltcG9ydCB7IEFVVEhfTUVUSE9EUywgUFJJTkNJUEFMX1RZUEVTLCBUT0tFTl9VU0VTLCB0eXBlIEp3dFBheWxvYWQgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgVVNFUl9UT0tFTl9BTEdPUklUSE0sIGRlY29kZUp3dEhlYWRlciB9IGZyb20gJy4uL3V0aWxzL2p3ay5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcbi8qKiBJc3N1ZXIvYXVkaWVuY2UgcGlubmluZywgd2hlbiB0aGUgZGVwbG95bWVudCBjb25maWd1cmVzIHRoZW0uIFNoYXJlZCBieSBib3RoIGNoYWlucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc3N1ZXJBdWRpZW5jZU9wdGlvbnMoKTogeyBpc3N1ZXI/OiBzdHJpbmc7IGF1ZGllbmNlPzogc3RyaW5nIH0ge1xuICByZXR1cm4ge1xuICAgIC4uLihwcm9jZXNzLmVudi5KV1RfSVNTVUVSID8geyBpc3N1ZXI6IHByb2Nlc3MuZW52LkpXVF9JU1NVRVIgfSA6IHt9KSxcbiAgICAuLi4ocHJvY2Vzcy5lbnYuSldUX0FVRElFTkNFID8geyBhdWRpZW5jZTogcHJvY2Vzcy5lbnYuSldUX0FVRElFTkNFIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogVmVyaWZ5IGEgdG9rZW4gdGhhdCBzcGVha3MgZm9yIGEgUEVSU09OIOKAlCBhY2Nlc3MsIHN0ZXAtdXAsIGFuZCB0aGUgdG9rZW4gYW5cbiAqIG9wYXF1ZSBhY2Nlc3Mga2V5IGlzIGV4Y2hhbmdlZCBmb3Ig4oCUIGFnYWluc3QgcGxhdGZvcm0ncyBwdWJsaXNoZWQgc2lnbmluZ1xuICoga2V5cy5cbiAqXG4gKiBFUzI1NiBhbmQgYSBga2lkYCBhcmUgYm90aCBtYW5kYXRvcnk6IG5vIGBraWRgIG1lYW5zIG5vIHdheSB0byBwaWNrIHRoZSByaWdodFxuICoga2V5IGFjcm9zcyBhIHJvdGF0aW9uLCBhbmQgYW55IG90aGVyIGFsZ29yaXRobSBpcyByZWZ1c2VkIG91dHJpZ2h0LCB3aGljaCBpc1xuICogd2hhdCBtYWtlcyBcIm5vIHNlcnZpY2UgYWNjZXB0cyBhbiBIUzI1NiB1c2VyIHRva2VuXCIgYSBwcm9wZXJ0eSBvZiB0aGUgY29kZVxuICogcmF0aGVyIHRoYW4gYSBjb252ZW50aW9uLiBLZXkgbG9va3VwIGdvZXMgdGhyb3VnaCB0aGUgc2hhcmVkIEpXS1MgY2FjaGVcbiAqICgxMC1taW51dGUgcmVmcmVzaCwgb25lIHJlZmV0Y2ggb24gYW4gdW5rbm93biBga2lkYCwgYnJpZWYgbmVnYXRpdmUgY2FjaGUpLlxuICpcbiAqIEB0aHJvd3Mge1Vua25vd25LaWRFcnJvcn0gdGhlIGtleSBzZXQgaXMgY3VycmVudCBhbmQgaGFzIG5vIHN1Y2gga2V5IOKGkiA0MDEuXG4gKiBAdGhyb3dzIHtKd2tzVW5hdmFpbGFibGVFcnJvcn0gdGhlIGtleSBzZXQgY291bGQgbm90IGJlIG9idGFpbmVkIOKGkiA1MDM7IGFuXG4gKiAgICAgICAgIHVudmVyaWZpYWJsZSB0b2tlbiBpcyBuZXZlciB0cmVhdGVkIGFzIHZhbGlkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VXNlckp3dDxUID0gSnd0UGF5bG9hZD4odG9rZW46IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICBjb25zdCBoZWFkZXIgPSBkZWNvZGVKd3RIZWFkZXIodG9rZW4pO1xuICBpZiAoaGVhZGVyPy5hbGcgIT09IFVTRVJfVE9LRU5fQUxHT1JJVEhNIHx8ICFoZWFkZXIua2lkKSB7XG4gICAgdGhyb3cgbmV3IGp3dC5Kc29uV2ViVG9rZW5FcnJvcihgVXNlciB0b2tlbnMgbXVzdCBiZSBzaWduZWQgd2l0aCAke1VTRVJfVE9LRU5fQUxHT1JJVEhNfSBhbmQgY2FycnkgYSBraWRgKTtcbiAgfVxuICBjb25zdCBrZXkgPSBhd2FpdCBwbGF0Zm9ybUp3a3NDYWNoZSgpLmdldEtleShoZWFkZXIua2lkKTtcbiAgcmV0dXJuIGp3dC52ZXJpZnkodG9rZW4sIGtleSwgeyBhbGdvcml0aG1zOiBbVVNFUl9UT0tFTl9BTEdPUklUSE1dLCAuLi5pc3N1ZXJBdWRpZW5jZU9wdGlvbnMoKSB9KSBhcyBUO1xufVxuXG4vKipcbiAqIFZlcmlmeSBBTlkgYmVhcmVyIHRva2VuIGFuZCByZXR1cm4gaXRzIGNsYWltcy5cbiAqXG4gKiBTaW5jZSAjMTQgdGhlcmUgaXMgbm8gc2hhcmVkIHNlY3JldCBsZWZ0OiBCT1RIIGNoYWlucyBhcmUgRVMyNTYgd2l0aCBhIGBraWRgLFxuICogc28gdGhlIGRpc3BhdGNoIGlzIGJ5ICoqd2hvIG93bnMgdGhlIGBraWRgKiogcmF0aGVyIHRoYW4gYnkgYWxnb3JpdGhtIOKAlCBhbmRcbiAqIGJlY2F1c2UgYSBga2lkYCBpcyBhbiBSRkMgNzYzOCB0aHVtYnByaW50LCBvd25lcnNoaXAgaXMgYSBmYWN0IGFib3V0IHRoZSBrZXksXG4gKiBub3QgYSBjbGFpbSB0aGUgdG9rZW4gbWFrZXMgYWJvdXQgaXRzZWxmOlxuICpcbiAqIC0gYSBga2lkYCBwdWJsaXNoZWQgaW4gdGhlIHBlci1zZXJ2aWNlIGtleSBidW5kbGUg4oaSIGFuIElOVEVSTkFMIFNFUlZJQ0UgdG9rZW5cbiAqICAgKHtAbGluayBzaWduU2VydmljZVRva2VufSksIHZlcmlmaWVkIHdpdGggdGhhdCBzZXJ2aWNlJ3Mga2V5OyBpdHMgYHN1YmAgbXVzdFxuICogICBuYW1lIHRoZSBzYW1lIHNlcnZpY2UsIHNvIG9uZSBzZXJ2aWNlIGNhbiBuZXZlciBzcGVhayBmb3IgYW5vdGhlci5cbiAqIC0gYW55dGhpbmcgZWxzZSDihpIgYSBwbGF0Zm9ybS1zaWduZWQgVVNFUiB0b2tlbiwgdmVyaWZpZWQgYWdhaW5zdCBwbGF0Zm9ybSdzXG4gKiAgIHB1Ymxpc2hlZCBKV0tTLiBBIHRva2VuIGNsYWltaW5nIGBwcmluY2lwYWxUeXBlOiAnc2VydmljZSdgIGlzIHJlZnVzZWRcbiAqICAgaGVyZTogYW4gaW50ZXJuYWwgaWRlbnRpdHkgbWF5IG5vdCByaWRlIHRoZSB1c2VyIHNpZ25pbmcga2V5LlxuICpcbiAqIEFueXRoaW5nIHRoYXQgaXMgbm90IEVTMjU2IHdpdGggYSBga2lkYCBmYWlscyBpbiBib3RoIGNoYWlucywgd2hpY2ggaXMgd2hhdFxuICogbWFrZXMgXCJubyBIUzI1NiB0b2tlbiBpcyBhY2NlcHRlZCBhbnl3aGVyZVwiIGEgcHJvcGVydHkgb2YgdGhlIGNvZGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlCZWFyZXJUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxKd3RQYXlsb2FkPiB7XG4gIGNvbnN0IGhlYWRlciA9IGRlY29kZUp3dEhlYWRlcih0b2tlbik7XG4gIGlmICghaGVhZGVyPy5hbGcpIHRocm93IG5ldyBqd3QuSnNvbldlYlRva2VuRXJyb3IoJ01hbGZvcm1lZCB0b2tlbiBoZWFkZXInKTtcblxuICBpZiAoaGVhZGVyLmtpZCAmJiBpc1NlcnZpY2VLaWQoaGVhZGVyLmtpZCkpIHtcbiAgICBjb25zdCBjbGFpbXMgPSB2ZXJpZnlTZXJ2aWNlSnd0PEp3dFBheWxvYWQ+KHRva2VuLCB7IGtpZDogaGVhZGVyLmtpZCwgLi4uaXNzdWVyQXVkaWVuY2VPcHRpb25zKCkgfSk7XG4gICAgaWYgKGNsYWltcy5wcmluY2lwYWxUeXBlICE9PSAnc2VydmljZScpIHtcbiAgICAgIGVtaXRDb3VudGVyKCdzZXJ2aWNlX2tleV9ub25fc2VydmljZV90b2tlbl9yZWplY3RlZF90b3RhbCcsIHsgYWxnOiBoZWFkZXIuYWxnIH0pO1xuICAgICAgdGhyb3cgbmV3IGp3dC5Kc29uV2ViVG9rZW5FcnJvcignQSBzZXJ2aWNlIHNpZ25pbmcga2V5IG1heSBvbmx5IG1pbnQgYSBzZXJ2aWNlIHByaW5jaXBhbCcpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhaW1zO1xuICB9XG5cbiAgY29uc3QgY2xhaW1zID0gYXdhaXQgdmVyaWZ5VXNlckp3dCh0b2tlbik7XG4gIGlmIChjbGFpbXMucHJpbmNpcGFsVHlwZSA9PT0gJ3NlcnZpY2UnKSB7XG4gICAgdGhyb3cgbmV3IGp3dC5Kc29uV2ViVG9rZW5FcnJvcignU2VydmljZSBwcmluY2lwYWxzIG1heSBub3QgYmUgc2lnbmVkIHdpdGggdGhlIHVzZXIgc2lnbmluZyBrZXknKTtcbiAgfVxuICByZXR1cm4gY2xhaW1zO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSB2ZXJpZmllZCB0b2tlbiBjYXJyaWVzIGEgd2VsbC1mb3JtZWQgaWRlbnRpdHk6IGEga25vd25cbiAqIGBwcmluY2lwYWxUeXBlYCBhbmQgYHRva2VuX3VzZWAsIGFuZCB0aGUgY2xhaW1zIHRoYXQga2luZCBvZiBwcmluY2lwYWwgbXVzdFxuICogaGF2ZS4gRmFpbHMgY2xvc2VkIOKAlCBhIHRva2VuIG1pbnRlZCBiZWZvcmUgdGhlc2UgY2xhaW1zIGV4aXN0ZWQsIG9yIG9uZSB3aXRoIGFcbiAqIGNvbnRyYWRpY3RvcnkgY29tYmluYXRpb24sIGlzIG5vdCBhbiBpZGVudGl0eSBhbnkgZ2F0ZSBzaG91bGQgcmVhc29uIGFib3V0LlxuICpcbiAqIC0gYHNlcnZpY2VgOiBgdG9rZW5fdXNlOiAnYWNjZXNzJ2AgYW5kIGEgYHNlcnZpY2U6PG5hbWU+YCBzdWJqZWN0ICh0aGUgbmFtZVxuICogICBmZWVkcyB0aGUgZGVueWxpc3QgYW5kIGF1ZGl0IGF0dHJpYnV0aW9uKS5cbiAqIC0gYHVzZXJgIC8gYHNlcnZpY2VfYWNjb3VudGA6IGBhbXJgIChrbm93biBtZXRob2RzKSwgYGFhbGAgYW5kIGBhdXRoX3RpbWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzVmFsaWRJZGVudGl0eUNsYWltcyhkZWNvZGVkOiBQYXJ0aWFsPEp3dFBheWxvYWQ+KTogYm9vbGVhbiB7XG4gIGlmICghZGVjb2RlZC5wcmluY2lwYWxUeXBlIHx8ICFQUklOQ0lQQUxfVFlQRVMuaW5jbHVkZXMoZGVjb2RlZC5wcmluY2lwYWxUeXBlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWRlY29kZWQudG9rZW5fdXNlIHx8ICFUT0tFTl9VU0VTLmluY2x1ZGVzKGRlY29kZWQudG9rZW5fdXNlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGVjb2RlZC5wcmluY2lwYWxUeXBlID09PSAnc2VydmljZScpIHtcbiAgICByZXR1cm4gZGVjb2RlZC50b2tlbl91c2UgPT09ICdhY2Nlc3MnXG4gICAgICAmJiB0eXBlb2YgZGVjb2RlZC5zdWIgPT09ICdzdHJpbmcnXG4gICAgICAmJiBkZWNvZGVkLnN1Yi5zdGFydHNXaXRoKFNFUlZJQ0VfU1VCSkVDVF9QUkVGSVgpXG4gICAgICAmJiBkZWNvZGVkLnN1Yi5sZW5ndGggPiBTRVJWSUNFX1NVQkpFQ1RfUFJFRklYLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheShkZWNvZGVkLmFtcilcbiAgICAmJiBkZWNvZGVkLmFtci5ldmVyeSgobSkgPT4gQVVUSF9NRVRIT0RTLmluY2x1ZGVzKG0pKVxuICAgICYmIChkZWNvZGVkLmFhbCA9PT0gMSB8fCBkZWNvZGVkLmFhbCA9PT0gMilcbiAgICAmJiB0eXBlb2YgZGVjb2RlZC5hdXRoX3RpbWUgPT09ICdudW1iZXInO1xufVxuXG4iXX0=
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LXZlcmlmeS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZGRsZXdhcmUvand0LXZlcmlmeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7R0FHRztBQUVILE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckcsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFtQixNQUFNLG9CQUFvQixDQUFDO0FBQ2hHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsMkZBQTJGO0FBQzNGLE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTztRQUNMLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzVFLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FBaUIsS0FBYTtJQUMvRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsSUFBSSxNQUFNLEVBQUUs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QztXQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztXQUNsRCxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1dBQ3hDLE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIEJlYXJlci10b2tlbiB2ZXJpZmljYXRpb246IHRoZSB1c2VyIGNoYWluIChFUzI1NiBhZ2FpbnN0IHBsYXRmb3JtJ3MgSldLUykgYW5kXG4gKiB0aGUgaWRlbnRpdHktY2xhaW0gc2hhcGUgZXZlcnkgZ2F0ZSByZWFzb25zIGFib3V0LlxuICovXG5cbmltcG9ydCBqd3QgZnJvbSAnanNvbndlYnRva2VuJztcbmltcG9ydCB7IHBsYXRmb3JtSndrc0NhY2hlIH0gZnJvbSAnLi4vc2VydmljZXMvandrcy1jYWNoZS5qcyc7XG5pbXBvcnQgeyBTRVJWSUNFX1NVQkpFQ1RfUFJFRklYLCBpc1NlcnZpY2VLaWQsIHZlcmlmeVNlcnZpY2VKd3QgfSBmcm9tICcuLi9zZXJ2aWNlcy9zZXJ2aWNlLWtleXMuanMnO1xuaW1wb3J0IHsgQVVUSF9NRVRIT0RTLCBQUklOQ0lQQUxfVFlQRVMsIFRPS0VOX1VTRVMsIHR5cGUgSnd0UGF5bG9hZCB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBVU0VSX1RPS0VOX0FMR09SSVRITSwgZGVjb2RlSnd0SGVhZGVyIH0gZnJvbSAnLi4vdXRpbHMvandrLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuLyoqIElzc3Vlci9hdWRpZW5jZSBwaW5uaW5nLCB3aGVuIHRoZSBkZXBsb3ltZW50IGNvbmZpZ3VyZXMgdGhlbS4gU2hhcmVkIGJ5IGJvdGggY2hhaW5zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzc3VlckF1ZGllbmNlT3B0aW9ucygpOiB7IGlzc3Vlcj86IHN0cmluZzsgYXVkaWVuY2U/OiBzdHJpbmcgfSB7XG4gIHJldHVybiB7XG4gICAgLi4uKHByb2Nlc3MuZW52LkpXVF9JU1NVRVIgPyB7IGlzc3VlcjogcHJvY2Vzcy5lbnYuSldUX0lTU1VFUiB9IDoge30pLFxuICAgIC4uLihwcm9jZXNzLmVudi5KV1RfQVVESUVOQ0UgPyB7IGF1ZGllbmNlOiBwcm9jZXNzLmVudi5KV1RfQVVESUVOQ0UgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBWZXJpZnkgYSB0b2tlbiB0aGF0IHNwZWFrcyBmb3IgYSBQRVJTT04g4oCUIGFjY2Vzcywgc3RlcC11cCwgYW5kIHRoZSB0b2tlbiBhblxuICogb3BhcXVlIGFjY2VzcyBrZXkgaXMgZXhjaGFuZ2VkIGZvciDigJQgYWdhaW5zdCBwbGF0Zm9ybSdzIHB1Ymxpc2hlZCBzaWduaW5nXG4gKiBrZXlzLlxuICpcbiAqIEVTMjU2IGFuZCBhIGBraWRgIGFyZSBib3RoIG1hbmRhdG9yeTogbm8gYGtpZGAgbWVhbnMgbm8gd2F5IHRvIHBpY2sgdGhlIHJpZ2h0XG4gKiBrZXkgYWNyb3NzIGEgcm90YXRpb24sIGFuZCBhbnkgb3RoZXIgYWxnb3JpdGhtIGlzIHJlZnVzZWQgb3V0cmlnaHQsIHdoaWNoIGlzXG4gKiB3aGF0IG1ha2VzIFwibm8gc2VydmljZSBhY2NlcHRzIGFuIEhTMjU2IHVzZXIgdG9rZW5cIiBhIHByb3BlcnR5IG9mIHRoZSBjb2RlXG4gKiByYXRoZXIgdGhhbiBhIGNvbnZlbnRpb24uIEtleSBsb29rdXAgZ29lcyB0aHJvdWdoIHRoZSBzaGFyZWQgSldLUyBjYWNoZVxuICogKDEwLW1pbnV0ZSByZWZyZXNoLCBvbmUgcmVmZXRjaCBvbiBhbiB1bmtub3duIGBraWRgLCBicmllZiBuZWdhdGl2ZSBjYWNoZSkuXG4gKlxuICogQHRocm93cyB7VW5rbm93bktpZEVycm9yfSB0aGUga2V5IHNldCBpcyBjdXJyZW50IGFuZCBoYXMgbm8gc3VjaCBrZXkg4oaSIDQwMS5cbiAqIEB0aHJvd3Mge0p3a3NVbmF2YWlsYWJsZUVycm9yfSB0aGUga2V5IHNldCBjb3VsZCBub3QgYmUgb2J0YWluZWQg4oaSIDUwMzsgYW5cbiAqICAgICAgICAgdW52ZXJpZmlhYmxlIHRva2VuIGlzIG5ldmVyIHRyZWF0ZWQgYXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlVc2VySnd0PFQgPSBKd3RQYXlsb2FkPih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGhlYWRlciA9IGRlY29kZUp3dEhlYWRlcih0b2tlbik7XG4gIGlmIChoZWFkZXI/LmFsZyAhPT0gVVNFUl9UT0tFTl9BTEdPUklUSE0gfHwgIWhlYWRlci5raWQpIHtcbiAgICB0aHJvdyBuZXcgand0Lkpzb25XZWJUb2tlbkVycm9yKGBVc2VyIHRva2VucyBtdXN0IGJlIHNpZ25lZCB3aXRoICR7VVNFUl9UT0tFTl9BTEdPUklUSE19IGFuZCBjYXJyeSBhIGtpZGApO1xuICB9XG4gIGNvbnN0IGtleSA9IGF3YWl0IHBsYXRmb3JtSndrc0NhY2hlKCkuZ2V0S2V5KGhlYWRlci5raWQpO1xuICByZXR1cm4gand0LnZlcmlmeSh0b2tlbiwga2V5LCB7IGFsZ29yaXRobXM6IFtVU0VSX1RPS0VOX0FMR09SSVRITV0sIC4uLmlzc3VlckF1ZGllbmNlT3B0aW9ucygpIH0pIGFzIFQ7XG59XG5cbi8qKlxuICogVmVyaWZ5IEFOWSBiZWFyZXIgdG9rZW4gYW5kIHJldHVybiBpdHMgY2xhaW1zLlxuICpcbiAqIFNpbmNlICMxNCB0aGVyZSBpcyBubyBzaGFyZWQgc2VjcmV0IGxlZnQ6IEJPVEggY2hhaW5zIGFyZSBFUzI1NiB3aXRoIGEgYGtpZGAsXG4gKiBzbyB0aGUgZGlzcGF0Y2ggaXMgYnkgKip3aG8gb3ducyB0aGUgYGtpZGAqKiByYXRoZXIgdGhhbiBieSBhbGdvcml0aG0g4oCUIGFuZFxuICogYmVjYXVzZSBhIGBraWRgIGlzIGFuIFJGQyA3NjM4IHRodW1icHJpbnQsIG93bmVyc2hpcCBpcyBhIGZhY3QgYWJvdXQgdGhlIGtleSxcbiAqIG5vdCBhIGNsYWltIHRoZSB0b2tlbiBtYWtlcyBhYm91dCBpdHNlbGY6XG4gKlxuICogLSBhIGBraWRgIHB1Ymxpc2hlZCBpbiB0aGUgcGVyLXNlcnZpY2Uga2V5IGJ1bmRsZSDihpIgYW4gSU5URVJOQUwgU0VSVklDRSB0b2tlblxuICogICAoe0BsaW5rIHNpZ25TZXJ2aWNlVG9rZW59KSwgdmVyaWZpZWQgd2l0aCB0aGF0IHNlcnZpY2UncyBrZXk7IGl0cyBgc3ViYCBtdXN0XG4gKiAgIG5hbWUgdGhlIHNhbWUgc2VydmljZSwgc28gb25lIHNlcnZpY2UgY2FuIG5ldmVyIHNwZWFrIGZvciBhbm90aGVyLlxuICogLSBhbnl0aGluZyBlbHNlIOKGkiBhIHBsYXRmb3JtLXNpZ25lZCBVU0VSIHRva2VuLCB2ZXJpZmllZCBhZ2FpbnN0IHBsYXRmb3JtJ3NcbiAqICAgcHVibGlzaGVkIEpXS1MuIEEgdG9rZW4gY2xhaW1pbmcgYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlJ2AgaXMgcmVmdXNlZFxuICogICBoZXJlOiBhbiBpbnRlcm5hbCBpZGVudGl0eSBtYXkgbm90IHJpZGUgdGhlIHVzZXIgc2lnbmluZyBrZXkuXG4gKlxuICogQW55dGhpbmcgdGhhdCBpcyBub3QgRVMyNTYgd2l0aCBhIGBraWRgIGZhaWxzIGluIGJvdGggY2hhaW5zLCB3aGljaCBpcyB3aGF0XG4gKiBtYWtlcyBcIm5vIEhTMjU2IHRva2VuIGlzIGFjY2VwdGVkIGFueXdoZXJlXCIgYSBwcm9wZXJ0eSBvZiB0aGUgY29kZS5cbiAqXG4gKiBBIHNlcnZpY2UgdG9rZW4gY29tZXMgYmFjayB3aXRoIGl0cyBhdXRob3JpdHkgY2xhaW1zIHJlZHVjZWQgKG5vXG4gKiBgaXNTdXBlckFkbWluYCwgbm8gb3JnLWFkbWluIGByb2xlYC9gaXNBZG1pbmAg4oCUIHNlZVxuICogYHdpdGhvdXRTZXJ2aWNlQXV0aG9yaXR5Q2xhaW1zYCksIGFuZCBvbmUgZnJvbSBhbiBvdXQtb2YtY2x1c3RlciBzaWduZXJcbiAqIChgZGVwbG95LWJvb3RzdHJhcGApIGlzIHJlZnVzZWQgdW5sZXNzIGBvcHRpb25zLmFjY2VwdFNlcnZpY2VzYCBuYW1lcyBpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeUJlYXJlclRva2VuKFxuICB0b2tlbjogc3RyaW5nLFxuICBvcHRpb25zOiB7IGFjY2VwdFNlcnZpY2VzPzogcmVhZG9ubHkgc3RyaW5nW10gfSA9IHt9LFxuKTogUHJvbWlzZTxKd3RQYXlsb2FkPiB7XG4gIGNvbnN0IGhlYWRlciA9IGRlY29kZUp3dEhlYWRlcih0b2tlbik7XG4gIGlmICghaGVhZGVyPy5hbGcpIHRocm93IG5ldyBqd3QuSnNvbldlYlRva2VuRXJyb3IoJ01hbGZvcm1lZCB0b2tlbiBoZWFkZXInKTtcblxuICBpZiAoaGVhZGVyLmtpZCAmJiBpc1NlcnZpY2VLaWQoaGVhZGVyLmtpZCkpIHtcbiAgICBjb25zdCBjbGFpbXMgPSB2ZXJpZnlTZXJ2aWNlSnd0PEp3dFBheWxvYWQ+KHRva2VuLCB7XG4gICAgICBraWQ6IGhlYWRlci5raWQsXG4gICAgICAuLi5pc3N1ZXJBdWRpZW5jZU9wdGlvbnMoKSxcbiAgICAgIC4uLihvcHRpb25zLmFjY2VwdFNlcnZpY2VzID8geyBhY2NlcHRTZXJ2aWNlczogb3B0aW9ucy5hY2NlcHRTZXJ2aWNlcyB9IDoge30pLFxuICAgIH0pO1xuICAgIGlmIChjbGFpbXMucHJpbmNpcGFsVHlwZSAhPT0gJ3NlcnZpY2UnKSB7XG4gICAgICBlbWl0Q291bnRlcignc2VydmljZV9rZXlfbm9uX3NlcnZpY2VfdG9rZW5fcmVqZWN0ZWRfdG90YWwnLCB7IGFsZzogaGVhZGVyLmFsZyB9KTtcbiAgICAgIHRocm93IG5ldyBqd3QuSnNvbldlYlRva2VuRXJyb3IoJ0Egc2VydmljZSBzaWduaW5nIGtleSBtYXkgb25seSBtaW50IGEgc2VydmljZSBwcmluY2lwYWwnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYWltcztcbiAgfVxuXG4gIGNvbnN0IGNsYWltcyA9IGF3YWl0IHZlcmlmeVVzZXJKd3QodG9rZW4pO1xuICBpZiAoY2xhaW1zLnByaW5jaXBhbFR5cGUgPT09ICdzZXJ2aWNlJykge1xuICAgIHRocm93IG5ldyBqd3QuSnNvbldlYlRva2VuRXJyb3IoJ1NlcnZpY2UgcHJpbmNpcGFscyBtYXkgbm90IGJlIHNpZ25lZCB3aXRoIHRoZSB1c2VyIHNpZ25pbmcga2V5Jyk7XG4gIH1cbiAgcmV0dXJuIGNsYWltcztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgdmVyaWZpZWQgdG9rZW4gY2FycmllcyBhIHdlbGwtZm9ybWVkIGlkZW50aXR5OiBhIGtub3duXG4gKiBgcHJpbmNpcGFsVHlwZWAgYW5kIGB0b2tlbl91c2VgLCBhbmQgdGhlIGNsYWltcyB0aGF0IGtpbmQgb2YgcHJpbmNpcGFsIG11c3RcbiAqIGhhdmUuIEZhaWxzIGNsb3NlZCDigJQgYSB0b2tlbiBtaW50ZWQgYmVmb3JlIHRoZXNlIGNsYWltcyBleGlzdGVkLCBvciBvbmUgd2l0aCBhXG4gKiBjb250cmFkaWN0b3J5IGNvbWJpbmF0aW9uLCBpcyBub3QgYW4gaWRlbnRpdHkgYW55IGdhdGUgc2hvdWxkIHJlYXNvbiBhYm91dC5cbiAqXG4gKiAtIGBzZXJ2aWNlYDogYHRva2VuX3VzZTogJ2FjY2VzcydgIGFuZCBhIGBzZXJ2aWNlOjxuYW1lPmAgc3ViamVjdCAodGhlIG5hbWVcbiAqICAgZmVlZHMgdGhlIGRlbnlsaXN0IGFuZCBhdWRpdCBhdHRyaWJ1dGlvbikuXG4gKiAtIGB1c2VyYCAvIGBzZXJ2aWNlX2FjY291bnRgOiBgYW1yYCAoa25vd24gbWV0aG9kcyksIGBhYWxgIGFuZCBgYXV0aF90aW1lYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZhbGlkSWRlbnRpdHlDbGFpbXMoZGVjb2RlZDogUGFydGlhbDxKd3RQYXlsb2FkPik6IGJvb2xlYW4ge1xuICBpZiAoIWRlY29kZWQucHJpbmNpcGFsVHlwZSB8fCAhUFJJTkNJUEFMX1RZUEVTLmluY2x1ZGVzKGRlY29kZWQucHJpbmNpcGFsVHlwZSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFkZWNvZGVkLnRva2VuX3VzZSB8fCAhVE9LRU5fVVNFUy5pbmNsdWRlcyhkZWNvZGVkLnRva2VuX3VzZSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKGRlY29kZWQucHJpbmNpcGFsVHlwZSA9PT0gJ3NlcnZpY2UnKSB7XG4gICAgcmV0dXJuIGRlY29kZWQudG9rZW5fdXNlID09PSAnYWNjZXNzJ1xuICAgICAgJiYgdHlwZW9mIGRlY29kZWQuc3ViID09PSAnc3RyaW5nJ1xuICAgICAgJiYgZGVjb2RlZC5zdWIuc3RhcnRzV2l0aChTRVJWSUNFX1NVQkpFQ1RfUFJFRklYKVxuICAgICAgJiYgZGVjb2RlZC5zdWIubGVuZ3RoID4gU0VSVklDRV9TVUJKRUNUX1BSRUZJWC5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZGVjb2RlZC5hbXIpXG4gICAgJiYgZGVjb2RlZC5hbXIuZXZlcnkoKG0pID0+IEFVVEhfTUVUSE9EUy5pbmNsdWRlcyhtKSlcbiAgICAmJiAoZGVjb2RlZC5hYWwgPT09IDEgfHwgZGVjb2RlZC5hYWwgPT09IDIpXG4gICAgJiYgdHlwZW9mIGRlY29kZWQuYXV0aF90aW1lID09PSAnbnVtYmVyJztcbn1cblxuIl19
@@ -25,10 +25,11 @@ export interface ServiceTokenOptions {
25
25
  /** TTL in seconds (default 300). */
26
26
  ttlSeconds?: number;
27
27
  /**
28
- * Role the token carries (required — no implicit default). **Pass the LOWEST
29
- * role the call actually needs** (`'member'` for read / data-plane calls) so a
30
- * leaked service token can't perform admin actions in the target org.
31
- * `isAdmin` is derived from this (admin|owner → true).
28
+ * Role the token carries (required — no implicit default). Pass `'member'`:
29
+ * every verifier clamps a service token's `owner`/`admin` role to `member`
30
+ * and its `isAdmin` to `false` (`withoutServiceAuthorityClaims`), so a higher
31
+ * role confers nothing on the receiving side. Grant a capability through
32
+ * {@link permissions} instead.
32
33
  */
33
34
  role: 'owner' | 'admin' | 'member';
34
35
  /**
@@ -20,9 +20,16 @@ import { decodeJwtHeader } from '../utils/jwk.js';
20
20
  // the claim; the subject names — and since #14 the name is cryptographically
21
21
  // bound to the signing key, so it can also be trusted.
22
22
  // `requireAuth` accepts these tokens transparently — they pass `decoded.sub`
23
- // and `decoded.role` checks, and the downstream org/role gates
24
- // (`requireOrgMembership` in platform's controller helpers, `requireSystemAdmin`)
25
- // rely on the org/role embedded in the token.
23
+ // and `decoded.role` checks, and downstream tenancy gates read the org embedded
24
+ // in the token.
25
+ //
26
+ // A service token carries NO admin authority, whatever it claims: the verifier
27
+ // (`verifyServiceJwt` → `withoutServiceAuthorityClaims`) drops `isSuperAdmin`,
28
+ // forces `isAdmin: false` and clamps an `owner`/`admin` role to `member`. What a
29
+ // service may do is decided by its NAME (bound to its key —
30
+ // `requireInternalService`, `isServicePrincipalNamed`) and by the explicit
31
+ // `permissions` claim. Tokens from the out-of-cluster `deploy-bootstrap` signer
32
+ // are refused unless the seam opts in (`requireAuth({ acceptServices })`).
26
33
  //
27
34
  // Tokens default to 5-minute TTL — long enough to survive a backend hop,
28
35
  // short enough that a leaked token is low-value.
@@ -157,4 +164,4 @@ export function verifyServicePrincipal(req) {
157
164
  return false;
158
165
  }
159
166
  }
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS10b2tlbnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL3NlcnZpY2UtdG9rZW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7O0dBRUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckgsT0FBTyxFQUFtQixNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBbUIsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsOEVBQThFO0FBQzlFLDRCQUE0QjtBQUM1QixFQUFFO0FBQ0YsNEVBQTRFO0FBQzVFLHNFQUFzRTtBQUN0RSw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hGLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELDZFQUE2RTtBQUM3RSwrREFBK0Q7QUFDL0Qsa0ZBQWtGO0FBQ2xGLDhDQUE4QztBQUM5QyxFQUFFO0FBQ0YseUVBQXlFO0FBQ3pFLGlEQUFpRDtBQUNqRCw4RUFBOEU7QUFFOUUsTUFBTSxpQ0FBaUMsR0FBRyxHQUFHLENBQUM7QUFFOUM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsQ0FDbEMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixJQUFJLEVBQUUsQ0FBQztLQUN2QyxLQUFLLENBQUMsR0FBRyxDQUFDO0tBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDcEIsTUFB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QUM7SUFDeEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBTZXJ2aWNlLXRvLXNlcnZpY2UgdG9rZW5zIGFuZCBzZXJ2aWNlLXByaW5jaXBhbCBjaGVja3MuXG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGhhc1ZhbGlkSWRlbnRpdHlDbGFpbXMsIGlzc3VlckF1ZGllbmNlT3B0aW9ucyB9IGZyb20gJy4vand0LXZlcmlmeS5qcyc7XG5pbXBvcnQgeyBTRVJWSUNFX1NVQkpFQ1RfUFJFRklYLCBpc1NlcnZpY2VLaWQsIHNpZ25TZXJ2aWNlSnd0LCB2ZXJpZnlTZXJ2aWNlSnd0IH0gZnJvbSAnLi4vc2VydmljZXMvc2VydmljZS1rZXlzLmpzJztcbmltcG9ydCB7IHR5cGUgSnd0UGF5bG9hZCB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyB0eXBlIFBlcm1pc3Npb24gfSBmcm9tICcuLi90eXBlcy9wZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgeyBkZWNvZGVKd3RIZWFkZXIgfSBmcm9tICcuLi91dGlscy9qd2suanMnO1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXJ2aWNlLXRvLXNlcnZpY2UgdG9rZW5zXG4vL1xuLy8gSW50ZXItc2VydmljZSBIVFRQIGNhbGxzIChiaWxsaW5nIOKGkiBtZXNzYWdlLCBwbGF0Zm9ybSDihpIgY29tcGxpYW5jZSwgZXRjLilcbi8vIG5lZWQgdG8gc2F0aXNmeSB0aGUgc2FtZSBgcmVxdWlyZUF1dGhgIG1pZGRsZXdhcmUgYXMgdXNlciByZXF1ZXN0cy5cbi8vIGBzaWduU2VydmljZVRva2VuYCBtaW50cyBhIHNob3J0LWxpdmVkIEVTMjU2IEpXVCBzaWduZWQgd2l0aCBUSElTIHNlcnZpY2Unc1xuLy8gT1dOIGtleSAoc2VlIGBzZXJ2aWNlcy9zZXJ2aWNlLWtleXMudHNgKSwgY2FycnlpbmcgYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlJ2Bcbi8vIGFuZCBuYW1pbmcgdGhlIGNhbGxpbmcgc2VydmljZSB2aWEgYHN1YjogJ3NlcnZpY2U6PG5hbWU+J2AuIEdhdGVzIGJyYW5jaCBvblxuLy8gdGhlIGNsYWltOyB0aGUgc3ViamVjdCBuYW1lcyDigJQgYW5kIHNpbmNlICMxNCB0aGUgbmFtZSBpcyBjcnlwdG9ncmFwaGljYWxseVxuLy8gYm91bmQgdG8gdGhlIHNpZ25pbmcga2V5LCBzbyBpdCBjYW4gYWxzbyBiZSB0cnVzdGVkLlxuLy8gYHJlcXVpcmVBdXRoYCBhY2NlcHRzIHRoZXNlIHRva2VucyB0cmFuc3BhcmVudGx5IOKAlCB0aGV5IHBhc3MgYGRlY29kZWQuc3ViYFxuLy8gYW5kIGBkZWNvZGVkLnJvbGVgIGNoZWNrcywgYW5kIHRoZSBkb3duc3RyZWFtIG9yZy9yb2xlIGdhdGVzXG4vLyAoYHJlcXVpcmVPcmdNZW1iZXJzaGlwYCBpbiBwbGF0Zm9ybSdzIGNvbnRyb2xsZXIgaGVscGVycywgYHJlcXVpcmVTeXN0ZW1BZG1pbmApXG4vLyByZWx5IG9uIHRoZSBvcmcvcm9sZSBlbWJlZGRlZCBpbiB0aGUgdG9rZW4uXG4vL1xuLy8gVG9rZW5zIGRlZmF1bHQgdG8gNS1taW51dGUgVFRMIOKAlCBsb25nIGVub3VnaCB0byBzdXJ2aXZlIGEgYmFja2VuZCBob3AsXG4vLyBzaG9ydCBlbm91Z2ggdGhhdCBhIGxlYWtlZCB0b2tlbiBpcyBsb3ctdmFsdWUuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgREVGQVVMVF9TRVJWSUNFX1RPS0VOX1RUTF9TRUNPTkRTID0gMzAwO1xuXG4vKipcbiAqIERlbnlsaXN0IG9mIHNlcnZpY2UgTkFNRVMgKHRoZSBgPG5hbWU+YCBpbiBgc3ViOiBzZXJ2aWNlOjxuYW1lPmApIHdob3NlIHRva2Vuc1xuICogYHJlcXVpcmVBdXRoYCBtdXN0IHJlamVjdC4gUmVhZCBmcm9tIGBTRVJWSUNFX1RPS0VOX0RFTllMSVNUYCAoY29tbWEtc2VwYXJhdGVkKVxuICogYXQgcHJvY2VzcyBzdGFydCwgc28gYXJtaW5nIGl0IGlzIGEgY29uZmlnIGNoYW5nZSArIHJvbGxvdXQg4oCUIGl0IGN1dHMgb2ZmIGFcbiAqIGNvbXByb21pc2VkIHNlcnZpY2UgV0lUSE9VVCByb3RhdGluZyBhbnkga2V5LCBhbmQgd2l0aG91dCBpbnZhbGlkYXRpbmcgZXZlcnlcbiAqIG90aGVyIHNlcnZpY2UncyB0b2tlbnMgYXMgY29sbGF0ZXJhbC5cbiAqL1xuY29uc3Qgc2VydmljZVRva2VuRGVueWxpc3QgPSBuZXcgU2V0KFxuICAocHJvY2Vzcy5lbnYuU0VSVklDRV9UT0tFTl9ERU5ZTElTVCB8fCAnJylcbiAgICAuc3BsaXQoJywnKVxuICAgIC5tYXAoKHMpID0+IHMudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbiksXG4pO1xuXG4vKipcbiAqIFRoZSBjYWxsaW5nIHNlcnZpY2UncyBuYW1lIGZvciBhIFNFUlZJQ0UgcHJpbmNpcGFsIChgcHJpbmNpcGFsVHlwZTogJ3NlcnZpY2UnYCksXG4gKiBlbHNlIGB1bmRlZmluZWRgLiBBIHVzZXIgdG9rZW4gbmV2ZXIgeWllbGRzIGEgbmFtZSwgd2hhdGV2ZXIgaXRzIGBzdWJgIHNheXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlTmFtZU9mKGNsYWltczogeyBwcmluY2lwYWxUeXBlPzogc3RyaW5nOyBzdWI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjbGFpbXM/LnByaW5jaXBhbFR5cGUgIT09ICdzZXJ2aWNlJyB8fCB0eXBlb2YgY2xhaW1zLnN1YiAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICghY2xhaW1zLnN1Yi5zdGFydHNXaXRoKFNFUlZJQ0VfU1VCSkVDVF9QUkVGSVgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gY2xhaW1zLnN1Yi5zbGljZShTRVJWSUNFX1NVQkpFQ1RfUFJFRklYLmxlbmd0aCkgfHwgdW5kZWZpbmVkO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHRoZSBjbGFpbXMgYXJlIGEgc2VydmljZSBwcmluY2lwYWwgd2hvc2Ugc2VydmljZSBpcyBvbiB0aGUgZGVueWxpc3QuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJ2aWNlVG9rZW5EZW5pZWQoY2xhaW1zOiB7IHByaW5jaXBhbFR5cGU/OiBzdHJpbmc7IHN1Yj86IHN0cmluZyB9KTogYm9vbGVhbiB7XG4gIGlmIChzZXJ2aWNlVG9rZW5EZW55bGlzdC5zaXplID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IG5hbWUgPSBzZXJ2aWNlTmFtZU9mKGNsYWltcyk7XG4gIHJldHVybiBuYW1lICE9PSB1bmRlZmluZWQgJiYgc2VydmljZVRva2VuRGVueWxpc3QuaGFzKG5hbWUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VUb2tlbk9wdGlvbnMge1xuICAvKiogQ2FsbGluZyBzZXJ2aWNlIGlkZW50aWZpZXIgKGUuZy4gJ2JpbGxpbmcnLCAncGxhdGZvcm0nKS4gRW1iZWRkZWQgYXMgYHN1Yjogc2VydmljZTo8bmFtZT5gLiAqL1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICAvKiogQWN0aXZlIG9yZyBjb250ZXh0IGZvciB0aGUgY2FsbC4gVXNlIHRoZSB0YXJnZXQgdGVuYW50J3Mgb3JnIGlkLCBvciB0aGVcbiAgICogIHdlbGwta25vd24gYFNZU1RFTV9PUkdfSURgIChhbiBPYmplY3RJZCkgZm9yIHN5c3RlbS13aWRlIG9wcyDigJQgTk9UIHRoZSBzdHJpbmdcbiAgICogICdzeXN0ZW0nLCB3aGljaCBpZC1iYXNlZCBzeXN0ZW0tb3JnIGNoZWNrcyB3b24ndCByZWNvZ25pemUuICovXG4gIG9yZ0lkPzogc3RyaW5nO1xuICAvKiogQWN0aXZlIG9yZyBuYW1lLiBEZWZhdWx0cyB0byBvcmdJZC4gKi9cbiAgb3JnTmFtZT86IHN0cmluZztcbiAgLyoqIFRUTCBpbiBzZWNvbmRzIChkZWZhdWx0IDMwMCkuICovXG4gIHR0bFNlY29uZHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBSb2xlIHRoZSB0b2tlbiBjYXJyaWVzIChyZXF1aXJlZCDigJQgbm8gaW1wbGljaXQgZGVmYXVsdCkuICoqUGFzcyB0aGUgTE9XRVNUXG4gICAqIHJvbGUgdGhlIGNhbGwgYWN0dWFsbHkgbmVlZHMqKiAoYCdtZW1iZXInYCBmb3IgcmVhZCAvIGRhdGEtcGxhbmUgY2FsbHMpIHNvIGFcbiAgICogbGVha2VkIHNlcnZpY2UgdG9rZW4gY2FuJ3QgcGVyZm9ybSBhZG1pbiBhY3Rpb25zIGluIHRoZSB0YXJnZXQgb3JnLlxuICAgKiBgaXNBZG1pbmAgaXMgZGVyaXZlZCBmcm9tIHRoaXMgKGFkbWlufG93bmVyIOKGkiB0cnVlKS5cbiAgICovXG4gIHJvbGU6ICdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcic7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBmaW5lLWdyYWluZWQgcGVybWlzc2lvbiBjbGFpbS4gUHJlZmVyIHRoaXMgKyBgcm9sZTogJ21lbWJlcidgIG92ZXIgYVxuICAgKiBoaWdoIHJvbGUgd2hlbiBhIGNhbGwgbmVlZHMgT05FIHNwZWNpZmljIGNhcGFiaWxpdHkgKGUuZy4gYFsncGx1Z2luczp3cml0ZSddYFxuICAgKiB0byBwdXNoIGEgcGx1Z2luIGltYWdlKSDigJQgdGhlIHRva2VuIHRoZW4gc2F0aXNmaWVzIHRoYXQgcGVybWlzc2lvbiBnYXRlXG4gICAqIFdJVEhPVVQgY2FycnlpbmcgYGlzQWRtaW5gLCBzbyBhIGxlYWtlZCB0b2tlbiBjYW4ndCBwZXJmb3JtIGFkbWluIGFjdGlvbnMuXG4gICAqL1xuICBwZXJtaXNzaW9ucz86IFBlcm1pc3Npb25bXTtcbiAgLyoqXG4gICAqIFNpZ25lZCBjbGFpbSAoYGF1ZGl0Q3Jvc3NPcmc6IHRydWVgKSBsZXR0aW5nIGFuIGAvYXVkaXQvZXZlbnRzYCBkZWxpdmVyeSBuYW1lXG4gICAqIGFuIGBhZmZlY3RlZE9yZ0lkYCBvdXRzaWRlIHRoZSB0b2tlbidzIG9yZy4gU2V0IE9OTFkgYnkgdGhlIHJlbW90ZS1hdWRpdFxuICAgKiBjbGllbnQsIGFuZCBvbmx5IHdoZW4gdGhlIGV2ZW50J3MgdmVyaWZpZWQgaW5ib3VuZCBwcmluY2lwYWwgd2FzIGFcbiAgICogc3VwZXJhZG1pbiBvciBhIHN5c3RlbS1vcmcgbWVtYmVyIOKAlCBuZXZlciBmcm9tIGNhbGwtc2l0ZSBpbnB1dC4gTWVhbnNcbiAgICogbm90aGluZyB0byBhbnkgb3RoZXIgcm91dGUuXG4gICAqL1xuICBhdWRpdENyb3NzT3JnPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNaW50IGEgSldUIGlkZW50aWZ5aW5nIHRoZSBjYWxsaW5nIHNlcnZpY2UuIFVzZWQgZm9yIGludGVyLXNlcnZpY2UgSFRUUCBjYWxscy5cbiAqIFRoZSB0b2tlbiBzYXRpc2ZpZXMgYHJlcXVpcmVBdXRoYCBhbmQgKHdoZW4gb3JnSWQgaXMgcHJlc2VudCkgYHJlcXVpcmVPcmdhbml6YXRpb25gLlxuICogU2NvcGUgaXQgd2l0aCBgb3B0cy5yb2xlYCDigJQgbGVhc3QgcHJpdmlsZWdlIGtlZXBzIGEgbGVha2VkIHRva2VuIGxvdy12YWx1ZS5cbiAqXG4gKiBgb3B0cy5zZXJ2aWNlTmFtZWAgbXVzdCBiZSBUSElTIHByb2Nlc3MncyBvd24gaWRlbnRpdHkgKGBTRVJWSUNFX05BTUVgKTogYVxuICogc2VydmljZSBob2xkcyBvbmx5IGl0cyBvd24gc2lnbmluZyBrZXksIHNvIG1pbnRpbmcgYSB0b2tlbiB0aGF0IG5hbWVzIGFub3RoZXJcbiAqIHNlcnZpY2UgdGhyb3dzIHJhdGhlciB0aGFuIHByb2R1Y2luZyBvbmUgZXZlcnkgcGVlciB3b3VsZCByZWplY3QuIFRoYXQgaXMgdGhlXG4gKiBvbmUgYmVoYXZpb3VyIGNoYW5nZSAjMTQgZm9yY2VzIG9uIGNhbGxlcnMg4oCUIHNlZSBgc2VydmljZXMvc2VydmljZS1rZXlzLnRzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25TZXJ2aWNlVG9rZW4ob3B0czogU2VydmljZVRva2VuT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHJvbGUgPSBvcHRzLnJvbGU7XG4gIGNvbnN0IHBheWxvYWQ6IE9taXQ8Snd0UGF5bG9hZCwgJ3N1Yic+ID0ge1xuICAgIHVzZXJuYW1lOiBgJHtvcHRzLnNlcnZpY2VOYW1lfS1zZXJ2aWNlYCxcbiAgICBlbWFpbDogYCR7b3B0cy5zZXJ2aWNlTmFtZX1AaW50ZXJuYWxgLFxuICAgIHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlJyxcbiAgICB0b2tlbl91c2U6ICdhY2Nlc3MnLFxuICAgIHJvbGUsXG4gICAgaXNBZG1pbjogcm9sZSA9PT0gJ293bmVyJyB8fCByb2xlID09PSAnYWRtaW4nLFxuICAgIHR5cGU6ICdhY2Nlc3MnLFxuICAgIG9yZ2FuaXphdGlvbklkOiBvcHRzLm9yZ0lkLFxuICAgIG9yZ2FuaXphdGlvbk5hbWU6IG9wdHMub3JnTmFtZSA/PyBvcHRzLm9yZ0lkLFxuICAgIC8vIFVuaXF1ZSB0b2tlbiBpZCBvbiBldmVyeSBtaW50LiBDb21iaW5lZCB3aXRoIHRoZSBzaG9ydCAoMzAwcyBkZWZhdWx0KSBUVExcbiAgICAvLyB0aGlzIGdpdmVzIGVhY2ggc2VydmljZSB0b2tlbiBhIGRpc3RpbmN0IGlkZW50aXR5IOKAlCB0aGUgY29ycmVsYXRpb24gaGFuZGxlXG4gICAgLy8gZm9yIHRyYWNpbmcgd2hpY2ggbWludCBwZXJmb3JtZWQgYSBjcm9zcy1zZXJ2aWNlIGFjdGlvbiwgYW5kIHRoZSBidWlsZGluZ1xuICAgIC8vIGJsb2NrIGZvciByZXBsYXkgZGV0ZWN0aW9uIChhIHZlcmlmaWVyIGNhbiB0cmFjayBzZWVuIGp0aXMpLiBJdCBkb2VzIE5PVFxuICAgIC8vIGJ5IGl0c2VsZiBwcmV2ZW50IHJlcGxheSB3aXRoaW4gdGhlIFRUTCB3aW5kb3cuXG4gICAganRpOiByYW5kb21VVUlEKCksXG4gICAgLy8gTGVhc3QtcHJpdmlsZWdlIGNhcGFiaWxpdHkgY2xhaW0gKG9wdGlvbmFsKSDigJQgbGV0cyBhIG1lbWJlci1yb2xlIHRva2VuXG4gICAgLy8gc2F0aXNmeSBhIHNwZWNpZmljIHBlcm1pc3Npb24gZ2F0ZSB3aXRob3V0IGNhcnJ5aW5nIGlzQWRtaW4uXG4gICAgLi4uKG9wdHMucGVybWlzc2lvbnMgJiYgb3B0cy5wZXJtaXNzaW9ucy5sZW5ndGggPiAwID8geyBwZXJtaXNzaW9uczogb3B0cy5wZXJtaXNzaW9ucyB9IDoge30pLFxuICAgIC4uLihvcHRzLmF1ZGl0Q3Jvc3NPcmcgPyB7IGF1ZGl0Q3Jvc3NPcmc6IHRydWUgYXMgY29uc3QgfSA6IHt9KSxcbiAgfTtcbiAgLy8gYHN1YmAsIGBpYXRgL2BleHBgIGFuZCB0aGUgb3B0aW9uYWwgaXNzdWVyL2F1ZGllbmNlIHRoYXQgcmVxdWlyZUF1dGhcbiAgLy8gdmVyaWZpZXMgYXJlIHN0YW1wZWQgYnkgdGhlIHNpZ25lciwgc28gdGhlcmUgaXMgZXhhY3RseSBvbmUgcGxhY2UgdGhhdFxuICAvLyBkZWNpZGVzIHdoYXQgYSBzZXJ2aWNlIHRva2VuIHNheXMuXG4gIHJldHVybiBzaWduU2VydmljZUp3dChwYXlsb2FkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCB7XG4gICAgc2VydmljZU5hbWU6IG9wdHMuc2VydmljZU5hbWUsXG4gICAgZXhwaXJlc0luU2Vjb25kczogb3B0cy50dGxTZWNvbmRzID8/IERFRkFVTFRfU0VSVklDRV9UT0tFTl9UVExfU0VDT05EUyxcbiAgICAuLi5pc3N1ZXJBdWRpZW5jZU9wdGlvbnMoKSxcbiAgfSk7XG59XG5cbi8qKiBDb252ZW5pZW5jZTogcmV0dXJucyBhIGBCZWFyZXIgPHRva2VuPmAgaGVhZGVyIHZhbHVlIGZvciBmZXRjaC9heGlvcyBjYWxscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJ2aWNlQXV0aEhlYWRlcihvcHRzOiBTZXJ2aWNlVG9rZW5PcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBCZWFyZXIgJHtzaWduU2VydmljZVRva2VuKG9wdHMpfWA7XG59XG5cbi8qKiBUcnVlIHdoZW4gYHJlcS51c2VyYCBpcyBhIHNlcnZpY2UgcHJpbmNpcGFsIChgcHJpbmNpcGFsVHlwZTogJ3NlcnZpY2UnYCwgbWludGVkIGJ5IGBzaWduU2VydmljZVRva2VuYCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJ2aWNlUHJpbmNpcGFsKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVxLnVzZXI/LnByaW5jaXBhbFR5cGUgPT09ICdzZXJ2aWNlJztcbn1cblxuLyoqXG4gKiBUcnVlIHdoZW4gYHJlcS51c2VyYCBpcyBhbiBPUkcgU0VSVklDRSBBQ0NPVU5UIChgcHJpbmNpcGFsVHlwZTpcbiAqICdzZXJ2aWNlX2FjY291bnQnYCkg4oCUIGEgbm9uLWh1bWFuIHByaW5jaXBhbCBvd25lZCBieSBvbmUgb3JnLCBhdXRoZW50aWNhdGluZ1xuICogd2l0aCBhIGBwYl9zYV/igKZgIGtleSBleGNoYW5nZWQgYXQgcGxhdGZvcm0uXG4gKlxuICogQSBzZXJ2aWNlIGFjY291bnQgaXMgTk9UIGFuIGludGVybmFsIHNlcnZpY2UgcHJpbmNpcGFsOiBpdCBob2xkcyBvcmcgUm9sZXMgYW5kXG4gKiBpcyBzdWJqZWN0IHRvIGV2ZXJ5IHBlcm1pc3Npb24gZ2F0ZSBhIG1lbWJlciBpcy4gV2hhdCBpdCBjYW4gbmV2ZXIgZG8gaXNcbiAqIHNhdGlzZnkgYSBIVU1BTi1wcmVzZW5jZSByZXF1aXJlbWVudCDigJQgc3RlcC11cCAoYW5kIGFueSBsYXRlciBhc3N1cmFuY2UgZ2F0ZSlcbiAqIHJlZnVzZXMgaXQgb3V0cmlnaHQsIGJlY2F1c2UgdGhlcmUgaXMgbm8gcGVyc29uIGJlaGluZCBpdCB0byByZS12ZXJpZnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcnZpY2VBY2NvdW50UHJpbmNpcGFsKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVxLnVzZXI/LnByaW5jaXBhbFR5cGUgPT09ICdzZXJ2aWNlX2FjY291bnQnO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGByZXEudXNlcmAgaXMgdGhlIG5hbWVkIGludGVybmFsIHNlcnZpY2UgKGUuZy4gYCdiaWxsaW5nJ2ApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VydmljZVByaW5jaXBhbE5hbWVkKHJlcTogUmVxdWVzdCwgc2VydmljZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2VydmljZU5hbWVPZihyZXEudXNlcikgPT09IHNlcnZpY2VOYW1lO1xufVxuXG4vKipcbiAqIFBSRS1hdXRoIGNoZWNrOiBjcnlwdG9ncmFwaGljYWxseSB2ZXJpZnkgdGhlIHJlcXVlc3QgY2FycmllcyBhIHZhbGlkLCBzaWduZWRcbiAqIFNFUlZJQ0UgdG9rZW4gKGBwcmluY2lwYWxUeXBlOiAnc2VydmljZSdgKS4gVW5saWtlIHtAbGluayBpc1NlcnZpY2VQcmluY2lwYWx9XG4gKiAod2hpY2ggcmVhZHMgdGhlIGFscmVhZHktcG9wdWxhdGVkIGByZXEudXNlcmApLCB0aGlzIHZlcmlmaWVzIHRoZSBiZWFyZXIgdG9rZW5cbiAqIGl0c2VsZiwgc28gaXQgaXMgc2FmZSB0byBjYWxsIEJFRk9SRSBgcmVxdWlyZUF1dGhgIHJ1bnMg4oCUIGUuZy4gdGhlIGdsb2JhbCByYXRlXG4gKiBsaW1pdGVyJ3MgYHNraXBgLCB3aGljaCBtdXN0IG5vdCB0cnVzdCB0aGUgc3Bvb2ZhYmxlIGB4LWludGVybmFsLXNlcnZpY2VgXG4gKiBoZWFkZXIuIE1pcnJvcnMgYHJlcXVpcmVBdXRoYCdzIFNFUlZJQ0UgY2hhaW4gZXhhY3RseSAodGhlIHNpZ25lcidzIG93biBrZXksXG4gKiByZXNvbHZlZCBieSBga2lkYCwgd2l0aCB0aGUgYHN1YmAvc2lnbmVyIGFncmVlbWVudCBjaGVjayBhbmQgdGhlIG9wdGlvbmFsXG4gKiBpc3N1ZXIvYXVkaWVuY2UpIGFuZCByZXR1cm5zIGBmYWxzZWAgb24gYW55IG1pc3NpbmcvaW52YWxpZC9ub24tc2VydmljZSB0b2tlblxuICog4oCUIGluY2x1ZGluZyBhbnkgcGxhdGZvcm0tc2lnbmVkIFVTRVIgdG9rZW4sIHdob3NlIGBraWRgIGlzIG5vdCBpbiB0aGUgc2VydmljZVxuICogYnVuZGxlIGF0IGFsbC4gU3RheXMgU1lOQ0hST05PVVMsIHdoaWNoIGlzIHdoeSB0aGUgcGVyLXNlcnZpY2UgcHVibGljIGtleXMgYXJlXG4gKiBkaXN0cmlidXRlZCBhcyBhIG1vdW50ZWQgYnVuZGxlIHJhdGhlciB0aGFuIGZldGNoZWQgb3ZlciBIVFRQLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5U2VydmljZVByaW5jaXBhbChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgY29uc3QgcGFydHMgPSByZXEuaGVhZGVycy5hdXRob3JpemF0aW9uPy5zcGxpdCgnICcpO1xuICBpZiAoIXBhcnRzIHx8IHBhcnRzLmxlbmd0aCAhPT0gMiB8fCBwYXJ0c1swXSAhPT0gJ0JlYXJlcicpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBoZWFkZXIgPSBkZWNvZGVKd3RIZWFkZXIocGFydHNbMV0pO1xuICAgIGlmICghaGVhZGVyPy5raWQgfHwgIWlzU2VydmljZUtpZChoZWFkZXIua2lkKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGRlY29kZWQgPSB2ZXJpZnlTZXJ2aWNlSnd0PEp3dFBheWxvYWQ+KHBhcnRzWzFdLCB7IGtpZDogaGVhZGVyLmtpZCwgLi4uaXNzdWVyQXVkaWVuY2VPcHRpb25zKCkgfSk7XG4gICAgaWYgKGRlY29kZWQudHlwZSAhPT0gJ2FjY2VzcycgfHwgZGVjb2RlZC5wcmluY2lwYWxUeXBlICE9PSAnc2VydmljZScgfHwgIWhhc1ZhbGlkSWRlbnRpdHlDbGFpbXMoZGVjb2RlZCkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBBIGRlbnlsaXN0ZWQgKGtpbGxlZCkgc2VydmljZSBtdXN0IE5PVCBiZSB0cmVhdGVkIGFzIGEgdHJ1c3RlZCBwcmluY2lwYWwg4oCUXG4gICAgLy8gb3RoZXJ3aXNlIGl0IGtlZXBzIHRoZSByYXRlLWxpbWl0ZXIgZXhlbXB0aW9uIGV2ZW4gdGhvdWdoIHJlcXVpcmVBdXRoIHJlamVjdHNcbiAgICAvLyBpdCBvbiByZWFsIHJvdXRlcy4gRm9sZCB0aGUga2lsbC1zd2l0Y2ggaW50byB0aGUgcHJlLWF1dGggY2hlY2sgdG9vLlxuICAgIHJldHVybiAhaXNTZXJ2aWNlVG9rZW5EZW5pZWQoZGVjb2RlZCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS10b2tlbnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL3NlcnZpY2UtdG9rZW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7O0dBRUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckgsT0FBTyxFQUFtQixNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBbUIsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsOEVBQThFO0FBQzlFLDRCQUE0QjtBQUM1QixFQUFFO0FBQ0YsNEVBQTRFO0FBQzVFLHNFQUFzRTtBQUN0RSw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hGLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELDZFQUE2RTtBQUM3RSxnRkFBZ0Y7QUFDaEYsZ0JBQWdCO0FBQ2hCLEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLGlGQUFpRjtBQUNqRiw0REFBNEQ7QUFDNUQsMkVBQTJFO0FBQzNFLGdGQUFnRjtBQUNoRiwyRUFBMkU7QUFDM0UsRUFBRTtBQUNGLHlFQUF5RTtBQUN6RSxpREFBaUQ7QUFDakQsOEVBQThFO0FBRTlFLE1BQU0saUNBQWlDLEdBQUcsR0FBRyxDQUFDO0FBRTlDOzs7Ozs7R0FNRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLENBQ2xDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsSUFBSSxFQUFFLENBQUM7S0FDdkMsS0FBSyxD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QUFLLENBQUM7UUFDdkgsNkVBQTZFO1FBQzdFLGdGQUFnRjtRQUNoRix1RUFBdUU7UUFDdkUsT0FBTyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU2VydmljZS10by1zZXJ2aWNlIHRva2VucyBhbmQgc2VydmljZS1wcmluY2lwYWwgY2hlY2tzLlxuICovXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0IH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBoYXNWYWxpZElkZW50aXR5Q2xhaW1zLCBpc3N1ZXJBdWRpZW5jZU9wdGlvbnMgfSBmcm9tICcuL2p3dC12ZXJpZnkuanMnO1xuaW1wb3J0IHsgU0VSVklDRV9TVUJKRUNUX1BSRUZJWCwgaXNTZXJ2aWNlS2lkLCBzaWduU2VydmljZUp3dCwgdmVyaWZ5U2VydmljZUp3dCB9IGZyb20gJy4uL3NlcnZpY2VzL3NlcnZpY2Uta2V5cy5qcyc7XG5pbXBvcnQgeyB0eXBlIEp3dFBheWxvYWQgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgdHlwZSBQZXJtaXNzaW9uIH0gZnJvbSAnLi4vdHlwZXMvcGVybWlzc2lvbnMuanMnO1xuaW1wb3J0IHsgZGVjb2RlSnd0SGVhZGVyIH0gZnJvbSAnLi4vdXRpbHMvandrLmpzJztcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VydmljZS10by1zZXJ2aWNlIHRva2Vuc1xuLy9cbi8vIEludGVyLXNlcnZpY2UgSFRUUCBjYWxscyAoYmlsbGluZyDihpIgbWVzc2FnZSwgcGxhdGZvcm0g4oaSIGNvbXBsaWFuY2UsIGV0Yy4pXG4vLyBuZWVkIHRvIHNhdGlzZnkgdGhlIHNhbWUgYHJlcXVpcmVBdXRoYCBtaWRkbGV3YXJlIGFzIHVzZXIgcmVxdWVzdHMuXG4vLyBgc2lnblNlcnZpY2VUb2tlbmAgbWludHMgYSBzaG9ydC1saXZlZCBFUzI1NiBKV1Qgc2lnbmVkIHdpdGggVEhJUyBzZXJ2aWNlJ3Ncbi8vIE9XTiBrZXkgKHNlZSBgc2VydmljZXMvc2VydmljZS1rZXlzLnRzYCksIGNhcnJ5aW5nIGBwcmluY2lwYWxUeXBlOiAnc2VydmljZSdgXG4vLyBhbmQgbmFtaW5nIHRoZSBjYWxsaW5nIHNlcnZpY2UgdmlhIGBzdWI6ICdzZXJ2aWNlOjxuYW1lPidgLiBHYXRlcyBicmFuY2ggb25cbi8vIHRoZSBjbGFpbTsgdGhlIHN1YmplY3QgbmFtZXMg4oCUIGFuZCBzaW5jZSAjMTQgdGhlIG5hbWUgaXMgY3J5cHRvZ3JhcGhpY2FsbHlcbi8vIGJvdW5kIHRvIHRoZSBzaWduaW5nIGtleSwgc28gaXQgY2FuIGFsc28gYmUgdHJ1c3RlZC5cbi8vIGByZXF1aXJlQXV0aGAgYWNjZXB0cyB0aGVzZSB0b2tlbnMgdHJhbnNwYXJlbnRseSDigJQgdGhleSBwYXNzIGBkZWNvZGVkLnN1YmBcbi8vIGFuZCBgZGVjb2RlZC5yb2xlYCBjaGVja3MsIGFuZCBkb3duc3RyZWFtIHRlbmFuY3kgZ2F0ZXMgcmVhZCB0aGUgb3JnIGVtYmVkZGVkXG4vLyBpbiB0aGUgdG9rZW4uXG4vL1xuLy8gQSBzZXJ2aWNlIHRva2VuIGNhcnJpZXMgTk8gYWRtaW4gYXV0aG9yaXR5LCB3aGF0ZXZlciBpdCBjbGFpbXM6IHRoZSB2ZXJpZmllclxuLy8gKGB2ZXJpZnlTZXJ2aWNlSnd0YCDihpIgYHdpdGhvdXRTZXJ2aWNlQXV0aG9yaXR5Q2xhaW1zYCkgZHJvcHMgYGlzU3VwZXJBZG1pbmAsXG4vLyBmb3JjZXMgYGlzQWRtaW46IGZhbHNlYCBhbmQgY2xhbXBzIGFuIGBvd25lcmAvYGFkbWluYCByb2xlIHRvIGBtZW1iZXJgLiBXaGF0IGFcbi8vIHNlcnZpY2UgbWF5IGRvIGlzIGRlY2lkZWQgYnkgaXRzIE5BTUUgKGJvdW5kIHRvIGl0cyBrZXkg4oCUXG4vLyBgcmVxdWlyZUludGVybmFsU2VydmljZWAsIGBpc1NlcnZpY2VQcmluY2lwYWxOYW1lZGApIGFuZCBieSB0aGUgZXhwbGljaXRcbi8vIGBwZXJtaXNzaW9uc2AgY2xhaW0uIFRva2VucyBmcm9tIHRoZSBvdXQtb2YtY2x1c3RlciBgZGVwbG95LWJvb3RzdHJhcGAgc2lnbmVyXG4vLyBhcmUgcmVmdXNlZCB1bmxlc3MgdGhlIHNlYW0gb3B0cyBpbiAoYHJlcXVpcmVBdXRoKHsgYWNjZXB0U2VydmljZXMgfSlgKS5cbi8vXG4vLyBUb2tlbnMgZGVmYXVsdCB0byA1LW1pbnV0ZSBUVEwg4oCUIGxvbmcgZW5vdWdoIHRvIHN1cnZpdmUgYSBiYWNrZW5kIGhvcCxcbi8vIHNob3J0IGVub3VnaCB0aGF0IGEgbGVha2VkIHRva2VuIGlzIGxvdy12YWx1ZS5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBERUZBVUxUX1NFUlZJQ0VfVE9LRU5fVFRMX1NFQ09ORFMgPSAzMDA7XG5cbi8qKlxuICogRGVueWxpc3Qgb2Ygc2VydmljZSBOQU1FUyAodGhlIGA8bmFtZT5gIGluIGBzdWI6IHNlcnZpY2U6PG5hbWU+YCkgd2hvc2UgdG9rZW5zXG4gKiBgcmVxdWlyZUF1dGhgIG11c3QgcmVqZWN0LiBSZWFkIGZyb20gYFNFUlZJQ0VfVE9LRU5fREVOWUxJU1RgIChjb21tYS1zZXBhcmF0ZWQpXG4gKiBhdCBwcm9jZXNzIHN0YXJ0LCBzbyBhcm1pbmcgaXQgaXMgYSBjb25maWcgY2hhbmdlICsgcm9sbG91dCDigJQgaXQgY3V0cyBvZmYgYVxuICogY29tcHJvbWlzZWQgc2VydmljZSBXSVRIT1VUIHJvdGF0aW5nIGFueSBrZXksIGFuZCB3aXRob3V0IGludmFsaWRhdGluZyBldmVyeVxuICogb3RoZXIgc2VydmljZSdzIHRva2VucyBhcyBjb2xsYXRlcmFsLlxuICovXG5jb25zdCBzZXJ2aWNlVG9rZW5EZW55bGlzdCA9IG5ldyBTZXQoXG4gIChwcm9jZXNzLmVudi5TRVJWSUNFX1RPS0VOX0RFTllMSVNUIHx8ICcnKVxuICAgIC5zcGxpdCgnLCcpXG4gICAgLm1hcCgocykgPT4gcy50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSxcbik7XG5cbi8qKlxuICogVGhlIGNhbGxpbmcgc2VydmljZSdzIG5hbWUgZm9yIGEgU0VSVklDRSBwcmluY2lwYWwgKGBwcmluY2lwYWxUeXBlOiAnc2VydmljZSdgKSxcbiAqIGVsc2UgYHVuZGVmaW5lZGAuIEEgdXNlciB0b2tlbiBuZXZlciB5aWVsZHMgYSBuYW1lLCB3aGF0ZXZlciBpdHMgYHN1YmAgc2F5cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VOYW1lT2YoY2xhaW1zOiB7IHByaW5jaXBhbFR5cGU/OiBzdHJpbmc7IHN1Yj86IHN0cmluZyB9IHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNsYWltcz8ucHJpbmNpcGFsVHlwZSAhPT0gJ3NlcnZpY2UnIHx8IHR5cGVvZiBjbGFpbXMuc3ViICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFjbGFpbXMuc3ViLnN0YXJ0c1dpdGgoU0VSVklDRV9TVUJKRUNUX1BSRUZJWCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBjbGFpbXMuc3ViLnNsaWNlKFNFUlZJQ0VfU1VCSkVDVF9QUkVGSVgubGVuZ3RoKSB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKiBUcnVlIHdoZW4gdGhlIGNsYWltcyBhcmUgYSBzZXJ2aWNlIHByaW5jaXBhbCB3aG9zZSBzZXJ2aWNlIGlzIG9uIHRoZSBkZW55bGlzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcnZpY2VUb2tlbkRlbmllZChjbGFpbXM6IHsgcHJpbmNpcGFsVHlwZT86IHN0cmluZzsgc3ViPzogc3RyaW5nIH0pOiBib29sZWFuIHtcbiAgaWYgKHNlcnZpY2VUb2tlbkRlbnlsaXN0LnNpemUgPT09IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbmFtZSA9IHNlcnZpY2VOYW1lT2YoY2xhaW1zKTtcbiAgcmV0dXJuIG5hbWUgIT09IHVuZGVmaW5lZCAmJiBzZXJ2aWNlVG9rZW5EZW55bGlzdC5oYXMobmFtZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVRva2VuT3B0aW9ucyB7XG4gIC8qKiBDYWxsaW5nIHNlcnZpY2UgaWRlbnRpZmllciAoZS5nLiAnYmlsbGluZycsICdwbGF0Zm9ybScpLiBFbWJlZGRlZCBhcyBgc3ViOiBzZXJ2aWNlOjxuYW1lPmAuICovXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnIGNvbnRleHQgZm9yIHRoZSBjYWxsLiBVc2UgdGhlIHRhcmdldCB0ZW5hbnQncyBvcmcgaWQsIG9yIHRoZVxuICAgKiAgd2VsbC1rbm93biBgU1lTVEVNX09SR19JRGAgKGFuIE9iamVjdElkKSBmb3Igc3lzdGVtLXdpZGUgb3BzIOKAlCBOT1QgdGhlIHN0cmluZ1xuICAgKiAgJ3N5c3RlbScsIHdoaWNoIGlkLWJhc2VkIHN5c3RlbS1vcmcgY2hlY2tzIHdvbid0IHJlY29nbml6ZS4gKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnIG5hbWUuIERlZmF1bHRzIHRvIG9yZ0lkLiAqL1xuICBvcmdOYW1lPzogc3RyaW5nO1xuICAvKiogVFRMIGluIHNlY29uZHMgKGRlZmF1bHQgMzAwKS4gKi9cbiAgdHRsU2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJvbGUgdGhlIHRva2VuIGNhcnJpZXMgKHJlcXVpcmVkIOKAlCBubyBpbXBsaWNpdCBkZWZhdWx0KS4gUGFzcyBgJ21lbWJlcidgOlxuICAgKiBldmVyeSB2ZXJpZmllciBjbGFtcHMgYSBzZXJ2aWNlIHRva2VuJ3MgYG93bmVyYC9gYWRtaW5gIHJvbGUgdG8gYG1lbWJlcmBcbiAgICogYW5kIGl0cyBgaXNBZG1pbmAgdG8gYGZhbHNlYCAoYHdpdGhvdXRTZXJ2aWNlQXV0aG9yaXR5Q2xhaW1zYCksIHNvIGEgaGlnaGVyXG4gICAqIHJvbGUgY29uZmVycyBub3RoaW5nIG9uIHRoZSByZWNlaXZpbmcgc2lkZS4gR3JhbnQgYSBjYXBhYmlsaXR5IHRocm91Z2hcbiAgICoge0BsaW5rIHBlcm1pc3Npb25zfSBpbnN0ZWFkLlxuICAgKi9cbiAgcm9sZTogJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGZpbmUtZ3JhaW5lZCBwZXJtaXNzaW9uIGNsYWltLiBQcmVmZXIgdGhpcyArIGByb2xlOiAnbWVtYmVyJ2Agb3ZlciBhXG4gICAqIGhpZ2ggcm9sZSB3aGVuIGEgY2FsbCBuZWVkcyBPTkUgc3BlY2lmaWMgY2FwYWJpbGl0eSAoZS5nLiBgWydwbHVnaW5zOndyaXRlJ11gXG4gICAqIHRvIHB1c2ggYSBwbHVnaW4gaW1hZ2UpIOKAlCB0aGUgdG9rZW4gdGhlbiBzYXRpc2ZpZXMgdGhhdCBwZXJtaXNzaW9uIGdhdGVcbiAgICogV0lUSE9VVCBjYXJyeWluZyBgaXNBZG1pbmAsIHNvIGEgbGVha2VkIHRva2VuIGNhbid0IHBlcmZvcm0gYWRtaW4gYWN0aW9ucy5cbiAgICovXG4gIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdO1xuICAvKipcbiAgICogU2lnbmVkIGNsYWltIChgYXVkaXRDcm9zc09yZzogdHJ1ZWApIGxldHRpbmcgYW4gYC9hdWRpdC9ldmVudHNgIGRlbGl2ZXJ5IG5hbWVcbiAgICogYW4gYGFmZmVjdGVkT3JnSWRgIG91dHNpZGUgdGhlIHRva2VuJ3Mgb3JnLiBTZXQgT05MWSBieSB0aGUgcmVtb3RlLWF1ZGl0XG4gICAqIGNsaWVudCwgYW5kIG9ubHkgd2hlbiB0aGUgZXZlbnQncyB2ZXJpZmllZCBpbmJvdW5kIHByaW5jaXBhbCB3YXMgYVxuICAgKiBzdXBlcmFkbWluIG9yIGEgc3lzdGVtLW9yZyBtZW1iZXIg4oCUIG5ldmVyIGZyb20gY2FsbC1zaXRlIGlucHV0LiBNZWFuc1xuICAgKiBub3RoaW5nIHRvIGFueSBvdGhlciByb3V0ZS5cbiAgICovXG4gIGF1ZGl0Q3Jvc3NPcmc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1pbnQgYSBKV1QgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgc2VydmljZS4gVXNlZCBmb3IgaW50ZXItc2VydmljZSBIVFRQIGNhbGxzLlxuICogVGhlIHRva2VuIHNhdGlzZmllcyBgcmVxdWlyZUF1dGhgIGFuZCAod2hlbiBvcmdJZCBpcyBwcmVzZW50KSBgcmVxdWlyZU9yZ2FuaXphdGlvbmAuXG4gKiBTY29wZSBpdCB3aXRoIGBvcHRzLnJvbGVgIOKAlCBsZWFzdCBwcml2aWxlZ2Uga2VlcHMgYSBsZWFrZWQgdG9rZW4gbG93LXZhbHVlLlxuICpcbiAqIGBvcHRzLnNlcnZpY2VOYW1lYCBtdXN0IGJlIFRISVMgcHJvY2VzcydzIG93biBpZGVudGl0eSAoYFNFUlZJQ0VfTkFNRWApOiBhXG4gKiBzZXJ2aWNlIGhvbGRzIG9ubHkgaXRzIG93biBzaWduaW5nIGtleSwgc28gbWludGluZyBhIHRva2VuIHRoYXQgbmFtZXMgYW5vdGhlclxuICogc2VydmljZSB0aHJvd3MgcmF0aGVyIHRoYW4gcHJvZHVjaW5nIG9uZSBldmVyeSBwZWVyIHdvdWxkIHJlamVjdC4gVGhhdCBpcyB0aGVcbiAqIG9uZSBiZWhhdmlvdXIgY2hhbmdlICMxNCBmb3JjZXMgb24gY2FsbGVycyDigJQgc2VlIGBzZXJ2aWNlcy9zZXJ2aWNlLWtleXMudHNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnblNlcnZpY2VUb2tlbihvcHRzOiBTZXJ2aWNlVG9rZW5PcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9sZSA9IG9wdHMucm9sZTtcbiAgY29uc3QgcGF5bG9hZDogT21pdDxKd3RQYXlsb2FkLCAnc3ViJz4gPSB7XG4gICAgdXNlcm5hbWU6IGAke29wdHMuc2VydmljZU5hbWV9LXNlcnZpY2VgLFxuICAgIGVtYWlsOiBgJHtvcHRzLnNlcnZpY2VOYW1lfUBpbnRlcm5hbGAsXG4gICAgcHJpbmNpcGFsVHlwZTogJ3NlcnZpY2UnLFxuICAgIHRva2VuX3VzZTogJ2FjY2VzcycsXG4gICAgcm9sZSxcbiAgICBpc0FkbWluOiByb2xlID09PSAnb3duZXInIHx8IHJvbGUgPT09ICdhZG1pbicsXG4gICAgdHlwZTogJ2FjY2VzcycsXG4gICAgb3JnYW5pemF0aW9uSWQ6IG9wdHMub3JnSWQsXG4gICAgb3JnYW5pemF0aW9uTmFtZTogb3B0cy5vcmdOYW1lID8/IG9wdHMub3JnSWQsXG4gICAgLy8gVW5pcXVlIHRva2VuIGlkIG9uIGV2ZXJ5IG1pbnQuIENvbWJpbmVkIHdpdGggdGhlIHNob3J0ICgzMDBzIGRlZmF1bHQpIFRUTFxuICAgIC8vIHRoaXMgZ2l2ZXMgZWFjaCBzZXJ2aWNlIHRva2VuIGEgZGlzdGluY3QgaWRlbnRpdHkg4oCUIHRoZSBjb3JyZWxhdGlvbiBoYW5kbGVcbiAgICAvLyBmb3IgdHJhY2luZyB3aGljaCBtaW50IHBlcmZvcm1lZCBhIGNyb3NzLXNlcnZpY2UgYWN0aW9uLCBhbmQgdGhlIGJ1aWxkaW5nXG4gICAgLy8gYmxvY2sgZm9yIHJlcGxheSBkZXRlY3Rpb24gKGEgdmVyaWZpZXIgY2FuIHRyYWNrIHNlZW4ganRpcykuIEl0IGRvZXMgTk9UXG4gICAgLy8gYnkgaXRzZWxmIHByZXZlbnQgcmVwbGF5IHdpdGhpbiB0aGUgVFRMIHdpbmRvdy5cbiAgICBqdGk6IHJhbmRvbVVVSUQoKSxcbiAgICAvLyBMZWFzdC1wcml2aWxlZ2UgY2FwYWJpbGl0eSBjbGFpbSAob3B0aW9uYWwpIOKAlCBsZXRzIGEgbWVtYmVyLXJvbGUgdG9rZW5cbiAgICAvLyBzYXRpc2Z5IGEgc3BlY2lmaWMgcGVybWlzc2lvbiBnYXRlIHdpdGhvdXQgY2FycnlpbmcgaXNBZG1pbi5cbiAgICAuLi4ob3B0cy5wZXJtaXNzaW9ucyAmJiBvcHRzLnBlcm1pc3Npb25zLmxlbmd0aCA+IDAgPyB7IHBlcm1pc3Npb25zOiBvcHRzLnBlcm1pc3Npb25zIH0gOiB7fSksXG4gICAgLi4uKG9wdHMuYXVkaXRDcm9zc09yZyA/IHsgYXVkaXRDcm9zc09yZzogdHJ1ZSBhcyBjb25zdCB9IDoge30pLFxuICB9O1xuICAvLyBgc3ViYCwgYGlhdGAvYGV4cGAgYW5kIHRoZSBvcHRpb25hbCBpc3N1ZXIvYXVkaWVuY2UgdGhhdCByZXF1aXJlQXV0aFxuICAvLyB2ZXJpZmllcyBhcmUgc3RhbXBlZCBieSB0aGUgc2lnbmVyLCBzbyB0aGVyZSBpcyBleGFjdGx5IG9uZSBwbGFjZSB0aGF0XG4gIC8vIGRlY2lkZXMgd2hhdCBhIHNlcnZpY2UgdG9rZW4gc2F5cy5cbiAgcmV0dXJuIHNpZ25TZXJ2aWNlSnd0KHBheWxvYWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHtcbiAgICBzZXJ2aWNlTmFtZTogb3B0cy5zZXJ2aWNlTmFtZSxcbiAgICBleHBpcmVzSW5TZWNvbmRzOiBvcHRzLnR0bFNlY29uZHMgPz8gREVGQVVMVF9TRVJWSUNFX1RPS0VOX1RUTF9TRUNPTkRTLFxuICAgIC4uLmlzc3VlckF1ZGllbmNlT3B0aW9ucygpLFxuICB9KTtcbn1cblxuLyoqIENvbnZlbmllbmNlOiByZXR1cm5zIGEgYEJlYXJlciA8dG9rZW4+YCBoZWFkZXIgdmFsdWUgZm9yIGZldGNoL2F4aW9zIGNhbGxzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcnZpY2VBdXRoSGVhZGVyKG9wdHM6IFNlcnZpY2VUb2tlbk9wdGlvbnMpOiBzdHJpbmcge1xuICByZXR1cm4gYEJlYXJlciAke3NpZ25TZXJ2aWNlVG9rZW4ob3B0cyl9YDtcbn1cblxuLyoqIFRydWUgd2hlbiBgcmVxLnVzZXJgIGlzIGEgc2VydmljZSBwcmluY2lwYWwgKGBwcmluY2lwYWxUeXBlOiAnc2VydmljZSdgLCBtaW50ZWQgYnkgYHNpZ25TZXJ2aWNlVG9rZW5gKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcnZpY2VQcmluY2lwYWwocmVxOiBSZXF1ZXN0KTogYm9vbGVhbiB7XG4gIHJldHVybiByZXEudXNlcj8ucHJpbmNpcGFsVHlwZSA9PT0gJ3NlcnZpY2UnO1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiBgcmVxLnVzZXJgIGlzIGFuIE9SRyBTRVJWSUNFIEFDQ09VTlQgKGBwcmluY2lwYWxUeXBlOlxuICogJ3NlcnZpY2VfYWNjb3VudCdgKSDigJQgYSBub24taHVtYW4gcHJpbmNpcGFsIG93bmVkIGJ5IG9uZSBvcmcsIGF1dGhlbnRpY2F0aW5nXG4gKiB3aXRoIGEgYHBiX3NhX+KApmAga2V5IGV4Y2hhbmdlZCBhdCBwbGF0Zm9ybS5cbiAqXG4gKiBBIHNlcnZpY2UgYWNjb3VudCBpcyBOT1QgYW4gaW50ZXJuYWwgc2VydmljZSBwcmluY2lwYWw6IGl0IGhvbGRzIG9yZyBSb2xlcyBhbmRcbiAqIGlzIHN1YmplY3QgdG8gZXZlcnkgcGVybWlzc2lvbiBnYXRlIGEgbWVtYmVyIGlzLiBXaGF0IGl0IGNhbiBuZXZlciBkbyBpc1xuICogc2F0aXNmeSBhIEhVTUFOLXByZXNlbmNlIHJlcXVpcmVtZW50IOKAlCBzdGVwLXVwIChhbmQgYW55IGxhdGVyIGFzc3VyYW5jZSBnYXRlKVxuICogcmVmdXNlcyBpdCBvdXRyaWdodCwgYmVjYXVzZSB0aGVyZSBpcyBubyBwZXJzb24gYmVoaW5kIGl0IHRvIHJlLXZlcmlmeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VydmljZUFjY291bnRQcmluY2lwYWwocmVxOiBSZXF1ZXN0KTogYm9vbGVhbiB7XG4gIHJldHVybiByZXEudXNlcj8ucHJpbmNpcGFsVHlwZSA9PT0gJ3NlcnZpY2VfYWNjb3VudCc7XG59XG5cbi8qKiBUcnVlIHdoZW4gYHJlcS51c2VyYCBpcyB0aGUgbmFtZWQgaW50ZXJuYWwgc2VydmljZSAoZS5nLiBgJ2JpbGxpbmcnYCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJ2aWNlUHJpbmNpcGFsTmFtZWQocmVxOiBSZXF1ZXN0LCBzZXJ2aWNlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzZXJ2aWNlTmFtZU9mKHJlcS51c2VyKSA9PT0gc2VydmljZU5hbWU7XG59XG5cbi8qKlxuICogUFJFLWF1dGggY2hlY2s6IGNyeXB0b2dyYXBoaWNhbGx5IHZlcmlmeSB0aGUgcmVxdWVzdCBjYXJyaWVzIGEgdmFsaWQsIHNpZ25lZFxuICogU0VSVklDRSB0b2tlbiAoYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlJ2ApLiBVbmxpa2Uge0BsaW5rIGlzU2VydmljZVByaW5jaXBhbH1cbiAqICh3aGljaCByZWFkcyB0aGUgYWxyZWFkeS1wb3B1bGF0ZWQgYHJlcS51c2VyYCksIHRoaXMgdmVyaWZpZXMgdGhlIGJlYXJlciB0b2tlblxuICogaXRzZWxmLCBzbyBpdCBpcyBzYWZlIHRvIGNhbGwgQkVGT1JFIGByZXF1aXJlQXV0aGAgcnVucyDigJQgZS5nLiB0aGUgZ2xvYmFsIHJhdGVcbiAqIGxpbWl0ZXIncyBgc2tpcGAsIHdoaWNoIG11c3Qgbm90IHRydXN0IHRoZSBzcG9vZmFibGUgYHgtaW50ZXJuYWwtc2VydmljZWBcbiAqIGhlYWRlci4gTWlycm9ycyBgcmVxdWlyZUF1dGhgJ3MgU0VSVklDRSBjaGFpbiBleGFjdGx5ICh0aGUgc2lnbmVyJ3Mgb3duIGtleSxcbiAqIHJlc29sdmVkIGJ5IGBraWRgLCB3aXRoIHRoZSBgc3ViYC9zaWduZXIgYWdyZWVtZW50IGNoZWNrIGFuZCB0aGUgb3B0aW9uYWxcbiAqIGlzc3Vlci9hdWRpZW5jZSkgYW5kIHJldHVybnMgYGZhbHNlYCBvbiBhbnkgbWlzc2luZy9pbnZhbGlkL25vbi1zZXJ2aWNlIHRva2VuXG4gKiDigJQgaW5jbHVkaW5nIGFueSBwbGF0Zm9ybS1zaWduZWQgVVNFUiB0b2tlbiwgd2hvc2UgYGtpZGAgaXMgbm90IGluIHRoZSBzZXJ2aWNlXG4gKiBidW5kbGUgYXQgYWxsLiBTdGF5cyBTWU5DSFJPTk9VUywgd2hpY2ggaXMgd2h5IHRoZSBwZXItc2VydmljZSBwdWJsaWMga2V5cyBhcmVcbiAqIGRpc3RyaWJ1dGVkIGFzIGEgbW91bnRlZCBidW5kbGUgcmF0aGVyIHRoYW4gZmV0Y2hlZCBvdmVyIEhUVFAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJ0cyA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb24/LnNwbGl0KCcgJyk7XG4gIGlmICghcGFydHMgfHwgcGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSAnQmVhcmVyJykgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IGhlYWRlciA9IGRlY29kZUp3dEhlYWRlcihwYXJ0c1sxXSk7XG4gICAgaWYgKCFoZWFkZXI/LmtpZCB8fCAhaXNTZXJ2aWNlS2lkKGhlYWRlci5raWQpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZGVjb2RlZCA9IHZlcmlmeVNlcnZpY2VKd3Q8Snd0UGF5bG9hZD4ocGFydHNbMV0sIHsga2lkOiBoZWFkZXIua2lkLCAuLi5pc3N1ZXJBdWRpZW5jZU9wdGlvbnMoKSB9KTtcbiAgICBpZiAoZGVjb2RlZC50eXBlICE9PSAnYWNjZXNzJyB8fCBkZWNvZGVkLnByaW5jaXBhbFR5cGUgIT09ICdzZXJ2aWNlJyB8fCAhaGFzVmFsaWRJZGVudGl0eUNsYWltcyhkZWNvZGVkKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEEgZGVueWxpc3RlZCAoa2lsbGVkKSBzZXJ2aWNlIG11c3QgTk9UIGJlIHRyZWF0ZWQgYXMgYSB0cnVzdGVkIHByaW5jaXBhbCDigJRcbiAgICAvLyBvdGhlcndpc2UgaXQga2VlcHMgdGhlIHJhdGUtbGltaXRlciBleGVtcHRpb24gZXZlbiB0aG91Z2ggcmVxdWlyZUF1dGggcmVqZWN0c1xuICAgIC8vIGl0IG9uIHJlYWwgcm91dGVzLiBGb2xkIHRoZSBraWxsLXN3aXRjaCBpbnRvIHRoZSBwcmUtYXV0aCBjaGVjayB0b28uXG4gICAgcmV0dXJuICFpc1NlcnZpY2VUb2tlbkRlbmllZChkZWNvZGVkKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
@@ -10,7 +10,7 @@ export * from './compliance-event-subscriber.js';
10
10
  export { type EntityEvent, type EntityEventSubscriber, entityEvents, } from './entity-events.js';
11
11
  export { destroySharedHttpAgents, createSafeClient, ResponseTooLargeError, InternalHttpClient, } from './http-client.js';
12
12
  export { setPlatformJwksCache, JwksUnavailableError, UnknownKidError, JwksCache, } from './jwks-cache.js';
13
- export { isServiceKid, serviceIdentity, verifyServiceJwt, } from './service-keys.js';
13
+ export { isServiceKid, OPT_IN_SERVICE_SIGNERS, serviceIdentity, verifyServiceJwt, withoutServiceAuthorityClaims, type ServiceJwtVerifyOptions, } from './service-keys.js';
14
14
  export { resetCircuitBreakers, } from './circuit-breaker.js';
15
15
  export { createEnvRedisDurableEventBus, type EventSubscription, type DurableEventBus, } from './durable-event-bus.js';
16
16
  export { getErrorRetryDecision, } from './retry-strategy.js';
@@ -16,7 +16,7 @@ export { setPlatformJwksCache, JwksUnavailableError, UnknownKidError, JwksCache,
16
16
  // side that platform's JWT options and the auth middleware need; key MATERIAL
17
17
  // handling (`signServiceJwt`, the bundle, the test reset hook) is reachable only
18
18
  // by deep import from inside api-core and its testing helpers.
19
- export { isServiceKid, serviceIdentity, verifyServiceJwt, } from './service-keys.js';
19
+ export { isServiceKid, OPT_IN_SERVICE_SIGNERS, serviceIdentity, verifyServiceJwt, withoutServiceAuthorityClaims, } from './service-keys.js';
20
20
  // The breaker is wired by the shared HTTP client; services consume its EFFECT,
21
21
  // not the class. Only the operational surface is public.
22
22
  export { resetCircuitBreakers, } from './circuit-breaker.js';
@@ -39,4 +39,4 @@ export { verifyPagerDutySignature, onCallInboundConfig, fetchRotaCoverage, parse
39
39
  export { sendPagerDutyEvent, pagerDutyConfig, resolveEventsEndpoint, PAGERDUTY_EVENTS_URL, } from './pagerduty.js';
40
40
  export { createEcosystemNotifyClient, NOTIFY_EMAIL_PATH, } from './ecosystem-notify-client.js';
41
41
  export { fetchOrgAIAccess, fetchOrgAIKey, assertOrgAIEnabled, requireOrgAIEnabled, resetOrgAICache, ORG_AI_ACCESS_PATH, ORG_AI_KEYS_PATH, } from './org-ai-client.js';
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLG1CQUFtQixFQUNuQiw4QkFBOEIsR0FDL0IsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsa0JBQWtCLEVBS2xCLFlBQVksR0FDYixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYiwwQkFBMEIsR0FLM0IsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGtCQUFrQixHQUVuQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFDTCxlQUFlLEdBR2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLFlBQVksRUFDWixhQUFhLEVBQ2IsY0FBYyxFQUNkLFVBQVUsRUFDVixXQUFXLEVBQ1gsZUFBZSxFQUNmLGVBQWUsRUFDZixxQ0FBcUMsR0FTdEMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsc0JBQXNCLEdBR3ZCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsMkJBQTJCLEVBRTNCLDhCQUE4QixHQUUvQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsT0FBTyxFQUdMLFlBQVksR0FDYixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsb0JBQW9CLEVB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LGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsZ0JBQWdCLEdBRWpCLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0IHtcbiAgZXhjaGFuZ2VBcGlLZXksXG4gIHJlc2V0QXBpS2V5RXhjaGFuZ2VDYWNoZSxcbiAgQXBpS2V5UmVqZWN0ZWRFcnJvcixcbiAgQXBpS2V5RXhjaGFuZ2VVbmF2YWlsYWJsZUVycm9yLFxufSBmcm9tICcuL2FwaS1rZXktZXhjaGFuZ2UuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlQ2FjaGVTZXJ2aWNlLFxuICB0eXBlIFJlZGlzQ2FjaGVDbGllbnQsXG4gIHR5cGUgQ2FjaGVJbnZhbGlkYXRpb25NZXNzYWdlLFxuICB0eXBlIENhY2hlSW52YWxpZGF0aW9uQnVzLFxuICB0eXBlIFJlZGlzSW52YWxpZGF0aW9uQ2xpZW50LFxuICBDYWNoZVNlcnZpY2UsXG59IGZyb20gJy4vY2FjaGUtc2VydmljZS5qcyc7XG5leHBvcnQge1xuICB3aXRoTGVhZGVyTG9jayxcbiAgY3JlYXRlRW52UmVkaXNMb2NrLFxuICBsZWFkZXJMb2NrS2V5LFxuICBERUZBVUxUX0xFQURFUl9MT0NLX1RUTF9NUyxcbiAgdHlwZSBMb2NrUmVkaXMsXG4gIHR5cGUgTGVhZGVyTG9ja1J1bixcbiAgdHlwZSBMZWFkZXJMb2NrT3B0aW9ucyxcbiAgdHlwZSBMZWFkZXJMb2NrQWJvcnRSZWFzb24sXG59IGZyb20gJy4vbGVhZGVyLWxvY2suanMnO1xuZXhwb3J0IHtcbiAgc2VuZFN5c3RlbU5vdGlmaWNhdGlvbixcbiAgU1lTVEVNX05PVElGWV9QQVRILFxuICB0eXBlIFN5c3RlbU5vdGlmaWNhdGlvbixcbn0gZnJvbSAnLi9zeXN0ZW0tbm90aWZpY2F0aW9uLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVNjaGVkdWxlcixcbiAgdHlwZSBTY2hlZHVsZXJPcHRpb25zLFxuICB0eXBlIFNjaGVkdWxlcixcbn0gZnJvbSAnLi9zY2hlZHVsZXIuanMnO1xuZXhwb3J0IHtcbiAgYXNzZXNzVmVyc2lvblZ1bG5zLFxuICB2ZXJzaW9uU2NhbkZhY3RzLFxuICBzY2FuRnJlc2huZXNzLFxuICBzY2FuV2FybmluZ3MsXG4gIGxhc3RTY2FubmVkQXQsXG4gIHNjYW5TdGFsZUhvdXJzLFxuICBzZXZlcml0eU9mLFxuICBtYXhTZXZlcml0eSxcbiAgc2V2ZXJpdHlBdExlYXN0LFxuICBWVUxOX1NFVkVSSVRJRVMsXG4gIHNldFZ1bG5Qb2xpY3lDb21wbGlhbmNlQ2xpZW50Rm9yVGVzdHMsXG4gIHR5cGUgVnVsblNldmVyaXR5LFxuICB0eXBlIFZ1bG5XYXJuaW5nLFxuICB0eXBlIFNjYW5uZWRSZWNvcmQsXG4gIHR5cGUgVnVsbkNvbnN1bXB0aW9uUG9saWN5LFxuICB0eXBlIFZ1bG5BY2NlcHRhbmNlLFxuICB0eXBlIFZlcnNpb25TY2FuRmFjdHMsXG4gIHR5cGUgVmVyc2lvblZ1bG5JbnB1dCxcbiAgdHlwZSBWZXJzaW9uVnVsbkFzc2Vzc21lbnQsXG59IGZyb20gJy4vdmVyc2lvbi12dWxuLXBvbGljeS5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVDb21wbGlhbmNlQ2xpZW50LFxuICB0eXBlIENvbXBsaWFuY2VDaGVja1Jlc3VsdCxcbiAgdHlwZSBDb21wbGlhbmNlVmlvbGF0aW9uLFxufSBmcm9tICcuL2NvbXBsaWFuY2UtY2xpZW50LmpzJztcbmV4cG9ydCB7XG4gIHBsdWdpblJ1bnNPd25JbWFnZSxcbiAgcGx1Z2luQ29tcGxpYW5jZVRhZ3MsXG4gIGRlcml2ZVBsdWdpbkltYWdlQ29tcGxpYW5jZSxcbiAgdHlwZSBQbHVnaW5Db21wbGlhbmNlQXR0cmlidXRlcyxcbiAgUExVR0lOX0lNQUdFX0NPTVBMSUFOQ0VfRklFTERTLFxuICB0eXBlIFBsdWdpbkltYWdlUm93LFxufSBmcm9tICcuLi91dGlscy9wbHVnaW4tY29tcGxpYW5jZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBsaWFuY2UtZXZlbnQtc3Vic2NyaWJlci5qcyc7XG5leHBvcnQge1xuICB0eXBlIEVudGl0eUV2ZW50LFxuICB0eXBlIEVudGl0eUV2ZW50U3Vic2NyaWJlcixcbiAgZW50aXR5RXZlbnRzLFxufSBmcm9tICcuL2VudGl0eS1ldmVudHMuanMnO1xuZXhwb3J0IHtcbiAgZGVzdHJveVNoYXJlZEh0dHBBZ2VudHMsXG4gIGNyZWF0ZVNhZmVDbGllbnQsXG4gIFJlc3BvbnNlVG9vTGFyZ2VFcnJvcixcbiAgSW50ZXJuYWxIdHRwQ2xpZW50LFxufSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmV4cG9ydCB7XG4gIHNldFBsYXRmb3JtSndrc0NhY2hlLFxuICBKd2tzVW5hdmFpbGFibGVFcnJvcixcbiAgVW5rbm93bktpZEVycm9yLFxuICBKd2tzQ2FjaGUsXG59IGZyb20gJy4vandrcy1jYWNoZS5qcyc7XG4vLyBTZXJ2aWNlLWtleSBpbnRlcm5hbHMgc3RheSBpbnRlcm5hbC4gVGhlIHBhY2thZ2Ugc3VyZmFjZSBpcyB0aGUgdmVyaWZ5L2luc3BlY3Rcbi8vIHNpZGUgdGhhdCBwbGF0Zm9ybSdzIEpXVCBvcHRpb25zIGFuZCB0aGUgYXV0aCBtaWRkbGV3YXJlIG5lZWQ7IGtleSBNQVRFUklBTFxuLy8gaGFuZGxpbmcgKGBzaWduU2VydmljZUp3dGAsIHRoZSBidW5kbGUsIHRoZSB0ZXN0IHJlc2V0IGhvb2spIGlzIHJlYWNoYWJsZSBvbmx5XG4vLyBieSBkZWVwIGltcG9ydCBmcm9tIGluc2lkZSBhcGktY29yZSBhbmQgaXRzIHRlc3RpbmcgaGVscGVycy5cbmV4cG9ydCB7XG4gIGlzU2VydmljZUtpZCxcbiAgc2VydmljZUlkZW50aXR5LFxuICB2ZXJpZnlTZXJ2aWNlSnd0LFxufSBmcm9tICcuL3NlcnZpY2Uta2V5cy5qcyc7XG4vLyBUaGUgYnJlYWtlciBpcyB3aXJlZCBieSB0aGUgc2hhcmVkIEhUVFAgY2xpZW50OyBzZXJ2aWNlcyBjb25zdW1lIGl0cyBFRkZFQ1QsXG4vLyBub3QgdGhlIGNsYXNzLiBPbmx5IHRoZSBvcGVyYXRpb25hbCBzdXJmYWNlIGlzIHB1YmxpYy5cbmV4cG9ydCB7XG4gIHJlc2V0Q2lyY3VpdEJyZWFrZXJzLFxufSBmcm9tICcuL2NpcmN1aXQtYnJlYWtlci5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVFbnZSZWRpc0R1cmFibGVFdmVudEJ1cyxcbiAgdHlwZSBFdmVudFN1YnNjcmlwdGlvbixcbiAgdHlwZSBEdXJhYmxlRXZlbnRCdXMsXG59IGZyb20gJy4vZHVyYWJsZS1ldmVudC1idXMuanMnO1xuZXhwb3J0IHtcbiAgZ2V0RXJyb3JSZXRyeURlY2lzaW9uLFxufSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgUmV0cnlDb25maWcsXG59IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuZXhwb3J0IHtcbiAgbmV4dEJhY2tvZmZNcyxcbiAgcmV0cnlGb3JldmVyLFxufSBmcm9tICcuL3JldHJ5LWZvcmV2ZXIuanMnO1xuZXhwb3J0IHtcbiAgZ2V0UXVvdGFTZXJ2aWNlQXV0aEhlYWRlcixcbiAgY3JlYXRlUXVvdGFTZXJ2aWNlLFxuICBpbmNyZW1lbnRRdW90YSxcbiAgcmVzZXJ2ZVF1b3RhLFxuICBzZW5kUXVvdGFSZXNlcnZlRGVuaWVkLFxuICBkZWNyZW1lbnRRdW90YSxcbiAgbWV0ZXJlZFF1b3RhVHlwZUZvcixcbiAgY2FsbFF1b3RhRXhlbXB0aW9uLFxuICBRVU9UQV9DSEVDS19USU1FT1VUX01TLFxuICBxdW90YUF0dHJpYnV0aW9uRnJvbVJlcXVlc3QsXG4gIHR5cGUgQWlLZXlTb3VyY2UsXG4gIHR5cGUgQWlMaW1pdENvZGUsXG4gIHR5cGUgQ2FsbFF1b3RhRXhlbXB0aW9uLFxuICB0eXBlIFF1b3RhUmVzZXJ2ZVJlc3VsdCxcbiAgdHlwZSBRdW90YVRva2VuVXNhZ2UsXG4gIHR5cGUgUXVvdGFTZXJ2aWNlLFxuICB0eXBlIFF1b3RhVXNhZ2VBdHRyaWJ1dGlvbixcbn0gZnJvbSAnLi9xdW90YS5qcyc7XG5leHBvcnQge1xuICBhaUNhbGxXZWlnaHQsXG4gIHBhcnNlQWlNb2RlbFdlaWdodHMsXG4gIE1BWF9BSV9DQUxMX1dFSUdIVCxcbn0gZnJvbSAnLi9haS1jYWxsLXdlaWdodC5qcyc7XG5leHBvcnQge1xuICBRdW90YUluY3JlbWVudEJhdGNoZXIsXG4gIGZsdXNoUXVvdGFJbmNyZW1lbnRzLFxuICBRVU9UQV9JTkNSRU1FTlRfRkxVU0hfTVMsXG4gIFFVT1RBX0lOQ1JFTUVOVF9CVUZGRVJfTUFYLFxuICBNQVhfR1JPVVBTX1BFUl9JTkNSRU1FTlQsXG4gIHR5cGUgTWV0ZXJlZEluY3JlbWVudEdyb3VwLFxufSBmcm9tICcuL3F1b3RhLWluY3JlbWVudC1iYXRjaGVyLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50LFxuICB3aXJlQXV0aHpEZW5pYWxBdWRpdG9yLFxuICByZWNvcmRBdWRpdCxcbiAgdHlwZSBSZW1vdGVBdWRpdEV2ZW50LFxuICB0eXBlIFJlbW90ZUF1ZGl0V2lyZUV2ZW50LFxuICB0eXBlIFJlbW90ZUF1ZGl0Q2xpZW50LFxufSBmcm9tICcuL3JlbW90ZS1hdWRpdC1jbGllbnQuanMnO1xuZXhwb3J0IHtcbiAgcnVuV2l0aEF1ZGl0Q29udGV4dCxcbiAgY3VycmVudEF1ZGl0Q29udGV4dCxcbiAgYXVkaXRDb250ZXh0RnJvbVJlcXVlc3QsXG4gIGF1ZGl0QXV0aEJsb2NrLFxuICBzYW5pdGl6ZUNvcnJlbGF0aW9uSWQsXG4gIHNhbml0aXplVXNlckFnZW50LFxuICBBVURJVF9DT1JSRUxBVElPTl9IRUFERVJTLFxuICB0eXBlIEF1ZGl0Q29udGV4dCxcbiAgdHlwZSBBdWRpdENvcnJlbGF0aW9uLFxuICB0eXBlIEF1ZGl0Sm9iQ29udGV4dCxcbiAgdHlwZSBBdWRpdEF1dGhCbG9jayxcbn0gZnJvbSAnLi9hdWRpdC1jb250ZXh0LmpzJztcbmV4cG9ydCB7XG4gIGF1ZGl0U3Bvb2xLZXksXG4gIGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCxcbiAgdHlwZSBBdWRpdFNwb29sLFxufSBmcm9tICcuL2F1ZGl0LXNwb29sLmpzJztcbmV4cG9ydCB7XG4gIHJlc29sdmVSZWRpc0Nvbm5lY3Rpb24sXG4gIGRlc2NyaWJlUmVkaXNDb25uZWN0aW9uLFxuICBjcmVhdGVSZWRpc0NsaWVudCxcbiAgY3JlYXRlRW52UmVkaXNDbGllbnQsXG4gIGNyZWF0ZVJlZGlzUmVhZHlHYXRlLFxuICBpbmNyV2luZG93LFxuICBSZWRpc0NvbmZpZ0Vycm9yLFxuICB0eXBlIFJlZGlzRXZhbENsaWVudCxcbn0gZnJvbSAnLi9lbnYtcmVkaXMuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlUmVkaXNUb2tlblJldm9jYXRpb25TdG9yZSxcbiAgY3JlYXRlRW52UmVkaXNUb2tlblJldm9jYXRpb25TdG9yZSxcbiAgcHVibGlzaFRva2VuUmV2b2NhdGlvbixcbiAgcHVibGlzaFNlc3Npb25SZXZvY2F0aW9uLFxuICBwdWJsaXNoQ3JlZGVudGlhbFJldm9jYXRpb24sXG59IGZyb20gJy4vdG9rZW4tcmV2b2NhdGlvbi5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVNZW1vcnlTc2VUaWNrZXRTdG9yZSxcbiAgY3JlYXRlRW52U3NlVGlja2V0U3RvcmUsXG4gIGVudlNzZVRpY2tldENhcHMsXG4gIHR5cGUgRW52U3NlVGlja2V0U3RvcmVDb25maWcsXG4gIHR5cGUgU3NlVGlja2V0U3RvcmUsXG4gIHR5cGUgU3NlVGlja2V0U3RvcmVDb25maWcsXG59IGZyb20gJy4vc3NlLXRpY2tldC1zdG9yZS5qcyc7XG5leHBvcnQge1xuICB3aXJlU2VydmljZVNlY3VyaXR5LFxufSBmcm9tICcuL3NlcnZpY2UtYm9vdC5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVXZWJob29rQ2hhbm5lbCxcbiAgY3JlYXRlRW1haWxDaGFubmVsLFxuICBjcmVhdGVDaGFubmVsUmVnaXN0cnksXG4gIHR5cGUgTm90aWZpY2F0aW9uUHJpb3JpdHksXG4gIHR5cGUgTm90aWZpY2F0aW9uTWVzc2FnZSxcbiAgdHlwZSBDaGFubmVsVGFyZ2V0LFxuICB0eXBlIERlbGl2ZXJ5UmVzdWx0LFxuICB0eXBlIE5vdGlmaWNhdGlvbkNoYW5uZWwsXG59IGZyb20gJy4vbm90aWZpY2F0aW9uLWNoYW5uZWxzLmpzJztcbmV4cG9ydCB7XG4gIGFsZXJ0RGVsaXZlcnlDb25maWcsXG4gIGNhbkRlbGl2ZXJBbnl3aGVyZSxcbiAgZGVhZG1hbkNvbmZpZyxcbiAgcmVwb3J0QWxlcnREZWxpdmVyeVBvc3R1cmUsXG4gIHNsYWNrQWxlcnRzQ29uZmlnLFxuICBzdGFydERlYWRtYW5IZWFydGJlYXQsXG4gIHN0b3BEZWFkbWFuSGVhcnRiZWF0LFxuICB0eXBlIERlYWRtYW5Db25maWcsXG4gIHR5cGUgQWxlcnREZWxpdmVyeUNvbmZpZyxcbiAgdHlwZSBTbGFja0FsZXJ0c0NvbmZpZyxcbn0gZnJvbSAnLi9hbGVydC1kZWxpdmVyeS5qcyc7XG5leHBvcnQge1xuICB2ZXJpZnlQYWdlckR1dHlTaWduYXR1cmUsXG4gIG9uQ2FsbEluYm91bmRDb25maWcsXG4gIGZldGNoUm90YUNvdmVyYWdlLFxuICBwYXJzZU9uQ2FsbFdlYmhvb2ssXG4gIGFja0xhdGVuY3lTZWNvbmRzLFxuICBQQUdFUkRVVFlfQVBJX1VSTCxcbiAgdHlwZSBPbkNhbGxJbmJvdW5kQ29uZmlnLFxuICB0eXBlIE9uQ2FsbFdlYmhvb2tFdmVudCxcbiAgdHlwZSBPbkNhbGxXZWJob29rRXZlbnRUeXBlLFxuICB0eXBlIFJvdGFDb3ZlcmFnZSxcbn0gZnJvbSAnLi9wYWdlcmR1dHktaW5ib3VuZC5qcyc7XG5leHBvcnQge1xuICBzZW5kUGFnZXJEdXR5RXZlbnQsXG4gIHBhZ2VyRHV0eUNvbmZpZyxcbiAgcmVzb2x2ZUV2ZW50c0VuZHBvaW50LFxuICBQQUdFUkRVVFlfRVZFTlRTX1VSTCxcbiAgdHlwZSBPbkNhbGxQcm92aWRlcixcbiAgdHlwZSBQYWdlckR1dHlBY3Rpb24sXG4gIHR5cGUgUGFnZXJEdXR5Q29uZmlnLFxuICB0eXBlIFBhZ2VyRHV0eUV2ZW50LFxuICB0eXBlIFBhZ2VyRHV0eVJlc3VsdCxcbiAgdHlwZSBQYWdlckR1dHlTZXZlcml0eSxcbn0gZnJvbSAnLi9wYWdlcmR1dHkuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlRWNvc3lzdGVtTm90aWZ5Q2xpZW50LFxuICBOT1RJRllfRU1BSUxfUEFUSCxcbiAgdHlwZSBFY29zeXN0ZW1Ob3RpZnlDbGllbnQsXG59IGZyb20gJy4vZWNvc3lzdGVtLW5vdGlmeS1jbGllbnQuanMnO1xuZXhwb3J0IHtcbiAgZmV0Y2hPcmdBSUFjY2VzcyxcbiAgZmV0Y2hPcmdBSUtleSxcbiAgYXNzZXJ0T3JnQUlFbmFibGVkLFxuICByZXF1aXJlT3JnQUlFbmFibGVkLFxuICByZXNldE9yZ0FJQ2FjaGUsXG4gIE9SR19BSV9BQ0NFU1NfUEFUSCxcbiAgT1JHX0FJX0tFWVNfUEFUSCxcbiAgdHlwZSBPcmdBSUFjY2Vzcyxcbn0gZnJvbSAnLi9vcmctYWktY2xpZW50LmpzJztcbiJdfQ==
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLG1CQUFtQixFQUNuQiw4QkFBOEIsR0FDL0IsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsa0JBQWtCLEVBS2xCLFlBQVksR0FDYixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYiwwQkFBMEIsR0FLM0IsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGtCQUFrQixHQUVuQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFDTCxlQUFlLEdBR2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLFlBQVksRUFDWixhQUFhLEVBQ2IsY0FBYyxFQUNkLFVBQVUsRUFDVixXQUFXLEVBQ1gsZUFBZSxFQUNmLGVBQWUsRUFDZixxQ0FBcUMsR0FTdEMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsc0JBQXNCLEdBR3ZCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsMkJBQTJCLEVBRTNCLDhCQUE4QixHQUUvQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsT0FBTyxFQUdMLFlBQVksR0FDYixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsb0JBQW9CLEVB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LGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixnQkFBZ0IsR0FFakIsTUFBTSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQge1xuICBleGNoYW5nZUFwaUtleSxcbiAgcmVzZXRBcGlLZXlFeGNoYW5nZUNhY2hlLFxuICBBcGlLZXlSZWplY3RlZEVycm9yLFxuICBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3IsXG59IGZyb20gJy4vYXBpLWtleS1leGNoYW5nZS5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVDYWNoZVNlcnZpY2UsXG4gIHR5cGUgUmVkaXNDYWNoZUNsaWVudCxcbiAgdHlwZSBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2UsXG4gIHR5cGUgQ2FjaGVJbnZhbGlkYXRpb25CdXMsXG4gIHR5cGUgUmVkaXNJbnZhbGlkYXRpb25DbGllbnQsXG4gIENhY2hlU2VydmljZSxcbn0gZnJvbSAnLi9jYWNoZS1zZXJ2aWNlLmpzJztcbmV4cG9ydCB7XG4gIHdpdGhMZWFkZXJMb2NrLFxuICBjcmVhdGVFbnZSZWRpc0xvY2ssXG4gIGxlYWRlckxvY2tLZXksXG4gIERFRkFVTFRfTEVBREVSX0xPQ0tfVFRMX01TLFxuICB0eXBlIExvY2tSZWRpcyxcbiAgdHlwZSBMZWFkZXJMb2NrUnVuLFxuICB0eXBlIExlYWRlckxvY2tPcHRpb25zLFxuICB0eXBlIExlYWRlckxvY2tBYm9ydFJlYXNvbixcbn0gZnJvbSAnLi9sZWFkZXItbG9jay5qcyc7XG5leHBvcnQge1xuICBzZW5kU3lzdGVtTm90aWZpY2F0aW9uLFxuICBTWVNURU1fTk9USUZZX1BBVEgsXG4gIHR5cGUgU3lzdGVtTm90aWZpY2F0aW9uLFxufSBmcm9tICcuL3N5c3RlbS1ub3RpZmljYXRpb24uanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlU2NoZWR1bGVyLFxuICB0eXBlIFNjaGVkdWxlck9wdGlvbnMsXG4gIHR5cGUgU2NoZWR1bGVyLFxufSBmcm9tICcuL3NjaGVkdWxlci5qcyc7XG5leHBvcnQge1xuICBhc3Nlc3NWZXJzaW9uVnVsbnMsXG4gIHZlcnNpb25TY2FuRmFjdHMsXG4gIHNjYW5GcmVzaG5lc3MsXG4gIHNjYW5XYXJuaW5ncyxcbiAgbGFzdFNjYW5uZWRBdCxcbiAgc2NhblN0YWxlSG91cnMsXG4gIHNldmVyaXR5T2YsXG4gIG1heFNldmVyaXR5LFxuICBzZXZlcml0eUF0TGVhc3QsXG4gIFZVTE5fU0VWRVJJVElFUyxcbiAgc2V0VnVsblBvbGljeUNvbXBsaWFuY2VDbGllbnRGb3JUZXN0cyxcbiAgdHlwZSBWdWxuU2V2ZXJpdHksXG4gIHR5cGUgVnVsbldhcm5pbmcsXG4gIHR5cGUgU2Nhbm5lZFJlY29yZCxcbiAgdHlwZSBWdWxuQ29uc3VtcHRpb25Qb2xpY3ksXG4gIHR5cGUgVnVsbkFjY2VwdGFuY2UsXG4gIHR5cGUgVmVyc2lvblNjYW5GYWN0cyxcbiAgdHlwZSBWZXJzaW9uVnVsbklucHV0LFxuICB0eXBlIFZlcnNpb25WdWxuQXNzZXNzbWVudCxcbn0gZnJvbSAnLi92ZXJzaW9uLXZ1bG4tcG9saWN5LmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZUNvbXBsaWFuY2VDbGllbnQsXG4gIHR5cGUgQ29tcGxpYW5jZUNoZWNrUmVzdWx0LFxuICB0eXBlIENvbXBsaWFuY2VWaW9sYXRpb24sXG59IGZyb20gJy4vY29tcGxpYW5jZS1jbGllbnQuanMnO1xuZXhwb3J0IHtcbiAgcGx1Z2luUnVuc093bkltYWdlLFxuICBwbHVnaW5Db21wbGlhbmNlVGFncyxcbiAgZGVyaXZlUGx1Z2luSW1hZ2VDb21wbGlhbmNlLFxuICB0eXBlIFBsdWdpbkNvbXBsaWFuY2VBdHRyaWJ1dGVzLFxuICBQTFVHSU5fSU1BR0VfQ09NUExJQU5DRV9GSUVMRFMsXG4gIHR5cGUgUGx1Z2luSW1hZ2VSb3csXG59IGZyb20gJy4uL3V0aWxzL3BsdWdpbi1jb21wbGlhbmNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcGxpYW5jZS1ldmVudC1zdWJzY3JpYmVyLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgRW50aXR5RXZlbnQsXG4gIHR5cGUgRW50aXR5RXZlbnRTdWJzY3JpYmVyLFxuICBlbnRpdHlFdmVudHMsXG59IGZyb20gJy4vZW50aXR5LWV2ZW50cy5qcyc7XG5leHBvcnQge1xuICBkZXN0cm95U2hhcmVkSHR0cEFnZW50cyxcbiAgY3JlYXRlU2FmZUNsaWVudCxcbiAgUmVzcG9uc2VUb29MYXJnZUVycm9yLFxuICBJbnRlcm5hbEh0dHBDbGllbnQsXG59IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuZXhwb3J0IHtcbiAgc2V0UGxhdGZvcm1Kd2tzQ2FjaGUsXG4gIEp3a3NVbmF2YWlsYWJsZUVycm9yLFxuICBVbmtub3duS2lkRXJyb3IsXG4gIEp3a3NDYWNoZSxcbn0gZnJvbSAnLi9qd2tzLWNhY2hlLmpzJztcbi8vIFNlcnZpY2Uta2V5IGludGVybmFscyBzdGF5IGludGVybmFsLiBUaGUgcGFja2FnZSBzdXJmYWNlIGlzIHRoZSB2ZXJpZnkvaW5zcGVjdFxuLy8gc2lkZSB0aGF0IHBsYXRmb3JtJ3MgSldUIG9wdGlvbnMgYW5kIHRoZSBhdXRoIG1pZGRsZXdhcmUgbmVlZDsga2V5IE1BVEVSSUFMXG4vLyBoYW5kbGluZyAoYHNpZ25TZXJ2aWNlSnd0YCwgdGhlIGJ1bmRsZSwgdGhlIHRlc3QgcmVzZXQgaG9vaykgaXMgcmVhY2hhYmxlIG9ubHlcbi8vIGJ5IGRlZXAgaW1wb3J0IGZyb20gaW5zaWRlIGFwaS1jb3JlIGFuZCBpdHMgdGVzdGluZyBoZWxwZXJzLlxuZXhwb3J0IHtcbiAgaXNTZXJ2aWNlS2lkLFxuICBPUFRfSU5fU0VSVklDRV9TSUdORVJTLFxuICBzZXJ2aWNlSWRlbnRpdHksXG4gIHZlcmlmeVNlcnZpY2VKd3QsXG4gIHdpdGhvdXRTZXJ2aWNlQXV0aG9yaXR5Q2xhaW1zLFxuICB0eXBlIFNlcnZpY2VKd3RWZXJpZnlPcHRpb25zLFxufSBmcm9tICcuL3NlcnZpY2Uta2V5cy5qcyc7XG4vLyBUaGUgYnJlYWtlciBpcyB3aXJlZCBieSB0aGUgc2hhcmVkIEhUVFAgY2xpZW50OyBzZXJ2aWNlcyBjb25zdW1lIGl0cyBFRkZFQ1QsXG4vLyBub3QgdGhlIGNsYXNzLiBPbmx5IHRoZSBvcGVyYXRpb25hbCBzdXJmYWNlIGlzIHB1YmxpYy5cbmV4cG9ydCB7XG4gIHJlc2V0Q2lyY3VpdEJyZWFrZXJzLFxufSBmcm9tICcuL2NpcmN1aXQtYnJlYWtlci5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVFbnZSZWRpc0R1cmFibGVFdmVudEJ1cyxcbiAgdHlwZSBFdmVudFN1YnNjcmlwdGlvbixcbiAgdHlwZSBEdXJhYmxlRXZlbnRCdXMsXG59IGZyb20gJy4vZHVyYWJsZS1ldmVudC1idXMuanMnO1xuZXhwb3J0IHtcbiAgZ2V0RXJyb3JSZXRyeURlY2lzaW9uLFxufSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgUmV0cnlDb25maWcsXG59IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuZXhwb3J0IHtcbiAgbmV4dEJhY2tvZmZNcyxcbiAgcmV0cnlGb3JldmVyLFxufSBmcm9tICcuL3JldHJ5LWZvcmV2ZXIuanMnO1xuZXhwb3J0IHtcbiAgZ2V0UXVvdGFTZXJ2aWNlQXV0aEhlYWRlcixcbiAgY3JlYXRlUXVvdGFTZXJ2aWNlLFxuICBpbmNyZW1lbnRRdW90YSxcbiAgcmVzZXJ2ZVF1b3RhLFxuICBzZW5kUXVvdGFSZXNlcnZlRGVuaWVkLFxuICBkZWNyZW1lbnRRdW90YSxcbiAgbWV0ZXJlZFF1b3RhVHlwZUZvcixcbiAgY2FsbFF1b3RhRXhlbXB0aW9uLFxuICBRVU9UQV9DSEVDS19USU1FT1VUX01TLFxuICBxdW90YUF0dHJpYnV0aW9uRnJvbVJlcXVlc3QsXG4gIHR5cGUgQWlLZXlTb3VyY2UsXG4gIHR5cGUgQWlMaW1pdENvZGUsXG4gIHR5cGUgQ2FsbFF1b3RhRXhlbXB0aW9uLFxuICB0eXBlIFF1b3RhUmVzZXJ2ZVJlc3VsdCxcbiAgdHlwZSBRdW90YVRva2VuVXNhZ2UsXG4gIHR5cGUgUXVvdGFTZXJ2aWNlLFxuICB0eXBlIFF1b3RhVXNhZ2VBdHRyaWJ1dGlvbixcbn0gZnJvbSAnLi9xdW90YS5qcyc7XG5leHBvcnQge1xuICBhaUNhbGxXZWlnaHQsXG4gIHBhcnNlQWlNb2RlbFdlaWdodHMsXG4gIE1BWF9BSV9DQUxMX1dFSUdIVCxcbn0gZnJvbSAnLi9haS1jYWxsLXdlaWdodC5qcyc7XG5leHBvcnQge1xuICBRdW90YUluY3JlbWVudEJhdGNoZXIsXG4gIGZsdXNoUXVvdGFJbmNyZW1lbnRzLFxuICBRVU9UQV9JTkNSRU1FTlRfRkxVU0hfTVMsXG4gIFFVT1RBX0lOQ1JFTUVOVF9CVUZGRVJfTUFYLFxuICBNQVhfR1JPVVBTX1BFUl9JTkNSRU1FTlQsXG4gIHR5cGUgTWV0ZXJlZEluY3JlbWVudEdyb3VwLFxufSBmcm9tICcuL3F1b3RhLWluY3JlbWVudC1iYXRjaGVyLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50LFxuICB3aXJlQXV0aHpEZW5pYWxBdWRpdG9yLFxuICByZWNvcmRBdWRpdCxcbiAgdHlwZSBSZW1vdGVBdWRpdEV2ZW50LFxuICB0eXBlIFJlbW90ZUF1ZGl0V2lyZUV2ZW50LFxuICB0eXBlIFJlbW90ZUF1ZGl0Q2xpZW50LFxufSBmcm9tICcuL3JlbW90ZS1hdWRpdC1jbGllbnQuanMnO1xuZXhwb3J0IHtcbiAgcnVuV2l0aEF1ZGl0Q29udGV4dCxcbiAgY3VycmVudEF1ZGl0Q29udGV4dCxcbiAgYXVkaXRDb250ZXh0RnJvbVJlcXVlc3QsXG4gIGF1ZGl0QXV0aEJsb2NrLFxuICBzYW5pdGl6ZUNvcnJlbGF0aW9uSWQsXG4gIHNhbml0aXplVXNlckFnZW50LFxuICBBVURJVF9DT1JSRUxBVElPTl9IRUFERVJTLFxuICB0eXBlIEF1ZGl0Q29udGV4dCxcbiAgdHlwZSBBdWRpdENvcnJlbGF0aW9uLFxuICB0eXBlIEF1ZGl0Sm9iQ29udGV4dCxcbiAgdHlwZSBBdWRpdEF1dGhCbG9jayxcbn0gZnJvbSAnLi9hdWRpdC1jb250ZXh0LmpzJztcbmV4cG9ydCB7XG4gIGF1ZGl0U3Bvb2xLZXksXG4gIGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCxcbiAgdHlwZSBBdWRpdFNwb29sLFxufSBmcm9tICcuL2F1ZGl0LXNwb29sLmpzJztcbmV4cG9ydCB7XG4gIHJlc29sdmVSZWRpc0Nvbm5lY3Rpb24sXG4gIGRlc2NyaWJlUmVkaXNDb25uZWN0aW9uLFxuICBjcmVhdGVSZWRpc0NsaWVudCxcbiAgY3JlYXRlRW52UmVkaXNDbGllbnQsXG4gIGNyZWF0ZVJlZGlzUmVhZHlHYXRlLFxuICBpbmNyV2luZG93LFxuICBSZWRpc0NvbmZpZ0Vycm9yLFxuICB0eXBlIFJlZGlzRXZhbENsaWVudCxcbn0gZnJvbSAnLi9lbnYtcmVkaXMuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlUmVkaXNUb2tlblJldm9jYXRpb25TdG9yZSxcbiAgY3JlYXRlRW52UmVkaXNUb2tlblJldm9jYXRpb25TdG9yZSxcbiAgcHVibGlzaFRva2VuUmV2b2NhdGlvbixcbiAgcHVibGlzaFNlc3Npb25SZXZvY2F0aW9uLFxuICBwdWJsaXNoQ3JlZGVudGlhbFJldm9jYXRpb24sXG59IGZyb20gJy4vdG9rZW4tcmV2b2NhdGlvbi5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVNZW1vcnlTc2VUaWNrZXRTdG9yZSxcbiAgY3JlYXRlRW52U3NlVGlja2V0U3RvcmUsXG4gIGVudlNzZVRpY2tldENhcHMsXG4gIHR5cGUgRW52U3NlVGlja2V0U3RvcmVDb25maWcsXG4gIHR5cGUgU3NlVGlja2V0U3RvcmUsXG4gIHR5cGUgU3NlVGlja2V0U3RvcmVDb25maWcsXG59IGZyb20gJy4vc3NlLXRpY2tldC1zdG9yZS5qcyc7XG5leHBvcnQge1xuICB3aXJlU2VydmljZVNlY3VyaXR5LFxufSBmcm9tICcuL3NlcnZpY2UtYm9vdC5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVXZWJob29rQ2hhbm5lbCxcbiAgY3JlYXRlRW1haWxDaGFubmVsLFxuICBjcmVhdGVDaGFubmVsUmVnaXN0cnksXG4gIHR5cGUgTm90aWZpY2F0aW9uUHJpb3JpdHksXG4gIHR5cGUgTm90aWZpY2F0aW9uTWVzc2FnZSxcbiAgdHlwZSBDaGFubmVsVGFyZ2V0LFxuICB0eXBlIERlbGl2ZXJ5UmVzdWx0LFxuICB0eXBlIE5vdGlmaWNhdGlvbkNoYW5uZWwsXG59IGZyb20gJy4vbm90aWZpY2F0aW9uLWNoYW5uZWxzLmpzJztcbmV4cG9ydCB7XG4gIGFsZXJ0RGVsaXZlcnlDb25maWcsXG4gIGNhbkRlbGl2ZXJBbnl3aGVyZSxcbiAgZGVhZG1hbkNvbmZpZyxcbiAgcmVwb3J0QWxlcnREZWxpdmVyeVBvc3R1cmUsXG4gIHNsYWNrQWxlcnRzQ29uZmlnLFxuICBzdGFydERlYWRtYW5IZWFydGJlYXQsXG4gIHN0b3BEZWFkbWFuSGVhcnRiZWF0LFxuICB0eXBlIERlYWRtYW5Db25maWcsXG4gIHR5cGUgQWxlcnREZWxpdmVyeUNvbmZpZyxcbiAgdHlwZSBTbGFja0FsZXJ0c0NvbmZpZyxcbn0gZnJvbSAnLi9hbGVydC1kZWxpdmVyeS5qcyc7XG5leHBvcnQge1xuICB2ZXJpZnlQYWdlckR1dHlTaWduYXR1cmUsXG4gIG9uQ2FsbEluYm91bmRDb25maWcsXG4gIGZldGNoUm90YUNvdmVyYWdlLFxuICBwYXJzZU9uQ2FsbFdlYmhvb2ssXG4gIGFja0xhdGVuY3lTZWNvbmRzLFxuICBQQUdFUkRVVFlfQVBJX1VSTCxcbiAgdHlwZSBPbkNhbGxJbmJvdW5kQ29uZmlnLFxuICB0eXBlIE9uQ2FsbFdlYmhvb2tFdmVudCxcbiAgdHlwZSBPbkNhbGxXZWJob29rRXZlbnRUeXBlLFxuICB0eXBlIFJvdGFDb3ZlcmFnZSxcbn0gZnJvbSAnLi9wYWdlcmR1dHktaW5ib3VuZC5qcyc7XG5leHBvcnQge1xuICBzZW5kUGFnZXJEdXR5RXZlbnQsXG4gIHBhZ2VyRHV0eUNvbmZpZyxcbiAgcmVzb2x2ZUV2ZW50c0VuZHBvaW50LFxuICBQQUdFUkRVVFlfRVZFTlRTX1VSTCxcbiAgdHlwZSBPbkNhbGxQcm92aWRlcixcbiAgdHlwZSBQYWdlckR1dHlBY3Rpb24sXG4gIHR5cGUgUGFnZXJEdXR5Q29uZmlnLFxuICB0eXBlIFBhZ2VyRHV0eUV2ZW50LFxuICB0eXBlIFBhZ2VyRHV0eVJlc3VsdCxcbiAgdHlwZSBQYWdlckR1dHlTZXZlcml0eSxcbn0gZnJvbSAnLi9wYWdlcmR1dHkuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlRWNvc3lzdGVtTm90aWZ5Q2xpZW50LFxuICBOT1RJRllfRU1BSUxfUEFUSCxcbiAgdHlwZSBFY29zeXN0ZW1Ob3RpZnlDbGllbnQsXG59IGZyb20gJy4vZWNvc3lzdGVtLW5vdGlmeS1jbGllbnQuanMnO1xuZXhwb3J0IHtcbiAgZmV0Y2hPcmdBSUFjY2VzcyxcbiAgZmV0Y2hPcmdBSUtleSxcbiAgYXNzZXJ0T3JnQUlFbmFibGVkLFxuICByZXF1aXJlT3JnQUlFbmFibGVkLFxuICByZXNldE9yZ0FJQ2FjaGUsXG4gIE9SR19BSV9BQ0NFU1NfUEFUSCxcbiAgT1JHX0FJX0tFWVNfUEFUSCxcbiAgdHlwZSBPcmdBSUFjY2Vzcyxcbn0gZnJvbSAnLi9vcmctYWktY2xpZW50LmpzJztcbiJdfQ==
@@ -47,6 +47,55 @@ export declare function signServiceJwt(claims: Record<string, unknown>, options:
47
47
  issuer?: string;
48
48
  audience?: string;
49
49
  }): string;
50
+ /**
51
+ * Signers whose key is published in the bundle but whose PRIVATE half lives
52
+ * OUTSIDE the cluster — today only `deploy-bootstrap`, which the deploy scripts
53
+ * hold on the operator / CI host (`certs/service-keys/deploy-bootstrap.key`)
54
+ * for the registry base-image push.
55
+ *
56
+ * Because the public bundle is mounted into EVERY service, a token from such a
57
+ * signer would otherwise verify everywhere. So {@link verifyServiceJwt} refuses
58
+ * these signers unless the call site names them in `acceptServices` — trust in
59
+ * an out-of-cluster key is opted into per verification seam, never inherited
60
+ * from the bundle. The seams that opt in today:
61
+ *
62
+ * - api/image-registry `auth-resolver.ts` (the `/token` mint for the
63
+ * `library/*` base-image push), via `verifyBearerToken(token, { acceptServices })`.
64
+ *
65
+ * A route opts in with `requireAuth({ acceptServices: ['deploy-bootstrap'] })`.
66
+ */
67
+ export declare const OPT_IN_SERVICE_SIGNERS: readonly string[];
68
+ /** Options every service-token verification takes. */
69
+ export interface ServiceJwtVerifyOptions {
70
+ kid: string;
71
+ issuer?: string;
72
+ audience?: string;
73
+ /**
74
+ * {@link OPT_IN_SERVICE_SIGNERS} this call site trusts. Any opt-in signer
75
+ * NOT listed is refused as an invalid token (401 at `requireAuth`). Naming an
76
+ * ordinary in-cluster service here is a no-op — those are always accepted.
77
+ */
78
+ acceptServices?: readonly string[];
79
+ }
80
+ /**
81
+ * The claims of a verified service token with every AUTHORITY claim a service
82
+ * may not assert about itself removed. A service principal's authority is its
83
+ * NAME (bound to its key — `requireInternalService`, `isServicePrincipalNamed`)
84
+ * plus the explicit least-privilege `permissions` claim, and nothing else:
85
+ *
86
+ * - `isSuperAdmin` is dropped — superadmin is a property of a PERSON, minted
87
+ * only by platform's user signer; a service key cannot confer it;
88
+ * - `isAdmin` is forced `false` and an `owner`/`admin` `role` is clamped to
89
+ * `member` — org admin-ness is likewise a person's membership, and every
90
+ * org-admin predicate (`isOrgAdmin`, `isAdmin === true`) reads one of these.
91
+ *
92
+ * Fail-safe by construction: a gate that wrongly relied on a service token's
93
+ * admin claim now refuses (403), it never grants more. Applied inside
94
+ * {@link verifyServiceJwt}, so EVERY chain that accepts a service token —
95
+ * api-core `requireAuth` / `verifyServicePrincipal`, platform's own verifier,
96
+ * image-registry's `/token` resolver — sees the same reduced claim set.
97
+ */
98
+ export declare function withoutServiceAuthorityClaims<T>(claims: T): T;
50
99
  /**
51
100
  * Verify an internal service token, SYNCHRONOUSLY, and return its claims.
52
101
  *
@@ -55,16 +104,19 @@ export declare function signServiceJwt(claims: Record<string, unknown>, options:
55
104
  * be impersonated by any other service — not even one that holds a valid key of
56
105
  * its own — a guarantee no shared secret can give.
57
106
  *
107
+ * Two further rules, both fail-closed:
108
+ * - an {@link OPT_IN_SERVICE_SIGNERS opt-in signer} (`deploy-bootstrap`) is
109
+ * refused unless `options.acceptServices` names it;
110
+ * - the returned claims never carry superadmin or org-admin authority
111
+ * ({@link withoutServiceAuthorityClaims}).
112
+ *
58
113
  * @throws {jwt.JsonWebTokenError} unknown `kid`, wrong algorithm, bad
59
- * signature, expired, or a `sub` that disagrees with the signing key.
114
+ * signature, expired, a `sub` that disagrees with the signing key, or an
115
+ * opt-in signer this call site did not accept.
60
116
  * @throws {ServiceKeyError} no verification bundle could be read at all — the
61
117
  * token's validity is UNKNOWN and the caller must not treat it as valid.
62
118
  */
63
- export declare function verifyServiceJwt<T = Record<string, unknown>>(token: string, options: {
64
- kid: string;
65
- issuer?: string;
66
- audience?: string;
67
- }): T;
119
+ export declare function verifyServiceJwt<T = Record<string, unknown>>(token: string, options: ServiceJwtVerifyOptions): T;
68
120
  /**
69
121
  * True while this service still publishes more than one verification key — i.e.
70
122
  * a signing-key rotation is open and the retiring key is still trusted. Feeds