@aws-cdk/aws-bedrock-agentcore-alpha 2.228.0-alpha.0 → 2.229.1-alpha.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 (92) hide show
  1. package/.jsii +1385 -1080
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +15 -1
  4. package/README.md +119 -15
  5. package/lib/gateway/gateway-base.js +171 -0
  6. package/{agentcore → lib}/gateway/gateway.js +4 -4
  7. package/{agentcore → lib}/gateway/inbound-auth/authorizer.js +3 -3
  8. package/lib/gateway/outbound-auth/api-key.js +141 -0
  9. package/{agentcore → lib}/gateway/outbound-auth/credential-provider.js +1 -1
  10. package/lib/gateway/outbound-auth/oauth.js +76 -0
  11. package/lib/gateway/perms.d.ts +73 -0
  12. package/lib/gateway/perms.js +109 -0
  13. package/{agentcore → lib}/gateway/protocol.js +2 -2
  14. package/{agentcore → lib}/gateway/targets/schema/api-schema.js +4 -4
  15. package/{agentcore → lib}/gateway/targets/schema/tool-schema.js +4 -4
  16. package/{agentcore → lib}/gateway/targets/target-base.js +1 -1
  17. package/{agentcore → lib}/gateway/targets/target-configuration.js +5 -5
  18. package/lib/gateway/targets/target.js +444 -0
  19. package/lib/index.d.ts +30 -1
  20. package/lib/index.js +55 -6
  21. package/{agentcore → lib}/memory/memory-strategy.js +1 -1
  22. package/{agentcore → lib}/memory/memory.js +2 -2
  23. package/{agentcore → lib}/memory/strategies/managed-strategy.js +1 -1
  24. package/{agentcore → lib}/memory/strategies/self-managed-strategy.js +1 -1
  25. package/{agentcore → lib}/network/network-configuration.js +4 -4
  26. package/{agentcore → lib}/runtime/runtime-artifact.d.ts +30 -0
  27. package/lib/runtime/runtime-artifact.js +174 -0
  28. package/{agentcore → lib}/runtime/runtime-authorizer-configuration.js +1 -1
  29. package/{agentcore → lib}/runtime/runtime-base.js +1 -1
  30. package/{agentcore → lib}/runtime/runtime-endpoint-base.js +1 -1
  31. package/{agentcore → lib}/runtime/runtime-endpoint.js +1 -1
  32. package/{agentcore → lib}/runtime/runtime.d.ts +32 -1
  33. package/lib/runtime/runtime.js +694 -0
  34. package/lib/runtime/types.d.ts +50 -0
  35. package/lib/runtime/types.js +25 -0
  36. package/{agentcore → lib}/tools/browser.d.ts +37 -0
  37. package/lib/tools/browser.js +680 -0
  38. package/{agentcore → lib}/tools/code-interpreter.js +2 -2
  39. package/package.json +10 -10
  40. package/agentcore/gateway/gateway-base.js +0 -171
  41. package/agentcore/gateway/outbound-auth/api-key.js +0 -141
  42. package/agentcore/gateway/outbound-auth/oauth.js +0 -76
  43. package/agentcore/gateway/perms.d.ts +0 -75
  44. package/agentcore/gateway/perms.js +0 -112
  45. package/agentcore/gateway/targets/target.js +0 -444
  46. package/agentcore/index.d.ts +0 -30
  47. package/agentcore/index.js +0 -71
  48. package/agentcore/runtime/runtime-artifact.js +0 -90
  49. package/agentcore/runtime/runtime.js +0 -589
  50. package/agentcore/runtime/types.d.ts +0 -20
  51. package/agentcore/runtime/types.js +0 -25
  52. package/agentcore/tools/browser.js +0 -641
  53. /package/{agentcore → lib}/gateway/gateway-base.d.ts +0 -0
  54. /package/{agentcore → lib}/gateway/gateway.d.ts +0 -0
  55. /package/{agentcore → lib}/gateway/inbound-auth/authorizer.d.ts +0 -0
  56. /package/{agentcore → lib}/gateway/outbound-auth/api-key.d.ts +0 -0
  57. /package/{agentcore → lib}/gateway/outbound-auth/credential-provider.d.ts +0 -0
  58. /package/{agentcore → lib}/gateway/outbound-auth/iam-role.d.ts +0 -0
  59. /package/{agentcore → lib}/gateway/outbound-auth/iam-role.js +0 -0
  60. /package/{agentcore → lib}/gateway/outbound-auth/oauth.d.ts +0 -0
  61. /package/{agentcore → lib}/gateway/protocol.d.ts +0 -0
  62. /package/{agentcore → lib}/gateway/targets/schema/api-schema.d.ts +0 -0
  63. /package/{agentcore → lib}/gateway/targets/schema/base-schema.d.ts +0 -0
  64. /package/{agentcore → lib}/gateway/targets/schema/base-schema.js +0 -0
  65. /package/{agentcore → lib}/gateway/targets/schema/tool-schema.d.ts +0 -0
  66. /package/{agentcore → lib}/gateway/targets/target-base.d.ts +0 -0
  67. /package/{agentcore → lib}/gateway/targets/target-configuration.d.ts +0 -0
  68. /package/{agentcore → lib}/gateway/targets/target.d.ts +0 -0
  69. /package/{agentcore → lib}/gateway/validation-helpers.d.ts +0 -0
  70. /package/{agentcore → lib}/gateway/validation-helpers.js +0 -0
  71. /package/{agentcore → lib}/memory/memory-strategy.d.ts +0 -0
  72. /package/{agentcore → lib}/memory/memory.d.ts +0 -0
  73. /package/{agentcore → lib}/memory/perms.d.ts +0 -0
  74. /package/{agentcore → lib}/memory/perms.js +0 -0
  75. /package/{agentcore → lib}/memory/strategies/managed-strategy.d.ts +0 -0
  76. /package/{agentcore → lib}/memory/strategies/self-managed-strategy.d.ts +0 -0
  77. /package/{agentcore → lib}/memory/validation-helpers.d.ts +0 -0
  78. /package/{agentcore → lib}/memory/validation-helpers.js +0 -0
  79. /package/{agentcore → lib}/network/network-configuration.d.ts +0 -0
  80. /package/{agentcore → lib}/runtime/perms.d.ts +0 -0
  81. /package/{agentcore → lib}/runtime/perms.js +0 -0
  82. /package/{agentcore → lib}/runtime/runtime-authorizer-configuration.d.ts +0 -0
  83. /package/{agentcore → lib}/runtime/runtime-base.d.ts +0 -0
  84. /package/{agentcore → lib}/runtime/runtime-endpoint-base.d.ts +0 -0
  85. /package/{agentcore → lib}/runtime/runtime-endpoint.d.ts +0 -0
  86. /package/{agentcore → lib}/runtime/validation-helpers.d.ts +0 -0
  87. /package/{agentcore → lib}/runtime/validation-helpers.js +0 -0
  88. /package/{agentcore → lib}/tools/code-interpreter.d.ts +0 -0
  89. /package/{agentcore → lib}/tools/perms.d.ts +0 -0
  90. /package/{agentcore → lib}/tools/perms.js +0 -0
  91. /package/{agentcore → lib}/tools/validation-helpers.d.ts +0 -0
  92. /package/{agentcore → lib}/tools/validation-helpers.js +0 -0
