@aws-cdk/toolkit-lib 0.3.7 → 0.4.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 (179) hide show
  1. package/README.md +5 -0
  2. package/api-extractor.json +1 -1
  3. package/build-info.json +2 -2
  4. package/db.json.gz +0 -0
  5. package/lib/actions/deploy/index.d.ts +106 -34
  6. package/lib/actions/deploy/index.js +2 -17
  7. package/lib/actions/deploy/private/deploy-options.d.ts +1 -90
  8. package/lib/actions/deploy/private/deploy-options.js +1 -1
  9. package/lib/actions/deploy/private/helpers.d.ts +1 -6
  10. package/lib/actions/deploy/private/helpers.js +1 -9
  11. package/lib/actions/diff/index.d.ts +1 -9
  12. package/lib/actions/diff/index.js +1 -1
  13. package/lib/actions/diff/private/helpers.d.ts +2 -1
  14. package/lib/actions/diff/private/helpers.js +6 -6
  15. package/lib/actions/drift/index.d.ts +50 -0
  16. package/lib/actions/drift/index.js +3 -0
  17. package/lib/actions/index.d.ts +1 -0
  18. package/lib/actions/index.js +2 -1
  19. package/lib/actions/watch/index.d.ts +7 -1
  20. package/lib/actions/watch/index.js +1 -1
  21. package/lib/api/aws-auth/awscli-compatible.d.ts +4 -4
  22. package/lib/api/aws-auth/awscli-compatible.js +7 -9
  23. package/lib/api/aws-auth/base-credentials.d.ts +109 -0
  24. package/lib/api/aws-auth/base-credentials.js +79 -0
  25. package/lib/api/aws-auth/credential-plugins.js +3 -3
  26. package/lib/api/aws-auth/index.d.ts +1 -0
  27. package/lib/api/aws-auth/index.js +2 -1
  28. package/lib/api/aws-auth/private/index.d.ts +0 -1
  29. package/lib/api/aws-auth/private/index.js +1 -2
  30. package/lib/api/aws-auth/sdk-provider.d.ts +23 -27
  31. package/lib/api/aws-auth/sdk-provider.js +19 -16
  32. package/lib/api/aws-auth/sdk.d.ts +9 -5
  33. package/lib/api/aws-auth/sdk.js +6 -3
  34. package/lib/api/aws-auth/types.d.ts +7 -87
  35. package/lib/api/aws-auth/types.js +1 -74
  36. package/lib/api/bootstrap/bootstrap-environment.d.ts +1 -1
  37. package/lib/api/bootstrap/bootstrap-environment.js +8 -9
  38. package/lib/api/bootstrap/deploy-bootstrap.d.ts +1 -1
  39. package/lib/api/bootstrap/deploy-bootstrap.js +4 -5
  40. package/lib/api/cloud-assembly/context-store.d.ts +78 -0
  41. package/lib/api/cloud-assembly/context-store.js +160 -0
  42. package/lib/api/cloud-assembly/environment.d.ts +19 -16
  43. package/lib/api/cloud-assembly/environment.js +21 -12
  44. package/lib/api/cloud-assembly/index.d.ts +1 -0
  45. package/lib/api/cloud-assembly/index.js +2 -1
  46. package/lib/api/cloud-assembly/private/context-aware-source.d.ts +3 -10
  47. package/lib/api/cloud-assembly/private/context-aware-source.js +6 -11
  48. package/lib/api/cloud-assembly/private/exec.d.ts +1 -1
  49. package/lib/api/cloud-assembly/private/exec.js +2 -5
  50. package/lib/api/cloud-assembly/private/helpers.d.ts +9 -0
  51. package/lib/api/cloud-assembly/private/helpers.js +44 -0
  52. package/lib/api/cloud-assembly/private/index.d.ts +0 -1
  53. package/lib/api/cloud-assembly/private/index.js +1 -2
  54. package/lib/api/cloud-assembly/private/prepare-source.d.ts +27 -16
  55. package/lib/api/cloud-assembly/private/prepare-source.js +49 -46
  56. package/lib/api/cloud-assembly/private/stack-assembly.d.ts +1 -1
  57. package/lib/api/cloud-assembly/private/stack-assembly.js +1 -1
  58. package/lib/api/cloud-assembly/source-builder.d.ts +142 -14
  59. package/lib/api/cloud-assembly/source-builder.js +307 -1
  60. package/lib/api/cloud-assembly/stack-assembly.js +3 -4
  61. package/lib/api/cloudformation/template-body-parameter.d.ts +1 -1
  62. package/lib/api/cloudformation/template-body-parameter.js +4 -5
  63. package/lib/api/context.d.ts +1 -1
  64. package/lib/api/context.js +1 -1
  65. package/lib/api/deployments/asset-publishing.js +15 -16
  66. package/lib/api/deployments/assets.d.ts +1 -1
  67. package/lib/api/deployments/assets.js +4 -5
  68. package/lib/api/deployments/cfn-api.d.ts +1 -1
  69. package/lib/api/deployments/cfn-api.js +14 -15
  70. package/lib/api/deployments/checks.d.ts +1 -1
  71. package/lib/api/deployments/checks.js +3 -4
  72. package/lib/api/deployments/deploy-stack.d.ts +14 -3
  73. package/lib/api/deployments/deploy-stack.js +73 -49
  74. package/lib/api/deployments/deployments.d.ts +13 -2
  75. package/lib/api/deployments/deployments.js +10 -9
  76. package/lib/api/deployments/index.d.ts +0 -1
  77. package/lib/api/deployments/index.js +1 -2
  78. package/lib/api/diff/diff-formatter.d.ts +3 -3
  79. package/lib/api/diff/diff-formatter.js +6 -6
  80. package/lib/api/drift/drift-formatter.d.ts +81 -0
  81. package/lib/api/drift/drift-formatter.js +201 -0
  82. package/lib/api/drift/drift.d.ts +12 -0
  83. package/lib/api/drift/drift.js +63 -0
  84. package/lib/api/drift/index.d.ts +2 -0
  85. package/lib/api/drift/index.js +19 -0
  86. package/lib/api/environment/environment-access.d.ts +1 -1
  87. package/lib/api/environment/environment-access.js +3 -4
  88. package/lib/api/environment/environment-resources.d.ts +1 -1
  89. package/lib/api/environment/environment-resources.js +5 -6
  90. package/lib/api/garbage-collection/garbage-collector.js +44 -35
  91. package/lib/api/garbage-collection/progress-printer.d.ts +1 -1
  92. package/lib/api/garbage-collection/progress-printer.js +3 -4
  93. package/lib/api/garbage-collection/stack-refresh.d.ts +1 -1
  94. package/lib/api/garbage-collection/stack-refresh.js +3 -4
  95. package/lib/api/hotswap/common.d.ts +9 -4
  96. package/lib/api/hotswap/common.js +11 -4
  97. package/lib/api/hotswap/ecs-services.js +2 -2
  98. package/lib/api/hotswap/hotswap-deployments.js +3 -3
  99. package/lib/api/index.d.ts +1 -0
  100. package/lib/api/index.js +2 -1
  101. package/lib/api/io/io-host.d.ts +15 -1
  102. package/lib/api/io/io-host.js +1 -1
  103. package/lib/api/io/io-message.d.ts +7 -10
  104. package/lib/api/io/io-message.js +1 -1
  105. package/lib/api/io/private/io-default-messages.d.ts +7 -3
  106. package/lib/api/io/private/io-default-messages.js +23 -21
  107. package/lib/api/io/private/io-helper.d.ts +4 -4
  108. package/lib/api/io/private/io-helper.js +18 -14
  109. package/lib/api/io/private/messages.d.ts +18 -14
  110. package/lib/api/io/private/messages.js +52 -54
  111. package/lib/api/io/private/span.d.ts +18 -11
  112. package/lib/api/io/private/span.js +60 -42
  113. package/lib/api/io/toolkit-action.d.ts +1 -1
  114. package/lib/api/io/toolkit-action.js +1 -1
  115. package/lib/api/logs-monitor/find-cloudwatch-logs.js +2 -3
  116. package/lib/api/notices/cached-data-source.js +2 -1
  117. package/lib/api/notices/filter.d.ts +1 -1
  118. package/lib/api/notices/filter.js +2 -3
  119. package/lib/api/notices/notices.d.ts +17 -4
  120. package/lib/api/notices/notices.js +2 -2
  121. package/lib/api/notices/web-data-source.d.ts +30 -3
  122. package/lib/api/notices/web-data-source.js +37 -10
  123. package/lib/api/refactoring/cloudformation.d.ts +7 -5
  124. package/lib/api/refactoring/cloudformation.js +1 -1
  125. package/lib/api/refactoring/digest.d.ts +2 -2
  126. package/lib/api/refactoring/digest.js +25 -61
  127. package/lib/api/refactoring/graph.d.ts +15 -0
  128. package/lib/api/refactoring/graph.js +108 -0
  129. package/lib/api/refactoring/index.js +12 -6
  130. package/lib/api/resource-import/importer.d.ts +2 -1
  131. package/lib/api/resource-import/importer.js +28 -28
  132. package/lib/api/resource-import/migrator.js +4 -4
  133. package/lib/api/toolkit-info.d.ts +1 -1
  134. package/lib/api/toolkit-info.js +3 -4
  135. package/lib/api/work-graph/work-graph.d.ts +1 -1
  136. package/lib/api/work-graph/work-graph.js +4 -5
  137. package/lib/context-providers/index.d.ts +1 -2
  138. package/lib/context-providers/index.js +6 -4
  139. package/lib/index_bg.wasm +0 -0
  140. package/lib/payloads/context.d.ts +0 -1
  141. package/lib/payloads/context.js +1 -1
  142. package/lib/payloads/deploy.d.ts +2 -2
  143. package/lib/payloads/deploy.js +1 -1
  144. package/lib/payloads/destroy.d.ts +3 -3
  145. package/lib/payloads/destroy.js +1 -1
  146. package/lib/payloads/diff.d.ts +46 -5
  147. package/lib/payloads/diff.js +1 -1
  148. package/lib/payloads/drift.d.ts +12 -0
  149. package/lib/payloads/drift.js +3 -0
  150. package/lib/payloads/gc.d.ts +12 -0
  151. package/lib/payloads/gc.js +3 -0
  152. package/lib/payloads/import.d.ts +45 -0
  153. package/lib/payloads/import.js +3 -0
  154. package/lib/payloads/index.d.ts +3 -0
  155. package/lib/payloads/index.js +4 -1
  156. package/lib/payloads/rollback.d.ts +2 -2
  157. package/lib/payloads/rollback.js +1 -1
  158. package/lib/payloads/stack-activity.d.ts +2 -2
  159. package/lib/payloads/stack-activity.js +1 -1
  160. package/lib/payloads/types.d.ts +10 -0
  161. package/lib/payloads/types.js +1 -1
  162. package/lib/toolkit/non-interactive-io-host.js +2 -2
  163. package/lib/toolkit/private/index.d.ts +2 -1
  164. package/lib/toolkit/private/index.js +1 -1
  165. package/lib/toolkit/toolkit.d.ts +9 -2
  166. package/lib/toolkit/toolkit.js +169 -92
  167. package/lib/util/objects.d.ts +4 -0
  168. package/lib/util/objects.js +8 -1
  169. package/package.json +13 -16
  170. package/lib/actions/import/index.d.ts +0 -21
  171. package/lib/actions/import/index.js +0 -3
  172. package/lib/api/aws-auth/proxy-agent.d.ts +0 -13
  173. package/lib/api/aws-auth/proxy-agent.js +0 -54
  174. package/lib/api/cloud-assembly/private/source-builder.d.ts +0 -52
  175. package/lib/api/cloud-assembly/private/source-builder.js +0 -262
  176. package/lib/api/deployments/deployment-method.d.ts +0 -24
  177. package/lib/api/deployments/deployment-method.js +0 -3
  178. package/lib/api/shared-private.d.ts +0 -8
  179. package/lib/api/shared-private.js +0 -32
@@ -4,6 +4,7 @@ exports.computeResourceDigests = computeResourceDigests;
4
4
  exports.hashObject = hashObject;
5
5
  const crypto = require("node:crypto");
6
6
  const util_1 = require("@aws-cdk/cloudformation-diff/lib/diff/util");
7
+ const graph_1 = require("./graph");
7
8
  /**
8
9
  * Computes the digest for each resource in the template.
9
10
  *
@@ -27,63 +28,16 @@ const util_1 = require("@aws-cdk/cloudformation-diff/lib/diff/util");
27
28
  * CloudFormation template form a directed acyclic graph, this function is
28
29
  * well-defined.
29
30
  */
