@workflow/core 5.0.0-beta.32 → 5.0.0-beta.34

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.
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
package/dist/telemetry.js CHANGED
@@ -132,8 +132,43 @@ const Tracer = once(async () => {
132
132
  const api = await OtelApi.value;
133
133
  if (!api)
134
134
  return null;
135
- return api.trace.getTracer('workflow');
135
+ const tracer = api.trace.getTracer('workflow');
136
+ logOtelDiagnosticOnce(api, tracer);
137
+ return tracer;
136
138
  });
139
+ /**
140
+ * One-shot runtime diagnostic (DEBUG=workflow:* only), same shape as the one
141
+ * world-vercel emits tagged `world-vercel`: prints how this module instance
142
+ * of `@opentelemetry/api` sees the global registration, so a deployment's
143
+ * logs show the two packages' views side by side.
144
+ */
145
+ let otelDiagLogged = false;
146
+ function logOtelDiagnosticOnce(otel, tracer) {
147
+ const debugEnabled = typeof process !== 'undefined' &&
148
+ typeof process.env.DEBUG === 'string' &&
149
+ (process.env.DEBUG.includes('workflow:') || process.env.DEBUG === '*');
150
+ if (otelDiagLogged || !debugEnabled)
151
+ return;
152
+ otelDiagLogged = true;
153
+ try {
154
+ const g = globalThis[Symbol.for('opentelemetry.js.api.1')];
155
+ const provider = otel.trace.getTracerProvider();
156
+ const delegate = provider.getDelegate?.() ?? provider;
157
+ const probe = tracer.startSpan('workflow.otel.probe.core');
158
+ console.warn('[workflow:otel-diag] core', JSON.stringify({
159
+ globalRegistrationVersion: g?.version ?? null,
160
+ providerCtor: provider?.constructor?.name ?? null,
161
+ delegateCtor: delegate?.constructor?.name ?? null,
162
+ tracerCtor: tracer?.constructor?.name ?? null,
163
+ probeCtor: probe?.constructor?.name ?? null,
164
+ probeRecording: probe.isRecording(),
165
+ }));
166
+ probe.end();
167
+ }
168
+ catch (error) {
169
+ console.warn('[workflow:otel-diag] core failed:', error instanceof Error ? error.message : error);
170
+ }
171
+ }
137
172
  export async function trace(spanName, ...args) {
138
173
  const [tracer, otel] = await Promise.all([Tracer.value, OtelApi.value]);
139
174
  const { fn, opts } = typeof args[0] === 'function'
@@ -299,4 +334,4 @@ export async function getWorkflowBaggage() {
299
334
  workflowName: name,
300
335
  };
301
336
  }
