@workflow/core 5.0.0-beta.7 → 5.0.0-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/runtime/helpers.js +2 -2
- package/dist/set-attributes.d.ts +15 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +17 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +44 -6
- package/dist/step/context-storage.d.ts +14 -0
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +1 -1
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +20 -3
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -1
- package/dist/workflow/set-attributes.d.ts +74 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +81 -0
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +12 -3
- package/package.json +7 -7
package/dist/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
export { FatalError, RetryableError, type RetryableErrorOptions, } from '@workflow/errors';
|
|
13
13
|
export { createHook, createWebhook, type Hook, type HookOptions, type RequestWithResponse, type Webhook, type WebhookOptions, } from './create-hook.js';
|
|
14
14
|
export { defineHook, type TypedHook } from './define-hook.js';
|
|
15
|
+
export { experimental_setAttributes } from './set-attributes.js';
|
|
15
16
|
export { sleep } from './sleep.js';
|
|
16
17
|
export { getStepMetadata, type StepMetadata, } from './step/get-step-metadata.js';
|
|
17
18
|
export { getWorkflowMetadata, type WorkflowMetadata, } from './step/get-workflow-metadata.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,UAAU,EACV,aAAa,EACb,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EACL,eAAe,EACf,KAAK,YAAY,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,KAAK,gBAAgB,GACtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,WAAW,EACX,KAAK,6BAA6B,GACnC,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,UAAU,EACV,aAAa,EACb,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EACL,eAAe,EACf,KAAK,YAAY,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,KAAK,gBAAgB,GACtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,WAAW,EACX,KAAK,6BAA6B,GACnC,MAAM,2BAA2B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -12,8 +12,9 @@
|
|
|
12
12
|
export { FatalError, RetryableError, } from '@workflow/errors';
|
|
13
13
|
export { createHook, createWebhook, } from './create-hook.js';
|
|
14
14
|
export { defineHook } from './define-hook.js';
|
|
15
|
+
export { experimental_setAttributes } from './set-attributes.js';
|
|
15
16
|
export { sleep } from './sleep.js';
|
|
16
17
|
export { getStepMetadata, } from './step/get-step-metadata.js';
|
|
17
18
|
export { getWorkflowMetadata, } from './step/get-workflow-metadata.js';
|
|
18
19
|
export { getWritable, } from './step/writable-stream.js';
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFDTCxVQUFVLEVBQ1YsY0FBYyxHQUVmLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLFVBQVUsRUFDVixhQUFhLEdBTWQsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFrQixNQUFNLGtCQUFrQixDQUFDO0FBQzlELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUNMLGVBQWUsR0FFaEIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsbUJBQW1CLEdBRXBCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUNMLFdBQVcsR0FFWixNQUFNLDJCQUEyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKdXN0IHRoZSBjb3JlIHV0aWxpdGllcyB0aGF0IGFyZSBtZWFudCB0byBiZSBpbXBvcnRlZCBieSB1c2VyXG4gKiBzdGVwcy93b3JrZmxvd3MuIFRoaXMgYWxsb3dzIHRoZSBidW5kbGVyIHRvIHRyZWUtc2hha2UgYW5kIGxpbWl0IHdoYXQgZ29lc1xuICogaW50byB0aGUgZmluYWwgdXNlciBidW5kbGVzLiBMb2dpYyBmb3IgcnVubmluZy9oYW5kbGluZyBzdGVwcy93b3JrZmxvd3NcbiAqIHNob3VsZCBsaXZlIGluIHJ1bnRpbWUuIEV2ZW50dWFsbHkgdGhlc2UgbWlnaHQgYmUgc2VwYXJhdGUgcGFja2FnZXNcbiAqIGB3b3JrZmxvd2AgYW5kIGB3b3JrZmxvdy9ydW50aW1lYD9cbiAqXG4gKiBFdmVyeXRoaW5nIGhlcmUgd2lsbCBnZXQgcmUtZXhwb3J0ZWQgdW5kZXIgdGhlICd3b3JrZmxvdycgdG9wIGxldmVsIHBhY2thZ2UuXG4gKiBUaGlzIHNob3VsZCBiZSBhIG1pbmltYWwgc2V0IG9mIEFQSXMgc28gKipkbyBub3QgYW55dGhpbmcgaGVyZSoqIHVubGVzcyBpdCdzXG4gKiBuZWVkZWQgZm9yIHVzZXJsYW5kIHdvcmtmbG93IGNvZGUuXG4gKi9cblxuZXhwb3J0IHtcbiAgRmF0YWxFcnJvcixcbiAgUmV0cnlhYmxlRXJyb3IsXG4gIHR5cGUgUmV0cnlhYmxlRXJyb3JPcHRpb25zLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZUhvb2ssXG4gIGNyZWF0ZVdlYmhvb2ssXG4gIHR5cGUgSG9vayxcbiAgdHlwZSBIb29rT3B0aW9ucyxcbiAgdHlwZSBSZXF1ZXN0V2l0aFJlc3BvbnNlLFxuICB0eXBlIFdlYmhvb2ssXG4gIHR5cGUgV2ViaG9va09wdGlvbnMsXG59IGZyb20gJy4vY3JlYXRlLWhvb2suanMnO1xuZXhwb3J0IHsgZGVmaW5lSG9vaywgdHlwZSBUeXBlZEhvb2sgfSBmcm9tICcuL2RlZmluZS1ob29rLmpzJztcbmV4cG9ydCB7IGV4cGVyaW1lbnRhbF9zZXRBdHRyaWJ1dGVzIH0gZnJvbSAnLi9zZXQtYXR0cmlidXRlcy5qcyc7XG5leHBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuZXhwb3J0IHtcbiAgZ2V0U3RlcE1ldGFkYXRhLFxuICB0eXBlIFN0ZXBNZXRhZGF0YSxcbn0gZnJvbSAnLi9zdGVwL2dldC1zdGVwLW1ldGFkYXRhLmpzJztcbmV4cG9ydCB7XG4gIGdldFdvcmtmbG93TWV0YWRhdGEsXG4gIHR5cGUgV29ya2Zsb3dNZXRhZGF0YSxcbn0gZnJvbSAnLi9zdGVwL2dldC13b3JrZmxvdy1tZXRhZGF0YS5qcyc7XG5leHBvcnQge1xuICBnZXRXcml0YWJsZSxcbiAgdHlwZSBXb3JrZmxvd1dyaXRhYmxlU3RyZWFtT3B0aW9ucyxcbn0gZnJvbSAnLi9zdGVwL3dyaXRhYmxlLXN0cmVhbS5qcyc7XG4iXX0=
|
package/dist/runtime/helpers.js
CHANGED
|
@@ -252,7 +252,7 @@ export async function loadWorkflowRunEvents(runId, afterCursor) {
|
|
|
252
252
|
// Preserve the last non-null cursor across pages. A World may
|
|
253
253
|
// legitimately return `{ data: [], cursor: null, hasMore: false }`
|
|
254
254
|
// on a trailing empty page — for example when the previous page's
|
|
255
|
-
// underlying
|
|
255
|
+
// underlying DB query hit the limit exactly and returned a
|
|
256
256
|
// `LastEvaluatedKey` "just in case". Overwriting with that null
|
|
257
257
|
// would lose the position past the last real event we loaded and
|
|
258
258
|
// force the runtime into the "no cursor after initial load" full-
|
|
@@ -401,4 +401,4 @@ export function memoizeEncryptionKey(world, runOrId) {
|
|
|
401
401
|
return cached;
|
|
402
402
|
};
|
|
403
403
|
}
|
|
404
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixvQkFBb0IsRUFDcEIsbUJBQW1CLEdBQ3BCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXhDLE9BQU8sRUFBa0IsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbkQsd0RBQXdEO0FBQ3hELE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDO0FBRTVDOzs7O0dBSUc7QUFDSCxNQUFNLDBCQUEwQixHQUFHLHNCQUFzQixDQUFDO0FBRTFEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsWUFBb0I7SUFDdkQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ25ELE1BQU0sSUFBSSxLQUFLLENBQ2IsMEJBQTBCLFlBQVksd0dBQXdHLENBQy9JLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxrQkFBa0IsWUFBWSxFQUFvQixDQUFDO0FBQzVELENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0FBRXRDOztHQUVHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FBQyxhQUFxQjtJQUNyRCxPQUFPLG1C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QUFDLE9BQU8sQ0FBQyxXQUFXO1FBQUUsT0FBTztJQUNqQyxJQUFJLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQyxlQUFlLENBQzlCLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU87SUFDVCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEtBQVksRUFDWixPQUE2QjtJQUU3QixJQUFJLE1BQWtELENBQUM7SUFDdkQsT0FBTyxHQUFHLEVBQUU7UUFDVixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDbkIsMkRBQTJEO2dCQUMzRCxxRUFBcUU7Z0JBQ3JFLDhEQUE4RDtnQkFDOUQsTUFBTSxNQUFNLEdBQ1YsT0FBTyxPQUFPLEtBQUssUUFBUTtvQkFDekIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUMsT0FBTyxDQUFDO29CQUMvQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDcEQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBFdmVudCxcbiAgSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBWYWxpZFF1ZXVlTmFtZSxcbiAgV29ya2Zsb3dSdW4sXG4gIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgSGVhbHRoQ2hlY2tQYXlsb2FkU2NoZW1hLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX0xFR0FDWSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcblxuaW1wb3J0IHsgdHlwZSBDcnlwdG9LZXksIGltcG9ydEtleSB9IGZyb20gJy4uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IGdldFNwYW5LaW5kLCB0cmFjZSB9IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIHdvcmtmbG93Q29yZVZlcnNpb24gfSBmcm9tICcuLi92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vZ2V0LXdvcmxkLWxhenkuanMnO1xuXG4vKiogRGVmYXVsdCB0aW1lb3V0IGZvciBoZWFsdGggY2hlY2tzIGluIG1pbGxpc2Vjb25kcyAqL1xuY29uc3QgREVGQVVMVF9IRUFMVEhfQ0hFQ0tfVElNRU9VVCA9IDMwXzAwMDtcblxuLyoqXG4gKiBQYXR0ZXJuIGZvciBzYWZlIHdvcmtmbG93IG5hbWVzLiBPbmx5IGFsbG93cyBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyxcbiAqIHVuZGVyc2NvcmVzLCBoeXBoZW5zLCBkb3RzLCBmb3J3YXJkIHNsYXNoZXMgKGZvciBuYW1lc3BhY2VkIHdvcmtmbG93cyksXG4gKiBhbmQgYXQgc2lnbnMgKGZvciBzY29wZWQgcGFja2FnZXMpLlxuICovXG5jb25zdCBTQUZFX1dPUktGTE9XX05BTUVfUEFUVEVSTiA9IC9eW2EtekEtWjAtOV9cXC0uL0BdKyQvO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBhIHdvcmtmbG93IG5hbWUgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcXVldWUgbmFtZS5cbiAqIEVuc3VyZXMgdGhlIHdvcmtmbG93IG5hbWUgb25seSBjb250YWlucyBzYWZlIGNoYXJhY3RlcnMgYmVmb3JlXG4gKiBpbnRlcnBvbGF0aW5nIGl0IGludG8gdGhlIHF1ZXVlIG5hbWUgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lOiBzdHJpbmcpOiBWYWxpZFF1ZXVlTmFtZSB7XG4gIGlmICghU0FGRV9XT1JLRkxPV19OQU1FX1BBVFRFUk4udGVzdCh3b3JrZmxvd05hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgd29ya2Zsb3cgbmFtZSBcIiR7d29ya2Zsb3dOYW1lfVwiOiBtdXN0IG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgdW5kZXJzY29yZXMsIGh5cGhlbnMsIGRvdHMsIGZvcndhcmQgc2xhc2hlcywgb3IgYXQgc2lnbnNgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYF9fd2tmX3dvcmtmbG93XyR7d29ya2Zsb3dOYW1lfWAgYXMgVmFsaWRRdWV1ZU5hbWU7XG59XG5cbmNvbnN0IGdlbmVyYXRlSWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RyZWFtIG5hbWUgZm9yIGEgaGVhbHRoIGNoZWNrIHdpdGggdGhlIGdpdmVuIGNvcnJlbGF0aW9uIElELlxuICovXG5mdW5jdGlvbiBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBfX2hlYWx0aF9jaGVja19fJHtjb3JyZWxhdGlvbklkfWA7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgaGVhbHRoIGNoZWNrIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja1Jlc3VsdCB7XG4gIGhlYWx0aHk6IGJvb2xlYW47XG4gIC8qKiBFcnJvciBtZXNzYWdlIGlmIGhlYWx0aCBjaGVjayBmYWlsZWQgKi9cbiAgZXJyb3I/OiBzdHJpbmc7XG4gIC8qKiBMYXRlbmN5IGlmIHRoZSBoZWFsdGggY2hlY2sgd2FzIHN1Y2Nlc3NmdWwgKi9cbiAgbGF0ZW5jeU1zPzogbnVtYmVyO1xuICAvKiogU3BlYyB2ZXJzaW9uIG9mIHRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQgKi9cbiAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgaGVhbHRoIGNoZWNrIHBheWxvYWQuXG4gKiBJZiBzbywgcmV0dXJucyB0aGUgcGFyc2VkIHBheWxvYWQuIE90aGVyd2lzZSByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkKFxuICBtZXNzYWdlOiB1bmtub3duXG4pOiBIZWFsdGhDaGVja1BheWxvYWQgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXN1bHQgPSBIZWFsdGhDaGVja1BheWxvYWRTY2hlbWEuc2FmZVBhcnNlKG1lc3NhZ2UpO1xuICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBkZXRlcm1pbmlzdGljIGZha2UgcnVuSWQgZm9yIGhlYWx0aCBjaGVjayBzdHJlYW1zLlxuICogQm90aCB0aGUgd3JpdGVyIChoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UpIGFuZCByZWFkZXIgKGhlYWx0aENoZWNrKSBkZXJpdmVcbiAqIHRoZSBzYW1lIHJ1bklkIGZyb20gdGhlIGNvcnJlbGF0aW9uSWQgc28gdGhhdCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzY29wZVxuICogc3RyZWFtIHJlYWRzIGJ5IHJ1bklkIHN0aWxsIHdvcmsgY29ycmVjdGx5LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUhlYWx0aENoZWNrUnVuSWQoY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGB3cnVuX2hjXyR7Y29ycmVsYXRpb25JZH1gO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBoZWFsdGggY2hlY2sgbWVzc2FnZSBieSB3cml0aW5nIHRoZSByZXN1bHQgdG8gdGhlIHdvcmxkJ3Mgc3RyZWFtLlxuICogVGhlIGNhbGxlciBjYW4gbGlzdGVuIHRvIHRoaXMgc3RyZWFtIHRvIGdldCB0aGUgaGVhbHRoIGNoZWNrIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSBoZWFsdGhDaGVjayAtIFRoZSBwYXJzZWQgaGVhbHRoIGNoZWNrIHBheWxvYWRcbiAqIEBwYXJhbSBlbmRwb2ludCAtIFdoaWNoIGVuZHBvaW50IGlzIHJlc3BvbmRpbmcgKCd3b3JrZmxvdycgb3IgJ3N0ZXAnKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlKFxuICBoZWFsdGhDaGVjazogSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBlbmRwb2ludDogJ3dvcmtmbG93JyB8ICdzdGVwJyxcbiAgd29ybGRTcGVjVmVyc2lvbj86IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPSBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIGhlYWx0aHk6IHRydWUsXG4gICAgZW5kcG9pbnQsXG4gICAgY29ycmVsYXRpb25JZDogaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCxcbiAgICBzcGVjVmVyc2lvbjogd29ybGRTcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgfSk7XG4gIC8vIFVzZSBhIGRldGVybWluaXN0aWMgZmFrZSBydW5JZCBkZXJpdmVkIGZyb20gdGhlIGNvcnJlbGF0aW9uSWQgc28gdGhhdFxuICAvLyB0aGUgcmVhZGVyIHNpZGUgcHJvZHVjZXMgdGhlIHNhbWUgdmFsdWUuXG4gIGNvbnN0IGZha2VSdW5JZCA9IGdlbmVyYXRlSGVhbHRoQ2hlY2tSdW5JZChoZWFsdGhDaGVjay5jb3JyZWxhdGlvbklkKTtcbiAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShmYWtlUnVuSWQsIHN0cmVhbU5hbWUsIHJlc3BvbnNlKTtcbiAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShmYWtlUnVuSWQsIHN0cmVhbU5hbWUpO1xufVxuXG5leHBvcnQgdHlwZSBIZWFsdGhDaGVja0VuZHBvaW50ID0gJ3dvcmtmbG93JyB8ICdzdGVwJztcblxuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja09wdGlvbnMge1xuICAvKiogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgaGVhbHRoIGNoZWNrIHJlc3BvbnNlLiBEZWZhdWx0OiAzMDAwMCAoMzBzKSAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogRGVwbG95bWVudCBJRCB0byBzZW5kIHRoZSBoZWFsdGggY2hlY2sgdG8uIEZhbGxzIGJhY2sgdG8gcHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQuICovXG4gIGRlcGxveW1lbnRJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGhlYWx0aCBjaGVjayBieSBzZW5kaW5nIGEgbWVzc2FnZSB0aHJvdWdoIHRoZSBxdWV1ZSBwaXBlbGluZVxuICogYW5kIHZlcmlmeWluZyBpdCBpcyBwcm9jZXNzZWQgYnkgdGhlIHNwZWNpZmllZCBlbmRwb2ludC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGJ5cGFzc2VzIERlcGxveW1lbnQgUHJvdGVjdGlvbiBvbiBWZXJjZWwgYmVjYXVzZSBpdCBnb2VzXG4gKiB0aHJvdWdoIHRoZSBxdWV1ZSBpbmZyYXN0cnVjdHVyZSByYXRoZXIgdGhhbiBkaXJlY3QgSFRUUC5cbiAqXG4gKiBAcGFyYW0gd29ybGQgLSBUaGUgV29ybGQgaW5zdGFuY2UgdG8gdXNlIGZvciB0aGUgaGVhbHRoIGNoZWNrXG4gKiBAcGFyYW0gZW5kcG9pbnQgLSBXaGljaCBlbmRwb2ludCB0byBoZWFsdGggY2hlY2s6ICd3b3JrZmxvdycgb3IgJ3N0ZXAnXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBoZWFsdGggY2hlY2tcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGhlYWx0aCBjaGVjayByZXN1bHRcbiAqL1xuLy8gUG9sbCBpbnRlcnZhbCBmb3IgaGVhbHRoIGNoZWNrIHJldHJpZXMgKG1zKVxuY29uc3QgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwgPSAxMDA7XG4vLyBQZXItcmVhZCB0aW1lb3V0IHRvIHByZXZlbnQgYmxvY2tpbmcgZm9yZXZlciBvbiBsb2NhbCB3b3JsZCdzIEV2ZW50RW1pdHRlclxuLy8gKHdoaWNoIGRvZXNuJ3Qgd29yayBhY3Jvc3MgcHJvY2Vzc2VzKVxuY29uc3QgSEVBTFRIX0NIRUNLX1JFQURfVElNRU9VVCA9IDUwMDtcblxuLyoqXG4gKiBSZWFkIGNodW5rcyBmcm9tIGEgc3RyZWFtIHdpdGggYSB0aW1lb3V0IHBlciByZWFkIG9wZXJhdGlvbi5cbiAqIFJldHVybnMgeyBjaHVua3MsIHRpbWVkT3V0IH0gd2hlcmUgdGltZWRPdXQgaW5kaWNhdGVzIGlmIGEgcmVhZCB0aW1lZCBvdXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRTdHJlYW1XaXRoVGltZW91dChcbiAgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI8VWludDhBcnJheT4sXG4gIHJlYWRUaW1lb3V0OiBudW1iZXJcbik6IFByb21pc2U8eyBjaHVua3M6IFVpbnQ4QXJyYXlbXTsgdGltZWRPdXQ6IGJvb2xlYW4gfT4ge1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgZG9uZSA9IGZhbHNlO1xuICBsZXQgdGltZWRPdXQgPSBmYWxzZTtcblxuICB3aGlsZSAoIWRvbmUgJiYgIXRpbWVkT3V0KSB7XG4gICAgY29uc3QgcmVhZFByb21pc2UgPSByZWFkZXIucmVhZCgpO1xuICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8eyBkb25lOiB0cnVlOyB2YWx1ZTogdW5kZWZpbmVkIH0+KFxuICAgICAgKHJlc29sdmUpID0+XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfSwgcmVhZFRpbWVvdXQpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbcmVhZFByb21pc2UsIHRpbWVvdXRQcm9taXNlXSk7XG4gICAgZG9uZSA9IHJlc3VsdC5kb25lO1xuICAgIGlmIChyZXN1bHQudmFsdWUpIGNodW5rcy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gIH1cblxuICByZXR1cm4geyBjaHVua3MsIHRpbWVkT3V0IH07XG59XG5cbi8qKlxuICogUGFyc2UgYW5kIHZhbGlkYXRlIGEgaGVhbHRoIGNoZWNrIHJlc3BvbnNlIGZyb20gc3RyZWFtIGNodW5rcy5cbiAqIFJldHVybnMgdGhlIHBhcnNlZCByZXNwb25zZSBvciBudWxsIGlmIGludmFsaWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSGVhbHRoQ2hlY2tSZXNwb25zZShcbiAgY2h1bmtzOiBVaW50OEFycmF5W11cbik6IHsgaGVhbHRoeTogYm9vbGVhbiB9IHwgbnVsbCB7XG4gIGlmIChjaHVua3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB0b3RhbExlbmd0aCA9IGNodW5rcy5yZWR1Y2UoKHN1bSwgY2h1bmspID0+IHN1bSArIGNodW5rLmxlbmd0aCwgMCk7XG4gIGNvbnN0IGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICBjb21iaW5lZC5zZXQoY2h1bmssIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcbiAgfVxuICBjb25zdCByZXNwb25zZVRleHQgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoY29tYmluZWQpO1xuXG4gIGxldCByZXNwb25zZTogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gT2xkIGRlcGxveW1lbnRzIChzcGVjVmVyc2lvbiA8IDMpIHJldHVybiBwbGFpbiB0ZXh0IGxpa2VcbiAgICAvLyAnV29ya2Zsb3cgU0RLIFwiLi4uXCIgZW5kcG9pbnQgaXMgaGVhbHRoeScuIFRyZWF0IGFueSBub24tZW1wdHlcbiAgICAvLyB0ZXh0IHJlc3BvbnNlIGFzIGEgaGVhbHRoeSBkZXBsb3ltZW50IHdpdGggdW5rbm93biBzcGVjVmVyc2lvbi5cbiAgICBpZiAocmVzcG9uc2VUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7IGhlYWx0aHk6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHJlc3BvbnNlICE9PSAnb2JqZWN0JyB8fFxuICAgIHJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgISgnaGVhbHRoeScgaW4gcmVzcG9uc2UpIHx8XG4gICAgdHlwZW9mIChyZXNwb25zZSBhcyB7IGhlYWx0aHk6IHVua25vd24gfSkuaGVhbHRoeSAhPT0gJ2Jvb2xlYW4nXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgciA9IHJlc3BvbnNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBwYXJzZWQ6IHsgaGVhbHRoeTogYm9vbGVhbjsgc3BlY1ZlcnNpb24/OiBudW1iZXIgfSA9IHtcbiAgICBoZWFsdGh5OiByLmhlYWx0aHkgYXMgYm9vbGVhbixcbiAgfTtcbiAgaWYgKHR5cGVvZiByLnNwZWNWZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHBhcnNlZC5zcGVjVmVyc2lvbiA9IHIuc3BlY1ZlcnNpb247XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhlYWx0aENoZWNrKFxuICB3b3JsZDogV29ybGQsXG4gIGVuZHBvaW50OiBIZWFsdGhDaGVja0VuZHBvaW50LFxuICBvcHRpb25zPzogSGVhbHRoQ2hlY2tPcHRpb25zXG4pOiBQcm9taXNlPEhlYWx0aENoZWNrUmVzdWx0PiB7XG4gIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8/IERFRkFVTFRfSEVBTFRIX0NIRUNLX1RJTUVPVVQ7XG4gIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSBnZW5lcmF0ZUlkKCk7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPSBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoY29ycmVsYXRpb25JZCk7XG5cbiAgY29uc3QgcXVldWVOYW1lOiBWYWxpZFF1ZXVlTmFtZSA9XG4gICAgZW5kcG9pbnQgPT09ICd3b3JrZmxvdydcbiAgICAgID8gJ19fd2tmX3dvcmtmbG93X2hlYWx0aF9jaGVjaydcbiAgICAgIDogJ19fd2tmX3N0ZXBfaGVhbHRoX2NoZWNrJztcblxuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd29ybGQucXVldWUoXG4gICAgICBxdWV1ZU5hbWUsXG4gICAgICB7IF9faGVhbHRoQ2hlY2s6IHRydWUsIGNvcnJlbGF0aW9uSWQgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gVXNlIEpTT04gdHJhbnNwb3J0IHNvIHRoZSBoZWFsdGggY2hlY2sgd29ya3MgYWdhaW5zdCBib3RoXG4gICAgICAgIC8vIG9sZCAoSlNPTi1vbmx5KSBhbmQgbmV3IChkdWFsKSBkZXBsb3ltZW50cy5cbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG4gICAgICAgIGRlcGxveW1lbnRJZDogb3B0aW9ucz8uZGVwbG95bWVudElkLFxuICAgICAgfVxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IHRpbWVvdXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHdvcmxkLnN0cmVhbXMuZ2V0KFxuICAgICAgICAgIGdlbmVyYXRlSGVhbHRoQ2hlY2tSdW5JZChjb3JyZWxhdGlvbklkKSxcbiAgICAgICAgICBzdHJlYW1OYW1lXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgeyBjaHVua3MsIHRpbWVkT3V0IH0gPSBhd2FpdCByZWFkU3RyZWFtV2l0aFRpbWVvdXQoXG4gICAgICAgICAgcmVhZGVyLFxuICAgICAgICAgIEhFQUxUSF9DSEVDS19SRUFEX1RJTUVPVVRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGltZWRPdXQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVhZGVyLmNhbmNlbCgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gSWdub3JlIGNhbmNlbCBlcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEhFQUxUSF9DSEVDS19QT0xMX0lOVEVSVkFMKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHBhcnNlSGVhbHRoQ2hlY2tSZXNwb25zZShjaHVua3MpO1xuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICAgICAgICBsYXRlbmN5TXM6IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBIRUFMVEhfQ0hFQ0tfUE9MTF9JTlRFUlZBTClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWx0aHk6IGZhbHNlLFxuICAgICAgZXJyb3I6IGBIZWFsdGggY2hlY2sgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tc2AsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhbHRoeTogZmFsc2UsXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBMb2FkcyB3b3JrZmxvdyBydW4gZXZlbnRzIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGFsbCBwYWdlcyBvZiBwYWdpbmF0ZWRcbiAqIHJlc3VsdHMuIEV2ZW50cyBhcmUgcmV0dXJuZWQgaW4gY2hyb25vbG9naWNhbCAoYXNjZW5kaW5nKSBvcmRlciBmb3JcbiAqIGRldGVybWluaXN0aWMgd29ya2Zsb3cgcmVwbGF5LlxuICpcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQuXG4gKiBAcGFyYW0gYWZ0ZXJDdXJzb3IgLSBJZiBwcm92aWRlZCwgb25seSBldmVudHMgYWZ0ZXIgdGhpcyBjdXJzb3IgYXJlXG4gKiAgIHJldHVybmVkIChpbmNyZW1lbnRhbCBsb2FkKS4gSWYgb21pdHRlZCwgYWxsIGV2ZW50cyBhcmUgcmV0dXJuZWQuXG4gKiAgIFRoZSByZXR1cm5lZCBjdXJzb3IgY2FuIGJlIHBhc3NlZCBiYWNrIGluIG9uIGEgc3Vic2VxdWVudCBjYWxsIGZvclxuICogICBpbmNyZW1lbnRhbCBsb2FkaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFdvcmtmbG93UnVuRXZlbnRzKFxuICBydW5JZDogc3RyaW5nLFxuICBhZnRlckN1cnNvcj86IHN0cmluZ1xuKTogUHJvbWlzZTx7IGV2ZW50czogRXZlbnRbXTsgY3Vyc29yOiBzdHJpbmcgfCBudWxsIH0+IHtcbiAgY29uc3QgaW5jcmVtZW50YWwgPSBhZnRlckN1cnNvciAhPT0gdW5kZWZpbmVkO1xuICByZXR1cm4gdHJhY2UoXG4gICAgaW5jcmVtZW50YWwgPyAnd29ya2Zsb3cubG9hZE5ld0V2ZW50cycgOiAnd29ya2Zsb3cubG9hZEV2ZW50cycsXG4gICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbG9hZGVkRXZlbnRzOiBFdmVudFtdID0gW107XG4gICAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsID0gYWZ0ZXJDdXJzb3IgPz8gbnVsbDtcbiAgICAgIGxldCBoYXNNb3JlID0gdHJ1ZTtcbiAgICAgIGxldCBwYWdlc0xvYWRlZCA9IDA7XG5cbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgICBjb25zdCBsb2FkU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgd2hpbGUgKGhhc01vcmUpIHtcbiAgICAgICAgLy8gVE9ETzogd2UncmUgY3VycmVudGx5IGxvYWRpbmcgYWxsIHRoZSBkYXRhIHdpdGggcmVzb2x2ZVJlZiBiZWhhdmlvdXIuIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXNcbiAgICAgICAgLy8gdG8gbGF6eWxvYWQgdGhlIGRhdGEgZnJvbSB0aGUgd29ybGQgaW5zdGVhZCBzbyB0aGF0IHdlIGNhbiBvcHRpbWl6ZSBhbmQgbWFrZSB0aGUgZXZlbnQgbG9nIGxvYWRpbmdcbiAgICAgICAgLy8gbXVjaCBmYXN0ZXIgYW5kIG1lbW9yeSBlZmZpY2llbnRcbiAgICAgICAgY29uc3QgcGFnZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3b3JsZC5ldmVudHMubGlzdCh7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICAgIGN1cnNvcjogY3Vyc29yID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBsb2FkZWRFdmVudHMucHVzaCguLi5yZXNwb25zZS5kYXRhKTtcbiAgICAgICAgaGFzTW9yZSA9IHJlc3BvbnNlLmhhc01vcmU7XG4gICAgICAgIC8vIFByZXNlcnZlIHRoZSBsYXN0IG5vbi1udWxsIGN1cnNvciBhY3Jvc3MgcGFnZXMuIEEgV29ybGQgbWF5XG4gICAgICAgIC8vIGxlZ2l0aW1hdGVseSByZXR1cm4gYHsgZGF0YTogW10sIGN1cnNvcjogbnVsbCwgaGFzTW9yZTogZmFsc2UgfWBcbiAgICAgICAgLy8gb24gYSB0cmFpbGluZyBlbXB0eSBwYWdlIOKAlCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBwcmV2aW91cyBwYWdlJ3NcbiAgICAgICAgLy8gdW5kZXJseWluZyBEeW5hbW9EQiBxdWVyeSBoaXQgYExpbWl0YCBleGFjdGx5IGFuZCByZXR1cm5lZCBhXG4gICAgICAgIC8vIGBMYXN0RXZhbHVhdGVkS2V5YCBcImp1c3QgaW4gY2FzZVwiLiBPdmVyd3JpdGluZyB3aXRoIHRoYXQgbnVsbFxuICAgICAgICAvLyB3b3VsZCBsb3NlIHRoZSBwb3NpdGlvbiBwYXN0IHRoZSBsYXN0IHJlYWwgZXZlbnQgd2UgbG9hZGVkIGFuZFxuICAgICAgICAvLyBmb3JjZSB0aGUgcnVudGltZSBpbnRvIHRoZSBcIm5vIGN1cnNvciBhZnRlciBpbml0aWFsIGxvYWRcIiBmdWxsLVxuICAgICAgICAvLyByZWxvYWQgZmFsbGJhY2sgb24gZXZlcnkgc3Vic2VxdWVudCByZXBsYXkgaXRlcmF0aW9uLlxuICAgICAgICBjdXJzb3IgPSByZXNwb25zZS5jdXJzb3IgPz8gY3Vyc29yO1xuICAgICAgICBwYWdlc0xvYWRlZCsrO1xuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ0xvYWRlZCBldmVudCBwYWdlJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIGluY3JlbWVudGFsLFxuICAgICAgICAgIHBhZ2U6IHBhZ2VzTG9hZGVkLFxuICAgICAgICAgIHBhZ2VFdmVudHM6IHJlc3BvbnNlLmRhdGEubGVuZ3RoLFxuICAgICAgICAgIHRvdGFsRXZlbnRzOiBsb2FkZWRFdmVudHMubGVuZ3RoLFxuICAgICAgICAgIGhhc01vcmUsXG4gICAgICAgICAgcGFnZU1zOiBEYXRlLm5vdygpIC0gcGFnZVN0YXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnRXZlbnQgbG9hZCBjb21wbGV0ZScsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGluY3JlbWVudGFsLFxuICAgICAgICB0b3RhbEV2ZW50czogbG9hZGVkRXZlbnRzLmxlbmd0aCxcbiAgICAgICAgcGFnZXNMb2FkZWQsXG4gICAgICAgIHRvdGFsTXM6IERhdGUubm93KCkgLSBsb2FkU3RhcnQsXG4gICAgICB9KTtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0V2ZW50c0NvdW50KGxvYWRlZEV2ZW50cy5sZW5ndGgpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFdmVudHNQYWdlc0xvYWRlZChwYWdlc0xvYWRlZCksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgZXZlbnRzOiBsb2FkZWRFdmVudHMsIGN1cnNvciB9O1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBDT1JTIGhlYWRlcnMgZm9yIGhlYWx0aCBjaGVjayByZXNwb25zZXMuXG4gKiBBbGxvd3MgdGhlIG9ic2VydmFiaWxpdHkgVUkgdG8gY2hlY2sgZW5kcG9pbnQgaGVhbHRoIGZyb20gYSBkaWZmZXJlbnQgb3JpZ2luLlxuICovXG5jb25zdCBIRUFMVEhfQ0hFQ0tfQ09SU19IRUFERVJTID0ge1xuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogJyonLFxuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcyc6ICdQT1NULCBPUFRJT05TLCBHRVQsIEhFQUQnLFxuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyc6ICdDb250ZW50LVR5cGUnLFxufTtcblxuLyoqXG4gKiBXcmFwcyBhIHJlcXVlc3QvcmVzcG9uc2UgaGFuZGxlciBhbmQgYWRkcyBhIGhlYWx0aCBjaGVjayBcIm1vZGVcIlxuICogYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgYF9faGVhbHRoYCBxdWVyeSBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoSGVhbHRoQ2hlY2soXG4gIGhhbmRsZXI6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+LFxuICB3b3JsZFNwZWNWZXJzaW9uPzogbnVtYmVyXG4pOiAocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIHJldHVybiBhc3luYyAocmVxOiBSZXF1ZXN0KSA9PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXEudXJsKTtcbiAgICBjb25zdCBpc0hlYWx0aENoZWNrID0gdXJsLnNlYXJjaFBhcmFtcy5oYXMoJ19faGVhbHRoJyk7XG4gICAgaWYgKGlzSGVhbHRoQ2hlY2spIHtcbiAgICAgIC8vIEhhbmRsZSBDT1JTIHByZWZsaWdodCBmb3IgaGVhbHRoIGNoZWNrXG4gICAgICBpZiAocmVxLm1ldGhvZCA9PT0gJ09QVElPTlMnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge1xuICAgICAgICAgIHN0YXR1czogMjA0LFxuICAgICAgICAgIGhlYWRlcnM6IEhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGhlYWx0aHk6IHRydWUsXG4gICAgICAgICAgZW5kcG9pbnQ6IHVybC5wYXRobmFtZSxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogd29ybGRTcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAuLi5IRUFMVEhfQ0hFQ0tfQ09SU19IRUFERVJTLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBoYW5kbGVyKHJlcSk7XG4gIH07XG59XG5cbi8qKlxuICogUXVldWVzIGEgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIHF1ZXVlIHdpdGggdHJhY2luZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHF1ZXVlTWVzc2FnZShcbiAgd29ybGQ6IFdvcmxkLFxuICAuLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiB3b3JsZC5xdWV1ZT5cbikge1xuICBjb25zdCBxdWV1ZU5hbWUgPSBhcmdzWzBdO1xuICBhd2FpdCB0cmFjZShcbiAgICAncXVldWUucHVibGlzaCcsXG4gICAge1xuICAgICAgLy8gU3RhbmRhcmQgT1RFTCBtZXNzYWdpbmcgY29udmVudGlvbnNcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUocXVldWVOYW1lKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ09wZXJhdGlvblR5cGUoJ3B1Ymxpc2gnKSxcbiAgICAgICAgLy8gUGVlciBzZXJ2aWNlIGZvciBEYXRhZG9nIHNlcnZpY2UgbWFwc1xuICAgICAgICAuLi5BdHRyaWJ1dGUuUGVlclNlcnZpY2UoJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuUnBjU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY1NlcnZpY2UoJ3ZxcycpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuUnBjTWV0aG9kKCdwdWJsaXNoJyksXG4gICAgICB9LFxuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ1BST0RVQ0VSJyksXG4gICAgfSxcbiAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgY29uc3QgeyBtZXNzYWdlSWQgfSA9IGF3YWl0IHdvcmxkLnF1ZXVlKC4uLmFyZ3MpO1xuICAgICAgaWYgKG1lc3NhZ2VJZCkge1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZS5NZXNzYWdpbmdNZXNzYWdlSWQobWVzc2FnZUlkKSk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHF1ZXVlIG92ZXJoZWFkIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciBhIGdpdmVuIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWV1ZU92ZXJoZWFkKG1lc3NhZ2U6IHsgcmVxdWVzdGVkQXQ/OiBEYXRlIH0pIHtcbiAgaWYgKCFtZXNzYWdlLnJlcXVlc3RlZEF0KSByZXR1cm47XG4gIHRyeSB7XG4gICAgcmV0dXJuIEF0dHJpYnV0ZS5RdWV1ZU92ZXJoZWFkTXMoXG4gICAgICBEYXRlLm5vdygpIC0gbWVzc2FnZS5yZXF1ZXN0ZWRBdC5nZXRUaW1lKClcbiAgICApO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbWVtb2l6ZWQgYWNjZXNzb3IgZm9yIHRoZSBwZXItcnVuIEFFUy0yNTYgZW5jcnlwdGlvbiBrZXkuXG4gKlxuICogVGhlIGZpcnN0IGNhbGwgcmVzb2x2ZXMgdGhlIGtleSB2aWEgYHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW5gICh3aGljaFxuICogbWF5IGRvIEhLREYgZGVyaXZhdGlvbiBsb2NhbGx5IG9uIFZlcmNlbCwgb3IgYSBuZXR3b3JrIGZldGNoIGZyb21cbiAqIGV4dGVybmFsIGNvbnRleHRzKSBhbmQgaW1wb3J0cyBpdCBhcyBhIGBDcnlwdG9LZXlgOyBzdWJzZXF1ZW50IGNhbGxzXG4gKiBhd2FpdCB0aGUgc2FtZSBjYWNoZWQgcHJvbWlzZS4gSWYgdGhlIHdvcmxkIGRvZXNuJ3Qgc3VwcG9ydCBlbmNyeXB0aW9uXG4gKiBvciB0aGUgcnVuIGhhcyBubyBrZXkgY29uZmlndXJlZCwgdGhlIGNhY2hlZCB2YWx1ZSBpcyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBVc2VkIGJ5IHN0ZXAgLyB3b3JrZmxvdyBoYW5kbGVycyB0byBkZWZlciB0aGUgKHBvdGVudGlhbGx5IGV4cGVuc2l2ZSlcbiAqIGtleSBmZXRjaCB1bnRpbCB0aGUgZmlyc3QgY29kZSBwYXRoIHRoYXQgYWN0dWFsbHkgbmVlZHMgaXQg4oCUIHR5cGljYWxseVxuICogaW5wdXQgaHlkcmF0aW9uIG9uIHRoZSBzdWNjZXNzIHBhdGgsIG9yIGVycm9yIGRlaHlkcmF0aW9uIG9uIGEgZmFpbHVyZVxuICogcGF0aC4gQm90aCBwYXRocyBjYW4gcmFjZS1jYWxsIHRoZSBhY2Nlc3NvciB3aXRob3V0IHRyaWdnZXJpbmcgZHVwbGljYXRlXG4gKiBmZXRjaGVzLlxuICpcbiAqIEVycm9ycyB0aHJvd24gYnkgYGdldEVuY3J5cHRpb25LZXlGb3JSdW5gIHByb3BhZ2F0ZSB0byBldmVyeSBjYWxsZXJcbiAqICh0aGUgY2FjaGVkIHByb21pc2UgcmVqZWN0cykuIFRoaXMgaXMgaW50ZW50aW9uYWw6IHdoZW4gZW5jcnlwdGlvbiBpc1xuICogY29uZmlndXJlZCwgd2UgbmV2ZXIgd2FudCB0byBzaWxlbnRseSBmYWxsIGJhY2sgdG8gcGxhaW50ZXh0XG4gKiBzZXJpYWxpemF0aW9uLiBBIHByb3BhZ2F0ZWQgZXJyb3IgaW4gYW4gZXZlbnQtZW1pc3Npb24gcGF0aCBsZWF2ZXMgdGhlXG4gKiBvdXRlciB0cnkvY2F0Y2ggdG8gbG9nIGFuZCBzdXJmYWNlIHRoZSBpc3N1ZTsgdGhlIHF1ZXVlJ3MgcmVkZWxpdmVyeVxuICogc2VtYW50aWNzIHdpbGwgcmV0cnkgdGhlIGtleSBmZXRjaCBvbiB0aGUgbmV4dCBhdHRlbXB0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZUVuY3J5cHRpb25LZXkoXG4gIHdvcmxkOiBXb3JsZCxcbiAgcnVuT3JJZDogV29ya2Zsb3dSdW4gfCBzdHJpbmdcbik6ICgpID0+IFByb21pc2U8Q3J5cHRvS2V5IHwgdW5kZWZpbmVkPiB7XG4gIGxldCBjYWNoZWQ6IFByb21pc2U8Q3J5cHRvS2V5IHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgY2FjaGVkID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gVGhlIGBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuYCBvdmVybG9hZCBzZXQgdGFrZXMgZWl0aGVyIGFcbiAgICAgICAgLy8gYFdvcmtmbG93UnVuYCBvciBhIGBydW5JZDogc3RyaW5nYCAod2l0aCBvcHRpb25hbCBjb250ZXh0KS4gQnJhbmNoXG4gICAgICAgIC8vIGhlcmUgc28gVHlwZVNjcmlwdCBwaWNrcyB0aGUgcmlnaHQgb3ZlcmxvYWQgZm9yIGVhY2ggc2hhcGUuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9XG4gICAgICAgICAgdHlwZW9mIHJ1bk9ySWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5PcklkKVxuICAgICAgICAgICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuT3JJZCk7XG4gICAgICAgIHJldHVybiByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgIH0pKCk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWQ7XG4gIH07XG59XG4iXX0=
|
|
404
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixvQkFBb0IsRUFDcEIsbUJBQW1CLEdBQ3BCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXhDLE9BQU8sRUFBa0IsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbkQsd0RBQXdEO0FBQ3hELE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDO0FBRTVDOzs7O0dBSUc7QUFDSCxNQUFNLDBCQUEwQixHQUFHLHNCQUFzQixDQUFDO0FBRTFEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsWUFBb0I7SUFDdkQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ25ELE1BQU0sSUFBSSxLQUFLLENBQ2IsMEJBQTBCLFlBQVksd0dBQXdHLENBQy9JLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxrQkFBa0IsWUFBWSxFQUFvQixDQUFDO0FBQzVELENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0FBRXRDOztHQUVHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FBQyxhQUFxQjtJQUNyRCxPQUFPLG1C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QUFDLE9BQU8sQ0FBQyxXQUFXO1FBQUUsT0FBTztJQUNqQyxJQUFJLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQyxlQUFlLENBQzlCLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU87SUFDVCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEtBQVksRUFDWixPQUE2QjtJQUU3QixJQUFJLE1BQWtELENBQUM7SUFDdkQsT0FBTyxHQUFHLEVBQUU7UUFDVixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDbkIsMkRBQTJEO2dCQUMzRCxxRUFBcUU7Z0JBQ3JFLDhEQUE4RDtnQkFDOUQsTUFBTSxNQUFNLEdBQ1YsT0FBTyxPQUFPLEtBQUssUUFBUTtvQkFDekIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUMsT0FBTyxDQUFDO29CQUMvQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDcEQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBFdmVudCxcbiAgSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBWYWxpZFF1ZXVlTmFtZSxcbiAgV29ya2Zsb3dSdW4sXG4gIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgSGVhbHRoQ2hlY2tQYXlsb2FkU2NoZW1hLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX0xFR0FDWSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcblxuaW1wb3J0IHsgdHlwZSBDcnlwdG9LZXksIGltcG9ydEtleSB9IGZyb20gJy4uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IGdldFNwYW5LaW5kLCB0cmFjZSB9IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIHdvcmtmbG93Q29yZVZlcnNpb24gfSBmcm9tICcuLi92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vZ2V0LXdvcmxkLWxhenkuanMnO1xuXG4vKiogRGVmYXVsdCB0aW1lb3V0IGZvciBoZWFsdGggY2hlY2tzIGluIG1pbGxpc2Vjb25kcyAqL1xuY29uc3QgREVGQVVMVF9IRUFMVEhfQ0hFQ0tfVElNRU9VVCA9IDMwXzAwMDtcblxuLyoqXG4gKiBQYXR0ZXJuIGZvciBzYWZlIHdvcmtmbG93IG5hbWVzLiBPbmx5IGFsbG93cyBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyxcbiAqIHVuZGVyc2NvcmVzLCBoeXBoZW5zLCBkb3RzLCBmb3J3YXJkIHNsYXNoZXMgKGZvciBuYW1lc3BhY2VkIHdvcmtmbG93cyksXG4gKiBhbmQgYXQgc2lnbnMgKGZvciBzY29wZWQgcGFja2FnZXMpLlxuICovXG5jb25zdCBTQUZFX1dPUktGTE9XX05BTUVfUEFUVEVSTiA9IC9eW2EtekEtWjAtOV9cXC0uL0BdKyQvO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBhIHdvcmtmbG93IG5hbWUgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcXVldWUgbmFtZS5cbiAqIEVuc3VyZXMgdGhlIHdvcmtmbG93IG5hbWUgb25seSBjb250YWlucyBzYWZlIGNoYXJhY3RlcnMgYmVmb3JlXG4gKiBpbnRlcnBvbGF0aW5nIGl0IGludG8gdGhlIHF1ZXVlIG5hbWUgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lOiBzdHJpbmcpOiBWYWxpZFF1ZXVlTmFtZSB7XG4gIGlmICghU0FGRV9XT1JLRkxPV19OQU1FX1BBVFRFUk4udGVzdCh3b3JrZmxvd05hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgd29ya2Zsb3cgbmFtZSBcIiR7d29ya2Zsb3dOYW1lfVwiOiBtdXN0IG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgdW5kZXJzY29yZXMsIGh5cGhlbnMsIGRvdHMsIGZvcndhcmQgc2xhc2hlcywgb3IgYXQgc2lnbnNgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYF9fd2tmX3dvcmtmbG93XyR7d29ya2Zsb3dOYW1lfWAgYXMgVmFsaWRRdWV1ZU5hbWU7XG59XG5cbmNvbnN0IGdlbmVyYXRlSWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RyZWFtIG5hbWUgZm9yIGEgaGVhbHRoIGNoZWNrIHdpdGggdGhlIGdpdmVuIGNvcnJlbGF0aW9uIElELlxuICovXG5mdW5jdGlvbiBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBfX2hlYWx0aF9jaGVja19fJHtjb3JyZWxhdGlvbklkfWA7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgaGVhbHRoIGNoZWNrIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja1Jlc3VsdCB7XG4gIGhlYWx0aHk6IGJvb2xlYW47XG4gIC8qKiBFcnJvciBtZXNzYWdlIGlmIGhlYWx0aCBjaGVjayBmYWlsZWQgKi9cbiAgZXJyb3I/OiBzdHJpbmc7XG4gIC8qKiBMYXRlbmN5IGlmIHRoZSBoZWFsdGggY2hlY2sgd2FzIHN1Y2Nlc3NmdWwgKi9cbiAgbGF0ZW5jeU1zPzogbnVtYmVyO1xuICAvKiogU3BlYyB2ZXJzaW9uIG9mIHRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQgKi9cbiAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgaGVhbHRoIGNoZWNrIHBheWxvYWQuXG4gKiBJZiBzbywgcmV0dXJucyB0aGUgcGFyc2VkIHBheWxvYWQuIE90aGVyd2lzZSByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkKFxuICBtZXNzYWdlOiB1bmtub3duXG4pOiBIZWFsdGhDaGVja1BheWxvYWQgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXN1bHQgPSBIZWFsdGhDaGVja1BheWxvYWRTY2hlbWEuc2FmZVBhcnNlKG1lc3NhZ2UpO1xuICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBkZXRlcm1pbmlzdGljIGZha2UgcnVuSWQgZm9yIGhlYWx0aCBjaGVjayBzdHJlYW1zLlxuICogQm90aCB0aGUgd3JpdGVyIChoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UpIGFuZCByZWFkZXIgKGhlYWx0aENoZWNrKSBkZXJpdmVcbiAqIHRoZSBzYW1lIHJ1bklkIGZyb20gdGhlIGNvcnJlbGF0aW9uSWQgc28gdGhhdCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzY29wZVxuICogc3RyZWFtIHJlYWRzIGJ5IHJ1bklkIHN0aWxsIHdvcmsgY29ycmVjdGx5LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUhlYWx0aENoZWNrUnVuSWQoY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGB3cnVuX2hjXyR7Y29ycmVsYXRpb25JZH1gO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBoZWFsdGggY2hlY2sgbWVzc2FnZSBieSB3cml0aW5nIHRoZSByZXN1bHQgdG8gdGhlIHdvcmxkJ3Mgc3RyZWFtLlxuICogVGhlIGNhbGxlciBjYW4gbGlzdGVuIHRvIHRoaXMgc3RyZWFtIHRvIGdldCB0aGUgaGVhbHRoIGNoZWNrIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSBoZWFsdGhDaGVjayAtIFRoZSBwYXJzZWQgaGVhbHRoIGNoZWNrIHBheWxvYWRcbiAqIEBwYXJhbSBlbmRwb2ludCAtIFdoaWNoIGVuZHBvaW50IGlzIHJlc3BvbmRpbmcgKCd3b3JrZmxvdycgb3IgJ3N0ZXAnKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlKFxuICBoZWFsdGhDaGVjazogSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBlbmRwb2ludDogJ3dvcmtmbG93JyB8ICdzdGVwJyxcbiAgd29ybGRTcGVjVmVyc2lvbj86IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPSBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIGhlYWx0aHk6IHRydWUsXG4gICAgZW5kcG9pbnQsXG4gICAgY29ycmVsYXRpb25JZDogaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCxcbiAgICBzcGVjVmVyc2lvbjogd29ybGRTcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgfSk7XG4gIC8vIFVzZSBhIGRldGVybWluaXN0aWMgZmFrZSBydW5JZCBkZXJpdmVkIGZyb20gdGhlIGNvcnJlbGF0aW9uSWQgc28gdGhhdFxuICAvLyB0aGUgcmVhZGVyIHNpZGUgcHJvZHVjZXMgdGhlIHNhbWUgdmFsdWUuXG4gIGNvbnN0IGZha2VSdW5JZCA9IGdlbmVyYXRlSGVhbHRoQ2hlY2tSdW5JZChoZWFsdGhDaGVjay5jb3JyZWxhdGlvbklkKTtcbiAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShmYWtlUnVuSWQsIHN0cmVhbU5hbWUsIHJlc3BvbnNlKTtcbiAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShmYWtlUnVuSWQsIHN0cmVhbU5hbWUpO1xufVxuXG5leHBvcnQgdHlwZSBIZWFsdGhDaGVja0VuZHBvaW50ID0gJ3dvcmtmbG93JyB8ICdzdGVwJztcblxuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja09wdGlvbnMge1xuICAvKiogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgaGVhbHRoIGNoZWNrIHJlc3BvbnNlLiBEZWZhdWx0OiAzMDAwMCAoMzBzKSAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogRGVwbG95bWVudCBJRCB0byBzZW5kIHRoZSBoZWFsdGggY2hlY2sgdG8uIEZhbGxzIGJhY2sgdG8gcHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQuICovXG4gIGRlcGxveW1lbnRJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGhlYWx0aCBjaGVjayBieSBzZW5kaW5nIGEgbWVzc2FnZSB0aHJvdWdoIHRoZSBxdWV1ZSBwaXBlbGluZVxuICogYW5kIHZlcmlmeWluZyBpdCBpcyBwcm9jZXNzZWQgYnkgdGhlIHNwZWNpZmllZCBlbmRwb2ludC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGJ5cGFzc2VzIERlcGxveW1lbnQgUHJvdGVjdGlvbiBvbiBWZXJjZWwgYmVjYXVzZSBpdCBnb2VzXG4gKiB0aHJvdWdoIHRoZSBxdWV1ZSBpbmZyYXN0cnVjdHVyZSByYXRoZXIgdGhhbiBkaXJlY3QgSFRUUC5cbiAqXG4gKiBAcGFyYW0gd29ybGQgLSBUaGUgV29ybGQgaW5zdGFuY2UgdG8gdXNlIGZvciB0aGUgaGVhbHRoIGNoZWNrXG4gKiBAcGFyYW0gZW5kcG9pbnQgLSBXaGljaCBlbmRwb2ludCB0byBoZWFsdGggY2hlY2s6ICd3b3JrZmxvdycgb3IgJ3N0ZXAnXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBoZWFsdGggY2hlY2tcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGhlYWx0aCBjaGVjayByZXN1bHRcbiAqL1xuLy8gUG9sbCBpbnRlcnZhbCBmb3IgaGVhbHRoIGNoZWNrIHJldHJpZXMgKG1zKVxuY29uc3QgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwgPSAxMDA7XG4vLyBQZXItcmVhZCB0aW1lb3V0IHRvIHByZXZlbnQgYmxvY2tpbmcgZm9yZXZlciBvbiBsb2NhbCB3b3JsZCdzIEV2ZW50RW1pdHRlclxuLy8gKHdoaWNoIGRvZXNuJ3Qgd29yayBhY3Jvc3MgcHJvY2Vzc2VzKVxuY29uc3QgSEVBTFRIX0NIRUNLX1JFQURfVElNRU9VVCA9IDUwMDtcblxuLyoqXG4gKiBSZWFkIGNodW5rcyBmcm9tIGEgc3RyZWFtIHdpdGggYSB0aW1lb3V0IHBlciByZWFkIG9wZXJhdGlvbi5cbiAqIFJldHVybnMgeyBjaHVua3MsIHRpbWVkT3V0IH0gd2hlcmUgdGltZWRPdXQgaW5kaWNhdGVzIGlmIGEgcmVhZCB0aW1lZCBvdXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRTdHJlYW1XaXRoVGltZW91dChcbiAgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI8VWludDhBcnJheT4sXG4gIHJlYWRUaW1lb3V0OiBudW1iZXJcbik6IFByb21pc2U8eyBjaHVua3M6IFVpbnQ4QXJyYXlbXTsgdGltZWRPdXQ6IGJvb2xlYW4gfT4ge1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgZG9uZSA9IGZhbHNlO1xuICBsZXQgdGltZWRPdXQgPSBmYWxzZTtcblxuICB3aGlsZSAoIWRvbmUgJiYgIXRpbWVkT3V0KSB7XG4gICAgY29uc3QgcmVhZFByb21pc2UgPSByZWFkZXIucmVhZCgpO1xuICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8eyBkb25lOiB0cnVlOyB2YWx1ZTogdW5kZWZpbmVkIH0+KFxuICAgICAgKHJlc29sdmUpID0+XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfSwgcmVhZFRpbWVvdXQpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbcmVhZFByb21pc2UsIHRpbWVvdXRQcm9taXNlXSk7XG4gICAgZG9uZSA9IHJlc3VsdC5kb25lO1xuICAgIGlmIChyZXN1bHQudmFsdWUpIGNodW5rcy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gIH1cblxuICByZXR1cm4geyBjaHVua3MsIHRpbWVkT3V0IH07XG59XG5cbi8qKlxuICogUGFyc2UgYW5kIHZhbGlkYXRlIGEgaGVhbHRoIGNoZWNrIHJlc3BvbnNlIGZyb20gc3RyZWFtIGNodW5rcy5cbiAqIFJldHVybnMgdGhlIHBhcnNlZCByZXNwb25zZSBvciBudWxsIGlmIGludmFsaWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSGVhbHRoQ2hlY2tSZXNwb25zZShcbiAgY2h1bmtzOiBVaW50OEFycmF5W11cbik6IHsgaGVhbHRoeTogYm9vbGVhbiB9IHwgbnVsbCB7XG4gIGlmIChjaHVua3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB0b3RhbExlbmd0aCA9IGNodW5rcy5yZWR1Y2UoKHN1bSwgY2h1bmspID0+IHN1bSArIGNodW5rLmxlbmd0aCwgMCk7XG4gIGNvbnN0IGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICBjb21iaW5lZC5zZXQoY2h1bmssIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcbiAgfVxuICBjb25zdCByZXNwb25zZVRleHQgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoY29tYmluZWQpO1xuXG4gIGxldCByZXNwb25zZTogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gT2xkIGRlcGxveW1lbnRzIChzcGVjVmVyc2lvbiA8IDMpIHJldHVybiBwbGFpbiB0ZXh0IGxpa2VcbiAgICAvLyAnV29ya2Zsb3cgU0RLIFwiLi4uXCIgZW5kcG9pbnQgaXMgaGVhbHRoeScuIFRyZWF0IGFueSBub24tZW1wdHlcbiAgICAvLyB0ZXh0IHJlc3BvbnNlIGFzIGEgaGVhbHRoeSBkZXBsb3ltZW50IHdpdGggdW5rbm93biBzcGVjVmVyc2lvbi5cbiAgICBpZiAocmVzcG9uc2VUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7IGhlYWx0aHk6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHJlc3BvbnNlICE9PSAnb2JqZWN0JyB8fFxuICAgIHJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgISgnaGVhbHRoeScgaW4gcmVzcG9uc2UpIHx8XG4gICAgdHlwZW9mIChyZXNwb25zZSBhcyB7IGhlYWx0aHk6IHVua25vd24gfSkuaGVhbHRoeSAhPT0gJ2Jvb2xlYW4nXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgciA9IHJlc3BvbnNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBwYXJzZWQ6IHsgaGVhbHRoeTogYm9vbGVhbjsgc3BlY1ZlcnNpb24/OiBudW1iZXIgfSA9IHtcbiAgICBoZWFsdGh5OiByLmhlYWx0aHkgYXMgYm9vbGVhbixcbiAgfTtcbiAgaWYgKHR5cGVvZiByLnNwZWNWZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHBhcnNlZC5zcGVjVmVyc2lvbiA9IHIuc3BlY1ZlcnNpb247XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhlYWx0aENoZWNrKFxuICB3b3JsZDogV29ybGQsXG4gIGVuZHBvaW50OiBIZWFsdGhDaGVja0VuZHBvaW50LFxuICBvcHRpb25zPzogSGVhbHRoQ2hlY2tPcHRpb25zXG4pOiBQcm9taXNlPEhlYWx0aENoZWNrUmVzdWx0PiB7XG4gIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8/IERFRkFVTFRfSEVBTFRIX0NIRUNLX1RJTUVPVVQ7XG4gIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSBnZW5lcmF0ZUlkKCk7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPSBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoY29ycmVsYXRpb25JZCk7XG5cbiAgY29uc3QgcXVldWVOYW1lOiBWYWxpZFF1ZXVlTmFtZSA9XG4gICAgZW5kcG9pbnQgPT09ICd3b3JrZmxvdydcbiAgICAgID8gJ19fd2tmX3dvcmtmbG93X2hlYWx0aF9jaGVjaydcbiAgICAgIDogJ19fd2tmX3N0ZXBfaGVhbHRoX2NoZWNrJztcblxuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd29ybGQucXVldWUoXG4gICAgICBxdWV1ZU5hbWUsXG4gICAgICB7IF9faGVhbHRoQ2hlY2s6IHRydWUsIGNvcnJlbGF0aW9uSWQgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gVXNlIEpTT04gdHJhbnNwb3J0IHNvIHRoZSBoZWFsdGggY2hlY2sgd29ya3MgYWdhaW5zdCBib3RoXG4gICAgICAgIC8vIG9sZCAoSlNPTi1vbmx5KSBhbmQgbmV3IChkdWFsKSBkZXBsb3ltZW50cy5cbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG4gICAgICAgIGRlcGxveW1lbnRJZDogb3B0aW9ucz8uZGVwbG95bWVudElkLFxuICAgICAgfVxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IHRpbWVvdXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHdvcmxkLnN0cmVhbXMuZ2V0KFxuICAgICAgICAgIGdlbmVyYXRlSGVhbHRoQ2hlY2tSdW5JZChjb3JyZWxhdGlvbklkKSxcbiAgICAgICAgICBzdHJlYW1OYW1lXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgeyBjaHVua3MsIHRpbWVkT3V0IH0gPSBhd2FpdCByZWFkU3RyZWFtV2l0aFRpbWVvdXQoXG4gICAgICAgICAgcmVhZGVyLFxuICAgICAgICAgIEhFQUxUSF9DSEVDS19SRUFEX1RJTUVPVVRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGltZWRPdXQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVhZGVyLmNhbmNlbCgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gSWdub3JlIGNhbmNlbCBlcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEhFQUxUSF9DSEVDS19QT0xMX0lOVEVSVkFMKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHBhcnNlSGVhbHRoQ2hlY2tSZXNwb25zZShjaHVua3MpO1xuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICAgICAgICBsYXRlbmN5TXM6IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBIRUFMVEhfQ0hFQ0tfUE9MTF9JTlRFUlZBTClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWx0aHk6IGZhbHNlLFxuICAgICAgZXJyb3I6IGBIZWFsdGggY2hlY2sgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tc2AsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhbHRoeTogZmFsc2UsXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBMb2FkcyB3b3JrZmxvdyBydW4gZXZlbnRzIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGFsbCBwYWdlcyBvZiBwYWdpbmF0ZWRcbiAqIHJlc3VsdHMuIEV2ZW50cyBhcmUgcmV0dXJuZWQgaW4gY2hyb25vbG9naWNhbCAoYXNjZW5kaW5nKSBvcmRlciBmb3JcbiAqIGRldGVybWluaXN0aWMgd29ya2Zsb3cgcmVwbGF5LlxuICpcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQuXG4gKiBAcGFyYW0gYWZ0ZXJDdXJzb3IgLSBJZiBwcm92aWRlZCwgb25seSBldmVudHMgYWZ0ZXIgdGhpcyBjdXJzb3IgYXJlXG4gKiAgIHJldHVybmVkIChpbmNyZW1lbnRhbCBsb2FkKS4gSWYgb21pdHRlZCwgYWxsIGV2ZW50cyBhcmUgcmV0dXJuZWQuXG4gKiAgIFRoZSByZXR1cm5lZCBjdXJzb3IgY2FuIGJlIHBhc3NlZCBiYWNrIGluIG9uIGEgc3Vic2VxdWVudCBjYWxsIGZvclxuICogICBpbmNyZW1lbnRhbCBsb2FkaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFdvcmtmbG93UnVuRXZlbnRzKFxuICBydW5JZDogc3RyaW5nLFxuICBhZnRlckN1cnNvcj86IHN0cmluZ1xuKTogUHJvbWlzZTx7IGV2ZW50czogRXZlbnRbXTsgY3Vyc29yOiBzdHJpbmcgfCBudWxsIH0+IHtcbiAgY29uc3QgaW5jcmVtZW50YWwgPSBhZnRlckN1cnNvciAhPT0gdW5kZWZpbmVkO1xuICByZXR1cm4gdHJhY2UoXG4gICAgaW5jcmVtZW50YWwgPyAnd29ya2Zsb3cubG9hZE5ld0V2ZW50cycgOiAnd29ya2Zsb3cubG9hZEV2ZW50cycsXG4gICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbG9hZGVkRXZlbnRzOiBFdmVudFtdID0gW107XG4gICAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsID0gYWZ0ZXJDdXJzb3IgPz8gbnVsbDtcbiAgICAgIGxldCBoYXNNb3JlID0gdHJ1ZTtcbiAgICAgIGxldCBwYWdlc0xvYWRlZCA9IDA7XG5cbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgICBjb25zdCBsb2FkU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgd2hpbGUgKGhhc01vcmUpIHtcbiAgICAgICAgLy8gVE9ETzogd2UncmUgY3VycmVudGx5IGxvYWRpbmcgYWxsIHRoZSBkYXRhIHdpdGggcmVzb2x2ZVJlZiBiZWhhdmlvdXIuIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXNcbiAgICAgICAgLy8gdG8gbGF6eWxvYWQgdGhlIGRhdGEgZnJvbSB0aGUgd29ybGQgaW5zdGVhZCBzbyB0aGF0IHdlIGNhbiBvcHRpbWl6ZSBhbmQgbWFrZSB0aGUgZXZlbnQgbG9nIGxvYWRpbmdcbiAgICAgICAgLy8gbXVjaCBmYXN0ZXIgYW5kIG1lbW9yeSBlZmZpY2llbnRcbiAgICAgICAgY29uc3QgcGFnZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3b3JsZC5ldmVudHMubGlzdCh7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICAgIGN1cnNvcjogY3Vyc29yID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBsb2FkZWRFdmVudHMucHVzaCguLi5yZXNwb25zZS5kYXRhKTtcbiAgICAgICAgaGFzTW9yZSA9IHJlc3BvbnNlLmhhc01vcmU7XG4gICAgICAgIC8vIFByZXNlcnZlIHRoZSBsYXN0IG5vbi1udWxsIGN1cnNvciBhY3Jvc3MgcGFnZXMuIEEgV29ybGQgbWF5XG4gICAgICAgIC8vIGxlZ2l0aW1hdGVseSByZXR1cm4gYHsgZGF0YTogW10sIGN1cnNvcjogbnVsbCwgaGFzTW9yZTogZmFsc2UgfWBcbiAgICAgICAgLy8gb24gYSB0cmFpbGluZyBlbXB0eSBwYWdlIOKAlCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBwcmV2aW91cyBwYWdlJ3NcbiAgICAgICAgLy8gdW5kZXJseWluZyBEQiBxdWVyeSBoaXQgdGhlIGxpbWl0IGV4YWN0bHkgYW5kIHJldHVybmVkIGFcbiAgICAgICAgLy8gYExhc3RFdmFsdWF0ZWRLZXlgIFwianVzdCBpbiBjYXNlXCIuIE92ZXJ3cml0aW5nIHdpdGggdGhhdCBudWxsXG4gICAgICAgIC8vIHdvdWxkIGxvc2UgdGhlIHBvc2l0aW9uIHBhc3QgdGhlIGxhc3QgcmVhbCBldmVudCB3ZSBsb2FkZWQgYW5kXG4gICAgICAgIC8vIGZvcmNlIHRoZSBydW50aW1lIGludG8gdGhlIFwibm8gY3Vyc29yIGFmdGVyIGluaXRpYWwgbG9hZFwiIGZ1bGwtXG4gICAgICAgIC8vIHJlbG9hZCBmYWxsYmFjayBvbiBldmVyeSBzdWJzZXF1ZW50IHJlcGxheSBpdGVyYXRpb24uXG4gICAgICAgIGN1cnNvciA9IHJlc3BvbnNlLmN1cnNvciA/PyBjdXJzb3I7XG4gICAgICAgIHBhZ2VzTG9hZGVkKys7XG5cbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnTG9hZGVkIGV2ZW50IHBhZ2UnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgaW5jcmVtZW50YWwsXG4gICAgICAgICAgcGFnZTogcGFnZXNMb2FkZWQsXG4gICAgICAgICAgcGFnZUV2ZW50czogcmVzcG9uc2UuZGF0YS5sZW5ndGgsXG4gICAgICAgICAgdG90YWxFdmVudHM6IGxvYWRlZEV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgICBwYWdlTXM6IERhdGUubm93KCkgLSBwYWdlU3RhcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdFdmVudCBsb2FkIGNvbXBsZXRlJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgaW5jcmVtZW50YWwsXG4gICAgICAgIHRvdGFsRXZlbnRzOiBsb2FkZWRFdmVudHMubGVuZ3RoLFxuICAgICAgICBwYWdlc0xvYWRlZCxcbiAgICAgICAgdG90YWxNczogRGF0ZS5ub3coKSAtIGxvYWRTdGFydCxcbiAgICAgIH0pO1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXZlbnRzQ291bnQobG9hZGVkRXZlbnRzLmxlbmd0aCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0V2ZW50c1BhZ2VzTG9hZGVkKHBhZ2VzTG9hZGVkKSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyBldmVudHM6IGxvYWRlZEV2ZW50cywgY3Vyc29yIH07XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIENPUlMgaGVhZGVycyBmb3IgaGVhbHRoIGNoZWNrIHJlc3BvbnNlcy5cbiAqIEFsbG93cyB0aGUgb2JzZXJ2YWJpbGl0eSBVSSB0byBjaGVjayBlbmRwb2ludCBoZWFsdGggZnJvbSBhIGRpZmZlcmVudCBvcmlnaW4uXG4gKi9cbmNvbnN0IEhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMgPSB7XG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiAnKicsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogJ1BPU1QsIE9QVElPTlMsIEdFVCwgSEVBRCcsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogJ0NvbnRlbnQtVHlwZScsXG59O1xuXG4vKipcbiAqIFdyYXBzIGEgcmVxdWVzdC9yZXNwb25zZSBoYW5kbGVyIGFuZCBhZGRzIGEgaGVhbHRoIGNoZWNrIFwibW9kZVwiXG4gKiBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBgX19oZWFsdGhgIHF1ZXJ5IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhIZWFsdGhDaGVjayhcbiAgaGFuZGxlcjogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4sXG4gIHdvcmxkU3BlY1ZlcnNpb24/OiBudW1iZXJcbik6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgcmV0dXJuIGFzeW5jIChyZXE6IFJlcXVlc3QpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwpO1xuICAgIGNvbnN0IGlzSGVhbHRoQ2hlY2sgPSB1cmwuc2VhcmNoUGFyYW1zLmhhcygnX19oZWFsdGgnKTtcbiAgICBpZiAoaXNIZWFsdGhDaGVjaykge1xuICAgICAgLy8gSGFuZGxlIENPUlMgcHJlZmxpZ2h0IGZvciBoZWFsdGggY2hlY2tcbiAgICAgIGlmIChyZXEubWV0aG9kID09PSAnT1BUSU9OUycpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7XG4gICAgICAgICAgc3RhdHVzOiAyMDQsXG4gICAgICAgICAgaGVhZGVyczogSEVBTFRIX0NIRUNLX0NPUlNfSEVBREVSUyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgaGVhbHRoeTogdHJ1ZSxcbiAgICAgICAgICBlbmRwb2ludDogdXJsLnBhdGhuYW1lLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiB3b3JsZFNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIHdvcmtmbG93Q29yZVZlcnNpb24sXG4gICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIC4uLkhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGhhbmRsZXIocmVxKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBRdWV1ZXMgYSBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQgcXVldWUgd2l0aCB0cmFjaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcXVldWVNZXNzYWdlKFxuICB3b3JsZDogV29ybGQsXG4gIC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIHdvcmxkLnF1ZXVlPlxuKSB7XG4gIGNvbnN0IHF1ZXVlTmFtZSA9IGFyZ3NbMF07XG4gIGF3YWl0IHRyYWNlKFxuICAgICdxdWV1ZS5wdWJsaXNoJyxcbiAgICB7XG4gICAgICAvLyBTdGFuZGFyZCBPVEVMIG1lc3NhZ2luZyBjb252ZW50aW9uc1xuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZShxdWV1ZU5hbWUpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nT3BlcmF0aW9uVHlwZSgncHVibGlzaCcpLFxuICAgICAgICAvLyBQZWVyIHNlcnZpY2UgZm9yIERhdGFkb2cgc2VydmljZSBtYXBzXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5QZWVyU2VydmljZSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5ScGNTeXN0ZW0oJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuUnBjU2VydmljZSgndnFzJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5ScGNNZXRob2QoJ3B1Ymxpc2gnKSxcbiAgICAgIH0sXG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnUFJPRFVDRVInKSxcbiAgICB9LFxuICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBjb25zdCB7IG1lc3NhZ2VJZCB9ID0gYXdhaXQgd29ybGQucXVldWUoLi4uYXJncyk7XG4gICAgICBpZiAobWVzc2FnZUlkKSB7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoQXR0cmlidXRlLk1lc3NhZ2luZ01lc3NhZ2VJZChtZXNzYWdlSWQpKTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcXVldWUgb3ZlcmhlYWQgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIGEgZ2l2ZW4gbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFF1ZXVlT3ZlcmhlYWQobWVzc2FnZTogeyByZXF1ZXN0ZWRBdD86IERhdGUgfSkge1xuICBpZiAoIW1lc3NhZ2UucmVxdWVzdGVkQXQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICByZXR1cm4gQXR0cmlidXRlLlF1ZXVlT3ZlcmhlYWRNcyhcbiAgICAgIERhdGUubm93KCkgLSBtZXNzYWdlLnJlcXVlc3RlZEF0LmdldFRpbWUoKVxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBtZW1vaXplZCBhY2Nlc3NvciBmb3IgdGhlIHBlci1ydW4gQUVTLTI1NiBlbmNyeXB0aW9uIGtleS5cbiAqXG4gKiBUaGUgZmlyc3QgY2FsbCByZXNvbHZlcyB0aGUga2V5IHZpYSBgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAgKHdoaWNoXG4gKiBtYXkgZG8gSEtERiBkZXJpdmF0aW9uIGxvY2FsbHkgb24gVmVyY2VsLCBvciBhIG5ldHdvcmsgZmV0Y2ggZnJvbVxuICogZXh0ZXJuYWwgY29udGV4dHMpIGFuZCBpbXBvcnRzIGl0IGFzIGEgYENyeXB0b0tleWA7IHN1YnNlcXVlbnQgY2FsbHNcbiAqIGF3YWl0IHRoZSBzYW1lIGNhY2hlZCBwcm9taXNlLiBJZiB0aGUgd29ybGQgZG9lc24ndCBzdXBwb3J0IGVuY3J5cHRpb25cbiAqIG9yIHRoZSBydW4gaGFzIG5vIGtleSBjb25maWd1cmVkLCB0aGUgY2FjaGVkIHZhbHVlIGlzIGB1bmRlZmluZWRgLlxuICpcbiAqIFVzZWQgYnkgc3RlcCAvIHdvcmtmbG93IGhhbmRsZXJzIHRvIGRlZmVyIHRoZSAocG90ZW50aWFsbHkgZXhwZW5zaXZlKVxuICoga2V5IGZldGNoIHVudGlsIHRoZSBmaXJzdCBjb2RlIHBhdGggdGhhdCBhY3R1YWxseSBuZWVkcyBpdCDigJQgdHlwaWNhbGx5XG4gKiBpbnB1dCBoeWRyYXRpb24gb24gdGhlIHN1Y2Nlc3MgcGF0aCwgb3IgZXJyb3IgZGVoeWRyYXRpb24gb24gYSBmYWlsdXJlXG4gKiBwYXRoLiBCb3RoIHBhdGhzIGNhbiByYWNlLWNhbGwgdGhlIGFjY2Vzc29yIHdpdGhvdXQgdHJpZ2dlcmluZyBkdXBsaWNhdGVcbiAqIGZldGNoZXMuXG4gKlxuICogRXJyb3JzIHRocm93biBieSBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAgcHJvcGFnYXRlIHRvIGV2ZXJ5IGNhbGxlclxuICogKHRoZSBjYWNoZWQgcHJvbWlzZSByZWplY3RzKS4gVGhpcyBpcyBpbnRlbnRpb25hbDogd2hlbiBlbmNyeXB0aW9uIGlzXG4gKiBjb25maWd1cmVkLCB3ZSBuZXZlciB3YW50IHRvIHNpbGVudGx5IGZhbGwgYmFjayB0byBwbGFpbnRleHRcbiAqIHNlcmlhbGl6YXRpb24uIEEgcHJvcGFnYXRlZCBlcnJvciBpbiBhbiBldmVudC1lbWlzc2lvbiBwYXRoIGxlYXZlcyB0aGVcbiAqIG91dGVyIHRyeS9jYXRjaCB0byBsb2cgYW5kIHN1cmZhY2UgdGhlIGlzc3VlOyB0aGUgcXVldWUncyByZWRlbGl2ZXJ5XG4gKiBzZW1hbnRpY3Mgd2lsbCByZXRyeSB0aGUga2V5IGZldGNoIG9uIHRoZSBuZXh0IGF0dGVtcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplRW5jcnlwdGlvbktleShcbiAgd29ybGQ6IFdvcmxkLFxuICBydW5PcklkOiBXb3JrZmxvd1J1biB8IHN0cmluZ1xuKTogKCkgPT4gUHJvbWlzZTxDcnlwdG9LZXkgfCB1bmRlZmluZWQ+IHtcbiAgbGV0IGNhY2hlZDogUHJvbWlzZTxDcnlwdG9LZXkgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBjYWNoZWQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBUaGUgYGdldEVuY3J5cHRpb25LZXlGb3JSdW5gIG92ZXJsb2FkIHNldCB0YWtlcyBlaXRoZXIgYVxuICAgICAgICAvLyBgV29ya2Zsb3dSdW5gIG9yIGEgYHJ1bklkOiBzdHJpbmdgICh3aXRoIG9wdGlvbmFsIGNvbnRleHQpLiBCcmFuY2hcbiAgICAgICAgLy8gaGVyZSBzbyBUeXBlU2NyaXB0IHBpY2tzIHRoZSByaWdodCBvdmVybG9hZCBmb3IgZWFjaCBzaGFwZS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID1cbiAgICAgICAgICB0eXBlb2YgcnVuT3JJZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bk9ySWQpXG4gICAgICAgICAgICA6IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5PcklkKTtcbiAgICAgICAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuICAgICAgfSkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ExperimentalSetAttributesOptions } from './workflow/set-attributes.js';
|
|
2
|
+
export type { ExperimentalSetAttributesOptions };
|
|
3
|
+
/**
|
|
4
|
+
* Host-side stub for `experimental_setAttributes`. The real
|
|
5
|
+
* implementation lives in `./workflow/set-attributes.ts` and is
|
|
6
|
+
* selected by the `workflow` package-exports condition when the
|
|
7
|
+
* workflow VM bundle is resolved.
|
|
8
|
+
*
|
|
9
|
+
* Reaching this stub means the function was called outside a workflow
|
|
10
|
+
* body — most likely from a `'use step'` function or plain host code.
|
|
11
|
+
* That isn't supported in the MVP: attribute mutations must be
|
|
12
|
+
* event-sourced through the workflow runtime so they survive replay.
|
|
13
|
+
*/
|
|
14
|
+
export declare function experimental_setAttributes(_attrs: Record<string, string | undefined>, _options?: ExperimentalSetAttributesOptions): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=set-attributes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-attributes.d.ts","sourceRoot":"","sources":["../src/set-attributes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AAErF,YAAY,EAAE,gCAAgC,EAAE,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC1C,QAAQ,CAAC,EAAE,gCAAgC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FatalError } from '@workflow/errors';
|
|
2
|
+
/**
|
|
3
|
+
* Host-side stub for `experimental_setAttributes`. The real
|
|
4
|
+
* implementation lives in `./workflow/set-attributes.ts` and is
|
|
5
|
+
* selected by the `workflow` package-exports condition when the
|
|
6
|
+
* workflow VM bundle is resolved.
|
|
7
|
+
*
|
|
8
|
+
* Reaching this stub means the function was called outside a workflow
|
|
9
|
+
* body — most likely from a `'use step'` function or plain host code.
|
|
10
|
+
* That isn't supported in the MVP: attribute mutations must be
|
|
11
|
+
* event-sourced through the workflow runtime so they survive replay.
|
|
12
|
+
*/
|
|
13
|
+
export async function experimental_setAttributes(_attrs, _options) {
|
|
14
|
+
throw new FatalError("experimental_setAttributes() must be called from a 'use workflow' function. " +
|
|
15
|
+
'Calling it from a step body or plain host code is not supported.');
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LWF0dHJpYnV0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2V0LWF0dHJpYnV0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSzlDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDBCQUEwQixDQUM5QyxNQUEwQyxFQUMxQyxRQUEyQztJQUUzQyxNQUFNLElBQUksVUFBVSxDQUNsQiw4RUFBOEU7UUFDNUUsa0VBQWtFLENBQ3JFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmF0YWxFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBFeHBlcmltZW50YWxTZXRBdHRyaWJ1dGVzT3B0aW9ucyB9IGZyb20gJy4vd29ya2Zsb3cvc2V0LWF0dHJpYnV0ZXMuanMnO1xuXG5leHBvcnQgdHlwZSB7IEV4cGVyaW1lbnRhbFNldEF0dHJpYnV0ZXNPcHRpb25zIH07XG5cbi8qKlxuICogSG9zdC1zaWRlIHN0dWIgZm9yIGBleHBlcmltZW50YWxfc2V0QXR0cmlidXRlc2AuIFRoZSByZWFsXG4gKiBpbXBsZW1lbnRhdGlvbiBsaXZlcyBpbiBgLi93b3JrZmxvdy9zZXQtYXR0cmlidXRlcy50c2AgYW5kIGlzXG4gKiBzZWxlY3RlZCBieSB0aGUgYHdvcmtmbG93YCBwYWNrYWdlLWV4cG9ydHMgY29uZGl0aW9uIHdoZW4gdGhlXG4gKiB3b3JrZmxvdyBWTSBidW5kbGUgaXMgcmVzb2x2ZWQuXG4gKlxuICogUmVhY2hpbmcgdGhpcyBzdHViIG1lYW5zIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkIG91dHNpZGUgYSB3b3JrZmxvd1xuICogYm9keSDigJQgbW9zdCBsaWtlbHkgZnJvbSBhIGAndXNlIHN0ZXAnYCBmdW5jdGlvbiBvciBwbGFpbiBob3N0IGNvZGUuXG4gKiBUaGF0IGlzbid0IHN1cHBvcnRlZCBpbiB0aGUgTVZQOiBhdHRyaWJ1dGUgbXV0YXRpb25zIG11c3QgYmVcbiAqIGV2ZW50LXNvdXJjZWQgdGhyb3VnaCB0aGUgd29ya2Zsb3cgcnVudGltZSBzbyB0aGV5IHN1cnZpdmUgcmVwbGF5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwZXJpbWVudGFsX3NldEF0dHJpYnV0ZXMoXG4gIF9hdHRyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgX29wdGlvbnM/OiBFeHBlcmltZW50YWxTZXRBdHRyaWJ1dGVzT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRocm93IG5ldyBGYXRhbEVycm9yKFxuICAgIFwiZXhwZXJpbWVudGFsX3NldEF0dHJpYnV0ZXMoKSBtdXN0IGJlIGNhbGxlZCBmcm9tIGEgJ3VzZSB3b3JrZmxvdycgZnVuY3Rpb24uIFwiICtcbiAgICAgICdDYWxsaW5nIGl0IGZyb20gYSBzdGVwIGJvZHkgb3IgcGxhaW4gaG9zdCBjb2RlIGlzIG5vdCBzdXBwb3J0ZWQuJ1xuICApO1xufVxuIl19
|
package/dist/source-map.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-map.d.ts","sourceRoot":"","sources":["../src/source-map.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"source-map.d.ts","sourceRoot":"","sources":["../src/source-map.ts"],"names":[],"mappings":"AAqDA;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,MAAM,CAsDR"}
|
package/dist/source-map.js
CHANGED
|
@@ -1,4 +1,44 @@
|
|
|
1
1
|
import { originalPositionFor, TraceMap } from '@jridgewell/trace-mapping';
|
|
2
|
+
function isBase64Char(code) {
|
|
3
|
+
return ((code >= 0x41 && code <= 0x5a) ||
|
|
4
|
+
(code >= 0x61 && code <= 0x7a) ||
|
|
5
|
+
(code >= 0x30 && code <= 0x39) ||
|
|
6
|
+
code === 0x2b ||
|
|
7
|
+
code === 0x2f ||
|
|
8
|
+
code === 0x3d);
|
|
9
|
+
}
|
|
10
|
+
function extractInlineSourceMapBase64(source) {
|
|
11
|
+
const sourceMapPrefix = '//# sourceMappingURL=data:application/json';
|
|
12
|
+
const base64Marker = ';base64,';
|
|
13
|
+
let scanFrom = 0;
|
|
14
|
+
while (scanFrom < source.length) {
|
|
15
|
+
const prefixIdx = source.indexOf(sourceMapPrefix, scanFrom);
|
|
16
|
+
if (prefixIdx === -1)
|
|
17
|
+
return undefined;
|
|
18
|
+
const base64Start = source.indexOf(base64Marker, prefixIdx + sourceMapPrefix.length);
|
|
19
|
+
if (base64Start === -1) {
|
|
20
|
+
scanFrom = prefixIdx + sourceMapPrefix.length;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const commaBefore = source.indexOf(',', prefixIdx);
|
|
24
|
+
if (commaBefore !== -1 && commaBefore < base64Start) {
|
|
25
|
+
scanFrom = base64Start + base64Marker.length;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const valueStart = base64Start + base64Marker.length;
|
|
29
|
+
let valueEnd = valueStart;
|
|
30
|
+
while (valueEnd < source.length) {
|
|
31
|
+
if (!isBase64Char(source.charCodeAt(valueEnd))) {
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
valueEnd++;
|
|
35
|
+
}
|
|
36
|
+
if (valueEnd > valueStart) {
|
|
37
|
+
return source.slice(valueStart, valueEnd);
|
|
38
|
+
}
|
|
39
|
+
scanFrom = valueEnd;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
2
42
|
/**
|
|
3
43
|
* Remaps an error stack trace using inline source maps to show original source locations.
|
|
4
44
|
*
|
|
@@ -8,13 +48,11 @@ import { originalPositionFor, TraceMap } from '@jridgewell/trace-mapping';
|
|
|
8
48
|
* @returns The remapped stack trace with original source locations
|
|
9
49
|
*/
|
|
10
50
|
export function remapErrorStack(stack, filename, workflowCode) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
if (!sourceMapMatch) {
|
|
51
|
+
const base64 = extractInlineSourceMapBase64(workflowCode);
|
|
52
|
+
if (!base64) {
|
|
14
53
|
return stack; // No source map found
|
|
15
54
|
}
|
|
16
55
|
try {
|
|
17
|
-
const base64 = sourceMapMatch[1];
|
|
18
56
|
const sourceMapJson = Buffer.from(base64, 'base64').toString('utf-8');
|
|
19
57
|
const sourceMapData = JSON.parse(sourceMapJson);
|
|
20
58
|
// Use TraceMap (pure JS, no WASM required)
|
|
@@ -48,9 +86,9 @@ export function remapErrorStack(stack, filename, workflowCode) {
|
|
|
48
86
|
});
|
|
49
87
|
return remappedLines.join('\n');
|
|
50
88
|
}
|
|
51
|
-
catch
|
|
89
|
+
catch {
|
|
52
90
|
// If source map processing fails, return original stack
|
|
53
91
|
return stack;
|
|
54
92
|
}
|
|
55
93
|
}
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zb3VyY2UtbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUxRSxTQUFTLFlBQVksQ0FBQyxJQUFZO0lBQ2hDLE9BQU8sQ0FDTCxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQztRQUM5QixDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQztRQUM5QixDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQztRQUM5QixJQUFJLEtBQUssSUFBSTtRQUNiLElBQUksS0FBSyxJQUFJO1FBQ2IsSUFBSSxLQUFLLElBQUksQ0FDZCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQUMsTUFBYztJQUNsRCxNQUFNLGVBQWUsR0FBRyw0Q0FBNEMsQ0FBQztJQUNyRSxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUM7SUFDaEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRWpCLE9BQU8sUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RCxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUV2QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUNoQyxZQUFZLEVBQ1osU0FBUyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQ25DLENBQUM7UUFDRixJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLFFBQVEsR0FBRyxTQUFTLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUM5QyxT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UUFBUSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUM7Z0JBQzFELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7Z0JBQ3RFLE9BQU8sVUFBVSxJQUFJLEtBQUssUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ3ZFLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQyxDQUFDLGdDQUFnQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1Asd0RBQXdEO1FBQ3hELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBvcmlnaW5hbFBvc2l0aW9uRm9yLCBUcmFjZU1hcCB9IGZyb20gJ0BqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmcnO1xuXG5mdW5jdGlvbiBpc0Jhc2U2NENoYXIoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgKGNvZGUgPj0gMHg0MSAmJiBjb2RlIDw9IDB4NWEpIHx8XG4gICAgKGNvZGUgPj0gMHg2MSAmJiBjb2RlIDw9IDB4N2EpIHx8XG4gICAgKGNvZGUgPj0gMHgzMCAmJiBjb2RlIDw9IDB4MzkpIHx8XG4gICAgY29kZSA9PT0gMHgyYiB8fFxuICAgIGNvZGUgPT09IDB4MmYgfHxcbiAgICBjb2RlID09PSAweDNkXG4gICk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJbmxpbmVTb3VyY2VNYXBCYXNlNjQoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2VNYXBQcmVmaXggPSAnLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uJztcbiAgY29uc3QgYmFzZTY0TWFya2VyID0gJztiYXNlNjQsJztcbiAgbGV0IHNjYW5Gcm9tID0gMDtcblxuICB3aGlsZSAoc2NhbkZyb20gPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgY29uc3QgcHJlZml4SWR4ID0gc291cmNlLmluZGV4T2Yoc291cmNlTWFwUHJlZml4LCBzY2FuRnJvbSk7XG4gICAgaWYgKHByZWZpeElkeCA9PT0gLTEpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBiYXNlNjRTdGFydCA9IHNvdXJjZS5pbmRleE9mKFxuICAgICAgYmFzZTY0TWFya2VyLFxuICAgICAgcHJlZml4SWR4ICsgc291cmNlTWFwUHJlZml4Lmxlbmd0aFxuICAgICk7XG4gICAgaWYgKGJhc2U2NFN0YXJ0ID09PSAtMSkge1xuICAgICAgc2NhbkZyb20gPSBwcmVmaXhJZHggKyBzb3VyY2VNYXBQcmVmaXgubGVuZ3RoO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFCZWZvcmUgPSBzb3VyY2UuaW5kZXhPZignLCcsIHByZWZpeElkeCk7XG4gICAgaWYgKGNvbW1hQmVmb3JlICE9PSAtMSAmJiBjb21tYUJlZm9yZSA8IGJhc2U2NFN0YXJ0KSB7XG4gICAgICBzY2FuRnJvbSA9IGJhc2U2NFN0YXJ0ICsgYmFzZTY0TWFya2VyLmxlbmd0aDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU3RhcnQgPSBiYXNlNjRTdGFydCArIGJhc2U2NE1hcmtlci5sZW5ndGg7XG4gICAgbGV0IHZhbHVlRW5kID0gdmFsdWVTdGFydDtcbiAgICB3aGlsZSAodmFsdWVFbmQgPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICBpZiAoIWlzQmFzZTY0Q2hhcihzb3VyY2UuY2hhckNvZGVBdCh2YWx1ZUVuZCkpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFsdWVFbmQrKztcbiAgICB9XG5cbiAgICBpZiAodmFsdWVFbmQgPiB2YWx1ZVN0YXJ0KSB7XG4gICAgICByZXR1cm4gc291cmNlLnNsaWNlKHZhbHVlU3RhcnQsIHZhbHVlRW5kKTtcbiAgICB9XG4gICAgc2NhbkZyb20gPSB2YWx1ZUVuZDtcbiAgfVxufVxuXG4vKipcbiAqIFJlbWFwcyBhbiBlcnJvciBzdGFjayB0cmFjZSB1c2luZyBpbmxpbmUgc291cmNlIG1hcHMgdG8gc2hvdyBvcmlnaW5hbCBzb3VyY2UgbG9jYXRpb25zLlxuICpcbiAqIEBwYXJhbSBzdGFjayAtIFRoZSBlcnJvciBzdGFjayB0cmFjZSB0byByZW1hcFxuICogQHBhcmFtIGZpbGVuYW1lIC0gVGhlIHdvcmtmbG93IGZpbGVuYW1lIHRvIG1hdGNoIGluIHN0YWNrIGZyYW1lc1xuICogQHBhcmFtIHdvcmtmbG93Q29kZSAtIFRoZSB3b3JrZmxvdyBidW5kbGUgY29kZSBjb250YWluaW5nIGlubGluZSBzb3VyY2UgbWFwc1xuICogQHJldHVybnMgVGhlIHJlbWFwcGVkIHN0YWNrIHRyYWNlIHdpdGggb3JpZ2luYWwgc291cmNlIGxvY2F0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtYXBFcnJvclN0YWNrKFxuICBzdGFjazogc3RyaW5nLFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICB3b3JrZmxvd0NvZGU6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZTY0ID0gZXh0cmFjdElubGluZVNvdXJjZU1hcEJhc2U2NCh3b3JrZmxvd0NvZGUpO1xuICBpZiAoIWJhc2U2NCkge1xuICAgIHJldHVybiBzdGFjazsgLy8gTm8gc291cmNlIG1hcCBmb3VuZFxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzb3VyY2VNYXBKc29uID0gQnVmZmVyLmZyb20oYmFzZTY0LCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgY29uc3Qgc291cmNlTWFwRGF0YSA9IEpTT04ucGFyc2Uoc291cmNlTWFwSnNvbik7XG5cbiAgICAvLyBVc2UgVHJhY2VNYXAgKHB1cmUgSlMsIG5vIFdBU00gcmVxdWlyZWQpXG4gICAgY29uc3QgdHJhY2VyID0gbmV3IFRyYWNlTWFwKHNvdXJjZU1hcERhdGEpO1xuXG4gICAgLy8gUGFyc2UgYW5kIHJlbWFwIGVhY2ggbGluZSBpbiB0aGUgc3RhY2sgdHJhY2VcbiAgICBjb25zdCBsaW5lcyA9IHN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICBjb25zdCByZW1hcHBlZExpbmVzID0gbGluZXMubWFwKChsaW5lKSA9PiB7XG4gICAgICAvLyBNYXRjaCBzdGFjayBmcmFtZXM6IFwiYXQgZnVuY3Rpb25OYW1lIChmaWxlbmFtZTpsaW5lOmNvbHVtbilcIiBvciBcImF0IGZpbGVuYW1lOmxpbmU6Y29sdW1uXCJcbiAgICAgIGNvbnN0IGZyYW1lTWF0Y2ggPSBsaW5lLm1hdGNoKFxuICAgICAgICAvXlxccyphdFxccysoPzooLis/KVxccytcXCgpPyguKz8pOihcXGQrKTooXFxkKylcXCk/JC9cbiAgICAgICk7XG4gICAgICBpZiAoIWZyYW1lTWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGxpbmU7IC8vIE5vdCBhIHN0YWNrIGZyYW1lLCByZXR1cm4gYXMtaXNcbiAgICAgIH1cblxuICAgICAgY29uc3QgWywgZnVuY3Rpb25OYW1lLCBmaWxlLCBsaW5lU3RyLCBjb2xTdHJdID0gZnJhbWVNYXRjaDtcblxuICAgICAgLy8gT25seSByZW1hcCBmcmFtZXMgZnJvbSBvdXIgd29ya2Zsb3cgZmlsZVxuICAgICAgaWYgKCFmaWxlLmluY2x1ZGVzKGZpbGVuYW1lKSkge1xuICAgICAgICByZXR1cm4gbGluZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGluZU51bWJlciA9IHBhcnNlSW50KGxpbmVTdHIsIDEwKTtcbiAgICAgIGNvbnN0IGNvbHVtbk51bWJlciA9IHBhcnNlSW50KGNvbFN0ciwgMTApO1xuXG4gICAgICAvLyBNYXAgdG8gb3JpZ2luYWwgc291cmNlIHBvc2l0aW9uXG4gICAgICBjb25zdCBvcmlnaW5hbCA9IG9yaWdpbmFsUG9zaXRpb25Gb3IodHJhY2VyLCB7XG4gICAgICAgIGxpbmU6IGxpbmVOdW1iZXIsXG4gICAgICAgIGNvbHVtbjogY29sdW1uTnVtYmVyLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcmlnaW5hbC5zb3VyY2UgJiYgb3JpZ2luYWwubGluZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBmdW5jID0gZnVuY3Rpb25OYW1lIHx8IG9yaWdpbmFsLm5hbWUgfHwgJ2Fub255bW91cyc7XG4gICAgICAgIGNvbnN0IGNvbCA9IG9yaWdpbmFsLmNvbHVtbiAhPT0gbnVsbCA/IG9yaWdpbmFsLmNvbHVtbiA6IGNvbHVtbk51bWJlcjtcbiAgICAgICAgcmV0dXJuIGAgICAgYXQgJHtmdW5jfSAoJHtvcmlnaW5hbC5zb3VyY2V9OiR7b3JpZ2luYWwubGluZX06JHtjb2x9KWA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5lOyAvLyBDb3VsZG4ndCBtYXAsIHJldHVybiBvcmlnaW5hbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlbWFwcGVkTGluZXMuam9pbignXFxuJyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHNvdXJjZSBtYXAgcHJvY2Vzc2luZyBmYWlscywgcmV0dXJuIG9yaWdpbmFsIHN0YWNrXG4gICAgcmV0dXJuIHN0YWNrO1xuICB9XG59XG4iXX0=
|
|
@@ -1,13 +1,27 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
2
|
import type { CryptoKey } from '../encryption.js';
|
|
3
|
+
import type { FlushableStreamState } from '../flushable-stream.js';
|
|
3
4
|
import type { WorkflowMetadata } from '../workflow/get-workflow-metadata.js';
|
|
4
5
|
import type { StepMetadata } from './get-step-metadata.js';
|
|
6
|
+
/**
|
|
7
|
+
* Per-step cache entry for a `(runId, namespace)` writable stream.
|
|
8
|
+
*
|
|
9
|
+
* Holds the user-facing `WritableStream` and the shared `FlushableStreamState`
|
|
10
|
+
* driving the background pipe to the workflow server. Re-used so repeat calls
|
|
11
|
+
* to `getWritable()` within the same step return the same handle instead of
|
|
12
|
+
* spawning racing pipes — see https://github.com/vercel/workflow/issues/2058.
|
|
13
|
+
*/
|
|
14
|
+
export interface CachedWritable {
|
|
15
|
+
writable: WritableStream<any>;
|
|
16
|
+
state: FlushableStreamState;
|
|
17
|
+
}
|
|
5
18
|
export type StepContext = {
|
|
6
19
|
stepMetadata: StepMetadata;
|
|
7
20
|
workflowMetadata: WorkflowMetadata;
|
|
8
21
|
ops: Promise<void>[];
|
|
9
22
|
closureVars?: Record<string, any>;
|
|
10
23
|
encryptionKey?: CryptoKey;
|
|
24
|
+
writables?: Map<string, CachedWritable>;
|
|
11
25
|
};
|
|
12
26
|
export declare const contextStorage: AsyncLocalStorage<StepContext>;
|
|
13
27
|
//# sourceMappingURL=context-storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-storage.d.ts","sourceRoot":"","sources":["../../src/step/context-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"context-storage.d.ts","sourceRoot":"","sources":["../../src/step/context-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IAC9B,KAAK,EAAE,oBAAoB,CAAC;CAC7B;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACzC,CAAC;AAoBF,eAAO,MAAM,cAAc,EAAE,iBAAiB,CAAC,WAAW,CAKjB,CAAC"}
|
|
@@ -19,4 +19,4 @@ const CONTEXT_STORAGE_SYMBOL = Symbol.for('WORKFLOW_STEP_CONTEXT_STORAGE');
|
|
|
19
19
|
export const contextStorage = globalThis[CONTEXT_STORAGE_SYMBOL] ??
|
|
20
20
|
(globalThis[CONTEXT_STORAGE_SYMBOL] =
|
|
21
21
|
new AsyncLocalStorage());
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0ZXAvY29udGV4dC1zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBNEJyRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQUUzRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQ3ZCLFVBQWtCLENBQUMsc0JBQXNCLENBRTdCO0lBQ2QsQ0FBRSxVQUFrQixDQUFDLHNCQUFzQixDQUFDO1FBQzFDLElBQUksaUJBQWlCLEVBQWUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcbmltcG9ydCB0eXBlIHsgQ3J5cHRvS2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsdXNoYWJsZVN0cmVhbVN0YXRlIH0gZnJvbSAnLi4vZmx1c2hhYmxlLXN0cmVhbS5qcyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tICcuLi93b3JrZmxvdy9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGVwTWV0YWRhdGEgfSBmcm9tICcuL2dldC1zdGVwLW1ldGFkYXRhLmpzJztcblxuLyoqXG4gKiBQZXItc3RlcCBjYWNoZSBlbnRyeSBmb3IgYSBgKHJ1bklkLCBuYW1lc3BhY2UpYCB3cml0YWJsZSBzdHJlYW0uXG4gKlxuICogSG9sZHMgdGhlIHVzZXItZmFjaW5nIGBXcml0YWJsZVN0cmVhbWAgYW5kIHRoZSBzaGFyZWQgYEZsdXNoYWJsZVN0cmVhbVN0YXRlYFxuICogZHJpdmluZyB0aGUgYmFja2dyb3VuZCBwaXBlIHRvIHRoZSB3b3JrZmxvdyBzZXJ2ZXIuIFJlLXVzZWQgc28gcmVwZWF0IGNhbGxzXG4gKiB0byBgZ2V0V3JpdGFibGUoKWAgd2l0aGluIHRoZSBzYW1lIHN0ZXAgcmV0dXJuIHRoZSBzYW1lIGhhbmRsZSBpbnN0ZWFkIG9mXG4gKiBzcGF3bmluZyByYWNpbmcgcGlwZXMg4oCUIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdmVyY2VsL3dvcmtmbG93L2lzc3Vlcy8yMDU4LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlZFdyaXRhYmxlIHtcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtPGFueT47XG4gIHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZTtcbn1cblxuZXhwb3J0IHR5cGUgU3RlcENvbnRleHQgPSB7XG4gIHN0ZXBNZXRhZGF0YTogU3RlcE1ldGFkYXRhO1xuICB3b3JrZmxvd01ldGFkYXRhOiBXb3JrZmxvd01ldGFkYXRhO1xuICBvcHM6IFByb21pc2U8dm9pZD5bXTtcbiAgY2xvc3VyZVZhcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBlbmNyeXB0aW9uS2V5PzogQ3J5cHRvS2V5O1xuICB3cml0YWJsZXM/OiBNYXA8c3RyaW5nLCBDYWNoZWRXcml0YWJsZT47XG59O1xuXG4vKipcbiAqIFByb2Nlc3Mtd2lkZSBzaW5nbGV0b24gQXN5bmNMb2NhbFN0b3JhZ2UgZm9yIHN0ZXAgZXhlY3V0aW9uIGNvbnRleHQuXG4gKlxuICogVXNlcyBgU3ltYm9sLmZvcigpYCBvbiBnbG9iYWxUaGlzIHRvIGd1YXJhbnRlZSBhIHNpbmdsZSBpbnN0YW5jZSBldmVuIHdoZW5cbiAqIGJ1bmRsZXJzIChlLmcuIFZlcmNlbCdzIHByb2R1Y3Rpb24gYnVuZGxlcikgY3JlYXRlIG11bHRpcGxlIGNvcGllcyBvZiB0aGlzXG4gKiBtb2R1bGUuIFdpdGhvdXQgdGhpcywgYGNvbnRleHRTdG9yYWdlLnJ1bigpYCBpbiB0aGUgc3RlcCBoYW5kbGVyIGFuZFxuICogYGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKClgIGluIHVzZXIgY29kZSAodmlhIGdldFdvcmtmbG93TWV0YWRhdGEgL1xuICogZ2V0U3RlcE1ldGFkYXRhKSBjYW4gcmVmZXJlbmNlIGRpZmZlcmVudCBBc3luY0xvY2FsU3RvcmFnZSBpbnN0YW5jZXMsXG4gKiBjYXVzaW5nIHRoZSBzdG9yZSB0byBhcHBlYXIgZW1wdHkuXG4gKlxuICogTm90ZSB0aGF0IHdlIHdlcmUgdW5hYmxlIHRvIHJlcHJvZHVjZSB0aGlzIGlzc3VlLiBUaGlzIGlzIGEgZml4IGZvciB0aGUgb25seSBzeW50aGV0aWMgd2F5XG4gKiB3YXkgaW4gd2hpY2ggd2UgY291bGQgZ2V0IHRoZSBidWlsZGVyIHRvIGJyZWFrIHdpdGggdGhlIHJlcG9ydGVkIGVycm9yIG1lc3NhZ2UsIGFuZFxuICogc2VydmVzIGFzIGRlZmVuc2UtaW4tZGVwdGgsIHNpbmNlIHRoZSBjaGFuZ2UgaXMgb3RoZXJ3aXNlIHNhZmUuXG4gKlxuICogU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdmVyY2VsL3dvcmtmbG93L2lzc3Vlcy8xNTc3XG4gKi9cbmNvbnN0IENPTlRFWFRfU1RPUkFHRV9TWU1CT0wgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19TVEVQX0NPTlRFWFRfU1RPUkFHRScpO1xuXG5leHBvcnQgY29uc3QgY29udGV4dFN0b3JhZ2U6IEFzeW5jTG9jYWxTdG9yYWdlPFN0ZXBDb250ZXh0PiA9XG4gICgoZ2xvYmFsVGhpcyBhcyBhbnkpW0NPTlRFWFRfU1RPUkFHRV9TWU1CT0xdIGFzXG4gICAgfCBBc3luY0xvY2FsU3RvcmFnZTxTdGVwQ29udGV4dD5cbiAgICB8IHVuZGVmaW5lZCkgPz9cbiAgKChnbG9iYWxUaGlzIGFzIGFueSlbQ09OVEVYVF9TVE9SQUdFX1NZTUJPTF0gPVxuICAgIG5ldyBBc3luY0xvY2FsU3RvcmFnZTxTdGVwQ29udGV4dD4oKSk7XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writable-stream.d.ts","sourceRoot":"","sources":["../../src/step/writable-stream.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,GAAG,EACjC,OAAO,GAAE,6BAAkC,GAC1C,cAAc,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"writable-stream.d.ts","sourceRoot":"","sources":["../../src/step/writable-stream.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,GAAG,EACjC,OAAO,GAAE,6BAAkC,GAC1C,cAAc,CAAC,CAAC,CAAC,CAuEnB"}
|
|
@@ -22,7 +22,24 @@ export function getWritable(options = {}) {
|
|
|
22
22
|
const { namespace } = options;
|
|
23
23
|
const runId = ctx.workflowMetadata.workflowRunId;
|
|
24
24
|
const name = getWorkflowRunStreamId(runId, namespace);
|
|
25
|
-
//
|
|
25
|
+
// Cache the writable per (runId, namespace) within the step context.
|
|
26
|
+
//
|
|
27
|
+
// The previous behavior — constructing a fresh TransformStream and
|
|
28
|
+
// background pipe on every call — produced non-deterministic chunk
|
|
29
|
+
// ordering when callers acquired a new writer per write (e.g. a
|
|
30
|
+
// per-chunk loop). Each pipe flushed to the same (runId, name) server
|
|
31
|
+
// stream independently, and on Vercel the 50-100ms HTTP latency
|
|
32
|
+
// turned the race window from microseconds into something prod-visible.
|
|
33
|
+
//
|
|
34
|
+
// Sharing a single TransformStream + pipe across calls makes the
|
|
35
|
+
// unsafe pattern correct: writes go through one serial sink in the
|
|
36
|
+
// order the user wrote them. See
|
|
37
|
+
// https://github.com/vercel/workflow/issues/2058.
|
|
38
|
+
const cache = (ctx.writables ??= new Map());
|
|
39
|
+
const cached = cache.get(name);
|
|
40
|
+
if (cached) {
|
|
41
|
+
return cached.writable;
|
|
42
|
+
}
|
|
26
43
|
const serialize = getSerializeStream(getExternalReducers(globalThis, ctx.ops, runId, ctx.encryptionKey), ctx.encryptionKey);
|
|
27
44
|
// Use flushable pipe so the ops promise resolves when the user releases
|
|
28
45
|
// their writer lock, not only when the stream is explicitly closed.
|
|
@@ -50,7 +67,7 @@ export function getWritable(options = {}) {
|
|
|
50
67
|
value: runId,
|
|
51
68
|
writable: false,
|
|
52
69
|
});
|
|
53
|
-
|
|
70
|
+
cache.set(name, { writable: serialize.writable, state });
|
|
54
71
|
return serialize.writable;
|
|
55
72
|
}
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGFibGUtc3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0ZXAvd3JpdGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLGdCQUFnQixHQUNqQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLDRCQUE0QixHQUM3QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUF1QixjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWEzRTs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixVQUF5QyxFQUFFO0lBRTNDLE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0QyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCwrQkFBK0IsQ0FDN0IsZUFBZSxFQUNmLG1FQUFtRSxFQUNuRSxXQUFXLENBQ1osQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQzlCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUM7SUFDakQsTUFBTSxJQUFJLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXRELHFFQUFxRTtJQUNyRSxFQUFFO0lBQ0YsbUVBQW1FO0lBQ25FLG1FQUFtRTtJQUNuRSxnRUFBZ0U7SUFDaEUsc0VBQXNFO0lBQ3RFLGdFQUFnRTtJQUNoRSx3RUFBd0U7SUFDeEUsRUFBRTtJQUNGLGlFQUFpRTtJQUNqRSxtRUFBbUU7SUFDbkUsaUNBQWlDO0lBQ2pDLGtEQUFrRDtJQUNsRCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssSUFBSSxHQUFHLEVBQTBCLENBQUMsQ0FBQztJQUNwRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxPQUFPLE1BQU0sQ0FBQyxRQUE2QixDQUFDO0lBQzlDLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FDbEMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFDbEUsR0FBRyxDQUFDLGFBQWEsQ0FDbEIsQ0FBQztJQUVGLHdFQUF3RTtJQUN4RSxvRUFBb0U7SUFDcEUsd0VBQXdFO0lBQ3hFLDJDQUEyQztJQUMzQyxNQUFNLGNBQWMsR0FBRyxJQUFJLDRCQUE0QixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRSxNQUFNLEtBQUssR0FBRyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3JDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUU1QixhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtRQUNsRSxzQ0FBc0M7SUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTVDLHFFQUFxRTtJQUNyRSxnRUFBZ0U7SUFDaEUsa0VBQWtFO0lBQ2xFLGlFQUFpRTtJQUNqRSw2REFBNkQ7SUFDN0QsOERBQThEO0lBQzlELGtEQUFrRDtJQUNsRCxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLEVBQUU7UUFDNUQsS0FBSyxFQUFFLElBQUk7UUFDWCxRQUFRLEVBQUUsS0FBSztLQUNoQixDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsMkJBQTJCLEVBQUU7UUFDckUsS0FBSyxFQUFFLEtBQUs7UUFDWixRQUFRLEVBQUUsS0FBSztLQUNoQixDQUFDLENBQUM7SUFFSCxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFekQsT0FBTyxTQUFTLENBQUMsUUFBNkIsQ0FBQztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdGhyb3dOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dCB9IGZyb20gJy4uL2NvbnRleHQtZXJyb3JzLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUZsdXNoYWJsZVN0YXRlLFxuICBmbHVzaGFibGVQaXBlLFxuICBwb2xsV3JpdGFibGVMb2NrLFxufSBmcm9tICcuLi9mbHVzaGFibGUtc3RyZWFtLmpzJztcbmltcG9ydCB7XG4gIGdldEV4dGVybmFsUmVkdWNlcnMsXG4gIGdldFNlcmlhbGl6ZVN0cmVhbSxcbiAgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbSxcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBTVFJFQU1fTkFNRV9TWU1CT0wsIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCB9IGZyb20gJy4uL3N5bWJvbHMuanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCB9IGZyb20gJy4uL3V0aWwuanMnO1xuaW1wb3J0IHsgdHlwZSBDYWNoZWRXcml0YWJsZSwgY29udGV4dFN0b3JhZ2UgfSBmcm9tICcuL2NvbnRleHQtc3RvcmFnZS5qcyc7XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIHtAbGluayBnZXRXcml0YWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dXcml0YWJsZVN0cmVhbU9wdGlvbnMge1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbmFtZXNwYWNlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbXVsdGlwbGUgc3RyZWFtcyBhc3NvY2lhdGVkXG4gICAqIHdpdGggdGhlIHNhbWUgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhIHdyaXRhYmxlIHN0cmVhbSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCB3b3JrZmxvdy5cbiAqXG4gKiBUaGUgd3JpdGFibGUgc3RyZWFtIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aGluIHN0ZXAgZnVuY3Rpb25zIHRvIHdyaXRlXG4gKiBkYXRhIHRoYXQgY2FuIGJlIHJlYWQgb3V0c2lkZSB0aGUgd29ya2Zsb3cgYnkgdXNpbmcgdGhlIHJlYWRhYmxlIG1ldGhvZCBvZiBnZXRSdW4uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgd3JpdGFibGUgc3RyZWFtXG4gKiBAcmV0dXJucyBUaGUgd3JpdGFibGUgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCB3b3JrZmxvdyBydW5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgY2FsbGVkIG91dHNpZGUgYSB3b3JrZmxvdyBvciBzdGVwIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXcml0YWJsZTxXID0gYW55PihcbiAgb3B0aW9uczogV29ya2Zsb3dXcml0YWJsZVN0cmVhbU9wdGlvbnMgPSB7fVxuKTogV3JpdGFibGVTdHJlYW08Vz4ge1xuICBjb25zdCBjdHggPSBjb250ZXh0U3RvcmFnZS5nZXRTdG9yZSgpO1xuICBpZiAoIWN0eCkge1xuICAgIHRocm93Tm90SW5Xb3JrZmxvd09yU3RlcENvbnRleHQoXG4gICAgICAnZ2V0V3JpdGFibGUoKScsXG4gICAgICAnaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2RvY3MvYXBpLXJlZmVyZW5jZS93b3JrZmxvdy9nZXQtd3JpdGFibGUnLFxuICAgICAgZ2V0V3JpdGFibGVcbiAgICApO1xuICB9XG5cbiAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJ1bklkID0gY3R4LndvcmtmbG93TWV0YWRhdGEud29ya2Zsb3dSdW5JZDtcbiAgY29uc3QgbmFtZSA9IGdldFdvcmtmbG93UnVuU3RyZWFtSWQocnVuSWQsIG5hbWVzcGFjZSk7XG5cbiAgLy8gQ2FjaGUgdGhlIHdyaXRhYmxlIHBlciAocnVuSWQsIG5hbWVzcGFjZSkgd2l0aGluIHRoZSBzdGVwIGNvbnRleHQuXG4gIC8vXG4gIC8vIFRoZSBwcmV2aW91cyBiZWhhdmlvciDigJQgY29uc3RydWN0aW5nIGEgZnJlc2ggVHJhbnNmb3JtU3RyZWFtIGFuZFxuICAvLyBiYWNrZ3JvdW5kIHBpcGUgb24gZXZlcnkgY2FsbCDigJQgcHJvZHVjZWQgbm9uLWRldGVybWluaXN0aWMgY2h1bmtcbiAgLy8gb3JkZXJpbmcgd2hlbiBjYWxsZXJzIGFjcXVpcmVkIGEgbmV3IHdyaXRlciBwZXIgd3JpdGUgKGUuZy4gYVxuICAvLyBwZXItY2h1bmsgbG9vcCkuIEVhY2ggcGlwZSBmbHVzaGVkIHRvIHRoZSBzYW1lIChydW5JZCwgbmFtZSkgc2VydmVyXG4gIC8vIHN0cmVhbSBpbmRlcGVuZGVudGx5LCBhbmQgb24gVmVyY2VsIHRoZSA1MC0xMDBtcyBIVFRQIGxhdGVuY3lcbiAgLy8gdHVybmVkIHRoZSByYWNlIHdpbmRvdyBmcm9tIG1pY3Jvc2Vjb25kcyBpbnRvIHNvbWV0aGluZyBwcm9kLXZpc2libGUuXG4gIC8vXG4gIC8vIFNoYXJpbmcgYSBzaW5nbGUgVHJhbnNmb3JtU3RyZWFtICsgcGlwZSBhY3Jvc3MgY2FsbHMgbWFrZXMgdGhlXG4gIC8vIHVuc2FmZSBwYXR0ZXJuIGNvcnJlY3Q6IHdyaXRlcyBnbyB0aHJvdWdoIG9uZSBzZXJpYWwgc2luayBpbiB0aGVcbiAgLy8gb3JkZXIgdGhlIHVzZXIgd3JvdGUgdGhlbS4gU2VlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92ZXJjZWwvd29ya2Zsb3cvaXNzdWVzLzIwNTguXG4gIGNvbnN0IGNhY2hlID0gKGN0eC53cml0YWJsZXMgPz89IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRXcml0YWJsZT4oKSk7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChuYW1lKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQud3JpdGFibGUgYXMgV3JpdGFibGVTdHJlYW08Vz47XG4gIH1cblxuICBjb25zdCBzZXJpYWxpemUgPSBnZXRTZXJpYWxpemVTdHJlYW0oXG4gICAgZ2V0RXh0ZXJuYWxSZWR1Y2VycyhnbG9iYWxUaGlzLCBjdHgub3BzLCBydW5JZCwgY3R4LmVuY3J5cHRpb25LZXkpLFxuICAgIGN0eC5lbmNyeXB0aW9uS2V5XG4gICk7XG5cbiAgLy8gVXNlIGZsdXNoYWJsZSBwaXBlIHNvIHRoZSBvcHMgcHJvbWlzZSByZXNvbHZlcyB3aGVuIHRoZSB1c2VyIHJlbGVhc2VzXG4gIC8vIHRoZWlyIHdyaXRlciBsb2NrLCBub3Qgb25seSB3aGVuIHRoZSBzdHJlYW0gaXMgZXhwbGljaXRseSBjbG9zZWQuXG4gIC8vIFdpdGhvdXQgdGhpcywgVmVyY2VsIGZ1bmN0aW9ucyBoYW5nIHVudGlsIHRoZSBydW50aW1lIHRpbWVvdXQgYmVjYXVzZVxuICAvLyAucGlwZVRvKCkgb25seSByZXNvbHZlcyBvbiBzdHJlYW0gY2xvc2UuXG4gIGNvbnN0IHNlcnZlcldyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0ocnVuSWQsIG5hbWUpO1xuICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gIGN0eC5vcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICBmbHVzaGFibGVQaXBlKHNlcmlhbGl6ZS5yZWFkYWJsZSwgc2VydmVyV3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgfSk7XG5cbiAgcG9sbFdyaXRhYmxlTG9jayhzZXJpYWxpemUud3JpdGFibGUsIHN0YXRlKTtcblxuICAvLyBUYWcgdGhlIHdyaXRhYmxlIHdpdGggaXRzIHVuZGVybHlpbmcgYChydW5JZCwgbmFtZSlgIHNvIGRvd25zdHJlYW1cbiAgLy8gcmVkdWNlcnMgY2FuIHJlY29nbml6ZSB0aGF0IGl0J3MgYWxyZWFkeSBiYWNrZWQgYnkgYSB3b3JrZmxvd1xuICAvLyBzZXJ2ZXIgc3RyZWFtLiBDYWxsaW5nIGBzdGFydChjaGlsZCwgW2FyZ3MsIHRoZVdyaXRhYmxlXSlgIGZyb21cbiAgLy8gdGhlIHNhbWUgc3RlcCB1c2VzIHRoZXNlIHRhZ3MgdG8gZW1pdCBgeyBuYW1lLCBydW5JZCB9YCBpbiB0aGVcbiAgLy8gZGVoeWRyYXRlZCBkZXNjcmlwdG9yLCBzbyB0aGUgY2hpbGQncyByZXZpdmVyIGNhbiBvcGVuIHRoZVxuICAvLyB3cml0YWJsZSBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBgKHJ1bklkLCBuYW1lKWAgZGlyZWN0bHkg4oCUIG5vXG4gIC8vIGluLXByb2Nlc3MgYnJpZGdlIHRpZWQgdG8gdGhpcyBzdGVwJ3MgbGlmZXRpbWUuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9OQU1FX1NZTUJPTCwge1xuICAgIHZhbHVlOiBuYW1lLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCwge1xuICAgIHZhbHVlOiBydW5JZCxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gIH0pO1xuXG4gIGNhY2hlLnNldChuYW1lLCB7IHdyaXRhYmxlOiBzZXJpYWxpemUud3JpdGFibGUsIHN0YXRlIH0pO1xuXG4gIHJldHVybiBzZXJpYWxpemUud3JpdGFibGUgYXMgV3JpdGFibGVTdHJlYW08Vz47XG59XG4iXX0=
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "5.0.0-beta.
|
|
1
|
+
export declare const version = "5.0.0-beta.8";
|
|
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.
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
export const version = '5.0.0-beta.8';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR2VuZXJhdGVkIGJ5IGdlbnZlcnNpb24uXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICc1LjAuMC1iZXRhLjgnXG4iXX0=
|
package/dist/workflow/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { StepMetadata } from '../step/get-step-metadata.js';
|
|
2
2
|
export { FatalError, RetryableError, type RetryableErrorOptions, } from '@workflow/errors';
|
|
3
3
|
export type { Hook, HookOptions } from '../create-hook.js';
|
|
4
|
+
export { experimental_setAttributes } from './set-attributes.js';
|
|
4
5
|
export { sleep } from '../sleep.js';
|
|
5
6
|
export { createHook, createWebhook } from './create-hook.js';
|
|
6
7
|
export { defineHook } from './define-hook.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAInD,wBAAgB,eAAe,IAAI,YAAY,CAM9C;AACD,wBAAgB,UAAU,SAMzB"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAInD,wBAAgB,eAAe,IAAI,YAAY,CAM9C;AACD,wBAAgB,UAAU,SAMzB"}
|
package/dist/workflow/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { throwNotInStepContext, throwUnavailableInWorkflowContext, } from '../context-errors.js';
|
|
2
2
|
export { FatalError, RetryableError, } from '@workflow/errors';
|
|
3
|
+
export { experimental_setAttributes } from './set-attributes.js';
|
|
3
4
|
export { sleep } from '../sleep.js';
|
|
4
5
|
export { createHook, createWebhook } from './create-hook.js';
|
|
5
6
|
export { defineHook } from './define-hook.js';
|
|
@@ -13,4 +14,4 @@ export function getStepMetadata() {
|
|
|
13
14
|
export function resumeHook() {
|
|
14
15
|
throwUnavailableInWorkflowContext('resumeHook()', 'https://workflow-sdk.dev/docs/api-reference/workflow-api/resume-hook', resumeHook);
|
|
15
16
|
}
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixpQ0FBaUMsR0FDbEMsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsR0FFZixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELG9FQUFvRTtBQUNwRSw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLGVBQWU7SUFDN0IscUJBQXFCLENBQ25CLG1CQUFtQixFQUNuQix3RUFBd0UsRUFDeEUsZUFBZSxDQUNoQixDQUFDO0FBQ0osQ0FBQztBQUNELE1BQU0sVUFBVSxVQUFVO0lBQ3hCLGlDQUFpQyxDQUMvQixjQUFjLEVBQ2Qsc0VBQXNFLEVBQ3RFLFVBQVUsQ0FDWCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHRocm93Tm90SW5TdGVwQ29udGV4dCxcbiAgdGhyb3dVbmF2YWlsYWJsZUluV29ya2Zsb3dDb250ZXh0LFxufSBmcm9tICcuLi9jb250ZXh0LWVycm9ycy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0ZXBNZXRhZGF0YSB9IGZyb20gJy4uL3N0ZXAvZ2V0LXN0ZXAtbWV0YWRhdGEuanMnO1xuXG5leHBvcnQge1xuICBGYXRhbEVycm9yLFxuICBSZXRyeWFibGVFcnJvcixcbiAgdHlwZSBSZXRyeWFibGVFcnJvck9wdGlvbnMsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuZXhwb3J0IHR5cGUgeyBIb29rLCBIb29rT3B0aW9ucyB9IGZyb20gJy4uL2NyZWF0ZS1ob29rLmpzJztcbmV4cG9ydCB7IGV4cGVyaW1lbnRhbF9zZXRBdHRyaWJ1dGVzIH0gZnJvbSAnLi9zZXQtYXR0cmlidXRlcy5qcyc7XG5leHBvcnQgeyBzbGVlcCB9IGZyb20gJy4uL3NsZWVwLmpzJztcbmV4cG9ydCB7IGNyZWF0ZUhvb2ssIGNyZWF0ZVdlYmhvb2sgfSBmcm9tICcuL2NyZWF0ZS1ob29rLmpzJztcbmV4cG9ydCB7IGRlZmluZUhvb2sgfSBmcm9tICcuL2RlZmluZS1ob29rLmpzJztcbmV4cG9ydCB7IGdldFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tICcuL2dldC13b3JrZmxvdy1tZXRhZGF0YS5qcyc7XG5leHBvcnQgeyBnZXRXcml0YWJsZSB9IGZyb20gJy4vd3JpdGFibGUtc3RyZWFtLmpzJztcblxuLy8gd29ya2Zsb3dzIGNhbid0IHVzZSB0aGVzZSBmdW5jdGlvbnMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHByb3ZpZGVcbi8vIHRoZSBleHBvcnQgc28gYnVuZGxpbmcgZG9lc24ndCBmYWlsIHdoZW4gc3RlcCBhbmQgd29ya2Zsb3cgYXJlIGluIHNhbWUgZmlsZVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0ZXBNZXRhZGF0YSgpOiBTdGVwTWV0YWRhdGEge1xuICB0aHJvd05vdEluU3RlcENvbnRleHQoXG4gICAgJ2dldFN0ZXBNZXRhZGF0YSgpJyxcbiAgICAnaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2RvY3MvYXBpLXJlZmVyZW5jZS93b3JrZmxvdy9nZXQtc3RlcC1tZXRhZGF0YScsXG4gICAgZ2V0U3RlcE1ldGFkYXRhXG4gICk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzdW1lSG9vaygpIHtcbiAgdGhyb3dVbmF2YWlsYWJsZUluV29ya2Zsb3dDb250ZXh0KFxuICAgICdyZXN1bWVIb29rKCknLFxuICAgICdodHRwczovL3dvcmtmbG93LXNkay5kZXYvZG9jcy9hcGktcmVmZXJlbmNlL3dvcmtmbG93LWFwaS9yZXN1bWUtaG9vaycsXG4gICAgcmVzdW1lSG9va1xuICApO1xufVxuIl19
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options accepted by `experimental_setAttributes`.
|
|
3
|
+
*/
|
|
4
|
+
export interface ExperimentalSetAttributesOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Permit attribute keys that start with the reserved `$` prefix.
|
|
7
|
+
* **Default: `false`.**
|
|
8
|
+
*
|
|
9
|
+
* The `$` namespace is reserved for framework and library code that
|
|
10
|
+
* is built on top of the workflow SDK (telemetry, agent metadata,
|
|
11
|
+
* platform-emitted tags, etc.). User code MUST NOT write keys in
|
|
12
|
+
* this namespace; validation rejects them so accidental collisions
|
|
13
|
+
* with tooling-owned keys can't slip through.
|
|
14
|
+
*
|
|
15
|
+
* Only flip this to `true` if your caller is itself a framework or
|
|
16
|
+
* library that owns a `$`-prefixed sub-namespace and knows the
|
|
17
|
+
* conventions of any other tools writing into it. Misuse can
|
|
18
|
+
* conflict with observability surfaces, agent dashboards, or future
|
|
19
|
+
* platform features that rely on the reserved namespace.
|
|
20
|
+
*/
|
|
21
|
+
allowReservedAttributes?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Attach plaintext string key/value metadata to the current workflow run.
|
|
25
|
+
*
|
|
26
|
+
* **EXPERIMENTAL.** The `experimental_` prefix is deliberate — the
|
|
27
|
+
* shape, semantics, and dispatch path are likely to change before this
|
|
28
|
+
* is renamed to a stable export. Use only when you can absorb a
|
|
29
|
+
* breaking rename later.
|
|
30
|
+
*
|
|
31
|
+
* Callable only from a workflow body (`'use workflow'`). The call is
|
|
32
|
+
* dispatched through the workflow runtime as a step, so the mutation
|
|
33
|
+
* is recorded in the event log and survives replay.
|
|
34
|
+
*
|
|
35
|
+
* Validation runs in the VM (cheap, deterministic) before the step
|
|
36
|
+
* dispatch — violations throw `FatalError` without queuing a step. An
|
|
37
|
+
* empty record is a no-op. `value: undefined` removes the key from the
|
|
38
|
+
* run's attribute map.
|
|
39
|
+
*
|
|
40
|
+
* **Reserved namespace.** Keys starting with `$` are reserved for
|
|
41
|
+
* framework/library code (telemetry, agent metadata, etc.). User code
|
|
42
|
+
* trying to write a `$`-prefixed key throws `FatalError`. If you are a
|
|
43
|
+
* framework author and need to set a reserved key, pass
|
|
44
|
+
* `{ allowReservedAttributes: true }` as the second argument — see
|
|
45
|
+
* `ExperimentalSetAttributesOptions` for the trade-offs.
|
|
46
|
+
*
|
|
47
|
+
* **WARNING**: While this feature is experimental, calling e.g.
|
|
48
|
+
* `Promise.all([experimental_setAttributes({ a: '1' }), experimental_setAttributes({ a: '2' })])`
|
|
49
|
+
* is not guaranteed to be ordered consistently, but the equivalent
|
|
50
|
+
* sequential `.then()` chain is.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* import { experimental_setAttributes } from 'workflow';
|
|
55
|
+
*
|
|
56
|
+
* export async function myWorkflow() {
|
|
57
|
+
* 'use workflow';
|
|
58
|
+
* await experimental_setAttributes({ phase: 'init' });
|
|
59
|
+
* // ... work ...
|
|
60
|
+
* await experimental_setAttributes({ phase: 'done', orderId: 'ord_123' });
|
|
61
|
+
* await experimental_setAttributes({ orderId: undefined }); // remove
|
|
62
|
+
* }
|
|
63
|
+
* ```
|
|
64
|
+
*
|
|
65
|
+
* @example Framework / library code writing into the reserved namespace.
|
|
66
|
+
* ```ts
|
|
67
|
+
* await experimental_setAttributes(
|
|
68
|
+
* { '$agent.kind': 'durable-agent' },
|
|
69
|
+
* { allowReservedAttributes: true }
|
|
70
|
+
* );
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function experimental_setAttributes(attrs: Record<string, string | undefined>, options?: ExperimentalSetAttributesOptions): Promise<void>;
|
|
74
|
+
//# sourceMappingURL=set-attributes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-attributes.d.ts","sourceRoot":"","sources":["../../src/workflow/set-attributes.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C;;;;;;;;;;;;;;;OAeG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACzC,OAAO,GAAE,gCAAqC,GAC7C,OAAO,CAAC,IAAI,CAAC,CA0Cf"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { FatalError } from '@workflow/errors';
|
|
2
|
+
import { AttributeValidationError, validateAttributeChanges, } from '@workflow/world';
|
|
3
|
+
import { WORKFLOW_USE_STEP } from '../symbols.js';
|
|
4
|
+
/**
|
|
5
|
+
* Attach plaintext string key/value metadata to the current workflow run.
|
|
6
|
+
*
|
|
7
|
+
* **EXPERIMENTAL.** The `experimental_` prefix is deliberate — the
|
|
8
|
+
* shape, semantics, and dispatch path are likely to change before this
|
|
9
|
+
* is renamed to a stable export. Use only when you can absorb a
|
|
10
|
+
* breaking rename later.
|
|
11
|
+
*
|
|
12
|
+
* Callable only from a workflow body (`'use workflow'`). The call is
|
|
13
|
+
* dispatched through the workflow runtime as a step, so the mutation
|
|
14
|
+
* is recorded in the event log and survives replay.
|
|
15
|
+
*
|
|
16
|
+
* Validation runs in the VM (cheap, deterministic) before the step
|
|
17
|
+
* dispatch — violations throw `FatalError` without queuing a step. An
|
|
18
|
+
* empty record is a no-op. `value: undefined` removes the key from the
|
|
19
|
+
* run's attribute map.
|
|
20
|
+
*
|
|
21
|
+
* **Reserved namespace.** Keys starting with `$` are reserved for
|
|
22
|
+
* framework/library code (telemetry, agent metadata, etc.). User code
|
|
23
|
+
* trying to write a `$`-prefixed key throws `FatalError`. If you are a
|
|
24
|
+
* framework author and need to set a reserved key, pass
|
|
25
|
+
* `{ allowReservedAttributes: true }` as the second argument — see
|
|
26
|
+
* `ExperimentalSetAttributesOptions` for the trade-offs.
|
|
27
|
+
*
|
|
28
|
+
* **WARNING**: While this feature is experimental, calling e.g.
|
|
29
|
+
* `Promise.all([experimental_setAttributes({ a: '1' }), experimental_setAttributes({ a: '2' })])`
|
|
30
|
+
* is not guaranteed to be ordered consistently, but the equivalent
|
|
31
|
+
* sequential `.then()` chain is.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* import { experimental_setAttributes } from 'workflow';
|
|
36
|
+
*
|
|
37
|
+
* export async function myWorkflow() {
|
|
38
|
+
* 'use workflow';
|
|
39
|
+
* await experimental_setAttributes({ phase: 'init' });
|
|
40
|
+
* // ... work ...
|
|
41
|
+
* await experimental_setAttributes({ phase: 'done', orderId: 'ord_123' });
|
|
42
|
+
* await experimental_setAttributes({ orderId: undefined }); // remove
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @example Framework / library code writing into the reserved namespace.
|
|
47
|
+
* ```ts
|
|
48
|
+
* await experimental_setAttributes(
|
|
49
|
+
* { '$agent.kind': 'durable-agent' },
|
|
50
|
+
* { allowReservedAttributes: true }
|
|
51
|
+
* );
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export async function experimental_setAttributes(attrs, options = {}) {
|
|
55
|
+
if (attrs === null || typeof attrs !== 'object' || Array.isArray(attrs)) {
|
|
56
|
+
throw new FatalError(`experimental_setAttributes requires a plain object, got ${attrs === null ? 'null' : Array.isArray(attrs) ? 'array' : typeof attrs}`);
|
|
57
|
+
}
|
|
58
|
+
const changes = Object.entries(attrs).map(([key, value]) => ({
|
|
59
|
+
key,
|
|
60
|
+
value: value === undefined ? null : value,
|
|
61
|
+
}));
|
|
62
|
+
if (changes.length === 0)
|
|
63
|
+
return;
|
|
64
|
+
const allowReservedAttributes = options.allowReservedAttributes === true;
|
|
65
|
+
try {
|
|
66
|
+
validateAttributeChanges(changes, { allowReservedAttributes });
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
if (err instanceof AttributeValidationError) {
|
|
70
|
+
throw new FatalError(err.message);
|
|
71
|
+
}
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
const useStep = globalThis[WORKFLOW_USE_STEP];
|
|
75
|
+
if (!useStep) {
|
|
76
|
+
throw new FatalError('experimental_setAttributes() called outside a workflow runtime context. ' +
|
|
77
|
+
'It must be called from within a workflow body (`use workflow`).');
|
|
78
|
+
}
|
|
79
|
+
await useStep('__builtin_set_attributes')(changes, allowReservedAttributes ? { allowReservedAttributes: true } : {});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LWF0dHJpYnV0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvc2V0LWF0dHJpYnV0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIsd0JBQXdCLEdBQ3pCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBeUJsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCLENBQzlDLEtBQXlDLEVBQ3pDLFVBQTRDLEVBQUU7SUFFOUMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEUsTUFBTSxJQUFJLFVBQVUsQ0FDbEIsMkRBQ0UsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FDcEUsRUFBRSxDQUNILENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQXNCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUMxRCxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLEdBQUc7UUFDSCxLQUFLLEVBQUUsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO0tBQzFDLENBQUMsQ0FDSCxDQUFDO0lBQ0YsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPO0lBQ2pDLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixLQUFLLElBQUksQ0FBQztJQUN6RSxJQUFJLENBQUM7UUFDSCx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLEdBQUcsWUFBWSx3QkFBd0IsRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxNQUFNLEdBQUcsQ0FBQztJQUNaLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBSSxVQUFzQyxDQUFDLGlCQUFpQixDQU81RCxDQUFDO0lBQ2QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLFVBQVUsQ0FDbEIsMEVBQTBFO1lBQ3hFLGlFQUFpRSxDQUNwRSxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQ3ZDLE9BQU8sRUFDUCx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUNqRSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZhdGFsRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7XG4gIHR5cGUgQXR0cmlidXRlQ2hhbmdlLFxuICBBdHRyaWJ1dGVWYWxpZGF0aW9uRXJyb3IsXG4gIHZhbGlkYXRlQXR0cmlidXRlQ2hhbmdlcyxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IFdPUktGTE9XX1VTRV9TVEVQIH0gZnJvbSAnLi4vc3ltYm9scy5qcyc7XG5cbi8qKlxuICogT3B0aW9ucyBhY2NlcHRlZCBieSBgZXhwZXJpbWVudGFsX3NldEF0dHJpYnV0ZXNgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cGVyaW1lbnRhbFNldEF0dHJpYnV0ZXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBlcm1pdCBhdHRyaWJ1dGUga2V5cyB0aGF0IHN0YXJ0IHdpdGggdGhlIHJlc2VydmVkIGAkYCBwcmVmaXguXG4gICAqICoqRGVmYXVsdDogYGZhbHNlYC4qKlxuICAgKlxuICAgKiBUaGUgYCRgIG5hbWVzcGFjZSBpcyByZXNlcnZlZCBmb3IgZnJhbWV3b3JrIGFuZCBsaWJyYXJ5IGNvZGUgdGhhdFxuICAgKiBpcyBidWlsdCBvbiB0b3Agb2YgdGhlIHdvcmtmbG93IFNESyAodGVsZW1ldHJ5LCBhZ2VudCBtZXRhZGF0YSxcbiAgICogcGxhdGZvcm0tZW1pdHRlZCB0YWdzLCBldGMuKS4gVXNlciBjb2RlIE1VU1QgTk9UIHdyaXRlIGtleXMgaW5cbiAgICogdGhpcyBuYW1lc3BhY2U7IHZhbGlkYXRpb24gcmVqZWN0cyB0aGVtIHNvIGFjY2lkZW50YWwgY29sbGlzaW9uc1xuICAgKiB3aXRoIHRvb2xpbmctb3duZWQga2V5cyBjYW4ndCBzbGlwIHRocm91Z2guXG4gICAqXG4gICAqIE9ubHkgZmxpcCB0aGlzIHRvIGB0cnVlYCBpZiB5b3VyIGNhbGxlciBpcyBpdHNlbGYgYSBmcmFtZXdvcmsgb3JcbiAgICogbGlicmFyeSB0aGF0IG93bnMgYSBgJGAtcHJlZml4ZWQgc3ViLW5hbWVzcGFjZSBhbmQga25vd3MgdGhlXG4gICAqIGNvbnZlbnRpb25zIG9mIGFueSBvdGhlciB0b29scyB3cml0aW5nIGludG8gaXQuIE1pc3VzZSBjYW5cbiAgICogY29uZmxpY3Qgd2l0aCBvYnNlcnZhYmlsaXR5IHN1cmZhY2VzLCBhZ2VudCBkYXNoYm9hcmRzLCBvciBmdXR1cmVcbiAgICogcGxhdGZvcm0gZmVhdHVyZXMgdGhhdCByZWx5IG9uIHRoZSByZXNlcnZlZCBuYW1lc3BhY2UuXG4gICAqL1xuICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQXR0YWNoIHBsYWludGV4dCBzdHJpbmcga2V5L3ZhbHVlIG1ldGFkYXRhIHRvIHRoZSBjdXJyZW50IHdvcmtmbG93IHJ1bi5cbiAqXG4gKiAqKkVYUEVSSU1FTlRBTC4qKiBUaGUgYGV4cGVyaW1lbnRhbF9gIHByZWZpeCBpcyBkZWxpYmVyYXRlIOKAlCB0aGVcbiAqIHNoYXBlLCBzZW1hbnRpY3MsIGFuZCBkaXNwYXRjaCBwYXRoIGFyZSBsaWtlbHkgdG8gY2hhbmdlIGJlZm9yZSB0aGlzXG4gKiBpcyByZW5hbWVkIHRvIGEgc3RhYmxlIGV4cG9ydC4gVXNlIG9ubHkgd2hlbiB5b3UgY2FuIGFic29yYiBhXG4gKiBicmVha2luZyByZW5hbWUgbGF0ZXIuXG4gKlxuICogQ2FsbGFibGUgb25seSBmcm9tIGEgd29ya2Zsb3cgYm9keSAoYCd1c2Ugd29ya2Zsb3cnYCkuIFRoZSBjYWxsIGlzXG4gKiBkaXNwYXRjaGVkIHRocm91Z2ggdGhlIHdvcmtmbG93IHJ1bnRpbWUgYXMgYSBzdGVwLCBzbyB0aGUgbXV0YXRpb25cbiAqIGlzIHJlY29yZGVkIGluIHRoZSBldmVudCBsb2cgYW5kIHN1cnZpdmVzIHJlcGxheS5cbiAqXG4gKiBWYWxpZGF0aW9uIHJ1bnMgaW4gdGhlIFZNIChjaGVhcCwgZGV0ZXJtaW5pc3RpYykgYmVmb3JlIHRoZSBzdGVwXG4gKiBkaXNwYXRjaCDigJQgdmlvbGF0aW9ucyB0aHJvdyBgRmF0YWxFcnJvcmAgd2l0aG91dCBxdWV1aW5nIGEgc3RlcC4gQW5cbiAqIGVtcHR5IHJlY29yZCBpcyBhIG5vLW9wLiBgdmFsdWU6IHVuZGVmaW5lZGAgcmVtb3ZlcyB0aGUga2V5IGZyb20gdGhlXG4gKiBydW4ncyBhdHRyaWJ1dGUgbWFwLlxuICpcbiAqICoqUmVzZXJ2ZWQgbmFtZXNwYWNlLioqIEtleXMgc3RhcnRpbmcgd2l0aCBgJGAgYXJlIHJlc2VydmVkIGZvclxuICogZnJhbWV3b3JrL2xpYnJhcnkgY29kZSAodGVsZW1ldHJ5LCBhZ2VudCBtZXRhZGF0YSwgZXRjLikuIFVzZXIgY29kZVxuICogdHJ5aW5nIHRvIHdyaXRlIGEgYCRgLXByZWZpeGVkIGtleSB0aHJvd3MgYEZhdGFsRXJyb3JgLiBJZiB5b3UgYXJlIGFcbiAqIGZyYW1ld29yayBhdXRob3IgYW5kIG5lZWQgdG8gc2V0IGEgcmVzZXJ2ZWQga2V5LCBwYXNzXG4gKiBgeyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogdHJ1ZSB9YCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IOKAlCBzZWVcbiAqIGBFeHBlcmltZW50YWxTZXRBdHRyaWJ1dGVzT3B0aW9uc2AgZm9yIHRoZSB0cmFkZS1vZmZzLlxuICpcbiAqICoqV0FSTklORyoqOiBXaGlsZSB0aGlzIGZlYXR1cmUgaXMgZXhwZXJpbWVudGFsLCBjYWxsaW5nIGUuZy5cbiAqIGBQcm9taXNlLmFsbChbZXhwZXJpbWVudGFsX3NldEF0dHJpYnV0ZXMoeyBhOiAnMScgfSksIGV4cGVyaW1lbnRhbF9zZXRBdHRyaWJ1dGVzKHsgYTogJzInIH0pXSlgXG4gKiBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBvcmRlcmVkIGNvbnNpc3RlbnRseSwgYnV0IHRoZSBlcXVpdmFsZW50XG4gKiBzZXF1ZW50aWFsIGAudGhlbigpYCBjaGFpbiBpcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGV4cGVyaW1lbnRhbF9zZXRBdHRyaWJ1dGVzIH0gZnJvbSAnd29ya2Zsb3cnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KCkge1xuICogICAndXNlIHdvcmtmbG93JztcbiAqICAgYXdhaXQgZXhwZXJpbWVudGFsX3NldEF0dHJpYnV0ZXMoeyBwaGFzZTogJ2luaXQnIH0pO1xuICogICAvLyAuLi4gd29yayAuLi5cbiAqICAgYXdhaXQgZXhwZXJpbWVudGFsX3NldEF0dHJpYnV0ZXMoeyBwaGFzZTogJ2RvbmUnLCBvcmRlcklkOiAnb3JkXzEyMycgfSk7XG4gKiAgIGF3YWl0IGV4cGVyaW1lbnRhbF9zZXRBdHRyaWJ1dGVzKHsgb3JkZXJJZDogdW5kZWZpbmVkIH0pOyAvLyByZW1vdmVcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIEZyYW1ld29yayAvIGxpYnJhcnkgY29kZSB3cml0aW5nIGludG8gdGhlIHJlc2VydmVkIG5hbWVzcGFjZS5cbiAqIGBgYHRzXG4gKiBhd2FpdCBleHBlcmltZW50YWxfc2V0QXR0cmlidXRlcyhcbiAqICAgeyAnJGFnZW50LmtpbmQnOiAnZHVyYWJsZS1hZ2VudCcgfSxcbiAqICAgeyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogdHJ1ZSB9XG4gKiApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBlcmltZW50YWxfc2V0QXR0cmlidXRlcyhcbiAgYXR0cnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IEV4cGVyaW1lbnRhbFNldEF0dHJpYnV0ZXNPcHRpb25zID0ge31cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoYXR0cnMgPT09IG51bGwgfHwgdHlwZW9mIGF0dHJzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGF0dHJzKSkge1xuICAgIHRocm93IG5ldyBGYXRhbEVycm9yKFxuICAgICAgYGV4cGVyaW1lbnRhbF9zZXRBdHRyaWJ1dGVzIHJlcXVpcmVzIGEgcGxhaW4gb2JqZWN0LCBnb3QgJHtcbiAgICAgICAgYXR0cnMgPT09IG51bGwgPyAnbnVsbCcgOiBBcnJheS5pc0FycmF5KGF0dHJzKSA/ICdhcnJheScgOiB0eXBlb2YgYXR0cnNcbiAgICAgIH1gXG4gICAgKTtcbiAgfVxuICBjb25zdCBjaGFuZ2VzOiBBdHRyaWJ1dGVDaGFuZ2VbXSA9IE9iamVjdC5lbnRyaWVzKGF0dHJzKS5tYXAoXG4gICAgKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlOiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHZhbHVlLFxuICAgIH0pXG4gICk7XG4gIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBjb25zdCBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9IG9wdGlvbnMuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWU7XG4gIHRyeSB7XG4gICAgdmFsaWRhdGVBdHRyaWJ1dGVDaGFuZ2VzKGNoYW5nZXMsIHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBdHRyaWJ1dGVWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBGYXRhbEVycm9yKGVyci5tZXNzYWdlKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGNvbnN0IHVzZVN0ZXAgPSAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbV09SS0ZMT1dfVVNFX1NURVBdIGFzXG4gICAgfCAoKFxuICAgICAgICBzdGVwTmFtZTogc3RyaW5nXG4gICAgICApID0+IChcbiAgICAgICAgY2hhbmdlczogQXR0cmlidXRlQ2hhbmdlW10sXG4gICAgICAgIG9wdGlvbnM/OiB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbiB9XG4gICAgICApID0+IFByb21pc2U8dm9pZD4pXG4gICAgfCB1bmRlZmluZWQ7XG4gIGlmICghdXNlU3RlcCkge1xuICAgIHRocm93IG5ldyBGYXRhbEVycm9yKFxuICAgICAgJ2V4cGVyaW1lbnRhbF9zZXRBdHRyaWJ1dGVzKCkgY2FsbGVkIG91dHNpZGUgYSB3b3JrZmxvdyBydW50aW1lIGNvbnRleHQuICcgK1xuICAgICAgICAnSXQgbXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSB3b3JrZmxvdyBib2R5IChgdXNlIHdvcmtmbG93YCkuJ1xuICAgICk7XG4gIH1cbiAgYXdhaXQgdXNlU3RlcCgnX19idWlsdGluX3NldF9hdHRyaWJ1dGVzJykoXG4gICAgY2hhbmdlcyxcbiAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgfSA6IHt9XG4gICk7XG59XG4iXX0=
|
package/dist/workflow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA0GjD,wBAAsB,WAAW,CAC/B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,KAAK,EAAE,EACf,aAAa,EAAE,SAAS,GAAG,SAAS,GACnC,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,CAusB/B"}
|
package/dist/workflow.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { runInContext } from 'node:vm';
|
|
2
2
|
import { CorruptedEventLogError, ERROR_SLUGS, WorkflowNotRegisteredError, WorkflowRuntimeError, } from '@workflow/errors';
|
|
3
3
|
import { withResolvers } from '@workflow/utils';
|
|
4
|
-
import { getPortLazy } from './runtime/get-port-lazy.js';
|
|
5
4
|
import { parseWorkflowName } from '@workflow/utils/parse-name';
|
|
6
5
|
import * as nanoid from 'nanoid';
|
|
7
6
|
import { monotonicFactory } from 'ulid';
|
|
8
7
|
import { EventConsumerResult, EventsConsumer } from './events-consumer.js';
|
|
9
8
|
import { ENOTSUP, WorkflowSuspension } from './global.js';
|
|
10
9
|
import { runtimeLogger } from './logger.js';
|
|
10
|
+
import { getPortLazy } from './runtime/get-port-lazy.js';
|
|
11
11
|
import { handleSuspension } from './runtime/suspension-handler.js';
|
|
12
12
|
import { getWorld } from './runtime/world.js';
|
|
13
13
|
import { dehydrateWorkflowReturnValue, hydrateWorkflowArguments, } from './serialization.js';
|
|
@@ -17,8 +17,8 @@ import * as Attribute from './telemetry/semantic-conventions.js';
|
|
|
17
17
|
import { trace } from './telemetry.js';
|
|
18
18
|
import { getWorkflowRunStreamId } from './util.js';
|
|
19
19
|
import { createContext } from './vm/index.js';
|
|
20
|
-
import { WORKFLOW_CONTEXT_SYMBOL } from './workflow/get-workflow-metadata.js';
|
|
21
20
|
import { createAbortSignalStatics, createCreateAbortController, } from './workflow/abort-controller.js';
|
|
21
|
+
import { WORKFLOW_CONTEXT_SYMBOL } from './workflow/get-workflow-metadata.js';
|
|
22
22
|
import { createCreateHook } from './workflow/hook.js';
|
|
23
23
|
import { createSleep } from './workflow/sleep.js';
|
|
24
24
|
/**
|
|
@@ -36,6 +36,15 @@ import { createSleep } from './workflow/sleep.js';
|
|
|
36
36
|
* the abort hook is created but never resumed and the cancellation never
|
|
37
37
|
* reaches the running step.
|
|
38
38
|
*
|
|
39
|
+
* NOTE: drain only commits the `*_created` events; it does NOT enqueue step
|
|
40
|
+
* bodies for execution. The platform's step worker rejects `step_started`
|
|
41
|
+
* for runs that have already transitioned to terminal (`RunExpiredError`),
|
|
42
|
+
* so a step queued here would be skipped anyway. Fire-and-forget step calls
|
|
43
|
+
* with side effects therefore work only when followed by some later `await`
|
|
44
|
+
* on a runtime primitive that triggers a real suspension (the normal
|
|
45
|
+
* runtime loop in `runtime.ts` queues the step there). A `void` placed
|
|
46
|
+
* immediately before `return` is not reliably executed.
|
|
47
|
+
*
|
|
39
48
|
* Drain failures are swallowed: the workflow's own outcome (the user's return
|
|
40
49
|
* value or thrown error) is the source of truth; secondary cleanup that fails
|
|
41
50
|
* shouldn't change the run's terminal state.
|
|
@@ -652,4 +661,4 @@ export async function runWorkflow(workflowCode, workflowRun, events, encryptionK
|
|
|
652
661
|
}
|
|
653
662
|
});
|
|
654
663
|
}
|
|
655
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN2QyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLFdBQVcsRUFDWCwwQkFBMEIsRUFDMUIsb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUvRCxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFeEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFOUMsT0FBTyxFQUNMLDRCQUE0QixFQUM1Qix3QkFBd0IsR0FDekIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixzQkFBc0IsRUFDdEIsY0FBYyxFQUNkLGlCQUFpQixHQUNsQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEtBQUssU0FBUyxN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UUFBUSxDQUNULENBQUM7WUFFRixNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBydW5JbkNvbnRleHQgfSBmcm9tICdub2RlOnZtJztcbmltcG9ydCB7XG4gIENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IsXG4gIEVSUk9SX1NMVUdTLFxuICBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgd2l0aFJlc29sdmVycyB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBnZXRQb3J0TGF6eSB9IGZyb20gJy4vcnVudGltZS9nZXQtcG9ydC1sYXp5LmpzJztcbmltcG9ydCB7IHBhcnNlV29ya2Zsb3dOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHR5cGUgeyBFdmVudCwgV29ya2Zsb3dSdW4gfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0ICogYXMgbmFub2lkIGZyb20gJ25hbm9pZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgdHlwZSB7IENyeXB0b0tleSB9IGZyb20gJy4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBFdmVudENvbnN1bWVyUmVzdWx0LCBFdmVudHNDb25zdW1lciB9IGZyb20gJy4vZXZlbnRzLWNvbnN1bWVyLmpzJztcbmltcG9ydCB0eXBlIHsgUXVldWVJdGVtIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgRU5PVFNVUCwgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGhhbmRsZVN1c3BlbnNpb24gfSBmcm9tICcuL3J1bnRpbWUvc3VzcGVuc2lvbi1oYW5kbGVyLmpzJztcbmltcG9ydCB7IGdldFdvcmxkIH0gZnJvbSAnLi9ydW50aW1lL3dvcmxkLmpzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0IH0gZnJvbSAnLi9wcml2YXRlLmpzJztcbmltcG9ydCB7XG4gIGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUsXG4gIGh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZVVzZVN0ZXAgfSBmcm9tICcuL3N0ZXAuanMnO1xuaW1wb3J0IHtcbiAgQk9EWV9JTklUX1NZTUJPTCxcbiAgU1RBQkxFX1VMSUQsXG4gIFdPUktGTE9XX0NSRUFURV9IT09LLFxuICBXT1JLRkxPV19HRVRfU1RSRUFNX0lELFxuICBXT1JLRkxPV19TTEVFUCxcbiAgV09SS0ZMT1dfVVNFX1NURVAsXG59IGZyb20gJy4vc3ltYm9scy5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgdHJhY2UgfSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1J1blN0cmVhbUlkIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuL3ZtL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dNZXRhZGF0YSB9IGZyb20gJy4vd29ya2Zsb3cvZ2V0LXdvcmtmbG93LW1ldGFkYXRhLmpzJztcbmltcG9ydCB7IFdPUktGTE9XX0NPTlRFWFRfU1lNQk9MIH0gZnJvbSAnLi93b3JrZmxvdy9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlQWJvcnRTaWduYWxTdGF0aWNzLFxuICBjcmVhdGVDcmVhdGVBYm9ydENvbnRyb2xsZXIsXG59IGZyb20gJy4vd29ya2Zsb3cvYWJvcnQtY29udHJvbGxlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVDcmVhdGVIb29rIH0gZnJvbSAnLi93b3JrZmxvdy9ob29rLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNsZWVwIH0gZnJvbSAnLi93b3JrZmxvdy9zbGVlcC5qcyc7XG5cbi8qKlxuICogRHJhaW4gcGVuZGluZyBxdWV1ZSBpdGVtcyBhdCB3b3JrZmxvdyBjb21wbGV0aW9uIChzdWNjZXNzIG9yIGZhaWx1cmUpLlxuICpcbiAqIFRyZWF0cyBlbmQtb2YtcnVuIGxpa2UgYSBmaW5hbCBzdXNwZW5zaW9uOiBhbnkgb3BlcmF0aW9uIHRoZSB3b3JrZmxvdyBjb2RlXG4gKiBzcGF3bmVkIGJ1dCBkaWRuJ3QgYGF3YWl0YCDigJQgYWJvcnQgaG9vayByZXN1bWVzLCBob29rIGNyZWF0aW9ucy9kaXNwb3NhbHMsXG4gKiBzbGVlcCB3YWl0cywgc3RlcCBxdWV1ZWluZ3Mg4oCUIGdldHMgY29tbWl0dGVkIHRvIHRoZSBldmVudCBsb2cgdmlhIHRoZVxuICogc3VzcGVuc2lvbiBoYW5kbGVyIGJlZm9yZSB0aGUgcnVuIGlzIG1hcmtlZCB0ZXJtaW5hbC5cbiAqXG4gKiBUaGlzIG1hdGNoZXMgbm9ybWFsIEpTIHNlbWFudGljcyB3aGVyZSBgc2V0VGltZW91dChmbiwgLi4uKWAgZXRjLiBjb250aW51ZVxuICogcnVubmluZyBhZnRlciB0aGUgc3Vycm91bmRpbmcgZnVuY3Rpb24gcmV0dXJucy4gTW9zdCBpbXBvcnRhbnRseSwgaXQgZW5zdXJlc1xuICogYGNvbnRyb2xsZXIuYWJvcnQoKWAgY2FsbGVkIGFzIHRoZSBsYXN0IHN0YXRlbWVudCBvZiBhIHdvcmtmbG93IGFjdHVhbGx5XG4gKiBwcm9wYWdhdGVzIHRvIGluLWZsaWdodCBzdGVwcyBvbiBvdGhlciBjb21wdXRlIGluc3RhbmNlcyDigJQgd2l0aG91dCB0aGlzLFxuICogdGhlIGFib3J0IGhvb2sgaXMgY3JlYXRlZCBidXQgbmV2ZXIgcmVzdW1lZCBhbmQgdGhlIGNhbmNlbGxhdGlvbiBuZXZlclxuICogcmVhY2hlcyB0aGUgcnVubmluZyBzdGVwLlxuICpcbiAqIERyYWluIGZhaWx1cmVzIGFyZSBzd2FsbG93ZWQ6IHRoZSB3b3JrZmxvdydzIG93biBvdXRjb21lICh0aGUgdXNlcidzIHJldHVyblxuICogdmFsdWUgb3IgdGhyb3duIGVycm9yKSBpcyB0aGUgc291cmNlIG9mIHRydXRoOyBzZWNvbmRhcnkgY2xlYW51cCB0aGF0IGZhaWxzXG4gKiBzaG91bGRuJ3QgY2hhbmdlIHRoZSBydW4ncyB0ZXJtaW5hbCBzdGF0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZHJhaW5QZW5kaW5nUXVldWVJdGVtcyhcbiAgcnVuSWQ6IHN0cmluZyxcbiAgcGVuZGluZ1F1ZXVlOiBNYXA8c3RyaW5nLCBRdWV1ZUl0ZW0+LFxuICB2bUdsb2JhbFRoaXM6IHR5cGVvZiBnbG9iYWxUaGlzLFxuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4sXG4gIG91dGNvbWU6ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCdcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAocGVuZGluZ1F1ZXVlLnNpemUgPT09IDApIHJldHVybjtcbiAgLy8gSW1wbGljaXRseSBkaXNwb3NlIGFueSBhYm9ydCBob29rcyAoc3lzdGVtIGhvb2tzKSB0aGF0IGFyZSBzdGlsbCBhbGl2ZSBhdFxuICAvLyB3b3JrZmxvdyBjb21wbGV0aW9uIHNvIHRoZXkgZG9uJ3QgbGVhayByb3dzIGluIHRoZSBob29rcyB0YWJsZSBmb3IgdGhlXG4gIC8vIHJ1bidzIGxpZmV0aW1lLiBTa2lwIGhvb2tzIHRoYXQgYWxyZWFkeSBoYXZlIGFuIGFib3J0IGluIGZsaWdodCDigJQgdGhvc2VcbiAgLy8gd2lsbCBlbWl0IGhvb2tfcmVjZWl2ZWQgdmlhIHRoZSBhYm9ydCBwcm9jZXNzaW5nIHBhdGguIFVzZXIgaG9va3NcbiAgLy8gKGlzU3lzdGVtICE9PSB0cnVlKSBhcmUgaW50ZW50aW9uYWxseSBsZWZ0IGFsb25lOiB0aGVpciBsaWZldGltZSBpc1xuICAvLyBtYW5hZ2VkIGJ5IHRoZSB1c2VyJ3MgY29kZSwgbm90IHRoZSBydW50aW1lLlxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGVuZGluZ1F1ZXVlLnZhbHVlcygpKSB7XG4gICAgaWYgKFxuICAgICAgaXRlbS50eXBlID09PSAnaG9vaycgJiZcbiAgICAgIGl0ZW0uaXNTeXN0ZW0gJiZcbiAgICAgICFpdGVtLmRpc3Bvc2VkICYmXG4gICAgICAhaXRlbS5hYm9ydFJlcXVlc3RlZFxuICAgICkge1xuICAgICAgaXRlbS5kaXNwb3NlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICAgIGNvbnN0IHN5bnRoZXNpemVkID0gbmV3IFdvcmtmbG93U3VzcGVuc2lvbihwZW5kaW5nUXVldWUsIHZtR2xvYmFsVGhpcyk7XG4gICAgYXdhaXQgaGFuZGxlU3VzcGVuc2lvbih7XG4gICAgICBzdXNwZW5zaW9uOiBzeW50aGVzaXplZCxcbiAgICAgIHdvcmxkLFxuICAgICAgcnVuOiB3b3JrZmxvd1J1bixcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgYEZhaWxlZCB0byBkcmFpbiBwZW5kaW5nIHF1ZXVlIGl0ZW1zIGZvciAke291dGNvbWV9IHdvcmtmbG93IHJ1bmAsXG4gICAgICB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICBtZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV29ya2Zsb3coXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nLFxuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4sXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgZW5jcnlwdGlvbktleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIHJldHVybiB0cmFjZShgd29ya2Zsb3cucnVuICR7d29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lfWAsIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZCh3b3JrZmxvd1J1bi5ydW5JZCksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMod29ya2Zsb3dSdW4uc3RhdHVzKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0V2ZW50c0NvdW50KGV2ZW50cy5sZW5ndGgpLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gd29ya2Zsb3dSdW4uc3RhcnRlZEF0O1xuICAgIGlmICghc3RhcnRlZEF0KSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGBXb3JrZmxvdyBydW4gXCIke3dvcmtmbG93UnVuLnJ1bklkfVwiIGhhcyBubyBcInN0YXJ0ZWRBdFwiIHRpbWVzdGFtcCAoc2hvdWxkIG5vdCBoYXBwZW4pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHBvcnQgYmVmb3JlIGNyZWF0aW5nIFZNIGNvbnRleHQgdG8gYXZvaWQgYXN5bmMgb3BlcmF0aW9uc1xuICAgIC8vIGFmZmVjdGluZyB0aGUgZGV0ZXJtaW5pc3RpYyB0aW1lc3RhbXBcbiAgICBjb25zdCBpc1ZlcmNlbCA9IHByb2Nlc3MuZW52LlZFUkNFTF9VUkwgIT09IHVuZGVmaW5lZDtcbiAgICAvLyBMb2FkIGdldFBvcnQgbGF6aWx5IHRvIHByZXZlbnQgVHVyYm9wYWNrIGZyb20gdHJhY2luZyBnZXQtcG9ydCdzXG4gICAgLy8gZnMgb3BzIChyZWFkZGlyLCByZWFkRmlsZSkgaW50byB0aGUgZmxvdyByb3V0ZSBidW5kbGUuXG4gICAgLy8gVXNlcyBnbG9iYWxUaGlzLl9fd2tmX2dldFBvcnQgYXMgYSBsYXp5LWluaXRpYWxpemVkIGNhY2hlIHRvIGF2b2lkXG4gICAgLy8gYnVuZGxlciBzdGF0aWMgYW5hbHlzaXMgd2hpbGUgc3RheWluZyBjb21wYXRpYmxlIHdpdGggQ0pTL0VTTS9WTS5cbiAgICBjb25zdCBwb3J0ID0gaXNWZXJjZWwgPyB1bmRlZmluZWQgOiBhd2FpdCBnZXRQb3J0TGF6eSgpO1xuXG4gICAgY29uc3Qge1xuICAgICAgY29udGV4dCxcbiAgICAgIGdsb2JhbFRoaXM6IHZtR2xvYmFsVGhpcyxcbiAgICAgIHVwZGF0ZVRpbWVzdGFtcCxcbiAgICB9ID0gY3JlYXRlQ29udGV4dCh7XG4gICAgICBzZWVkOiBgJHt3b3JrZmxvd1J1bi5ydW5JZH06JHt3b3JrZmxvd1J1bi53b3JrZmxvd05hbWV9OiR7K3N0YXJ0ZWRBdH1gLFxuICAgICAgZml4ZWRUaW1lc3RhbXA6ICtzdGFydGVkQXQsXG4gICAgfSk7XG5cbiAgICBjb25zdCB3b3JrZmxvd0Rpc2NvbnRpbnVhdGlvbiA9IHdpdGhSZXNvbHZlcnM8dm9pZD4oKTtcblxuICAgIGNvbnN0IHVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCgpID0+IHZtR2xvYmFsVGhpcy5NYXRoLnJhbmRvbSgpKTtcbiAgICBjb25zdCBnZW5lcmF0ZU5hbm9pZCA9IG5hbm9pZC5jdXN0b21SYW5kb20obmFub2lkLnVybEFscGhhYmV0LCAyMSwgKHNpemUpID0+XG4gICAgICBuZXcgVWludDhBcnJheShzaXplKS5tYXAoKCkgPT4gMjU2ICogdm1HbG9iYWxUaGlzLk1hdGgucmFuZG9tKCkpXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBhIG11dGFibGUgaG9sZGVyIGZvciB0aGUgcHJvbWlzZSBxdWV1ZSBzbyB0aGUgRXZlbnRzQ29uc3VtZXJcbiAgICAvLyBjYW4gYWNjZXNzIHRoZSBjdXJyZW50IHF1ZXVlIHN0YXRlIHZpYSBhIGdldHRlci4gVGhlIHF1ZXVlIGlzIG11dGF0ZWRcbiAgICAvLyBieSBzdGVwL2hvb2svc2xlZXAgY2FsbGJhY2tzIGFzIGV2ZW50cyBhcmUgcHJvY2Vzc2VkLlxuICAgIGNvbnN0IHByb21pc2VRdWV1ZUhvbGRlciA9IHsgY3VycmVudDogUHJvbWlzZS5yZXNvbHZlKCkgfTtcblxuICAgIGNvbnN0IGV2ZW50c0NvbnN1bWVyID0gbmV3IEV2ZW50c0NvbnN1bWVyKGV2ZW50cywge1xuICAgICAgb25VbmNvbnN1bWVkRXZlbnQ6IChldmVudCkgPT4ge1xuICAgICAgICB3b3JrZmxvd0Rpc2NvbnRpbnVhdGlvbi5yZWplY3QoXG4gICAgICAgICAgbmV3IENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IoXG4gICAgICAgICAgICBgVW5jb25zdW1lZCBldmVudCBpbiBldmVudCBsb2c6IGV2ZW50VHlwZT0ke2V2ZW50LmV2ZW50VHlwZX0sIGNvcnJlbGF0aW9uSWQ9JHtldmVudC5jb3JyZWxhdGlvbklkfSwgZXZlbnRJZD0ke2V2ZW50LmV2ZW50SWR9LiBUaGlzIGluZGljYXRlcyBhIGNvcnJ1cHRlZCBvciBpbnZhbGlkIGV2ZW50IGxvZy5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGdldFByb21pc2VRdWV1ZTogKCkgPT4gcHJvbWlzZVF1ZXVlSG9sZGVyLmN1cnJlbnQsXG4gICAgfSk7XG5cbiAgICBjb25zdCB3b3JrZmxvd0NvbnRleHQ6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCA9IHtcbiAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICBnbG9iYWxUaGlzOiB2bUdsb2JhbFRoaXMsXG4gICAgICBvbldvcmtmbG93RXJyb3I6IHdvcmtmbG93RGlzY29udGludWF0aW9uLnJlamVjdCxcbiAgICAgIGV2ZW50c0NvbnN1bWVyLFxuICAgICAgZ2VuZXJhdGVVbGlkOiAoKSA9PiB1bGlkKCtzdGFydGVkQXQpLFxuICAgICAgZ2VuZXJhdGVOYW5vaWQsXG4gICAgICBpbnZvY2F0aW9uc1F1ZXVlOiBuZXcgTWFwKCksXG4gICAgICAvLyBVc2UgZ2V0dGVyL3NldHRlciBzbyB0aGUgRXZlbnRzQ29uc3VtZXIncyBnZXRQcm9taXNlUXVldWUoKSBhbHdheXNcbiAgICAgIC8vIHNlZXMgdGhlIGxhdGVzdCBxdWV1ZSBzdGF0ZSBhcyBpdCdzIG11dGF0ZWQgYnkgc3RlcC9ob29rL3NsZWVwIGNhbGxiYWNrcy5cbiAgICAgIGdldCBwcm9taXNlUXVldWUoKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUXVldWVIb2xkZXIuY3VycmVudDtcbiAgICAgIH0sXG4gICAgICBzZXQgcHJvbWlzZVF1ZXVlKHZhbHVlOiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgICAgIHByb21pc2VRdWV1ZUhvbGRlci5jdXJyZW50ID0gdmFsdWU7XG4gICAgICB9LFxuICAgICAgcGVuZGluZ0RlbGl2ZXJpZXM6IDAsXG4gICAgfTtcblxuICAgIC8vIFN1YnNjcmliZSB0byB0aGUgZXZlbnRzIGxvZyB0byB1cGRhdGUgdGhlIHRpbWVzdGFtcCBpbiB0aGUgdm0gY29udGV4dFxuICAgIHdvcmtmbG93Q29udGV4dC5ldmVudHNDb25zdW1lci5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBjcmVhdGVkQXQgPSBldmVudD8uY3JlYXRlZEF0O1xuICAgICAgaWYgKGNyZWF0ZWRBdCkge1xuICAgICAgICB1cGRhdGVUaW1lc3RhbXAoK2NyZWF0ZWRBdCk7XG4gICAgICB9XG4gICAgICAvLyBOZXZlciBjb25zdW1lIGV2ZW50cyAtIHRoaXMgaXMgb25seSBhIHBhc3NpdmUgc3Vic2NyaWJlclxuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgfSk7XG5cbiAgICAvLyBDb25zdW1lIHJ1biBsaWZlY3ljbGUgZXZlbnRzIC0gdGhlc2UgYXJlIHN0cnVjdHVyYWwgZXZlbnRzIHRoYXQgZG9uJ3RcbiAgICAvLyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgaW4gdGhlIHdvcmtmbG93LCBidXQgbXVzdCBiZSBjb25zdW1lZCB0byBhZHZhbmNlXG4gICAgLy8gcGFzdCB0aGVtIGluIHRoZSBldmVudCBsb2dcbiAgICB3b3JrZmxvd0NvbnRleHQuZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgLy8gQ29uc3VtZSBydW5fY3JlYXRlZCAtIGV2ZXJ5IHJ1biBoYXMgZXhhY3RseSBvbmVcbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcpIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnN1bWUgcnVuX3N0YXJ0ZWQgLSBldmVyeSBydW4gaGFzIGV4YWN0bHkgb25lXG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnKSB7XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICB9KTtcblxuICAgIGNvbnN0IHVzZVN0ZXAgPSBjcmVhdGVVc2VTdGVwKHdvcmtmbG93Q29udGV4dCk7XG4gICAgY29uc3QgY3JlYXRlSG9vayA9IGNyZWF0ZUNyZWF0ZUhvb2sod29ya2Zsb3dDb250ZXh0KTtcbiAgICBjb25zdCBzbGVlcCA9IGNyZWF0ZVNsZWVwKHdvcmtmbG93Q29udGV4dCk7XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfVVNFX1NURVBdID0gdXNlU3RlcDtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfQ1JFQVRFX0hPT0tdID0gY3JlYXRlSG9vaztcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfU0xFRVBdID0gc2xlZXA7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gICAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX0dFVF9TVFJFQU1fSURdID0gKG5hbWVzcGFjZT86IHN0cmluZykgPT5cbiAgICAgIGdldFdvcmtmbG93UnVuU3RyZWFtSWQod29ya2Zsb3dSdW4ucnVuSWQsIG5hbWVzcGFjZSk7XG5cbiAgICAvLyBUT0RPOiB0aGVyZSBzaG91bGQgYmUgYSBnZXRVcmwgbWV0aG9kIG9uIHRoZSB3b3JsZCBpbnRlcmZhY2UgaXRzZWxmLiBUaGlzXG4gICAgLy8gc29sdXRpb24gb25seSB3b3JrcyBmb3IgdmVyY2VsICsgbG9jYWwgd29ybGRzLlxuICAgIGNvbnN0IHVybCA9IGlzVmVyY2VsXG4gICAgICA/IGBodHRwczovLyR7cHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTH1gXG4gICAgICA6IGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydCA/PyAzMDAwfWA7XG5cbiAgICAvLyBGb3IgdGhlIHdvcmtmbG93IFZNLCB3ZSBzdG9yZSB0aGUgY29udGV4dCBpbiBhIHN5bWJvbCBvbiB0aGUgYGdsb2JhbFRoaXNgIG9iamVjdFxuICAgIGNvbnN0IGN0eDogV29ya2Zsb3dNZXRhZGF0YSA9IHtcbiAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgd29ya2Zsb3dSdW5JZDogd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICB3b3JrZmxvd1N0YXJ0ZWRBdDogbmV3IHZtR2xvYmFsVGhpcy5EYXRlKCtzdGFydGVkQXQpLFxuICAgICAgdXJsLFxuICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gICAgfTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICAgIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19DT05URVhUX1NZTUJPTF0gPSBjdHg7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gICAgdm1HbG9iYWxUaGlzW1NUQUJMRV9VTElEXSA9IHVsaWQ7XG5cbiAgICAvLyBOT1RFOiBXaWxsIGhhdmUgYSBjb25maWcgb3ZlcnJpZGUgdG8gdXNlIHRoZSBjdXN0b20gZmV0Y2ggc3RlcC5cbiAgICAvLyAgICAgICBGb3Igbm93IGBmZXRjaGAgbXVzdCBiZSBleHBsaWNpdGx5IGltcG9ydGVkIGZyb20gYHdvcmtmbG93YC5cbiAgICB2bUdsb2JhbFRoaXMuZmV0Y2ggPSAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgdm1HbG9iYWxUaGlzLkVycm9yKFxuICAgICAgICBgR2xvYmFsIFwiZmV0Y2hcIiBpcyB1bmF2YWlsYWJsZSBpbiB3b3JrZmxvdyBmdW5jdGlvbnMuIFVzZSB0aGUgXCJmZXRjaFwiIHN0ZXAgZnVuY3Rpb24gZnJvbSBcIndvcmtmbG93XCIgdG8gbWFrZSBIVFRQIHJlcXVlc3RzLlxcblxcbkxlYXJuIG1vcmU6IGh0dHBzOi8vd29ya2Zsb3ctc2RrLmRldi9lcnIvJHtFUlJPUl9TTFVHUy5GRVRDSF9JTl9XT1JLRkxPV19GVU5DVElPTn1gXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBPdmVycmlkZSB0aW1lb3V0L2ludGVydmFsIGZ1bmN0aW9ucyB0byB0aHJvdyBoZWxwZnVsIGVycm9yc1xuICAgIC8vIFRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkIGluIHdvcmtmbG93IGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgcmVseSBvblxuICAgIC8vIGFzeW5jaHJvbm91cyBzY2hlZHVsaW5nIHdoaWNoIGJyZWFrcyBkZXRlcm1pbmlzdGljIHJlcGxheVxuICAgIGNvbnN0IHRpbWVvdXRFcnJvck1lc3NhZ2UgPVxuICAgICAgJ1RpbWVvdXQgZnVuY3Rpb25zIGxpa2UgXCJzZXRUaW1lb3V0XCIgYW5kIFwic2V0SW50ZXJ2YWxcIiBhcmUgbm90IHN1cHBvcnRlZCBpbiB3b3JrZmxvdyBmdW5jdGlvbnMuIFVzZSB0aGUgXCJzbGVlcFwiIGZ1bmN0aW9uIGZyb20gXCJ3b3JrZmxvd1wiIGZvciB0aW1lLWJhc2VkIGRlbGF5cy4nO1xuXG4gICAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLnNldFRpbWVvdXQgPSAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLnNldEludGVydmFsID0gKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIHtcbiAgICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgICB9KTtcbiAgICB9O1xuICAgICh2bUdsb2JhbFRoaXMgYXMgYW55KS5jbGVhclRpbWVvdXQgPSAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLmNsZWFySW50ZXJ2YWwgPSAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLnNldEltbWVkaWF0ZSA9ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICAodm1HbG9iYWxUaGlzIGFzIGFueSkuY2xlYXJJbW1lZGlhdGUgPSAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBgQWJvcnRDb250cm9sbGVyYCBhbmQgYEFib3J0U2lnbmFsYCBpbiB0aGUgd29ya2Zsb3cgVk0gYXJlIGhvb2stYmFja2VkXG4gICAgLy8gZm9yIGRldGVybWluaXN0aWMgcmVwbGF5LiBUaGUgY29udHJvbGxlcidzIGFib3J0KCkgcXVldWVzIGEgaG9vayByZXN1bXB0aW9uLFxuICAgIC8vIGFuZCBzaWduYWwuYWJvcnRlZCBpcyB1cGRhdGVkIHdoZW4gdGhlIGhvb2sgZXZlbnQgaXMgcHJvY2Vzc2VkIGR1cmluZyByZXBsYXkuXG4gICAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLkFib3J0Q29udHJvbGxlciA9XG4gICAgICBjcmVhdGVDcmVhdGVBYm9ydENvbnRyb2xsZXIod29ya2Zsb3dDb250ZXh0KTtcbiAgICBjb25zdCBhYm9ydFNpZ25hbFN0YXRpY3MgPSBjcmVhdGVBYm9ydFNpZ25hbFN0YXRpY3MoKTtcbiAgICAodm1HbG9iYWxUaGlzIGFzIGFueSkuQWJvcnRTaWduYWwgPSB7XG4gICAgICBhYm9ydDogYWJvcnRTaWduYWxTdGF0aWNzLmFib3J0LFxuICAgICAgYW55OiBhYm9ydFNpZ25hbFN0YXRpY3MuYW55LFxuICAgICAgdGltZW91dDogYWJvcnRTaWduYWxTdGF0aWNzLnRpbWVvdXQsXG4gICAgfTtcblxuICAgIC8vIGBSZXF1ZXN0YCBhbmQgYFJlc3BvbnNlYCBhcmUgc3BlY2lhbCBidWlsdC1pbiBjbGFzc2VzIHRoYXQgaW52b2tlIHN0ZXBzXG4gICAgLy8gZm9yIHRoZSBganNvbigpYCwgYHRleHQoKWAgYW5kIGBhcnJheUJ1ZmZlcigpYCBpbnN0YW5jZSBtZXRob2RzXG4gICAgY2xhc3MgUmVxdWVzdCBpbXBsZW1lbnRzIGdsb2JhbFRoaXMuUmVxdWVzdCB7XG4gICAgICBjYWNoZSE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnY2FjaGUnXTtcbiAgICAgIGNyZWRlbnRpYWxzITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydjcmVkZW50aWFscyddO1xuICAgICAgZGVzdGluYXRpb24hOiBnbG9iYWxUaGlzLlJlcXVlc3RbJ2Rlc3RpbmF0aW9uJ107XG4gICAgICBoZWFkZXJzITogSGVhZGVycztcbiAgICAgIGludGVncml0eSE6IHN0cmluZztcbiAgICAgIG1ldGhvZCE6IHN0cmluZztcbiAgICAgIG1vZGUhOiBnbG9iYWxUaGlzLlJlcXVlc3RbJ21vZGUnXTtcbiAgICAgIHJlZGlyZWN0ITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydyZWRpcmVjdCddO1xuICAgICAgcmVmZXJyZXIhOiBzdHJpbmc7XG4gICAgICByZWZlcnJlclBvbGljeSE6IGdsb2JhbFRoaXMuUmVxdWVzdFsncmVmZXJyZXJQb2xpY3knXTtcbiAgICAgIHVybCE6IHN0cmluZztcbiAgICAgIGtlZXBhbGl2ZSE6IGJvb2xlYW47XG4gICAgICBzaWduYWwhOiBBYm9ydFNpZ25hbDtcbiAgICAgIGR1cGxleCE6ICdoYWxmJztcbiAgICAgIGJvZHkhOiBSZWFkYWJsZVN0cmVhbTxhbnk+IHwgbnVsbDtcblxuICAgICAgY29uc3RydWN0b3IoaW5wdXQ6IGFueSwgaW5pdD86IFJlcXVlc3RJbml0KSB7XG4gICAgICAgIC8vIEhhbmRsZSBVUkwgaW5wdXRcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiB2bUdsb2JhbFRoaXMuVVJMKSB7XG4gICAgICAgICAgY29uc3QgdXJsU3RyaW5nID0gU3RyaW5nKGlucHV0KTtcbiAgICAgICAgICAvLyBWYWxpZGF0ZSBVUkwgZm9ybWF0XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ldyB2bUdsb2JhbFRoaXMuVVJMKHVybFN0cmluZyk7XG4gICAgICAgICAgICB0aGlzLnVybCA9IHVybFN0cmluZztcbiAgICAgICAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIHBhcnNlIFVSTCBmcm9tICR7dXJsU3RyaW5nfWAsIHtcbiAgICAgICAgICAgICAgY2F1c2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSW5wdXQgaXMgYSBSZXF1ZXN0IG9iamVjdCAtIGNsb25lIGl0cyBwcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy51cmwgPSBpbnB1dC51cmw7XG4gICAgICAgICAgaWYgKCFpbml0KSB7XG4gICAgICAgICAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZDtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbnB1dC5oZWFkZXJzKTtcbiAgICAgICAgICAgIHRoaXMuYm9keSA9IGlucHV0LmJvZHk7XG4gICAgICAgICAgICB0aGlzLm1vZGUgPSBpbnB1dC5tb2RlO1xuICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgdGhpcy5jYWNoZSA9IGlucHV0LmNhY2hlO1xuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdCA9IGlucHV0LnJlZGlyZWN0O1xuICAgICAgICAgICAgdGhpcy5yZWZlcnJlciA9IGlucHV0LnJlZmVycmVyO1xuICAgICAgICAgICAgdGhpcy5yZWZlcnJlclBvbGljeSA9IGlucHV0LnJlZmVycmVyUG9saWN5O1xuICAgICAgICAgICAgdGhpcy5pbnRlZ3JpdHkgPSBpbnB1dC5pbnRlZ3JpdHk7XG4gICAgICAgICAgICB0aGlzLmtlZXBhbGl2ZSA9IGlucHV0LmtlZXBhbGl2ZTtcbiAgICAgICAgICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsO1xuICAgICAgICAgICAgdGhpcy5kdXBsZXggPSBpbnB1dC5kdXBsZXg7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gaW5wdXQuZGVzdGluYXRpb247XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIElmIGluaXQgaXMgcHJvdmlkZWQsIG1lcmdlOiB1c2Ugc291cmNlIHByb3BlcnRpZXMsIHRoZW4gb3ZlcnJpZGUgd2l0aCBpbml0XG4gICAgICAgICAgLy8gQ29weSBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2UgUmVxdWVzdCBmaXJzdFxuICAgICAgICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kO1xuICAgICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbnB1dC5oZWFkZXJzKTtcbiAgICAgICAgICB0aGlzLmJvZHkgPSBpbnB1dC5ib2R5O1xuICAgICAgICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGU7XG4gICAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzO1xuICAgICAgICAgIHRoaXMuY2FjaGUgPSBpbnB1dC5jYWNoZTtcbiAgICAgICAgICB0aGlzLnJlZGlyZWN0ID0gaW5wdXQucmVkaXJlY3Q7XG4gICAgICAgICAgdGhpcy5yZWZlcnJlciA9IGlucHV0LnJlZmVycmVyO1xuICAgICAgICAgIHRoaXMucmVmZXJyZXJQb2xpY3kgPSBpbnB1dC5yZWZlcnJlclBvbGljeTtcbiAgICAgICAgICB0aGlzLmludGVncml0eSA9IGlucHV0LmludGVncml0eTtcbiAgICAgICAgICB0aGlzLmtlZXBhbGl2ZSA9IGlucHV0LmtlZXBhbGl2ZTtcbiAgICAgICAgICB0aGlzLnNpZ25hbCA9IGlucHV0LnNpZ25hbDtcbiAgICAgICAgICB0aGlzLmR1cGxleCA9IGlucHV0LmR1cGxleDtcbiAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gaW5wdXQuZGVzdGluYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdmVycmlkZSB3aXRoIGluaXQgb3B0aW9ucyBpZiBwcm92aWRlZFxuICAgICAgICAvLyBTZXQgbWV0aG9kXG4gICAgICAgIGlmIChpbml0Py5tZXRob2QpIHtcbiAgICAgICAgICB0aGlzLm1ldGhvZCA9IGluaXQubWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMubWV0aG9kICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGRlZmF1bHQgZm9yIHN0cmluZyBpbnB1dCBjYXNlXG4gICAgICAgICAgdGhpcy5tZXRob2QgPSAnR0VUJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBoZWFkZXJzXG4gICAgICAgIGlmIChpbml0Py5oZWFkZXJzKSB7XG4gICAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGluaXQuaGVhZGVycyk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIGlucHV0IGluc3RhbmNlb2Ygdm1HbG9iYWxUaGlzLlVSTFxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBGb3Igc3RyaW5nL1VSTCBpbnB1dCwgY3JlYXRlIGVtcHR5IGhlYWRlcnNcbiAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBvdGhlciBwcm9wZXJ0aWVzIHdpdGggaW5pdCB2YWx1ZXMgb3IgZGVmYXVsdHNcbiAgICAgICAgaWYgKGluaXQ/Lm1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubW9kZSA9IGluaXQubW9kZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5tb2RlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMubW9kZSA9ICdjb3JzJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbml0Py5jcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGluaXQuY3JlZGVudGlhbHM7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuY3JlZGVudGlhbHMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9ICdzYW1lLW9yaWdpbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBgYW55YCBjYXN0IGhlcmUgYmVjYXVzZSBAdHlwZXMvbm9kZSB2MjIgZG9lcyBub3QgeWV0IGhhdmUgYGNhY2hlYFxuICAgICAgICBpZiAoKGluaXQgYXMgYW55KT8uY2FjaGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuY2FjaGUgPSAoaW5pdCBhcyBhbnkpLmNhY2hlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmNhY2hlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMuY2FjaGUgPSAnZGVmYXVsdCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5pdD8ucmVkaXJlY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMucmVkaXJlY3QgPSBpbml0LnJlZGlyZWN0O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJlZGlyZWN0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMucmVkaXJlY3QgPSAnZm9sbG93JztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbml0Py5yZWZlcnJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5yZWZlcnJlciA9IGluaXQucmVmZXJyZXI7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMucmVmZXJyZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy5yZWZlcnJlciA9ICdhYm91dDpjbGllbnQnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluaXQ/LnJlZmVycmVyUG9saWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnJlZmVycmVyUG9saWN5ID0gaW5pdC5yZWZlcnJlclBvbGljeTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5yZWZlcnJlclBvbGljeSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLnJlZmVycmVyUG9saWN5ID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5pdD8uaW50ZWdyaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmludGVncml0eSA9IGluaXQuaW50ZWdyaXR5O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmludGVncml0eSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLmludGVncml0eSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluaXQ/LmtlZXBhbGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5rZWVwYWxpdmUgPSBpbml0LmtlZXBhbGl2ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5rZWVwYWxpdmUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRoaXMua2VlcGFsaXZlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5pdD8uc2lnbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gQWJvcnRTaWduYWwgc3R1YlxuICAgICAgICAgIHRoaXMuc2lnbmFsID0gaW5pdC5zaWduYWw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2lnbmFsKSB7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIEFib3J0U2lnbmFsIHN0dWJcbiAgICAgICAgICB0aGlzLnNpZ25hbCA9IHsgYWJvcnRlZDogZmFsc2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5kdXBsZXgpIHtcbiAgICAgICAgICB0aGlzLmR1cGxleCA9ICdoYWxmJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5kZXN0aW5hdGlvbikge1xuICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSAnZG9jdW1lbnQnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm9keSA9IGluaXQ/LmJvZHk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCBHRVQvSEVBRCBtZXRob2RzIGRvbid0IGhhdmUgYSBib2R5XG4gICAgICAgIGlmIChcbiAgICAgICAgICBib2R5ICE9PSBudWxsICYmXG4gICAgICAgICAgYm9keSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgKHRoaXMubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSZXF1ZXN0IHdpdGggR0VUL0hFQUQgbWV0aG9kIGNhbm5vdCBoYXZlIGJvZHkuYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgQm9keUluaXQgZm9yIHNlcmlhbGl6YXRpb25cbiAgICAgICAgaWYgKGJvZHkgIT09IG51bGwgJiYgYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgXCJmYWtlXCIgUmVhZGFibGVTdHJlYW0gdGhhdCBzdG9yZXMgdGhlIG9yaWdpbmFsIGJvZHlcbiAgICAgICAgICAvLyBUaGlzIGF2b2lkcyBkb2luZyBhc3luYyB3b3JrIGR1cmluZyB3b3JrZmxvdyByZXBsYXlcbiAgICAgICAgICB0aGlzLmJvZHkgPSBPYmplY3QuY3JlYXRlKHZtR2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICAgICAgICAgIFtCT0RZX0lOSVRfU1lNQk9MXToge1xuICAgICAgICAgICAgICB2YWx1ZTogYm9keSxcbiAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmJvZHkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNsb25lKCk6IFJlcXVlc3Qge1xuICAgICAgICBFTk9UU1VQKCk7XG4gICAgICB9XG5cbiAgICAgIGdldCBib2R5VXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhlc2VcbiAgICAgIGJsb2IhOiAoKSA9PiBQcm9taXNlPEJsb2I+O1xuICAgICAgZm9ybURhdGEhOiAoKSA9PiBQcm9taXNlPEZvcm1EYXRhPjtcblxuICAgICAgYXJyYXlCdWZmZXIhOiAoKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICAgIGpzb24hOiAoKSA9PiBQcm9taXNlPGFueT47XG4gICAgICB0ZXh0ITogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgICBhc3luYyBieXRlcygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IHRoaXMuYXJyYXlCdWZmZXIoKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHZtR2xvYmFsVGhpcy5SZXF1ZXN0ID0gUmVxdWVzdDtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlcXVlc3QucHJvdG90eXBlLCB7XG4gICAgICBhcnJheUJ1ZmZlcjoge1xuICAgICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgQXJyYXlCdWZmZXI+KCdfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyJyksXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9LFxuICAgICAganNvbjoge1xuICAgICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgYW55PignX19idWlsdGluX3Jlc3BvbnNlX2pzb24nKSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB0ZXh0OiB7XG4gICAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBzdHJpbmc+KCdfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dCcpLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNsYXNzIFJlc3BvbnNlIGltcGxlbWVudHMgZ2xvYmFsVGhpcy5SZXNwb25zZSB7XG4gICAgICB0eXBlITogZ2xvYmFsVGhpcy5SZXNwb25zZVsndHlwZSddO1xuICAgICAgdXJsITogc3RyaW5nO1xuICAgICAgc3RhdHVzITogbnVtYmVyO1xuICAgICAgc3RhdHVzVGV4dCE6IHN0cmluZztcbiAgICAgIGJvZHkhOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB8IG51bGw7XG4gICAgICBoZWFkZXJzITogSGVhZGVycztcbiAgICAgIHJlZGlyZWN0ZWQhOiBib29sZWFuO1xuXG4gICAgICBjb25zdHJ1Y3Rvcihib2R5PzogYW55LCBpbml0PzogUmVzcG9uc2VJbml0KSB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gaW5pdD8uc3RhdHVzID8/IDIwMDtcbiAgICAgICAgdGhpcy5zdGF0dXNUZXh0ID0gaW5pdD8uc3RhdHVzVGV4dCA/PyAnJztcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGluaXQ/LmhlYWRlcnMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnZGVmYXVsdCc7XG4gICAgICAgIHRoaXMudXJsID0gJyc7XG4gICAgICAgIHRoaXMucmVkaXJlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgbnVsbC1ib2R5IHN0YXR1cyBjb2RlcyBkb24ndCBoYXZlIGEgYm9keVxuICAgICAgICAvLyBQZXIgSFRUUCBzcGVjOiAyMDQgKE5vIENvbnRlbnQpLCAyMDUgKFJlc2V0IENvbnRlbnQpLCBhbmQgMzA0IChOb3QgTW9kaWZpZWQpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBib2R5ICE9PSBudWxsICYmXG4gICAgICAgICAgYm9keSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgKHRoaXMuc3RhdHVzID09PSAyMDQgfHwgdGhpcy5zdGF0dXMgPT09IDIwNSB8fCB0aGlzLnN0YXR1cyA9PT0gMzA0KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYFJlc3BvbnNlIGNvbnN0cnVjdG9yOiBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyBjb2RlICR7dGhpcy5zdGF0dXN9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgQm9keUluaXQgZm9yIHNlcmlhbGl6YXRpb25cbiAgICAgICAgaWYgKGJvZHkgIT09IG51bGwgJiYgYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgXCJmYWtlXCIgUmVhZGFibGVTdHJlYW0gdGhhdCBzdG9yZXMgdGhlIG9yaWdpbmFsIGJvZHlcbiAgICAgICAgICAvLyBUaGlzIGF2b2lkcyBkb2luZyBhc3luYyB3b3JrIGR1cmluZyB3b3JrZmxvdyByZXBsYXlcbiAgICAgICAgICB0aGlzLmJvZHkgPSBPYmplY3QuY3JlYXRlKHZtR2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICAgICAgICAgIFtCT0RZX0lOSVRfU1lNQk9MXToge1xuICAgICAgICAgICAgICB2YWx1ZTogYm9keSxcbiAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmJvZHkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGVzZVxuICAgICAgY2xvbmUhOiAoKSA9PiBSZXNwb25zZTtcbiAgICAgIGJsb2IhOiAoKSA9PiBQcm9taXNlPGdsb2JhbFRoaXMuQmxvYj47XG4gICAgICBmb3JtRGF0YSE6ICgpID0+IFByb21pc2U8Z2xvYmFsVGhpcy5Gb3JtRGF0YT47XG5cbiAgICAgIGdldCBvaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMDtcbiAgICAgIH1cblxuICAgICAgZ2V0IGJvZHlVc2VkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGFycmF5QnVmZmVyITogKCkgPT4gUHJvbWlzZTxBcnJheUJ1ZmZlcj47XG4gICAgICBqc29uITogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgICAgdGV4dCE6ICgpID0+IFByb21pc2U8c3RyaW5nPjtcblxuICAgICAgYXN5bmMgYnl0ZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShhd2FpdCB0aGlzLmFycmF5QnVmZmVyKCkpO1xuICAgICAgfVxuXG4gICAgICBzdGF0aWMganNvbihkYXRhOiBhbnksIGluaXQ/OiBSZXNwb25zZUluaXQpOiBSZXNwb25zZSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbml0Py5oZWFkZXJzKTtcbiAgICAgICAgaWYgKCFoZWFkZXJzLmhhcygnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgICBoZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGJvZHksIHsgLi4uaW5pdCwgaGVhZGVycyB9KTtcbiAgICAgIH1cblxuICAgICAgc3RhdGljIGVycm9yKCk6IFJlc3BvbnNlIHtcbiAgICAgICAgRU5PVFNVUCgpO1xuICAgICAgfVxuXG4gICAgICBzdGF0aWMgcmVkaXJlY3QodXJsOiBzdHJpbmcgfCBVUkwsIHN0YXR1czogbnVtYmVyID0gMzAyKTogUmVzcG9uc2Uge1xuICAgICAgICAvLyBWYWxpZGF0ZSBzdGF0dXMgY29kZSAtIG9ubHkgc3BlY2lmaWMgcmVkaXJlY3QgY29kZXMgYXJlIGFsbG93ZWRcbiAgICAgICAgaWYgKCFbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdLmluY2x1ZGVzKHN0YXR1cykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIHJlZGlyZWN0IHN0YXR1cyBjb2RlOiAke3N0YXR1c30uIE11c3QgYmUgb25lIG9mOiAzMDEsIDMwMiwgMzAzLCAzMDcsIDMwOGBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIHJlc3BvbnNlIHdpdGggTG9jYXRpb24gaGVhZGVyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoKTtcbiAgICAgICAgaGVhZGVycy5zZXQoJ0xvY2F0aW9uJywgU3RyaW5nKHVybCkpO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gT2JqZWN0LmNyZWF0ZShSZXNwb25zZS5wcm90b3R5cGUpO1xuICAgICAgICByZXNwb25zZS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHQgPSAnJztcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIHJlc3BvbnNlLmJvZHkgPSBudWxsO1xuICAgICAgICByZXNwb25zZS50eXBlID0gJ2RlZmF1bHQnO1xuICAgICAgICByZXNwb25zZS51cmwgPSAnJztcbiAgICAgICAgcmVzcG9uc2UucmVkaXJlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdm1HbG9iYWxUaGlzLlJlc3BvbnNlID0gUmVzcG9uc2U7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXNwb25zZS5wcm90b3R5cGUsIHtcbiAgICAgIGFycmF5QnVmZmVyOiB7XG4gICAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBBcnJheUJ1ZmZlcj4oJ19fYnVpbHRpbl9yZXNwb25zZV9hcnJheV9idWZmZXInKSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBqc29uOiB7XG4gICAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBhbnk+KCdfX2J1aWx0aW5fcmVzcG9uc2VfanNvbicpLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHRleHQ6IHtcbiAgICAgICAgdmFsdWU6IHVzZVN0ZXA8W10sIHN0cmluZz4oJ19fYnVpbHRpbl9yZXNwb25zZV90ZXh0JyksXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY2xhc3MgUmVhZGFibGVTdHJlYW08VD4gaW1wbGVtZW50cyBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPFQ+IHtcbiAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBFTk9UU1VQKCk7XG4gICAgICB9XG5cbiAgICAgIGdldCBsb2NrZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY2FuY2VsKCk6IGFueSB7XG4gICAgICAgIEVOT1RTVVAoKTtcbiAgICAgIH1cblxuICAgICAgZ2V0UmVhZGVyKCk6IGFueSB7XG4gICAgICAgIEVOT1RTVVAoKTtcbiAgICAgIH1cblxuICAgICAgcGlwZVRocm91Z2goKTogYW55IHtcbiAgICAgICAgRU5PVFNVUCgpO1xuICAgICAgfVxuXG4gICAgICBwaXBlVG8oKTogYW55IHtcbiAgICAgICAgRU5PVFNVUCgpO1xuICAgICAgfVxuXG4gICAgICB0ZWUoKTogYW55IHtcbiAgICAgICAgRU5PVFNVUCgpO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZXMoKTogYW55IHtcbiAgICAgICAgRU5PVFNVUCgpO1xuICAgICAgfVxuXG4gICAgICBzdGF0aWMgZnJvbSgpOiBhbnkge1xuICAgICAgICBFTk9UU1VQKCk7XG4gICAgICB9XG5cbiAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogYW55IHtcbiAgICAgICAgRU5PVFNVUCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB2bUdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0gPSBSZWFkYWJsZVN0cmVhbTtcblxuICAgIGNsYXNzIFdyaXRhYmxlU3RyZWFtPFQ+IGltcGxlbWVudHMgZ2xvYmFsVGhpcy5Xcml0YWJsZVN0cmVhbTxUPiB7XG4gICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgRU5PVFNVUCgpO1xuICAgICAgfVxuXG4gICAgICBnZXQgbG9ja2VkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGFib3J0KCk6IGFueSB7XG4gICAgICAgIEVOT1RTVVAoKTtcbiAgICAgIH1cblxuICAgICAgY2xvc2UoKTogYW55IHtcbiAgICAgICAgRU5PVFNVUCgpO1xuICAgICAgfVxuXG4gICAgICBnZXRXcml0ZXIoKTogYW55IHtcbiAgICAgICAgRU5PVFNVUCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB2bUdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW0gPSBXcml0YWJsZVN0cmVhbTtcblxuICAgIGNsYXNzIFRyYW5zZm9ybVN0cmVhbTxJLCBPPiBpbXBsZW1lbnRzIGdsb2JhbFRoaXMuVHJhbnNmb3JtU3RyZWFtPEksIE8+IHtcbiAgICAgIHJlYWRhYmxlOiBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPE8+O1xuICAgICAgd3JpdGFibGU6IGdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW08ST47XG5cbiAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBFTk9UU1VQKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZtR2xvYmFsVGhpcy5UcmFuc2Zvcm1TdHJlYW0gPSBUcmFuc2Zvcm1TdHJlYW07XG5cbiAgICAvLyBFdmVudHVhbGx5IHdlJ2xsIHByb2JhYmx5IHdhbnQgdG8gcHJvdmlkZSBvdXIgb3duIGBjb25zb2xlYCBvYmplY3QsXG4gICAgLy8gYnV0IGZvciBub3cgd2UnbGwganVzdCBleHBvc2UgdGhlIGdsb2JhbCBvbmUuXG4gICAgdm1HbG9iYWxUaGlzLmNvbnNvbGUgPSBnbG9iYWxUaGlzLmNvbnNvbGU7XG5cbiAgICAvLyBIQUNLOiBwcm9wYWdhdGUgc3ltYm9sIG5lZWRlZCBmb3IgQUkgZ2F0ZXdheSB1c2FnZVxuICAgIGNvbnN0IFNZTUJPTF9GT1JfUkVRX0NPTlRFWFQgPSBTeW1ib2wuZm9yKCdAdmVyY2VsL3JlcXVlc3QtY29udGV4dCcpO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICAgIHZtR2xvYmFsVGhpc1tTWU1CT0xfRk9SX1JFUV9DT05URVhUXSA9IChnbG9iYWxUaGlzIGFzIGFueSlbXG4gICAgICBTWU1CT0xfRk9SX1JFUV9DT05URVhUXG4gICAgXTtcblxuICAgIC8vIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgdXNlci1kZWZpbmVkIHdvcmtmbG93IGZ1bmN0aW9uLlxuICAgIC8vIFRoZSBmaWxlbmFtZSBwYXJhbWV0ZXIgZW5zdXJlcyBzdGFjayB0cmFjZXMgc2hvdyBhIG1lYW5pbmdmdWwgbmFtZVxuICAgIC8vIChlLmcuLCBcImV4YW1wbGUvd29ya2Zsb3dzLzk5X2UyZS50c1wiKSBpbnN0ZWFkIG9mIFwiZXZhbG1hY2hpbmUuPGFub255bW91cz5cIi5cbiAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd1J1bi53b3JrZmxvd05hbWU7XG5cbiAgICBjb25zdCB3b3JrZmxvd0ZuID0gcnVuSW5Db250ZXh0KFxuICAgICAgYCR7d29ya2Zsb3dDb2RlfTsgZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzPy5nZXQoJHtKU09OLnN0cmluZ2lmeSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUpfSlgLFxuICAgICAgY29udGV4dCxcbiAgICAgIHsgZmlsZW5hbWUgfVxuICAgICk7XG5cbiAgICBpZiAodHlwZW9mIHdvcmtmbG93Rm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcih3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUpO1xuICAgIH1cblxuICAgIC8vIENoYWluIHdvcmtmbG93IGFyZ3VtZW50IGh5ZHJhdGlvbiBvbnRvIHRoZSBwcm9taXNlUXVldWUgc28gdGhhdCB0aGVcbiAgICAvLyB1bmNvbnN1bWVkIGV2ZW50IGNoZWNrICh3aGljaCB3YWl0cyBmb3IgdGhlIHF1ZXVlIHRvIGRyYWluKSBkb2Vzbid0XG4gICAgLy8gZmlyZSBkdXJpbmcgdGhlIGFzeW5jIGdhcCBiZXR3ZWVuIHJ1bl9zdGFydGVkIGNvbnN1bXB0aW9uIGFuZCB0aGVcbiAgICAvLyB3b3JrZmxvdyBmdW5jdGlvbiBzdWJzY3JpYmluZyBpdHMgZmlyc3Qgc3RlcCBjYWxsYmFja3MuXG4gICAgbGV0IGFyZ3M6IHVua25vd25bXSA9IFtdO1xuICAgIHdvcmtmbG93Q29udGV4dC5wcm9taXNlUXVldWUgPSB3b3JrZmxvd0NvbnRleHQucHJvbWlzZVF1ZXVlLnRoZW4oXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGFyZ3MgPSBhd2FpdCBoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMoXG4gICAgICAgICAgd29ya2Zsb3dSdW4uaW5wdXQsXG4gICAgICAgICAgd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICB2bUdsb2JhbFRoaXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuICAgIGF3YWl0IHdvcmtmbG93Q29udGV4dC5wcm9taXNlUXVldWU7XG5cbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0FyZ3VtZW50c0NvdW50KGFyZ3MubGVuZ3RoKSxcbiAgICB9KTtcblxuICAgIC8vIEludm9rZSB1c2VyIHdvcmtmbG93XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgIHdvcmtmbG93Rm4oLi4uYXJncyksXG4gICAgICAgIHdvcmtmbG93RGlzY29udGludWF0aW9uLnByb21pc2UsXG4gICAgICBdKTtcblxuICAgICAgY29uc3QgZGVoeWRyYXRlZCA9IGF3YWl0IGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIHZtR2xvYmFsVGhpc1xuICAgICAgKTtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1Jlc3VsdFR5cGUodHlwZW9mIHJlc3VsdCksXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgZHJhaW5QZW5kaW5nUXVldWVJdGVtcyhcbiAgICAgICAgd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICAgIHdvcmtmbG93Q29udGV4dC5pbnZvY2F0aW9uc1F1ZXVlLFxuICAgICAgICB2bUdsb2JhbFRoaXMsXG4gICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAnY29tcGxldGVkJ1xuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGRlaHlkcmF0ZWQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBMZXQgV29ya2Zsb3dTdXNwZW5zaW9uIHByb3BhZ2F0ZSDigJQgaGFuZGxlZCBzZXBhcmF0ZWx5IGJ5IHRoZSBydW50aW1lXG4gICAgICBpZiAoV29ya2Zsb3dTdXNwZW5zaW9uLmlzKGVycikpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zKFxuICAgICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgd29ya2Zsb3dDb250ZXh0Lmludm9jYXRpb25zUXVldWUsXG4gICAgICAgIHZtR2xvYmFsVGhpcyxcbiAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICdmYWlsZWQnXG4gICAgICApO1xuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==
|
|
664
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN2QyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLFdBQVcsRUFDWCwwQkFBMEIsRUFDMUIsb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRS9ELE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFM0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUNMLDRCQUE0QixFQUM1Qix3QkFBd0IsR0FDekIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixzQkFBc0IsRUFDdEIsY0FBYyxFQUNkLGlCQUFpQixHQUNsQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEtBQUssU0FBUyxN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QUFXLEVBQ1gsUUFBUSxDQUNULENBQUM7WUFFRixNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBydW5JbkNvbnRleHQgfSBmcm9tICdub2RlOnZtJztcbmltcG9ydCB7XG4gIENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IsXG4gIEVSUk9SX1NMVUdTLFxuICBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgd2l0aFJlc29sdmVycyB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB0eXBlIHsgRXZlbnQsIFdvcmtmbG93UnVuIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCAqIGFzIG5hbm9pZCBmcm9tICduYW5vaWQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHR5cGUgeyBDcnlwdG9LZXkgfSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCwgRXZlbnRzQ29uc3VtZXIgfSBmcm9tICcuL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlSXRlbSB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IEVOT1RTVVAsIFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgeyBnZXRQb3J0TGF6eSB9IGZyb20gJy4vcnVudGltZS9nZXQtcG9ydC1sYXp5LmpzJztcbmltcG9ydCB7IGhhbmRsZVN1c3BlbnNpb24gfSBmcm9tICcuL3J1bnRpbWUvc3VzcGVuc2lvbi1oYW5kbGVyLmpzJztcbmltcG9ydCB7IGdldFdvcmxkIH0gZnJvbSAnLi9ydW50aW1lL3dvcmxkLmpzJztcbmltcG9ydCB7XG4gIGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUsXG4gIGh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZVVzZVN0ZXAgfSBmcm9tICcuL3N0ZXAuanMnO1xuaW1wb3J0IHtcbiAgQk9EWV9JTklUX1NZTUJPTCxcbiAgU1RBQkxFX1VMSUQsXG4gIFdPUktGTE9XX0NSRUFURV9IT09LLFxuICBXT1JLRkxPV19HRVRfU1RSRUFNX0lELFxuICBXT1JLRkxPV19TTEVFUCxcbiAgV09SS0ZMT1dfVVNFX1NURVAsXG59IGZyb20gJy4vc3ltYm9scy5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgdHJhY2UgfSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1J1blN0cmVhbUlkIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuL3ZtL2luZGV4LmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUFib3J0U2lnbmFsU3RhdGljcyxcbiAgY3JlYXRlQ3JlYXRlQWJvcnRDb250cm9sbGVyLFxufSBmcm9tICcuL3dvcmtmbG93L2Fib3J0LWNvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSAnLi93b3JrZmxvdy9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuaW1wb3J0IHsgV09SS0ZMT1dfQ09OVEVYVF9TWU1CT0wgfSBmcm9tICcuL3dvcmtmbG93L2dldC13b3JrZmxvdy1tZXRhZGF0YS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVDcmVhdGVIb29rIH0gZnJvbSAnLi93b3JrZmxvdy9ob29rLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNsZWVwIH0gZnJvbSAnLi93b3JrZmxvdy9zbGVlcC5qcyc7XG5cbi8qKlxuICogRHJhaW4gcGVuZGluZyBxdWV1ZSBpdGVtcyBhdCB3b3JrZmxvdyBjb21wbGV0aW9uIChzdWNjZXNzIG9yIGZhaWx1cmUpLlxuICpcbiAqIFRyZWF0cyBlbmQtb2YtcnVuIGxpa2UgYSBmaW5hbCBzdXNwZW5zaW9uOiBhbnkgb3BlcmF0aW9uIHRoZSB3b3JrZmxvdyBjb2RlXG4gKiBzcGF3bmVkIGJ1dCBkaWRuJ3QgYGF3YWl0YCDigJQgYWJvcnQgaG9vayByZXN1bWVzLCBob29rIGNyZWF0aW9ucy9kaXNwb3NhbHMsXG4gKiBzbGVlcCB3YWl0cywgc3RlcCBxdWV1ZWluZ3Mg4oCUIGdldHMgY29tbWl0dGVkIHRvIHRoZSBldmVudCBsb2cgdmlhIHRoZVxuICogc3VzcGVuc2lvbiBoYW5kbGVyIGJlZm9yZSB0aGUgcnVuIGlzIG1hcmtlZCB0ZXJtaW5hbC5cbiAqXG4gKiBUaGlzIG1hdGNoZXMgbm9ybWFsIEpTIHNlbWFudGljcyB3aGVyZSBgc2V0VGltZW91dChmbiwgLi4uKWAgZXRjLiBjb250aW51ZVxuICogcnVubmluZyBhZnRlciB0aGUgc3Vycm91bmRpbmcgZnVuY3Rpb24gcmV0dXJucy4gTW9zdCBpbXBvcnRhbnRseSwgaXQgZW5zdXJlc1xuICogYGNvbnRyb2xsZXIuYWJvcnQoKWAgY2FsbGVkIGFzIHRoZSBsYXN0IHN0YXRlbWVudCBvZiBhIHdvcmtmbG93IGFjdHVhbGx5XG4gKiBwcm9wYWdhdGVzIHRvIGluLWZsaWdodCBzdGVwcyBvbiBvdGhlciBjb21wdXRlIGluc3RhbmNlcyDigJQgd2l0aG91dCB0aGlzLFxuICogdGhlIGFib3J0IGhvb2sgaXMgY3JlYXRlZCBidXQgbmV2ZXIgcmVzdW1lZCBhbmQgdGhlIGNhbmNlbGxhdGlvbiBuZXZlclxuICogcmVhY2hlcyB0aGUgcnVubmluZyBzdGVwLlxuICpcbiAqIE5PVEU6IGRyYWluIG9ubHkgY29tbWl0cyB0aGUgYCpfY3JlYXRlZGAgZXZlbnRzOyBpdCBkb2VzIE5PVCBlbnF1ZXVlIHN0ZXBcbiAqIGJvZGllcyBmb3IgZXhlY3V0aW9uLiBUaGUgcGxhdGZvcm0ncyBzdGVwIHdvcmtlciByZWplY3RzIGBzdGVwX3N0YXJ0ZWRgXG4gKiBmb3IgcnVucyB0aGF0IGhhdmUgYWxyZWFkeSB0cmFuc2l0aW9uZWQgdG8gdGVybWluYWwgKGBSdW5FeHBpcmVkRXJyb3JgKSxcbiAqIHNvIGEgc3RlcCBxdWV1ZWQgaGVyZSB3b3VsZCBiZSBza2lwcGVkIGFueXdheS4gRmlyZS1hbmQtZm9yZ2V0IHN0ZXAgY2FsbHNcbiAqIHdpdGggc2lkZSBlZmZlY3RzIHRoZXJlZm9yZSB3b3JrIG9ubHkgd2hlbiBmb2xsb3dlZCBieSBzb21lIGxhdGVyIGBhd2FpdGBcbiAqIG9uIGEgcnVudGltZSBwcmltaXRpdmUgdGhhdCB0cmlnZ2VycyBhIHJlYWwgc3VzcGVuc2lvbiAodGhlIG5vcm1hbFxuICogcnVudGltZSBsb29wIGluIGBydW50aW1lLnRzYCBxdWV1ZXMgdGhlIHN0ZXAgdGhlcmUpLiBBIGB2b2lkYCBwbGFjZWRcbiAqIGltbWVkaWF0ZWx5IGJlZm9yZSBgcmV0dXJuYCBpcyBub3QgcmVsaWFibHkgZXhlY3V0ZWQuXG4gKlxuICogRHJhaW4gZmFpbHVyZXMgYXJlIHN3YWxsb3dlZDogdGhlIHdvcmtmbG93J3Mgb3duIG91dGNvbWUgKHRoZSB1c2VyJ3MgcmV0dXJuXG4gKiB2YWx1ZSBvciB0aHJvd24gZXJyb3IpIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGg7IHNlY29uZGFyeSBjbGVhbnVwIHRoYXQgZmFpbHNcbiAqIHNob3VsZG4ndCBjaGFuZ2UgdGhlIHJ1bidzIHRlcm1pbmFsIHN0YXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zKFxuICBydW5JZDogc3RyaW5nLFxuICBwZW5kaW5nUXVldWU6IE1hcDxzdHJpbmcsIFF1ZXVlSXRlbT4sXG4gIHZtR2xvYmFsVGhpczogdHlwZW9mIGdsb2JhbFRoaXMsXG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bixcbiAgb3V0Y29tZTogJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChwZW5kaW5nUXVldWUuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAvLyBJbXBsaWNpdGx5IGRpc3Bvc2UgYW55IGFib3J0IGhvb2tzIChzeXN0ZW0gaG9va3MpIHRoYXQgYXJlIHN0aWxsIGFsaXZlIGF0XG4gIC8vIHdvcmtmbG93IGNvbXBsZXRpb24gc28gdGhleSBkb24ndCBsZWFrIHJvd3MgaW4gdGhlIGhvb2tzIHRhYmxlIGZvciB0aGVcbiAgLy8gcnVuJ3MgbGlmZXRpbWUuIFNraXAgaG9va3MgdGhhdCBhbHJlYWR5IGhhdmUgYW4gYWJvcnQgaW4gZmxpZ2h0IOKAlCB0aG9zZVxuICAvLyB3aWxsIGVtaXQgaG9va19yZWNlaXZlZCB2aWEgdGhlIGFib3J0IHByb2Nlc3NpbmcgcGF0aC4gVXNlciBob29rc1xuICAvLyAoaXNTeXN0ZW0gIT09IHRydWUpIGFyZSBpbnRlbnRpb25hbGx5IGxlZnQgYWxvbmU6IHRoZWlyIGxpZmV0aW1lIGlzXG4gIC8vIG1hbmFnZWQgYnkgdGhlIHVzZXIncyBjb2RlLCBub3QgdGhlIHJ1bnRpbWUuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBwZW5kaW5nUXVldWUudmFsdWVzKCkpIHtcbiAgICBpZiAoXG4gICAgICBpdGVtLnR5cGUgPT09ICdob29rJyAmJlxuICAgICAgaXRlbS5pc1N5c3RlbSAmJlxuICAgICAgIWl0ZW0uZGlzcG9zZWQgJiZcbiAgICAgICFpdGVtLmFib3J0UmVxdWVzdGVkXG4gICAgKSB7XG4gICAgICBpdGVtLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgY29uc3Qgc3ludGhlc2l6ZWQgPSBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKHBlbmRpbmdRdWV1ZSwgdm1HbG9iYWxUaGlzKTtcbiAgICBhd2FpdCBoYW5kbGVTdXNwZW5zaW9uKHtcbiAgICAgIHN1c3BlbnNpb246IHN5bnRoZXNpemVkLFxuICAgICAgd29ybGQsXG4gICAgICBydW46IHdvcmtmbG93UnVuLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICBgRmFpbGVkIHRvIGRyYWluIHBlbmRpbmcgcXVldWUgaXRlbXMgZm9yICR7b3V0Y29tZX0gd29ya2Zsb3cgcnVuYCxcbiAgICAgIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIG1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Xb3JrZmxvdyhcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bixcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBlbmNyeXB0aW9uS2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWRcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgcmV0dXJuIHRyYWNlKGB3b3JrZmxvdy5ydW4gJHt3b3JrZmxvd1J1bi53b3JrZmxvd05hbWV9YCwgYXN5bmMgKHNwYW4pID0+IHtcbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHdvcmtmbG93UnVuLnJ1bklkKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyh3b3JrZmxvd1J1bi5zdGF0dXMpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXZlbnRzQ291bnQoZXZlbnRzLmxlbmd0aCksXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGFydGVkQXQgPSB3b3JrZmxvd1J1bi5zdGFydGVkQXQ7XG4gICAgaWYgKCFzdGFydGVkQXQpIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7d29ya2Zsb3dSdW4ucnVuSWR9XCIgaGFzIG5vIFwic3RhcnRlZEF0XCIgdGltZXN0YW1wIChzaG91bGQgbm90IGhhcHBlbilgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgcG9ydCBiZWZvcmUgY3JlYXRpbmcgVk0gY29udGV4dCB0byBhdm9pZCBhc3luYyBvcGVyYXRpb25zXG4gICAgLy8gYWZmZWN0aW5nIHRoZSBkZXRlcm1pbmlzdGljIHRpbWVzdGFtcFxuICAgIGNvbnN0IGlzVmVyY2VsID0gcHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTCAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIExvYWQgZ2V0UG9ydCBsYXppbHkgdG8gcHJldmVudCBUdXJib3BhY2sgZnJvbSB0cmFjaW5nIGdldC1wb3J0J3NcbiAgICAvLyBmcyBvcHMgKHJlYWRkaXIsIHJlYWRGaWxlKSBpbnRvIHRoZSBmbG93IHJvdXRlIGJ1bmRsZS5cbiAgICAvLyBVc2VzIGdsb2JhbFRoaXMuX193a2ZfZ2V0UG9ydCBhcyBhIGxhenktaW5pdGlhbGl6ZWQgY2FjaGUgdG8gYXZvaWRcbiAgICAvLyBidW5kbGVyIHN0YXRpYyBhbmFseXNpcyB3aGlsZSBzdGF5aW5nIGNvbXBhdGlibGUgd2l0aCBDSlMvRVNNL1ZNLlxuICAgIGNvbnN0IHBvcnQgPSBpc1ZlcmNlbCA/IHVuZGVmaW5lZCA6IGF3YWl0IGdldFBvcnRMYXp5KCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBjb250ZXh0LFxuICAgICAgZ2xvYmFsVGhpczogdm1HbG9iYWxUaGlzLFxuICAgICAgdXBkYXRlVGltZXN0YW1wLFxuICAgIH0gPSBjcmVhdGVDb250ZXh0KHtcbiAgICAgIHNlZWQ6IGAke3dvcmtmbG93UnVuLnJ1bklkfToke3dvcmtmbG93UnVuLndvcmtmbG93TmFtZX06JHsrc3RhcnRlZEF0fWAsXG4gICAgICBmaXhlZFRpbWVzdGFtcDogK3N0YXJ0ZWRBdCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHdvcmtmbG93RGlzY29udGludWF0aW9uID0gd2l0aFJlc29sdmVyczx2b2lkPigpO1xuXG4gICAgY29uc3QgdWxpZCA9IG1vbm90b25pY0ZhY3RvcnkoKCkgPT4gdm1HbG9iYWxUaGlzLk1hdGgucmFuZG9tKCkpO1xuICAgIGNvbnN0IGdlbmVyYXRlTmFub2lkID0gbmFub2lkLmN1c3RvbVJhbmRvbShuYW5vaWQudXJsQWxwaGFiZXQsIDIxLCAoc2l6ZSkgPT5cbiAgICAgIG5ldyBVaW50OEFycmF5KHNpemUpLm1hcCgoKSA9PiAyNTYgKiB2bUdsb2JhbFRoaXMuTWF0aC5yYW5kb20oKSlcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGEgbXV0YWJsZSBob2xkZXIgZm9yIHRoZSBwcm9taXNlIHF1ZXVlIHNvIHRoZSBFdmVudHNDb25zdW1lclxuICAgIC8vIGNhbiBhY2Nlc3MgdGhlIGN1cnJlbnQgcXVldWUgc3RhdGUgdmlhIGEgZ2V0dGVyLiBUaGUgcXVldWUgaXMgbXV0YXRlZFxuICAgIC8vIGJ5IHN0ZXAvaG9vay9zbGVlcCBjYWxsYmFja3MgYXMgZXZlbnRzIGFyZSBwcm9jZXNzZWQuXG4gICAgY29uc3QgcHJvbWlzZVF1ZXVlSG9sZGVyID0geyBjdXJyZW50OiBQcm9taXNlLnJlc29sdmUoKSB9O1xuXG4gICAgY29uc3QgZXZlbnRzQ29uc3VtZXIgPSBuZXcgRXZlbnRzQ29uc3VtZXIoZXZlbnRzLCB7XG4gICAgICBvblVuY29uc3VtZWRFdmVudDogKGV2ZW50KSA9PiB7XG4gICAgICAgIHdvcmtmbG93RGlzY29udGludWF0aW9uLnJlamVjdChcbiAgICAgICAgICBuZXcgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcihcbiAgICAgICAgICAgIGBVbmNvbnN1bWVkIGV2ZW50IGluIGV2ZW50IGxvZzogZXZlbnRUeXBlPSR7ZXZlbnQuZXZlbnRUeXBlfSwgY29ycmVsYXRpb25JZD0ke2V2ZW50LmNvcnJlbGF0aW9uSWR9LCBldmVudElkPSR7ZXZlbnQuZXZlbnRJZH0uIFRoaXMgaW5kaWNhdGVzIGEgY29ycnVwdGVkIG9yIGludmFsaWQgZXZlbnQgbG9nLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgZ2V0UHJvbWlzZVF1ZXVlOiAoKSA9PiBwcm9taXNlUXVldWVIb2xkZXIuY3VycmVudCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHdvcmtmbG93Q29udGV4dDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0ID0ge1xuICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuLnJ1bklkLFxuICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgIGdsb2JhbFRoaXM6IHZtR2xvYmFsVGhpcyxcbiAgICAgIG9uV29ya2Zsb3dFcnJvcjogd29ya2Zsb3dEaXNjb250aW51YXRpb24ucmVqZWN0LFxuICAgICAgZXZlbnRzQ29uc3VtZXIsXG4gICAgICBnZW5lcmF0ZVVsaWQ6ICgpID0+IHVsaWQoK3N0YXJ0ZWRBdCksXG4gICAgICBnZW5lcmF0ZU5hbm9pZCxcbiAgICAgIGludm9jYXRpb25zUXVldWU6IG5ldyBNYXAoKSxcbiAgICAgIC8vIFVzZSBnZXR0ZXIvc2V0dGVyIHNvIHRoZSBFdmVudHNDb25zdW1lcidzIGdldFByb21pc2VRdWV1ZSgpIGFsd2F5c1xuICAgICAgLy8gc2VlcyB0aGUgbGF0ZXN0IHF1ZXVlIHN0YXRlIGFzIGl0J3MgbXV0YXRlZCBieSBzdGVwL2hvb2svc2xlZXAgY2FsbGJhY2tzLlxuICAgICAgZ2V0IHByb21pc2VRdWV1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VRdWV1ZUhvbGRlci5jdXJyZW50O1xuICAgICAgfSxcbiAgICAgIHNldCBwcm9taXNlUXVldWUodmFsdWU6IFByb21pc2U8dm9pZD4pIHtcbiAgICAgICAgcHJvbWlzZVF1ZXVlSG9sZGVyLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICBwZW5kaW5nRGVsaXZlcmllczogMCxcbiAgICB9O1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIHRoZSBldmVudHMgbG9nIHRvIHVwZGF0ZSB0aGUgdGltZXN0YW1wIGluIHRoZSB2bSBjb250ZXh0XG4gICAgd29ya2Zsb3dDb250ZXh0LmV2ZW50c0NvbnN1bWVyLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IGV2ZW50Py5jcmVhdGVkQXQ7XG4gICAgICBpZiAoY3JlYXRlZEF0KSB7XG4gICAgICAgIHVwZGF0ZVRpbWVzdGFtcCgrY3JlYXRlZEF0KTtcbiAgICAgIH1cbiAgICAgIC8vIE5ldmVyIGNvbnN1bWUgZXZlbnRzIC0gdGhpcyBpcyBvbmx5IGEgcGFzc2l2ZSBzdWJzY3JpYmVyXG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICB9KTtcblxuICAgIC8vIENvbnN1bWUgcnVuIGxpZmVjeWNsZSBldmVudHMgLSB0aGVzZSBhcmUgc3RydWN0dXJhbCBldmVudHMgdGhhdCBkb24ndFxuICAgIC8vIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBpbiB0aGUgd29ya2Zsb3csIGJ1dCBtdXN0IGJlIGNvbnN1bWVkIHRvIGFkdmFuY2VcbiAgICAvLyBwYXN0IHRoZW0gaW4gdGhlIGV2ZW50IGxvZ1xuICAgIHdvcmtmbG93Q29udGV4dC5ldmVudHNDb25zdW1lci5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25zdW1lIHJ1bl9jcmVhdGVkIC0gZXZlcnkgcnVuIGhhcyBleGFjdGx5IG9uZVxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJykge1xuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgLy8gQ29uc3VtZSBydW5fc3RhcnRlZCAtIGV2ZXJ5IHJ1biBoYXMgZXhhY3RseSBvbmVcbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcpIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdXNlU3RlcCA9IGNyZWF0ZVVzZVN0ZXAod29ya2Zsb3dDb250ZXh0KTtcbiAgICBjb25zdCBjcmVhdGVIb29rID0gY3JlYXRlQ3JlYXRlSG9vayh3b3JrZmxvd0NvbnRleHQpO1xuICAgIGNvbnN0IHNsZWVwID0gY3JlYXRlU2xlZXAod29ya2Zsb3dDb250ZXh0KTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICAgIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19VU0VfU1RFUF0gPSB1c2VTdGVwO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICAgIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19DUkVBVEVfSE9PS10gPSBjcmVhdGVIb29rO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICAgIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19TTEVFUF0gPSBzbGVlcDtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfR0VUX1NUUkVBTV9JRF0gPSAobmFtZXNwYWNlPzogc3RyaW5nKSA9PlxuICAgICAgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCh3b3JrZmxvd1J1bi5ydW5JZCwgbmFtZXNwYWNlKTtcblxuICAgIC8vIFRPRE86IHRoZXJlIHNob3VsZCBiZSBhIGdldFVybCBtZXRob2Qgb24gdGhlIHdvcmxkIGludGVyZmFjZSBpdHNlbGYuIFRoaXNcbiAgICAvLyBzb2x1dGlvbiBvbmx5IHdvcmtzIGZvciB2ZXJjZWwgKyBsb2NhbCB3b3JsZHMuXG4gICAgY29uc3QgdXJsID0gaXNWZXJjZWxcbiAgICAgID8gYGh0dHBzOi8vJHtwcm9jZXNzLmVudi5WRVJDRUxfVVJMfWBcbiAgICAgIDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0ID8/IDMwMDB9YDtcblxuICAgIC8vIEZvciB0aGUgd29ya2Zsb3cgVk0sIHdlIHN0b3JlIHRoZSBjb250ZXh0IGluIGEgc3ltYm9sIG9uIHRoZSBgZ2xvYmFsVGhpc2Agb2JqZWN0XG4gICAgY29uc3QgY3R4OiBXb3JrZmxvd01ldGFkYXRhID0ge1xuICAgICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsXG4gICAgICB3b3JrZmxvd1J1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgIHdvcmtmbG93U3RhcnRlZEF0OiBuZXcgdm1HbG9iYWxUaGlzLkRhdGUoK3N0YXJ0ZWRBdCksXG4gICAgICB1cmwsXG4gICAgICBmZWF0dXJlczogeyBlbmNyeXB0aW9uOiAhIWVuY3J5cHRpb25LZXkgfSxcbiAgICB9O1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gICAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX0NPTlRFWFRfU1lNQk9MXSA9IGN0eDtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgICB2bUdsb2JhbFRoaXNbU1RBQkxFX1VMSURdID0gdWxpZDtcblxuICAgIC8vIE5PVEU6IFdpbGwgaGF2ZSBhIGNvbmZpZyBvdmVycmlkZSB0byB1c2UgdGhlIGN1c3RvbSBmZXRjaCBzdGVwLlxuICAgIC8vICAgICAgIEZvciBub3cgYGZldGNoYCBtdXN0IGJlIGV4cGxpY2l0bHkgaW1wb3J0ZWQgZnJvbSBgd29ya2Zsb3dgLlxuICAgIHZtR2xvYmFsVGhpcy5mZXRjaCA9ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyB2bUdsb2JhbFRoaXMuRXJyb3IoXG4gICAgICAgIGBHbG9iYWwgXCJmZXRjaFwiIGlzIHVuYXZhaWxhYmxlIGluIHdvcmtmbG93IGZ1bmN0aW9ucy4gVXNlIHRoZSBcImZldGNoXCIgc3RlcCBmdW5jdGlvbiBmcm9tIFwid29ya2Zsb3dcIiB0byBtYWtlIEhUVFAgcmVxdWVzdHMuXFxuXFxuTGVhcm4gbW9yZTogaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2Vyci8ke0VSUk9SX1NMVUdTLkZFVENIX0lOX1dPUktGTE9XX0ZVTkNUSU9OfWBcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIE92ZXJyaWRlIHRpbWVvdXQvaW50ZXJ2YWwgZnVuY3Rpb25zIHRvIHRocm93IGhlbHBmdWwgZXJyb3JzXG4gICAgLy8gVGhlc2UgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gd29ya2Zsb3cgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSByZWx5IG9uXG4gICAgLy8gYXN5bmNocm9ub3VzIHNjaGVkdWxpbmcgd2hpY2ggYnJlYWtzIGRldGVybWluaXN0aWMgcmVwbGF5XG4gICAgY29uc3QgdGltZW91dEVycm9yTWVzc2FnZSA9XG4gICAgICAnVGltZW91dCBmdW5jdGlvbnMgbGlrZSBcInNldFRpbWVvdXRcIiBhbmQgXCJzZXRJbnRlcnZhbFwiIGFyZSBub3Qgc3VwcG9ydGVkIGluIHdvcmtmbG93IGZ1bmN0aW9ucy4gVXNlIHRoZSBcInNsZWVwXCIgZnVuY3Rpb24gZnJvbSBcIndvcmtmbG93XCIgZm9yIHRpbWUtYmFzZWQgZGVsYXlzLic7XG5cbiAgICAodm1HbG9iYWxUaGlzIGFzIGFueSkuc2V0VGltZW91dCA9ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICAodm1HbG9iYWxUaGlzIGFzIGFueSkuc2V0SW50ZXJ2YWwgPSAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLmNsZWFyVGltZW91dCA9ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICAodm1HbG9iYWxUaGlzIGFzIGFueSkuY2xlYXJJbnRlcnZhbCA9ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICAodm1HbG9iYWxUaGlzIGFzIGFueSkuc2V0SW1tZWRpYXRlID0gKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIHtcbiAgICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgICB9KTtcbiAgICB9O1xuICAgICh2bUdsb2JhbFRoaXMgYXMgYW55KS5jbGVhckltbWVkaWF0ZSA9ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIGBBYm9ydENvbnRyb2xsZXJgIGFuZCBgQWJvcnRTaWduYWxgIGluIHRoZSB3b3JrZmxvdyBWTSBhcmUgaG9vay1iYWNrZWRcbiAgICAvLyBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuIFRoZSBjb250cm9sbGVyJ3MgYWJvcnQoKSBxdWV1ZXMgYSBob29rIHJlc3VtcHRpb24sXG4gICAgLy8gYW5kIHNpZ25hbC5hYm9ydGVkIGlzIHVwZGF0ZWQgd2hlbiB0aGUgaG9vayBldmVudCBpcyBwcm9jZXNzZWQgZHVyaW5nIHJlcGxheS5cbiAgICAodm1HbG9iYWxUaGlzIGFzIGFueSkuQWJvcnRDb250cm9sbGVyID1cbiAgICAgIGNyZWF0ZUNyZWF0ZUFib3J0Q29udHJvbGxlcih3b3JrZmxvd0NvbnRleHQpO1xuICAgIGNvbnN0IGFib3J0U2lnbmFsU3RhdGljcyA9IGNyZWF0ZUFib3J0U2lnbmFsU3RhdGljcygpO1xuICAgICh2bUdsb2JhbFRoaXMgYXMgYW55KS5BYm9ydFNpZ25hbCA9IHtcbiAgICAgIGFib3J0OiBhYm9ydFNpZ25hbFN0YXRpY3MuYWJvcnQsXG4gICAgICBhbnk6IGFib3J0U2lnbmFsU3RhdGljcy5hbnksXG4gICAgICB0aW1lb3V0OiBhYm9ydFNpZ25hbFN0YXRpY3MudGltZW91dCxcbiAgICB9O1xuXG4gICAgLy8gYFJlcXVlc3RgIGFuZCBgUmVzcG9uc2VgIGFyZSBzcGVjaWFsIGJ1aWx0LWluIGNsYXNzZXMgdGhhdCBpbnZva2Ugc3RlcHNcbiAgICAvLyBmb3IgdGhlIGBqc29uKClgLCBgdGV4dCgpYCBhbmQgYGFycmF5QnVmZmVyKClgIGluc3RhbmNlIG1ldGhvZHNcbiAgICBjbGFzcyBSZXF1ZXN0IGltcGxlbWVudHMgZ2xvYmFsVGhpcy5SZXF1ZXN0IHtcbiAgICAgIGNhY2hlITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydjYWNoZSddO1xuICAgICAgY3JlZGVudGlhbHMhOiBnbG9iYWxUaGlzLlJlcXVlc3RbJ2NyZWRlbnRpYWxzJ107XG4gICAgICBkZXN0aW5hdGlvbiE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnZGVzdGluYXRpb24nXTtcbiAgICAgIGhlYWRlcnMhOiBIZWFkZXJzO1xuICAgICAgaW50ZWdyaXR5ITogc3RyaW5nO1xuICAgICAgbWV0aG9kITogc3RyaW5nO1xuICAgICAgbW9kZSE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnbW9kZSddO1xuICAgICAgcmVkaXJlY3QhOiBnbG9iYWxUaGlzLlJlcXVlc3RbJ3JlZGlyZWN0J107XG4gICAgICByZWZlcnJlciE6IHN0cmluZztcbiAgICAgIHJlZmVycmVyUG9saWN5ITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydyZWZlcnJlclBvbGljeSddO1xuICAgICAgdXJsITogc3RyaW5nO1xuICAgICAga2VlcGFsaXZlITogYm9vbGVhbjtcbiAgICAgIHNpZ25hbCE6IEFib3J0U2lnbmFsO1xuICAgICAgZHVwbGV4ITogJ2hhbGYnO1xuICAgICAgYm9keSE6IFJlYWRhYmxlU3RyZWFtPGFueT4gfCBudWxsO1xuXG4gICAgICBjb25zdHJ1Y3RvcihpbnB1dDogYW55LCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICAgICAgLy8gSGFuZGxlIFVSTCBpbnB1dFxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIHZtR2xvYmFsVGhpcy5VUkwpIHtcbiAgICAgICAgICBjb25zdCB1cmxTdHJpbmcgPSBTdHJpbmcoaW5wdXQpO1xuICAgICAgICAgIC8vIFZhbGlkYXRlIFVSTCBmb3JtYXRcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmV3IHZtR2xvYmFsVGhpcy5VUkwodXJsU3RyaW5nKTtcbiAgICAgICAgICAgIHRoaXMudXJsID0gdXJsU3RyaW5nO1xuICAgICAgICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBGYWlsZWQgdG8gcGFyc2UgVVJMIGZyb20gJHt1cmxTdHJpbmd9YCwge1xuICAgICAgICAgICAgICBjYXVzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJbnB1dCBpcyBhIFJlcXVlc3Qgb2JqZWN0IC0gY2xvbmUgaXRzIHByb3BlcnRpZXNcbiAgICAgICAgICB0aGlzLnVybCA9IGlucHV0LnVybDtcbiAgICAgICAgICBpZiAoIWluaXQpIHtcbiAgICAgICAgICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGlucHV0LmhlYWRlcnMpO1xuICAgICAgICAgICAgdGhpcy5ib2R5ID0gaW5wdXQuYm9keTtcbiAgICAgICAgICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGU7XG4gICAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHM7XG4gICAgICAgICAgICB0aGlzLmNhY2hlID0gaW5wdXQuY2FjaGU7XG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0ID0gaW5wdXQucmVkaXJlY3Q7XG4gICAgICAgICAgICB0aGlzLnJlZmVycmVyID0gaW5wdXQucmVmZXJyZXI7XG4gICAgICAgICAgICB0aGlzLnJlZmVycmVyUG9saWN5ID0gaW5wdXQucmVmZXJyZXJQb2xpY3k7XG4gICAgICAgICAgICB0aGlzLmludGVncml0eSA9IGlucHV0LmludGVncml0eTtcbiAgICAgICAgICAgIHRoaXMua2VlcGFsaXZlID0gaW5wdXQua2VlcGFsaXZlO1xuICAgICAgICAgICAgdGhpcy5zaWduYWwgPSBpbnB1dC5zaWduYWw7XG4gICAgICAgICAgICB0aGlzLmR1cGxleCA9IGlucHV0LmR1cGxleDtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBpbnB1dC5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgaW5pdCBpcyBwcm92aWRlZCwgbWVyZ2U6IHVzZSBzb3VyY2UgcHJvcGVydGllcywgdGhlbiBvdmVycmlkZSB3aXRoIGluaXRcbiAgICAgICAgICAvLyBDb3B5IGFsbCBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZSBSZXF1ZXN0IGZpcnN0XG4gICAgICAgICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2Q7XG4gICAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGlucHV0LmhlYWRlcnMpO1xuICAgICAgICAgIHRoaXMuYm9keSA9IGlucHV0LmJvZHk7XG4gICAgICAgICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZTtcbiAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHM7XG4gICAgICAgICAgdGhpcy5jYWNoZSA9IGlucHV0LmNhY2hlO1xuICAgICAgICAgIHRoaXMucmVkaXJlY3QgPSBpbnB1dC5yZWRpcmVjdDtcbiAgICAgICAgICB0aGlzLnJlZmVycmVyID0gaW5wdXQucmVmZXJyZXI7XG4gICAgICAgICAgdGhpcy5yZWZlcnJlclBvbGljeSA9IGlucHV0LnJlZmVycmVyUG9saWN5O1xuICAgICAgICAgIHRoaXMuaW50ZWdyaXR5ID0gaW5wdXQuaW50ZWdyaXR5O1xuICAgICAgICAgIHRoaXMua2VlcGFsaXZlID0gaW5wdXQua2VlcGFsaXZlO1xuICAgICAgICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsO1xuICAgICAgICAgIHRoaXMuZHVwbGV4ID0gaW5wdXQuZHVwbGV4O1xuICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBpbnB1dC5kZXN0aW5hdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE92ZXJyaWRlIHdpdGggaW5pdCBvcHRpb25zIGlmIHByb3ZpZGVkXG4gICAgICAgIC8vIFNldCBtZXRob2RcbiAgICAgICAgaWYgKGluaXQ/Lm1ldGhvZCkge1xuICAgICAgICAgIHRoaXMubWV0aG9kID0gaW5pdC5tZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5tZXRob2QgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gZGVmYXVsdCBmb3Igc3RyaW5nIGlucHV0IGNhc2VcbiAgICAgICAgICB0aGlzLm1ldGhvZCA9ICdHRVQnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGhlYWRlcnNcbiAgICAgICAgaWYgKGluaXQ/LmhlYWRlcnMpIHtcbiAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoaW5pdC5oZWFkZXJzKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiB2bUdsb2JhbFRoaXMuVVJMXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEZvciBzdHJpbmcvVVJMIGlucHV0LCBjcmVhdGUgZW1wdHkgaGVhZGVyc1xuICAgICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IG90aGVyIHByb3BlcnRpZXMgd2l0aCBpbml0IHZhbHVlcyBvciBkZWZhdWx0c1xuICAgICAgICBpZiAoaW5pdD8ubW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5tb2RlID0gaW5pdC5tb2RlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLm1vZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy5tb2RlID0gJ2NvcnMnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluaXQ/LmNyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5pdC5jcmVkZW50aWFscztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5jcmVkZW50aWFscyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGBhbnlgIGNhc3QgaGVyZSBiZWNhdXNlIEB0eXBlcy9ub2RlIHYyMiBkb2VzIG5vdCB5ZXQgaGF2ZSBgY2FjaGVgXG4gICAgICAgIGlmICgoaW5pdCBhcyBhbnkpPy5jYWNoZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5jYWNoZSA9IChpbml0IGFzIGFueSkuY2FjaGU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuY2FjaGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy5jYWNoZSA9ICdkZWZhdWx0JztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbml0Py5yZWRpcmVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5yZWRpcmVjdCA9IGluaXQucmVkaXJlY3Q7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMucmVkaXJlY3QgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy5yZWRpcmVjdCA9ICdmb2xsb3cnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluaXQ/LnJlZmVycmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnJlZmVycmVyID0gaW5pdC5yZWZlcnJlcjtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5yZWZlcnJlciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLnJlZmVycmVyID0gJ2Fib3V0OmNsaWVudCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5pdD8ucmVmZXJyZXJQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMucmVmZXJyZXJQb2xpY3kgPSBpbml0LnJlZmVycmVyUG9saWN5O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJlZmVycmVyUG9saWN5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMucmVmZXJyZXJQb2xpY3kgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbml0Py5pbnRlZ3JpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuaW50ZWdyaXR5ID0gaW5pdC5pbnRlZ3JpdHk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuaW50ZWdyaXR5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMuaW50ZWdyaXR5ID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5pdD8ua2VlcGFsaXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmtlZXBhbGl2ZSA9IGluaXQua2VlcGFsaXZlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmtlZXBhbGl2ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhpcy5rZWVwYWxpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbml0Py5zaWduYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBBYm9ydFNpZ25hbCBzdHViXG4gICAgICAgICAgdGhpcy5zaWduYWwgPSBpbml0LnNpZ25hbDtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5zaWduYWwpIHtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gQWJvcnRTaWduYWwgc3R1YlxuICAgICAgICAgIHRoaXMuc2lnbmFsID0geyBhYm9ydGVkOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmR1cGxleCkge1xuICAgICAgICAgIHRoaXMuZHVwbGV4ID0gJ2hhbGYnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmRlc3RpbmF0aW9uKSB7XG4gICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9ICdkb2N1bWVudCc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib2R5ID0gaW5pdD8uYm9keTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IEdFVC9IRUFEIG1ldGhvZHMgZG9uJ3QgaGF2ZSBhIGJvZHlcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGJvZHkgIT09IG51bGwgJiZcbiAgICAgICAgICBib2R5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFJlcXVlc3Qgd2l0aCBHRVQvSEVBRCBtZXRob2QgY2Fubm90IGhhdmUgYm9keS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBCb2R5SW5pdCBmb3Igc2VyaWFsaXphdGlvblxuICAgICAgICBpZiAoYm9keSAhPT0gbnVsbCAmJiBib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBcImZha2VcIiBSZWFkYWJsZVN0cmVhbSB0aGF0IHN0b3JlcyB0aGUgb3JpZ2luYWwgYm9keVxuICAgICAgICAgIC8vIFRoaXMgYXZvaWRzIGRvaW5nIGFzeW5jIHdvcmsgZHVyaW5nIHdvcmtmbG93IHJlcGxheVxuICAgICAgICAgIHRoaXMuYm9keSA9IE9iamVjdC5jcmVhdGUodm1HbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgICAgICAgICAgW0JPRFlfSU5JVF9TWU1CT0xdOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBib2R5LFxuICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYm9keSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xvbmUoKTogUmVxdWVzdCB7XG4gICAgICAgIEVOT1RTVVAoKTtcbiAgICAgIH1cblxuICAgICAgZ2V0IGJvZHlVc2VkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGVzZVxuICAgICAgYmxvYiE6ICgpID0+IFByb21pc2U8QmxvYj47XG4gICAgICBmb3JtRGF0YSE6ICgpID0+IFByb21pc2U8Rm9ybURhdGE+O1xuXG4gICAgICBhcnJheUJ1ZmZlciE6ICgpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgICAganNvbiE6ICgpID0+IFByb21pc2U8YW55PjtcbiAgICAgIHRleHQhOiAoKSA9PiBQcm9taXNlPHN0cmluZz47XG5cbiAgICAgIGFzeW5jIGJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgdGhpcy5hcnJheUJ1ZmZlcigpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdm1HbG9iYWxUaGlzLlJlcXVlc3QgPSBSZXF1ZXN0O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVxdWVzdC5wcm90b3R5cGUsIHtcbiAgICAgIGFycmF5QnVmZmVyOiB7XG4gICAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBBcnJheUJ1ZmZlcj4oJ19fYnVpbHRpbl9yZXNwb25zZV9hcnJheV9idWZmZXInKSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBqc29uOiB7XG4gICAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBhbnk+KCdfX2J1aWx0aW5fcmVzcG9uc2VfanNvbicpLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHRleHQ6IHtcbiAgICAgICAgdmFsdWU6IHVzZVN0ZXA8W10sIHN0cmluZz4oJ19fYnVpbHRpbl9yZXNwb25zZV90ZXh0JyksXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY2xhc3MgUmVzcG9uc2UgaW1wbGVtZW50cyBnbG9iYWxUaGlzLlJlc3BvbnNlIHtcbiAgICAgIHR5cGUhOiBnbG9iYWxUaGlzLlJlc3BvbnNlWyd0eXBlJ107XG4gICAgICB1cmwhOiBzdHJpbmc7XG4gICAgICBzdGF0dXMhOiBudW1iZXI7XG4gICAgICBzdGF0dXNUZXh0ITogc3RyaW5nO1xuICAgICAgYm9keSE6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHwgbnVsbDtcbiAgICAgIGhlYWRlcnMhOiBIZWFkZXJzO1xuICAgICAgcmVkaXJlY3RlZCE6IGJvb2xlYW47XG5cbiAgICAgIGNvbnN0cnVjdG9yKGJvZHk/OiBhbnksIGluaXQ/OiBSZXNwb25zZUluaXQpIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBpbml0Py5zdGF0dXMgPz8gMjAwO1xuICAgICAgICB0aGlzLnN0YXR1c1RleHQgPSBpbml0Py5zdGF0dXNUZXh0ID8/ICcnO1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoaW5pdD8uaGVhZGVycyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdkZWZhdWx0JztcbiAgICAgICAgdGhpcy51cmwgPSAnJztcbiAgICAgICAgdGhpcy5yZWRpcmVjdGVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCBudWxsLWJvZHkgc3RhdHVzIGNvZGVzIGRvbid0IGhhdmUgYSBib2R5XG4gICAgICAgIC8vIFBlciBIVFRQIHNwZWM6IDIwNCAoTm8gQ29udGVudCksIDIwNSAoUmVzZXQgQ29udGVudCksIGFuZCAzMDQgKE5vdCBNb2RpZmllZClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGJvZHkgIT09IG51bGwgJiZcbiAgICAgICAgICBib2R5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAodGhpcy5zdGF0dXMgPT09IDIwNCB8fCB0aGlzLnN0YXR1cyA9PT0gMjA1IHx8IHRoaXMuc3RhdHVzID09PSAzMDQpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBgUmVzcG9uc2UgY29uc3RydWN0b3I6IEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgJHt0aGlzLnN0YXR1c31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBCb2R5SW5pdCBmb3Igc2VyaWFsaXphdGlvblxuICAgICAgICBpZiAoYm9keSAhPT0gbnVsbCAmJiBib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBcImZha2VcIiBSZWFkYWJsZVN0cmVhbSB0aGF0IHN0b3JlcyB0aGUgb3JpZ2luYWwgYm9keVxuICAgICAgICAgIC8vIFRoaXMgYXZvaWRzIGRvaW5nIGFzeW5jIHdvcmsgZHVyaW5nIHdvcmtmbG93IHJlcGxheVxuICAgICAgICAgIHRoaXMuYm9keSA9IE9iamVjdC5jcmVhdGUodm1HbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgICAgICAgICAgW0JPRFlfSU5JVF9TWU1CT0xdOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBib2R5LFxuICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYm9keSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoZXNlXG4gICAgICBjbG9uZSE6ICgpID0+IFJlc3BvbnNlO1xuICAgICAgYmxvYiE6ICgpID0+IFByb21pc2U8Z2xvYmFsVGhpcy5CbG9iPjtcbiAgICAgIGZvcm1EYXRhITogKCkgPT4gUHJvbWlzZTxnbG9iYWxUaGlzLkZvcm1EYXRhPjtcblxuICAgICAgZ2V0IG9rKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwO1xuICAgICAgfVxuXG4gICAgICBnZXQgYm9keVVzZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgYXJyYXlCdWZmZXIhOiAoKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICAgIGpzb24hOiAoKSA9PiBQcm9taXNlPGFueT47XG4gICAgICB0ZXh0ITogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgICBhc3luYyBieXRlcygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IHRoaXMuYXJyYXlCdWZmZXIoKSk7XG4gICAgICB9XG5cbiAgICAgIHN0YXRpYyBqc29uKGRhdGE6IGFueSwgaW5pdD86IFJlc3BvbnNlSW5pdCk6IFJlc3BvbnNlIHtcbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGluaXQ/LmhlYWRlcnMpO1xuICAgICAgICBpZiAoIWhlYWRlcnMuaGFzKCdjb250ZW50LXR5cGUnKSkge1xuICAgICAgICAgIGhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoYm9keSwgeyAuLi5pbml0LCBoZWFkZXJzIH0pO1xuICAgICAgfVxuXG4gICAgICBzdGF0aWMgZXJyb3IoKTogUmVzcG9uc2Uge1xuICAgICAgICBFTk9UU1VQKCk7XG4gICAgICB9XG5cbiAgICAgIHN0YXRpYyByZWRpcmVjdCh1cmw6IHN0cmluZyB8IFVSTCwgc3RhdHVzOiBudW1iZXIgPSAzMDIpOiBSZXNwb25zZSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIHN0YXR1cyBjb2RlIC0gb25seSBzcGVjaWZpYyByZWRpcmVjdCBjb2RlcyBhcmUgYWxsb3dlZFxuICAgICAgICBpZiAoIVszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF0uaW5jbHVkZXMoc3RhdHVzKSkge1xuICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgcmVkaXJlY3Qgc3RhdHVzIGNvZGU6ICR7c3RhdHVzfS4gTXVzdCBiZSBvbmUgb2Y6IDMwMSwgMzAyLCAzMDMsIDMwNywgMzA4YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgcmVzcG9uc2Ugd2l0aCBMb2NhdGlvbiBoZWFkZXJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycygpO1xuICAgICAgICBoZWFkZXJzLnNldCgnTG9jYXRpb24nLCBTdHJpbmcodXJsKSk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBPYmplY3QuY3JlYXRlKFJlc3BvbnNlLnByb3RvdHlwZSk7XG4gICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzVGV4dCA9ICcnO1xuICAgICAgICByZXNwb25zZS5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgcmVzcG9uc2UuYm9keSA9IG51bGw7XG4gICAgICAgIHJlc3BvbnNlLnR5cGUgPSAnZGVmYXVsdCc7XG4gICAgICAgIHJlc3BvbnNlLnVybCA9ICcnO1xuICAgICAgICByZXNwb25zZS5yZWRpcmVjdGVkID0gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfVxuICAgIH1cbiAgICB2bUdsb2JhbFRoaXMuUmVzcG9uc2UgPSBSZXNwb25zZTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlc3BvbnNlLnByb3RvdHlwZSwge1xuICAgICAgYXJyYXlCdWZmZXI6IHtcbiAgICAgICAgdmFsdWU6IHVzZVN0ZXA8W10sIEFycmF5QnVmZmVyPignX19idWlsdGluX3Jlc3BvbnNlX2FycmF5X2J1ZmZlcicpLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIGpzb246IHtcbiAgICAgICAgdmFsdWU6IHVzZVN0ZXA8W10sIGFueT4oJ19fYnVpbHRpbl9yZXNwb25zZV9qc29uJyksXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9LFxuICAgICAgdGV4dDoge1xuICAgICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgc3RyaW5nPignX19idWlsdGluX3Jlc3BvbnNlX3RleHQnKSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjbGFzcyBSZWFkYWJsZVN0cmVhbTxUPiBpbXBsZW1lbnRzIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VD4ge1xuICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIEVOT1RTVVAoKTtcbiAgICAgIH1cblxuICAgICAgZ2V0IGxvY2tlZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjYW5jZWwoKTogYW55IHtcbiAgICAgICAgRU5PVFNVUCgpO1xuICAgICAgfVxuXG4gICAgICBnZXRSZWFkZXIoKTogYW55IHtcbiAgICAgICAgRU5PVFNVUCgpO1xuICAgICAgfVxuXG4gICAgICBwaXBlVGhyb3VnaCgpOiBhbnkge1xuICAgICAgICBFTk9UU1VQKCk7XG4gICAgICB9XG5cbiAgICAgIHBpcGVUbygpOiBhbnkge1xuICAgICAgICBFTk9UU1VQKCk7XG4gICAgICB9XG5cbiAgICAgIHRlZSgpOiBhbnkge1xuICAgICAgICBFTk9UU1VQKCk7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlcygpOiBhbnkge1xuICAgICAgICBFTk9UU1VQKCk7XG4gICAgICB9XG5cbiAgICAgIHN0YXRpYyBmcm9tKCk6IGFueSB7XG4gICAgICAgIEVOT1RTVVAoKTtcbiAgICAgIH1cblxuICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBhbnkge1xuICAgICAgICBFTk9UU1VQKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZtR2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbSA9IFJlYWRhYmxlU3RyZWFtO1xuXG4gICAgY2xhc3MgV3JpdGFibGVTdHJlYW08VD4gaW1wbGVtZW50cyBnbG9iYWxUaGlzLldyaXRhYmxlU3RyZWFtPFQ+IHtcbiAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBFTk9UU1VQKCk7XG4gICAgICB9XG5cbiAgICAgIGdldCBsb2NrZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgYWJvcnQoKTogYW55IHtcbiAgICAgICAgRU5PVFNVUCgpO1xuICAgICAgfVxuXG4gICAgICBjbG9zZSgpOiBhbnkge1xuICAgICAgICBFTk9UU1VQKCk7XG4gICAgICB9XG5cbiAgICAgIGdldFdyaXRlcigpOiBhbnkge1xuICAgICAgICBFTk9UU1VQKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZtR2xvYmFsVGhpcy5Xcml0YWJsZVN0cmVhbSA9IFdyaXRhYmxlU3RyZWFtO1xuXG4gICAgY2xhc3MgVHJhbnNmb3JtU3RyZWFtPEksIE8+IGltcGxlbWVudHMgZ2xvYmFsVGhpcy5UcmFuc2Zvcm1TdHJlYW08SSwgTz4ge1xuICAgICAgcmVhZGFibGU6IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08Tz47XG4gICAgICB3cml0YWJsZTogZ2xvYmFsVGhpcy5Xcml0YWJsZVN0cmVhbTxJPjtcblxuICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIEVOT1RTVVAoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdm1HbG9iYWxUaGlzLlRyYW5zZm9ybVN0cmVhbSA9IFRyYW5zZm9ybVN0cmVhbTtcblxuICAgIC8vIEV2ZW50dWFsbHkgd2UnbGwgcHJvYmFibHkgd2FudCB0byBwcm92aWRlIG91ciBvd24gYGNvbnNvbGVgIG9iamVjdCxcbiAgICAvLyBidXQgZm9yIG5vdyB3ZSdsbCBqdXN0IGV4cG9zZSB0aGUgZ2xvYmFsIG9uZS5cbiAgICB2bUdsb2JhbFRoaXMuY29uc29sZSA9IGdsb2JhbFRoaXMuY29uc29sZTtcblxuICAgIC8vIEhBQ0s6IHByb3BhZ2F0ZSBzeW1ib2wgbmVlZGVkIGZvciBBSSBnYXRld2F5IHVzYWdlXG4gICAgY29uc3QgU1lNQk9MX0ZPUl9SRVFfQ09OVEVYVCA9IFN5bWJvbC5mb3IoJ0B2ZXJjZWwvcmVxdWVzdC1jb250ZXh0Jyk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gICAgdm1HbG9iYWxUaGlzW1NZTUJPTF9GT1JfUkVRX0NPTlRFWFRdID0gKGdsb2JhbFRoaXMgYXMgYW55KVtcbiAgICAgIFNZTUJPTF9GT1JfUkVRX0NPTlRFWFRcbiAgICBdO1xuXG4gICAgLy8gR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB1c2VyLWRlZmluZWQgd29ya2Zsb3cgZnVuY3Rpb24uXG4gICAgLy8gVGhlIGZpbGVuYW1lIHBhcmFtZXRlciBlbnN1cmVzIHN0YWNrIHRyYWNlcyBzaG93IGEgbWVhbmluZ2Z1bCBuYW1lXG4gICAgLy8gKGUuZy4sIFwiZXhhbXBsZS93b3JrZmxvd3MvOTlfZTJlLnRzXCIpIGluc3RlYWQgb2YgXCJldmFsbWFjaGluZS48YW5vbnltb3VzPlwiLlxuICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93UnVuLndvcmtmbG93TmFtZTtcblxuICAgIGNvbnN0IHdvcmtmbG93Rm4gPSBydW5JbkNvbnRleHQoXG4gICAgICBgJHt3b3JrZmxvd0NvZGV9OyBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3M/LmdldCgke0pTT04uc3RyaW5naWZ5KHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSl9KWAsXG4gICAgICBjb250ZXh0LFxuICAgICAgeyBmaWxlbmFtZSB9XG4gICAgKTtcblxuICAgIGlmICh0eXBlb2Ygd29ya2Zsb3dGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gQ2hhaW4gd29ya2Zsb3cgYXJndW1lbnQgaHlkcmF0aW9uIG9udG8gdGhlIHByb21pc2VRdWV1ZSBzbyB0aGF0IHRoZVxuICAgIC8vIHVuY29uc3VtZWQgZXZlbnQgY2hlY2sgKHdoaWNoIHdhaXRzIGZvciB0aGUgcXVldWUgdG8gZHJhaW4pIGRvZXNuJ3RcbiAgICAvLyBmaXJlIGR1cmluZyB0aGUgYXN5bmMgZ2FwIGJldHdlZW4gcnVuX3N0YXJ0ZWQgY29uc3VtcHRpb24gYW5kIHRoZVxuICAgIC8vIHdvcmtmbG93IGZ1bmN0aW9uIHN1YnNjcmliaW5nIGl0cyBmaXJzdCBzdGVwIGNhbGxiYWNrcy5cbiAgICBsZXQgYXJnczogdW5rbm93bltdID0gW107XG4gICAgd29ya2Zsb3dDb250ZXh0LnByb21pc2VRdWV1ZSA9IHdvcmtmbG93Q29udGV4dC5wcm9taXNlUXVldWUudGhlbihcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXJncyA9IGF3YWl0IGh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgICAgICAgICB3b3JrZmxvd1J1bi5pbnB1dCxcbiAgICAgICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgIHZtR2xvYmFsVGhpc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG4gICAgYXdhaXQgd29ya2Zsb3dDb250ZXh0LnByb21pc2VRdWV1ZTtcblxuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93QXJndW1lbnRzQ291bnQoYXJncy5sZW5ndGgpLFxuICAgIH0pO1xuXG4gICAgLy8gSW52b2tlIHVzZXIgd29ya2Zsb3dcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgd29ya2Zsb3dGbiguLi5hcmdzKSxcbiAgICAgICAgd29ya2Zsb3dEaXNjb250aW51YXRpb24ucHJvbWlzZSxcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCBkZWh5ZHJhdGVkID0gYXdhaXQgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgdm1HbG9iYWxUaGlzXG4gICAgICApO1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UmVzdWx0VHlwZSh0eXBlb2YgcmVzdWx0KSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zKFxuICAgICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgd29ya2Zsb3dDb250ZXh0Lmludm9jYXRpb25zUXVldWUsXG4gICAgICAgIHZtR2xvYmFsVGhpcyxcbiAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICdjb21wbGV0ZWQnXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gZGVoeWRyYXRlZDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIExldCBXb3JrZmxvd1N1c3BlbnNpb24gcHJvcGFnYXRlIOKAlCBoYW5kbGVkIHNlcGFyYXRlbHkgYnkgdGhlIHJ1bnRpbWVcbiAgICAgIGlmIChXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyKSkge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRyYWluUGVuZGluZ1F1ZXVlSXRlbXMoXG4gICAgICAgIHdvcmtmbG93UnVuLnJ1bklkLFxuICAgICAgICB3b3JrZmxvd0NvbnRleHQuaW52b2NhdGlvbnNRdWV1ZSxcbiAgICAgICAgdm1HbG9iYWxUaGlzLFxuICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgJ2ZhaWxlZCdcbiAgICAgICk7XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH0pO1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow/core",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.8",
|
|
4
4
|
"description": "Core runtime and engine for Workflow SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -89,12 +89,12 @@
|
|
|
89
89
|
"semver": "7.7.4",
|
|
90
90
|
"ulid": "~3.0.1",
|
|
91
91
|
"zod": "4.3.6",
|
|
92
|
-
"@workflow/errors": "5.0.0-beta.
|
|
93
|
-
"@workflow/serde": "5.0.0-beta.
|
|
94
|
-
"@workflow/utils": "5.0.0-beta.
|
|
95
|
-
"@workflow/world": "5.0.0-beta.
|
|
96
|
-
"@workflow/world-local": "5.0.0-beta.
|
|
97
|
-
"@workflow/world-vercel": "5.0.0-beta.
|
|
92
|
+
"@workflow/errors": "5.0.0-beta.5",
|
|
93
|
+
"@workflow/serde": "5.0.0-beta.2",
|
|
94
|
+
"@workflow/utils": "5.0.0-beta.3",
|
|
95
|
+
"@workflow/world": "5.0.0-beta.5",
|
|
96
|
+
"@workflow/world-local": "5.0.0-beta.7",
|
|
97
|
+
"@workflow/world-vercel": "5.0.0-beta.7"
|
|
98
98
|
},
|
|
99
99
|
"devDependencies": {
|
|
100
100
|
"@opentelemetry/api": "1.9.0",
|