eoapi-cdk 11.2.0 → 11.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -4300,7 +4300,7 @@
4300
4300
  "kind": "interface",
4301
4301
  "locationInModule": {
4302
4302
  "filename": "lib/database/index.ts",
4303
- "line": 442
4303
+ "line": 462
4304
4304
  },
4305
4305
  "name": "DatabaseParameters",
4306
4306
  "properties": [
@@ -4313,7 +4313,7 @@
4313
4313
  "immutable": true,
4314
4314
  "locationInModule": {
4315
4315
  "filename": "lib/database/index.ts",
4316
- "line": 458
4316
+ "line": 478
4317
4317
  },
4318
4318
  "name": "effectiveCacheSize",
4319
4319
  "type": {
@@ -4329,7 +4329,7 @@
4329
4329
  "immutable": true,
4330
4330
  "locationInModule": {
4331
4331
  "filename": "lib/database/index.ts",
4332
- "line": 468
4332
+ "line": 488
4333
4333
  },
4334
4334
  "name": "maintenanceWorkMem",
4335
4335
  "type": {
@@ -4345,7 +4345,7 @@
4345
4345
  "immutable": true,
4346
4346
  "locationInModule": {
4347
4347
  "filename": "lib/database/index.ts",
4348
- "line": 446
4348
+ "line": 466
4349
4349
  },
4350
4350
  "name": "maxConnections",
4351
4351
  "type": {
@@ -4361,7 +4361,7 @@
4361
4361
  "immutable": true,
4362
4362
  "locationInModule": {
4363
4363
  "filename": "lib/database/index.ts",
4364
- "line": 473
4364
+ "line": 493
4365
4365
  },
4366
4366
  "name": "maxLocksPerTransaction",
4367
4367
  "type": {
@@ -4377,7 +4377,7 @@
4377
4377
  "immutable": true,
4378
4378
  "locationInModule": {
4379
4379
  "filename": "lib/database/index.ts",
4380
- "line": 488
4380
+ "line": 508
4381
4381
  },
4382
4382
  "name": "randomPageCost",
4383
4383
  "type": {
@@ -4393,7 +4393,7 @@
4393
4393
  "immutable": true,
4394
4394
  "locationInModule": {
4395
4395
  "filename": "lib/database/index.ts",
4396
- "line": 483
4396
+ "line": 503
4397
4397
  },
4398
4398
  "name": "seqPageCost",
4399
4399
  "type": {
@@ -4410,7 +4410,7 @@
4410
4410
  "immutable": true,
4411
4411
  "locationInModule": {
4412
4412
  "filename": "lib/database/index.ts",
4413
- "line": 453
4413
+ "line": 473
4414
4414
  },
4415
4415
  "name": "sharedBuffers",
4416
4416
  "type": {
@@ -4426,7 +4426,7 @@
4426
4426
  "immutable": true,
4427
4427
  "locationInModule": {
4428
4428
  "filename": "lib/database/index.ts",
4429
- "line": 478
4429
+ "line": 498
4430
4430
  },
4431
4431
  "name": "tempBuffers",
4432
4432
  "type": {
@@ -4442,7 +4442,7 @@
4442
4442
  "immutable": true,
4443
4443
  "locationInModule": {
4444
4444
  "filename": "lib/database/index.ts",
4445
- "line": 463
4445
+ "line": 483
4446
4446
  },
4447
4447
  "name": "workMem",
4448
4448
  "type": {
@@ -5208,7 +5208,7 @@
5208
5208
  "immutable": true,
5209
5209
  "locationInModule": {
5210
5210
  "filename": "lib/database/index.ts",
5211
- "line": 396
5211
+ "line": 416
5212
5212
  },
5213
5213
  "name": "addPatchManager",
5214
5214
  "optional": true,
@@ -5244,7 +5244,7 @@
5244
5244
  "immutable": true,
5245
5245
  "locationInModule": {
5246
5246
  "filename": "lib/database/index.ts",
5247
- "line": 420
5247
+ "line": 440
5248
5248
  },
5249
5249
  "name": "bootstrapperLambdaFunctionOptions",
5250
5250
  "optional": true,
@@ -5262,7 +5262,7 @@
5262
5262
  "immutable": true,
5263
5263
  "locationInModule": {
5264
5264
  "filename": "lib/database/index.ts",
5265
- "line": 411
5265
+ "line": 431
5266
5266
  },
5267
5267
  "name": "customResourceProperties",
5268
5268
  "optional": true,
@@ -5286,7 +5286,7 @@
5286
5286
  "immutable": true,
5287
5287
  "locationInModule": {
5288
5288
  "filename": "lib/database/index.ts",
5289
- "line": 439
5289
+ "line": 459
5290
5290
  },
5291
5291
  "name": "forceBootstrap",
5292
5292
  "optional": true,
@@ -5304,7 +5304,7 @@
5304
5304
  "immutable": true,
5305
5305
  "locationInModule": {
5306
5306
  "filename": "lib/database/index.ts",
5307
- "line": 403
5307
+ "line": 423
5308
5308
  },
5309
5309
  "name": "maintenanceWindow",
5310
5310
  "optional": true,
@@ -5312,6 +5312,25 @@
5312
5312
  "fqn": "aws-cdk-lib.aws_ssm.CfnMaintenanceWindow"
5313
5313
  }
5314
5314
  },
5315
+ {
5316
+ "abstract": true,
5317
+ "docs": {
5318
+ "default": "/aws/service/canonical/ubuntu/server/noble/stable/20260218/amd64/hvm/ebs-gp3/ami-id",
5319
+ "remarks": "Defaults to the latest Ubuntu Noble AMI (`current`). For stable deployments\nwhere EC2 replacement should only happen on explicit intent, pin this to a\nspecific date-versioned path:\n /aws/service/canonical/ubuntu/server/noble/stable/YYYYMMDD.X/amd64/hvm/ebs-gp3/ami-id\n\nTo list available date-versioned paths in your region:\n aws ssm get-parameters-by-path --path \"/aws/service/canonical/ubuntu/server/noble/stable/\" --recursive --query \"Parameters[?ends_with(Name, 'amd64/hvm/ebs-gp3/ami-id')].Name\"\n\nSee: https://documentation.ubuntu.com/aws/aws-how-to/instances/find-ubuntu-images/\n\nWith addPatchManager: true (default), SSM Patch Manager handles OS security\nupdates without requiring instance replacement.",
5320
+ "stability": "experimental",
5321
+ "summary": "SSM parameter path for the PgBouncer EC2 instance machine image (AMI)."
5322
+ },
5323
+ "immutable": true,
5324
+ "locationInModule": {
5325
+ "filename": "lib/database/index.ts",
5326
+ "line": 408
5327
+ },
5328
+ "name": "pgbouncerAmiSsmParameter",
5329
+ "optional": true,
5330
+ "type": {
5331
+ "primitive": "string"
5332
+ }
5333
+ },
5315
5334
  {
5316
5335
  "abstract": true,
5317
5336
  "docs": {
@@ -7980,6 +7999,6 @@
7980
7999
  "symbolId": "lib/titiler-pgstac-api/index:TitilerPgstacApiLambdaRuntimeProps"
7981
8000
  }
7982
8001
  },
7983
- "version": "11.2.0",
7984
- "fingerprint": "JuwPzjBJm9a2qm2mtbn1VcIh2bNOUOkdLb5kF9v932s="
8002
+ "version": "11.3.1",
8003
+ "fingerprint": "te+s2VXr/r9dyNnAEBlk66pcgb7rMGXcqJypR7IwGVc="
7985
8004
  }
@@ -158,5 +158,5 @@ class BastionHost extends constructs_1.Construct {
158
158
  }
159
159
  exports.BastionHost = BastionHost;
160
160
  _a = JSII_RTTI_SYMBOL_1;
161
- BastionHost[_a] = { fqn: "eoapi-cdk.BastionHost", version: "11.2.0" };
161
+ BastionHost[_a] = { fqn: "eoapi-cdk.BastionHost", version: "11.3.1" };
162
162
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQU1xQjtBQUNyQiwyQ0FBdUM7QUFFdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpR0c7QUFDSCxNQUFhLFdBQVksU0FBUSxzQkFBUztJQUd4QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVCO1FBQy9ELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXJDLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUkscUJBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUNyRCxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7WUFDZCxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUscUJBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQ2pELFlBQVksRUFBRSxHQUFHLFNBQVMsZUFBZTtZQUN6QyxZQUFZLEVBQUUscUJBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUMvQixxQkFBRyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsRUFDckMscUJBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUN0QjtZQUNELFlBQVksRUFBRSxxQkFBRyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQztnQkFDL0MsVUFBVSxFQUFFLHFCQUFHLENBQUMscUJBQXFCLENBQUMsY0FBYztnQkFDcEQsT0FBTyxFQUFFLHFCQUFHLENBQUMsa0JBQWtCLENBQUMsTUFBTTthQUN2QyxDQUFDO1lBQ0YsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLHlCQUF5QixFQUFFLElBQUk7U0FDaEMsQ0FBQyxDQUFDO1FBRUgsb0JBQW9CO1FBQ3BCLElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQyxJQUFJLHFCQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7Z0JBQ3pCLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVU7Z0JBQ3BDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7YUFDMUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQy9CLEtBQUssQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFDdEMscUJBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUNsQixvQ0FBb0MsQ0FDckMsQ0FBQztRQUVGLGtDQUFrQztRQUNsQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQ2pDLHFCQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDbkIscUJBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQ2pDLFlBQVksQ0FDYixDQUFDO1FBQ0osQ0FBQztRQUVELHFCQUFxQjtRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FDM0IsSUFBSSxxQkFBRyxDQUFDLGVBQWUsQ0FBQztZQUN0QixPQUFPLEVBQUU7Z0JBQ1AsZUFBZTtnQkFDZiwrQkFBK0I7Z0JBQy9CLGVBQWU7YUFDaEI7WUFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7U0FDakIsQ0FBQyxDQUNILENBQUM7UUFFRixJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1lBQ3hDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVU7WUFDL0IsVUFBVSxFQUFFLEdBQUcsU0FBUyxjQUFjO1NBQ3ZDLENBQUMsQ0FBQztRQUNILElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsMkJBQTJCLEVBQUU7WUFDL0MsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO1lBQ3JDLFVBQVUsRUFBRSxHQUFHLFNBQVMscUJBQXFCO1NBQzlDLENBQUMsQ0FBQztRQUNILElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsaUNBQWlDLEVBQUU7WUFDckQsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCO1lBQzFDLFVBQVUsRUFBRSxHQUFHLFNBQVMsa0JBQWtCO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBekVILGtDQTBFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFN0YWNrLFxuICBhd3NfZWMyIGFzIGVjMixcbiAgYXdzX2lhbSBhcyBpYW0sXG4gIGF3c19yZHMgYXMgcmRzLFxuICBDZm5PdXRwdXQsXG59IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLyoqXG4gKiBUaGUgZGF0YWJhc2UgaXMgbG9jYXRlZCBpbiBhbiBpc29sYXRlZCBzdWJuZXQsIG1lYW5pbmcgdGhhdCBpdCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBwdWJsaWMgaW50ZXJuZXQuIEFzIHN1Y2gsIHRvIGludGVyYWN0IHdpdGggdGhlIGRhdGFiYXNlIGRpcmVjdGx5LCBhIHVzZXIgbXVzdCB0dW5uZWwgdGhyb3VnaCBhIGJhc3Rpb24gaG9zdC5cbiAqXG4gKiAjIyMgQ29uZmlndXJpbmdcbiAqXG4gKiBUaGlzIGNvZGViYXNlIGNvbnRyb2xzIF93aG9fIGlzIGFsbG93ZWQgdG8gY29ubmVjdCB0byB0aGUgYmFzdGlvbiBob3N0LiBUaGlzIHJlcXVpcmVzIHR3byBzdGVwczpcbiAqXG4gKiAxLiBBZGRpbmcgdGhlIElQIGFkZHJlc3MgZnJvbSB3aGljaCB5b3UgYXJlIGNvbm5lY3RpbmcgdG8gdGhlIGBpcHY0QWxsb3dsaXN0YCBhcnJheVxuICogMS4gQ3JlYXRpbmcgYSBiYXN0aW9uIGhvc3Qgc3lzdGVtIHVzZXIgYnkgYWRkaW5nIHRoZSB1c2VyJ3MgY29uZmlndXJhdGlvbiBpbmZvcm0gdG8gYHVzZXJkYXRhLnlhbWxgXG4gKlxuICogIyMjIyBBZGRpbmcgYW4gSVAgYWRkcmVzcyB0byB0aGUgYGlwdjRBbGxvd2xpc3RgIGFycmF5XG4gKlxuICogVGhlIGBCYXN0aW9uSG9zdGAgY29uc3RydWN0IHRha2VzIGluIGFuIGBpcHY0QWxsb3dsaXN0YCBhcnJheSBhcyBhbiBhcmd1bWVudC4gRmluZCB5b3VyIElQIGFkZHJlc3MgKGVnIGBjdXJsIGFwaS5pcGlmeS5vcmdgKSBhbmQgYWRkIHRoYXQgdG8gdGhlIGFycmF5IGFsb25nIHdpdGggdGhlIHRyYWlsaW5nIENJRFIgYmxvY2sgKGxpa2VseSBgLzMyYCB0byBpbmRpY2F0ZSB0aGF0IHlvdSBhcmUgYWRkaW5nIGEgc2luZ2xlIElQIGFkZHJlc3MpLlxuICpcbiAqICMjIyMgQ3JlYXRpbmcgYSB1c2VyIHZpYSBgdXNlcmRhdGEueWFtbGBcbiAqXG4gKiBBZGQgYW4gZW50cnkgdG8gdGhlIGB1c2Vyc2AgYXJyYXkgd2l0aCBhIHVzZXJuYW1lIChsaWtlbHkgbWF0Y2hpbmcgeW91ciBsb2NhbCBzeXN0ZW1zIHVzZXJuYW1lLCB3aGljaCB5b3UgY2FuIGdldCBieSBydW5uaW5nIHRoZSBgd2hvYW1pYCBjb21tYW5kIGluIHlvdXIgdGVybWluYWwpIGFuZCBhIHB1YmxpYyBrZXkgKGxpa2VseSB5b3VyIGRlZmF1bHQgcHVibGljIGtleSwgd2hpY2ggeW91IGNhbiBnZXQgYnkgcnVubmluZyBgY2F0IH4vLnNzaC9pZF8qLnB1YmAgaW4geW91ciB0ZXJtaW5hbCkuXG4gKlxuICogIyMjIyBUaXBzICYgVHJpY2tzIHdoZW4gdXNpbmcgdGhlIEJhc3Rpb24gSG9zdFxuICpcbiAqICoqQ29ubmVjdGluZyB0byBSRFMgSW5zdGFuY2UgdmlhIFNTTSoqXG4gKlxuICogYGBgc2hcbiAqIGF3cyBzc20gc3RhcnQtc2Vzc2lvbiAtLXRhcmdldCAkSU5TVEFOQ0VfSUQgXFxcbiAqIC0tZG9jdW1lbnQtbmFtZSBBV1MtU3RhcnRQb3J0Rm9yd2FyZGluZ1Nlc3Npb25Ub1JlbW90ZUhvc3QgXFxcbiAqIC0tcGFyYW1ldGVycyAne1xuICogXCJob3N0XCI6IFtcbiAqIFwiZXhhbXBsZS1kYi5jNWFiY2RlZmdoaWoudXMtd2VzdC0yLnJkcy5hbWF6b25hd3MuY29tXCJcbiAqIF0sXG4gKiBcInBvcnROdW1iZXJcIjogW1xuICogXCI1NDMyXCJcbiAqIF0sXG4gKiBcImxvY2FsUG9ydE51bWJlclwiOiBbXG4gKiBcIjk5OTlcIlxuICogXVxuICogfScgXFxcbiAqIC0tcHJvZmlsZSAkQVdTX1BST0ZJTEVcbiAqIGBgYFxuICpcbiAqIGBgYHNoXG4gKiBwc3FsIC1oIGxvY2FsaG9zdCAtcCA5OTk5ICMgY29udGludWUgYWRkaW5nIHVzZXJuYW1lICgtVSkgYW5kIGRiICgtZCkgaGVyZS4uLlxuICogYGBgXG4gKlxuICogQ29ubmVjdCBkaXJlY3RseSB0byBCYXN0aW9uIEhvc3Q6XG4gKlxuICogYGBgc2hcbiAqIGF3cyBzc20gc3RhcnQtc2Vzc2lvbiAtLXRhcmdldCAkSU5TVEFOQ0VfSUQgLS1wcm9maWxlICRBV1NfUFJPRklMRVxuICogYGBgXG4gKlxuICogKipTZXR0aW5nIHVwIGFuIFNTSCB0dW5uZWwqKlxuICpcbiAqIEluIHlvdXIgYH4vLnNzaC9jb25maWdgIGZpbGUsIGFkZCBhbiBlbnRyeSBsaWtlOlxuICpcbiAqIGBgYFxuICogSG9zdCBkYi10dW5uZWxcbiAqIEhvc3RuYW1lIHt0aGUtYmFzdGlvbi1ob3N0LWFkZHJlc3N9XG4gKiBMb2NhbEZvcndhcmQgOTk5OSB7dGhlLWRiLWhvc3RuYW1lfTo1NDMyXG4gKiBgYGBcbiAqXG4gKiBUaGVuIGEgdHVubmVsIGNhbiBiZSBvcGVuZWQgdmlhOlxuICpcbiAqIGBgYFxuICogc3NoIC1OIGRiLXR1bm5lbFxuICogYGBgXG4gKlxuICogQW5kIGEgY29ubmVjdGlvbiB0byB0aGUgREIgY2FuIGJlIG1hZGUgdmlhOlxuICpcbiAqIGBgYFxuICogcHNxbCAtaCAxMjcuMC4wLjEgLXAgOTk5OSAtVSB7dXNlcm5hbWV9IC1kIHtkYXRhYmFzZX1cbiAqIGBgYFxuICpcbiAqICoqSGFuZGxpbmcgYFJFTU9URSBIT1NUIElERU5USUZJQ0FUSU9OIEhBUyBDSEFOR0VEIWAgZXJyb3IqKlxuICpcbiAqIElmIHlvdSd2ZSByZWRlcGxveWVkIGEgYmFzdGlvbiBob3N0IHRoYXQgeW91J3ZlIHByZXZpb3VzbHkgY29ubmVjdGVkIHRvLCB5b3UgbWF5IHNlZSBhbiBlcnJvciBsaWtlOlxuICpcbiAqIGBgYFxuICogQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBcbiAqIEAgICAgV0FSTklORzogUkVNT1RFIEhPU1QgSURFTlRJRklDQVRJT04gSEFTIENIQU5HRUQhICAgICBAXG4gKiBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFxuICogSVQgSVMgUE9TU0lCTEUgVEhBVCBTT01FT05FIElTIERPSU5HIFNPTUVUSElORyBOQVNUWSFcbiAqIFNvbWVvbmUgY291bGQgYmUgZWF2ZXNkcm9wcGluZyBvbiB5b3UgcmlnaHQgbm93IChtYW4taW4tdGhlLW1pZGRsZSBhdHRhY2spIVxuICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0aGF0IGEgaG9zdCBrZXkgaGFzIGp1c3QgYmVlbiBjaGFuZ2VkLlxuICogVGhlIGZpbmdlcnByaW50IGZvciB0aGUgRUNEU0Ega2V5IHNlbnQgYnkgdGhlIHJlbW90ZSBob3N0IGlzXG4gKiBTSEEyNTY6bVBueEFPWFRwYjA2UEZnSTFRYzhUTVEyZTliN2dvVTh5Mk5kUzVoeklyOC5cbiAqIFBsZWFzZSBjb250YWN0IHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IuXG4gKiBBZGQgY29ycmVjdCBob3N0IGtleSBpbiAvVXNlcnMvdXNlcm5hbWUvLnNzaC9rbm93bl9ob3N0cyB0byBnZXQgcmlkIG9mIHRoaXMgbWVzc2FnZS5cbiAqIE9mZmVuZGluZyBFQ0RTQSBrZXkgaW4gL1VzZXJzL3VzZXJuYW1lLy5zc2gva25vd25faG9zdHM6MjhcbiAqIEVDRFNBIGhvc3Qga2V5IGZvciBlYzItMTItMzQtNTYtNzg5LnVzLXdlc3QtMi5jb21wdXRlLmFtYXpvbmF3cy5jb20gaGFzIGNoYW5nZWQgYW5kIHlvdSBoYXZlIHJlcXVlc3RlZCBzdHJpY3QgY2hlY2tpbmcuXG4gKiBIb3N0IGtleSB2ZXJpZmljYXRpb24gZmFpbGVkLlxuICogYGBgXG4gKlxuICogVGhpcyBpcyBkdWUgdG8gdGhlIHNlcnZlcidzIGZpbmdlcnByaW50IGNoYW5naW5nLiBXZSBjYW4gc2NydWIgdGhlIGZpbmdlcnByaW50IGZyb20gb3VyIHN5c3RlbSB3aXRoIGEgY29tbWFuZCBsaWtlOlxuICpcbiAqIGBgYFxuICogc3NoLWtleWdlbiAtUiAxMi4zNC41Ni43ODlcbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEJhc3Rpb25Ib3N0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgaW5zdGFuY2U6IGVjMi5JbnN0YW5jZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQmFzdGlvbkhvc3RQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCB7IHN0YWNrTmFtZSB9ID0gU3RhY2sub2YodGhpcyk7XG5cbiAgICAvLyBCdWlsZCBlYzIgaW5zdGFuY2VcbiAgICB0aGlzLmluc3RhbmNlID0gbmV3IGVjMi5JbnN0YW5jZSh0aGlzLCBcImJhc3Rpb24taG9zdFwiLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHsgc3VibmV0VHlwZTogZWMyLlN1Ym5ldFR5cGUuUFVCTElDIH0sXG4gICAgICBpbnN0YW5jZU5hbWU6IGAke3N0YWNrTmFtZX0gYmFzdGlvbiBob3N0YCxcbiAgICAgIGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZS5vZihcbiAgICAgICAgZWMyLkluc3RhbmNlQ2xhc3MuQlVSU1RBQkxFNF9HUkFWSVRPTixcbiAgICAgICAgZWMyLkluc3RhbmNlU2l6ZS5OQU5PXG4gICAgICApLFxuICAgICAgbWFjaGluZUltYWdlOiBlYzIuTWFjaGluZUltYWdlLmxhdGVzdEFtYXpvbkxpbnV4KHtcbiAgICAgICAgZ2VuZXJhdGlvbjogZWMyLkFtYXpvbkxpbnV4R2VuZXJhdGlvbi5BTUFaT05fTElOVVhfMixcbiAgICAgICAgY3B1VHlwZTogZWMyLkFtYXpvbkxpbnV4Q3B1VHlwZS5BUk1fNjQsXG4gICAgICB9KSxcbiAgICAgIHVzZXJEYXRhOiBwcm9wcy51c2VyRGF0YSxcbiAgICAgIHVzZXJEYXRhQ2F1c2VzUmVwbGFjZW1lbnQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBBc3NpZ24gZWxhc3RpYyBJUFxuICAgIGlmIChwcm9wcy5jcmVhdGVFbGFzdGljSXAgPz8gdHJ1ZSkge1xuICAgICAgbmV3IGVjMi5DZm5FSVAodGhpcywgXCJJUFwiLCB7XG4gICAgICAgIGluc3RhbmNlSWQ6IHRoaXMuaW5zdGFuY2UuaW5zdGFuY2VJZCxcbiAgICAgICAgdGFnczogW3sga2V5OiBcIk5hbWVcIiwgdmFsdWU6IHN0YWNrTmFtZSB9XSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFsbG93IGJhc3Rpb24gaG9zdCB0byBjb25uZWN0IHRvIGRiXG4gICAgdGhpcy5pbnN0YW5jZS5jb25uZWN0aW9ucy5hbGxvd1RvKFxuICAgICAgcHJvcHMuZGIuY29ubmVjdGlvbnMuc2VjdXJpdHlHcm91cHNbMF0sXG4gICAgICBlYzIuUG9ydC50Y3AoNTQzMiksXG4gICAgICBcIkFsbG93IGNvbm5lY3Rpb24gZnJvbSBiYXN0aW9uIGhvc3RcIlxuICAgICk7XG5cbiAgICAvLyBBbGxvdyBJUCBhY2Nlc3MgdG8gYmFzdGlvbiBob3N0XG4gICAgZm9yIChjb25zdCBpcHY0IG9mIHByb3BzLmlwdjRBbGxvd2xpc3QpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2UuY29ubmVjdGlvbnMuYWxsb3dGcm9tKFxuICAgICAgICBlYzIuUGVlci5pcHY0KGlwdjQpLFxuICAgICAgICBlYzIuUG9ydC50Y3AocHJvcHMuc3NoUG9ydCB8fCAyMiksXG4gICAgICAgIFwiU1NIIEFjY2Vzc1wiXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEludGVncmF0ZSB3aXRoIFNTTVxuICAgIHRoaXMuaW5zdGFuY2UuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgXCJzc21tZXNzYWdlczoqXCIsXG4gICAgICAgICAgXCJzc206VXBkYXRlSW5zdGFuY2VJbmZvcm1hdGlvblwiLFxuICAgICAgICAgIFwiZWMybWVzc2FnZXM6KlwiLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiaW5zdGFuY2UtaWQtb3V0cHV0XCIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmluc3RhbmNlLmluc3RhbmNlSWQsXG4gICAgICBleHBvcnROYW1lOiBgJHtzdGFja05hbWV9LWluc3RhbmNlLWlkYCxcbiAgICB9KTtcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiaW5zdGFuY2UtcHVibGljLWlwLW91dHB1dFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5pbnN0YW5jZS5pbnN0YW5jZVB1YmxpY0lwLFxuICAgICAgZXhwb3J0TmFtZTogYCR7c3RhY2tOYW1lfS1pbnN0YW5jZS1wdWJsaWMtaXBgLFxuICAgIH0pO1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgXCJpbnN0YW5jZS1wdWJsaWMtZG5zLW5hbWUtb3V0cHV0XCIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmluc3RhbmNlLmluc3RhbmNlUHVibGljRG5zTmFtZSxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0tcHVibGljLWRucy1uYW1lYCxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc3Rpb25Ib3N0UHJvcHMge1xuICByZWFkb25seSB2cGM6IGVjMi5JVnBjO1xuICByZWFkb25seSBkYjogcmRzLklEYXRhYmFzZUluc3RhbmNlO1xuICByZWFkb25seSB1c2VyRGF0YTogZWMyLlVzZXJEYXRhO1xuICByZWFkb25seSBpcHY0QWxsb3dsaXN0OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgc3NoUG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgYW4gZWxhc3RpYyBJUCBzaG91bGQgYmUgY3JlYXRlZCBmb3IgdGhlIGJhc3Rpb24gaG9zdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZUVsYXN0aWNJcD86IGJvb2xlYW47XG59XG4iXX0=
@@ -41,10 +41,24 @@ export interface PgBouncerProps {
41
41
  */
42
42
  instanceProps?: Partial<ec2.InstanceProps>;
43
43
  /**
44
- * Optional reference to the database bootstrapper CustomResource.
45
- * When provided, the health check will re-trigger if the database setup changes.
44
+ * SSM parameter path for the PgBouncer EC2 instance machine image (AMI).
45
+ *
46
+ * Defaults to the latest Ubuntu Noble AMI. For stable deployments where
47
+ * EC2 replacement should only happen on explicit intent (not on Canonical
48
+ * AMI releases), pin this to a specific date-versioned path:
49
+ * /aws/service/canonical/ubuntu/server/noble/stable/YYYYMMDD.X/amd64/hvm/ebs-gp3/ami-id
50
+ *
51
+ * To list available date-versioned paths in your region:
52
+ * aws ssm get-parameters-by-path --path "/aws/service/canonical/ubuntu/server/noble/stable/" --recursive --query "Parameters[?ends_with(Name, 'amd64/hvm/ebs-gp3/ami-id')].Name"
53
+ *
54
+ * See: https://documentation.ubuntu.com/aws/aws-how-to/instances/find-ubuntu-images/
55
+ *
56
+ * With addPatchManager: true (default), SSM Patch Manager handles OS
57
+ * security updates without requiring instance replacement.
58
+ *
59
+ * @default /aws/service/canonical/ubuntu/server/noble/stable/20260218/amd64/hvm/ebs-gp3/ami-id
46
60
  */
47
- databaseBootstrapper?: CustomResource;
61
+ readonly machineImageSsmParameter?: string;
48
62
  }
49
63
  export declare class PgBouncer extends Construct {
50
64
  readonly instance: ec2.Instance;
@@ -5,6 +5,7 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const constructs_1 = require("constructs");
6
6
  const fs = require("fs");
7
7
  const path = require("path");
8
+ const DEFAULT_AMI_SSM_PARAMETER = "/aws/service/canonical/ubuntu/server/noble/stable/20260218/amd64/hvm/ebs-gp3/ami-id";
8
9
  class PgBouncer extends constructs_1.Construct {
9
10
  // The max_connections parameter in PgBouncer determines the maximum number of
10
11
  // connections to open on the actual database instance. We want that number to
@@ -62,7 +63,7 @@ class PgBouncer extends constructs_1.Construct {
62
63
  ? aws_cdk_lib_1.aws_ec2.SubnetType.PUBLIC
63
64
  : aws_cdk_lib_1.aws_ec2.SubnetType.PRIVATE_WITH_EGRESS,
64
65
  },
65
- machineImage: aws_cdk_lib_1.aws_ec2.MachineImage.fromSsmParameter("/aws/service/canonical/ubuntu/server/noble/stable/current/amd64/hvm/ebs-gp3/ami-id", { os: aws_cdk_lib_1.aws_ec2.OperatingSystemType.LINUX }),
66
+ machineImage: aws_cdk_lib_1.aws_ec2.MachineImage.fromSsmParameter(props.machineImageSsmParameter ?? DEFAULT_AMI_SSM_PARAMETER, { os: aws_cdk_lib_1.aws_ec2.OperatingSystemType.LINUX }),
66
67
  blockDevices: [
67
68
  {
68
69
  deviceName: "/dev/xvda",
@@ -138,10 +139,6 @@ class PgBouncer extends constructs_1.Construct {
138
139
  serviceToken: healthCheckFunction.functionArn,
139
140
  properties: {
140
141
  InstanceId: this.instance.instanceId,
141
- // Reference the database bootstrapper to re-trigger on database changes
142
- ...(props.databaseBootstrapper && {
143
- DatabaseBootstrapperRef: props.databaseBootstrapper.ref,
144
- }),
145
142
  },
146
143
  });
147
144
  // Ensure health check runs after instance is created but before secret update
@@ -153,7 +150,9 @@ class PgBouncer extends constructs_1.Construct {
153
150
  // Set environment variables with configuration parameters
154
151
  userDataScript.addCommands('export SECRET_ARN="' + database.secret.secretArn + '"', 'export REGION="' + aws_cdk_lib_1.Stack.of(this).region + '"', 'export POOL_MODE="' + pgBouncerConfig.poolMode + '"', 'export MAX_CLIENT_CONN="' + pgBouncerConfig.maxClientConn + '"', 'export DEFAULT_POOL_SIZE="' + pgBouncerConfig.defaultPoolSize + '"', 'export MIN_POOL_SIZE="' + pgBouncerConfig.minPoolSize + '"', 'export RESERVE_POOL_SIZE="' + pgBouncerConfig.reservePoolSize + '"', 'export RESERVE_POOL_TIMEOUT="' +
155
152
  pgBouncerConfig.reservePoolTimeout +
156
- '"', 'export MAX_DB_CONNECTIONS="' + pgBouncerConfig.maxDbConnections + '"', 'export MAX_USER_CONNECTIONS="' + pgBouncerConfig.maxUserConnections + '"');
153
+ '"', 'export MAX_DB_CONNECTIONS="' + pgBouncerConfig.maxDbConnections + '"', 'export MAX_USER_CONNECTIONS="' +
154
+ pgBouncerConfig.maxUserConnections +
155
+ '"');
157
156
  // Load the startup script
158
157
  const scriptPath = path.join(__dirname, "./pgbouncer-setup.sh");
159
158
  let script = fs.readFileSync(scriptPath, "utf8");
@@ -162,4 +161,4 @@ class PgBouncer extends constructs_1.Construct {
162
161
  }
163
162
  }
164
163
  exports.PgBouncer = PgBouncer;
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGdCb3VuY2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGdCb3VuY2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQVFxQjtBQUNyQiwyQ0FBdUM7QUFFdkMseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQTBEN0IsTUFBYSxTQUFVLFNBQVEsc0JBQVM7SUFPdEMsOEVBQThFO0lBQzlFLDhFQUE4RTtJQUM5RSxnRkFBZ0Y7SUFDaEYsa0NBQWtDO0lBRTFCLHlCQUF5QixDQUMvQixnQkFBd0I7UUFFeEIsNEVBQTRFO1FBQzVFLGdFQUFnRTtRQUNoRSxPQUFPO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsYUFBYSxFQUFFLElBQUk7WUFDbkIsZUFBZSxFQUFFLENBQUM7WUFDbEIsV0FBVyxFQUFFLENBQUM7WUFDZCxlQUFlLEVBQUUsQ0FBQztZQUNsQixrQkFBa0IsRUFBRSxDQUFDO1lBQ3JCLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLEVBQUU7WUFDdkMsa0JBQWtCLEVBQUUsZ0JBQWdCLEdBQUcsRUFBRTtTQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUI7UUFDN0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixrQ0FBa0M7UUFFbEMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQzNELEtBQUssQ0FBQyxnQkFBZ0IsQ0FDdkIsQ0FBQztRQUVGLHNDQUFzQztRQUN0QyxNQUFNLGVBQWUsR0FBbUM7WUFDdEQsR0FBRyxzQkFBc0I7WUFDekIsR0FBRyxLQUFLLENBQUMsZUFBZTtTQUN6QixDQUFDO1FBRUYscUVBQXFFO1FBQ3JFLE1BQU0sSUFBSSxHQUFHLElBQUkscUJBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUM5QyxXQUFXLEVBQ1QsdUVBQXVFO1lBQ3pFLFNBQVMsRUFBRSxJQUFJLHFCQUFHLENB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c19lYzIgYXMgZWMyLFxuICBhd3NfaWFtIGFzIGlhbSxcbiAgYXdzX2xhbWJkYSBhcyBsYW1iZGEsXG4gIGF3c19zZWNyZXRzbWFuYWdlciBhcyBzZWNyZXRzbWFuYWdlcixcbiAgQ3VzdG9tUmVzb3VyY2UsXG4gIER1cmF0aW9uLFxuICBTdGFjayxcbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuLy8gdXNlZCB0byBwb3B1bGF0ZSBwZ2JvdW5jZXIgY29uZmlnOlxuLy8gc2VlIGh0dHBzOi8vd3d3LnBnYm91bmNlci5vcmcvY29uZmlnLmh0bWwgZm9yIGRldGFpbHNcbmV4cG9ydCBpbnRlcmZhY2UgUGdCb3VuY2VyQ29uZmlnUHJvcHMge1xuICBwb29sTW9kZT86IFwidHJhbnNhY3Rpb25cIiB8IFwic2Vzc2lvblwiIHwgXCJzdGF0ZW1lbnRcIjtcbiAgbWF4Q2xpZW50Q29ubj86IG51bWJlcjtcbiAgZGVmYXVsdFBvb2xTaXplPzogbnVtYmVyO1xuICBtaW5Qb29sU2l6ZT86IG51bWJlcjtcbiAgcmVzZXJ2ZVBvb2xTaXplPzogbnVtYmVyO1xuICByZXNlcnZlUG9vbFRpbWVvdXQ/OiBudW1iZXI7XG4gIG1heERiQ29ubmVjdGlvbnM/OiBudW1iZXI7XG4gIG1heFVzZXJDb25uZWN0aW9ucz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZ0JvdW5jZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBWUEMgdG8gZGVwbG95IFBnQm91bmNlciBpbnRvXG4gICAqL1xuICB2cGM6IGVjMi5JVnBjO1xuXG4gIC8qKlxuICAgKiBUaGUgUkRTIGluc3RhbmNlIHRvIGNvbm5lY3QgdG9cbiAgICovXG4gIGRhdGFiYXNlOiB7XG4gICAgY29ubmVjdGlvbnM6IGVjMi5Db25uZWN0aW9ucztcbiAgICBzZWNyZXQ6IHNlY3JldHNtYW5hZ2VyLklTZWNyZXQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1heGltdW0gY29ubmVjdGlvbnMgc2V0dGluZyBmb3IgdGhlIGRhdGFiYXNlLlxuICAgKiBQZ0JvdW5jZXIgd2lsbCB1c2UgMTAgZmV3ZXIgdGhhbiB0aGlzIHZhbHVlLlxuICAgKi9cbiAgZGJNYXhDb25uZWN0aW9uczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlcGxveSBpbiBwdWJsaWMgc3VibmV0XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB1c2VQdWJsaWNTdWJuZXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQZ0JvdW5jZXIgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqL1xuICBwZ0JvdW5jZXJDb25maWc/OiBQZ0JvdW5jZXJDb25maWdQcm9wcztcblxuICAvKipcbiAgICogRUMyIGluc3RhbmNlIG9wdGlvbnNcbiAgICovXG4gIGluc3RhbmNlUHJvcHM/OiBQYXJ0aWFsPGVjMi5JbnN0YW5jZVByb3BzPjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBkYXRhYmFzZSBib290c3RyYXBwZXIgQ3VzdG9tUmVzb3VyY2UuXG4gICAqIFdoZW4gcHJvdmlkZWQsIHRoZSBoZWFsdGggY2hlY2sgd2lsbCByZS10cmlnZ2VyIGlmIHRoZSBkYXRhYmFzZSBzZXR1cCBjaGFuZ2VzLlxuICAgKi9cbiAgZGF0YWJhc2VCb290c3RyYXBwZXI/OiBDdXN0b21SZXNvdXJjZTtcbn1cblxuZXhwb3J0IGNsYXNzIFBnQm91bmNlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBpbnN0YW5jZTogZWMyLkluc3RhbmNlO1xuICBwdWJsaWMgcmVhZG9ubHkgcGdib3VuY2VyU2VjcmV0OiBzZWNyZXRzbWFuYWdlci5TZWNyZXQ7XG4gIHB1YmxpYyByZWFkb25seSBzZWN1cml0eUdyb3VwOiBlYzIuU2VjdXJpdHlHcm91cDtcbiAgcHVibGljIHJlYWRvbmx5IHNlY3JldFVwZGF0ZUNvbXBsZXRlOiBDdXN0b21SZXNvdXJjZTtcbiAgcHVibGljIHJlYWRvbmx5IGhlYWx0aENoZWNrOiBDdXN0b21SZXNvdXJjZTtcblxuICAvLyBUaGUgbWF4X2Nvbm5lY3Rpb25zIHBhcmFtZXRlciBpbiBQZ0JvdW5jZXIgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2ZcbiAgLy8gY29ubmVjdGlvbnMgdG8gb3BlbiBvbiB0aGUgYWN0dWFsIGRhdGFiYXNlIGluc3RhbmNlLiBXZSB3YW50IHRoYXQgbnVtYmVyIHRvXG4gIC8vIGJlIHNsaWdodGx5IHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIG1heF9jb25uZWN0aW9ucyB2YWx1ZSBvbiB0aGUgUkRTIGluc3RhbmNlXG4gIC8vIHNvIHdlIHBlcmZvcm0gdGhpcyBjYWxjdWxhdGlvbi5cblxuICBwcml2YXRlIGdldERlZmF1bHRQZ2JvdW5jZXJDb25maWcoXG4gICAgZGJNYXhDb25uZWN0aW9uczogbnVtYmVyXG4gICk6IFJlcXVpcmVkPFBnQm91bmNlckNvbmZpZ1Byb3BzPiB7XG4gICAgLy8gbWF4RGJDb25uZWN0aW9ucyAoYW5kIG1heFVzZXJDb25uZWN0aW9ucykgYXJlIHRoZSBvbmx5IHNldHRpbmdzIHRoYXQgbmVlZFxuICAgIC8vIHRvIGJlIHJlc3BvbnNpdmUgdG8gdGhlIGRhdGFiYXNlIHNpemUvbWF4X2Nvbm5lY3Rpb25zIHNldHRpbmdcbiAgICByZXR1cm4ge1xuICAgICAgcG9vbE1vZGU6IFwidHJhbnNhY3Rpb25cIixcbiAgICAgIG1heENsaWVudENvbm46IDEwMDAsXG4gICAgICBkZWZhdWx0UG9vbFNpemU6IDUsXG4gICAgICBtaW5Qb29sU2l6ZTogMCxcbiAgICAgIHJlc2VydmVQb29sU2l6ZTogNSxcbiAgICAgIHJlc2VydmVQb29sVGltZW91dDogNSxcbiAgICAgIG1heERiQ29ubmVjdGlvbnM6IGRiTWF4Q29ubmVjdGlvbnMgLSAxMCxcbiAgICAgIG1heFVzZXJDb25uZWN0aW9uczogZGJNYXhDb25uZWN0aW9ucyAtIDEwLFxuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUGdCb3VuY2VyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gU2V0IGRlZmF1bHRzIGZvciBvcHRpb25hbCBwcm9wc1xuXG4gICAgY29uc3QgZGVmYXVsdFBnYm91bmNlckNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdFBnYm91bmNlckNvbmZpZyhcbiAgICAgIHByb3BzLmRiTWF4Q29ubmVjdGlvbnNcbiAgICApO1xuXG4gICAgLy8gTWVyZ2UgcHJvdmlkZWQgY29uZmlnIHdpdGggZGVmYXVsdHNcbiAgICBjb25zdCBwZ0JvdW5jZXJDb25maWc6IFJlcXVpcmVkPFBnQm91bmNlckNvbmZpZ1Byb3BzPiA9IHtcbiAgICAgIC4uLmRlZmF1bHRQZ2JvdW5jZXJDb25maWcsXG4gICAgICAuLi5wcm9wcy5wZ0JvdW5jZXJDb25maWcsXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSByb2xlIGZvciBQZ0JvdW5jZXIgaW5zdGFuY2UgdG8gZW5hYmxlIHdyaXRpbmcgdG8gQ2xvdWRXYXRjaFxuICAgIGNvbnN0IHJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgXCJJbnN0YW5jZVJvbGVcIiwge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwicGdib3VuY2VyIGluc3RhbmNlIHJvbGUgd2l0aCBTeXN0ZW1zIE1hbmFnZXIgKyBDbG91ZFdhdGNoIHBlcm1pc3Npb25zXCIsXG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImVjMi5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcbiAgICAgICAgICBcIkFtYXpvblNTTU1hbmFnZWRJbnN0YW5jZUNvcmVcIlxuICAgICAgICApLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgXCJDbG91ZFdhdGNoQWdlbnRTZXJ2ZXJQb2xpY3lcIlxuICAgICAgICApLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIC8vIEFkZCBwb2xpY3kgdG8gYWxsb3cgcmVhZGluZyBSRFMgY3JlZGVudGlhbHMgZnJvbSBTZWNyZXRzIE1hbmFnZXJcbiAgICByb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZVwiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMuZGF0YWJhc2Uuc2VjcmV0LnNlY3JldEFybl0sXG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYSBzZWN1cml0eSBncm91cCBhbmQgYWxsb3cgY29ubmVjdGlvbnMgZnJvbSB0aGUgTGFtYmRhIElQIHJhbmdlcyBmb3IgdGhpcyByZWdpb25cbiAgICB0aGlzLnNlY3VyaXR5R3JvdXAgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAodGhpcywgXCJQZ0JvdW5jZXJTZWN1cml0eUdyb3VwXCIsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgZGVzY3JpcHRpb246IFwiU2VjdXJpdHkgZ3JvdXAgZm9yIFBnQm91bmNlciBpbnN0YW5jZVwiLFxuICAgICAgYWxsb3dBbGxPdXRib3VuZDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBQZ0JvdW5jZXIgaW5zdGFuY2VcbiAgICBjb25zdCBkZWZhdWx0SW5zdGFuY2VDb25maWc6IE9taXQ8ZWMyLkluc3RhbmNlUHJvcHMsIFwidnBjXCI+ID0ge1xuICAgICAgaW5zdGFuY2VOYW1lOiBcInBnYm91bmNlclwiLFxuICAgICAgaW5zdGFuY2VUeXBlOiBlYzIuSW5zdGFuY2VUeXBlLm9mKFxuICAgICAgICBlYzIuSW5zdGFuY2VDbGFzcy5UMyxcbiAgICAgICAgZWMyLkluc3RhbmNlU2l6ZS5NSUNST1xuICAgICAgKSxcbiAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgc3VibmV0VHlwZTogcHJvcHMudXNlUHVibGljU3VibmV0XG4gICAgICAgICAgPyBlYzIuU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgICAgICA6IGVjMi5TdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1MsXG4gICAgICB9LFxuICAgICAgbWFjaGluZUltYWdlOiBlYzIuTWFjaGluZUltYWdlLmZyb21Tc21QYXJhbWV0ZXIoXG4gICAgICAgIFwiL2F3cy9zZXJ2aWNlL2Nhbm9uaWNhbC91YnVudHUvc2VydmVyL25vYmxlL3N0YWJsZS9jdXJyZW50L2FtZDY0L2h2bS9lYnMtZ3AzL2FtaS1pZFwiLFxuICAgICAgICB7IG9zOiBlYzIuT3BlcmF0aW5nU3lzdGVtVHlwZS5MSU5VWCB9XG4gICAgICApLFxuICAgICAgYmxvY2tEZXZpY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBkZXZpY2VOYW1lOiBcIi9kZXYveHZkYVwiLFxuICAgICAgICAgIHZvbHVtZTogZWMyLkJsb2NrRGV2aWNlVm9sdW1lLmVicygyMCwge1xuICAgICAgICAgICAgdm9sdW1lVHlwZTogZWMyLkVic0RldmljZVZvbHVtZVR5cGUuR1AzLFxuICAgICAgICAgICAgZW5jcnlwdGVkOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlT25UZXJtaW5hdGlvbjogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICByb2xlLFxuICAgICAgc2VjdXJpdHlHcm91cDogdGhpcy5zZWN1cml0eUdyb3VwLFxuICAgICAgdXNlckRhdGE6IHRoaXMubG9hZFVzZXJEYXRhU2NyaXB0KHBnQm91bmNlckNvbmZpZywgcHJvcHMuZGF0YWJhc2UpLFxuICAgICAgdXNlckRhdGFDYXVzZXNSZXBsYWNlbWVudDogdHJ1ZSxcbiAgICAgIGFzc29jaWF0ZVB1YmxpY0lwQWRkcmVzczogcHJvcHMudXNlUHVibGljU3VibmV0LFxuICAgIH07XG5cbiAgICB0aGlzLmluc3RhbmNlID0gbmV3IGVjMi5JbnN0YW5jZSh0aGlzLCBcIkluc3RhbmNlXCIsIHtcbiAgICAgIC4uLmRlZmF1bHRJbnN0YW5jZUNvbmZpZyxcbiAgICAgIC4uLnByb3BzLmluc3RhbmNlUHJvcHMsXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICB9KTtcblxuICAgIC8vIEFsbG93IFBnQm91bmNlciB0byBjb25uZWN0IHRvIFJEU1xuICAgIHByb3BzLmRhdGFiYXNlLmNvbm5lY3Rpb25zLmFsbG93RnJvbShcbiAgICAgIHRoaXMuaW5zdGFuY2UsXG4gICAgICBlYzIuUG9ydC50Y3AoNTQzMiksXG4gICAgICBcIkFsbG93IFBnQm91bmNlciB0byBjb25uZWN0IHRvIFJEU1wiXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBzZWNyZXQgZm9yIHBnYm91bmNlciBjb25uZWN0aW9uIGNyZWRlbnRpYWxzXG4gICAgdGhpcy5wZ2JvdW5jZXJTZWNyZXQgPSBuZXcgc2VjcmV0c21hbmFnZXIuU2VjcmV0KHRoaXMsIFwiUGdCb3VuY2VyU2VjcmV0XCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbm5lY3Rpb24gaW5mb3JtYXRpb24gZm9yIFBnQm91bmNlciBpbnN0YW5jZVwiLFxuICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IHtcbiAgICAgICAgZ2VuZXJhdGVTdHJpbmdLZXk6IFwiZHVtbXlcIixcbiAgICAgICAgc2VjcmV0U3RyaW5nVGVtcGxhdGU6IFwie31cIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBHcmFudCB0aGUgcm9sZSBwZXJtaXNzaW9uIHRvIHJlYWQgdGhlIG5ldyBzZWNyZXRcbiAgICB0aGlzLnBnYm91bmNlclNlY3JldC5ncmFudFJlYWQocm9sZSk7XG5cbiAgICAvLyBVcGRhdGUgcGdib3VuY2VyU2VjcmV0IHRvIGNvbnRhaW4gcGdzdGFjU2VjcmV0IHZhbHVlcyBidXQgd2l0aCBuZXcgdmFsdWUgZm9yIGhvc3RcbiAgICBjb25zdCBzZWNyZXRVcGRhdGVyRm4gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIFwiU2VjcmV0VXBkYXRlckZ1bmN0aW9uXCIsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU19MQVRFU1QsXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgXCJsYW1iZGEvcGdib3VuY2VyLXNlY3JldC11cGRhdGVyXCIpXG4gICAgICApLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgU09VUkNFX1NFQ1JFVF9BUk46IHByb3BzLmRhdGFiYXNlLnNlY3JldC5zZWNyZXRBcm4sXG4gICAgICAgIFRBUkdFVF9TRUNSRVRfQVJOOiB0aGlzLnBnYm91bmNlclNlY3JldC5zZWNyZXRBcm4sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcHJvcHMuZGF0YWJhc2Uuc2VjcmV0LmdyYW50UmVhZChzZWNyZXRVcGRhdGVyRm4pO1xuICAgIHRoaXMucGdib3VuY2VyU2VjcmV0LmdyYW50V3JpdGUoc2VjcmV0VXBkYXRlckZuKTtcblxuICAgIHRoaXMuc2VjcmV0VXBkYXRlQ29tcGxldGUgPSBuZXcgQ3VzdG9tUmVzb3VyY2UoXG4gICAgICB0aGlzLFxuICAgICAgXCJwZ2JvdW5jZXJTZWNyZXRCb290c3RyYXBwZXJcIixcbiAgICAgIHtcbiAgICAgICAgc2VydmljZVRva2VuOiBzZWNyZXRVcGRhdGVyRm4uZnVuY3Rpb25Bcm4sXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBpbnN0YW5jZUlwOiBwcm9wcy51c2VQdWJsaWNTdWJuZXRcbiAgICAgICAgICAgID8gdGhpcy5pbnN0YW5jZS5pbnN0YW5jZVB1YmxpY0lwXG4gICAgICAgICAgICA6IHRoaXMuaW5zdGFuY2UuaW5zdGFuY2VQcml2YXRlSXAsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEFkZCBoZWFsdGggY2hlY2sgY3VzdG9tIHJlc291cmNlXG4gICAgY29uc3QgaGVhbHRoQ2hlY2tGdW5jdGlvbiA9IG5ldyBsYW1iZGEuRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgXCJIZWFsdGhDaGVja0Z1bmN0aW9uXCIsXG4gICAgICB7XG4gICAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU19MQVRFU1QsXG4gICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDEwKSxcbiAgICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KFxuICAgICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsIFwibGFtYmRhL3BnYm91bmNlci1oZWFsdGgtY2hlY2tcIilcbiAgICAgICAgKSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUGdCb3VuY2VyIGhlYWx0aCBjaGVjayBmdW5jdGlvblwiLFxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBHcmFudCBTU00gcGVybWlzc2lvbnMgZm9yIGhlYWx0aCBjaGVja1xuICAgIGhlYWx0aENoZWNrRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgXCJzc206U2VuZENvbW1hbmRcIixcbiAgICAgICAgICBcInNzbTpHZXRDb21tYW5kSW52b2NhdGlvblwiLFxuICAgICAgICAgIFwic3NtOkRlc2NyaWJlSW5zdGFuY2VJbmZvcm1hdGlvblwiLFxuICAgICAgICAgIFwic3NtOkxpc3RDb21tYW5kSW52b2NhdGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5oZWFsdGhDaGVjayA9IG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCBcIlBnQm91bmNlckhlYWx0aENoZWNrXCIsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogaGVhbHRoQ2hlY2tGdW5jdGlvbi5mdW5jdGlvbkFybixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgSW5zdGFuY2VJZDogdGhpcy5pbnN0YW5jZS5pbnN0YW5jZUlkLFxuICAgICAgICAvLyBSZWZlcmVuY2UgdGhlIGRhdGFiYXNlIGJvb3RzdHJhcHBlciB0byByZS10cmlnZ2VyIG9uIGRhdGFiYXNlIGNoYW5nZXNcbiAgICAgICAgLi4uKHByb3BzLmRhdGFiYXNlQm9vdHN0cmFwcGVyICYmIHtcbiAgICAgICAgICBEYXRhYmFzZUJvb3RzdHJhcHBlclJlZjogcHJvcHMuZGF0YWJhc2VCb290c3RyYXBwZXIucmVmLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBFbnN1cmUgaGVhbHRoIGNoZWNrIHJ1bnMgYWZ0ZXIgaW5zdGFuY2UgaXMgY3JlYXRlZCBidXQgYmVmb3JlIHNlY3JldCB1cGRhdGVcbiAgICB0aGlzLmhlYWx0aENoZWNrLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLmluc3RhbmNlKTtcbiAgICB0aGlzLnNlY3JldFVwZGF0ZUNvbXBsZXRlLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLmhlYWx0aENoZWNrKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFVzZXJEYXRhU2NyaXB0KFxuICAgIHBnQm91bmNlckNvbmZpZzogUmVxdWlyZWQ8Tm9uTnVsbGFibGU8UGdCb3VuY2VyUHJvcHNbXCJwZ0JvdW5jZXJDb25maWdcIl0+PixcbiAgICBkYXRhYmFzZTogeyBzZWNyZXQ6IHNlY3JldHNtYW5hZ2VyLklTZWNyZXQgfVxuICApOiBlYzIuVXNlckRhdGEge1xuICAgIGNvbnN0IHVzZXJEYXRhU2NyaXB0ID0gZWMyLlVzZXJEYXRhLmZvckxpbnV4KCk7XG5cbiAgICAvLyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGggY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzXG4gICAgdXNlckRhdGFTY3JpcHQuYWRkQ29tbWFuZHMoXG4gICAgICAnZXhwb3J0IFNFQ1JFVF9BUk49XCInICsgZGF0YWJhc2Uuc2VjcmV0LnNlY3JldEFybiArICdcIicsXG4gICAgICAnZXhwb3J0IFJFR0lPTj1cIicgKyBTdGFjay5vZih0aGlzKS5yZWdpb24gKyAnXCInLFxuICAgICAgJ2V4cG9ydCBQT09MX01PREU9XCInICsgcGdCb3VuY2VyQ29uZmlnLnBvb2xNb2RlICsgJ1wiJyxcbiAgICAgICdleHBvcnQgTUFYX0NMSUVOVF9DT05OPVwiJyArIHBnQm91bmNlckNvbmZpZy5tYXhDbGllbnRDb25uICsgJ1wiJyxcbiAgICAgICdleHBvcnQgREVGQVVMVF9QT09MX1NJWkU9XCInICsgcGdCb3VuY2VyQ29uZmlnLmRlZmF1bHRQb29sU2l6ZSArICdcIicsXG4gICAgICAnZXhwb3J0IE1JTl9QT09MX1NJWkU9XCInICsgcGdCb3VuY2VyQ29uZmlnLm1pblBvb2xTaXplICsgJ1wiJyxcbiAgICAgICdleHBvcnQgUkVTRVJWRV9QT09MX1NJWkU9XCInICsgcGdCb3VuY2VyQ29uZmlnLnJlc2VydmVQb29sU2l6ZSArICdcIicsXG4gICAgICAnZXhwb3J0IFJFU0VSVkVfUE9PTF9USU1FT1VUPVwiJyArXG4gICAgICAgIHBnQm91bmNlckNvbmZpZy5yZXNlcnZlUG9vbFRpbWVvdXQgK1xuICAgICAgICAnXCInLFxuICAgICAgJ2V4cG9ydCBNQVhfREJfQ09OTkVDVElPTlM9XCInICsgcGdCb3VuY2VyQ29uZmlnLm1heERiQ29ubmVjdGlvbnMgKyAnXCInLFxuICAgICAgJ2V4cG9ydCBNQVhfVVNFUl9DT05ORUNUSU9OUz1cIicgKyBwZ0JvdW5jZXJDb25maWcubWF4VXNlckNvbm5lY3Rpb25zICsgJ1wiJ1xuICAgICk7XG5cbiAgICAvLyBMb2FkIHRoZSBzdGFydHVwIHNjcmlwdFxuICAgIGNvbnN0IHNjcmlwdFBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4vcGdib3VuY2VyLXNldHVwLnNoXCIpO1xuICAgIGxldCBzY3JpcHQgPSBmcy5yZWFkRmlsZVN5bmMoc2NyaXB0UGF0aCwgXCJ1dGY4XCIpO1xuXG4gICAgdXNlckRhdGFTY3JpcHQuYWRkQ29tbWFuZHMoc2NyaXB0KTtcblxuICAgIHJldHVybiB1c2VyRGF0YVNjcmlwdDtcbiAgfVxufVxuIl19
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGdCb3VuY2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUGdCb3VuY2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQVFxQjtBQUNyQiwyQ0FBdUM7QUFFdkMseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQWU3QixNQUFNLHlCQUF5QixHQUM3QixxRkFBcUYsQ0FBQztBQTJEeEYsTUFBYSxTQUFVLFNBQVEsc0JBQVM7SUFPdEMsOEVBQThFO0lBQzlFLDhFQUE4RTtJQUM5RSxnRkFBZ0Y7SUFDaEYsa0NBQWtDO0lBRTFCLHlCQUF5QixDQUMvQixnQkFBd0I7UUFFeEIsNEVBQTRFO1FBQzVFLGdFQUFnRTtRQUNoRSxPQUFPO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsYUFBYSxFQUFFLElBQUk7WUFDbkIsZUFBZSxFQUFFLENBQUM7WUFDbEIsV0FBVyxFQUFFLENBQUM7WUFDZCxlQUFlLEVBQUUsQ0FBQztZQUNsQixrQkFBa0IsRUFBRSxDQUFDO1lBQ3JCLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLEVBQUU7WUFDdkMsa0JBQWtCLEVBQUUsZ0JBQWdCLEdBQUcsRUFBRTtTQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUI7UUFDN0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixrQ0FBa0M7UUFFbEMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQzNELEtBQUssQ0FBQyxnQkFBZ0IsQ0FDdkIsQ0FBQztRQUVGLHNDQUFzQztRQUN0QyxNQUFNLGVBQWUsR0FBbUM7WUFDdEQsR0FBRyxzQkFBc0I7WUFDekIsR0FBRyxLQUFLLENBQUMsZUFBZTtTQUN6QixDQUFDO1FBRUYscUVBQXFFO1FBQ3JFLE1BQU0sSUFBSSxHQUFHLElBQUkscUJBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUM5QyxXQUFXLEVBQ1Qs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QztRQUU1QyxNQUFNLGNBQWMsR0FBRyxxQkFBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUUvQywwREFBMEQ7UUFDMUQsY0FBYyxDQUFDLFdBQVcsQ0FDeEIscUJBQXFCLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUN2RCxpQkFBaUIsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUMvQyxvQkFBb0IsR0FBRyxlQUFlLENBQUMsUUFBUSxHQUFHLEdBQUcsRUFDckQsMEJBQTBCLEdBQUcsZUFBZSxDQUFDLGFBQWEsR0FBRyxHQUFHLEVBQ2hFLDRCQUE0QixHQUFHLGVBQWUsQ0FBQyxlQUFlLEdBQUcsR0FBRyxFQUNwRSx3QkFBd0IsR0FBRyxlQUFlLENBQUMsV0FBVyxHQUFHLEdBQUcsRUFDNUQsNEJBQTRCLEdBQUcsZUFBZSxDQUFDLGVBQWUsR0FBRyxHQUFHLEVBQ3BFLCtCQUErQjtZQUM3QixlQUFlLENBQUMsa0JBQWtCO1lBQ2xDLEdBQUcsRUFDTCw2QkFBNkIsR0FBRyxlQUFlLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxFQUN0RSwrQkFBK0I7WUFDN0IsZUFBZSxDQUFDLGtCQUFrQjtZQUNsQyxHQUFHLENBQ04sQ0FBQztRQUVGLDBCQUEwQjtRQUMxQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2hFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWpELGNBQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbkMsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBek9ELDhCQXlPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGF3c19lYzIgYXMgZWMyLFxuICBhd3NfaWFtIGFzIGlhbSxcbiAgYXdzX2xhbWJkYSBhcyBsYW1iZGEsXG4gIGF3c19zZWNyZXRzbWFuYWdlciBhcyBzZWNyZXRzbWFuYWdlcixcbiAgQ3VzdG9tUmVzb3VyY2UsXG4gIER1cmF0aW9uLFxuICBTdGFjayxcbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuLy8gdXNlZCB0byBwb3B1bGF0ZSBwZ2JvdW5jZXIgY29uZmlnOlxuLy8gc2VlIGh0dHBzOi8vd3d3LnBnYm91bmNlci5vcmcvY29uZmlnLmh0bWwgZm9yIGRldGFpbHNcbmV4cG9ydCBpbnRlcmZhY2UgUGdCb3VuY2VyQ29uZmlnUHJvcHMge1xuICBwb29sTW9kZT86IFwidHJhbnNhY3Rpb25cIiB8IFwic2Vzc2lvblwiIHwgXCJzdGF0ZW1lbnRcIjtcbiAgbWF4Q2xpZW50Q29ubj86IG51bWJlcjtcbiAgZGVmYXVsdFBvb2xTaXplPzogbnVtYmVyO1xuICBtaW5Qb29sU2l6ZT86IG51bWJlcjtcbiAgcmVzZXJ2ZVBvb2xTaXplPzogbnVtYmVyO1xuICByZXNlcnZlUG9vbFRpbWVvdXQ/OiBudW1iZXI7XG4gIG1heERiQ29ubmVjdGlvbnM/OiBudW1iZXI7XG4gIG1heFVzZXJDb25uZWN0aW9ucz86IG51bWJlcjtcbn1cblxuY29uc3QgREVGQVVMVF9BTUlfU1NNX1BBUkFNRVRFUiA9XG4gIFwiL2F3cy9zZXJ2aWNlL2Nhbm9uaWNhbC91YnVudHUvc2VydmVyL25vYmxlL3N0YWJsZS8yMDI2MDIxOC9hbWQ2NC9odm0vZWJzLWdwMy9hbWktaWRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQZ0JvdW5jZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBWUEMgdG8gZGVwbG95IFBnQm91bmNlciBpbnRvXG4gICAqL1xuICB2cGM6IGVjMi5JVnBjO1xuXG4gIC8qKlxuICAgKiBUaGUgUkRTIGluc3RhbmNlIHRvIGNvbm5lY3QgdG9cbiAgICovXG4gIGRhdGFiYXNlOiB7XG4gICAgY29ubmVjdGlvbnM6IGVjMi5Db25uZWN0aW9ucztcbiAgICBzZWNyZXQ6IHNlY3JldHNtYW5hZ2VyLklTZWNyZXQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1heGltdW0gY29ubmVjdGlvbnMgc2V0dGluZyBmb3IgdGhlIGRhdGFiYXNlLlxuICAgKiBQZ0JvdW5jZXIgd2lsbCB1c2UgMTAgZmV3ZXIgdGhhbiB0aGlzIHZhbHVlLlxuICAgKi9cbiAgZGJNYXhDb25uZWN0aW9uczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlcGxveSBpbiBwdWJsaWMgc3VibmV0XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB1c2VQdWJsaWNTdWJuZXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQZ0JvdW5jZXIgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqL1xuICBwZ0JvdW5jZXJDb25maWc/OiBQZ0JvdW5jZXJDb25maWdQcm9wcztcblxuICAvKipcbiAgICogRUMyIGluc3RhbmNlIG9wdGlvbnNcbiAgICovXG4gIGluc3RhbmNlUHJvcHM/OiBQYXJ0aWFsPGVjMi5JbnN0YW5jZVByb3BzPjtcblxuICAvKipcbiAgICogU1NNIHBhcmFtZXRlciBwYXRoIGZvciB0aGUgUGdCb3VuY2VyIEVDMiBpbnN0YW5jZSBtYWNoaW5lIGltYWdlIChBTUkpLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0aGUgbGF0ZXN0IFVidW50dSBOb2JsZSBBTUkuIEZvciBzdGFibGUgZGVwbG95bWVudHMgd2hlcmVcbiAgICogRUMyIHJlcGxhY2VtZW50IHNob3VsZCBvbmx5IGhhcHBlbiBvbiBleHBsaWNpdCBpbnRlbnQgKG5vdCBvbiBDYW5vbmljYWxcbiAgICogQU1JIHJlbGVhc2VzKSwgcGluIHRoaXMgdG8gYSBzcGVjaWZpYyBkYXRlLXZlcnNpb25lZCBwYXRoOlxuICAgKiAgIC9hd3Mvc2VydmljZS9jYW5vbmljYWwvdWJ1bnR1L3NlcnZlci9ub2JsZS9zdGFibGUvWVlZWU1NREQuWC9hbWQ2NC9odm0vZWJzLWdwMy9hbWktaWRcbiAgICpcbiAgICogVG8gbGlzdCBhdmFpbGFibGUgZGF0ZS12ZXJzaW9uZWQgcGF0aHMgaW4geW91ciByZWdpb246XG4gICAqICAgYXdzIHNzbSBnZXQtcGFyYW1ldGVycy1ieS1wYXRoIC0tcGF0aCBcIi9hd3Mvc2VydmljZS9jYW5vbmljYWwvdWJ1bnR1L3NlcnZlci9ub2JsZS9zdGFibGUvXCIgLS1yZWN1cnNpdmUgLS1xdWVyeSBcIlBhcmFtZXRlcnNbP2VuZHNfd2l0aChOYW1lLCAnYW1kNjQvaHZtL2Vicy1ncDMvYW1pLWlkJyldLk5hbWVcIlxuICAgKlxuICAgKiBTZWU6IGh0dHBzOi8vZG9jdW1lbnRhdGlvbi51YnVudHUuY29tL2F3cy9hd3MtaG93LXRvL2luc3RhbmNlcy9maW5kLXVidW50dS1pbWFnZXMvXG4gICAqXG4gICAqIFdpdGggYWRkUGF0Y2hNYW5hZ2VyOiB0cnVlIChkZWZhdWx0KSwgU1NNIFBhdGNoIE1hbmFnZXIgaGFuZGxlcyBPU1xuICAgKiBzZWN1cml0eSB1cGRhdGVzIHdpdGhvdXQgcmVxdWlyaW5nIGluc3RhbmNlIHJlcGxhY2VtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAvYXdzL3NlcnZpY2UvY2Fub25pY2FsL3VidW50dS9zZXJ2ZXIvbm9ibGUvc3RhYmxlLzIwMjYwMjE4L2FtZDY0L2h2bS9lYnMtZ3AzL2FtaS1pZFxuICAgKi9cbiAgcmVhZG9ubHkgbWFjaGluZUltYWdlU3NtUGFyYW1ldGVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUGdCb3VuY2VyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGluc3RhbmNlOiBlYzIuSW5zdGFuY2U7XG4gIHB1YmxpYyByZWFkb25seSBwZ2JvdW5jZXJTZWNyZXQ6IHNlY3JldHNtYW5hZ2VyLlNlY3JldDtcbiAgcHVibGljIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXA6IGVjMi5TZWN1cml0eUdyb3VwO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0VXBkYXRlQ29tcGxldGU6IEN1c3RvbVJlc291cmNlO1xuICBwdWJsaWMgcmVhZG9ubHkgaGVhbHRoQ2hlY2s6IEN1c3RvbVJlc291cmNlO1xuXG4gIC8vIFRoZSBtYXhfY29ubmVjdGlvbnMgcGFyYW1ldGVyIGluIFBnQm91bmNlciBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZlxuICAvLyBjb25uZWN0aW9ucyB0byBvcGVuIG9uIHRoZSBhY3R1YWwgZGF0YWJhc2UgaW5zdGFuY2UuIFdlIHdhbnQgdGhhdCBudW1iZXIgdG9cbiAgLy8gYmUgc2xpZ2h0bHkgc21hbGxlciB0aGFuIHRoZSBhY3R1YWwgbWF4X2Nvbm5lY3Rpb25zIHZhbHVlIG9uIHRoZSBSRFMgaW5zdGFuY2VcbiAgLy8gc28gd2UgcGVyZm9ybSB0aGlzIGNhbGN1bGF0aW9uLlxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFBnYm91bmNlckNvbmZpZyhcbiAgICBkYk1heENvbm5lY3Rpb25zOiBudW1iZXIsXG4gICk6IFJlcXVpcmVkPFBnQm91bmNlckNvbmZpZ1Byb3BzPiB7XG4gICAgLy8gbWF4RGJDb25uZWN0aW9ucyAoYW5kIG1heFVzZXJDb25uZWN0aW9ucykgYXJlIHRoZSBvbmx5IHNldHRpbmdzIHRoYXQgbmVlZFxuICAgIC8vIHRvIGJlIHJlc3BvbnNpdmUgdG8gdGhlIGRhdGFiYXNlIHNpemUvbWF4X2Nvbm5lY3Rpb25zIHNldHRpbmdcbiAgICByZXR1cm4ge1xuICAgICAgcG9vbE1vZGU6IFwidHJhbnNhY3Rpb25cIixcbiAgICAgIG1heENsaWVudENvbm46IDEwMDAsXG4gICAgICBkZWZhdWx0UG9vbFNpemU6IDUsXG4gICAgICBtaW5Qb29sU2l6ZTogMCxcbiAgICAgIHJlc2VydmVQb29sU2l6ZTogNSxcbiAgICAgIHJlc2VydmVQb29sVGltZW91dDogNSxcbiAgICAgIG1heERiQ29ubmVjdGlvbnM6IGRiTWF4Q29ubmVjdGlvbnMgLSAxMCxcbiAgICAgIG1heFVzZXJDb25uZWN0aW9uczogZGJNYXhDb25uZWN0aW9ucyAtIDEwLFxuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUGdCb3VuY2VyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gU2V0IGRlZmF1bHRzIGZvciBvcHRpb25hbCBwcm9wc1xuXG4gICAgY29uc3QgZGVmYXVsdFBnYm91bmNlckNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdFBnYm91bmNlckNvbmZpZyhcbiAgICAgIHByb3BzLmRiTWF4Q29ubmVjdGlvbnMsXG4gICAgKTtcblxuICAgIC8vIE1lcmdlIHByb3ZpZGVkIGNvbmZpZyB3aXRoIGRlZmF1bHRzXG4gICAgY29uc3QgcGdCb3VuY2VyQ29uZmlnOiBSZXF1aXJlZDxQZ0JvdW5jZXJDb25maWdQcm9wcz4gPSB7XG4gICAgICAuLi5kZWZhdWx0UGdib3VuY2VyQ29uZmlnLFxuICAgICAgLi4ucHJvcHMucGdCb3VuY2VyQ29uZmlnLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgcm9sZSBmb3IgUGdCb3VuY2VyIGluc3RhbmNlIHRvIGVuYWJsZSB3cml0aW5nIHRvIENsb3VkV2F0Y2hcbiAgICBjb25zdCByb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsIFwiSW5zdGFuY2VSb2xlXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcInBnYm91bmNlciBpbnN0YW5jZSByb2xlIHdpdGggU3lzdGVtcyBNYW5hZ2VyICsgQ2xvdWRXYXRjaCBwZXJtaXNzaW9uc1wiLFxuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJlYzIuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgXCJBbWF6b25TU01NYW5hZ2VkSW5zdGFuY2VDb3JlXCIsXG4gICAgICAgICksXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcbiAgICAgICAgICBcIkNsb3VkV2F0Y2hBZ2VudFNlcnZlclBvbGljeVwiLFxuICAgICAgICApLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIC8vIEFkZCBwb2xpY3kgdG8gYWxsb3cgcmVhZGluZyBSRFMgY3JlZGVudGlhbHMgZnJvbSBTZWNyZXRzIE1hbmFnZXJcbiAgICByb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZVwiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMuZGF0YWJhc2Uuc2VjcmV0LnNlY3JldEFybl0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGEgc2VjdXJpdHkgZ3JvdXAgYW5kIGFsbG93IGNvbm5lY3Rpb25zIGZyb20gdGhlIExhbWJkYSBJUCByYW5nZXMgZm9yIHRoaXMgcmVnaW9uXG4gICAgdGhpcy5zZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsIFwiUGdCb3VuY2VyU2VjdXJpdHlHcm91cFwiLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNlY3VyaXR5IGdyb3VwIGZvciBQZ0JvdW5jZXIgaW5zdGFuY2VcIixcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgUGdCb3VuY2VyIGluc3RhbmNlXG4gICAgY29uc3QgZGVmYXVsdEluc3RhbmNlQ29uZmlnOiBPbWl0PGVjMi5JbnN0YW5jZVByb3BzLCBcInZwY1wiPiA9IHtcbiAgICAgIGluc3RhbmNlTmFtZTogXCJwZ2JvdW5jZXJcIixcbiAgICAgIGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZS5vZihcbiAgICAgICAgZWMyLkluc3RhbmNlQ2xhc3MuVDMsXG4gICAgICAgIGVjMi5JbnN0YW5jZVNpemUuTUlDUk8sXG4gICAgICApLFxuICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICBzdWJuZXRUeXBlOiBwcm9wcy51c2VQdWJsaWNTdWJuZXRcbiAgICAgICAgICA/IGVjMi5TdWJuZXRUeXBlLlBVQkxJQ1xuICAgICAgICAgIDogZWMyLlN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTUyxcbiAgICAgIH0sXG4gICAgICBtYWNoaW5lSW1hZ2U6IGVjMi5NYWNoaW5lSW1hZ2UuZnJvbVNzbVBhcmFtZXRlcihcbiAgICAgICAgcHJvcHMubWFjaGluZUltYWdlU3NtUGFyYW1ldGVyID8/IERFRkFVTFRfQU1JX1NTTV9QQVJBTUVURVIsXG4gICAgICAgIHsgb3M6IGVjMi5PcGVyYXRpbmdTeXN0ZW1UeXBlLkxJTlVYIH0sXG4gICAgICApLFxuICAgICAgYmxvY2tEZXZpY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBkZXZpY2VOYW1lOiBcIi9kZXYveHZkYVwiLFxuICAgICAgICAgIHZvbHVtZTogZWMyLkJsb2NrRGV2aWNlVm9sdW1lLmVicygyMCwge1xuICAgICAgICAgICAgdm9sdW1lVHlwZTogZWMyLkVic0RldmljZVZvbHVtZVR5cGUuR1AzLFxuICAgICAgICAgICAgZW5jcnlwdGVkOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlT25UZXJtaW5hdGlvbjogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICByb2xlLFxuICAgICAgc2VjdXJpdHlHcm91cDogdGhpcy5zZWN1cml0eUdyb3VwLFxuICAgICAgdXNlckRhdGE6IHRoaXMubG9hZFVzZXJEYXRhU2NyaXB0KHBnQm91bmNlckNvbmZpZywgcHJvcHMuZGF0YWJhc2UpLFxuICAgICAgdXNlckRhdGFDYXVzZXNSZXBsYWNlbWVudDogdHJ1ZSxcbiAgICAgIGFzc29jaWF0ZVB1YmxpY0lwQWRkcmVzczogcHJvcHMudXNlUHVibGljU3VibmV0LFxuICAgIH07XG5cbiAgICB0aGlzLmluc3RhbmNlID0gbmV3IGVjMi5JbnN0YW5jZSh0aGlzLCBcIkluc3RhbmNlXCIsIHtcbiAgICAgIC4uLmRlZmF1bHRJbnN0YW5jZUNvbmZpZyxcbiAgICAgIC4uLnByb3BzLmluc3RhbmNlUHJvcHMsXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICB9KTtcblxuICAgIC8vIEFsbG93IFBnQm91bmNlciB0byBjb25uZWN0IHRvIFJEU1xuICAgIHByb3BzLmRhdGFiYXNlLmNvbm5lY3Rpb25zLmFsbG93RnJvbShcbiAgICAgIHRoaXMuaW5zdGFuY2UsXG4gICAgICBlYzIuUG9ydC50Y3AoNTQzMiksXG4gICAgICBcIkFsbG93IFBnQm91bmNlciB0byBjb25uZWN0IHRvIFJEU1wiLFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgc2VjcmV0IGZvciBwZ2JvdW5jZXIgY29ubmVjdGlvbiBjcmVkZW50aWFsc1xuICAgIHRoaXMucGdib3VuY2VyU2VjcmV0ID0gbmV3IHNlY3JldHNtYW5hZ2VyLlNlY3JldCh0aGlzLCBcIlBnQm91bmNlclNlY3JldFwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJDb25uZWN0aW9uIGluZm9ybWF0aW9uIGZvciBQZ0JvdW5jZXIgaW5zdGFuY2VcIixcbiAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiB7XG4gICAgICAgIGdlbmVyYXRlU3RyaW5nS2V5OiBcImR1bW15XCIsXG4gICAgICAgIHNlY3JldFN0cmluZ1RlbXBsYXRlOiBcInt9XCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gR3JhbnQgdGhlIHJvbGUgcGVybWlzc2lvbiB0byByZWFkIHRoZSBuZXcgc2VjcmV0XG4gICAgdGhpcy5wZ2JvdW5jZXJTZWNyZXQuZ3JhbnRSZWFkKHJvbGUpO1xuXG4gICAgLy8gVXBkYXRlIHBnYm91bmNlclNlY3JldCB0byBjb250YWluIHBnc3RhY1NlY3JldCB2YWx1ZXMgYnV0IHdpdGggbmV3IHZhbHVlIGZvciBob3N0XG4gICAgY29uc3Qgc2VjcmV0VXBkYXRlckZuID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCBcIlNlY3JldFVwZGF0ZXJGdW5jdGlvblwiLCB7XG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfTEFURVNULFxuICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsIFwibGFtYmRhL3BnYm91bmNlci1zZWNyZXQtdXBkYXRlclwiKSxcbiAgICAgICksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBTT1VSQ0VfU0VDUkVUX0FSTjogcHJvcHMuZGF0YWJhc2Uuc2VjcmV0LnNlY3JldEFybixcbiAgICAgICAgVEFSR0VUX1NFQ1JFVF9BUk46IHRoaXMucGdib3VuY2VyU2VjcmV0LnNlY3JldEFybixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBwcm9wcy5kYXRhYmFzZS5zZWNyZXQuZ3JhbnRSZWFkKHNlY3JldFVwZGF0ZXJGbik7XG4gICAgdGhpcy5wZ2JvdW5jZXJTZWNyZXQuZ3JhbnRXcml0ZShzZWNyZXRVcGRhdGVyRm4pO1xuXG4gICAgdGhpcy5zZWNyZXRVcGRhdGVDb21wbGV0ZSA9IG5ldyBDdXN0b21SZXNvdXJjZShcbiAgICAgIHRoaXMsXG4gICAgICBcInBnYm91bmNlclNlY3JldEJvb3RzdHJhcHBlclwiLFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlVG9rZW46IHNlY3JldFVwZGF0ZXJGbi5mdW5jdGlvbkFybixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGluc3RhbmNlSXA6IHByb3BzLnVzZVB1YmxpY1N1Ym5ldFxuICAgICAgICAgICAgPyB0aGlzLmluc3RhbmNlLmluc3RhbmNlUHVibGljSXBcbiAgICAgICAgICAgIDogdGhpcy5pbnN0YW5jZS5pbnN0YW5jZVByaXZhdGVJcCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEFkZCBoZWFsdGggY2hlY2sgY3VzdG9tIHJlc291cmNlXG4gICAgY29uc3QgaGVhbHRoQ2hlY2tGdW5jdGlvbiA9IG5ldyBsYW1iZGEuRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgXCJIZWFsdGhDaGVja0Z1bmN0aW9uXCIsXG4gICAgICB7XG4gICAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU19MQVRFU1QsXG4gICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDEwKSxcbiAgICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KFxuICAgICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsIFwibGFtYmRhL3BnYm91bmNlci1oZWFsdGgtY2hlY2tcIiksXG4gICAgICAgICksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlBnQm91bmNlciBoZWFsdGggY2hlY2sgZnVuY3Rpb25cIixcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEdyYW50IFNTTSBwZXJtaXNzaW9ucyBmb3IgaGVhbHRoIGNoZWNrXG4gICAgaGVhbHRoQ2hlY2tGdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBcInNzbTpTZW5kQ29tbWFuZFwiLFxuICAgICAgICAgIFwic3NtOkdldENvbW1hbmRJbnZvY2F0aW9uXCIsXG4gICAgICAgICAgXCJzc206RGVzY3JpYmVJbnN0YW5jZUluZm9ybWF0aW9uXCIsXG4gICAgICAgICAgXCJzc206TGlzdENvbW1hbmRJbnZvY2F0aW9uc1wiLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy5oZWFsdGhDaGVjayA9IG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCBcIlBnQm91bmNlckhlYWx0aENoZWNrXCIsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogaGVhbHRoQ2hlY2tGdW5jdGlvbi5mdW5jdGlvbkFybixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgSW5zdGFuY2VJZDogdGhpcy5pbnN0YW5jZS5pbnN0YW5jZUlkLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIEVuc3VyZSBoZWFsdGggY2hlY2sgcnVucyBhZnRlciBpbnN0YW5jZSBpcyBjcmVhdGVkIGJ1dCBiZWZvcmUgc2VjcmV0IHVwZGF0ZVxuICAgIHRoaXMuaGVhbHRoQ2hlY2subm9kZS5hZGREZXBlbmRlbmN5KHRoaXMuaW5zdGFuY2UpO1xuICAgIHRoaXMuc2VjcmV0VXBkYXRlQ29tcGxldGUubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMuaGVhbHRoQ2hlY2spO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkVXNlckRhdGFTY3JpcHQoXG4gICAgcGdCb3VuY2VyQ29uZmlnOiBSZXF1aXJlZDxOb25OdWxsYWJsZTxQZ0JvdW5jZXJQcm9wc1tcInBnQm91bmNlckNvbmZpZ1wiXT4+LFxuICAgIGRhdGFiYXNlOiB7IHNlY3JldDogc2VjcmV0c21hbmFnZXIuSVNlY3JldCB9LFxuICApOiBlYzIuVXNlckRhdGEge1xuICAgIGNvbnN0IHVzZXJEYXRhU2NyaXB0ID0gZWMyLlVzZXJEYXRhLmZvckxpbnV4KCk7XG5cbiAgICAvLyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGggY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzXG4gICAgdXNlckRhdGFTY3JpcHQuYWRkQ29tbWFuZHMoXG4gICAgICAnZXhwb3J0IFNFQ1JFVF9BUk49XCInICsgZGF0YWJhc2Uuc2VjcmV0LnNlY3JldEFybiArICdcIicsXG4gICAgICAnZXhwb3J0IFJFR0lPTj1cIicgKyBTdGFjay5vZih0aGlzKS5yZWdpb24gKyAnXCInLFxuICAgICAgJ2V4cG9ydCBQT09MX01PREU9XCInICsgcGdCb3VuY2VyQ29uZmlnLnBvb2xNb2RlICsgJ1wiJyxcbiAgICAgICdleHBvcnQgTUFYX0NMSUVOVF9DT05OPVwiJyArIHBnQm91bmNlckNvbmZpZy5tYXhDbGllbnRDb25uICsgJ1wiJyxcbiAgICAgICdleHBvcnQgREVGQVVMVF9QT09MX1NJWkU9XCInICsgcGdCb3VuY2VyQ29uZmlnLmRlZmF1bHRQb29sU2l6ZSArICdcIicsXG4gICAgICAnZXhwb3J0IE1JTl9QT09MX1NJWkU9XCInICsgcGdCb3VuY2VyQ29uZmlnLm1pblBvb2xTaXplICsgJ1wiJyxcbiAgICAgICdleHBvcnQgUkVTRVJWRV9QT09MX1NJWkU9XCInICsgcGdCb3VuY2VyQ29uZmlnLnJlc2VydmVQb29sU2l6ZSArICdcIicsXG4gICAgICAnZXhwb3J0IFJFU0VSVkVfUE9PTF9USU1FT1VUPVwiJyArXG4gICAgICAgIHBnQm91bmNlckNvbmZpZy5yZXNlcnZlUG9vbFRpbWVvdXQgK1xuICAgICAgICAnXCInLFxuICAgICAgJ2V4cG9ydCBNQVhfREJfQ09OTkVDVElPTlM9XCInICsgcGdCb3VuY2VyQ29uZmlnLm1heERiQ29ubmVjdGlvbnMgKyAnXCInLFxuICAgICAgJ2V4cG9ydCBNQVhfVVNFUl9DT05ORUNUSU9OUz1cIicgK1xuICAgICAgICBwZ0JvdW5jZXJDb25maWcubWF4VXNlckNvbm5lY3Rpb25zICtcbiAgICAgICAgJ1wiJyxcbiAgICApO1xuXG4gICAgLy8gTG9hZCB0aGUgc3RhcnR1cCBzY3JpcHRcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuL3BnYm91bmNlci1zZXR1cC5zaFwiKTtcbiAgICBsZXQgc2NyaXB0ID0gZnMucmVhZEZpbGVTeW5jKHNjcmlwdFBhdGgsIFwidXRmOFwiKTtcblxuICAgIHVzZXJEYXRhU2NyaXB0LmFkZENvbW1hbmRzKHNjcmlwdCk7XG5cbiAgICByZXR1cm4gdXNlckRhdGFTY3JpcHQ7XG4gIH1cbn1cbiJdfQ==
@@ -171,8 +171,15 @@ def handler(event, context):
171
171
  """Lambda Handler."""
172
172
  print(f"Handling {event}")
173
173
 
174
+ physicalResourceId = event.get("PhysicalResourceId") or context.log_stream_name
174
175
  if event["RequestType"] not in ["Create", "Update"]:
175
- return send(event, context, "SUCCESS", {"msg": "No action to be taken"})
176
+ return send(
177
+ event,
178
+ context,
179
+ "SUCCESS",
180
+ {"msg": "No action to be taken"},
181
+ physicalResourceId=physicalResourceId,
182
+ )
176
183
 
177
184
  try:
178
185
  params = event["ResourceProperties"]
@@ -261,8 +268,14 @@ def handler(event, context):
261
268
 
262
269
  except Exception as e:
263
270
  print(f"Unable to bootstrap database with exception={e}")
264
- send(event, context, "FAILED", {"message": str(e)})
271
+ send(
272
+ event,
273
+ context,
274
+ "FAILED",
275
+ {"message": str(e)},
276
+ physicalResourceId=physicalResourceId,
277
+ )
265
278
  raise e
266
279
 
267
280
  print("Complete.")
268
- return send(event, context, "SUCCESS", {})
281
+ return send(event, context, "SUCCESS", {}, physicalResourceId=physicalResourceId)
@@ -94,6 +94,25 @@ export interface PgStacDatabaseProps extends rds.DatabaseInstanceProps {
94
94
  * @default - defined in the construct
95
95
  */
96
96
  readonly pgbouncerInstanceProps?: ec2.InstanceProps | any;
97
+ /**
98
+ * SSM parameter path for the PgBouncer EC2 instance machine image (AMI).
99
+ *
100
+ * Defaults to the latest Ubuntu Noble AMI (`current`). For stable deployments
101
+ * where EC2 replacement should only happen on explicit intent, pin this to a
102
+ * specific date-versioned path:
103
+ * /aws/service/canonical/ubuntu/server/noble/stable/YYYYMMDD.X/amd64/hvm/ebs-gp3/ami-id
104
+ *
105
+ * To list available date-versioned paths in your region:
106
+ * aws ssm get-parameters-by-path --path "/aws/service/canonical/ubuntu/server/noble/stable/" --recursive --query "Parameters[?ends_with(Name, 'amd64/hvm/ebs-gp3/ami-id')].Name"
107
+ *
108
+ * See: https://documentation.ubuntu.com/aws/aws-how-to/instances/find-ubuntu-images/
109
+ *
110
+ * With addPatchManager: true (default), SSM Patch Manager handles OS security
111
+ * updates without requiring instance replacement.
112
+ *
113
+ * @default /aws/service/canonical/ubuntu/server/noble/stable/20260218/amd64/hvm/ebs-gp3/ami-id
114
+ */
115
+ readonly pgbouncerAmiSsmParameter?: string;
97
116
  /**
98
117
  * Add patching system using AWS SSM for pgbouncer instance maintenance
99
118
  * `addPgbouncer` must be true for this to have an effect
@@ -215,7 +215,7 @@ class PgStacDatabase extends constructs_1.Construct {
215
215
  reservePoolSize: 5,
216
216
  reservePoolTimeout: 5,
217
217
  },
218
- databaseBootstrapper: bootstrapper,
218
+ machineImageSsmParameter: props.pgbouncerAmiSsmParameter,
219
219
  });
220
220
  this._pgBouncerServer.node.addDependency(bootstrapper);
221
221
  // Patching infrastructure for PgBouncer instance
@@ -271,5 +271,5 @@ class PgStacDatabase extends constructs_1.Construct {
271
271
  }
272
272
  exports.PgStacDatabase = PgStacDatabase;
273
273
  _a = JSII_RTTI_SYMBOL_1;
274
- PgStacDatabase[_a] = { fqn: "eoapi-cdk.PgStacDatabase", version: "11.2.0" };
275
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQVdxQjtBQUNyQiwyQ0FBdUM7QUFDdkMsb0NBSWtCO0FBQ2xCLDJDQUF3QztBQUN4QyxpREFBOEM7QUFDOUMsaUNBQWlDO0FBQ2pDLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFFN0IsTUFBTSxhQUFhLEdBQTJCLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBRWhGLElBQUksMEJBQTBCLEdBQTJCO0lBQ3ZELE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFlBQVksRUFBRSxNQUFNO0NBQ3JCLENBQUM7QUFFRixTQUFTLE1BQU0sQ0FDYixRQUFzRDtJQUV0RCxPQUFRLFFBQWlDLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQztBQUM5RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixRQUFnQixFQUNoQixTQUFvQztJQUVwQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXpDLDBCQUEwQjtJQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO0lBQzlFLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUUvQyxvQkFBb0I7SUFDcEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztJQUMzRSxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLFdB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QUFrQixFQUFFLEdBQUcsa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLEVBQUUsNEJBQTRCO1lBQzdFLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRTtZQUNyQixrQkFBa0IsRUFBRSxHQUFHLGtCQUFrQixFQUFFO1lBQzNDLHNCQUFzQixFQUFFLE1BQU07WUFDOUIsV0FBVyxFQUFFLEdBQUcsV0FBVyxHQUFHLENBQUMsRUFBRSxFQUFFLDRCQUE0QjtZQUMvRCxXQUFXLEVBQUUsR0FBRyxXQUFXLEVBQUU7WUFDN0IsY0FBYyxFQUFFLEdBQUcsY0FBYyxFQUFFO1NBQ3BDLENBQUM7SUFDSixDQUFDOztBQWpPSCx3Q0FrT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDdXN0b21SZXNvdXJjZSxcbiAgRHVyYXRpb24sXG4gIFJlbW92YWxQb2xpY3ksXG4gIFN0YWNrLFxuICBhd3NfbGFtYmRhLFxuICBhd3NfbG9ncyxcbiAgYXdzX2VjMiBhcyBlYzIsXG4gIGF3c19yZHMgYXMgcmRzLFxuICBhd3Nfc2VjcmV0c21hbmFnZXIgYXMgc2VjcmV0c21hbmFnZXIsXG4gIGF3c19zc20gYXMgc3NtLFxufSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBDdXN0b21MYW1iZGFGdW5jdGlvblByb3BzLFxuICBERUZBVUxUX1BHU1RBQ19WRVJTSU9OLFxuICByZXNvbHZlTGFtYmRhQ29kZSxcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBQZ0JvdW5jZXIgfSBmcm9tIFwiLi9QZ0JvdW5jZXJcIjtcbmltcG9ydCB7IFBhdGNoTWFuYWdlciB9IGZyb20gXCIuL1BhdGNoTWFuYWdlclwiO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5jb25zdCBpbnN0YW5jZVNpemVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0gcmVxdWlyZShcIi4vaW5zdGFuY2UtbWVtb3J5Lmpzb25cIik7XG5cbmxldCBkZWZhdWx0UGdTVEFDQ3VzdG9tT3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHtcbiAgY29udGV4dDogXCJGQUxTRVwiLFxuICBtb3NhaWNfaW5kZXg6IFwiVFJVRVwiLFxufTtcblxuZnVuY3Rpb24gaGFzVnBjKFxuICBpbnN0YW5jZTogcmRzLkRhdGFiYXNlSW5zdGFuY2UgfCByZHMuSURhdGFiYXNlSW5zdGFuY2UsXG4pOiBpbnN0YW5jZSBpcyByZHMuRGF0YWJhc2VJbnN0YW5jZSB7XG4gIHJldHVybiAoaW5zdGFuY2UgYXMgcmRzLkRhdGFiYXNlSW5zdGFuY2UpLnZwYyAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGEgY29udGVudC1iYXNlZCBoYXNoIGZvciBMYW1iZGEgRG9ja2VyIGJ1aWxkIGFzc2V0cy5cbiAqXG4gKiBUaGlzIGhhc2ggaW5jbHVkZXM6XG4gKiAtIERvY2tlcmZpbGUgY29udGVudFxuICogLSBIYW5kbGVyIGNvZGUgY29udGVudFxuICogLSBCdWlsZCBhcmd1bWVudHMgKFBHU1RBQ19WRVJTSU9OLCBQWVRIT05fVkVSU0lPTilcbiAqXG4gKiBAcGFyYW0gYmFzZVBhdGggLSBCYXNlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBib290c3RyYXBwZXJfcnVudGltZSBmb2xkZXJcbiAqIEBwYXJhbSBidWlsZEFyZ3MgLSBEb2NrZXIgYnVpbGQgYXJndW1lbnRzIHRoYXQgYWZmZWN0IHRoZSBMYW1iZGFcbiAqIEByZXR1cm5zIFNIQTI1NiBoYXNoIGFzIGhleCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUxhbWJkYUNvZGVIYXNoKFxuICBiYXNlUGF0aDogc3RyaW5nLFxuICBidWlsZEFyZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4pOiBzdHJpbmcge1xuICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIik7XG5cbiAgLy8gSGFzaCBEb2NrZXJmaWxlIGNvbnRlbnRcbiAgY29uc3QgZG9ja2VyZmlsZVBhdGggPSBwYXRoLmpvaW4oYmFzZVBhdGgsIFwiYm9vdHN0cmFwcGVyX3J1bnRpbWUvRG9ja2VyZmlsZVwiKTtcbiAgY29uc3QgZG9ja2VyZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZG9ja2VyZmlsZVBhdGgsIFwidXRmOFwiKTtcbiAgaGFzaC51cGRhdGUoYERvY2tlcmZpbGU6JHtkb2NrZXJmaWxlQ29udGVudH1gKTtcblxuICAvLyBIYXNoIGhhbmRsZXIgY29kZVxuICBjb25zdCBoYW5kbGVyUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgXCJib290c3RyYXBwZXJfcnVudGltZS9oYW5kbGVyLnB5XCIpO1xuICBjb25zdCBoYW5kbGVyQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhoYW5kbGVyUGF0aCwgXCJ1dGY4XCIpO1xuICBoYXNoLnVwZGF0ZShgaGFuZGxlcjoke2hhbmRsZXJDb250ZW50fWApO1xuXG4gIC8vIEhhc2ggYnVpbGQgYXJndW1lbnRzIGluIHNvcnRlZCBvcmRlciBmb3IgY29uc2lzdGVuY3lcbiAgY29uc3Qgc29ydGVkQXJncyA9IE9iamVjdC5rZXlzKGJ1aWxkQXJncylcbiAgICAuc29ydCgpXG4gICAgLm1hcCgoa2V5KSA9PiBgJHtrZXl9PSR7YnVpbGRBcmdzW2tleV19YClcbiAgICAuam9pbihcIixcIik7XG4gIGhhc2gudXBkYXRlKGBidWlsZEFyZ3M6JHtzb3J0ZWRBcmdzfWApO1xuXG4gIHJldHVybiBoYXNoLmRpZ2VzdChcImhleFwiKTtcbn1cblxuLyoqXG4gKiBBbiBSRFMgaW5zdGFuY2Ugd2l0aCBwZ1NUQUMgaW5zdGFsbGVkIGFuZCBQZ0JvdW5jZXIgY29ubmVjdGlvbiBwb29saW5nLlxuICpcbiAqIFRoaXMgY29uc3RydWN0IGNyZWF0ZXMgYW4gb3B0aW1pemVkIHBnU1RBQyBkYXRhYmFzZSBzZXR1cCB0aGF0IGluY2x1ZGVzOlxuICogLSBSRFMgUG9zdGdyZVNRTCBpbnN0YW5jZSB3aXRoIHBnU1RBQyBleHRlbnNpb25cbiAqIC0gUGdCb3VuY2VyIGNvbm5lY3Rpb24gcG9vbGVyIChlbmFibGVkIGJ5IGRlZmF1bHQpXG4gKiAtIEF1dG9tYXRlZCBoZWFsdGggbW9uaXRvcmluZyBzeXN0ZW1cbiAqIC0gT3B0aW1pemVkIGRhdGFiYXNlIHBhcmFtZXRlcnMgZm9yIHRoZSBzZWxlY3RlZCBpbnN0YW5jZSB0eXBlXG4gKlxuICogIyMgQ29ubmVjdGlvbiBQb29saW5nIHdpdGggUGdCb3VuY2VyXG4gKlxuICogQnkgZGVmYXVsdCwgdGhpcyBjb25zdHJ1Y3QgZGVwbG95cyBQZ0JvdW5jZXIgYXMgYSBjb25uZWN0aW9uIHBvb2xlciBydW5uaW5nIG9uXG4gKiBhIGRlZGljYXRlZCBFQzIgaW5zdGFuY2UuIFBnQm91bmNlciBwcm92aWRlcyBzZXZlcmFsIGJlbmVmaXRzOlxuICpcbiAqIC0gKipDb25uZWN0aW9uIE1hbmFnZW1lbnQqKjogUG9vbHMgYW5kIHJldXNlcyBkYXRhYmFzZSBjb25uZWN0aW9ucyB0byByZWR1Y2Ugb3ZlcmhlYWRcbiAqIC0gKipQZXJmb3JtYW5jZSoqOiBPcHRpbWl6ZXMgY29ubmVjdGlvbiBoYW5kbGluZyBmb3IgaGlnaC10cmFmZmljIGFwcGxpY2F0aW9uc1xuICogLSAqKlNjYWxhYmlsaXR5Kio6IEFsbG93cyBtb3JlIGNvbmN1cnJlbnQgY29ubmVjdGlvbnMgdGhhbiB0aGUgUkRTIGluc3RhbmNlIGFsb25lXG4gKiAtICoqSGVhbHRoIE1vbml0b3JpbmcqKjogSW5jbHVkZXMgY29tcHJlaGVuc2l2ZSBoZWFsdGggY2hlY2tzIHRvIGVuc3VyZSBhdmFpbGFiaWxpdHlcbiAqXG4gKiAjIyMgUGdCb3VuY2VyIENvbmZpZ3VyYXRpb25cbiAqIC0gUG9vbCBtb2RlOiBUcmFuc2FjdGlvbi1sZXZlbCBwb29saW5nIChkZWZhdWx0KVxuICogLSBNYXhpbXVtIGNsaWVudCBjb25uZWN0aW9uczogMTAwMFxuICogLSBEZWZhdWx0IHBvb2wgc2l6ZTogMjAgY29ubmVjdGlvbnMgcGVyIGRhdGFiYXNlL3VzZXIgY29tYmluYXRpb25cbiAqIC0gSW5zdGFuY2UgdHlwZTogdDMubWljcm8gRUMyIGluc3RhbmNlXG4gKlxuICogIyMjIEhlYWx0aCBDaGVjayBTeXN0ZW1cbiAqIFRoZSBjb25zdHJ1Y3QgaW5jbHVkZXMgYW4gYXV0b21hdGVkIGhlYWx0aCBjaGVjayBzeXN0ZW0gdGhhdCB2YWxpZGF0ZXM6XG4gKiAtIFBnQm91bmNlciBzZXJ2aWNlIGlzIHJ1bm5pbmcgYW5kIGxpc3RlbmluZyBvbiBwb3J0IDU0MzJcbiAqIC0gQ29ubmVjdGlvbiB0ZXN0cyB0byBlbnN1cmUgYWNjZXNzaWJpbGl0eVxuICogLSBDbG91ZC1pbml0IHNldHVwIGNvbXBsZXRpb24gYmVmb3JlIHZhbGlkYXRpb25cbiAqIC0gRGV0YWlsZWQgZGlhZ25vc3RpY3MgZm9yIHRyb3VibGVzaG9vdGluZ1xuICpcbiAqICMjIyBDb25uZWN0aW9uIERldGFpbHNcbiAqIFdoZW4gUGdCb3VuY2VyIGlzIGVuYWJsZWQsIGFwcGxpY2F0aW9ucyBjb25uZWN0IHRocm91Z2ggdGhlIFBnQm91bmNlciBpbnN0YW5jZVxuICogcmF0aGVyIHRoYW4gZGlyZWN0bHkgdG8gUkRTLiBUaGUgYHBnc3RhY1NlY3JldGAgY29udGFpbnMgY29ubmVjdGlvbiBpbmZvcm1hdGlvblxuICogcG9pbnRpbmcgdG8gUGdCb3VuY2VyLCBhbmQgdGhlIGBjb25uZWN0aW9uVGFyZ2V0YCBwcm9wZXJ0eSByZWZlcnMgdG8gdGhlXG4gKiBQZ0JvdW5jZXIgRUMyIGluc3RhbmNlLlxuICpcbiAqIFRvIGRpc2FibGUgUGdCb3VuY2VyIGFuZCBjb25uZWN0IGRpcmVjdGx5IHRvIFJEUywgc2V0IGBhZGRQZ2JvdW5jZXI6IGZhbHNlYC5cbiAqXG4gKiBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIGByZHMuRGF0YWJhc2VJbnN0YW5jZWAgaGlnaGVyLWxldmVsIGNvbnN0cnVjdFxuICogbWFraW5nIHVzZSBvZiB0aGUgQm9vdHN0cmFwUGdTdGFjIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBnU3RhY0RhdGFiYXNlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgZGI6IHJkcy5EYXRhYmFzZUluc3RhbmNlO1xuICBwZ3N0YWNTZWNyZXQ6IHNlY3JldHNtYW5hZ2VyLklTZWNyZXQ7XG4gIHByaXZhdGUgX3BnQm91bmNlclNlcnZlcj86IFBnQm91bmNlcjtcblxuICBwdWJsaWMgcmVhZG9ubHkgcGdzdGFjVmVyc2lvbjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvblRhcmdldDogcmRzLklEYXRhYmFzZUluc3RhbmNlIHwgZWMyLkluc3RhbmNlO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjdXJpdHlHcm91cD86IGVjMi5TZWN1cml0eUdyb3VwO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0Qm9vdHN0cmFwcGVyPzogQ3VzdG9tUmVzb3VyY2U7XG4gIHB1YmxpYyByZWFkb25seSBwZ2JvdW5jZXJIZWFsdGhDaGVjaz86IEN1c3RvbVJlc291cmNlO1xuICBwdWJsaWMgcmVhZG9ubHkgcGdib3VuY2VySW5zdGFuY2VJZD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUGdTdGFjRGF0YWJhc2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBkZWZhdWx0UGFyYW1ldGVycyA9IHRoaXMuZ2V0UGFyYW1ldGVycyhcbiAgICAgIHByb3BzLmluc3RhbmNlVHlwZT8udG9TdHJpbmcoKSB8fCBcIm01LmxhcmdlXCIsXG4gICAgICBwcm9wcy5wYXJhbWV0ZXJzLFxuICAgICk7XG4gICAgY29uc3QgcGFyYW1ldGVyR3JvdXAgPSBuZXcgcmRzLlBhcmFtZXRlckdyb3VwKHRoaXMsIFwicGFyYW1ldGVyR3JvdXBcIiwge1xuICAgICAgZW5naW5lOiBwcm9wcy5lbmdpbmUsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIG1heF9jb25uZWN0aW9uczogZGVmYXVsdFBhcmFtZXRlcnMubWF4Q29ubmVjdGlvbnMsXG4gICAgICAgIHNoYXJlZF9idWZmZXJzOiBkZWZhdWx0UGFyYW1ldGVycy5zaGFyZWRCdWZmZXJzLFxuICAgICAgICBlZmZlY3RpdmVfY2FjaGVfc2l6ZTogZGVmYXVsdFBhcmFtZXRlcnMuZWZmZWN0aXZlQ2FjaGVTaXplLFxuICAgICAgICB3b3JrX21lbTogZGVmYXVsdFBhcmFtZXRlcnMud29ya01lbSxcbiAgICAgICAgbWFpbnRlbmFuY2Vfd29ya19tZW06IGRlZmF1bHRQYXJhbWV0ZXJzLm1haW50ZW5hbmNlV29ya01lbSxcbiAgICAgICAgbWF4X2xvY2tzX3Blcl90cmFuc2FjdGlvbjogZGVmYXVsdFBhcmFtZXRlcnMubWF4TG9ja3NQZXJUcmFuc2FjdGlvbixcbiAgICAgICAgdGVtcF9idWZmZXJzOiBkZWZhdWx0UGFyYW1ldGVycy50ZW1wQnVmZmVycyxcbiAgICAgICAgc2VxX3BhZ2VfY29zdDogZGVmYXVsdFBhcmFtZXRlcnMuc2VxUGFnZUNvc3QsXG4gICAgICAgIHJhbmRvbV9wYWdlX2Nvc3Q6IGRlZmF1bHRQYXJhbWV0ZXJzLnJhbmRvbVBhZ2VDb3N0LFxuICAgICAgICAuLi5wcm9wcy5wYXJhbWV0ZXJzLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZGIgPSBuZXcgcmRzLkRhdGFiYXNlSW5zdGFuY2UodGhpcywgXCJkYlwiLCB7XG4gICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgIHBhcmFtZXRlckdyb3VwLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBnc3RhY1ZlcnNpb24gPSBwcm9wcy5wZ3N0YWNWZXJzaW9uIHx8IERFRkFVTFRfUEdTVEFDX1ZFUlNJT047XG5cbiAgICBjb25zdCB7IGNvZGU6IHVzZXJDb2RlLCAuLi5vdGhlckxhbWJkYU9wdGlvbnMgfSA9XG4gICAgICBwcm9wcy5ib290c3RyYXBwZXJMYW1iZGFGdW5jdGlvbk9wdGlvbnMgfHwge307XG5cbiAgICAvLyBTdG9yZSBidWlsZCBhcmdzIGZvciBoYXNoIGNvbXB1dGF0aW9uXG4gICAgY29uc3QgYnVpbGRBcmdzID0ge1xuICAgICAgUFlUSE9OX1ZFUlNJT046IFwiMy4xMlwiLFxuICAgICAgUEdTVEFDX1ZFUlNJT046IHRoaXMucGdzdGFjVmVyc2lvbixcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBhd3NfbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIFwibGFtYmRhXCIsIHtcbiAgICAgIC8vIGRlZmF1bHRzXG4gICAgICBydW50aW1lOiBhd3NfbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfMTIsXG4gICAgICBoYW5kbGVyOiBcImhhbmRsZXIuaGFuZGxlclwiLFxuICAgICAgbWVtb3J5U2l6ZTogMTI4LFxuICAgICAgbG9nUmV0ZW50aW9uOiBhd3NfbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9XRUVLLFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxNSksXG4gICAgICBjb2RlOiByZXNvbHZlTGFtYmRhQ29kZSh1c2VyQ29kZSwgX19kaXJuYW1lLCB7XG4gICAgICAgIGZpbGU6IFwiYm9vdHN0cmFwcGVyX3J1bnRpbWUvRG9ja2VyZmlsZVwiLFxuICAgICAgICBidWlsZEFyZ3M6IGJ1aWxkQXJncyxcbiAgICAgIH0pLFxuICAgICAgdnBjOiBoYXNWcGModGhpcy5kYikgPyB0aGlzLmRiLnZwYyA6IHByb3BzLnZwYyxcbiAgICAgIGFsbG93UHVibGljU3VibmV0OiB0cnVlLFxuICAgICAgLy8gb3ZlcndyaXRlcyBkZWZhdWx0cyB3aXRoIHVzZXItcHJvdmlkZWQgY29uZmlndXJhYmxlIHByb3BlcnRpZXMsXG4gICAgICAuLi5vdGhlckxhbWJkYU9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBnc3RhY1NlY3JldCA9IG5ldyBzZWNyZXRzbWFuYWdlci5TZWNyZXQodGhpcywgXCJib290c3RyYXBwZXJzZWNyZXRcIiwge1xuICAgICAgc2VjcmV0TmFtZTogW1xuICAgICAgICBwcm9wcy5zZWNyZXRzUHJlZml4IHx8IFwicGdzdGFjXCIsXG4gICAgICAgIGlkLFxuICAgICAgICB0aGlzLm5vZGUuYWRkci5zbGljZSgtOCksXG4gICAgICBdLmpvaW4oXCIvXCIpLFxuICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IHtcbiAgICAgICAgc2VjcmV0U3RyaW5nVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBkYm5hbWU6IHByb3BzLnBnc3RhY0RiTmFtZSB8fCBcInBnc3RhY1wiLFxuICAgICAgICAgIGVuZ2luZTogXCJwb3N0Z3Jlc1wiLFxuICAgICAgICAgIHBvcnQ6IDU0MzIsXG4gICAgICAgICAgaG9zdDogdGhpcy5kYi5pbnN0YW5jZUVuZHBvaW50Lmhvc3RuYW1lLFxuICAgICAgICAgIHVzZXJuYW1lOiBwcm9wcy5wZ3N0YWNVc2VybmFtZSB8fCBcInBnc3RhY191c2VyXCIsXG4gICAgICAgIH0pLFxuICAgICAgICBnZW5lcmF0ZVN0cmluZ0tleTogXCJwYXNzd29yZFwiLFxuICAgICAgICBleGNsdWRlUHVuY3R1YXRpb246IHRydWUsXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IGBQZ1NUQUMgZGF0YWJhc2UgYm9vdHN0cmFwcGVkIGJ5ICR7XG4gICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZVxuICAgICAgfWAsXG4gICAgfSk7XG5cbiAgICAvLyBBbGxvdyBsYW1iZGEgdG8uLi5cbiAgICAvLyByZWFkIG5ldyB1c2VyIHNlY3JldFxuICAgIHRoaXMucGdzdGFjU2VjcmV0LmdyYW50UmVhZChoYW5kbGVyKTtcbiAgICAvLyByZWFkIGRhdGFiYXNlIHNlY3JldFxuICAgIHRoaXMuZGIuc2VjcmV0IS5ncmFudFJlYWQoaGFuZGxlcik7XG4gICAgLy8gY29ubmVjdCB0byBkYXRhYmFzZVxuICAgIHRoaXMuZGIuY29ubmVjdGlvbnMuYWxsb3dGcm9tKGhhbmRsZXIsIGVjMi5Qb3J0LnRjcCg1NDMyKSk7XG5cbiAgICBsZXQgY3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID1cbiAgICAgIHByb3BzLmN1c3RvbVJlc291cmNlUHJvcGVydGllc1xuICAgICAgICA/IHsgLi4uZGVmYXVsdFBnU1RBQ0N1c3RvbU9wdGlvbnMsIC4uLnByb3BzLmN1c3RvbVJlc291cmNlUHJvcGVydGllcyB9XG4gICAgICAgIDogZGVmYXVsdFBnU1RBQ0N1c3RvbU9wdGlvbnM7XG5cbiAgICAvLyB1cGRhdGUgcHJvcGVydGllc1xuICAgIGN1c3RvbVJlc291cmNlUHJvcGVydGllc1tcImNvbm5fc2VjcmV0X2FyblwiXSA9IHRoaXMuZGIuc2VjcmV0IS5zZWNyZXRBcm47XG4gICAgY3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzW1wibmV3X3VzZXJfc2VjcmV0X2FyblwiXSA9XG4gICAgICB0aGlzLnBnc3RhY1NlY3JldC5zZWNyZXRBcm47XG5cbiAgICAvLyBpZiBwcm9wcy5sYW1iZGFGdW5jdGlvbk9wdGlvbnMgZG9lc24ndCBoYXZlICdjb2RlJyBkZWZpbmVkLCB1cGRhdGUgcGdzdGFjX3ZlcnNpb24gKG5lZWRlZCBmb3IgZGVmYXVsdCBydW50aW1lKVxuICAgIGlmICghdXNlckNvZGUpIHtcbiAgICAgIGN1c3RvbVJlc291cmNlUHJvcGVydGllc1tcInBnc3RhY192ZXJzaW9uXCJdID0gdGhpcy5wZ3N0YWNWZXJzaW9uO1xuXG4gICAgICAvLyBBZGQgY29udGVudC1iYXNlZCBoYXNoIHRvIGVuc3VyZSB0aGUgTGFtYmRhIGdldHMgcmUtZXhlY3V0ZWQgb25seSB3aGVuIGNvZGUgb3IgY29uZmlnIGNoYW5nZXNcbiAgICAgIGN1c3RvbVJlc291cmNlUHJvcGVydGllc1tcImNvZGVfaGFzaFwiXSA9IGNvbXB1dGVMYW1iZGFDb2RlSGFzaChcbiAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICBidWlsZEFyZ3MsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGZvcmNlIHRoZSBib290c3RyYXAgcHJvY2VzcyB0byBydW4gYnkgYWRkaW5nIGEgdGltZXN0YW1wIHdoaWNoIHdpbGwgZW5zdXJlIHRoZSBjdXN0b20gcmVzb3VyY2UgZXhlY3V0ZXMgdGhlIExhbWJkYSBmdW5jdGlvblxuICAgIGlmIChwcm9wcy5mb3JjZUJvb3RzdHJhcCkge1xuICAgICAgY3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzW1widGltZXN0YW1wXCJdID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvb3RzdHJhcHBlciA9IG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCBcImJvb3RzdHJhcHBlclwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IGhhbmRsZXIuZnVuY3Rpb25Bcm4sXG4gICAgICBwcm9wZXJ0aWVzOiBjdXN0b21SZXNvdXJjZVByb3BlcnRpZXMsXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlJFVEFJTiwgLy8gVGhpcyByZXRhaW5zIHRoZSBjdXN0b20gcmVzb3VyY2UgKHdoaWNoIGRvZXNuJ3QgcmVhbGx5IGV4aXN0KSwgbm90IHRoZSBkYXRhYmFzZVxuICAgIH0pO1xuXG4gICAgLy8gUGdCb3VuY2VyOiBjb25uZWN0aW9uIHBvb2xlcmN1c3RvbXJlc291cmNlIHRyaWdnZXIgb24gcmVkZXBsb3lcbiAgICBjb25zdCBkZWZhdWx0UGdib3VuY2VySW5zdGFuY2VQcm9wczogUGFydGlhbDxlYzIuSW5zdGFuY2VQcm9wcz4gPSB7XG4gICAgICBpbnN0YW5jZU5hbWU6IGAke1N0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX0tcGdib3VuY2VyYCxcbiAgICAgIGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZS5vZihcbiAgICAgICAgZWMyLkluc3RhbmNlQ2xhc3MuVDMsXG4gICAgICAgIGVjMi5JbnN0YW5jZVNpemUuTUlDUk8sXG4gICAgICApLFxuICAgIH07XG4gICAgY29uc3QgYWRkUGdib3VuY2VyID0gcHJvcHMuYWRkUGdib3VuY2VyID8/IHRydWU7XG4gICAgaWYgKGFkZFBnYm91bmNlcikge1xuICAgICAgdGhpcy5fcGdCb3VuY2VyU2VydmVyID0gbmV3IFBnQm91bmNlcih0aGlzLCBcInBnYm91bmNlclwiLCB7XG4gICAgICAgIGluc3RhbmNlUHJvcHM6IHtcbiAgICAgICAgICAuLi5kZWZhdWx0UGdib3VuY2VySW5zdGFuY2VQcm9wcyxcbiAgICAgICAgICAuLi5wcm9wcy5wZ2JvdW5jZXJJbnN0YW5jZVByb3BzLFxuICAgICAgICB9LFxuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgZGF0YWJhc2U6IHtcbiAgICAgICAgICBjb25uZWN0aW9uczogdGhpcy5kYi5jb25uZWN0aW9ucyxcbiAgICAgICAgICBzZWNyZXQ6IHRoaXMucGdzdGFjU2VjcmV0LFxuICAgICAgICB9LFxuICAgICAgICBkYk1heENvbm5lY3Rpb25zOiBwYXJzZUludChkZWZhdWx0UGFyYW1ldGVycy5tYXhDb25uZWN0aW9ucyksXG4gICAgICAgIHVzZVB1YmxpY1N1Ym5ldDpcbiAgICAgICAgICAhcHJvcHMudnBjU3VibmV0cyB8fFxuICAgICAgICAgIHByb3BzLnZwY1N1Ym5ldHMuc3VibmV0VHlwZSA9PT0gZWMyLlN1Ym5ldFR5cGUuUFVCTElDLFxuICAgICAgICBwZ0JvdW5jZXJDb25maWc6IHtcbiAgICAgICAgICBwb29sTW9kZTogXCJ0cmFuc2FjdGlvblwiLFxuICAgICAgICAgIG1heENsaWVudENvbm46IDEwMDAsXG4gICAgICAgICAgZGVmYXVsdFBvb2xTaXplOiAyMCxcbiAgICAgICAgICBtaW5Qb29sU2l6ZTogMTAsXG4gICAgICAgICAgcmVzZXJ2ZVBvb2xTaXplOiA1LFxuICAgICAgICAgIHJlc2VydmVQb29sVGltZW91dDogNSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF0YWJhc2VCb290c3RyYXBwZXI6IGJvb3RzdHJhcHBlcixcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9wZ0JvdW5jZXJTZXJ2ZXIubm9kZS5hZGREZXBlbmRlbmN5KGJvb3RzdHJhcHBlcik7XG5cbiAgICAgIC8vIFBhdGNoaW5nIGluZnJhc3RydWN0dXJlIGZvciBQZ0JvdW5jZXIgaW5zdGFuY2VcbiAgICAgIGNvbnN0IGFkZFBhdGNoTWFuYWdlciA9IHByb3BzLmFkZFBhdGNoTWFuYWdlciA/PyB0cnVlO1xuICAgICAgaWYgKGFkZFBhdGNoTWFuYWdlcikge1xuICAgICAgICBuZXcgUGF0Y2hNYW5hZ2VyKHRoaXMsIFwiUGF0Y2hNYW5hZ2VyXCIsIHtcbiAgICAgICAgICBpbnN0YW5jZUlkOiB0aGlzLl9wZ0JvdW5jZXJTZXJ2ZXIuaW5zdGFuY2UuaW5zdGFuY2VJZCxcbiAgICAgICAgICBtYWludGVuYW5jZVdpbmRvdzogcHJvcHMubWFpbnRlbmFuY2VXaW5kb3csXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBnc3RhY1NlY3JldCA9IHRoaXMuX3BnQm91bmNlclNlcnZlci5wZ2JvdW5jZXJTZWNyZXQ7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25UYXJnZXQgPSB0aGlzLl9wZ0JvdW5jZXJTZXJ2ZXIuaW5zdGFuY2U7XG4gICAgICB0aGlzLnNlY3VyaXR5R3JvdXAgPSB0aGlzLl9wZ0JvdW5jZXJTZXJ2ZXIuc2VjdXJpdHlHcm91cDtcbiAgICAgIHRoaXMuc2VjcmV0Qm9vdHN0cmFwcGVyID0gdGhpcy5fcGdCb3VuY2VyU2VydmVyLnNlY3JldFVwZGF0ZUNvbXBsZXRlO1xuICAgICAgdGhpcy5wZ2JvdW5jZXJIZWFsdGhDaGVjayA9IHRoaXMuX3BnQm91bmNlclNlcnZlci5oZWFsdGhDaGVjaztcbiAgICAgIHRoaXMucGdib3VuY2VySW5zdGFuY2VJZCA9IHRoaXMuX3BnQm91bmNlclNlcnZlci5pbnN0YW5jZS5pbnN0YW5jZUlkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25UYXJnZXQgPSB0aGlzLmRiO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKFxuICAgIGluc3RhbmNlVHlwZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnM6IFBnU3RhY0RhdGFiYXNlUHJvcHNbXCJwYXJhbWV0ZXJzXCJdLFxuICApOiBEYXRhYmFzZVBhcmFtZXRlcnMge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNsaS9pc3N1ZXMvMTI3OSNpc3N1ZWNvbW1lbnQtOTA5MzE4MjM2XG4gICAgY29uc3QgbWVtb3J5X2luX2tiID0gaW5zdGFuY2VTaXplc1tpbnN0YW5jZVR5cGVdICogMTAyNDtcblxuICAgIC8vIEl0J3Mgb25seSBuZWNlc3NhcnkgdG8gY29uc2lkZXIgcGFzc2VkIGluIHBhcmFtZXRlcnMgZm9yIGFueSB2YWx1ZSB0aGF0IHVzZWQgdG9cbiAgICAvLyBkZXJpdmUgc3Vic2VxdWVudCB2YWx1ZXMuIFZhbHVlcyB0aGF0IGRvbid0IGhhdmUgZGVwZW5kZW5jaWVzIHdpbGwgYmUgb3ZlcnJpZGVuXG4gICAgLy8gd2hlbiB3ZSB1bnBhY2sgdGhlIHBhc3NlZC1pbiB1c2VyIHBhcmFtZXRlcnNcbiAgICBjb25zdCBtYXhDb25uZWN0aW9ucyA9IHBhcmFtZXRlcnM/Lm1heENvbm5lY3Rpb25zXG4gICAgICA/IE51bWJlci5wYXJzZUludChwYXJhbWV0ZXJzLm1heENvbm5lY3Rpb25zKVxuICAgICAgOiAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUkRTL2xhdGVzdC9Vc2VyR3VpZGUvQ0hBUF9MaW1pdHMuaHRtbCNSRFNfTGltaXRzLk1heENvbm5lY3Rpb25zXG4gICAgICAgIE1hdGgubWluKE1hdGgucm91bmQoKG1lbW9yeV9pbl9rYiAqIDEwMjQpIC8gOTUzMTM5MiksIDUwMDApO1xuICAgIGNvbnN0IHNoYXJlZEJ1ZmZlcnMgPSBwYXJhbWV0ZXJzPy5zaGFyZWRCdWZlcnNcbiAgICAgID8gTnVtYmVyLnBhcnNlSW50KHBhcmFtZXRlcnMuc2hhcmVkQnVmZXJzKVxuICAgICAgOiBNYXRoLnJvdW5kKDAuMjUgKiBtZW1vcnlfaW5fa2IpO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlQ2FjaGVTaXplID0gTWF0aC5yb3VuZCgwLjc1ICogbWVtb3J5X2luX2tiKTtcbiAgICBjb25zdCB3b3JrTWVtID0gTWF0aC5mbG9vcihzaGFyZWRCdWZmZXJzIC8gbWF4Q29ubmVjdGlvbnMpO1xuICAgIGNvbnN0IG1haW50ZW5hbmNlV29ya01lbSA9IE1hdGgucm91bmQoMC4yNSAqIHNoYXJlZEJ1ZmZlcnMpO1xuXG4gICAgY29uc3QgdGVtcEJ1ZmZlcnMgPSAxMjggKiAxMDI0O1xuICAgIGNvbnN0IHNlcVBhZ2VDb3N0ID0gMTtcbiAgICBjb25zdCByYW5kb21QYWdlQ29zdCA9IDEuMTtcblxuICAgIHJldHVybiB7XG4gICAgICBtYXhDb25uZWN0aW9uczogYCR7bWF4Q29ubmVjdGlvbnN9YCxcbiAgICAgIHNoYXJlZEJ1ZmZlcnM6IGAke3NoYXJlZEJ1ZmZlcnMgLyA4fWAsIC8vIFJlcHJlc2VudGVkIGluIDhrYiBibG9ja3NcbiAgICAgIGVmZmVjdGl2ZUNhY2hlU2l6ZTogYCR7ZWZmZWN0aXZlQ2FjaGVTaXplIC8gOH1gLCAvLyBSZXByZXNlbnRlZCBpbiA4a2IgYmxvY2tzXG4gICAgICB3b3JrTWVtOiBgJHt3b3JrTWVtfWAsXG4gICAgICBtYWludGVuYW5jZVdvcmtNZW06IGAke21haW50ZW5hbmNlV29ya01lbX1gLFxuICAgICAgbWF4TG9ja3NQZXJUcmFuc2FjdGlvbjogXCIxMDI0XCIsXG4gICAgICB0ZW1wQnVmZmVyczogYCR7dGVtcEJ1ZmZlcnMgLyA4fWAsIC8vIFJlcHJlc2VudGVkIGluIDhrYiBibG9ja3NcbiAgICAgIHNlcVBhZ2VDb3N0OiBgJHtzZXFQYWdlQ29zdH1gLFxuICAgICAgcmFuZG9tUGFnZUNvc3Q6IGAke3JhbmRvbVBhZ2VDb3N0fWAsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBnU3RhY0RhdGFiYXNlUHJvcHMgZXh0ZW5kcyByZHMuRGF0YWJhc2VJbnN0YW5jZVByb3BzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgZGF0YWJhc2UgdGhhdCBpcyB0byBiZSBjcmVhdGVkIGFuZCBvbnRvIHdoaWNoIHBnU1RBQyB3aWxsIGJlIGluc3RhbGxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgcGdzdGFjXG4gICAqL1xuICByZWFkb25seSBwZ3N0YWNEYk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgcGdzdGFjIHRvIGluc3RhbGwgb24gdGhlIGRhdGFiYXNlXG4gICAqXG4gICAqIEBkZWZhdWx0IDAuOC41XG4gICAqL1xuICByZWFkb25seSBwZ3N0YWNWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdG8gYXNzaWduIHRvIHRoZSBnZW5lcmF0ZWQgYHNlY3JldHNfbWFuYWdlci5TZWNyZXRgXG4gICAqXG4gICAqIEBkZWZhdWx0IHBnc3RhY1xuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0c1ByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB1c2VyIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIHBnU1RBQyBkYXRhYmFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgcGdzdGFjX3VzZXJcbiAgICovXG4gIHJlYWRvbmx5IHBnc3RhY1VzZXJuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGQgcGdib3VuY2VyIGluc3RhbmNlIGZvciBtYW5hZ2luZyB0cmFmZmljIHRvIHRoZSBwZ1NUQUMgZGF0YWJhc2VcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkUGdib3VuY2VyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUHJvcGVydGllcyBmb3IgdGhlIHBnYm91bmNlciBlYzIgaW5zdGFuY2VcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZpbmVkIGluIHRoZSBjb25zdHJ1Y3RcbiAgICovXG4gIHJlYWRvbmx5IHBnYm91bmNlckluc3RhbmNlUHJvcHM/OiBlYzIuSW5zdGFuY2VQcm9wcyB8IGFueTtcblxuICAvKipcbiAgICogQWRkIHBhdGNoaW5nIHN5c3RlbSB1c2luZyBBV1MgU1NNIGZvciBwZ2JvdW5jZXIgaW5zdGFuY2UgbWFpbnRlbmFuY2VcbiAgICogYGFkZFBnYm91bmNlcmAgbXVzdCBiZSB0cnVlIGZvciB0aGlzIHRvIGhhdmUgYW4gZWZmZWN0XG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGFkZFBhdGNoTWFuYWdlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBtYWludGVuYW5jZSB3aW5kb3cgZm9yIHBhdGNoaW5nXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSBuZXcgbWFpbnRlbmFuY2Ugd2luZG93IHdpbGwgYmUgY3JlYXRlZCwgZGVmaW5lZCBpbiBjb25zdHJ1Y3RcbiAgICovXG4gIHJlYWRvbmx5IG1haW50ZW5hbmNlV2luZG93Pzogc3NtLkNmbk1haW50ZW5hbmNlV2luZG93O1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gQ3VzdG9tIFJlc291cmNlIHByb3BlcnRpZXMuIEEgY3VzdG9tIHJlc291cmNlIHByb3BlcnR5IGlzIGdvaW5nIHRvIGJlIGNyZWF0ZWRcbiAgICogdG8gdHJpZ2dlciB0aGUgYm9vc3RyYXBwaW5nIGxhbWJkYSBmdW5jdGlvbi4gVGhpcyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG4gICAqIG9uIHRvcCBvZiB0aGUgZGVmYXVsdHMgb25lcy5cbiAgICpcbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVJlc291cmNlUHJvcGVydGllcz86IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGxhbWJkYSBmdW5jdGlvbiBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmluZWQgaW4gdGhlIGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGJvb3RzdHJhcHBlckxhbWJkYUZ1bmN0aW9uT3B0aW9ucz86IEN1c3RvbUxhbWJkYUZ1bmN0aW9uUHJvcHM7XG5cbiAgLyoqXG4gICAqIEZvcmNlIHJlZGVwbG95bWVudCBvZiB0aGUgZGF0YWJhc2UgYm9vdHN0cmFwcGVyIExhbWJkYSBvbiBldmVyeSBkZXBsb3kuXG4gICAqXG4gICAqIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIHdoZW4gdXNpbmcgY3VzdG9tIExhbWJkYSBjb2RlIHZpYSBib290c3RyYXBwZXJMYW1iZGFGdW5jdGlvbk9wdGlvbnMuXG4gICAqIFdoZW4gZW5hYmxlZCwgYSB0aW1lc3RhbXAgd2lsbCBiZSBhZGRlZCB0byB0aGUgY3VzdG9tIHJlc291cmNlIHByb3BlcnRpZXMgdG8gZW5zdXJlXG4gICAqIHRoZSBib290c3RyYXBwZXIgTGFtYmRhIHJ1bnMgb24gZXZlcnkgZGVwbG95bWVudC5cbiAgICpcbiAgICogRm9yIHRoZSBkZWZhdWx0IERvY2tlci1iYXNlZCBib290c3RyYXAgY29kZSwgdGhpcyBmbGFnIGlzIGlnbm9yZWQgYW5kIGEgY29udGVudC1iYXNlZFxuICAgKiBoYXNoIGlzIHVzZWQgaW5zdGVhZCAod2hpY2ggYXV0b21hdGljYWxseSB0cmlnZ2VycyByZWRlcGxveW1lbnQgd2hlbiBjb2RlIGNoYW5nZXMpLlxuICAgKlxuICAgKiAqKkFsdGVybmF0aXZlIGFwcHJvYWNoOioqIEluc3RlYWQgb2YgdXNpbmcgdGhpcyBmbGFnLCB5b3UgY2FuIHRyaWdnZXIgYm9vdHN0cmFwIGJ5XG4gICAqIG1vZGlmeWluZyBhbnkgcHJvcGVydHkgaW4gYGN1c3RvbVJlc291cmNlUHJvcGVydGllc2AgKGUuZy4sIGluY3JlbWVudCBgcGdzdGFjX3ZlcnNpb25gXG4gICAqIG9yIGFkZCBhIGByZWJ1aWxkX3RyaWdnZXJgIHByb3BlcnR5IHdpdGggYSBuZXcgdmFsdWUpLiBUaGlzIGdpdmVzIHlvdSBtb3JlIGdyYW51bGFyXG4gICAqIGNvbnRyb2wgb3ZlciB3aGVuIHJlZGVwbG95bWVudCBoYXBwZW5zLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VCb290c3RyYXA/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlUGFyYW1ldGVycyB7XG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIExFQVNUKHtEQkluc3RhbmNlQ2xhc3NNZW1vcnkvOTUzMTM5Mn0sIDUwMDApXG4gICAqL1xuICByZWFkb25seSBtYXhDb25uZWN0aW9uczogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOb3RlOiBUaGlzIHZhbHVlIGlzIG1lYXN1cmVkIGluIDhLQiBibG9ja3MuXG4gICAqXG4gICAqIEBkZWZhdWx0ICd7REJJbnN0YW5jZUNsYXNzTWVtb3J5LzMyNzY4fScgMjUlIG9mIGluc3RhbmNlIG1lbW9yeSwgaWUgYHsoREJJbnN0YW5jZUNsYXNzTWVtb3J5LygxMDI0KjgpKSAqIDAuMjV9YFxuICAgKi9cbiAgcmVhZG9ubHkgc2hhcmVkQnVmZmVyczogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIDc1JSBvZiBpbnN0YW5jZSBtZW1vcnlcbiAgICovXG4gIHJlYWRvbmx5IGVmZmVjdGl2ZUNhY2hlU2l6ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIHNoYXJlZCBidWZmZXJzIGRpdmlkZWQgYnkgbWF4IGNvbm5lY3Rpb25zXG4gICAqL1xuICByZWFkb25seSB3b3JrTWVtOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IC0gMjUlIG9mIHNoYXJlZCBidWZmZXJzXG4gICAqL1xuICByZWFkb25seSBtYWludGVuYW5jZVdvcmtNZW06IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgMTAyNFxuICAgKi9cbiAgcmVhZG9ubHkgbWF4TG9ja3NQZXJUcmFuc2FjdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAxMzExNzIgKDEyOCAqIDEwMjQpXG4gICAqL1xuICByZWFkb25seSB0ZW1wQnVmZmVyczogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSBzZXFQYWdlQ29zdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAxLjFcbiAgICovXG4gIHJlYWRvbmx5IHJhbmRvbVBhZ2VDb3N0OiBzdHJpbmc7XG59XG4iXX0=
274
+ PgStacDatabase[_a] = { fqn: "eoapi-cdk.PgStacDatabase", version: "11.3.1" };
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQVdxQjtBQUNyQiwyQ0FBdUM7QUFDdkMsb0NBSWtCO0FBQ2xCLDJDQUF3QztBQUN4QyxpREFBOEM7QUFDOUMsaUNBQWlDO0FBQ2pDLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFFN0IsTUFBTSxhQUFhLEdBQTJCLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBRWhGLElBQUksMEJBQTBCLEdBQTJCO0lBQ3ZELE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFlBQVksRUFBRSxNQUFNO0NBQ3JCLENBQUM7QUFFRixTQUFTLE1BQU0sQ0FDYixRQUFzRDtJQUV0RCxPQUFRLFFBQWlDLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQztBQUM5RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixRQUFnQixFQUNoQixTQUFvQztJQUVwQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXpDLDBCQUEwQjtJQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO0lBQzlFLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUUvQyxvQkFBb0I7SUFDcEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztJQUMzRSxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLFdB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QTRCO1lBQ25FLGtCQUFrQixFQUFFLEdBQUcsa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLEVBQUUsNEJBQTRCO1lBQzdFLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRTtZQUNyQixrQkFBa0IsRUFBRSxHQUFHLGtCQUFrQixFQUFFO1lBQzNDLHNCQUFzQixFQUFFLE1BQU07WUFDOUIsV0FBVyxFQUFFLEdBQUcsV0FBVyxHQUFHLENBQUMsRUFBRSxFQUFFLDRCQUE0QjtZQUMvRCxXQUFXLEVBQUUsR0FBRyxXQUFXLEVBQUU7WUFDN0IsY0FBYyxFQUFFLEdBQUcsY0FBYyxFQUFFO1NBQ3BDLENBQUM7SUFDSixDQUFDOztBQWpPSCx3Q0FrT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDdXN0b21SZXNvdXJjZSxcbiAgRHVyYXRpb24sXG4gIFJlbW92YWxQb2xpY3ksXG4gIFN0YWNrLFxuICBhd3NfbGFtYmRhLFxuICBhd3NfbG9ncyxcbiAgYXdzX2VjMiBhcyBlYzIsXG4gIGF3c19yZHMgYXMgcmRzLFxuICBhd3Nfc2VjcmV0c21hbmFnZXIgYXMgc2VjcmV0c21hbmFnZXIsXG4gIGF3c19zc20gYXMgc3NtLFxufSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBDdXN0b21MYW1iZGFGdW5jdGlvblByb3BzLFxuICBERUZBVUxUX1BHU1RBQ19WRVJTSU9OLFxuICByZXNvbHZlTGFtYmRhQ29kZSxcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBQZ0JvdW5jZXIgfSBmcm9tIFwiLi9QZ0JvdW5jZXJcIjtcbmltcG9ydCB7IFBhdGNoTWFuYWdlciB9IGZyb20gXCIuL1BhdGNoTWFuYWdlclwiO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5jb25zdCBpbnN0YW5jZVNpemVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0gcmVxdWlyZShcIi4vaW5zdGFuY2UtbWVtb3J5Lmpzb25cIik7XG5cbmxldCBkZWZhdWx0UGdTVEFDQ3VzdG9tT3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHtcbiAgY29udGV4dDogXCJGQUxTRVwiLFxuICBtb3NhaWNfaW5kZXg6IFwiVFJVRVwiLFxufTtcblxuZnVuY3Rpb24gaGFzVnBjKFxuICBpbnN0YW5jZTogcmRzLkRhdGFiYXNlSW5zdGFuY2UgfCByZHMuSURhdGFiYXNlSW5zdGFuY2UsXG4pOiBpbnN0YW5jZSBpcyByZHMuRGF0YWJhc2VJbnN0YW5jZSB7XG4gIHJldHVybiAoaW5zdGFuY2UgYXMgcmRzLkRhdGFiYXNlSW5zdGFuY2UpLnZwYyAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGEgY29udGVudC1iYXNlZCBoYXNoIGZvciBMYW1iZGEgRG9ja2VyIGJ1aWxkIGFzc2V0cy5cbiAqXG4gKiBUaGlzIGhhc2ggaW5jbHVkZXM6XG4gKiAtIERvY2tlcmZpbGUgY29udGVudFxuICogLSBIYW5kbGVyIGNvZGUgY29udGVudFxuICogLSBCdWlsZCBhcmd1bWVudHMgKFBHU1RBQ19WRVJTSU9OLCBQWVRIT05fVkVSU0lPTilcbiAqXG4gKiBAcGFyYW0gYmFzZVBhdGggLSBCYXNlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBib290c3RyYXBwZXJfcnVudGltZSBmb2xkZXJcbiAqIEBwYXJhbSBidWlsZEFyZ3MgLSBEb2NrZXIgYnVpbGQgYXJndW1lbnRzIHRoYXQgYWZmZWN0IHRoZSBMYW1iZGFcbiAqIEByZXR1cm5zIFNIQTI1NiBoYXNoIGFzIGhleCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUxhbWJkYUNvZGVIYXNoKFxuICBiYXNlUGF0aDogc3RyaW5nLFxuICBidWlsZEFyZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4pOiBzdHJpbmcge1xuICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIik7XG5cbiAgLy8gSGFzaCBEb2NrZXJmaWxlIGNvbnRlbnRcbiAgY29uc3QgZG9ja2VyZmlsZVBhdGggPSBwYXRoLmpvaW4oYmFzZVBhdGgsIFwiYm9vdHN0cmFwcGVyX3J1bnRpbWUvRG9ja2VyZmlsZVwiKTtcbiAgY29uc3QgZG9ja2VyZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZG9ja2VyZmlsZVBhdGgsIFwidXRmOFwiKTtcbiAgaGFzaC51cGRhdGUoYERvY2tlcmZpbGU6JHtkb2NrZXJmaWxlQ29udGVudH1gKTtcblxuICAvLyBIYXNoIGhhbmRsZXIgY29kZVxuICBjb25zdCBoYW5kbGVyUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgXCJib290c3RyYXBwZXJfcnVudGltZS9oYW5kbGVyLnB5XCIpO1xuICBjb25zdCBoYW5kbGVyQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhoYW5kbGVyUGF0aCwgXCJ1dGY4XCIpO1xuICBoYXNoLnVwZGF0ZShgaGFuZGxlcjoke2hhbmRsZXJDb250ZW50fWApO1xuXG4gIC8vIEhhc2ggYnVpbGQgYXJndW1lbnRzIGluIHNvcnRlZCBvcmRlciBmb3IgY29uc2lzdGVuY3lcbiAgY29uc3Qgc29ydGVkQXJncyA9IE9iamVjdC5rZXlzKGJ1aWxkQXJncylcbiAgICAuc29ydCgpXG4gICAgLm1hcCgoa2V5KSA9PiBgJHtrZXl9PSR7YnVpbGRBcmdzW2tleV19YClcbiAgICAuam9pbihcIixcIik7XG4gIGhhc2gudXBkYXRlKGBidWlsZEFyZ3M6JHtzb3J0ZWRBcmdzfWApO1xuXG4gIHJldHVybiBoYXNoLmRpZ2VzdChcImhleFwiKTtcbn1cblxuLyoqXG4gKiBBbiBSRFMgaW5zdGFuY2Ugd2l0aCBwZ1NUQUMgaW5zdGFsbGVkIGFuZCBQZ0JvdW5jZXIgY29ubmVjdGlvbiBwb29saW5nLlxuICpcbiAqIFRoaXMgY29uc3RydWN0IGNyZWF0ZXMgYW4gb3B0aW1pemVkIHBnU1RBQyBkYXRhYmFzZSBzZXR1cCB0aGF0IGluY2x1ZGVzOlxuICogLSBSRFMgUG9zdGdyZVNRTCBpbnN0YW5jZSB3aXRoIHBnU1RBQyBleHRlbnNpb25cbiAqIC0gUGdCb3VuY2VyIGNvbm5lY3Rpb24gcG9vbGVyIChlbmFibGVkIGJ5IGRlZmF1bHQpXG4gKiAtIEF1dG9tYXRlZCBoZWFsdGggbW9uaXRvcmluZyBzeXN0ZW1cbiAqIC0gT3B0aW1pemVkIGRhdGFiYXNlIHBhcmFtZXRlcnMgZm9yIHRoZSBzZWxlY3RlZCBpbnN0YW5jZSB0eXBlXG4gKlxuICogIyMgQ29ubmVjdGlvbiBQb29saW5nIHdpdGggUGdCb3VuY2VyXG4gKlxuICogQnkgZGVmYXVsdCwgdGhpcyBjb25zdHJ1Y3QgZGVwbG95cyBQZ0JvdW5jZXIgYXMgYSBjb25uZWN0aW9uIHBvb2xlciBydW5uaW5nIG9uXG4gKiBhIGRlZGljYXRlZCBFQzIgaW5zdGFuY2UuIFBnQm91bmNlciBwcm92aWRlcyBzZXZlcmFsIGJlbmVmaXRzOlxuICpcbiAqIC0gKipDb25uZWN0aW9uIE1hbmFnZW1lbnQqKjogUG9vbHMgYW5kIHJldXNlcyBkYXRhYmFzZSBjb25uZWN0aW9ucyB0byByZWR1Y2Ugb3ZlcmhlYWRcbiAqIC0gKipQZXJmb3JtYW5jZSoqOiBPcHRpbWl6ZXMgY29ubmVjdGlvbiBoYW5kbGluZyBmb3IgaGlnaC10cmFmZmljIGFwcGxpY2F0aW9uc1xuICogLSAqKlNjYWxhYmlsaXR5Kio6IEFsbG93cyBtb3JlIGNvbmN1cnJlbnQgY29ubmVjdGlvbnMgdGhhbiB0aGUgUkRTIGluc3RhbmNlIGFsb25lXG4gKiAtICoqSGVhbHRoIE1vbml0b3JpbmcqKjogSW5jbHVkZXMgY29tcHJlaGVuc2l2ZSBoZWFsdGggY2hlY2tzIHRvIGVuc3VyZSBhdmFpbGFiaWxpdHlcbiAqXG4gKiAjIyMgUGdCb3VuY2VyIENvbmZpZ3VyYXRpb25cbiAqIC0gUG9vbCBtb2RlOiBUcmFuc2FjdGlvbi1sZXZlbCBwb29saW5nIChkZWZhdWx0KVxuICogLSBNYXhpbXVtIGNsaWVudCBjb25uZWN0aW9uczogMTAwMFxuICogLSBEZWZhdWx0IHBvb2wgc2l6ZTogMjAgY29ubmVjdGlvbnMgcGVyIGRhdGFiYXNlL3VzZXIgY29tYmluYXRpb25cbiAqIC0gSW5zdGFuY2UgdHlwZTogdDMubWljcm8gRUMyIGluc3RhbmNlXG4gKlxuICogIyMjIEhlYWx0aCBDaGVjayBTeXN0ZW1cbiAqIFRoZSBjb25zdHJ1Y3QgaW5jbHVkZXMgYW4gYXV0b21hdGVkIGhlYWx0aCBjaGVjayBzeXN0ZW0gdGhhdCB2YWxpZGF0ZXM6XG4gKiAtIFBnQm91bmNlciBzZXJ2aWNlIGlzIHJ1bm5pbmcgYW5kIGxpc3RlbmluZyBvbiBwb3J0IDU0MzJcbiAqIC0gQ29ubmVjdGlvbiB0ZXN0cyB0byBlbnN1cmUgYWNjZXNzaWJpbGl0eVxuICogLSBDbG91ZC1pbml0IHNldHVwIGNvbXBsZXRpb24gYmVmb3JlIHZhbGlkYXRpb25cbiAqIC0gRGV0YWlsZWQgZGlhZ25vc3RpY3MgZm9yIHRyb3VibGVzaG9vdGluZ1xuICpcbiAqICMjIyBDb25uZWN0aW9uIERldGFpbHNcbiAqIFdoZW4gUGdCb3VuY2VyIGlzIGVuYWJsZWQsIGFwcGxpY2F0aW9ucyBjb25uZWN0IHRocm91Z2ggdGhlIFBnQm91bmNlciBpbnN0YW5jZVxuICogcmF0aGVyIHRoYW4gZGlyZWN0bHkgdG8gUkRTLiBUaGUgYHBnc3RhY1NlY3JldGAgY29udGFpbnMgY29ubmVjdGlvbiBpbmZvcm1hdGlvblxuICogcG9pbnRpbmcgdG8gUGdCb3VuY2VyLCBhbmQgdGhlIGBjb25uZWN0aW9uVGFyZ2V0YCBwcm9wZXJ0eSByZWZlcnMgdG8gdGhlXG4gKiBQZ0JvdW5jZXIgRUMyIGluc3RhbmNlLlxuICpcbiAqIFRvIGRpc2FibGUgUGdCb3VuY2VyIGFuZCBjb25uZWN0IGRpcmVjdGx5IHRvIFJEUywgc2V0IGBhZGRQZ2JvdW5jZXI6IGZhbHNlYC5cbiAqXG4gKiBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIGByZHMuRGF0YWJhc2VJbnN0YW5jZWAgaGlnaGVyLWxldmVsIGNvbnN0cnVjdFxuICogbWFraW5nIHVzZSBvZiB0aGUgQm9vdHN0cmFwUGdTdGFjIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBnU3RhY0RhdGFiYXNlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgZGI6IHJkcy5EYXRhYmFzZUluc3RhbmNlO1xuICBwZ3N0YWNTZWNyZXQ6IHNlY3JldHNtYW5hZ2VyLklTZWNyZXQ7XG4gIHByaXZhdGUgX3BnQm91bmNlclNlcnZlcj86IFBnQm91bmNlcjtcblxuICBwdWJsaWMgcmVhZG9ubHkgcGdzdGFjVmVyc2lvbjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvblRhcmdldDogcmRzLklEYXRhYmFzZUluc3RhbmNlIHwgZWMyLkluc3RhbmNlO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjdXJpdHlHcm91cD86IGVjMi5TZWN1cml0eUdyb3VwO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0Qm9vdHN0cmFwcGVyPzogQ3VzdG9tUmVzb3VyY2U7XG4gIHB1YmxpYyByZWFkb25seSBwZ2JvdW5jZXJIZWFsdGhDaGVjaz86IEN1c3RvbVJlc291cmNlO1xuICBwdWJsaWMgcmVhZG9ubHkgcGdib3VuY2VySW5zdGFuY2VJZD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUGdTdGFjRGF0YWJhc2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBkZWZhdWx0UGFyYW1ldGVycyA9IHRoaXMuZ2V0UGFyYW1ldGVycyhcbiAgICAgIHByb3BzLmluc3RhbmNlVHlwZT8udG9TdHJpbmcoKSB8fCBcIm01LmxhcmdlXCIsXG4gICAgICBwcm9wcy5wYXJhbWV0ZXJzLFxuICAgICk7XG4gICAgY29uc3QgcGFyYW1ldGVyR3JvdXAgPSBuZXcgcmRzLlBhcmFtZXRlckdyb3VwKHRoaXMsIFwicGFyYW1ldGVyR3JvdXBcIiwge1xuICAgICAgZW5naW5lOiBwcm9wcy5lbmdpbmUsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIG1heF9jb25uZWN0aW9uczogZGVmYXVsdFBhcmFtZXRlcnMubWF4Q29ubmVjdGlvbnMsXG4gICAgICAgIHNoYXJlZF9idWZmZXJzOiBkZWZhdWx0UGFyYW1ldGVycy5zaGFyZWRCdWZmZXJzLFxuICAgICAgICBlZmZlY3RpdmVfY2FjaGVfc2l6ZTogZGVmYXVsdFBhcmFtZXRlcnMuZWZmZWN0aXZlQ2FjaGVTaXplLFxuICAgICAgICB3b3JrX21lbTogZGVmYXVsdFBhcmFtZXRlcnMud29ya01lbSxcbiAgICAgICAgbWFpbnRlbmFuY2Vfd29ya19tZW06IGRlZmF1bHRQYXJhbWV0ZXJzLm1haW50ZW5hbmNlV29ya01lbSxcbiAgICAgICAgbWF4X2xvY2tzX3Blcl90cmFuc2FjdGlvbjogZGVmYXVsdFBhcmFtZXRlcnMubWF4TG9ja3NQZXJUcmFuc2FjdGlvbixcbiAgICAgICAgdGVtcF9idWZmZXJzOiBkZWZhdWx0UGFyYW1ldGVycy50ZW1wQnVmZmVycyxcbiAgICAgICAgc2VxX3BhZ2VfY29zdDogZGVmYXVsdFBhcmFtZXRlcnMuc2VxUGFnZUNvc3QsXG4gICAgICAgIHJhbmRvbV9wYWdlX2Nvc3Q6IGRlZmF1bHRQYXJhbWV0ZXJzLnJhbmRvbVBhZ2VDb3N0LFxuICAgICAgICAuLi5wcm9wcy5wYXJhbWV0ZXJzLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZGIgPSBuZXcgcmRzLkRhdGFiYXNlSW5zdGFuY2UodGhpcywgXCJkYlwiLCB7XG4gICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgIHBhcmFtZXRlckdyb3VwLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBnc3RhY1ZlcnNpb24gPSBwcm9wcy5wZ3N0YWNWZXJzaW9uIHx8IERFRkFVTFRfUEdTVEFDX1ZFUlNJT047XG5cbiAgICBjb25zdCB7IGNvZGU6IHVzZXJDb2RlLCAuLi5vdGhlckxhbWJkYU9wdGlvbnMgfSA9XG4gICAgICBwcm9wcy5ib290c3RyYXBwZXJMYW1iZGFGdW5jdGlvbk9wdGlvbnMgfHwge307XG5cbiAgICAvLyBTdG9yZSBidWlsZCBhcmdzIGZvciBoYXNoIGNvbXB1dGF0aW9uXG4gICAgY29uc3QgYnVpbGRBcmdzID0ge1xuICAgICAgUFlUSE9OX1ZFUlNJT046IFwiMy4xMlwiLFxuICAgICAgUEdTVEFDX1ZFUlNJT046IHRoaXMucGdzdGFjVmVyc2lvbixcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBhd3NfbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIFwibGFtYmRhXCIsIHtcbiAgICAgIC8vIGRlZmF1bHRzXG4gICAgICBydW50aW1lOiBhd3NfbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfMTIsXG4gICAgICBoYW5kbGVyOiBcImhhbmRsZXIuaGFuZGxlclwiLFxuICAgICAgbWVtb3J5U2l6ZTogMTI4LFxuICAgICAgbG9nUmV0ZW50aW9uOiBhd3NfbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9XRUVLLFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxNSksXG4gICAgICBjb2RlOiByZXNvbHZlTGFtYmRhQ29kZSh1c2VyQ29kZSwgX19kaXJuYW1lLCB7XG4gICAgICAgIGZpbGU6IFwiYm9vdHN0cmFwcGVyX3J1bnRpbWUvRG9ja2VyZmlsZVwiLFxuICAgICAgICBidWlsZEFyZ3M6IGJ1aWxkQXJncyxcbiAgICAgIH0pLFxuICAgICAgdnBjOiBoYXNWcGModGhpcy5kYikgPyB0aGlzLmRiLnZwYyA6IHByb3BzLnZwYyxcbiAgICAgIGFsbG93UHVibGljU3VibmV0OiB0cnVlLFxuICAgICAgLy8gb3ZlcndyaXRlcyBkZWZhdWx0cyB3aXRoIHVzZXItcHJvdmlkZWQgY29uZmlndXJhYmxlIHByb3BlcnRpZXMsXG4gICAgICAuLi5vdGhlckxhbWJkYU9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBnc3RhY1NlY3JldCA9IG5ldyBzZWNyZXRzbWFuYWdlci5TZWNyZXQodGhpcywgXCJib290c3RyYXBwZXJzZWNyZXRcIiwge1xuICAgICAgc2VjcmV0TmFtZTogW1xuICAgICAgICBwcm9wcy5zZWNyZXRzUHJlZml4IHx8IFwicGdzdGFjXCIsXG4gICAgICAgIGlkLFxuICAgICAgICB0aGlzLm5vZGUuYWRkci5zbGljZSgtOCksXG4gICAgICBdLmpvaW4oXCIvXCIpLFxuICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IHtcbiAgICAgICAgc2VjcmV0U3RyaW5nVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBkYm5hbWU6IHByb3BzLnBnc3RhY0RiTmFtZSB8fCBcInBnc3RhY1wiLFxuICAgICAgICAgIGVuZ2luZTogXCJwb3N0Z3Jlc1wiLFxuICAgICAgICAgIHBvcnQ6IDU0MzIsXG4gICAgICAgICAgaG9zdDogdGhpcy5kYi5pbnN0YW5jZUVuZHBvaW50Lmhvc3RuYW1lLFxuICAgICAgICAgIHVzZXJuYW1lOiBwcm9wcy5wZ3N0YWNVc2VybmFtZSB8fCBcInBnc3RhY191c2VyXCIsXG4gICAgICAgIH0pLFxuICAgICAgICBnZW5lcmF0ZVN0cmluZ0tleTogXCJwYXNzd29yZFwiLFxuICAgICAgICBleGNsdWRlUHVuY3R1YXRpb246IHRydWUsXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IGBQZ1NUQUMgZGF0YWJhc2UgYm9vdHN0cmFwcGVkIGJ5ICR7XG4gICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZVxuICAgICAgfWAsXG4gICAgfSk7XG5cbiAgICAvLyBBbGxvdyBsYW1iZGEgdG8uLi5cbiAgICAvLyByZWFkIG5ldyB1c2VyIHNlY3JldFxuICAgIHRoaXMucGdzdGFjU2VjcmV0LmdyYW50UmVhZChoYW5kbGVyKTtcbiAgICAvLyByZWFkIGRhdGFiYXNlIHNlY3JldFxuICAgIHRoaXMuZGIuc2VjcmV0IS5ncmFudFJlYWQoaGFuZGxlcik7XG4gICAgLy8gY29ubmVjdCB0byBkYXRhYmFzZVxuICAgIHRoaXMuZGIuY29ubmVjdGlvbnMuYWxsb3dGcm9tKGhhbmRsZXIsIGVjMi5Qb3J0LnRjcCg1NDMyKSk7XG5cbiAgICBsZXQgY3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID1cbiAgICAgIHByb3BzLmN1c3RvbVJlc291cmNlUHJvcGVydGllc1xuICAgICAgICA/IHsgLi4uZGVmYXVsdFBnU1RBQ0N1c3RvbU9wdGlvbnMsIC4uLnByb3BzLmN1c3RvbVJlc291cmNlUHJvcGVydGllcyB9XG4gICAgICAgIDogZGVmYXVsdFBnU1RBQ0N1c3RvbU9wdGlvbnM7XG5cbiAgICAvLyB1cGRhdGUgcHJvcGVydGllc1xuICAgIGN1c3RvbVJlc291cmNlUHJvcGVydGllc1tcImNvbm5fc2VjcmV0X2FyblwiXSA9IHRoaXMuZGIuc2VjcmV0IS5zZWNyZXRBcm47XG4gICAgY3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzW1wibmV3X3VzZXJfc2VjcmV0X2FyblwiXSA9XG4gICAgICB0aGlzLnBnc3RhY1NlY3JldC5zZWNyZXRBcm47XG5cbiAgICAvLyBpZiBwcm9wcy5sYW1iZGFGdW5jdGlvbk9wdGlvbnMgZG9lc24ndCBoYXZlICdjb2RlJyBkZWZpbmVkLCB1cGRhdGUgcGdzdGFjX3ZlcnNpb24gKG5lZWRlZCBmb3IgZGVmYXVsdCBydW50aW1lKVxuICAgIGlmICghdXNlckNvZGUpIHtcbiAgICAgIGN1c3RvbVJlc291cmNlUHJvcGVydGllc1tcInBnc3RhY192ZXJzaW9uXCJdID0gdGhpcy5wZ3N0YWNWZXJzaW9uO1xuXG4gICAgICAvLyBBZGQgY29udGVudC1iYXNlZCBoYXNoIHRvIGVuc3VyZSB0aGUgTGFtYmRhIGdldHMgcmUtZXhlY3V0ZWQgb25seSB3aGVuIGNvZGUgb3IgY29uZmlnIGNoYW5nZXNcbiAgICAgIGN1c3RvbVJlc291cmNlUHJvcGVydGllc1tcImNvZGVfaGFzaFwiXSA9IGNvbXB1dGVMYW1iZGFDb2RlSGFzaChcbiAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICBidWlsZEFyZ3MsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGZvcmNlIHRoZSBib290c3RyYXAgcHJvY2VzcyB0byBydW4gYnkgYWRkaW5nIGEgdGltZXN0YW1wIHdoaWNoIHdpbGwgZW5zdXJlIHRoZSBjdXN0b20gcmVzb3VyY2UgZXhlY3V0ZXMgdGhlIExhbWJkYSBmdW5jdGlvblxuICAgIGlmIChwcm9wcy5mb3JjZUJvb3RzdHJhcCkge1xuICAgICAgY3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzW1widGltZXN0YW1wXCJdID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvb3RzdHJhcHBlciA9IG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCBcImJvb3RzdHJhcHBlclwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IGhhbmRsZXIuZnVuY3Rpb25Bcm4sXG4gICAgICBwcm9wZXJ0aWVzOiBjdXN0b21SZXNvdXJjZVByb3BlcnRpZXMsXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlJFVEFJTiwgLy8gVGhpcyByZXRhaW5zIHRoZSBjdXN0b20gcmVzb3VyY2UgKHdoaWNoIGRvZXNuJ3QgcmVhbGx5IGV4aXN0KSwgbm90IHRoZSBkYXRhYmFzZVxuICAgIH0pO1xuXG4gICAgLy8gUGdCb3VuY2VyOiBjb25uZWN0aW9uIHBvb2xlcmN1c3RvbXJlc291cmNlIHRyaWdnZXIgb24gcmVkZXBsb3lcbiAgICBjb25zdCBkZWZhdWx0UGdib3VuY2VySW5zdGFuY2VQcm9wczogUGFydGlhbDxlYzIuSW5zdGFuY2VQcm9wcz4gPSB7XG4gICAgICBpbnN0YW5jZU5hbWU6IGAke1N0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX0tcGdib3VuY2VyYCxcbiAgICAgIGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZS5vZihcbiAgICAgICAgZWMyLkluc3RhbmNlQ2xhc3MuVDMsXG4gICAgICAgIGVjMi5JbnN0YW5jZVNpemUuTUlDUk8sXG4gICAgICApLFxuICAgIH07XG4gICAgY29uc3QgYWRkUGdib3VuY2VyID0gcHJvcHMuYWRkUGdib3VuY2VyID8/IHRydWU7XG4gICAgaWYgKGFkZFBnYm91bmNlcikge1xuICAgICAgdGhpcy5fcGdCb3VuY2VyU2VydmVyID0gbmV3IFBnQm91bmNlcih0aGlzLCBcInBnYm91bmNlclwiLCB7XG4gICAgICAgIGluc3RhbmNlUHJvcHM6IHtcbiAgICAgICAgICAuLi5kZWZhdWx0UGdib3VuY2VySW5zdGFuY2VQcm9wcyxcbiAgICAgICAgICAuLi5wcm9wcy5wZ2JvdW5jZXJJbnN0YW5jZVByb3BzLFxuICAgICAgICB9LFxuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgZGF0YWJhc2U6IHtcbiAgICAgICAgICBjb25uZWN0aW9uczogdGhpcy5kYi5jb25uZWN0aW9ucyxcbiAgICAgICAgICBzZWNyZXQ6IHRoaXMucGdzdGFjU2VjcmV0LFxuICAgICAgICB9LFxuICAgICAgICBkYk1heENvbm5lY3Rpb25zOiBwYXJzZUludChkZWZhdWx0UGFyYW1ldGVycy5tYXhDb25uZWN0aW9ucyksXG4gICAgICAgIHVzZVB1YmxpY1N1Ym5ldDpcbiAgICAgICAgICAhcHJvcHMudnBjU3VibmV0cyB8fFxuICAgICAgICAgIHByb3BzLnZwY1N1Ym5ldHMuc3VibmV0VHlwZSA9PT0gZWMyLlN1Ym5ldFR5cGUuUFVCTElDLFxuICAgICAgICBwZ0JvdW5jZXJDb25maWc6IHtcbiAgICAgICAgICBwb29sTW9kZTogXCJ0cmFuc2FjdGlvblwiLFxuICAgICAgICAgIG1heENsaWVudENvbm46IDEwMDAsXG4gICAgICAgICAgZGVmYXVsdFBvb2xTaXplOiAyMCxcbiAgICAgICAgICBtaW5Qb29sU2l6ZTogMTAsXG4gICAgICAgICAgcmVzZXJ2ZVBvb2xTaXplOiA1LFxuICAgICAgICAgIHJlc2VydmVQb29sVGltZW91dDogNSxcbiAgICAgICAgfSxcbiAgICAgICAgbWFjaGluZUltYWdlU3NtUGFyYW1ldGVyOiBwcm9wcy5wZ2JvdW5jZXJBbWlTc21QYXJhbWV0ZXIsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fcGdCb3VuY2VyU2VydmVyLm5vZGUuYWRkRGVwZW5kZW5jeShib290c3RyYXBwZXIpO1xuXG4gICAgICAvLyBQYXRjaGluZyBpbmZyYXN0cnVjdHVyZSBmb3IgUGdCb3VuY2VyIGluc3RhbmNlXG4gICAgICBjb25zdCBhZGRQYXRjaE1hbmFnZXIgPSBwcm9wcy5hZGRQYXRjaE1hbmFnZXIgPz8gdHJ1ZTtcbiAgICAgIGlmIChhZGRQYXRjaE1hbmFnZXIpIHtcbiAgICAgICAgbmV3IFBhdGNoTWFuYWdlcih0aGlzLCBcIlBhdGNoTWFuYWdlclwiLCB7XG4gICAgICAgICAgaW5zdGFuY2VJZDogdGhpcy5fcGdCb3VuY2VyU2VydmVyLmluc3RhbmNlLmluc3RhbmNlSWQsXG4gICAgICAgICAgbWFpbnRlbmFuY2VXaW5kb3c6IHByb3BzLm1haW50ZW5hbmNlV2luZG93LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wZ3N0YWNTZWNyZXQgPSB0aGlzLl9wZ0JvdW5jZXJTZXJ2ZXIucGdib3VuY2VyU2VjcmV0O1xuICAgICAgdGhpcy5jb25uZWN0aW9uVGFyZ2V0ID0gdGhpcy5fcGdCb3VuY2VyU2VydmVyLmluc3RhbmNlO1xuICAgICAgdGhpcy5zZWN1cml0eUdyb3VwID0gdGhpcy5fcGdCb3VuY2VyU2VydmVyLnNlY3VyaXR5R3JvdXA7XG4gICAgICB0aGlzLnNlY3JldEJvb3RzdHJhcHBlciA9IHRoaXMuX3BnQm91bmNlclNlcnZlci5zZWNyZXRVcGRhdGVDb21wbGV0ZTtcbiAgICAgIHRoaXMucGdib3VuY2VySGVhbHRoQ2hlY2sgPSB0aGlzLl9wZ0JvdW5jZXJTZXJ2ZXIuaGVhbHRoQ2hlY2s7XG4gICAgICB0aGlzLnBnYm91bmNlckluc3RhbmNlSWQgPSB0aGlzLl9wZ0JvdW5jZXJTZXJ2ZXIuaW5zdGFuY2UuaW5zdGFuY2VJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25uZWN0aW9uVGFyZ2V0ID0gdGhpcy5kYjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVycyhcbiAgICBpbnN0YW5jZVR5cGU6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzOiBQZ1N0YWNEYXRhYmFzZVByb3BzW1wicGFyYW1ldGVyc1wiXSxcbiAgKTogRGF0YWJhc2VQYXJhbWV0ZXJzIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jbGkvaXNzdWVzLzEyNzkjaXNzdWVjb21tZW50LTkwOTMxODIzNlxuICAgIGNvbnN0IG1lbW9yeV9pbl9rYiA9IGluc3RhbmNlU2l6ZXNbaW5zdGFuY2VUeXBlXSAqIDEwMjQ7XG5cbiAgICAvLyBJdCdzIG9ubHkgbmVjZXNzYXJ5IHRvIGNvbnNpZGVyIHBhc3NlZCBpbiBwYXJhbWV0ZXJzIGZvciBhbnkgdmFsdWUgdGhhdCB1c2VkIHRvXG4gICAgLy8gZGVyaXZlIHN1YnNlcXVlbnQgdmFsdWVzLiBWYWx1ZXMgdGhhdCBkb24ndCBoYXZlIGRlcGVuZGVuY2llcyB3aWxsIGJlIG92ZXJyaWRlblxuICAgIC8vIHdoZW4gd2UgdW5wYWNrIHRoZSBwYXNzZWQtaW4gdXNlciBwYXJhbWV0ZXJzXG4gICAgY29uc3QgbWF4Q29ubmVjdGlvbnMgPSBwYXJhbWV0ZXJzPy5tYXhDb25uZWN0aW9uc1xuICAgICAgPyBOdW1iZXIucGFyc2VJbnQocGFyYW1ldGVycy5tYXhDb25uZWN0aW9ucylcbiAgICAgIDogLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblJEUy9sYXRlc3QvVXNlckd1aWRlL0NIQVBfTGltaXRzLmh0bWwjUkRTX0xpbWl0cy5NYXhDb25uZWN0aW9uc1xuICAgICAgICBNYXRoLm1pbihNYXRoLnJvdW5kKChtZW1vcnlfaW5fa2IgKiAxMDI0KSAvIDk1MzEzOTIpLCA1MDAwKTtcbiAgICBjb25zdCBzaGFyZWRCdWZmZXJzID0gcGFyYW1ldGVycz8uc2hhcmVkQnVmZXJzXG4gICAgICA/IE51bWJlci5wYXJzZUludChwYXJhbWV0ZXJzLnNoYXJlZEJ1ZmVycylcbiAgICAgIDogTWF0aC5yb3VuZCgwLjI1ICogbWVtb3J5X2luX2tiKTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZUNhY2hlU2l6ZSA9IE1hdGgucm91bmQoMC43NSAqIG1lbW9yeV9pbl9rYik7XG4gICAgY29uc3Qgd29ya01lbSA9IE1hdGguZmxvb3Ioc2hhcmVkQnVmZmVycyAvIG1heENvbm5lY3Rpb25zKTtcbiAgICBjb25zdCBtYWludGVuYW5jZVdvcmtNZW0gPSBNYXRoLnJvdW5kKDAuMjUgKiBzaGFyZWRCdWZmZXJzKTtcblxuICAgIGNvbnN0IHRlbXBCdWZmZXJzID0gMTI4ICogMTAyNDtcbiAgICBjb25zdCBzZXFQYWdlQ29zdCA9IDE7XG4gICAgY29uc3QgcmFuZG9tUGFnZUNvc3QgPSAxLjE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWF4Q29ubmVjdGlvbnM6IGAke21heENvbm5lY3Rpb25zfWAsXG4gICAgICBzaGFyZWRCdWZmZXJzOiBgJHtzaGFyZWRCdWZmZXJzIC8gOH1gLCAvLyBSZXByZXNlbnRlZCBpbiA4a2IgYmxvY2tzXG4gICAgICBlZmZlY3RpdmVDYWNoZVNpemU6IGAke2VmZmVjdGl2ZUNhY2hlU2l6ZSAvIDh9YCwgLy8gUmVwcmVzZW50ZWQgaW4gOGtiIGJsb2Nrc1xuICAgICAgd29ya01lbTogYCR7d29ya01lbX1gLFxuICAgICAgbWFpbnRlbmFuY2VXb3JrTWVtOiBgJHttYWludGVuYW5jZVdvcmtNZW19YCxcbiAgICAgIG1heExvY2tzUGVyVHJhbnNhY3Rpb246IFwiMTAyNFwiLFxuICAgICAgdGVtcEJ1ZmZlcnM6IGAke3RlbXBCdWZmZXJzIC8gOH1gLCAvLyBSZXByZXNlbnRlZCBpbiA4a2IgYmxvY2tzXG4gICAgICBzZXFQYWdlQ29zdDogYCR7c2VxUGFnZUNvc3R9YCxcbiAgICAgIHJhbmRvbVBhZ2VDb3N0OiBgJHtyYW5kb21QYWdlQ29zdH1gLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZ1N0YWNEYXRhYmFzZVByb3BzIGV4dGVuZHMgcmRzLkRhdGFiYXNlSW5zdGFuY2VQcm9wcyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIGRhdGFiYXNlIHRoYXQgaXMgdG8gYmUgY3JlYXRlZCBhbmQgb250byB3aGljaCBwZ1NUQUMgd2lsbCBiZSBpbnN0YWxsZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHBnc3RhY1xuICAgKi9cbiAgcmVhZG9ubHkgcGdzdGFjRGJOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHBnc3RhYyB0byBpbnN0YWxsIG9uIHRoZSBkYXRhYmFzZVxuICAgKlxuICAgKiBAZGVmYXVsdCAwLjguNVxuICAgKi9cbiAgcmVhZG9ubHkgcGdzdGFjVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUHJlZml4IHRvIGFzc2lnbiB0byB0aGUgZ2VuZXJhdGVkIGBzZWNyZXRzX21hbmFnZXIuU2VjcmV0YFxuICAgKlxuICAgKiBAZGVmYXVsdCBwZ3N0YWNcbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldHNQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdXNlciB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBjb25uZWN0aW5nIHRvIHRoZSBwZ1NUQUMgZGF0YWJhc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHBnc3RhY191c2VyXG4gICAqL1xuICByZWFkb25seSBwZ3N0YWNVc2VybmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkIHBnYm91bmNlciBpbnN0YW5jZSBmb3IgbWFuYWdpbmcgdHJhZmZpYyB0byB0aGUgcGdTVEFDIGRhdGFiYXNlXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGFkZFBnYm91bmNlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgZm9yIHRoZSBwZ2JvdW5jZXIgZWMyIGluc3RhbmNlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmaW5lZCBpbiB0aGUgY29uc3RydWN0XG4gICAqL1xuICByZWFkb25seSBwZ2JvdW5jZXJJbnN0YW5jZVByb3BzPzogZWMyLkluc3RhbmNlUHJvcHMgfCBhbnk7XG5cbiAgLyoqXG4gICAqIFNTTSBwYXJhbWV0ZXIgcGF0aCBmb3IgdGhlIFBnQm91bmNlciBFQzIgaW5zdGFuY2UgbWFjaGluZSBpbWFnZSAoQU1JKS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIGxhdGVzdCBVYnVudHUgTm9ibGUgQU1JIChgY3VycmVudGApLiBGb3Igc3RhYmxlIGRlcGxveW1lbnRzXG4gICAqIHdoZXJlIEVDMiByZXBsYWNlbWVudCBzaG91bGQgb25seSBoYXBwZW4gb24gZXhwbGljaXQgaW50ZW50LCBwaW4gdGhpcyB0byBhXG4gICAqIHNwZWNpZmljIGRhdGUtdmVyc2lvbmVkIHBhdGg6XG4gICAqICAgL2F3cy9zZXJ2aWNlL2Nhbm9uaWNhbC91YnVudHUvc2VydmVyL25vYmxlL3N0YWJsZS9ZWVlZTU1ERC5YL2FtZDY0L2h2bS9lYnMtZ3AzL2FtaS1pZFxuICAgKlxuICAgKiBUbyBsaXN0IGF2YWlsYWJsZSBkYXRlLXZlcnNpb25lZCBwYXRocyBpbiB5b3VyIHJlZ2lvbjpcbiAgICogICBhd3Mgc3NtIGdldC1wYXJhbWV0ZXJzLWJ5LXBhdGggLS1wYXRoIFwiL2F3cy9zZXJ2aWNlL2Nhbm9uaWNhbC91YnVudHUvc2VydmVyL25vYmxlL3N0YWJsZS9cIiAtLXJlY3Vyc2l2ZSAtLXF1ZXJ5IFwiUGFyYW1ldGVyc1s/ZW5kc193aXRoKE5hbWUsICdhbWQ2NC9odm0vZWJzLWdwMy9hbWktaWQnKV0uTmFtZVwiXG4gICAqXG4gICAqIFNlZTogaHR0cHM6Ly9kb2N1bWVudGF0aW9uLnVidW50dS5jb20vYXdzL2F3cy1ob3ctdG8vaW5zdGFuY2VzL2ZpbmQtdWJ1bnR1LWltYWdlcy9cbiAgICpcbiAgICogV2l0aCBhZGRQYXRjaE1hbmFnZXI6IHRydWUgKGRlZmF1bHQpLCBTU00gUGF0Y2ggTWFuYWdlciBoYW5kbGVzIE9TIHNlY3VyaXR5XG4gICAqIHVwZGF0ZXMgd2l0aG91dCByZXF1aXJpbmcgaW5zdGFuY2UgcmVwbGFjZW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC9hd3Mvc2VydmljZS9jYW5vbmljYWwvdWJ1bnR1L3NlcnZlci9ub2JsZS9zdGFibGUvMjAyNjAyMTgvYW1kNjQvaHZtL2Vicy1ncDMvYW1pLWlkXG4gICAqL1xuICByZWFkb25seSBwZ2JvdW5jZXJBbWlTc21QYXJhbWV0ZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZCBwYXRjaGluZyBzeXN0ZW0gdXNpbmcgQVdTIFNTTSBmb3IgcGdib3VuY2VyIGluc3RhbmNlIG1haW50ZW5hbmNlXG4gICAqIGBhZGRQZ2JvdW5jZXJgIG11c3QgYmUgdHJ1ZSBmb3IgdGhpcyB0byBoYXZlIGFuIGVmZmVjdFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhZGRQYXRjaE1hbmFnZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gbWFpbnRlbmFuY2Ugd2luZG93IGZvciBwYXRjaGluZ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgbmV3IG1haW50ZW5hbmNlIHdpbmRvdyB3aWxsIGJlIGNyZWF0ZWQsIGRlZmluZWQgaW4gY29uc3RydWN0XG4gICAqL1xuICByZWFkb25seSBtYWludGVuYW5jZVdpbmRvdz86IHNzbS5DZm5NYWludGVuYW5jZVdpbmRvdztcblxuICAvKipcbiAgICogTGFtYmRhIGZ1bmN0aW9uIEN1c3RvbSBSZXNvdXJjZSBwcm9wZXJ0aWVzLiBBIGN1c3RvbSByZXNvdXJjZSBwcm9wZXJ0eSBpcyBnb2luZyB0byBiZSBjcmVhdGVkXG4gICAqIHRvIHRyaWdnZXIgdGhlIGJvb3N0cmFwcGluZyBsYW1iZGEgZnVuY3Rpb24uIFRoaXMgcGFyYW1ldGVyIGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgcHJvcGVydGllc1xuICAgKiBvbiB0b3Agb2YgdGhlIGRlZmF1bHRzIG9uZXMuXG4gICAqXG4gICAqL1xuICByZWFkb25seSBjdXN0b21SZXNvdXJjZVByb3BlcnRpZXM/OiB7XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBsYW1iZGEgZnVuY3Rpb24gcHJvcGVydGllcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZpbmVkIGluIHRoZSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBwZXJMYW1iZGFGdW5jdGlvbk9wdGlvbnM/OiBDdXN0b21MYW1iZGFGdW5jdGlvblByb3BzO1xuXG4gIC8qKlxuICAgKiBGb3JjZSByZWRlcGxveW1lbnQgb2YgdGhlIGRhdGFiYXNlIGJvb3RzdHJhcHBlciBMYW1iZGEgb24gZXZlcnkgZGVwbG95LlxuICAgKlxuICAgKiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSB3aGVuIHVzaW5nIGN1c3RvbSBMYW1iZGEgY29kZSB2aWEgYm9vdHN0cmFwcGVyTGFtYmRhRnVuY3Rpb25PcHRpb25zLlxuICAgKiBXaGVuIGVuYWJsZWQsIGEgdGltZXN0YW1wIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGN1c3RvbSByZXNvdXJjZSBwcm9wZXJ0aWVzIHRvIGVuc3VyZVxuICAgKiB0aGUgYm9vdHN0cmFwcGVyIExhbWJkYSBydW5zIG9uIGV2ZXJ5IGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEZvciB0aGUgZGVmYXVsdCBEb2NrZXItYmFzZWQgYm9vdHN0cmFwIGNvZGUsIHRoaXMgZmxhZyBpcyBpZ25vcmVkIGFuZCBhIGNvbnRlbnQtYmFzZWRcbiAgICogaGFzaCBpcyB1c2VkIGluc3RlYWQgKHdoaWNoIGF1dG9tYXRpY2FsbHkgdHJpZ2dlcnMgcmVkZXBsb3ltZW50IHdoZW4gY29kZSBjaGFuZ2VzKS5cbiAgICpcbiAgICogKipBbHRlcm5hdGl2ZSBhcHByb2FjaDoqKiBJbnN0ZWFkIG9mIHVzaW5nIHRoaXMgZmxhZywgeW91IGNhbiB0cmlnZ2VyIGJvb3RzdHJhcCBieVxuICAgKiBtb2RpZnlpbmcgYW55IHByb3BlcnR5IGluIGBjdXN0b21SZXNvdXJjZVByb3BlcnRpZXNgIChlLmcuLCBpbmNyZW1lbnQgYHBnc3RhY192ZXJzaW9uYFxuICAgKiBvciBhZGQgYSBgcmVidWlsZF90cmlnZ2VyYCBwcm9wZXJ0eSB3aXRoIGEgbmV3IHZhbHVlKS4gVGhpcyBnaXZlcyB5b3UgbW9yZSBncmFudWxhclxuICAgKiBjb250cm9sIG92ZXIgd2hlbiByZWRlcGxveW1lbnQgaGFwcGVucy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGZvcmNlQm9vdHN0cmFwPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZVBhcmFtZXRlcnMge1xuICAvKipcbiAgICogQGRlZmF1bHQgLSBMRUFTVCh7REJJbnN0YW5jZUNsYXNzTWVtb3J5Lzk1MzEzOTJ9LCA1MDAwKVxuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q29ubmVjdGlvbnM6IHN0cmluZztcblxuICAvKipcbiAgICogTm90ZTogVGhpcyB2YWx1ZSBpcyBtZWFzdXJlZCBpbiA4S0IgYmxvY2tzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAne0RCSW5zdGFuY2VDbGFzc01lbW9yeS8zMjc2OH0nIDI1JSBvZiBpbnN0YW5jZSBtZW1vcnksIGllIGB7KERCSW5zdGFuY2VDbGFzc01lbW9yeS8oMTAyNCo4KSkgKiAwLjI1fWBcbiAgICovXG4gIHJlYWRvbmx5IHNoYXJlZEJ1ZmZlcnM6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgLSA3NSUgb2YgaW5zdGFuY2UgbWVtb3J5XG4gICAqL1xuICByZWFkb25seSBlZmZlY3RpdmVDYWNoZVNpemU6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgLSBzaGFyZWQgYnVmZmVycyBkaXZpZGVkIGJ5IG1heCBjb25uZWN0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgd29ya01lbTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIDI1JSBvZiBzaGFyZWQgYnVmZmVyc1xuICAgKi9cbiAgcmVhZG9ubHkgbWFpbnRlbmFuY2VXb3JrTWVtOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IDEwMjRcbiAgICovXG4gIHJlYWRvbmx5IG1heExvY2tzUGVyVHJhbnNhY3Rpb246IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgMTMxMTcyICgxMjggKiAxMDI0KVxuICAgKi9cbiAgcmVhZG9ubHkgdGVtcEJ1ZmZlcnM6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVhZG9ubHkgc2VxUGFnZUNvc3Q6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgMS4xXG4gICAqL1xuICByZWFkb25seSByYW5kb21QYWdlQ29zdDogc3RyaW5nO1xufVxuIl19