@@ -0,0 +1,680 @@
1
+ "use strict";
2
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
3
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
4
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
5
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
6
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
7
+ var _, done = false;
8
+ for (var i = decorators.length - 1; i >= 0; i--) {
9
+ var context = {};
10
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
11
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
12
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
13
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
14
+ if (kind === "accessor") {
15
+ if (result === void 0) continue;
16
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
17
+ if (_ = accept(result.get)) descriptor.get = _;
18
+ if (_ = accept(result.set)) descriptor.set = _;
19
+ if (_ = accept(result.init)) initializers.unshift(_);
20
+ }
21
+ else if (_ = accept(result)) {
22
+ if (kind === "field") initializers.unshift(_);
23
+ else descriptor[key] = _;
24
+ }
25
+ }
26
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
27
+ done = true;
28
+ };
29
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
30
+ var useValue = arguments.length > 2;
31
+ for (var i = 0; i < initializers.length; i++) {
32
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
33
+ }
34
+ return useValue ? value : void 0;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.BrowserCustom = exports.BrowserCustomBase = exports.BrowserSigning = void 0;
38
+ const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
39
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
41
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
42
+ const iam = require("aws-cdk-lib/aws-iam");
43
+ const s3 = require("aws-cdk-lib/aws-s3");
44
+ const ec2 = require("aws-cdk-lib/aws-ec2");
45
+ const agent_core = require("aws-cdk-lib/aws-bedrockagentcore");
46
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
47
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
48
+ // Internal Libs
49
+ const perms = require("./perms");
50
+ const validation_helpers_1 = require("./validation-helpers");
51
+ const network_configuration_1 = require("../network/network-configuration");
52
+ /******************************************************************************
53
+ * CONSTANTS
54
+ *****************************************************************************/
55
+ /**
56
+ * Minimum length for browser name
57
+ * @internal
58
+ */
59
+ const BROWSER_NAME_MIN_LENGTH = 1;
60
+ /**
61
+ * Maximum length for browser name
62
+ * @internal
63
+ */
64
+ const BROWSER_NAME_MAX_LENGTH = 48;
65
+ /**
66
+ * Minimum length for browser tags
67
+ * @internal
68
+ */
69
+ const BROWSER_TAG_MIN_LENGTH = 1;
70
+ /**
71
+ * Maximum length for browser tags
72
+ * @internal
73
+ */
74
+ const BROWSER_TAG_MAX_LENGTH = 256;
75
+ /******************************************************************************
76
+ * Enums
77
+ *****************************************************************************/
78
+ /**
79
+ * Browser signing. Specifies whether browser signing is enabled.
80
+ * When enabled, the browser will cryptographically sign HTTP requests to identify
81
+ * itself as an AI agent to bot control vendors.
82
+ */
83
+ var BrowserSigning;
84
+ (function (BrowserSigning) {
85
+ /**
86
+ * Browser signing is enabled.
87
+ */
88
+ BrowserSigning["ENABLED"] = "ENABLED";
89
+ /**
90
+ * Browser signing is disabled.
91
+ */
92
+ BrowserSigning["DISABLED"] = "DISABLED";
93
+ })(BrowserSigning || (exports.BrowserSigning = BrowserSigning = {}));
94
+ /******************************************************************************
95
+ * ABSTRACT BASE CLASS
96
+ *****************************************************************************/
97
+ /**
98
+ * Abstract base class for a Browser.
99
+ * Contains methods and attributes valid for Browsers either created with CDK or imported.
100
+ */
101
+ class BrowserCustomBase extends aws_cdk_lib_1.Resource {
102
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.BrowserCustomBase", version: "2.229.1-alpha.0" };
103
+ /**
104
+ * An accessor for the Connections object that will fail if this Browser does not have a VPC
105
+ * configured.
106
+ */
107
+ get connections() {
108
+ if (!this._connections) {
109
+ throw new aws_cdk_lib_1.ValidationError('Cannot manage network access without configuring a VPC', this);
110
+ }
111
+ return this._connections;
112
+ }
113
+ /**
114
+ * The actual Connections object for this Browser. This may be unset in the event that a VPC has not
115
+ * been configured.
116
+ * @internal
117
+ */
118
+ _connections;
119
+ constructor(scope, id) {
120
+ super(scope, id);
121
+ }
122
+ /**
123
+ * Grants IAM actions to the IAM Principal
124
+ * @param grantee - The IAM principal to grant permissions to
125
+ * @param actions - The actions to grant
126
+ * @returns An IAM Grant object representing the granted permissions
127
+ */
128
+ grant(grantee, ...actions) {
129
+ return iam.Grant.addToPrincipal({
130
+ grantee: grantee,
131
+ resourceArns: [this.browserArn],
132
+ actions: actions,
133
+ });
134
+ }
135
+ /**
136
+ * Grant read permissions on this browser to an IAM principal.
137
+ * This includes both read permissions on the specific browser and list permissions on all browsers.
138
+ *
139
+ * @param grantee - The IAM principal to grant read permissions to
140
+ * @default - Default grant configuration:
141
+ * - actions: ['bedrock-agentcore:GetBrowser', 'bedrock-agentcore:GetBrowserSession'] on this.browserArn
142
+ * - actions: ['bedrock-agentcore:ListBrowsers', 'bedrock-agentcore:ListBrowserSessions'] on all resources (*)
143
+ * @returns An IAM Grant object representing the granted permissions
144
+ */
145
+ grantRead(grantee) {
146
+ const resourceSpecificGrant = this.grant(grantee, ...perms.BROWSER_READ_PERMS);
147
+ const allResourceGrant = iam.Grant.addToPrincipal({
148
+ grantee: grantee,
149
+ resourceArns: ['*'],
150
+ actions: perms.BROWSER_LIST_PERMS,
151
+ });
152
+ // Return combined grant
153
+ return resourceSpecificGrant.combine(allResourceGrant);
154
+ }
155
+ /**
156
+ * Grant invoke permissions on this browser to an IAM principal.
157
+ *
158
+ * @param grantee - The IAM principal to grant invoke permissions to
159
+ * @default - Default grant configuration:
160
+ * - actions: ['bedrock-agentcore:StartBrowserSession', 'bedrock-agentcore:UpdateBrowserStream', 'bedrock-agentcore:StopBrowserSession']
161
+ * - resourceArns: [this.browserArn]
162
+ * @returns An IAM Grant object representing the granted permissions
163
+ */
164
+ grantUse(grantee) {
165
+ return this.grant(grantee, ...perms.BROWSER_USE_PERMS);
166
+ }
167
+ // ------------------------------------------------------
168
+ // Metrics
169
+ // ------------------------------------------------------
170
+ /**
171
+ * Return the given named metric for this browser.
172
+ *
173
+ * By default, the metric will be calculated as a sum over a period of 5 minutes.
174
+ * You can customize this by using the `statistic` and `period` properties.
175
+ */
176
+ metric(metricName, dimensions, props) {
177
+ const metricProps = {
178
+ namespace: 'AWS/Bedrock-AgentCore',
179
+ metricName,
180
+ dimensionsMap: { ...dimensions, Resource: this.browserArn },
181
+ ...props,
182
+ };
183
+ return this.configureMetric(metricProps);
184
+ }
185
+ /**
186
+ * Creates a CloudWatch metric for tracking browser api operations..
187
+ *
188
+ * @param props - Configuration options for the metric
189
+ * @default - Default metric configuration:
190
+ * - namespace: 'AWS/Bedrock-AgentCore'
191
+ * - metricName: metricName
192
+ * - dimensionsMap: { BrowserId: this.browserId }
193
+ * @returns A CloudWatch Metric configured for browser api operations
194
+ */
195
+ metricForApiOperation(metricName, operation, props) {
196
+ return this.metric(metricName, { Operation: operation }, props);
197
+ }
198
+ /**
199
+ * Creates a CloudWatch metric for tracking browser latencies.
200
+ *
201
+ * @param props - Configuration options for the metric
202
+ * @default - Default metric configuration:
203
+ * - namespace: 'AWS/Bedrock-AgentCore'
204
+ * - metricName: Latency
205
+ * @returns A CloudWatch Metric configured for browser latencies
206
+ */
207
+ metricLatencyForApiOperation(operation, props) {
208
+ return this.metricForApiOperation('Latency', operation, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
209
+ }
210
+ /**
211
+ * Creates a CloudWatch metric for tracking browser invocations.
212
+ *
213
+ * @param props - Configuration options for the metric
214
+ * @default - Default metric configuration:
215
+ * - namespace: 'AWS/Bedrock-AgentCore'
216
+ * - metricName: Invocations
217
+ * @returns A CloudWatch Metric configured for browser latencies
218
+ */
219
+ metricInvocationsForApiOperation(operation, props) {
220
+ return this.metricForApiOperation('Invocations', operation, {
221
+ statistic: aws_cloudwatch_1.Stats.SUM,
222
+ ...props,
223
+ });
224
+ }
225
+ /**
226
+ * Creates a CloudWatch metric for tracking browser errors.
227
+ *
228
+ * @param props - Configuration options for the metric
229
+ * @default - Default metric configuration:
230
+ * - namespace: 'AWS/Bedrock-AgentCore'
231
+ * - metricName: Errors
232
+ * @returns A CloudWatch Metric configured for browser errors
233
+ */
234
+ metricErrorsForApiOperation(operation, props) {
235
+ return this.metricForApiOperation('Errors', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
236
+ }
237
+ /**
238
+ * Creates a CloudWatch metric for tracking browser throttles.
239
+ *
240
+ * @param props - Configuration options for the metric
241
+ * @default - Default metric configuration:
242
+ * - namespace: 'AWS/Bedrock-AgentCore'
243
+ * - metricName: Throttles
244
+ * @returns A CloudWatch Metric configured for browser throttles
245
+ */
246
+ metricThrottlesForApiOperation(operation, props) {
247
+ return this.metricForApiOperation('Throttles', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
248
+ }
249
+ /**
250
+ * Creates a CloudWatch metric for tracking browser system errors.
251
+ *
252
+ * @param props - Configuration options for the metric
253
+ * @default - Default metric configuration:
254
+ * - namespace: 'AWS/Bedrock-AgentCore'
255
+ * - metricName: SystemErrors
256
+ * @returns A CloudWatch Metric configured for browser system errors
257
+ */
258
+ metricSystemErrorsForApiOperation(operation, props) {
259
+ return this.metricForApiOperation('SystemErrors', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
260
+ }
261
+ /**
262
+ * Creates a CloudWatch metric for tracking browser user errors.
263
+ *
264
+ * @param props - Configuration options for the metric
265
+ * @default - Default metric configuration:
266
+ * - namespace: 'AWS/Bedrock-AgentCore'
267
+ * - metricName: UserErrors
268
+ * @returns A CloudWatch Metric configured for browser user errors
269
+ */
270
+ metricUserErrorsForApiOperation(operation, props) {
271
+ return this.metricForApiOperation('UserErrors', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
272
+ }
273
+ /**
274
+ * Creates a CloudWatch metric for tracking browser session duration.
275
+ *
276
+ * @param props - Configuration options for the metric
277
+ * @default - Default metric configuration:
278
+ * - namespace: 'AWS/Bedrock-AgentCore'
279
+ * - metricName: Duration
280
+ * @returns A CloudWatch Metric configured for browser session duration
281
+ */
282
+ metricSessionDuration(props) {
283
+ return this.metric('Duration', { Operation: 'BrowserSession' }, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
284
+ }
285
+ /**
286
+ * Creates a CloudWatch metric for tracking browser user takeovers.
287
+ *
288
+ * @param props - Configuration options for the metric
289
+ * @default - Default metric configuration:
290
+ * - namespace: 'AWS/Bedrock-AgentCore'
291
+ * - metricName: TakeOverCount
292
+ * @returns A CloudWatch Metric configured for browser user takeovers
293
+ */
294
+ metricTakeOverCount(props) {
295
+ return this.metric('TakeOverCount', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
296
+ }
297
+ /**
298
+ * Creates a CloudWatch metric for tracking browser user takeovers released.
299
+ *
300
+ * @param props - Configuration options for the metric
301
+ * @default - Default metric configuration:
302
+ * - namespace: 'AWS/Bedrock-AgentCore'
303
+ * - metricName: TakeOverReleaseCount
304
+ * @returns A CloudWatch Metric configured for browser user takeovers released
305
+ */
306
+ metricTakeOverReleaseCount(props) {
307
+ return this.metric('TakeOverReleaseCount', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
308
+ }
309
+ /**
310
+ * Creates a CloudWatch metric for tracking browser user takeovers duration.
311
+ *
312
+ * @param props - Configuration options for the metric
313
+ * @default - Default metric configuration:
314
+ * - namespace: 'AWS/Bedrock-AgentCore'
315
+ * - metricName: TakeOverDuration
316
+ * @returns A CloudWatch Metric configured for browser user takeovers duration
317
+ */
318
+ metricTakeOverDuration(props) {
319
+ return this.metric('TakeOverDuration', {}, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
320
+ }
321
+ /**
322
+ * Internal method to create a metric.
323
+ *
324
+ * @param props - Configuration options for the metric
325
+ * @returns A CloudWatch Metric configured for browser api operations
326
+ */
327
+ configureMetric(props) {
328
+ return new aws_cloudwatch_1.Metric({
329
+ ...props,
330
+ region: props?.region ?? this.stack.region,
331
+ account: props?.account ?? this.stack.account,
332
+ });
333
+ }
334
+ }
335
+ exports.BrowserCustomBase = BrowserCustomBase;
336
+ /******************************************************************************
337
+ * Class
338
+ *****************************************************************************/
339
+ /**
340
+ * Browser resource for AWS Bedrock Agent Core.
341
+ * Provides a browser environment for web automation and interaction.
342
+ *
343
+ * @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/browser.html
344
+ * @resource AWS::BedrockAgentCore::BrowserCustom
345
+ */
346
+ let BrowserCustom = (() => {
347
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
348
+ let _classDescriptor;
349
+ let _classExtraInitializers = [];
350
+ let _classThis;
351
+ let _classSuper = BrowserCustomBase;
352
+ var BrowserCustom = class extends _classSuper {
353
+ static { _classThis = this; }
354
+ static {
355
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
356
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
357
+ BrowserCustom = _classThis = _classDescriptor.value;
358
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
359
+ }
360
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.BrowserCustom", version: "2.229.1-alpha.0" };
361
+ /** Uniquely identifies this class. */
362
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.BrowserCustom';
363
+ /**
364
+ * Static Method for importing an existing Bedrock AgentCore Browser Custom.
365
+ */
366
+ /**
367
+ * Creates an Browser Custom reference from an existing browser's attributes.
368
+ *
369
+ * @param scope - The construct scope
370
+ * @param id - Identifier of the construct
371
+ * @param attrs - Attributes of the existing browser custom
372
+ * @returns An IBrowserCustom reference to the existing browser
373
+ */
374
+ static fromBrowserCustomAttributes(scope, id, attrs) {
375
+ try {
376
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_BrowserCustomAttributes(attrs);
377
+ }
378
+ catch (error) {
379
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
380
+ Error.captureStackTrace(error, this.fromBrowserCustomAttributes);
381
+ }
382
+ throw error;
383
+ }
384
+ class Import extends BrowserCustomBase {
385
+ browserArn = attrs.browserArn;
386
+ browserId = aws_cdk_lib_1.Arn.split(attrs.browserArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
387
+ executionRole = iam.Role.fromRoleArn(scope, `${id}Role`, attrs.roleArn);
388
+ lastUpdatedAt = attrs.lastUpdatedAt;
389
+ grantPrincipal = this.executionRole;
390
+ status = attrs.status;
391
+ createdAt = attrs.createdAt;
392
+ constructor(s, i) {
393
+ super(s, i);
394
+ this.grantPrincipal = this.executionRole || new iam.UnknownPrincipal({ resource: this });
395
+ if (attrs.securityGroups) {
396
+ this._connections = new ec2.Connections({
397
+ securityGroups: attrs.securityGroups,
398
+ });
399
+ }
400
+ }
401
+ }
402
+ // Return new Browser Custom
403
+ return new Import(scope, id);
404
+ }
405
+ // ------------------------------------------------------
406
+ // Attributes
407
+ // ------------------------------------------------------
408
+ /**
409
+ * The ARN of the browser resource.
410
+ * @attribute
411
+ */
412
+ browserArn;
413
+ /**
414
+ * The id of the browser
415
+ * @attribute
416
+ */
417
+ browserId;
418
+ /**
419
+ * The name of the browser
420
+ */
421
+ name;
422
+ /**
423
+ * The description of the browser
424
+ */
425
+ description;
426
+ /**
427
+ * The last updated timestamp of the browser
428
+ * @attribute
429
+ */
430
+ lastUpdatedAt;
431
+ /**
432
+ * The status of the browser
433
+ * @attribute
434
+ */
435
+ status;
436
+ /**
437
+ * The created timestamp of the browser
438
+ * @attribute
439
+ */
440
+ createdAt;
441
+ /**
442
+ * The failure reason of the browser
443
+ * @attribute
444
+ */
445
+ failureReason;
446
+ /**
447
+ * The IAM role associated to the browser.
448
+ */
449
+ executionRole;
450
+ /**
451
+ * Tags applied to this browser resource
452
+ * A map of key-value pairs for resource tagging
453
+ * @default - No tags applied
454
+ */
455
+ tags;
456
+ /**
457
+ * The principal to grant permissions to
458
+ */
459
+ grantPrincipal;
460
+ /**
461
+ * The network configuration of the browser
462
+ */
463
+ networkConfiguration;
464
+ /**
465
+ * The recording configuration of the browser
466
+ */
467
+ recordingConfig;
468
+ /**
469
+ * The browser signing configuration of the browser
470
+ */
471
+ browserSigning;
472
+ // ------------------------------------------------------
473
+ // Internal Only
474
+ // ------------------------------------------------------
475
+ __resource;
476
+ // ------------------------------------------------------
477
+ // CONSTRUCTOR
478
+ // ------------------------------------------------------
479
+ constructor(scope, id, props) {
480
+ super(scope, id);
481
+ try {
482
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_BrowserCustomProps(props);
483
+ }
484
+ catch (error) {
485
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
486
+ Error.captureStackTrace(error, BrowserCustom);
487
+ }
488
+ throw error;
489
+ }
490
+ // Enhanced CDK Analytics Telemetry
491
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
492
+ // ------------------------------------------------------
493
+ // Set properties and defaults
494
+ // ------------------------------------------------------
495
+ this.name = props.browserCustomName;
496
+ this.description = props.description;
497
+ this.networkConfiguration = props.networkConfiguration ?? network_configuration_1.BrowserNetworkConfiguration.usingPublicNetwork();
498
+ this.recordingConfig = props.recordingConfig ?? { enabled: false };
499
+ this.executionRole = props.executionRole ?? this._createBrowserRole();
500
+ this.grantPrincipal = this.executionRole;
501
+ this.tags = props.tags;
502
+ this.browserSigning = props.browserSigning ?? BrowserSigning.DISABLED;
503
+ // Validate browser name
504
+ (0, validation_helpers_1.throwIfInvalid)(this._validateBrowserName, this.name);
505
+ // Validate browser tags
506
+ (0, validation_helpers_1.throwIfInvalid)(this._validateBrowserTags, this.tags);
507
+ // Validate recording configuration
508
+ (0, validation_helpers_1.throwIfInvalid)(this._validateRecordingConfig, this.recordingConfig);
509
+ // Network configuration and validation is done in the network configuration class
510
+ // So we don't need to validate it here
511
+ // Set connections - create a shared connections object
512
+ if (this.networkConfiguration.connections) {
513
+ // Use the network configuration's connections as the shared object
514
+ this._connections = this.networkConfiguration.connections;
515
+ }
516
+ // ------------------------------------------------------
517
+ // CFN Props - With Lazy support
518
+ // ------------------------------------------------------
519
+ const cfnProps = {
520
+ name: this.name,
521
+ description: this.description,
522
+ networkConfiguration: aws_cdk_lib_1.Lazy.any({ produce: () => this.networkConfiguration._render(this._connections) }),
523
+ recordingConfig: this._renderRecordingConfig(),
524
+ executionRoleArn: this.executionRole?.roleArn,
525
+ tags: this.tags,
526
+ browserSigning: this._renderBrowserSigning(),
527
+ };
528
+ // L1 instantiation
529
+ this.__resource = new agent_core.CfnBrowserCustom(this, 'Resource', cfnProps);
530
+ // Get attributes directly from the CloudFormation resource
531
+ this.browserId = this.__resource.attrBrowserId;
532
+ this.browserArn = this.__resource.attrBrowserArn;
533
+ this.status = this.__resource.attrStatus;
534
+ this.createdAt = this.__resource.attrCreatedAt;
535
+ this.lastUpdatedAt = this.__resource.attrLastUpdatedAt;
536
+ this.failureReason = this.__resource.attrFailureReason;
537
+ // if recording is configured, add permissions to the execution role
538
+ if (this.recordingConfig && this.recordingConfig.s3Location) {
539
+ if (!aws_cdk_lib_1.Token.isUnresolved(this.recordingConfig.s3Location.bucketName)) {
540
+ aws_cdk_lib_1.Stack.of(this).resolve(this.recordingConfig.s3Location.bucketName);
541
+ }
542
+ const bucket = s3.Bucket.fromBucketName(this, `${this.name}RecordingBucket`, this.recordingConfig.s3Location.bucketName);
543
+ // Ensure the policy is applied before the browser resource is created
544
+ const grant = bucket.grantReadWrite(this.executionRole);
545
+ grant.applyBefore(this.__resource);
546
+ }
547
+ }
548
+ /**
549
+ * Render the recording configuration.
550
+ *
551
+ * @returns RecordingConfigProperty object in CloudFormation format, or undefined if no recording configuration is defined
552
+ * @default - undefined if no recording configuration is provided
553
+ * @internal This is an internal core function and should not be called directly.
554
+ */
555
+ _renderRecordingConfig() {
556
+ return this.recordingConfig ? {
557
+ enabled: this.recordingConfig.enabled,
558
+ s3Location: this.recordingConfig.s3Location ? {
559
+ bucket: this.recordingConfig.s3Location.bucketName,
560
+ prefix: this.recordingConfig.s3Location.objectKey,
561
+ } : undefined,
562
+ } : undefined;
563
+ }
564
+ /**
565
+ * Render the browser signing configuration.
566
+ *
567
+ * @returns BrowserSigningProperty object in CloudFormation format, or undefined if no browser signing configuration is defined
568
+ * @default - undefined if no browser signing configuration is provided
569
+ * @internal This is an internal core function and should not be called directly.
570
+ */
571
+ _renderBrowserSigning() {
572
+ return this.browserSigning === BrowserSigning.ENABLED ? {
573
+ enabled: true,
574
+ } : {
575
+ enabled: false,
576
+ };
577
+ }
578
+ /**
579
+ * Creates execution role needed for the browser to access AWS services
580
+ * @returns The created role
581
+ * @internal This is an internal core function and should not be called directly.
582
+ */
583
+ _createBrowserRole() {
584
+ const role = new iam.Role(this, 'ServiceRole', {
585
+ assumedBy: new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com'),
586
+ });
587
+ return role;
588
+ }
589
+ // ------------------------------------------------------
590
+ // Validators
591
+ // ------------------------------------------------------
592
+ /**
593
+ * Validates the browser name format
594
+ * @param name The browser name to validate
595
+ * @returns Array of validation error messages, empty if valid
596
+ */
597
+ _validateBrowserName = (name) => {
598
+ let errors = [];
599
+ errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
600
+ value: name,
601
+ fieldName: 'Browser name',
602
+ minLength: BROWSER_NAME_MIN_LENGTH,
603
+ maxLength: BROWSER_NAME_MAX_LENGTH,
604
+ }));
605
+ // Check if name matches the AWS API pattern: [a-zA-Z][a-zA-Z0-9_]{0,47}
606
+ // Must start with a letter, followed by up to 47 letters, numbers, or underscores
607
+ const validNamePattern = /^[a-zA-Z][a-zA-Z0-9_]{0,47}$/;
608
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(name, 'Browser name', validNamePattern));
609
+ return errors;
610
+ };
611
+ /**
612
+ * Validates the browser tags format
613
+ * @param tags The tags object to validate
614
+ * @returns Array of validation error messages, empty if valid
615
+ */
616
+ _validateBrowserTags = (tags) => {
617
+ let errors = [];
618
+ if (!tags) {
619
+ return errors; // Tags are optional
620
+ }
621
+ // Validate each tag key and value
622
+ for (const [key, value] of Object.entries(tags)) {
623
+ errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
624
+ value: key,
625
+ fieldName: 'Tag key',
626
+ minLength: BROWSER_TAG_MIN_LENGTH,
627
+ maxLength: BROWSER_TAG_MAX_LENGTH,
628
+ }));
629
+ // Validate tag key pattern: ^[a-zA-Z0-9\s._:/=+@-]*$
630
+ const validKeyPattern = /^[a-zA-Z0-9\s._:/=+@-]*$/;
631
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(key, 'Tag key', validKeyPattern));
632
+ // Validate tag value
633
+ errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
634
+ value: value,
635
+ fieldName: 'Tag value',
636
+ minLength: BROWSER_TAG_MIN_LENGTH,
637
+ maxLength: BROWSER_TAG_MAX_LENGTH,
638
+ }));
639
+ // Validate tag value pattern: ^[a-zA-Z0-9\s._:/=+@-]*$
640
+ const validValuePattern = /^[a-zA-Z0-9\s._:/=+@-]*$/;
641
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(value, 'Tag value', validValuePattern));
642
+ }
643
+ return errors;
644
+ };
645
+ /**
646
+ * Validates the recording configuration
647
+ * @param recordingConfig The recording configuration to validate
648
+ * @returns Array of validation error messages, empty if valid
649
+ */
650
+ _validateRecordingConfig = (recordingConfig) => {
651
+ let errors = [];
652
+ if (!recordingConfig) {
653
+ return errors; // No validation needed if no recording config is provided
654
+ }
655
+ const s3Location = recordingConfig.s3Location;
656
+ // Only validate S3 location if it's actually provided
657
+ if (s3Location) {
658
+ // Both bucket name and object key are required when S3 location is provided
659
+ if (!s3Location.bucketName) {
660
+ errors.push('S3 bucket name is required when S3 location is provided for recording configuration');
661
+ }
662
+ else {
663
+ // Validate bucket name pattern: ^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$
664
+ const bucketNamePattern = /^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$/;
665
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(s3Location.bucketName, 'S3 bucket name', bucketNamePattern));
666
+ }
667
+ if (!s3Location.objectKey) {
668
+ errors.push('S3 object key (prefix) is required when S3 location is provided for recording configuration');
669
+ }
670
+ }
671
+ return errors;
672
+ };
673
+ static {
674
+ __runInitializers(_classThis, _classExtraInitializers);
675
+ }
676
+ };
677
+ return BrowserCustom = _classThis;
678
+ })();
679
+ exports.BrowserCustom = BrowserCustom;
680
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBU3FCO0FBQ3JCLCtEQU1vQztBQUNwQywyQ0FBMkM7QUFDM0MseUNBQXlDO0FBQ3pDLDJDQUEyQztBQUMzQywrREFBK0Q7QUFHL0QsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUMxRSxnQkFBZ0I7QUFDaEIsaUNBQWlDO0FBQ2pDLDZEQUF1RztBQUN2Ryw0RUFBK0U7QUFFL0U7OytFQUUrRTtBQUMvRTs7O0dBR0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUVsQzs7O0dBR0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQUVuQzs7O0dBR0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUVqQzs7O0dBR0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUVuQzs7K0VBRStFO0FBQy9FOzs7O0dBSUc7QUFDSCxJQUFZLGNBU1g7QUFURCxXQUFZLGNBQWM7SUFDeEI7O09BRUc7SUFDSCxxQ0FBbUIsQ0FBQTtJQUNuQjs7T0FFRztJQUNILHVDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFUVyxjQUFjLDhCQUFkLGNBQWMsUUFTekI7QUEwSEQ7OytFQUUrRTtBQUMvRTs7O0dBR0c7QUFDSCxNQUFzQixpQkFBa0IsU0FBUSxzQkFBUTs7SUFXdEQ7OztPQUdHO0lBQ0gsSUFBVyxXQUFXO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLDZCQUFlLENBQUMsd0RBQXdELEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztLQUMxQjtJQUNEOzs7O09BSUc7SUFDTyxZQUFZLENBQThCO0lBRXBE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QztnQkFDN0csQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUM7O1lBM1VTLHVEQUFhOzs7OztBQUFiLHNDQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXJuLFxuICBBcm5Gb3JtYXQsXG4gIElSZXNvdXJjZSxcbiAgTGF6eSxcbiAgUmVzb3VyY2UsXG4gIFRva2VuLFxuICBTdGFjayxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBEaW1lbnNpb25zTWFwLFxuICBNZXRyaWMsXG4gIE1ldHJpY09wdGlvbnMsXG4gIE1ldHJpY1Byb3BzLFxuICBTdGF0cyxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGFnZW50X2NvcmUgZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2thZ2VudGNvcmUnO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG4vLyBJbnRlcm5hbCBMaWJzXG5pbXBvcnQgKiBhcyBwZXJtcyBmcm9tICcuL3Blcm1zJztcbmltcG9ydCB7IHZhbGlkYXRlRmllbGRQYXR0ZXJuLCB2YWxpZGF0ZVN0cmluZ0ZpZWxkTGVuZ3RoLCB0aHJvd0lmSW52YWxpZCB9IGZyb20gJy4vdmFsaWRhdGlvbi1oZWxwZXJzJztcbmltcG9ydCB7IEJyb3dzZXJOZXR3b3JrQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL25ldHdvcmsvbmV0d29yay1jb25maWd1cmF0aW9uJztcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVEFOVFNcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogTWluaW11bSBsZW5ndGggZm9yIGJyb3dzZXIgbmFtZVxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IEJST1dTRVJfTkFNRV9NSU5fTEVOR1RIID0gMTtcblxuLyoqXG4gKiBNYXhpbXVtIGxlbmd0aCBmb3IgYnJvd3NlciBuYW1lXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgQlJPV1NFUl9OQU1FX01BWF9MRU5HVEggPSA0ODtcblxuLyoqXG4gKiBNaW5pbXVtIGxlbmd0aCBmb3IgYnJvd3NlciB0YWdzXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgQlJPV1NFUl9UQUdfTUlOX0xFTkdUSCA9IDE7XG5cbi8qKlxuICogTWF4aW11bSBsZW5ndGggZm9yIGJyb3dzZXIgdGFnc1xuICogQGludGVybmFsXG4gKi9cbmNvbnN0IEJST1dTRVJfVEFHX01BWF9MRU5HVEggPSAyNTY7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtc1xuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBCcm93c2VyIHNpZ25pbmcuIFNwZWNpZmllcyB3aGV0aGVyIGJyb3dzZXIgc2lnbmluZyBpcyBlbmFibGVkLlxuICogV2hlbiBlbmFibGVkLCB0aGUgYnJvd3NlciB3aWxsIGNyeXB0b2dyYXBoaWNhbGx5IHNpZ24gSFRUUCByZXF1ZXN0cyB0byBpZGVudGlmeVxuICogaXRzZWxmIGFzIGFuIEFJIGFnZW50IHRvIGJvdCBjb250cm9sIHZlbmRvcnMuXG4gKi9cbmV4cG9ydCBlbnVtIEJyb3dzZXJTaWduaW5nIHtcbiAgLyoqXG4gICAqIEJyb3dzZXIgc2lnbmluZyBpcyBlbmFibGVkLlxuICAgKi9cbiAgRU5BQkxFRCA9ICdFTkFCTEVEJyxcbiAgLyoqXG4gICAqIEJyb3dzZXIgc2lnbmluZyBpcyBkaXNhYmxlZC5cbiAgICovXG4gIERJU0FCTEVEID0gJ0RJU0FCTEVEJyxcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgQnJvd3NlciByZXNvdXJjZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQnJvd3NlckN1c3RvbSBleHRlbmRzIElSZXNvdXJjZSwgaWFtLklHcmFudGFibGUsIGVjMi5JQ29ubmVjdGFibGUge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgYnJvd3NlciByZXNvdXJjZVxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBicm93c2VyQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgYnJvd3NlclxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBicm93c2VySWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIHRoYXQgcHJvdmlkZXMgcGVybWlzc2lvbnMgZm9yIHRoZSBicm93c2VyIHRvIGFjY2VzcyBBV1Mgc2VydmljZXNcbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGU6IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogVGltZXN0YW1wIHdoZW4gdGhlIGJyb3dzZXIgd2FzIGxhc3QgdXBkYXRlZFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBsYXN0VXBkYXRlZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBicm93c2VyXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZXN0YW1wIHdoZW4gdGhlIGJyb3dzZXIgd2FzIGNyZWF0ZWRcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFudHMgSUFNIGFjdGlvbnMgdG8gdGhlIElBTSBQcmluY2lwYWxcbiAgICovXG4gIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudDtcbiAgLyoqXG4gICAqIEdyYW50cyBgR2V0YCBhbmQgYExpc3RgIGFjdGlvbnMgb24gdGhlIEJyb3dzZXJcbiAgICovXG4gIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcbiAgLyoqXG4gICAqIEdyYW50cyBgSW52b2tlYCwgYFN0YXJ0YCwgYW5kIGBVcGRhdGVgIGFjdGlvbnMgb24gdGhlIEJyb3dzZXJcbiAgICovXG4gIGdyYW50VXNlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBNZXRyaWNzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBnaXZlbiBuYW1lZCBtZXRyaWMgZm9yIHRoaXMgYnJvd3Nlci5cbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIGRpbWVuc2lvbnM6IERpbWVuc2lvbnNNYXAsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBnaXZlbiBuYW1lZCBtZXRyaWMgcmVsYXRlZCB0byB0aGUgQVBJIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhpcyBicm93c2VyLlxuICAgKi9cbiAgbWV0cmljRm9yQXBpT3BlcmF0aW9uKG1ldHJpY05hbWU6IHN0cmluZywgb3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgbGF0ZW5jeSBvZiBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgYnJvd3Nlci5cbiAgICovXG4gIG1ldHJpY0xhdGVuY3lGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIHRvdGFsIG51bWJlciBvZiBBUEkgcmVxdWVzdHMgbWFkZSBmb3IgYSBzcGVjaWZpYyBicm93c2VyIG9wZXJhdGlvbi5cbiAgICovXG4gIG1ldHJpY0ludm9jYXRpb25zRm9yQXBpT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgZXJyb3JzIGZvciBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgYnJvd3Nlci5cbiAgICovXG4gIG1ldHJpY0Vycm9yc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHRocm90dGxlZCByZXF1ZXN0cyBmb3IgYSBzcGVjaWZpYyBBUEkgb3BlcmF0aW9uIHBlcmZvcm1lZCBvbiB0aGlzIGJyb3dzZXIuXG4gICAqL1xuICBtZXRyaWNUaHJvdHRsZXNGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBzeXN0ZW0gZXJyb3JzIGZvciBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgYnJvd3Nlci5cbiAgICovXG4gIG1ldHJpY1N5c3RlbUVycm9yc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHVzZXIgZXJyb3JzIGZvciBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgYnJvd3Nlci5cbiAgICovXG4gIG1ldHJpY1VzZXJFcnJvcnNGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgZHVyYXRpb24gb2YgYnJvd3NlciBzZXNzaW9ucy5cbiAgICovXG4gIG1ldHJpY1Nlc3Npb25EdXJhdGlvbihwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgdXNlciB0YWtlb3ZlcnMuXG4gICAqL1xuICBtZXRyaWNUYWtlT3ZlckNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiB1c2VyIHRha2VvdmVycyByZWxlYXNlZC5cbiAgICovXG4gIG1ldHJpY1Rha2VPdmVyUmVsZWFzZUNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgZHVyYXRpb24gb2YgdXNlciB0YWtlb3ZlcnMuXG4gICAqL1xuICBtZXRyaWNUYWtlT3ZlckR1cmF0aW9uKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICBBQlNUUkFDVCBCQVNFIENMQVNTXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGEgQnJvd3Nlci5cbiAqIENvbnRhaW5zIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXMgdmFsaWQgZm9yIEJyb3dzZXJzIGVpdGhlciBjcmVhdGVkIHdpdGggQ0RLIG9yIGltcG9ydGVkLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnJvd3NlckN1c3RvbUJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElCcm93c2VyQ3VzdG9tIHtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGJyb3dzZXJBcm46IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGJyb3dzZXJJZDogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGV4ZWN1dGlvblJvbGU6IGlhbS5JUm9sZTtcbiAgLyoqXG4gICAqIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgcGVybWlzc2lvbnMgdG9cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG4gIC8qKlxuICAgKiBBbiBhY2Nlc3NvciBmb3IgdGhlIENvbm5lY3Rpb25zIG9iamVjdCB0aGF0IHdpbGwgZmFpbCBpZiB0aGlzIEJyb3dzZXIgZG9lcyBub3QgaGF2ZSBhIFZQQ1xuICAgKiBjb25maWd1cmVkLlxuICAgKi9cbiAgcHVibGljIGdldCBjb25uZWN0aW9ucygpOiBlYzIuQ29ubmVjdGlvbnMge1xuICAgIGlmICghdGhpcy5fY29ubmVjdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0Nhbm5vdCBtYW5hZ2UgbmV0d29yayBhY2Nlc3Mgd2l0aG91dCBjb25maWd1cmluZyBhIFZQQycsIHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbnM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBhY3R1YWwgQ29ubmVjdGlvbnMgb2JqZWN0IGZvciB0aGlzIEJyb3dzZXIuIFRoaXMgbWF5IGJlIHVuc2V0IGluIHRoZSBldmVudCB0aGF0IGEgVlBDIGhhcyBub3RcbiAgICogYmVlbiBjb25maWd1cmVkLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfY29ubmVjdGlvbnM6IGVjMi5Db25uZWN0aW9ucyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgSUFNIGFjdGlvbnMgdG8gdGhlIElBTSBQcmluY2lwYWxcbiAgICogQHBhcmFtIGdyYW50ZWUgLSBUaGUgSUFNIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0b1xuICAgKiBAcGFyYW0gYWN0aW9ucyAtIFRoZSBhY3Rpb25zIHRvIGdyYW50XG4gICAqIEByZXR1cm5zIEFuIElBTSBHcmFudCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAqL1xuICBwdWJsaWMgZ3JhbnQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWU6IGdyYW50ZWUsXG4gICAgICByZXNvdXJjZUFybnM6IFt0aGlzLmJyb3dzZXJBcm5dLFxuICAgICAgYWN0aW9uczogYWN0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIHBlcm1pc3Npb25zIG9uIHRoaXMgYnJvd3NlciB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKiBUaGlzIGluY2x1ZGVzIGJvdGggcmVhZCBwZXJtaXNzaW9ucyBvbiB0aGUgc3BlY2lmaWMgYnJvd3NlciBhbmQgbGlzdCBwZXJtaXNzaW9ucyBvbiBhbGwgYnJvd3NlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIC0gVGhlIElBTSBwcmluY2lwYWwgdG8gZ3JhbnQgcmVhZCBwZXJtaXNzaW9ucyB0b1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgZ3JhbnQgY29uZmlndXJhdGlvbjpcbiAgICogLSBhY3Rpb25zOiBbJ2JlZHJvY2stYWdlbnRjb3JlOkdldEJyb3dzZXInLCAnYmVkcm9jay1hZ2VudGNvcmU6R2V0QnJvd3NlclNlc3Npb24nXSBvbiB0aGlzLmJyb3dzZXJBcm5cbiAgICogLSBhY3Rpb25zOiBbJ2JlZHJvY2stYWdlbnRjb3JlOkxpc3RCcm93c2VycycsICdiZWRyb2NrLWFnZW50Y29yZTpMaXN0QnJvd3NlclNlc3Npb25zJ10gb24gYWxsIHJlc291cmNlcyAoKilcbiAgICogQHJldHVybnMgQW4gSUFNIEdyYW50IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdyYW50ZWQgcGVybWlzc2lvbnNcbiAgICovXG4gIHB1YmxpYyBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIGNvbnN0IHJlc291cmNlU3BlY2lmaWNHcmFudCA9IHRoaXMuZ3JhbnQoXG4gICAgICBncmFudGVlLFxuICAgICAgLi4ucGVybXMuQlJPV1NFUl9SRUFEX1BFUk1TLFxuICAgICk7XG5cbiAgICBjb25zdCBhbGxSZXNvdXJjZUdyYW50ID0gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWU6IGdyYW50ZWUsXG4gICAgICByZXNvdXJjZUFybnM6IFsnKiddLFxuICAgICAgYWN0aW9uczogcGVybXMuQlJPV1NFUl9MSVNUX1BFUk1TLFxuICAgIH0pO1xuICAgIC8vIFJldHVybiBjb21iaW5lZCBncmFudFxuICAgIHJldHVybiByZXNvdXJjZVNwZWNpZmljR3JhbnQuY29tYmluZShhbGxSZXNvdXJjZUdyYW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBpbnZva2UgcGVybWlzc2lvbnMgb24gdGhpcyBicm93c2VyIHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIC0gVGhlIElBTSBwcmluY2lwYWwgdG8gZ3JhbnQgaW52b2tlIHBlcm1pc3Npb25zIHRvXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBncmFudCBjb25maWd1cmF0aW9uOlxuICAgKiAtIGFjdGlvbnM6IFsnYmVkcm9jay1hZ2VudGNvcmU6U3RhcnRCcm93c2VyU2Vzc2lvbicsICdiZWRyb2NrLWFnZW50Y29yZTpVcGRhdGVCcm93c2VyU3RyZWFtJywgJ2JlZHJvY2stYWdlbnRjb3JlOlN0b3BCcm93c2VyU2Vzc2lvbiddXG4gICAqIC0gcmVzb3VyY2VBcm5zOiBbdGhpcy5icm93c2VyQXJuXVxuICAgKiBAcmV0dXJucyBBbiBJQU0gR3JhbnQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ3JhbnRlZCBwZXJtaXNzaW9uc1xuICAgKi9cbiAgcHVibGljIGdyYW50VXNlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGdyYW50ZWUsXG4gICAgICAuLi5wZXJtcy5CUk9XU0VSX1VTRV9QRVJNUyxcbiAgICApO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIE1ldHJpY3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGdpdmVuIG5hbWVkIG1ldHJpYyBmb3IgdGhpcyBicm93c2VyLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgbWV0cmljIHdpbGwgYmUgY2FsY3VsYXRlZCBhcyBhIHN1bSBvdmVyIGEgcGVyaW9kIG9mIDUgbWludXRlcy5cbiAgICogWW91IGNhbiBjdXN0b21pemUgdGhpcyBieSB1c2luZyB0aGUgYHN0YXRpc3RpY2AgYW5kIGBwZXJpb2RgIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgZGltZW5zaW9uczogRGltZW5zaW9uc01hcCwgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICBjb25zdCBtZXRyaWNQcm9wczogTWV0cmljUHJvcHMgPSB7XG4gICAgICBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnLFxuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHsgLi4uZGltZW5zaW9ucywgUmVzb3VyY2U6IHRoaXMuYnJvd3NlckFybiB9LFxuICAgICAgLi4ucHJvcHMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5jb25maWd1cmVNZXRyaWMobWV0cmljUHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdHJhY2tpbmcgYnJvd3NlciBhcGkgb3BlcmF0aW9ucy4uXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgbWV0cmljIGNvbmZpZ3VyYXRpb246XG4gICAqIC0gbmFtZXNwYWNlOiAnQVdTL0JlZHJvY2stQWdlbnRDb3JlJ1xuICAgKiAtIG1ldHJpY05hbWU6IG1ldHJpY05hbWVcbiAgICogLSBkaW1lbnNpb25zTWFwOiB7IEJyb3dzZXJJZDogdGhpcy5icm93c2VySWQgfVxuICAgKiBAcmV0dXJucyBBIENsb3VkV2F0Y2ggTWV0cmljIGNvbmZpZ3VyZWQgZm9yIGJyb3dzZXIgYXBpIG9wZXJhdGlvbnNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNGb3JBcGlPcGVyYXRpb24oXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIHByb3BzPzogTWV0cmljT3B0aW9ucyxcbiAgKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMobWV0cmljTmFtZSwgeyBPcGVyYXRpb246IG9wZXJhdGlvbiB9LCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0cmFja2luZyBicm93c2VyIGxhdGVuY2llcy5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBtZXRyaWMgY29uZmlndXJhdGlvbjpcbiAgICogLSBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnXG4gICAqIC0gbWV0cmljTmFtZTogTGF0ZW5jeVxuICAgKiBAcmV0dXJucyBBIENsb3VkV2F0Y2ggTWV0cmljIGNvbmZpZ3VyZWQgZm9yIGJyb3dzZXIgbGF0ZW5jaWVzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljTGF0ZW5jeUZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGb3JBcGlPcGVyYXRpb24oJ0xhdGVuY3knLCBvcGVyYXRpb24sIHsgc3RhdGlzdGljOiBTdGF0cy5BVkVSQUdFLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRyYWNraW5nIGJyb3dzZXIgaW52b2NhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgbWV0cmljIGNvbmZpZ3VyYXRpb246XG4gICAqIC0gbmFtZXNwYWNlOiAnQVdTL0JlZHJvY2stQWdlbnRDb3JlJ1xuICAgKiAtIG1ldHJpY05hbWU6IEludm9jYXRpb25zXG4gICAqIEByZXR1cm5zIEEgQ2xvdWRXYXRjaCBNZXRyaWMgY29uZmlndXJlZCBmb3IgYnJvd3NlciBsYXRlbmNpZXNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNJbnZvY2F0aW9uc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGb3JBcGlPcGVyYXRpb24oJ0ludm9jYXRpb25zJywgb3BlcmF0aW9uLCB7XG4gICAgICBzdGF0aXN0aWM6IFN0YXRzLlNVTSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdHJhY2tpbmcgYnJvd3NlciBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgbWV0cmljIGNvbmZpZ3VyYXRpb246XG4gICAqIC0gbmFtZXNwYWNlOiAnQVdTL0JlZHJvY2stQWdlbnRDb3JlJ1xuICAgKiAtIG1ldHJpY05hbWU6IEVycm9yc1xuICAgKiBAcmV0dXJucyBBIENsb3VkV2F0Y2ggTWV0cmljIGNvbmZpZ3VyZWQgZm9yIGJyb3dzZXIgZXJyb3JzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljRXJyb3JzRm9yQXBpT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY0ZvckFwaU9wZXJhdGlvbignRXJyb3JzJywgb3BlcmF0aW9uLCB7IHN0YXRpc3RpYzogU3RhdHMuU1VNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRyYWNraW5nIGJyb3dzZXIgdGhyb3R0bGVzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBtZXRyaWNcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IG1ldHJpYyBjb25maWd1cmF0aW9uOlxuICAgKiAtIG5hbWVzcGFjZTogJ0FXUy9CZWRyb2NrLUFnZW50Q29yZSdcbiAgICogLSBtZXRyaWNOYW1lOiBUaHJvdHRsZXNcbiAgICogQHJldHVybnMgQSBDbG91ZFdhdGNoIE1ldHJpYyBjb25maWd1cmVkIGZvciBicm93c2VyIHRocm90dGxlc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1Rocm90dGxlc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGb3JBcGlPcGVyYXRpb24oJ1Rocm90dGxlcycsIG9wZXJhdGlvbiwgeyBzdGF0aXN0aWM6IFN0YXRzLlNVTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0cmFja2luZyBicm93c2VyIHN5c3RlbSBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgbWV0cmljIGNvbmZpZ3VyYXRpb246XG4gICAqIC0gbmFtZXNwYWNlOiAnQVdTL0JlZHJvY2stQWdlbnRDb3JlJ1xuICAgKiAtIG1ldHJpY05hbWU6IFN5c3RlbUVycm9yc1xuICAgKiBAcmV0dXJucyBBIENsb3VkV2F0Y2ggTWV0cmljIGNvbmZpZ3VyZWQgZm9yIGJyb3dzZXIgc3lzdGVtIGVycm9yc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1N5c3RlbUVycm9yc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGb3JBcGlPcGVyYXRpb24oJ1N5c3RlbUVycm9ycycsIG9wZXJhdGlvbiwgeyBzdGF0aXN0aWM6IFN0YXRzLlNVTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0cmFja2luZyBicm93c2VyIHVzZXIgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBtZXRyaWNcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IG1ldHJpYyBjb25maWd1cmF0aW9uOlxuICAgKiAtIG5hbWVzcGFjZTogJ0FXUy9CZWRyb2NrLUFnZW50Q29yZSdcbiAgICogLSBtZXRyaWNOYW1lOiBVc2VyRXJyb3JzXG4gICAqIEByZXR1cm5zIEEgQ2xvdWRXYXRjaCBNZXRyaWMgY29uZmlndXJlZCBmb3IgYnJvd3NlciB1c2VyIGVycm9yc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1VzZXJFcnJvcnNGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljRm9yQXBpT3BlcmF0aW9uKCdVc2VyRXJyb3JzJywgb3BlcmF0aW9uLCB7IHN0YXRpc3RpYzogU3RhdHMuU1VNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRyYWNraW5nIGJyb3dzZXIgc2Vzc2lvbiBkdXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBtZXRyaWMgY29uZmlndXJhdGlvbjpcbiAgICogLSBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnXG4gICAqIC0gbWV0cmljTmFtZTogRHVyYXRpb25cbiAgICogQHJldHVybnMgQSBDbG91ZFdhdGNoIE1ldHJpYyBjb25maWd1cmVkIGZvciBicm93c2VyIHNlc3Npb24gZHVyYXRpb25cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNTZXNzaW9uRHVyYXRpb24ocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0R1cmF0aW9uJywgeyBPcGVyYXRpb246ICdCcm93c2VyU2Vzc2lvbicgfSwgeyBzdGF0aXN0aWM6IFN0YXRzLkFWRVJBR0UsIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdHJhY2tpbmcgYnJvd3NlciB1c2VyIHRha2VvdmVycy5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBtZXRyaWMgY29uZmlndXJhdGlvbjpcbiAgICogLSBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnXG4gICAqIC0gbWV0cmljTmFtZTogVGFrZU92ZXJDb3VudFxuICAgKiBAcmV0dXJucyBBIENsb3VkV2F0Y2ggTWV0cmljIGNvbmZpZ3VyZWQgZm9yIGJyb3dzZXIgdXNlciB0YWtlb3ZlcnNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNUYWtlT3ZlckNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdUYWtlT3ZlckNvdW50Jywge30sIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdHJhY2tpbmcgYnJvd3NlciB1c2VyIHRha2VvdmVycyByZWxlYXNlZC5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBtZXRyaWMgY29uZmlndXJhdGlvbjpcbiAgICogLSBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnXG4gICAqIC0gbWV0cmljTmFtZTogVGFrZU92ZXJSZWxlYXNlQ291bnRcbiAgICogQHJldHVybnMgQSBDbG91ZFdhdGNoIE1ldHJpYyBjb25maWd1cmVkIGZvciBicm93c2VyIHVzZXIgdGFrZW92ZXJzIHJlbGVhc2VkXG4gICAqL1xuICBwdWJsaWMgbWV0cmljVGFrZU92ZXJSZWxlYXNlQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ1Rha2VPdmVyUmVsZWFzZUNvdW50Jywge30sIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdHJhY2tpbmcgYnJvd3NlciB1c2VyIHRha2VvdmVycyBkdXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBtZXRyaWMgY29uZmlndXJhdGlvbjpcbiAgICogLSBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnXG4gICAqIC0gbWV0cmljTmFtZTogVGFrZU92ZXJEdXJhdGlvblxuICAgKiBAcmV0dXJucyBBIENsb3VkV2F0Y2ggTWV0cmljIGNvbmZpZ3VyZWQgZm9yIGJyb3dzZXIgdXNlciB0YWtlb3ZlcnMgZHVyYXRpb25cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNUYWtlT3ZlckR1cmF0aW9uKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdUYWtlT3ZlckR1cmF0aW9uJywge30sIHsgc3RhdGlzdGljOiBTdGF0cy5BVkVSQUdFLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gY3JlYXRlIGEgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBtZXRyaWNcbiAgICogQHJldHVybnMgQSBDbG91ZFdhdGNoIE1ldHJpYyBjb25maWd1cmVkIGZvciBicm93c2VyIGFwaSBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGNvbmZpZ3VyZU1ldHJpYyhwcm9wczogTWV0cmljUHJvcHMpIHtcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHJlZ2lvbjogcHJvcHM/LnJlZ2lvbiA/PyB0aGlzLnN0YWNrLnJlZ2lvbixcbiAgICAgIGFjY291bnQ6IHByb3BzPy5hY2NvdW50ID8/IHRoaXMuc3RhY2suYWNjb3VudCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkaW5nIENvbmZpZ3VyYXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBSZWNvcmRpbmcgY29uZmlndXJhdGlvbiBmb3IgYnJvd3NlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGluZ0NvbmZpZyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHJlY29yZGluZyBpcyBlbmFibGVkXG4gICAqIEBkZWZhdWx0IC0gZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTMyBMb2NhdGlvbiBDb25maWd1cmF0aW9uXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBzM0xvY2F0aW9uPzogTG9jYXRpb247XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgUFJPUFMgRk9SIE5FVyBDT05TVFJVQ1RcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBCcm93c2VyIHJlc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJvd3NlckN1c3RvbVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBicm93c2VyXG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpXG4gICAqIFRoZSBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY2FuIGJlIHVwIHRvIDQ4IGNoYXJhY3RlcnMgbG9uZ1xuICAgKiBQYXR0ZXJuOiBbYS16QS1aXVthLXpBLVowLTlfXXswLDQ3fVxuICAgKiBAcmVxdWlyZWQgLSBZZXNcbiAgICovXG4gIHJlYWRvbmx5IGJyb3dzZXJDdXN0b21OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgYnJvd3NlclxuICAgKiBWYWxpZCBjaGFyYWN0ZXJzIGFyZSBhLXosIEEtWiwgMC05LCBfICh1bmRlcnNjb3JlKSwgLSAoaHlwaGVuKSBhbmQgc3BhY2VzXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBjYW4gaGF2ZSB1cCB0byAyMDAgY2hhcmFjdGVyc1xuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uXG4gICAqIEByZXF1aXJlZCAtIE5vXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogTmV0d29yayBjb25maWd1cmF0aW9uIGZvciBicm93c2VyXG4gICAqIEByZXF1aXJlZCAtIE5vXG4gICAqIEBkZWZhdWx0IC0gUFVCTElDIG5ldHdvcmsgbW9kZVxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya0NvbmZpZ3VyYXRpb24/OiBCcm93c2VyTmV0d29ya0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFJlY29yZGluZyBjb25maWd1cmF0aW9uIGZvciBicm93c2VyXG4gICAqIEByZXF1aXJlZCAtIE5vXG4gICAqIEBkZWZhdWx0IC0gTm8gcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlY29yZGluZ0NvbmZpZz86IFJlY29yZGluZ0NvbmZpZztcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIHRoYXQgcHJvdmlkZXMgcGVybWlzc2lvbnMgZm9yIHRoZSBicm93c2VyIHRvIGFjY2VzcyBBV1Mgc2VydmljZXNcbiAgICogQGRlZmF1bHQgLSBBIG5ldyByb2xlIHdpbGwgYmUgY3JlYXRlZFxuICAgKiBAcmVxdWlyZWQgLSBOb1xuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uUm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogVGFncyAob3B0aW9uYWwpXG4gICAqIEEgbGlzdCBvZiBrZXk6dmFsdWUgcGFpcnMgb2YgdGFncyB0byBhcHBseSB0byB0aGlzIEJyb3dzZXIgcmVzb3VyY2VcbiAgICpcbiAgICogQGRlZmF1bHQge30gLSBubyB0YWdzXG4gICAqIEByZXF1aXJlZCAtIE5vXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgYnJvd3NlciBzaWduaW5nIGlzIGVuYWJsZWQuXG4gICAqIFdoZW4gZW5hYmxlZCwgdGhlIGJyb3dzZXIgd2lsbCBjcnlwdG9ncmFwaGljYWxseSBzaWduXG4gICAqIEhUVFAgcmVxdWVzdHMgdG8gaWRlbnRpZnkgaXRzZWxmIGFzIGFuIEFJIGFnZW50IHRvIGJvdCBjb250cm9sIHZlbmRvcnMuXG4gICAqIEBkZWZhdWx0IC0gQnJvd3NlclNpZ25pbmcuRElTQUJMRURcbiAgICovXG4gIHJlYWRvbmx5IGJyb3dzZXJTaWduaW5nPzogQnJvd3NlclNpZ25pbmc7XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgIEFUVFJTIEZPUiBJTVBPUlRFRCBDT05TVFJVQ1RcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogQXR0cmlidXRlcyBmb3Igc3BlY2lmeWluZyBhbiBpbXBvcnRlZCBCcm93c2VyIEN1c3RvbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcm93c2VyQ3VzdG9tQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBhZ2VudC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgYnJvd3NlckFybjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgSUFNIHJvbGUgYXNzb2NpYXRlZCB0byB0aGUgYnJvd3Nlci5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybjogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGlzIGJyb3dzZXIgd2FzIGxhc3QgdXBkYXRlZC5cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIC0gTm8gbGFzdCB1cGRhdGVkIHRpbWVzdGFtcCBpcyBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIGJyb3dzZXIuXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vIHN0YXR1cyBpcyBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNyZWF0ZWQgdGltZXN0YW1wIG9mIHRoZSBicm93c2VyLlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBObyBjcmVhdGVkIHRpbWVzdGFtcCBpcyBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHNlY3VyaXR5IGdyb3VwcyBmb3IgdGhpcyBicm93c2VyLCBpZiBpbiBhIFZQQy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBCeSBkZWZhdWx0LCB0aGUgYnJvd3NlciBpcyBub3QgaW4gYSBWUEMuXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IGVjMi5JU2VjdXJpdHlHcm91cFtdO1xufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogQnJvd3NlciByZXNvdXJjZSBmb3IgQVdTIEJlZHJvY2sgQWdlbnQgQ29yZS5cbiAqIFByb3ZpZGVzIGEgYnJvd3NlciBlbnZpcm9ubWVudCBmb3Igd2ViIGF1dG9tYXRpb24gYW5kIGludGVyYWN0aW9uLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlL2xhdGVzdC9kZXZndWlkZS9icm93c2VyLmh0bWxcbiAqIEByZXNvdXJjZSBBV1M6OkJlZHJvY2tBZ2VudENvcmU6OkJyb3dzZXJDdXN0b21cbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIEJyb3dzZXJDdXN0b20gZXh0ZW5kcyBCcm93c2VyQ3VzdG9tQmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWJlZHJvY2stYWdlbnRjb3JlLWFscGhhLkJyb3dzZXJDdXN0b20nO1xuXG4gIC8qKlxuICAgKiBTdGF0aWMgTWV0aG9kIGZvciBpbXBvcnRpbmcgYW4gZXhpc3RpbmcgQmVkcm9jayBBZ2VudENvcmUgQnJvd3NlciBDdXN0b20uXG4gICAqL1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBCcm93c2VyIEN1c3RvbSByZWZlcmVuY2UgZnJvbSBhbiBleGlzdGluZyBicm93c2VyJ3MgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gaWQgLSBJZGVudGlmaWVyIG9mIHRoZSBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGF0dHJzIC0gQXR0cmlidXRlcyBvZiB0aGUgZXhpc3RpbmcgYnJvd3NlciBjdXN0b21cbiAgICogQHJldHVybnMgQW4gSUJyb3dzZXJDdXN0b20gcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZyBicm93c2VyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Ccm93c2VyQ3VzdG9tQXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogQnJvd3NlckN1c3RvbUF0dHJpYnV0ZXMpOiBJQnJvd3NlckN1c3RvbSB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQnJvd3NlckN1c3RvbUJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGJyb3dzZXJBcm4gPSBhdHRycy5icm93c2VyQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGJyb3dzZXJJZCA9IEFybi5zcGxpdChhdHRycy5icm93c2VyQXJuLCBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSkucmVzb3VyY2VOYW1lITtcbiAgICAgIHB1YmxpYyByZWFkb25seSBleGVjdXRpb25Sb2xlID0gaWFtLlJvbGUuZnJvbVJvbGVBcm4oc2NvcGUsIGAke2lkfVJvbGVgLCBhdHRycy5yb2xlQXJuKTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBsYXN0VXBkYXRlZEF0ID0gYXR0cnMubGFzdFVwZGF0ZWRBdDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbCA9IHRoaXMuZXhlY3V0aW9uUm9sZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXMgPSBhdHRycy5zdGF0dXM7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0ID0gYXR0cnMuY3JlYXRlZEF0O1xuXG4gICAgICBjb25zdHJ1Y3RvcihzOiBDb25zdHJ1Y3QsIGk6IHN0cmluZykge1xuICAgICAgICBzdXBlcihzLCBpKTtcblxuICAgICAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5leGVjdXRpb25Sb2xlIHx8IG5ldyBpYW0uVW5rbm93blByaW5jaXBhbCh7IHJlc291cmNlOiB0aGlzIH0pO1xuICAgICAgICBpZiAoYXR0cnMuc2VjdXJpdHlHcm91cHMpIHtcbiAgICAgICAgICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBlYzIuQ29ubmVjdGlvbnMoe1xuICAgICAgICAgICAgc2VjdXJpdHlHcm91cHM6IGF0dHJzLnNlY3VyaXR5R3JvdXBzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG5ldyBCcm93c2VyIEN1c3RvbVxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEF0dHJpYnV0ZXNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBicm93c2VyIHJlc291cmNlLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYnJvd3NlckFybjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBicm93c2VyXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBicm93c2VySWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBicm93c2VyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBicm93c2VyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbGFzdCB1cGRhdGVkIHRpbWVzdGFtcCBvZiB0aGUgYnJvd3NlclxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIGJyb3dzZXJcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjcmVhdGVkIHRpbWVzdGFtcCBvZiB0aGUgYnJvd3NlclxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGZhaWx1cmUgcmVhc29uIG9mIHRoZSBicm93c2VyXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmYWlsdXJlUmVhc29uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIElBTSByb2xlIGFzc29jaWF0ZWQgdG8gdGhlIGJyb3dzZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXhlY3V0aW9uUm9sZTogaWFtLklSb2xlO1xuICAvKipcbiAgICogVGFncyBhcHBsaWVkIHRvIHRoaXMgYnJvd3NlciByZXNvdXJjZVxuICAgKiBBIG1hcCBvZiBrZXktdmFsdWUgcGFpcnMgZm9yIHJlc291cmNlIHRhZ2dpbmdcbiAgICogQGRlZmF1bHQgLSBObyB0YWdzIGFwcGxpZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgLyoqXG4gICAqIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgcGVybWlzc2lvbnMgdG9cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG4gIC8qKlxuICAgKiBUaGUgbmV0d29yayBjb25maWd1cmF0aW9uIG9mIHRoZSBicm93c2VyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmV0d29ya0NvbmZpZ3VyYXRpb246IEJyb3dzZXJOZXR3b3JrQ29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSByZWNvcmRpbmcgY29uZmlndXJhdGlvbiBvZiB0aGUgYnJvd3NlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlY29yZGluZ0NvbmZpZz86IFJlY29yZGluZ0NvbmZpZztcbiAgLyoqXG4gICAqIFRoZSBicm93c2VyIHNpZ25pbmcgY29uZmlndXJhdGlvbiBvZiB0aGUgYnJvd3NlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJyb3dzZXJTaWduaW5nPzogQnJvd3NlclNpZ25pbmc7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBJbnRlcm5hbCBPbmx5XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBwcml2YXRlIHJlYWRvbmx5IF9fcmVzb3VyY2U6IGFnZW50X2NvcmUuQ2ZuQnJvd3NlckN1c3RvbTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ09OU1RSVUNUT1JcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCcm93c2VyQ3VzdG9tUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gU2V0IHByb3BlcnRpZXMgYW5kIGRlZmF1bHRzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgdGhpcy5uYW1lID0gcHJvcHMuYnJvd3NlckN1c3RvbU5hbWU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24gPSBwcm9wcy5uZXR3b3JrQ29uZmlndXJhdGlvbiA/PyBCcm93c2VyTmV0d29ya0NvbmZpZ3VyYXRpb24udXNpbmdQdWJsaWNOZXR3b3JrKCk7XG4gICAgdGhpcy5yZWNvcmRpbmdDb25maWcgPSBwcm9wcy5yZWNvcmRpbmdDb25maWcgPz8geyBlbmFibGVkOiBmYWxzZSB9O1xuICAgIHRoaXMuZXhlY3V0aW9uUm9sZSA9IHByb3BzLmV4ZWN1dGlvblJvbGUgPz8gdGhpcy5fY3JlYXRlQnJvd3NlclJvbGUoKTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5leGVjdXRpb25Sb2xlO1xuICAgIHRoaXMudGFncyA9IHByb3BzLnRhZ3M7XG4gICAgdGhpcy5icm93c2VyU2lnbmluZyA9IHByb3BzLmJyb3dzZXJTaWduaW5nID8/IEJyb3dzZXJTaWduaW5nLkRJU0FCTEVEO1xuXG4gICAgLy8gVmFsaWRhdGUgYnJvd3NlciBuYW1lXG4gICAgdGhyb3dJZkludmFsaWQodGhpcy5fdmFsaWRhdGVCcm93c2VyTmFtZSwgdGhpcy5uYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIGJyb3dzZXIgdGFnc1xuICAgIHRocm93SWZJbnZhbGlkKHRoaXMuX3ZhbGlkYXRlQnJvd3NlclRhZ3MsIHRoaXMudGFncyk7XG5cbiAgICAvLyBWYWxpZGF0ZSByZWNvcmRpbmcgY29uZmlndXJhdGlvblxuICAgIHRocm93SWZJbnZhbGlkKHRoaXMuX3ZhbGlkYXRlUmVjb3JkaW5nQ29uZmlnLCB0aGlzLnJlY29yZGluZ0NvbmZpZyk7XG5cbiAgICAvLyBOZXR3b3JrIGNvbmZpZ3VyYXRpb24gYW5kIHZhbGlkYXRpb24gaXMgZG9uZSBpbiB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uIGNsYXNzXG4gICAgLy8gU28gd2UgZG9uJ3QgbmVlZCB0byB2YWxpZGF0ZSBpdCBoZXJlXG5cbiAgICAvLyBTZXQgY29ubmVjdGlvbnMgLSBjcmVhdGUgYSBzaGFyZWQgY29ubmVjdGlvbnMgb2JqZWN0XG4gICAgaWYgKHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24uY29ubmVjdGlvbnMpIHtcbiAgICAgIC8vIFVzZSB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uJ3MgY29ubmVjdGlvbnMgYXMgdGhlIHNoYXJlZCBvYmplY3RcbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gdGhpcy5uZXR3b3JrQ29uZmlndXJhdGlvbi5jb25uZWN0aW9ucztcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDRk4gUHJvcHMgLSBXaXRoIExhenkgc3VwcG9ydFxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGNmblByb3BzOiBhZ2VudF9jb3JlLkNmbkJyb3dzZXJDdXN0b21Qcm9wcyA9IHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbmV0d29ya0NvbmZpZ3VyYXRpb246IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gdGhpcy5uZXR3b3JrQ29uZmlndXJhdGlvbi5fcmVuZGVyKHRoaXMuX2Nvbm5lY3Rpb25zKSB9KSxcbiAgICAgIHJlY29yZGluZ0NvbmZpZzogdGhpcy5fcmVuZGVyUmVjb3JkaW5nQ29uZmlnKCksXG4gICAgICBleGVjdXRpb25Sb2xlQXJuOiB0aGlzLmV4ZWN1dGlvblJvbGU/LnJvbGVBcm4sXG4gICAgICB0YWdzOiB0aGlzLnRhZ3MsXG4gICAgICBicm93c2VyU2lnbmluZzogdGhpcy5fcmVuZGVyQnJvd3NlclNpZ25pbmcoKSxcbiAgICB9O1xuXG4gICAgLy8gTDEgaW5zdGFudGlhdGlvblxuICAgIHRoaXMuX19yZXNvdXJjZSA9IG5ldyBhZ2VudF9jb3JlLkNmbkJyb3dzZXJDdXN0b20odGhpcywgJ1Jlc291cmNlJywgY2ZuUHJvcHMpO1xuXG4gICAgLy8gR2V0IGF0dHJpYnV0ZXMgZGlyZWN0bHkgZnJvbSB0aGUgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2VcbiAgICB0aGlzLmJyb3dzZXJJZCA9IHRoaXMuX19yZXNvdXJjZS5hdHRyQnJvd3NlcklkO1xuICAgIHRoaXMuYnJvd3NlckFybiA9IHRoaXMuX19yZXNvdXJjZS5hdHRyQnJvd3NlckFybjtcbiAgICB0aGlzLnN0YXR1cyA9IHRoaXMuX19yZXNvdXJjZS5hdHRyU3RhdHVzO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gdGhpcy5fX3Jlc291cmNlLmF0dHJDcmVhdGVkQXQ7XG4gICAgdGhpcy5sYXN0VXBkYXRlZEF0ID0gdGhpcy5fX3Jlc291cmNlLmF0dHJMYXN0VXBkYXRlZEF0O1xuICAgIHRoaXMuZmFpbHVyZVJlYXNvbiA9IHRoaXMuX19yZXNvdXJjZS5hdHRyRmFpbHVyZVJlYXNvbjtcblxuICAgIC8vIGlmIHJlY29yZGluZyBpcyBjb25maWd1cmVkLCBhZGQgcGVybWlzc2lvbnMgdG8gdGhlIGV4ZWN1dGlvbiByb2xlXG4gICAgaWYgKHRoaXMucmVjb3JkaW5nQ29uZmlnICYmIHRoaXMucmVjb3JkaW5nQ29uZmlnLnMzTG9jYXRpb24pIHtcbiAgICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHRoaXMucmVjb3JkaW5nQ29uZmlnLnMzTG9jYXRpb24uYnVja2V0TmFtZSkpIHtcbiAgICAgICAgU3RhY2sub2YodGhpcykucmVzb2x2ZSh0aGlzLnJlY29yZGluZ0NvbmZpZy5zM0xvY2F0aW9uLmJ1Y2tldE5hbWUpO1xuICAgICAgfVxuICAgICAgY29uc3QgYnVja2V0ID0gczMuQnVja2V0LmZyb21CdWNrZXROYW1lKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHt0aGlzLm5hbWV9UmVjb3JkaW5nQnVja2V0YCxcbiAgICAgICAgdGhpcy5yZWNvcmRpbmdDb25maWcuczNMb2NhdGlvbi5idWNrZXROYW1lLFxuICAgICAgKTtcbiAgICAgIC8vIEVuc3VyZSB0aGUgcG9saWN5IGlzIGFwcGxpZWQgYmVmb3JlIHRoZSBicm93c2VyIHJlc291cmNlIGlzIGNyZWF0ZWRcbiAgICAgIGNvbnN0IGdyYW50ID0gYnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuZXhlY3V0aW9uUm9sZSk7XG4gICAgICBncmFudC5hcHBseUJlZm9yZSh0aGlzLl9fcmVzb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHJlY29yZGluZyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBSZWNvcmRpbmdDb25maWdQcm9wZXJ0eSBvYmplY3QgaW4gQ2xvdWRGb3JtYXRpb24gZm9ybWF0LCBvciB1bmRlZmluZWQgaWYgbm8gcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gaXMgZGVmaW5lZFxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZCBpZiBubyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiBpcyBwcm92aWRlZFxuICAgKiBAaW50ZXJuYWwgVGhpcyBpcyBhbiBpbnRlcm5hbCBjb3JlIGZ1bmN0aW9uIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS5cbiAgICovXG4gIHByaXZhdGUgX3JlbmRlclJlY29yZGluZ0NvbmZpZygpOiBhZ2VudF9jb3JlLkNmbkJyb3dzZXJDdXN0b20uUmVjb3JkaW5nQ29uZmlnUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlY29yZGluZ0NvbmZpZyA/IHtcbiAgICAgIGVuYWJsZWQ6IHRoaXMucmVjb3JkaW5nQ29uZmlnLmVuYWJsZWQsXG4gICAgICBzM0xvY2F0aW9uOiB0aGlzLnJlY29yZGluZ0NvbmZpZy5zM0xvY2F0aW9uID8ge1xuICAgICAgICBidWNrZXQ6IHRoaXMucmVjb3JkaW5nQ29uZmlnLnMzTG9jYXRpb24uYnVja2V0TmFtZSxcbiAgICAgICAgcHJlZml4OiB0aGlzLnJlY29yZGluZ0NvbmZpZy5zM0xvY2F0aW9uLm9iamVjdEtleSxcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgfSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGJyb3dzZXIgc2lnbmluZyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBCcm93c2VyU2lnbmluZ1Byb3BlcnR5IG9iamVjdCBpbiBDbG91ZEZvcm1hdGlvbiBmb3JtYXQsIG9yIHVuZGVmaW5lZCBpZiBubyBicm93c2VyIHNpZ25pbmcgY29uZmlndXJhdGlvbiBpcyBkZWZpbmVkXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkIGlmIG5vIGJyb3dzZXIgc2lnbmluZyBjb25maWd1cmF0aW9uIGlzIHByb3ZpZGVkXG4gICAqIEBpbnRlcm5hbCBUaGlzIGlzIGFuIGludGVybmFsIGNvcmUgZnVuY3Rpb24gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVuZGVyQnJvd3NlclNpZ25pbmcoKTogYWdlbnRfY29yZS5DZm5Ccm93c2VyQ3VzdG9tLkJyb3dzZXJTaWduaW5nUHJvcGVydHkge1xuICAgIHJldHVybiB0aGlzLmJyb3dzZXJTaWduaW5nID09PSBCcm93c2VyU2lnbmluZy5FTkFCTEVEID8ge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICB9IDoge1xuICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGV4ZWN1dGlvbiByb2xlIG5lZWRlZCBmb3IgdGhlIGJyb3dzZXIgdG8gYWNjZXNzIEFXUyBzZXJ2aWNlc1xuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCByb2xlXG4gICAqIEBpbnRlcm5hbCBUaGlzIGlzIGFuIGludGVybmFsIGNvcmUgZnVuY3Rpb24gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlQnJvd3NlclJvbGUoKTogaWFtLklSb2xlIHtcbiAgICBjb25zdCByb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdTZXJ2aWNlUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdiZWRyb2NrLWFnZW50Y29yZS5hbWF6b25hd3MuY29tJyksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcm9sZTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBWYWxpZGF0b3JzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBicm93c2VyIG5hbWUgZm9ybWF0XG4gICAqIEBwYXJhbSBuYW1lIFRoZSBicm93c2VyIG5hbWUgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcywgZW1wdHkgaWYgdmFsaWRcbiAgICovXG4gIHByaXZhdGUgX3ZhbGlkYXRlQnJvd3Nlck5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZ0ZpZWxkTGVuZ3RoKHtcbiAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgZmllbGROYW1lOiAnQnJvd3NlciBuYW1lJyxcbiAgICAgIG1pbkxlbmd0aDogQlJPV1NFUl9OQU1FX01JTl9MRU5HVEgsXG4gICAgICBtYXhMZW5ndGg6IEJST1dTRVJfTkFNRV9NQVhfTEVOR1RILFxuICAgIH0pKTtcblxuICAgIC8vIENoZWNrIGlmIG5hbWUgbWF0Y2hlcyB0aGUgQVdTIEFQSSBwYXR0ZXJuOiBbYS16QS1aXVthLXpBLVowLTlfXXswLDQ3fVxuICAgIC8vIE11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciwgZm9sbG93ZWQgYnkgdXAgdG8gNDcgbGV0dGVycywgbnVtYmVycywgb3IgdW5kZXJzY29yZXNcbiAgICBjb25zdCB2YWxpZE5hbWVQYXR0ZXJuID0gL15bYS16QS1aXVthLXpBLVowLTlfXXswLDQ3fSQvO1xuICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRmllbGRQYXR0ZXJuKG5hbWUsICdCcm93c2VyIG5hbWUnLCB2YWxpZE5hbWVQYXR0ZXJuKSk7XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGJyb3dzZXIgdGFncyBmb3JtYXRcbiAgICogQHBhcmFtIHRhZ3MgVGhlIHRhZ3Mgb2JqZWN0IHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMsIGVtcHR5IGlmIHZhbGlkXG4gICAqL1xuICBwcml2YXRlIF92YWxpZGF0ZUJyb3dzZXJUYWdzID0gKHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogc3RyaW5nW10gPT4ge1xuICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKCF0YWdzKSB7XG4gICAgICByZXR1cm4gZXJyb3JzOyAvLyBUYWdzIGFyZSBvcHRpb25hbFxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggdGFnIGtleSBhbmQgdmFsdWVcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YWdzKSkge1xuICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmdGaWVsZExlbmd0aCh7XG4gICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgIGZpZWxkTmFtZTogJ1RhZyBrZXknLFxuICAgICAgICBtaW5MZW5ndGg6IEJST1dTRVJfVEFHX01JTl9MRU5HVEgsXG4gICAgICAgIG1heExlbmd0aDogQlJPV1NFUl9UQUdfTUFYX0xFTkdUSCxcbiAgICAgIH0pKTtcblxuICAgICAgLy8gVmFsaWRhdGUgdGFnIGtleSBwYXR0ZXJuOiBeW2EtekEtWjAtOVxccy5fOi89K0AtXSokXG4gICAgICBjb25zdCB2YWxpZEtleVBhdHRlcm4gPSAvXlthLXpBLVowLTlcXHMuXzovPStALV0qJC87XG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZUZpZWxkUGF0dGVybihrZXksICdUYWcga2V5JywgdmFsaWRLZXlQYXR0ZXJuKSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRhZyB2YWx1ZVxuICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmdGaWVsZExlbmd0aCh7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgZmllbGROYW1lOiAnVGFnIHZhbHVlJyxcbiAgICAgICAgbWluTGVuZ3RoOiBCUk9XU0VSX1RBR19NSU5fTEVOR1RILFxuICAgICAgICBtYXhMZW5ndGg6IEJST1dTRVJfVEFHX01BWF9MRU5HVEgsXG4gICAgICB9KSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRhZyB2YWx1ZSBwYXR0ZXJuOiBeW2EtekEtWjAtOVxccy5fOi89K0AtXSokXG4gICAgICBjb25zdCB2YWxpZFZhbHVlUGF0dGVybiA9IC9eW2EtekEtWjAtOVxccy5fOi89K0AtXSokLztcbiAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRmllbGRQYXR0ZXJuKHZhbHVlLCAnVGFnIHZhbHVlJywgdmFsaWRWYWx1ZVBhdHRlcm4pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHJlY29yZGluZyBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSByZWNvcmRpbmdDb25maWcgVGhlIHJlY29yZGluZyBjb25maWd1cmF0aW9uIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMsIGVtcHR5IGlmIHZhbGlkXG4gICAqL1xuICBwcml2YXRlIF92YWxpZGF0ZVJlY29yZGluZ0NvbmZpZyA9IChyZWNvcmRpbmdDb25maWc/OiBSZWNvcmRpbmdDb25maWcpOiBzdHJpbmdbXSA9PiB7XG4gICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIXJlY29yZGluZ0NvbmZpZykge1xuICAgICAgcmV0dXJuIGVycm9yczsgLy8gTm8gdmFsaWRhdGlvbiBuZWVkZWQgaWYgbm8gcmVjb3JkaW5nIGNvbmZpZyBpcyBwcm92aWRlZFxuICAgIH1cblxuICAgIGNvbnN0IHMzTG9jYXRpb24gPSByZWNvcmRpbmdDb25maWcuczNMb2NhdGlvbjtcblxuICAgIC8vIE9ubHkgdmFsaWRhdGUgUzMgbG9jYXRpb24gaWYgaXQncyBhY3R1YWxseSBwcm92aWRlZFxuICAgIGlmIChzM0xvY2F0aW9uKSB7XG4gICAgICAvLyBCb3RoIGJ1Y2tldCBuYW1lIGFuZCBvYmplY3Qga2V5IGFyZSByZXF1aXJlZCB3aGVuIFMzIGxvY2F0aW9uIGlzIHByb3ZpZGVkXG4gICAgICBpZiAoIXMzTG9jYXRpb24uYnVja2V0TmFtZSkge1xuICAgICAgICBlcnJvcnMucHVzaCgnUzMgYnVja2V0IG5hbWUgaXMgcmVxdWlyZWQgd2hlbiBTMyBsb2NhdGlvbiBpcyBwcm92aWRlZCBmb3IgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGJ1Y2tldCBuYW1lIHBhdHRlcm46IF5bYS16MC05XVthLXowLTkuLV17MSw2MX1bYS16MC05XSRcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZVBhdHRlcm4gPSAvXlthLXowLTldW2EtejAtOS4tXXsxLDYxfVthLXowLTldJC87XG4gICAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRmllbGRQYXR0ZXJuKHMzTG9jYXRpb24uYnVja2V0TmFtZSwgJ1MzIGJ1Y2tldCBuYW1lJywgYnVja2V0TmFtZVBhdHRlcm4pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzM0xvY2F0aW9uLm9iamVjdEtleSkge1xuICAgICAgICBlcnJvcnMucHVzaCgnUzMgb2JqZWN0IGtleSAocHJlZml4KSBpcyByZXF1aXJlZCB3aGVuIFMzIGxvY2F0aW9uIGlzIHByb3ZpZGVkIGZvciByZWNvcmRpbmcgY29uZmlndXJhdGlvbicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH07XG59XG4iXX0=