302
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxLQUFLLElBQUksTUFBTSxxQ0FBcUMsQ0FBQztBQW9CNUQseUVBQXlFO0FBQ3pFLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUV2RDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztJQUM5QyxJQUFJLEtBQUssS0FBSyxZQUFZO1FBQUUsT0FBTyxZQUFZLENBQUM7SUFDaEQsSUFBSSxLQUFLLElBQUksS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzVFLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxhQUFhLENBQUMsSUFBSSxDQUNoQiwyQ0FBMkMsS0FBSyxpRUFBaUUsQ0FDbEgsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxPQUEyQztJQUUzQyxPQUFPLE9BQU8sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsU0FBNEIsRUFDNUIsZUFB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LENBQUMsTUFBTSxFQUFFLEVBQ3JCLE9BQU8sQ0FDUixDQUFDO0lBRUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQjtJQUd0QyxNQUFNLElBQUksR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDakMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUU1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbkUsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUUvQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxDQUFDO0lBQ3pELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSyxDQUFDO0lBRXRELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFdEMsT0FBTztRQUNMLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLFlBQVksRUFBRSxJQUFJO0tBQ25CLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBhcGkgZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB0eXBlIHsgU3BhbiwgU3BhbktpbmQsIFNwYW5PcHRpb25zIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB7IG9uY2UgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCAqIGFzIEF0dHIgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRyYWNlIENvbnRleHQgUHJvcGFnYXRpb24gVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDb250cm9scyBob3cgd29ya2Zsb3cvc3RlcCBxdWV1ZS1oYW5kbGVyIHNwYW5zIHJlbGF0ZSB0byB0aGUgcnVuLW9yaWdpblxuICogdHJhY2UgY29udGV4dCBjYXJyaWVkIGluIHF1ZXVlIG1lc3NhZ2VzOlxuICpcbiAqIC0gYCdsaW5rZWQnYCAoZGVmYXVsdCk6IGVhY2ggaW52b2NhdGlvbiBzdGFydHMgYSBORVcgcm9vdCB0cmFjZTsgdGhlXG4gKiAgIHJ1bi1vcmlnaW4gY29udGV4dCAoYW5kIHRoZSBpbmNvbWluZyBkZWxpdmVyeSBjb250ZXh0KSBhcmUgYXR0YWNoZWQgYXNcbiAqICAgc3BhbiBsaW5rcy4gVGhpcyBrZWVwcyB0cmFjZXMgYm91bmRlZCBwZXIgaW52b2NhdGlvbiBpbnN0ZWFkIG9mXG4gKiAgIHN0aXRjaGluZyBhIGxvbmctbGl2ZWQgcnVuIGludG8gb25lIGdpYW50IHRyYWNlLlxuICogLSBgJ2NvbnRpbnVvdXMnYDogdGhlIHJlc3RvcmVkIHJ1bi1vcmlnaW4gY29udGV4dCBiZWNvbWVzIHRoZSBwYXJlbnQgb2ZcbiAqICAgdGhlIGludm9jYXRpb24gc3BhbiAobGVnYWN5IGJlaGF2aW9yKSwgcHJvZHVjaW5nIGEgc2luZ2xlIHRyYWNlIHRoYXRcbiAqICAgc3BhbnMgdGhlIGVudGlyZSBydW4uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93VHJhY2VNb2RlID0gJ2xpbmtlZCcgfCAnY29udGludW91cyc7XG5cbi8qKiBVbnJlY29nbml6ZWQgYFdPUktGTE9XX1RSQUNFX01PREVgIHZhbHVlcyB3ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC4gKi9cbmNvbnN0IHdhcm5lZFVucmVjb2duaXplZFRyYWNlTW9kZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYWN0aXZlIHRyYWNlIG1vZGUgZnJvbSB0aGUgYFdPUktGTE9XX1RSQUNFX01PREVgIGVudiB2YXIuXG4gKiBEZWZhdWx0cyB0byBgJ2xpbmtlZCdgOyBhbnkgdmFsdWUgb3RoZXIgdGhhbiBgJ2NvbnRpbnVvdXMnYCBzZWxlY3RzIGl0LlxuICogVW5yZWNvZ25pemVkIG5vbi1lbXB0eSB2YWx1ZXMgKGUuZy4gdHlwb3MgbGlrZSBgY29udGlub3VzYCkgZW1pdCBhXG4gKiBvbmUtdGltZSB3YXJuaW5nIHNvIHNpbGVudCBmYWxsYmFjayB0byBgbGlua2VkYCBpcyBhdCBsZWFzdCB2aXNpYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dUcmFjZU1vZGUoKTogV29ya2Zsb3dUcmFjZU1vZGUge1xuICBjb25zdCB2YWx1ZSA9IHByb2Nlc3MuZW52LldPUktGTE9XX1RSQUNFX01PREU7XG4gIGlmICh2YWx1ZSA9PT0gJ2NvbnRpbnVvdXMnKSByZXR1cm4gJ2NvbnRpbnVvdXMnO1xuICBpZiAodmFsdWUgJiYgdmFsdWUgIT09ICdsaW5rZWQnICYmICF3YXJuZWRVbnJlY29nbml6ZWRUcmFjZU1vZGVzLmhhcyh2YWx1ZSkpIHtcbiAgICB3YXJuZWRVbnJlY29nbml6ZWRUcmFjZU1vZGVzLmFkZCh2YWx1ZSk7XG4gICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgYFVucmVjb2duaXplZCBXT1JLRkxPV19UUkFDRV9NT0RFIHZhbHVlIFwiJHt2YWx1ZX1cIjsgZXhwZWN0ZWQgXCJsaW5rZWRcIiBvciBcImNvbnRpbnVvdXNcIi4gRmFsbGluZyBiYWNrIHRvIFwibGlua2VkXCIuYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuICdsaW5rZWQnO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhIHNlcmlhbGl6ZWQgdHJhY2UgY2FycmllciBpcyB1c2FibGUsIGkuZS4gcHJlc2VudCBhbmRcbiAqIG5vbi1lbXB0eS4gYHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpYCByZXR1cm5zIGB7fWAgd2hlbiBubyBPVEVMIFNESyBpc1xuICogcmVnaXN0ZXJlZCBvciBubyBzcGFuIGlzIGFjdGl2ZSwgYW5kIGBzdGFydCgpYCBhbHdheXMgYXR0YWNoZXMgdGhlXG4gKiBjYXJyaWVyIHRvIHRoZSBmaXJzdCBxdWV1ZSBtZXNzYWdlIOKAlCBzbyBhbiBlbXB0eSBjYXJyaWVyIG11c3QgYmUgdHJlYXRlZFxuICogdGhlIHNhbWUgYXMgYW4gYWJzZW50IG9uZSB3aGVyZXZlciB0aGUgdHJhY2UtbW9kZSBsb2dpYyBicmFuY2hlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVXNhYmxlVHJhY2VDYXJyaWVyKFxuICBjYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkXG4pOiBjYXJyaWVyIGlzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICByZXR1cm4gY2FycmllciAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5rZXlzKGNhcnJpZXIpLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJhY2UgY2FycmllciB0byBhdHRhY2ggdG8gbWVzc2FnZXMgdGhlIGN1cnJlbnQgaW52b2NhdGlvblxuICogZW5xdWV1ZXMuIEluIGBsaW5rZWRgIG1vZGUgdGhlIE9SSUdJTkFMIHJ1bi1vcmlnaW4gY2FycmllciBpcyBmb3J3YXJkZWRcbiAqIHVuY2hhbmdlZCAod2hlbiB1c2FibGUpIHNvIGV2ZXJ5IGZ1dHVyZSBpbnZvY2F0aW9uIGxpbmtzIGJhY2sgdG8gdGhlIHNhbWVcbiAqIG9yaWdpbjsgb3RoZXJ3aXNlIOKAlCBgY29udGludW91c2AgbW9kZSwgb3Igbm8gdXNhYmxlIGluY29taW5nIGNhcnJpZXIg4oCUXG4gKiB0aGUgY3VycmVudCAoYWN0aXZlKSBjb250ZXh0IGlzIHNlcmlhbGl6ZWQsIHNvIHRoZSB0cmFjZSBrZWVwcyBjaGFpbmluZ1xuICogKGNvbnRpbnVvdXMpIG9yIHRoZSBmaXJzdCBpbnN0cnVtZW50ZWQgaW52b2NhdGlvbiBiZWNvbWVzIHRoZSBkZS1mYWN0b1xuICogb3JpZ2luIChsaW5rZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV4dFRyYWNlQ2FycmllcihcbiAgdHJhY2VNb2RlOiBXb3JrZmxvd1RyYWNlTW9kZSxcbiAgaW5jb21pbmdDYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgcmV0dXJuIHRyYWNlTW9kZSA9PT0gJ2xpbmtlZCcgJiYgaXNVc2FibGVUcmFjZUNhcnJpZXIoaW5jb21pbmdDYXJyaWVyKVxuICAgID8gUHJvbWlzZS5yZXNvbHZlKGluY29taW5nQ2FycmllcilcbiAgICA6IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgc3BhbiBsaW5rcyBmb3IgYSBxdWV1ZS1kZWxpdmVyZWQgaW52b2NhdGlvbiBzcGFuXG4gKiAoYHdvcmtmbG93LmV4ZWN1dGVgIC8gYHN0ZXAuZXhlY3V0ZWApOlxuICpcbiAqIC0gSW4gYGxpbmtlZGAgbW9kZSB0aGUgaW52b2NhdGlvbiBzcGFuIGlzIGEgQ0hJTEQgb2YgdGhlIGxvY2FsIGRlbGl2ZXJ5XG4gKiAgIChmbG93LXJvdXRlKSBjb250ZXh0LCBzbyB0aGUgb25seSBsaW5rIGlzIHRvIHRoZSBydW4tb3JpZ2luIGNvbnRleHRcbiAqICAgZnJvbSB0aGUgbWVzc2FnZSdzIHRyYWNlIGNhcnJpZXIg4oCUIGNvbm5lY3RpbmcgdGhpcyBib3VuZGVkIHBlci1pbnZvY2F0aW9uXG4gKiAgIHRyYWNlIGJhY2sgdG8gd2hlcmUgdGhlIHJ1biB3YXMgc3RhcnRlZC4gVGhlIHJ1bi1vcmlnaW4gY29udGV4dCBpcyBhXG4gKiAgIGxpbmssIG5ldmVyIGEgcGFyZW50LCBhbmQgcmUtZW5xdWV1ZXMgZm9yd2FyZCB0aGUgb3JpZ2luYWwgY2FycmllclxuICogICB1bmNoYW5nZWQsIHNvIHRoZSB3aG9sZSBydW4gaXMgbmV2ZXIgc3RpdGNoZWQgaW50byBvbmUgZ2lhbnQgdHJhY2UuXG4gKiAgIFRoZSBsaW5rIGlzIHNraXBwZWQgd2hlbiB0aGUgY2FycmllciBpcyBhYnNlbnQsIGVtcHR5LCBvciBpbnZhbGlkLlxuICogLSBJbiBgY29udGludW91c2AgbW9kZSB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGlzIHJlc3RvcmVkIGFzIHRoZSBwYXJlbnRcbiAqICAgaW5zdGVhZCwgYW5kIHRoZSBsaW5rIHBvaW50cyBhdCB0aGUgaW5jb21pbmcgZGVsaXZlcnkgY29udGV4dC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyhcbiAgdHJhY2VNb2RlOiBXb3JrZmxvd1RyYWNlTW9kZSxcbiAgaW5jb21pbmdDYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPGFwaS5MaW5rW10gfCB1bmRlZmluZWQ+IHtcbiAgaWYgKHRyYWNlTW9kZSAhPT0gJ2xpbmtlZCcpIHJldHVybiBsaW5rVG9DdXJyZW50Q29udGV4dCgpO1xuICBjb25zdCBvcmlnaW5MaW5rID0gYXdhaXQgbGlua1RvVHJhY2VDYXJyaWVyKFxuICAgIGlzVXNhYmxlVHJhY2VDYXJyaWVyKGluY29taW5nQ2FycmllcikgPyBpbmNvbWluZ0NhcnJpZXIgOiB1bmRlZmluZWRcbiAgKTtcbiAgcmV0dXJuIG9yaWdpbkxpbmsgPyBbb3JpZ2luTGlua10gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgY3VycmVudCB0cmFjZSBjb250ZXh0IGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgcGFzc2VkIHRocm91Z2ggcXVldWVzXG4gKiBAcmV0dXJucyBBIHJlY29yZCBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgdHJhY2UgY29udGV4dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VyaWFsaXplVHJhY2VDYXJyaWVyKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4ge307XG4gIGNvbnN0IGNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgLy8gSW5qZWN0IHRoZSBjdXJyZW50IGNvbnRleHQgaW50byB0aGUgY2FycmllclxuICBvdGVsLnByb3BhZ2F0aW9uLmluamVjdChvdGVsLmNvbnRleHQuYWN0aXZlKCksIGNhcnJpZXIpO1xuICByZXR1cm4gY2Fycmllcjtcbn1cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgdHJhY2UgY29udGV4dCBhbmQgcmV0dXJucyBhIGNvbnRleHQgdGhhdCBjYW4gYmUgdXNlZCB0byBjb250aW51ZSB0aGUgdHJhY2VcbiAqIEBwYXJhbSB0cmFjZUNhcnJpZXIgVGhlIHNlcmlhbGl6ZWQgdHJhY2UgY29udGV4dFxuICogQHJldHVybnMgT3BlblRlbGVtZXRyeSBjb250ZXh0IHdpdGggdGhlIHJlc3RvcmVkIHRyYWNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXNlcmlhbGl6ZVRyYWNlQ2FycmllcihcbiAgdHJhY2VDYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pIHtcbiAgY29uc3Qgb3RlbCA9IGF3YWl0IE90ZWxBcGkudmFsdWU7XG4gIGlmICghb3RlbCkgcmV0dXJuO1xuICAvLyBFeHRyYWN0IHRoZSBjb250ZXh0IGZyb20gdGhlIGNhcnJpZXJcbiAgcmV0dXJuIG90ZWwucHJvcGFnYXRpb24uZXh0cmFjdChvdGVsLmNvbnRleHQuYWN0aXZlKCksIHRyYWNlQ2Fycmllcik7XG59XG5cbi8qKlxuICogUnVucyBhIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIGRlc2VyaWFsaXplZCB0cmFjZVxuICogQHBhcmFtIHRyYWNlQ2FycmllciBUaGUgc2VyaWFsaXplZCB0cmFjZSBjYXJyaWVyIChvcHRpb25hbClcbiAqIEBwYXJhbSBmbiBUaGUgZnVuY3Rpb24gdG8gcnVuIHdpdGhpbiB0aGUgdHJhY2UgY29udGV4dFxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhUcmFjZUNvbnRleHQ8VD4oXG4gIHRyYWNlQ2FycmllcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCxcbiAgZm46ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBpZiAoIXRyYWNlQ2Fycmllcikge1xuICAgIHJldHVybiBmbigpO1xuICB9XG5cbiAgY29uc3Qgb3RlbCA9IGF3YWl0IE90ZWxBcGkudmFsdWU7XG4gIGlmICghb3RlbCkgcmV0dXJuIGZuKCk7XG5cbiAgY29uc3QgZXh0cmFjdGVkQ29udGV4dCA9IGF3YWl0IGRlc2VyaWFsaXplVHJhY2VDYXJyaWVyKHRyYWNlQ2Fycmllcik7XG4gIGlmICghZXh0cmFjdGVkQ29udGV4dCkge1xuICAgIHJldHVybiBmbigpO1xuICB9XG5cbiAgcmV0dXJuIG90ZWwuY29udGV4dC53aXRoKGV4dHJhY3RlZENvbnRleHQsIGFzeW5jICgpID0+IGF3YWl0IGZuKCkpO1xufVxuXG5jb25zdCBPdGVsQXBpID0gb25jZShhc3luYyAoKSA9PiB7XG4gIC8vIGBAb3BlbnRlbGVtZXRyeS9hcGlgIGlzIGFuIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeS4gVGhlIHN0YXRpYyBzcGVjaWZpZXJcbiAgLy8gaXMgaW50ZW50aW9uYWw6IGVzYnVpbGQtYnVuZGxlZCB0YXJnZXRzICh0aGUgQ0xJJ3NcbiAgLy8gYHZlcmNlbC1idWlsZC1vdXRwdXQtYXBpYCBidWlsZCwgTml0cm8sIEFzdHJvKSBzaGlwIGEgc2VsZi1jb250YWluZWRcbiAgLy8gYnVuZGxlIHdpdGggbm8gbm9kZV9tb2R1bGVzLCBzbyB0aGUgcGFja2FnZSBtdXN0IGJlICppbmxpbmVkKiBhdCBidWlsZFxuICAvLyB0aW1lIGZvciBzcGFucyB0byB3b3JrIGF0IHJ1bnRpbWUg4oCUIGEgcnVudGltZS1idWlsdCBzcGVjaWZpZXIgaXMgb3BhcXVlIHRvXG4gIC8vIGVzYnVpbGQgYW5kIHdvdWxkIHNpbGVudGx5IGRpc2FibGUgdHJhY2luZyB0aGVyZS4gQnVuZGxlcnMgdGhhdCByZWplY3QgYW5cbiAgLy8gdW5yZXNvbHZhYmxlIHN0YXRpYyBgaW1wb3J0KClgIHdoZW4gdGhlIHBlZXIgaXNuJ3QgaW5zdGFsbGVkIChSb2xsdXAvVml0ZSxcbiAgLy8gZS5nLiBTdmVsdGVLaXQpIGluc3RlYWQgZXh0ZXJuYWxpemUgYEBvcGVudGVsZW1ldHJ5L2FwaWAgaW4gdGhlIHdvcmtmbG93XG4gIC8vIGZyYW1ld29yayBpbnRlZ3JhdGlvbiwgd2hpY2gga2VlcHMgdGhlIGJ1aWxkIGdyZWVuIGFuZCBzdGlsbCBsb2FkcyByZWFsXG4gIC8vIE9UZWwgd2hlbiB0aGUgcGVlciBpcyBwcmVzZW50LiBSdW50aW1lIHNlbWFudGljczogcHJlc2VudCDihpIgbG9hZGVkLCBhYnNlbnRcbiAgLy8g4oaSIGNhdWdodCBhbmQgdHJhY2luZyBkaXNhYmxlZC5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgaW1wb3J0KCdAb3BlbnRlbGVtZXRyeS9hcGknKTtcbiAgfSBjYXRjaCB7XG4gICAgcnVudGltZUxvZ2dlci5pbmZvKCdPcGVuVGVsZW1ldHJ5IG5vdCBhdmFpbGFibGUsIHRyYWNpbmcgd2lsbCBiZSBkaXNhYmxlZCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59KTtcblxuY29uc3QgVHJhY2VyID0gb25jZShhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGFwaSA9IGF3YWl0IE90ZWxBcGkudmFsdWU7XG4gIGlmICghYXBpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGFwaS50cmFjZS5nZXRUcmFjZXIoJ3dvcmtmbG93Jyk7XG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYWNlPFQ+KFxuICBzcGFuTmFtZTogc3RyaW5nLFxuICAuLi5hcmdzOlxuICAgIHwgW2ZuOiAoc3Bhbj86IFNwYW4pID0+IFByb21pc2U8VD5dXG4gICAgfCBbb3B0czogU3Bhbk9wdGlvbnMsIGZuOiAoc3Bhbj86IFNwYW4pID0+IFByb21pc2U8VD5dXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgW3RyYWNlciwgb3RlbF0gPSBhd2FpdCBQcm9taXNlLmFsbChbVHJhY2VyLnZhbHVlLCBPdGVsQXBpLnZhbHVlXSk7XG4gIGNvbnN0IHsgZm4sIG9wdHMgfSA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdmdW5jdGlvbidcbiAgICAgID8geyBmbjogYXJnc1swXSwgb3B0czoge30gfVxuICAgICAgOiB7IGZuOiBhcmdzWzFdLCBvcHRzOiBhcmdzWzBdIH07XG4gIGlmICghZm4pIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gdG8gdHJhY2UgbXVzdCBiZSBwcm92aWRlZCcpO1xuXG4gIGlmICghdHJhY2VyIHx8ICFvdGVsKSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH1cblxuICByZXR1cm4gdHJhY2VyLnN0YXJ0QWN0aXZlU3BhbihzcGFuTmFtZSwgb3B0cywgYXN5bmMgKHNwYW4pID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oc3Bhbik7XG4gICAgICBzcGFuLnNldFN0YXR1cyh7IGNvZGU6IG90ZWwuU3BhblN0YXR1c0NvZGUuT0sgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgY29kZTogb3RlbC5TcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgbWVzc2FnZTogKGUgYXMgRXJyb3IpLm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIGFwcGx5V29ya2Zsb3dTdXNwZW5zaW9uVG9TcGFuKGUsIG90ZWwsIHNwYW4pO1xuICAgICAgdGhyb3cgZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc3Bhbi5lbmQoKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEVtaXQgYSBzcGFuIHdob3NlIHN0YXJ0IGlzIGJhY2stZGF0ZWQgdG8gYHN0YXJ0RXBvY2hNc2AgYW5kIHdob3NlIGVuZCBpcyBub3csXG4gKiBzbyBpdHMgZHVyYXRpb24gcmVmbGVjdHMgYW4gaW50ZXJ2YWwgb25seSBtZWFzdXJhYmxlIGF0IGl0cyBlbmQgKGUuZy5cbiAqIHRpbWUtdG8tZmlyc3QtY2h1bmssIGtub3duIHdoZW4gdGhlIGZpcnN0IGNodW5rIGFycml2ZXMpLiBVbmxpa2UgYHRyYWNlKClgLFxuICogdGhpcyByZWNvcmRzIGFuIGFscmVhZHktZWxhcHNlZCBzcGFuIGluIG9uZSBzaG90IHJhdGhlciB0aGFuIHdyYXBwaW5nIGFcbiAqIGNhbGxiYWNrLiBOby1vcCB3aGVuIE9wZW5UZWxlbWV0cnkgaXMgbm90IGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlY29yZEVsYXBzZWRTcGFuKFxuICBzcGFuTmFtZTogc3RyaW5nLFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgb3B0cz86IFNwYW5PcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdHJhY2VyID0gYXdhaXQgVHJhY2VyLnZhbHVlO1xuICBpZiAoIXRyYWNlcikgcmV0dXJuO1xuICB0cmFjZXIuc3RhcnRTcGFuKHNwYW5OYW1lLCB7IC4uLm9wdHMsIHN0YXJ0VGltZTogc3RhcnRFcG9jaE1zIH0pLmVuZCgpO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgd29ya2Zsb3cgc3VzcGVuc2lvbiBhdHRyaWJ1dGVzIHRvIHRoZSBnaXZlbiBzcGFuIGlmIHRoZSBlcnJvciBpcyBhIFdvcmtmbG93U3VzcGVuc2lvblxuICogd2hpY2ggaXMgdGVjaG5pY2FsbHkgbm90IGFuIGVycm9yLCBidXQgYW4gYWxnZWJyYWljIGVmZmVjdCBpbmRpY2F0aW5nIHN1c3BlbnNpb24uXG4gKi9cbmZ1bmN0aW9uIGFwcGx5V29ya2Zsb3dTdXNwZW5zaW9uVG9TcGFuKFxuICBlcnJvcjogdW5rbm93bixcbiAgb3RlbDogdHlwZW9mIGFwaSxcbiAgc3BhbjogYXBpLlNwYW5cbikge1xuICBpZiAoIWVycm9yIHx8ICFXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyb3IpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBvdGVsLlNwYW5TdGF0dXNDb2RlLk9LIH0pO1xuICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgIC4uLkF0dHIuV29ya2Zsb3dTdXNwZW5zaW9uU3RhdGUoJ3N1c3BlbmRlZCcpLFxuICAgIC4uLkF0dHIuV29ya2Zsb3dTdXNwZW5zaW9uU3RlcENvdW50KGVycm9yLnN0ZXBDb3VudCksXG4gICAgLi4uQXR0ci5Xb3JrZmxvd1N1c3BlbnNpb25Ib29rQ291bnQoZXJyb3IuaG9va0NvdW50KSxcbiAgICAuLi5BdHRyLldvcmtmbG93U3VzcGVuc2lvbldhaXRDb3VudChlcnJvci53YWl0Q291bnQpLFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNwYW5Db250ZXh0Rm9yVHJhY2VDYXJyaWVyKFxuICBjYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pIHtcbiAgY29uc3QgW2Rlc2VyaWFsaXplZCwgb3RlbF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZGVzZXJpYWxpemVUcmFjZUNhcnJpZXIoY2FycmllciksXG4gICAgT3RlbEFwaS52YWx1ZSxcbiAgXSk7XG4gIGlmICghZGVzZXJpYWxpemVkIHx8ICFvdGVsKSByZXR1cm47XG4gIHJldHVybiBvdGVsLnRyYWNlLmdldFNwYW5Db250ZXh0KGRlc2VyaWFsaXplZCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBY3RpdmVTcGFuKCkge1xuICByZXR1cm4gYXdhaXQgd2l0aE90ZWwoKG90ZWwpID0+IG90ZWwudHJhY2UuZ2V0QWN0aXZlU3BhbigpKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhbGwgbWV0aG9kcyBvZiBhbiBvYmplY3Qgd2l0aCB0cmFjaW5nIHNwYW5zLlxuICogQHBhcmFtIHByZWZpeCAtIFByZWZpeCBmb3Igc3BhbiBuYW1lcyAoZS5nLiwgXCJXT1JMRC5ydW5zXCIpXG4gKiBAcGFyYW0gbyAtIE9iamVjdCB3aXRoIG1ldGhvZHMgdG8gaW5zdHJ1bWVudFxuICogQHJldHVybnMgSW5zdHJ1bWVudGVkIG9iamVjdCB3aXRoIHNhbWUgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0cnVtZW50T2JqZWN0PFQgZXh0ZW5kcyBvYmplY3Q+KHByZWZpeDogc3RyaW5nLCBvOiBUKTogVCB7XG4gIGNvbnN0IGhhbmRsZXJzID0ge30gYXMgVDtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobykgYXMgKGtleW9mIFQpW10pIHtcbiAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaGFuZGxlcnNba2V5XSA9IG9ba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZiA9IG9ba2V5XTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgIGhhbmRsZXJzW2tleV0gPSBhc3luYyAoLi4uYXJnczogYW55W10pID0+XG4gICAgICAgIHRyYWNlKGAke3ByZWZpeH0uJHtTdHJpbmcoa2V5KX1gLCB7fSwgKCkgPT4gZiguLi5hcmdzKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBoYW5kbGVycztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNwYW5LaW5kKGZpZWxkOiBrZXlvZiB0eXBlb2YgU3BhbktpbmQpIHtcbiAgcmV0dXJuIHdpdGhPdGVsKCh4KSA9PiB4LlNwYW5LaW5kW2ZpZWxkXSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoT3RlbDxUPihcbiAgZm46IChvdGVsOiB0eXBlb2YgYXBpKSA9PiBUXG4pOiBQcm9taXNlPEF3YWl0ZWQ8VD4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgb3RlbCA9IGF3YWl0IE90ZWxBcGkudmFsdWU7XG4gIGlmICghb3RlbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGF3YWl0IGZuKG90ZWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlua1RvQ3VycmVudENvbnRleHQoKTogUHJvbWlzZTxbYXBpLkxpbmtdIHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiB3aXRoT3RlbCgob3RlbCk6IFthcGkuTGlua10gfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBvdGVsLnRyYWNlLmdldEFjdGl2ZVNwYW4oKT8uc3BhbkNvbnRleHQoKTtcbiAgICBpZiAoIWNvbnRleHQpIHJldHVybjtcbiAgICByZXR1cm4gW3sgY29udGV4dCB9XTtcbiAgfSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgc3BhbiBsaW5rIHBvaW50aW5nIGF0IHRoZSBzcGFuIGNvbnRleHQgZW1iZWRkZWQgaW4gYSBzZXJpYWxpemVkXG4gKiB0cmFjZSBjYXJyaWVyIChlLmcuIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgZmxvd2luZyB0aHJvdWdoIHF1ZXVlXG4gKiBtZXNzYWdlcykuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBPVEVMIGlzIHVuYXZhaWxhYmxlLCB0aGUgY2FycmllciBpc1xuICogYWJzZW50LCBvciBpdCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgc3BhbiBjb250ZXh0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlua1RvVHJhY2VDYXJyaWVyKFxuICBjYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPGFwaS5MaW5rIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghY2FycmllcikgcmV0dXJuO1xuICBjb25zdCBbY29udGV4dCwgb3RlbF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZ2V0U3BhbkNvbnRleHRGb3JUcmFjZUNhcnJpZXIoY2FycmllciksXG4gICAgT3RlbEFwaS52YWx1ZSxcbiAgXSk7XG4gIGlmICghY29udGV4dCB8fCAhb3RlbCkgcmV0dXJuO1xuICBpZiAoIW90ZWwudHJhY2UuaXNTcGFuQ29udGV4dFZhbGlkKGNvbnRleHQpKSByZXR1cm47XG4gIHJldHVybiB7IGNvbnRleHQgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCYWdnYWdlIFByb3BhZ2F0aW9uIFV0aWxpdGllc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogV29ya2Zsb3cgY29udGV4dCB0byBwcm9wYWdhdGUgdmlhIGJhZ2dhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0JhZ2dhZ2VDb250ZXh0IHtcbiAgd29ya2Zsb3dSdW5JZDogc3RyaW5nO1xuICB3b3JrZmxvd05hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZXRzIHdvcmtmbG93IGNvbnRleHQgYXMgT1RFTCBiYWdnYWdlIGZvciBhdXRvbWF0aWMgcHJvcGFnYXRpb24uXG4gKiBCYWdnYWdlIGlzIHByb3BhZ2F0ZWQgYWNyb3NzIHNlcnZpY2UgYm91bmRhcmllcyB2aWEgSFRUUCBoZWFkZXJzLlxuICogQHBhcmFtIGNvbnRleHQgLSBXb3JrZmxvdyBjb250ZXh0IHRvIHNldCBhcyBiYWdnYWdlXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRvIHJ1biB3aXRoaW4gdGhlIGJhZ2dhZ2UgY29udGV4dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFdvcmtmbG93QmFnZ2FnZTxUPihcbiAgY29udGV4dDogV29ya2Zsb3dCYWdnYWdlQ29udGV4dCxcbiAgZm46ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gZm4oKTtcblxuICAvLyBDcmVhdGUgYmFnZ2FnZSB3aXRoIHdvcmtmbG93IGNvbnRleHRcbiAgY29uc3QgYmFnZ2FnZSA9IG90ZWwucHJvcGFnYXRpb24uY3JlYXRlQmFnZ2FnZSh7XG4gICAgJ3dvcmtmbG93LnJ1bl9pZCc6IHsgdmFsdWU6IGNvbnRleHQud29ya2Zsb3dSdW5JZCB9LFxuICAgICd3b3JrZmxvdy5uYW1lJzogeyB2YWx1ZTogY29udGV4dC53b3JrZmxvd05hbWUgfSxcbiAgfSk7XG5cbiAgLy8gU2V0IGJhZ2dhZ2UgaW4gY29udGV4dCBhbmQgcnVuIGZ1bmN0aW9uXG4gIGNvbnN0IGNvbnRleHRXaXRoQmFnZ2FnZSA9IG90ZWwucHJvcGFnYXRpb24uc2V0QmFnZ2FnZShcbiAgICBvdGVsLmNvbnRleHQuYWN0aXZlKCksXG4gICAgYmFnZ2FnZVxuICApO1xuXG4gIHJldHVybiBvdGVsLmNvbnRleHQud2l0aChjb250ZXh0V2l0aEJhZ2dhZ2UsICgpID0+IGZuKCkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB3b3JrZmxvdyBjb250ZXh0IGZyb20gT1RFTCBiYWdnYWdlLlxuICogQHJldHVybnMgV29ya2Zsb3cgY29udGV4dCBpZiBwcmVzZW50IGluIGJhZ2dhZ2UsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdvcmtmbG93QmFnZ2FnZSgpOiBQcm9taXNlPFxuICBXb3JrZmxvd0JhZ2dhZ2VDb250ZXh0IHwgdW5kZWZpbmVkXG4+IHtcbiAgY29uc3Qgb3RlbCA9IGF3YWl0IE90ZWxBcGkudmFsdWU7XG4gIGlmICghb3RlbCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBiYWdnYWdlID0gb3RlbC5wcm9wYWdhdGlvbi5nZXRCYWdnYWdlKG90ZWwuY29udGV4dC5hY3RpdmUoKSk7XG4gIGlmICghYmFnZ2FnZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBydW5JZCA9IGJhZ2dhZ2UuZ2V0RW50cnkoJ3dvcmtmbG93LnJ1bl9pZCcpPy52YWx1ZTtcbiAgY29uc3QgbmFtZSA9IGJhZ2dhZ2UuZ2V0RW50cnkoJ3dvcmtmbG93Lm5hbWUnKT8udmFsdWU7XG5cbiAgaWYgKCFydW5JZCB8fCAhbmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIHdvcmtmbG93TmFtZTogbmFtZSxcbiAgfTtcbn1cbiJdfQ==
337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxLQUFLLElBQUksTUFBTSxxQ0FBcUMsQ0FBQztBQW9CNUQseUVBQXlFO0FBQ3pFLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUV2RDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztJQUM5QyxJQUFJLEtBQUssS0FBSyxZQUFZO1FBQUUsT0FBTyxZQUFZLENBQUM7SUFDaEQsSUFBSSxLQUFLLElBQUksS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzVFLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxhQUFhLENBQUMsSUFBSSxDQUNoQiwyQ0FBMkMsS0FBSyxpRUFBaUUsQ0FDbEgsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxPQUEyQztJQUUzQyxPQUFPLE9BQU8sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsU0FBNEIsRUFDNUIsZUFB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QyxLQUFLLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFdEMsT0FBTztRQUNMLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLFlBQVksRUFBRSxJQUFJO0tBQ25CLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBhcGkgZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB0eXBlIHsgU3BhbiwgU3BhbktpbmQsIFNwYW5PcHRpb25zIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB7IG9uY2UgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCAqIGFzIEF0dHIgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRyYWNlIENvbnRleHQgUHJvcGFnYXRpb24gVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDb250cm9scyBob3cgd29ya2Zsb3cvc3RlcCBxdWV1ZS1oYW5kbGVyIHNwYW5zIHJlbGF0ZSB0byB0aGUgcnVuLW9yaWdpblxuICogdHJhY2UgY29udGV4dCBjYXJyaWVkIGluIHF1ZXVlIG1lc3NhZ2VzOlxuICpcbiAqIC0gYCdsaW5rZWQnYCAoZGVmYXVsdCk6IGVhY2ggaW52b2NhdGlvbiBzdGFydHMgYSBORVcgcm9vdCB0cmFjZTsgdGhlXG4gKiAgIHJ1bi1vcmlnaW4gY29udGV4dCAoYW5kIHRoZSBpbmNvbWluZyBkZWxpdmVyeSBjb250ZXh0KSBhcmUgYXR0YWNoZWQgYXNcbiAqICAgc3BhbiBsaW5rcy4gVGhpcyBrZWVwcyB0cmFjZXMgYm91bmRlZCBwZXIgaW52b2NhdGlvbiBpbnN0ZWFkIG9mXG4gKiAgIHN0aXRjaGluZyBhIGxvbmctbGl2ZWQgcnVuIGludG8gb25lIGdpYW50IHRyYWNlLlxuICogLSBgJ2NvbnRpbnVvdXMnYDogdGhlIHJlc3RvcmVkIHJ1bi1vcmlnaW4gY29udGV4dCBiZWNvbWVzIHRoZSBwYXJlbnQgb2ZcbiAqICAgdGhlIGludm9jYXRpb24gc3BhbiAobGVnYWN5IGJlaGF2aW9yKSwgcHJvZHVjaW5nIGEgc2luZ2xlIHRyYWNlIHRoYXRcbiAqICAgc3BhbnMgdGhlIGVudGlyZSBydW4uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93VHJhY2VNb2RlID0gJ2xpbmtlZCcgfCAnY29udGludW91cyc7XG5cbi8qKiBVbnJlY29nbml6ZWQgYFdPUktGTE9XX1RSQUNFX01PREVgIHZhbHVlcyB3ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC4gKi9cbmNvbnN0IHdhcm5lZFVucmVjb2duaXplZFRyYWNlTW9kZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYWN0aXZlIHRyYWNlIG1vZGUgZnJvbSB0aGUgYFdPUktGTE9XX1RSQUNFX01PREVgIGVudiB2YXIuXG4gKiBEZWZhdWx0cyB0byBgJ2xpbmtlZCdgOyBhbnkgdmFsdWUgb3RoZXIgdGhhbiBgJ2NvbnRpbnVvdXMnYCBzZWxlY3RzIGl0LlxuICogVW5yZWNvZ25pemVkIG5vbi1lbXB0eSB2YWx1ZXMgKGUuZy4gdHlwb3MgbGlrZSBgY29udGlub3VzYCkgZW1pdCBhXG4gKiBvbmUtdGltZSB3YXJuaW5nIHNvIHNpbGVudCBmYWxsYmFjayB0byBgbGlua2VkYCBpcyBhdCBsZWFzdCB2aXNpYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dUcmFjZU1vZGUoKTogV29ya2Zsb3dUcmFjZU1vZGUge1xuICBjb25zdCB2YWx1ZSA9IHByb2Nlc3MuZW52LldPUktGTE9XX1RSQUNFX01PREU7XG4gIGlmICh2YWx1ZSA9PT0gJ2NvbnRpbnVvdXMnKSByZXR1cm4gJ2NvbnRpbnVvdXMnO1xuICBpZiAodmFsdWUgJiYgdmFsdWUgIT09ICdsaW5rZWQnICYmICF3YXJuZWRVbnJlY29nbml6ZWRUcmFjZU1vZGVzLmhhcyh2YWx1ZSkpIHtcbiAgICB3YXJuZWRVbnJlY29nbml6ZWRUcmFjZU1vZGVzLmFkZCh2YWx1ZSk7XG4gICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgYFVucmVjb2duaXplZCBXT1JLRkxPV19UUkFDRV9NT0RFIHZhbHVlIFwiJHt2YWx1ZX1cIjsgZXhwZWN0ZWQgXCJsaW5rZWRcIiBvciBcImNvbnRpbnVvdXNcIi4gRmFsbGluZyBiYWNrIHRvIFwibGlua2VkXCIuYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuICdsaW5rZWQnO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhIHNlcmlhbGl6ZWQgdHJhY2UgY2FycmllciBpcyB1c2FibGUsIGkuZS4gcHJlc2VudCBhbmRcbiAqIG5vbi1lbXB0eS4gYHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpYCByZXR1cm5zIGB7fWAgd2hlbiBubyBPVEVMIFNESyBpc1xuICogcmVnaXN0ZXJlZCBvciBubyBzcGFuIGlzIGFjdGl2ZSwgYW5kIGBzdGFydCgpYCBhbHdheXMgYXR0YWNoZXMgdGhlXG4gKiBjYXJyaWVyIHRvIHRoZSBmaXJzdCBxdWV1ZSBtZXNzYWdlIOKAlCBzbyBhbiBlbXB0eSBjYXJyaWVyIG11c3QgYmUgdHJlYXRlZFxuICogdGhlIHNhbWUgYXMgYW4gYWJzZW50IG9uZSB3aGVyZXZlciB0aGUgdHJhY2UtbW9kZSBsb2dpYyBicmFuY2hlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVXNhYmxlVHJhY2VDYXJyaWVyKFxuICBjYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkXG4pOiBjYXJyaWVyIGlzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICByZXR1cm4gY2FycmllciAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5rZXlzKGNhcnJpZXIpLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJhY2UgY2FycmllciB0byBhdHRhY2ggdG8gbWVzc2FnZXMgdGhlIGN1cnJlbnQgaW52b2NhdGlvblxuICogZW5xdWV1ZXMuIEluIGBsaW5rZWRgIG1vZGUgdGhlIE9SSUdJTkFMIHJ1bi1vcmlnaW4gY2FycmllciBpcyBmb3J3YXJkZWRcbiAqIHVuY2hhbmdlZCAod2hlbiB1c2FibGUpIHNvIGV2ZXJ5IGZ1dHVyZSBpbnZvY2F0aW9uIGxpbmtzIGJhY2sgdG8gdGhlIHNhbWVcbiAqIG9yaWdpbjsgb3RoZXJ3aXNlIOKAlCBgY29udGludW91c2AgbW9kZSwgb3Igbm8gdXNhYmxlIGluY29taW5nIGNhcnJpZXIg4oCUXG4gKiB0aGUgY3VycmVudCAoYWN0aXZlKSBjb250ZXh0IGlzIHNlcmlhbGl6ZWQsIHNvIHRoZSB0cmFjZSBrZWVwcyBjaGFpbmluZ1xuICogKGNvbnRpbnVvdXMpIG9yIHRoZSBmaXJzdCBpbnN0cnVtZW50ZWQgaW52b2NhdGlvbiBiZWNvbWVzIHRoZSBkZS1mYWN0b1xuICogb3JpZ2luIChsaW5rZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV4dFRyYWNlQ2FycmllcihcbiAgdHJhY2VNb2RlOiBXb3JrZmxvd1RyYWNlTW9kZSxcbiAgaW5jb21pbmdDYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgcmV0dXJuIHRyYWNlTW9kZSA9PT0gJ2xpbmtlZCcgJiYgaXNVc2FibGVUcmFjZUNhcnJpZXIoaW5jb21pbmdDYXJyaWVyKVxuICAgID8gUHJvbWlzZS5yZXNvbHZlKGluY29taW5nQ2FycmllcilcbiAgICA6IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgc3BhbiBsaW5rcyBmb3IgYSBxdWV1ZS1kZWxpdmVyZWQgaW52b2NhdGlvbiBzcGFuXG4gKiAoYHdvcmtmbG93LmV4ZWN1dGVgIC8gYHN0ZXAuZXhlY3V0ZWApOlxuICpcbiAqIC0gSW4gYGxpbmtlZGAgbW9kZSB0aGUgaW52b2NhdGlvbiBzcGFuIGlzIGEgQ0hJTEQgb2YgdGhlIGxvY2FsIGRlbGl2ZXJ5XG4gKiAgIChmbG93LXJvdXRlKSBjb250ZXh0LCBzbyB0aGUgb25seSBsaW5rIGlzIHRvIHRoZSBydW4tb3JpZ2luIGNvbnRleHRcbiAqICAgZnJvbSB0aGUgbWVzc2FnZSdzIHRyYWNlIGNhcnJpZXIg4oCUIGNvbm5lY3RpbmcgdGhpcyBib3VuZGVkIHBlci1pbnZvY2F0aW9uXG4gKiAgIHRyYWNlIGJhY2sgdG8gd2hlcmUgdGhlIHJ1biB3YXMgc3RhcnRlZC4gVGhlIHJ1bi1vcmlnaW4gY29udGV4dCBpcyBhXG4gKiAgIGxpbmssIG5ldmVyIGEgcGFyZW50LCBhbmQgcmUtZW5xdWV1ZXMgZm9yd2FyZCB0aGUgb3JpZ2luYWwgY2FycmllclxuICogICB1bmNoYW5nZWQsIHNvIHRoZSB3aG9sZSBydW4gaXMgbmV2ZXIgc3RpdGNoZWQgaW50byBvbmUgZ2lhbnQgdHJhY2UuXG4gKiAgIFRoZSBsaW5rIGlzIHNraXBwZWQgd2hlbiB0aGUgY2FycmllciBpcyBhYnNlbnQsIGVtcHR5LCBvciBpbnZhbGlkLlxuICogLSBJbiBgY29udGludW91c2AgbW9kZSB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGlzIHJlc3RvcmVkIGFzIHRoZSBwYXJlbnRcbiAqICAgaW5zdGVhZCwgYW5kIHRoZSBsaW5rIHBvaW50cyBhdCB0aGUgaW5jb21pbmcgZGVsaXZlcnkgY29udGV4dC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyhcbiAgdHJhY2VNb2RlOiBXb3JrZmxvd1RyYWNlTW9kZSxcbiAgaW5jb21pbmdDYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPGFwaS5MaW5rW10gfCB1bmRlZmluZWQ+IHtcbiAgaWYgKHRyYWNlTW9kZSAhPT0gJ2xpbmtlZCcpIHJldHVybiBsaW5rVG9DdXJyZW50Q29udGV4dCgpO1xuICBjb25zdCBvcmlnaW5MaW5rID0gYXdhaXQgbGlua1RvVHJhY2VDYXJyaWVyKFxuICAgIGlzVXNhYmxlVHJhY2VDYXJyaWVyKGluY29taW5nQ2FycmllcikgPyBpbmNvbWluZ0NhcnJpZXIgOiB1bmRlZmluZWRcbiAgKTtcbiAgcmV0dXJuIG9yaWdpbkxpbmsgPyBbb3JpZ2luTGlua10gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgY3VycmVudCB0cmFjZSBjb250ZXh0IGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgcGFzc2VkIHRocm91Z2ggcXVldWVzXG4gKiBAcmV0dXJucyBBIHJlY29yZCBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgdHJhY2UgY29udGV4dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VyaWFsaXplVHJhY2VDYXJyaWVyKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4ge307XG4gIGNvbnN0IGNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgLy8gSW5qZWN0IHRoZSBjdXJyZW50IGNvbnRleHQgaW50byB0aGUgY2FycmllclxuICBvdGVsLnByb3BhZ2F0aW9uLmluamVjdChvdGVsLmNvbnRleHQuYWN0aXZlKCksIGNhcnJpZXIpO1xuICByZXR1cm4gY2Fycmllcjtcbn1cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgdHJhY2UgY29udGV4dCBhbmQgcmV0dXJucyBhIGNvbnRleHQgdGhhdCBjYW4gYmUgdXNlZCB0byBjb250aW51ZSB0aGUgdHJhY2VcbiAqIEBwYXJhbSB0cmFjZUNhcnJpZXIgVGhlIHNlcmlhbGl6ZWQgdHJhY2UgY29udGV4dFxuICogQHJldHVybnMgT3BlblRlbGVtZXRyeSBjb250ZXh0IHdpdGggdGhlIHJlc3RvcmVkIHRyYWNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXNlcmlhbGl6ZVRyYWNlQ2FycmllcihcbiAgdHJhY2VDYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pIHtcbiAgY29uc3Qgb3RlbCA9IGF3YWl0IE90ZWxBcGkudmFsdWU7XG4gIGlmICghb3RlbCkgcmV0dXJuO1xuICAvLyBFeHRyYWN0IHRoZSBjb250ZXh0IGZyb20gdGhlIGNhcnJpZXJcbiAgcmV0dXJuIG90ZWwucHJvcGFnYXRpb24uZXh0cmFjdChvdGVsLmNvbnRleHQuYWN0aXZlKCksIHRyYWNlQ2Fycmllcik7XG59XG5cbi8qKlxuICogUnVucyBhIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIGRlc2VyaWFsaXplZCB0cmFjZVxuICogQHBhcmFtIHRyYWNlQ2FycmllciBUaGUgc2VyaWFsaXplZCB0cmFjZSBjYXJyaWVyIChvcHRpb25hbClcbiAqIEBwYXJhbSBmbiBUaGUgZnVuY3Rpb24gdG8gcnVuIHdpdGhpbiB0aGUgdHJhY2UgY29udGV4dFxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhUcmFjZUNvbnRleHQ8VD4oXG4gIHRyYWNlQ2FycmllcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCxcbiAgZm46ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBpZiAoIXRyYWNlQ2Fycmllcikge1xuICAgIHJldHVybiBmbigpO1xuICB9XG5cbiAgY29uc3Qgb3RlbCA9IGF3YWl0IE90ZWxBcGkudmFsdWU7XG4gIGlmICghb3RlbCkgcmV0dXJuIGZuKCk7XG5cbiAgY29uc3QgZXh0cmFjdGVkQ29udGV4dCA9IGF3YWl0IGRlc2VyaWFsaXplVHJhY2VDYXJyaWVyKHRyYWNlQ2Fycmllcik7XG4gIGlmICghZXh0cmFjdGVkQ29udGV4dCkge1xuICAgIHJldHVybiBmbigpO1xuICB9XG5cbiAgcmV0dXJuIG90ZWwuY29udGV4dC53aXRoKGV4dHJhY3RlZENvbnRleHQsIGFzeW5jICgpID0+IGF3YWl0IGZuKCkpO1xufVxuXG5jb25zdCBPdGVsQXBpID0gb25jZShhc3luYyAoKSA9PiB7XG4gIC8vIGBAb3BlbnRlbGVtZXRyeS9hcGlgIGlzIGFuIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeS4gVGhlIHN0YXRpYyBzcGVjaWZpZXJcbiAgLy8gaXMgaW50ZW50aW9uYWw6IGVzYnVpbGQtYnVuZGxlZCB0YXJnZXRzICh0aGUgQ0xJJ3NcbiAgLy8gYHZlcmNlbC1idWlsZC1vdXRwdXQtYXBpYCBidWlsZCwgTml0cm8sIEFzdHJvKSBzaGlwIGEgc2VsZi1jb250YWluZWRcbiAgLy8gYnVuZGxlIHdpdGggbm8gbm9kZV9tb2R1bGVzLCBzbyB0aGUgcGFja2FnZSBtdXN0IGJlICppbmxpbmVkKiBhdCBidWlsZFxuICAvLyB0aW1lIGZvciBzcGFucyB0byB3b3JrIGF0IHJ1bnRpbWUg4oCUIGEgcnVudGltZS1idWlsdCBzcGVjaWZpZXIgaXMgb3BhcXVlIHRvXG4gIC8vIGVzYnVpbGQgYW5kIHdvdWxkIHNpbGVudGx5IGRpc2FibGUgdHJhY2luZyB0aGVyZS4gQnVuZGxlcnMgdGhhdCByZWplY3QgYW5cbiAgLy8gdW5yZXNvbHZhYmxlIHN0YXRpYyBgaW1wb3J0KClgIHdoZW4gdGhlIHBlZXIgaXNuJ3QgaW5zdGFsbGVkIChSb2xsdXAvVml0ZSxcbiAgLy8gZS5nLiBTdmVsdGVLaXQpIGluc3RlYWQgZXh0ZXJuYWxpemUgYEBvcGVudGVsZW1ldHJ5L2FwaWAgaW4gdGhlIHdvcmtmbG93XG4gIC8vIGZyYW1ld29yayBpbnRlZ3JhdGlvbiwgd2hpY2gga2VlcHMgdGhlIGJ1aWxkIGdyZWVuIGFuZCBzdGlsbCBsb2FkcyByZWFsXG4gIC8vIE9UZWwgd2hlbiB0aGUgcGVlciBpcyBwcmVzZW50LiBSdW50aW1lIHNlbWFudGljczogcHJlc2VudCDihpIgbG9hZGVkLCBhYnNlbnRcbiAgLy8g4oaSIGNhdWdodCBhbmQgdHJhY2luZyBkaXNhYmxlZC5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgaW1wb3J0KCdAb3BlbnRlbGVtZXRyeS9hcGknKTtcbiAgfSBjYXRjaCB7XG4gICAgcnVudGltZUxvZ2dlci5pbmZvKCdPcGVuVGVsZW1ldHJ5IG5vdCBhdmFpbGFibGUsIHRyYWNpbmcgd2lsbCBiZSBkaXNhYmxlZCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59KTtcblxuY29uc3QgVHJhY2VyID0gb25jZShhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGFwaSA9IGF3YWl0IE90ZWxBcGkudmFsdWU7XG4gIGlmICghYXBpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgdHJhY2VyID0gYXBpLnRyYWNlLmdldFRyYWNlcignd29ya2Zsb3cnKTtcbiAgbG9nT3RlbERpYWdub3N0aWNPbmNlKGFwaSwgdHJhY2VyKTtcbiAgcmV0dXJuIHRyYWNlcjtcbn0pO1xuXG4vKipcbiAqIE9uZS1zaG90IHJ1bnRpbWUgZGlhZ25vc3RpYyAoREVCVUc9d29ya2Zsb3c6KiBvbmx5KSwgc2FtZSBzaGFwZSBhcyB0aGUgb25lXG4gKiB3b3JsZC12ZXJjZWwgZW1pdHMgdGFnZ2VkIGB3b3JsZC12ZXJjZWxgOiBwcmludHMgaG93IHRoaXMgbW9kdWxlIGluc3RhbmNlXG4gKiBvZiBgQG9wZW50ZWxlbWV0cnkvYXBpYCBzZWVzIHRoZSBnbG9iYWwgcmVnaXN0cmF0aW9uLCBzbyBhIGRlcGxveW1lbnQnc1xuICogbG9ncyBzaG93IHRoZSB0d28gcGFja2FnZXMnIHZpZXdzIHNpZGUgYnkgc2lkZS5cbiAqL1xubGV0IG90ZWxEaWFnTG9nZ2VkID0gZmFsc2U7XG5mdW5jdGlvbiBsb2dPdGVsRGlhZ25vc3RpY09uY2Uob3RlbDogdHlwZW9mIGFwaSwgdHJhY2VyOiBhcGkuVHJhY2VyKTogdm9pZCB7XG4gIGNvbnN0IGRlYnVnRW5hYmxlZCA9XG4gICAgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHByb2Nlc3MuZW52LkRFQlVHID09PSAnc3RyaW5nJyAmJlxuICAgIChwcm9jZXNzLmVudi5ERUJVRy5pbmNsdWRlcygnd29ya2Zsb3c6JykgfHwgcHJvY2Vzcy5lbnYuREVCVUcgPT09ICcqJyk7XG4gIGlmIChvdGVsRGlhZ0xvZ2dlZCB8fCAhZGVidWdFbmFibGVkKSByZXR1cm47XG4gIG90ZWxEaWFnTG9nZ2VkID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBnID0gKGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgU3ltYm9sLmZvcignb3BlbnRlbGVtZXRyeS5qcy5hcGkuMScpXG4gICAgXSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm92aWRlciA9IG90ZWwudHJhY2UuZ2V0VHJhY2VyUHJvdmlkZXIoKTtcbiAgICBjb25zdCBkZWxlZ2F0ZSA9XG4gICAgICAocHJvdmlkZXIgYXMgeyBnZXREZWxlZ2F0ZT86ICgpID0+IHVua25vd24gfSkuZ2V0RGVsZWdhdGU/LigpID8/IHByb3ZpZGVyO1xuICAgIGNvbnN0IHByb2JlID0gdHJhY2VyLnN0YXJ0U3Bhbignd29ya2Zsb3cub3RlbC5wcm9iZS5jb3JlJyk7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1t3b3JrZmxvdzpvdGVsLWRpYWddIGNvcmUnLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnbG9iYWxSZWdpc3RyYXRpb25WZXJzaW9uOiBnPy52ZXJzaW9uID8/IG51bGwsXG4gICAgICAgIHByb3ZpZGVyQ3RvcjogcHJvdmlkZXI/LmNvbnN0cnVjdG9yPy5uYW1lID8/IG51bGwsXG4gICAgICAgIGRlbGVnYXRlQ3RvcjogKGRlbGVnYXRlIGFzIG9iamVjdCB8IG51bGwpPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBudWxsLFxuICAgICAgICB0cmFjZXJDdG9yOiB0cmFjZXI/LmNvbnN0cnVjdG9yPy5uYW1lID8/IG51bGwsXG4gICAgICAgIHByb2JlQ3RvcjogcHJvYmU/LmNvbnN0cnVjdG9yPy5uYW1lID8/IG51bGwsXG4gICAgICAgIHByb2JlUmVjb3JkaW5nOiBwcm9iZS5pc1JlY29yZGluZygpLFxuICAgICAgfSlcbiAgICApO1xuICAgIHByb2JlLmVuZCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdbd29ya2Zsb3c6b3RlbC1kaWFnXSBjb3JlIGZhaWxlZDonLFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvclxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYWNlPFQ+KFxuICBzcGFuTmFtZTogc3RyaW5nLFxuICAuLi5hcmdzOlxuICAgIHwgW2ZuOiAoc3Bhbj86IFNwYW4pID0+IFByb21pc2U8VD5dXG4gICAgfCBbb3B0czogU3Bhbk9wdGlvbnMsIGZuOiAoc3Bhbj86IFNwYW4pID0+IFByb21pc2U8VD5dXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgW3RyYWNlciwgb3RlbF0gPSBhd2FpdCBQcm9taXNlLmFsbChbVHJhY2VyLnZhbHVlLCBPdGVsQXBpLnZhbHVlXSk7XG4gIGNvbnN0IHsgZm4sIG9wdHMgfSA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdmdW5jdGlvbidcbiAgICAgID8geyBmbjogYXJnc1swXSwgb3B0czoge30gfVxuICAgICAgOiB7IGZuOiBhcmdzWzFdLCBvcHRzOiBhcmdzWzBdIH07XG4gIGlmICghZm4pIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gdG8gdHJhY2UgbXVzdCBiZSBwcm92aWRlZCcpO1xuXG4gIGlmICghdHJhY2VyIHx8ICFvdGVsKSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH1cblxuICByZXR1cm4gdHJhY2VyLnN0YXJ0QWN0aXZlU3BhbihzcGFuTmFtZSwgb3B0cywgYXN5bmMgKHNwYW4pID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oc3Bhbik7XG4gICAgICBzcGFuLnNldFN0YXR1cyh7IGNvZGU6IG90ZWwuU3BhblN0YXR1c0NvZGUuT0sgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgY29kZTogb3RlbC5TcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgbWVzc2FnZTogKGUgYXMgRXJyb3IpLm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIGFwcGx5V29ya2Zsb3dTdXNwZW5zaW9uVG9TcGFuKGUsIG90ZWwsIHNwYW4pO1xuICAgICAgdGhyb3cgZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc3Bhbi5lbmQoKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEVtaXQgYSBzcGFuIHdob3NlIHN0YXJ0IGlzIGJhY2stZGF0ZWQgdG8gYHN0YXJ0RXBvY2hNc2AgYW5kIHdob3NlIGVuZCBpcyBub3csXG4gKiBzbyBpdHMgZHVyYXRpb24gcmVmbGVjdHMgYW4gaW50ZXJ2YWwgb25seSBtZWFzdXJhYmxlIGF0IGl0cyBlbmQgKGUuZy5cbiAqIHRpbWUtdG8tZmlyc3QtY2h1bmssIGtub3duIHdoZW4gdGhlIGZpcnN0IGNodW5rIGFycml2ZXMpLiBVbmxpa2UgYHRyYWNlKClgLFxuICogdGhpcyByZWNvcmRzIGFuIGFscmVhZHktZWxhcHNlZCBzcGFuIGluIG9uZSBzaG90IHJhdGhlciB0aGFuIHdyYXBwaW5nIGFcbiAqIGNhbGxiYWNrLiBOby1vcCB3aGVuIE9wZW5UZWxlbWV0cnkgaXMgbm90IGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlY29yZEVsYXBzZWRTcGFuKFxuICBzcGFuTmFtZTogc3RyaW5nLFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgb3B0cz86IFNwYW5PcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdHJhY2VyID0gYXdhaXQgVHJhY2VyLnZhbHVlO1xuICBpZiAoIXRyYWNlcikgcmV0dXJuO1xuICB0cmFjZXIuc3RhcnRTcGFuKHNwYW5OYW1lLCB7IC4uLm9wdHMsIHN0YXJ0VGltZTogc3RhcnRFcG9jaE1zIH0pLmVuZCgpO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgd29ya2Zsb3cgc3VzcGVuc2lvbiBhdHRyaWJ1dGVzIHRvIHRoZSBnaXZlbiBzcGFuIGlmIHRoZSBlcnJvciBpcyBhIFdvcmtmbG93U3VzcGVuc2lvblxuICogd2hpY2ggaXMgdGVjaG5pY2FsbHkgbm90IGFuIGVycm9yLCBidXQgYW4gYWxnZWJyYWljIGVmZmVjdCBpbmRpY2F0aW5nIHN1c3BlbnNpb24uXG4gKi9cbmZ1bmN0aW9uIGFwcGx5V29ya2Zsb3dTdXNwZW5zaW9uVG9TcGFuKFxuICBlcnJvcjogdW5rbm93bixcbiAgb3RlbDogdHlwZW9mIGFwaSxcbiAgc3BhbjogYXBpLlNwYW5cbikge1xuICBpZiAoIWVycm9yIHx8ICFXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyb3IpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBvdGVsLlNwYW5TdGF0dXNDb2RlLk9LIH0pO1xuICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgIC4uLkF0dHIuV29ya2Zsb3dTdXNwZW5zaW9uU3RhdGUoJ3N1c3BlbmRlZCcpLFxuICAgIC4uLkF0dHIuV29ya2Zsb3dTdXNwZW5zaW9uU3RlcENvdW50KGVycm9yLnN0ZXBDb3VudCksXG4gICAgLi4uQXR0ci5Xb3JrZmxvd1N1c3BlbnNpb25Ib29rQ291bnQoZXJyb3IuaG9va0NvdW50KSxcbiAgICAuLi5BdHRyLldvcmtmbG93U3VzcGVuc2lvbldhaXRDb3VudChlcnJvci53YWl0Q291bnQpLFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNwYW5Db250ZXh0Rm9yVHJhY2VDYXJyaWVyKFxuICBjYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pIHtcbiAgY29uc3QgW2Rlc2VyaWFsaXplZCwgb3RlbF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZGVzZXJpYWxpemVUcmFjZUNhcnJpZXIoY2FycmllciksXG4gICAgT3RlbEFwaS52YWx1ZSxcbiAgXSk7XG4gIGlmICghZGVzZXJpYWxpemVkIHx8ICFvdGVsKSByZXR1cm47XG4gIHJldHVybiBvdGVsLnRyYWNlLmdldFNwYW5Db250ZXh0KGRlc2VyaWFsaXplZCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBY3RpdmVTcGFuKCkge1xuICByZXR1cm4gYXdhaXQgd2l0aE90ZWwoKG90ZWwpID0+IG90ZWwudHJhY2UuZ2V0QWN0aXZlU3BhbigpKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhbGwgbWV0aG9kcyBvZiBhbiBvYmplY3Qgd2l0aCB0cmFjaW5nIHNwYW5zLlxuICogQHBhcmFtIHByZWZpeCAtIFByZWZpeCBmb3Igc3BhbiBuYW1lcyAoZS5nLiwgXCJXT1JMRC5ydW5zXCIpXG4gKiBAcGFyYW0gbyAtIE9iamVjdCB3aXRoIG1ldGhvZHMgdG8gaW5zdHJ1bWVudFxuICogQHJldHVybnMgSW5zdHJ1bWVudGVkIG9iamVjdCB3aXRoIHNhbWUgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0cnVtZW50T2JqZWN0PFQgZXh0ZW5kcyBvYmplY3Q+KHByZWZpeDogc3RyaW5nLCBvOiBUKTogVCB7XG4gIGNvbnN0IGhhbmRsZXJzID0ge30gYXMgVDtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobykgYXMgKGtleW9mIFQpW10pIHtcbiAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaGFuZGxlcnNba2V5XSA9IG9ba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZiA9IG9ba2V5XTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgIGhhbmRsZXJzW2tleV0gPSBhc3luYyAoLi4uYXJnczogYW55W10pID0+XG4gICAgICAgIHRyYWNlKGAke3ByZWZpeH0uJHtTdHJpbmcoa2V5KX1gLCB7fSwgKCkgPT4gZiguLi5hcmdzKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBoYW5kbGVycztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNwYW5LaW5kKGZpZWxkOiBrZXlvZiB0eXBlb2YgU3BhbktpbmQpIHtcbiAgcmV0dXJuIHdpdGhPdGVsKCh4KSA9PiB4LlNwYW5LaW5kW2ZpZWxkXSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoT3RlbDxUPihcbiAgZm46IChvdGVsOiB0eXBlb2YgYXBpKSA9PiBUXG4pOiBQcm9taXNlPEF3YWl0ZWQ8VD4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgb3RlbCA9IGF3YWl0IE90ZWxBcGkudmFsdWU7XG4gIGlmICghb3RlbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGF3YWl0IGZuKG90ZWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlua1RvQ3VycmVudENvbnRleHQoKTogUHJvbWlzZTxbYXBpLkxpbmtdIHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiB3aXRoT3RlbCgob3RlbCk6IFthcGkuTGlua10gfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBvdGVsLnRyYWNlLmdldEFjdGl2ZVNwYW4oKT8uc3BhbkNvbnRleHQoKTtcbiAgICBpZiAoIWNvbnRleHQpIHJldHVybjtcbiAgICByZXR1cm4gW3sgY29udGV4dCB9XTtcbiAgfSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgc3BhbiBsaW5rIHBvaW50aW5nIGF0IHRoZSBzcGFuIGNvbnRleHQgZW1iZWRkZWQgaW4gYSBzZXJpYWxpemVkXG4gKiB0cmFjZSBjYXJyaWVyIChlLmcuIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgZmxvd2luZyB0aHJvdWdoIHF1ZXVlXG4gKiBtZXNzYWdlcykuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBPVEVMIGlzIHVuYXZhaWxhYmxlLCB0aGUgY2FycmllciBpc1xuICogYWJzZW50LCBvciBpdCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgc3BhbiBjb250ZXh0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlua1RvVHJhY2VDYXJyaWVyKFxuICBjYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPGFwaS5MaW5rIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghY2FycmllcikgcmV0dXJuO1xuICBjb25zdCBbY29udGV4dCwgb3RlbF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZ2V0U3BhbkNvbnRleHRGb3JUcmFjZUNhcnJpZXIoY2FycmllciksXG4gICAgT3RlbEFwaS52YWx1ZSxcbiAgXSk7XG4gIGlmICghY29udGV4dCB8fCAhb3RlbCkgcmV0dXJuO1xuICBpZiAoIW90ZWwudHJhY2UuaXNTcGFuQ29udGV4dFZhbGlkKGNvbnRleHQpKSByZXR1cm47XG4gIHJldHVybiB7IGNvbnRleHQgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCYWdnYWdlIFByb3BhZ2F0aW9uIFV0aWxpdGllc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogV29ya2Zsb3cgY29udGV4dCB0byBwcm9wYWdhdGUgdmlhIGJhZ2dhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0JhZ2dhZ2VDb250ZXh0IHtcbiAgd29ya2Zsb3dSdW5JZDogc3RyaW5nO1xuICB3b3JrZmxvd05hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZXRzIHdvcmtmbG93IGNvbnRleHQgYXMgT1RFTCBiYWdnYWdlIGZvciBhdXRvbWF0aWMgcHJvcGFnYXRpb24uXG4gKiBCYWdnYWdlIGlzIHByb3BhZ2F0ZWQgYWNyb3NzIHNlcnZpY2UgYm91bmRhcmllcyB2aWEgSFRUUCBoZWFkZXJzLlxuICogQHBhcmFtIGNvbnRleHQgLSBXb3JrZmxvdyBjb250ZXh0IHRvIHNldCBhcyBiYWdnYWdlXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRvIHJ1biB3aXRoaW4gdGhlIGJhZ2dhZ2UgY29udGV4dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFdvcmtmbG93QmFnZ2FnZTxUPihcbiAgY29udGV4dDogV29ya2Zsb3dCYWdnYWdlQ29udGV4dCxcbiAgZm46ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gZm4oKTtcblxuICAvLyBDcmVhdGUgYmFnZ2FnZSB3aXRoIHdvcmtmbG93IGNvbnRleHRcbiAgY29uc3QgYmFnZ2FnZSA9IG90ZWwucHJvcGFnYXRpb24uY3JlYXRlQmFnZ2FnZSh7XG4gICAgJ3dvcmtmbG93LnJ1bl9pZCc6IHsgdmFsdWU6IGNvbnRleHQud29ya2Zsb3dSdW5JZCB9LFxuICAgICd3b3JrZmxvdy5uYW1lJzogeyB2YWx1ZTogY29udGV4dC53b3JrZmxvd05hbWUgfSxcbiAgfSk7XG5cbiAgLy8gU2V0IGJhZ2dhZ2UgaW4gY29udGV4dCBhbmQgcnVuIGZ1bmN0aW9uXG4gIGNvbnN0IGNvbnRleHRXaXRoQmFnZ2FnZSA9IG90ZWwucHJvcGFnYXRpb24uc2V0QmFnZ2FnZShcbiAgICBvdGVsLmNvbnRleHQuYWN0aXZlKCksXG4gICAgYmFnZ2FnZVxuICApO1xuXG4gIHJldHVybiBvdGVsLmNvbnRleHQud2l0aChjb250ZXh0V2l0aEJhZ2dhZ2UsICgpID0+IGZuKCkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB3b3JrZmxvdyBjb250ZXh0IGZyb20gT1RFTCBiYWdnYWdlLlxuICogQHJldHVybnMgV29ya2Zsb3cgY29udGV4dCBpZiBwcmVzZW50IGluIGJhZ2dhZ2UsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdvcmtmbG93QmFnZ2FnZSgpOiBQcm9taXNlPFxuICBXb3JrZmxvd0JhZ2dhZ2VDb250ZXh0IHwgdW5kZWZpbmVkXG4+IHtcbiAgY29uc3Qgb3RlbCA9IGF3YWl0IE90ZWxBcGkudmFsdWU7XG4gIGlmICghb3RlbCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBiYWdnYWdlID0gb3RlbC5wcm9wYWdhdGlvbi5nZXRCYWdnYWdlKG90ZWwuY29udGV4dC5hY3RpdmUoKSk7XG4gIGlmICghYmFnZ2FnZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBydW5JZCA9IGJhZ2dhZ2UuZ2V0RW50cnkoJ3dvcmtmbG93LnJ1bl9pZCcpPy52YWx1ZTtcbiAgY29uc3QgbmFtZSA9IGJhZ2dhZ2UuZ2V0RW50cnkoJ3dvcmtmbG93Lm5hbWUnKT8udmFsdWU7XG5cbiAgaWYgKCFydW5JZCB8fCAhbmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIHdvcmtmbG93TmFtZTogbmFtZSxcbiAgfTtcbn1cbiJdfQ==
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const version = "5.0.0-beta.32";
1
+ export declare const version = "5.0.0-beta.34";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Generated by genversion.
2
- export const version = '5.0.0-beta.32';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR2VuZXJhdGVkIGJ5IGdlbnZlcnNpb24uXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICc1LjAuMC1iZXRhLjMyJ1xuIl19
2
+ export const version = '5.0.0-beta.34';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR2VuZXJhdGVkIGJ5IGdlbnZlcnNpb24uXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICc1LjAuMC1iZXRhLjM0J1xuIl19
@@ -405,12 +405,17 @@ Two queue topics are created per deployment:
405
405
  | `step.func` | `__wkf_step_*` | Step execution (long-running, `maxDuration: max`) |
