@pipeline-builder/api-core 3.4.88 → 3.4.89

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.
@@ -177,12 +177,20 @@ function _requireAuth(options, req, res, next) {
177
177
  // privilege change the platform published). No store registered ⇒ this is a
178
178
  // no-op and control passes straight through. Fail-open on any store error.
179
179
  if (tokenRevocationStore && decoded.sub && typeof decoded.tokenVersion === 'number') {
180
- void isTokenRevoked(decoded).then((revoked) => {
180
+ // `.catch(next)` forwards a DOWNSTREAM synchronous throw from `next()` to
181
+ // Express's error middleware — without it, that throw would surface as an
182
+ // unhandled rejection (this `next()` runs in a microtask, outside the
183
+ // surrounding try/catch and Express's per-layer dispatch). `isTokenRevoked`
184
+ // itself never rejects (it fail-opens internally), so the catch only ever
185
+ // sees a genuine downstream error.
186
+ isTokenRevoked(decoded)
187
+ .then((revoked) => {
181
188
  if (revoked) {
182
189
  return sendError(res, HttpStatus.UNAUTHORIZED, 'Session has been revoked; please sign in again', ErrorCode.TOKEN_REVOKED);
183
190
  }
184
191
  next();
185
- });
192
+ })
193
+ .catch(next);
186
194
  return;
187
195
  }
188
196
  next();
@@ -471,4 +479,4 @@ export function verifyServicePrincipal(req) {
471
479
  return false;
472
480
  }
473
481
  }
