@aws-cdk/toolkit-lib 1.27.0 → 1.29.0

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.
Files changed (50) hide show
  1. package/build-info.json +2 -2
  2. package/db.json.gz +0 -0
  3. package/lib/actions/validate/index.d.ts +10 -0
  4. package/lib/actions/validate/index.js +1 -1
  5. package/lib/api/bootstrap/deploy-bootstrap.js +2 -1
  6. package/lib/api/cloud-assembly/environment.js +16 -4
  7. package/lib/api/deployments/cfn-api.d.ts +24 -6
  8. package/lib/api/deployments/cfn-api.js +81 -33
  9. package/lib/api/deployments/deploy-stack.js +8 -1
  10. package/lib/api/deployments/deployment-result.d.ts +6 -0
  11. package/lib/api/deployments/deployment-result.js +1 -1
  12. package/lib/api/hotswap/hotswap-deployments.js +2 -1
  13. package/lib/api/hotswap/lambda-functions.js +3 -33
  14. package/lib/api/io/private/index.d.ts +1 -0
  15. package/lib/api/io/private/index.js +2 -1
  16. package/lib/api/io/private/messages.d.ts +1 -0
  17. package/lib/api/io/private/messages.js +8 -4
  18. package/lib/api/io/private/span.d.ts +6 -0
  19. package/lib/api/io/private/span.js +10 -3
  20. package/lib/api/stack-events/stack-activity-monitor.d.ts +13 -1
  21. package/lib/api/stack-events/stack-activity-monitor.js +12 -2
  22. package/lib/api/stack-events/stack-event-poller.d.ts +7 -0
  23. package/lib/api/stack-events/stack-event-poller.js +20 -1
  24. package/lib/api/validate/validate-formatting.d.ts +5 -0
  25. package/lib/api/validate/validate-formatting.js +127 -0
  26. package/lib/api/work-graph/work-graph-builder.d.ts +3 -0
  27. package/lib/api/work-graph/work-graph-builder.js +38 -3
  28. package/lib/api/work-graph/work-graph-types.d.ts +19 -7
  29. package/lib/api/work-graph/work-graph-types.js +1 -1
  30. package/lib/api/work-graph/work-graph.d.ts +2 -1
  31. package/lib/api/work-graph/work-graph.js +8 -1
  32. package/lib/index_bg.wasm +0 -0
  33. package/lib/payloads/stack-activity.d.ts +6 -0
  34. package/lib/payloads/stack-activity.js +1 -1
  35. package/lib/private/activity-printer/base.d.ts +7 -1
  36. package/lib/private/activity-printer/base.js +16 -2
  37. package/lib/private/activity-printer/current.js +12 -6
  38. package/lib/private/activity-printer/history.js +15 -12
  39. package/lib/private/tools.d.ts +2 -0
  40. package/lib/private/tools.js +120 -0
  41. package/lib/private/tools.js.plain +21 -0
  42. package/lib/toolkit/toolkit.d.ts +2 -1
  43. package/lib/toolkit/toolkit.js +104 -19
  44. package/lib/toolkit/types.d.ts +30 -0
  45. package/lib/toolkit/types.js +1 -1
  46. package/lib/util/index.d.ts +0 -1
  47. package/lib/util/index.js +1 -2
  48. package/package.json +15 -13
  49. package/lib/util/archive.d.ts +0 -2
  50. package/lib/util/archive.js +0 -86
@@ -1,6 +1,7 @@
1
1
  import type { StackEvent } from '@aws-sdk/client-cloudformation';
2
2
  import type { ResourceError } from './resource-errors';
3
3
  import { ResourceErrors } from './resource-errors';
4
+ import type { ResourceDeleteFailure } from '../../toolkit/types';
4
5
  import type { ICloudFormationClient } from '../aws-auth/private';