406
406
  | `flow.func` | `__wkf_workflow_*` | Workflow orchestration (`maxDuration: 60`) |
407
407
 
408
- If you're building a framework integration that targets Vercel, you should write these triggers into the `.vc-config.json` for each generated function. The `STEP_QUEUE_TRIGGER` and `WORKFLOW_QUEUE_TRIGGER` constants are exported from `@workflow/builders` for this purpose:
408
+ If you're building a framework integration that targets Vercel, you should write these triggers into the `.vc-config.json` for each generated function. Use `getWorkflowQueueTrigger()` for flow functions so `WORKFLOW_SEQUENTIAL_REPLAYS=1` is reflected in the generated trigger configuration (it also accepts a `namespace` option, matching `createWorkflowQueueTrigger`); `STEP_QUEUE_TRIGGER` is exported for step functions:
409
409
 
410
410
  ```typescript
411
- import { STEP_QUEUE_TRIGGER, WORKFLOW_QUEUE_TRIGGER } from "@workflow/builders";
411
+ import { getWorkflowQueueTrigger, STEP_QUEUE_TRIGGER } from "@workflow/builders";
412
+
413
+ const flowTriggers = [getWorkflowQueueTrigger()];
414
+ const stepTriggers = [STEP_QUEUE_TRIGGER];
412
415
  ```