474
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXBDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBbUIsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFL0MsNERBQTREO0FBQzVELElBQUksVUFBOEIsQ0FBQztBQUNuQyxJQUFJLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUM5Qiw4RUFBOEU7QUFDOUUsSUFBSSxrQkFBc0MsQ0FBQztBQUMzQyxJQUFJLDZCQUE2QixHQUFHLENBQUMsQ0FBQztBQUN0QyxNQUFNLDhCQUE4QixHQUFHLE9BQU8sQ0FBQyxDQUFDLFlBQVk7QUFFNUQsU0FBUyxZQUFZO0lBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLENBQUMsVUFBVSxJQUFJLEdBQUcsR0FBRyxxQkFBcUIsR0FBRyw4QkFBOEIsRUFBRSxDQUFDO1FBQ2hGLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEVBQUUs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QUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDL0QsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLE9BQU8sQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgand0IGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgeyBIdHRwU3RhdHVzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2h0dHAtc3RhdHVzLmpzJztcbmltcG9ydCB0eXBlIHsgSnd0UGF5bG9hZCB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICcuLi90eXBlcy9lcnJvci1jb2Rlcy5qcyc7XG5pbXBvcnQgeyB0eXBlIFBlcm1pc3Npb24sIGhhc1Blcm1pc3Npb24gfSBmcm9tICcuLi90eXBlcy9wZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRIZWFkZXJTdHJpbmcgfSBmcm9tICcuLi91dGlscy9oZWFkZXJzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBzZW5kRXJyb3IgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignYXV0aC1taWRkbGV3YXJlJyk7XG5cbi8qKiBDYWNoZWQgSldUIHNlY3JldCB3aXRoIHBlcmlvZGljIHJlZnJlc2ggZnJvbSBlbnYgdmFyLiAqL1xubGV0IF9qd3RTZWNyZXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbmxldCBfand0U2VjcmV0UmVmcmVzaGVkQXQgPSAwO1xuLyoqIENhY2hlZCBQUkVWSU9VUyBKV1Qgc2VjcmV0IChvcHRpb25hbCkg4oCUIGVuYWJsZXMgemVyby1kb3dudGltZSByb3RhdGlvbi4gKi9cbmxldCBfand0U2VjcmV0UHJldmlvdXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcbmxldCBfand0U2VjcmV0UHJldmlvdXNSZWZyZXNoZWRBdCA9IDA7XG5jb25zdCBKV1RfU0VDUkVUX1JFRlJFU0hfSU5URVJWQUxfTVMgPSAzMDBfMDAwOyAvLyA1IG1pbnV0ZXNcblxuZnVuY3Rpb24gZ2V0Snd0U2VjcmV0KCk6IHN0cmluZyB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGlmICghX2p3dFNlY3JldCB8fCBub3cgLSBfand0U2VjcmV0UmVmcmVzaGVkQXQgPiBKV1RfU0VDUkVUX1JFRlJFU0hfSU5URVJWQUxfTVMpIHtcbiAgICBjb25zdCBzZWNyZXQgPSBwcm9jZXNzLmVudi5KV1RfU0VDUkVUO1xuICAgIGlmICghc2VjcmV0KSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0pXVF9TRUNSRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdKV1RfU0VDUkVUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmIChfand0U2VjcmV0ICYmIF9qd3RTZWNyZXQgIT09IHNlY3JldCkge1xuICAgICAgbG9nZ2VyLmluZm8oJ0pXVCBzZWNyZXQgcm90YXRlZCcpO1xuICAgIH1cbiAgICBfand0U2VjcmV0ID0gc2VjcmV0O1xuICAgIF9qd3RTZWNyZXRSZWZyZXNoZWRBdCA9IG5vdztcbiAgfVxuICByZXR1cm4gX2p3dFNlY3JldDtcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9uYWwgUFJFVklPVVMgSldUIHNlY3JldCAoYEpXVF9TRUNSRVRfUFJFVklPVVNgKSwgY2FjaGVkIHdpdGggdGhlIHNhbWVcbiAqIFRUTCBhcyB0aGUgcHJpbWFyeS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHVuc2V0LiBEdXJpbmcgYSBgSldUX1NFQ1JFVGBcbiAqIHJvdGF0aW9uLCBvcGVyYXRvcnMgc2V0IGBKV1RfU0VDUkVUX1BSRVZJT1VTYCB0byB0aGUgb2xkIHZhbHVlIHNvIHRva2VucyBzaWduZWRcbiAqIHdpdGggRUlUSEVSIHNlY3JldCBrZWVwIHZlcmlmeWluZyDigJQgY2xvc2luZyB0aGUgYXV0aC1vdXRhZ2Ugd2luZG93IHdoZXJlXG4gKiBzdGlsbC12YWxpZCBvbGQtc2lnbmVkIChvciBmcmVzaGx5IG5ldy1zaWduZWQpIHRva2VucyB3b3VsZCBvdGhlcndpc2UgYmVcbiAqIHJlamVjdGVkLiBgdW5kZWZpbmVkYCBpcyBhIHZhbGlkIGNhY2hlZCB2YWx1ZSwgc28gdGhpcyByZWZyZXNoZXMgcHVyZWx5IG9uIHRoZVxuICogdGltZSBpbnRlcnZhbCAobm90IG9uIGVtcHRpbmVzcykuXG4gKi9cbmZ1bmN0aW9uIGdldEp3dFNlY3JldFByZXZpb3VzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGlmIChub3cgLSBfand0U2VjcmV0UHJldmlvdXNSZWZyZXNoZWRBdCA+IEpXVF9TRUNSRVRfUkVGUkVTSF9JTlRFUlZBTF9NUykge1xuICAgIF9qd3RTZWNyZXRQcmV2aW91cyA9IHByb2Nlc3MuZW52LkpXVF9TRUNSRVRfUFJFVklPVVMgfHwgdW5kZWZpbmVkO1xuICAgIF9qd3RTZWNyZXRQcmV2aW91c1JlZnJlc2hlZEF0ID0gbm93O1xuICB9XG4gIHJldHVybiBfand0U2VjcmV0UHJldmlvdXM7XG59XG5cbi8qKlxuICogVmVyaWZ5IGEgSldUIGFnYWluc3QgdGhlIHByaW1hcnkgc2VjcmV0LCBmYWxsaW5nIGJhY2sgdG8gdGhlIHByZXZpb3VzIHNlY3JldFxuICogKHdoZW4gYEpXVF9TRUNSRVRfUFJFVklPVVNgIGlzIGNvbmZpZ3VyZWQpIE9OTFkgb24gYSBzaWduYXR1cmUvdmVyaWZpY2F0aW9uXG4gKiBmYWlsdXJlLiBUaGlzIG1ha2VzIHRva2VuIHZlcmlmaWNhdGlvbiBzdXJ2aXZlIGEgc2VjcmV0IHJvdGF0aW9uIHdpdGggemVyb1xuICogZG93bnRpbWU6IGEgdG9rZW4gdmFsaWQgdW5kZXIgRUlUSEVSIHNlY3JldCBwYXNzZXMuXG4gKlxuICoganNvbndlYnRva2VuJ3MgYHZlcmlmeWAgdGFrZXMgYSBzaW5nbGUgc2VjcmV0LCBzbyB0aGlzIGlzIHRyeS1wcmltYXJ5LXRoZW4tXG4gKiBwcmV2aW91cyDigJQgTk9UIGEgc2VjcmV0IGFycmF5LiBObyBleGlzdGluZyBjaGVjayBpcyB3ZWFrZW5lZDpcbiAqICAgLSBgdmVyaWZ5T3B0aW9uc2AgKGFsZ29yaXRobSBwaW5uaW5nICsgb3B0aW9uYWwgaXNzdWVyL2F1ZGllbmNlKSBpcyBhcHBsaWVkXG4gKiAgICAgaWRlbnRpY2FsbHkgb24gQk9USCBhdHRlbXB0cywgc28gYWxnLWNvbmZ1c2lvbiAvIGBhbGc6bm9uZWAgc3RheSBibG9ja2VkLlxuICogICAtIEV4cGlyeSAvIG5vdC1iZWZvcmUgZnJvbSB0aGUgUFJJTUFSWSBhdHRlbXB0IGFyZSBhdXRob3JpdGF0aXZlIGFuZCBhcmVcbiAqICAgICByZS10aHJvd24gd2l0aG91dCBhIHByZXZpb3VzLXNlY3JldCByZXRyeSwgc28gYSBgVG9rZW5FeHBpcmVkRXJyb3JgIGlzXG4gKiAgICAgbmV2ZXIgbWFza2VkIGludG8gYW4gXCJpbnZhbGlkIHNpZ25hdHVyZVwiLlxuICogICAtIFdoZW4gbm8gcHJldmlvdXMgc2VjcmV0IGlzIHNldCwgYmVoYXZpb3VyIGlzIGJ5dGUtZm9yLWJ5dGUgdGhlIG9yaWdpbmFsOlxuICogICAgIHRoZSBwcmltYXJ5IGVycm9yIHByb3BhZ2F0ZXMgdW5jaGFuZ2VkLlxuICovXG5mdW5jdGlvbiB2ZXJpZnlKd3RXaXRoUm90YXRpb24odG9rZW46IHN0cmluZywgdmVyaWZ5T3B0aW9uczogand0LlZlcmlmeU9wdGlvbnMpOiBKd3RQYXlsb2FkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gand0LnZlcmlmeSh0b2tlbiwgZ2V0Snd0U2VjcmV0KCksIHZlcmlmeU9wdGlvbnMpIGFzIEp3dFBheWxvYWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IHByZXZpb3VzID0gZ2V0Snd0U2VjcmV0UHJldmlvdXMoKTtcbiAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHByZXZpb3VzIHNlY3JldCBvbmx5IGZvciBhIHNpZ25hdHVyZS92ZXJpZmljYXRpb24gZmFpbHVyZVxuICAgIC8vIChhIHBsYWluIEpzb25XZWJUb2tlbkVycm9yKS4gRXhwaXJ5IC8gbm90LWJlZm9yZSBhcmUgZW5mb3JjZWQgcmVnYXJkbGVzcyBvZlxuICAgIC8vIHdoaWNoIHNlY3JldCBzaWduZWQgdGhlIHRva2VuLCBzbyB0aG9zZSBlcnJvcnMgbXVzdCBzdXJmYWNlIGFzLWlzLlxuICAgIGlmIChcbiAgICAgIHByZXZpb3VzXG4gICAgICAmJiBlcnIgaW5zdGFuY2VvZiBqd3QuSnNvbldlYlRva2VuRXJyb3JcbiAgICAgICYmICEoZXJyIGluc3RhbmNlb2Ygand0LlRva2VuRXhwaXJlZEVycm9yKVxuICAgICAgJiYgIShlcnIgaW5zdGFuY2VvZiBqd3QuTm90QmVmb3JlRXJyb3IpXG4gICAgKSB7XG4gICAgICAvLyBBIHRva2VuIHNpZ25lZCBieSB0aGUgcHJldmlvdXMgc2VjcmV0IHZlcmlmaWVzIGhlcmU7IGlmIGl0IGlzIGluc3RlYWRcbiAgICAgIC8vIGV4cGlyZWQvaW52YWxpZCB1bmRlciB0aGUgcHJldmlvdXMgc2VjcmV0LCB0aGF0IGVycm9yIHByb3BhZ2F0ZXMgYW5kIGlzXG4gICAgICAvLyBoYW5kbGVkIGJ5IHRoZSBjYWxsZXIgZXhhY3RseSBsaWtlIGEgcHJpbWFyeSBmYWlsdXJlLlxuICAgICAgcmV0dXJuIGp3dC52ZXJpZnkodG9rZW4sIHByZXZpb3VzLCB2ZXJpZnlPcHRpb25zKSBhcyBKd3RQYXlsb2FkO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlQXV0aE9wdGlvbnMge1xuICAvKipcbiAgICogQWxsb3cgeC1vcmctaWQveC1vcmctbmFtZSBoZWFkZXJzIHRvIG92ZXJyaWRlIHRoZSBKV1QncyBvcmdhbml6YXRpb24gZmllbGRzLlxuICAgKlxuICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBgeC1vcmctaWRgL2B4LW9yZy1uYW1lYCBoZWFkZXJzIG92ZXJyaWRlIHRoZSBjYWxsZXIncyBvcmdcbiAgICog4oCUIGJ1dCBPTkxZIGZvciBhIHZlcmlmaWVkIFNZUy1BRE1JTiAoYGlzU3VwZXJBZG1pbmAgY2xhaW0pLiBGb3IgYW55IG9yZGluYXJ5XG4gICAqIGF1dGhlbnRpY2F0ZWQgdXNlciB0aGUgaGVhZGVycyBhcmUgaWdub3JlZCwgc28gZW5hYmxpbmcgdGhpcyBjYW4gbmV2ZXIgbGV0IGFcbiAgICogbm9ybWFsIHVzZXIgaW1wZXJzb25hdGUgYW5vdGhlciB0ZW5hbnQncyBvcmcuIFVzZSBmb3IgY3Jvc3Mtb3JnIGFkbWluIHRvb2xpbmdcbiAgICogKGUuZy4gYSBzeXNhZG1pbiBtYW5hZ2luZyBhIGdpdmVuIG9yZydzIGJpbGxpbmcpLiBJZiB1bnN1cmUsIGxlYXZlIGl0IGRpc2FibGVkLlxuICAgKi9cbiAgYWxsb3dPcmdIZWFkZXJPdmVycmlkZT86IGJvb2xlYW47XG59XG5cbi8qKiBKV1QgYXV0aCBtaWRkbGV3YXJlLiBVc2UgZGlyZWN0bHkgb3IgY2FsbCB3aXRoIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgb3B0aW9ucz86IFJlcXVpcmVBdXRoT3B0aW9ucyxcbik6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgcmVxT3JPcHRpb25zPzogUmVxdWVzdCB8IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVzPzogUmVzcG9uc2UsXG4gIG5leHQ/OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHwgKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZCkge1xuICBpZiAocmVxT3JPcHRpb25zICYmIHJlcyAmJiBuZXh0ICYmICdoZWFkZXJzJyBpbiByZXFPck9wdGlvbnMpIHtcbiAgICByZXR1cm4gX3JlcXVpcmVBdXRoKHt9LCByZXFPck9wdGlvbnMgYXMgUmVxdWVzdCwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSAocmVxT3JPcHRpb25zIGFzIFJlcXVpcmVBdXRoT3B0aW9ucykgfHwge307XG4gIHJldHVybiAocmVxOiBSZXF1ZXN0LCByZXNJbm5lcjogUmVzcG9uc2UsIG5leHRJbm5lcjogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgX3JlcXVpcmVBdXRoKG9wdGlvbnMsIHJlcSwgcmVzSW5uZXIsIG5leHRJbm5lcik7XG4gIH07XG59XG5cbi8qKlxuICogQSBzb3VyY2Ugb2YgdGhlIENVUlJFTlQgYHRva2VuVmVyc2lvbmAgZm9yIGEgdXNlciwgYmFja2VkIGJ5IGEgc3RvcmUgdGhlXG4gKiBzdGF0ZWxlc3Mgc2VydmljZXMgY2FuIHJlYWQgKGluIHByYWN0aWNlIGEgUmVkaXMga2V5IHRoZSBwbGF0Zm9ybSBwdWJsaXNoZXNcbiAqIHRvIG9uIGV2ZXJ5IHByaXZpbGVnZSBjaGFuZ2UpLiBSZWdpc3RlcmVkIHZpYSB7QGxpbmsgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmV9LlxuICpcbiAqIGBnZXRDdXJyZW50VmVyc2lvbmAgcmV0dXJucyB0aGUgdXNlcidzIGN1cnJlbnQgdmVyc2lvbiwgb3IgYG51bGxgIHdoZW4gdGhlXG4gKiBzdG9yZSBoYXMgbm8gZW50cnkg4oCUIGEgbWlzcyBpcyB0cmVhdGVkIGFzIFwibm8ga25vd24gcmV2b2NhdGlvblwiIChmYWlsLW9wZW4pOlxuICogcmV2b2NhdGlvbiBlbnRyaWVzIGFyZSBwdWJsaXNoZWQgd2l0aCBhIFRUTCBtYXRjaGluZyB0aGUgYWNjZXNzLXRva2VuXG4gKiBsaWZldGltZSwgc28gYSBtaXNzaW5nIGVudHJ5IG1lYW5zIGFueSB0b2tlbiBvbGQgZW5vdWdoIHRvIHByZWRhdGUgaXQgaGFzXG4gKiBhbHJlYWR5IGV4cGlyZWQgb24gaXRzIG93bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb2tlblJldm9jYXRpb25TdG9yZSB7XG4gIGdldEN1cnJlbnRWZXJzaW9uKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPjtcbn1cblxubGV0IHRva2VuUmV2b2NhdGlvblN0b3JlOiBUb2tlblJldm9jYXRpb25TdG9yZSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZWdpc3RlciAob3IgY2xlYXIsIHdpdGggYHVuZGVmaW5lZGApIHRoZSBwcm9jZXNzLXdpZGUgdG9rZW4tcmV2b2NhdGlvbiBzdG9yZS5cbiAqIFdoZW4gdW5zZXQgKHRoZSBkZWZhdWx0KSwgYHJlcXVpcmVBdXRoYCBwZXJmb3JtcyBOTyByZXZvY2F0aW9uIGNoZWNrIGFuZFxuICogYmVoYXZlcyBleGFjdGx5IGFzIGJlZm9yZSDigJQgc28gdGhpcyBpcyBmdWxseSBiYWNrd2FyZCBjb21wYXRpYmxlIGFuZCBzZXJ2aWNlc1xuICogb3B0IGluIGF0IGJvb3QgYnkgd2lyaW5nIHRoZWlyIFJlZGlzIGNsaWVudC4gUGxhdGZvcm0ga2VlcHMgaXRzIG93biBNb25nby1cbiAqIGJhY2tlZCBjaGVjayBhbmQgbmVlZCBub3QgcmVnaXN0ZXIgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmUoc3RvcmU6IFRva2VuUmV2b2NhdGlvblN0b3JlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIHRva2VuUmV2b2NhdGlvblN0b3JlID0gc3RvcmU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gYGRlY29kZWRgIGhhcyBiZWVuIHJldm9rZWQgcGVyIHRoZSByZWdpc3RlcmVkIHN0b3JlOiBpdHNcbiAqIGVtYmVkZGVkIGB0b2tlblZlcnNpb25gIGlzIHN0cmljdGx5IGJlaGluZCB0aGUgc3RvcmUncyBjdXJyZW50IHZlcnNpb24uXG4gKiBGYWlsLW9wZW4g4oCUIGFueSBzdG9yZSBlcnJvciwgYSBtaXNzaW5nIGVudHJ5LCBvciBhIHRva2VuL3N0b3JlIHdpdGhvdXQgYVxuICogdXNhYmxlIHZlcnNpb24geWllbGRzIGBmYWxzZWAgKGFsbG93KS4gTmV2ZXIgdGhyb3dzLlxuICovXG5hc3luYyBmdW5jdGlvbiBpc1Rva2VuUmV2b2tlZChkZWNvZGVkOiBKd3RQYXlsb2FkKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHN0b3JlID0gdG9rZW5SZXZvY2F0aW9uU3RvcmU7XG4gIGlmICghc3RvcmUgfHwgIWRlY29kZWQuc3ViIHx8IHR5cGVvZiBkZWNvZGVkLnRva2VuVmVyc2lvbiAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgc3RvcmUuZ2V0Q3VycmVudFZlcnNpb24oZGVjb2RlZC5zdWIpO1xuICAgIHJldHVybiBjdXJyZW50ICE9PSBudWxsICYmIGRlY29kZWQudG9rZW5WZXJzaW9uIDwgY3VycmVudDtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFpbC1vcGVuOiBhIHJldm9jYXRpb24tc3RvcmUgb3V0YWdlIG11c3Qgbm90IGxvY2sgZXZlcnkgdXNlciBvdXQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9yZXF1aXJlQXV0aChcbiAgb3B0aW9uczogUmVxdWlyZUF1dGhPcHRpb25zLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IHZvaWQge1xuICBjb25zdCBhdXRoSGVhZGVyID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbjtcblxuICBpZiAoIWF1dGhIZWFkZXIpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRob3JpemF0aW9uIGhlYWRlciByZXF1aXJlZCcsIEVycm9yQ29kZS5UT0tFTl9NSVNTSU5HKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gYXV0aEhlYWRlci5zcGxpdCgnICcpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSAnQmVhcmVyJykge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0ludmFsaWQgYXV0aG9yaXphdGlvbiBmb3JtYXQuIFVzZTogQmVhcmVyIDx0b2tlbj4nLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFBhc3MgdGhyb3VnaCBvcHRpb25hbCBpc3N1ZXIvYXVkaWVuY2UgdmVyaWZpY2F0aW9uIHdoZW4gZW52LWNvbmZpZ3VyZWQuXG4gICAgLy8gV2l0aG91dCB0aGVzZSwgYSBKV1Qgc2lnbmVkIGJ5IGFueSBzeXN0ZW0gdGhhdCBoYXBwZW5zIHRvIHNoYXJlIHRoZVxuICAgIC8vIHNhbWUgSldUX1NFQ1JFVCB3b3VsZCBiZSBhY2NlcHRlZCDigJQgZGVmZW5jZS1pbi1kZXB0aCBmb3Igc2hhcmVkLXNlY3JldFxuICAgIC8vIG1pc2NvbmZpZ3VyYXRpb25zIGFjcm9zcyBzZXJ2aWNlcyAvIGVudmlyb25tZW50cy5cbiAgICAvLyBQaW4gdGhlIGFjY2VwdGVkIGFsZ29yaXRobSB0byB0aGUgY29uZmlndXJlZCBITUFDIGFsZyAoZGVmYXVsdCBIUzI1NikuXG4gICAgLy8gV2l0aG91dCBhbiBhbGxvdy1saXN0LCBgand0LnZlcmlmeWAgYWNjZXB0cyBhbnkgYWxnb3JpdGhtIHRoZSBrZXkgY2FuXG4gICAgLy8gdmVyaWZ5IOKAlCB0aGUgY2xhc3NpYyBhbGctY29uZnVzaW9uIHZlY3RvciAoYW5kIGEgaGFyZCBndWFyZCBhZ2FpbnN0XG4gICAgLy8gYGFsZzpub25lYCkuIEVudi1kcml2ZW4gc28gaXQgc3RheXMgaW4gbG9ja3N0ZXAgd2l0aCBob3cgdG9rZW5zIGFyZVxuICAgIC8vIHNpZ25lZCAoc2VlIHNpZ25TZXJ2aWNlVG9rZW4gKyBwbGF0Zm9ybSdzIGNvbmZpZy5hdXRoLmp3dC5hbGdvcml0aG0pLlxuICAgIGNvbnN0IHZlcmlmeU9wdGlvbnM6IGp3dC5WZXJpZnlPcHRpb25zID0geyBhbGdvcml0aG1zOiBbKHByb2Nlc3MuZW52LkpXVF9BTEdPUklUSE0gfHwgJ0hTMjU2JykgYXMgand0LkFsZ29yaXRobV0gfTtcbiAgICBjb25zdCBleHBlY3RlZElzc3VlciA9IHByb2Nlc3MuZW52LkpXVF9JU1NVRVI7XG4gICAgY29uc3QgZXhwZWN0ZWRBdWRpZW5jZSA9IHByb2Nlc3MuZW52LkpXVF9BVURJRU5DRTtcbiAgICBpZiAoZXhwZWN0ZWRJc3N1ZXIpIHZlcmlmeU9wdGlvbnMuaXNzdWVyID0gZXhwZWN0ZWRJc3N1ZXI7XG4gICAgaWYgKGV4cGVjdGVkQXVkaWVuY2UpIHZlcmlmeU9wdGlvbnMuYXVkaWVuY2UgPSBleHBlY3RlZEF1ZGllbmNlO1xuICAgIGNvbnN0IGRlY29kZWQgPSB2ZXJpZnlKd3RXaXRoUm90YXRpb24ocGFydHNbMV0sIHZlcmlmeU9wdGlvbnMpO1xuXG4gICAgaWYgKGRlY29kZWQudHlwZSAhPT0gJ2FjY2VzcycpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ09ubHkgYWNjZXNzIHRva2VucyBjYW4gYmUgdXNlZCBmb3IgQVBJIHJlcXVlc3RzJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIGlmICghZGVjb2RlZC5zdWIgfHwgIWRlY29kZWQucm9sZSkge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnVG9rZW4gbWlzc2luZyByZXF1aXJlZCBmaWVsZHMnLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gICAgfVxuXG4gICAgcmVxLnVzZXIgPSB7IC4uLmRlY29kZWQgfTtcblxuICAgIC8vIFRoZSB4LW9yZy1pZC94LW9yZy1uYW1lIG92ZXJyaWRlIGxldHMgYSBTWVMtQURNSU4gYWN0IG9uIGEgY2hvc2VuIG9yZ1xuICAgIC8vIChjcm9zcy1vcmcgYWRtaW4gdG9vbGluZykuIEl0IGlzIGdhdGVkIG9uIHRoZSB2ZXJpZmllZCBgaXNTdXBlckFkbWluYCBjbGFpbVxuICAgIC8vIGhlcmUgc28gdGhhdCBldmVuIGEgcm91dGUgd2hpY2ggbWlzdGFrZW5seSBlbmFibGVzIGBhbGxvd09yZ0hlYWRlck92ZXJyaWRlYFxuICAgIC8vIGNhbiBORVZFUiBsZXQgYW4gb3JkaW5hcnkgYXV0aGVudGljYXRlZCB1c2VyIHNwb29mIGFub3RoZXIgdGVuYW50J3Mgb3JnIHZpYVxuICAgIC8vIHRoZSBoZWFkZXIg4oCUIGRlZmVuY2UtaW4tZGVwdGggYWdhaW5zdCB0aGUgY3Jvc3MtdGVuYW50IGJyZWFrIHRoaXMgY2F1c2VkLlxuICAgIGlmIChvcHRpb25zLmFsbG93T3JnSGVhZGVyT3ZlcnJpZGUgJiYgZGVjb2RlZC5pc1N1cGVyQWRtaW4gPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGhlYWRlck9yZ0lkID0gZ2V0SGVhZGVyU3RyaW5nKHJlcS5oZWFkZXJzWyd4LW9yZy1pZCddKTtcbiAgICAgIGNvbnN0IGhlYWRlck9yZ05hbWUgPSBnZXRIZWFkZXJTdHJpbmcocmVxLmhlYWRlcnNbJ3gtb3JnLW5hbWUnXSk7XG4gICAgICBpZiAoaGVhZGVyT3JnSWQpIHJlcS51c2VyLm9yZ2FuaXphdGlvbklkID0gaGVhZGVyT3JnSWQ7XG4gICAgICBpZiAoaGVhZGVyT3JnTmFtZSkgcmVxLnVzZXIub3JnYW5pemF0aW9uTmFtZSA9IGhlYWRlck9yZ05hbWU7XG4gICAgfVxuXG4gICAgLy8gU2Vzc2lvbi1pbnZhbGlkYXRpb24gY2hlY2sgZm9yIHRoZSBzdGF0ZWxlc3Mgc2VydmljZXM6IHJlamVjdCBhIHRva2VuXG4gICAgLy8gd2hvc2UgYHRva2VuVmVyc2lvbmAgaXMgYmVoaW5kIHRoZSByZXZvY2F0aW9uIHN0b3JlJ3MgY3VycmVudCB2YWx1ZSAoYVxuICAgIC8vIHByaXZpbGVnZSBjaGFuZ2UgdGhlIHBsYXRmb3JtIHB1Ymxpc2hlZCkuIE5vIHN0b3JlIHJlZ2lzdGVyZWQg4oeSIHRoaXMgaXMgYVxuICAgIC8vIG5vLW9wIGFuZCBjb250cm9sIHBhc3NlcyBzdHJhaWdodCB0aHJvdWdoLiBGYWlsLW9wZW4gb24gYW55IHN0b3JlIGVycm9yLlxuICAgIGlmICh0b2tlblJldm9jYXRpb25TdG9yZSAmJiBkZWNvZGVkLnN1YiAmJiB0eXBlb2YgZGVjb2RlZC50b2tlblZlcnNpb24gPT09ICdudW1iZXInKSB7XG4gICAgICB2b2lkIGlzVG9rZW5SZXZva2VkKGRlY29kZWQpLnRoZW4oKHJldm9rZWQpID0+IHtcbiAgICAgICAgaWYgKHJldm9rZWQpIHtcbiAgICAgICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdTZXNzaW9uIGhhcyBiZWVuIHJldm9rZWQ7IHBsZWFzZSBzaWduIGluIGFnYWluJywgRXJyb3JDb2RlLlRPS0VOX1JFVk9LRUQpO1xuICAgICAgICB9XG4gICAgICAgIG5leHQoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBqd3QuVG9rZW5FeHBpcmVkRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIGhhcyBleHBpcmVkJywgRXJyb3JDb2RlLlRPS0VOX0VYUElSRUQpO1xuICAgIH1cblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIGp3dC5Kc29uV2ViVG9rZW5FcnJvcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnSW52YWxpZCB0b2tlbicsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiBmYWlsZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGFkbWluIHJvbGUuIFVzZSBhZnRlciByZXF1aXJlQXV0aC5cbiAqIFBlcm1pdHMgdXNlcnMgd2hvc2UgcGVyLW9yZyByb2xlIGlzICdhZG1pbicgb3IgJ293bmVyJy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBZG1pbihcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgaWYgKCFyZXEudXNlcikge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gIH1cblxuICBpZiAocmVxLnVzZXIucm9sZSAhPT0gJ2FkbWluJyAmJiByZXEudXNlci5yb2xlICE9PSAnb3duZXInKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLCAnQWRtaW4gYWNjZXNzIHJlcXVpcmVkJywgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyk7XG4gIH1cblxuICBuZXh0KCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVxdWVzdCdzIHVzZXIgaG9sZHMgYHBlcm1pc3Npb25gLiBTdXBlcmFkbWlucyBpbXBsaWNpdGx5IGhvbGRcbiAqIGV2ZXJ5IHBlcm1pc3Npb24uIFJlYWRzIHRoZSByZXNvbHZlZCBgcGVybWlzc2lvbnNgIGNsYWltIChzZXQgYXQgdG9rZW4gaXNzdWUsXG4gKiBvciByZS1kZXJpdmVkIHBlciByZXF1ZXN0IGJ5IHRoZSBwbGF0Zm9ybSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VySGFzUGVybWlzc2lvbihyZXE6IFJlcXVlc3QsIHBlcm1pc3Npb246IFBlcm1pc3Npb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc1Blcm1pc3Npb24ocmVxLnVzZXI/LnBlcm1pc3Npb25zLCBwZXJtaXNzaW9uLCByZXEudXNlcj8uaXNTdXBlckFkbWluKTtcbn1cblxuLyoqXG4gKiBDb250ZXh0IHBhc3NlZCB0byBhIHJlZ2lzdGVyZWQgYXV0aG9yaXphdGlvbi1kZW5pYWwgYXVkaXRvciB3aGVuIGFcbiAqIHN0YXRlLWNoYW5naW5nIHJlcXVlc3QgaXMgcmVqZWN0ZWQgYnkgYHJlcXVpcmVQZXJtaXNzaW9uYCAvXG4gKiBgcmVxdWlyZVN5c3RlbUFkbWluYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoekRlbmlhbEluZm8ge1xuICAvKiogVGhlIGRlbmllZCB1c2VyJ3MgaWQgKGBzdWJgKSwgaWYgYXV0aGVudGljYXRlZC4gKi9cbiAgYWN0b3JJZD86IHN0cmluZztcbiAgYWN0b3JFbWFpbD86IHN0cmluZztcbiAgLyoqIFRoZSB1c2VyJ3MgYWN0aXZlIG9yZyBhdCBkZW5pYWwgdGltZS4gKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIC8qKiBIVFRQIG1ldGhvZCArIHBhdGggb2YgdGhlIHJlamVjdGVkIHJlcXVlc3QuICovXG4gIG1ldGhvZDogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKiBXaGF0IHdhcyByZXF1aXJlZDogdGhlIG1pc3NpbmcgcGVybWlzc2lvbihzKSwgb3IgJ3N5c3RlbS1hZG1pbicuICovXG4gIHJlcXVpcmVkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9uYWwgc2luayBmb3IgZGVuaWVkLWF1dGhvcml6YXRpb24gZXZlbnRzLiBMZWZ0IHVuc2V0IGJ5IGRlZmF1bHQgc29cbiAqIGFwaS1jb3JlIHN0YXlzIGRlY291cGxlZCBmcm9tIGFueSBhdWRpdCB0cmFuc3BvcnQg4oCUIGEgc2VydmljZSByZWdpc3RlcnMgb25lXG4gKiBhdCBib290ICh0eXBpY2FsbHkgZm9yd2FyZGluZyB0byBpdHMgYFJlbW90ZUF1ZGl0Q2xpZW50YCBhcyBhblxuICogYGF1dGh6LmRlbmllZGAgZXZlbnQsIG9yLCBvbiBwbGF0Zm9ybSwgdG8gdGhlIGxvY2FsIGBhdWRpdCgpYCBoZWxwZXIpLlxuICogTVVTVCBiZSBiZXN0LWVmZm9ydDogaXQgaXMgaW52b2tlZCBpbnNpZGUgdGhlIHJlcXVlc3QgcGF0aCwgc28gaXQgbXVzdCBuZXZlclxuICogdGhyb3cgb3IgYmxvY2sgKHRoZSBnYXRlIHdyYXBzIHRoZSBjYWxsIGluIHRyeS9jYXRjaCByZWdhcmRsZXNzKS5cbiAqL1xubGV0IGF1dGh6RGVuaWFsQXVkaXRvcjogKChpbmZvOiBBdXRoekRlbmlhbEluZm8pID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJlZ2lzdGVyIChvciBjbGVhciwgd2l0aCBgdW5kZWZpbmVkYCkgdGhlIHByb2Nlc3Mtd2lkZSBhdXRob3JpemF0aW9uLWRlbmlhbFxuICogYXVkaXRvci4gSWRlbXBvdGVudDsgdGhlIGxhc3QgcmVnaXN0cmF0aW9uIHdpbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRBdXRoekRlbmlhbEF1ZGl0b3IoZm46ICgoaW5mbzogQXV0aHpEZW5pYWxJbmZvKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBhdXRoekRlbmlhbEF1ZGl0b3IgPSBmbjtcbn1cblxuLyoqXG4gKiBFbWl0IGEgZGVuaWFsIGV2ZW50LCBiZXN0LWVmZm9ydC4gT25seSBmaXJlcyBmb3Igc3RhdGUtY2hhbmdpbmcgKG5vbi1HRVQsXG4gKiBub24tSEVBRC9PUFRJT05TKSByZXF1ZXN0cyDigJQgYSByZWplY3RlZCBHRVQgaXMgbG93LXNpZ25hbCBwcm9iaW5nIG5vaXNlIGFuZFxuICogd291bGQgYW1wbGlmeSBhdWRpdCB2b2x1bWUgdW5kZXIgYSBzY2FuLiBOZXZlciB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIGF1ZGl0QXV0aHpEZW5pYWwocmVxOiBSZXF1ZXN0LCByZXF1aXJlZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGF1ZGl0b3IgPSBhdXRoekRlbmlhbEF1ZGl0b3I7XG4gIGlmICghYXVkaXRvcikgcmV0dXJuO1xuICBjb25zdCBtZXRob2QgPSByZXEubWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gIGlmIChtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnIHx8IG1ldGhvZCA9PT0gJ09QVElPTlMnKSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXVkaXRvcih7XG4gICAgICBhY3RvcklkOiByZXEudXNlcj8uc3ViLFxuICAgICAgYWN0b3JFbWFpbDogcmVxLnVzZXI/LmVtYWlsLFxuICAgICAgb3JnSWQ6IHJlcS51c2VyPy5vcmdhbml6YXRpb25JZCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHBhdGg6IHJlcS5vcmlnaW5hbFVybCB8fCByZXEudXJsLFxuICAgICAgcmVxdWlyZWQsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEJlc3QtZWZmb3J0IOKAlCBhIGJyb2tlbiBhdWRpdG9yIG11c3QgbmV2ZXIgYnJlYWsgdGhlIGF1dGggZ2F0ZS5cbiAgfVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIHRoYXQgdGhlIHVzZXIgaG9sZCBBVCBMRUFTVCBPTkUgb2YgdGhlIGdpdmVuIHBlcm1pc3Npb25zIChvciBiZSBhXG4gKiBzdXBlcmFkbWluKS4gVXNlIGFmdGVyIHJlcXVpcmVBdXRoLiBNaXJyb3JzIGByZXF1aXJlUm9sZWAncyBhbnktb2Ygc2VtYW50aWNzO1xuICogcGFzcyBhIHNpbmdsZSBwZXJtaXNzaW9uIGZvciBhIHNwZWNpZmljIGFjdGlvbiwgb3Igc2V2ZXJhbCB3aGVuIGFueSBvbmUgb2ZcbiAqIHRoZW0gc2hvdWxkIGdyYW50IGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVQZXJtaXNzaW9uKC4uLnBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW10pIHtcbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIGlmICghcmVxLnVzZXIpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gICAgfVxuICAgIC8vIHVzZXJIYXNQZXJtaXNzaW9uIOKGkiBoYXNQZXJtaXNzaW9uIGFscmVhZHkgZ3JhbnRzIHN1cGVyYWRtaW5zIGV2ZXJ5XG4gICAgLy8gcGVybWlzc2lvbiwgc28gdGhpcyBzaW5nbGUgY2hlY2sgY292ZXJzIGJvdGggdGhlIHN1cGVyYWRtaW4gYnlwYXNzIGFuZFxuICAgIC8vIHRoZSBhbnktb2YgbWVtYmVyc2hpcCB0ZXN0IHdpdGhvdXQgcmUtaW5saW5pbmcgZWl0aGVyLlxuICAgIGlmIChwZXJtaXNzaW9ucy5zb21lKChwKSA9PiB1c2VySGFzUGVybWlzc2lvbihyZXEsIHApKSkgcmV0dXJuIG5leHQoKTtcbiAgICBhdWRpdEF1dGh6RGVuaWFsKHJlcSwgcGVybWlzc2lvbnMuam9pbignIG9yICcpKTtcbiAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgcmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTixcbiAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHBlcm1pc3Npb246ICR7cGVybWlzc2lvbnMuam9pbignIG9yICcpfWAsXG4gICAgICBFcnJvckNvZGUuSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TLFxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogUmVxdWlyZXMgdGhhdCB0aGUgdXNlciBob2xkIEVWRVJZIG9uZSBvZiB0aGUgZ2l2ZW4gcGVybWlzc2lvbnMgKG9yIGJlIGFcbiAqIHN1cGVyYWRtaW4pIOKAlCB0aGUgQU5EIGNvdW50ZXJwYXJ0IHRvIGByZXF1aXJlUGVybWlzc2lvbmAncyBhbnktb2YuIFVzZSBmb3IgYVxuICogc2Vuc2l0aXZlIGFjdGlvbiB0aGF0IGxlZ2l0aW1hdGVseSBkZW1hbmRzIHR3byBkaXN0aW5jdCBjYXBhYmlsaXRpZXMgYXQgb25jZVxuICogKGUuZy4gYSBjcm9zcy1zdXJmYWNlIG9wZXJhdGlvbiksIHNvIHRoZSBndWFyYW50ZWUgaXMgZXhwbGljaXQgcmF0aGVyIHRoYW5cbiAqIGFwcHJveGltYXRlZCBieSBjaGFpbmluZyB0d28gYHJlcXVpcmVQZXJtaXNzaW9uYCBnYXRlcy4gU3VwZXJhZG1pbnMgYnlwYXNzXG4gKiAodGhleSBpbXBsaWNpdGx5IGhvbGQgZXZlcnkgcGVybWlzc2lvbikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQWxsUGVybWlzc2lvbnMoLi4ucGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXSkge1xuICByZXR1cm4gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKTogdm9pZCA9PiB7XG4gICAgaWYgKCFyZXEudXNlcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgICB9XG4gICAgY29uc3QgbWlzc2luZyA9IHBlcm1pc3Npb25zLmZpbHRlcigocCkgPT4gIXVzZXJIYXNQZXJtaXNzaW9uKHJlcSwgcCkpO1xuICAgIGlmIChtaXNzaW5nLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5leHQoKTtcbiAgICBhdWRpdEF1dGh6RGVuaWFsKHJlcSwgcGVybWlzc2lvbnMuam9pbignIGFuZCAnKSk7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICBgTWlzc2luZyByZXF1aXJlZCBwZXJtaXNzaW9uOiAke21pc3Npbmcuam9pbignIGFuZCAnKX1gLFxuICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdGVuYW50J3MgY2Fub25pY2FsIG9yZyAqKmlkKiog4oCUIGEgZml4ZWQsIHdlbGwta25vd24gT2JqZWN0SWQgKE5PVFxuICogdGhlIHN0cmluZyAnc3lzdGVtJykuIFRoaXMgaXMgdGhlIHNpbmdsZSBrbm9iIGV2ZXJ5IHNlcnZpY2UgcmVzb2x2ZXMgdGhlXG4gKiBzeXN0ZW0gdGVuYW50IHRocm91Z2g7IG92ZXJyaWRlIHZpYSB0aGUgYFNZU1RFTV9PUkdfSURgIGVudiBmb3IgYWx0ZXJuYXRlXG4gKiBpbnN0YWxscy4gVGhlIHN5c3RlbSBvcmcncyBodW1hbiBpZGVudGlmaWVyIHN0YXlzIHRoZSBzbHVnL25hbWUgJ3N5c3RlbSdcbiAqIChzZWUge0BsaW5rIFNZU1RFTV9PUkdfU0xVR30pOyBvbmx5IGl0cyBgX2lkYCBpcyB0aGlzIE9iamVjdElkLlxuICovXG5leHBvcnQgY29uc3QgU1lTVEVNX09SR19JRCA9IChwcm9jZXNzLmVudi5TWVNURU1fT1JHX0lEIHx8ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnKS50b0xvd2VyQ2FzZSgpO1xuXG4vKiogVGhlIHN5c3RlbSBvcmcncyB3ZWxsLWtub3duIHNsdWcvbmFtZSAodGhlIGh1bWFuIGlkZW50aWZpZXI7IGl0cyBgX2lkYCBpcyB7QGxpbmsgU1lTVEVNX09SR19JRH0pLiAqL1xuZXhwb3J0IGNvbnN0IFNZU1RFTV9PUkdfU0xVRyA9ICdzeXN0ZW0nO1xuXG4vKipcbiAqIENoZWNrIGlmIGFuIG9yZ0lkIG9yIG9yZ05hbWUvc2x1ZyBtYXRjaGVzIHRoZSBzeXN0ZW0gb3JnLiBVc2UgdGhpcyBpbnN0ZWFkIG9mXG4gKiBjb21wYXJpbmcgZGlyZWN0bHk6IHRoZSBpZCBpcyBub3cgYW4gT2JqZWN0SWQgKHtAbGluayBTWVNURU1fT1JHX0lEfSkgd2hpbGUgdGhlXG4gKiBuYW1lL3NsdWcgaXMgJ3N5c3RlbScgKHtAbGluayBTWVNURU1fT1JHX1NMVUd9KSwgc28gdGhlIHR3byBhcmUgY29tcGFyZWQgYWdhaW5zdFxuICogdGhlaXIgcmVzcGVjdGl2ZSBjYW5vbmljYWwgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTeXN0ZW1PcmdJZChvcmdJZD86IHN0cmluZywgb3JnTmFtZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3JnSWQ/LnRvTG93ZXJDYXNlKCkgPT09IFNZU1RFTV9PUkdfSUQgfHwgb3JnTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gU1lTVEVNX09SR19TTFVHO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIGZyb20gYSBzeXN0ZW0gYWRtaW4uXG4gKlxuICogQXV0aG9yaXR5IGlzIGdyYW50ZWQgc29sZWx5IGJ5IHRoZSB1c2VyLWxldmVsIGBpc1N1cGVyQWRtaW5gIGZsYWcgY2FycmllZFxuICogaW4gdGhlIEpXVC4gVGhlIFwibWVtYmVyc2hpcCBpbiB0aGUgd2VsbC1rbm93biAnc3lzdGVtJyBvcmcgd2l0aCByb2xlXG4gKiBhZG1pbi9vd25lclwiIHBhdGggd2FzIHJlbW92ZWQg4oCUIGl0IGNvbmZsYXRlZCBhIFBpcGVsaW5lIEJ1aWxkZXIgb3BlcmF0b3JcbiAqIHdpdGggYSByZWFsIGN1c3RvbWVyIHRlbmFudCBpbiB0aGUgZGF0YSBtb2RlbCwgYW5kIG1lYW50IGFueSB1bmludGVuZGVkXG4gKiB3cml0ZSB0aGF0IGNyZWF0ZWQgYSAnc3lzdGVtJy1uYW1lZCBvcmcgY291bGQgcXVpZXRseSBncmFudCBjcm9zcy1vcmdcbiAqIGF1dGhvcml0eS4gVGhlIGBzeXN0ZW1gIG9yZyBzdGlsbCBleGlzdHMgYXMgYSAqY29udGVudCBob2xkZXIqIGZvciBzaGFyZWRcbiAqIHNhbXBsZSBkYXRhOyBpdCBqdXN0IG5vIGxvbmdlciBjb25mZXJzIHByaXZpbGVnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3lzdGVtQWRtaW4ocmVxOiBSZXF1ZXN0KTogYm9vbGVhbiB7XG4gIHJldHVybiByZXEudXNlcj8uaXNTdXBlckFkbWluID09PSB0cnVlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlcXVlc3QncyB0b2tlbiBjYXJyaWVzIGEgc3BlY2lmaWMgY2FwYWJpbGl0eSBgc2NvcGVgIChlLmcuXG4gKiBgJ3JlcG9ydGluZzppbmdlc3QnYCkuIFVzZWQgdG8gZ2F0ZSBlbmRwb2ludHMgdGhhdCBhY2NlcHQgYSBuYXJyb3cgbWFjaGluZVxuICogaWRlbnRpdHkg4oCUIGEgbm9ybWFsIGludGVyYWN0aXZlIHVzZXIgdG9rZW4gaGFzIG5vIGBzY29wZWAgYW5kIHJldHVybnMgZmFsc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNTY29wZShyZXE6IFJlcXVlc3QsIHNjb3BlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcS51c2VyPy5zY29wZSA9PT0gc2NvcGU7XG59XG5cbi8qKiBSZXF1aXJlcyBzeXN0ZW0gYWRtaW4gKGFkbWluIHJvbGUgKyBzeXN0ZW0gb3JnYW5pemF0aW9uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlU3lzdGVtQWRtaW4oXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIGlmICghaXNTeXN0ZW1BZG1pbihyZXEpKSB7XG4gICAgYXVkaXRBdXRoekRlbmlhbChyZXEsICdzeXN0ZW0tYWRtaW4nKTtcbiAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgcmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTixcbiAgICAgICdBY2Nlc3MgZGVuaWVkLiBPbmx5IHN5c3RlbSBhZG1pbmlzdHJhdG9ycyBjYW4gcGVyZm9ybSB0aGlzIGFjdGlvbi4nLFxuICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICApO1xuICB9XG4gIG5leHQoKTtcbn1cblxuLyoqXG4gKiBSZXF1aXJlIGEgc3BlY2lmaWMgZmVhdHVyZSBmbGFnLiBVc2UgYWZ0ZXIgcmVxdWlyZUF1dGguXG4gKiBDaGVja3MgdGhlIGBmZWF0dXJlc2AgYXJyYXkgaW4gdGhlIEpXVCBwYXlsb2FkIChzZXQgYXQgdG9rZW4gaXNzdWFuY2UpLlxuICogU3lzYWRtaW5zIChpc1N1cGVyQWRtaW4pIGJ5cGFzcyDigJQgdGhleSBhbHdheXMgaGF2ZSBldmVyeSBmZWF0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUZlYXR1cmUoZmVhdHVyZTogc3RyaW5nKSB7XG4gIHJldHVybiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJlcS51c2VyKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICAgIH1cblxuICAgIC8vIFN5c2FkbWlucyBnZXQgYWxsIGZlYXR1cmVzOyB0aGUgYGZlYXR1cmVzYCBhcnJheSBvbiB0aGVpciB0b2tlbiBpc1xuICAgIC8vIHBvcHVsYXRlZCB3aXRoIGV2ZXJ5IGZsYWcgYXQgaXNzdWFuY2UgdGltZSBidXQgdGhlIGJ5cGFzcyBoZXJlIGtlZXBzXG4gICAgLy8gdGhlIHJ1bGUgZXhwbGljaXQgYW5kIHN1cnZpdmVzIGEgdG9rZW4gaXNzdWVkIGJlZm9yZSBhIG5ldyBmZWF0dXJlXG4gICAgLy8gZmxhZyB3YXMgYWRkZWQuXG4gICAgaWYgKHJlcS51c2VyLmlzU3VwZXJBZG1pbiA9PT0gdHJ1ZSkgcmV0dXJuIG5leHQoKTtcblxuICAgIGlmICghcmVxLnVzZXIuZmVhdHVyZXM/LmluY2x1ZGVzKGZlYXR1cmUpKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLFxuICAgICAgICBgVGhpcyBmZWF0dXJlIHJlcXVpcmVzIGEgaGlnaGVyIHBsYW4gKCR7ZmVhdHVyZX0pYCxcbiAgICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGVmZmVjdGl2ZSBhY2Nlc3MgbW9kaWZpZXIgZm9yIGFuIGVudGl0eSBiZWluZyBjcmVhdGVkL3VwZGF0ZWQuXG4gKiAncHVibGljJyBpcyBwZXJtaXR0ZWQgZm9yIGFueSBhZG1pbiBvciBvd25lciByb2xlIChzeXN0ZW0gYWRtaW5zIGNyZWF0ZVxuICogY2F0YWxvZy13aWRlIHB1YmxpYyBlbnRpdGllczsgb3JnIGFkbWlucyBjcmVhdGUgb3JnLXdpZGUgcHVibGljIGVudGl0aWVzKS5cbiAqIEV2ZXJ5b25lIGVsc2UgKG1lbWJlciByb2xlLCBubyByb2xlKSBnZXRzICdwcml2YXRlJy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBY2Nlc3NNb2RpZmllcihyZXE6IFJlcXVlc3QsIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogJ3B1YmxpYycgfCAncHJpdmF0ZScge1xuICBpZiAocmVxdWVzdGVkID09PSAncHVibGljJyAmJiAocmVxLnVzZXI/LnJvbGUgPT09ICdhZG1pbicgfHwgcmVxLnVzZXI/LnJvbGUgPT09ICdvd25lcicpKSB7XG4gICAgcmV0dXJuICdwdWJsaWMnO1xuICB9XG4gIHJldHVybiAncHJpdmF0ZSc7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VydmljZS10by1zZXJ2aWNlIHRva2Vuc1xuLy9cbi8vIEludGVyLXNlcnZpY2UgSFRUUCBjYWxscyAoYmlsbGluZyDihpIgbWVzc2FnZSwgcGxhdGZvcm0g4oaSIGNvbXBsaWFuY2UsIGV0Yy4pXG4vLyBuZWVkIHRvIHNhdGlzZnkgdGhlIHNhbWUgYHJlcXVpcmVBdXRoYCBtaWRkbGV3YXJlIGFzIHVzZXIgcmVxdWVzdHMuXG4vLyBgc2lnblNlcnZpY2VUb2tlbmAgbWludHMgYSBzaG9ydC1saXZlZCBKV1Qgc2lnbmVkIHdpdGggdGhlIHNoYXJlZFxuLy8gSldUX1NFQ1JFVCwgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgc2VydmljZSB2aWEgYHN1YjogJ3NlcnZpY2U6PG5hbWU+J2AuXG4vLyBgcmVxdWlyZUF1dGhgIGFjY2VwdHMgdGhlc2UgdG9rZW5zIHRyYW5zcGFyZW50bHkg4oCUIHRoZXkgcGFzcyBgZGVjb2RlZC5zdWJgXG4vLyBhbmQgYGRlY29kZWQucm9sZWAgY2hlY2tzLCBhbmQgZG93bnN0cmVhbSBgcmVxdWlyZU9yZ2FuaXphdGlvbmAgL1xuLy8gYHJlcXVpcmVBZG1pbmAgcmVseSBvbiB0aGUgb3JnL3JvbGUgZW1iZWRkZWQgaW4gdGhlIHRva2VuLlxuLy9cbi8vIFRva2VucyBkZWZhdWx0IHRvIDUtbWludXRlIFRUTCDigJQgbG9uZyBlbm91Z2ggdG8gc3Vydml2ZSBhIGJhY2tlbmQgaG9wLFxuLy8gc2hvcnQgZW5vdWdoIHRoYXQgYSBsZWFrZWQgdG9rZW4gaXMgbG93LXZhbHVlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IERFRkFVTFRfU0VSVklDRV9UT0tFTl9UVExfU0VDT05EUyA9IDMwMDtcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlVG9rZW5PcHRpb25zIHtcbiAgLyoqIENhbGxpbmcgc2VydmljZSBpZGVudGlmaWVyIChlLmcuICdiaWxsaW5nJywgJ3BsYXRmb3JtJykuIEVtYmVkZGVkIGFzIGBzdWI6IHNlcnZpY2U6PG5hbWU+YC4gKi9cbiAgc2VydmljZU5hbWU6IHN0cmluZztcbiAgLyoqIEFjdGl2ZSBvcmcgY29udGV4dCBmb3IgdGhlIGNhbGwuIFVzZSB0aGUgdGFyZ2V0IHRlbmFudCdzIG9yZyBJRCwgb3IgJ3N5c3RlbScgZm9yIHN5c3RlbS13aWRlIG9wcy4gKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnIG5hbWUuIERlZmF1bHRzIHRvIG9yZ0lkLiAqL1xuICBvcmdOYW1lPzogc3RyaW5nO1xuICAvKiogVFRMIGluIHNlY29uZHMgKGRlZmF1bHQgMzAwKS4gKi9cbiAgdHRsU2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJvbGUgdGhlIHRva2VuIGNhcnJpZXMgKHJlcXVpcmVkIOKAlCBubyBpbXBsaWNpdCBkZWZhdWx0KS4gKipQYXNzIHRoZSBMT1dFU1RcbiAgICogcm9sZSB0aGUgY2FsbCBhY3R1YWxseSBuZWVkcyoqIChgJ21lbWJlcidgIGZvciByZWFkIC8gZGF0YS1wbGFuZSBjYWxscykgc28gYVxuICAgKiBsZWFrZWQgc2VydmljZSB0b2tlbiBjYW4ndCBwZXJmb3JtIGFkbWluIGFjdGlvbnMgaW4gdGhlIHRhcmdldCBvcmcuXG4gICAqIGBpc0FkbWluYCBpcyBkZXJpdmVkIGZyb20gdGhpcyAoYWRtaW58b3duZXIg4oaSIHRydWUpLlxuICAgKi9cbiAgcm9sZTogJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJztcbn1cblxuLyoqXG4gKiBNaW50IGEgSldUIGlkZW50aWZ5aW5nIHRoZSBjYWxsaW5nIHNlcnZpY2UuIFVzZWQgZm9yIGludGVyLXNlcnZpY2UgSFRUUCBjYWxscy5cbiAqIFRoZSB0b2tlbiBzYXRpc2ZpZXMgYHJlcXVpcmVBdXRoYCBhbmQgKHdoZW4gb3JnSWQgaXMgcHJlc2VudCkgYHJlcXVpcmVPcmdhbml6YXRpb25gLlxuICogU2NvcGUgaXQgd2l0aCBgb3B0cy5yb2xlYCDigJQgbGVhc3QgcHJpdmlsZWdlIGtlZXBzIGEgbGVha2VkIHRva2VuIGxvdy12YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25TZXJ2aWNlVG9rZW4ob3B0czogU2VydmljZVRva2VuT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHJvbGUgPSBvcHRzLnJvbGU7XG4gIGNvbnN0IHBheWxvYWQ6IEp3dFBheWxvYWQgPSB7XG4gICAgc3ViOiBgc2VydmljZToke29wdHMuc2VydmljZU5hbWV9YCxcbiAgICB1c2VybmFtZTogYCR7b3B0cy5zZXJ2aWNlTmFtZX0tc2VydmljZWAsXG4gICAgZW1haWw6IGAke29wdHMuc2VydmljZU5hbWV9QGludGVybmFsYCxcbiAgICByb2xlLFxuICAgIGlzQWRtaW46IHJvbGUgPT09ICdvd25lcicgfHwgcm9sZSA9PT0gJ2FkbWluJyxcbiAgICB0eXBlOiAnYWNjZXNzJyxcbiAgICBvcmdhbml6YXRpb25JZDogb3B0cy5vcmdJZCxcbiAgICBvcmdhbml6YXRpb25OYW1lOiBvcHRzLm9yZ05hbWUgPz8gb3B0cy5vcmdJZCxcbiAgfTtcbiAgLy8gTWF0Y2ggdGhlIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZSB0aGF0IHJlcXVpcmVBdXRoIHZlcmlmaWVzLCB3aGVuXG4gIC8vIGNvbmZpZ3VyZWQuIFdpdGhvdXQgdGhlc2UsIGEgc2VydmljZSB0b2tlbiBzaWduZWQgaGVyZSB3b3VsZCBmYWlsXG4gIC8vIHJlcXVpcmVBdXRoIGluIGEgZGVwbG95bWVudCB0aGF0IGhhcyBzZXQgSldUX0lTU1VFUi9KV1RfQVVESUVOQ0UuXG4gIGNvbnN0IHNpZ25PcHRpb25zOiBqd3QuU2lnbk9wdGlvbnMgPSB7XG4gICAgZXhwaXJlc0luOiBvcHRzLnR0bFNlY29uZHMgPz8gREVGQVVMVF9TRVJWSUNFX1RPS0VOX1RUTF9TRUNPTkRTLFxuICAgIC8vIFNpZ24gd2l0aCB0aGUgc2FtZSBjb25maWd1cmVkIGFsZyByZXF1aXJlQXV0aCBwaW5zIG9uIHZlcmlmeSwgc28gc2VydmljZVxuICAgIC8vIHRva2VucyBzdGF5IHZhbGlkIHVuZGVyIGEgbm9uLWRlZmF1bHQgSldUX0FMR09SSVRITS5cbiAgICBhbGdvcml0aG06IChwcm9jZXNzLmVudi5KV1RfQUxHT1JJVEhNIHx8ICdIUzI1NicpIGFzIGp3dC5BbGdvcml0aG0sXG4gICAgLy8gVW5pcXVlIHRva2VuIGlkIG9uIGV2ZXJ5IG1pbnQuIENvbWJpbmVkIHdpdGggdGhlIHNob3J0ICgzMDBzIGRlZmF1bHQpIFRUTFxuICAgIC8vIHRoaXMgZ2l2ZXMgZWFjaCBzZXJ2aWNlIHRva2VuIGEgZGlzdGluY3QgaWRlbnRpdHkg4oCUIHRoZSBidWlsZGluZyBibG9jayBmb3JcbiAgICAvLyByZXBsYXkgZGV0ZWN0aW9uIChhIHZlcmlmaWVyIGNhbiB0cmFjayBzZWVuIGp0aXMpIGFuZCB0aGUgY29ycmVsYXRpb25cbiAgICAvLyBoYW5kbGUgZm9yIHRyYWNpbmcgd2hpY2ggbWludCBwZXJmb3JtZWQgYSBjcm9zcy1zZXJ2aWNlIGFjdGlvbi4gSXQgZG9lc1xuICAgIC8vIE5PVCBieSBpdHNlbGYgcHJldmVudCByZXBsYXkgd2l0aGluIHRoZSBUVEwgd2luZG93OyB0cnVlIHJlcGxheSBkZWZlbmNlXG4gICAgLy8gbmVlZHMgdGhlIGFzeW1tZXRyaWMta2V5IHdvcmsgdHJhY2tlZCBzZXBhcmF0ZWx5LlxuICAgIGp3dGlkOiByYW5kb21VVUlEKCksXG4gIH07XG4gIGlmIChwcm9jZXNzLmVudi5KV1RfSVNTVUVSKSBzaWduT3B0aW9ucy5pc3N1ZXIgPSBwcm9jZXNzLmVudi5KV1RfSVNTVUVSO1xuICBpZiAocHJvY2Vzcy5lbnYuSldUX0FVRElFTkNFKSBzaWduT3B0aW9ucy5hdWRpZW5jZSA9IHByb2Nlc3MuZW52LkpXVF9BVURJRU5DRTtcbiAgcmV0dXJuIGp3dC5zaWduKHBheWxvYWQsIGdldEp3dFNlY3JldCgpLCBzaWduT3B0aW9ucyk7XG59XG5cbi8qKiBDb252ZW5pZW5jZTogcmV0dXJucyBhIGBCZWFyZXIgPHRva2VuPmAgaGVhZGVyIHZhbHVlIGZvciBmZXRjaC9heGlvcyBjYWxscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJ2aWNlQXV0aEhlYWRlcihvcHRzOiBTZXJ2aWNlVG9rZW5PcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBCZWFyZXIgJHtzaWduU2VydmljZVRva2VuKG9wdHMpfWA7XG59XG5cbi8qKiBUcnVlIHdoZW4gYHJlcS51c2VyLnN1YmAgd2FzIGlzc3VlZCBieSBgc2lnblNlcnZpY2VUb2tlbmAgKGkuZS4gc3RhcnRzIHdpdGggYHNlcnZpY2U6YCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJ2aWNlUHJpbmNpcGFsKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVxLnVzZXI/LnN1Yj8uc3RhcnRzV2l0aCgnc2VydmljZTonKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBQUkUtYXV0aCBjaGVjazogY3J5cHRvZ3JhcGhpY2FsbHkgdmVyaWZ5IHRoZSByZXF1ZXN0IGNhcnJpZXMgYSB2YWxpZCwgc2lnbmVkXG4gKiBTRVJWSUNFIHRva2VuIChgc3ViYCBzdGFydHMgd2l0aCBgc2VydmljZTpgKS4gVW5saWtlIHtAbGluayBpc1NlcnZpY2VQcmluY2lwYWx9XG4gKiAod2hpY2ggcmVhZHMgdGhlIGFscmVhZHktcG9wdWxhdGVkIGByZXEudXNlcmApLCB0aGlzIHZlcmlmaWVzIHRoZSBiZWFyZXIgdG9rZW5cbiAqIGl0c2VsZiwgc28gaXQgaXMgc2FmZSB0byBjYWxsIEJFRk9SRSBgcmVxdWlyZUF1dGhgIHJ1bnMg4oCUIGUuZy4gdGhlIGdsb2JhbCByYXRlXG4gKiBsaW1pdGVyJ3MgYHNraXBgLCB3aGljaCBtdXN0IG5vdCB0cnVzdCB0aGUgc3Bvb2ZhYmxlIGB4LWludGVybmFsLXNlcnZpY2VgXG4gKiBoZWFkZXIuIE1pcnJvcnMgYHJlcXVpcmVBdXRoYCdzIHZlcmlmaWNhdGlvbiAoYWxnb3JpdGhtIHBpbm5pbmcgKyBvcHRpb25hbFxuICogaXNzdWVyL2F1ZGllbmNlKSBhbmQgcmV0dXJucyBgZmFsc2VgIG9uIGFueSBtaXNzaW5nL2ludmFsaWQvbm9uLXNlcnZpY2UgdG9rZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJ0cyA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb24/LnNwbGl0KCcgJyk7XG4gIGlmICghcGFydHMgfHwgcGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSAnQmVhcmVyJykgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IHZlcmlmeU9wdGlvbnM6IGp3dC5WZXJpZnlPcHRpb25zID0geyBhbGdvcml0aG1zOiBbKHByb2Nlc3MuZW52LkpXVF9BTEdPUklUSE0gfHwgJ0hTMjU2JykgYXMgand0LkFsZ29yaXRobV0gfTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuSldUX0lTU1VFUikgdmVyaWZ5T3B0aW9ucy5pc3N1ZXIgPSBwcm9jZXNzLmVudi5KV1RfSVNTVUVSO1xuICAgIGlmIChwcm9jZXNzLmVudi5KV1RfQVVESUVOQ0UpIHZlcmlmeU9wdGlvbnMuYXVkaWVuY2UgPSBwcm9jZXNzLmVudi5KV1RfQVVESUVOQ0U7XG4gICAgY29uc3QgZGVjb2RlZCA9IHZlcmlmeUp3dFdpdGhSb3RhdGlvbihwYXJ0c1sxXSwgdmVyaWZ5T3B0aW9ucyk7XG4gICAgcmV0dXJuIGRlY29kZWQudHlwZSA9PT0gJ2FjY2VzcycgJiYgdHlwZW9mIGRlY29kZWQuc3ViID09PSAnc3RyaW5nJyAmJiBkZWNvZGVkLnN1Yi5zdGFydHNXaXRoKCdzZXJ2aWNlOicpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
482
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXBDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBbUIsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFL0MsNERBQTREO0FBQzVELElBQUksVUFBOEIsQ0FBQztBQUNuQyxJQUFJLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUM5Qiw4RUFBOEU7QUFDOUUsSUFBSSxrQkFBc0MsQ0FBQztBQUMzQyxJQUFJLDZCQUE2QixHQUFHLENBQUMsQ0FBQztBQUN0QyxNQUFNLDhCQUE4QixHQUFHLE9BQU8sQ0FBQyxDQUFDLFlBQVk7QUFFNUQsU0FBUyxZQUFZO0lBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLENBQUMsVUFBVSxJQUFJLEdBQUcsR0FBRyxxQkFBcUIsR0FBRyw4QkFBOEIsRUFBRSxDQUFDO1FBQ2hGLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEVBQUUs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RyxDQUFDLFlBQVk7WUFBRSxhQUFhLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO1FBQ2hGLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUMvRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sT0FBTyxDQUFDLEdBQUcsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBqd3QgZnJvbSAnanNvbndlYnRva2VuJztcbmltcG9ydCB7IEh0dHBTdGF0dXMgfSBmcm9tICcuLi9jb25zdGFudHMvaHR0cC1zdGF0dXMuanMnO1xuaW1wb3J0IHR5cGUgeyBKd3RQYXlsb2FkIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJy4uL3R5cGVzL2Vycm9yLWNvZGVzLmpzJztcbmltcG9ydCB7IHR5cGUgUGVybWlzc2lvbiwgaGFzUGVybWlzc2lvbiB9IGZyb20gJy4uL3R5cGVzL3Blcm1pc3Npb25zLmpzJztcbmltcG9ydCB7IGdldEhlYWRlclN0cmluZyB9IGZyb20gJy4uL3V0aWxzL2hlYWRlcnMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IHNlbmRFcnJvciB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdhdXRoLW1pZGRsZXdhcmUnKTtcblxuLyoqIENhY2hlZCBKV1Qgc2VjcmV0IHdpdGggcGVyaW9kaWMgcmVmcmVzaCBmcm9tIGVudiB2YXIuICovXG5sZXQgX2p3dFNlY3JldDogc3RyaW5nIHwgdW5kZWZpbmVkO1xubGV0IF9qd3RTZWNyZXRSZWZyZXNoZWRBdCA9IDA7XG4vKiogQ2FjaGVkIFBSRVZJT1VTIEpXVCBzZWNyZXQgKG9wdGlvbmFsKSDigJQgZW5hYmxlcyB6ZXJvLWRvd250aW1lIHJvdGF0aW9uLiAqL1xubGV0IF9qd3RTZWNyZXRQcmV2aW91czogc3RyaW5nIHwgdW5kZWZpbmVkO1xubGV0IF9qd3RTZWNyZXRQcmV2aW91c1JlZnJlc2hlZEF0ID0gMDtcbmNvbnN0IEpXVF9TRUNSRVRfUkVGUkVTSF9JTlRFUlZBTF9NUyA9IDMwMF8wMDA7IC8vIDUgbWludXRlc1xuXG5mdW5jdGlvbiBnZXRKd3RTZWNyZXQoKTogc3RyaW5nIHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgaWYgKCFfand0U2VjcmV0IHx8IG5vdyAtIF9qd3RTZWNyZXRSZWZyZXNoZWRBdCA+IEpXVF9TRUNSRVRfUkVGUkVTSF9JTlRFUlZBTF9NUykge1xuICAgIGNvbnN0IHNlY3JldCA9IHByb2Nlc3MuZW52LkpXVF9TRUNSRVQ7XG4gICAgaWYgKCFzZWNyZXQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignSldUX1NFQ1JFVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pXVF9TRUNSRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKF9qd3RTZWNyZXQgJiYgX2p3dFNlY3JldCAhPT0gc2VjcmV0KSB7XG4gICAgICBsb2dnZXIuaW5mbygnSldUIHNlY3JldCByb3RhdGVkJyk7XG4gICAgfVxuICAgIF9qd3RTZWNyZXQgPSBzZWNyZXQ7XG4gICAgX2p3dFNlY3JldFJlZnJlc2hlZEF0ID0gbm93O1xuICB9XG4gIHJldHVybiBfand0U2VjcmV0O1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb25hbCBQUkVWSU9VUyBKV1Qgc2VjcmV0IChgSldUX1NFQ1JFVF9QUkVWSU9VU2ApLCBjYWNoZWQgd2l0aCB0aGUgc2FtZVxuICogVFRMIGFzIHRoZSBwcmltYXJ5LiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdW5zZXQuIER1cmluZyBhIGBKV1RfU0VDUkVUYFxuICogcm90YXRpb24sIG9wZXJhdG9ycyBzZXQgYEpXVF9TRUNSRVRfUFJFVklPVVNgIHRvIHRoZSBvbGQgdmFsdWUgc28gdG9rZW5zIHNpZ25lZFxuICogd2l0aCBFSVRIRVIgc2VjcmV0IGtlZXAgdmVyaWZ5aW5nIOKAlCBjbG9zaW5nIHRoZSBhdXRoLW91dGFnZSB3aW5kb3cgd2hlcmVcbiAqIHN0aWxsLXZhbGlkIG9sZC1zaWduZWQgKG9yIGZyZXNobHkgbmV3LXNpZ25lZCkgdG9rZW5zIHdvdWxkIG90aGVyd2lzZSBiZVxuICogcmVqZWN0ZWQuIGB1bmRlZmluZWRgIGlzIGEgdmFsaWQgY2FjaGVkIHZhbHVlLCBzbyB0aGlzIHJlZnJlc2hlcyBwdXJlbHkgb24gdGhlXG4gKiB0aW1lIGludGVydmFsIChub3Qgb24gZW1wdGluZXNzKS5cbiAqL1xuZnVuY3Rpb24gZ2V0Snd0U2VjcmV0UHJldmlvdXMoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgaWYgKG5vdyAtIF9qd3RTZWNyZXRQcmV2aW91c1JlZnJlc2hlZEF0ID4gSldUX1NFQ1JFVF9SRUZSRVNIX0lOVEVSVkFMX01TKSB7XG4gICAgX2p3dFNlY3JldFByZXZpb3VzID0gcHJvY2Vzcy5lbnYuSldUX1NFQ1JFVF9QUkVWSU9VUyB8fCB1bmRlZmluZWQ7XG4gICAgX2p3dFNlY3JldFByZXZpb3VzUmVmcmVzaGVkQXQgPSBub3c7XG4gIH1cbiAgcmV0dXJuIF9qd3RTZWNyZXRQcmV2aW91cztcbn1cblxuLyoqXG4gKiBWZXJpZnkgYSBKV1QgYWdhaW5zdCB0aGUgcHJpbWFyeSBzZWNyZXQsIGZhbGxpbmcgYmFjayB0byB0aGUgcHJldmlvdXMgc2VjcmV0XG4gKiAod2hlbiBgSldUX1NFQ1JFVF9QUkVWSU9VU2AgaXMgY29uZmlndXJlZCkgT05MWSBvbiBhIHNpZ25hdHVyZS92ZXJpZmljYXRpb25cbiAqIGZhaWx1cmUuIFRoaXMgbWFrZXMgdG9rZW4gdmVyaWZpY2F0aW9uIHN1cnZpdmUgYSBzZWNyZXQgcm90YXRpb24gd2l0aCB6ZXJvXG4gKiBkb3dudGltZTogYSB0b2tlbiB2YWxpZCB1bmRlciBFSVRIRVIgc2VjcmV0IHBhc3Nlcy5cbiAqXG4gKiBqc29ud2VidG9rZW4ncyBgdmVyaWZ5YCB0YWtlcyBhIHNpbmdsZSBzZWNyZXQsIHNvIHRoaXMgaXMgdHJ5LXByaW1hcnktdGhlbi1cbiAqIHByZXZpb3VzIOKAlCBOT1QgYSBzZWNyZXQgYXJyYXkuIE5vIGV4aXN0aW5nIGNoZWNrIGlzIHdlYWtlbmVkOlxuICogICAtIGB2ZXJpZnlPcHRpb25zYCAoYWxnb3JpdGhtIHBpbm5pbmcgKyBvcHRpb25hbCBpc3N1ZXIvYXVkaWVuY2UpIGlzIGFwcGxpZWRcbiAqICAgICBpZGVudGljYWxseSBvbiBCT1RIIGF0dGVtcHRzLCBzbyBhbGctY29uZnVzaW9uIC8gYGFsZzpub25lYCBzdGF5IGJsb2NrZWQuXG4gKiAgIC0gRXhwaXJ5IC8gbm90LWJlZm9yZSBmcm9tIHRoZSBQUklNQVJZIGF0dGVtcHQgYXJlIGF1dGhvcml0YXRpdmUgYW5kIGFyZVxuICogICAgIHJlLXRocm93biB3aXRob3V0IGEgcHJldmlvdXMtc2VjcmV0IHJldHJ5LCBzbyBhIGBUb2tlbkV4cGlyZWRFcnJvcmAgaXNcbiAqICAgICBuZXZlciBtYXNrZWQgaW50byBhbiBcImludmFsaWQgc2lnbmF0dXJlXCIuXG4gKiAgIC0gV2hlbiBubyBwcmV2aW91cyBzZWNyZXQgaXMgc2V0LCBiZWhhdmlvdXIgaXMgYnl0ZS1mb3ItYnl0ZSB0aGUgb3JpZ2luYWw6XG4gKiAgICAgdGhlIHByaW1hcnkgZXJyb3IgcHJvcGFnYXRlcyB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIHZlcmlmeUp3dFdpdGhSb3RhdGlvbih0b2tlbjogc3RyaW5nLCB2ZXJpZnlPcHRpb25zOiBqd3QuVmVyaWZ5T3B0aW9ucyk6IEp3dFBheWxvYWQge1xuICB0cnkge1xuICAgIHJldHVybiBqd3QudmVyaWZ5KHRva2VuLCBnZXRKd3RTZWNyZXQoKSwgdmVyaWZ5T3B0aW9ucykgYXMgSnd0UGF5bG9hZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc3QgcHJldmlvdXMgPSBnZXRKd3RTZWNyZXRQcmV2aW91cygpO1xuICAgIC8vIEZhbGwgYmFjayB0byB0aGUgcHJldmlvdXMgc2VjcmV0IG9ubHkgZm9yIGEgc2lnbmF0dXJlL3ZlcmlmaWNhdGlvbiBmYWlsdXJlXG4gICAgLy8gKGEgcGxhaW4gSnNvbldlYlRva2VuRXJyb3IpLiBFeHBpcnkgLyBub3QtYmVmb3JlIGFyZSBlbmZvcmNlZCByZWdhcmRsZXNzIG9mXG4gICAgLy8gd2hpY2ggc2VjcmV0IHNpZ25lZCB0aGUgdG9rZW4sIHNvIHRob3NlIGVycm9ycyBtdXN0IHN1cmZhY2UgYXMtaXMuXG4gICAgaWYgKFxuICAgICAgcHJldmlvdXNcbiAgICAgICYmIGVyciBpbnN0YW5jZW9mIGp3dC5Kc29uV2ViVG9rZW5FcnJvclxuICAgICAgJiYgIShlcnIgaW5zdGFuY2VvZiBqd3QuVG9rZW5FeHBpcmVkRXJyb3IpXG4gICAgICAmJiAhKGVyciBpbnN0YW5jZW9mIGp3dC5Ob3RCZWZvcmVFcnJvcilcbiAgICApIHtcbiAgICAgIC8vIEEgdG9rZW4gc2lnbmVkIGJ5IHRoZSBwcmV2aW91cyBzZWNyZXQgdmVyaWZpZXMgaGVyZTsgaWYgaXQgaXMgaW5zdGVhZFxuICAgICAgLy8gZXhwaXJlZC9pbnZhbGlkIHVuZGVyIHRoZSBwcmV2aW91cyBzZWNyZXQsIHRoYXQgZXJyb3IgcHJvcGFnYXRlcyBhbmQgaXNcbiAgICAgIC8vIGhhbmRsZWQgYnkgdGhlIGNhbGxlciBleGFjdGx5IGxpa2UgYSBwcmltYXJ5IGZhaWx1cmUuXG4gICAgICByZXR1cm4gand0LnZlcmlmeSh0b2tlbiwgcHJldmlvdXMsIHZlcmlmeU9wdGlvbnMpIGFzIEp3dFBheWxvYWQ7XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVBdXRoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbGxvdyB4LW9yZy1pZC94LW9yZy1uYW1lIGhlYWRlcnMgdG8gb3ZlcnJpZGUgdGhlIEpXVCdzIG9yZ2FuaXphdGlvbiBmaWVsZHMuXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgdGhlIGB4LW9yZy1pZGAvYHgtb3JnLW5hbWVgIGhlYWRlcnMgb3ZlcnJpZGUgdGhlIGNhbGxlcidzIG9yZ1xuICAgKiDigJQgYnV0IE9OTFkgZm9yIGEgdmVyaWZpZWQgU1lTLUFETUlOIChgaXNTdXBlckFkbWluYCBjbGFpbSkuIEZvciBhbnkgb3JkaW5hcnlcbiAgICogYXV0aGVudGljYXRlZCB1c2VyIHRoZSBoZWFkZXJzIGFyZSBpZ25vcmVkLCBzbyBlbmFibGluZyB0aGlzIGNhbiBuZXZlciBsZXQgYVxuICAgKiBub3JtYWwgdXNlciBpbXBlcnNvbmF0ZSBhbm90aGVyIHRlbmFudCdzIG9yZy4gVXNlIGZvciBjcm9zcy1vcmcgYWRtaW4gdG9vbGluZ1xuICAgKiAoZS5nLiBhIHN5c2FkbWluIG1hbmFnaW5nIGEgZ2l2ZW4gb3JnJ3MgYmlsbGluZykuIElmIHVuc3VyZSwgbGVhdmUgaXQgZGlzYWJsZWQuXG4gICAqL1xuICBhbGxvd09yZ0hlYWRlck92ZXJyaWRlPzogYm9vbGVhbjtcbn1cblxuLyoqIEpXVCBhdXRoIG1pZGRsZXdhcmUuIFVzZSBkaXJlY3RseSBvciBjYWxsIHdpdGggb3B0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBdXRoKFxuICBvcHRpb25zPzogUmVxdWlyZUF1dGhPcHRpb25zLFxuKTogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBdXRoKFxuICByZXFPck9wdGlvbnM/OiBSZXF1ZXN0IHwgUmVxdWlyZUF1dGhPcHRpb25zLFxuICByZXM/OiBSZXNwb25zZSxcbiAgbmV4dD86IE5leHRGdW5jdGlvbixcbik6IHZvaWQgfCAoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB2b2lkKSB7XG4gIGlmIChyZXFPck9wdGlvbnMgJiYgcmVzICYmIG5leHQgJiYgJ2hlYWRlcnMnIGluIHJlcU9yT3B0aW9ucykge1xuICAgIHJldHVybiBfcmVxdWlyZUF1dGgoe30sIHJlcU9yT3B0aW9ucyBhcyBSZXF1ZXN0LCByZXMsIG5leHQpO1xuICB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IChyZXFPck9wdGlvbnMgYXMgUmVxdWlyZUF1dGhPcHRpb25zKSB8fCB7fTtcbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlc0lubmVyOiBSZXNwb25zZSwgbmV4dElubmVyOiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICBfcmVxdWlyZUF1dGgob3B0aW9ucywgcmVxLCByZXNJbm5lciwgbmV4dElubmVyKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBBIHNvdXJjZSBvZiB0aGUgQ1VSUkVOVCBgdG9rZW5WZXJzaW9uYCBmb3IgYSB1c2VyLCBiYWNrZWQgYnkgYSBzdG9yZSB0aGVcbiAqIHN0YXRlbGVzcyBzZXJ2aWNlcyBjYW4gcmVhZCAoaW4gcHJhY3RpY2UgYSBSZWRpcyBrZXkgdGhlIHBsYXRmb3JtIHB1Ymxpc2hlc1xuICogdG8gb24gZXZlcnkgcHJpdmlsZWdlIGNoYW5nZSkuIFJlZ2lzdGVyZWQgdmlhIHtAbGluayBzZXRUb2tlblJldm9jYXRpb25TdG9yZX0uXG4gKlxuICogYGdldEN1cnJlbnRWZXJzaW9uYCByZXR1cm5zIHRoZSB1c2VyJ3MgY3VycmVudCB2ZXJzaW9uLCBvciBgbnVsbGAgd2hlbiB0aGVcbiAqIHN0b3JlIGhhcyBubyBlbnRyeSDigJQgYSBtaXNzIGlzIHRyZWF0ZWQgYXMgXCJubyBrbm93biByZXZvY2F0aW9uXCIgKGZhaWwtb3Blbik6XG4gKiByZXZvY2F0aW9uIGVudHJpZXMgYXJlIHB1Ymxpc2hlZCB3aXRoIGEgVFRMIG1hdGNoaW5nIHRoZSBhY2Nlc3MtdG9rZW5cbiAqIGxpZmV0aW1lLCBzbyBhIG1pc3NpbmcgZW50cnkgbWVhbnMgYW55IHRva2VuIG9sZCBlbm91Z2ggdG8gcHJlZGF0ZSBpdCBoYXNcbiAqIGFscmVhZHkgZXhwaXJlZCBvbiBpdHMgb3duLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUmV2b2NhdGlvblN0b3JlIHtcbiAgZ2V0Q3VycmVudFZlcnNpb24odXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IG51bGw+O1xufVxuXG5sZXQgdG9rZW5SZXZvY2F0aW9uU3RvcmU6IFRva2VuUmV2b2NhdGlvblN0b3JlIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJlZ2lzdGVyIChvciBjbGVhciwgd2l0aCBgdW5kZWZpbmVkYCkgdGhlIHByb2Nlc3Mtd2lkZSB0b2tlbi1yZXZvY2F0aW9uIHN0b3JlLlxuICogV2hlbiB1bnNldCAodGhlIGRlZmF1bHQpLCBgcmVxdWlyZUF1dGhgIHBlcmZvcm1zIE5PIHJldm9jYXRpb24gY2hlY2sgYW5kXG4gKiBiZWhhdmVzIGV4YWN0bHkgYXMgYmVmb3JlIOKAlCBzbyB0aGlzIGlzIGZ1bGx5IGJhY2t3YXJkIGNvbXBhdGlibGUgYW5kIHNlcnZpY2VzXG4gKiBvcHQgaW4gYXQgYm9vdCBieSB3aXJpbmcgdGhlaXIgUmVkaXMgY2xpZW50LiBQbGF0Zm9ybSBrZWVwcyBpdHMgb3duIE1vbmdvLVxuICogYmFja2VkIGNoZWNrIGFuZCBuZWVkIG5vdCByZWdpc3RlciBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUb2tlblJldm9jYXRpb25TdG9yZShzdG9yZTogVG9rZW5SZXZvY2F0aW9uU3RvcmUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgdG9rZW5SZXZvY2F0aW9uU3RvcmUgPSBzdG9yZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgd2hlbiBgZGVjb2RlZGAgaGFzIGJlZW4gcmV2b2tlZCBwZXIgdGhlIHJlZ2lzdGVyZWQgc3RvcmU6IGl0c1xuICogZW1iZWRkZWQgYHRva2VuVmVyc2lvbmAgaXMgc3RyaWN0bHkgYmVoaW5kIHRoZSBzdG9yZSdzIGN1cnJlbnQgdmVyc2lvbi5cbiAqIEZhaWwtb3BlbiDigJQgYW55IHN0b3JlIGVycm9yLCBhIG1pc3NpbmcgZW50cnksIG9yIGEgdG9rZW4vc3RvcmUgd2l0aG91dCBhXG4gKiB1c2FibGUgdmVyc2lvbiB5aWVsZHMgYGZhbHNlYCAoYWxsb3cpLiBOZXZlciB0aHJvd3MuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzVG9rZW5SZXZva2VkKGRlY29kZWQ6IEp3dFBheWxvYWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgc3RvcmUgPSB0b2tlblJldm9jYXRpb25TdG9yZTtcbiAgaWYgKCFzdG9yZSB8fCAhZGVjb2RlZC5zdWIgfHwgdHlwZW9mIGRlY29kZWQudG9rZW5WZXJzaW9uICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBzdG9yZS5nZXRDdXJyZW50VmVyc2lvbihkZWNvZGVkLnN1Yik7XG4gICAgcmV0dXJuIGN1cnJlbnQgIT09IG51bGwgJiYgZGVjb2RlZC50b2tlblZlcnNpb24gPCBjdXJyZW50O1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWlsLW9wZW46IGEgcmV2b2NhdGlvbi1zdG9yZSBvdXRhZ2UgbXVzdCBub3QgbG9jayBldmVyeSB1c2VyIG91dC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3JlcXVpcmVBdXRoKFxuICBvcHRpb25zOiBSZXF1aXJlQXV0aE9wdGlvbnMsXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIGNvbnN0IGF1dGhIZWFkZXIgPSByZXEuaGVhZGVycy5hdXRob3JpemF0aW9uO1xuXG4gIGlmICghYXV0aEhlYWRlcikge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhvcml6YXRpb24gaGVhZGVyIHJlcXVpcmVkJywgRXJyb3JDb2RlLlRPS0VOX01JU1NJTkcpO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBhdXRoSGVhZGVyLnNwbGl0KCcgJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDIgfHwgcGFydHNbMF0gIT09ICdCZWFyZXInKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnSW52YWxpZCBhdXRob3JpemF0aW9uIGZvcm1hdC4gVXNlOiBCZWFyZXIgPHRva2VuPicsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gUGFzcyB0aHJvdWdoIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZSB2ZXJpZmljYXRpb24gd2hlbiBlbnYtY29uZmlndXJlZC5cbiAgICAvLyBXaXRob3V0IHRoZXNlLCBhIEpXVCBzaWduZWQgYnkgYW55IHN5c3RlbSB0aGF0IGhhcHBlbnMgdG8gc2hhcmUgdGhlXG4gICAgLy8gc2FtZSBKV1RfU0VDUkVUIHdvdWxkIGJlIGFjY2VwdGVkIOKAlCBkZWZlbmNlLWluLWRlcHRoIGZvciBzaGFyZWQtc2VjcmV0XG4gICAgLy8gbWlzY29uZmlndXJhdGlvbnMgYWNyb3NzIHNlcnZpY2VzIC8gZW52aXJvbm1lbnRzLlxuICAgIC8vIFBpbiB0aGUgYWNjZXB0ZWQgYWxnb3JpdGhtIHRvIHRoZSBjb25maWd1cmVkIEhNQUMgYWxnIChkZWZhdWx0IEhTMjU2KS5cbiAgICAvLyBXaXRob3V0IGFuIGFsbG93LWxpc3QsIGBqd3QudmVyaWZ5YCBhY2NlcHRzIGFueSBhbGdvcml0aG0gdGhlIGtleSBjYW5cbiAgICAvLyB2ZXJpZnkg4oCUIHRoZSBjbGFzc2ljIGFsZy1jb25mdXNpb24gdmVjdG9yIChhbmQgYSBoYXJkIGd1YXJkIGFnYWluc3RcbiAgICAvLyBgYWxnOm5vbmVgKS4gRW52LWRyaXZlbiBzbyBpdCBzdGF5cyBpbiBsb2Nrc3RlcCB3aXRoIGhvdyB0b2tlbnMgYXJlXG4gICAgLy8gc2lnbmVkIChzZWUgc2lnblNlcnZpY2VUb2tlbiArIHBsYXRmb3JtJ3MgY29uZmlnLmF1dGguand0LmFsZ29yaXRobSkuXG4gICAgY29uc3QgdmVyaWZ5T3B0aW9uczogand0LlZlcmlmeU9wdGlvbnMgPSB7IGFsZ29yaXRobXM6IFsocHJvY2Vzcy5lbnYuSldUX0FMR09SSVRITSB8fCAnSFMyNTYnKSBhcyBqd3QuQWxnb3JpdGhtXSB9O1xuICAgIGNvbnN0IGV4cGVjdGVkSXNzdWVyID0gcHJvY2Vzcy5lbnYuSldUX0lTU1VFUjtcbiAgICBjb25zdCBleHBlY3RlZEF1ZGllbmNlID0gcHJvY2Vzcy5lbnYuSldUX0FVRElFTkNFO1xuICAgIGlmIChleHBlY3RlZElzc3VlcikgdmVyaWZ5T3B0aW9ucy5pc3N1ZXIgPSBleHBlY3RlZElzc3VlcjtcbiAgICBpZiAoZXhwZWN0ZWRBdWRpZW5jZSkgdmVyaWZ5T3B0aW9ucy5hdWRpZW5jZSA9IGV4cGVjdGVkQXVkaWVuY2U7XG4gICAgY29uc3QgZGVjb2RlZCA9IHZlcmlmeUp3dFdpdGhSb3RhdGlvbihwYXJ0c1sxXSwgdmVyaWZ5T3B0aW9ucyk7XG5cbiAgICBpZiAoZGVjb2RlZC50eXBlICE9PSAnYWNjZXNzJykge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnT25seSBhY2Nlc3MgdG9rZW5zIGNhbiBiZSB1c2VkIGZvciBBUEkgcmVxdWVzdHMnLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gICAgfVxuXG4gICAgaWYgKCFkZWNvZGVkLnN1YiB8fCAhZGVjb2RlZC5yb2xlKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdUb2tlbiBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcycsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICByZXEudXNlciA9IHsgLi4uZGVjb2RlZCB9O1xuXG4gICAgLy8gVGhlIHgtb3JnLWlkL3gtb3JnLW5hbWUgb3ZlcnJpZGUgbGV0cyBhIFNZUy1BRE1JTiBhY3Qgb24gYSBjaG9zZW4gb3JnXG4gICAgLy8gKGNyb3NzLW9yZyBhZG1pbiB0b29saW5nKS4gSXQgaXMgZ2F0ZWQgb24gdGhlIHZlcmlmaWVkIGBpc1N1cGVyQWRtaW5gIGNsYWltXG4gICAgLy8gaGVyZSBzbyB0aGF0IGV2ZW4gYSByb3V0ZSB3aGljaCBtaXN0YWtlbmx5IGVuYWJsZXMgYGFsbG93T3JnSGVhZGVyT3ZlcnJpZGVgXG4gICAgLy8gY2FuIE5FVkVSIGxldCBhbiBvcmRpbmFyeSBhdXRoZW50aWNhdGVkIHVzZXIgc3Bvb2YgYW5vdGhlciB0ZW5hbnQncyBvcmcgdmlhXG4gICAgLy8gdGhlIGhlYWRlciDigJQgZGVmZW5jZS1pbi1kZXB0aCBhZ2FpbnN0IHRoZSBjcm9zcy10ZW5hbnQgYnJlYWsgdGhpcyBjYXVzZWQuXG4gICAgaWYgKG9wdGlvbnMuYWxsb3dPcmdIZWFkZXJPdmVycmlkZSAmJiBkZWNvZGVkLmlzU3VwZXJBZG1pbiA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaGVhZGVyT3JnSWQgPSBnZXRIZWFkZXJTdHJpbmcocmVxLmhlYWRlcnNbJ3gtb3JnLWlkJ10pO1xuICAgICAgY29uc3QgaGVhZGVyT3JnTmFtZSA9IGdldEhlYWRlclN0cmluZyhyZXEuaGVhZGVyc1sneC1vcmctbmFtZSddKTtcbiAgICAgIGlmIChoZWFkZXJPcmdJZCkgcmVxLnVzZXIub3JnYW5pemF0aW9uSWQgPSBoZWFkZXJPcmdJZDtcbiAgICAgIGlmIChoZWFkZXJPcmdOYW1lKSByZXEudXNlci5vcmdhbml6YXRpb25OYW1lID0gaGVhZGVyT3JnTmFtZTtcbiAgICB9XG5cbiAgICAvLyBTZXNzaW9uLWludmFsaWRhdGlvbiBjaGVjayBmb3IgdGhlIHN0YXRlbGVzcyBzZXJ2aWNlczogcmVqZWN0IGEgdG9rZW5cbiAgICAvLyB3aG9zZSBgdG9rZW5WZXJzaW9uYCBpcyBiZWhpbmQgdGhlIHJldm9jYXRpb24gc3RvcmUncyBjdXJyZW50IHZhbHVlIChhXG4gICAgLy8gcHJpdmlsZWdlIGNoYW5nZSB0aGUgcGxhdGZvcm0gcHVibGlzaGVkKS4gTm8gc3RvcmUgcmVnaXN0ZXJlZCDih5IgdGhpcyBpcyBhXG4gICAgLy8gbm8tb3AgYW5kIGNvbnRyb2wgcGFzc2VzIHN0cmFpZ2h0IHRocm91Z2guIEZhaWwtb3BlbiBvbiBhbnkgc3RvcmUgZXJyb3IuXG4gICAgaWYgKHRva2VuUmV2b2NhdGlvblN0b3JlICYmIGRlY29kZWQuc3ViICYmIHR5cGVvZiBkZWNvZGVkLnRva2VuVmVyc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIGAuY2F0Y2gobmV4dClgIGZvcndhcmRzIGEgRE9XTlNUUkVBTSBzeW5jaHJvbm91cyB0aHJvdyBmcm9tIGBuZXh0KClgIHRvXG4gICAgICAvLyBFeHByZXNzJ3MgZXJyb3IgbWlkZGxld2FyZSDigJQgd2l0aG91dCBpdCwgdGhhdCB0aHJvdyB3b3VsZCBzdXJmYWNlIGFzIGFuXG4gICAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9uICh0aGlzIGBuZXh0KClgIHJ1bnMgaW4gYSBtaWNyb3Rhc2ssIG91dHNpZGUgdGhlXG4gICAgICAvLyBzdXJyb3VuZGluZyB0cnkvY2F0Y2ggYW5kIEV4cHJlc3MncyBwZXItbGF5ZXIgZGlzcGF0Y2gpLiBgaXNUb2tlblJldm9rZWRgXG4gICAgICAvLyBpdHNlbGYgbmV2ZXIgcmVqZWN0cyAoaXQgZmFpbC1vcGVucyBpbnRlcm5hbGx5KSwgc28gdGhlIGNhdGNoIG9ubHkgZXZlclxuICAgICAgLy8gc2VlcyBhIGdlbnVpbmUgZG93bnN0cmVhbSBlcnJvci5cbiAgICAgIGlzVG9rZW5SZXZva2VkKGRlY29kZWQpXG4gICAgICAgIC50aGVuKChyZXZva2VkKSA9PiB7XG4gICAgICAgICAgaWYgKHJldm9rZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Nlc3Npb24gaGFzIGJlZW4gcmV2b2tlZDsgcGxlYXNlIHNpZ24gaW4gYWdhaW4nLCBFcnJvckNvZGUuVE9LRU5fUkVWT0tFRCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKG5leHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBqd3QuVG9rZW5FeHBpcmVkRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIGhhcyBleHBpcmVkJywgRXJyb3JDb2RlLlRPS0VOX0VYUElSRUQpO1xuICAgIH1cblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIGp3dC5Kc29uV2ViVG9rZW5FcnJvcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnSW52YWxpZCB0b2tlbicsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiBmYWlsZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGFkbWluIHJvbGUuIFVzZSBhZnRlciByZXF1aXJlQXV0aC5cbiAqIFBlcm1pdHMgdXNlcnMgd2hvc2UgcGVyLW9yZyByb2xlIGlzICdhZG1pbicgb3IgJ293bmVyJy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBZG1pbihcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgaWYgKCFyZXEudXNlcikge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gIH1cblxuICBpZiAocmVxLnVzZXIucm9sZSAhPT0gJ2FkbWluJyAmJiByZXEudXNlci5yb2xlICE9PSAnb3duZXInKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLCAnQWRtaW4gYWNjZXNzIHJlcXVpcmVkJywgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyk7XG4gIH1cblxuICBuZXh0KCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVxdWVzdCdzIHVzZXIgaG9sZHMgYHBlcm1pc3Npb25gLiBTdXBlcmFkbWlucyBpbXBsaWNpdGx5IGhvbGRcbiAqIGV2ZXJ5IHBlcm1pc3Npb24uIFJlYWRzIHRoZSByZXNvbHZlZCBgcGVybWlzc2lvbnNgIGNsYWltIChzZXQgYXQgdG9rZW4gaXNzdWUsXG4gKiBvciByZS1kZXJpdmVkIHBlciByZXF1ZXN0IGJ5IHRoZSBwbGF0Zm9ybSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VySGFzUGVybWlzc2lvbihyZXE6IFJlcXVlc3QsIHBlcm1pc3Npb246IFBlcm1pc3Npb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc1Blcm1pc3Npb24ocmVxLnVzZXI/LnBlcm1pc3Npb25zLCBwZXJtaXNzaW9uLCByZXEudXNlcj8uaXNTdXBlckFkbWluKTtcbn1cblxuLyoqXG4gKiBDb250ZXh0IHBhc3NlZCB0byBhIHJlZ2lzdGVyZWQgYXV0aG9yaXphdGlvbi1kZW5pYWwgYXVkaXRvciB3aGVuIGFcbiAqIHN0YXRlLWNoYW5naW5nIHJlcXVlc3QgaXMgcmVqZWN0ZWQgYnkgYHJlcXVpcmVQZXJtaXNzaW9uYCAvXG4gKiBgcmVxdWlyZVN5c3RlbUFkbWluYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoekRlbmlhbEluZm8ge1xuICAvKiogVGhlIGRlbmllZCB1c2VyJ3MgaWQgKGBzdWJgKSwgaWYgYXV0aGVudGljYXRlZC4gKi9cbiAgYWN0b3JJZD86IHN0cmluZztcbiAgYWN0b3JFbWFpbD86IHN0cmluZztcbiAgLyoqIFRoZSB1c2VyJ3MgYWN0aXZlIG9yZyBhdCBkZW5pYWwgdGltZS4gKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIC8qKiBIVFRQIG1ldGhvZCArIHBhdGggb2YgdGhlIHJlamVjdGVkIHJlcXVlc3QuICovXG4gIG1ldGhvZDogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKiBXaGF0IHdhcyByZXF1aXJlZDogdGhlIG1pc3NpbmcgcGVybWlzc2lvbihzKSwgb3IgJ3N5c3RlbS1hZG1pbicuICovXG4gIHJlcXVpcmVkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9uYWwgc2luayBmb3IgZGVuaWVkLWF1dGhvcml6YXRpb24gZXZlbnRzLiBMZWZ0IHVuc2V0IGJ5IGRlZmF1bHQgc29cbiAqIGFwaS1jb3JlIHN0YXlzIGRlY291cGxlZCBmcm9tIGFueSBhdWRpdCB0cmFuc3BvcnQg4oCUIGEgc2VydmljZSByZWdpc3RlcnMgb25lXG4gKiBhdCBib290ICh0eXBpY2FsbHkgZm9yd2FyZGluZyB0byBpdHMgYFJlbW90ZUF1ZGl0Q2xpZW50YCBhcyBhblxuICogYGF1dGh6LmRlbmllZGAgZXZlbnQsIG9yLCBvbiBwbGF0Zm9ybSwgdG8gdGhlIGxvY2FsIGBhdWRpdCgpYCBoZWxwZXIpLlxuICogTVVTVCBiZSBiZXN0LWVmZm9ydDogaXQgaXMgaW52b2tlZCBpbnNpZGUgdGhlIHJlcXVlc3QgcGF0aCwgc28gaXQgbXVzdCBuZXZlclxuICogdGhyb3cgb3IgYmxvY2sgKHRoZSBnYXRlIHdyYXBzIHRoZSBjYWxsIGluIHRyeS9jYXRjaCByZWdhcmRsZXNzKS5cbiAqL1xubGV0IGF1dGh6RGVuaWFsQXVkaXRvcjogKChpbmZvOiBBdXRoekRlbmlhbEluZm8pID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJlZ2lzdGVyIChvciBjbGVhciwgd2l0aCBgdW5kZWZpbmVkYCkgdGhlIHByb2Nlc3Mtd2lkZSBhdXRob3JpemF0aW9uLWRlbmlhbFxuICogYXVkaXRvci4gSWRlbXBvdGVudDsgdGhlIGxhc3QgcmVnaXN0cmF0aW9uIHdpbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRBdXRoekRlbmlhbEF1ZGl0b3IoZm46ICgoaW5mbzogQXV0aHpEZW5pYWxJbmZvKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBhdXRoekRlbmlhbEF1ZGl0b3IgPSBmbjtcbn1cblxuLyoqXG4gKiBFbWl0IGEgZGVuaWFsIGV2ZW50LCBiZXN0LWVmZm9ydC4gT25seSBmaXJlcyBmb3Igc3RhdGUtY2hhbmdpbmcgKG5vbi1HRVQsXG4gKiBub24tSEVBRC9PUFRJT05TKSByZXF1ZXN0cyDigJQgYSByZWplY3RlZCBHRVQgaXMgbG93LXNpZ25hbCBwcm9iaW5nIG5vaXNlIGFuZFxuICogd291bGQgYW1wbGlmeSBhdWRpdCB2b2x1bWUgdW5kZXIgYSBzY2FuLiBOZXZlciB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIGF1ZGl0QXV0aHpEZW5pYWwocmVxOiBSZXF1ZXN0LCByZXF1aXJlZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGF1ZGl0b3IgPSBhdXRoekRlbmlhbEF1ZGl0b3I7XG4gIGlmICghYXVkaXRvcikgcmV0dXJuO1xuICBjb25zdCBtZXRob2QgPSByZXEubWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gIGlmIChtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnIHx8IG1ldGhvZCA9PT0gJ09QVElPTlMnKSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXVkaXRvcih7XG4gICAgICBhY3RvcklkOiByZXEudXNlcj8uc3ViLFxuICAgICAgYWN0b3JFbWFpbDogcmVxLnVzZXI/LmVtYWlsLFxuICAgICAgb3JnSWQ6IHJlcS51c2VyPy5vcmdhbml6YXRpb25JZCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHBhdGg6IHJlcS5vcmlnaW5hbFVybCB8fCByZXEudXJsLFxuICAgICAgcmVxdWlyZWQsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEJlc3QtZWZmb3J0IOKAlCBhIGJyb2tlbiBhdWRpdG9yIG11c3QgbmV2ZXIgYnJlYWsgdGhlIGF1dGggZ2F0ZS5cbiAgfVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIHRoYXQgdGhlIHVzZXIgaG9sZCBBVCBMRUFTVCBPTkUgb2YgdGhlIGdpdmVuIHBlcm1pc3Npb25zIChvciBiZSBhXG4gKiBzdXBlcmFkbWluKS4gVXNlIGFmdGVyIHJlcXVpcmVBdXRoLiBNaXJyb3JzIGByZXF1aXJlUm9sZWAncyBhbnktb2Ygc2VtYW50aWNzO1xuICogcGFzcyBhIHNpbmdsZSBwZXJtaXNzaW9uIGZvciBhIHNwZWNpZmljIGFjdGlvbiwgb3Igc2V2ZXJhbCB3aGVuIGFueSBvbmUgb2ZcbiAqIHRoZW0gc2hvdWxkIGdyYW50IGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVQZXJtaXNzaW9uKC4uLnBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW10pIHtcbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIGlmICghcmVxLnVzZXIpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gICAgfVxuICAgIC8vIHVzZXJIYXNQZXJtaXNzaW9uIOKGkiBoYXNQZXJtaXNzaW9uIGFscmVhZHkgZ3JhbnRzIHN1cGVyYWRtaW5zIGV2ZXJ5XG4gICAgLy8gcGVybWlzc2lvbiwgc28gdGhpcyBzaW5nbGUgY2hlY2sgY292ZXJzIGJvdGggdGhlIHN1cGVyYWRtaW4gYnlwYXNzIGFuZFxuICAgIC8vIHRoZSBhbnktb2YgbWVtYmVyc2hpcCB0ZXN0IHdpdGhvdXQgcmUtaW5saW5pbmcgZWl0aGVyLlxuICAgIGlmIChwZXJtaXNzaW9ucy5zb21lKChwKSA9PiB1c2VySGFzUGVybWlzc2lvbihyZXEsIHApKSkgcmV0dXJuIG5leHQoKTtcbiAgICBhdWRpdEF1dGh6RGVuaWFsKHJlcSwgcGVybWlzc2lvbnMuam9pbignIG9yICcpKTtcbiAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgcmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTixcbiAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHBlcm1pc3Npb246ICR7cGVybWlzc2lvbnMuam9pbignIG9yICcpfWAsXG4gICAgICBFcnJvckNvZGUuSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TLFxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogUmVxdWlyZXMgdGhhdCB0aGUgdXNlciBob2xkIEVWRVJZIG9uZSBvZiB0aGUgZ2l2ZW4gcGVybWlzc2lvbnMgKG9yIGJlIGFcbiAqIHN1cGVyYWRtaW4pIOKAlCB0aGUgQU5EIGNvdW50ZXJwYXJ0IHRvIGByZXF1aXJlUGVybWlzc2lvbmAncyBhbnktb2YuIFVzZSBmb3IgYVxuICogc2Vuc2l0aXZlIGFjdGlvbiB0aGF0IGxlZ2l0aW1hdGVseSBkZW1hbmRzIHR3byBkaXN0aW5jdCBjYXBhYmlsaXRpZXMgYXQgb25jZVxuICogKGUuZy4gYSBjcm9zcy1zdXJmYWNlIG9wZXJhdGlvbiksIHNvIHRoZSBndWFyYW50ZWUgaXMgZXhwbGljaXQgcmF0aGVyIHRoYW5cbiAqIGFwcHJveGltYXRlZCBieSBjaGFpbmluZyB0d28gYHJlcXVpcmVQZXJtaXNzaW9uYCBnYXRlcy4gU3VwZXJhZG1pbnMgYnlwYXNzXG4gKiAodGhleSBpbXBsaWNpdGx5IGhvbGQgZXZlcnkgcGVybWlzc2lvbikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQWxsUGVybWlzc2lvbnMoLi4ucGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXSkge1xuICByZXR1cm4gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKTogdm9pZCA9PiB7XG4gICAgaWYgKCFyZXEudXNlcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgICB9XG4gICAgY29uc3QgbWlzc2luZyA9IHBlcm1pc3Npb25zLmZpbHRlcigocCkgPT4gIXVzZXJIYXNQZXJtaXNzaW9uKHJlcSwgcCkpO1xuICAgIGlmIChtaXNzaW5nLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5leHQoKTtcbiAgICBhdWRpdEF1dGh6RGVuaWFsKHJlcSwgcGVybWlzc2lvbnMuam9pbignIGFuZCAnKSk7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICBgTWlzc2luZyByZXF1aXJlZCBwZXJtaXNzaW9uOiAke21pc3Npbmcuam9pbignIGFuZCAnKX1gLFxuICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSBzeXN0ZW0gdGVuYW50J3MgY2Fub25pY2FsIG9yZyAqKmlkKiog4oCUIGEgZml4ZWQsIHdlbGwta25vd24gT2JqZWN0SWQgKE5PVFxuICogdGhlIHN0cmluZyAnc3lzdGVtJykuIFRoaXMgaXMgdGhlIHNpbmdsZSBrbm9iIGV2ZXJ5IHNlcnZpY2UgcmVzb2x2ZXMgdGhlXG4gKiBzeXN0ZW0gdGVuYW50IHRocm91Z2g7IG92ZXJyaWRlIHZpYSB0aGUgYFNZU1RFTV9PUkdfSURgIGVudiBmb3IgYWx0ZXJuYXRlXG4gKiBpbnN0YWxscy4gVGhlIHN5c3RlbSBvcmcncyBodW1hbiBpZGVudGlmaWVyIHN0YXlzIHRoZSBzbHVnL25hbWUgJ3N5c3RlbSdcbiAqIChzZWUge0BsaW5rIFNZU1RFTV9PUkdfU0xVR30pOyBvbmx5IGl0cyBgX2lkYCBpcyB0aGlzIE9iamVjdElkLlxuICovXG5leHBvcnQgY29uc3QgU1lTVEVNX09SR19JRCA9IChwcm9jZXNzLmVudi5TWVNURU1fT1JHX0lEIHx8ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnKS50b0xvd2VyQ2FzZSgpO1xuXG4vKiogVGhlIHN5c3RlbSBvcmcncyB3ZWxsLWtub3duIHNsdWcvbmFtZSAodGhlIGh1bWFuIGlkZW50aWZpZXI7IGl0cyBgX2lkYCBpcyB7QGxpbmsgU1lTVEVNX09SR19JRH0pLiAqL1xuZXhwb3J0IGNvbnN0IFNZU1RFTV9PUkdfU0xVRyA9ICdzeXN0ZW0nO1xuXG4vKipcbiAqIENoZWNrIGlmIGFuIG9yZ0lkIG9yIG9yZ05hbWUvc2x1ZyBtYXRjaGVzIHRoZSBzeXN0ZW0gb3JnLiBVc2UgdGhpcyBpbnN0ZWFkIG9mXG4gKiBjb21wYXJpbmcgZGlyZWN0bHk6IHRoZSBpZCBpcyBub3cgYW4gT2JqZWN0SWQgKHtAbGluayBTWVNURU1fT1JHX0lEfSkgd2hpbGUgdGhlXG4gKiBuYW1lL3NsdWcgaXMgJ3N5c3RlbScgKHtAbGluayBTWVNURU1fT1JHX1NMVUd9KSwgc28gdGhlIHR3byBhcmUgY29tcGFyZWQgYWdhaW5zdFxuICogdGhlaXIgcmVzcGVjdGl2ZSBjYW5vbmljYWwgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTeXN0ZW1PcmdJZChvcmdJZD86IHN0cmluZywgb3JnTmFtZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3JnSWQ/LnRvTG93ZXJDYXNlKCkgPT09IFNZU1RFTV9PUkdfSUQgfHwgb3JnTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gU1lTVEVNX09SR19TTFVHO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIGZyb20gYSBzeXN0ZW0gYWRtaW4uXG4gKlxuICogQXV0aG9yaXR5IGlzIGdyYW50ZWQgc29sZWx5IGJ5IHRoZSB1c2VyLWxldmVsIGBpc1N1cGVyQWRtaW5gIGZsYWcgY2FycmllZFxuICogaW4gdGhlIEpXVC4gVGhlIFwibWVtYmVyc2hpcCBpbiB0aGUgd2VsbC1rbm93biAnc3lzdGVtJyBvcmcgd2l0aCByb2xlXG4gKiBhZG1pbi9vd25lclwiIHBhdGggd2FzIHJlbW92ZWQg4oCUIGl0IGNvbmZsYXRlZCBhIFBpcGVsaW5lIEJ1aWxkZXIgb3BlcmF0b3JcbiAqIHdpdGggYSByZWFsIGN1c3RvbWVyIHRlbmFudCBpbiB0aGUgZGF0YSBtb2RlbCwgYW5kIG1lYW50IGFueSB1bmludGVuZGVkXG4gKiB3cml0ZSB0aGF0IGNyZWF0ZWQgYSAnc3lzdGVtJy1uYW1lZCBvcmcgY291bGQgcXVpZXRseSBncmFudCBjcm9zcy1vcmdcbiAqIGF1dGhvcml0eS4gVGhlIGBzeXN0ZW1gIG9yZyBzdGlsbCBleGlzdHMgYXMgYSAqY29udGVudCBob2xkZXIqIGZvciBzaGFyZWRcbiAqIHNhbXBsZSBkYXRhOyBpdCBqdXN0IG5vIGxvbmdlciBjb25mZXJzIHByaXZpbGVnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3lzdGVtQWRtaW4ocmVxOiBSZXF1ZXN0KTogYm9vbGVhbiB7XG4gIHJldHVybiByZXEudXNlcj8uaXNTdXBlckFkbWluID09PSB0cnVlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlcXVlc3QncyB0b2tlbiBjYXJyaWVzIGEgc3BlY2lmaWMgY2FwYWJpbGl0eSBgc2NvcGVgIChlLmcuXG4gKiBgJ3JlcG9ydGluZzppbmdlc3QnYCkuIFVzZWQgdG8gZ2F0ZSBlbmRwb2ludHMgdGhhdCBhY2NlcHQgYSBuYXJyb3cgbWFjaGluZVxuICogaWRlbnRpdHkg4oCUIGEgbm9ybWFsIGludGVyYWN0aXZlIHVzZXIgdG9rZW4gaGFzIG5vIGBzY29wZWAgYW5kIHJldHVybnMgZmFsc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNTY29wZShyZXE6IFJlcXVlc3QsIHNjb3BlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcS51c2VyPy5zY29wZSA9PT0gc2NvcGU7XG59XG5cbi8qKiBSZXF1aXJlcyBzeXN0ZW0gYWRtaW4gKGFkbWluIHJvbGUgKyBzeXN0ZW0gb3JnYW5pemF0aW9uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlU3lzdGVtQWRtaW4oXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIGlmICghaXNTeXN0ZW1BZG1pbihyZXEpKSB7XG4gICAgYXVkaXRBdXRoekRlbmlhbChyZXEsICdzeXN0ZW0tYWRtaW4nKTtcbiAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgcmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTixcbiAgICAgICdBY2Nlc3MgZGVuaWVkLiBPbmx5IHN5c3RlbSBhZG1pbmlzdHJhdG9ycyBjYW4gcGVyZm9ybSB0aGlzIGFjdGlvbi4nLFxuICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICApO1xuICB9XG4gIG5leHQoKTtcbn1cblxuLyoqXG4gKiBSZXF1aXJlIGEgc3BlY2lmaWMgZmVhdHVyZSBmbGFnLiBVc2UgYWZ0ZXIgcmVxdWlyZUF1dGguXG4gKiBDaGVja3MgdGhlIGBmZWF0dXJlc2AgYXJyYXkgaW4gdGhlIEpXVCBwYXlsb2FkIChzZXQgYXQgdG9rZW4gaXNzdWFuY2UpLlxuICogU3lzYWRtaW5zIChpc1N1cGVyQWRtaW4pIGJ5cGFzcyDigJQgdGhleSBhbHdheXMgaGF2ZSBldmVyeSBmZWF0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUZlYXR1cmUoZmVhdHVyZTogc3RyaW5nKSB7XG4gIHJldHVybiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJlcS51c2VyKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICAgIH1cblxuICAgIC8vIFN5c2FkbWlucyBnZXQgYWxsIGZlYXR1cmVzOyB0aGUgYGZlYXR1cmVzYCBhcnJheSBvbiB0aGVpciB0b2tlbiBpc1xuICAgIC8vIHBvcHVsYXRlZCB3aXRoIGV2ZXJ5IGZsYWcgYXQgaXNzdWFuY2UgdGltZSBidXQgdGhlIGJ5cGFzcyBoZXJlIGtlZXBzXG4gICAgLy8gdGhlIHJ1bGUgZXhwbGljaXQgYW5kIHN1cnZpdmVzIGEgdG9rZW4gaXNzdWVkIGJlZm9yZSBhIG5ldyBmZWF0dXJlXG4gICAgLy8gZmxhZyB3YXMgYWRkZWQuXG4gICAgaWYgKHJlcS51c2VyLmlzU3VwZXJBZG1pbiA9PT0gdHJ1ZSkgcmV0dXJuIG5leHQoKTtcblxuICAgIGlmICghcmVxLnVzZXIuZmVhdHVyZXM/LmluY2x1ZGVzKGZlYXR1cmUpKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLFxuICAgICAgICBgVGhpcyBmZWF0dXJlIHJlcXVpcmVzIGEgaGlnaGVyIHBsYW4gKCR7ZmVhdHVyZX0pYCxcbiAgICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGVmZmVjdGl2ZSBhY2Nlc3MgbW9kaWZpZXIgZm9yIGFuIGVudGl0eSBiZWluZyBjcmVhdGVkL3VwZGF0ZWQuXG4gKiAncHVibGljJyBpcyBwZXJtaXR0ZWQgZm9yIGFueSBhZG1pbiBvciBvd25lciByb2xlIChzeXN0ZW0gYWRtaW5zIGNyZWF0ZVxuICogY2F0YWxvZy13aWRlIHB1YmxpYyBlbnRpdGllczsgb3JnIGFkbWlucyBjcmVhdGUgb3JnLXdpZGUgcHVibGljIGVudGl0aWVzKS5cbiAqIEV2ZXJ5b25lIGVsc2UgKG1lbWJlciByb2xlLCBubyByb2xlKSBnZXRzICdwcml2YXRlJy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBY2Nlc3NNb2RpZmllcihyZXE6IFJlcXVlc3QsIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogJ3B1YmxpYycgfCAncHJpdmF0ZScge1xuICBpZiAocmVxdWVzdGVkID09PSAncHVibGljJyAmJiAocmVxLnVzZXI/LnJvbGUgPT09ICdhZG1pbicgfHwgcmVxLnVzZXI/LnJvbGUgPT09ICdvd25lcicpKSB7XG4gICAgcmV0dXJuICdwdWJsaWMnO1xuICB9XG4gIHJldHVybiAncHJpdmF0ZSc7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VydmljZS10by1zZXJ2aWNlIHRva2Vuc1xuLy9cbi8vIEludGVyLXNlcnZpY2UgSFRUUCBjYWxscyAoYmlsbGluZyDihpIgbWVzc2FnZSwgcGxhdGZvcm0g4oaSIGNvbXBsaWFuY2UsIGV0Yy4pXG4vLyBuZWVkIHRvIHNhdGlzZnkgdGhlIHNhbWUgYHJlcXVpcmVBdXRoYCBtaWRkbGV3YXJlIGFzIHVzZXIgcmVxdWVzdHMuXG4vLyBgc2lnblNlcnZpY2VUb2tlbmAgbWludHMgYSBzaG9ydC1saXZlZCBKV1Qgc2lnbmVkIHdpdGggdGhlIHNoYXJlZFxuLy8gSldUX1NFQ1JFVCwgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgc2VydmljZSB2aWEgYHN1YjogJ3NlcnZpY2U6PG5hbWU+J2AuXG4vLyBgcmVxdWlyZUF1dGhgIGFjY2VwdHMgdGhlc2UgdG9rZW5zIHRyYW5zcGFyZW50bHkg4oCUIHRoZXkgcGFzcyBgZGVjb2RlZC5zdWJgXG4vLyBhbmQgYGRlY29kZWQucm9sZWAgY2hlY2tzLCBhbmQgZG93bnN0cmVhbSBgcmVxdWlyZU9yZ2FuaXphdGlvbmAgL1xuLy8gYHJlcXVpcmVBZG1pbmAgcmVseSBvbiB0aGUgb3JnL3JvbGUgZW1iZWRkZWQgaW4gdGhlIHRva2VuLlxuLy9cbi8vIFRva2VucyBkZWZhdWx0IHRvIDUtbWludXRlIFRUTCDigJQgbG9uZyBlbm91Z2ggdG8gc3Vydml2ZSBhIGJhY2tlbmQgaG9wLFxuLy8gc2hvcnQgZW5vdWdoIHRoYXQgYSBsZWFrZWQgdG9rZW4gaXMgbG93LXZhbHVlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IERFRkFVTFRfU0VSVklDRV9UT0tFTl9UVExfU0VDT05EUyA9IDMwMDtcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlVG9rZW5PcHRpb25zIHtcbiAgLyoqIENhbGxpbmcgc2VydmljZSBpZGVudGlmaWVyIChlLmcuICdiaWxsaW5nJywgJ3BsYXRmb3JtJykuIEVtYmVkZGVkIGFzIGBzdWI6IHNlcnZpY2U6PG5hbWU+YC4gKi9cbiAgc2VydmljZU5hbWU6IHN0cmluZztcbiAgLyoqIEFjdGl2ZSBvcmcgY29udGV4dCBmb3IgdGhlIGNhbGwuIFVzZSB0aGUgdGFyZ2V0IHRlbmFudCdzIG9yZyBJRCwgb3IgJ3N5c3RlbScgZm9yIHN5c3RlbS13aWRlIG9wcy4gKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnIG5hbWUuIERlZmF1bHRzIHRvIG9yZ0lkLiAqL1xuICBvcmdOYW1lPzogc3RyaW5nO1xuICAvKiogVFRMIGluIHNlY29uZHMgKGRlZmF1bHQgMzAwKS4gKi9cbiAgdHRsU2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJvbGUgdGhlIHRva2VuIGNhcnJpZXMgKHJlcXVpcmVkIOKAlCBubyBpbXBsaWNpdCBkZWZhdWx0KS4gKipQYXNzIHRoZSBMT1dFU1RcbiAgICogcm9sZSB0aGUgY2FsbCBhY3R1YWxseSBuZWVkcyoqIChgJ21lbWJlcidgIGZvciByZWFkIC8gZGF0YS1wbGFuZSBjYWxscykgc28gYVxuICAgKiBsZWFrZWQgc2VydmljZSB0b2tlbiBjYW4ndCBwZXJmb3JtIGFkbWluIGFjdGlvbnMgaW4gdGhlIHRhcmdldCBvcmcuXG4gICAqIGBpc0FkbWluYCBpcyBkZXJpdmVkIGZyb20gdGhpcyAoYWRtaW58b3duZXIg4oaSIHRydWUpLlxuICAgKi9cbiAgcm9sZTogJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJztcbn1cblxuLyoqXG4gKiBNaW50IGEgSldUIGlkZW50aWZ5aW5nIHRoZSBjYWxsaW5nIHNlcnZpY2UuIFVzZWQgZm9yIGludGVyLXNlcnZpY2UgSFRUUCBjYWxscy5cbiAqIFRoZSB0b2tlbiBzYXRpc2ZpZXMgYHJlcXVpcmVBdXRoYCBhbmQgKHdoZW4gb3JnSWQgaXMgcHJlc2VudCkgYHJlcXVpcmVPcmdhbml6YXRpb25gLlxuICogU2NvcGUgaXQgd2l0aCBgb3B0cy5yb2xlYCDigJQgbGVhc3QgcHJpdmlsZWdlIGtlZXBzIGEgbGVha2VkIHRva2VuIGxvdy12YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25TZXJ2aWNlVG9rZW4ob3B0czogU2VydmljZVRva2VuT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHJvbGUgPSBvcHRzLnJvbGU7XG4gIGNvbnN0IHBheWxvYWQ6IEp3dFBheWxvYWQgPSB7XG4gICAgc3ViOiBgc2VydmljZToke29wdHMuc2VydmljZU5hbWV9YCxcbiAgICB1c2VybmFtZTogYCR7b3B0cy5zZXJ2aWNlTmFtZX0tc2VydmljZWAsXG4gICAgZW1haWw6IGAke29wdHMuc2VydmljZU5hbWV9QGludGVybmFsYCxcbiAgICByb2xlLFxuICAgIGlzQWRtaW46IHJvbGUgPT09ICdvd25lcicgfHwgcm9sZSA9PT0gJ2FkbWluJyxcbiAgICB0eXBlOiAnYWNjZXNzJyxcbiAgICBvcmdhbml6YXRpb25JZDogb3B0cy5vcmdJZCxcbiAgICBvcmdhbml6YXRpb25OYW1lOiBvcHRzLm9yZ05hbWUgPz8gb3B0cy5vcmdJZCxcbiAgfTtcbiAgLy8gTWF0Y2ggdGhlIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZSB0aGF0IHJlcXVpcmVBdXRoIHZlcmlmaWVzLCB3aGVuXG4gIC8vIGNvbmZpZ3VyZWQuIFdpdGhvdXQgdGhlc2UsIGEgc2VydmljZSB0b2tlbiBzaWduZWQgaGVyZSB3b3VsZCBmYWlsXG4gIC8vIHJlcXVpcmVBdXRoIGluIGEgZGVwbG95bWVudCB0aGF0IGhhcyBzZXQgSldUX0lTU1VFUi9KV1RfQVVESUVOQ0UuXG4gIGNvbnN0IHNpZ25PcHRpb25zOiBqd3QuU2lnbk9wdGlvbnMgPSB7XG4gICAgZXhwaXJlc0luOiBvcHRzLnR0bFNlY29uZHMgPz8gREVGQVVMVF9TRVJWSUNFX1RPS0VOX1RUTF9TRUNPTkRTLFxuICAgIC8vIFNpZ24gd2l0aCB0aGUgc2FtZSBjb25maWd1cmVkIGFsZyByZXF1aXJlQXV0aCBwaW5zIG9uIHZlcmlmeSwgc28gc2VydmljZVxuICAgIC8vIHRva2VucyBzdGF5IHZhbGlkIHVuZGVyIGEgbm9uLWRlZmF1bHQgSldUX0FMR09SSVRITS5cbiAgICBhbGdvcml0aG06IChwcm9jZXNzLmVudi5KV1RfQUxHT1JJVEhNIHx8ICdIUzI1NicpIGFzIGp3dC5BbGdvcml0aG0sXG4gICAgLy8gVW5pcXVlIHRva2VuIGlkIG9uIGV2ZXJ5IG1pbnQuIENvbWJpbmVkIHdpdGggdGhlIHNob3J0ICgzMDBzIGRlZmF1bHQpIFRUTFxuICAgIC8vIHRoaXMgZ2l2ZXMgZWFjaCBzZXJ2aWNlIHRva2VuIGEgZGlzdGluY3QgaWRlbnRpdHkg4oCUIHRoZSBidWlsZGluZyBibG9jayBmb3JcbiAgICAvLyByZXBsYXkgZGV0ZWN0aW9uIChhIHZlcmlmaWVyIGNhbiB0cmFjayBzZWVuIGp0aXMpIGFuZCB0aGUgY29ycmVsYXRpb25cbiAgICAvLyBoYW5kbGUgZm9yIHRyYWNpbmcgd2hpY2ggbWludCBwZXJmb3JtZWQgYSBjcm9zcy1zZXJ2aWNlIGFjdGlvbi4gSXQgZG9lc1xuICAgIC8vIE5PVCBieSBpdHNlbGYgcHJldmVudCByZXBsYXkgd2l0aGluIHRoZSBUVEwgd2luZG93OyB0cnVlIHJlcGxheSBkZWZlbmNlXG4gICAgLy8gbmVlZHMgdGhlIGFzeW1tZXRyaWMta2V5IHdvcmsgdHJhY2tlZCBzZXBhcmF0ZWx5LlxuICAgIGp3dGlkOiByYW5kb21VVUlEKCksXG4gIH07XG4gIGlmIChwcm9jZXNzLmVudi5KV1RfSVNTVUVSKSBzaWduT3B0aW9ucy5pc3N1ZXIgPSBwcm9jZXNzLmVudi5KV1RfSVNTVUVSO1xuICBpZiAocHJvY2Vzcy5lbnYuSldUX0FVRElFTkNFKSBzaWduT3B0aW9ucy5hdWRpZW5jZSA9IHByb2Nlc3MuZW52LkpXVF9BVURJRU5DRTtcbiAgcmV0dXJuIGp3dC5zaWduKHBheWxvYWQsIGdldEp3dFNlY3JldCgpLCBzaWduT3B0aW9ucyk7XG59XG5cbi8qKiBDb252ZW5pZW5jZTogcmV0dXJucyBhIGBCZWFyZXIgPHRva2VuPmAgaGVhZGVyIHZhbHVlIGZvciBmZXRjaC9heGlvcyBjYWxscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJ2aWNlQXV0aEhlYWRlcihvcHRzOiBTZXJ2aWNlVG9rZW5PcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBCZWFyZXIgJHtzaWduU2VydmljZVRva2VuKG9wdHMpfWA7XG59XG5cbi8qKiBUcnVlIHdoZW4gYHJlcS51c2VyLnN1YmAgd2FzIGlzc3VlZCBieSBgc2lnblNlcnZpY2VUb2tlbmAgKGkuZS4gc3RhcnRzIHdpdGggYHNlcnZpY2U6YCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJ2aWNlUHJpbmNpcGFsKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVxLnVzZXI/LnN1Yj8uc3RhcnRzV2l0aCgnc2VydmljZTonKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBQUkUtYXV0aCBjaGVjazogY3J5cHRvZ3JhcGhpY2FsbHkgdmVyaWZ5IHRoZSByZXF1ZXN0IGNhcnJpZXMgYSB2YWxpZCwgc2lnbmVkXG4gKiBTRVJWSUNFIHRva2VuIChgc3ViYCBzdGFydHMgd2l0aCBgc2VydmljZTpgKS4gVW5saWtlIHtAbGluayBpc1NlcnZpY2VQcmluY2lwYWx9XG4gKiAod2hpY2ggcmVhZHMgdGhlIGFscmVhZHktcG9wdWxhdGVkIGByZXEudXNlcmApLCB0aGlzIHZlcmlmaWVzIHRoZSBiZWFyZXIgdG9rZW5cbiAqIGl0c2VsZiwgc28gaXQgaXMgc2FmZSB0byBjYWxsIEJFRk9SRSBgcmVxdWlyZUF1dGhgIHJ1bnMg4oCUIGUuZy4gdGhlIGdsb2JhbCByYXRlXG4gKiBsaW1pdGVyJ3MgYHNraXBgLCB3aGljaCBtdXN0IG5vdCB0cnVzdCB0aGUgc3Bvb2ZhYmxlIGB4LWludGVybmFsLXNlcnZpY2VgXG4gKiBoZWFkZXIuIE1pcnJvcnMgYHJlcXVpcmVBdXRoYCdzIHZlcmlmaWNhdGlvbiAoYWxnb3JpdGhtIHBpbm5pbmcgKyBvcHRpb25hbFxuICogaXNzdWVyL2F1ZGllbmNlKSBhbmQgcmV0dXJucyBgZmFsc2VgIG9uIGFueSBtaXNzaW5nL2ludmFsaWQvbm9uLXNlcnZpY2UgdG9rZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJ0cyA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb24/LnNwbGl0KCcgJyk7XG4gIGlmICghcGFydHMgfHwgcGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSAnQmVhcmVyJykgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IHZlcmlmeU9wdGlvbnM6IGp3dC5WZXJpZnlPcHRpb25zID0geyBhbGdvcml0aG1zOiBbKHByb2Nlc3MuZW52LkpXVF9BTEdPUklUSE0gfHwgJ0hTMjU2JykgYXMgand0LkFsZ29yaXRobV0gfTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuSldUX0lTU1VFUikgdmVyaWZ5T3B0aW9ucy5pc3N1ZXIgPSBwcm9jZXNzLmVudi5KV1RfSVNTVUVSO1xuICAgIGlmIChwcm9jZXNzLmVudi5KV1RfQVVESUVOQ0UpIHZlcmlmeU9wdGlvbnMuYXVkaWVuY2UgPSBwcm9jZXNzLmVudi5KV1RfQVVESUVOQ0U7XG4gICAgY29uc3QgZGVjb2RlZCA9IHZlcmlmeUp3dFdpdGhSb3RhdGlvbihwYXJ0c1sxXSwgdmVyaWZ5T3B0aW9ucyk7XG4gICAgcmV0dXJuIGRlY29kZWQudHlwZSA9PT0gJ2FjY2VzcycgJiYgdHlwZW9mIGRlY29kZWQuc3ViID09PSAnc3RyaW5nJyAmJiBkZWNvZGVkLnN1Yi5zdGFydHNXaXRoKCdzZXJ2aWNlOicpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
@@ -48,8 +48,9 @@ export function createRemoteAuditClient(config = {}) {
48
48
  return {
49
49
  record(event, serviceName) {
50
50
  const authHeader = getServiceAuthHeader({ serviceName, orgId: event.orgId, role: 'member' });
51
- // Strip the `Bearer ` prefix for InternalHttpClient it sets the
52
- // Authorization header itself; the value here is raw.
51
+ // getServiceAuthHeader returns a full `Bearer <token>` value; the
52
+ // http-client forwards request headers as-is (it does NOT inject its own
53
+ // Authorization), so pass it straight through as the Authorization header.
53
54
  // A stable per-emission Idempotency-Key makes this non-idempotent POST
54
55
  // retry-safe in the http-client (so transient 5xx/timeout/429 are retried
55
56
  // rather than dropped) and lets the platform ingest dedup a re-delivered
@@ -63,7 +64,10 @@ export function createRemoteAuditClient(config = {}) {
63
64
  // /audit, and the internal ingest endpoint lives at /events under that.
64
65
  client.post('/audit/events', event, { headers, ...AUDIT_REQUEST_OPTIONS })
65
66
  .then((response) => {
66
- if (!response || response.statusCode !== 200) {
67
+ // Any 2xx is an accept (the ingest returns 200 today, but 201/202/204
68
+ // are equally "stored"); only a non-2xx / missing response warns.
69
+ const ok = response && response.statusCode >= 200 && response.statusCode < 300;
70
+ if (!ok) {
67
71
  logger.warn('Remote audit ingest non-ok', {
68
72
  action: event.action, statusCode: response?.statusCode,
69
73
  });
@@ -78,4 +82,4 @@ export function createRemoteAuditClient(config = {}) {
78
82
  },
79
83
  };
80
84
  }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWF1ZGl0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZW1vdGUtYXVkaXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQStEO0lBQ3hGLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBNEZGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFNBQWtDLEVBQUU7SUFDMUUsTUFBTSxhQUFhLEdBQWtCO1FBQ25DLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksVUFBVTtRQUNwRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQzlFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUk7S0FDaEMsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRS9DLE9BQU87UUFDTCxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVc7WUFDdkIsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDN0YsaUVBQWlFO1lBQ2pFLHNEQUFzRDtZQUN0RCx1RUFBdUU7WUFDdkUsMEVBQTBFO1lBQzFFLHlFQUF5RTtZQUN6RSx5RUFBeUU7WUFDekUsb0RBQW9EO1lBQ3BELE1BQU0sT0FBTyxHQUEyQjtnQkFDdEMsZUFBZSxFQUFFLFVBQVU7Z0JBQzNCLGlCQUFpQixFQUFFLFVBQVUsRUFBRTthQUNoQyxDQUFDO1lBQ0Ysb0VBQW9FO1lBQ3BFLHdFQUF3RTtZQUN4RSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxDQUFDO2lCQUN2RSxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUM3QyxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFO3dCQUN4QyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVU7cUJBQ3ZELENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxDQUFDLEdBQVksRUFBRSxFQUFFO2dCQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFO29CQUN2QyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07b0JBQ3BCLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN2RCxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZVNhZmVDbGllbnQsIHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9hdXRoLmpzJztcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3JlbW90ZS1hdWRpdCcpO1xuXG4vKipcbiAqIEF1ZGl0IGluZ2VzdCBpcyBiZXN0LWVmZm9ydCBhbmQgTVVTVCBOT1QgYmxvY2sgdGhlIGNhbGxlciwgYnV0IGEgdHJhbnNpZW50XG4gKiBmYWlsdXJlICg0MjkgLyA1eHggLyBjb25uZWN0aW9uIHJlc2V0IC8gdGltZW91dCkgc2hvdWxkIG5vdCBzaWxlbnRseSBkcm9wIHRoZVxuICogcm93IG9uIHRoZSBmaXJzdCBhdHRlbXB0LiBFYWNoIGVtaXNzaW9uIGNhcnJpZXMgYSBzdGFibGUgcGVyLWV2ZW50XG4gKiBgSWRlbXBvdGVuY3ktS2V5YCAoc2VlIGByZWNvcmRgKSwgc28gdGhlIGh0dHAtY2xpZW50IHRyZWF0cyB0aGUgUE9TVCBhc1xuICogcmV0cnktc2FmZSBhbmQgdGhlIHBsYXRmb3JtIGNhbiBkZWR1cCBhIHJldHJpZWQgZGVsaXZlcnkgaW5zdGVhZCBvZiB3cml0aW5nIGFcbiAqIGR1cGxpY2F0ZSByb3cuIEJ1ZGdldCBpcyBrZXB0IHNtYWxsIHNvIGEgaGFyZC1kb3duIHBsYXRmb3JtIGNhbid0IGJhY2sgdGhlXG4gKiB3b3JrZXIgdXAgZm9yIGxvbmc6IGJhc2UgZGVsYXkgw5coMiByZXRyaWVzKSArIGEgY291cGxlIG9mIDQyOSBiYWNrb2Zmcy5cbiAqL1xuY29uc3QgQVVESVRfUkVRVUVTVF9PUFRJT05TOiBQaWNrPFJlcXVlc3RPcHRpb25zLCAnbWF4UmF0ZUxpbWl0UmV0cmllcycgfCAnbWF4UmV0cmllcyc+ID0ge1xuICBtYXhSYXRlTGltaXRSZXRyaWVzOiAyLFxuICBtYXhSZXRyaWVzOiAyLFxufTtcblxuLyoqXG4gKiBTdWJzZXQgb2YgcGxhdGZvcm0ncyBBdWRpdEFjdGlvbiBlbnVtIHRoYXQgbm9uLXBsYXRmb3JtIHNlcnZpY2VzIGVtaXQuXG4gKiBLZXB0IGluIHN5bmMgbWFudWFsbHkgd2l0aCBwbGF0Zm9ybS9zcmMvbW9kZWxzL2F1ZGl0LWV2ZW50LnRzOyBtaXNtYXRjaGVkXG4gKiBhY3Rpb25zIGFyZSByZWplY3RlZCBieSB0aGUgcGxhdGZvcm0gaW5nZXN0IGVuZHBvaW50ICg0MDApIHNvIGEgZHJpZnQgaXNcbiAqIHZpc2libGUgaW4gbG9ncyByYXRoZXIgdGhhbiBzaWxlbnRseSBkcm9wcGVkLlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVBdWRpdEFjdGlvbiA9XG4gIHwgJ3BsdWdpbi5idWlsZC5jb21wbGV0ZWQnXG4gIHwgJ3BsdWdpbi5idWlsZC5mYWlsZWQnXG4gIHwgJ3BsdWdpbi5idWlsZC50aW1lb3V0J1xuICAvLyBQbHVnaW4gbGlmZWN5Y2xlIG11dGF0aW9ucyAoYXBpL3BsdWdpbiByb3V0ZSBoYW5kbGVycykg4oCUIHRoZSBkZXN0cnVjdGl2ZSAvXG4gIC8vIHB1Ymxpc2hpbmcgc3VyZmFjZSB0aGF0IGJ1aWxkcyBhbHJlYWR5IGF1ZGl0J3MgY291bnRlcnBhcnQ6IHJlZ2lzdHJ5IGRlbGV0ZSxcbiAgLy8gc291cmNlIHVwbG9hZCwgYW5kIGRlcGxveS10by1jbHVzdGVyLiBgdGFyZ2V0SWRgIGlzIHRoZSBwbHVnaW4gaWQuXG4gIHwgJ3BsdWdpbi5kZWxldGUnXG4gIHwgJ3BsdWdpbi51cGxvYWQnXG4gIHwgJ3BsdWdpbi5kZXBsb3knXG4gIC8vIFBpcGVsaW5lIG11dGF0aW9ucyDigJQgZW1pdHRlZCBieSBhcGkvcGlwZWxpbmUncyByb3V0ZSBoYW5kbGVyc1xuICAvLyAoY3JlYXRlL3VwZGF0ZS9kZWxldGUgKyBDb2RlUGlwZWxpbmUgZXhlY3V0aW9uIHRyaWdnZXIvY2FuY2VsKSBhbmRcbiAgLy8gcG9zdGVkIHRvIHBsYXRmb3JtJ3MgYFBPU1QgL2F1ZGl0L2V2ZW50c2AgaW5nZXN0LlxuICB8ICdwaXBlbGluZS5jcmVhdGUnXG4gIHwgJ3BpcGVsaW5lLnVwZGF0ZSdcbiAgfCAncGlwZWxpbmUuZGVsZXRlJ1xuICB8ICdwaXBlbGluZS5leGVjdXRpb24uc3RhcnQnXG4gIHwgJ3BpcGVsaW5lLmV4ZWN1dGlvbi5jYW5jZWwnXG4gIC8vIFF1b3RhIGFkbWluaXN0cmF0aW9uIChhcGkvcXVvdGEpIOKAlCBhIHN1cGVyYWRtaW4gcmVzZXR0aW5nIGFuIG9yZydzIHVzYWdlXG4gIC8vIGNvdW50ZXIgb3IgZWRpdGluZyBpdHMgdGllciBsaW1pdHMuIGBhZmZlY3RlZE9yZ0lkYCBpcyB0aGUgb3JnIGNoYW5nZWQ7XG4gIC8vIGBkZXRhaWxzYCBjYXJyaWVzIHRoZSBxdW90YVR5cGUgKyBvbGQvbmV3IHZhbHVlLlxuICB8ICdxdW90YS5yZXNldCdcbiAgfCAncXVvdGEubGltaXQudXBkYXRlJ1xuICAvLyBDb21wbGlhbmNlIHJ1bGUgYWRtaW5pc3RyYXRpb24gKGFwaS9jb21wbGlhbmNlKSDigJQgYXBwcm92aW5nIGFuIGV4ZW1wdGlvblxuICAvLyByZXF1ZXN0LCB0b2dnbGluZyBhIHJ1bGUgYWN0aXZlL2luYWN0aXZlLCBvciBjYW5jZWxsaW5nIGEgcnVubmluZyBzY2FuLlxuICAvLyBgdGFyZ2V0SWRgIGlzIHRoZSBydWxlL2V4ZW1wdGlvbi9zY2FuIGlkLlxuICB8ICdjb21wbGlhbmNlLmV4ZW1wdGlvbi5hcHByb3ZlJ1xuICB8ICdjb21wbGlhbmNlLnJ1bGUudG9nZ2xlJ1xuICB8ICdjb21wbGlhbmNlLnNjYW4uY2FuY2VsJ1xuICAvLyBJbWFnZS1yZWdpc3RyeSBkZXN0cnVjdGl2ZSBvcHMgKGFwaS9pbWFnZS1yZWdpc3RyeSkg4oCUIGdhcmJhZ2UtY29sbGVjdGlvblxuICAvLyBzd2VlcHMgYW5kIGV4cGxpY2l0IGltYWdlL3RhZyBkZWxldGVzIChwcmV2aW91c2x5IG9ubHkgYSBsb2cgbGluZSkuXG4gIHwgJ3JlZ2lzdHJ5LmdjJ1xuICB8ICdyZWdpc3RyeS5pbWFnZS5kZWxldGUnXG4gIC8vIERlbmllZCBhdXRob3JpemF0aW9uIGF0dGVtcHQg4oCUIGVtaXR0ZWQgYmVzdC1lZmZvcnQgYnkgdGhlIHNoYXJlZFxuICAvLyBgcmVxdWlyZVBlcm1pc3Npb25gIC8gYHJlcXVpcmVTeXN0ZW1BZG1pbmAgZ2F0ZSB3aGVuIGEgc3RhdGUtY2hhbmdpbmdcbiAgLy8gKG5vbi1HRVQpIHJlcXVlc3QgaXMgcmVqZWN0ZWQsIHNvIHByb2JpbmcvZXNjYWxhdGlvbiBhdHRlbXB0cyBhcmUgdmlzaWJsZVxuICAvLyByYXRoZXIgdGhhbiBpbnZpc2libGUuIGBkZXRhaWxzYCBjYXJyaWVzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uICsgcGF0aDtcbiAgLy8gYG91dGNvbWVgIGlzICdmYWlsdXJlJy5cbiAgfCAnYXV0aHouZGVuaWVkJztcblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVBdWRpdEV2ZW50IHtcbiAgYWN0aW9uOiBSZW1vdGVBdWRpdEFjdGlvbjtcbiAgYWN0b3JJZDogc3RyaW5nO1xuICBhY3RvckVtYWlsPzogc3RyaW5nO1xuICBvcmdJZD86IHN0cmluZztcbiAgYWZmZWN0ZWRPcmdJZD86IHN0cmluZztcbiAgdGFyZ2V0VHlwZT86IHN0cmluZztcbiAgdGFyZ2V0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEaWQgdGhlIGF1ZGl0ZWQgYWN0aW9uIHN1Y2NlZWQgb3IgZmFpbD8gRGVmYXVsdHMgdG8gJ3N1Y2Nlc3MnIHdoZW4gb21pdHRlZFxuICAgKiAodGhlIHBsYXRmb3JtIGluZ2VzdCBhcHBsaWVzIHRoZSBzYW1lIGRlZmF1bHQpLiBEZW5pZWQtYXV0aHogZXZlbnRzIHNldFxuICAgKiAnZmFpbHVyZScgc28gYSByZXZpZXdlciBjYW4gZmlsdGVyIGF0dGVtcHRzIGZyb20gY29tcGxldGVkIGFjdGlvbnMuXG4gICAqL1xuICBvdXRjb21lPzogJ3N1Y2Nlc3MnIHwgJ2ZhaWx1cmUnO1xuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2xpZW50IGZvciBQT1NUaW5nIGF1ZGl0IGV2ZW50cyB0byB0aGUgcGxhdGZvcm0ncyBgL2F1ZGl0LWV2ZW50c2AgaW5nZXN0XG4gKiBlbmRwb2ludC4gTWludHMgYSBmcmVzaCBzZXJ2aWNlIHRva2VuIHBlciBjYWxsICg1IG1pbiBUVEwpICB0aGVyZSdzIG5vXG4gKiBtZWFuaW5nZnVsIGNhY2hpbmcgYmVuZWZpdCB3aGVuIGVtaXNzaW9ucyBhcmUgc3BhcnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgLyoqXG4gICAqIEZpcmUtYW5kLWZvcmdldCBhdWRpdCBlbWlzc2lvbi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhdCB3YXJuIGxldmVsIGJ1dFxuICAgKiBuZXZlciB0aHJvd24gIHRoZSBvcmlnaW5hdGluZyBhY3Rpb24gKGUuZy4gYSBwbHVnaW4gYnVpbGQpIGhhcyBpdHNcbiAgICogb3duIHN1Y2Nlc3MvZmFpbHVyZSBwYXRoIHRoYXQgc2hvdWxkbid0IGdldCBwb2xsdXRlZCBieSBhIGZsYWt5IGF1ZGl0XG4gICAqIGRvd25zdHJlYW0uXG4gICAqL1xuICByZWNvcmQoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSByZW1vdGUgYXVkaXQgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnIHtcbiAgLyoqIFBsYXRmb3JtIHNlcnZpY2UgaG9zdCAoZGVmYXVsdDogZW52IFBMQVRGT1JNX1NFUlZJQ0VfSE9TVCBvciAncGxhdGZvcm0nKSAqL1xuICBob3N0Pzogc3RyaW5nO1xuICAvKiogUGxhdGZvcm0gc2VydmljZSBwb3J0IChkZWZhdWx0OiBlbnYgUExBVEZPUk1fU0VSVklDRV9QT1JUIG9yIDMwMDApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgbXMgKGRlZmF1bHQgMzAwMCAgYXVkaXQgc2hvdWxkbid0IGJsb2NrIHRoZSB3b3JrZXIpLiAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBhIHJlbW90ZS1hdWRpdCBjbGllbnQgdGFyZ2V0ZWQgYXQgdGhlIHBsYXRmb3JtIHNlcnZpY2UuXG4gKlxuICogVXNlZCBieSBhcGkvcGx1Z2luJ3MgYnVpbGQgd29ya2VyIHRvIHB1c2ggYHBsdWdpbi5idWlsZC4qYCBldmVudHMgaW50b1xuICogdGhlIHBsYXRmb3JtJ3MgTW9uZ29EQiBgYXVkaXRfZXZlbnRzYCBjb2xsZWN0aW9uLiBPdGhlciBzZXJ2aWNlc1xuICogd2l0aCB3b3JrZXItc3R5bGUgZW1pdHRlcnMgY2FuIHVzZSB0aGUgc2FtZSBjbGllbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGF1ZGl0Q2xpZW50ID0gY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQoKTtcbiAqIGF1ZGl0Q2xpZW50LnJlY29yZCh7XG4gKiBhY3Rpb246ICdwbHVnaW4uYnVpbGQuY29tcGxldGVkJyxcbiAqIGFjdG9ySWQ6ICd1c2VyLTEyMycsXG4gKiBvcmdJZDogJ29yZy1hY21lJyxcbiAqIHRhcmdldFR5cGU6ICdwbHVnaW4nLFxuICogdGFyZ2V0SWQ6ICdwbHVnaW4tYWJjJyxcbiAqIGRldGFpbHM6IHsgbmFtZTogJ215LXBsdWdpbicsIHZlcnNpb246ICcxLjAuMCcgfSxcbiAqIH0sICdwbHVnaW4nKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQoY29uZmlnOiBSZW1vdGVBdWRpdENsaWVudENvbmZpZyA9IHt9KTogUmVtb3RlQXVkaXRDbGllbnQge1xuICBjb25zdCBzZXJ2aWNlQ29uZmlnOiBTZXJ2aWNlQ29uZmlnID0ge1xuICAgIGhvc3Q6IGNvbmZpZy5ob3N0ID8/IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFUlZJQ0VfSE9TVCA/PyAncGxhdGZvcm0nLFxuICAgIHBvcnQ6IGNvbmZpZy5wb3J0ID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFUlZJQ0VfUE9SVCA/PyAnMzAwMCcsIDEwKSxcbiAgICB0aW1lb3V0OiBjb25maWcudGltZW91dCA/PyAzMDAwLFxuICB9O1xuICBjb25zdCBjbGllbnQgPSBjcmVhdGVTYWZlQ2xpZW50KHNlcnZpY2VDb25maWcpO1xuXG4gIHJldHVybiB7XG4gICAgcmVjb3JkKGV2ZW50LCBzZXJ2aWNlTmFtZSkge1xuICAgICAgY29uc3QgYXV0aEhlYWRlciA9IGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWUsIG9yZ0lkOiBldmVudC5vcmdJZCwgcm9sZTogJ21lbWJlcicgfSk7XG4gICAgICAvLyBTdHJpcCB0aGUgYEJlYXJlciBgIHByZWZpeCBmb3IgSW50ZXJuYWxIdHRwQ2xpZW50ICBpdCBzZXRzIHRoZVxuICAgICAgLy8gQXV0aG9yaXphdGlvbiBoZWFkZXIgaXRzZWxmOyB0aGUgdmFsdWUgaGVyZSBpcyByYXcuXG4gICAgICAvLyBBIHN0YWJsZSBwZXItZW1pc3Npb24gSWRlbXBvdGVuY3ktS2V5IG1ha2VzIHRoaXMgbm9uLWlkZW1wb3RlbnQgUE9TVFxuICAgICAgLy8gcmV0cnktc2FmZSBpbiB0aGUgaHR0cC1jbGllbnQgKHNvIHRyYW5zaWVudCA1eHgvdGltZW91dC80MjkgYXJlIHJldHJpZWRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGRyb3BwZWQpIGFuZCBsZXRzIHRoZSBwbGF0Zm9ybSBpbmdlc3QgZGVkdXAgYSByZS1kZWxpdmVyZWRcbiAgICAgIC8vIGV2ZW50IGluc3RlYWQgb2Ygd3JpdGluZyBhIGR1cGxpY2F0ZSBhdWRpdCByb3cuIEdlbmVyYXRlZCBvbmNlIGhlcmUgc29cbiAgICAgIC8vIGV2ZXJ5IHJldHJ5IG9mIFRISVMgZW1pc3Npb24gcmV1c2VzIHRoZSBzYW1lIGtleS5cbiAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYXV0aEhlYWRlcixcbiAgICAgICAgJ0lkZW1wb3RlbmN5LUtleSc6IHJhbmRvbVVVSUQoKSxcbiAgICAgIH07XG4gICAgICAvLyBQYXRoIGlzIC9hdWRpdC9ldmVudHMgIHRoZSBwbGF0Zm9ybSBtb3VudHMgdGhlIGF1ZGl0IHJvdXRlciB1bmRlclxuICAgICAgLy8gL2F1ZGl0LCBhbmQgdGhlIGludGVybmFsIGluZ2VzdCBlbmRwb2ludCBsaXZlcyBhdCAvZXZlbnRzIHVuZGVyIHRoYXQuXG4gICAgICBjbGllbnQucG9zdCgnL2F1ZGl0L2V2ZW50cycsIGV2ZW50LCB7IGhlYWRlcnMsIC4uLkFVRElUX1JFUVVFU1RfT1BUSU9OUyB9KVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1JlbW90ZSBhdWRpdCBpbmdlc3Qgbm9uLW9rJywge1xuICAgICAgICAgICAgICBhY3Rpb246IGV2ZW50LmFjdGlvbiwgc3RhdHVzQ29kZTogcmVzcG9uc2U/LnN0YXR1c0NvZGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ1JlbW90ZSBhdWRpdCBpbmdlc3QgdGhyZXcnLCB7XG4gICAgICAgICAgICBhY3Rpb246IGV2ZW50LmFjdGlvbixcbiAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWF1ZGl0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZW1vdGUtYXVkaXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQStEO0lBQ3hGLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBNEZGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFNBQWtDLEVBQUU7SUFDMUUsTUFBTSxhQUFhLEdBQWtCO1FBQ25DLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksVUFBVTtRQUNwRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQzlFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUk7S0FDaEMsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRS9DLE9BQU87UUFDTCxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVc7WUFDdkIsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDN0Ysa0VBQWtFO1lBQ2xFLHlFQUF5RTtZQUN6RSwyRUFBMkU7WUFDM0UsdUVBQXVFO1lBQ3ZFLDBFQUEwRTtZQUMxRSx5RUFBeUU7WUFDekUseUVBQXlFO1lBQ3pFLG9EQUFvRDtZQUNwRCxNQUFNLE9BQU8sR0FBMkI7Z0JBQ3RDLGVBQWUsRUFBRSxVQUFVO2dCQUMzQixpQkFBaUIsRUFBRSxVQUFVLEVBQUU7YUFDaEMsQ0FBQztZQUNGLG9FQUFvRTtZQUNwRSx3RUFBd0U7WUFDeEUsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcscUJBQXFCLEVBQUUsQ0FBQztpQkFDdkUsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2pCLHNFQUFzRTtnQkFDdEUsa0VBQWtFO2dCQUNsRSxNQUFNLEVBQUUsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7Z0JBQy9FLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDUixNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFO3dCQUN4QyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVU7cUJBQ3ZELENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxDQUFDLEdBQVksRUFBRSxFQUFFO2dCQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFO29CQUN2QyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07b0JBQ3BCLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN2RCxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZVNhZmVDbGllbnQsIHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9hdXRoLmpzJztcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3JlbW90ZS1hdWRpdCcpO1xuXG4vKipcbiAqIEF1ZGl0IGluZ2VzdCBpcyBiZXN0LWVmZm9ydCBhbmQgTVVTVCBOT1QgYmxvY2sgdGhlIGNhbGxlciwgYnV0IGEgdHJhbnNpZW50XG4gKiBmYWlsdXJlICg0MjkgLyA1eHggLyBjb25uZWN0aW9uIHJlc2V0IC8gdGltZW91dCkgc2hvdWxkIG5vdCBzaWxlbnRseSBkcm9wIHRoZVxuICogcm93IG9uIHRoZSBmaXJzdCBhdHRlbXB0LiBFYWNoIGVtaXNzaW9uIGNhcnJpZXMgYSBzdGFibGUgcGVyLWV2ZW50XG4gKiBgSWRlbXBvdGVuY3ktS2V5YCAoc2VlIGByZWNvcmRgKSwgc28gdGhlIGh0dHAtY2xpZW50IHRyZWF0cyB0aGUgUE9TVCBhc1xuICogcmV0cnktc2FmZSBhbmQgdGhlIHBsYXRmb3JtIGNhbiBkZWR1cCBhIHJldHJpZWQgZGVsaXZlcnkgaW5zdGVhZCBvZiB3cml0aW5nIGFcbiAqIGR1cGxpY2F0ZSByb3cuIEJ1ZGdldCBpcyBrZXB0IHNtYWxsIHNvIGEgaGFyZC1kb3duIHBsYXRmb3JtIGNhbid0IGJhY2sgdGhlXG4gKiB3b3JrZXIgdXAgZm9yIGxvbmc6IGJhc2UgZGVsYXkgw5coMiByZXRyaWVzKSArIGEgY291cGxlIG9mIDQyOSBiYWNrb2Zmcy5cbiAqL1xuY29uc3QgQVVESVRfUkVRVUVTVF9PUFRJT05TOiBQaWNrPFJlcXVlc3RPcHRpb25zLCAnbWF4UmF0ZUxpbWl0UmV0cmllcycgfCAnbWF4UmV0cmllcyc+ID0ge1xuICBtYXhSYXRlTGltaXRSZXRyaWVzOiAyLFxuICBtYXhSZXRyaWVzOiAyLFxufTtcblxuLyoqXG4gKiBTdWJzZXQgb2YgcGxhdGZvcm0ncyBBdWRpdEFjdGlvbiBlbnVtIHRoYXQgbm9uLXBsYXRmb3JtIHNlcnZpY2VzIGVtaXQuXG4gKiBLZXB0IGluIHN5bmMgbWFudWFsbHkgd2l0aCBwbGF0Zm9ybS9zcmMvbW9kZWxzL2F1ZGl0LWV2ZW50LnRzOyBtaXNtYXRjaGVkXG4gKiBhY3Rpb25zIGFyZSByZWplY3RlZCBieSB0aGUgcGxhdGZvcm0gaW5nZXN0IGVuZHBvaW50ICg0MDApIHNvIGEgZHJpZnQgaXNcbiAqIHZpc2libGUgaW4gbG9ncyByYXRoZXIgdGhhbiBzaWxlbnRseSBkcm9wcGVkLlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVBdWRpdEFjdGlvbiA9XG4gIHwgJ3BsdWdpbi5idWlsZC5jb21wbGV0ZWQnXG4gIHwgJ3BsdWdpbi5idWlsZC5mYWlsZWQnXG4gIHwgJ3BsdWdpbi5idWlsZC50aW1lb3V0J1xuICAvLyBQbHVnaW4gbGlmZWN5Y2xlIG11dGF0aW9ucyAoYXBpL3BsdWdpbiByb3V0ZSBoYW5kbGVycykg4oCUIHRoZSBkZXN0cnVjdGl2ZSAvXG4gIC8vIHB1Ymxpc2hpbmcgc3VyZmFjZSB0aGF0IGJ1aWxkcyBhbHJlYWR5IGF1ZGl0J3MgY291bnRlcnBhcnQ6IHJlZ2lzdHJ5IGRlbGV0ZSxcbiAgLy8gc291cmNlIHVwbG9hZCwgYW5kIGRlcGxveS10by1jbHVzdGVyLiBgdGFyZ2V0SWRgIGlzIHRoZSBwbHVnaW4gaWQuXG4gIHwgJ3BsdWdpbi5kZWxldGUnXG4gIHwgJ3BsdWdpbi51cGxvYWQnXG4gIHwgJ3BsdWdpbi5kZXBsb3knXG4gIC8vIFBpcGVsaW5lIG11dGF0aW9ucyDigJQgZW1pdHRlZCBieSBhcGkvcGlwZWxpbmUncyByb3V0ZSBoYW5kbGVyc1xuICAvLyAoY3JlYXRlL3VwZGF0ZS9kZWxldGUgKyBDb2RlUGlwZWxpbmUgZXhlY3V0aW9uIHRyaWdnZXIvY2FuY2VsKSBhbmRcbiAgLy8gcG9zdGVkIHRvIHBsYXRmb3JtJ3MgYFBPU1QgL2F1ZGl0L2V2ZW50c2AgaW5nZXN0LlxuICB8ICdwaXBlbGluZS5jcmVhdGUnXG4gIHwgJ3BpcGVsaW5lLnVwZGF0ZSdcbiAgfCAncGlwZWxpbmUuZGVsZXRlJ1xuICB8ICdwaXBlbGluZS5leGVjdXRpb24uc3RhcnQnXG4gIHwgJ3BpcGVsaW5lLmV4ZWN1dGlvbi5jYW5jZWwnXG4gIC8vIFF1b3RhIGFkbWluaXN0cmF0aW9uIChhcGkvcXVvdGEpIOKAlCBhIHN1cGVyYWRtaW4gcmVzZXR0aW5nIGFuIG9yZydzIHVzYWdlXG4gIC8vIGNvdW50ZXIgb3IgZWRpdGluZyBpdHMgdGllciBsaW1pdHMuIGBhZmZlY3RlZE9yZ0lkYCBpcyB0aGUgb3JnIGNoYW5nZWQ7XG4gIC8vIGBkZXRhaWxzYCBjYXJyaWVzIHRoZSBxdW90YVR5cGUgKyBvbGQvbmV3IHZhbHVlLlxuICB8ICdxdW90YS5yZXNldCdcbiAgfCAncXVvdGEubGltaXQudXBkYXRlJ1xuICAvLyBDb21wbGlhbmNlIHJ1bGUgYWRtaW5pc3RyYXRpb24gKGFwaS9jb21wbGlhbmNlKSDigJQgYXBwcm92aW5nIGFuIGV4ZW1wdGlvblxuICAvLyByZXF1ZXN0LCB0b2dnbGluZyBhIHJ1bGUgYWN0aXZlL2luYWN0aXZlLCBvciBjYW5jZWxsaW5nIGEgcnVubmluZyBzY2FuLlxuICAvLyBgdGFyZ2V0SWRgIGlzIHRoZSBydWxlL2V4ZW1wdGlvbi9zY2FuIGlkLlxuICB8ICdjb21wbGlhbmNlLmV4ZW1wdGlvbi5hcHByb3ZlJ1xuICB8ICdjb21wbGlhbmNlLnJ1bGUudG9nZ2xlJ1xuICB8ICdjb21wbGlhbmNlLnNjYW4uY2FuY2VsJ1xuICAvLyBJbWFnZS1yZWdpc3RyeSBkZXN0cnVjdGl2ZSBvcHMgKGFwaS9pbWFnZS1yZWdpc3RyeSkg4oCUIGdhcmJhZ2UtY29sbGVjdGlvblxuICAvLyBzd2VlcHMgYW5kIGV4cGxpY2l0IGltYWdlL3RhZyBkZWxldGVzIChwcmV2aW91c2x5IG9ubHkgYSBsb2cgbGluZSkuXG4gIHwgJ3JlZ2lzdHJ5LmdjJ1xuICB8ICdyZWdpc3RyeS5pbWFnZS5kZWxldGUnXG4gIC8vIERlbmllZCBhdXRob3JpemF0aW9uIGF0dGVtcHQg4oCUIGVtaXR0ZWQgYmVzdC1lZmZvcnQgYnkgdGhlIHNoYXJlZFxuICAvLyBgcmVxdWlyZVBlcm1pc3Npb25gIC8gYHJlcXVpcmVTeXN0ZW1BZG1pbmAgZ2F0ZSB3aGVuIGEgc3RhdGUtY2hhbmdpbmdcbiAgLy8gKG5vbi1HRVQpIHJlcXVlc3QgaXMgcmVqZWN0ZWQsIHNvIHByb2JpbmcvZXNjYWxhdGlvbiBhdHRlbXB0cyBhcmUgdmlzaWJsZVxuICAvLyByYXRoZXIgdGhhbiBpbnZpc2libGUuIGBkZXRhaWxzYCBjYXJyaWVzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uICsgcGF0aDtcbiAgLy8gYG91dGNvbWVgIGlzICdmYWlsdXJlJy5cbiAgfCAnYXV0aHouZGVuaWVkJztcblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVBdWRpdEV2ZW50IHtcbiAgYWN0aW9uOiBSZW1vdGVBdWRpdEFjdGlvbjtcbiAgYWN0b3JJZDogc3RyaW5nO1xuICBhY3RvckVtYWlsPzogc3RyaW5nO1xuICBvcmdJZD86IHN0cmluZztcbiAgYWZmZWN0ZWRPcmdJZD86IHN0cmluZztcbiAgdGFyZ2V0VHlwZT86IHN0cmluZztcbiAgdGFyZ2V0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEaWQgdGhlIGF1ZGl0ZWQgYWN0aW9uIHN1Y2NlZWQgb3IgZmFpbD8gRGVmYXVsdHMgdG8gJ3N1Y2Nlc3MnIHdoZW4gb21pdHRlZFxuICAgKiAodGhlIHBsYXRmb3JtIGluZ2VzdCBhcHBsaWVzIHRoZSBzYW1lIGRlZmF1bHQpLiBEZW5pZWQtYXV0aHogZXZlbnRzIHNldFxuICAgKiAnZmFpbHVyZScgc28gYSByZXZpZXdlciBjYW4gZmlsdGVyIGF0dGVtcHRzIGZyb20gY29tcGxldGVkIGFjdGlvbnMuXG4gICAqL1xuICBvdXRjb21lPzogJ3N1Y2Nlc3MnIHwgJ2ZhaWx1cmUnO1xuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2xpZW50IGZvciBQT1NUaW5nIGF1ZGl0IGV2ZW50cyB0byB0aGUgcGxhdGZvcm0ncyBgL2F1ZGl0LWV2ZW50c2AgaW5nZXN0XG4gKiBlbmRwb2ludC4gTWludHMgYSBmcmVzaCBzZXJ2aWNlIHRva2VuIHBlciBjYWxsICg1IG1pbiBUVEwpICB0aGVyZSdzIG5vXG4gKiBtZWFuaW5nZnVsIGNhY2hpbmcgYmVuZWZpdCB3aGVuIGVtaXNzaW9ucyBhcmUgc3BhcnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgLyoqXG4gICAqIEZpcmUtYW5kLWZvcmdldCBhdWRpdCBlbWlzc2lvbi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhdCB3YXJuIGxldmVsIGJ1dFxuICAgKiBuZXZlciB0aHJvd24gIHRoZSBvcmlnaW5hdGluZyBhY3Rpb24gKGUuZy4gYSBwbHVnaW4gYnVpbGQpIGhhcyBpdHNcbiAgICogb3duIHN1Y2Nlc3MvZmFpbHVyZSBwYXRoIHRoYXQgc2hvdWxkbid0IGdldCBwb2xsdXRlZCBieSBhIGZsYWt5IGF1ZGl0XG4gICAqIGRvd25zdHJlYW0uXG4gICAqL1xuICByZWNvcmQoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSByZW1vdGUgYXVkaXQgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnIHtcbiAgLyoqIFBsYXRmb3JtIHNlcnZpY2UgaG9zdCAoZGVmYXVsdDogZW52IFBMQVRGT1JNX1NFUlZJQ0VfSE9TVCBvciAncGxhdGZvcm0nKSAqL1xuICBob3N0Pzogc3RyaW5nO1xuICAvKiogUGxhdGZvcm0gc2VydmljZSBwb3J0IChkZWZhdWx0OiBlbnYgUExBVEZPUk1fU0VSVklDRV9QT1JUIG9yIDMwMDApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgbXMgKGRlZmF1bHQgMzAwMCAgYXVkaXQgc2hvdWxkbid0IGJsb2NrIHRoZSB3b3JrZXIpLiAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBhIHJlbW90ZS1hdWRpdCBjbGllbnQgdGFyZ2V0ZWQgYXQgdGhlIHBsYXRmb3JtIHNlcnZpY2UuXG4gKlxuICogVXNlZCBieSBhcGkvcGx1Z2luJ3MgYnVpbGQgd29ya2VyIHRvIHB1c2ggYHBsdWdpbi5idWlsZC4qYCBldmVudHMgaW50b1xuICogdGhlIHBsYXRmb3JtJ3MgTW9uZ29EQiBgYXVkaXRfZXZlbnRzYCBjb2xsZWN0aW9uLiBPdGhlciBzZXJ2aWNlc1xuICogd2l0aCB3b3JrZXItc3R5bGUgZW1pdHRlcnMgY2FuIHVzZSB0aGUgc2FtZSBjbGllbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGF1ZGl0Q2xpZW50ID0gY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQoKTtcbiAqIGF1ZGl0Q2xpZW50LnJlY29yZCh7XG4gKiBhY3Rpb246ICdwbHVnaW4uYnVpbGQuY29tcGxldGVkJyxcbiAqIGFjdG9ySWQ6ICd1c2VyLTEyMycsXG4gKiBvcmdJZDogJ29yZy1hY21lJyxcbiAqIHRhcmdldFR5cGU6ICdwbHVnaW4nLFxuICogdGFyZ2V0SWQ6ICdwbHVnaW4tYWJjJyxcbiAqIGRldGFpbHM6IHsgbmFtZTogJ215LXBsdWdpbicsIHZlcnNpb246ICcxLjAuMCcgfSxcbiAqIH0sICdwbHVnaW4nKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQoY29uZmlnOiBSZW1vdGVBdWRpdENsaWVudENvbmZpZyA9IHt9KTogUmVtb3RlQXVkaXRDbGllbnQge1xuICBjb25zdCBzZXJ2aWNlQ29uZmlnOiBTZXJ2aWNlQ29uZmlnID0ge1xuICAgIGhvc3Q6IGNvbmZpZy5ob3N0ID8/IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFUlZJQ0VfSE9TVCA/PyAncGxhdGZvcm0nLFxuICAgIHBvcnQ6IGNvbmZpZy5wb3J0ID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFUlZJQ0VfUE9SVCA/PyAnMzAwMCcsIDEwKSxcbiAgICB0aW1lb3V0OiBjb25maWcudGltZW91dCA/PyAzMDAwLFxuICB9O1xuICBjb25zdCBjbGllbnQgPSBjcmVhdGVTYWZlQ2xpZW50KHNlcnZpY2VDb25maWcpO1xuXG4gIHJldHVybiB7XG4gICAgcmVjb3JkKGV2ZW50LCBzZXJ2aWNlTmFtZSkge1xuICAgICAgY29uc3QgYXV0aEhlYWRlciA9IGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWUsIG9yZ0lkOiBldmVudC5vcmdJZCwgcm9sZTogJ21lbWJlcicgfSk7XG4gICAgICAvLyBnZXRTZXJ2aWNlQXV0aEhlYWRlciByZXR1cm5zIGEgZnVsbCBgQmVhcmVyIDx0b2tlbj5gIHZhbHVlOyB0aGVcbiAgICAgIC8vIGh0dHAtY2xpZW50IGZvcndhcmRzIHJlcXVlc3QgaGVhZGVycyBhcy1pcyAoaXQgZG9lcyBOT1QgaW5qZWN0IGl0cyBvd25cbiAgICAgIC8vIEF1dGhvcml6YXRpb24pLCBzbyBwYXNzIGl0IHN0cmFpZ2h0IHRocm91Z2ggYXMgdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyLlxuICAgICAgLy8gQSBzdGFibGUgcGVyLWVtaXNzaW9uIElkZW1wb3RlbmN5LUtleSBtYWtlcyB0aGlzIG5vbi1pZGVtcG90ZW50IFBPU1RcbiAgICAgIC8vIHJldHJ5LXNhZmUgaW4gdGhlIGh0dHAtY2xpZW50IChzbyB0cmFuc2llbnQgNXh4L3RpbWVvdXQvNDI5IGFyZSByZXRyaWVkXG4gICAgICAvLyByYXRoZXIgdGhhbiBkcm9wcGVkKSBhbmQgbGV0cyB0aGUgcGxhdGZvcm0gaW5nZXN0IGRlZHVwIGEgcmUtZGVsaXZlcmVkXG4gICAgICAvLyBldmVudCBpbnN0ZWFkIG9mIHdyaXRpbmcgYSBkdXBsaWNhdGUgYXVkaXQgcm93LiBHZW5lcmF0ZWQgb25jZSBoZXJlIHNvXG4gICAgICAvLyBldmVyeSByZXRyeSBvZiBUSElTIGVtaXNzaW9uIHJldXNlcyB0aGUgc2FtZSBrZXkuXG4gICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGF1dGhIZWFkZXIsXG4gICAgICAgICdJZGVtcG90ZW5jeS1LZXknOiByYW5kb21VVUlEKCksXG4gICAgICB9O1xuICAgICAgLy8gUGF0aCBpcyAvYXVkaXQvZXZlbnRzICB0aGUgcGxhdGZvcm0gbW91bnRzIHRoZSBhdWRpdCByb3V0ZXIgdW5kZXJcbiAgICAgIC8vIC9hdWRpdCwgYW5kIHRoZSBpbnRlcm5hbCBpbmdlc3QgZW5kcG9pbnQgbGl2ZXMgYXQgL2V2ZW50cyB1bmRlciB0aGF0LlxuICAgICAgY2xpZW50LnBvc3QoJy9hdWRpdC9ldmVudHMnLCBldmVudCwgeyBoZWFkZXJzLCAuLi5BVURJVF9SRVFVRVNUX09QVElPTlMgfSlcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgLy8gQW55IDJ4eCBpcyBhbiBhY2NlcHQgKHRoZSBpbmdlc3QgcmV0dXJucyAyMDAgdG9kYXksIGJ1dCAyMDEvMjAyLzIwNFxuICAgICAgICAgIC8vIGFyZSBlcXVhbGx5IFwic3RvcmVkXCIpOyBvbmx5IGEgbm9uLTJ4eCAvIG1pc3NpbmcgcmVzcG9uc2Ugd2FybnMuXG4gICAgICAgICAgY29uc3Qgb2sgPSByZXNwb25zZSAmJiByZXNwb25zZS5zdGF0dXNDb2RlID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXNDb2RlIDwgMzAwO1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdSZW1vdGUgYXVkaXQgaW5nZXN0IG5vbi1vaycsIHtcbiAgICAgICAgICAgICAgYWN0aW9uOiBldmVudC5hY3Rpb24sIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdSZW1vdGUgYXVkaXQgaW5nZXN0IHRocmV3Jywge1xuICAgICAgICAgICAgYWN0aW9uOiBldmVudC5hY3Rpb24sXG4gICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZTogU3RyaW5nKGVyciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -28,10 +28,14 @@ export function createRedisTokenRevocationStore(redis) {
28
28
  async getCurrentVersion(userId) {
29
29
  try {
30
30
  const raw = await redis.get(tokenRevocationKey(userId));
31
- if (raw === null || raw === undefined)
31
+ if (raw === null || raw === undefined || raw.trim() === '')
32
32
  return null;
33
- const n = Number.parseInt(raw, 10);
34
- return Number.isFinite(n) ? n : null;
33
+ // Strict integer parse: `Number` (unlike `parseInt`) rejects trailing
34
+ // garbage ("5abc" → NaN), so a corrupted entry fails open (null → "not
35
+ // revoked") rather than being read as a bogus version. The empty-string
36
+ // guard above matters because `Number('')` is 0, not NaN.
37
+ const n = Number(raw);
38
+ return Number.isInteger(n) ? n : null;
35
39
  }
36
40
  catch (err) {
37
41
  logger.debug('Token-revocation read failed (fail-open)', {
@@ -67,4 +71,4 @@ export async function publishTokenRevocation(redis, userId, tokenVersion, ttlSec
67
71
  });
68
72
  }
69
73
  }
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tcmV2b2NhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy90b2tlbi1yZXZvY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFJdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBRWhEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLGFBQWEsQ0FBQztBQUV6RCx3Q0FBd0M7QUFDeEMsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQWM7SUFDL0MsT0FBTyxHQUFHLDJCQUEyQixHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ25ELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxLQUF1QjtJQUNyRSxPQUFPO1FBQ0wsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQWM7WUFDcEMsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLFNBQVM7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNuQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3ZDLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsMENBQTBDLEVBQUU7b0JBQ3ZELE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztpQkFDaEUsQ0FBQyxDQUFDO2dCQUNILE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxLQUF1QixFQUN2QixNQUFjLEVBQ2QsWUFBb0IsRUFDcEIsVUFBa0I7SUFFbEIsSUFBSSxDQUFDO1FBQ0gsOERBQThEO1FBQzlELE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9HLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxzRUFBc0UsRUFBRTtZQUNsRixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7U0FDaEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBSZWRpc0NhY2hlQ2xpZW50IH0gZnJvbSAnLi9jYWNoZS1zZXJ2aWNlLmpzJztcbmltcG9ydCB0eXBlIHsgVG9rZW5SZXZvY2F0aW9uU3RvcmUgfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCd0b2tlbi1yZXZvY2F0aW9uJyk7XG5cbi8qKlxuICogUmVkaXMga2V5IG5hbWVzcGFjZSBmb3IgdGhlIHBlci11c2VyIGN1cnJlbnQgYHRva2VuVmVyc2lvbmAuIFRoZSBwbGF0Zm9ybVxuICogUFVCTElTSEVTIHRvIHRoaXMga2V5IG9uIGV2ZXJ5IHByaXZpbGVnZSBjaGFuZ2U7IHRoZSBzdGF0ZWxlc3Mgc2VydmljZXMgUkVBRFxuICogaXQgaW4gYHJlcXVpcmVBdXRoYCAodmlhIHtAbGluayBjcmVhdGVSZWRpc1Rva2VuUmV2b2NhdGlvblN0b3JlfSkgdG8gcmVqZWN0XG4gKiB0b2tlbnMgbWludGVkIGJlZm9yZSB0aGF0IGNoYW5nZS4gUHVibGlzaGVyIGFuZCByZWFkZXJzIE1VU1Qgc2hhcmUgdGhpcyBleGFjdFxuICogcHJlZml4IOKAlCBoZW5jZSBib3RoIGhlbHBlcnMgbGl2ZSBoZXJlLCBpbiBvbmUgcGxhY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBUT0tFTl9SRVZPQ0FUSU9OX0tFWV9QUkVGSVggPSAnYXV0aHJldjp0djonO1xuXG4vKiogVGhlIHJldm9jYXRpb24ga2V5IGZvciBhIHVzZXIgaWQuICovXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5SZXZvY2F0aW9uS2V5KHVzZXJJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke1RPS0VOX1JFVk9DQVRJT05fS0VZX1BSRUZJWH0ke3VzZXJJZH1gO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEge0BsaW5rIFRva2VuUmV2b2NhdGlvblN0b3JlfSBiYWNrZWQgYnkgYSBSZWRpcyBjbGllbnQsIGZvciBhIHN0YXRlbGVzc1xuICogc2VydmljZSB0byByZWdpc3RlciB2aWEgYHNldFRva2VuUmV2b2NhdGlvblN0b3JlYC4gUmVhZHMgdGhlIGN1cnJlbnRcbiAqIGB0b2tlblZlcnNpb25gIHRoZSBwbGF0Zm9ybSBwdWJsaXNoZWQgZm9yIHRoZSB1c2VyLlxuICpcbiAqIEZhaWwtb3BlbiBieSBjb250cmFjdDogYSBtaXNzLCBhIHBhcnNlIGZhaWx1cmUsIG9yIGEgUmVkaXMgZXJyb3IgYWxsIHlpZWxkXG4gKiBgbnVsbGAgKOKAlCBgcmVxdWlyZUF1dGhgIHRyZWF0cyB0aGF0IGFzIFwibm8ga25vd24gcmV2b2NhdGlvblwiKSwgc28gYSBSZWRpc1xuICogb3V0YWdlIGRlZ3JhZGVzIHRvIHRoZSBwcmUtZXhpc3RpbmcgYmVoYXZpb3VyIHJhdGhlciB0aGFuIGxvY2tpbmcgdXNlcnMgb3V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNUb2tlblJldm9jYXRpb25TdG9yZShyZWRpczogUmVkaXNDYWNoZUNsaWVudCk6IFRva2VuUmV2b2NhdGlvblN0b3JlIHtcbiAgcmV0dXJuIHtcbiAgICBhc3luYyBnZXRDdXJyZW50VmVyc2lvbih1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgcmVkaXMuZ2V0KHRva2VuUmV2b2NhdGlvbktleSh1c2VySWQpKTtcbiAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IG4gPSBOdW1iZXIucGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobikgPyBuIDogbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1Rva2VuLXJldm9jYXRpb24gcmVhZCBmYWlsZWQgKGZhaWwtb3BlbiknLCB7XG4gICAgICAgICAgdXNlcklkLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoIGEgdXNlcidzIGN1cnJlbnQgYHRva2VuVmVyc2lvbmAgc28gdGhlIHN0YXRlbGVzcyBzZXJ2aWNlcyBzZWUgdGhlXG4gKiByZXZvY2F0aW9uIGltbWVkaWF0ZWx5IChwbGF0Zm9ybSBzaWRlKS4gQmVzdC1lZmZvcnQg4oCUIG5ldmVyIHRocm93czsgYSBmYWlsdXJlXG4gKiBqdXN0IG1lYW5zIHRoZSBzZXJ2aWNlcyBmYWxsIGJhY2sgdG8gbmF0dXJhbCB0b2tlbiBleHBpcnkgZm9yIHRoaXMgY2hhbmdlLlxuICpcbiAqIFRoZSBrZXkgaXMgd3JpdHRlbiB3aXRoIGEgVFRMIGVxdWFsIHRvIHRoZSBhY2Nlc3MtdG9rZW4gbGlmZXRpbWU6IGFueSB0b2tlblxuICogdGhhdCBjb3VsZCBzdGlsbCBjYXJyeSBhbiBvbGRlciB2ZXJzaW9uIGhhcyBleHBpcmVkIGJ5IHRoZSB0aW1lIHRoZSBlbnRyeVxuICogbGFwc2VzLCBzbyBhbiBleHBpcmVkIGVudHJ5IGNhbiBuZXZlciBjYXVzZSBhIGZhbHNlIFwicmV2b2tlZFwiIG5vciBhIG1pc3NlZCBvbmUuXG4gKlxuICogQHBhcmFtIHJlZGlzIC0gdGhlIHBsYXRmb3JtJ3MgUmVkaXMgY2xpZW50XG4gKiBAcGFyYW0gdXNlcklkIC0gdGhlIHVzZXIgd2hvc2Ugc2Vzc2lvbnMgY2hhbmdlZFxuICogQHBhcmFtIHRva2VuVmVyc2lvbiAtIHRoZSB1c2VyJ3MgTkVXIChwb3N0LWluY3JlbWVudCkgdG9rZW5WZXJzaW9uXG4gKiBAcGFyYW0gdHRsU2Vjb25kcyAtIGFjY2Vzcy10b2tlbiBsaWZldGltZSBpbiBzZWNvbmRzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoVG9rZW5SZXZvY2F0aW9uKFxuICByZWRpczogUmVkaXNDYWNoZUNsaWVudCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHRva2VuVmVyc2lvbjogbnVtYmVyLFxuICB0dGxTZWNvbmRzOiBudW1iZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBpb3JlZGlzLXN0eWxlIHZhcmlhZGljIFNFVCB3aXRoIGV4cGlyeTogU0VUIGtleSB2YWwgRVggdHRsLlxuICAgIGF3YWl0IHJlZGlzLnNldCh0b2tlblJldm9jYXRpb25LZXkodXNlcklkKSwgU3RyaW5nKHRva2VuVmVyc2lvbiksICdFWCcsIE1hdGgubWF4KDEsIE1hdGguZmxvb3IodHRsU2Vjb25kcykpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1Rva2VuLXJldm9jYXRpb24gcHVibGlzaCBmYWlsZWQgKHNlcnZpY2VzIGZhbGwgYmFjayB0byB0b2tlbiBleHBpcnkpJywge1xuICAgICAgdXNlcklkLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tcmV2b2NhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy90b2tlbi1yZXZvY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFJdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBRWhEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLGFBQWEsQ0FBQztBQUV6RCx3Q0FBd0M7QUFDeEMsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQWM7SUFDL0MsT0FBTyxHQUFHLDJCQUEyQixHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ25ELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxLQUF1QjtJQUNyRSxPQUFPO1FBQ0wsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQWM7WUFDcEMsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDeEUsc0VBQXNFO2dCQUN0RSx1RUFBdUU7Z0JBQ3ZFLHdFQUF3RTtnQkFDeEUsMERBQTBEO2dCQUMxRCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDeEMsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsRUFBRTtvQkFDdkQsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUNoRSxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsc0JBQXNCLENBQzFDLEtBQXVCLEVBQ3ZCLE1BQWMsRUFDZCxZQUFvQixFQUNwQixVQUFrQjtJQUVsQixJQUFJLENBQUM7UUFDSCw4REFBOEQ7UUFDOUQsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0csQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLHNFQUFzRSxFQUFFO1lBQ2xGLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztTQUNoRSxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFJlZGlzQ2FjaGVDbGllbnQgfSBmcm9tICcuL2NhY2hlLXNlcnZpY2UuanMnO1xuaW1wb3J0IHR5cGUgeyBUb2tlblJldm9jYXRpb25TdG9yZSB9IGZyb20gJy4uL21pZGRsZXdhcmUvYXV0aC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3Rva2VuLXJldm9jYXRpb24nKTtcblxuLyoqXG4gKiBSZWRpcyBrZXkgbmFtZXNwYWNlIGZvciB0aGUgcGVyLXVzZXIgY3VycmVudCBgdG9rZW5WZXJzaW9uYC4gVGhlIHBsYXRmb3JtXG4gKiBQVUJMSVNIRVMgdG8gdGhpcyBrZXkgb24gZXZlcnkgcHJpdmlsZWdlIGNoYW5nZTsgdGhlIHN0YXRlbGVzcyBzZXJ2aWNlcyBSRUFEXG4gKiBpdCBpbiBgcmVxdWlyZUF1dGhgICh2aWEge0BsaW5rIGNyZWF0ZVJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmV9KSB0byByZWplY3RcbiAqIHRva2VucyBtaW50ZWQgYmVmb3JlIHRoYXQgY2hhbmdlLiBQdWJsaXNoZXIgYW5kIHJlYWRlcnMgTVVTVCBzaGFyZSB0aGlzIGV4YWN0XG4gKiBwcmVmaXgg4oCUIGhlbmNlIGJvdGggaGVscGVycyBsaXZlIGhlcmUsIGluIG9uZSBwbGFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRPS0VOX1JFVk9DQVRJT05fS0VZX1BSRUZJWCA9ICdhdXRocmV2OnR2Oic7XG5cbi8qKiBUaGUgcmV2b2NhdGlvbiBrZXkgZm9yIGEgdXNlciBpZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2tlblJldm9jYXRpb25LZXkodXNlcklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7VE9LRU5fUkVWT0NBVElPTl9LRVlfUFJFRklYfSR7dXNlcklkfWA7XG59XG5cbi8qKlxuICogQnVpbGQgYSB7QGxpbmsgVG9rZW5SZXZvY2F0aW9uU3RvcmV9IGJhY2tlZCBieSBhIFJlZGlzIGNsaWVudCwgZm9yIGEgc3RhdGVsZXNzXG4gKiBzZXJ2aWNlIHRvIHJlZ2lzdGVyIHZpYSBgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmVgLiBSZWFkcyB0aGUgY3VycmVudFxuICogYHRva2VuVmVyc2lvbmAgdGhlIHBsYXRmb3JtIHB1Ymxpc2hlZCBmb3IgdGhlIHVzZXIuXG4gKlxuICogRmFpbC1vcGVuIGJ5IGNvbnRyYWN0OiBhIG1pc3MsIGEgcGFyc2UgZmFpbHVyZSwgb3IgYSBSZWRpcyBlcnJvciBhbGwgeWllbGRcbiAqIGBudWxsYCAo4oCUIGByZXF1aXJlQXV0aGAgdHJlYXRzIHRoYXQgYXMgXCJubyBrbm93biByZXZvY2F0aW9uXCIpLCBzbyBhIFJlZGlzXG4gKiBvdXRhZ2UgZGVncmFkZXMgdG8gdGhlIHByZS1leGlzdGluZyBiZWhhdmlvdXIgcmF0aGVyIHRoYW4gbG9ja2luZyB1c2VycyBvdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWRpc1Rva2VuUmV2b2NhdGlvblN0b3JlKHJlZGlzOiBSZWRpc0NhY2hlQ2xpZW50KTogVG9rZW5SZXZvY2F0aW9uU3RvcmUge1xuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldEN1cnJlbnRWZXJzaW9uKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5nZXQodG9rZW5SZXZvY2F0aW9uS2V5KHVzZXJJZCkpO1xuICAgICAgICBpZiAocmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdy50cmltKCkgPT09ICcnKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gU3RyaWN0IGludGVnZXIgcGFyc2U6IGBOdW1iZXJgICh1bmxpa2UgYHBhcnNlSW50YCkgcmVqZWN0cyB0cmFpbGluZ1xuICAgICAgICAvLyBnYXJiYWdlIChcIjVhYmNcIiDihpIgTmFOKSwgc28gYSBjb3JydXB0ZWQgZW50cnkgZmFpbHMgb3BlbiAobnVsbCDihpIgXCJub3RcbiAgICAgICAgLy8gcmV2b2tlZFwiKSByYXRoZXIgdGhhbiBiZWluZyByZWFkIGFzIGEgYm9ndXMgdmVyc2lvbi4gVGhlIGVtcHR5LXN0cmluZ1xuICAgICAgICAvLyBndWFyZCBhYm92ZSBtYXR0ZXJzIGJlY2F1c2UgYE51bWJlcignJylgIGlzIDAsIG5vdCBOYU4uXG4gICAgICAgIGNvbnN0IG4gPSBOdW1iZXIocmF3KTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobikgPyBuIDogbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1Rva2VuLXJldm9jYXRpb24gcmVhZCBmYWlsZWQgKGZhaWwtb3BlbiknLCB7XG4gICAgICAgICAgdXNlcklkLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoIGEgdXNlcidzIGN1cnJlbnQgYHRva2VuVmVyc2lvbmAgc28gdGhlIHN0YXRlbGVzcyBzZXJ2aWNlcyBzZWUgdGhlXG4gKiByZXZvY2F0aW9uIGltbWVkaWF0ZWx5IChwbGF0Zm9ybSBzaWRlKS4gQmVzdC1lZmZvcnQg4oCUIG5ldmVyIHRocm93czsgYSBmYWlsdXJlXG4gKiBqdXN0IG1lYW5zIHRoZSBzZXJ2aWNlcyBmYWxsIGJhY2sgdG8gbmF0dXJhbCB0b2tlbiBleHBpcnkgZm9yIHRoaXMgY2hhbmdlLlxuICpcbiAqIFRoZSBrZXkgaXMgd3JpdHRlbiB3aXRoIGEgVFRMIGVxdWFsIHRvIHRoZSBhY2Nlc3MtdG9rZW4gbGlmZXRpbWU6IGFueSB0b2tlblxuICogdGhhdCBjb3VsZCBzdGlsbCBjYXJyeSBhbiBvbGRlciB2ZXJzaW9uIGhhcyBleHBpcmVkIGJ5IHRoZSB0aW1lIHRoZSBlbnRyeVxuICogbGFwc2VzLCBzbyBhbiBleHBpcmVkIGVudHJ5IGNhbiBuZXZlciBjYXVzZSBhIGZhbHNlIFwicmV2b2tlZFwiIG5vciBhIG1pc3NlZCBvbmUuXG4gKlxuICogQHBhcmFtIHJlZGlzIC0gdGhlIHBsYXRmb3JtJ3MgUmVkaXMgY2xpZW50XG4gKiBAcGFyYW0gdXNlcklkIC0gdGhlIHVzZXIgd2hvc2Ugc2Vzc2lvbnMgY2hhbmdlZFxuICogQHBhcmFtIHRva2VuVmVyc2lvbiAtIHRoZSB1c2VyJ3MgTkVXIChwb3N0LWluY3JlbWVudCkgdG9rZW5WZXJzaW9uXG4gKiBAcGFyYW0gdHRsU2Vjb25kcyAtIGFjY2Vzcy10b2tlbiBsaWZldGltZSBpbiBzZWNvbmRzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoVG9rZW5SZXZvY2F0aW9uKFxuICByZWRpczogUmVkaXNDYWNoZUNsaWVudCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHRva2VuVmVyc2lvbjogbnVtYmVyLFxuICB0dGxTZWNvbmRzOiBudW1iZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBpb3JlZGlzLXN0eWxlIHZhcmlhZGljIFNFVCB3aXRoIGV4cGlyeTogU0VUIGtleSB2YWwgRVggdHRsLlxuICAgIGF3YWl0IHJlZGlzLnNldCh0b2tlblJldm9jYXRpb25LZXkodXNlcklkKSwgU3RyaW5nKHRva2VuVmVyc2lvbiksICdFWCcsIE1hdGgubWF4KDEsIE1hdGguZmxvb3IodHRsU2Vjb25kcykpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1Rva2VuLXJldm9jYXRpb24gcHVibGlzaCBmYWlsZWQgKHNlcnZpY2VzIGZhbGwgYmFjayB0byB0b2tlbiBleHBpcnkpJywge1xuICAgICAgdXNlcklkLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -85,7 +85,7 @@
85
85
  "access": "public",
86
86
  "registry": "https://registry.npmjs.org/"
87
87
  },
88
- "version": "3.4.88",
88
+ "version": "3.4.89",
89
89
  "bugs": {
90
90
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
91
91
  },