5
6
  export interface StackEventPollerProps {
6
7
  /**
@@ -109,6 +110,11 @@ export declare class StackEventPoller {
109
110
  * A record of the errors we've seen
110
111
  */
111
112
  readonly errors: ResourceErrors;
113
+ /**
114
+ * Resources that received DELETE_FAILED during a stack update.
115
+ * CloudFormation skips these and completes the update anyway.
116
+ */
117
+ readonly deleteFailures: ResourceDeleteFailure[];
112
118
  private readonly eventIds;
113
119
  private readonly nestedStackPollers;
114
120
  constructor(cfn: ICloudFormationClient, props: StackEventPollerProps);
@@ -127,6 +133,7 @@ export declare class StackEventPoller {
127
133
  * invocations to `poll` will return *newer* events (also in old-to-new order).
128
134
  */
129
135
  poll(): Promise<ResourceEvent[]>;
136
+ private updateDeleteFailures;
130
137
  private doPoll;
131
138
  /**
132
139
  * On the CREATE_IN_PROGRESS, UPDATE_IN_PROGRESS, DELETE_IN_PROGRESS event of a nested stack, poll the nested stack updates
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.StackEventPoller = exports.PollRange = void 0;
4
+ const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
4
5
  const resource_errors_1 = require("./resource-errors");
5
6
  const util_1 = require("../../util");
6
7
  class PollRange {
@@ -96,6 +97,11 @@ class StackEventPoller {
96
97
  * A record of the errors we've seen
97
98
  */
98
99
  errors = new resource_errors_1.ResourceErrors();
100
+ /**
101
+ * Resources that received DELETE_FAILED during a stack update.
102
+ * CloudFormation skips these and completes the update anyway.
103
+ */
104
+ deleteFailures = [];
99
105
  eventIds = new Set();
100
106
  nestedStackPollers = {};
101
107
  constructor(cfn, props) {
@@ -131,8 +137,21 @@ class StackEventPoller {
131
137
  events.sort((a, b) => a.event.Timestamp.valueOf() - b.event.Timestamp.valueOf());
132
138
  this.events.push(...events);
133
139
  this.errors.update(...events);
140
+ this.updateDeleteFailures(events);
134
141
  return events;
135
142
  }
143
+ updateDeleteFailures(events) {
144
+ for (const { event } of events) {
145
+ if (event.ResourceStatus === client_cloudformation_1.ResourceStatus.DELETE_FAILED && event.ResourceType !== 'AWS::CloudFormation::Stack') {
146
+ this.deleteFailures.push({
147
+ logicalResourceId: event.LogicalResourceId ?? '',
148
+ physicalResourceId: event.PhysicalResourceId,
149
+ resourceType: event.ResourceType ?? '',
150
+ reason: event.ResourceStatusReason ?? '',
151
+ });
152
+ }
153
+ }
154
+ }
136
155
  async doPoll() {
137
156
  // If we already have events and we poll again, we can only get newer events up to
138
157
  // events we've already seen. No need to invoke the "oldestEvent" decider again.
@@ -224,4 +243,4 @@ function isStackBeginOperationState(state) {
224
243
  function isStackTerminalState(state) {
225
244
  return !(state ?? '').endsWith('_IN_PROGRESS');
226
245
  }
227
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stZXZlbnQtcG9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RhY2stZXZlbnQtcG9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHVEQUFtRDtBQUNuRCxxQ0FBa0U7QUFtQ2xFLE1BQXNCLFNBQVM7SUFDN0I7O09BRUc7SUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQWlCO1FBQzVDLE9BQU87WUFDTCxVQUFVLENBQUMsS0FBSztnQkFDZCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7WUFDcEYsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBa0I7UUFDL0MsT0FBTztZQUNMLFVBQVUsQ0FBQyxLQUFLO2dCQUNkLE9BQU8sS0FBSyxDQUFDLGdCQUFnQixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQ3JILENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsbUJBQW1CO1FBQy9CLElBQUksV0FBK0IsQ0FBQztRQUNwQyxPQUFPO1lBQ0wsVUFBVSxDQUFDLEtBQUs7Z0JBQ2QsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzlCLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztvQkFDdEMsT0FBTyxVQUFVLENBQUM7Z0JBQ3BCLENBQUM7Z0JBRUQsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxD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RTtnQkFDbEUsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIscUJBQXFCLEVBQUUscUJBQXFCO2dCQUM1QyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxTQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDdkUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXRKRCw0Q0FzSkM7QUFFRCxTQUFTLDBCQUEwQixDQUFDLEtBQXlCO0lBQzNELE9BQU87UUFDTCxvQkFBb0I7UUFDcEIsb0JBQW9CO1FBQ3BCLG9CQUFvQjtRQUNwQiw2QkFBNkI7UUFDN0Isc0JBQXNCO0tBQ3ZCLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxLQUF5QjtJQUNyRCxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0YWNrRXZlbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUVycm9yIH0gZnJvbSAnLi9yZXNvdXJjZS1lcnJvcnMnO1xuaW1wb3J0IHsgUmVzb3VyY2VFcnJvcnMgfSBmcm9tICcuL3Jlc291cmNlLWVycm9ycyc7XG5pbXBvcnQgeyBmb3JtYXRFcnJvck1lc3NhZ2UsIGlzUm9vdFN0YWNrRXZlbnQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgSUNsb3VkRm9ybWF0aW9uQ2xpZW50IH0gZnJvbSAnLi4vYXdzLWF1dGgvcHJpdmF0ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tFdmVudFBvbGxlclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0byBwb2xsXG4gICAqL1xuICByZWFkb25seSBzdGFja0Fybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJRHMgb2YgcGFyZW50IHN0YWNrcyBvZiB0aGlzIHJlc291cmNlLCBpbiBjYXNlIG9mIHJlc291cmNlcyBpbiBuZXN0ZWQgc3RhY2tzXG4gICAqL1xuICByZWFkb25seSBwYXJlbnRTdGFja0xvZ2ljYWxJZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSBjb25maWd1cmFibGUgYWxnb3JpdGhtIHRvIGluZGljYXRlIHdoZW4gd2Ugc2hvdWxkIHN0b3AgY29uc3VtaW5nIHRoZSBldmVudCBzdHJlYW0uXG4gICAqXG4gICAqIFRoZSBpbml0aWFsUG9sbFJhbmdlIG9iamVjdCB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZlxuICAgKiBwb2xsaW5nLiAgSXQgd2lsbCBiZSBzaG93biBhbGwgZXZlbnRzIGluIGEgY2h1bmsgaW4gdHVybiwgbmV3ZXN0LXRvLW9sZGVzdCxcbiAgICogYW5kIHNob3VsZCBkZWNpZGUgdGhlIG9sZGVzdCBldmVudCB3ZSdyZSBzdGlsbCBpbnRlcmVzdGVkIGluLiBXZSB3aWxsIG5vdFxuICAgKiBnbyBiYWNrIGZ1cnRoZXIgY29uc3VtaW5nIHRoZSBldmVudCBzdHJlYW0uXG4gICAqXG4gICAqIE9uIHN1YnNlcXVlbnQgcG9sbHMsIHdlIHdpbGwgdXNlIHRoZSBldmVudHMgd2UndmUgYWxyZWFkeSBzZWVuIHRvIGRlY2lkZSB3aGVuIHRvIHN0b3BcbiAgICogcG9sbGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGluaXRpYWxQb2xsUmFuZ2U6IElQb2xsUmFuZ2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBvbGxSYW5nZSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHBvbGxpbmcgc2hvdWxkIHN0b3Agb24gc2VlaW5nIHRoaXMgZXZlbnRcbiAgICovXG4gIHNob3VsZFN0b3AoZXZlbnQ6IFJlc291cmNlRXZlbnQpOiAnc3RvcC1pbmNsdWRlJyB8ICdzdG9wLWV4Y2x1ZGUnIHwgJ2NvbnRpbnVlJztcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBvbGxSYW5nZSB7XG4gIC8qKlxuICAgKiBPbmx5IGluY2x1ZGUgZXZlbnRzIHNpbmNlIHRoYW4gYSBnaXZlbiB0aW1lXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNpbmNlVGltZXN0YW1wKHN0YXJ0VGltZTogbnVtYmVyKTogSVBvbGxSYW5nZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3VsZFN0b3AoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50LmV2ZW50LlRpbWVzdGFtcCEudmFsdWVPZigpIDwgc3RhcnRUaW1lID8gJ3N0b3AtZXhjbHVkZScgOiAnY29udGludWUnO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3Agd2hlbiB3ZSBzZWUgdGhlIHJvb3Qgc3RhY2sgZW50ZXJpbmcgdGhpcyBzdGF0dXNcbiAgICpcbiAgICogU2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlIGBDUkVBVEVfSU5fUFJPR1JFU1NgLCBgVVBEQVRFX0lOX1BST0dSRVNTYCxcbiAgICogYERFTEVURV9JTl9QUk9HUkVTUywgYFJPTExCQUNLX0lOX1BST0dSRVNTYC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2luY2VTdGFja1N0YXR1cyhzdGF0dXNlczogc3RyaW5nW10pOiBJUG9sbFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvdWxkU3RvcChldmVudCkge1xuICAgICAgICByZXR1cm4gZXZlbnQuaXNSb290U3RhY2tFdmVudCAmJiBzdGF0dXNlcy5pbmNsdWRlcyhldmVudC5ldmVudC5SZXNvdXJjZVN0YXR1cyA/PyAnJykgPyAnc3RvcC1pbmNsdWRlJyA6ICdjb250aW51ZSc7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB3aGVuIHdlIHNlZSBldmVudHMgdGhhdCBiZWxvbmcgdG8gYSBkaWZmZXJlbnQgb3BlcmF0aW9uXG4gICAqXG4gICAqIFJlY29yZHMgdGhlIGZpcnN0IE9wZXJhdGlvbklkLCBhbmQgc3RvcHMgYXMgc29vbiBhcyB3ZSBzZWUgZXZlbnRzIHRoYXQgZG9uJ3QgaGF2ZSBpdCBhbnltb3JlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtb3N0UmVjZW50T3BlcmF0aW9uKCk6IElQb2xsUmFuZ2Uge1xuICAgIGxldCBvcGVyYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBzaG91bGRTdG9wKGV2ZW50KSB7XG4gICAgICAgIGlmIChvcGVyYXRpb25JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3BlcmF0aW9uSWQgPSBldmVudC5ldmVudC5PcGVyYXRpb25JZDtcbiAgICAgICAgICByZXR1cm4gJ2NvbnRpbnVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBldmVudC5ldmVudC5PcGVyYXRpb25JZCA9PT0gb3BlcmF0aW9uSWQgPyAnY29udGludWUnIDogJ3N0b3AtZXhjbHVkZSc7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQSBwb2xsIHJhbmdlIGRlY2lkZXIgdGhhdCBhbHdheXMgcmV0dXJucyAnY29udGludWUnLCBjb25zdW1pbmcgdGhlIGVudGlyZSBDRk4gZXZlbnQgc3RyZWFtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb25zdW1lQWxsKCk6IElQb2xsUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICBzaG91bGRTdG9wKCkge1xuICAgICAgICByZXR1cm4gJ2NvbnRpbnVlJztcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlRXZlbnQge1xuICAvKipcbiAgICogVGhlIFN0YWNrIEV2ZW50IGFzIHJlY2VpdmVkIGZyb20gQ2xvdWRGb3JtYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGV2ZW50OiBTdGFja0V2ZW50O1xuXG4gIC8qKlxuICAgKiBJRHMgb2YgcGFyZW50IHN0YWNrcyBvZiB0aGUgcmVzb3VyY2UsIGluIGNhc2Ugb2YgcmVzb3VyY2VzIGluIG5lc3RlZCBzdGFja3NcbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudFN0YWNrTG9naWNhbElkczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBldmVudCByZWdhcmRzIHRoZSByb290IHN0YWNrXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpc1Jvb3RTdGFja0V2ZW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQb2xsIGZvciBzdGFjayBldmVudHMsIHBvdGVudGlhbGx5IG11bHRpcGxlIHRpbWVzIGFzIG5ldyBldmVudHMgY29tZSBpbiBvdmVyIHRpbWVcbiAqXG4gKiBJbmNsdWRlcyBldmVudHMgZnJvbSBuZXN0ZWQgc3RhY2tzLlxuICpcbiAqIFBvbGxpbmcgbWF5IGhhcHBlbiBpbiBtdWx0aXBsZSBidXJzdHMsIGFuZCBldmVyeSBidXJzdCBjb25zdW1lcyBldmVudHMgZnJvbSBuZXdlc3QtdG8tb2xkZXN0XG4gKiBmcm9tIHRoZSBzdGFjayBldmVudHMgQVBJLCBzbyBldmVudHMgYXJlIGNvbnN1bWVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6XG4gKlxuICogYGBgXG4gKiBDT05TVU1JTkdcbiAqXG4gKiBzdGFjayBldmVudHMgICAobmV3KSB6IHkgeCB3IHYgdSB0IHMgciBxIHAgbyBuIG0gbCBrIGogaSBoIGcgZiBlIGQgYyBiIGEgKG9sZClcbiAqIGJ1cnN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgICBwb2xsKCkgIzEgICAgXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgIHBvbGwoKSAjMiAgIF0gICAgICAgICAgICAgICBeXG4gKiAgICAgICAgICAgICAgICAgICAgIFsgIHBvbGwoKSAjMyAgIF0gICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFBvbGxSYW5nZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaWRlcyB0byBzdG9wIGhlcmVcbiAqIGBgYFxuICpcbiAqIEV2ZW50cyBhcmUgc29ydGVkIG9sZC10by1uZXcgYmVmb3JlIGJlaW5nIHJldHVybmVkLCBzbyB0aGUgZXZlbnRzIHJldHVybmVkIGJ5IGVhY2hcbiAqIHBvbGwgYXJlOlxuICpcbiAqIGBgYFxuICogcG9sbCgpICMxID0+IFtlIGYgZyBoIGkgaiBrIGxdXG4gKiBwb2xsKCkgIzIgPT4gW20gbiBvIHAgcSByIHNdXG4gKiBwb2xsKCkgIzMgPT4gW3QgdSB2IHcgeCB5IHpdXG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFja0V2ZW50UG9sbGVyIHtcbiAgLyoqXG4gICAqIEFsbCBldmVudHMgd2UndmUgc2VlbiBzbyBmYXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBldmVudHM6IFJlc291cmNlRXZlbnRbXSA9IFtdO1xuICBwdWJsaWMgY29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQSByZWNvcmQgb2YgdGhlIGVycm9ycyB3ZSd2ZSBzZWVuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXJyb3JzID0gbmV3IFJlc291cmNlRXJyb3JzKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBldmVudElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5lc3RlZFN0YWNrUG9sbGVyczogUmVjb3JkPHN0cmluZywgU3RhY2tFdmVudFBvbGxlcj4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNmbjogSUNsb3VkRm9ybWF0aW9uQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IFN0YWNrRXZlbnRQb2xsZXJQcm9wcyxcbiAgKSB7XG4gIH1cblxuICAvKipcbiAgICogRnJvbSBhbGwgYWNjdW11bGF0ZWQgZXZlbnRzLCByZXR1cm4gb25seSB0aGUgZXJyb3JzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlRXJyb3JzKCk6IFJlYWRvbmx5QXJyYXk8UmVzb3VyY2VFcnJvcj4ge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5hbGw7XG4gIH1cblxuICAvKipcbiAgICogUG9sbCBmb3IgbmV3IHN0YWNrIGV2ZW50c1xuICAgKlxuICAgKiBXaWxsIHJlYWQgYWxsIGV2ZW50cyB0aGF0IGFyZSBhdmFpbGFibGUgdXAgdW50aWwgdGhlIG9sZGVzdCBldmVudHNcbiAgICogaW5kaWNhdGVkIGJ5IHRoZSBjb25zdHJ1Y3RvciBmaWx0ZXJzLCBvciB1bnRpbCBpdCBlbmNvdW50ZXJzIGV2ZW50cyB0aGF0IGl0XG4gICAqIGhhcyBhbHJlYWR5IHJlYWQgYmVmb3JlLlxuICAgKlxuICAgKiBSZWN1cnNlcyBpbnRvIG5lc3RlZCBzdGFja3MsIGFuZCByZXR1cm5zIGV2ZW50cyBvbGQtdG8tbmV3LiBNdWx0aXBsZVxuICAgKiBpbnZvY2F0aW9ucyB0byBgcG9sbGAgd2lsbCByZXR1cm4gKm5ld2VyKiBldmVudHMgKGFsc28gaW4gb2xkLXRvLW5ldyBvcmRlcikuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcG9sbCgpOiBQcm9taXNlPFJlc291cmNlRXZlbnRbXT4ge1xuICAgIGNvbnN0IGV2ZW50czogUmVzb3VyY2VFdmVudFtdID0gYXdhaXQgdGhpcy5kb1BvbGwoKTtcblxuICAgIC8vIEFsc28gcG9sbCBhbGwgbmVzdGVkIHN0YWNrcyB3ZSdyZSBjdXJyZW50bHkgdHJhY2tpbmdcbiAgICBmb3IgKGNvbnN0IFtsb2dpY2FsSWQsIHBvbGxlcl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5uZXN0ZWRTdGFja1BvbGxlcnMpKSB7XG4gICAgICBldmVudHMucHVzaCguLi4oYXdhaXQgcG9sbGVyLnBvbGwoKSkpO1xuICAgICAgaWYgKHBvbGxlci5jb21wbGV0ZSkge1xuICAgICAgICBkZWxldGUgdGhpcy5uZXN0ZWRTdGFja1BvbGxlcnNbbG9naWNhbElkXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gd2hhdCB3ZSBoYXZlIHNvIGZhclxuICAgIGV2ZW50cy5zb3J0KChhLCBiKSA9PiBhLmV2ZW50LlRpbWVzdGFtcCEudmFsdWVPZigpIC0gYi5ldmVudC5UaW1lc3RhbXAhLnZhbHVlT2YoKSk7XG4gICAgdGhpcy5ldmVudHMucHVzaCguLi5ldmVudHMpO1xuXG4gICAgdGhpcy5lcnJvcnMudXBkYXRlKC4uLmV2ZW50cyk7XG5cbiAgICByZXR1cm4gZXZlbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkb1BvbGwoKTogUHJvbWlzZTxSZXNvdXJjZUV2ZW50W10+IHtcbiAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgZXZlbnRzIGFuZCB3ZSBwb2xsIGFnYWluLCB3ZSBjYW4gb25seSBnZXQgbmV3ZXIgZXZlbnRzIHVwIHRvXG4gICAgLy8gZXZlbnRzIHdlJ3ZlIGFscmVhZHkgc2Vlbi4gTm8gbmVlZCB0byBpbnZva2UgdGhlIFwib2xkZXN0RXZlbnRcIiBkZWNpZGVyIGFnYWluLlxuICAgIGNvbnN0IHN0b3BEZWNpZGVyID0gdGhpcy5ldmVudElkcy5zaXplID4gMCA/IFBvbGxSYW5nZS5jb25zdW1lQWxsKCkgOiB0aGlzLnByb3BzLmluaXRpYWxQb2xsUmFuZ2U7XG5cbiAgICBjb25zdCBldmVudHM6IFJlc291cmNlRXZlbnRbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBsZXQgbmV4dFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKCFmaW5pc2hlZCkge1xuICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5jZm4uZGVzY3JpYmVTdGFja0V2ZW50cyh7IFN0YWNrTmFtZTogdGhpcy5wcm9wcy5zdGFja0FybiwgTmV4dFRva2VuOiBuZXh0VG9rZW4gfSk7XG4gICAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgcGFnZT8uU3RhY2tFdmVudHMgPz8gW10pIHtcbiAgICAgICAgICAvLyBBbHJlYWR5IHNlZW4gdGhpcyBvbmVcbiAgICAgICAgICBpZiAodGhpcy5ldmVudElkcy5oYXMoZXZlbnQuRXZlbnRJZCEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGlzUGFyZW50U3RhY2tFdmVudCA9IGlzUm9vdFN0YWNrRXZlbnQoZXZlbnQpO1xuICAgICAgICAgIC8vIEZyZXNoIGV2ZW50XG4gICAgICAgICAgY29uc3QgcmVzRXZlbnQ6IFJlc291cmNlRXZlbnQgPSB7XG4gICAgICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgICAgICBwYXJlbnRTdGFja0xvZ2ljYWxJZHM6IHRoaXMucHJvcHMucGFyZW50U3RhY2tMb2dpY2FsSWRzID8/IFtdLFxuICAgICAgICAgICAgaXNSb290U3RhY2tFdmVudDogaXNQYXJlbnRTdGFja0V2ZW50LFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBNYWtlIGEgc3RvcCBkZWNpc2lvblxuICAgICAgICAgIGNvbnN0IHN0b3BEZWNpc2lvbiA9IHN0b3BEZWNpZGVyLnNob3VsZFN0b3AocmVzRXZlbnQpO1xuICAgICAgICAgIGlmIChzdG9wRGVjaXNpb24gPT09ICdzdG9wLWV4Y2x1ZGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZXZlbnRJZHMuYWRkKGV2ZW50LkV2ZW50SWQhKTtcblxuICAgICAgICAgIGV2ZW50cy5wdXNoKHJlc0V2ZW50KTtcblxuICAgICAgICAgIGlmIChzdG9wRGVjaXNpb24gPT09ICdzdG9wLWluY2x1ZGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFpc1BhcmVudFN0YWNrRXZlbnQgJiZcbiAgICAgICAgICAgICAgZXZlbnQuUmVzb3VyY2VUeXBlID09PSAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snICYmXG4gICAgICAgICAgICAgIGlzU3RhY2tCZWdpbk9wZXJhdGlvblN0YXRlKGV2ZW50LlJlc291cmNlU3RhdHVzKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGV2ZW50IGlzIG5vdCBmb3IgYHRoaXNgIHN0YWNrIGFuZCBoYXMgYSBwaHlzaWNhbCByZXNvdXJjZSBJZCwgcmVjdXJzaXZlbHkgY2FsbCBmb3IgZXZlbnRzIGluIHRoZSBuZXN0ZWQgc3RhY2tcbiAgICAgICAgICAgIHRoaXMudHJhY2tOZXN0ZWRTdGFjayhldmVudCwgWy4uLih0aGlzLnByb3BzLnBhcmVudFN0YWNrTG9naWNhbElkcyA/PyBbXSksIGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkID8/ICcnXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGlzUGFyZW50U3RhY2tFdmVudCAmJiBpc1N0YWNrVGVybWluYWxTdGF0ZShldmVudC5SZXNvdXJjZVN0YXR1cykpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRUb2tlbiA9IHBhZ2U/Lk5leHRUb2tlbjtcbiAgICAgICAgaWYgKG5leHRUb2tlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAvLyBDRk4gcmV0dXJucyB0aGUgaW5wdXQgZXhhY3RseSBhcyBwcm92aWRlZCBieSB1cyB0byB0aGUgYERlc2NyaWJlU3RhY2tFdmVudHNgIGFwaSBjYWxsXG4gICAgICBpZiAoIShlLm5hbWUgPT09ICdWYWxpZGF0aW9uRXJyb3InICYmIGZvcm1hdEVycm9yTWVzc2FnZShlKSA9PT0gYFN0YWNrIFske3RoaXMucHJvcHMuc3RhY2tBcm59XSBkb2VzIG5vdCBleGlzdGApKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiB0aGUgQ1JFQVRFX0lOX1BST0dSRVNTLCBVUERBVEVfSU5fUFJPR1JFU1MsIERFTEVURV9JTl9QUk9HUkVTUyBldmVudCBvZiBhIG5lc3RlZCBzdGFjaywgcG9sbCB0aGUgbmVzdGVkIHN0YWNrIHVwZGF0ZXNcbiAgICovXG4gIHByaXZhdGUgdHJhY2tOZXN0ZWRTdGFjayhldmVudDogU3RhY2tFdmVudCwgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IGxvZ2ljYWxJZCA9IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkO1xuICAgIGNvbnN0IHBoeXNpY2FsUmVzb3VyY2VJZCA9IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZDtcblxuICAgIC8vIFRoZSBDUkVBVEVfSU5fUFJPR1JFU1MgZXZlbnQgZm9yIGEgTmVzdGVkIFN0YWNrIGlzIGVtaXR0ZWQgdHdpY2U7IGZpcnN0IHdpdGhvdXQgYSBQaHlzaWNhbFJlc291cmNlSWRcbiAgICAvLyBhbmQgdGhlbiB3aXRoLiBJZ25vcmUgdGhpcyBldmVudCBpZiB3ZSBkb24ndCBoYXZlIHRoYXQgcHJvcGVydHkgeWV0LlxuICAgIC8vXG4gICAgLy8gKEF0IHRoaXMgcG9pbnQsIEkgYWxzbyBkb24ndCB0cnVzdCB0aGF0IGxvZ2ljYWxJZCBpcyBhbHdheXMgZ29pbmcgdG8gYmUgdGhlcmUgc28gdmFsaWRhdGUgdGhhdCBhcyB3ZWxsKVxuICAgIGlmICghbG9naWNhbElkIHx8ICFwaHlzaWNhbFJlc291cmNlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubmVzdGVkU3RhY2tQb2xsZXJzW2xvZ2ljYWxJZF0pIHtcbiAgICAgIHRoaXMubmVzdGVkU3RhY2tQb2xsZXJzW2xvZ2ljYWxJZF0gPSBuZXcgU3RhY2tFdmVudFBvbGxlcih0aGlzLmNmbiwge1xuICAgICAgICBzdGFja0FybjogcGh5c2ljYWxSZXNvdXJjZUlkLFxuICAgICAgICBwYXJlbnRTdGFja0xvZ2ljYWxJZHM6IHBhcmVudFN0YWNrTG9naWNhbElkcyxcbiAgICAgICAgaW5pdGlhbFBvbGxSYW5nZTogUG9sbFJhbmdlLnNpbmNlVGltZXN0YW1wKGV2ZW50LlRpbWVzdGFtcCEudmFsdWVPZigpKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1N0YWNrQmVnaW5PcGVyYXRpb25TdGF0ZShzdGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gIHJldHVybiBbXG4gICAgJ0NSRUFURV9JTl9QUk9HUkVTUycsXG4gICAgJ1VQREFURV9JTl9QUk9HUkVTUycsXG4gICAgJ0RFTEVURV9JTl9QUk9HUkVTUycsXG4gICAgJ1VQREFURV9ST0xMQkFDS19JTl9QUk9HUkVTUycsXG4gICAgJ1JPTExCQUNLX0lOX1BST0dSRVNTJyxcbiAgXS5pbmNsdWRlcyhzdGF0ZSA/PyAnJyk7XG59XG5cbmZ1bmN0aW9uIGlzU3RhY2tUZXJtaW5hbFN0YXRlKHN0YXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgcmV0dXJuICEoc3RhdGUgPz8gJycpLmVuZHNXaXRoKCdfSU5fUFJPR1JFU1MnKTtcbn1cbiJdfQ==
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stZXZlbnQtcG9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RhY2stZXZlbnQtcG9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDBFQUFnRTtBQUVoRSx1REFBbUQ7QUFFbkQscUNBQWtFO0FBbUNsRSxNQUFzQixTQUFTO0lBQzdCOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFpQjtRQUM1QyxPQUFPO1lBQ0wsVUFBVSxDQUFDLEtBQUs7Z0JBQ2QsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQ3BGLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQWtCO1FBQy9DLE9BQU87WUFDTCxVQUFVLENBQUMsS0FBSztnQkFDZCxPQUFPLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUNySCxDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLG1CQUFtQjtRQUMvQixJQUFJLFdBQStCLENBQUM7UUFDcEMsT0FBTztZQUNMLFVBQVUsQ0FBQyxLQUFLO2dCQUNkLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUM5QixXQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7b0JBQ3RDLE9BQU8sVUFBVSxDQUFDO2dCQUNwQixDQUFDO2dCQUVELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FB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QUFLLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0YWNrRXZlbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgUmVzb3VyY2VTdGF0dXMgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUVycm9yIH0gZnJvbSAnLi9yZXNvdXJjZS1lcnJvcnMnO1xuaW1wb3J0IHsgUmVzb3VyY2VFcnJvcnMgfSBmcm9tICcuL3Jlc291cmNlLWVycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlRGVsZXRlRmFpbHVyZSB9IGZyb20gJy4uLy4uL3Rvb2xraXQvdHlwZXMnO1xuaW1wb3J0IHsgZm9ybWF0RXJyb3JNZXNzYWdlLCBpc1Jvb3RTdGFja0V2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgdHlwZSB7IElDbG91ZEZvcm1hdGlvbkNsaWVudCB9IGZyb20gJy4uL2F3cy1hdXRoL3ByaXZhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrRXZlbnRQb2xsZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdG8gcG9sbFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tBcm46IHN0cmluZztcblxuICAvKipcbiAgICogSURzIG9mIHBhcmVudCBzdGFja3Mgb2YgdGhpcyByZXNvdXJjZSwgaW4gY2FzZSBvZiByZXNvdXJjZXMgaW4gbmVzdGVkIHN0YWNrc1xuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50U3RhY2tMb2dpY2FsSWRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgY29uZmlndXJhYmxlIGFsZ29yaXRobSB0byBpbmRpY2F0ZSB3aGVuIHdlIHNob3VsZCBzdG9wIGNvbnN1bWluZyB0aGUgZXZlbnQgc3RyZWFtLlxuICAgKlxuICAgKiBUaGUgaW5pdGlhbFBvbGxSYW5nZSBvYmplY3Qgd2lsbCBiZSBjYWxsZWQgb24gdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2ZcbiAgICogcG9sbGluZy4gIEl0IHdpbGwgYmUgc2hvd24gYWxsIGV2ZW50cyBpbiBhIGNodW5rIGluIHR1cm4sIG5ld2VzdC10by1vbGRlc3QsXG4gICAqIGFuZCBzaG91bGQgZGVjaWRlIHRoZSBvbGRlc3QgZXZlbnQgd2UncmUgc3RpbGwgaW50ZXJlc3RlZCBpbi4gV2Ugd2lsbCBub3RcbiAgICogZ28gYmFjayBmdXJ0aGVyIGNvbnN1bWluZyB0aGUgZXZlbnQgc3RyZWFtLlxuICAgKlxuICAgKiBPbiBzdWJzZXF1ZW50IHBvbGxzLCB3ZSB3aWxsIHVzZSB0aGUgZXZlbnRzIHdlJ3ZlIGFscmVhZHkgc2VlbiB0byBkZWNpZGUgd2hlbiB0byBzdG9wXG4gICAqIHBvbGxpbmcuXG4gICAqL1xuICByZWFkb25seSBpbml0aWFsUG9sbFJhbmdlOiBJUG9sbFJhbmdlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQb2xsUmFuZ2Uge1xuICAvKipcbiAgICogV2hldGhlciBwb2xsaW5nIHNob3VsZCBzdG9wIG9uIHNlZWluZyB0aGlzIGV2ZW50XG4gICAqL1xuICBzaG91bGRTdG9wKGV2ZW50OiBSZXNvdXJjZUV2ZW50KTogJ3N0b3AtaW5jbHVkZScgfCAnc3RvcC1leGNsdWRlJyB8ICdjb250aW51ZSc7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQb2xsUmFuZ2Uge1xuICAvKipcbiAgICogT25seSBpbmNsdWRlIGV2ZW50cyBzaW5jZSB0aGFuIGEgZ2l2ZW4gdGltZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzaW5jZVRpbWVzdGFtcChzdGFydFRpbWU6IG51bWJlcik6IElQb2xsUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICBzaG91bGRTdG9wKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBldmVudC5ldmVudC5UaW1lc3RhbXAhLnZhbHVlT2YoKSA8IHN0YXJ0VGltZSA/ICdzdG9wLWV4Y2x1ZGUnIDogJ2NvbnRpbnVlJztcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHdoZW4gd2Ugc2VlIHRoZSByb290IHN0YWNrIGVudGVyaW5nIHRoaXMgc3RhdHVzXG4gICAqXG4gICAqIFNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSBgQ1JFQVRFX0lOX1BST0dSRVNTYCwgYFVQREFURV9JTl9QUk9HUkVTU2AsXG4gICAqIGBERUxFVEVfSU5fUFJPR1JFU1MsIGBST0xMQkFDS19JTl9QUk9HUkVTU2AuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNpbmNlU3RhY2tTdGF0dXMoc3RhdHVzZXM6IHN0cmluZ1tdKTogSVBvbGxSYW5nZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3VsZFN0b3AoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50LmlzUm9vdFN0YWNrRXZlbnQgJiYgc3RhdHVzZXMuaW5jbHVkZXMoZXZlbnQuZXZlbnQuUmVzb3VyY2VTdGF0dXMgPz8gJycpID8gJ3N0b3AtaW5jbHVkZScgOiAnY29udGludWUnO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3Agd2hlbiB3ZSBzZWUgZXZlbnRzIHRoYXQgYmVsb25nIHRvIGEgZGlmZmVyZW50IG9wZXJhdGlvblxuICAgKlxuICAgKiBSZWNvcmRzIHRoZSBmaXJzdCBPcGVyYXRpb25JZCwgYW5kIHN0b3BzIGFzIHNvb24gYXMgd2Ugc2VlIGV2ZW50cyB0aGF0IGRvbid0IGhhdmUgaXQgYW55bW9yZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbW9zdFJlY2VudE9wZXJhdGlvbigpOiBJUG9sbFJhbmdlIHtcbiAgICBsZXQgb3BlcmF0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvdWxkU3RvcChldmVudCkge1xuICAgICAgICBpZiAob3BlcmF0aW9uSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9wZXJhdGlvbklkID0gZXZlbnQuZXZlbnQuT3BlcmF0aW9uSWQ7XG4gICAgICAgICAgcmV0dXJuICdjb250aW51ZSc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXZlbnQuZXZlbnQuT3BlcmF0aW9uSWQgPT09IG9wZXJhdGlvbklkID8gJ2NvbnRpbnVlJyA6ICdzdG9wLWV4Y2x1ZGUnO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgcG9sbCByYW5nZSBkZWNpZGVyIHRoYXQgYWx3YXlzIHJldHVybnMgJ2NvbnRpbnVlJywgY29uc3VtaW5nIHRoZSBlbnRpcmUgQ0ZOIGV2ZW50IHN0cmVhbS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29uc3VtZUFsbCgpOiBJUG9sbFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvdWxkU3RvcCgpIHtcbiAgICAgICAgcmV0dXJuICdjb250aW51ZSc7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUV2ZW50IHtcbiAgLyoqXG4gICAqIFRoZSBTdGFjayBFdmVudCBhcyByZWNlaXZlZCBmcm9tIENsb3VkRm9ybWF0aW9uXG4gICAqL1xuICByZWFkb25seSBldmVudDogU3RhY2tFdmVudDtcblxuICAvKipcbiAgICogSURzIG9mIHBhcmVudCBzdGFja3Mgb2YgdGhlIHJlc291cmNlLCBpbiBjYXNlIG9mIHJlc291cmNlcyBpbiBuZXN0ZWQgc3RhY2tzXG4gICAqL1xuICByZWFkb25seSBwYXJlbnRTdGFja0xvZ2ljYWxJZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZXZlbnQgcmVnYXJkcyB0aGUgcm9vdCBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaXNSb290U3RhY2tFdmVudD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUG9sbCBmb3Igc3RhY2sgZXZlbnRzLCBwb3RlbnRpYWxseSBtdWx0aXBsZSB0aW1lcyBhcyBuZXcgZXZlbnRzIGNvbWUgaW4gb3ZlciB0aW1lXG4gKlxuICogSW5jbHVkZXMgZXZlbnRzIGZyb20gbmVzdGVkIHN0YWNrcy5cbiAqXG4gKiBQb2xsaW5nIG1heSBoYXBwZW4gaW4gbXVsdGlwbGUgYnVyc3RzLCBhbmQgZXZlcnkgYnVyc3QgY29uc3VtZXMgZXZlbnRzIGZyb20gbmV3ZXN0LXRvLW9sZGVzdFxuICogZnJvbSB0aGUgc3RhY2sgZXZlbnRzIEFQSSwgc28gZXZlbnRzIGFyZSBjb25zdW1lZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOlxuICpcbiAqIGBgYFxuICogQ09OU1VNSU5HXG4gKlxuICogc3RhY2sgZXZlbnRzICAgKG5ldykgeiB5IHggdyB2IHUgdCBzIHIgcSBwIG8gbiBtIGwgayBqIGkgaCBnIGYgZSBkIGMgYiBhIChvbGQpXG4gKiBidXJzdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICAgcG9sbCgpICMxICAgIF1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICBwb2xsKCkgIzIgICBdICAgICAgICAgICAgICAgXlxuICogICAgICAgICAgICAgICAgICAgICBbICBwb2xsKCkgIzMgICBdICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxQb2xsUmFuZ2VcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2lkZXMgdG8gc3RvcCBoZXJlXG4gKiBgYGBcbiAqXG4gKiBFdmVudHMgYXJlIHNvcnRlZCBvbGQtdG8tbmV3IGJlZm9yZSBiZWluZyByZXR1cm5lZCwgc28gdGhlIGV2ZW50cyByZXR1cm5lZCBieSBlYWNoXG4gKiBwb2xsIGFyZTpcbiAqXG4gKiBgYGBcbiAqIHBvbGwoKSAjMSA9PiBbZSBmIGcgaCBpIGogayBsXVxuICogcG9sbCgpICMyID0+IFttIG4gbyBwIHEgciBzXVxuICogcG9sbCgpICMzID0+IFt0IHUgdiB3IHggeSB6XVxuICogYGBgXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU3RhY2tFdmVudFBvbGxlciB7XG4gIC8qKlxuICAgKiBBbGwgZXZlbnRzIHdlJ3ZlIHNlZW4gc28gZmFyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXZlbnRzOiBSZXNvdXJjZUV2ZW50W10gPSBbXTtcbiAgcHVibGljIGNvbXBsZXRlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIG9mIHRoZSBlcnJvcnMgd2UndmUgc2VlblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVycm9ycyA9IG5ldyBSZXNvdXJjZUVycm9ycygpO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZXMgdGhhdCByZWNlaXZlZCBERUxFVEVfRkFJTEVEIGR1cmluZyBhIHN0YWNrIHVwZGF0ZS5cbiAgICogQ2xvdWRGb3JtYXRpb24gc2tpcHMgdGhlc2UgYW5kIGNvbXBsZXRlcyB0aGUgdXBkYXRlIGFueXdheS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZWxldGVGYWlsdXJlczogUmVzb3VyY2VEZWxldGVGYWlsdXJlW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmVzdGVkU3RhY2tQb2xsZXJzOiBSZWNvcmQ8c3RyaW5nLCBTdGFja0V2ZW50UG9sbGVyPiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2ZuOiBJQ2xvdWRGb3JtYXRpb25DbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogU3RhY2tFdmVudFBvbGxlclByb3BzLFxuICApIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBGcm9tIGFsbCBhY2N1bXVsYXRlZCBldmVudHMsIHJldHVybiBvbmx5IHRoZSBlcnJvcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VFcnJvcnMoKTogUmVhZG9ubHlBcnJheTxSZXNvdXJjZUVycm9yPiB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmFsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xsIGZvciBuZXcgc3RhY2sgZXZlbnRzXG4gICAqXG4gICAqIFdpbGwgcmVhZCBhbGwgZXZlbnRzIHRoYXQgYXJlIGF2YWlsYWJsZSB1cCB1bnRpbCB0aGUgb2xkZXN0IGV2ZW50c1xuICAgKiBpbmRpY2F0ZWQgYnkgdGhlIGNvbnN0cnVjdG9yIGZpbHRlcnMsIG9yIHVudGlsIGl0IGVuY291bnRlcnMgZXZlbnRzIHRoYXQgaXRcbiAgICogaGFzIGFscmVhZHkgcmVhZCBiZWZvcmUuXG4gICAqXG4gICAqIFJlY3Vyc2VzIGludG8gbmVzdGVkIHN0YWNrcywgYW5kIHJldHVybnMgZXZlbnRzIG9sZC10by1uZXcuIE11bHRpcGxlXG4gICAqIGludm9jYXRpb25zIHRvIGBwb2xsYCB3aWxsIHJldHVybiAqbmV3ZXIqIGV2ZW50cyAoYWxzbyBpbiBvbGQtdG8tbmV3IG9yZGVyKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwb2xsKCk6IFByb21pc2U8UmVzb3VyY2VFdmVudFtdPiB7XG4gICAgY29uc3QgZXZlbnRzOiBSZXNvdXJjZUV2ZW50W10gPSBhd2FpdCB0aGlzLmRvUG9sbCgpO1xuXG4gICAgLy8gQWxzbyBwb2xsIGFsbCBuZXN0ZWQgc3RhY2tzIHdlJ3JlIGN1cnJlbnRseSB0cmFja2luZ1xuICAgIGZvciAoY29uc3QgW2xvZ2ljYWxJZCwgcG9sbGVyXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm5lc3RlZFN0YWNrUG9sbGVycykpIHtcbiAgICAgIGV2ZW50cy5wdXNoKC4uLihhd2FpdCBwb2xsZXIucG9sbCgpKSk7XG4gICAgICBpZiAocG9sbGVyLmNvbXBsZXRlKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm5lc3RlZFN0YWNrUG9sbGVyc1tsb2dpY2FsSWRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiB3aGF0IHdlIGhhdmUgc28gZmFyXG4gICAgZXZlbnRzLnNvcnQoKGEsIGIpID0+IGEuZXZlbnQuVGltZXN0YW1wIS52YWx1ZU9mKCkgLSBiLmV2ZW50LlRpbWVzdGFtcCEudmFsdWVPZigpKTtcbiAgICB0aGlzLmV2ZW50cy5wdXNoKC4uLmV2ZW50cyk7XG5cbiAgICB0aGlzLmVycm9ycy51cGRhdGUoLi4uZXZlbnRzKTtcbiAgICB0aGlzLnVwZGF0ZURlbGV0ZUZhaWx1cmVzKGV2ZW50cyk7XG5cbiAgICByZXR1cm4gZXZlbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEZWxldGVGYWlsdXJlcyhldmVudHM6IFJlc291cmNlRXZlbnRbXSkge1xuICAgIGZvciAoY29uc3QgeyBldmVudCB9IG9mIGV2ZW50cykge1xuICAgICAgaWYgKGV2ZW50LlJlc291cmNlU3RhdHVzID09PSBSZXNvdXJjZVN0YXR1cy5ERUxFVEVfRkFJTEVEICYmIGV2ZW50LlJlc291cmNlVHlwZSAhPT0gJ0FXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrJykge1xuICAgICAgICB0aGlzLmRlbGV0ZUZhaWx1cmVzLnB1c2goe1xuICAgICAgICAgIGxvZ2ljYWxSZXNvdXJjZUlkOiBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCA/PyAnJyxcbiAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IGV2ZW50LlJlc291cmNlVHlwZSA/PyAnJyxcbiAgICAgICAgICByZWFzb246IGV2ZW50LlJlc291cmNlU3RhdHVzUmVhc29uID8/ICcnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRvUG9sbCgpOiBQcm9taXNlPFJlc291cmNlRXZlbnRbXT4ge1xuICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBldmVudHMgYW5kIHdlIHBvbGwgYWdhaW4sIHdlIGNhbiBvbmx5IGdldCBuZXdlciBldmVudHMgdXAgdG9cbiAgICAvLyBldmVudHMgd2UndmUgYWxyZWFkeSBzZWVuLiBObyBuZWVkIHRvIGludm9rZSB0aGUgXCJvbGRlc3RFdmVudFwiIGRlY2lkZXIgYWdhaW4uXG4gICAgY29uc3Qgc3RvcERlY2lkZXIgPSB0aGlzLmV2ZW50SWRzLnNpemUgPiAwID8gUG9sbFJhbmdlLmNvbnN1bWVBbGwoKSA6IHRoaXMucHJvcHMuaW5pdGlhbFBvbGxSYW5nZTtcblxuICAgIGNvbnN0IGV2ZW50czogUmVzb3VyY2VFdmVudFtdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gICAgICB3aGlsZSAoIWZpbmlzaGVkKSB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzLmNmbi5kZXNjcmliZVN0YWNrRXZlbnRzKHsgU3RhY2tOYW1lOiB0aGlzLnByb3BzLnN0YWNrQXJuLCBOZXh0VG9rZW46IG5leHRUb2tlbiB9KTtcbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBwYWdlPy5TdGFja0V2ZW50cyA/PyBbXSkge1xuICAgICAgICAgIC8vIEFscmVhZHkgc2VlbiB0aGlzIG9uZVxuICAgICAgICAgIGlmICh0aGlzLmV2ZW50SWRzLmhhcyhldmVudC5FdmVudElkISkpIHtcbiAgICAgICAgICAgIHJldHVybiBldmVudHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaXNQYXJlbnRTdGFja0V2ZW50ID0gaXNSb290U3RhY2tFdmVudChldmVudCk7XG4gICAgICAgICAgLy8gRnJlc2ggZXZlbnRcbiAgICAgICAgICBjb25zdCByZXNFdmVudDogUmVzb3VyY2VFdmVudCA9IHtcbiAgICAgICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgICAgIHBhcmVudFN0YWNrTG9naWNhbElkczogdGhpcy5wcm9wcy5wYXJlbnRTdGFja0xvZ2ljYWxJZHMgPz8gW10sXG4gICAgICAgICAgICBpc1Jvb3RTdGFja0V2ZW50OiBpc1BhcmVudFN0YWNrRXZlbnQsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIE1ha2UgYSBzdG9wIGRlY2lzaW9uXG4gICAgICAgICAgY29uc3Qgc3RvcERlY2lzaW9uID0gc3RvcERlY2lkZXIuc2hvdWxkU3RvcChyZXNFdmVudCk7XG4gICAgICAgICAgaWYgKHN0b3BEZWNpc2lvbiA9PT0gJ3N0b3AtZXhjbHVkZScpIHtcbiAgICAgICAgICAgIHJldHVybiBldmVudHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5ldmVudElkcy5hZGQoZXZlbnQuRXZlbnRJZCEpO1xuXG4gICAgICAgICAgZXZlbnRzLnB1c2gocmVzRXZlbnQpO1xuXG4gICAgICAgICAgaWYgKHN0b3BEZWNpc2lvbiA9PT0gJ3N0b3AtaW5jbHVkZScpIHtcbiAgICAgICAgICAgIHJldHVybiBldmVudHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWlzUGFyZW50U3RhY2tFdmVudCAmJlxuICAgICAgICAgICAgICBldmVudC5SZXNvdXJjZVR5cGUgPT09ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycgJiZcbiAgICAgICAgICAgICAgaXNTdGFja0JlZ2luT3BlcmF0aW9uU3RhdGUoZXZlbnQuUmVzb3VyY2VTdGF0dXMpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZXZlbnQgaXMgbm90IGZvciBgdGhpc2Agc3RhY2sgYW5kIGhhcyBhIHBoeXNpY2FsIHJlc291cmNlIElkLCByZWN1cnNpdmVseSBjYWxsIGZvciBldmVudHMgaW4gdGhlIG5lc3RlZCBzdGFja1xuICAgICAgICAgICAgdGhpcy50cmFja05lc3RlZFN0YWNrKGV2ZW50LCBbLi4uKHRoaXMucHJvcHMucGFyZW50U3RhY2tMb2dpY2FsSWRzID8/IFtdKSwgZXZlbnQuTG9naWNhbFJlc291cmNlSWQgPz8gJyddKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNQYXJlbnRTdGFja0V2ZW50ICYmIGlzU3RhY2tUZXJtaW5hbFN0YXRlKGV2ZW50LlJlc291cmNlU3RhdHVzKSkge1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbmV4dFRva2VuID0gcGFnZT8uTmV4dFRva2VuO1xuICAgICAgICBpZiAobmV4dFRva2VuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIC8vIENGTiByZXR1cm5zIHRoZSBpbnB1dCBleGFjdGx5IGFzIHByb3ZpZGVkIGJ5IHVzIHRvIHRoZSBgRGVzY3JpYmVTdGFja0V2ZW50c2AgYXBpIGNhbGxcbiAgICAgIGlmICghKGUubmFtZSA9PT0gJ1ZhbGlkYXRpb25FcnJvcicgJiYgZm9ybWF0RXJyb3JNZXNzYWdlKGUpID09PSBgU3RhY2sgWyR7dGhpcy5wcm9wcy5zdGFja0Fybn1dIGRvZXMgbm90IGV4aXN0YCkpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uIHRoZSBDUkVBVEVfSU5fUFJPR1JFU1MsIFVQREFURV9JTl9QUk9HUkVTUywgREVMRVRFX0lOX1BST0dSRVNTIGV2ZW50IG9mIGEgbmVzdGVkIHN0YWNrLCBwb2xsIHRoZSBuZXN0ZWQgc3RhY2sgdXBkYXRlc1xuICAgKi9cbiAgcHJpdmF0ZSB0cmFja05lc3RlZFN0YWNrKGV2ZW50OiBTdGFja0V2ZW50LCBwYXJlbnRTdGFja0xvZ2ljYWxJZHM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgbG9naWNhbElkID0gZXZlbnQuTG9naWNhbFJlc291cmNlSWQ7XG4gICAgY29uc3QgcGh5c2ljYWxSZXNvdXJjZUlkID0gZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkO1xuXG4gICAgLy8gVGhlIENSRUFURV9JTl9QUk9HUkVTUyBldmVudCBmb3IgYSBOZXN0ZWQgU3RhY2sgaXMgZW1pdHRlZCB0d2ljZTsgZmlyc3Qgd2l0aG91dCBhIFBoeXNpY2FsUmVzb3VyY2VJZFxuICAgIC8vIGFuZCB0aGVuIHdpdGguIElnbm9yZSB0aGlzIGV2ZW50IGlmIHdlIGRvbid0IGhhdmUgdGhhdCBwcm9wZXJ0eSB5ZXQuXG4gICAgLy9cbiAgICAvLyAoQXQgdGhpcyBwb2ludCwgSSBhbHNvIGRvbid0IHRydXN0IHRoYXQgbG9naWNhbElkIGlzIGFsd2F5cyBnb2luZyB0byBiZSB0aGVyZSBzbyB2YWxpZGF0ZSB0aGF0IGFzIHdlbGwpXG4gICAgaWYgKCFsb2dpY2FsSWQgfHwgIXBoeXNpY2FsUmVzb3VyY2VJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5uZXN0ZWRTdGFja1BvbGxlcnNbbG9naWNhbElkXSkge1xuICAgICAgdGhpcy5uZXN0ZWRTdGFja1BvbGxlcnNbbG9naWNhbElkXSA9IG5ldyBTdGFja0V2ZW50UG9sbGVyKHRoaXMuY2ZuLCB7XG4gICAgICAgIHN0YWNrQXJuOiBwaHlzaWNhbFJlc291cmNlSWQsXG4gICAgICAgIHBhcmVudFN0YWNrTG9naWNhbElkczogcGFyZW50U3RhY2tMb2dpY2FsSWRzLFxuICAgICAgICBpbml0aWFsUG9sbFJhbmdlOiBQb2xsUmFuZ2Uuc2luY2VUaW1lc3RhbXAoZXZlbnQuVGltZXN0YW1wIS52YWx1ZU9mKCkpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3RhY2tCZWdpbk9wZXJhdGlvblN0YXRlKHN0YXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgcmV0dXJuIFtcbiAgICAnQ1JFQVRFX0lOX1BST0dSRVNTJyxcbiAgICAnVVBEQVRFX0lOX1BST0dSRVNTJyxcbiAgICAnREVMRVRFX0lOX1BST0dSRVNTJyxcbiAgICAnVVBEQVRFX1JPTExCQUNLX0lOX1BST0dSRVNTJyxcbiAgICAnUk9MTEJBQ0tfSU5fUFJPR1JFU1MnLFxuICBdLmluY2x1ZGVzKHN0YXRlID8/ICcnKTtcbn1cblxuZnVuY3Rpb24gaXNTdGFja1Rlcm1pbmFsU3RhdGUoc3RhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICByZXR1cm4gIShzdGF0ZSA/PyAnJykuZW5kc1dpdGgoJ19JTl9QUk9HUkVTUycpO1xufVxuIl19
@@ -0,0 +1,5 @@
1
+ import type { ValidateResult } from '../../actions/validate';
2
+ import type { ActionLessMessage } from '../io/private';
3
+ export declare function hostMessageFromValidation(result: ValidateResult): ActionLessMessage<any>;
4
+ export declare function formatValidateResult(result: ValidateResult): string;
5
+ //# sourceMappingURL=validate-formatting.d.ts.map
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hostMessageFromValidation = hostMessageFromValidation;
4
+ exports.formatValidateResult = formatValidateResult;
5
+ const path = require("node:path");
6
+ const chalk = require("chalk");
7
+ const private_1 = require("../io/private");
8
+ // Matches C0 control chars (except \t and \n), DEL, and CSI (8-bit mode).
9
+ // Strips ANSI escape sequences, carriage returns, backspaces, BEL, and
10
+ // bidirectional overrides that could spoof terminal output.
11
+ const CONTROL_CHARS = /[\x00-\x08\x0B-\x1F\x7F\x9B]/g;
12
+ function sanitize(s) {
13
+ return (s ?? '').replace(CONTROL_CHARS, '�');
14
+ }
15
+ const SEVERITY_ORDER = {
16
+ fatal: 0,
17
+ error: 1,
18
+ warning: 2,
19
+ info: 3,
20
+ };
21
+ function hostMessageFromValidation(result) {
22
+ // Always emit at info level so the CLI IoHost doesn't wrap the entire output
23
+ // in a single color. The formatter handles per-severity coloring internally.
24
+ // Consumers detect failure via the structured `data.conclusion` field or exit code.
25
+ return private_1.IO.CDK_TOOLKIT_I9600.msg(formatValidateResult(result), result);
26
+ }
27
+ function formatValidateResult(result) {
28
+ const violations = flattenViolations(result.pluginReports);
29
+ if (violations.length === 0) {
30
+ return '\nPolicy validation passed. No problems found.';
31
+ }
32
+ violations.sort((a, b) => {
33
+ const aOrder = SEVERITY_ORDER[a.severity.toLowerCase()] ?? 4;
34
+ const bOrder = SEVERITY_ORDER[b.severity.toLowerCase()] ?? 4;
35
+ return aOrder - bOrder;
36
+ });
37
+ const title = result.title ?? 'Validation Report';
38
+ const blocks = violations.map((v) => formatViolationBlock(v));
39
+ return `\n${title}\n${'-'.repeat(title.length)}\n\n${blocks.join('\n\n')}`;
40
+ }
41
+ function flattenViolations(pluginReports) {
42
+ const result = [];
43
+ for (const report of pluginReports) {
44
+ const pluginName = report.pluginName;
45
+ for (const violation of report.violations) {
46
+ const severity = normalizeSeverity(violation.severity);
47
+ for (const construct of violation.violatingConstructs) {
48
+ result.push({ severity, description: violation.description, ruleName: violation.ruleName, pluginName, construct });
49
+ }
50
+ }
51
+ }
52
+ return result;
53
+ }
54
+ function normalizeSeverity(severity) {
55
+ if (!severity)
56
+ return 'Warning';
57
+ const lower = severity.toLowerCase();
58
+ if (lower === 'fatal')
59
+ return 'Fatal';
60
+ if (lower === 'error')
61
+ return 'Error';
62
+ if (lower === 'warning')
63
+ return 'Warning';
64
+ if (lower === 'info')
65
+ return 'Info';
66
+ const safe = sanitize(severity);
67
+ return safe.charAt(0).toUpperCase() + safe.slice(1);
68
+ }
69
+ function formatViolationBlock(v) {
70
+ const lines = [];
71
+ const location = getLeafLocation(v.construct.stackTraces);
72
+ if (location) {
73
+ lines.push(chalk.underline(sanitize(location)));
74
+ }
75
+ const severityColor = getSeverityColor(v.severity);
76
+ const description = stripAckTag(sanitize(v.description));
77
+ const severityAndDesc = severityColor(chalk.bold(`${v.severity}: ${description}`));
78
+ lines.push(`${severityAndDesc} ${sanitize(v.pluginName)}`);
79
+ const constructInfo = formatConstructInfo(v.construct);
80
+ lines.push(` ${constructInfo}`);
81
+ if (v.severity.toLowerCase() !== 'fatal') {
82
+ const ackId = `${sanitize(v.pluginName)}::${sanitize(v.ruleName)}`.replace(/ /g, '-');
83
+ lines.push(` Acknowledge '${ackId}'`);
84
+ }
85
+ return lines.join('\n');
86
+ }
87
+ function getSeverityColor(severity) {
88
+ switch (severity.toLowerCase()) {
89
+ case 'fatal': return chalk.red;
90
+ case 'error': return chalk.ansi256(208);
91
+ case 'warning': return chalk.yellow;
92
+ default: return chalk.blue;
93
+ }
94
+ }
95
+ function formatConstructInfo(construct) {
96
+ const parts = [];
97
+ const logicalId = sanitize(construct.cloudFormationResource?.logicalId);
98
+ if (construct.constructPath) {
99
+ const cPath = sanitize(construct.constructPath);
100
+ parts.push(logicalId ? `${chalk.bold(cPath)} (${logicalId})` : chalk.bold(cPath));
101
+ }
102
+ else if (logicalId) {
103
+ parts.push(chalk.bold(logicalId));
104
+ }
105
+ if (construct.constructFqn) {
106
+ parts.push(sanitize(construct.constructFqn));
107
+ }
108
+ return parts.join(' ');
109
+ }
110
+ function stripAckTag(description) {
111
+ return description.replace(/\s*\[ack:\s*[^\]]+\]\s*/g, '').trim();
112
+ }
113
+ function getLeafLocation(stackTraces) {
114
+ if (!stackTraces || stackTraces.length === 0)
115
+ return undefined;
116
+ const lastTrace = stackTraces[stackTraces.length - 1];
117
+ const frames = lastTrace.split('\n');
118
+ if (frames.length === 0)
119
+ return undefined;
120
+ // Find the first frame that's user code (not in node_modules or aws-cdk-lib)
121
+ const userFrame = frames.find(f => !f.includes('node_modules') && !f.includes('aws-cdk-lib'));
122
+ const frame = (userFrame ?? frames[0]).trim();
123
+ const match = frame.match(/\((.+)\)$/) || frame.match(/at\s+(.+)$/);
124
+ const location = match ? match[1] : frame;
125
+ return path.isAbsolute(location.split(':')[0]) ? path.relative(process.cwd(), location) : location;
126
+ }
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtZm9ybWF0dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInZhbGlkYXRlLWZvcm1hdHRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsOERBS0M7QUFFRCxvREFnQkM7QUFyREQsa0NBQWtDO0FBRWxDLCtCQUErQjtBQUcvQiwyQ0FBbUM7QUFFbkMsMEVBQTBFO0FBQzFFLHVFQUF1RTtBQUN2RSw0REFBNEQ7QUFDNUQsTUFBTSxhQUFhLEdBQUcsK0JBQStCLENBQUM7QUFDdEQsU0FBUyxRQUFRLENBQUMsQ0FBcUI7SUFDckMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFVRCxNQUFNLGNBQWMsR0FBMkI7SUFDN0MsS0FBSyxFQUFFLENBQUM7SUFDUixLQUFLLEVBQUUsQ0FBQztJQUNSLE9BQU8sRUFBRSxDQUFDO0lBQ1YsSUFBSSxFQUFFLENBQUM7Q0FDUixDQUFDO0FBRUYsU0FBZ0IseUJBQXlCLENBQUMsTUFBc0I7SUFDOUQsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSxvRkFBb0Y7SUFDcEYsT0FBTyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBQyxNQUFzQjtJQUN6RCxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFM0QsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzVCLE9BQU8sZ0RBQWdELENBQUM7SUFDMUQsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdkIsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFD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RyxDQUFDLENBQUMsQ0FBQztJQUN0RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFMUMsNkVBQTZFO0lBQzdFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDOUYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFOUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUNyRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5SZXBvcnRKc29uLCBWaW9sYXRpbmdDb25zdHJ1Y3RKc29uIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgVmFsaWRhdGVSZXN1bHQgfSBmcm9tICcuLi8uLi9hY3Rpb25zL3ZhbGlkYXRlJztcbmltcG9ydCB0eXBlIHsgQWN0aW9uTGVzc01lc3NhZ2UgfSBmcm9tICcuLi9pby9wcml2YXRlJztcbmltcG9ydCB7IElPIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5cbi8vIE1hdGNoZXMgQzAgY29udHJvbCBjaGFycyAoZXhjZXB0IFxcdCBhbmQgXFxuKSwgREVMLCBhbmQgQ1NJICg4LWJpdCBtb2RlKS5cbi8vIFN0cmlwcyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMsIGNhcnJpYWdlIHJldHVybnMsIGJhY2tzcGFjZXMsIEJFTCwgYW5kXG4vLyBiaWRpcmVjdGlvbmFsIG92ZXJyaWRlcyB0aGF0IGNvdWxkIHNwb29mIHRlcm1pbmFsIG91dHB1dC5cbmNvbnN0IENPTlRST0xfQ0hBUlMgPSAvW1xceDAwLVxceDA4XFx4MEItXFx4MUZcXHg3RlxceDlCXS9nO1xuZnVuY3Rpb24gc2FuaXRpemUoczogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIChzID8/ICcnKS5yZXBsYWNlKENPTlRST0xfQ0hBUlMsICfvv70nKTtcbn1cblxuaW50ZXJmYWNlIEZsYXR0ZW5lZFZpb2xhdGlvbiB7XG4gIHJlYWRvbmx5IHNldmVyaXR5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bGVOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgY29uc3RydWN0OiBWaW9sYXRpbmdDb25zdHJ1Y3RKc29uO1xufVxuXG5jb25zdCBTRVZFUklUWV9PUkRFUjogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgZmF0YWw6IDAsXG4gIGVycm9yOiAxLFxuICB3YXJuaW5nOiAyLFxuICBpbmZvOiAzLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGhvc3RNZXNzYWdlRnJvbVZhbGlkYXRpb24ocmVzdWx0OiBWYWxpZGF0ZVJlc3VsdCk6IEFjdGlvbkxlc3NNZXNzYWdlPGFueT4ge1xuICAvLyBBbHdheXMgZW1pdCBhdCBpbmZvIGxldmVsIHNvIHRoZSBDTEkgSW9Ib3N0IGRvZXNuJ3Qgd3JhcCB0aGUgZW50aXJlIG91dHB1dFxuICAvLyBpbiBhIHNpbmdsZSBjb2xvci4gVGhlIGZvcm1hdHRlciBoYW5kbGVzIHBlci1zZXZlcml0eSBjb2xvcmluZyBpbnRlcm5hbGx5LlxuICAvLyBDb25zdW1lcnMgZGV0ZWN0IGZhaWx1cmUgdmlhIHRoZSBzdHJ1Y3R1cmVkIGBkYXRhLmNvbmNsdXNpb25gIGZpZWxkIG9yIGV4aXQgY29kZS5cbiAgcmV0dXJuIElPLkNES19UT09MS0lUX0k5NjAwLm1zZyhmb3JtYXRWYWxpZGF0ZVJlc3VsdChyZXN1bHQpLCByZXN1bHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VmFsaWRhdGVSZXN1bHQocmVzdWx0OiBWYWxpZGF0ZVJlc3VsdCk6IHN0cmluZyB7XG4gIGNvbnN0IHZpb2xhdGlvbnMgPSBmbGF0dGVuVmlvbGF0aW9ucyhyZXN1bHQucGx1Z2luUmVwb3J0cyk7XG5cbiAgaWYgKHZpb2xhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdcXG5Qb2xpY3kgdmFsaWRhdGlvbiBwYXNzZWQuIE5vIHByb2JsZW1zIGZvdW5kLic7XG4gIH1cblxuICB2aW9sYXRpb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBhT3JkZXIgPSBTRVZFUklUWV9PUkRFUlthLnNldmVyaXR5LnRvTG93ZXJDYXNlKCldID8/IDQ7XG4gICAgY29uc3QgYk9yZGVyID0gU0VWRVJJVFlfT1JERVJbYi5zZXZlcml0eS50b0xvd2VyQ2FzZSgpXSA/PyA0O1xuICAgIHJldHVybiBhT3JkZXIgLSBiT3JkZXI7XG4gIH0pO1xuXG4gIGNvbnN0IHRpdGxlID0gcmVzdWx0LnRpdGxlID8/ICdWYWxpZGF0aW9uIFJlcG9ydCc7XG4gIGNvbnN0IGJsb2NrcyA9IHZpb2xhdGlvbnMubWFwKCh2KSA9PiBmb3JtYXRWaW9sYXRpb25CbG9jayh2KSk7XG4gIHJldHVybiBgXFxuJHt0aXRsZX1cXG4keyctJy5yZXBlYXQodGl0bGUubGVuZ3RoKX1cXG5cXG4ke2Jsb2Nrcy5qb2luKCdcXG5cXG4nKX1gO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuVmlvbGF0aW9ucyhwbHVnaW5SZXBvcnRzOiBQbHVnaW5SZXBvcnRKc29uW10pOiBGbGF0dGVuZWRWaW9sYXRpb25bXSB7XG4gIGNvbnN0IHJlc3VsdDogRmxhdHRlbmVkVmlvbGF0aW9uW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJlcG9ydCBvZiBwbHVnaW5SZXBvcnRzKSB7XG4gICAgY29uc3QgcGx1Z2luTmFtZSA9IHJlcG9ydC5wbHVnaW5OYW1lO1xuXG4gICAgZm9yIChjb25zdCB2aW9sYXRpb24gb2YgcmVwb3J0LnZpb2xhdGlvbnMpIHtcbiAgICAgIGNvbnN0IHNldmVyaXR5ID0gbm9ybWFsaXplU2V2ZXJpdHkodmlvbGF0aW9uLnNldmVyaXR5KTtcblxuICAgICAgZm9yIChjb25zdCBjb25zdHJ1Y3Qgb2YgdmlvbGF0aW9uLnZpb2xhdGluZ0NvbnN0cnVjdHMpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goeyBzZXZlcml0eSwgZGVzY3JpcHRpb246IHZpb2xhdGlvbi5kZXNjcmlwdGlvbiwgcnVsZU5hbWU6IHZpb2xhdGlvbi5ydWxlTmFtZSwgcGx1Z2luTmFtZSwgY29uc3RydWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNldmVyaXR5KHNldmVyaXR5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoIXNldmVyaXR5KSByZXR1cm4gJ1dhcm5pbmcnO1xuICBjb25zdCBsb3dlciA9IHNldmVyaXR5LnRvTG93ZXJDYXNlKCk7XG4gIGlmIChsb3dlciA9PT0gJ2ZhdGFsJykgcmV0dXJuICdGYXRhbCc7XG4gIGlmIChsb3dlciA9PT0gJ2Vycm9yJykgcmV0dXJuICdFcnJvcic7XG4gIGlmIChsb3dlciA9PT0gJ3dhcm5pbmcnKSByZXR1cm4gJ1dhcm5pbmcnO1xuICBpZiAobG93ZXIgPT09ICdpbmZvJykgcmV0dXJuICdJbmZvJztcbiAgY29uc3Qgc2FmZSA9IHNhbml0aXplKHNldmVyaXR5KTtcbiAgcmV0dXJuIHNhZmUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzYWZlLnNsaWNlKDEpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRWaW9sYXRpb25CbG9jayh2OiBGbGF0dGVuZWRWaW9sYXRpb24pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCBsb2NhdGlvbiA9IGdldExlYWZMb2NhdGlvbih2LmNvbnN0cnVjdC5zdGFja1RyYWNlcyk7XG4gIGlmIChsb2NhdGlvbikge1xuICAgIGxpbmVzLnB1c2goY2hhbGsudW5kZXJsaW5lKHNhbml0aXplKGxvY2F0aW9uKSkpO1xuICB9XG5cbiAgY29uc3Qgc2V2ZXJpdHlDb2xvciA9IGdldFNldmVyaXR5Q29sb3Iodi5zZXZlcml0eSk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gc3RyaXBBY2tUYWcoc2FuaXRpemUodi5kZXNjcmlwdGlvbikpO1xuICBjb25zdCBzZXZlcml0eUFuZERlc2MgPSBzZXZlcml0eUNvbG9yKGNoYWxrLmJvbGQoYCR7di5zZXZlcml0eX06ICR7ZGVzY3JpcHRpb259YCkpO1xuICBsaW5lcy5wdXNoKGAke3NldmVyaXR5QW5kRGVzY30gJHtzYW5pdGl6ZSh2LnBsdWdpbk5hbWUpfWApO1xuXG4gIGNvbnN0IGNvbnN0cnVjdEluZm8gPSBmb3JtYXRDb25zdHJ1Y3RJbmZvKHYuY29uc3RydWN0KTtcbiAgbGluZXMucHVzaChgICAgJHtjb25zdHJ1Y3RJbmZvfWApO1xuXG4gIGlmICh2LnNldmVyaXR5LnRvTG93ZXJDYXNlKCkgIT09ICdmYXRhbCcpIHtcbiAgICBjb25zdCBhY2tJZCA9IGAke3Nhbml0aXplKHYucGx1Z2luTmFtZSl9Ojoke3Nhbml0aXplKHYucnVsZU5hbWUpfWAucmVwbGFjZSgvIC9nLCAnLScpO1xuICAgIGxpbmVzLnB1c2goYCAgIEFja25vd2xlZGdlICcke2Fja0lkfSdgKTtcbiAgfVxuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2V2ZXJpdHlDb2xvcihzZXZlcml0eTogc3RyaW5nKTogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcge1xuICBzd2l0Y2ggKHNldmVyaXR5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdmYXRhbCc6IHJldHVybiBjaGFsay5yZWQ7XG4gICAgY2FzZSAnZXJyb3InOiByZXR1cm4gY2hhbGsuYW5zaTI1NigyMDgpO1xuICAgIGNhc2UgJ3dhcm5pbmcnOiByZXR1cm4gY2hhbGsueWVsbG93O1xuICAgIGRlZmF1bHQ6IHJldHVybiBjaGFsay5ibHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdENvbnN0cnVjdEluZm8oY29uc3RydWN0OiBWaW9sYXRpbmdDb25zdHJ1Y3RKc29uKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGxvZ2ljYWxJZCA9IHNhbml0aXplKGNvbnN0cnVjdC5jbG91ZEZvcm1hdGlvblJlc291cmNlPy5sb2dpY2FsSWQpO1xuXG4gIGlmIChjb25zdHJ1Y3QuY29uc3RydWN0UGF0aCkge1xuICAgIGNvbnN0IGNQYXRoID0gc2FuaXRpemUoY29uc3RydWN0LmNvbnN0cnVjdFBhdGgpO1xuICAgIHBhcnRzLnB1c2gobG9naWNhbElkID8gYCR7Y2hhbGsuYm9sZChjUGF0aCl9ICgke2xvZ2ljYWxJZH0pYCA6IGNoYWxrLmJvbGQoY1BhdGgpKTtcbiAgfSBlbHNlIGlmIChsb2dpY2FsSWQpIHtcbiAgICBwYXJ0cy5wdXNoKGNoYWxrLmJvbGQobG9naWNhbElkKSk7XG4gIH1cblxuICBpZiAoY29uc3RydWN0LmNvbnN0cnVjdEZxbikge1xuICAgIHBhcnRzLnB1c2goc2FuaXRpemUoY29uc3RydWN0LmNvbnN0cnVjdEZxbikpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBBY2tUYWcoZGVzY3JpcHRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBkZXNjcmlwdGlvbi5yZXBsYWNlKC9cXHMqXFxbYWNrOlxccypbXlxcXV0rXFxdXFxzKi9nLCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXRMZWFmTG9jYXRpb24oc3RhY2tUcmFjZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFzdGFja1RyYWNlcyB8fCBzdGFja1RyYWNlcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGxhc3RUcmFjZSA9IHN0YWNrVHJhY2VzW3N0YWNrVHJhY2VzLmxlbmd0aCAtIDFdO1xuICBjb25zdCBmcmFtZXMgPSBsYXN0VHJhY2Uuc3BsaXQoJ1xcbicpO1xuICBpZiAoZnJhbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBGaW5kIHRoZSBmaXJzdCBmcmFtZSB0aGF0J3MgdXNlciBjb2RlIChub3QgaW4gbm9kZV9tb2R1bGVzIG9yIGF3cy1jZGstbGliKVxuICBjb25zdCB1c2VyRnJhbWUgPSBmcmFtZXMuZmluZChmID0+ICFmLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSAmJiAhZi5pbmNsdWRlcygnYXdzLWNkay1saWInKSk7XG4gIGNvbnN0IGZyYW1lID0gKHVzZXJGcmFtZSA/PyBmcmFtZXNbMF0pLnRyaW0oKTtcblxuICBjb25zdCBtYXRjaCA9IGZyYW1lLm1hdGNoKC9cXCgoLispXFwpJC8pIHx8IGZyYW1lLm1hdGNoKC9hdFxccysoLispJC8pO1xuICBjb25zdCBsb2NhdGlvbiA9IG1hdGNoID8gbWF0Y2hbMV0gOiBmcmFtZTtcbiAgcmV0dXJuIHBhdGguaXNBYnNvbHV0ZShsb2NhdGlvbi5zcGxpdCgnOicpWzBdKSA/IHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgbG9jYXRpb24pIDogbG9jYXRpb247XG59XG4iXX0=
@@ -8,6 +8,9 @@ export declare class WorkGraphBuilder {
8
8
  /**
9
9
  * Default priorities for nodes
10
10
  *
11
+ * Messages have the highest priority to ensure they are emitted as soon as
12
+ * possible (because they will be used for measuring timings).
13
+ *
11
14
  * Assets builds have higher priority than the other two operations, to make good on our promise that
12
15
  * '--prebuild-assets' will actually do assets before stacks (if it can). Unfortunately it is the
13
16
  * default :(
@@ -13,6 +13,9 @@ class WorkGraphBuilder {
13
13
  /**
14
14
  * Default priorities for nodes
15
15
  *
16
+ * Messages have the highest priority to ensure they are emitted as soon as
17
+ * possible (because they will be used for measuring timings).
18
+ *
16
19
  * Assets builds have higher priority than the other two operations, to make good on our promise that
17
20
  * '--prebuild-assets' will actually do assets before stacks (if it can). Unfortunately it is the
18
21
  * default :(
@@ -23,6 +26,7 @@ class WorkGraphBuilder {
23
26
  'asset-build': 10,
24
27
  'asset-publish': 0,
25
28
  'stack': 5,
29
+ 'marker': 100,
26
30
  };
27
31
  graph;
28
32
  ioHelper;
@@ -49,8 +53,35 @@ class WorkGraphBuilder {
49
53
  addAsset(parentStack, assetManifestArtifact, assetManifest, asset) {
50
54
  // Just the artifact identifier
51
55
  const assetId = asset.id.assetId;
52
- const buildId = `build-${assetId}-${(0, util_1.contentHashAny)([assetId, asset.genericSource]).substring(0, 10)}`;
53
- const publishId = `publish-${assetId}-${(0, util_1.contentHashAny)([assetId, asset.genericDestination]).substring(0, 10)}`;
56
+ // Build node, contains hash of source (build only once)
57
+ const sourceHash = (0, util_1.contentHashAny)([assetId, asset.genericSource]).substring(0, 10);
58
+ const buildId = `build-${assetId}-${sourceHash}`;
59
+ // Publish node, contains hash of both source and dest
60
+ const publishId = `publish-${assetId}-${sourceHash}${(0, util_1.contentHashAny)([assetId, asset.genericDestination]).substring(0, 10)}`;
61
+ // Message to emit when we start on an asset
62
+ const startId = `start-${assetId}`;
63
+ if (!this.graph.tryGetNode(startId)) {
64
+ this.graph.addNodes({
65
+ type: 'marker',
66
+ id: startId,
67
+ dependencies: new Set(),
68
+ deploymentState: work_graph_types_1.DeploymentState.PENDING,
69
+ priority: WorkGraphBuilder.PRIORITIES.marker,
70
+ marker: { type: 'start-asset', asset },
71
+ });
72
+ }
73
+ // Message to emit when we end an asset
74
+ const endId = `end-${assetId}`;
75
+ if (!this.graph.tryGetNode(endId)) {
76
+ this.graph.addNodes({
77
+ type: 'marker',
78
+ id: endId,
79
+ dependencies: new Set(),
80
+ deploymentState: work_graph_types_1.DeploymentState.PENDING,
81
+ priority: WorkGraphBuilder.PRIORITIES.marker,
82
+ marker: { type: 'end-asset', asset },
83
+ });
84
+ }
54
85
  // Build node only gets added once because they are all the same
55
86
  if (!this.graph.tryGetNode(buildId)) {
56
87
  const node = {
@@ -58,6 +89,8 @@ class WorkGraphBuilder {
58
89
  id: buildId,
59
90
  note: asset.displayName(false),
60
91
  dependencies: new Set([
92
+ // Build depends on the start message having been emitted.
93
+ startId,
61
94
  ...this.stackArtifactIds(assetManifestArtifact.dependencies),
62
95
  // If we disable prebuild, then assets inherit (stack) dependencies from their parent stack
63
96
  ...!this.prebuildAssets ? this.stackArtifactIds(onlyStacks(parentStack.dependencies)) : [],
@@ -87,6 +120,8 @@ class WorkGraphBuilder {
87
120
  deploymentState: work_graph_types_1.DeploymentState.PENDING,
88
121
  priority: WorkGraphBuilder.PRIORITIES['asset-publish'],
89
122
  });
123
+ // Every publish node that we add must complete before we fire the "done with publishing this asset" message.
124
+ this.graph.addDependency(endId, publishId);
90
125
  }
91
126
  for (const inheritedDep of this.stackArtifactIds(onlyStacks(parentStack.dependencies))) {
92
127
  // The asset publish step also depends on the stacks that the parent depends on.
@@ -169,4 +204,4 @@ function stacksFromAssets(artifacts) {
169
204
  function onlyStacks(artifacts) {
170
205
  return artifacts.filter(x => cxapi.CloudFormationStackArtifact.isCloudFormationStackArtifact(x));
171
206
  }
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yay1ncmFwaC1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid29yay1ncmFwaC1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDREQUE2RTtBQUM3RSxxREFBcUQ7QUFDckQsNkNBQXlDO0FBRXpDLHlEQUFxRDtBQUNyRCwrREFBMkQ7QUFDM0QscUNBQTRDO0FBRzVDLE1BQWEsZ0JBQWdCO0lBb0JSO0lBQ0E7SUFwQm5COzs7Ozs7OztPQVFHO0lBQ0ksTUFBTSxDQUFDLFVBQVUsR0FBcUM7UUFDM0QsYUFBYSxFQUFFLEVBQUU7UUFDakIsZUFBZSxFQUFFLENBQUM7UUFDbEIsT0FBTyxFQUFFLENBQUM7S0FDWCxDQUFDO0lBQ2UsS0FBSyxDQUFZO0lBQ2pCLFFBQVEsQ0FBVztJQUVwQyxZQUNFLFFBQWtCLEVBQ0QsY0FBdUIsRUFDdkIsV0FBVyxFQUFFO1FBRGIsbUJBQWMsR0FBZCxjQUFjLENBQVM7UUFDdkIsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQUU5QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksc0JBQVMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVPLFFBQVEsQ0FBQyxRQUEyQztRQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUNsQixJQUFJLEVBQUUsT0FBTztZQUNiLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxZQUFZLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUMvRSxLQUFLLEVBQUUsUUFBUTtZQUNmLGVBQWUsRUFBRSxrQ0FBZSxDQUFDLE9BQU87WUFDeEMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLFVB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Q2xELE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25HLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3NldE1hbmlmZXN0LCB0eXBlIElNYW5pZmVzdEVudHJ5IH0gZnJvbSAnQGF3cy1jZGsvY2RrLWFzc2V0cy1saWInO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCB7IFdvcmtHcmFwaCB9IGZyb20gJy4vd29yay1ncmFwaCc7XG5pbXBvcnQgdHlwZSB7IEFzc2V0QnVpbGROb2RlLCBXb3JrTm9kZSB9IGZyb20gJy4vd29yay1ncmFwaC10eXBlcyc7XG5pbXBvcnQgeyBEZXBsb3ltZW50U3RhdGUgfSBmcm9tICcuL3dvcmstZ3JhcGgtdHlwZXMnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC90b29sa2l0LWVycm9yJztcbmltcG9ydCB7IGNvbnRlbnRIYXNoQW55IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBXb3JrR3JhcGhCdWlsZGVyIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgcHJpb3JpdGllcyBmb3Igbm9kZXNcbiAgICpcbiAgICogQXNzZXRzIGJ1aWxkcyBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBvdGhlciB0d28gb3BlcmF0aW9ucywgdG8gbWFrZSBnb29kIG9uIG91ciBwcm9taXNlIHRoYXRcbiAgICogJy0tcHJlYnVpbGQtYXNzZXRzJyB3aWxsIGFjdHVhbGx5IGRvIGFzc2V0cyBiZWZvcmUgc3RhY2tzIChpZiBpdCBjYW4pLiBVbmZvcnR1bmF0ZWx5IGl0IGlzIHRoZVxuICAgKiBkZWZhdWx0IDooXG4gICAqXG4gICAqIEJ1dCBiZXR3ZWVuIHN0YWNrIGRlcGVuZGVuY2llcyBhbmQgcHVibGlzaCBkZXBlbmRlbmNpZXMsIHN0YWNrIGRlcGVuZGVuY2llcyBnbyBmaXJzdFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBQUklPUklUSUVTOiBSZWNvcmQ8V29ya05vZGVbJ3R5cGUnXSwgbnVtYmVyPiA9IHtcbiAgICAnYXNzZXQtYnVpbGQnOiAxMCxcbiAgICAnYXNzZXQtcHVibGlzaCc6IDAsXG4gICAgJ3N0YWNrJzogNSxcbiAgfTtcbiAgcHJpdmF0ZSByZWFkb25seSBncmFwaDogV29ya0dyYXBoO1xuICBwcml2YXRlIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpb0hlbHBlcjogSW9IZWxwZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmVidWlsZEFzc2V0czogYm9vbGVhbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGlkUHJlZml4ID0gJycsXG4gICkge1xuICAgIHRoaXMuZ3JhcGggPSBuZXcgV29ya0dyYXBoKHt9LCBpb0hlbHBlcik7XG4gICAgdGhpcy5pb0hlbHBlciA9IGlvSGVscGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRTdGFjayhhcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KSB7XG4gICAgdGhpcy5ncmFwaC5hZGROb2Rlcyh7XG4gICAgICB0eXBlOiAnc3RhY2snLFxuICAgICAgaWQ6IGAke3RoaXMuaWRQcmVmaXh9JHthcnRpZmFjdC5pZH1gLFxuICAgICAgZGVwZW5kZW5jaWVzOiBuZXcgU2V0KHRoaXMuc3RhY2tBcnRpZmFjdElkcyhvbmx5U3RhY2tzKGFydGlmYWN0LmRlcGVuZGVuY2llcykpKSxcbiAgICAgIHN0YWNrOiBhcnRpZmFjdCxcbiAgICAgIGRlcGxveW1lbnRTdGF0ZTogRGVwbG95bWVudFN0YXRlLlBFTkRJTkcsXG4gICAgICBwcmlvcml0eTogV29ya0dyYXBoQnVpbGRlci5QUklPUklUSUVTLnN0YWNrLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9vZiwgc2VlIHRoaXMgcGFyYW1ldGVyIGxpc3RcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljL21heC1sZW5cbiAgcHJpdmF0ZSBhZGRBc3NldChwYXJlbnRTdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LCBhc3NldE1hbmlmZXN0QXJ0aWZhY3Q6IGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdCwgYXNzZXRNYW5pZmVzdDogQXNzZXRNYW5pZmVzdCwgYXNzZXQ6IElNYW5pZmVzdEVudHJ5KSB7XG4gICAgLy8gSnVzdCB0aGUgYXJ0aWZhY3QgaWRlbnRpZmllclxuICAgIGNvbnN0IGFzc2V0SWQgPSBhc3NldC5pZC5hc3NldElkO1xuXG4gICAgY29uc3QgYnVpbGRJZCA9IGBidWlsZC0ke2Fzc2V0SWR9LSR7Y29udGVudEhhc2hBbnkoW2Fzc2V0SWQsIGFzc2V0LmdlbmVyaWNTb3VyY2VdKS5zdWJzdHJpbmcoMCwgMTApfWA7XG4gICAgY29uc3QgcHVibGlzaElkID0gYHB1Ymxpc2gtJHthc3NldElkfS0ke2NvbnRlbnRIYXNoQW55KFthc3NldElkLCBhc3NldC5nZW5lcmljRGVzdGluYXRpb25dKS5zdWJzdHJpbmcoMCwgMTApfWA7XG5cbiAgICAvLyBCdWlsZCBub2RlIG9ubHkgZ2V0cyBhZGRlZCBvbmNlIGJlY2F1c2UgdGhleSBhcmUgYWxsIHRoZSBzYW1lXG4gICAgaWYgKCF0aGlzLmdyYXBoLnRyeUdldE5vZGUoYnVpbGRJZCkpIHtcbiAgICAgIGNvbnN0IG5vZGU6IEFzc2V0QnVpbGROb2RlID0ge1xuICAgICAgICB0eXBlOiAnYXNzZXQtYnVpbGQnLFxuICAgICAgICBpZDogYnVpbGRJZCxcbiAgICAgICAgbm90ZTogYXNzZXQuZGlzcGxheU5hbWUoZmFsc2UpLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IG5ldyBTZXQoW1xuICAgICAgICAgIC4uLnRoaXMuc3RhY2tBcnRpZmFjdElkcyhhc3NldE1hbmlmZXN0QXJ0aWZhY3QuZGVwZW5kZW5jaWVzKSxcbiAgICAgICAgICAvLyBJZiB3ZSBkaXNhYmxlIHByZWJ1aWxkLCB0aGVuIGFzc2V0cyBpbmhlcml0IChzdGFjaykgZGVwZW5kZW5jaWVzIGZyb20gdGhlaXIgcGFyZW50IHN0YWNrXG4gICAgICAgICAgLi4uIXRoaXMucHJlYnVpbGRBc3NldHMgPyB0aGlzLnN0YWNrQXJ0aWZhY3RJZHMob25seVN0YWNrcyhwYXJlbnRTdGFjay5kZXBlbmRlbmNpZXMpKSA6IFtdLFxuICAgICAgICBdKSxcbiAgICAgICAgcGFyZW50U3RhY2s6IHBhcmVudFN0YWNrLFxuICAgICAgICBhc3NldE1hbmlmZXN0QXJ0aWZhY3QsXG4gICAgICAgIGFzc2V0TWFuaWZlc3QsXG4gICAgICAgIGFzc2V0LFxuICAgICAgICBkZXBsb3ltZW50U3RhdGU6IERlcGxveW1lbnRTdGF0ZS5QRU5ESU5HLFxuICAgICAgICBwcmlvcml0eTogV29ya0dyYXBoQnVpbGRlci5QUklPUklUSUVTWydhc3NldC1idWlsZCddLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZ3JhcGguYWRkTm9kZXMobm9kZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHVibGlzaE5vZGUgPSB0aGlzLmdyYXBoLnRyeUdldE5vZGUocHVibGlzaElkKTtcbiAgICBpZiAoIXB1Ymxpc2hOb2RlKSB7XG4gICAgICB0aGlzLmdyYXBoLmFkZE5vZGVzKHtcbiAgICAgICAgdHlwZTogJ2Fzc2V0LXB1Ymxpc2gnLFxuICAgICAgICBpZDogcHVibGlzaElkLFxuICAgICAgICBub3RlOiBhc3NldC5kaXNwbGF5TmFtZSh0cnVlKSxcbiAgICAgICAgZGVwZW5kZW5jaWVzOiBuZXcgU2V0KFtcbiAgICAgICAgICBidWlsZElkLFxuICAgICAgICBdKSxcbiAgICAgICAgcGFyZW50U3RhY2ssXG4gICAgICAgIGFzc2V0TWFuaWZlc3RBcnRpZmFjdCxcbiAgICAgICAgYXNzZXRNYW5pZmVzdCxcbiAgICAgICAgYXNzZXQsXG4gICAgICAgIGRlcGxveW1lbnRTdGF0ZTogRGVwbG95bWVudFN0YXRlLlBFTkRJTkcsXG4gICAgICAgIHByaW9yaXR5OiBXb3JrR3JhcGhCdWlsZGVyLlBSSU9SSVRJRVNbJ2Fzc2V0LXB1Ymxpc2gnXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaW5oZXJpdGVkRGVwIG9mIHRoaXMuc3RhY2tBcnRpZmFjdElkcyhvbmx5U3RhY2tzKHBhcmVudFN0YWNrLmRlcGVuZGVuY2llcykpKSB7XG4gICAgICAvLyBUaGUgYXNzZXQgcHVibGlzaCBzdGVwIGFsc28gZGVwZW5kcyBvbiB0aGUgc3RhY2tzIHRoYXQgdGhlIHBhcmVudCBkZXBlbmRzIG9uLlxuICAgICAgLy8gVGhpcyBpcyBwdXJlbHkgY29zbWV0aWM6IGlmIHdlIGRvbid0IGRvIHRoaXMsIHRoZSBwcm9ncmVzcyBwcmludGluZyBvZiBhc3NldCBwdWJsaXNoaW5nXG4gICAgICAvLyBpcyBnb2luZyB0byBpbnRlcmZlcmUgd2l0aCB0aGUgcHJvZ3Jlc3MgYmFyIG9mIHRoZSBzdGFjayBkZXBsb3ltZW50LiBXZSBjb3VsZCByZW1vdmUgdGhpc1xuICAgICAgLy8gZm9yIG92ZXJhbGwgZmFzdGVyIGRlcGxveW1lbnRzIGlmIHdlIGV2ZXIgaGF2ZSBhIGJldHRlciBtZXRob2Qgb2YgcHJvZ3Jlc3MgZGlzcGxheWluZy5cbiAgICAgIC8vIE5vdGU6IHRoaXMgbWF5IGludHJvZHVjZSBhIGN5Y2xlIGlmIG9uZSBvZiB0aGUgcGFyZW50J3MgZGVwZW5kZW5jaWVzIGlzIGFub3RoZXIgc3RhY2sgdGhhdFxuICAgICAgLy8gZGVwZW5kcyBvbiB0aGlzIGFzc2V0LiBUbyB3b3JrYXJvdW5kIHRoaXMgd2UgcmVtb3ZlIHRoZXNlIGN5Y2xlcyBvbmNlIGFsbCBub2RlcyBoYXZlXG4gICAgICAvLyBiZWVuIGFkZGVkIHRvIHRoZSBncmFwaC5cbiAgICAgIHRoaXMuZ3JhcGguYWRkRGVwZW5kZW5jeShwdWJsaXNoSWQsIGluaGVyaXRlZERlcCk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyB3aWxsIHdvcmsgd2hldGhlciB0aGUgc3RhY2sgbm9kZSBoYXMgYmVlbiBhZGRlZCB5ZXQgb3Igbm90XG4gICAgdGhpcy5ncmFwaC5hZGREZXBlbmRlbmN5KGAke3RoaXMuaWRQcmVmaXh9JHtwYXJlbnRTdGFjay5pZH1gLCBwdWJsaXNoSWQpO1xuICB9XG5cbiAgcHVibGljIGJ1aWxkKGFydGlmYWN0czogY3hhcGkuQ2xvdWRBcnRpZmFjdFtdKTogV29ya0dyYXBoIHtcbiAgICBjb25zdCBwYXJlbnRTdGFja3MgPSBzdGFja3NGcm9tQXNzZXRzKGFydGlmYWN0cyk7XG5cbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIGFydGlmYWN0cykge1xuICAgICAgaWYgKGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdC5pc0Nsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdChhcnRpZmFjdCkpIHtcbiAgICAgICAgdGhpcy5hZGRTdGFjayhhcnRpZmFjdCk7XG4gICAgICB9IGVsc2UgaWYgKGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdC5pc0Fzc2V0TWFuaWZlc3RBcnRpZmFjdChhcnRpZmFjdCkpIHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBBc3NldE1hbmlmZXN0LmZyb21GaWxlKGFydGlmYWN0LmZpbGUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgbWFuaWZlc3QuZW50cmllcykge1xuICAgICAgICAgIGNvbnN0IHBhcmVudFN0YWNrID0gcGFyZW50U3RhY2tzLmdldChhcnRpZmFjdCk7XG4gICAgICAgICAgaWYgKHBhcmVudFN0YWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ09ycGhhbmVkQXNzZXRNYW5pZmVzdCcsICdGb3VuZCBhbiBhc3NldCBtYW5pZmVzdCB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBzdGFjaycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFkZEFzc2V0KHBhcmVudFN0YWNrLCBhcnRpZmFjdCwgbWFuaWZlc3QsIGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjeGFwaS5OZXN0ZWRDbG91ZEFzc2VtYmx5QXJ0aWZhY3QuaXNOZXN0ZWRDbG91ZEFzc2VtYmx5QXJ0aWZhY3QoYXJ0aWZhY3QpKSB7XG4gICAgICAgIGNvbnN0IGFzc2VtYmx5ID0gbmV3IGN4YXBpLkNsb3VkQXNzZW1ibHkoYXJ0aWZhY3QuZnVsbFBhdGgsIHsgdG9wb1NvcnQ6IGZhbHNlIH0pO1xuICAgICAgICBjb25zdCBuZXN0ZWRHcmFwaCA9IG5ldyBXb3JrR3JhcGhCdWlsZGVyKFxuICAgICAgICAgIHRoaXMuaW9IZWxwZXIsXG4gICAgICAgICAgdGhpcy5wcmVidWlsZEFzc2V0cyxcbiAgICAgICAgICBgJHt0aGlzLmlkUHJlZml4fSR7YXJ0aWZhY3QuaWR9LmAsXG4gICAgICAgICkuYnVpbGQoYXNzZW1ibHkuYXJ0aWZhY3RzKTtcbiAgICAgICAgdGhpcy5ncmFwaC5hYnNvcmIobmVzdGVkR3JhcGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWdub3JlIHdoYXRldmVyIGVsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmdyYXBoLnJlbW92ZVVuYXZhaWxhYmxlRGVwZW5kZW5jaWVzKCk7XG5cbiAgICAvLyBSZW1vdmUgYW55IHBvdGVudGlhbGx5IGludHJvZHVjZWQgY3ljbGVzIGJldHdlZW4gYXNzZXQgcHVibGlzaGluZyBhbmQgdGhlIHN0YWNrcyB0aGF0IGRlcGVuZCBvbiB0aGVtLlxuICAgIHRoaXMucmVtb3ZlU3RhY2tQdWJsaXNoQ3ljbGVzKCk7XG5cbiAgICByZXR1cm4gdGhpcy5ncmFwaDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhY2tBcnRpZmFjdElkcyhkZXBzOiBjeGFwaS5DbG91ZEFydGlmYWN0W10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGRlcHMuZmxhdE1hcCgoZCkgPT4gY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LmlzQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KGQpID8gW3RoaXMuc3RhY2tBcnRpZmFjdElkKGQpXSA6IFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhY2tBcnRpZmFjdElkKGFydGlmYWN0OiBjeGFwaS5DbG91ZEFydGlmYWN0KTogc3RyaW5nIHtcbiAgICBpZiAoIWN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdC5pc0Nsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdChhcnRpZmFjdCkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0ludmFsaWRBcnRpZmFjdFR5cGUnLCBgQ2FuIG9ubHkgY2FsbCB0aGlzIG9uIENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCwgZ290OiAke2FydGlmYWN0LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLmlkUHJlZml4fSR7YXJ0aWZhY3QuaWR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXZSBtYXkgaGF2ZSBhY2NpZGVudGFsbHkgaW50cm9kdWNlZCBjeWNsZXMgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIHRoZSBtZXNzYWdlcyBwcmludGVkIHRvIHRoZVxuICAgKiBjb25zb2xlIG5vdCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyIHRvbyBtdWNoLiBSZW1vdmUgdGhlbSBhZ2Fpbi5cbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlU3RhY2tQdWJsaXNoQ3ljbGVzKCkge1xuICAgIGNvbnN0IHB1Ymxpc2hTdGVwcyA9IHRoaXMuZ3JhcGgubm9kZXNPZlR5cGUoJ2Fzc2V0LXB1Ymxpc2gnKTtcbiAgICBmb3IgKGNvbnN0IHB1Ymxpc2hTdGVwIG9mIHB1Ymxpc2hTdGVwcykge1xuICAgICAgZm9yIChjb25zdCBkZXAgb2YgcHVibGlzaFN0ZXAuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGlmICh0aGlzLmdyYXBoLnJlYWNoYWJsZShkZXAsIHB1Ymxpc2hTdGVwLmlkKSkge1xuICAgICAgICAgIHB1Ymxpc2hTdGVwLmRlcGVuZGVuY2llcy5kZWxldGUoZGVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFja3NGcm9tQXNzZXRzKGFydGlmYWN0czogY3hhcGkuQ2xvdWRBcnRpZmFjdFtdKSB7XG4gIGNvbnN0IHJldCA9IG5ldyBNYXA8Y3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0LCBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q+KCk7XG4gIGZvciAoY29uc3Qgc3RhY2sgb2YgYXJ0aWZhY3RzLmZpbHRlcih4ID0+IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdC5pc0Nsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCh4KSkpIHtcbiAgICBjb25zdCBhc3NldEFydGlmYWN0cyA9IHN0YWNrLmRlcGVuZGVuY2llcy5maWx0ZXIoKHgpID0+IGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdC5pc0Fzc2V0TWFuaWZlc3RBcnRpZmFjdCh4KSk7XG4gICAgZm9yIChjb25zdCBhcnQgb2YgYXNzZXRBcnRpZmFjdHMpIHtcbiAgICAgIHJldC5zZXQoYXJ0LCBzdGFjayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb25seVN0YWNrcyhhcnRpZmFjdHM6IGN4YXBpLkNsb3VkQXJ0aWZhY3RbXSkge1xuICByZXR1cm4gYXJ0aWZhY3RzLmZpbHRlcih4ID0+IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdC5pc0Nsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCh4KSk7XG59XG5cbiJdfQ==
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yay1ncmFwaC1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid29yay1ncmFwaC1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDREQUE2RTtBQUM3RSxxREFBcUQ7QUFDckQsNkNBQXlDO0FBRXpDLHlEQUFxRDtBQUNyRCwrREFBMkQ7QUFDM0QscUNBQTRDO0FBRzVDLE1BQWEsZ0JBQWdCO0lBd0JSO0lBQ0E7SUF4Qm5COzs7Ozs7Ozs7OztPQVdHO0lBQ0ksTUFBTSxDQUFDLFVBQVUsR0FBcUM7UUFDM0QsYUFBYSxFQUFFLEVBQUU7UUFDakIsZUFBZSxFQUFFLENBQUM7UUFDbEIsT0FBTyxFQUFFLENBQUM7UUFDVixRQUFRLEVBQUUsR0FBRztLQUNkLENBQUM7SUFDZSxLQUFLLENBQVk7SUFDakIsUUFBUSxDQUFXO0lBRXBDLFlBQ0UsUUFBa0IsRUFDRCxjQUF1QixFQUN2QixXQUFXLEVBQUU7UUFEYixtQkFBYyxHQUFkLGNBQWMsQ0FBUztRQUN2QixhQUFRLEdBQVIsUUFBUSxDQUFLO1FBRTlCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxzQkFBUyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRU8sUUFBUSxDQUFDLFFBQTJDO1FBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQ2xCLElBQUksRUFBRSxPQUFPO1lBQ2IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsRUFBRSxFQUFFO1lBQ3BDLFlBQVksRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQy9FLEtBQUssRUFBRSxRQUFRO1lBQ2YsZUFBZSxFQUFFLGtDQUFlLENBQUMsT0FBTztZQUN4QyxR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O0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsU0FBZ0M7SUFDbEQsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzc2V0TWFuaWZlc3QsIHR5cGUgSU1hbmlmZXN0RW50cnkgfSBmcm9tICdAYXdzLWNkay9jZGstYXNzZXRzLWxpYic7XG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuaW1wb3J0IHsgV29ya0dyYXBoIH0gZnJvbSAnLi93b3JrLWdyYXBoJztcbmltcG9ydCB0eXBlIHsgQXNzZXRCdWlsZE5vZGUsIE1hcmtlck5vZGUsIFdvcmtOb2RlIH0gZnJvbSAnLi93b3JrLWdyYXBoLXR5cGVzJztcbmltcG9ydCB7IERlcGxveW1lbnRTdGF0ZSB9IGZyb20gJy4vd29yay1ncmFwaC10eXBlcyc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHsgY29udGVudEhhc2hBbnkgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgSW9IZWxwZXIgfSBmcm9tICcuLi9pby9wcml2YXRlJztcblxuZXhwb3J0IGNsYXNzIFdvcmtHcmFwaEJ1aWxkZXIge1xuICAvKipcbiAgICogRGVmYXVsdCBwcmlvcml0aWVzIGZvciBub2Rlc1xuICAgKlxuICAgKiBNZXNzYWdlcyBoYXZlIHRoZSBoaWdoZXN0IHByaW9yaXR5IHRvIGVuc3VyZSB0aGV5IGFyZSBlbWl0dGVkIGFzIHNvb24gYXNcbiAgICogcG9zc2libGUgKGJlY2F1c2UgdGhleSB3aWxsIGJlIHVzZWQgZm9yIG1lYXN1cmluZyB0aW1pbmdzKS5cbiAgICpcbiAgICogQXNzZXRzIGJ1aWxkcyBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBvdGhlciB0d28gb3BlcmF0aW9ucywgdG8gbWFrZSBnb29kIG9uIG91ciBwcm9taXNlIHRoYXRcbiAgICogJy0tcHJlYnVpbGQtYXNzZXRzJyB3aWxsIGFjdHVhbGx5IGRvIGFzc2V0cyBiZWZvcmUgc3RhY2tzIChpZiBpdCBjYW4pLiBVbmZvcnR1bmF0ZWx5IGl0IGlzIHRoZVxuICAgKiBkZWZhdWx0IDooXG4gICAqXG4gICAqIEJ1dCBiZXR3ZWVuIHN0YWNrIGRlcGVuZGVuY2llcyBhbmQgcHVibGlzaCBkZXBlbmRlbmNpZXMsIHN0YWNrIGRlcGVuZGVuY2llcyBnbyBmaXJzdFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBQUklPUklUSUVTOiBSZWNvcmQ8V29ya05vZGVbJ3R5cGUnXSwgbnVtYmVyPiA9IHtcbiAgICAnYXNzZXQtYnVpbGQnOiAxMCxcbiAgICAnYXNzZXQtcHVibGlzaCc6IDAsXG4gICAgJ3N0YWNrJzogNSxcbiAgICAnbWFya2VyJzogMTAwLFxuICB9O1xuICBwcml2YXRlIHJlYWRvbmx5IGdyYXBoOiBXb3JrR3JhcGg7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGlvSGVscGVyOiBJb0hlbHBlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByZWJ1aWxkQXNzZXRzOiBib29sZWFuLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaWRQcmVmaXggPSAnJyxcbiAgKSB7XG4gICAgdGhpcy5ncmFwaCA9IG5ldyBXb3JrR3JhcGgoe30sIGlvSGVscGVyKTtcbiAgICB0aGlzLmlvSGVscGVyID0gaW9IZWxwZXI7XG4gIH1cblxuICBwcml2YXRlIGFkZFN0YWNrKGFydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QpIHtcbiAgICB0aGlzLmdyYXBoLmFkZE5vZGVzKHtcbiAgICAgIHR5cGU6ICdzdGFjaycsXG4gICAgICBpZDogYCR7dGhpcy5pZFByZWZpeH0ke2FydGlmYWN0LmlkfWAsXG4gICAgICBkZXBlbmRlbmNpZXM6IG5ldyBTZXQodGhpcy5zdGFja0FydGlmYWN0SWRzKG9ubHlTdGFja3MoYXJ0aWZhY3QuZGVwZW5kZW5jaWVzKSkpLFxuICAgICAgc3RhY2s6IGFydGlmYWN0LFxuICAgICAgZGVwbG95bWVudFN0YXRlOiBEZXBsb3ltZW50U3RhdGUuUEVORElORyxcbiAgICAgIHByaW9yaXR5OiBXb3JrR3JhcGhCdWlsZGVyLlBSSU9SSVRJRVMuc3RhY2ssXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT29mLCBzZWUgdGhpcyBwYXJhbWV0ZXIgbGlzdFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBzdHlsaXN0aWMvbWF4LWxlblxuICBwcml2YXRlIGFkZEFzc2V0KHBhcmVudFN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsIGFzc2V0TWFuaWZlc3RBcnRpZmFjdDogY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0LCBhc3NldE1hbmlmZXN0OiBBc3NldE1hbmlmZXN0LCBhc3NldDogSU1hbmlmZXN0RW50cnkpIHtcbiAgICAvLyBKdXN0IHRoZSBhcnRpZmFjdCBpZGVudGlmaWVyXG4gICAgY29uc3QgYXNzZXRJZCA9IGFzc2V0LmlkLmFzc2V0SWQ7XG5cbiAgICAvLyBCdWlsZCBub2RlLCBjb250YWlucyBoYXNoIG9mIHNvdXJjZSAoYnVpbGQgb25seSBvbmNlKVxuICAgIGNvbnN0IHNvdXJjZUhhc2ggPSBjb250ZW50SGFzaEFueShbYXNzZXRJZCwgYXNzZXQuZ2VuZXJpY1NvdXJjZV0pLnN1YnN0cmluZygwLCAxMCk7XG4gICAgY29uc3QgYnVpbGRJZCA9IGBidWlsZC0ke2Fzc2V0SWR9LSR7c291cmNlSGFzaH1gO1xuICAgIC8vIFB1Ymxpc2ggbm9kZSwgY29udGFpbnMgaGFzaCBvZiBib3RoIHNvdXJjZSBhbmQgZGVzdFxuICAgIGNvbnN0IHB1Ymxpc2hJZCA9IGBwdWJsaXNoLSR7YXNzZXRJZH0tJHtzb3VyY2VIYXNofSR7Y29udGVudEhhc2hBbnkoW2Fzc2V0SWQsIGFzc2V0LmdlbmVyaWNEZXN0aW5hdGlvbl0pLnN1YnN0cmluZygwLCAxMCl9YDtcblxuICAgIC8vIE1lc3NhZ2UgdG8gZW1pdCB3aGVuIHdlIHN0YXJ0IG9uIGFuIGFzc2V0XG4gICAgY29uc3Qgc3RhcnRJZCA9IGBzdGFydC0ke2Fzc2V0SWR9YDtcbiAgICBpZiAoIXRoaXMuZ3JhcGgudHJ5R2V0Tm9kZShzdGFydElkKSkge1xuICAgICAgdGhpcy5ncmFwaC5hZGROb2Rlcyh7XG4gICAgICAgIHR5cGU6ICdtYXJrZXInLFxuICAgICAgICBpZDogc3RhcnRJZCxcbiAgICAgICAgZGVwZW5kZW5jaWVzOiBuZXcgU2V0KCksXG4gICAgICAgIGRlcGxveW1lbnRTdGF0ZTogRGVwbG95bWVudFN0YXRlLlBFTkRJTkcsXG4gICAgICAgIHByaW9yaXR5OiBXb3JrR3JhcGhCdWlsZGVyLlBSSU9SSVRJRVMubWFya2VyLFxuICAgICAgICBtYXJrZXI6IHsgdHlwZTogJ3N0YXJ0LWFzc2V0JywgYXNzZXQgfSxcbiAgICAgIH0gc2F0aXNmaWVzIE1hcmtlck5vZGUpO1xuICAgIH1cblxuICAgIC8vIE1lc3NhZ2UgdG8gZW1pdCB3aGVuIHdlIGVuZCBhbiBhc3NldFxuICAgIGNvbnN0IGVuZElkID0gYGVuZC0ke2Fzc2V0SWR9YDtcbiAgICBpZiAoIXRoaXMuZ3JhcGgudHJ5R2V0Tm9kZShlbmRJZCkpIHtcbiAgICAgIHRoaXMuZ3JhcGguYWRkTm9kZXMoe1xuICAgICAgICB0eXBlOiAnbWFya2VyJyxcbiAgICAgICAgaWQ6IGVuZElkLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IG5ldyBTZXQoKSxcbiAgICAgICAgZGVwbG95bWVudFN0YXRlOiBEZXBsb3ltZW50U3RhdGUuUEVORElORyxcbiAgICAgICAgcHJpb3JpdHk6IFdvcmtHcmFwaEJ1aWxkZXIuUFJJT1JJVElFUy5tYXJrZXIsXG4gICAgICAgIG1hcmtlcjogeyB0eXBlOiAnZW5kLWFzc2V0JywgYXNzZXQgfSxcbiAgICAgIH0gc2F0aXNmaWVzIE1hcmtlck5vZGUpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIG5vZGUgb25seSBnZXRzIGFkZGVkIG9uY2UgYmVjYXVzZSB0aGV5IGFyZSBhbGwgdGhlIHNhbWVcbiAgICBpZiAoIXRoaXMuZ3JhcGgudHJ5R2V0Tm9kZShidWlsZElkKSkge1xuICAgICAgY29uc3Qgbm9kZTogQXNzZXRCdWlsZE5vZGUgPSB7XG4gICAgICAgIHR5cGU6ICdhc3NldC1idWlsZCcsXG4gICAgICAgIGlkOiBidWlsZElkLFxuICAgICAgICBub3RlOiBhc3NldC5kaXNwbGF5TmFtZShmYWxzZSksXG4gICAgICAgIGRlcGVuZGVuY2llczogbmV3IFNldChbXG4gICAgICAgICAgLy8gQnVpbGQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgbWVzc2FnZSBoYXZpbmcgYmVlbiBlbWl0dGVkLlxuICAgICAgICAgIHN0YXJ0SWQsXG4gICAgICAgICAgLi4udGhpcy5zdGFja0FydGlmYWN0SWRzKGFzc2V0TWFuaWZlc3RBcnRpZmFjdC5kZXBlbmRlbmNpZXMpLFxuICAgICAgICAgIC8vIElmIHdlIGRpc2FibGUgcHJlYnVpbGQsIHRoZW4gYXNzZXRzIGluaGVyaXQgKHN0YWNrKSBkZXBlbmRlbmNpZXMgZnJvbSB0aGVpciBwYXJlbnQgc3RhY2tcbiAgICAgICAgICAuLi4hdGhpcy5wcmVidWlsZEFzc2V0cyA/IHRoaXMuc3RhY2tBcnRpZmFjdElkcyhvbmx5U3RhY2tzKHBhcmVudFN0YWNrLmRlcGVuZGVuY2llcykpIDogW10sXG4gICAgICAgIF0pLFxuICAgICAgICBwYXJlbnRTdGFjazogcGFyZW50U3RhY2ssXG4gICAgICAgIGFzc2V0TWFuaWZlc3RBcnRpZmFjdCxcbiAgICAgICAgYXNzZXRNYW5pZmVzdCxcbiAgICAgICAgYXNzZXQsXG4gICAgICAgIGRlcGxveW1lbnRTdGF0ZTogRGVwbG95bWVudFN0YXRlLlBFTkRJTkcsXG4gICAgICAgIHByaW9yaXR5OiBXb3JrR3JhcGhCdWlsZGVyLlBSSU9SSVRJRVNbJ2Fzc2V0LWJ1aWxkJ10sXG4gICAgICB9O1xuICAgICAgdGhpcy5ncmFwaC5hZGROb2Rlcyhub2RlKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdWJsaXNoTm9kZSA9IHRoaXMuZ3JhcGgudHJ5R2V0Tm9kZShwdWJsaXNoSWQpO1xuICAgIGlmICghcHVibGlzaE5vZGUpIHtcbiAgICAgIHRoaXMuZ3JhcGguYWRkTm9kZXMoe1xuICAgICAgICB0eXBlOiAnYXNzZXQtcHVibGlzaCcsXG4gICAgICAgIGlkOiBwdWJsaXNoSWQsXG4gICAgICAgIG5vdGU6IGFzc2V0LmRpc3BsYXlOYW1lKHRydWUpLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IG5ldyBTZXQoW1xuICAgICAgICAgIGJ1aWxkSWQsXG4gICAgICAgIF0pLFxuICAgICAgICBwYXJlbnRTdGFjayxcbiAgICAgICAgYXNzZXRNYW5pZmVzdEFydGlmYWN0LFxuICAgICAgICBhc3NldE1hbmlmZXN0LFxuICAgICAgICBhc3NldCxcbiAgICAgICAgZGVwbG95bWVudFN0YXRlOiBEZXBsb3ltZW50U3RhdGUuUEVORElORyxcbiAgICAgICAgcHJpb3JpdHk6IFdvcmtHcmFwaEJ1aWxkZXIuUFJJT1JJVElFU1snYXNzZXQtcHVibGlzaCddLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEV2ZXJ5IHB1Ymxpc2ggbm9kZSB0aGF0IHdlIGFkZCBtdXN0IGNvbXBsZXRlIGJlZm9yZSB3ZSBmaXJlIHRoZSBcImRvbmUgd2l0aCBwdWJsaXNoaW5nIHRoaXMgYXNzZXRcIiBtZXNzYWdlLlxuICAgICAgdGhpcy5ncmFwaC5hZGREZXBlbmRlbmN5KGVuZElkLCBwdWJsaXNoSWQpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaW5oZXJpdGVkRGVwIG9mIHRoaXMuc3RhY2tBcnRpZmFjdElkcyhvbmx5U3RhY2tzKHBhcmVudFN0YWNrLmRlcGVuZGVuY2llcykpKSB7XG4gICAgICAvLyBUaGUgYXNzZXQgcHVibGlzaCBzdGVwIGFsc28gZGVwZW5kcyBvbiB0aGUgc3RhY2tzIHRoYXQgdGhlIHBhcmVudCBkZXBlbmRzIG9uLlxuICAgICAgLy8gVGhpcyBpcyBwdXJlbHkgY29zbWV0aWM6IGlmIHdlIGRvbid0IGRvIHRoaXMsIHRoZSBwcm9ncmVzcyBwcmludGluZyBvZiBhc3NldCBwdWJsaXNoaW5nXG4gICAgICAvLyBpcyBnb2luZyB0byBpbnRlcmZlcmUgd2l0aCB0aGUgcHJvZ3Jlc3MgYmFyIG9mIHRoZSBzdGFjayBkZXBsb3ltZW50LiBXZSBjb3VsZCByZW1vdmUgdGhpc1xuICAgICAgLy8gZm9yIG92ZXJhbGwgZmFzdGVyIGRlcGxveW1lbnRzIGlmIHdlIGV2ZXIgaGF2ZSBhIGJldHRlciBtZXRob2Qgb2YgcHJvZ3Jlc3MgZGlzcGxheWluZy5cbiAgICAgIC8vIE5vdGU6IHRoaXMgbWF5IGludHJvZHVjZSBhIGN5Y2xlIGlmIG9uZSBvZiB0aGUgcGFyZW50J3MgZGVwZW5kZW5jaWVzIGlzIGFub3RoZXIgc3RhY2sgdGhhdFxuICAgICAgLy8gZGVwZW5kcyBvbiB0aGlzIGFzc2V0LiBUbyB3b3JrYXJvdW5kIHRoaXMgd2UgcmVtb3ZlIHRoZXNlIGN5Y2xlcyBvbmNlIGFsbCBub2RlcyBoYXZlXG4gICAgICAvLyBiZWVuIGFkZGVkIHRvIHRoZSBncmFwaC5cbiAgICAgIHRoaXMuZ3JhcGguYWRkRGVwZW5kZW5jeShwdWJsaXNoSWQsIGluaGVyaXRlZERlcCk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyB3aWxsIHdvcmsgd2hldGhlciB0aGUgc3RhY2sgbm9kZSBoYXMgYmVlbiBhZGRlZCB5ZXQgb3Igbm90XG4gICAgdGhpcy5ncmFwaC5hZGREZXBlbmRlbmN5KGAke3RoaXMuaWRQcmVmaXh9JHtwYXJlbnRTdGFjay5pZH1gLCBwdWJsaXNoSWQpO1xuICB9XG5cbiAgcHVibGljIGJ1aWxkKGFydGlmYWN0czogY3hhcGkuQ2xvdWRBcnRpZmFjdFtdKTogV29ya0dyYXBoIHtcbiAgICBjb25zdCBwYXJlbnRTdGFja3MgPSBzdGFja3NGcm9tQXNzZXRzKGFydGlmYWN0cyk7XG5cbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIGFydGlmYWN0cykge1xuICAgICAgaWYgKGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdC5pc0Nsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdChhcnRpZmFjdCkpIHtcbiAgICAgICAgdGhpcy5hZGRTdGFjayhhcnRpZmFjdCk7XG4gICAgICB9IGVsc2UgaWYgKGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdC5pc0Fzc2V0TWFuaWZlc3RBcnRpZmFjdChhcnRpZmFjdCkpIHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBBc3NldE1hbmlmZXN0LmZyb21GaWxlKGFydGlmYWN0LmZpbGUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgbWFuaWZlc3QuZW50cmllcykge1xuICAgICAgICAgIGNvbnN0IHBhcmVudFN0YWNrID0gcGFyZW50U3RhY2tzLmdldChhcnRpZmFjdCk7XG4gICAgICAgICAgaWYgKHBhcmVudFN0YWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ09ycGhhbmVkQXNzZXRNYW5pZmVzdCcsICdGb3VuZCBhbiBhc3NldCBtYW5pZmVzdCB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBzdGFjaycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFkZEFzc2V0KHBhcmVudFN0YWNrLCBhcnRpZmFjdCwgbWFuaWZlc3QsIGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjeGFwaS5OZXN0ZWRDbG91ZEFzc2VtYmx5QXJ0aWZhY3QuaXNOZXN0ZWRDbG91ZEFzc2VtYmx5QXJ0aWZhY3QoYXJ0aWZhY3QpKSB7XG4gICAgICAgIGNvbnN0IGFzc2VtYmx5ID0gbmV3IGN4YXBpLkNsb3VkQXNzZW1ibHkoYXJ0aWZhY3QuZnVsbFBhdGgsIHsgdG9wb1NvcnQ6IGZhbHNlIH0pO1xuICAgICAgICBjb25zdCBuZXN0ZWRHcmFwaCA9IG5ldyBXb3JrR3JhcGhCdWlsZGVyKFxuICAgICAgICAgIHRoaXMuaW9IZWxwZXIsXG4gICAgICAgICAgdGhpcy5wcmVidWlsZEFzc2V0cyxcbiAgICAgICAgICBgJHt0aGlzLmlkUHJlZml4fSR7YXJ0aWZhY3QuaWR9LmAsXG4gICAgICAgICkuYnVpbGQoYXNzZW1ibHkuYXJ0aWZhY3RzKTtcbiAgICAgICAgdGhpcy5ncmFwaC5hYnNvcmIobmVzdGVkR3JhcGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWdub3JlIHdoYXRldmVyIGVsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmdyYXBoLnJlbW92ZVVuYXZhaWxhYmxlRGVwZW5kZW5jaWVzKCk7XG5cbiAgICAvLyBSZW1vdmUgYW55IHBvdGVudGlhbGx5IGludHJvZHVjZWQgY3ljbGVzIGJldHdlZW4gYXNzZXQgcHVibGlzaGluZyBhbmQgdGhlIHN0YWNrcyB0aGF0IGRlcGVuZCBvbiB0aGVtLlxuICAgIHRoaXMucmVtb3ZlU3RhY2tQdWJsaXNoQ3ljbGVzKCk7XG5cbiAgICByZXR1cm4gdGhpcy5ncmFwaDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhY2tBcnRpZmFjdElkcyhkZXBzOiBjeGFwaS5DbG91ZEFydGlmYWN0W10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGRlcHMuZmxhdE1hcCgoZCkgPT4gY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LmlzQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KGQpID8gW3RoaXMuc3RhY2tBcnRpZmFjdElkKGQpXSA6IFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhY2tBcnRpZmFjdElkKGFydGlmYWN0OiBjeGFwaS5DbG91ZEFydGlmYWN0KTogc3RyaW5nIHtcbiAgICBpZiAoIWN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdC5pc0Nsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdChhcnRpZmFjdCkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0ludmFsaWRBcnRpZmFjdFR5cGUnLCBgQ2FuIG9ubHkgY2FsbCB0aGlzIG9uIENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCwgZ290OiAke2FydGlmYWN0LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLmlkUHJlZml4fSR7YXJ0aWZhY3QuaWR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXZSBtYXkgaGF2ZSBhY2NpZGVudGFsbHkgaW50cm9kdWNlZCBjeWNsZXMgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIHRoZSBtZXNzYWdlcyBwcmludGVkIHRvIHRoZVxuICAgKiBjb25zb2xlIG5vdCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyIHRvbyBtdWNoLiBSZW1vdmUgdGhlbSBhZ2Fpbi5cbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlU3RhY2tQdWJsaXNoQ3ljbGVzKCkge1xuICAgIGNvbnN0IHB1Ymxpc2hTdGVwcyA9IHRoaXMuZ3JhcGgubm9kZXNPZlR5cGUoJ2Fzc2V0LXB1Ymxpc2gnKTtcbiAgICBmb3IgKGNvbnN0IHB1Ymxpc2hTdGVwIG9mIHB1Ymxpc2hTdGVwcykge1xuICAgICAgZm9yIChjb25zdCBkZXAgb2YgcHVibGlzaFN0ZXAuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGlmICh0aGlzLmdyYXBoLnJlYWNoYWJsZShkZXAsIHB1Ymxpc2hTdGVwLmlkKSkge1xuICAgICAgICAgIHB1Ymxpc2hTdGVwLmRlcGVuZGVuY2llcy5kZWxldGUoZGVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFja3NGcm9tQXNzZXRzKGFydGlmYWN0czogY3hhcGkuQ2xvdWRBcnRpZmFjdFtdKSB7XG4gIGNvbnN0IHJldCA9IG5ldyBNYXA8Y3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0LCBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q+KCk7XG4gIGZvciAoY29uc3Qgc3RhY2sgb2YgYXJ0aWZhY3RzLmZpbHRlcih4ID0+IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdC5pc0Nsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCh4KSkpIHtcbiAgICBjb25zdCBhc3NldEFydGlmYWN0cyA9IHN0YWNrLmRlcGVuZGVuY2llcy5maWx0ZXIoKHgpID0+IGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdC5pc0Fzc2V0TWFuaWZlc3RBcnRpZmFjdCh4KSk7XG4gICAgZm9yIChjb25zdCBhcnQgb2YgYXNzZXRBcnRpZmFjdHMpIHtcbiAgICAgIHJldC5zZXQoYXJ0LCBzdGFjayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb25seVN0YWNrcyhhcnRpZmFjdHM6IGN4YXBpLkNsb3VkQXJ0aWZhY3RbXSkge1xuICByZXR1cm4gYXJ0aWZhY3RzLmZpbHRlcih4ID0+IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdC5pc0Nsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCh4KSk7XG59XG5cbiJdfQ==
@@ -8,19 +8,19 @@ export declare enum DeploymentState {
8
8
  FAILED = "failed",
9
9
  SKIPPED = "skipped"
10
10
  }
11
- export type WorkNode = StackNode | AssetBuildNode | AssetPublishNode;
11
+ export type WorkNode = StackNode | AssetBuildNode | AssetPublishNode | MarkerNode;
12
12
  export interface WorkNodeCommon {
13
13
  readonly id: string;
14
14
  readonly dependencies: Set<string>;
15
15
  deploymentState: DeploymentState;
16
16
  /** Some readable information to attach to the id, which may be unreadable */
17
17
  readonly note?: string;
18
+ /** Sort by priority when picking up work, higher is earlier */
19
+ readonly priority?: number;
18
20
  }
19
21
  export interface StackNode extends WorkNodeCommon {
20
22
  readonly type: 'stack';
21
23
  readonly stack: cxapi.CloudFormationStackArtifact;
22
- /** Sort by priority when picking up work, higher is earlier */
23
- readonly priority?: number;
24
24
  }
25
25
  export interface AssetBuildNode extends WorkNodeCommon {
26
26
  readonly type: 'asset-build';
@@ -32,8 +32,6 @@ export interface AssetBuildNode extends WorkNodeCommon {
32
32
  readonly parentStack: cxapi.CloudFormationStackArtifact;
33
33
  /** The asset that needs to be built */
34
34
  readonly asset: IManifestEntry;
35
- /** Sort by priority when picking up work, higher is earlier */
36
- readonly priority?: number;
37
35
  }
38
36
  export interface AssetPublishNode extends WorkNodeCommon {
39
37
  readonly type: 'asset-publish';
@@ -45,7 +43,21 @@ export interface AssetPublishNode extends WorkNodeCommon {
45
43
  readonly parentStack: cxapi.CloudFormationStackArtifact;
46
44
  /** The asset that needs to be published */
47
45
  readonly asset: IManifestEntry;
48
- /** Sort by priority when picking up work, higher is earlier */
49
- readonly priority?: number;
46
+ }
47
+ /**
48
+ * A node that represents a message to the IoHost to be emitted at a certain point in the graph execution.
49
+ *
50
+ * These are used to bookend certain parts of the graph.
51
+ */
52
+ export interface MarkerNode extends WorkNodeCommon {
53
+ readonly type: 'marker';
54
+ /** The event to emit when this node is reached. */
55
+ readonly marker: {
56
+ type: 'start-asset';
57
+ asset: IManifestEntry;
58
+ } | {
59
+ type: 'end-asset';
60
+ asset: IManifestEntry;
61
+ };
50
62
  }
51
63
  //# sourceMappingURL=work-graph-types.d.ts.map
@@ -10,4 +10,4 @@ var DeploymentState;
10
10
  DeploymentState["FAILED"] = "failed";
11
11
  DeploymentState["SKIPPED"] = "skipped";
12
12
  })(DeploymentState || (exports.DeploymentState = DeploymentState = {}));
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yay1ncmFwaC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndvcmstZ3JhcGgtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsSUFBWSxlQU9YO0FBUEQsV0FBWSxlQUFlO0lBQ3pCLHNDQUFtQixDQUFBO0lBQ25CLG9DQUFpQixDQUFBO0lBQ2pCLDBDQUF1QixDQUFBO0lBQ3ZCLDBDQUF1QixDQUFBO0lBQ3ZCLG9DQUFpQixDQUFBO0lBQ2pCLHNDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFQVyxlQUFlLCtCQUFmLGVBQWUsUUFPMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFzc2V0TWFuaWZlc3QsIElNYW5pZmVzdEVudHJ5IH0gZnJvbSAnQGF3cy1jZGsvY2RrLWFzc2V0cy1saWInO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuXG5leHBvcnQgZW51bSBEZXBsb3ltZW50U3RhdGUge1xuICBQRU5ESU5HID0gJ3BlbmRpbmcnLFxuICBRVUVVRUQgPSAncXVldWVkJyxcbiAgREVQTE9ZSU5HID0gJ2RlcGxveWluZycsXG4gIENPTVBMRVRFRCA9ICdjb21wbGV0ZWQnLFxuICBGQUlMRUQgPSAnZmFpbGVkJyxcbiAgU0tJUFBFRCA9ICdza2lwcGVkJyxcbn1cblxuZXhwb3J0IHR5cGUgV29ya05vZGUgPSBTdGFja05vZGUgfCBBc3NldEJ1aWxkTm9kZSB8IEFzc2V0UHVibGlzaE5vZGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya05vZGVDb21tb24ge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBkZXBlbmRlbmNpZXM6IFNldDxzdHJpbmc+O1xuICBkZXBsb3ltZW50U3RhdGU6IERlcGxveW1lbnRTdGF0ZTtcbiAgLyoqIFNvbWUgcmVhZGFibGUgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBpZCwgd2hpY2ggbWF5IGJlIHVucmVhZGFibGUgKi9cbiAgcmVhZG9ubHkgbm90ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja05vZGUgZXh0ZW5kcyBXb3JrTm9kZUNvbW1vbiB7XG4gIHJlYWRvbmx5IHR5cGU6ICdzdGFjayc7XG4gIHJlYWRvbmx5IHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG4gIC8qKiBTb3J0IGJ5IHByaW9yaXR5IHdoZW4gcGlja2luZyB1cCB3b3JrLCBoaWdoZXIgaXMgZWFybGllciAqL1xuICByZWFkb25seSBwcmlvcml0eT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3NldEJ1aWxkTm9kZSBleHRlbmRzIFdvcmtOb2RlQ29tbW9uIHtcbiAgcmVhZG9ubHkgdHlwZTogJ2Fzc2V0LWJ1aWxkJztcbiAgLyoqIFRoZSBhc3NldCBtYW5pZmVzdCB0aGlzIGFzc2V0IHJlc2lkZXMgaW4gKGFydGlmYWN0KSAqL1xuICByZWFkb25seSBhc3NldE1hbmlmZXN0QXJ0aWZhY3Q6IGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdDtcbiAgLyoqIFRoZSBhc3NldCBtYW5pZmVzdCB0aGlzIGFzc2V0IHJlc2lkZXMgaW4gKi9cbiAgcmVhZG9ubHkgYXNzZXRNYW5pZmVzdDogQXNzZXRNYW5pZmVzdDtcbiAgLyoqIFRoZSBzdGFjayB0aGlzIGFzc2V0IHdhcyBkZWZpbmVkIGluICh1c2VkIGZvciBlbnZpcm9ubWVudCBzZXR0aW5ncykgKi9cbiAgcmVhZG9ubHkgcGFyZW50U3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcbiAgLyoqIFRoZSBhc3NldCB0aGF0IG5lZWRzIHRvIGJlIGJ1aWx0ICovXG4gIHJlYWRvbmx5IGFzc2V0OiBJTWFuaWZlc3RFbnRyeTtcbiAgLyoqIFNvcnQgYnkgcHJpb3JpdHkgd2hlbiBwaWNraW5nIHVwIHdvcmssIGhpZ2hlciBpcyBlYXJsaWVyICovXG4gIHJlYWRvbmx5IHByaW9yaXR5PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UHVibGlzaE5vZGUgZXh0ZW5kcyBXb3JrTm9kZUNvbW1vbiB7XG4gIHJlYWRvbmx5IHR5cGU6ICdhc3NldC1wdWJsaXNoJztcbiAgLyoqIFRoZSBhc3NldCBtYW5pZmVzdCB0aGlzIGFzc2V0IHJlc2lkZXMgaW4gKGFydGlmYWN0KSAqL1xuICByZWFkb25seSBhc3NldE1hbmlmZXN0QXJ0aWZhY3Q6IGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdDtcbiAgLyoqIFRoZSBhc3NldCBtYW5pZmVzdCB0aGlzIGFzc2V0IHJlc2lkZXMgaW4gKi9cbiAgcmVhZG9ubHkgYXNzZXRNYW5pZmVzdDogQXNzZXRNYW5pZmVzdDtcbiAgLyoqIFRoZSBzdGFjayB0aGlzIGFzc2V0IHdhcyBkZWZpbmVkIGluICh1c2VkIGZvciBlbnZpcm9ubWVudCBzZXR0aW5ncykgKi9cbiAgcmVhZG9ubHkgcGFyZW50U3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcbiAgLyoqIFRoZSBhc3NldCB0aGF0IG5lZWRzIHRvIGJlIHB1Ymxpc2hlZCAqL1xuICByZWFkb25seSBhc3NldDogSU1hbmlmZXN0RW50cnk7XG4gIC8qKiBTb3J0IGJ5IHByaW9yaXR5IHdoZW4gcGlja2luZyB1cCB3b3JrLCBoaWdoZXIgaXMgZWFybGllciAqL1xuICByZWFkb25seSBwcmlvcml0eT86IG51bWJlcjtcbn1cbiJdfQ==
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yay1ncmFwaC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndvcmstZ3JhcGgtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsSUFBWSxlQU9YO0FBUEQsV0FBWSxlQUFlO0lBQ3pCLHNDQUFtQixDQUFBO0lBQ25CLG9DQUFpQixDQUFBO0lBQ2pCLDBDQUF1QixDQUFBO0lBQ3ZCLDBDQUF1QixDQUFBO0lBQ3ZCLG9DQUFpQixDQUFBO0lBQ2pCLHNDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFQVyxlQUFlLCtCQUFmLGVBQWUsUUFPMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFzc2V0TWFuaWZlc3QsIElNYW5pZmVzdEVudHJ5IH0gZnJvbSAnQGF3cy1jZGsvY2RrLWFzc2V0cy1saWInO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuXG5leHBvcnQgZW51bSBEZXBsb3ltZW50U3RhdGUge1xuICBQRU5ESU5HID0gJ3BlbmRpbmcnLFxuICBRVUVVRUQgPSAncXVldWVkJyxcbiAgREVQTE9ZSU5HID0gJ2RlcGxveWluZycsXG4gIENPTVBMRVRFRCA9ICdjb21wbGV0ZWQnLFxuICBGQUlMRUQgPSAnZmFpbGVkJyxcbiAgU0tJUFBFRCA9ICdza2lwcGVkJyxcbn1cblxuZXhwb3J0IHR5cGUgV29ya05vZGUgPSBTdGFja05vZGUgfCBBc3NldEJ1aWxkTm9kZSB8IEFzc2V0UHVibGlzaE5vZGUgfCBNYXJrZXJOb2RlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtOb2RlQ29tbW9uIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiBTZXQ8c3RyaW5nPjtcbiAgZGVwbG95bWVudFN0YXRlOiBEZXBsb3ltZW50U3RhdGU7XG4gIC8qKiBTb21lIHJlYWRhYmxlIGluZm9ybWF0aW9uIHRvIGF0dGFjaCB0byB0aGUgaWQsIHdoaWNoIG1heSBiZSB1bnJlYWRhYmxlICovXG4gIHJlYWRvbmx5IG5vdGU/OiBzdHJpbmc7XG4gIC8qKiBTb3J0IGJ5IHByaW9yaXR5IHdoZW4gcGlja2luZyB1cCB3b3JrLCBoaWdoZXIgaXMgZWFybGllciAqL1xuICByZWFkb25seSBwcmlvcml0eT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja05vZGUgZXh0ZW5kcyBXb3JrTm9kZUNvbW1vbiB7XG4gIHJlYWRvbmx5IHR5cGU6ICdzdGFjayc7XG4gIHJlYWRvbmx5IHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRCdWlsZE5vZGUgZXh0ZW5kcyBXb3JrTm9kZUNvbW1vbiB7XG4gIHJlYWRvbmx5IHR5cGU6ICdhc3NldC1idWlsZCc7XG4gIC8qKiBUaGUgYXNzZXQgbWFuaWZlc3QgdGhpcyBhc3NldCByZXNpZGVzIGluIChhcnRpZmFjdCkgKi9cbiAgcmVhZG9ubHkgYXNzZXRNYW5pZmVzdEFydGlmYWN0OiBjeGFwaS5Bc3NldE1hbmlmZXN0QXJ0aWZhY3Q7XG4gIC8qKiBUaGUgYXNzZXQgbWFuaWZlc3QgdGhpcyBhc3NldCByZXNpZGVzIGluICovXG4gIHJlYWRvbmx5IGFzc2V0TWFuaWZlc3Q6IEFzc2V0TWFuaWZlc3Q7XG4gIC8qKiBUaGUgc3RhY2sgdGhpcyBhc3NldCB3YXMgZGVmaW5lZCBpbiAodXNlZCBmb3IgZW52aXJvbm1lbnQgc2V0dGluZ3MpICovXG4gIHJlYWRvbmx5IHBhcmVudFN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG4gIC8qKiBUaGUgYXNzZXQgdGhhdCBuZWVkcyB0byBiZSBidWlsdCAqL1xuICByZWFkb25seSBhc3NldDogSU1hbmlmZXN0RW50cnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRQdWJsaXNoTm9kZSBleHRlbmRzIFdvcmtOb2RlQ29tbW9uIHtcbiAgcmVhZG9ubHkgdHlwZTogJ2Fzc2V0LXB1Ymxpc2gnO1xuICAvKiogVGhlIGFzc2V0IG1hbmlmZXN0IHRoaXMgYXNzZXQgcmVzaWRlcyBpbiAoYXJ0aWZhY3QpICovXG4gIHJlYWRvbmx5IGFzc2V0TWFuaWZlc3RBcnRpZmFjdDogY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0O1xuICAvKiogVGhlIGFzc2V0IG1hbmlmZXN0IHRoaXMgYXNzZXQgcmVzaWRlcyBpbiAqL1xuICByZWFkb25seSBhc3NldE1hbmlmZXN0OiBBc3NldE1hbmlmZXN0O1xuICAvKiogVGhlIHN0YWNrIHRoaXMgYXNzZXQgd2FzIGRlZmluZWQgaW4gKHVzZWQgZm9yIGVudmlyb25tZW50IHNldHRpbmdzKSAqL1xuICByZWFkb25seSBwYXJlbnRTdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICAvKiogVGhlIGFzc2V0IHRoYXQgbmVlZHMgdG8gYmUgcHVibGlzaGVkICovXG4gIHJlYWRvbmx5IGFzc2V0OiBJTWFuaWZlc3RFbnRyeTtcbn1cblxuLyoqXG4gKiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIGEgbWVzc2FnZSB0byB0aGUgSW9Ib3N0IHRvIGJlIGVtaXR0ZWQgYXQgYSBjZXJ0YWluIHBvaW50IGluIHRoZSBncmFwaCBleGVjdXRpb24uXG4gKlxuICogVGhlc2UgYXJlIHVzZWQgdG8gYm9va2VuZCBjZXJ0YWluIHBhcnRzIG9mIHRoZSBncmFwaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXJrZXJOb2RlIGV4dGVuZHMgV29ya05vZGVDb21tb24ge1xuICByZWFkb25seSB0eXBlOiAnbWFya2VyJztcblxuICAvKiogVGhlIGV2ZW50IHRvIGVtaXQgd2hlbiB0aGlzIG5vZGUgaXMgcmVhY2hlZC4gKi9cbiAgcmVhZG9ubHkgbWFya2VyOlxuICAgIHwgeyB0eXBlOiAnc3RhcnQtYXNzZXQnOyBhc3NldDogSU1hbmlmZXN0RW50cnkgfVxuICAgIHwgeyB0eXBlOiAnZW5kLWFzc2V0JzsgYXNzZXQ6IElNYW5pZmVzdEVudHJ5IH07XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- import type { WorkNode, StackNode, AssetBuildNode, AssetPublishNode } from './work-graph-types';
1
+ import type { WorkNode, StackNode, AssetBuildNode, AssetPublishNode, MarkerNode } from './work-graph-types';
2
2
  import type { IoHelper } from '../io/private';
3
3
  export type Concurrency = number | Record<WorkNode['type'], number>;
4
4
  export declare class WorkGraph {
@@ -80,5 +80,6 @@ export interface WorkGraphActions {
80
80
  deployStack: (stackNode: StackNode) => Promise<void>;
81
81
  buildAsset: (assetNode: AssetBuildNode) => Promise<void>;
82
82
  publishAsset: (assetNode: AssetPublishNode) => Promise<void>;
83
+ marker: (markerNode: MarkerNode) => Promise<void>;
83
84
  }
84
85
  //# sourceMappingURL=work-graph.d.ts.map