413
416
 
417
+ If your integration constructs the flow trigger object itself instead of calling `getWorkflowQueueTrigger()`, it must add `maxConcurrency: 1` to that trigger when sequential replays are enabled at build time (`WORKFLOW_SEQUENTIAL_REPLAYS=1`, or `WORKFLOW_SAFE_MODE=1` when the specific variable is unset — the exported `isSequentialReplaysEnabled()` helper implements this check). The runtime half of the feature (per-run queue topics) activates from the environment variable alone — without the trigger half, those per-run topics are not serialized and the setting only adds queue-topic cardinality.
418
+
414
419
 
415
420
  ### Custom implementations
416
421
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/core",
3
- "version": "5.0.0-beta.32",
3
+ "version": "5.0.0-beta.34",
4
4
  "description": "Core runtime and engine for Workflow SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -101,9 +101,9 @@
101
101
  "@workflow/errors": "5.0.0-beta.10",
102
102
  "@workflow/serde": "5.0.0-beta.2",
103
103
  "@workflow/utils": "5.0.0-beta.6",
104
- "@workflow/world": "5.0.0-beta.19",
105
- "@workflow/world-local": "5.0.0-beta.27",
106
- "@workflow/world-vercel": "5.0.0-beta.28"
104
+ "@workflow/world": "5.0.0-beta.20",
105
+ "@workflow/world-local": "5.0.0-beta.28",
106
+ "@workflow/world-vercel": "5.0.0-beta.30"
107
107
  },
108
108
  "devDependencies": {
109
109
  "@opentelemetry/api": "1.9.0",
@@ -116,6 +116,7 @@
116
116
  "@types/semver": "7.7.1",
117
117
  "cross-env": "10.1.0",
118
118
  "genversion": "3.2.0",
119
+ "typescript": "^6.0.3",
119
120
  "@workflow/tsconfig": "5.0.0-beta.0"
120
121
  },
121
122
  "peerDependencies": {