@workflow/core 5.0.0-beta.42 → 5.0.0-beta.43
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/create-hook.d.ts +9 -5
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/private.d.ts +31 -12
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +147 -23
- package/dist/runtime/constants.d.ts +27 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +33 -1
- package/dist/runtime/quickjs-entrypoint.d.ts +2 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +3 -2
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +54 -29
- package/dist/runtime/step-executor.d.ts +49 -1
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +67 -8
- package/dist/runtime/step-latency.d.ts +6 -0
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +3 -1
- package/dist/runtime/suspension-handler.d.ts +81 -1
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +501 -15
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +126 -16
- package/dist/serialization.d.ts +10 -2
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +48 -6
- package/dist/telemetry.d.ts +6 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +22 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/create-hook.js +2 -2
- package/dist/workflow/hook.js +3 -3
- package/dist/workflow.js +16 -8
- package/docs/foundations/hooks.mdx +2 -2
- package/docs/foundations/streaming.mdx +24 -0
- package/docs/how-it-works/event-sourcing.mdx +39 -1
- package/package.json +4 -4
|
@@ -193,5 +193,11 @@ export declare function computeStepLatencyEventData(params: {
|
|
|
193
193
|
lazyStepStart: boolean;
|
|
194
194
|
/** Whether the body ran optimistically, without awaiting step_started. */
|
|
195
195
|
optimisticStart: boolean;
|
|
196
|
+
/**
|
|
197
|
+
* Whether the step's `step_created` + `step_started` pair was pre-claimed
|
|
198
|
+
* inside the suspension handler's batched fan-out write (no start POST of
|
|
199
|
+
* its own at all).
|
|
200
|
+
*/
|
|
201
|
+
preclaimedStart?: boolean;
|
|
196
202
|
}): StepLatencyEventData | undefined;
|
|
197
203
|
//# sourceMappingURL=step-latency.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-latency.d.ts","sourceRoot":"","sources":["../../src/runtime/step-latency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;CAChB;AAYD,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAkCD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,wEAAwE;IACxE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB;;;;;;;;OAQG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,0EAA0E;IAC1E,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,2BAA2B,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD;;;;;OAKG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,mBAAmB,GAAG,SAAS,CAuFlC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,QAAQ,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC1C,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,aAAa,EAAE,OAAO,CAAC;IACvB,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"step-latency.d.ts","sourceRoot":"","sources":["../../src/runtime/step-latency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;CAChB;AAYD,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAkCD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,wEAAwE;IACxE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB;;;;;;;;OAQG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,0EAA0E;IAC1E,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,2BAA2B,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD;;;;;OAKG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,mBAAmB,GAAG,SAAS,CAuFlC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,QAAQ,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC1C,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,aAAa,EAAE,OAAO,CAAC;IACvB,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,oBAAoB,GAAG,SAAS,CAqFnC"}
|
|
@@ -190,6 +190,8 @@ export function computeStepLatencyEventData(params) {
|
|
|
190
190
|
optimizations.push('lazyStepStart');
|
|
191
191
|
if (params.optimisticStart)
|
|
192
192
|
optimizations.push('optimisticStart');
|
|
193
|
+
if (params.preclaimedStart)
|
|
194
|
+
optimizations.push('preclaimedStart');
|
|
193
195
|
return {
|
|
194
196
|
...(ttfs !== undefined ? { ttfs } : {}),
|
|
195
197
|
...(stso !== undefined ? { stso } : {}),
|
|
@@ -204,4 +206,4 @@ export function computeStepLatencyEventData(params) {
|
|
|
204
206
|
optimizations,
|
|
205
207
|
};
|
|
206
208
|
}
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1sYXRlbmN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1sYXRlbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQThGQTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFvQmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLDhCQUE4QixHQUFvQyxJQUFJLEdBQUcsQ0FDN0U7SUFDRSxjQUFjO0lBQ2QsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsZUFBZTtJQUNmLGVBQWU7SUFDZixjQUFjO0lBQ2QsZ0JBQWdCO0NBQ2pCLENBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxNQXdEMUM7SUFDQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTFCLElBQUksWUFBWSxHQUNkLE1BQU0sQ0FBQyxzQkFBc0I7UUFDN0IsTUFBTSxDQUFDLGNBQWMsS0FBSyxTQUFTO1FBQ25DLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQzdCLElBQUksa0JBQXNDLENBQUM7SUFDM0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksOEJBQThCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixNQUFNO1lBQ1IsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzRCxrQkFBa0I7b0JBQ2hCLGtCQUFrQixLQUFLLFNBQVM7d0JB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QUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxTQUFTLEtBQUssU0FBUztZQUN4RCxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNuQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQ3pELENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFO1lBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pFLGFBQWE7S0FDZCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRXZlbnQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIENsaWVudC1zaWRlIGxhdGVuY3kgbWVhc3VyZW1lbnQgKFRURlMgLyBTVFNPIC8gUlNGUykgdGhyZWFkZWQgZnJvbSB0aGVcbiAqIG9yY2hlc3RyYXRvcidzIGlubGluZSBleGVjdXRpb24gcGF0aCBpbnRvIGBleGVjdXRlU3RlcGAuXG4gKlxuICogVFRGUyAodGltZS10by1maXJzdC1zdGVwKSBtZWFzdXJlcyBydW4gY3JlYXRpb24g4oaSIHRoZSBmaXJzdCBzdGVwJ3MgYm9keVxuICogYmVnaW5uaW5nIHRvIGV4ZWN1dGUuIFNUU08gKHN0ZXAtdG8tc3RlcCBvdmVyaGVhZCkgbWVhc3VyZXMgdGhlIHByZXZpb3VzXG4gKiBzdGVwJ3MgdGVybWluYWwgZXZlbnQg4oaSIHRoZSBuZXh0IHN0ZXAncyBib2R5IGJlZ2lubmluZyB0byBleGVjdXRlLiBSU0ZTXG4gKiAocnVuLXN0YXJ0ZWQtdG8tZmlyc3Qtc3RlcCkgbWVhc3VyZXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZGluZyDihpJcbiAqIHRoZSBmaXJzdCBzdGVwJ3Mgc3RhcnQgUE9TVCBiZWluZyBpc3N1ZWQg4oCUIGEgc3ViLXdpbmRvdyBvZiBUVEZTIHRoYXRcbiAqIGlzb2xhdGVzIHJlcGxheSBvdmVyaGVhZCBmcm9tIHRoZSBydW4tY3JlYXRpb24gcXVldWUgaG9wOyBgZmluYWxTY2hlZHVsaW5nUmVwbGF5YFxuICogaXMgdGhlIHN5bmNocm9ub3VzIHdvcmtmbG93LWZ1bmN0aW9uLWV4ZWN1dGlvbiBkdXJhdGlvbiBvZiBvbmx5IHRoZSBGSU5BTFxuICogcmVwbGF5IHBhc3Mgd2l0aGluIHRoYXQgd2luZG93ICh0aGUgcGFzcyB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAqIGZpcnN0IHN0ZXApIOKAlCBpdCBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzIGVhcmxpZXIgcHJlLWZpcnN0LXN0ZXAgcGFzc2VzXG4gKiAoc2VlIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfSksIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXMgXCJ0aGVcbiAqIHJlcGxheSBwb3J0aW9uIG9mIFJTRlNcIi4gQWxsIGFyZSBhdHRhY2hlZCB0byB0aGUgc3RlcCdzIHRlcm1pbmFsXG4gKiBldmVudCBzbyBhIGJhY2tlbmQgY2FuIGVtaXQgbGF0ZW5jeSBtZXRyaWNzIGZyb20gdGhlIGV2ZW50IHdyaXRlIGFsb25lLFxuICogd2l0aG91dCBleHRyYSBldmVudC1sb2cgcXVlcmllcy5cbiAqXG4gKiBFbGlnaWJpbGl0eSBpcyBkZWNpZGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IgKHdoaWNoIG93bnMgdGhlIGV2ZW50IGxvZykgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9OyB0aGUgZmluYWwgdmFsdWVzIGFyZSBjb21wdXRlZCBieVxuICogYGV4ZWN1dGVTdGVwYCByaWdodCBiZWZvcmUgdXNlciBjb2RlIHJ1bnMgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeVRyYWNraW5nIHtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIG9mIHJ1biBjcmVhdGlvbiAoZnJvbSB0aGUgcnVuLWlkIFVMSUQsIGZhbGxpbmcgYmFjayB0byB0aGUgcnVuXG4gICAqIHNuYXBzaG90J3MgYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFRURlMuXG4gICAqL1xuICB0dGZzQW5jaG9yTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXYWxsLWNsb2NrIG1zIHRoaXMgaW52b2NhdGlvbiBzcGVudCBjb21taXR0aW5nIGBob29rX2NyZWF0ZWRgIGV2ZW50c1xuICAgKiBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAgKGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBhaGVhZCBvZiB0aGUgZmlyc3RcbiAgICogc3RlcCBjb21taXRzIGluIHRoZSBzYW1lIHN1c3BlbnNpb24gYmF0Y2gpLiBTdWJ0cmFjdGVkIGZyb20gVFRGUyBzbyB0aGVcbiAgICogbWV0cmljIHJlZmxlY3RzIHJ1bnRpbWUgb3ZlcmhlYWQgcmF0aGVyIHRoYW4gdGhlIHVzZXIncyBob29rIHdyaXRlcy5cbiAgICovXG4gIHByZVN0ZXBCbG9ja2luZ01zPzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGZpcnN0IHByZS1zdGVwIGBhdHRyX3NldGAgd3JpdGUgYmVnYW4gKGl0cyBjbGllbnQtc3RhbXBlZFxuICAgKiBgb2NjdXJyZWRBdGAsIGZhbGxpbmcgYmFjayB0byBgY3JlYXRlZEF0YCkuIFdoZW4gcHJlc2VudCwgdGhlIFRURlNcbiAgICogbWVhc3VyZW1lbnQgRU5EUyBoZXJlIGluc3RlYWQgb2YgYXQgdGhlIHN0ZXAncyBjb2RlIHN0YXJ0OiBhXG4gICAqIHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcFxuICAgKiByZXNvbHZlcyB0aHJvdWdoIGFuIGV4dHJhIHJlcGxheSAoc2VlIHRoZSBgaGFzQXR0cmlidXRlRXZlbnRzYCBicmFuY2ggaW5cbiAgICogcnVudGltZS50cyksIHNvIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHdyaXRlIHVudGlsIHRoZSBzdGVwIGJvZHkgcnVucyBpc1xuICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIHNldEF0dHJpYnV0ZXMgY2FsbCDigJQgd2hpY2ggaXMgc3VidHJhY3RlZCBieSBlbmRpbmdcbiAgICogdGhlIG1lYXN1cmVtZW50IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgc3RlcCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBiZWVuXG4gICAqIHNjaGVkdWxlZC5cbiAgICovXG4gIHByZVN0ZXBBdHRyU3RhcnRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIHRoZSBwcmV2aW91cyBzdGVwJ3MgdGVybWluYWwgZXZlbnQgd2FzIHJlY29yZGVkIChpdHNcbiAgICogY2xpZW50LXN0YW1wZWQgYG9jY3VycmVkQXRgLCBmYWxsaW5nIGJhY2sgdG8gYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHlcbiAgICogd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFNUU08uXG4gICAqL1xuICBwcmV2U3RlcEVuZE1zPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIHVuaXF1ZSB0ZXJtaW5hbCBzdGVwcyBhbHJlYWR5IGluIHRoZSBldmVudCBsb2cuICovXG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBldmVudHMgYWxyZWFkeSBpbiB0aGUgZXZlbnQgbG9nLiAqL1xuICBldmVudENvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLLlxuICAgKiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFJTRlMg4oCUIHRoZSBzYW1lIGVsaWdpYmlsaXR5IGFzXG4gICAqIFRURlMgKHNlZSB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9KSwgcGx1cyBhIHJlY292ZXJhYmxlXG4gICAqIGFuY2hvci4gSW4gdHVyYm8gbW9kZSwgYHJ1bl9zdGFydGVkYCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICogYXdhaXRlZCwgc28gdGhpcyBpcyBzdGFtcGVkIGF0IHRoZSBwb2ludCB0aGUgcnVudGltZSBzeW50aGVzaXplcyB0aGVcbiAgICogcnVuIGxvY2FsbHkgYW5kIGJlZ2lucyByZXBsYXkgaW5zdGVhZCBvZiBhdCB0aGUgcmVhbCByZXNwb25zZTsgdGhlXG4gICAqIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUIGlzIHN0aWxsIGNoYWluZWQgb24gdGhlIHJlYWwgYHJ1bl9zdGFydGVkYFxuICAgKiBwcm9taXNlIChzZWUgc3RlcC1leGVjdXRvci50cyksIHNvIFJTRlMgc3RpbGwgZW5kcyB1cCBtZWFzdXJpbmcgdGhlXG4gICAqIGdlbnVpbmUgcnVuX3N0YXJ0ZWQtdG8tZmlyc3Qtc3RlcC1QT1NUIHN0cmV0Y2ggZXZlbiB0aG91Z2ggdGhlIHR3b1xuICAgKiBoYWx2ZXMgb3ZlcmxhcCB1bmRlciB0dXJiby5cbiAgICovXG4gIHJzZnNBbmNob3JNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdhbGwtY2xvY2sgbXMgdGhpcyBpbnZvY2F0aW9uJ3Mgc3luY2hyb25vdXMgd29ya2Zsb3ctZnVuY3Rpb24gcmVwbGF5XG4gICAqIHRvb2s6IGZyb20gY2FsbGluZyBgcnVuV29ya2Zsb3dgIHRvIGl0IHRocm93aW5nIHRoZSBzdXNwZW5zaW9uIHRoYXRcbiAgICogc2NoZWR1bGVkIHRoaXMgYmF0Y2guIEV4Y2x1ZGVzIGF3YWl0ZWQgbmV0d29yayBJL08gKHRoZSBzdXNwZW5zaW9uJ3NcbiAgICogZXZlbnQgY29tbWl0cywgdGhlIHN0ZXAncyBvd24gc3RhcnQgUE9TVCkuIFByZXNlbnQgb25seSBhbG9uZ3NpZGVcbiAgICogYHJzZnNBbmNob3JNc2AuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIEZJTkFMIHJlcGxheSBwYXNzIG9ubHkg4oCUIHRoZSBpbnZvY2F0aW9uIHRoYXQgcmVhY2hlZCBhbmRcbiAgICogc2NoZWR1bGVkIHRoZSBmaXJzdCBzdGVwLiBWYWxpZCBSU0ZTIHBhdGhzIGNhbiByZXBsYXkgbW9yZSB0aGFuIG9uY2VcbiAgICogYmVmb3JlIHRoZSBmaXJzdCBzdGVwIChlLmcuIGEgd29ya2Zsb3ctYm9keSBgc2V0QXR0cmlidXRlcygpYCBkZXRvdXJcbiAgICogcmVwbGF5cyB0d2ljZSksIGFuZCBhIHJlZGVsaXZlcnkgb21pdHMgZWFybGllciBpbnZvY2F0aW9ucycgcmVwbGF5IHdvcmtcbiAgICogZW50aXJlbHk7IHRoaXMgdmFsdWUgaXMgbm90IGFjY3VtdWxhdGVkIGFjcm9zcyB0aG9zZSBlYXJsaWVyIHBhc3Nlcy5cbiAgICogRG8gbm90IHJlYWQgaXQgYXMgXCJ0aGUgcmVwbGF5IHBvcnRpb24gb2YgUlNGU1wiIOKAlCBSU0ZTXG4gICAqICh7QGxpbmsgcnNmc0FuY2hvck1zfSkgY292ZXJzIHRoZSB3aG9sZSBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwXG4gICAqIHdpbmRvdywgdGhpcyBjb3ZlcnMgb25seSB0aGUgbGFzdCBwYXNzLlxuICAgKi9cbiAgcmVwbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1vc3QgbmVnYXRpdmUgcmF3IGR1cmF0aW9uIHN0aWxsIGF0dHJpYnV0ZWQgdG8gY3Jvc3MtbWFjaGluZSBjbG9jayBza2V3XG4gKiAoYW5kIGNsYW1wZWQgdG8gMCkuIEFueXRoaW5nIG1vcmUgbmVnYXRpdmUgbWVhbnMgYSBjb3JydXB0IGFuY2hvciDigJQgZS5nLiBhXG4gKiBtaXMtZGVjb2RlZCBydW4tSUQgdGltZXN0YW1wIOKAlCBhbmQgdGhlIHNhbXBsZSBpcyBkcm9wcGVkIGluc3RlYWQ6IGFcbiAqIHN5c3RlbWF0aWNhbGx5IGNvcnJ1cHQgYW5jaG9yIHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYW4gZXhhY3QtemVybyBsYXRlbmN5XG4gKiBvbiBldmVyeSBzYW1wbGUsIHNpbGVudGx5IGRyYWdnaW5nIGVudGlyZSBwZXJjZW50aWxlIGRpc3RyaWJ1dGlvbnMgdG8gMFxuICogcmF0aGVyIHRoYW4gc3VyZmFjaW5nIGFzIG1pc3NpbmcgZGF0YS5cbiAqL1xuY29uc3QgTUFYX0NMT0NLX1NLRVdfTVMgPSA2MF8wMDA7XG5cbi8qKiBMYXRlbmN5IHRlbGVtZXRyeSBhdHRhY2hlZCB0byBhIHN0ZXAncyB0ZXJtaW5hbCBldmVudCdzIGBldmVudERhdGFgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeUV2ZW50RGF0YSB7XG4gIHR0ZnM/OiBudW1iZXI7XG4gIHN0c28/OiBudW1iZXI7XG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgZXZlbnRDb3VudD86IG51bWJlcjtcbiAgLyoqIENsaWVudC1tZWFzdXJlZCBydW5fc3RhcnRlZCDihpIgZmlyc3Qgc3RlcCdzIHN0YXJ0IFBPU1QsIG1zLiAqL1xuICByc2ZzPzogbnVtYmVyO1xuICAvKipcbiAgICogQ2xpZW50LW1lYXN1cmVkIHdhbGwtY2xvY2sgbXMgb2YgdGhlIEZJTkFMIHJlcGxheSBwYXNzIHRoYXQgc2NoZWR1bGVkXG4gICAqIHRoZSBmaXJzdCBzdGVwIChzZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXN9KSDigJQgbm90XG4gICAqIGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHByZS1maXJzdC1zdGVwIHBhc3Nlcywgc28gaXQgbXVzdCBub3QgYmVcbiAgICogcmVhZCBhcyBcInRoZSByZXBsYXkgcG9ydGlvbiBvZiBgcnNmc2BcIi5cbiAgICovXG4gIGZpbmFsU2NoZWR1bGluZ1JlcGxheT86IG51bWJlcjtcbiAgb3B0aW1pemF0aW9ucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEV2ZW50IHR5cGVzIHRoYXQgZGlzcXVhbGlmeSBUVEZTIHdoZW4gcHJlc2VudCBpbiB0aGUgZXZlbnQgbG9nIGF0IHRoZSB0aW1lXG4gKiB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBiYXRjaCBpcyBzY2hlZHVsZWQ6XG4gKlxuICogLSBBbnkgc3RlcCBldmVudCBtZWFucyB0aGlzIGlzIG5vdCB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBleGVjdXRpb24uXG4gKiAtIGBob29rX3JlY2VpdmVkYCAvIGB3YWl0X2NyZWF0ZWRgIC8gYHdhaXRfY29tcGxldGVkYCBtZWFuIHRoZSBydW4ncyBwYXRoIHRvXG4gKiAgIHRoZSBmaXJzdCBzdGVwIGRlcGVuZGVkIG9uIHVzZXItZHJpdmVuIHRpbWluZyAoYSB3ZWJob29rIGFycml2aW5nLCBhXG4gKiAgIHNsZWVwIGVsYXBzaW5nKSwgc28gdGhlIG1lYXN1cmVtZW50IHdvdWxkIG5vdCByZWZsZWN0IHJ1bnRpbWUgb3ZlcmhlYWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGFic2VudCwgd2l0aCB0aGVpciBjb3N0IHN1YnRyYWN0ZWQgaW5zdGVhZDpcbiAqXG4gKiAtIGBob29rX2NyZWF0ZWRgOiBhIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBiZWZvcmUgdGhlIGZpcnN0IHN0ZXBcbiAqICAgY29tbWl0cyBpbiB0aGUgc2FtZSBpbnZvY2F0aW9uLCB3aG9zZSBtZWFzdXJlZCBkdXJhdGlvbiBpcyBzdWJ0cmFjdGVkIHZpYVxuICogICB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQmxvY2tpbmdNc30uXG4gKiAtIGBhdHRyX3NldGAgKHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgKTogcmVzb2x2ZXMgdGhyb3VnaFxuICogICBhbiBleHRyYSByZXBsYXkgYmVmb3JlIHN0ZXBzIHJ1bi4gU3VidHJhY3RlZCBieSBlbmRpbmcgdGhlIG1lYXN1cmVtZW50IGF0XG4gKiAgIHRoZSBmaXJzdCBhdHRyIHdyaXRlJ3MgdGltZXN0YW1wIGluc3RlYWQg4oCUIHNlZVxuICogICB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQXR0clN0YXJ0TXN9LlxuICovXG5jb25zdCBUVEZTX0RJU1FVQUxJRllJTkdfRVZFTlRfVFlQRVM6IFJlYWRvbmx5U2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFxuICBbXG4gICAgJ3N0ZXBfY3JlYXRlZCcsXG4gICAgJ3N0ZXBfc3RhcnRlZCcsXG4gICAgJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAnc3RlcF9mYWlsZWQnLFxuICAgICdzdGVwX3JldHJ5aW5nJyxcbiAgICAnaG9va19yZWNlaXZlZCcsXG4gICAgJ3dhaXRfY3JlYXRlZCcsXG4gICAgJ3dhaXRfY29tcGxldGVkJyxcbiAgXVxuKTtcblxuLyoqXG4gKiBEZWNpZGUsIGZyb20gdGhlIG9yY2hlc3RyYXRvcidzIHZpZXcgb2YgdGhlIGV2ZW50IGxvZywgd2hldGhlciB0aGUgaW5saW5lXG4gKiBzdGVwIGJhdGNoIGFib3V0IHRvIGV4ZWN1dGUgcXVhbGlmaWVzIGZvciBUVEZTIGFuZC9vciBTVFNPIG1lYXN1cmVtZW50LlxuICogUmV0dXJucyB1bmRlZmluZWQgd2hlbiBuZWl0aGVyIGFwcGxpZXMuIENhbGxlZCBvbmNlIHBlciBiYXRjaDsgdGhlIHJlc3VsdFxuICogaXMgcGFzc2VkIHRvIHRoZSBiYXRjaCdzIGZpcnN0IHN0ZXAgb25seSwgc28gYSBwYXJhbGxlbCBmaXJzdCBiYXRjaCBlbWl0cyBhXG4gKiBzaW5nbGUgc2FtcGxlIHJhdGhlciB0aGFuIG9uZSBwZXIgc2libGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nKHBhcmFtczoge1xuICAvKiogVGhlIG9yY2hlc3RyYXRvcidzIGN1cnJlbnQgaW4tbWVtb3J5IGV2ZW50IGxvZyAoYXNjZW5kaW5nIG9yZGVyKS4gKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGludm9jYXRpb24ncyBpbml0aWFsIGV2ZW50IGxvYWQgY29udGFpbmVkIG5vdGhpbmcgYmV5b25kXG4gICAqIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkL2F0dHJfc2V0LiBQcmUtZXhpc3RpbmcgaG9vayBldmVudHMgd2VyZSB3cml0dGVuXG4gICAqIGJ5IGFuIGVhcmxpZXIgaW52b2NhdGlvbiwgc28gdGhlIHRpbWUgdGhleSBhZGRlZCAoaW5jbHVkaW5nIHRoZSBxdWV1ZVxuICAgKiBob3AgYmFjayB0byB0aGlzIGludm9jYXRpb24pIGlzIHVubWVhc3VyYWJsZSBhbmQgZGlzcXVhbGlmaWVzIFRURlMuXG4gICAqIGF0dHJfc2V0IGlzIHBlcm1pdHRlZDogYSByZWRlbGl2ZXJ5IGNhbiBsYW5kIGFmdGVyIGEgY29tbWl0dGVkIHByZS1zdGVwXG4gICAqIGF0dHJfc2V0LCBhbmQgdGhlIGRldG91ciBpdCBtYXJrcyBpcyBzdWJ0cmFjdGVkIHZpYSBgcHJlU3RlcEF0dHJTdGFydE1zYFxuICAgKiByZWdhcmRsZXNzIG9mIHdoaWNoIGludm9jYXRpb24gd3JvdGUgaXQuXG4gICAqL1xuICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOiBib29sZWFuO1xuICAvKiogRXBvY2ggbXMgb2YgcnVuIGNyZWF0aW9uLCBpZiByZWNvdmVyYWJsZS4gQWJzZW50IGRpc3F1YWxpZmllcyBUVEZTLiAqL1xuICBydW5DcmVhdGVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLIChvcixcbiAgICogdW5kZXIgdHVyYm8sIHRoZSBpbnN0YW50IHRoZSBydW4gd2FzIHN5bnRoZXNpemVkIGxvY2FsbHkg4oCUIHNlZVxuICAgKiB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5yc2ZzQW5jaG9yTXN9KS4gQWJzZW50IGRpc3F1YWxpZmllcyBSU0ZTLlxuICAgKi9cbiAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogV2FsbC1jbG9jayBtcyB0aGlzIHN1c3BlbnNpb24ncyBgcnVuV29ya2Zsb3dgIGNhbGwgc3BlbnQgZXhlY3V0aW5nXG4gICAqIHN5bmNocm9ub3VzbHkgYmVmb3JlIHRocm93aW5nIOKAlCB0aGUgRklOQUwgcmVwbGF5IHBhc3Mgb25seSwgbm90XG4gICAqIGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHBhc3Nlcy4gU2VlXG4gICAqIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfS5cbiAgICovXG4gIHJlcGxheU1zOiBudW1iZXI7XG4gIC8qKiBTZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucHJlU3RlcEJsb2NraW5nTXN9LiAqL1xuICBwcmVTdGVwQmxvY2tpbmdNczogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGFjY3VtdWxhdG9yJ3MgdmFsdWUgYXMgb2YgdGhlIHN1c3BlbnNpb24gdGhhdCB3cm90ZSB0aGUgcnVuJ3MgZmlyc3RcbiAgICogYXR0cl9zZXQgKGl0cyBob29rIHBoYXNlIHJ1bnMgYmVmb3JlIGl0cyBhdHRyIHdyaXRlcykuIFdoZW4gdGhlXG4gICAqIG1lYXN1cmVtZW50IGVuZHMgYXQgdGhlIGF0dHIgd3JpdGUsIG9ubHkgaG9vayB0aW1lIGZyb20gYmVmb3JlIHRoYXRcbiAgICogcG9pbnQgbWF5IGJlIHN1YnRyYWN0ZWQg4oCUIGxhdGVyIGhvb2sgd3JpdGVzIGZhbGwgb3V0c2lkZSB0aGUgbWVhc3VyZWRcbiAgICogd2luZG93LiBVbmRlZmluZWQgd2hlbiBubyBhdHRyIHN1c3BlbnNpb24gaGFwcGVuZWQgaW4gdGhpcyBpbnZvY2F0aW9uXG4gICAqIChlLmcuIHRoZSBhdHRyX3NldCB3YXMgbG9hZGVkIGZyb20gYSByZWRlbGl2ZXJ5J3Mgc25hcHNob3QsIHdoZXJlIG5vXG4gICAqIHNhbWUtaW52b2NhdGlvbiBob29rIHRpbWUgcHJlY2VkZXMgaXQpLlxuICAgKi9cbiAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdXNwZW5zaW9uIHRoYXQgc2NoZWR1bGVkIHRoaXMgYmF0Y2ggYWxzbyBjcmVhdGVkIHdhaXRzLlxuICAgKiBUaG9zZSBgd2FpdF9jcmVhdGVkYCB3cml0ZXMgYXJlIG5vdCBpbiBgZXZlbnRzYCB5ZXQgKHRoZXkgd2VyZSBjb21taXR0ZWRcbiAgICogYnkgdGhpcyB2ZXJ5IHN1c3BlbnNpb24gcGFzcyksIHNvIHRoZXkgbXVzdCBiZSByZXBvcnRlZCBzZXBhcmF0ZWx5LiBBXG4gICAqIHdhaXQgZGlzcXVhbGlmaWVzIGJvdGggbWVhc3VyZW1lbnRzLlxuICAgKi9cbiAgc3VzcGVuc2lvbkhhc1dhaXRzOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc3VzcGVuc2lvbiB0aGF0IHNjaGVkdWxlZCB0aGlzIGJhdGNoIGFsc28gY3JlYXRlZCBob29rc1xuICAgKiAoYWxzbyBub3QgaW4gYGV2ZW50c2AgeWV0KS4gSG9va3Mga2VlcCBUVEZTIGVsaWdpYmxlIOKAlCB0aGVpciBtZWFzdXJlZFxuICAgKiB3cml0ZSB0aW1lIGlzIHN1YnRyYWN0ZWQgdmlhIGBwcmVTdGVwQmxvY2tpbmdNc2Ag4oCUIGJ1dCBkaXNxdWFsaWZ5IFNUU08sXG4gICAqIHdoaWNoIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgYSBwdXJlIGJhY2stdG8tYmFjayBzdGVwIGdhcC5cbiAgICovXG4gIHN1c3BlbnNpb25DcmVhdGVkSG9va3M6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xufSk6IFN0ZXBMYXRlbmN5VHJhY2tpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGV2ZW50cyB9ID0gcGFyYW1zO1xuXG4gIGxldCB0dGZzRWxpZ2libGUgPVxuICAgIHBhcmFtcy5pbnZvY2F0aW9uU3RhcnRlZENsZWFuICYmXG4gICAgcGFyYW1zLnJ1bkNyZWF0ZWRBdE1zICE9PSB1bmRlZmluZWQgJiZcbiAgICAhcGFyYW1zLnN1c3BlbnNpb25IYXNXYWl0cztcbiAgbGV0IHByZVN0ZXBBdHRyU3RhcnRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAodHRmc0VsaWdpYmxlKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChUVEZTX0RJU1FVQUxJRllJTkdfRVZFTlRfVFlQRVMuaGFzKGV2ZW50LmV2ZW50VHlwZSkpIHtcbiAgICAgICAgdHRmc0VsaWdpYmxlID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0Jykge1xuICAgICAgICBjb25zdCBhdHRyU3RhcnRNcyA9ICsoZXZlbnQub2NjdXJyZWRBdCA/PyBldmVudC5jcmVhdGVkQXQpO1xuICAgICAgICBwcmVTdGVwQXR0clN0YXJ0TXMgPVxuICAgICAgICAgIHByZVN0ZXBBdHRyU3RhcnRNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGF0dHJTdGFydE1zXG4gICAgICAgICAgICA6IE1hdGgubWluKHByZVN0ZXBBdHRyU3RhcnRNcywgYXR0clN0YXJ0TXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNUU086IHRoZSB0d28gc3RlcHMgcmFuIGJhY2stdG8tYmFjayDigJQgdGhlIG5ld2VzdCBrbm93biBldmVudCBpcyB0aGVcbiAgLy8gcHJldmlvdXMgc3RlcCdzIHRlcm1pbmFsIGV2ZW50LCB3aXRoIG5vdGhpbmcgKGhvb2tfcmVjZWl2ZWQsIHdhaXRzLFxuICAvLyBhdHRyX3NldCwgLi4uKSBpbiBiZXR3ZWVuIGFuZCB0aGlzIHN1c3BlbnNpb24gc2NoZWR1bGluZyBub3RoaW5nIGJ1dFxuICAvLyBzdGVwcy5cbiAgbGV0IHByZXZTdGVwRW5kTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0ZXBDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgZXZlbnRDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBsYXN0RXZlbnQgPSBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdO1xuICBpZiAoXG4gICAgIXBhcmFtcy5zdXNwZW5zaW9uSGFzV2FpdHMgJiZcbiAgICAhcGFyYW1zLnN1c3BlbnNpb25DcmVhdGVkSG9va3MgJiZcbiAgICBsYXN0RXZlbnQgJiZcbiAgICAobGFzdEV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgbGFzdEV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJylcbiAgKSB7XG4gICAgcHJldlN0ZXBFbmRNcyA9ICsobGFzdEV2ZW50Lm9jY3VycmVkQXQgPz8gbGFzdEV2ZW50LmNyZWF0ZWRBdCk7XG4gICAgY29uc3QgdGVybWluYWxTdGVwSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJykgJiZcbiAgICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgdGVybWluYWxTdGVwSWRzLmFkZChldmVudC5jb3JyZWxhdGlvbklkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RlcENvdW50ID0gdGVybWluYWxTdGVwSWRzLnNpemU7XG4gICAgZXZlbnRDb3VudCA9IGV2ZW50cy5sZW5ndGg7XG4gIH1cblxuICAvLyBSU0ZTIHNoYXJlcyBUVEZTJ3MgZWxpZ2liaWxpdHkgZXhhY3RseSAoc2FtZSBldmVudC1sb2cvd2FpdCBjaGVja3MpLFxuICAvLyBwbHVzIGl0cyBvd24gYW5jaG9yIGJlaW5nIHJlY292ZXJhYmxlLlxuICBjb25zdCByc2ZzRWxpZ2libGUgPVxuICAgIHR0ZnNFbGlnaWJsZSAmJiBwYXJhbXMucnVuU3RhcnRlZFJlY2VpdmVkQXRNcyAhPT0gdW5kZWZpbmVkO1xuXG4gIGlmICghdHRmc0VsaWdpYmxlICYmIHByZXZTdGVwRW5kTXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLih0dGZzRWxpZ2libGVcbiAgICAgID8ge1xuICAgICAgICAgIHR0ZnNBbmNob3JNczogcGFyYW1zLnJ1bkNyZWF0ZWRBdE1zLFxuICAgICAgICAgIC8vIFdoZW4gdGhlIG1lYXN1cmVtZW50IGVuZHMgYXQgdGhlIGZpcnN0IGF0dHIgd3JpdGUsIG9ubHkgaG9va1xuICAgICAgICAgIC8vIHRpbWUgZnJvbSBiZWZvcmUgdGhhdCBwb2ludCBpcyBpbnNpZGUgdGhlIG1lYXN1cmVkIHdpbmRvdy5cbiAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNczpcbiAgICAgICAgICAgIHByZVN0ZXBBdHRyU3RhcnRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKHBhcmFtcy5wcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPz8gMClcbiAgICAgICAgICAgICAgOiBwYXJhbXMucHJlU3RlcEJsb2NraW5nTXMsXG4gICAgICAgICAgLi4uKHByZVN0ZXBBdHRyU3RhcnRNcyAhPT0gdW5kZWZpbmVkID8geyBwcmVTdGVwQXR0clN0YXJ0TXMgfSA6IHt9KSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHJzZnNFbGlnaWJsZVxuICAgICAgPyB7XG4gICAgICAgICAgcnNmc0FuY2hvck1zOiBwYXJhbXMucnVuU3RhcnRlZFJlY2VpdmVkQXRNcyxcbiAgICAgICAgICByZXBsYXlNczogcGFyYW1zLnJlcGxheU1zLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocHJldlN0ZXBFbmRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgcHJldlN0ZXBFbmRNcywgc3RlcENvdW50LCBldmVudENvdW50IH1cbiAgICAgIDoge30pLFxuICAgIHR1cmJvOiBwYXJhbXMudHVyYm8sXG4gIH07XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgbGF0ZW5jeSB0ZWxlbWV0cnkgdG8gYXR0YWNoIHRvIHRoZSBzdGVwJ3MgdGVybWluYWwgZXZlbnQuXG4gKiBDYWxsZWQgYnkgYGV4ZWN1dGVTdGVwYCB3aXRoIHRoZSB3YWxsLWNsb2NrIHRpbWVzdGFtcCB0YWtlbiBpbW1lZGlhdGVseVxuICogYmVmb3JlIHVzZXIgc3RlcCBjb2RlIHJ1bnMuIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0b1xuICogcmVwb3J0IChubyB0cmFja2luZywgb3IgYSByZXRyeSBhdHRlbXB0IOKAlCByZXRyaWVzIG1lYXN1cmUgbmVpdGhlciBUVEZTIG5vclxuICogU1RTTykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3RlcExhdGVuY3lFdmVudERhdGEocGFyYW1zOiB7XG4gIHRyYWNraW5nOiBTdGVwTGF0ZW5jeVRyYWNraW5nIHwgdW5kZWZpbmVkO1xuICAvKiogYERhdGUubm93KClgIHRha2VuIGltbWVkaWF0ZWx5IGJlZm9yZSB1c2VyIHN0ZXAgY29kZSBiZWdhbiBleGVjdXRpbmcuICovXG4gIHN0ZXBDb2RlU3RhcnRlZEF0TXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIGBEYXRlLm5vdygpYCB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUXG4gICAqIChgc3RlcF9zdGFydGVkYCkgd2FzIGlzc3VlZC4gUHJlc2VudCBvbmx5IGZvciB0aGUgbGF6eSBpbmxpbmUgc3RlcHMgUlNGU1xuICAgKiBjYXJlcyBhYm91dDsgc2VlIHRoZSBjYWxsIHNpdGVzIGluIHN0ZXAtZXhlY3V0b3IudHMuXG4gICAqL1xuICBzdGVwU3RhcnRQb3N0U2VudEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgYXR0ZW1wdDogbnVtYmVyO1xuICAvKiogV2hldGhlciB0aGlzIHN0ZXAgd2FzIHN0YXJ0ZWQgbGF6aWx5IChubyBzZXBhcmF0ZSBzdGVwX2NyZWF0ZWQgd3JpdGUpLiAqL1xuICBsYXp5U3RlcFN0YXJ0OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgYm9keSByYW4gb3B0aW1pc3RpY2FsbHksIHdpdGhvdXQgYXdhaXRpbmcgc3RlcF9zdGFydGVkLiAqL1xuICBvcHRpbWlzdGljU3RhcnQ6IGJvb2xlYW47XG59KTogU3RlcExhdGVuY3lFdmVudERhdGEgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IHRyYWNraW5nIH0gPSBwYXJhbXM7XG4gIGlmICghdHJhY2tpbmcgfHwgcGFyYW1zLmF0dGVtcHQgIT09IDEpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gU21hbGwgbmVnYXRpdmUgZHVyYXRpb25zIGNsYW1wIHRvIDA6IGNyb3NzLWludm9jYXRpb24gdGltZXN0YW1wcyBjYW5cbiAgLy8gY29tZSBmcm9tIGFub3RoZXIgbWFjaGluZSdzIGNsb2NrLCBzbyBib3VuZGVkIHNrZXcgbXVzdCBub3QgcHJvZHVjZVxuICAvLyBuZWdhdGl2ZSB2YWx1ZXMuIER1cmF0aW9ucyBtb3JlIG5lZ2F0aXZlIHRoYW4gTUFYX0NMT0NLX1NLRVdfTVMgYXJlIG5vdFxuICAvLyBza2V3IGJ1dCBhIGNvcnJ1cHQgYW5jaG9yLCBhbmQgdGhlIHNhbXBsZSBpcyBkcm9wcGVkIChzZWUgdGhlIGNvbnN0YW50J3NcbiAgLy8gZG9jIGNvbW1lbnQpLlxuICAvL1xuICAvLyBBIHByZS1zdGVwIHNldEF0dHJpYnV0ZXMgZGV0b3VyIGVuZHMgdGhlIG1lYXN1cmVtZW50IGF0IHRoZSBmaXJzdCBhdHRyXG4gIC8vIHdyaXRlIGluc3RlYWQgb2YgdGhlIHN0ZXAncyBjb2RlIHN0YXJ0IOKAlCB0aGUgcmVtYWluZGVyIGlzIHRoZSBkdXJhdGlvblxuICAvLyBvZiB0aGUgc2V0QXR0cmlidXRlcyBjYWxsIChyZXNvbHZlZCB2aWEgYW4gZXh0cmEgcmVwbGF5KSwgd2hpY2ggaXNcbiAgLy8gc3VidHJhY3RlZCByYXRoZXIgdGhhbiBkaXNxdWFsaWZ5aW5nIHRoZSBzYW1wbGUuIEluIHRoYXQgY2FzZVxuICAvLyBgdHJhY2tpbmcucHJlU3RlcEJsb2NraW5nTXNgIGFscmVhZHkgaG9sZHMgb25seSB0aGUgaG9vayB0aW1lIGZyb21cbiAgLy8gQkVGT1JFIHRoZSBhdHRyIHdyaXRlIOKAlCBob29rIHdyaXRlcyBhZnRlciB0aGUgd2luZG93IGNsb3NlZCBhcmUgZXhjbHVkZWRcbiAgLy8gYnkgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmcgKHNlZSBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMpLlxuICBjb25zdCB0dGZzRW5kTXMgPSB0cmFja2luZy5wcmVTdGVwQXR0clN0YXJ0TXMgPz8gcGFyYW1zLnN0ZXBDb2RlU3RhcnRlZEF0TXM7XG4gIGNvbnN0IHJhd1R0ZnMgPVxuICAgIHRyYWNraW5nLnR0ZnNBbmNob3JNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHR0ZnNFbmRNcyAtIHRyYWNraW5nLnR0ZnNBbmNob3JNcyAtICh0cmFja2luZy5wcmVTdGVwQmxvY2tpbmdNcyA/PyAwKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHR0ZnMgPVxuICAgIHJhd1R0ZnMgIT09IHVuZGVmaW5lZCAmJiByYXdUdGZzID49IC1NQVhfQ0xPQ0tfU0tFV19NU1xuICAgICAgPyBNYXRoLm1heCgwLCByYXdUdGZzKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJhd1N0c28gPVxuICAgIHRyYWNraW5nLnByZXZTdGVwRW5kTXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyBwYXJhbXMuc3RlcENvZGVTdGFydGVkQXRNcyAtIHRyYWNraW5nLnByZXZTdGVwRW5kTXNcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdHNvID1cbiAgICByYXdTdHNvICE9PSB1bmRlZmluZWQgJiYgcmF3U3RzbyA+PSAtTUFYX0NMT0NLX1NLRVdfTVNcbiAgICAgID8gTWF0aC5tYXgoMCwgcmF3U3RzbylcbiAgICAgIDogdW5kZWZpbmVkO1xuICAvLyBSU0ZTIGVuZHMgYXQgdGhlIGFjdHVhbCBzdGFydC1QT1NUIGluc3RhbnQsIG5vdCBhdCB0dGZzRW5kTXMg4oCUIHVubGlrZVxuICAvLyBUVEZTIGl0IGlzIG5vdCBzdWJqZWN0IHRvIHRoZSBwcmUtc3RlcCBhdHRyLXdyaXRlIHNob3J0Y3V0LCBzbyBhXG4gIC8vIHByZS1zdGVwIHNldEF0dHJpYnV0ZXMgZGV0b3VyIChyYXJlKSBtYWtlcyBSU0ZTIGluY2x1ZGUgdGhlIGRldG91clxuICAvLyB3aGlsZSBUVEZTIGV4Y2x1ZGVzIGl0LiBgZmluYWxTY2hlZHVsaW5nUmVwbGF5YCBpcyBhIGRpcmVjdCBwYXNzdGhyb3VnaFxuICAvLyBvZiBgdHJhY2tpbmcucmVwbGF5TXNgIOKAlCB0aGUgRklOQUwgcmVwbGF5IHBhc3Mgb25seSAoc2VlXG4gIC8vIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXMpIOKAlCBzbyBubyBmdXJ0aGVyIHN1YnRyYWN0aW9uIGFwcGxpZXMsIGJ1dFxuICAvLyBpdCBhbHNvIG1lYW5zIGl0IGlzIE5PVCBhY2N1bXVsYXRlZCBhY3Jvc3MgYW55IGVhcmxpZXIgcHJlLWZpcnN0LXN0ZXBcbiAgLy8gcGFzc2VzIChlLmcuIGEgc2V0QXR0cmlidXRlcyBkZXRvdXIpIGFuZCBtdXN0IG5vdCBiZSByZWFkIGFzIFwidGhlXG4gIC8vIHJlcGxheSBwb3J0aW9uIG9mIHJzZnNcIjsgcnNmcyBjb3ZlcnMgdGhlIHdob2xlIHdpbmRvdy5cbiAgLy9cbiAgLy8gZmluYWxTY2hlZHVsaW5nUmVwbGF5IGR1cGxpY2F0ZXMgd2hhdCBPVEVMIGFscmVhZHkgY2FwdHVyZXMgb24gdGhlIHJ1bi9pbnZvY2F0aW9uXG4gIC8vIHNwYW4sIGJ1dCBpcyBkZWxpYmVyYXRlbHkgY29sbGVjdGVkIGFzIGNsaWVudCB0ZWxlbWV0cnkgc28gdGhlIHNlcnZlclxuICAvLyBjYW4gZW1pdCBpdCBhcyBhbiBVTlNBTVBMRUQsIGZ1bGwtcG9wdWxhdGlvbiBtZXRyaWM6IHdvcmtmbG93LXNlcnZlcidzXG4gIC8vIHNlcnZlciBzcGFucyBhcmUgaGVhdmlseSBzYW1wbGVkIGluIHByb2R1Y3Rpb24gKH43JSksIGFuZCBjbGllbnQgc3BhbnNcbiAgLy8gY2FuJ3QgYmUgZmlsdGVyZWQgYnkgU0RLIHZlcnNpb24sIHNvIG5laXRoZXIgY2FuIHNlcnZlIGFzIHRoZVxuICAvLyBkYXNoYm9hcmQncyBleGFjdCBUVEZTIGRlY29tcG9zaXRpb24uXG4gIGNvbnN0IHJzZnMgPVxuICAgIHRyYWNraW5nLnJzZnNBbmNob3JNcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgcGFyYW1zLnN0ZXBTdGFydFBvc3RTZW50QXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IE1hdGgubWF4KDAsIHBhcmFtcy5zdGVwU3RhcnRQb3N0U2VudEF0TXMgLSB0cmFja2luZy5yc2ZzQW5jaG9yTXMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZmluYWxTY2hlZHVsaW5nUmVwbGF5ID1cbiAgICB0cmFja2luZy5yZXBsYXlNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IE1hdGgubWF4KDAsIHRyYWNraW5nLnJlcGxheU1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKHR0ZnMgPT09IHVuZGVmaW5lZCAmJiBzdHNvID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qgb3B0aW1pemF0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKHRyYWNraW5nLnR1cmJvKSBvcHRpbWl6YXRpb25zLnB1c2goJ3R1cmJvJyk7XG4gIGlmIChwYXJhbXMubGF6eVN0ZXBTdGFydCkgb3B0aW1pemF0aW9ucy5wdXNoKCdsYXp5U3RlcFN0YXJ0Jyk7XG4gIGlmIChwYXJhbXMub3B0aW1pc3RpY1N0YXJ0KSBvcHRpbWl6YXRpb25zLnB1c2goJ29wdGltaXN0aWNTdGFydCcpO1xuXG4gIHJldHVybiB7XG4gICAgLi4uKHR0ZnMgIT09IHVuZGVmaW5lZCA/IHsgdHRmcyB9IDoge30pLFxuICAgIC4uLihzdHNvICE9PSB1bmRlZmluZWQgPyB7IHN0c28gfSA6IHt9KSxcbiAgICAuLi4oc3RzbyAhPT0gdW5kZWZpbmVkICYmIHRyYWNraW5nLnN0ZXBDb3VudCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgc3RlcENvdW50OiB0cmFja2luZy5zdGVwQ291bnQgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHN0c28gIT09IHVuZGVmaW5lZCAmJiB0cmFja2luZy5ldmVudENvdW50ICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBldmVudENvdW50OiB0cmFja2luZy5ldmVudENvdW50IH1cbiAgICAgIDoge30pLFxuICAgIC4uLihyc2ZzICE9PSB1bmRlZmluZWQgPyB7IHJzZnMgfSA6IHt9KSxcbiAgICAuLi4oZmluYWxTY2hlZHVsaW5nUmVwbGF5ICE9PSB1bmRlZmluZWQgPyB7IGZpbmFsU2NoZWR1bGluZ1JlcGxheSB9IDoge30pLFxuICAgIG9wdGltaXphdGlvbnMsXG4gIH07XG59XG4iXX0=
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1sYXRlbmN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1sYXRlbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQThGQTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFvQmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLDhCQUE4QixHQUFvQyxJQUFJLEdBQUcsQ0FDN0U7SUFDRSxjQUFjO0lBQ2QsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsZUFBZTtJQUNmLGVBQWU7SUFDZixjQUFjO0lBQ2QsZ0JBQWdCO0NBQ2pCLENBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxNQXdEMUM7SUFDQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTFCLElBQUksWUFBWSxHQUNkLE1BQU0sQ0FBQyxzQkFBc0I7UUFDN0IsTUFBTSxDQUFDLGNBQWMsS0FBSyxTQUFTO1FBQ25DLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQzdCLElBQUksa0JBQXNDLENBQUM7SUFDM0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksOEJBQThCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixNQUFNO1lBQ1IsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzRCxrQkFBa0I7b0JBQ2hCLGtCQUFrQixLQUFLLFNBQVM7d0JB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RSxPQUFPO1FBQ0wsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxTQUFTLEtBQUssU0FBUztZQUN4RCxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNuQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQ3pELENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFO1lBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pFLGFBQWE7S0FDZCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRXZlbnQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIENsaWVudC1zaWRlIGxhdGVuY3kgbWVhc3VyZW1lbnQgKFRURlMgLyBTVFNPIC8gUlNGUykgdGhyZWFkZWQgZnJvbSB0aGVcbiAqIG9yY2hlc3RyYXRvcidzIGlubGluZSBleGVjdXRpb24gcGF0aCBpbnRvIGBleGVjdXRlU3RlcGAuXG4gKlxuICogVFRGUyAodGltZS10by1maXJzdC1zdGVwKSBtZWFzdXJlcyBydW4gY3JlYXRpb24g4oaSIHRoZSBmaXJzdCBzdGVwJ3MgYm9keVxuICogYmVnaW5uaW5nIHRvIGV4ZWN1dGUuIFNUU08gKHN0ZXAtdG8tc3RlcCBvdmVyaGVhZCkgbWVhc3VyZXMgdGhlIHByZXZpb3VzXG4gKiBzdGVwJ3MgdGVybWluYWwgZXZlbnQg4oaSIHRoZSBuZXh0IHN0ZXAncyBib2R5IGJlZ2lubmluZyB0byBleGVjdXRlLiBSU0ZTXG4gKiAocnVuLXN0YXJ0ZWQtdG8tZmlyc3Qtc3RlcCkgbWVhc3VyZXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZGluZyDihpJcbiAqIHRoZSBmaXJzdCBzdGVwJ3Mgc3RhcnQgUE9TVCBiZWluZyBpc3N1ZWQg4oCUIGEgc3ViLXdpbmRvdyBvZiBUVEZTIHRoYXRcbiAqIGlzb2xhdGVzIHJlcGxheSBvdmVyaGVhZCBmcm9tIHRoZSBydW4tY3JlYXRpb24gcXVldWUgaG9wOyBgZmluYWxTY2hlZHVsaW5nUmVwbGF5YFxuICogaXMgdGhlIHN5bmNocm9ub3VzIHdvcmtmbG93LWZ1bmN0aW9uLWV4ZWN1dGlvbiBkdXJhdGlvbiBvZiBvbmx5IHRoZSBGSU5BTFxuICogcmVwbGF5IHBhc3Mgd2l0aGluIHRoYXQgd2luZG93ICh0aGUgcGFzcyB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAqIGZpcnN0IHN0ZXApIOKAlCBpdCBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzIGVhcmxpZXIgcHJlLWZpcnN0LXN0ZXAgcGFzc2VzXG4gKiAoc2VlIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfSksIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXMgXCJ0aGVcbiAqIHJlcGxheSBwb3J0aW9uIG9mIFJTRlNcIi4gQWxsIGFyZSBhdHRhY2hlZCB0byB0aGUgc3RlcCdzIHRlcm1pbmFsXG4gKiBldmVudCBzbyBhIGJhY2tlbmQgY2FuIGVtaXQgbGF0ZW5jeSBtZXRyaWNzIGZyb20gdGhlIGV2ZW50IHdyaXRlIGFsb25lLFxuICogd2l0aG91dCBleHRyYSBldmVudC1sb2cgcXVlcmllcy5cbiAqXG4gKiBFbGlnaWJpbGl0eSBpcyBkZWNpZGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IgKHdoaWNoIG93bnMgdGhlIGV2ZW50IGxvZykgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9OyB0aGUgZmluYWwgdmFsdWVzIGFyZSBjb21wdXRlZCBieVxuICogYGV4ZWN1dGVTdGVwYCByaWdodCBiZWZvcmUgdXNlciBjb2RlIHJ1bnMgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeVRyYWNraW5nIHtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIG9mIHJ1biBjcmVhdGlvbiAoZnJvbSB0aGUgcnVuLWlkIFVMSUQsIGZhbGxpbmcgYmFjayB0byB0aGUgcnVuXG4gICAqIHNuYXBzaG90J3MgYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFRURlMuXG4gICAqL1xuICB0dGZzQW5jaG9yTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXYWxsLWNsb2NrIG1zIHRoaXMgaW52b2NhdGlvbiBzcGVudCBjb21taXR0aW5nIGBob29rX2NyZWF0ZWRgIGV2ZW50c1xuICAgKiBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAgKGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBhaGVhZCBvZiB0aGUgZmlyc3RcbiAgICogc3RlcCBjb21taXRzIGluIHRoZSBzYW1lIHN1c3BlbnNpb24gYmF0Y2gpLiBTdWJ0cmFjdGVkIGZyb20gVFRGUyBzbyB0aGVcbiAgICogbWV0cmljIHJlZmxlY3RzIHJ1bnRpbWUgb3ZlcmhlYWQgcmF0aGVyIHRoYW4gdGhlIHVzZXIncyBob29rIHdyaXRlcy5cbiAgICovXG4gIHByZVN0ZXBCbG9ja2luZ01zPzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGZpcnN0IHByZS1zdGVwIGBhdHRyX3NldGAgd3JpdGUgYmVnYW4gKGl0cyBjbGllbnQtc3RhbXBlZFxuICAgKiBgb2NjdXJyZWRBdGAsIGZhbGxpbmcgYmFjayB0byBgY3JlYXRlZEF0YCkuIFdoZW4gcHJlc2VudCwgdGhlIFRURlNcbiAgICogbWVhc3VyZW1lbnQgRU5EUyBoZXJlIGluc3RlYWQgb2YgYXQgdGhlIHN0ZXAncyBjb2RlIHN0YXJ0OiBhXG4gICAqIHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcFxuICAgKiByZXNvbHZlcyB0aHJvdWdoIGFuIGV4dHJhIHJlcGxheSAoc2VlIHRoZSBgaGFzQXR0cmlidXRlRXZlbnRzYCBicmFuY2ggaW5cbiAgICogcnVudGltZS50cyksIHNvIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHdyaXRlIHVudGlsIHRoZSBzdGVwIGJvZHkgcnVucyBpc1xuICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIHNldEF0dHJpYnV0ZXMgY2FsbCDigJQgd2hpY2ggaXMgc3VidHJhY3RlZCBieSBlbmRpbmdcbiAgICogdGhlIG1lYXN1cmVtZW50IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgc3RlcCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBiZWVuXG4gICAqIHNjaGVkdWxlZC5cbiAgICovXG4gIHByZVN0ZXBBdHRyU3RhcnRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIHRoZSBwcmV2aW91cyBzdGVwJ3MgdGVybWluYWwgZXZlbnQgd2FzIHJlY29yZGVkIChpdHNcbiAgICogY2xpZW50LXN0YW1wZWQgYG9jY3VycmVkQXRgLCBmYWxsaW5nIGJhY2sgdG8gYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHlcbiAgICogd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFNUU08uXG4gICAqL1xuICBwcmV2U3RlcEVuZE1zPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIHVuaXF1ZSB0ZXJtaW5hbCBzdGVwcyBhbHJlYWR5IGluIHRoZSBldmVudCBsb2cuICovXG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBldmVudHMgYWxyZWFkeSBpbiB0aGUgZXZlbnQgbG9nLiAqL1xuICBldmVudENvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLLlxuICAgKiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFJTRlMg4oCUIHRoZSBzYW1lIGVsaWdpYmlsaXR5IGFzXG4gICAqIFRURlMgKHNlZSB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9KSwgcGx1cyBhIHJlY292ZXJhYmxlXG4gICAqIGFuY2hvci4gSW4gdHVyYm8gbW9kZSwgYHJ1bl9zdGFydGVkYCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICogYXdhaXRlZCwgc28gdGhpcyBpcyBzdGFtcGVkIGF0IHRoZSBwb2ludCB0aGUgcnVudGltZSBzeW50aGVzaXplcyB0aGVcbiAgICogcnVuIGxvY2FsbHkgYW5kIGJlZ2lucyByZXBsYXkgaW5zdGVhZCBvZiBhdCB0aGUgcmVhbCByZXNwb25zZTsgdGhlXG4gICAqIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUIGlzIHN0aWxsIGNoYWluZWQgb24gdGhlIHJlYWwgYHJ1bl9zdGFydGVkYFxuICAgKiBwcm9taXNlIChzZWUgc3RlcC1leGVjdXRvci50cyksIHNvIFJTRlMgc3RpbGwgZW5kcyB1cCBtZWFzdXJpbmcgdGhlXG4gICAqIGdlbnVpbmUgcnVuX3N0YXJ0ZWQtdG8tZmlyc3Qtc3RlcC1QT1NUIHN0cmV0Y2ggZXZlbiB0aG91Z2ggdGhlIHR3b1xuICAgKiBoYWx2ZXMgb3ZlcmxhcCB1bmRlciB0dXJiby5cbiAgICovXG4gIHJzZnNBbmNob3JNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdhbGwtY2xvY2sgbXMgdGhpcyBpbnZvY2F0aW9uJ3Mgc3luY2hyb25vdXMgd29ya2Zsb3ctZnVuY3Rpb24gcmVwbGF5XG4gICAqIHRvb2s6IGZyb20gY2FsbGluZyBgcnVuV29ya2Zsb3dgIHRvIGl0IHRocm93aW5nIHRoZSBzdXNwZW5zaW9uIHRoYXRcbiAgICogc2NoZWR1bGVkIHRoaXMgYmF0Y2guIEV4Y2x1ZGVzIGF3YWl0ZWQgbmV0d29yayBJL08gKHRoZSBzdXNwZW5zaW9uJ3NcbiAgICogZXZlbnQgY29tbWl0cywgdGhlIHN0ZXAncyBvd24gc3RhcnQgUE9TVCkuIFByZXNlbnQgb25seSBhbG9uZ3NpZGVcbiAgICogYHJzZnNBbmNob3JNc2AuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIEZJTkFMIHJlcGxheSBwYXNzIG9ubHkg4oCUIHRoZSBpbnZvY2F0aW9uIHRoYXQgcmVhY2hlZCBhbmRcbiAgICogc2NoZWR1bGVkIHRoZSBmaXJzdCBzdGVwLiBWYWxpZCBSU0ZTIHBhdGhzIGNhbiByZXBsYXkgbW9yZSB0aGFuIG9uY2VcbiAgICogYmVmb3JlIHRoZSBmaXJzdCBzdGVwIChlLmcuIGEgd29ya2Zsb3ctYm9keSBgc2V0QXR0cmlidXRlcygpYCBkZXRvdXJcbiAgICogcmVwbGF5cyB0d2ljZSksIGFuZCBhIHJlZGVsaXZlcnkgb21pdHMgZWFybGllciBpbnZvY2F0aW9ucycgcmVwbGF5IHdvcmtcbiAgICogZW50aXJlbHk7IHRoaXMgdmFsdWUgaXMgbm90IGFjY3VtdWxhdGVkIGFjcm9zcyB0aG9zZSBlYXJsaWVyIHBhc3Nlcy5cbiAgICogRG8gbm90IHJlYWQgaXQgYXMgXCJ0aGUgcmVwbGF5IHBvcnRpb24gb2YgUlNGU1wiIOKAlCBSU0ZTXG4gICAqICh7QGxpbmsgcnNmc0FuY2hvck1zfSkgY292ZXJzIHRoZSB3aG9sZSBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwXG4gICAqIHdpbmRvdywgdGhpcyBjb3ZlcnMgb25seSB0aGUgbGFzdCBwYXNzLlxuICAgKi9cbiAgcmVwbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1vc3QgbmVnYXRpdmUgcmF3IGR1cmF0aW9uIHN0aWxsIGF0dHJpYnV0ZWQgdG8gY3Jvc3MtbWFjaGluZSBjbG9jayBza2V3XG4gKiAoYW5kIGNsYW1wZWQgdG8gMCkuIEFueXRoaW5nIG1vcmUgbmVnYXRpdmUgbWVhbnMgYSBjb3JydXB0IGFuY2hvciDigJQgZS5nLiBhXG4gKiBtaXMtZGVjb2RlZCBydW4tSUQgdGltZXN0YW1wIOKAlCBhbmQgdGhlIHNhbXBsZSBpcyBkcm9wcGVkIGluc3RlYWQ6IGFcbiAqIHN5c3RlbWF0aWNhbGx5IGNvcnJ1cHQgYW5jaG9yIHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYW4gZXhhY3QtemVybyBsYXRlbmN5XG4gKiBvbiBldmVyeSBzYW1wbGUsIHNpbGVudGx5IGRyYWdnaW5nIGVudGlyZSBwZXJjZW50aWxlIGRpc3RyaWJ1dGlvbnMgdG8gMFxuICogcmF0aGVyIHRoYW4gc3VyZmFjaW5nIGFzIG1pc3NpbmcgZGF0YS5cbiAqL1xuY29uc3QgTUFYX0NMT0NLX1NLRVdfTVMgPSA2MF8wMDA7XG5cbi8qKiBMYXRlbmN5IHRlbGVtZXRyeSBhdHRhY2hlZCB0byBhIHN0ZXAncyB0ZXJtaW5hbCBldmVudCdzIGBldmVudERhdGFgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeUV2ZW50RGF0YSB7XG4gIHR0ZnM/OiBudW1iZXI7XG4gIHN0c28/OiBudW1iZXI7XG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgZXZlbnRDb3VudD86IG51bWJlcjtcbiAgLyoqIENsaWVudC1tZWFzdXJlZCBydW5fc3RhcnRlZCDihpIgZmlyc3Qgc3RlcCdzIHN0YXJ0IFBPU1QsIG1zLiAqL1xuICByc2ZzPzogbnVtYmVyO1xuICAvKipcbiAgICogQ2xpZW50LW1lYXN1cmVkIHdhbGwtY2xvY2sgbXMgb2YgdGhlIEZJTkFMIHJlcGxheSBwYXNzIHRoYXQgc2NoZWR1bGVkXG4gICAqIHRoZSBmaXJzdCBzdGVwIChzZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXN9KSDigJQgbm90XG4gICAqIGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHByZS1maXJzdC1zdGVwIHBhc3Nlcywgc28gaXQgbXVzdCBub3QgYmVcbiAgICogcmVhZCBhcyBcInRoZSByZXBsYXkgcG9ydGlvbiBvZiBgcnNmc2BcIi5cbiAgICovXG4gIGZpbmFsU2NoZWR1bGluZ1JlcGxheT86IG51bWJlcjtcbiAgb3B0aW1pemF0aW9ucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEV2ZW50IHR5cGVzIHRoYXQgZGlzcXVhbGlmeSBUVEZTIHdoZW4gcHJlc2VudCBpbiB0aGUgZXZlbnQgbG9nIGF0IHRoZSB0aW1lXG4gKiB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBiYXRjaCBpcyBzY2hlZHVsZWQ6XG4gKlxuICogLSBBbnkgc3RlcCBldmVudCBtZWFucyB0aGlzIGlzIG5vdCB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBleGVjdXRpb24uXG4gKiAtIGBob29rX3JlY2VpdmVkYCAvIGB3YWl0X2NyZWF0ZWRgIC8gYHdhaXRfY29tcGxldGVkYCBtZWFuIHRoZSBydW4ncyBwYXRoIHRvXG4gKiAgIHRoZSBmaXJzdCBzdGVwIGRlcGVuZGVkIG9uIHVzZXItZHJpdmVuIHRpbWluZyAoYSB3ZWJob29rIGFycml2aW5nLCBhXG4gKiAgIHNsZWVwIGVsYXBzaW5nKSwgc28gdGhlIG1lYXN1cmVtZW50IHdvdWxkIG5vdCByZWZsZWN0IHJ1bnRpbWUgb3ZlcmhlYWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGFic2VudCwgd2l0aCB0aGVpciBjb3N0IHN1YnRyYWN0ZWQgaW5zdGVhZDpcbiAqXG4gKiAtIGBob29rX2NyZWF0ZWRgOiBhIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBiZWZvcmUgdGhlIGZpcnN0IHN0ZXBcbiAqICAgY29tbWl0cyBpbiB0aGUgc2FtZSBpbnZvY2F0aW9uLCB3aG9zZSBtZWFzdXJlZCBkdXJhdGlvbiBpcyBzdWJ0cmFjdGVkIHZpYVxuICogICB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQmxvY2tpbmdNc30uXG4gKiAtIGBhdHRyX3NldGAgKHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgKTogcmVzb2x2ZXMgdGhyb3VnaFxuICogICBhbiBleHRyYSByZXBsYXkgYmVmb3JlIHN0ZXBzIHJ1bi4gU3VidHJhY3RlZCBieSBlbmRpbmcgdGhlIG1lYXN1cmVtZW50IGF0XG4gKiAgIHRoZSBmaXJzdCBhdHRyIHdyaXRlJ3MgdGltZXN0YW1wIGluc3RlYWQg4oCUIHNlZVxuICogICB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQXR0clN0YXJ0TXN9LlxuICovXG5jb25zdCBUVEZTX0RJU1FVQUxJRllJTkdfRVZFTlRfVFlQRVM6IFJlYWRvbmx5U2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFxuICBbXG4gICAgJ3N0ZXBfY3JlYXRlZCcsXG4gICAgJ3N0ZXBfc3RhcnRlZCcsXG4gICAgJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAnc3RlcF9mYWlsZWQnLFxuICAgICdzdGVwX3JldHJ5aW5nJyxcbiAgICAnaG9va19yZWNlaXZlZCcsXG4gICAgJ3dhaXRfY3JlYXRlZCcsXG4gICAgJ3dhaXRfY29tcGxldGVkJyxcbiAgXVxuKTtcblxuLyoqXG4gKiBEZWNpZGUsIGZyb20gdGhlIG9yY2hlc3RyYXRvcidzIHZpZXcgb2YgdGhlIGV2ZW50IGxvZywgd2hldGhlciB0aGUgaW5saW5lXG4gKiBzdGVwIGJhdGNoIGFib3V0IHRvIGV4ZWN1dGUgcXVhbGlmaWVzIGZvciBUVEZTIGFuZC9vciBTVFNPIG1lYXN1cmVtZW50LlxuICogUmV0dXJucyB1bmRlZmluZWQgd2hlbiBuZWl0aGVyIGFwcGxpZXMuIENhbGxlZCBvbmNlIHBlciBiYXRjaDsgdGhlIHJlc3VsdFxuICogaXMgcGFzc2VkIHRvIHRoZSBiYXRjaCdzIGZpcnN0IHN0ZXAgb25seSwgc28gYSBwYXJhbGxlbCBmaXJzdCBiYXRjaCBlbWl0cyBhXG4gKiBzaW5nbGUgc2FtcGxlIHJhdGhlciB0aGFuIG9uZSBwZXIgc2libGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nKHBhcmFtczoge1xuICAvKiogVGhlIG9yY2hlc3RyYXRvcidzIGN1cnJlbnQgaW4tbWVtb3J5IGV2ZW50IGxvZyAoYXNjZW5kaW5nIG9yZGVyKS4gKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGludm9jYXRpb24ncyBpbml0aWFsIGV2ZW50IGxvYWQgY29udGFpbmVkIG5vdGhpbmcgYmV5b25kXG4gICAqIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkL2F0dHJfc2V0LiBQcmUtZXhpc3RpbmcgaG9vayBldmVudHMgd2VyZSB3cml0dGVuXG4gICAqIGJ5IGFuIGVhcmxpZXIgaW52b2NhdGlvbiwgc28gdGhlIHRpbWUgdGhleSBhZGRlZCAoaW5jbHVkaW5nIHRoZSBxdWV1ZVxuICAgKiBob3AgYmFjayB0byB0aGlzIGludm9jYXRpb24pIGlzIHVubWVhc3VyYWJsZSBhbmQgZGlzcXVhbGlmaWVzIFRURlMuXG4gICAqIGF0dHJfc2V0IGlzIHBlcm1pdHRlZDogYSByZWRlbGl2ZXJ5IGNhbiBsYW5kIGFmdGVyIGEgY29tbWl0dGVkIHByZS1zdGVwXG4gICAqIGF0dHJfc2V0LCBhbmQgdGhlIGRldG91ciBpdCBtYXJrcyBpcyBzdWJ0cmFjdGVkIHZpYSBgcHJlU3RlcEF0dHJTdGFydE1zYFxuICAgKiByZWdhcmRsZXNzIG9mIHdoaWNoIGludm9jYXRpb24gd3JvdGUgaXQuXG4gICAqL1xuICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOiBib29sZWFuO1xuICAvKiogRXBvY2ggbXMgb2YgcnVuIGNyZWF0aW9uLCBpZiByZWNvdmVyYWJsZS4gQWJzZW50IGRpc3F1YWxpZmllcyBUVEZTLiAqL1xuICBydW5DcmVhdGVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLIChvcixcbiAgICogdW5kZXIgdHVyYm8sIHRoZSBpbnN0YW50IHRoZSBydW4gd2FzIHN5bnRoZXNpemVkIGxvY2FsbHkg4oCUIHNlZVxuICAgKiB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5yc2ZzQW5jaG9yTXN9KS4gQWJzZW50IGRpc3F1YWxpZmllcyBSU0ZTLlxuICAgKi9cbiAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogV2FsbC1jbG9jayBtcyB0aGlzIHN1c3BlbnNpb24ncyBgcnVuV29ya2Zsb3dgIGNhbGwgc3BlbnQgZXhlY3V0aW5nXG4gICAqIHN5bmNocm9ub3VzbHkgYmVmb3JlIHRocm93aW5nIOKAlCB0aGUgRklOQUwgcmVwbGF5IHBhc3Mgb25seSwgbm90XG4gICAqIGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHBhc3Nlcy4gU2VlXG4gICAqIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfS5cbiAgICovXG4gIHJlcGxheU1zOiBudW1iZXI7XG4gIC8qKiBTZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucHJlU3RlcEJsb2NraW5nTXN9LiAqL1xuICBwcmVTdGVwQmxvY2tpbmdNczogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGFjY3VtdWxhdG9yJ3MgdmFsdWUgYXMgb2YgdGhlIHN1c3BlbnNpb24gdGhhdCB3cm90ZSB0aGUgcnVuJ3MgZmlyc3RcbiAgICogYXR0cl9zZXQgKGl0cyBob29rIHBoYXNlIHJ1bnMgYmVmb3JlIGl0cyBhdHRyIHdyaXRlcykuIFdoZW4gdGhlXG4gICAqIG1lYXN1cmVtZW50IGVuZHMgYXQgdGhlIGF0dHIgd3JpdGUsIG9ubHkgaG9vayB0aW1lIGZyb20gYmVmb3JlIHRoYXRcbiAgICogcG9pbnQgbWF5IGJlIHN1YnRyYWN0ZWQg4oCUIGxhdGVyIGhvb2sgd3JpdGVzIGZhbGwgb3V0c2lkZSB0aGUgbWVhc3VyZWRcbiAgICogd2luZG93LiBVbmRlZmluZWQgd2hlbiBubyBhdHRyIHN1c3BlbnNpb24gaGFwcGVuZWQgaW4gdGhpcyBpbnZvY2F0aW9uXG4gICAqIChlLmcuIHRoZSBhdHRyX3NldCB3YXMgbG9hZGVkIGZyb20gYSByZWRlbGl2ZXJ5J3Mgc25hcHNob3QsIHdoZXJlIG5vXG4gICAqIHNhbWUtaW52b2NhdGlvbiBob29rIHRpbWUgcHJlY2VkZXMgaXQpLlxuICAgKi9cbiAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdXNwZW5zaW9uIHRoYXQgc2NoZWR1bGVkIHRoaXMgYmF0Y2ggYWxzbyBjcmVhdGVkIHdhaXRzLlxuICAgKiBUaG9zZSBgd2FpdF9jcmVhdGVkYCB3cml0ZXMgYXJlIG5vdCBpbiBgZXZlbnRzYCB5ZXQgKHRoZXkgd2VyZSBjb21taXR0ZWRcbiAgICogYnkgdGhpcyB2ZXJ5IHN1c3BlbnNpb24gcGFzcyksIHNvIHRoZXkgbXVzdCBiZSByZXBvcnRlZCBzZXBhcmF0ZWx5LiBBXG4gICAqIHdhaXQgZGlzcXVhbGlmaWVzIGJvdGggbWVhc3VyZW1lbnRzLlxuICAgKi9cbiAgc3VzcGVuc2lvbkhhc1dhaXRzOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc3VzcGVuc2lvbiB0aGF0IHNjaGVkdWxlZCB0aGlzIGJhdGNoIGFsc28gY3JlYXRlZCBob29rc1xuICAgKiAoYWxzbyBub3QgaW4gYGV2ZW50c2AgeWV0KS4gSG9va3Mga2VlcCBUVEZTIGVsaWdpYmxlIOKAlCB0aGVpciBtZWFzdXJlZFxuICAgKiB3cml0ZSB0aW1lIGlzIHN1YnRyYWN0ZWQgdmlhIGBwcmVTdGVwQmxvY2tpbmdNc2Ag4oCUIGJ1dCBkaXNxdWFsaWZ5IFNUU08sXG4gICAqIHdoaWNoIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgYSBwdXJlIGJhY2stdG8tYmFjayBzdGVwIGdhcC5cbiAgICovXG4gIHN1c3BlbnNpb25DcmVhdGVkSG9va3M6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xufSk6IFN0ZXBMYXRlbmN5VHJhY2tpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGV2ZW50cyB9ID0gcGFyYW1zO1xuXG4gIGxldCB0dGZzRWxpZ2libGUgPVxuICAgIHBhcmFtcy5pbnZvY2F0aW9uU3RhcnRlZENsZWFuICYmXG4gICAgcGFyYW1zLnJ1bkNyZWF0ZWRBdE1zICE9PSB1bmRlZmluZWQgJiZcbiAgICAhcGFyYW1zLnN1c3BlbnNpb25IYXNXYWl0cztcbiAgbGV0IHByZVN0ZXBBdHRyU3RhcnRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAodHRmc0VsaWdpYmxlKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChUVEZTX0RJU1FVQUxJRllJTkdfRVZFTlRfVFlQRVMuaGFzKGV2ZW50LmV2ZW50VHlwZSkpIHtcbiAgICAgICAgdHRmc0VsaWdpYmxlID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0Jykge1xuICAgICAgICBjb25zdCBhdHRyU3RhcnRNcyA9ICsoZXZlbnQub2NjdXJyZWRBdCA/PyBldmVudC5jcmVhdGVkQXQpO1xuICAgICAgICBwcmVTdGVwQXR0clN0YXJ0TXMgPVxuICAgICAgICAgIHByZVN0ZXBBdHRyU3RhcnRNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGF0dHJTdGFydE1zXG4gICAgICAgICAgICA6IE1hdGgubWluKHByZVN0ZXBBdHRyU3RhcnRNcywgYXR0clN0YXJ0TXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNUU086IHRoZSB0d28gc3RlcHMgcmFuIGJhY2stdG8tYmFjayDigJQgdGhlIG5ld2VzdCBrbm93biBldmVudCBpcyB0aGVcbiAgLy8gcHJldmlvdXMgc3RlcCdzIHRlcm1pbmFsIGV2ZW50LCB3aXRoIG5vdGhpbmcgKGhvb2tfcmVjZWl2ZWQsIHdhaXRzLFxuICAvLyBhdHRyX3NldCwgLi4uKSBpbiBiZXR3ZWVuIGFuZCB0aGlzIHN1c3BlbnNpb24gc2NoZWR1bGluZyBub3RoaW5nIGJ1dFxuICAvLyBzdGVwcy5cbiAgbGV0IHByZXZTdGVwRW5kTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0ZXBDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgZXZlbnRDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBsYXN0RXZlbnQgPSBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdO1xuICBpZiAoXG4gICAgIXBhcmFtcy5zdXNwZW5zaW9uSGFzV2FpdHMgJiZcbiAgICAhcGFyYW1zLnN1c3BlbnNpb25DcmVhdGVkSG9va3MgJiZcbiAgICBsYXN0RXZlbnQgJiZcbiAgICAobGFzdEV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgbGFzdEV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJylcbiAgKSB7XG4gICAgcHJldlN0ZXBFbmRNcyA9ICsobGFzdEV2ZW50Lm9jY3VycmVkQXQgPz8gbGFzdEV2ZW50LmNyZWF0ZWRBdCk7XG4gICAgY29uc3QgdGVybWluYWxTdGVwSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJykgJiZcbiAgICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgdGVybWluYWxTdGVwSWRzLmFkZChldmVudC5jb3JyZWxhdGlvbklkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RlcENvdW50ID0gdGVybWluYWxTdGVwSWRzLnNpemU7XG4gICAgZXZlbnRDb3VudCA9IGV2ZW50cy5sZW5ndGg7XG4gIH1cblxuICAvLyBSU0ZTIHNoYXJlcyBUVEZTJ3MgZWxpZ2liaWxpdHkgZXhhY3RseSAoc2FtZSBldmVudC1sb2cvd2FpdCBjaGVja3MpLFxuICAvLyBwbHVzIGl0cyBvd24gYW5jaG9yIGJlaW5nIHJlY292ZXJhYmxlLlxuICBjb25zdCByc2ZzRWxpZ2libGUgPVxuICAgIHR0ZnNFbGlnaWJsZSAmJiBwYXJhbXMucnVuU3RhcnRlZFJlY2VpdmVkQXRNcyAhPT0gdW5kZWZpbmVkO1xuXG4gIGlmICghdHRmc0VsaWdpYmxlICYmIHByZXZTdGVwRW5kTXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLih0dGZzRWxpZ2libGVcbiAgICAgID8ge1xuICAgICAgICAgIHR0ZnNBbmNob3JNczogcGFyYW1zLnJ1bkNyZWF0ZWRBdE1zLFxuICAgICAgICAgIC8vIFdoZW4gdGhlIG1lYXN1cmVtZW50IGVuZHMgYXQgdGhlIGZpcnN0IGF0dHIgd3JpdGUsIG9ubHkgaG9va1xuICAgICAgICAgIC8vIHRpbWUgZnJvbSBiZWZvcmUgdGhhdCBwb2ludCBpcyBpbnNpZGUgdGhlIG1lYXN1cmVkIHdpbmRvdy5cbiAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNczpcbiAgICAgICAgICAgIHByZVN0ZXBBdHRyU3RhcnRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKHBhcmFtcy5wcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPz8gMClcbiAgICAgICAgICAgICAgOiBwYXJhbXMucHJlU3RlcEJsb2NraW5nTXMsXG4gICAgICAgICAgLi4uKHByZVN0ZXBBdHRyU3RhcnRNcyAhPT0gdW5kZWZpbmVkID8geyBwcmVTdGVwQXR0clN0YXJ0TXMgfSA6IHt9KSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHJzZnNFbGlnaWJsZVxuICAgICAgPyB7XG4gICAgICAgICAgcnNmc0FuY2hvck1zOiBwYXJhbXMucnVuU3RhcnRlZFJlY2VpdmVkQXRNcyxcbiAgICAgICAgICByZXBsYXlNczogcGFyYW1zLnJlcGxheU1zLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocHJldlN0ZXBFbmRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgcHJldlN0ZXBFbmRNcywgc3RlcENvdW50LCBldmVudENvdW50IH1cbiAgICAgIDoge30pLFxuICAgIHR1cmJvOiBwYXJhbXMudHVyYm8sXG4gIH07XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgbGF0ZW5jeSB0ZWxlbWV0cnkgdG8gYXR0YWNoIHRvIHRoZSBzdGVwJ3MgdGVybWluYWwgZXZlbnQuXG4gKiBDYWxsZWQgYnkgYGV4ZWN1dGVTdGVwYCB3aXRoIHRoZSB3YWxsLWNsb2NrIHRpbWVzdGFtcCB0YWtlbiBpbW1lZGlhdGVseVxuICogYmVmb3JlIHVzZXIgc3RlcCBjb2RlIHJ1bnMuIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0b1xuICogcmVwb3J0IChubyB0cmFja2luZywgb3IgYSByZXRyeSBhdHRlbXB0IOKAlCByZXRyaWVzIG1lYXN1cmUgbmVpdGhlciBUVEZTIG5vclxuICogU1RTTykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3RlcExhdGVuY3lFdmVudERhdGEocGFyYW1zOiB7XG4gIHRyYWNraW5nOiBTdGVwTGF0ZW5jeVRyYWNraW5nIHwgdW5kZWZpbmVkO1xuICAvKiogYERhdGUubm93KClgIHRha2VuIGltbWVkaWF0ZWx5IGJlZm9yZSB1c2VyIHN0ZXAgY29kZSBiZWdhbiBleGVjdXRpbmcuICovXG4gIHN0ZXBDb2RlU3RhcnRlZEF0TXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIGBEYXRlLm5vdygpYCB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUXG4gICAqIChgc3RlcF9zdGFydGVkYCkgd2FzIGlzc3VlZC4gUHJlc2VudCBvbmx5IGZvciB0aGUgbGF6eSBpbmxpbmUgc3RlcHMgUlNGU1xuICAgKiBjYXJlcyBhYm91dDsgc2VlIHRoZSBjYWxsIHNpdGVzIGluIHN0ZXAtZXhlY3V0b3IudHMuXG4gICAqL1xuICBzdGVwU3RhcnRQb3N0U2VudEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgYXR0ZW1wdDogbnVtYmVyO1xuICAvKiogV2hldGhlciB0aGlzIHN0ZXAgd2FzIHN0YXJ0ZWQgbGF6aWx5IChubyBzZXBhcmF0ZSBzdGVwX2NyZWF0ZWQgd3JpdGUpLiAqL1xuICBsYXp5U3RlcFN0YXJ0OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgYm9keSByYW4gb3B0aW1pc3RpY2FsbHksIHdpdGhvdXQgYXdhaXRpbmcgc3RlcF9zdGFydGVkLiAqL1xuICBvcHRpbWlzdGljU3RhcnQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdGVwJ3MgYHN0ZXBfY3JlYXRlZGAgKyBgc3RlcF9zdGFydGVkYCBwYWlyIHdhcyBwcmUtY2xhaW1lZFxuICAgKiBpbnNpZGUgdGhlIHN1c3BlbnNpb24gaGFuZGxlcidzIGJhdGNoZWQgZmFuLW91dCB3cml0ZSAobm8gc3RhcnQgUE9TVCBvZlxuICAgKiBpdHMgb3duIGF0IGFsbCkuXG4gICAqL1xuICBwcmVjbGFpbWVkU3RhcnQ/OiBib29sZWFuO1xufSk6IFN0ZXBMYXRlbmN5RXZlbnREYXRhIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyB0cmFja2luZyB9ID0gcGFyYW1zO1xuICBpZiAoIXRyYWNraW5nIHx8IHBhcmFtcy5hdHRlbXB0ICE9PSAxKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFNtYWxsIG5lZ2F0aXZlIGR1cmF0aW9ucyBjbGFtcCB0byAwOiBjcm9zcy1pbnZvY2F0aW9uIHRpbWVzdGFtcHMgY2FuXG4gIC8vIGNvbWUgZnJvbSBhbm90aGVyIG1hY2hpbmUncyBjbG9jaywgc28gYm91bmRlZCBza2V3IG11c3Qgbm90IHByb2R1Y2VcbiAgLy8gbmVnYXRpdmUgdmFsdWVzLiBEdXJhdGlvbnMgbW9yZSBuZWdhdGl2ZSB0aGFuIE1BWF9DTE9DS19TS0VXX01TIGFyZSBub3RcbiAgLy8gc2tldyBidXQgYSBjb3JydXB0IGFuY2hvciwgYW5kIHRoZSBzYW1wbGUgaXMgZHJvcHBlZCAoc2VlIHRoZSBjb25zdGFudCdzXG4gIC8vIGRvYyBjb21tZW50KS5cbiAgLy9cbiAgLy8gQSBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzIGRldG91ciBlbmRzIHRoZSBtZWFzdXJlbWVudCBhdCB0aGUgZmlyc3QgYXR0clxuICAvLyB3cml0ZSBpbnN0ZWFkIG9mIHRoZSBzdGVwJ3MgY29kZSBzdGFydCDigJQgdGhlIHJlbWFpbmRlciBpcyB0aGUgZHVyYXRpb25cbiAgLy8gb2YgdGhlIHNldEF0dHJpYnV0ZXMgY2FsbCAocmVzb2x2ZWQgdmlhIGFuIGV4dHJhIHJlcGxheSksIHdoaWNoIGlzXG4gIC8vIHN1YnRyYWN0ZWQgcmF0aGVyIHRoYW4gZGlzcXVhbGlmeWluZyB0aGUgc2FtcGxlLiBJbiB0aGF0IGNhc2VcbiAgLy8gYHRyYWNraW5nLnByZVN0ZXBCbG9ja2luZ01zYCBhbHJlYWR5IGhvbGRzIG9ubHkgdGhlIGhvb2sgdGltZSBmcm9tXG4gIC8vIEJFRk9SRSB0aGUgYXR0ciB3cml0ZSDigJQgaG9vayB3cml0ZXMgYWZ0ZXIgdGhlIHdpbmRvdyBjbG9zZWQgYXJlIGV4Y2x1ZGVkXG4gIC8vIGJ5IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nIChzZWUgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zKS5cbiAgY29uc3QgdHRmc0VuZE1zID0gdHJhY2tpbmcucHJlU3RlcEF0dHJTdGFydE1zID8/IHBhcmFtcy5zdGVwQ29kZVN0YXJ0ZWRBdE1zO1xuICBjb25zdCByYXdUdGZzID1cbiAgICB0cmFja2luZy50dGZzQW5jaG9yTXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB0dGZzRW5kTXMgLSB0cmFja2luZy50dGZzQW5jaG9yTXMgLSAodHJhY2tpbmcucHJlU3RlcEJsb2NraW5nTXMgPz8gMClcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCB0dGZzID1cbiAgICByYXdUdGZzICE9PSB1bmRlZmluZWQgJiYgcmF3VHRmcyA+PSAtTUFYX0NMT0NLX1NLRVdfTVNcbiAgICAgID8gTWF0aC5tYXgoMCwgcmF3VHRmcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByYXdTdHNvID1cbiAgICB0cmFja2luZy5wcmV2U3RlcEVuZE1zICE9PSB1bmRlZmluZWRcbiAgICAgID8gcGFyYW1zLnN0ZXBDb2RlU3RhcnRlZEF0TXMgLSB0cmFja2luZy5wcmV2U3RlcEVuZE1zXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RzbyA9XG4gICAgcmF3U3RzbyAhPT0gdW5kZWZpbmVkICYmIHJhd1N0c28gPj0gLU1BWF9DTE9DS19TS0VXX01TXG4gICAgICA/IE1hdGgubWF4KDAsIHJhd1N0c28pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgLy8gUlNGUyBlbmRzIGF0IHRoZSBhY3R1YWwgc3RhcnQtUE9TVCBpbnN0YW50LCBub3QgYXQgdHRmc0VuZE1zIOKAlCB1bmxpa2VcbiAgLy8gVFRGUyBpdCBpcyBub3Qgc3ViamVjdCB0byB0aGUgcHJlLXN0ZXAgYXR0ci13cml0ZSBzaG9ydGN1dCwgc28gYVxuICAvLyBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzIGRldG91ciAocmFyZSkgbWFrZXMgUlNGUyBpbmNsdWRlIHRoZSBkZXRvdXJcbiAgLy8gd2hpbGUgVFRGUyBleGNsdWRlcyBpdC4gYGZpbmFsU2NoZWR1bGluZ1JlcGxheWAgaXMgYSBkaXJlY3QgcGFzc3Rocm91Z2hcbiAgLy8gb2YgYHRyYWNraW5nLnJlcGxheU1zYCDigJQgdGhlIEZJTkFMIHJlcGxheSBwYXNzIG9ubHkgKHNlZVxuICAvLyBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zKSDigJQgc28gbm8gZnVydGhlciBzdWJ0cmFjdGlvbiBhcHBsaWVzLCBidXRcbiAgLy8gaXQgYWxzbyBtZWFucyBpdCBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzIGFueSBlYXJsaWVyIHByZS1maXJzdC1zdGVwXG4gIC8vIHBhc3NlcyAoZS5nLiBhIHNldEF0dHJpYnV0ZXMgZGV0b3VyKSBhbmQgbXVzdCBub3QgYmUgcmVhZCBhcyBcInRoZVxuICAvLyByZXBsYXkgcG9ydGlvbiBvZiByc2ZzXCI7IHJzZnMgY292ZXJzIHRoZSB3aG9sZSB3aW5kb3cuXG4gIC8vXG4gIC8vIGZpbmFsU2NoZWR1bGluZ1JlcGxheSBkdXBsaWNhdGVzIHdoYXQgT1RFTCBhbHJlYWR5IGNhcHR1cmVzIG9uIHRoZSBydW4vaW52b2NhdGlvblxuICAvLyBzcGFuLCBidXQgaXMgZGVsaWJlcmF0ZWx5IGNvbGxlY3RlZCBhcyBjbGllbnQgdGVsZW1ldHJ5IHNvIHRoZSBzZXJ2ZXJcbiAgLy8gY2FuIGVtaXQgaXQgYXMgYW4gVU5TQU1QTEVELCBmdWxsLXBvcHVsYXRpb24gbWV0cmljOiB3b3JrZmxvdy1zZXJ2ZXInc1xuICAvLyBzZXJ2ZXIgc3BhbnMgYXJlIGhlYXZpbHkgc2FtcGxlZCBpbiBwcm9kdWN0aW9uICh+NyUpLCBhbmQgY2xpZW50IHNwYW5zXG4gIC8vIGNhbid0IGJlIGZpbHRlcmVkIGJ5IFNESyB2ZXJzaW9uLCBzbyBuZWl0aGVyIGNhbiBzZXJ2ZSBhcyB0aGVcbiAgLy8gZGFzaGJvYXJkJ3MgZXhhY3QgVFRGUyBkZWNvbXBvc2l0aW9uLlxuICBjb25zdCByc2ZzID1cbiAgICB0cmFja2luZy5yc2ZzQW5jaG9yTXMgIT09IHVuZGVmaW5lZCAmJlxuICAgIHBhcmFtcy5zdGVwU3RhcnRQb3N0U2VudEF0TXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyBNYXRoLm1heCgwLCBwYXJhbXMuc3RlcFN0YXJ0UG9zdFNlbnRBdE1zIC0gdHJhY2tpbmcucnNmc0FuY2hvck1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbmFsU2NoZWR1bGluZ1JlcGxheSA9XG4gICAgdHJhY2tpbmcucmVwbGF5TXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyBNYXRoLm1heCgwLCB0cmFja2luZy5yZXBsYXlNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIGlmICh0dGZzID09PSB1bmRlZmluZWQgJiYgc3RzbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG9wdGltaXphdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGlmICh0cmFja2luZy50dXJibykgb3B0aW1pemF0aW9ucy5wdXNoKCd0dXJibycpO1xuICBpZiAocGFyYW1zLmxhenlTdGVwU3RhcnQpIG9wdGltaXphdGlvbnMucHVzaCgnbGF6eVN0ZXBTdGFydCcpO1xuICBpZiAocGFyYW1zLm9wdGltaXN0aWNTdGFydCkgb3B0aW1pemF0aW9ucy5wdXNoKCdvcHRpbWlzdGljU3RhcnQnKTtcbiAgaWYgKHBhcmFtcy5wcmVjbGFpbWVkU3RhcnQpIG9wdGltaXphdGlvbnMucHVzaCgncHJlY2xhaW1lZFN0YXJ0Jyk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4odHRmcyAhPT0gdW5kZWZpbmVkID8geyB0dGZzIH0gOiB7fSksXG4gICAgLi4uKHN0c28gIT09IHVuZGVmaW5lZCA/IHsgc3RzbyB9IDoge30pLFxuICAgIC4uLihzdHNvICE9PSB1bmRlZmluZWQgJiYgdHJhY2tpbmcuc3RlcENvdW50ICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBzdGVwQ291bnQ6IHRyYWNraW5nLnN0ZXBDb3VudCB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4oc3RzbyAhPT0gdW5kZWZpbmVkICYmIHRyYWNraW5nLmV2ZW50Q291bnQgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IGV2ZW50Q291bnQ6IHRyYWNraW5nLmV2ZW50Q291bnQgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHJzZnMgIT09IHVuZGVmaW5lZCA/IHsgcnNmcyB9IDoge30pLFxuICAgIC4uLihmaW5hbFNjaGVkdWxpbmdSZXBsYXkgIT09IHVuZGVmaW5lZCA/IHsgZmluYWxTY2hlZHVsaW5nUmVwbGF5IH0gOiB7fSksXG4gICAgb3B0aW1pemF0aW9ucyxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -3,6 +3,7 @@ import { type SerializedData, type TraceCarrier, type ValidQueueName, type Workf
|
|
|
3
3
|
import type { StepInvocationQueueItem, WorkflowSuspension } from '../global.js';
|
|
4
4
|
import { type LoadedEventLog } from './helpers.js';
|
|
5
5
|
import { ReplayRecoveryReporter } from './replay-recovery-reporter.js';
|
|
6
|
+
import type { PreclaimedInlineStart } from './step-executor.js';
|
|
6
7
|
export interface SuspensionHandlerParams {
|
|
7
8
|
suspension: WorkflowSuspension;
|
|
8
9
|
world: World;
|
|
@@ -52,6 +53,31 @@ export interface SuspensionHandlerParams {
|
|
|
52
53
|
*/
|
|
53
54
|
getTraceCarrier: () => Promise<TraceCarrier>;
|
|
54
55
|
};
|
|
56
|
+
/**
|
|
57
|
+
* Inline step ownership: the queue message ID of the invocation this
|
|
58
|
+
* suspension runs in (the queue handler's meta). When present AND the
|
|
59
|
+
* batched fan-out engages, the lazy-inline steps' deferred writes are
|
|
60
|
+
* folded into the batch as `step_created` + `step_started` pairs — the
|
|
61
|
+
* started row stamped with this ID, exactly like the lazy claim it
|
|
62
|
+
* replaces — pre-claiming the steps the caller is about to run inline. See
|
|
63
|
+
* {@link SuspensionHandlerResult.inlineClaims}. Callers that never
|
|
64
|
+
* inline-execute (terminal drain) omit it, keeping their lazy steps on the
|
|
65
|
+
* plain deferred path.
|
|
66
|
+
*/
|
|
67
|
+
ownerMessageId?: string;
|
|
68
|
+
/**
|
|
69
|
+
* Lets the batched fan-out return before every chunk has committed: only
|
|
70
|
+
* the chunk carrying the pre-claimed inline pairs gates the handler's
|
|
71
|
+
* return (its claims are what the caller starts bodies from), while the
|
|
72
|
+
* trailing chunks' commits — and every chunk's in-flush step-message
|
|
73
|
+
* publishes — ride {@link SuspensionHandlerResult.deferredBatchWork}. A
|
|
74
|
+
* caller that opts in MUST await that promise before acking its delivery:
|
|
75
|
+
* the durability contract ("every create durable before ack") moves from
|
|
76
|
+
* the handler's return to that join, and nothing else re-drives a lost
|
|
77
|
+
* trailing chunk. Callers that don't opt in (terminal drain, default)
|
|
78
|
+
* keep the everything-durable-at-return behavior.
|
|
79
|
+
*/
|
|
80
|
+
allowDeferredBatchWork?: boolean;
|
|
55
81
|
}
|
|
56
82
|
/**
|
|
57
83
|
* Result of handling a suspension. Returns pending step items so the caller
|
|
@@ -104,6 +130,60 @@ export interface SuspensionHandlerResult {
|
|
|
104
130
|
stepName: string;
|
|
105
131
|
dehydratedInput: SerializedData;
|
|
106
132
|
}>;
|
|
133
|
+
/**
|
|
134
|
+
* Pre-claimed inline starts, by correlation id: the per-step verdicts of
|
|
135
|
+
* the `step_created` + `step_started` pairs the batched fan-out committed
|
|
136
|
+
* for the lazy-inline steps. A step with an entry here is passed to
|
|
137
|
+
* `executeStep` as `preclaimedStart` INSTEAD of `lazyStepInput` — its
|
|
138
|
+
* input already rode the pair, and the claim is settled: `owned: true`
|
|
139
|
+
* carries the started attempt-1 entity (input re-attached) so the body
|
|
140
|
+
* runs straight off the batch commit with no start write of its own;
|
|
141
|
+
* `owned: false` lost the pair's atomic create-claim to a concurrent
|
|
142
|
+
* writer, and executeStep returns `skipped` without running the body —
|
|
143
|
+
* the same outcome as losing the lazy claim. Empty whenever the fold did
|
|
144
|
+
* not engage (batching off, no `ownerMessageId`, or the lone-inline case,
|
|
145
|
+
* which keeps the optimistic lazy path and its claim/body overlap).
|
|
146
|
+
*
|
|
147
|
+
* Crash window: the pair commits before the caller runs the body, so a
|
|
148
|
+
* crash between them leaves a started step stamped with this message's
|
|
149
|
+
* ID. Redelivery of the same message re-executes it via the owned-recovery
|
|
150
|
+
* path — the exact machinery the lazy claim's crash window already uses.
|
|
151
|
+
*/
|
|
152
|
+
inlineClaims: Map<string, PreclaimedInlineStart>;
|
|
153
|
+
/**
|
|
154
|
+
* The highest slot the batched fan-out committed, when it ran. The batch's
|
|
155
|
+
* own events are not in the caller's loaded log (the next reload picks
|
|
156
|
+
* them up), so the caller folds this ceiling into the slot snapshot it
|
|
157
|
+
* hands the inline executions — otherwise every inline terminal write
|
|
158
|
+
* would name a pre-batch position and be answered with a skipped-slot
|
|
159
|
+
* report echoing the events this suspension just wrote. Under
|
|
160
|
+
* {@link SuspensionHandlerParams.allowDeferredBatchWork} this covers the
|
|
161
|
+
* chunks that had committed by the handler's return (always the pair
|
|
162
|
+
* chunk); a trailing chunk that commits later is echoed back on the
|
|
163
|
+
* terminal writes like any foreign event — reports the executor reads for
|
|
164
|
+
* position and discards.
|
|
165
|
+
*
|
|
166
|
+
* So the echo is only fully suppressed for a SINGLE-chunk fold. On a
|
|
167
|
+
* multi-chunk fan-out the bodies start off the pair chunk while trailing
|
|
168
|
+
* chunks are still in flight, and an inline terminal write issued in that
|
|
169
|
+
* window still names a position below them and still draws a report for
|
|
170
|
+
* their events. Bounded (trailing chunks only, large fan-outs only) and
|
|
171
|
+
* self-correcting on the next reload — recorded so a report seen there
|
|
172
|
+
* reads as expected rather than as a bug.
|
|
173
|
+
*/
|
|
174
|
+
batchCommittedSlotCeiling?: number;
|
|
175
|
+
/**
|
|
176
|
+
* The batched fan-out's deferred work, present only when the caller opted
|
|
177
|
+
* in via {@link SuspensionHandlerParams.allowDeferredBatchWork} and
|
|
178
|
+
* trailing work exists: the commits of every chunk except the pair chunk,
|
|
179
|
+
* plus every chunk's step-message publishes (each chained on ITS OWN
|
|
180
|
+
* chunk's commit, so publish-after-create holds per step). The caller
|
|
181
|
+
* MUST await it before acking — a rejection here is a failed suspension
|
|
182
|
+
* write and fails the delivery exactly as it would have at the handler's
|
|
183
|
+
* return. Steps whose messages this work publishes are already in
|
|
184
|
+
* {@link queuedStepCorrelationIds} at return time.
|
|
185
|
+
*/
|
|
186
|
+
deferredBatchWork?: Promise<void>;
|
|
107
187
|
/**
|
|
108
188
|
* The soonest pending wait, if any: seconds until it elapses and the
|
|
109
189
|
* correlationId of the wait that produced that timeout. The
|
|
@@ -153,5 +233,5 @@ export interface SuspensionHandlerResult {
|
|
|
153
233
|
* 1. Hooks are processed first to prevent race conditions with webhook receivers
|
|
154
234
|
* 2. Step events and wait events are created in parallel
|
|
155
235
|
*/
|
|
156
|
-
export declare function handleSuspension({ suspension, world, run, span, requestId, eventLog, runReadyBarrier, replayRecoveryReporter, stepDispatch, }: SuspensionHandlerParams): Promise<SuspensionHandlerResult>;
|
|
236
|
+
export declare function handleSuspension({ suspension, world, run, span, requestId, eventLog, runReadyBarrier, replayRecoveryReporter, stepDispatch, ownerMessageId, allowDeferredBatchWork, }: SuspensionHandlerParams): Promise<SuspensionHandlerResult>;
|
|
157
237
|
//# sourceMappingURL=suspension-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suspension-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/suspension-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAS/C,OAAO,EAKL,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"suspension-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/suspension-handler.ts"],"names":[],"mappings":"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"}
|