30
- function computeResourceDigests(template) {
31
- const resources = template.Resources || {};
32
- const graph = {};
33
- const reverseGraph = {};
34
- // 1. Build adjacency lists
35
- for (const id of Object.keys(resources)) {
36
- graph[id] = new Set();
37
- reverseGraph[id] = new Set();
38
- }
39
- // 2. Detect dependencies by searching for Ref/Fn::GetAtt
40
- const findDependencies = (value) => {
41
- if (!value || typeof value !== 'object')
42
- return [];
43
- if (Array.isArray(value)) {
44
- return value.flatMap(findDependencies);
45
- }
46
- if ('Ref' in value) {
47
- return [value.Ref];
48
- }
49
- if ('Fn::GetAtt' in value) {
50
- const refTarget = Array.isArray(value['Fn::GetAtt']) ? value['Fn::GetAtt'][0] : value['Fn::GetAtt'].split('.')[0];
51
- return [refTarget];
52
- }
53
- if ('DependsOn' in value) {
54
- return [value.DependsOn];
55
- }
56
- return Object.values(value).flatMap(findDependencies);
57
- };
58
- for (const [id, res] of Object.entries(resources)) {
59
- const deps = findDependencies(res || {});
60
- for (const dep of deps) {
61
- if (dep in resources && dep !== id) {
62
- graph[id].add(dep);
63
- reverseGraph[dep].add(id);
64
- }
65
- }
66
- }
67
- // 3. Topological sort
68
- const outDegree = Object.keys(graph).reduce((acc, k) => {
69
- acc[k] = graph[k].size;
70
- return acc;
71
- }, {});
72
- const queue = Object.keys(outDegree).filter((k) => outDegree[k] === 0);
73
- const order = [];
74
- while (queue.length > 0) {
75
- const node = queue.shift();
76
- order.push(node);
77
- for (const nxt of reverseGraph[node]) {
78
- outDegree[nxt]--;
79
- if (outDegree[nxt] === 0) {
80
- queue.push(nxt);
81
- }
82
- }
83
- }
31
+ function computeResourceDigests(stacks) {
32
+ const exports = Object.fromEntries(stacks.flatMap((s) => Object.values(s.template.Outputs ?? {})
33
+ .filter((o) => o.Export != null && typeof o.Export.Name === 'string')
34
+ .map((o) => [o.Export.Name, { stackName: s.stackName, value: o.Value }])));
35
+ const resources = Object.fromEntries(stacks.flatMap((s) => Object.entries(s.template.Resources ?? {}).map(([id, res]) => [`${s.stackName}.${id}`, res])));
36
+ const graph = new graph_1.ResourceGraph(stacks);
37
+ const nodes = graph.sortedNodes;
84
38
  // 4. Compute digests in sorted order
85
39
  const result = {};
86
- for (const id of order) {
40
+ for (const id of nodes) {
87
41
  const resource = resources[id];
88
42
  const resourceProperties = resource.Properties ?? {};
89
43
  const model = (0, util_1.loadResourceModel)(resource.Type);
@@ -102,8 +56,8 @@ function computeResourceDigests(template) {
102
56
  else {
103
57
  // The resource does not have a physical ID defined, so we need to
104
58
  // compute the digest based on its properties and dependencies.
105
- const depDigests = Array.from(graph[id]).map((d) => result[d]);
106
- const propertiesHash = hashObject(stripReferences(stripConstructPath(resource)));
59
+ const depDigests = Array.from(graph.outNeighbors(id)).map((d) => result[d]);
60
+ const propertiesHash = hashObject(stripReferences(stripConstructPath(resource), exports));
107
61
  toHash = resource.Type + propertiesHash + depDigests.join('');
108
62
  }
109
63
  result[id] = crypto.createHash('sha256').update(toHash).digest('hex');
@@ -140,11 +94,11 @@ function hashObject(obj) {
140
94
  * Removes sub-properties containing Ref or Fn::GetAtt to avoid hashing
141
95
  * references themselves but keeps the property structure.
142
96
  */
143
- function stripReferences(value) {
97
+ function stripReferences(value, exports) {
144
98
  if (!value || typeof value !== 'object')
145
99
  return value;
146
100
  if (Array.isArray(value)) {
147
- return value.map(stripReferences);
101
+ return value.map(x => stripReferences(x, exports));
148
102
  }
149
103
  if ('Ref' in value) {
150
104
  return { __cloud_ref__: 'Ref' };
@@ -155,9 +109,19 @@ function stripReferences(value) {
155
109
  if ('DependsOn' in value) {
156
110
  return { __cloud_ref__: 'DependsOn' };
157
111
  }
112
+ if ('Fn::ImportValue' in value) {
113
+ const v = exports[value['Fn::ImportValue']].value;
114
+ // Treat Fn::ImportValue as if it were a reference with the same stack
115
+ if ('Ref' in v) {
116
+ return { __cloud_ref__: 'Ref' };
117
+ }
118
+ else if ('Fn::GetAtt' in v) {
119
+ return { __cloud_ref__: 'Fn::GetAtt' };
120
+ }
121
+ }
158
122
  const result = {};
159
123
  for (const [k, v] of Object.entries(value)) {
160
- result[k] = stripReferences(v);
124
+ result[k] = stripReferences(v, exports);
161
125
  }
162
126
  return result;
163
127
  }
@@ -172,4 +136,4 @@ function stripConstructPath(resource) {
172
136
  function intersection(a, b) {
173
137
  return a.filter((value) => b.includes(value));
174
138
  }
175
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlnZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlnZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkJBLHdEQTBGQztBQUVELGdDQXdCQztBQS9JRCxzQ0FBc0M7QUFDdEMscUVBQStFO0FBRy9FOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsUUFBZ0M7SUFDckUsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7SUFDM0MsTUFBTSxLQUFLLEdBQWdDLEVBQUUsQ0FBQztJQUM5QyxNQUFNLFlBQVksR0FBZ0MsRUFBRSxDQUFDO0lBRXJELDJCQUEyQjtJQUMzQixLQUFLLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUN4QyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN0QixZQUFZLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQseURBQXlEO0lBQ3pELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxLQUFVLEVBQVksRUFBRTtRQUNoRCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNuRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxZQUFZLElBQUksS0FBSyxFQUFFLENBQUM7WUFDMUIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFD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Q0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgbG9hZFJlc291cmNlTW9kZWwgfSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmL2xpYi9kaWZmL3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvblRlbXBsYXRlIH0gZnJvbSAnLi9jbG91ZGZvcm1hdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRpZ2VzdCBmb3IgZWFjaCByZXNvdXJjZSBpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICogQ29uY2VwdHVhbGx5LCB0aGUgZGlnZXN0IGlzIGNvbXB1dGVkIGFzOlxuICpcbiAqICAgICBkKHJlc291cmNlKSA9IGhhc2godHlwZSArIHBoeXNpY2FsSWQpICAgICAgICAgICAgICAgICAgICAgICAsIGlmIHBoeXNpY2FsSWQgaXMgZGVmaW5lZFxuICogICAgICAgICAgICAgICAgID0gaGFzaCh0eXBlICsgcHJvcGVydGllcyArIGRlcGVuZGVuY2llcy5tYXAoZCkpICwgb3RoZXJ3aXNlXG4gKlxuICogd2hlcmUgYGhhc2hgIGlzIGEgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLiBJbiBvdGhlciB3b3JkcywgaWYgYSByZXNvdXJjZSBoYXNcbiAqIGEgcGh5c2ljYWwgSUQsIHdlIHVzZSB0aGUgcGh5c2ljYWwgSUQgcGx1cyBpdHMgdHlwZSB0byB1bmlxdWVseSBpZGVudGlmeVxuICogdGhhdCByZXNvdXJjZS4gSW4gdGhpcyBjYXNlLCB0aGUgZGlnZXN0IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZXNlIHR3byBmaWVsZHNcbiAqIGFsb25lLiBBIGNvcm9sbGFyeSBpcyB0aGF0IHN1Y2ggcmVzb3VyY2VzIGNhbiBiZSByZW5hbWVkIGFuZCBoYXZlIHRoZWlyXG4gKiBwcm9wZXJ0aWVzIHVwZGF0ZWQgYXQgdGhlIHNhbWUgdGltZSwgYW5kIHN0aWxsIGJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudC5cbiAqXG4gKiBPdGhlcndpc2UsIHRoZSBkaWdlc3QgaXMgY29tcHV0ZWQgZnJvbSBpdHMgdHlwZSwgaXRzIG93biBwcm9wZXJ0aWVzICh0aGF0IGlzLFxuICogZXhjbHVkaW5nIHByb3BlcnRpZXMgdGhhdCByZWZlciB0byBvdGhlciByZXNvdXJjZXMpLCBhbmQgdGhlIGRpZ2VzdHMgb2YgZWFjaCBvZlxuICogaXRzIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBUaGUgZGlnZXN0IG9mIGEgcmVzb3VyY2UsIGRlZmluZWQgcmVjdXJzaXZlbHkgdGhpcyB3YXksIHJlbWFpbnMgc3RhYmxlIGV2ZW4gaWZcbiAqIG9uZSBvciBtb3JlIG9mIGl0cyBkZXBlbmRlbmNpZXMgZ2V0cyByZW5hbWVkLiBTaW5jZSB0aGUgcmVzb3VyY2VzIGluIGFcbiAqIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIGZvcm0gYSBkaXJlY3RlZCBhY3ljbGljIGdyYXBoLCB0aGlzIGZ1bmN0aW9uIGlzXG4gKiB3ZWxsLWRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVzb3VyY2VEaWdlc3RzKHRlbXBsYXRlOiBDbG91ZEZvcm1hdGlvblRlbXBsYXRlKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJlc291cmNlcyA9IHRlbXBsYXRlLlJlc291cmNlcyB8fCB7fTtcbiAgY29uc3QgZ3JhcGg6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHt9O1xuICBjb25zdCByZXZlcnNlR3JhcGg6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHt9O1xuXG4gIC8vIDEuIEJ1aWxkIGFkamFjZW5jeSBsaXN0c1xuICBmb3IgKGNvbnN0IGlkIG9mIE9iamVjdC5rZXlzKHJlc291cmNlcykpIHtcbiAgICBncmFwaFtpZF0gPSBuZXcgU2V0KCk7XG4gICAgcmV2ZXJzZUdyYXBoW2lkXSA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIC8vIDIuIERldGVjdCBkZXBlbmRlbmNpZXMgYnkgc2VhcmNoaW5nIGZvciBSZWYvRm46OkdldEF0dFxuICBjb25zdCBmaW5kRGVwZW5kZW5jaWVzID0gKHZhbHVlOiBhbnkpOiBzdHJpbmdbXSA9PiB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuZmxhdE1hcChmaW5kRGVwZW5kZW5jaWVzKTtcbiAgICB9XG4gICAgaWYgKCdSZWYnIGluIHZhbHVlKSB7XG4gICAgICByZXR1cm4gW3ZhbHVlLlJlZl07XG4gICAgfVxuICAgIGlmICgnRm46OkdldEF0dCcgaW4gdmFsdWUpIHtcbiAgICAgIGNvbnN0IHJlZlRhcmdldCA9IEFycmF5LmlzQXJyYXkodmFsdWVbJ0ZuOjpHZXRBdHQnXSkgPyB2YWx1ZVsnRm46OkdldEF0dCddWzBdIDogdmFsdWVbJ0ZuOjpHZXRBdHQnXS5zcGxpdCgnLicpWzBdO1xuICAgICAgcmV0dXJuIFtyZWZUYXJnZXRdO1xuICAgIH1cbiAgICBpZiAoJ0RlcGVuZHNPbicgaW4gdmFsdWUpIHtcbiAgICAgIHJldHVybiBbdmFsdWUuRGVwZW5kc09uXTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModmFsdWUpLmZsYXRNYXAoZmluZERlcGVuZGVuY2llcyk7XG4gIH07XG5cbiAgZm9yIChjb25zdCBbaWQsIHJlc10gb2YgT2JqZWN0LmVudHJpZXMocmVzb3VyY2VzKSkge1xuICAgIGNvbnN0IGRlcHMgPSBmaW5kRGVwZW5kZW5jaWVzKHJlcyB8fCB7fSk7XG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgaWYgKGRlcCBpbiByZXNvdXJjZXMgJiYgZGVwICE9PSBpZCkge1xuICAgICAgICBncmFwaFtpZF0uYWRkKGRlcCk7XG4gICAgICAgIHJldmVyc2VHcmFwaFtkZXBdLmFkZChpZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gMy4gVG9wb2xvZ2ljYWwgc29ydFxuICBjb25zdCBvdXREZWdyZWUgPSBPYmplY3Qua2V5cyhncmFwaCkucmVkdWNlKChhY2MsIGspID0+IHtcbiAgICBhY2Nba10gPSBncmFwaFtrXS5zaXplO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pO1xuXG4gIGNvbnN0IHF1ZXVlID0gT2JqZWN0LmtleXMob3V0RGVncmVlKS5maWx0ZXIoKGspID0+IG91dERlZ3JlZVtrXSA9PT0gMCk7XG4gIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IHF1ZXVlLnNoaWZ0KCkhO1xuICAgIG9yZGVyLnB1c2gobm9kZSk7XG4gICAgZm9yIChjb25zdCBueHQgb2YgcmV2ZXJzZUdyYXBoW25vZGVdKSB7XG4gICAgICBvdXREZWdyZWVbbnh0XS0tO1xuICAgICAgaWYgKG91dERlZ3JlZVtueHRdID09PSAwKSB7XG4gICAgICAgIHF1ZXVlLnB1c2gobnh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA0LiBDb21wdXRlIGRpZ2VzdHMgaW4gc29ydGVkIG9yZGVyXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGlkIG9mIG9yZGVyKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSByZXNvdXJjZXNbaWRdO1xuICAgIGNvbnN0IHJlc291cmNlUHJvcGVydGllcyA9IHJlc291cmNlLlByb3BlcnRpZXMgPz8ge307XG4gICAgY29uc3QgbW9kZWwgPSBsb2FkUmVzb3VyY2VNb2RlbChyZXNvdXJjZS5UeXBlKTtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gaW50ZXJzZWN0aW9uKE9iamVjdC5rZXlzKHJlc291cmNlUHJvcGVydGllcyksIG1vZGVsPy5wcmltYXJ5SWRlbnRpZmllciA/PyBbXSk7XG4gICAgbGV0IHRvSGFzaDogc3RyaW5nO1xuXG4gICAgaWYgKGlkZW50aWZpZXIubGVuZ3RoID09PSBtb2RlbD8ucHJpbWFyeUlkZW50aWZpZXI/Lmxlbmd0aCkge1xuICAgICAgLy8gVGhlIHJlc291cmNlIGhhcyBhIHBoeXNpY2FsIElEIGRlZmluZWQsIHNvIHdlIGNhblxuICAgICAgLy8gdXNlIHRoZSBJRCBhbmQgdGhlIHR5cGUgYXMgdGhlIGlkZW50aXR5IG9mIHRoZSByZXNvdXJjZS5cbiAgICAgIHRvSGFzaCA9XG4gICAgICAgIHJlc291cmNlLlR5cGUgK1xuICAgICAgICBpZGVudGlmaWVyXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICAgIC5tYXAoKGF0dHIpID0+IEpTT04uc3RyaW5naWZ5KHJlc291cmNlUHJvcGVydGllc1thdHRyXSkpXG4gICAgICAgICAgLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmVzb3VyY2UgZG9lcyBub3QgaGF2ZSBhIHBoeXNpY2FsIElEIGRlZmluZWQsIHNvIHdlIG5lZWQgdG9cbiAgICAgIC8vIGNvbXB1dGUgdGhlIGRpZ2VzdCBiYXNlZCBvbiBpdHMgcHJvcGVydGllcyBhbmQgZGVwZW5kZW5jaWVzLlxuICAgICAgY29uc3QgZGVwRGlnZXN0cyA9IEFycmF5LmZyb20oZ3JhcGhbaWRdKS5tYXAoKGQpID0+IHJlc3VsdFtkXSk7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzSGFzaCA9IGhhc2hPYmplY3Qoc3RyaXBSZWZlcmVuY2VzKHN0cmlwQ29uc3RydWN0UGF0aChyZXNvdXJjZSkpKTtcbiAgICAgIHRvSGFzaCA9IHJlc291cmNlLlR5cGUgKyBwcm9wZXJ0aWVzSGFzaCArIGRlcERpZ2VzdHMuam9pbignJyk7XG4gICAgfVxuXG4gICAgcmVzdWx0W2lkXSA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUodG9IYXNoKS5kaWdlc3QoJ2hleCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc2hPYmplY3Qob2JqOiBhbnkpOiBzdHJpbmcge1xuICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGZ1bmN0aW9uIGFkZFRvSGFzaCh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIGFkZFRvSGFzaCgnbnVsbCcpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goYWRkVG9IYXNoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBoYXNoLnVwZGF0ZShrZXkpO1xuICAgICAgICAgICAgYWRkVG9IYXNoKHZhbHVlW2tleV0pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYXNoLnVwZGF0ZSh0eXBlb2YgdmFsdWUgKyB2YWx1ZS50b1N0cmluZygpKTtcbiAgICB9XG4gIH1cblxuICBhZGRUb0hhc2gob2JqKTtcbiAgcmV0dXJuIGhhc2guZGlnZXN0KCdoZXgnKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHN1Yi1wcm9wZXJ0aWVzIGNvbnRhaW5pbmcgUmVmIG9yIEZuOjpHZXRBdHQgdG8gYXZvaWQgaGFzaGluZ1xuICogcmVmZXJlbmNlcyB0aGVtc2VsdmVzIGJ1dCBrZWVwcyB0aGUgcHJvcGVydHkgc3RydWN0dXJlLlxuICovXG5mdW5jdGlvbiBzdHJpcFJlZmVyZW5jZXModmFsdWU6IGFueSk6IGFueSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKHN0cmlwUmVmZXJlbmNlcyk7XG4gIH1cbiAgaWYgKCdSZWYnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHsgX19jbG91ZF9yZWZfXzogJ1JlZicgfTtcbiAgfVxuICBpZiAoJ0ZuOjpHZXRBdHQnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHsgX19jbG91ZF9yZWZfXzogJ0ZuOjpHZXRBdHQnIH07XG4gIH1cbiAgaWYgKCdEZXBlbmRzT24nIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHsgX19jbG91ZF9yZWZfXzogJ0RlcGVuZHNPbicgfTtcbiAgfVxuICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICByZXN1bHRba10gPSBzdHJpcFJlZmVyZW5jZXModik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc3RyaXBDb25zdHJ1Y3RQYXRoKHJlc291cmNlOiBhbnkpOiBhbnkge1xuICBpZiAocmVzb3VyY2U/Lk1ldGFkYXRhPy5bJ2F3czpjZGs6cGF0aCddID09IG51bGwpIHtcbiAgICByZXR1cm4gcmVzb3VyY2U7XG4gIH1cblxuICBjb25zdCBjb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXNvdXJjZSkpO1xuICBkZWxldGUgY29weS5NZXRhZGF0YVsnYXdzOmNkazpwYXRoJ107XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3Rpb248VD4oYTogVFtdLCBiOiBUW10pOiBUW10ge1xuICByZXR1cm4gYS5maWx0ZXIoKHZhbHVlKSA9PiBiLmluY2x1ZGVzKHZhbHVlKSk7XG59XG4iXX0=
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlnZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlnZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNEJBLHdEQWlEQztBQUVELGdDQXdCQztBQXZHRCxzQ0FBc0M7QUFDdEMscUVBQStFO0FBRS9FLG1DQUF3QztBQUV4Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLE1BQTZCO0lBQ2xFLE1BQU0sT0FBTyxHQUF1RCxNQUFNLENBQUMsV0FBVyxDQUNwRixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7U0FDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztTQUNwRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFnRCxDQUFDLENBQzFILENBQ0YsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQ2xDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNuQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FDNUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxF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O1xuaW1wb3J0IHsgbG9hZFJlc291cmNlTW9kZWwgfSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmL2xpYi9kaWZmL3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvblJlc291cmNlLCBDbG91ZEZvcm1hdGlvblN0YWNrIH0gZnJvbSAnLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYXBoIH0gZnJvbSAnLi9ncmFwaCc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRpZ2VzdCBmb3IgZWFjaCByZXNvdXJjZSBpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICogQ29uY2VwdHVhbGx5LCB0aGUgZGlnZXN0IGlzIGNvbXB1dGVkIGFzOlxuICpcbiAqICAgICBkKHJlc291cmNlKSA9IGhhc2godHlwZSArIHBoeXNpY2FsSWQpICAgICAgICAgICAgICAgICAgICAgICAsIGlmIHBoeXNpY2FsSWQgaXMgZGVmaW5lZFxuICogICAgICAgICAgICAgICAgID0gaGFzaCh0eXBlICsgcHJvcGVydGllcyArIGRlcGVuZGVuY2llcy5tYXAoZCkpICwgb3RoZXJ3aXNlXG4gKlxuICogd2hlcmUgYGhhc2hgIGlzIGEgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLiBJbiBvdGhlciB3b3JkcywgaWYgYSByZXNvdXJjZSBoYXNcbiAqIGEgcGh5c2ljYWwgSUQsIHdlIHVzZSB0aGUgcGh5c2ljYWwgSUQgcGx1cyBpdHMgdHlwZSB0byB1bmlxdWVseSBpZGVudGlmeVxuICogdGhhdCByZXNvdXJjZS4gSW4gdGhpcyBjYXNlLCB0aGUgZGlnZXN0IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZXNlIHR3byBmaWVsZHNcbiAqIGFsb25lLiBBIGNvcm9sbGFyeSBpcyB0aGF0IHN1Y2ggcmVzb3VyY2VzIGNhbiBiZSByZW5hbWVkIGFuZCBoYXZlIHRoZWlyXG4gKiBwcm9wZXJ0aWVzIHVwZGF0ZWQgYXQgdGhlIHNhbWUgdGltZSwgYW5kIHN0aWxsIGJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudC5cbiAqXG4gKiBPdGhlcndpc2UsIHRoZSBkaWdlc3QgaXMgY29tcHV0ZWQgZnJvbSBpdHMgdHlwZSwgaXRzIG93biBwcm9wZXJ0aWVzICh0aGF0IGlzLFxuICogZXhjbHVkaW5nIHByb3BlcnRpZXMgdGhhdCByZWZlciB0byBvdGhlciByZXNvdXJjZXMpLCBhbmQgdGhlIGRpZ2VzdHMgb2YgZWFjaCBvZlxuICogaXRzIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBUaGUgZGlnZXN0IG9mIGEgcmVzb3VyY2UsIGRlZmluZWQgcmVjdXJzaXZlbHkgdGhpcyB3YXksIHJlbWFpbnMgc3RhYmxlIGV2ZW4gaWZcbiAqIG9uZSBvciBtb3JlIG9mIGl0cyBkZXBlbmRlbmNpZXMgZ2V0cyByZW5hbWVkLiBTaW5jZSB0aGUgcmVzb3VyY2VzIGluIGFcbiAqIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIGZvcm0gYSBkaXJlY3RlZCBhY3ljbGljIGdyYXBoLCB0aGlzIGZ1bmN0aW9uIGlzXG4gKiB3ZWxsLWRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVzb3VyY2VEaWdlc3RzKHN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGV4cG9ydHM6IHsgW3A6IHN0cmluZ106IHsgc3RhY2tOYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnkgfSB9ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIHN0YWNrcy5mbGF0TWFwKChzKSA9PlxuICAgICAgT2JqZWN0LnZhbHVlcyhzLnRlbXBsYXRlLk91dHB1dHMgPz8ge30pXG4gICAgICAgIC5maWx0ZXIoKG8pID0+IG8uRXhwb3J0ICE9IG51bGwgJiYgdHlwZW9mIG8uRXhwb3J0Lk5hbWUgPT09ICdzdHJpbmcnKVxuICAgICAgICAubWFwKChvKSA9PiBbby5FeHBvcnQuTmFtZSwgeyBzdGFja05hbWU6IHMuc3RhY2tOYW1lLCB2YWx1ZTogby5WYWx1ZSB9XSBhcyBbc3RyaW5nLCB7IHN0YWNrTmFtZTogc3RyaW5nOyB2YWx1ZTogYW55IH1dKSxcbiAgICApLFxuICApO1xuXG4gIGNvbnN0IHJlc291cmNlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBzdGFja3MuZmxhdE1hcCgocykgPT5cbiAgICAgIE9iamVjdC5lbnRyaWVzKHMudGVtcGxhdGUuUmVzb3VyY2VzID8/IHt9KS5tYXAoXG4gICAgICAgIChbaWQsIHJlc10pID0+IFtgJHtzLnN0YWNrTmFtZX0uJHtpZH1gLCByZXNdIGFzIFtzdHJpbmcsIENsb3VkRm9ybWF0aW9uUmVzb3VyY2VdLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIGNvbnN0IGdyYXBoID0gbmV3IFJlc291cmNlR3JhcGgoc3RhY2tzKTtcbiAgY29uc3Qgbm9kZXMgPSBncmFwaC5zb3J0ZWROb2RlcztcbiAgLy8gNC4gQ29tcHV0ZSBkaWdlc3RzIGluIHNvcnRlZCBvcmRlclxuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBpZCBvZiBub2Rlcykge1xuICAgIGNvbnN0IHJlc291cmNlID0gcmVzb3VyY2VzW2lkXTtcbiAgICBjb25zdCByZXNvdXJjZVByb3BlcnRpZXMgPSByZXNvdXJjZS5Qcm9wZXJ0aWVzID8/IHt9O1xuICAgIGNvbnN0IG1vZGVsID0gbG9hZFJlc291cmNlTW9kZWwocmVzb3VyY2UuVHlwZSk7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IGludGVyc2VjdGlvbihPYmplY3Qua2V5cyhyZXNvdXJjZVByb3BlcnRpZXMpLCBtb2RlbD8ucHJpbWFyeUlkZW50aWZpZXIgPz8gW10pO1xuICAgIGxldCB0b0hhc2g6IHN0cmluZztcblxuICAgIGlmIChpZGVudGlmaWVyLmxlbmd0aCA9PT0gbW9kZWw/LnByaW1hcnlJZGVudGlmaWVyPy5sZW5ndGgpIHtcbiAgICAgIC8vIFRoZSByZXNvdXJjZSBoYXMgYSBwaHlzaWNhbCBJRCBkZWZpbmVkLCBzbyB3ZSBjYW5cbiAgICAgIC8vIHVzZSB0aGUgSUQgYW5kIHRoZSB0eXBlIGFzIHRoZSBpZGVudGl0eSBvZiB0aGUgcmVzb3VyY2UuXG4gICAgICB0b0hhc2ggPVxuICAgICAgICByZXNvdXJjZS5UeXBlICtcbiAgICAgICAgaWRlbnRpZmllclxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAubWFwKChhdHRyKSA9PiBKU09OLnN0cmluZ2lmeShyZXNvdXJjZVByb3BlcnRpZXNbYXR0cl0pKVxuICAgICAgICAgIC5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJlc291cmNlIGRvZXMgbm90IGhhdmUgYSBwaHlzaWNhbCBJRCBkZWZpbmVkLCBzbyB3ZSBuZWVkIHRvXG4gICAgICAvLyBjb21wdXRlIHRoZSBkaWdlc3QgYmFzZWQgb24gaXRzIHByb3BlcnRpZXMgYW5kIGRlcGVuZGVuY2llcy5cbiAgICAgIGNvbnN0IGRlcERpZ2VzdHMgPSBBcnJheS5mcm9tKGdyYXBoLm91dE5laWdoYm9ycyhpZCkpLm1hcCgoZCkgPT4gcmVzdWx0W2RdKTtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXNIYXNoID0gaGFzaE9iamVjdChzdHJpcFJlZmVyZW5jZXMoc3RyaXBDb25zdHJ1Y3RQYXRoKHJlc291cmNlKSwgZXhwb3J0cykpO1xuICAgICAgdG9IYXNoID0gcmVzb3VyY2UuVHlwZSArIHByb3BlcnRpZXNIYXNoICsgZGVwRGlnZXN0cy5qb2luKCcnKTtcbiAgICB9XG5cbiAgICByZXN1bHRbaWRdID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZSh0b0hhc2gpLmRpZ2VzdCgnaGV4Jyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzaE9iamVjdChvYmo6IGFueSk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgZnVuY3Rpb24gYWRkVG9IYXNoKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgYWRkVG9IYXNoKCdudWxsJyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChhZGRUb0hhc2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmtleXModmFsdWUpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGhhc2gudXBkYXRlKGtleSk7XG4gICAgICAgICAgICBhZGRUb0hhc2godmFsdWVba2V5XSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc2gudXBkYXRlKHR5cGVvZiB2YWx1ZSArIHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgfVxuXG4gIGFkZFRvSGFzaChvYmopO1xuICByZXR1cm4gaGFzaC5kaWdlc3QoJ2hleCcpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgc3ViLXByb3BlcnRpZXMgY29udGFpbmluZyBSZWYgb3IgRm46OkdldEF0dCB0byBhdm9pZCBoYXNoaW5nXG4gKiByZWZlcmVuY2VzIHRoZW1zZWx2ZXMgYnV0IGtlZXBzIHRoZSBwcm9wZXJ0eSBzdHJ1Y3R1cmUuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwUmVmZXJlbmNlcyh2YWx1ZTogYW55LCBleHBvcnRzOiB7IFtwOiBzdHJpbmddOiB7IHN0YWNrTmFtZTogc3RyaW5nOyB2YWx1ZTogYW55IH0gfSk6IGFueSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKHggPT4gc3RyaXBSZWZlcmVuY2VzKHgsIGV4cG9ydHMpKTtcbiAgfVxuICBpZiAoJ1JlZicgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4geyBfX2Nsb3VkX3JlZl9fOiAnUmVmJyB9O1xuICB9XG4gIGlmICgnRm46OkdldEF0dCcgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4geyBfX2Nsb3VkX3JlZl9fOiAnRm46OkdldEF0dCcgfTtcbiAgfVxuICBpZiAoJ0RlcGVuZHNPbicgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4geyBfX2Nsb3VkX3JlZl9fOiAnRGVwZW5kc09uJyB9O1xuICB9XG4gIGlmICgnRm46OkltcG9ydFZhbHVlJyBpbiB2YWx1ZSkge1xuICAgIGNvbnN0IHYgPSBleHBvcnRzW3ZhbHVlWydGbjo6SW1wb3J0VmFsdWUnXV0udmFsdWU7XG4gICAgLy8gVHJlYXQgRm46OkltcG9ydFZhbHVlIGFzIGlmIGl0IHdlcmUgYSByZWZlcmVuY2Ugd2l0aCB0aGUgc2FtZSBzdGFja1xuICAgIGlmICgnUmVmJyBpbiB2KSB7XG4gICAgICByZXR1cm4geyBfX2Nsb3VkX3JlZl9fOiAnUmVmJyB9O1xuICAgIH0gZWxzZSBpZiAoJ0ZuOjpHZXRBdHQnIGluIHYpIHtcbiAgICAgIHJldHVybiB7IF9fY2xvdWRfcmVmX186ICdGbjo6R2V0QXR0JyB9O1xuICAgIH1cbiAgfVxuICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICByZXN1bHRba10gPSBzdHJpcFJlZmVyZW5jZXModiwgZXhwb3J0cyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc3RyaXBDb25zdHJ1Y3RQYXRoKHJlc291cmNlOiBhbnkpOiBhbnkge1xuICBpZiAocmVzb3VyY2U/Lk1ldGFkYXRhPy5bJ2F3czpjZGs6cGF0aCddID09IG51bGwpIHtcbiAgICByZXR1cm4gcmVzb3VyY2U7XG4gIH1cblxuICBjb25zdCBjb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXNvdXJjZSkpO1xuICBkZWxldGUgY29weS5NZXRhZGF0YVsnYXdzOmNkazpwYXRoJ107XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3Rpb248VD4oYTogVFtdLCBiOiBUW10pOiBUW10ge1xuICByZXR1cm4gYS5maWx0ZXIoKHZhbHVlKSA9PiBiLmluY2x1ZGVzKHZhbHVlKSk7XG59XG4iXX0=
@@ -0,0 +1,15 @@
1
+ import type { CloudFormationStack } from './cloudformation';
2
+ /**
3
+ * An immutable directed graph of resources from multiple CloudFormation stacks.
4
+ */
5
+ export declare class ResourceGraph {
6
+ private readonly edges;
7
+ private readonly reverseEdges;
8
+ constructor(stacks: Omit<CloudFormationStack, 'environment'>[]);
9
+ /**
10
+ * Returns the sorted nodes in topological order.
11
+ */
12
+ get sortedNodes(): string[];
13
+ inNeighbors(node: string): string[];
14
+ outNeighbors(node: string): string[];
15
+ }
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResourceGraph = void 0;
4
+ const toolkit_error_1 = require("../../toolkit/toolkit-error");
5
+ /**
6
+ * An immutable directed graph of resources from multiple CloudFormation stacks.
7
+ */
8
+ class ResourceGraph {
9
+ edges = {};
10
+ reverseEdges = {};
11
+ constructor(stacks) {
12
+ const exports = Object.fromEntries(stacks.flatMap((s) => Object.values(s.template.Outputs ?? {})
13
+ .filter((o) => o.Export != null && typeof o.Export.Name === 'string')
14
+ .map((o) => [o.Export.Name, { stackName: s.stackName, value: o.Value }])));
15
+ const resources = Object.fromEntries(stacks.flatMap((s) => Object.entries(s.template.Resources ?? {}).map(([id, res]) => [`${s.stackName}.${id}`, res])));
16
+ // 1. Build adjacency lists
17
+ for (const id of Object.keys(resources)) {
18
+ this.edges[id] = new Set();
19
+ this.reverseEdges[id] = new Set();
20
+ }
21
+ // 2. Detect dependencies by searching for Ref/Fn::GetAtt
22
+ const findDependencies = (stackName, value) => {
23
+ if (!value || typeof value !== 'object')
24
+ return [];
25
+ if (Array.isArray(value)) {
26
+ return value.flatMap((res) => findDependencies(stackName, res));
27
+ }
28
+ if ('Ref' in value) {
29
+ return [`${stackName}.${value.Ref}`];
30
+ }
31
+ if ('Fn::GetAtt' in value) {
32
+ const refTarget = Array.isArray(value['Fn::GetAtt'])
33
+ ? value['Fn::GetAtt'][0]
34
+ : value['Fn::GetAtt'].split('.')[0];
35
+ return [`${stackName}.${refTarget}`];
36
+ }
37
+ if ('Fn::ImportValue' in value) {
38
+ const exp = exports[value['Fn::ImportValue']];
39
+ const v = exp.value;
40
+ if ('Fn::GetAtt' in v) {
41
+ const id = Array.isArray(v['Fn::GetAtt']) ? v['Fn::GetAtt'][0] : v['Fn::GetAtt'].split('.')[0];
42
+ return [`${exp.stackName}.${id}`];
43
+ }
44
+ if ('Ref' in v) {
45
+ return [`${exp.stackName}.${v.Ref}`];
46
+ }
47
+ return [`${exp.stackName}.${v}`];
48
+ }
49
+ const result = [];
50
+ if ('DependsOn' in value) {
51
+ if (Array.isArray(value.DependsOn)) {
52
+ result.push(...value.DependsOn.map((r) => `${stackName}.${r}`));
53
+ }
54
+ else {
55
+ result.push(`${stackName}.${value.DependsOn}`);
56
+ }
57
+ }
58
+ result.push(...Object.values(value).flatMap((res) => findDependencies(stackName, res)));
59
+ return result;
60
+ };
61
+ for (const [id, res] of Object.entries(resources)) {
62
+ const stackName = id.split('.')[0];
63
+ const deps = findDependencies(stackName, res || {});
64
+ for (const dep of deps) {
65
+ if (dep in resources && dep !== id) {
66
+ this.edges[id].add(dep);
67
+ this.reverseEdges[dep].add(id);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ /**
73
+ * Returns the sorted nodes in topological order.
74
+ */
75
+ get sortedNodes() {
76
+ const result = [];
77
+ const outDegree = Object.keys(this.edges).reduce((acc, k) => {
78
+ acc[k] = this.edges[k].size;
79
+ return acc;
80
+ }, {});
81
+ const queue = Object.keys(outDegree).filter((k) => outDegree[k] === 0);
82
+ while (queue.length > 0) {
83
+ const node = queue.shift();
84
+ result.push(node);
85
+ for (const nxt of this.reverseEdges[node]) {
86
+ outDegree[nxt]--;
87
+ if (outDegree[nxt] === 0) {
88
+ queue.push(nxt);
89
+ }
90
+ }
91
+ }
92
+ return result;
93
+ }
94
+ inNeighbors(node) {
95
+ if (!(node in this.edges)) {
96
+ throw new toolkit_error_1.ToolkitError(`Node ${node} not found in the graph`);
97
+ }
98
+ return Array.from(this.reverseEdges[node] || []);
99
+ }
100
+ outNeighbors(node) {
101
+ if (!(node in this.edges)) {
102
+ throw new toolkit_error_1.ToolkitError(`Node ${node} not found in the graph`);
103
+ }
104
+ return Array.from(this.edges[node] || []);
105
+ }
106
+ }
107
+ exports.ResourceGraph = ResourceGraph;
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJncmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwrREFBMkQ7QUFFM0Q7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFDUCxLQUFLLEdBQWdDLEVBQUUsQ0FBQztJQUN4QyxZQUFZLEdBQWdDLEVBQUUsQ0FBQztJQUVoRSxZQUFZLE1BQWtEO1FBQzVELE1BQU0sT0FBTyxHQUF1RCxNQUFNLENBQUMsV0FBVyxDQUNwRixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7YUFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQzthQUNwRSxHQUFHLENBQ0YsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQU16RCxDQUNKLENBQ0osQ0FDRixDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDbEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ25CLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUM1QyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQXFD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QUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVNLFlBQVksQ0FBQyxJQUFZO1FBQzlCLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksNEJBQVksQ0FBQyxRQUFRLElBQUkseUJBQXlCLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGO0FBN0hELHNDQTZIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2xvdWRGb3JtYXRpb25SZXNvdXJjZSwgQ2xvdWRGb3JtYXRpb25TdGFjayB9IGZyb20gJy4vY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC90b29sa2l0LWVycm9yJztcblxuLyoqXG4gKiBBbiBpbW11dGFibGUgZGlyZWN0ZWQgZ3JhcGggb2YgcmVzb3VyY2VzIGZyb20gbXVsdGlwbGUgQ2xvdWRGb3JtYXRpb24gc3RhY2tzLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VHcmFwaCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWRnZXM6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHJldmVyc2VFZGdlczogUmVjb3JkPHN0cmluZywgU2V0PHN0cmluZz4+ID0ge307XG5cbiAgY29uc3RydWN0b3Ioc3RhY2tzOiBPbWl0PENsb3VkRm9ybWF0aW9uU3RhY2ssICdlbnZpcm9ubWVudCc+W10pIHtcbiAgICBjb25zdCBleHBvcnRzOiB7IFtwOiBzdHJpbmddOiB7IHN0YWNrTmFtZTogc3RyaW5nOyB2YWx1ZTogYW55IH0gfSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIHN0YWNrcy5mbGF0TWFwKChzKSA9PlxuICAgICAgICBPYmplY3QudmFsdWVzKHMudGVtcGxhdGUuT3V0cHV0cyA/PyB7fSlcbiAgICAgICAgICAuZmlsdGVyKChvKSA9PiBvLkV4cG9ydCAhPSBudWxsICYmIHR5cGVvZiBvLkV4cG9ydC5OYW1lID09PSAnc3RyaW5nJylcbiAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgKG8pID0+XG4gICAgICAgICAgICAgIFtvLkV4cG9ydC5OYW1lLCB7IHN0YWNrTmFtZTogcy5zdGFja05hbWUsIHZhbHVlOiBvLlZhbHVlIH1dIGFzIFtcbiAgICAgICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc3RhY2tOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogYW55O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc291cmNlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIHN0YWNrcy5mbGF0TWFwKChzKSA9PlxuICAgICAgICBPYmplY3QuZW50cmllcyhzLnRlbXBsYXRlLlJlc291cmNlcyA/PyB7fSkubWFwKFxuICAgICAgICAgIChbaWQsIHJlc10pID0+IFtgJHtzLnN0YWNrTmFtZX0uJHtpZH1gLCByZXNdIGFzIFtzdHJpbmcsIENsb3VkRm9ybWF0aW9uUmVzb3VyY2VdLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgLy8gMS4gQnVpbGQgYWRqYWNlbmN5IGxpc3RzXG4gICAgZm9yIChjb25zdCBpZCBvZiBPYmplY3Qua2V5cyhyZXNvdXJjZXMpKSB7XG4gICAgICB0aGlzLmVkZ2VzW2lkXSA9IG5ldyBTZXQoKTtcbiAgICAgIHRoaXMucmV2ZXJzZUVkZ2VzW2lkXSA9IG5ldyBTZXQoKTtcbiAgICB9XG5cbiAgICAvLyAyLiBEZXRlY3QgZGVwZW5kZW5jaWVzIGJ5IHNlYXJjaGluZyBmb3IgUmVmL0ZuOjpHZXRBdHRcbiAgICBjb25zdCBmaW5kRGVwZW5kZW5jaWVzID0gKHN0YWNrTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogc3RyaW5nW10gPT4ge1xuICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAoKHJlcykgPT4gZmluZERlcGVuZGVuY2llcyhzdGFja05hbWUsIHJlcykpO1xuICAgICAgfVxuICAgICAgaWYgKCdSZWYnIGluIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBbYCR7c3RhY2tOYW1lfS4ke3ZhbHVlLlJlZn1gXTtcbiAgICAgIH1cbiAgICAgIGlmICgnRm46OkdldEF0dCcgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgcmVmVGFyZ2V0ID0gQXJyYXkuaXNBcnJheSh2YWx1ZVsnRm46OkdldEF0dCddKVxuICAgICAgICAgID8gdmFsdWVbJ0ZuOjpHZXRBdHQnXVswXVxuICAgICAgICAgIDogdmFsdWVbJ0ZuOjpHZXRBdHQnXS5zcGxpdCgnLicpWzBdO1xuICAgICAgICByZXR1cm4gW2Ake3N0YWNrTmFtZX0uJHtyZWZUYXJnZXR9YF07XG4gICAgICB9XG4gICAgICBpZiAoJ0ZuOjpJbXBvcnRWYWx1ZScgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZXhwID0gZXhwb3J0c1t2YWx1ZVsnRm46OkltcG9ydFZhbHVlJ11dO1xuICAgICAgICBjb25zdCB2ID0gZXhwLnZhbHVlO1xuICAgICAgICBpZiAoJ0ZuOjpHZXRBdHQnIGluIHYpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IEFycmF5LmlzQXJyYXkodlsnRm46OkdldEF0dCddKSA/IHZbJ0ZuOjpHZXRBdHQnXVswXSA6IHZbJ0ZuOjpHZXRBdHQnXS5zcGxpdCgnLicpWzBdO1xuICAgICAgICAgIHJldHVybiBbYCR7ZXhwLnN0YWNrTmFtZX0uJHtpZH1gXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ1JlZicgaW4gdikge1xuICAgICAgICAgIHJldHVybiBbYCR7ZXhwLnN0YWNrTmFtZX0uJHt2LlJlZn1gXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Ake2V4cC5zdGFja05hbWV9LiR7dn1gXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICgnRGVwZW5kc09uJyBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5EZXBlbmRzT24pKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goLi4udmFsdWUuRGVwZW5kc09uLm1hcCgocjogc3RyaW5nKSA9PiBgJHtzdGFja05hbWV9LiR7cn1gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goYCR7c3RhY2tOYW1lfS4ke3ZhbHVlLkRlcGVuZHNPbn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goLi4uT2JqZWN0LnZhbHVlcyh2YWx1ZSkuZmxhdE1hcCgocmVzKSA9PiBmaW5kRGVwZW5kZW5jaWVzKHN0YWNrTmFtZSwgcmVzKSkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBbaWQsIHJlc10gb2YgT2JqZWN0LmVudHJpZXMocmVzb3VyY2VzKSkge1xuICAgICAgY29uc3Qgc3RhY2tOYW1lID0gaWQuc3BsaXQoJy4nKVswXTtcbiAgICAgIGNvbnN0IGRlcHMgPSBmaW5kRGVwZW5kZW5jaWVzKHN0YWNrTmFtZSwgcmVzIHx8IHt9KTtcbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgaWYgKGRlcCBpbiByZXNvdXJjZXMgJiYgZGVwICE9PSBpZCkge1xuICAgICAgICAgIHRoaXMuZWRnZXNbaWRdLmFkZChkZXApO1xuICAgICAgICAgIHRoaXMucmV2ZXJzZUVkZ2VzW2RlcF0uYWRkKGlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzb3J0ZWQgbm9kZXMgaW4gdG9wb2xvZ2ljYWwgb3JkZXIuXG4gICAqL1xuICBnZXQgc29ydGVkTm9kZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBvdXREZWdyZWUgPSBPYmplY3Qua2V5cyh0aGlzLmVkZ2VzKS5yZWR1Y2UoKGFjYywgaykgPT4ge1xuICAgICAgYWNjW2tdID0gdGhpcy5lZGdlc1trXS5zaXplO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KTtcblxuICAgIGNvbnN0IHF1ZXVlID0gT2JqZWN0LmtleXMob3V0RGVncmVlKS5maWx0ZXIoKGspID0+IG91dERlZ3JlZVtrXSA9PT0gMCk7XG5cbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHF1ZXVlLnNoaWZ0KCkhO1xuICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgICBmb3IgKGNvbnN0IG54dCBvZiB0aGlzLnJldmVyc2VFZGdlc1tub2RlXSkge1xuICAgICAgICBvdXREZWdyZWVbbnh0XS0tO1xuICAgICAgICBpZiAob3V0RGVncmVlW254dF0gPT09IDApIHtcbiAgICAgICAgICBxdWV1ZS5wdXNoKG54dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBpbk5laWdoYm9ycyhub2RlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCEobm9kZSBpbiB0aGlzLmVkZ2VzKSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgTm9kZSAke25vZGV9IG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGhgKTtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5yZXZlcnNlRWRnZXNbbm9kZV0gfHwgW10pO1xuICB9XG5cbiAgcHVibGljIG91dE5laWdoYm9ycyhub2RlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCEobm9kZSBpbiB0aGlzLmVkZ2VzKSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgTm9kZSAke25vZGV9IG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGhgKTtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lZGdlc1tub2RlXSB8fCBbXSk7XG4gIH1cbn1cbiJdfQ==
@@ -117,7 +117,7 @@ async function usePrescribedMappings(mappingGroups, sdkProvider) {
117
117
  }
118
118
  }
119
119
  function resourceMovements(before, after) {
120
- return Object.values(removeUnmovedResources(zip(groupByKey(before.flatMap(resourceDigests)), groupByKey(after.flatMap(resourceDigests)))));
120
+ return Object.values(removeUnmovedResources(zip(groupByKey(resourceDigests(before)), groupByKey(resourceDigests(after)))));
121
121
  }
122
122
  function ambiguousMovements(movements) {
123
123
  // A movement is considered ambiguous if these two conditions are met:
@@ -180,10 +180,16 @@ function zip(m1, m2) {
180
180
  /**
181
181
  * Computes a list of pairs [digest, location] for each resource in the stack.
182
182
  */
183
- function resourceDigests(stack) {
184
- const digests = (0, digest_1.computeResourceDigests)(stack.template);
185
- return Object.entries(digests).map(([logicalId, digest]) => {
186
- const location = new cloudformation_1.ResourceLocation(stack, logicalId);
183
+ function resourceDigests(stacks) {
184
+ // index stacks by name
185
+ const stacksByName = new Map();
186
+ for (const stack of stacks) {
187
+ stacksByName.set(stack.stackName, stack);
188
+ }
189
+ const digests = (0, digest_1.computeResourceDigests)(stacks);
190
+ return Object.entries(digests).map(([loc, digest]) => {
191
+ const [stackName, logicalId] = loc.split('.');
192
+ const location = new cloudformation_1.ResourceLocation(stacksByName.get(stackName), logicalId);
187
193
  return [digest, location];
188
194
  });
189
195
  }
@@ -249,4 +255,4 @@ function formatAmbiguousMappings(paths) {
249
255
  (0, cloudformation_diff_1.formatAmbiguousMappings)(stream, paths);
250
256
  return stream.toString();
251
257
  }
252
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQXVEQSxzREFxRkM7QUFFRCw4Q0FNQztBQUVELGdEQU9DO0FBTUQsNENBZUM7QUEyREQsc0RBNkJDO0FBZ0NELGtEQUlDO0FBRUQsMERBSUM7QUFuVEQsc0VBR3NDO0FBR3RDLHFDQUFrRDtBQUVsRCxzQ0FBaUM7QUFDakMsd0NBQStDO0FBRS9DLHFEQUFxRTtBQUNyRSxxQ0FBOEQ7QUFDOUQsdUNBQTJEO0FBRTNELCtEQUEyRDtBQUUzRCw0Q0FBMEI7QUFTMUIsTUFBYSxjQUFlLFNBQVEsS0FBSztJQUNYO0lBQTVCLFlBQTRCLFNBQTZCO1FBQ3ZELEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBRFgsY0FBUyxHQUFULFNBQVMsQ0FBb0I7SUFFekQsQ0FBQztJQUVNLEtBQUs7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEUsU0FBUyxPQUFPLENBQUMsU0FBNkI7WUFDNUMsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBWkQsd0NBWUM7QUFFRCxTQUFTLFVBQVUsQ0FBSSxPQUFzQjtJQUMzQyxNQUFNLE1BQU0sR0FBd0IsRUFBRSxDQUFDO0lBRXZDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN2QyxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNuQixN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LENBQUMsQ0FBQztJQUVGLHdFQUF3RTtJQUN4RSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxRQUF3QjtJQUMxRCxNQUFNLE1BQU0sR0FBRyxJQUFJLDJCQUFpQixFQUFFLENBQUM7SUFDdkMsSUFBQSx5Q0FBZ0IsRUFBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkMsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDM0IsQ0FBQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLEtBQTZCO0lBQ25FLE1BQU0sTUFBTSxHQUFHLElBQUksMkJBQWlCLEVBQUUsQ0FBQztJQUN2QyxJQUFBLDZDQUFvQixFQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUeXBlZE1hcHBpbmcgfSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCB7XG4gIGZvcm1hdEFtYmlndW91c01hcHBpbmdzIGFzIGZtdEFtYmlndW91c01hcHBpbmdzLFxuICBmb3JtYXRUeXBlZE1hcHBpbmdzIGFzIGZtdFR5cGVkTWFwcGluZ3MsXG59IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHR5cGUgeyBTdGFja1N1bW1hcnkgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgZGVzZXJpYWxpemVTdHJ1Y3R1cmUgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgU2RrUHJvdmlkZXIgfSBmcm9tICcuLi9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB7IE1vZGUgfSBmcm9tICcuLi9wbHVnaW4nO1xuaW1wb3J0IHsgU3RyaW5nV3JpdGVTdHJlYW0gfSBmcm9tICcuLi9zdHJlYW1zJztcbmltcG9ydCB0eXBlIHsgQ2xvdWRGb3JtYXRpb25TdGFjayB9IGZyb20gJy4vY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgUmVzb3VyY2VMb2NhdGlvbiwgUmVzb3VyY2VNYXBwaW5nIH0gZnJvbSAnLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBjb21wdXRlUmVzb3VyY2VEaWdlc3RzLCBoYXNoT2JqZWN0IH0gZnJvbSAnLi9kaWdlc3QnO1xuaW1wb3J0IHsgdHlwZSBFeGNsdWRlTGlzdCwgTmV2ZXJFeGNsdWRlIH0gZnJvbSAnLi9leGNsdWRlJztcbmltcG9ydCB0eXBlIHsgTWFwcGluZ0dyb3VwIH0gZnJvbSAnLi4vLi4vYWN0aW9ucyc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuXG5leHBvcnQgKiBmcm9tICcuL2V4Y2x1ZGUnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzZXQgb2YgcG9zc2libGUgbW92ZW1lbnRzIG9mIGEgcmVzb3VyY2UgZnJvbSBvbmUgbG9jYXRpb25cbiAqIHRvIGFub3RoZXIuIEluIHRoZSBpZGVhbCBjYXNlLCB0aGVyZSBpcyBvbmx5IG9uZSBzb3VyY2UgYW5kIG9ubHkgb25lXG4gKiBkZXN0aW5hdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VNb3ZlbWVudCA9IFtSZXNvdXJjZUxvY2F0aW9uW10sIFJlc291cmNlTG9jYXRpb25bXV07XG5cbmV4cG9ydCBjbGFzcyBBbWJpZ3VpdHlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG1vdmVtZW50czogUmVzb3VyY2VNb3ZlbWVudFtdKSB7XG4gICAgc3VwZXIoJ0FtYmlndW91cyByZXNvdXJjZSBtYXBwaW5ncycpO1xuICB9XG5cbiAgcHVibGljIHBhdGhzKCk6IFtzdHJpbmdbXSwgc3RyaW5nW11dW10ge1xuICAgIHJldHVybiB0aGlzLm1vdmVtZW50cy5tYXAoKFthLCBiXSkgPT4gW2NvbnZlcnQoYSksIGNvbnZlcnQoYildKTtcblxuICAgIGZ1bmN0aW9uIGNvbnZlcnQobG9jYXRpb25zOiBSZXNvdXJjZUxvY2F0aW9uW10pOiBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gbG9jYXRpb25zLm1hcCgobCkgPT4gbC50b1BhdGgoKSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdyb3VwQnlLZXk8QT4oZW50cmllczogW3N0cmluZywgQV1bXSk6IFJlY29yZDxzdHJpbmcsIEFbXT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEFbXT4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtoYXNoLCBsb2NhdGlvbl0gb2YgZW50cmllcykge1xuICAgIGlmIChoYXNoIGluIHJlc3VsdCkge1xuICAgICAgcmVzdWx0W2hhc2hdLnB1c2gobG9jYXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRbaGFzaF0gPSBbbG9jYXRpb25dO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1c2VQcmVzY3JpYmVkTWFwcGluZ3MoXG4gIG1hcHBpbmdHcm91cHM6IE1hcHBpbmdHcm91cFtdLFxuICBzZGtQcm92aWRlcjogU2RrUHJvdmlkZXIsXG4pOiBQcm9taXNlPFJlc291cmNlTWFwcGluZ1tdPiB7XG4gIGludGVyZmFjZSBTdGFja0dyb3VwIGV4dGVuZHMgTWFwcGluZ0dyb3VwIHtcbiAgICBzdGFja3M6IENsb3VkRm9ybWF0aW9uU3RhY2tbXTtcbiAgfVxuXG4gIGNvbnN0IHN0YWNrR3JvdXBzOiBTdGFja0dyb3VwW10gPSBbXTtcbiAgZm9yIChjb25zdCBncm91cCBvZiBtYXBwaW5nR3JvdXBzKSB7XG4gICAgc3RhY2tHcm91cHMucHVzaCh7XG4gICAgICAuLi5ncm91cCxcbiAgICAgIHN0YWNrczogYXdhaXQgZ2V0RGVwbG95ZWRTdGFja3Moc2RrUHJvdmlkZXIsIGVudmlyb25tZW50T2YoZ3JvdXApKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSBkZXN0aW5hdGlvbnNcbiAgZm9yIChsZXQgZ3JvdXAgb2Ygc3RhY2tHcm91cHMpIHtcbiAgICBjb25zdCBkZXN0aW5hdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgZGVzdGluYXRpb24gb2YgT2JqZWN0LnZhbHVlcyhncm91cC5yZXNvdXJjZXMpKSB7XG4gICAgICBpZiAoZGVzdGluYXRpb25zLmhhcyhkZXN0aW5hdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgICBgRHVwbGljYXRlIGRlc3RpbmF0aW9uIHJlc291cmNlICcke2Rlc3RpbmF0aW9ufScgaW4gZW52aXJvbm1lbnQgJHtncm91cC5hY2NvdW50fS8ke2dyb3VwLnJlZ2lvbn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZGVzdGluYXRpb25zLmFkZChkZXN0aW5hdGlvbik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBSZXNvdXJjZU1hcHBpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGdyb3VwIG9mIHN0YWNrR3JvdXBzKSB7XG4gICAgZm9yIChjb25zdCBbc291cmNlLCBkZXN0aW5hdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoZ3JvdXAucmVzb3VyY2VzKSkge1xuICAgICAgaWYgKCFpblVzZShzb3VyY2UsIGdyb3VwLnN0YWNrcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgU291cmNlIHJlc291cmNlICcke3NvdXJjZX0nIGRvZXMgbm90IGV4aXN0IGluIGVudmlyb25tZW50ICR7Z3JvdXAuYWNjb3VudH0vJHtncm91cC5yZWdpb259YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpblVzZShkZXN0aW5hdGlvbiwgZ3JvdXAuc3RhY2tzKSkge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgICAgIGBEZXN0aW5hdGlvbiByZXNvdXJjZSAnJHtkZXN0aW5hdGlvbn0nIGFscmVhZHkgaW4gdXNlIGluIGVudmlyb25tZW50ICR7Z3JvdXAuYWNjb3VudH0vJHtncm91cC5yZWdpb259YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudE9mKGdyb3VwKTtcbiAgICAgIGNvbnN0IHNyYyA9IG1ha2VMb2NhdGlvbihzb3VyY2UsIGVudmlyb25tZW50LCBncm91cC5zdGFja3MpO1xuICAgICAgY29uc3QgZHN0ID0gbWFrZUxvY2F0aW9uKGRlc3RpbmF0aW9uLCBlbnZpcm9ubWVudCk7XG4gICAgICByZXN1bHQucHVzaChuZXcgUmVzb3VyY2VNYXBwaW5nKHNyYywgZHN0KSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG5cbiAgZnVuY3Rpb24gaW5Vc2UobG9jYXRpb246IHN0cmluZywgc3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBbc3RhY2tOYW1lLCBsb2dpY2FsSWRdID0gbG9jYXRpb24uc3BsaXQoJy4nKTtcbiAgICBpZiAoc3RhY2tOYW1lID09IG51bGwgfHwgbG9naWNhbElkID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYEludmFsaWQgbG9jYXRpb24gJyR7bG9jYXRpb259J2ApO1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IHN0YWNrcy5maW5kKChzKSA9PiBzLnN0YWNrTmFtZSA9PT0gc3RhY2tOYW1lKTtcbiAgICByZXR1cm4gc3RhY2sgIT0gbnVsbCAmJiBzdGFjay50ZW1wbGF0ZS5SZXNvdXJjZXM/Lltsb2dpY2FsSWRdICE9IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBlbnZpcm9ubWVudE9mKGdyb3VwOiBNYXBwaW5nR3JvdXApIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudDogZ3JvdXAuYWNjb3VudCxcbiAgICAgIHJlZ2lvbjogZ3JvdXAucmVnaW9uLFxuICAgICAgbmFtZTogJycsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VMb2NhdGlvbihcbiAgICBsb2M6IHN0cmluZyxcbiAgICBlbnZpcm9ubWVudDogY3hhcGkuRW52aXJvbm1lbnQsXG4gICAgc3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW10gPSBbXSxcbiAgKTogUmVzb3VyY2VMb2NhdGlvbiB7XG4gICAgY29uc3QgW3N0YWNrTmFtZSwgbG9naWNhbElkXSA9IGxvYy5zcGxpdCgnLicpO1xuICAgIGNvbnN0IHN0YWNrID0gc3RhY2tzLmZpbmQoKHMpID0+IHMuc3RhY2tOYW1lID09PSBzdGFja05hbWUpO1xuXG4gICAgcmV0dXJuIG5ldyBSZXNvdXJjZUxvY2F0aW9uKFxuICAgICAge1xuICAgICAgICBzdGFja05hbWUsXG4gICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICB0ZW1wbGF0ZTogc3RhY2s/LnRlbXBsYXRlID8/IHt9LFxuICAgICAgfSxcbiAgICAgIGxvZ2ljYWxJZCxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvdXJjZU1vdmVtZW50cyhiZWZvcmU6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSwgYWZ0ZXI6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSk6IFJlc291cmNlTW92ZW1lbnRbXSB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKFxuICAgIHJlbW92ZVVubW92ZWRSZXNvdXJjZXMoXG4gICAgICB6aXAoZ3JvdXBCeUtleShiZWZvcmUuZmxhdE1hcChyZXNvdXJjZURpZ2VzdHMpKSwgZ3JvdXBCeUtleShhZnRlci5mbGF0TWFwKHJlc291cmNlRGlnZXN0cykpKSxcbiAgICApLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYW1iaWd1b3VzTW92ZW1lbnRzKG1vdmVtZW50czogUmVzb3VyY2VNb3ZlbWVudFtdKSB7XG4gIC8vIEEgbW92ZW1lbnQgaXMgY29uc2lkZXJlZCBhbWJpZ3VvdXMgaWYgdGhlc2UgdHdvIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAgLy8gIDEuIEJvdGggc2lkZXMgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudCAob3RoZXJ3aXNlLCBpdCdzIGp1c3QgYWRkaXRpb24gb3IgZGVsZXRpb24pXG4gIC8vICAyLiBBdCBsZWFzdCBvbmUgc2lkZSBoYXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50XG4gIHJldHVybiBtb3ZlbWVudHNcbiAgICAuZmlsdGVyKChbcHJlLCBwb3N0XSkgPT4gcHJlLmxlbmd0aCA+IDAgJiYgcG9zdC5sZW5ndGggPiAwKVxuICAgIC5maWx0ZXIoKFtwcmUsIHBvc3RdKSA9PiBwcmUubGVuZ3RoID4gMSB8fCBwb3N0Lmxlbmd0aCA+IDEpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbGlzdCBvZiB1bmFtYmlndW91cyByZXNvdXJjZSBtb3ZlbWVudHMgaW50byBhIGxpc3Qgb2YgcmVzb3VyY2UgbWFwcGluZ3MuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb3VyY2VNYXBwaW5ncyhtb3ZlbWVudHM6IFJlc291cmNlTW92ZW1lbnRbXSwgc3RhY2tzPzogQ2xvdWRGb3JtYXRpb25TdGFja1tdKTogUmVzb3VyY2VNYXBwaW5nW10ge1xuICBjb25zdCBzdGFja3NQcmVkaWNhdGUgPVxuICAgIHN0YWNrcyA9PSBudWxsXG4gICAgICA/ICgpID0+IHRydWVcbiAgICAgIDogKG06IFJlc291cmNlTWFwcGluZykgPT4ge1xuICAgICAgICAvLyBBbnkgbW92ZW1lbnQgdGhhdCBpbnZvbHZlcyBvbmUgb2YgdGhlIHNlbGVjdGVkIHN0YWNrcyAoZWl0aGVyIG1vdmluZyBmcm9tIG9yIHRvKVxuICAgICAgICAvLyBpcyBjb25zaWRlcmVkIGEgY2FuZGlkYXRlIGZvciByZWZhY3RvcmluZy5cbiAgICAgICAgY29uc3Qgc3RhY2tOYW1lcyA9IFttLnNvdXJjZS5zdGFjay5zdGFja05hbWUsIG0uZGVzdGluYXRpb24uc3RhY2suc3RhY2tOYW1lXTtcbiAgICAgICAgcmV0dXJuIHN0YWNrcy5zb21lKChzdGFjaykgPT4gc3RhY2tOYW1lcy5pbmNsdWRlcyhzdGFjay5zdGFja05hbWUpKTtcbiAgICAgIH07XG5cbiAgcmV0dXJuIG1vdmVtZW50c1xuICAgIC5maWx0ZXIoKFtwcmUsIHBvc3RdKSA9PiBwcmUubGVuZ3RoID09PSAxICYmIHBvc3QubGVuZ3RoID09PSAxICYmICFwcmVbMF0uZXF1YWxUbyhwb3N0WzBdKSlcbiAgICAubWFwKChbcHJlLCBwb3N0XSkgPT4gbmV3IFJlc291cmNlTWFwcGluZyhwcmVbMF0sIHBvc3RbMF0pKVxuICAgIC5maWx0ZXIoc3RhY2tzUHJlZGljYXRlKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW5tb3ZlZFJlc291cmNlcyhtOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU1vdmVtZW50Pik6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTW92ZW1lbnQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU1vdmVtZW50PiA9IHt9O1xuICBmb3IgKGNvbnN0IFtoYXNoLCBbYmVmb3JlLCBhZnRlcl1dIG9mIE9iamVjdC5lbnRyaWVzKG0pKSB7XG4gICAgY29uc3QgY29tbW9uID0gYmVmb3JlLmZpbHRlcigoYikgPT4gYWZ0ZXIuc29tZSgoYSkgPT4gYS5lcXVhbFRvKGIpKSk7XG4gICAgcmVzdWx0W2hhc2hdID0gW1xuICAgICAgYmVmb3JlLmZpbHRlcigoYikgPT4gIWNvbW1vbi5zb21lKChjKSA9PiBiLmVxdWFsVG8oYykpKSxcbiAgICAgIGFmdGVyLmZpbHRlcigoYSkgPT4gIWNvbW1vbi5zb21lKChjKSA9PiBhLmVxdWFsVG8oYykpKSxcbiAgICBdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBGb3IgZWFjaCBoYXNoLCBpZGVudGlmeWluZyBhIHNpbmdsZSByZXNvdXJjZSwgemlwIHRoZSB0d28gbGlzdHMgb2YgbG9jYXRpb25zLFxuICogcHJvZHVjaW5nIGEgcmVzb3VyY2UgbW92ZW1lbnRcbiAqL1xuZnVuY3Rpb24gemlwKFxuICBtMTogUmVjb3JkPHN0cmluZywgUmVzb3VyY2VMb2NhdGlvbltdPixcbiAgbTI6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTG9jYXRpb25bXT4sXG4pOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU1vdmVtZW50PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgUmVzb3VyY2VNb3ZlbWVudD4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtoYXNoLCBsb2NhdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKG0xKSkge1xuICAgIGlmIChoYXNoIGluIG0yKSB7XG4gICAgICByZXN1bHRbaGFzaF0gPSBbbG9jYXRpb25zLCBtMltoYXNoXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtoYXNoXSA9IFtsb2NhdGlvbnMsIFtdXTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtoYXNoLCBsb2NhdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKG0yKSkge1xuICAgIGlmICghKGhhc2ggaW4gbTEpKSB7XG4gICAgICByZXN1bHRbaGFzaF0gPSBbW10sIGxvY2F0aW9uc107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBhIGxpc3Qgb2YgcGFpcnMgW2RpZ2VzdCwgbG9jYXRpb25dIGZvciBlYWNoIHJlc291cmNlIGluIHRoZSBzdGFjay5cbiAqL1xuZnVuY3Rpb24gcmVzb3VyY2VEaWdlc3RzKHN0YWNrOiBDbG91ZEZvcm1hdGlvblN0YWNrKTogW3N0cmluZywgUmVzb3VyY2VMb2NhdGlvbl1bXSB7XG4gIGNvbnN0IGRpZ2VzdHMgPSBjb21wdXRlUmVzb3VyY2VEaWdlc3RzKHN0YWNrLnRlbXBsYXRlKTtcblxuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZGlnZXN0cykubWFwKChbbG9naWNhbElkLCBkaWdlc3RdKSA9PiB7XG4gICAgY29uc3QgbG9jYXRpb246IFJlc291cmNlTG9jYXRpb24gPSBuZXcgUmVzb3VyY2VMb2NhdGlvbihzdGFjaywgbG9naWNhbElkKTtcbiAgICByZXR1cm4gW2RpZ2VzdCwgbG9jYXRpb25dO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0aGUgZGVwbG95ZWQgc3RhdGUgdG8gdGhlIGNsb3VkIGFzc2VtYmx5IHN0YXRlLCBhbmQgZmluZHMgYWxsIHJlc291cmNlc1xuICogdGhhdCB3ZXJlIG1vdmVkIGZyb20gb25lIGxvY2F0aW9uIChzdGFjayArIGxvZ2ljYWwgSUQpIHRvIGFub3RoZXIuIFRoZSBjb21wYXJpc29uXG4gKiBpcyBkb25lIHBlciBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRSZXNvdXJjZU1vdmVtZW50cyhcbiAgc3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW10sXG4gIHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcixcbiAgZXhjbHVkZTogRXhjbHVkZUxpc3QgPSBuZXcgTmV2ZXJFeGNsdWRlKCksXG4pOiBQcm9taXNlPFJlc291cmNlTW92ZW1lbnRbXT4ge1xuICBjb25zdCBzdGFja0dyb3VwczogTWFwPHN0cmluZywgW0Nsb3VkRm9ybWF0aW9uU3RhY2tbXSwgQ2xvdWRGb3JtYXRpb25TdGFja1tdXT4gPSBuZXcgTWFwKCk7XG5cbiAgLy8gR3JvdXAgc3RhY2tzIGJ5IGVudmlyb25tZW50XG4gIGZvciAoY29uc3Qgc3RhY2sgb2Ygc3RhY2tzKSB7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBzdGFjay5lbnZpcm9ubWVudDtcbiAgICBjb25zdCBrZXkgPSBoYXNoT2JqZWN0KGVudmlyb25tZW50KTtcbiAgICBpZiAoc3RhY2tHcm91cHMuaGFzKGtleSkpIHtcbiAgICAgIHN0YWNrR3JvdXBzLmdldChrZXkpIVsxXS5wdXNoKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgd2Ugc2VlIGFuIGVudmlyb25tZW50LCB3ZSBuZWVkIHRvIGZldGNoIGFsbCBzdGFja3MgZGVwbG95ZWQgdG8gaXQuXG4gICAgICBjb25zdCBiZWZvcmUgPSBhd2FpdCBnZXREZXBsb3llZFN0YWNrcyhzZGtQcm92aWRlciwgZW52aXJvbm1lbnQpO1xuICAgICAgc3RhY2tHcm91cHMuc2V0KGtleSwgW2JlZm9yZSwgW3N0YWNrXV0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogUmVzb3VyY2VNb3ZlbWVudFtdID0gW107XG4gIGZvciAoY29uc3QgW18sIFtiZWZvcmUsIGFmdGVyXV0gb2Ygc3RhY2tHcm91cHMpIHtcbiAgICByZXN1bHQucHVzaCguLi5yZXNvdXJjZU1vdmVtZW50cyhiZWZvcmUsIGFmdGVyKSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0LmZpbHRlcigobW92KSA9PiB7XG4gICAgY29uc3QgYWZ0ZXIgPSBtb3ZbMV07XG4gICAgcmV0dXJuIGFmdGVyLmV2ZXJ5KChsKSA9PiAhZXhjbHVkZS5pc0V4Y2x1ZGVkKGwpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldERlcGxveWVkU3RhY2tzKFxuICBzZGtQcm92aWRlcjogU2RrUHJvdmlkZXIsXG4gIGVudmlyb25tZW50OiBjeGFwaS5FbnZpcm9ubWVudCxcbik6IFByb21pc2U8Q2xvdWRGb3JtYXRpb25TdGFja1tdPiB7XG4gIGNvbnN0IGNmbiA9IChhd2FpdCBzZGtQcm92aWRlci5mb3JFbnZpcm9ubWVudChlbnZpcm9ubWVudCwgTW9kZS5Gb3JSZWFkaW5nKSkuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG5cbiAgY29uc3Qgc3VtbWFyaWVzID0gYXdhaXQgY2ZuLnBhZ2luYXRlZExpc3RTdGFja3Moe1xuICAgIFN0YWNrU3RhdHVzRmlsdGVyOiBbXG4gICAgICAnQ1JFQVRFX0NPTVBMRVRFJyxcbiAgICAgICdVUERBVEVfQ09NUExFVEUnLFxuICAgICAgJ1VQREFURV9ST0xMQkFDS19DT01QTEVURScsXG4gICAgICAnSU1QT1JUX0NPTVBMRVRFJyxcbiAgICAgICdST0xMQkFDS19DT01QTEVURScsXG4gICAgXSxcbiAgfSk7XG5cbiAgY29uc3Qgbm9ybWFsaXplID0gYXN5bmMgKHN1bW1hcnk6IFN0YWNrU3VtbWFyeSkgPT4ge1xuICAgIGNvbnN0IHRlbXBsYXRlQ29tbWFuZE91dHB1dCA9IGF3YWl0IGNmbi5nZXRUZW1wbGF0ZSh7IFN0YWNrTmFtZTogc3VtbWFyeS5TdGFja05hbWUhIH0pO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gZGVzZXJpYWxpemVTdHJ1Y3R1cmUodGVtcGxhdGVDb21tYW5kT3V0cHV0LlRlbXBsYXRlQm9keSA/PyAne30nKTtcbiAgICByZXR1cm4ge1xuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBzdGFja05hbWU6IHN1bW1hcnkuU3RhY2tOYW1lISxcbiAgICAgIHRlbXBsYXRlLFxuICAgIH07XG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gIHJldHVybiBQcm9taXNlLmFsbChzdW1tYXJpZXMubWFwKG5vcm1hbGl6ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VHlwZWRNYXBwaW5ncyhtYXBwaW5nczogVHlwZWRNYXBwaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyaW5nV3JpdGVTdHJlYW0oKTtcbiAgZm10VHlwZWRNYXBwaW5ncyhzdHJlYW0sIG1hcHBpbmdzKTtcbiAgcmV0dXJuIHN0cmVhbS50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QW1iaWd1b3VzTWFwcGluZ3MocGF0aHM6IFtzdHJpbmdbXSwgc3RyaW5nW11dW10pOiBzdHJpbmcge1xuICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyaW5nV3JpdGVTdHJlYW0oKTtcbiAgZm10QW1iaWd1b3VzTWFwcGluZ3Moc3RyZWFtLCBwYXRocyk7XG4gIHJldHVybiBzdHJlYW0udG9TdHJpbmcoKTtcbn1cbiJdfQ==
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQXVEQSxzREFxRkM7QUFFRCw4Q0FNQztBQUVELGdEQU9DO0FBTUQsNENBZUM7QUFrRUQsc0RBNkJDO0FBZ0NELGtEQUlDO0FBRUQsMERBSUM7QUExVEQsc0VBR3NDO0FBR3RDLHFDQUFrRDtBQUVsRCxzQ0FBaUM7QUFDakMsd0NBQStDO0FBRS9DLHFEQUFxRTtBQUNyRSxxQ0FBOEQ7QUFDOUQsdUNBQTJEO0FBRTNELCtEQUEyRDtBQUUzRCw0Q0FBMEI7QUFTMUIsTUFBYSxjQUFlLFNBQVEsS0FBSztJQUNYO0lBQTVCLFlBQTRCLFNBQTZCO1FBQ3ZELEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBRFgsY0FBUyxHQUFULFNBQVMsQ0FBb0I7SUFFekQsQ0FBQztJQUVNLEtBQUs7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEUsU0FBUyxPQUFPLENBQUMsU0FBNkI7WUFDNUMsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBWkQsd0NBWUM7QUFFRCxTQUFTLFVBQVUsQ0FBSSxPQUFzQjtJQUMzQyxNQUFNLE1BQU0sR0FBd0IsRUFBRSxDQUFDO0lBRXZDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN2QyxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNuQixN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TUFBTSxxQkFBcUIsR0FBRyxNQUFNLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVUsRUFBRSxDQUFDLENBQUM7UUFDdkYsTUFBTSxRQUFRLEdBQUcsSUFBQSwyQkFBb0IsRUFBQyxxQkFBcUIsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLENBQUM7UUFDbEYsT0FBTztZQUNMLFdBQVc7WUFDWCxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVU7WUFDN0IsUUFBUTtTQUNULENBQUM7SUFDSixDQUFDLENBQUM7SUFFRix3RUFBd0U7SUFDeEUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUMsUUFBd0I7SUFDMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSwyQkFBaUIsRUFBRSxDQUFDO0lBQ3ZDLElBQUEseUNBQWdCLEVBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFnQix1QkFBdUIsQ0FBQyxLQUE2QjtJQUNuRSxNQUFNLE1BQU0sR0FBRyxJQUFJLDJCQUFpQixFQUFFLENBQUM7SUFDdkMsSUFBQSw2Q0FBb0IsRUFBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVHlwZWRNYXBwaW5nIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQge1xuICBmb3JtYXRBbWJpZ3VvdXNNYXBwaW5ncyBhcyBmbXRBbWJpZ3VvdXNNYXBwaW5ncyxcbiAgZm9ybWF0VHlwZWRNYXBwaW5ncyBhcyBmbXRUeXBlZE1hcHBpbmdzLFxufSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCB0eXBlICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB0eXBlIHsgU3RhY2tTdW1tYXJ5IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IGRlc2VyaWFsaXplU3RydWN0dXJlIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgdHlwZSB7IFNka1Byb3ZpZGVyIH0gZnJvbSAnLi4vYXdzLWF1dGgvcHJpdmF0ZSc7XG5pbXBvcnQgeyBNb2RlIH0gZnJvbSAnLi4vcGx1Z2luJztcbmltcG9ydCB7IFN0cmluZ1dyaXRlU3RyZWFtIH0gZnJvbSAnLi4vc3RyZWFtcyc7XG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uU3RhY2sgfSBmcm9tICcuL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IFJlc291cmNlTG9jYXRpb24sIFJlc291cmNlTWFwcGluZyB9IGZyb20gJy4vY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgY29tcHV0ZVJlc291cmNlRGlnZXN0cywgaGFzaE9iamVjdCB9IGZyb20gJy4vZGlnZXN0JztcbmltcG9ydCB7IHR5cGUgRXhjbHVkZUxpc3QsIE5ldmVyRXhjbHVkZSB9IGZyb20gJy4vZXhjbHVkZSc7XG5pbXBvcnQgdHlwZSB7IE1hcHBpbmdHcm91cCB9IGZyb20gJy4uLy4uL2FjdGlvbnMnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC90b29sa2l0LWVycm9yJztcblxuZXhwb3J0ICogZnJvbSAnLi9leGNsdWRlJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2V0IG9mIHBvc3NpYmxlIG1vdmVtZW50cyBvZiBhIHJlc291cmNlIGZyb20gb25lIGxvY2F0aW9uXG4gKiB0byBhbm90aGVyLiBJbiB0aGUgaWRlYWwgY2FzZSwgdGhlcmUgaXMgb25seSBvbmUgc291cmNlIGFuZCBvbmx5IG9uZVxuICogZGVzdGluYXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFJlc291cmNlTW92ZW1lbnQgPSBbUmVzb3VyY2VMb2NhdGlvbltdLCBSZXNvdXJjZUxvY2F0aW9uW11dO1xuXG5leHBvcnQgY2xhc3MgQW1iaWd1aXR5RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBtb3ZlbWVudHM6IFJlc291cmNlTW92ZW1lbnRbXSkge1xuICAgIHN1cGVyKCdBbWJpZ3VvdXMgcmVzb3VyY2UgbWFwcGluZ3MnKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXRocygpOiBbc3RyaW5nW10sIHN0cmluZ1tdXVtdIHtcbiAgICByZXR1cm4gdGhpcy5tb3ZlbWVudHMubWFwKChbYSwgYl0pID0+IFtjb252ZXJ0KGEpLCBjb252ZXJ0KGIpXSk7XG5cbiAgICBmdW5jdGlvbiBjb252ZXJ0KGxvY2F0aW9uczogUmVzb3VyY2VMb2NhdGlvbltdKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIGxvY2F0aW9ucy5tYXAoKGwpID0+IGwudG9QYXRoKCkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBncm91cEJ5S2V5PEE+KGVudHJpZXM6IFtzdHJpbmcsIEFdW10pOiBSZWNvcmQ8c3RyaW5nLCBBW10+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBBW10+ID0ge307XG5cbiAgZm9yIChjb25zdCBbaGFzaCwgbG9jYXRpb25dIG9mIGVudHJpZXMpIHtcbiAgICBpZiAoaGFzaCBpbiByZXN1bHQpIHtcbiAgICAgIHJlc3VsdFtoYXNoXS5wdXNoKGxvY2F0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2hhc2hdID0gW2xvY2F0aW9uXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXNlUHJlc2NyaWJlZE1hcHBpbmdzKFxuICBtYXBwaW5nR3JvdXBzOiBNYXBwaW5nR3JvdXBbXSxcbiAgc2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyLFxuKTogUHJvbWlzZTxSZXNvdXJjZU1hcHBpbmdbXT4ge1xuICBpbnRlcmZhY2UgU3RhY2tHcm91cCBleHRlbmRzIE1hcHBpbmdHcm91cCB7XG4gICAgc3RhY2tzOiBDbG91ZEZvcm1hdGlvblN0YWNrW107XG4gIH1cblxuICBjb25zdCBzdGFja0dyb3VwczogU3RhY2tHcm91cFtdID0gW107XG4gIGZvciAoY29uc3QgZ3JvdXAgb2YgbWFwcGluZ0dyb3Vwcykge1xuICAgIHN0YWNrR3JvdXBzLnB1c2goe1xuICAgICAgLi4uZ3JvdXAsXG4gICAgICBzdGFja3M6IGF3YWl0IGdldERlcGxveWVkU3RhY2tzKHNka1Byb3ZpZGVyLCBlbnZpcm9ubWVudE9mKGdyb3VwKSksXG4gICAgfSk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB0aGF0IHRoZXJlIGFyZSBubyBkdXBsaWNhdGUgZGVzdGluYXRpb25zXG4gIGZvciAobGV0IGdyb3VwIG9mIHN0YWNrR3JvdXBzKSB7XG4gICAgY29uc3QgZGVzdGluYXRpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGRlc3RpbmF0aW9uIG9mIE9iamVjdC52YWx1ZXMoZ3JvdXAucmVzb3VyY2VzKSkge1xuICAgICAgaWYgKGRlc3RpbmF0aW9ucy5oYXMoZGVzdGluYXRpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICAgYER1cGxpY2F0ZSBkZXN0aW5hdGlvbiByZXNvdXJjZSAnJHtkZXN0aW5hdGlvbn0nIGluIGVudmlyb25tZW50ICR7Z3JvdXAuYWNjb3VudH0vJHtncm91cC5yZWdpb259YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRlc3RpbmF0aW9ucy5hZGQoZGVzdGluYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogUmVzb3VyY2VNYXBwaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBncm91cCBvZiBzdGFja0dyb3Vwcykge1xuICAgIGZvciAoY29uc3QgW3NvdXJjZSwgZGVzdGluYXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwLnJlc291cmNlcykpIHtcbiAgICAgIGlmICghaW5Vc2Uoc291cmNlLCBncm91cC5zdGFja3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYFNvdXJjZSByZXNvdXJjZSAnJHtzb3VyY2V9JyBkb2VzIG5vdCBleGlzdCBpbiBlbnZpcm9ubWVudCAke2dyb3VwLmFjY291bnR9LyR7Z3JvdXAucmVnaW9ufWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5Vc2UoZGVzdGluYXRpb24sIGdyb3VwLnN0YWNrcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgICBgRGVzdGluYXRpb24gcmVzb3VyY2UgJyR7ZGVzdGluYXRpb259JyBhbHJlYWR5IGluIHVzZSBpbiBlbnZpcm9ubWVudCAke2dyb3VwLmFjY291bnR9LyR7Z3JvdXAucmVnaW9ufWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVudmlyb25tZW50ID0gZW52aXJvbm1lbnRPZihncm91cCk7XG4gICAgICBjb25zdCBzcmMgPSBtYWtlTG9jYXRpb24oc291cmNlLCBlbnZpcm9ubWVudCwgZ3JvdXAuc3RhY2tzKTtcbiAgICAgIGNvbnN0IGRzdCA9IG1ha2VMb2NhdGlvbihkZXN0aW5hdGlvbiwgZW52aXJvbm1lbnQpO1xuICAgICAgcmVzdWx0LnB1c2gobmV3IFJlc291cmNlTWFwcGluZyhzcmMsIGRzdCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xuXG4gIGZ1bmN0aW9uIGluVXNlKGxvY2F0aW9uOiBzdHJpbmcsIHN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgW3N0YWNrTmFtZSwgbG9naWNhbElkXSA9IGxvY2F0aW9uLnNwbGl0KCcuJyk7XG4gICAgaWYgKHN0YWNrTmFtZSA9PSBudWxsIHx8IGxvZ2ljYWxJZCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBJbnZhbGlkIGxvY2F0aW9uICcke2xvY2F0aW9ufSdgKTtcbiAgICB9XG4gICAgY29uc3Qgc3RhY2sgPSBzdGFja3MuZmluZCgocykgPT4gcy5zdGFja05hbWUgPT09IHN0YWNrTmFtZSk7XG4gICAgcmV0dXJuIHN0YWNrICE9IG51bGwgJiYgc3RhY2sudGVtcGxhdGUuUmVzb3VyY2VzPy5bbG9naWNhbElkXSAhPSBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gZW52aXJvbm1lbnRPZihncm91cDogTWFwcGluZ0dyb3VwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY291bnQ6IGdyb3VwLmFjY291bnQsXG4gICAgICByZWdpb246IGdyb3VwLnJlZ2lvbixcbiAgICAgIG5hbWU6ICcnLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBtYWtlTG9jYXRpb24oXG4gICAgbG9jOiBzdHJpbmcsXG4gICAgZW52aXJvbm1lbnQ6IGN4YXBpLkVudmlyb25tZW50LFxuICAgIHN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdID0gW10sXG4gICk6IFJlc291cmNlTG9jYXRpb24ge1xuICAgIGNvbnN0IFtzdGFja05hbWUsIGxvZ2ljYWxJZF0gPSBsb2Muc3BsaXQoJy4nKTtcbiAgICBjb25zdCBzdGFjayA9IHN0YWNrcy5maW5kKChzKSA9PiBzLnN0YWNrTmFtZSA9PT0gc3RhY2tOYW1lKTtcblxuICAgIHJldHVybiBuZXcgUmVzb3VyY2VMb2NhdGlvbihcbiAgICAgIHtcbiAgICAgICAgc3RhY2tOYW1lLFxuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgdGVtcGxhdGU6IHN0YWNrPy50ZW1wbGF0ZSA/PyB7fSxcbiAgICAgIH0sXG4gICAgICBsb2dpY2FsSWQsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb3VyY2VNb3ZlbWVudHMoYmVmb3JlOiBDbG91ZEZvcm1hdGlvblN0YWNrW10sIGFmdGVyOiBDbG91ZEZvcm1hdGlvblN0YWNrW10pOiBSZXNvdXJjZU1vdmVtZW50W10ge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhcbiAgICByZW1vdmVVbm1vdmVkUmVzb3VyY2VzKFxuICAgICAgemlwKGdyb3VwQnlLZXkocmVzb3VyY2VEaWdlc3RzKGJlZm9yZSkpLCBncm91cEJ5S2V5KHJlc291cmNlRGlnZXN0cyhhZnRlcikpKSxcbiAgICApLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYW1iaWd1b3VzTW92ZW1lbnRzKG1vdmVtZW50czogUmVzb3VyY2VNb3ZlbWVudFtdKSB7XG4gIC8vIEEgbW92ZW1lbnQgaXMgY29uc2lkZXJlZCBhbWJpZ3VvdXMgaWYgdGhlc2UgdHdvIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAgLy8gIDEuIEJvdGggc2lkZXMgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudCAob3RoZXJ3aXNlLCBpdCdzIGp1c3QgYWRkaXRpb24gb3IgZGVsZXRpb24pXG4gIC8vICAyLiBBdCBsZWFzdCBvbmUgc2lkZSBoYXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50XG4gIHJldHVybiBtb3ZlbWVudHNcbiAgICAuZmlsdGVyKChbcHJlLCBwb3N0XSkgPT4gcHJlLmxlbmd0aCA+IDAgJiYgcG9zdC5sZW5ndGggPiAwKVxuICAgIC5maWx0ZXIoKFtwcmUsIHBvc3RdKSA9PiBwcmUubGVuZ3RoID4gMSB8fCBwb3N0Lmxlbmd0aCA+IDEpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbGlzdCBvZiB1bmFtYmlndW91cyByZXNvdXJjZSBtb3ZlbWVudHMgaW50byBhIGxpc3Qgb2YgcmVzb3VyY2UgbWFwcGluZ3MuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb3VyY2VNYXBwaW5ncyhtb3ZlbWVudHM6IFJlc291cmNlTW92ZW1lbnRbXSwgc3RhY2tzPzogQ2xvdWRGb3JtYXRpb25TdGFja1tdKTogUmVzb3VyY2VNYXBwaW5nW10ge1xuICBjb25zdCBzdGFja3NQcmVkaWNhdGUgPVxuICAgIHN0YWNrcyA9PSBudWxsXG4gICAgICA/ICgpID0+IHRydWVcbiAgICAgIDogKG06IFJlc291cmNlTWFwcGluZykgPT4ge1xuICAgICAgICAvLyBBbnkgbW92ZW1lbnQgdGhhdCBpbnZvbHZlcyBvbmUgb2YgdGhlIHNlbGVjdGVkIHN0YWNrcyAoZWl0aGVyIG1vdmluZyBmcm9tIG9yIHRvKVxuICAgICAgICAvLyBpcyBjb25zaWRlcmVkIGEgY2FuZGlkYXRlIGZvciByZWZhY3RvcmluZy5cbiAgICAgICAgY29uc3Qgc3RhY2tOYW1lcyA9IFttLnNvdXJjZS5zdGFjay5zdGFja05hbWUsIG0uZGVzdGluYXRpb24uc3RhY2suc3RhY2tOYW1lXTtcbiAgICAgICAgcmV0dXJuIHN0YWNrcy5zb21lKChzdGFjaykgPT4gc3RhY2tOYW1lcy5pbmNsdWRlcyhzdGFjay5zdGFja05hbWUpKTtcbiAgICAgIH07XG5cbiAgcmV0dXJuIG1vdmVtZW50c1xuICAgIC5maWx0ZXIoKFtwcmUsIHBvc3RdKSA9PiBwcmUubGVuZ3RoID09PSAxICYmIHBvc3QubGVuZ3RoID09PSAxICYmICFwcmVbMF0uZXF1YWxUbyhwb3N0WzBdKSlcbiAgICAubWFwKChbcHJlLCBwb3N0XSkgPT4gbmV3IFJlc291cmNlTWFwcGluZyhwcmVbMF0sIHBvc3RbMF0pKVxuICAgIC5maWx0ZXIoc3RhY2tzUHJlZGljYXRlKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW5tb3ZlZFJlc291cmNlcyhtOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU1vdmVtZW50Pik6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTW92ZW1lbnQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU1vdmVtZW50PiA9IHt9O1xuICBmb3IgKGNvbnN0IFtoYXNoLCBbYmVmb3JlLCBhZnRlcl1dIG9mIE9iamVjdC5lbnRyaWVzKG0pKSB7XG4gICAgY29uc3QgY29tbW9uID0gYmVmb3JlLmZpbHRlcigoYikgPT4gYWZ0ZXIuc29tZSgoYSkgPT4gYS5lcXVhbFRvKGIpKSk7XG4gICAgcmVzdWx0W2hhc2hdID0gW1xuICAgICAgYmVmb3JlLmZpbHRlcigoYikgPT4gIWNvbW1vbi5zb21lKChjKSA9PiBiLmVxdWFsVG8oYykpKSxcbiAgICAgIGFmdGVyLmZpbHRlcigoYSkgPT4gIWNvbW1vbi5zb21lKChjKSA9PiBhLmVxdWFsVG8oYykpKSxcbiAgICBdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBGb3IgZWFjaCBoYXNoLCBpZGVudGlmeWluZyBhIHNpbmdsZSByZXNvdXJjZSwgemlwIHRoZSB0d28gbGlzdHMgb2YgbG9jYXRpb25zLFxuICogcHJvZHVjaW5nIGEgcmVzb3VyY2UgbW92ZW1lbnRcbiAqL1xuZnVuY3Rpb24gemlwKFxuICBtMTogUmVjb3JkPHN0cmluZywgUmVzb3VyY2VMb2NhdGlvbltdPixcbiAgbTI6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTG9jYXRpb25bXT4sXG4pOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU1vdmVtZW50PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgUmVzb3VyY2VNb3ZlbWVudD4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtoYXNoLCBsb2NhdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKG0xKSkge1xuICAgIGlmIChoYXNoIGluIG0yKSB7XG4gICAgICByZXN1bHRbaGFzaF0gPSBbbG9jYXRpb25zLCBtMltoYXNoXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtoYXNoXSA9IFtsb2NhdGlvbnMsIFtdXTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtoYXNoLCBsb2NhdGlvbnNdIG9mIE9iamVjdC5lbnRyaWVzKG0yKSkge1xuICAgIGlmICghKGhhc2ggaW4gbTEpKSB7XG4gICAgICByZXN1bHRbaGFzaF0gPSBbW10sIGxvY2F0aW9uc107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBhIGxpc3Qgb2YgcGFpcnMgW2RpZ2VzdCwgbG9jYXRpb25dIGZvciBlYWNoIHJlc291cmNlIGluIHRoZSBzdGFjay5cbiAqL1xuZnVuY3Rpb24gcmVzb3VyY2VEaWdlc3RzKHN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja1tdKTogW3N0cmluZywgUmVzb3VyY2VMb2NhdGlvbl1bXSB7XG4gIC8vIGluZGV4IHN0YWNrcyBieSBuYW1lXG4gIGNvbnN0IHN0YWNrc0J5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBDbG91ZEZvcm1hdGlvblN0YWNrPigpO1xuICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcykge1xuICAgIHN0YWNrc0J5TmFtZS5zZXQoc3RhY2suc3RhY2tOYW1lLCBzdGFjayk7XG4gIH1cblxuICBjb25zdCBkaWdlc3RzID0gY29tcHV0ZVJlc291cmNlRGlnZXN0cyhzdGFja3MpO1xuXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhkaWdlc3RzKS5tYXAoKFtsb2MsIGRpZ2VzdF0pID0+IHtcbiAgICBjb25zdCBbc3RhY2tOYW1lLCBsb2dpY2FsSWRdID0gbG9jLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgbG9jYXRpb246IFJlc291cmNlTG9jYXRpb24gPSBuZXcgUmVzb3VyY2VMb2NhdGlvbihzdGFja3NCeU5hbWUuZ2V0KHN0YWNrTmFtZSkhLCBsb2dpY2FsSWQpO1xuICAgIHJldHVybiBbZGlnZXN0LCBsb2NhdGlvbl07XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHRoZSBkZXBsb3llZCBzdGF0ZSB0byB0aGUgY2xvdWQgYXNzZW1ibHkgc3RhdGUsIGFuZCBmaW5kcyBhbGwgcmVzb3VyY2VzXG4gKiB0aGF0IHdlcmUgbW92ZWQgZnJvbSBvbmUgbG9jYXRpb24gKHN0YWNrICsgbG9naWNhbCBJRCkgdG8gYW5vdGhlci4gVGhlIGNvbXBhcmlzb25cbiAqIGlzIGRvbmUgcGVyIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZFJlc291cmNlTW92ZW1lbnRzKFxuICBzdGFja3M6IENsb3VkRm9ybWF0aW9uU3RhY2tbXSxcbiAgc2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyLFxuICBleGNsdWRlOiBFeGNsdWRlTGlzdCA9IG5ldyBOZXZlckV4Y2x1ZGUoKSxcbik6IFByb21pc2U8UmVzb3VyY2VNb3ZlbWVudFtdPiB7XG4gIGNvbnN0IHN0YWNrR3JvdXBzOiBNYXA8c3RyaW5nLCBbQ2xvdWRGb3JtYXRpb25TdGFja1tdLCBDbG91ZEZvcm1hdGlvblN0YWNrW11dPiA9IG5ldyBNYXAoKTtcblxuICAvLyBHcm91cCBzdGFja3MgYnkgZW52aXJvbm1lbnRcbiAgZm9yIChjb25zdCBzdGFjayBvZiBzdGFja3MpIHtcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHN0YWNrLmVudmlyb25tZW50O1xuICAgIGNvbnN0IGtleSA9IGhhc2hPYmplY3QoZW52aXJvbm1lbnQpO1xuICAgIGlmIChzdGFja0dyb3Vwcy5oYXMoa2V5KSkge1xuICAgICAgc3RhY2tHcm91cHMuZ2V0KGtleSkhWzFdLnB1c2goc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgZmlyc3QgdGltZSB3ZSBzZWUgYW4gZW52aXJvbm1lbnQsIHdlIG5lZWQgdG8gZmV0Y2ggYWxsIHN0YWNrcyBkZXBsb3llZCB0byBpdC5cbiAgICAgIGNvbnN0IGJlZm9yZSA9IGF3YWl0IGdldERlcGxveWVkU3RhY2tzKHNka1Byb3ZpZGVyLCBlbnZpcm9ubWVudCk7XG4gICAgICBzdGFja0dyb3Vwcy5zZXQoa2V5LCBbYmVmb3JlLCBbc3RhY2tdXSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBSZXNvdXJjZU1vdmVtZW50W10gPSBbXTtcbiAgZm9yIChjb25zdCBbXywgW2JlZm9yZSwgYWZ0ZXJdXSBvZiBzdGFja0dyb3Vwcykge1xuICAgIHJlc3VsdC5wdXNoKC4uLnJlc291cmNlTW92ZW1lbnRzKGJlZm9yZSwgYWZ0ZXIpKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQuZmlsdGVyKChtb3YpID0+IHtcbiAgICBjb25zdCBhZnRlciA9IG1vdlsxXTtcbiAgICByZXR1cm4gYWZ0ZXIuZXZlcnkoKGwpID0+ICFleGNsdWRlLmlzRXhjbHVkZWQobCkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RGVwbG95ZWRTdGFja3MoXG4gIHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcixcbiAgZW52aXJvbm1lbnQ6IGN4YXBpLkVudmlyb25tZW50LFxuKTogUHJvbWlzZTxDbG91ZEZvcm1hdGlvblN0YWNrW10+IHtcbiAgY29uc3QgY2ZuID0gKGF3YWl0IHNka1Byb3ZpZGVyLmZvckVudmlyb25tZW50KGVudmlyb25tZW50LCBNb2RlLkZvclJlYWRpbmcpKS5zZGsuY2xvdWRGb3JtYXRpb24oKTtcblxuICBjb25zdCBzdW1tYXJpZXMgPSBhd2FpdCBjZm4ucGFnaW5hdGVkTGlzdFN0YWNrcyh7XG4gICAgU3RhY2tTdGF0dXNGaWx0ZXI6IFtcbiAgICAgICdDUkVBVEVfQ09NUExFVEUnLFxuICAgICAgJ1VQREFURV9DT01QTEVURScsXG4gICAgICAnVVBEQVRFX1JPTExCQUNLX0NPTVBMRVRFJyxcbiAgICAgICdJTVBPUlRfQ09NUExFVEUnLFxuICAgICAgJ1JPTExCQUNLX0NPTVBMRVRFJyxcbiAgICBdLFxuICB9KTtcblxuICBjb25zdCBub3JtYWxpemUgPSBhc3luYyAoc3VtbWFyeTogU3RhY2tTdW1tYXJ5KSA9PiB7XG4gICAgY29uc3QgdGVtcGxhdGVDb21tYW5kT3V0cHV0ID0gYXdhaXQgY2ZuLmdldFRlbXBsYXRlKHsgU3RhY2tOYW1lOiBzdW1tYXJ5LlN0YWNrTmFtZSEgfSk7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBkZXNlcmlhbGl6ZVN0cnVjdHVyZSh0ZW1wbGF0ZUNvbW1hbmRPdXRwdXQuVGVtcGxhdGVCb2R5ID8/ICd7fScpO1xuICAgIHJldHVybiB7XG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIHN0YWNrTmFtZTogc3VtbWFyeS5TdGFja05hbWUhLFxuICAgICAgdGVtcGxhdGUsXG4gICAgfTtcbiAgfTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGNka2xhYnMvcHJvbWlzZWFsbC1uby11bmJvdW5kZWQtcGFyYWxsZWxpc21cbiAgcmV0dXJuIFByb21pc2UuYWxsKHN1bW1hcmllcy5tYXAobm9ybWFsaXplKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUeXBlZE1hcHBpbmdzKG1hcHBpbmdzOiBUeXBlZE1hcHBpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJpbmdXcml0ZVN0cmVhbSgpO1xuICBmbXRUeXBlZE1hcHBpbmdzKHN0cmVhbSwgbWFwcGluZ3MpO1xuICByZXR1cm4gc3RyZWFtLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRBbWJpZ3VvdXNNYXBwaW5ncyhwYXRoczogW3N0cmluZ1tdLCBzdHJpbmdbXV1bXSk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJpbmdXcml0ZVN0cmVhbSgpO1xuICBmbXRBbWJpZ3VvdXNNYXBwaW5ncyhzdHJlYW0sIHBhdGhzKTtcbiAgcmV0dXJuIHN0cmVhbS50b1N0cmluZygpO1xufVxuIl19
@@ -1,7 +1,8 @@
1
1
  import type { ResourceDifference } from '@aws-cdk/cloudformation-diff';
2
2
  import type * as cxapi from '@aws-cdk/cx-api';
3
3
  import type { ResourceIdentifierSummary, ResourceToImport } from '@aws-sdk/client-cloudformation';
4
- import type { DeploymentMethod, Deployments } from '../deployments';
4
+ import type { DeploymentMethod } from '../../actions/deploy';
5
+ import type { Deployments } from '../deployments';
5
6
  import { type IoHelper } from '../io/private';
6
7
  import type { Tag } from '../tags';
7
8
  export type ResourcesToImport = ResourceToImport[];