@trautonen/cdk-dns-validated-certificate 0.0.11 → 0.0.13

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
@@ -3515,7 +3515,7 @@
3515
3515
  },
3516
3516
  "locationInModule": {
3517
3517
  "filename": "src/dns-validated-certificate.ts",
3518
- "line": 180
3518
+ "line": 181
3519
3519
  },
3520
3520
  "parameters": [
3521
3521
  {
@@ -3554,7 +3554,7 @@
3554
3554
  "kind": "class",
3555
3555
  "locationInModule": {
3556
3556
  "filename": "src/dns-validated-certificate.ts",
3557
- "line": 151
3557
+ "line": 152
3558
3558
  },
3559
3559
  "methods": [
3560
3560
  {
@@ -3565,7 +3565,7 @@
3565
3565
  },
3566
3566
  "locationInModule": {
3567
3567
  "filename": "src/dns-validated-certificate.ts",
3568
- "line": 284
3568
+ "line": 285
3569
3569
  },
3570
3570
  "name": "applyRemovalPolicy",
3571
3571
  "overrides": "aws-cdk-lib.Resource",
@@ -3586,7 +3586,7 @@
3586
3586
  },
3587
3587
  "locationInModule": {
3588
3588
  "filename": "src/dns-validated-certificate.ts",
3589
- "line": 272
3589
+ "line": 273
3590
3590
  },
3591
3591
  "name": "metricDaysToExpiry",
3592
3592
  "overrides": "aws-cdk-lib.aws_certificatemanager.ICertificate",
@@ -3616,7 +3616,7 @@
3616
3616
  "immutable": true,
3617
3617
  "locationInModule": {
3618
3618
  "filename": "src/dns-validated-certificate.ts",
3619
- "line": 153
3619
+ "line": 154
3620
3620
  },
3621
3621
  "name": "certificateArn",
3622
3622
  "overrides": "aws-cdk-lib.aws_certificatemanager.ICertificate",
@@ -3632,7 +3632,7 @@
3632
3632
  "immutable": true,
3633
3633
  "locationInModule": {
3634
3634
  "filename": "src/dns-validated-certificate.ts",
3635
- "line": 156
3635
+ "line": 157
3636
3636
  },
3637
3637
  "name": "certificateRegion",
3638
3638
  "type": {
@@ -3647,7 +3647,7 @@
3647
3647
  "immutable": true,
3648
3648
  "locationInModule": {
3649
3649
  "filename": "src/dns-validated-certificate.ts",
3650
- "line": 165
3650
+ "line": 166
3651
3651
  },
3652
3652
  "name": "domainName",
3653
3653
  "type": {
@@ -3662,7 +3662,7 @@
3662
3662
  "immutable": true,
3663
3663
  "locationInModule": {
3664
3664
  "filename": "src/dns-validated-certificate.ts",
3665
- "line": 159
3665
+ "line": 160
3666
3666
  },
3667
3667
  "name": "hostedZoneId",
3668
3668
  "type": {
@@ -3677,7 +3677,7 @@
3677
3677
  "immutable": true,
3678
3678
  "locationInModule": {
3679
3679
  "filename": "src/dns-validated-certificate.ts",
3680
- "line": 162
3680
+ "line": 163
3681
3681
  },
3682
3682
  "name": "hostedZoneName",
3683
3683
  "type": {
@@ -3692,7 +3692,7 @@
3692
3692
  "immutable": true,
3693
3693
  "locationInModule": {
3694
3694
  "filename": "src/dns-validated-certificate.ts",
3695
- "line": 168
3695
+ "line": 169
3696
3696
  },
3697
3697
  "name": "tags",
3698
3698
  "overrides": "aws-cdk-lib.ITaggable",
@@ -3713,7 +3713,7 @@
3713
3713
  "kind": "interface",
3714
3714
  "locationInModule": {
3715
3715
  "filename": "src/dns-validated-certificate.ts",
3716
- "line": 12
3716
+ "line": 13
3717
3717
  },
3718
3718
  "name": "DnsValidatedCertificateProps",
3719
3719
  "properties": [
@@ -3727,7 +3727,7 @@
3727
3727
  "immutable": true,
3728
3728
  "locationInModule": {
3729
3729
  "filename": "src/dns-validated-certificate.ts",
3730
- "line": 18
3730
+ "line": 19
3731
3731
  },
3732
3732
  "name": "domainName",
3733
3733
  "type": {
@@ -3744,7 +3744,7 @@
3744
3744
  "immutable": true,
3745
3745
  "locationInModule": {
3746
3746
  "filename": "src/dns-validated-certificate.ts",
3747
- "line": 26
3747
+ "line": 27
3748
3748
  },
3749
3749
  "name": "hostedZone",
3750
3750
  "type": {
@@ -3762,7 +3762,7 @@
3762
3762
  "immutable": true,
3763
3763
  "locationInModule": {
3764
3764
  "filename": "src/dns-validated-certificate.ts",
3765
- "line": 36
3765
+ "line": 37
3766
3766
  },
3767
3767
  "name": "certificateRegion",
3768
3768
  "optional": true,
@@ -3781,7 +3781,7 @@
3781
3781
  "immutable": true,
3782
3782
  "locationInModule": {
3783
3783
  "filename": "src/dns-validated-certificate.ts",
3784
- "line": 80
3784
+ "line": 81
3785
3785
  },
3786
3786
  "name": "cleanupValidationRecords",
3787
3787
  "optional": true,
@@ -3800,7 +3800,7 @@
3800
3800
  "immutable": true,
3801
3801
  "locationInModule": {
3802
3802
  "filename": "src/dns-validated-certificate.ts",
3803
- "line": 47
3803
+ "line": 48
3804
3804
  },
3805
3805
  "name": "customResourceRole",
3806
3806
  "optional": true,
@@ -3819,7 +3819,7 @@
3819
3819
  "immutable": true,
3820
3820
  "locationInModule": {
3821
3821
  "filename": "src/dns-validated-certificate.ts",
3822
- "line": 105
3822
+ "line": 106
3823
3823
  },
3824
3824
  "name": "removalPolicy",
3825
3825
  "optional": true,
@@ -3839,7 +3839,7 @@
3839
3839
  "immutable": true,
3840
3840
  "locationInModule": {
3841
3841
  "filename": "src/dns-validated-certificate.ts",
3842
- "line": 92
3842
+ "line": 93
3843
3843
  },
3844
3844
  "name": "transparencyLoggingEnabled",
3845
3845
  "optional": true,
@@ -3858,7 +3858,7 @@
3858
3858
  "immutable": true,
3859
3859
  "locationInModule": {
3860
3860
  "filename": "src/dns-validated-certificate.ts",
3861
- "line": 68
3861
+ "line": 69
3862
3862
  },
3863
3863
  "name": "validationExternalId",
3864
3864
  "optional": true,
@@ -3877,7 +3877,7 @@
3877
3877
  "immutable": true,
3878
3878
  "locationInModule": {
3879
3879
  "filename": "src/dns-validated-certificate.ts",
3880
- "line": 59
3880
+ "line": 60
3881
3881
  },
3882
3882
  "name": "validationRole",
3883
3883
  "optional": true,
@@ -3889,6 +3889,6 @@
3889
3889
  "symbolId": "src/dns-validated-certificate:DnsValidatedCertificateProps"
3890
3890
  }
3891
3891
  },
3892
- "version": "0.0.11",
3893
- "fingerprint": "UWODcZaDCR8Egdo0YPMxGXweiPe7rbmVhGfVCjY8lPA="
3892
+ "version": "0.0.13",
3893
+ "fingerprint": "yMkGuOMSUXFw5LgYymnDbA9xwQN4GJUBh3sQJJLNyoE="
3894
3894
  }
package/.mergify.yml ADDED
@@ -0,0 +1,23 @@
1
+ # ~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen".
2
+
3
+ queue_rules:
4
+ - name: default
5
+ merge_method: fast-forward
6
+ update_method: rebase
7
+ conditions:
8
+ - and:
9
+ - "#approved-reviews-by>=1"
10
+ - check-success=build
11
+ - check-success=package-js
12
+ pull_request_rules:
13
+ - name: auto-approve
14
+ conditions:
15
+ - and:
16
+ - base=main
17
+ - label=auto-approve
18
+ - "#approved-reviews-by>=1"
19
+ - check-success=build
20
+ - check-success=package-js
21
+ actions:
22
+ queue:
23
+ name: default
package/.projenrc.ts CHANGED
@@ -46,11 +46,50 @@ const project = new awscdk.AwsCdkConstructLibrary({
46
46
  },
47
47
  },
48
48
 
49
- autoMerge: true,
49
+ githubOptions: {
50
+ mergify: true,
51
+ mergifyOptions: {
52
+ rules: [
53
+ {
54
+ name: 'auto-approve',
55
+ conditions: [
56
+ {
57
+ and: [
58
+ 'base=main',
59
+ 'label=auto-approve',
60
+ '#approved-reviews-by>=1',
61
+ 'check-success=build',
62
+ 'check-success=package-js',
63
+ ],
64
+ },
65
+ ],
66
+ actions: {
67
+ queue: {
68
+ name: 'default',
69
+ },
70
+ },
71
+ },
72
+ ],
73
+ queues: [
74
+ {
75
+ name: 'default',
76
+ mergeMethod: 'fast-forward',
77
+ updateMethod: 'rebase',
78
+ conditions: [
79
+ {
80
+ and: ['#approved-reviews-by>=1', 'check-success=build', 'check-success=package-js'],
81
+ },
82
+ ],
83
+ },
84
+ ],
85
+ },
86
+ },
87
+
88
+ autoMerge: false,
50
89
  autoApproveUpgrades: true,
51
90
 
52
91
  autoApproveOptions: {
53
- allowedUsernames: ['github-bot', 'trautonen'],
92
+ allowedUsernames: ['github-actions[bot]', 'trautonen'],
54
93
  label: 'auto-approve',
55
94
  secret: 'GITHUB_TOKEN',
56
95
  },
@@ -37,7 +37,15 @@ var crypto = __toESM(require("crypto"));
37
37
  var import_client_acm = require("@aws-sdk/client-acm");
38
38
  var import_client_route_53 = require("@aws-sdk/client-route-53");
39
39
  var import_client_sts = require("@aws-sdk/client-sts");
40
+
41
+ // src/utils.ts
40
42
  var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
43
+ var stringToBoolean = (value) => {
44
+ return value === "true" ? true : false;
45
+ };
46
+ var objectToString = (value) => {
47
+ return JSON.stringify(value, void 0, 2);
48
+ };
41
49
  var containsSame = (array1, array2) => {
42
50
  if (array1.length !== array2.length)
43
51
  return false;
@@ -57,12 +65,11 @@ var tryFor = async (maxSeconds, timeoutError, fn) => {
57
65
  await sleep(Math.random() * base * 50 + base * 150);
58
66
  }
59
67
  };
68
+
69
+ // src/certificate-requestor.lambda.ts
60
70
  var parseProperties = (properties) => {
61
71
  return properties;
62
72
  };
63
- var stringifyProperties = (properties) => {
64
- return JSON.stringify(properties, void 0, 2);
65
- };
66
73
  var parseDomainValidationRecords = (certificate) => {
67
74
  const options = certificate.DomainValidationOptions ?? [];
68
75
  if (options.length > 0 && options.every((opt) => opt.ResourceRecord?.Name)) {
@@ -232,7 +239,7 @@ var handler = async (event) => {
232
239
  switch (event.RequestType) {
233
240
  case "Create": {
234
241
  console.log(`Requesting new certificate:
235
- ${stringifyProperties(properties)}`);
242
+ ${objectToString(properties)}`);
236
243
  const certificateArn = await requestCertificate(acm, route53, event.RequestId, properties);
237
244
  if (properties.Tags && Object.entries(properties.Tags).length > 0) {
238
245
  await addTags(acm, certificateArn, properties.Tags);
@@ -248,7 +255,7 @@ ${stringifyProperties(properties)}`);
248
255
  let certificateArn = event.PhysicalResourceId;
249
256
  if (shouldRequestNew(parseProperties(event.OldResourceProperties), properties)) {
250
257
  console.log(`Requesting new certificate due to change of properties:
251
- ${stringifyProperties(properties)}`);
258
+ ${objectToString(properties)}`);
252
259
  certificateArn = await requestCertificate(acm, route53, event.RequestId, properties);
253
260
  }
254
261
  if (properties.Tags && Object.entries(properties.Tags).length > 0) {
@@ -265,13 +272,13 @@ ${stringifyProperties(properties)}`);
265
272
  const certificateArn = event.PhysicalResourceId;
266
273
  if (properties.RemovalPolicy === "destroy") {
267
274
  console.log(`Deleting old certificate as per removal policy:
268
- ${stringifyProperties(properties)}`);
275
+ ${objectToString(properties)}`);
269
276
  await deleteCertificate(
270
277
  acm,
271
278
  route53,
272
279
  certificateArn,
273
280
  properties.HostedZoneId,
274
- properties.CleanupValidationRecords
281
+ stringToBoolean(properties.CleanupValidationRecords)
275
282
  );
276
283
  }
277
284
  return {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/certificate-requestor.lambda.ts"],
4
- "sourcesContent": ["import * as crypto from 'crypto'\nimport {\n ACMClient,\n AddTagsToCertificateCommand,\n AddTagsToCertificateCommandInput,\n CertificateDetail,\n DeleteCertificateCommand,\n DeleteCertificateCommandInput,\n DescribeCertificateCommand,\n DescribeCertificateCommandInput,\n RequestCertificateCommand,\n RequestCertificateCommandInput,\n waitUntilCertificateValidated,\n} from '@aws-sdk/client-acm'\nimport {\n ChangeAction,\n ChangeResourceRecordSetsCommand,\n ChangeResourceRecordSetsCommandInput,\n InvalidChangeBatch,\n ResourceRecordSet,\n Route53Client,\n waitUntilResourceRecordSetsChanged,\n} from '@aws-sdk/client-route-53'\nimport { AssumeRoleCommand, AssumeRoleCommandInput, STSClient } from '@aws-sdk/client-sts'\nimport type { AwsCredentialIdentity, Provider } from '@aws-sdk/types'\nimport type { CloudFormationCustomResourceEvent } from 'aws-lambda'\n\nexport type Properties = {\n HostedZoneId: string\n DomainName: string\n SubjectAlternativeNames?: string[]\n CertificateRegion: string\n ValidationRoleArn?: string\n ValidationExternalId?: string\n CleanupValidationRecords: boolean\n TransparencyLoggingEnabled: boolean\n Tags?: Record<string, string>\n RemovalPolicy: string\n}\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\n\nconst containsSame = <T>(array1: T[], array2: T[]): boolean => {\n if (array1.length !== array2.length) return false\n return array1.every((v1) => array2.includes(v1))\n}\n\nconst tryFor = async <T>(maxSeconds: number, timeoutError: string, fn: () => Promise<T | null>): Promise<T> => {\n const startTime = Date.now()\n // eslint-disable-next-line no-constant-condition\n for (let i = 0; true; i++) {\n if (Date.now() > startTime + maxSeconds * 1000) {\n throw new Error(timeoutError)\n }\n const result = await fn()\n if (result !== null) {\n return result\n }\n const base = Math.pow(2, i)\n await sleep(Math.random() * base * 50 + base * 150)\n }\n}\n\nconst parseProperties = (properties: Record<string, any>): Properties => {\n // maybe should actually parse and not just assume\n return properties as unknown as Properties\n}\n\nconst stringifyProperties = (properties: Properties): string => {\n return JSON.stringify(properties, undefined, 2)\n}\n\nconst parseDomainValidationRecords = (certificate: CertificateDetail): ResourceRecordSet[] | null => {\n const options = certificate.DomainValidationOptions ?? []\n if (options.length > 0 && options.every((opt) => opt.ResourceRecord?.Name)) {\n const uniqueRecords = [...new Map(options.map((opt) => [opt.ResourceRecord?.Name!, opt.ResourceRecord!])).values()]\n return uniqueRecords.map((record) => {\n return {\n Name: record.Name,\n Type: record.Type,\n TTL: 30,\n ResourceRecords: [\n {\n Value: record.Value,\n },\n ],\n }\n })\n }\n return null\n}\n\nconst changeRecordSets = async (\n route53: Route53Client,\n action: ChangeAction,\n records: ResourceRecordSet[],\n hostedZoneId: string\n): Promise<string> => {\n const changeRecordSetsInput: ChangeResourceRecordSetsCommandInput = {\n HostedZoneId: hostedZoneId,\n ChangeBatch: {\n Changes: records.map((record) => ({\n Action: action,\n ResourceRecordSet: record,\n })),\n },\n }\n const { ChangeInfo } = await route53.send(new ChangeResourceRecordSetsCommand(changeRecordSetsInput))\n const result = await waitUntilResourceRecordSetsChanged({ client: route53, maxWaitTime: 180 }, { Id: ChangeInfo?.Id })\n if (result.state !== 'SUCCESS') {\n throw new Error(\n `Record sets never changed for hosted zone ${hostedZoneId}: [${result.state}] ${result.reason ?? ''}`\n )\n }\n return ChangeInfo?.Id!\n}\n\nconst requestCertificate = async (\n acm: ACMClient,\n route53: Route53Client,\n requestId: string,\n properties: Properties\n): Promise<string> => {\n const { HostedZoneId, DomainName, SubjectAlternativeNames, TransparencyLoggingEnabled } = properties\n\n console.log(`Requesting certificate for ${DomainName}`)\n\n const requestCertificateInput: RequestCertificateCommandInput = {\n DomainName,\n SubjectAlternativeNames: SubjectAlternativeNames,\n IdempotencyToken: crypto.createHash('sha256').update(requestId).digest('hex').slice(0, 32),\n ValidationMethod: 'DNS',\n Options: {\n CertificateTransparencyLoggingPreference: TransparencyLoggingEnabled ? 'ENABLED' : 'DISABLED',\n },\n }\n const { CertificateArn } = await acm.send(new RequestCertificateCommand(requestCertificateInput))\n\n console.log(`Certificate ${CertificateArn} requested`)\n\n const validationMaxSeconds = 180\n const validationTimeoutError = `Domain validation options were not found in ${validationMaxSeconds} seconds`\n const validationRecords = await tryFor(validationMaxSeconds, validationTimeoutError, async () => {\n const describeCertificateInput: DescribeCertificateCommandInput = {\n CertificateArn,\n }\n const { Certificate } = await acm.send(new DescribeCertificateCommand(describeCertificateInput))\n return parseDomainValidationRecords(Certificate!)\n })\n\n console.log(`Upserting ${validationRecords.length} validation record(s) into hosted zone ${HostedZoneId}:`)\n validationRecords.forEach((record) =>\n console.log(`${record.Name} ${record.Type} ${record.ResourceRecords?.map((rr) => rr.Value).join(',')}`)\n )\n const changeId = await changeRecordSets(route53, 'UPSERT', validationRecords, HostedZoneId)\n console.log(`All validation records changed succesfully for change id ${changeId.replace('/change/', '')}`)\n\n console.log(`Waiting for certificate ${CertificateArn} to validate`)\n const result = await waitUntilCertificateValidated({ client: acm, maxWaitTime: 300 }, { CertificateArn })\n if (result.state !== 'SUCCESS') {\n throw new Error(`Certificate failed ${CertificateArn} to validate: [${result.state}] ${result.reason ?? ''}`)\n }\n console.log(`Certificate ${CertificateArn} successfully validated`)\n return CertificateArn!\n}\n\nconst deleteCertificate = async (\n acm: ACMClient,\n route53: Route53Client,\n certificateArn: string,\n hostedZoneId: string,\n cleanupValidationRecords: boolean\n): Promise<void> => {\n console.log(`Waiting for certificate ${certificateArn} usage to drain before deletion`)\n\n const waitUsageMaxSeconds = 600\n const waitUsageTimeoutError = `Certificate was still in use after ${waitUsageMaxSeconds} seconds`\n const certificate = await tryFor(waitUsageMaxSeconds, waitUsageTimeoutError, async () => {\n const describeCertificateInput: DescribeCertificateCommandInput = {\n CertificateArn: certificateArn,\n }\n const { Certificate } = await acm.send(new DescribeCertificateCommand(describeCertificateInput))\n const inUseBy = Certificate?.InUseBy ?? []\n if (inUseBy.length > 0) {\n return null\n }\n return Certificate!\n })\n console.log('Certificate is unused and will be deleted')\n\n const validationRecords = parseDomainValidationRecords(certificate)\n if (validationRecords && cleanupValidationRecords) {\n console.log(`Deleting ${validationRecords.length} validation record(s) from hosted zone ${hostedZoneId}`)\n try {\n const changeId = await changeRecordSets(route53, 'DELETE', validationRecords, hostedZoneId)\n console.log(`All validation records removed successfully for change id ${changeId.replace('/change/', '')}`)\n } catch (error) {\n if (error instanceof InvalidChangeBatch && error.message.includes('not found')) {\n // there's a deletion race condition where some other certificate has already deleted the records\n console.log(`All validation records have already been removed by some other certificate`)\n } else {\n throw error\n }\n }\n }\n\n console.log(`Deleting certificate ${certificateArn} from ACM`)\n const deleteCertificateInput: DeleteCertificateCommandInput = {\n CertificateArn: certificateArn,\n }\n await acm.send(new DeleteCertificateCommand(deleteCertificateInput))\n console.log(`Certificate ${certificateArn} successfully deleted`)\n}\n\nconst addTags = async (acm: ACMClient, certificateArn: string, tags: Record<string, string>) => {\n const tagList = Array.from(Object.entries(tags).map(([Key, Value]) => ({ Key, Value })))\n const addTagsInput: AddTagsToCertificateCommandInput = {\n CertificateArn: certificateArn,\n Tags: tagList,\n }\n\n console.log(`Adding ${tagList.length} tags to certificate ${certificateArn}`)\n await acm.send(new AddTagsToCertificateCommand(addTagsInput))\n console.log(`All tags successfully added to certificate ${certificateArn}`)\n}\n\nconst shouldRequestNew = (oldProperties: Properties, newProperties: Properties): boolean => {\n if (oldProperties.HostedZoneId !== newProperties.HostedZoneId) return true\n if (oldProperties.DomainName !== newProperties.DomainName) return true\n if (oldProperties.CertificateRegion !== newProperties.CertificateRegion) return true\n if (!containsSame(oldProperties.SubjectAlternativeNames ?? [], newProperties.SubjectAlternativeNames ?? []))\n return true\n if (oldProperties.CleanupValidationRecords !== newProperties.CleanupValidationRecords) return true\n if (oldProperties.TransparencyLoggingEnabled !== newProperties.TransparencyLoggingEnabled) return true\n if (oldProperties.RemovalPolicy !== newProperties.RemovalPolicy) return true\n return false\n}\n\nconst assumeRole = (\n roleArn: string | undefined,\n externalId: string | undefined\n): Provider<AwsCredentialIdentity> | undefined => {\n if (!roleArn) {\n return undefined\n }\n return async () => {\n const sts = new STSClient({ retryMode: 'adaptive' })\n const assumeRoleInput: AssumeRoleCommandInput = {\n RoleArn: roleArn,\n RoleSessionName: 'CertificateRequestor',\n ExternalId: externalId,\n }\n const { Credentials } = await sts.send(new AssumeRoleCommand(assumeRoleInput))\n return {\n accessKeyId: Credentials?.AccessKeyId!,\n secretAccessKey: Credentials?.SecretAccessKey!,\n sessionToken: Credentials?.SessionToken!,\n expiration: Credentials?.Expiration,\n }\n }\n}\n\nexport const handler = async (event: CloudFormationCustomResourceEvent) => {\n const properties = parseProperties(event.ResourceProperties)\n\n const acm = new ACMClient({ region: properties.CertificateRegion, retryMode: 'adaptive' })\n const route53 = new Route53Client({\n retryMode: 'adaptive',\n credentials: assumeRole(properties.ValidationRoleArn, properties.ValidationExternalId),\n })\n\n switch (event.RequestType) {\n case 'Create': {\n console.log(`Requesting new certificate:\\n${stringifyProperties(properties)}`)\n const certificateArn = await requestCertificate(acm, route53, event.RequestId, properties)\n if (properties.Tags && Object.entries(properties.Tags).length > 0) {\n await addTags(acm, certificateArn, properties.Tags)\n }\n return {\n PhysicalResourceId: certificateArn,\n Data: {\n Arn: certificateArn,\n },\n }\n }\n case 'Update': {\n let certificateArn = event.PhysicalResourceId\n if (shouldRequestNew(parseProperties(event.OldResourceProperties), properties)) {\n console.log(`Requesting new certificate due to change of properties:\\n${stringifyProperties(properties)}`)\n certificateArn = await requestCertificate(acm, route53, event.RequestId, properties)\n }\n if (properties.Tags && Object.entries(properties.Tags).length > 0) {\n await addTags(acm, certificateArn, properties.Tags)\n }\n return {\n PhysicalResourceId: certificateArn,\n Data: {\n Arn: certificateArn,\n },\n }\n }\n case 'Delete': {\n const certificateArn = event.PhysicalResourceId\n if (properties.RemovalPolicy === 'destroy') {\n console.log(`Deleting old certificate as per removal policy:\\n${stringifyProperties(properties)}`)\n await deleteCertificate(\n acm,\n route53,\n certificateArn,\n properties.HostedZoneId,\n properties.CleanupValidationRecords\n )\n }\n return {\n PhysicalResourceId: certificateArn,\n Data: {\n Arn: certificateArn,\n },\n }\n }\n }\n throw new Error(`Invalid request type`)\n}\n"],
5
- "mappings": "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",
3
+ "sources": ["../../src/certificate-requestor.lambda.ts", "../../src/utils.ts"],
4
+ "sourcesContent": ["import * as crypto from 'crypto'\nimport {\n ACMClient,\n AddTagsToCertificateCommand,\n AddTagsToCertificateCommandInput,\n CertificateDetail,\n DeleteCertificateCommand,\n DeleteCertificateCommandInput,\n DescribeCertificateCommand,\n DescribeCertificateCommandInput,\n RequestCertificateCommand,\n RequestCertificateCommandInput,\n waitUntilCertificateValidated,\n} from '@aws-sdk/client-acm'\nimport {\n ChangeAction,\n ChangeResourceRecordSetsCommand,\n ChangeResourceRecordSetsCommandInput,\n InvalidChangeBatch,\n ResourceRecordSet,\n Route53Client,\n waitUntilResourceRecordSetsChanged,\n} from '@aws-sdk/client-route-53'\nimport { AssumeRoleCommand, AssumeRoleCommandInput, STSClient } from '@aws-sdk/client-sts'\nimport type { AwsCredentialIdentity, Provider } from '@aws-sdk/types'\nimport type { CloudFormationCustomResourceEvent } from 'aws-lambda'\nimport { containsSame, objectToString, stringToBoolean, tryFor } from './utils'\n\nexport type Properties = {\n HostedZoneId: string\n DomainName: string\n SubjectAlternativeNames?: string[]\n CertificateRegion: string\n ValidationRoleArn?: string\n ValidationExternalId?: string\n CleanupValidationRecords: string\n TransparencyLoggingEnabled: string\n Tags?: Record<string, string>\n RemovalPolicy: string\n}\n\nconst parseProperties = (properties: Record<string, any>): Properties => {\n // maybe should actually parse and not just assume\n return properties as unknown as Properties\n}\n\nconst parseDomainValidationRecords = (certificate: CertificateDetail): ResourceRecordSet[] | null => {\n const options = certificate.DomainValidationOptions ?? []\n if (options.length > 0 && options.every((opt) => opt.ResourceRecord?.Name)) {\n const uniqueRecords = [...new Map(options.map((opt) => [opt.ResourceRecord?.Name!, opt.ResourceRecord!])).values()]\n return uniqueRecords.map((record) => {\n return {\n Name: record.Name,\n Type: record.Type,\n TTL: 30,\n ResourceRecords: [\n {\n Value: record.Value,\n },\n ],\n }\n })\n }\n return null\n}\n\nconst changeRecordSets = async (\n route53: Route53Client,\n action: ChangeAction,\n records: ResourceRecordSet[],\n hostedZoneId: string\n): Promise<string> => {\n const changeRecordSetsInput: ChangeResourceRecordSetsCommandInput = {\n HostedZoneId: hostedZoneId,\n ChangeBatch: {\n Changes: records.map((record) => ({\n Action: action,\n ResourceRecordSet: record,\n })),\n },\n }\n const { ChangeInfo } = await route53.send(new ChangeResourceRecordSetsCommand(changeRecordSetsInput))\n const result = await waitUntilResourceRecordSetsChanged({ client: route53, maxWaitTime: 180 }, { Id: ChangeInfo?.Id })\n if (result.state !== 'SUCCESS') {\n throw new Error(\n `Record sets never changed for hosted zone ${hostedZoneId}: [${result.state}] ${result.reason ?? ''}`\n )\n }\n return ChangeInfo?.Id!\n}\n\nconst requestCertificate = async (\n acm: ACMClient,\n route53: Route53Client,\n requestId: string,\n properties: Properties\n): Promise<string> => {\n const { HostedZoneId, DomainName, SubjectAlternativeNames, TransparencyLoggingEnabled } = properties\n\n console.log(`Requesting certificate for ${DomainName}`)\n\n const requestCertificateInput: RequestCertificateCommandInput = {\n DomainName,\n SubjectAlternativeNames: SubjectAlternativeNames,\n IdempotencyToken: crypto.createHash('sha256').update(requestId).digest('hex').slice(0, 32),\n ValidationMethod: 'DNS',\n Options: {\n CertificateTransparencyLoggingPreference: TransparencyLoggingEnabled ? 'ENABLED' : 'DISABLED',\n },\n }\n const { CertificateArn } = await acm.send(new RequestCertificateCommand(requestCertificateInput))\n\n console.log(`Certificate ${CertificateArn} requested`)\n\n const validationMaxSeconds = 180\n const validationTimeoutError = `Domain validation options were not found in ${validationMaxSeconds} seconds`\n const validationRecords = await tryFor(validationMaxSeconds, validationTimeoutError, async () => {\n const describeCertificateInput: DescribeCertificateCommandInput = {\n CertificateArn,\n }\n const { Certificate } = await acm.send(new DescribeCertificateCommand(describeCertificateInput))\n return parseDomainValidationRecords(Certificate!)\n })\n\n console.log(`Upserting ${validationRecords.length} validation record(s) into hosted zone ${HostedZoneId}:`)\n validationRecords.forEach((record) =>\n console.log(`${record.Name} ${record.Type} ${record.ResourceRecords?.map((rr) => rr.Value).join(',')}`)\n )\n const changeId = await changeRecordSets(route53, 'UPSERT', validationRecords, HostedZoneId)\n console.log(`All validation records changed succesfully for change id ${changeId.replace('/change/', '')}`)\n\n console.log(`Waiting for certificate ${CertificateArn} to validate`)\n const result = await waitUntilCertificateValidated({ client: acm, maxWaitTime: 300 }, { CertificateArn })\n if (result.state !== 'SUCCESS') {\n throw new Error(`Certificate failed ${CertificateArn} to validate: [${result.state}] ${result.reason ?? ''}`)\n }\n console.log(`Certificate ${CertificateArn} successfully validated`)\n return CertificateArn!\n}\n\nconst deleteCertificate = async (\n acm: ACMClient,\n route53: Route53Client,\n certificateArn: string,\n hostedZoneId: string,\n cleanupValidationRecords: boolean\n): Promise<void> => {\n console.log(`Waiting for certificate ${certificateArn} usage to drain before deletion`)\n\n const waitUsageMaxSeconds = 600\n const waitUsageTimeoutError = `Certificate was still in use after ${waitUsageMaxSeconds} seconds`\n const certificate = await tryFor(waitUsageMaxSeconds, waitUsageTimeoutError, async () => {\n const describeCertificateInput: DescribeCertificateCommandInput = {\n CertificateArn: certificateArn,\n }\n const { Certificate } = await acm.send(new DescribeCertificateCommand(describeCertificateInput))\n const inUseBy = Certificate?.InUseBy ?? []\n if (inUseBy.length > 0) {\n return null\n }\n return Certificate!\n })\n console.log('Certificate is unused and will be deleted')\n\n const validationRecords = parseDomainValidationRecords(certificate)\n if (validationRecords && cleanupValidationRecords) {\n console.log(`Deleting ${validationRecords.length} validation record(s) from hosted zone ${hostedZoneId}`)\n try {\n const changeId = await changeRecordSets(route53, 'DELETE', validationRecords, hostedZoneId)\n console.log(`All validation records removed successfully for change id ${changeId.replace('/change/', '')}`)\n } catch (error) {\n if (error instanceof InvalidChangeBatch && error.message.includes('not found')) {\n // there's a deletion race condition where some other certificate has already deleted the records\n console.log(`All validation records have already been removed by some other certificate`)\n } else {\n throw error\n }\n }\n }\n\n console.log(`Deleting certificate ${certificateArn} from ACM`)\n const deleteCertificateInput: DeleteCertificateCommandInput = {\n CertificateArn: certificateArn,\n }\n await acm.send(new DeleteCertificateCommand(deleteCertificateInput))\n console.log(`Certificate ${certificateArn} successfully deleted`)\n}\n\nconst addTags = async (acm: ACMClient, certificateArn: string, tags: Record<string, string>) => {\n const tagList = Array.from(Object.entries(tags).map(([Key, Value]) => ({ Key, Value })))\n const addTagsInput: AddTagsToCertificateCommandInput = {\n CertificateArn: certificateArn,\n Tags: tagList,\n }\n\n console.log(`Adding ${tagList.length} tags to certificate ${certificateArn}`)\n await acm.send(new AddTagsToCertificateCommand(addTagsInput))\n console.log(`All tags successfully added to certificate ${certificateArn}`)\n}\n\nconst shouldRequestNew = (oldProperties: Properties, newProperties: Properties): boolean => {\n if (oldProperties.HostedZoneId !== newProperties.HostedZoneId) return true\n if (oldProperties.DomainName !== newProperties.DomainName) return true\n if (oldProperties.CertificateRegion !== newProperties.CertificateRegion) return true\n if (!containsSame(oldProperties.SubjectAlternativeNames ?? [], newProperties.SubjectAlternativeNames ?? []))\n return true\n if (oldProperties.CleanupValidationRecords !== newProperties.CleanupValidationRecords) return true\n if (oldProperties.TransparencyLoggingEnabled !== newProperties.TransparencyLoggingEnabled) return true\n if (oldProperties.RemovalPolicy !== newProperties.RemovalPolicy) return true\n return false\n}\n\nconst assumeRole = (\n roleArn: string | undefined,\n externalId: string | undefined\n): Provider<AwsCredentialIdentity> | undefined => {\n if (!roleArn) {\n return undefined\n }\n return async () => {\n const sts = new STSClient({ retryMode: 'adaptive' })\n const assumeRoleInput: AssumeRoleCommandInput = {\n RoleArn: roleArn,\n RoleSessionName: 'CertificateRequestor',\n ExternalId: externalId,\n }\n const { Credentials } = await sts.send(new AssumeRoleCommand(assumeRoleInput))\n return {\n accessKeyId: Credentials?.AccessKeyId!,\n secretAccessKey: Credentials?.SecretAccessKey!,\n sessionToken: Credentials?.SessionToken!,\n expiration: Credentials?.Expiration,\n }\n }\n}\n\nexport const handler = async (event: CloudFormationCustomResourceEvent) => {\n const properties = parseProperties(event.ResourceProperties)\n\n const acm = new ACMClient({ region: properties.CertificateRegion, retryMode: 'adaptive' })\n const route53 = new Route53Client({\n retryMode: 'adaptive',\n credentials: assumeRole(properties.ValidationRoleArn, properties.ValidationExternalId),\n })\n\n switch (event.RequestType) {\n case 'Create': {\n console.log(`Requesting new certificate:\\n${objectToString(properties)}`)\n const certificateArn = await requestCertificate(acm, route53, event.RequestId, properties)\n if (properties.Tags && Object.entries(properties.Tags).length > 0) {\n await addTags(acm, certificateArn, properties.Tags)\n }\n return {\n PhysicalResourceId: certificateArn,\n Data: {\n Arn: certificateArn,\n },\n }\n }\n case 'Update': {\n let certificateArn = event.PhysicalResourceId\n if (shouldRequestNew(parseProperties(event.OldResourceProperties), properties)) {\n console.log(`Requesting new certificate due to change of properties:\\n${objectToString(properties)}`)\n certificateArn = await requestCertificate(acm, route53, event.RequestId, properties)\n }\n if (properties.Tags && Object.entries(properties.Tags).length > 0) {\n await addTags(acm, certificateArn, properties.Tags)\n }\n return {\n PhysicalResourceId: certificateArn,\n Data: {\n Arn: certificateArn,\n },\n }\n }\n case 'Delete': {\n const certificateArn = event.PhysicalResourceId\n if (properties.RemovalPolicy === 'destroy') {\n console.log(`Deleting old certificate as per removal policy:\\n${objectToString(properties)}`)\n await deleteCertificate(\n acm,\n route53,\n certificateArn,\n properties.HostedZoneId,\n stringToBoolean(properties.CleanupValidationRecords)\n )\n }\n return {\n PhysicalResourceId: certificateArn,\n Data: {\n Arn: certificateArn,\n },\n }\n }\n }\n throw new Error(`Invalid request type`)\n}\n", "export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\n\nexport const booleanToString = (value: boolean): string => {\n return value ? 'true' : 'false'\n}\n\nexport const stringToBoolean = (value: string): boolean => {\n return value === 'true' ? true : false\n}\n\nexport const objectToString = (value: object): string => {\n return JSON.stringify(value, undefined, 2)\n}\n\nexport const containsSame = <T>(array1: T[], array2: T[]): boolean => {\n if (array1.length !== array2.length) return false\n return array1.every((v1) => array2.includes(v1))\n}\n\nexport const tryFor = async <T>(maxSeconds: number, timeoutError: string, fn: () => Promise<T | null>): Promise<T> => {\n const startTime = Date.now()\n // eslint-disable-next-line no-constant-condition\n for (let i = 0; true; i++) {\n if (Date.now() > startTime + maxSeconds * 1000) {\n throw new Error(timeoutError)\n }\n const result = await fn()\n if (result !== null) {\n return result\n }\n const base = Math.pow(2, i)\n await sleep(Math.random() * base * 50 + base * 150)\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,8 +6,8 @@ export type Properties = {
6
6
  CertificateRegion: string;
7
7
  ValidationRoleArn?: string;
8
8
  ValidationExternalId?: string;
9
- CleanupValidationRecords: boolean;
10
- TransparencyLoggingEnabled: boolean;
9
+ CleanupValidationRecords: string;
10
+ TransparencyLoggingEnabled: string;
11
11
  Tags?: Record<string, string>;
12
12
  RemovalPolicy: string;
13
13
  };
@@ -5,34 +5,11 @@ const crypto = require("crypto");
5
5
  const client_acm_1 = require("@aws-sdk/client-acm");
6
6
  const client_route_53_1 = require("@aws-sdk/client-route-53");
7
7
  const client_sts_1 = require("@aws-sdk/client-sts");
8
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
9
- const containsSame = (array1, array2) => {
10
- if (array1.length !== array2.length)
11
- return false;
12
- return array1.every((v1) => array2.includes(v1));
13
- };
14
- const tryFor = async (maxSeconds, timeoutError, fn) => {
15
- const startTime = Date.now();
16
- // eslint-disable-next-line no-constant-condition
17
- for (let i = 0; true; i++) {
18
- if (Date.now() > startTime + maxSeconds * 1000) {
19
- throw new Error(timeoutError);
20
- }
21
- const result = await fn();
22
- if (result !== null) {
23
- return result;
24
- }
25
- const base = Math.pow(2, i);
26
- await sleep(Math.random() * base * 50 + base * 150);
27
- }
28
- };
8
+ const utils_1 = require("./utils");
29
9
  const parseProperties = (properties) => {
30
10
  // maybe should actually parse and not just assume
31
11
  return properties;
32
12
  };
33
- const stringifyProperties = (properties) => {
34
- return JSON.stringify(properties, undefined, 2);
35
- };
36
13
  const parseDomainValidationRecords = (certificate) => {
37
14
  const options = certificate.DomainValidationOptions ?? [];
38
15
  if (options.length > 0 && options.every((opt) => opt.ResourceRecord?.Name)) {
@@ -85,7 +62,7 @@ const requestCertificate = async (acm, route53, requestId, properties) => {
85
62
  console.log(`Certificate ${CertificateArn} requested`);
86
63
  const validationMaxSeconds = 180;
87
64
  const validationTimeoutError = `Domain validation options were not found in ${validationMaxSeconds} seconds`;
88
- const validationRecords = await tryFor(validationMaxSeconds, validationTimeoutError, async () => {
65
+ const validationRecords = await (0, utils_1.tryFor)(validationMaxSeconds, validationTimeoutError, async () => {
89
66
  const describeCertificateInput = {
90
67
  CertificateArn,
91
68
  };
@@ -108,7 +85,7 @@ const deleteCertificate = async (acm, route53, certificateArn, hostedZoneId, cle
108
85
  console.log(`Waiting for certificate ${certificateArn} usage to drain before deletion`);
109
86
  const waitUsageMaxSeconds = 600;
110
87
  const waitUsageTimeoutError = `Certificate was still in use after ${waitUsageMaxSeconds} seconds`;
111
- const certificate = await tryFor(waitUsageMaxSeconds, waitUsageTimeoutError, async () => {
88
+ const certificate = await (0, utils_1.tryFor)(waitUsageMaxSeconds, waitUsageTimeoutError, async () => {
112
89
  const describeCertificateInput = {
113
90
  CertificateArn: certificateArn,
114
91
  };
@@ -161,7 +138,7 @@ const shouldRequestNew = (oldProperties, newProperties) => {
161
138
  return true;
162
139
  if (oldProperties.CertificateRegion !== newProperties.CertificateRegion)
163
140
  return true;
164
- if (!containsSame(oldProperties.SubjectAlternativeNames ?? [], newProperties.SubjectAlternativeNames ?? []))
141
+ if (!(0, utils_1.containsSame)(oldProperties.SubjectAlternativeNames ?? [], newProperties.SubjectAlternativeNames ?? []))
165
142
  return true;
166
143
  if (oldProperties.CleanupValidationRecords !== newProperties.CleanupValidationRecords)
167
144
  return true;
@@ -200,7 +177,7 @@ const handler = async (event) => {
200
177
  });
201
178
  switch (event.RequestType) {
202
179
  case 'Create': {
203
- console.log(`Requesting new certificate:\n${stringifyProperties(properties)}`);
180
+ console.log(`Requesting new certificate:\n${(0, utils_1.objectToString)(properties)}`);
204
181
  const certificateArn = await requestCertificate(acm, route53, event.RequestId, properties);
205
182
  if (properties.Tags && Object.entries(properties.Tags).length > 0) {
206
183
  await addTags(acm, certificateArn, properties.Tags);
@@ -215,7 +192,7 @@ const handler = async (event) => {
215
192
  case 'Update': {
216
193
  let certificateArn = event.PhysicalResourceId;
217
194
  if (shouldRequestNew(parseProperties(event.OldResourceProperties), properties)) {
218
- console.log(`Requesting new certificate due to change of properties:\n${stringifyProperties(properties)}`);
195
+ console.log(`Requesting new certificate due to change of properties:\n${(0, utils_1.objectToString)(properties)}`);
219
196
  certificateArn = await requestCertificate(acm, route53, event.RequestId, properties);
220
197
  }
221
198
  if (properties.Tags && Object.entries(properties.Tags).length > 0) {
@@ -231,8 +208,8 @@ const handler = async (event) => {
231
208
  case 'Delete': {
232
209
  const certificateArn = event.PhysicalResourceId;
233
210
  if (properties.RemovalPolicy === 'destroy') {
234
- console.log(`Deleting old certificate as per removal policy:\n${stringifyProperties(properties)}`);
235
- await deleteCertificate(acm, route53, certificateArn, properties.HostedZoneId, properties.CleanupValidationRecords);
211
+ console.log(`Deleting old certificate as per removal policy:\n${(0, utils_1.objectToString)(properties)}`);
212
+ await deleteCertificate(acm, route53, certificateArn, properties.HostedZoneId, (0, utils_1.stringToBoolean)(properties.CleanupValidationRecords));
236
213
  }
237
214
  return {
238
215
  PhysicalResourceId: certificateArn,
@@ -245,4 +222,4 @@ const handler = async (event) => {
245
222
  throw new Error(`Invalid request type`);
246
223
  };
247
224
  exports.handler = handler;
248
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGUtcmVxdWVzdG9yLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jZXJ0aWZpY2F0ZS1yZXF1ZXN0b3IubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUFnQztBQUNoQyxvREFZNEI7QUFDNUIsOERBUWlDO0FBQ2pDLG9EQUEwRjtBQWlCMUYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFFL0UsTUFBTSxZQUFZLEdBQUcsQ0FBSSxNQUFXLEVBQUUsTUFBVyxFQUFXLEVBQUU7SUFDNUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDakQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDbEQsQ0FBQyxDQUFBO0FBRUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUFLLFVBQWtCLEVBQUUsWUFBb0IsRUFBRSxFQUEyQixFQUFjLEVBQUU7SUFDNUcsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQzVCLGlEQUFpRDtJQUNqRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDekIsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxHQUFHLFVBQVUsR0FBRyxJQUFJLEVBQUU7WUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQTtTQUM5QjtRQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUE7UUFD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QUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNqRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLEVBQUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTthQUNwRDtZQUNELE9BQU87Z0JBQ0wsa0JBQWtCLEVBQUUsY0FBYztnQkFDbEMsSUFBSSxFQUFFO29CQUNKLEdBQUcsRUFBRSxjQUFjO2lCQUNwQjthQUNGLENBQUE7U0FDRjtRQUNELEtBQUssUUFBUSxDQUFDLENBQUM7WUFDYixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUE7WUFDL0MsSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRTtnQkFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvREFBb0QsbUJBQW1CLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUNsRyxNQUFNLGlCQUFpQixDQUNyQixHQUFHLEVBQ0gsT0FBTyxFQUNQLGNBQWMsRUFDZCxVQUFVLENBQUMsWUFBWSxFQUN2QixVQUFVLENBQUMsd0JBQXdCLENBQ3BDLENBQUE7YUFDRjtZQUNELE9BQU87Z0JBQ0wsa0JBQWtCLEVBQUUsY0FBYztnQkFDbEMsSUFBSSxFQUFFO29CQUNKLEdBQUcsRUFBRSxjQUFjO2lCQUNwQjthQUNGLENBQUE7U0FDRjtLQUNGO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO0FBQ3pDLENBQUMsQ0FBQTtBQTVEWSxRQUFBLE9BQU8sV0E0RG5CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0bydcbmltcG9ydCB7XG4gIEFDTUNsaWVudCxcbiAgQWRkVGFnc1RvQ2VydGlmaWNhdGVDb21tYW5kLFxuICBBZGRUYWdzVG9DZXJ0aWZpY2F0ZUNvbW1hbmRJbnB1dCxcbiAgQ2VydGlmaWNhdGVEZXRhaWwsXG4gIERlbGV0ZUNlcnRpZmljYXRlQ29tbWFuZCxcbiAgRGVsZXRlQ2VydGlmaWNhdGVDb21tYW5kSW5wdXQsXG4gIERlc2NyaWJlQ2VydGlmaWNhdGVDb21tYW5kLFxuICBEZXNjcmliZUNlcnRpZmljYXRlQ29tbWFuZElucHV0LFxuICBSZXF1ZXN0Q2VydGlmaWNhdGVDb21tYW5kLFxuICBSZXF1ZXN0Q2VydGlmaWNhdGVDb21tYW5kSW5wdXQsXG4gIHdhaXRVbnRpbENlcnRpZmljYXRlVmFsaWRhdGVkLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtYWNtJ1xuaW1wb3J0IHtcbiAgQ2hhbmdlQWN0aW9uLFxuICBDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHNDb21tYW5kLFxuICBDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHNDb21tYW5kSW5wdXQsXG4gIEludmFsaWRDaGFuZ2VCYXRjaCxcbiAgUmVzb3VyY2VSZWNvcmRTZXQsXG4gIFJvdXRlNTNDbGllbnQsXG4gIHdhaXRVbnRpbFJlc291cmNlUmVjb3JkU2V0c0NoYW5nZWQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1yb3V0ZS01MydcbmltcG9ydCB7IEFzc3VtZVJvbGVDb21tYW5kLCBBc3N1bWVSb2xlQ29tbWFuZElucHV0LCBTVFNDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc3RzJ1xuaW1wb3J0IHR5cGUgeyBBd3NDcmVkZW50aWFsSWRlbnRpdHksIFByb3ZpZGVyIH0gZnJvbSAnQGF3cy1zZGsvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCB9IGZyb20gJ2F3cy1sYW1iZGEnXG5cbmV4cG9ydCB0eXBlIFByb3BlcnRpZXMgPSB7XG4gIEhvc3RlZFpvbmVJZDogc3RyaW5nXG4gIERvbWFpbk5hbWU6IHN0cmluZ1xuICBTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcz86IHN0cmluZ1tdXG4gIENlcnRpZmljYXRlUmVnaW9uOiBzdHJpbmdcbiAgVmFsaWRhdGlvblJvbGVBcm4/OiBzdHJpbmdcbiAgVmFsaWRhdGlvbkV4dGVybmFsSWQ/OiBzdHJpbmdcbiAgQ2xlYW51cFZhbGlkYXRpb25SZWNvcmRzOiBib29sZWFuXG4gIFRyYW5zcGFyZW5jeUxvZ2dpbmdFbmFibGVkOiBib29sZWFuXG4gIFRhZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIFJlbW92YWxQb2xpY3k6IHN0cmluZ1xufVxuXG5jb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG5cbmNvbnN0IGNvbnRhaW5zU2FtZSA9IDxUPihhcnJheTE6IFRbXSwgYXJyYXkyOiBUW10pOiBib29sZWFuID0+IHtcbiAgaWYgKGFycmF5MS5sZW5ndGggIT09IGFycmF5Mi5sZW5ndGgpIHJldHVybiBmYWxzZVxuICByZXR1cm4gYXJyYXkxLmV2ZXJ5KCh2MSkgPT4gYXJyYXkyLmluY2x1ZGVzKHYxKSlcbn1cblxuY29uc3QgdHJ5Rm9yID0gYXN5bmMgPFQ+KG1heFNlY29uZHM6IG51bWJlciwgdGltZW91dEVycm9yOiBzdHJpbmcsIGZuOiAoKSA9PiBQcm9taXNlPFQgfCBudWxsPik6IFByb21pc2U8VD4gPT4ge1xuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgZm9yIChsZXQgaSA9IDA7IHRydWU7IGkrKykge1xuICAgIGlmIChEYXRlLm5vdygpID4gc3RhcnRUaW1lICsgbWF4U2Vjb25kcyAqIDEwMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0aW1lb3V0RXJyb3IpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKClcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuICAgIGNvbnN0IGJhc2UgPSBNYXRoLnBvdygyLCBpKVxuICAgIGF3YWl0IHNsZWVwKE1hdGgucmFuZG9tKCkgKiBiYXNlICogNTAgKyBiYXNlICogMTUwKVxuICB9XG59XG5cbmNvbnN0IHBhcnNlUHJvcGVydGllcyA9IChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvcGVydGllcyA9PiB7XG4gIC8vIG1heWJlIHNob3VsZCBhY3R1YWxseSBwYXJzZSBhbmQgbm90IGp1c3QgYXNzdW1lXG4gIHJldHVybiBwcm9wZXJ0aWVzIGFzIHVua25vd24gYXMgUHJvcGVydGllc1xufVxuXG5jb25zdCBzdHJpbmdpZnlQcm9wZXJ0aWVzID0gKHByb3BlcnRpZXM6IFByb3BlcnRpZXMpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocHJvcGVydGllcywgdW5kZWZpbmVkLCAyKVxufVxuXG5jb25zdCBwYXJzZURvbWFpblZhbGlkYXRpb25SZWNvcmRzID0gKGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZURldGFpbCk6IFJlc291cmNlUmVjb3JkU2V0W10gfCBudWxsID0+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IGNlcnRpZmljYXRlLkRvbWFpblZhbGlkYXRpb25PcHRpb25zID8/IFtdXG4gIGlmIChvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0KSA9PiBvcHQuUmVzb3VyY2VSZWNvcmQ/Lk5hbWUpKSB7XG4gICAgY29uc3QgdW5pcXVlUmVjb3JkcyA9IFsuLi5uZXcgTWFwKG9wdGlvbnMubWFwKChvcHQpID0+IFtvcHQuUmVzb3VyY2VSZWNvcmQ/Lk5hbWUhLCBvcHQuUmVzb3VyY2VSZWNvcmQhXSkpLnZhbHVlcygpXVxuICAgIHJldHVybiB1bmlxdWVSZWNvcmRzLm1hcCgocmVjb3JkKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBOYW1lOiByZWNvcmQuTmFtZSxcbiAgICAgICAgVHlwZTogcmVjb3JkLlR5cGUsXG4gICAgICAgIFRUTDogMzAsXG4gICAgICAgIFJlc291cmNlUmVjb3JkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFZhbHVlOiByZWNvcmQuVmFsdWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IGNoYW5nZVJlY29yZFNldHMgPSBhc3luYyAoXG4gIHJvdXRlNTM6IFJvdXRlNTNDbGllbnQsXG4gIGFjdGlvbjogQ2hhbmdlQWN0aW9uLFxuICByZWNvcmRzOiBSZXNvdXJjZVJlY29yZFNldFtdLFxuICBob3N0ZWRab25lSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgY2hhbmdlUmVjb3JkU2V0c0lucHV0OiBDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHNDb21tYW5kSW5wdXQgPSB7XG4gICAgSG9zdGVkWm9uZUlkOiBob3N0ZWRab25lSWQsXG4gICAgQ2hhbmdlQmF0Y2g6IHtcbiAgICAgIENoYW5nZXM6IHJlY29yZHMubWFwKChyZWNvcmQpID0+ICh7XG4gICAgICAgIEFjdGlvbjogYWN0aW9uLFxuICAgICAgICBSZXNvdXJjZVJlY29yZFNldDogcmVjb3JkLFxuICAgICAgfSkpLFxuICAgIH0sXG4gIH1cbiAgY29uc3QgeyBDaGFuZ2VJbmZvIH0gPSBhd2FpdCByb3V0ZTUzLnNlbmQobmV3IENoYW5nZVJlc291cmNlUmVjb3JkU2V0c0NvbW1hbmQoY2hhbmdlUmVjb3JkU2V0c0lucHV0KSlcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FpdFVudGlsUmVzb3VyY2VSZWNvcmRTZXRzQ2hhbmdlZCh7IGNsaWVudDogcm91dGU1MywgbWF4V2FpdFRpbWU6IDE4MCB9LCB7IElkOiBDaGFuZ2VJbmZvPy5JZCB9KVxuICBpZiAocmVzdWx0LnN0YXRlICE9PSAnU1VDQ0VTUycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUmVjb3JkIHNldHMgbmV2ZXIgY2hhbmdlZCBmb3IgaG9zdGVkIHpvbmUgJHtob3N0ZWRab25lSWR9OiBbJHtyZXN1bHQuc3RhdGV9XSAke3Jlc3VsdC5yZWFzb24gPz8gJyd9YFxuICAgIClcbiAgfVxuICByZXR1cm4gQ2hhbmdlSW5mbz8uSWQhXG59XG5cbmNvbnN0IHJlcXVlc3RDZXJ0aWZpY2F0ZSA9IGFzeW5jIChcbiAgYWNtOiBBQ01DbGllbnQsXG4gIHJvdXRlNTM6IFJvdXRlNTNDbGllbnQsXG4gIHJlcXVlc3RJZDogc3RyaW5nLFxuICBwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzXG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCB7IEhvc3RlZFpvbmVJZCwgRG9tYWluTmFtZSwgU3ViamVjdEFsdGVybmF0aXZlTmFtZXMsIFRyYW5zcGFyZW5jeUxvZ2dpbmdFbmFibGVkIH0gPSBwcm9wZXJ0aWVzXG5cbiAgY29uc29sZS5sb2coYFJlcXVlc3RpbmcgY2VydGlmaWNhdGUgZm9yICR7RG9tYWluTmFtZX1gKVxuXG4gIGNvbnN0IHJlcXVlc3RDZXJ0aWZpY2F0ZUlucHV0OiBSZXF1ZXN0Q2VydGlmaWNhdGVDb21tYW5kSW5wdXQgPSB7XG4gICAgRG9tYWluTmFtZSxcbiAgICBTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lczogU3ViamVjdEFsdGVybmF0aXZlTmFtZXMsXG4gICAgSWRlbXBvdGVuY3lUb2tlbjogY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShyZXF1ZXN0SWQpLmRpZ2VzdCgnaGV4Jykuc2xpY2UoMCwgMzIpLFxuICAgIFZhbGlkYXRpb25NZXRob2Q6ICdETlMnLFxuICAgIE9wdGlvbnM6IHtcbiAgICAgIENlcnRpZmljYXRlVHJhbnNwYXJlbmN5TG9nZ2luZ1ByZWZlcmVuY2U6IFRyYW5zcGFyZW5jeUxvZ2dpbmdFbmFibGVkID8gJ0VOQUJMRUQnIDogJ0RJU0FCTEVEJyxcbiAgICB9LFxuICB9XG4gIGNvbnN0IHsgQ2VydGlmaWNhdGVBcm4gfSA9IGF3YWl0IGFjbS5zZW5kKG5ldyBSZXF1ZXN0Q2VydGlmaWNhdGVDb21tYW5kKHJlcXVlc3RDZXJ0aWZpY2F0ZUlucHV0KSlcblxuICBjb25zb2xlLmxvZyhgQ2VydGlmaWNhdGUgJHtDZXJ0aWZpY2F0ZUFybn0gcmVxdWVzdGVkYClcblxuICBjb25zdCB2YWxpZGF0aW9uTWF4U2Vjb25kcyA9IDE4MFxuICBjb25zdCB2YWxpZGF0aW9uVGltZW91dEVycm9yID0gYERvbWFpbiB2YWxpZGF0aW9uIG9wdGlvbnMgd2VyZSBub3QgZm91bmQgaW4gJHt2YWxpZGF0aW9uTWF4U2Vjb25kc30gc2Vjb25kc2BcbiAgY29uc3QgdmFsaWRhdGlvblJlY29yZHMgPSBhd2FpdCB0cnlGb3IodmFsaWRhdGlvbk1heFNlY29uZHMsIHZhbGlkYXRpb25UaW1lb3V0RXJyb3IsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkZXNjcmliZUNlcnRpZmljYXRlSW5wdXQ6IERlc2NyaWJlQ2VydGlmaWNhdGVDb21tYW5kSW5wdXQgPSB7XG4gICAgICBDZXJ0aWZpY2F0ZUFybixcbiAgICB9XG4gICAgY29uc3QgeyBDZXJ0aWZpY2F0ZSB9ID0gYXdhaXQgYWNtLnNlbmQobmV3IERlc2NyaWJlQ2VydGlmaWNhdGVDb21tYW5kKGRlc2NyaWJlQ2VydGlmaWNhdGVJbnB1dCkpXG4gICAgcmV0dXJuIHBhcnNlRG9tYWluVmFsaWRhdGlvblJlY29yZHMoQ2VydGlmaWNhdGUhKVxuICB9KVxuXG4gIGNvbnNvbGUubG9nKGBVcHNlcnRpbmcgJHt2YWxpZGF0aW9uUmVjb3Jkcy5sZW5ndGh9IHZhbGlkYXRpb24gcmVjb3JkKHMpIGludG8gaG9zdGVkIHpvbmUgJHtIb3N0ZWRab25lSWR9OmApXG4gIHZhbGlkYXRpb25SZWNvcmRzLmZvckVhY2goKHJlY29yZCkgPT5cbiAgICBjb25zb2xlLmxvZyhgJHtyZWNvcmQuTmFtZX0gJHtyZWNvcmQuVHlwZX0gJHtyZWNvcmQuUmVzb3VyY2VSZWNvcmRzPy5tYXAoKHJyKSA9PiByci5WYWx1ZSkuam9pbignLCcpfWApXG4gIClcbiAgY29uc3QgY2hhbmdlSWQgPSBhd2FpdCBjaGFuZ2VSZWNvcmRTZXRzKHJvdXRlNTMsICdVUFNFUlQnLCB2YWxpZGF0aW9uUmVjb3JkcywgSG9zdGVkWm9uZUlkKVxuICBjb25zb2xlLmxvZyhgQWxsIHZhbGlkYXRpb24gcmVjb3JkcyBjaGFuZ2VkIHN1Y2Nlc2Z1bGx5IGZvciBjaGFuZ2UgaWQgJHtjaGFuZ2VJZC5yZXBsYWNlKCcvY2hhbmdlLycsICcnKX1gKVxuXG4gIGNvbnNvbGUubG9nKGBXYWl0aW5nIGZvciBjZXJ0aWZpY2F0ZSAke0NlcnRpZmljYXRlQXJufSB0byB2YWxpZGF0ZWApXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhaXRVbnRpbENlcnRpZmljYXRlVmFsaWRhdGVkKHsgY2xpZW50OiBhY20sIG1heFdhaXRUaW1lOiAzMDAgfSwgeyBDZXJ0aWZpY2F0ZUFybiB9KVxuICBpZiAocmVzdWx0LnN0YXRlICE9PSAnU1VDQ0VTUycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIGZhaWxlZCAke0NlcnRpZmljYXRlQXJufSB0byB2YWxpZGF0ZTogWyR7cmVzdWx0LnN0YXRlfV0gJHtyZXN1bHQucmVhc29uID8/ICcnfWApXG4gIH1cbiAgY29uc29sZS5sb2coYENlcnRpZmljYXRlICR7Q2VydGlmaWNhdGVBcm59IHN1Y2Nlc3NmdWxseSB2YWxpZGF0ZWRgKVxuICByZXR1cm4gQ2VydGlmaWNhdGVBcm4hXG59XG5cbmNvbnN0IGRlbGV0ZUNlcnRpZmljYXRlID0gYXN5bmMgKFxuICBhY206IEFDTUNsaWVudCxcbiAgcm91dGU1MzogUm91dGU1M0NsaWVudCxcbiAgY2VydGlmaWNhdGVBcm46IHN0cmluZyxcbiAgaG9zdGVkWm9uZUlkOiBzdHJpbmcsXG4gIGNsZWFudXBWYWxpZGF0aW9uUmVjb3JkczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnNvbGUubG9nKGBXYWl0aW5nIGZvciBjZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlQXJufSB1c2FnZSB0byBkcmFpbiBiZWZvcmUgZGVsZXRpb25gKVxuXG4gIGNvbnN0IHdhaXRVc2FnZU1heFNlY29uZHMgPSA2MDBcbiAgY29uc3Qgd2FpdFVzYWdlVGltZW91dEVycm9yID0gYENlcnRpZmljYXRlIHdhcyBzdGlsbCBpbiB1c2UgYWZ0ZXIgJHt3YWl0VXNhZ2VNYXhTZWNvbmRzfSBzZWNvbmRzYFxuICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGF3YWl0IHRyeUZvcih3YWl0VXNhZ2VNYXhTZWNvbmRzLCB3YWl0VXNhZ2VUaW1lb3V0RXJyb3IsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkZXNjcmliZUNlcnRpZmljYXRlSW5wdXQ6IERlc2NyaWJlQ2VydGlmaWNhdGVDb21tYW5kSW5wdXQgPSB7XG4gICAgICBDZXJ0aWZpY2F0ZUFybjogY2VydGlmaWNhdGVBcm4sXG4gICAgfVxuICAgIGNvbnN0IHsgQ2VydGlmaWNhdGUgfSA9IGF3YWl0IGFjbS5zZW5kKG5ldyBEZXNjcmliZUNlcnRpZmljYXRlQ29tbWFuZChkZXNjcmliZUNlcnRpZmljYXRlSW5wdXQpKVxuICAgIGNvbnN0IGluVXNlQnkgPSBDZXJ0aWZpY2F0ZT8uSW5Vc2VCeSA/PyBbXVxuICAgIGlmIChpblVzZUJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHJldHVybiBDZXJ0aWZpY2F0ZSFcbiAgfSlcbiAgY29uc29sZS5sb2coJ0NlcnRpZmljYXRlIGlzIHVudXNlZCBhbmQgd2lsbCBiZSBkZWxldGVkJylcblxuICBjb25zdCB2YWxpZGF0aW9uUmVjb3JkcyA9IHBhcnNlRG9tYWluVmFsaWRhdGlvblJlY29yZHMoY2VydGlmaWNhdGUpXG4gIGlmICh2YWxpZGF0aW9uUmVjb3JkcyAmJiBjbGVhbnVwVmFsaWRhdGlvblJlY29yZHMpIHtcbiAgICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgJHt2YWxpZGF0aW9uUmVjb3Jkcy5sZW5ndGh9IHZhbGlkYXRpb24gcmVjb3JkKHMpIGZyb20gaG9zdGVkIHpvbmUgJHtob3N0ZWRab25lSWR9YClcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hhbmdlSWQgPSBhd2FpdCBjaGFuZ2VSZWNvcmRTZXRzKHJvdXRlNTMsICdERUxFVEUnLCB2YWxpZGF0aW9uUmVjb3JkcywgaG9zdGVkWm9uZUlkKVxuICAgICAgY29uc29sZS5sb2coYEFsbCB2YWxpZGF0aW9uIHJlY29yZHMgcmVtb3ZlZCBzdWNjZXNzZnVsbHkgZm9yIGNoYW5nZSBpZCAke2NoYW5nZUlkLnJlcGxhY2UoJy9jaGFuZ2UvJywgJycpfWApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEludmFsaWRDaGFuZ2VCYXRjaCAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdub3QgZm91bmQnKSkge1xuICAgICAgICAvLyB0aGVyZSdzIGEgZGVsZXRpb24gcmFjZSBjb25kaXRpb24gd2hlcmUgc29tZSBvdGhlciBjZXJ0aWZpY2F0ZSBoYXMgYWxyZWFkeSBkZWxldGVkIHRoZSByZWNvcmRzXG4gICAgICAgIGNvbnNvbGUubG9nKGBBbGwgdmFsaWRhdGlvbiByZWNvcmRzIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgYnkgc29tZSBvdGhlciBjZXJ0aWZpY2F0ZWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBEZWxldGluZyBjZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlQXJufSBmcm9tIEFDTWApXG4gIGNvbnN0IGRlbGV0ZUNlcnRpZmljYXRlSW5wdXQ6IERlbGV0ZUNlcnRpZmljYXRlQ29tbWFuZElucHV0ID0ge1xuICAgIENlcnRpZmljYXRlQXJuOiBjZXJ0aWZpY2F0ZUFybixcbiAgfVxuICBhd2FpdCBhY20uc2VuZChuZXcgRGVsZXRlQ2VydGlmaWNhdGVDb21tYW5kKGRlbGV0ZUNlcnRpZmljYXRlSW5wdXQpKVxuICBjb25zb2xlLmxvZyhgQ2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZUFybn0gc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRgKVxufVxuXG5jb25zdCBhZGRUYWdzID0gYXN5bmMgKGFjbTogQUNNQ2xpZW50LCBjZXJ0aWZpY2F0ZUFybjogc3RyaW5nLCB0YWdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiB7XG4gIGNvbnN0IHRhZ0xpc3QgPSBBcnJheS5mcm9tKE9iamVjdC5lbnRyaWVzKHRhZ3MpLm1hcCgoW0tleSwgVmFsdWVdKSA9PiAoeyBLZXksIFZhbHVlIH0pKSlcbiAgY29uc3QgYWRkVGFnc0lucHV0OiBBZGRUYWdzVG9DZXJ0aWZpY2F0ZUNvbW1hbmRJbnB1dCA9IHtcbiAgICBDZXJ0aWZpY2F0ZUFybjogY2VydGlmaWNhdGVBcm4sXG4gICAgVGFnczogdGFnTGlzdCxcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBBZGRpbmcgJHt0YWdMaXN0Lmxlbmd0aH0gdGFncyB0byBjZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlQXJufWApXG4gIGF3YWl0IGFjbS5zZW5kKG5ldyBBZGRUYWdzVG9DZXJ0aWZpY2F0ZUNvbW1hbmQoYWRkVGFnc0lucHV0KSlcbiAgY29uc29sZS5sb2coYEFsbCB0YWdzIHN1Y2Nlc3NmdWxseSBhZGRlZCB0byBjZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlQXJufWApXG59XG5cbmNvbnN0IHNob3VsZFJlcXVlc3ROZXcgPSAob2xkUHJvcGVydGllczogUHJvcGVydGllcywgbmV3UHJvcGVydGllczogUHJvcGVydGllcyk6IGJvb2xlYW4gPT4ge1xuICBpZiAob2xkUHJvcGVydGllcy5Ib3N0ZWRab25lSWQgIT09IG5ld1Byb3BlcnRpZXMuSG9zdGVkWm9uZUlkKSByZXR1cm4gdHJ1ZVxuICBpZiAob2xkUHJvcGVydGllcy5Eb21haW5OYW1lICE9PSBuZXdQcm9wZXJ0aWVzLkRvbWFpbk5hbWUpIHJldHVybiB0cnVlXG4gIGlmIChvbGRQcm9wZXJ0aWVzLkNlcnRpZmljYXRlUmVnaW9uICE9PSBuZXdQcm9wZXJ0aWVzLkNlcnRpZmljYXRlUmVnaW9uKSByZXR1cm4gdHJ1ZVxuICBpZiAoIWNvbnRhaW5zU2FtZShvbGRQcm9wZXJ0aWVzLlN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzID8/IFtdLCBuZXdQcm9wZXJ0aWVzLlN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzID8/IFtdKSlcbiAgICByZXR1cm4gdHJ1ZVxuICBpZiAob2xkUHJvcGVydGllcy5DbGVhbnVwVmFsaWRhdGlvblJlY29yZHMgIT09IG5ld1Byb3BlcnRpZXMuQ2xlYW51cFZhbGlkYXRpb25SZWNvcmRzKSByZXR1cm4gdHJ1ZVxuICBpZiAob2xkUHJvcGVydGllcy5UcmFuc3BhcmVuY3lMb2dnaW5nRW5hYmxlZCAhPT0gbmV3UHJvcGVydGllcy5UcmFuc3BhcmVuY3lMb2dnaW5nRW5hYmxlZCkgcmV0dXJuIHRydWVcbiAgaWYgKG9sZFByb3BlcnRpZXMuUmVtb3ZhbFBvbGljeSAhPT0gbmV3UHJvcGVydGllcy5SZW1vdmFsUG9saWN5KSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgYXNzdW1lUm9sZSA9IChcbiAgcm9sZUFybjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBleHRlcm5hbElkOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb3ZpZGVyPEF3c0NyZWRlbnRpYWxJZGVudGl0eT4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXJvbGVBcm4pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzdHMgPSBuZXcgU1RTQ2xpZW50KHsgcmV0cnlNb2RlOiAnYWRhcHRpdmUnIH0pXG4gICAgY29uc3QgYXNzdW1lUm9sZUlucHV0OiBBc3N1bWVSb2xlQ29tbWFuZElucHV0ID0ge1xuICAgICAgUm9sZUFybjogcm9sZUFybixcbiAgICAgIFJvbGVTZXNzaW9uTmFtZTogJ0NlcnRpZmljYXRlUmVxdWVzdG9yJyxcbiAgICAgIEV4dGVybmFsSWQ6IGV4dGVybmFsSWQsXG4gICAgfVxuICAgIGNvbnN0IHsgQ3JlZGVudGlhbHMgfSA9IGF3YWl0IHN0cy5zZW5kKG5ldyBBc3N1bWVSb2xlQ29tbWFuZChhc3N1bWVSb2xlSW5wdXQpKVxuICAgIHJldHVybiB7XG4gICAgICBhY2Nlc3NLZXlJZDogQ3JlZGVudGlhbHM/LkFjY2Vzc0tleUlkISxcbiAgICAgIHNlY3JldEFjY2Vzc0tleTogQ3JlZGVudGlhbHM/LlNlY3JldEFjY2Vzc0tleSEsXG4gICAgICBzZXNzaW9uVG9rZW46IENyZWRlbnRpYWxzPy5TZXNzaW9uVG9rZW4hLFxuICAgICAgZXhwaXJhdGlvbjogQ3JlZGVudGlhbHM/LkV4cGlyYXRpb24sXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQpID0+IHtcbiAgY29uc3QgcHJvcGVydGllcyA9IHBhcnNlUHJvcGVydGllcyhldmVudC5SZXNvdXJjZVByb3BlcnRpZXMpXG5cbiAgY29uc3QgYWNtID0gbmV3IEFDTUNsaWVudCh7IHJlZ2lvbjogcHJvcGVydGllcy5DZXJ0aWZpY2F0ZVJlZ2lvbiwgcmV0cnlNb2RlOiAnYWRhcHRpdmUnIH0pXG4gIGNvbnN0IHJvdXRlNTMgPSBuZXcgUm91dGU1M0NsaWVudCh7XG4gICAgcmV0cnlNb2RlOiAnYWRhcHRpdmUnLFxuICAgIGNyZWRlbnRpYWxzOiBhc3N1bWVSb2xlKHByb3BlcnRpZXMuVmFsaWRhdGlvblJvbGVBcm4sIHByb3BlcnRpZXMuVmFsaWRhdGlvbkV4dGVybmFsSWQpLFxuICB9KVxuXG4gIHN3aXRjaCAoZXZlbnQuUmVxdWVzdFR5cGUpIHtcbiAgICBjYXNlICdDcmVhdGUnOiB7XG4gICAgICBjb25zb2xlLmxvZyhgUmVxdWVzdGluZyBuZXcgY2VydGlmaWNhdGU6XFxuJHtzdHJpbmdpZnlQcm9wZXJ0aWVzKHByb3BlcnRpZXMpfWApXG4gICAgICBjb25zdCBjZXJ0aWZpY2F0ZUFybiA9IGF3YWl0IHJlcXVlc3RDZXJ0aWZpY2F0ZShhY20sIHJvdXRlNTMsIGV2ZW50LlJlcXVlc3RJZCwgcHJvcGVydGllcylcbiAgICAgIGlmIChwcm9wZXJ0aWVzLlRhZ3MgJiYgT2JqZWN0LmVudHJpZXMocHJvcGVydGllcy5UYWdzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IGFkZFRhZ3MoYWNtLCBjZXJ0aWZpY2F0ZUFybiwgcHJvcGVydGllcy5UYWdzKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUGh5c2ljYWxSZXNvdXJjZUlkOiBjZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgRGF0YToge1xuICAgICAgICAgIEFybjogY2VydGlmaWNhdGVBcm4sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuICAgIGNhc2UgJ1VwZGF0ZSc6IHtcbiAgICAgIGxldCBjZXJ0aWZpY2F0ZUFybiA9IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZFxuICAgICAgaWYgKHNob3VsZFJlcXVlc3ROZXcocGFyc2VQcm9wZXJ0aWVzKGV2ZW50Lk9sZFJlc291cmNlUHJvcGVydGllcyksIHByb3BlcnRpZXMpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZXF1ZXN0aW5nIG5ldyBjZXJ0aWZpY2F0ZSBkdWUgdG8gY2hhbmdlIG9mIHByb3BlcnRpZXM6XFxuJHtzdHJpbmdpZnlQcm9wZXJ0aWVzKHByb3BlcnRpZXMpfWApXG4gICAgICAgIGNlcnRpZmljYXRlQXJuID0gYXdhaXQgcmVxdWVzdENlcnRpZmljYXRlKGFjbSwgcm91dGU1MywgZXZlbnQuUmVxdWVzdElkLCBwcm9wZXJ0aWVzKVxuICAgICAgfVxuICAgICAgaWYgKHByb3BlcnRpZXMuVGFncyAmJiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzLlRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgYWRkVGFncyhhY20sIGNlcnRpZmljYXRlQXJuLCBwcm9wZXJ0aWVzLlRhZ3MpXG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQaHlzaWNhbFJlc291cmNlSWQ6IGNlcnRpZmljYXRlQXJuLFxuICAgICAgICBEYXRhOiB7XG4gICAgICAgICAgQXJuOiBjZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gICAgY2FzZSAnRGVsZXRlJzoge1xuICAgICAgY29uc3QgY2VydGlmaWNhdGVBcm4gPSBldmVudC5QaHlzaWNhbFJlc291cmNlSWRcbiAgICAgIGlmIChwcm9wZXJ0aWVzLlJlbW92YWxQb2xpY3kgPT09ICdkZXN0cm95Jykge1xuICAgICAgICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgb2xkIGNlcnRpZmljYXRlIGFzIHBlciByZW1vdmFsIHBvbGljeTpcXG4ke3N0cmluZ2lmeVByb3BlcnRpZXMocHJvcGVydGllcyl9YClcbiAgICAgICAgYXdhaXQgZGVsZXRlQ2VydGlmaWNhdGUoXG4gICAgICAgICAgYWNtLFxuICAgICAgICAgIHJvdXRlNTMsXG4gICAgICAgICAgY2VydGlmaWNhdGVBcm4sXG4gICAgICAgICAgcHJvcGVydGllcy5Ib3N0ZWRab25lSWQsXG4gICAgICAgICAgcHJvcGVydGllcy5DbGVhbnVwVmFsaWRhdGlvblJlY29yZHNcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUGh5c2ljYWxSZXNvdXJjZUlkOiBjZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgRGF0YToge1xuICAgICAgICAgIEFybjogY2VydGlmaWNhdGVBcm4sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXF1ZXN0IHR5cGVgKVxufVxuIl19
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGUtcmVxdWVzdG9yLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jZXJ0aWZpY2F0ZS1yZXF1ZXN0b3IubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUFnQztBQUNoQyxvREFZNEI7QUFDNUIsOERBUWlDO0FBQ2pDLG9EQUEwRjtBQUcxRixtQ0FBK0U7QUFlL0UsTUFBTSxlQUFlLEdBQUcsQ0FBQyxVQUErQixFQUFjLEVBQUU7SUFDdEUsa0RBQWtEO0lBQ2xELE9BQU8sVUFBbUMsQ0FBQTtBQUM1QyxDQUFDLENBQUE7QUFFRCxNQUFNLDRCQUE0QixHQUFHLENBQUMsV0FBOEIsRUFBOEIsRUFBRTtJQUNsRyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsdUJBQXVCLElBQUksRUFBRSxDQUFBO0lBQ3pELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsRUFBRTtRQUMxRSxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLElBQUssRUFBRSxHQUFHLENBQUMsY0FBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDbkgsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbEMsT0FBTztnQkFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsR0FBRyxFQUFFLEVBQUU7Z0JBQ1AsZUFBZSxFQUFFO29CQUNmO3dCQUNFLEtBQUssRUFBRSxNQUFNLENBQUMs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QUksQ0FBQyxDQUFBO2FBQ3BEO1lBQ0QsT0FBTztnQkFDTCxrQkFBa0IsRUFBRSxjQUFjO2dCQUNsQyxJQUFJLEVBQUU7b0JBQ0osR0FBRyxFQUFFLGNBQWM7aUJBQ3BCO2FBQ0YsQ0FBQTtTQUNGO1FBQ0QsS0FBSyxRQUFRLENBQUMsQ0FBQztZQUNiLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQTtZQUMvQyxJQUFJLFVBQVUsQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFO2dCQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9EQUFvRCxJQUFBLHNCQUFjLEVBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUM3RixNQUFNLGlCQUFpQixDQUNyQixHQUFHLEVBQ0gsT0FBTyxFQUNQLGNBQWMsRUFDZCxVQUFVLENBQUMsWUFBWSxFQUN2QixJQUFBLHVCQUFlLEVBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQ3JELENBQUE7YUFDRjtZQUNELE9BQU87Z0JBQ0wsa0JBQWtCLEVBQUUsY0FBYztnQkFDbEMsSUFBSSxFQUFFO29CQUNKLEdBQUcsRUFBRSxjQUFjO2lCQUNwQjthQUNGLENBQUE7U0FDRjtLQUNGO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO0FBQ3pDLENBQUMsQ0FBQTtBQTVEWSxRQUFBLE9BQU8sV0E0RG5CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0bydcbmltcG9ydCB7XG4gIEFDTUNsaWVudCxcbiAgQWRkVGFnc1RvQ2VydGlmaWNhdGVDb21tYW5kLFxuICBBZGRUYWdzVG9DZXJ0aWZpY2F0ZUNvbW1hbmRJbnB1dCxcbiAgQ2VydGlmaWNhdGVEZXRhaWwsXG4gIERlbGV0ZUNlcnRpZmljYXRlQ29tbWFuZCxcbiAgRGVsZXRlQ2VydGlmaWNhdGVDb21tYW5kSW5wdXQsXG4gIERlc2NyaWJlQ2VydGlmaWNhdGVDb21tYW5kLFxuICBEZXNjcmliZUNlcnRpZmljYXRlQ29tbWFuZElucHV0LFxuICBSZXF1ZXN0Q2VydGlmaWNhdGVDb21tYW5kLFxuICBSZXF1ZXN0Q2VydGlmaWNhdGVDb21tYW5kSW5wdXQsXG4gIHdhaXRVbnRpbENlcnRpZmljYXRlVmFsaWRhdGVkLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtYWNtJ1xuaW1wb3J0IHtcbiAgQ2hhbmdlQWN0aW9uLFxuICBDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHNDb21tYW5kLFxuICBDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHNDb21tYW5kSW5wdXQsXG4gIEludmFsaWRDaGFuZ2VCYXRjaCxcbiAgUmVzb3VyY2VSZWNvcmRTZXQsXG4gIFJvdXRlNTNDbGllbnQsXG4gIHdhaXRVbnRpbFJlc291cmNlUmVjb3JkU2V0c0NoYW5nZWQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1yb3V0ZS01MydcbmltcG9ydCB7IEFzc3VtZVJvbGVDb21tYW5kLCBBc3N1bWVSb2xlQ29tbWFuZElucHV0LCBTVFNDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc3RzJ1xuaW1wb3J0IHR5cGUgeyBBd3NDcmVkZW50aWFsSWRlbnRpdHksIFByb3ZpZGVyIH0gZnJvbSAnQGF3cy1zZGsvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCB9IGZyb20gJ2F3cy1sYW1iZGEnXG5pbXBvcnQgeyBjb250YWluc1NhbWUsIG9iamVjdFRvU3RyaW5nLCBzdHJpbmdUb0Jvb2xlYW4sIHRyeUZvciB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCB0eXBlIFByb3BlcnRpZXMgPSB7XG4gIEhvc3RlZFpvbmVJZDogc3RyaW5nXG4gIERvbWFpbk5hbWU6IHN0cmluZ1xuICBTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcz86IHN0cmluZ1tdXG4gIENlcnRpZmljYXRlUmVnaW9uOiBzdHJpbmdcbiAgVmFsaWRhdGlvblJvbGVBcm4/OiBzdHJpbmdcbiAgVmFsaWRhdGlvbkV4dGVybmFsSWQ/OiBzdHJpbmdcbiAgQ2xlYW51cFZhbGlkYXRpb25SZWNvcmRzOiBzdHJpbmdcbiAgVHJhbnNwYXJlbmN5TG9nZ2luZ0VuYWJsZWQ6IHN0cmluZ1xuICBUYWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBSZW1vdmFsUG9saWN5OiBzdHJpbmdcbn1cblxuY29uc3QgcGFyc2VQcm9wZXJ0aWVzID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9wZXJ0aWVzID0+IHtcbiAgLy8gbWF5YmUgc2hvdWxkIGFjdHVhbGx5IHBhcnNlIGFuZCBub3QganVzdCBhc3N1bWVcbiAgcmV0dXJuIHByb3BlcnRpZXMgYXMgdW5rbm93biBhcyBQcm9wZXJ0aWVzXG59XG5cbmNvbnN0IHBhcnNlRG9tYWluVmFsaWRhdGlvblJlY29yZHMgPSAoY2VydGlmaWNhdGU6IENlcnRpZmljYXRlRGV0YWlsKTogUmVzb3VyY2VSZWNvcmRTZXRbXSB8IG51bGwgPT4ge1xuICBjb25zdCBvcHRpb25zID0gY2VydGlmaWNhdGUuRG9tYWluVmFsaWRhdGlvbk9wdGlvbnMgPz8gW11cbiAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCAmJiBvcHRpb25zLmV2ZXJ5KChvcHQpID0+IG9wdC5SZXNvdXJjZVJlY29yZD8uTmFtZSkpIHtcbiAgICBjb25zdCB1bmlxdWVSZWNvcmRzID0gWy4uLm5ldyBNYXAob3B0aW9ucy5tYXAoKG9wdCkgPT4gW29wdC5SZXNvdXJjZVJlY29yZD8uTmFtZSEsIG9wdC5SZXNvdXJjZVJlY29yZCFdKSkudmFsdWVzKCldXG4gICAgcmV0dXJuIHVuaXF1ZVJlY29yZHMubWFwKChyZWNvcmQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIE5hbWU6IHJlY29yZC5OYW1lLFxuICAgICAgICBUeXBlOiByZWNvcmQuVHlwZSxcbiAgICAgICAgVFRMOiAzMCxcbiAgICAgICAgUmVzb3VyY2VSZWNvcmRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgVmFsdWU6IHJlY29yZC5WYWx1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgY2hhbmdlUmVjb3JkU2V0cyA9IGFzeW5jIChcbiAgcm91dGU1MzogUm91dGU1M0NsaWVudCxcbiAgYWN0aW9uOiBDaGFuZ2VBY3Rpb24sXG4gIHJlY29yZHM6IFJlc291cmNlUmVjb3JkU2V0W10sXG4gIGhvc3RlZFpvbmVJZDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCBjaGFuZ2VSZWNvcmRTZXRzSW5wdXQ6IENoYW5nZVJlc291cmNlUmVjb3JkU2V0c0NvbW1hbmRJbnB1dCA9IHtcbiAgICBIb3N0ZWRab25lSWQ6IGhvc3RlZFpvbmVJZCxcbiAgICBDaGFuZ2VCYXRjaDoge1xuICAgICAgQ2hhbmdlczogcmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4gKHtcbiAgICAgICAgQWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIFJlc291cmNlUmVjb3JkU2V0OiByZWNvcmQsXG4gICAgICB9KSksXG4gICAgfSxcbiAgfVxuICBjb25zdCB7IENoYW5nZUluZm8gfSA9IGF3YWl0IHJvdXRlNTMuc2VuZChuZXcgQ2hhbmdlUmVzb3VyY2VSZWNvcmRTZXRzQ29tbWFuZChjaGFuZ2VSZWNvcmRTZXRzSW5wdXQpKVxuICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWl0VW50aWxSZXNvdXJjZVJlY29yZFNldHNDaGFuZ2VkKHsgY2xpZW50OiByb3V0ZTUzLCBtYXhXYWl0VGltZTogMTgwIH0sIHsgSWQ6IENoYW5nZUluZm8/LklkIH0pXG4gIGlmIChyZXN1bHQuc3RhdGUgIT09ICdTVUNDRVNTJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBSZWNvcmQgc2V0cyBuZXZlciBjaGFuZ2VkIGZvciBob3N0ZWQgem9uZSAke2hvc3RlZFpvbmVJZH06IFske3Jlc3VsdC5zdGF0ZX1dICR7cmVzdWx0LnJlYXNvbiA/PyAnJ31gXG4gICAgKVxuICB9XG4gIHJldHVybiBDaGFuZ2VJbmZvPy5JZCFcbn1cblxuY29uc3QgcmVxdWVzdENlcnRpZmljYXRlID0gYXN5bmMgKFxuICBhY206IEFDTUNsaWVudCxcbiAgcm91dGU1MzogUm91dGU1M0NsaWVudCxcbiAgcmVxdWVzdElkOiBzdHJpbmcsXG4gIHByb3BlcnRpZXM6IFByb3BlcnRpZXNcbik6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHsgSG9zdGVkWm9uZUlkLCBEb21haW5OYW1lLCBTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcywgVHJhbnNwYXJlbmN5TG9nZ2luZ0VuYWJsZWQgfSA9IHByb3BlcnRpZXNcblxuICBjb25zb2xlLmxvZyhgUmVxdWVzdGluZyBjZXJ0aWZpY2F0ZSBmb3IgJHtEb21haW5OYW1lfWApXG5cbiAgY29uc3QgcmVxdWVzdENlcnRpZmljYXRlSW5wdXQ6IFJlcXVlc3RDZXJ0aWZpY2F0ZUNvbW1hbmRJbnB1dCA9IHtcbiAgICBEb21haW5OYW1lLFxuICAgIFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzOiBTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyxcbiAgICBJZGVtcG90ZW5jeVRva2VuOiBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHJlcXVlc3RJZCkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCAzMiksXG4gICAgVmFsaWRhdGlvbk1ldGhvZDogJ0ROUycsXG4gICAgT3B0aW9uczoge1xuICAgICAgQ2VydGlmaWNhdGVUcmFuc3BhcmVuY3lMb2dnaW5nUHJlZmVyZW5jZTogVHJhbnNwYXJlbmN5TG9nZ2luZ0VuYWJsZWQgPyAnRU5BQkxFRCcgOiAnRElTQUJMRUQnLFxuICAgIH0sXG4gIH1cbiAgY29uc3QgeyBDZXJ0aWZpY2F0ZUFybiB9ID0gYXdhaXQgYWNtLnNlbmQobmV3IFJlcXVlc3RDZXJ0aWZpY2F0ZUNvbW1hbmQocmVxdWVzdENlcnRpZmljYXRlSW5wdXQpKVxuXG4gIGNvbnNvbGUubG9nKGBDZXJ0aWZpY2F0ZSAke0NlcnRpZmljYXRlQXJufSByZXF1ZXN0ZWRgKVxuXG4gIGNvbnN0IHZhbGlkYXRpb25NYXhTZWNvbmRzID0gMTgwXG4gIGNvbnN0IHZhbGlkYXRpb25UaW1lb3V0RXJyb3IgPSBgRG9tYWluIHZhbGlkYXRpb24gb3B0aW9ucyB3ZXJlIG5vdCBmb3VuZCBpbiAke3ZhbGlkYXRpb25NYXhTZWNvbmRzfSBzZWNvbmRzYFxuICBjb25zdCB2YWxpZGF0aW9uUmVjb3JkcyA9IGF3YWl0IHRyeUZvcih2YWxpZGF0aW9uTWF4U2Vjb25kcywgdmFsaWRhdGlvblRpbWVvdXRFcnJvciwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRlc2NyaWJlQ2VydGlmaWNhdGVJbnB1dDogRGVzY3JpYmVDZXJ0aWZpY2F0ZUNvbW1hbmRJbnB1dCA9IHtcbiAgICAgIENlcnRpZmljYXRlQXJuLFxuICAgIH1cbiAgICBjb25zdCB7IENlcnRpZmljYXRlIH0gPSBhd2FpdCBhY20uc2VuZChuZXcgRGVzY3JpYmVDZXJ0aWZpY2F0ZUNvbW1hbmQoZGVzY3JpYmVDZXJ0aWZpY2F0ZUlucHV0KSlcbiAgICByZXR1cm4gcGFyc2VEb21haW5WYWxpZGF0aW9uUmVjb3JkcyhDZXJ0aWZpY2F0ZSEpXG4gIH0pXG5cbiAgY29uc29sZS5sb2coYFVwc2VydGluZyAke3ZhbGlkYXRpb25SZWNvcmRzLmxlbmd0aH0gdmFsaWRhdGlvbiByZWNvcmQocykgaW50byBob3N0ZWQgem9uZSAke0hvc3RlZFpvbmVJZH06YClcbiAgdmFsaWRhdGlvblJlY29yZHMuZm9yRWFjaCgocmVjb3JkKSA9PlxuICAgIGNvbnNvbGUubG9nKGAke3JlY29yZC5OYW1lfSAke3JlY29yZC5UeXBlfSAke3JlY29yZC5SZXNvdXJjZVJlY29yZHM/Lm1hcCgocnIpID0+IHJyLlZhbHVlKS5qb2luKCcsJyl9YClcbiAgKVxuICBjb25zdCBjaGFuZ2VJZCA9IGF3YWl0IGNoYW5nZVJlY29yZFNldHMocm91dGU1MywgJ1VQU0VSVCcsIHZhbGlkYXRpb25SZWNvcmRzLCBIb3N0ZWRab25lSWQpXG4gIGNvbnNvbGUubG9nKGBBbGwgdmFsaWRhdGlvbiByZWNvcmRzIGNoYW5nZWQgc3VjY2VzZnVsbHkgZm9yIGNoYW5nZSBpZCAke2NoYW5nZUlkLnJlcGxhY2UoJy9jaGFuZ2UvJywgJycpfWApXG5cbiAgY29uc29sZS5sb2coYFdhaXRpbmcgZm9yIGNlcnRpZmljYXRlICR7Q2VydGlmaWNhdGVBcm59IHRvIHZhbGlkYXRlYClcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FpdFVudGlsQ2VydGlmaWNhdGVWYWxpZGF0ZWQoeyBjbGllbnQ6IGFjbSwgbWF4V2FpdFRpbWU6IDMwMCB9LCB7IENlcnRpZmljYXRlQXJuIH0pXG4gIGlmIChyZXN1bHQuc3RhdGUgIT09ICdTVUNDRVNTJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2VydGlmaWNhdGUgZmFpbGVkICR7Q2VydGlmaWNhdGVBcm59IHRvIHZhbGlkYXRlOiBbJHtyZXN1bHQuc3RhdGV9XSAke3Jlc3VsdC5yZWFzb24gPz8gJyd9YClcbiAgfVxuICBjb25zb2xlLmxvZyhgQ2VydGlmaWNhdGUgJHtDZXJ0aWZpY2F0ZUFybn0gc3VjY2Vzc2Z1bGx5IHZhbGlkYXRlZGApXG4gIHJldHVybiBDZXJ0aWZpY2F0ZUFybiFcbn1cblxuY29uc3QgZGVsZXRlQ2VydGlmaWNhdGUgPSBhc3luYyAoXG4gIGFjbTogQUNNQ2xpZW50LFxuICByb3V0ZTUzOiBSb3V0ZTUzQ2xpZW50LFxuICBjZXJ0aWZpY2F0ZUFybjogc3RyaW5nLFxuICBob3N0ZWRab25lSWQ6IHN0cmluZyxcbiAgY2xlYW51cFZhbGlkYXRpb25SZWNvcmRzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc29sZS5sb2coYFdhaXRpbmcgZm9yIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGVBcm59IHVzYWdlIHRvIGRyYWluIGJlZm9yZSBkZWxldGlvbmApXG5cbiAgY29uc3Qgd2FpdFVzYWdlTWF4U2Vjb25kcyA9IDYwMFxuICBjb25zdCB3YWl0VXNhZ2VUaW1lb3V0RXJyb3IgPSBgQ2VydGlmaWNhdGUgd2FzIHN0aWxsIGluIHVzZSBhZnRlciAke3dhaXRVc2FnZU1heFNlY29uZHN9IHNlY29uZHNgXG4gIGNvbnN0IGNlcnRpZmljYXRlID0gYXdhaXQgdHJ5Rm9yKHdhaXRVc2FnZU1heFNlY29uZHMsIHdhaXRVc2FnZVRpbWVvdXRFcnJvciwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRlc2NyaWJlQ2VydGlmaWNhdGVJbnB1dDogRGVzY3JpYmVDZXJ0aWZpY2F0ZUNvbW1hbmRJbnB1dCA9IHtcbiAgICAgIENlcnRpZmljYXRlQXJuOiBjZXJ0aWZpY2F0ZUFybixcbiAgICB9XG4gICAgY29uc3QgeyBDZXJ0aWZpY2F0ZSB9ID0gYXdhaXQgYWNtLnNlbmQobmV3IERlc2NyaWJlQ2VydGlmaWNhdGVDb21tYW5kKGRlc2NyaWJlQ2VydGlmaWNhdGVJbnB1dCkpXG4gICAgY29uc3QgaW5Vc2VCeSA9IENlcnRpZmljYXRlPy5JblVzZUJ5ID8/IFtdXG4gICAgaWYgKGluVXNlQnkubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIENlcnRpZmljYXRlIVxuICB9KVxuICBjb25zb2xlLmxvZygnQ2VydGlmaWNhdGUgaXMgdW51c2VkIGFuZCB3aWxsIGJlIGRlbGV0ZWQnKVxuXG4gIGNvbnN0IHZhbGlkYXRpb25SZWNvcmRzID0gcGFyc2VEb21haW5WYWxpZGF0aW9uUmVjb3JkcyhjZXJ0aWZpY2F0ZSlcbiAgaWYgKHZhbGlkYXRpb25SZWNvcmRzICYmIGNsZWFudXBWYWxpZGF0aW9uUmVjb3Jkcykge1xuICAgIGNvbnNvbGUubG9nKGBEZWxldGluZyAke3ZhbGlkYXRpb25SZWNvcmRzLmxlbmd0aH0gdmFsaWRhdGlvbiByZWNvcmQocykgZnJvbSBob3N0ZWQgem9uZSAke2hvc3RlZFpvbmVJZH1gKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjaGFuZ2VJZCA9IGF3YWl0IGNoYW5nZVJlY29yZFNldHMocm91dGU1MywgJ0RFTEVURScsIHZhbGlkYXRpb25SZWNvcmRzLCBob3N0ZWRab25lSWQpXG4gICAgICBjb25zb2xlLmxvZyhgQWxsIHZhbGlkYXRpb24gcmVjb3JkcyByZW1vdmVkIHN1Y2Nlc3NmdWxseSBmb3IgY2hhbmdlIGlkICR7Y2hhbmdlSWQucmVwbGFjZSgnL2NoYW5nZS8nLCAnJyl9YClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSW52YWxpZENoYW5nZUJhdGNoICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBmb3VuZCcpKSB7XG4gICAgICAgIC8vIHRoZXJlJ3MgYSBkZWxldGlvbiByYWNlIGNvbmRpdGlvbiB3aGVyZSBzb21lIG90aGVyIGNlcnRpZmljYXRlIGhhcyBhbHJlYWR5IGRlbGV0ZWQgdGhlIHJlY29yZHNcbiAgICAgICAgY29uc29sZS5sb2coYEFsbCB2YWxpZGF0aW9uIHJlY29yZHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBieSBzb21lIG90aGVyIGNlcnRpZmljYXRlYClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coYERlbGV0aW5nIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGVBcm59IGZyb20gQUNNYClcbiAgY29uc3QgZGVsZXRlQ2VydGlmaWNhdGVJbnB1dDogRGVsZXRlQ2VydGlmaWNhdGVDb21tYW5kSW5wdXQgPSB7XG4gICAgQ2VydGlmaWNhdGVBcm46IGNlcnRpZmljYXRlQXJuLFxuICB9XG4gIGF3YWl0IGFjbS5zZW5kKG5ldyBEZWxldGVDZXJ0aWZpY2F0ZUNvbW1hbmQoZGVsZXRlQ2VydGlmaWNhdGVJbnB1dCkpXG4gIGNvbnNvbGUubG9nKGBDZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlQXJufSBzdWNjZXNzZnVsbHkgZGVsZXRlZGApXG59XG5cbmNvbnN0IGFkZFRhZ3MgPSBhc3luYyAoYWNtOiBBQ01DbGllbnQsIGNlcnRpZmljYXRlQXJuOiBzdHJpbmcsIHRhZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+IHtcbiAgY29uc3QgdGFnTGlzdCA9IEFycmF5LmZyb20oT2JqZWN0LmVudHJpZXModGFncykubWFwKChbS2V5LCBWYWx1ZV0pID0+ICh7IEtleSwgVmFsdWUgfSkpKVxuICBjb25zdCBhZGRUYWdzSW5wdXQ6IEFkZFRhZ3NUb0NlcnRpZmljYXRlQ29tbWFuZElucHV0ID0ge1xuICAgIENlcnRpZmljYXRlQXJuOiBjZXJ0aWZpY2F0ZUFybixcbiAgICBUYWdzOiB0YWdMaXN0LFxuICB9XG5cbiAgY29uc29sZS5sb2coYEFkZGluZyAke3RhZ0xpc3QubGVuZ3RofSB0YWdzIHRvIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGVBcm59YClcbiAgYXdhaXQgYWNtLnNlbmQobmV3IEFkZFRhZ3NUb0NlcnRpZmljYXRlQ29tbWFuZChhZGRUYWdzSW5wdXQpKVxuICBjb25zb2xlLmxvZyhgQWxsIHRhZ3Mgc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGVBcm59YClcbn1cblxuY29uc3Qgc2hvdWxkUmVxdWVzdE5ldyA9IChvbGRQcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzLCBuZXdQcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzKTogYm9vbGVhbiA9PiB7XG4gIGlmIChvbGRQcm9wZXJ0aWVzLkhvc3RlZFpvbmVJZCAhPT0gbmV3UHJvcGVydGllcy5Ib3N0ZWRab25lSWQpIHJldHVybiB0cnVlXG4gIGlmIChvbGRQcm9wZXJ0aWVzLkRvbWFpbk5hbWUgIT09IG5ld1Byb3BlcnRpZXMuRG9tYWluTmFtZSkgcmV0dXJuIHRydWVcbiAgaWYgKG9sZFByb3BlcnRpZXMuQ2VydGlmaWNhdGVSZWdpb24gIT09IG5ld1Byb3BlcnRpZXMuQ2VydGlmaWNhdGVSZWdpb24pIHJldHVybiB0cnVlXG4gIGlmICghY29udGFpbnNTYW1lKG9sZFByb3BlcnRpZXMuU3ViamVjdEFsdGVybmF0aXZlTmFtZXMgPz8gW10sIG5ld1Byb3BlcnRpZXMuU3ViamVjdEFsdGVybmF0aXZlTmFtZXMgPz8gW10pKVxuICAgIHJldHVybiB0cnVlXG4gIGlmIChvbGRQcm9wZXJ0aWVzLkNsZWFudXBWYWxpZGF0aW9uUmVjb3JkcyAhPT0gbmV3UHJvcGVydGllcy5DbGVhbnVwVmFsaWRhdGlvblJlY29yZHMpIHJldHVybiB0cnVlXG4gIGlmIChvbGRQcm9wZXJ0aWVzLlRyYW5zcGFyZW5jeUxvZ2dpbmdFbmFibGVkICE9PSBuZXdQcm9wZXJ0aWVzLlRyYW5zcGFyZW5jeUxvZ2dpbmdFbmFibGVkKSByZXR1cm4gdHJ1ZVxuICBpZiAob2xkUHJvcGVydGllcy5SZW1vdmFsUG9saWN5ICE9PSBuZXdQcm9wZXJ0aWVzLlJlbW92YWxQb2xpY3kpIHJldHVybiB0cnVlXG4gIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCBhc3N1bWVSb2xlID0gKFxuICByb2xlQXJuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGV4dGVybmFsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvdmlkZXI8QXdzQ3JlZGVudGlhbElkZW50aXR5PiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghcm9sZUFybikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHN0cyA9IG5ldyBTVFNDbGllbnQoeyByZXRyeU1vZGU6ICdhZGFwdGl2ZScgfSlcbiAgICBjb25zdCBhc3N1bWVSb2xlSW5wdXQ6IEFzc3VtZVJvbGVDb21tYW5kSW5wdXQgPSB7XG4gICAgICBSb2xlQXJuOiByb2xlQXJuLFxuICAgICAgUm9sZVNlc3Npb25OYW1lOiAnQ2VydGlmaWNhdGVSZXF1ZXN0b3InLFxuICAgICAgRXh0ZXJuYWxJZDogZXh0ZXJuYWxJZCxcbiAgICB9XG4gICAgY29uc3QgeyBDcmVkZW50aWFscyB9ID0gYXdhaXQgc3RzLnNlbmQobmV3IEFzc3VtZVJvbGVDb21tYW5kKGFzc3VtZVJvbGVJbnB1dCkpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY2Vzc0tleUlkOiBDcmVkZW50aWFscz8uQWNjZXNzS2V5SWQhLFxuICAgICAgc2VjcmV0QWNjZXNzS2V5OiBDcmVkZW50aWFscz8uU2VjcmV0QWNjZXNzS2V5ISxcbiAgICAgIHNlc3Npb25Ub2tlbjogQ3JlZGVudGlhbHM/LlNlc3Npb25Ub2tlbiEsXG4gICAgICBleHBpcmF0aW9uOiBDcmVkZW50aWFscz8uRXhwaXJhdGlvbixcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoZXZlbnQ6IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCkgPT4ge1xuICBjb25zdCBwcm9wZXJ0aWVzID0gcGFyc2VQcm9wZXJ0aWVzKGV2ZW50LlJlc291cmNlUHJvcGVydGllcylcblxuICBjb25zdCBhY20gPSBuZXcgQUNNQ2xpZW50KHsgcmVnaW9uOiBwcm9wZXJ0aWVzLkNlcnRpZmljYXRlUmVnaW9uLCByZXRyeU1vZGU6ICdhZGFwdGl2ZScgfSlcbiAgY29uc3Qgcm91dGU1MyA9IG5ldyBSb3V0ZTUzQ2xpZW50KHtcbiAgICByZXRyeU1vZGU6ICdhZGFwdGl2ZScsXG4gICAgY3JlZGVudGlhbHM6IGFzc3VtZVJvbGUocHJvcGVydGllcy5WYWxpZGF0aW9uUm9sZUFybiwgcHJvcGVydGllcy5WYWxpZGF0aW9uRXh0ZXJuYWxJZCksXG4gIH0pXG5cbiAgc3dpdGNoIChldmVudC5SZXF1ZXN0VHlwZSkge1xuICAgIGNhc2UgJ0NyZWF0ZSc6IHtcbiAgICAgIGNvbnNvbGUubG9nKGBSZXF1ZXN0aW5nIG5ldyBjZXJ0aWZpY2F0ZTpcXG4ke29iamVjdFRvU3RyaW5nKHByb3BlcnRpZXMpfWApXG4gICAgICBjb25zdCBjZXJ0aWZpY2F0ZUFybiA9IGF3YWl0IHJlcXVlc3RDZXJ0aWZpY2F0ZShhY20sIHJvdXRlNTMsIGV2ZW50LlJlcXVlc3RJZCwgcHJvcGVydGllcylcbiAgICAgIGlmIChwcm9wZXJ0aWVzLlRhZ3MgJiYgT2JqZWN0LmVudHJpZXMocHJvcGVydGllcy5UYWdzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IGFkZFRhZ3MoYWNtLCBjZXJ0aWZpY2F0ZUFybiwgcHJvcGVydGllcy5UYWdzKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUGh5c2ljYWxSZXNvdXJjZUlkOiBjZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgRGF0YToge1xuICAgICAgICAgIEFybjogY2VydGlmaWNhdGVBcm4sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuICAgIGNhc2UgJ1VwZGF0ZSc6IHtcbiAgICAgIGxldCBjZXJ0aWZpY2F0ZUFybiA9IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZFxuICAgICAgaWYgKHNob3VsZFJlcXVlc3ROZXcocGFyc2VQcm9wZXJ0aWVzKGV2ZW50Lk9sZFJlc291cmNlUHJvcGVydGllcyksIHByb3BlcnRpZXMpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZXF1ZXN0aW5nIG5ldyBjZXJ0aWZpY2F0ZSBkdWUgdG8gY2hhbmdlIG9mIHByb3BlcnRpZXM6XFxuJHtvYmplY3RUb1N0cmluZyhwcm9wZXJ0aWVzKX1gKVxuICAgICAgICBjZXJ0aWZpY2F0ZUFybiA9IGF3YWl0IHJlcXVlc3RDZXJ0aWZpY2F0ZShhY20sIHJvdXRlNTMsIGV2ZW50LlJlcXVlc3RJZCwgcHJvcGVydGllcylcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wZXJ0aWVzLlRhZ3MgJiYgT2JqZWN0LmVudHJpZXMocHJvcGVydGllcy5UYWdzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IGFkZFRhZ3MoYWNtLCBjZXJ0aWZpY2F0ZUFybiwgcHJvcGVydGllcy5UYWdzKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUGh5c2ljYWxSZXNvdXJjZUlkOiBjZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgRGF0YToge1xuICAgICAgICAgIEFybjogY2VydGlmaWNhdGVBcm4sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuICAgIGNhc2UgJ0RlbGV0ZSc6IHtcbiAgICAgIGNvbnN0IGNlcnRpZmljYXRlQXJuID0gZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkXG4gICAgICBpZiAocHJvcGVydGllcy5SZW1vdmFsUG9saWN5ID09PSAnZGVzdHJveScpIHtcbiAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW5nIG9sZCBjZXJ0aWZpY2F0ZSBhcyBwZXIgcmVtb3ZhbCBwb2xpY3k6XFxuJHtvYmplY3RUb1N0cmluZyhwcm9wZXJ0aWVzKX1gKVxuICAgICAgICBhd2FpdCBkZWxldGVDZXJ0aWZpY2F0ZShcbiAgICAgICAgICBhY20sXG4gICAgICAgICAgcm91dGU1MyxcbiAgICAgICAgICBjZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgICBwcm9wZXJ0aWVzLkhvc3RlZFpvbmVJZCxcbiAgICAgICAgICBzdHJpbmdUb0Jvb2xlYW4ocHJvcGVydGllcy5DbGVhbnVwVmFsaWRhdGlvblJlY29yZHMpXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogY2VydGlmaWNhdGVBcm4sXG4gICAgICAgIERhdGE6IHtcbiAgICAgICAgICBBcm46IGNlcnRpZmljYXRlQXJuLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVxdWVzdCB0eXBlYClcbn1cbiJdfQ==
@@ -9,6 +9,7 @@ const iam = require("aws-cdk-lib/aws-iam");
9
9
  const lambda = require("aws-cdk-lib/aws-lambda");
10
10
  const custom_resources = require("aws-cdk-lib/custom-resources");
11
11
  const certificate_requestor_function_1 = require("./certificate-requestor-function");
12
+ const utils_1 = require("./utils");
12
13
  const DNS_VALIDATED_CERTIFICATE_TYPE = 'Custom::DnsValidatedCertificate';
13
14
  const CERTTIFICATE_RESOURCE_TYPE = 'AWS::CertificateManager::Certificate';
14
15
  /**
@@ -120,8 +121,8 @@ class DnsValidatedCertificate extends cdk.Resource {
120
121
  SubjectAlternativeNames: undefined,
121
122
  ValidationRoleArn: props.validationRole?.roleArn,
122
123
  ValidationExternalId: props.validationExternalId,
123
- CleanupValidationRecords: props.cleanupValidationRecords ?? true,
124
- TransparencyLoggingEnabled: props.transparencyLoggingEnabled ?? true,
124
+ CleanupValidationRecords: (0, utils_1.booleanToString)(props.cleanupValidationRecords ?? true),
125
+ TransparencyLoggingEnabled: (0, utils_1.booleanToString)(props.transparencyLoggingEnabled ?? true),
125
126
  Tags: cdk.Lazy.any({ produce: () => this.tags.renderTags() }),
126
127
  RemovalPolicy: cdk.Lazy.string({ produce: () => this.removalPolicy }),
127
128
  };
@@ -181,6 +182,6 @@ class DnsValidatedCertificate extends cdk.Resource {
181
182
  }
182
183
  }
183
184
  _a = JSII_RTTI_SYMBOL_1;
184
- DnsValidatedCertificate[_a] = { fqn: "@trautonen/cdk-dns-validated-certificate.DnsValidatedCertificate", version: "0.0.11" };
185
+ DnsValidatedCertificate[_a] = { fqn: "@trautonen/cdk-dns-validated-certificate.DnsValidatedCertificate", version: "0.0.13" };
185
186
  exports.DnsValidatedCertificate = DnsValidatedCertificate;
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zLXZhbGlkYXRlZC1jZXJ0aWZpY2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kbnMtdmFsaWRhdGVkLWNlcnRpZmljYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQWtDO0FBRWxDLHlEQUF3RDtBQUN4RCwyQ0FBMEM7QUFDMUMsaURBQWdEO0FBRWhELGlFQUFnRTtBQUVoRSxxRkFBK0U7QUFtRy9FLE1BQU0sOEJBQThCLEdBQUcsaUNBQWlDLENBQUE7QUFDeEUsTUFBTSwwQkFBMEIsR0FBRyxzQ0FBc0MsQ0FBQTtBQUV6RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHO0FBQ0gsTUFBYSx1QkFBd0IsU0FBUSxHQUFHLENBQUMsUUFBUTtJQXNCdkQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFtQztRQUMzRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUM1RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzdFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDekUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQTtRQUNyRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsQ0FBQyxDQUFBO1FBQzNFLElB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QUFFLGNBQXNCO1FBQzNFLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDaEYsT0FBTyxFQUFFLENBQUE7U0FDVjtRQUNELElBQUksVUFBVSxLQUFLLGNBQWMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxFQUFFO1lBQy9FLE9BQU8sQ0FBQyxlQUFlLGNBQWMscURBQXFELFVBQVUsRUFBRSxDQUFDLENBQUE7U0FDeEc7UUFDRCxPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7Ozs7QUEzS1UsMERBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJ1xuaW1wb3J0ICogYXMgY2VydGlmaWNhdGVtYW5hZ2VyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXInXG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJ1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSdcbmltcG9ydCAqIGFzIHJvdXRlNTMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMnXG5pbXBvcnQgKiBhcyBjdXN0b21fcmVzb3VyY2VzIGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJ1xuaW1wb3J0IHsgQ2VydGlmaWNhdGVSZXF1ZXN0b3JGdW5jdGlvbiB9IGZyb20gJy4vY2VydGlmaWNhdGUtcmVxdWVzdG9yLWZ1bmN0aW9uJ1xuaW1wb3J0IHsgUHJvcGVydGllcyB9IGZyb20gJy4vY2VydGlmaWNhdGUtcmVxdWVzdG9yLmxhbWJkYSdcblxuZXhwb3J0IGludGVyZmFjZSBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZVByb3BzIHtcbiAgLyoqXG4gICAqIEZ1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZSB0byByZXF1ZXN0IGEgY2VydGlmaWNhdGUgZm9yLlxuICAgKlxuICAgKiBNYXkgY29udGFpbiB3aWxkY2FyZHMsIHN1Y2ggYXMgYGAqLmRvbWFpbi5jb21gYC5cbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBIb3N0ZWQgem9uZSB0byB1c2UgZm9yIEROUyB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBJZiB0aGUgaG9zdGVkIHpvbmUgaXMgbm90IG1hbmFnZWQgYnkgdGhlIENESyBhcHBsaWNhdGlvbiwgaXQgbmVlZHMgdG8gYmUgcHJvdmlkZWQgdmlhXG4gICAqIGBgSG9zdGVkWm9uZS5mcm9tSG9zdGVkWm9uZUF0dHJpYnV0ZXMoKWBgLlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdGVkWm9uZTogcm91dGU1My5JSG9zdGVkWm9uZVxuXG4gIC8qKlxuICAgKiBBV1MgcmVnaW9uIHdoZXJlIHRoZSBjZXJ0aWZpY2F0ZSBpcyBkZXBsb3llZC5cbiAgICpcbiAgICogWW91IHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgYGBDZXJ0aWZpY2F0ZWBgIGNvbnN0cnVjdCBpbnN0ZWFkIGlmIHRoZSByZWdpb24gaXMgc2FtZSBhcyB0aGUgc3RhY2sncyBhbmQgdGhlIGhvc3RlZFxuICAgKiB6b25lIGlzIGluIHRoZSBzYW1lIGFjY291bnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gU2FtZSByZWdpb24gYXMgdGhlIHN0YWNrLlxuICAgKi9cbiAgcmVhZG9ubHkgY2VydGlmaWNhdGVSZWdpb24/OiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIHJvbGUgdGhhdCBpcyB1c2VkIGZvciB0aGUgY3VzdG9tIHJlc291cmNlIExhbWJkYSBleGVjdXRpb24uXG4gICAqXG4gICAqIFRoZSByb2xlIGlzIGdpdmVuIHBlcm1pc3Npb25zIHRvIHJlcXVlc3QgY2VydGlmaWNhdGVzIGZyb20gQUNNLiBJZiB0aGUgYGB2YWxpZGF0aW9uUm9sZWBgIGlzIHByb3ZpZGVkLCB0aGlzIHJvbGVcbiAgICogaXMgYWxzbyBnaXZlbiBwZXJtaXNzaW9uIHRvIGFzc3VtZSB0aGUgYGB2YWxpZGF0aW9uUm9sZWBgLiBPdGhlcndpc2UgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBob3N0ZWQgem9uZSBpcyBpbiBzYW1lXG4gICAqIGFjY291bnQgYW5kIHRoZSBleGVjdXRpb24gcm9sZSBpcyBnaXZlbiBwZXJtaXNzaW9ucyB0byBjaGFuZ2UgRE5TIHJlY29yZHMgZm9yIHRoZSBnaXZlbiBgYGRvbWFpbk5hbWVgYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBMYW1iZGEgY3JlYXRlcyBhIGRlZmF1bHQgZXhlY3V0aW9uIHJvbGUuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21SZXNvdXJjZVJvbGU/OiBpYW0uSVJvbGVcblxuICAvKipcbiAgICogVGhlIHJvbGUgdGhhdCBpcyBhc3N1bWVkIGZvciBETlMgcmVjb3JkIGNoYW5nZXMgZm9yIGNlcnRpZmljYXRlIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIFRoaXMgcm9sZSBzaG91bGQgZXhpc3QgaW4gdGhlIHNhbWUgYWNjb3VudCBhcyB0aGUgaG9zdGVkIHpvbmUgYW5kIGluY2x1ZGUgcGVybWlzc2lvbnMgdG8gY2hhbmdlIHRoZSBETlMgcmVjb3Jkc1xuICAgKiBmb3IgdGhlIGdpdmVuIGBgaG9zdGVkWm9uZWBgLiBUaGUgYGBjdXN0b21SZXNvdXJjZVJvbGVgYCBvciB0aGUgZGVmYXVsdCBleGVjdXRpb24gcm9sZSBpcyBnaXZlbiBwZXJtaXNzaW9uIHRvXG4gICAqIGFzc3VtZSB0aGlzIHJvbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc2VwYXJhdGUgcm9sZSBmb3IgRE5TIHJlY29yZCBjaGFuZ2VzLiBUaGUgZ2l2ZW4gY3VzdG9tUmVzb3VyY2VSb2xlIG9yIHRoZSBkZWZhdWx0IHJvbGUgaXMgdXNlZFxuICAgKiBmb3IgRE5TIHJlY29yZCBjaGFuZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRhdGlvblJvbGU/OiBpYW0uSVJvbGVcblxuICAvKipcbiAgICogRXh0ZXJuYWwgaWQgZm9yIGBgdmFsaWRhdGlvblJvbGVgYCByb2xlIGFzc3VtZSB2ZXJpZmljYXRpb24uXG4gICAqXG4gICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIGBgdmFsaWRhdGlvblJvbGVgYCBpcyBnaXZlbiBhbmQgdGhlIHJvbGUgZXhwZWN0cyBhbiBleHRlcm5hbCBpZCBwcm92aWRlZCBvbiBhc3N1bWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZXh0ZXJuYWwgaWQgcHJvdmlkZWQgZHVyaW5nIGFzc3VtZVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRhdGlvbkV4dGVybmFsSWQ/OiBzdHJpbmdcblxuICAvKipcbiAgICogRW5hYmxlIG9yIGRpc2FibGUgY2xlYW5pbmcgb2YgdmFsaWRhdGlvbiBETlMgcmVjb3JkcyBmcm9tIHRoZSBob3N0ZWQgem9uZS5cbiAgICpcbiAgICogSWYgdGhlcmUncyBtdWx0aXBsZSBjZXJ0aWZpY2F0ZXMgY3JlYXRlZCBmb3Igc2FtZSBkb21haW4sIGl0IGlzIHBvc3NpYmxlIHRvIGVuY291dGVyIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgc29tZVxuICAgKiBjZXJ0aWZpY2F0ZSBpcyByZW1vdmVkIGFuZCBhbm90aGVyIGNlcnRpZmljYXRlIHdvdWxkIG5lZWQgdGhlIHNhbWUgdmFsaWRhdGlvbiByZWNvcmQuIFByZWZlciBzaW5nbGUgY2VydGlmaWNhdGVcbiAgICogZm9yIGEgZG9tYWluIG9yIHNldCB0aGlzIHRvIGZhbHNlIGFuZCBjbGVhbnVwIHJlY29yZHMgbWFudWFsbHkgd2hlbiBub3QgbmVlZGVkIGFueW1vcmUuIElmIHlvdSBjaGFuZ2UgdGhpc1xuICAgKiBwcm9wZXJ0eSBhZnRlciBjcmVhdGlvbiwgYSBuZXcgY2VydGlmaWNhdGUgd2lsbCBiZSByZXF1ZXN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNsZWFudXBWYWxpZGF0aW9uUmVjb3Jkcz86IGJvb2xlYW5cblxuICAvKipcbiAgICogRW5hYmxlIG9yIGRpc2FibGUgdHJhbnNwYXJlbmN5IGxvZ2dpbmcgZm9yIHRoaXMgY2VydGlmaWNhdGUuXG4gICAqXG4gICAqIE9uY2UgYSBjZXJ0aWZpY2F0ZSBoYXMgYmVlbiBsb2dnZWQsIGl0IGNhbm5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGxvZy4gT3B0aW5nIG91dCBhdCB0aGF0IHBvaW50IHdpbGwgaGF2ZSBub1xuICAgKiBlZmZlY3QuIElmIHlvdSBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSBhZnRlciBjcmVhdGlvbiwgYSBuZXcgY2VydGlmaWNhdGUgd2lsbCBiZSByZXF1ZXN0ZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FjbS9sYXRlc3QvdXNlcmd1aWRlL2FjbS1iZXN0cHJhY3RpY2VzLmh0bWwjYmVzdC1wcmFjdGljZXMtdHJhbnNwYXJlbmN5XG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcGFyZW5jeUxvZ2dpbmdFbmFibGVkPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgZ2l2ZW4gcmVtb3ZhbCBwb2xpY3kgdG8gdGhpcyByZXNvdXJjZS5cbiAgICpcbiAgICogVGhlIHJlbW92YWwgcG9saWN5IGNvbnRyb2xzIHdoYXQgaGFwcGVucyB0byB0aGlzIHJlc291cmNlIHdoZW4gaXQgc3RvcHMgYmVpbmcgbWFuYWdlZCBieSBDbG91ZEZvcm1hdGlvbiwgZWl0aGVyXG4gICAqIGJlY2F1c2UgeW91J3ZlIHJlbW92ZWQgaXQgZnJvbSB0aGUgQ0RLIGFwcGxpY2F0aW9uIG9yIGJlY2F1c2UgeW91J3ZlIG1hZGUgYSBjaGFuZ2UgdGhhdCByZXF1aXJlcyB0aGUgcmVzb3VyY2UgdG9cbiAgICogYmUgcmVwbGFjZWQuIFRoZSByZXNvdXJjZSBjYW4gYmUgZGVsZXRlZCAoYGBSZW1vdmFsUG9saWN5LkRFU1RST1lgYCksIG9yIGxlZnQgaW4geW91ciBBV1MgYWNjb3VudCBmb3IgZGF0YVxuICAgKiByZWNvdmVyeSBhbmQgY2xlYW51cCBsYXRlciAoYGBSZW1vdmFsUG9saWN5LlJFVEFJTmBgKS4gSWYgeW91IGNoYW5nZSB0aGlzIHByb3BlcnR5IGFmdGVyIGNyZWF0aW9uLCBhIG5ld1xuICAgKiBjZXJ0aWZpY2F0ZSB3aWxsIGJlIHJlcXVlc3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogY2RrLlJlbW92YWxQb2xpY3lcbn1cblxuY29uc3QgRE5TX1ZBTElEQVRFRF9DRVJUSUZJQ0FURV9UWVBFID0gJ0N1c3RvbTo6RG5zVmFsaWRhdGVkQ2VydGlmaWNhdGUnXG5jb25zdCBDRVJUVElGSUNBVEVfUkVTT1VSQ0VfVFlQRSA9ICdBV1M6OkNlcnRpZmljYXRlTWFuYWdlcjo6Q2VydGlmaWNhdGUnXG5cbi8qKlxuICogQSBjZXJ0aWZpY2F0ZSBtYW5hZ2VkIGJ5IEFXUyBDZXJ0aWZpY2F0ZSBNYW5hZ2VyLiBXaWxsIGJlIGF1dG9tYXRpY2FsbHkgdmFsaWRhdGVkIHVzaW5nIEROUyB2YWxpZGF0aW9uIGFnYWluc3QgdGhlXG4gKiBzcGVjaWZpZWQgUm91dGUgNTMgaG9zdGVkIHpvbmUuIFRoaXMgY29uc3RydWN0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIGNyb3NzLXJlZ2lvbiBvciBjcm9zcy1hY2NvdW50IGNlcnRpZmljYXRlXG4gKiB2YWxpZGF0aW9ucy4gVGhlIGRlZmF1bHQgYGBDZXJ0aWZpY2F0ZWBgIGNvbnN0cnVjdCBpcyBiZXR0ZXIgaW4gY2FzZXMgd2hlcmUgZXZlcnl0aGluZyBpcyBtYW5hZ2VkIGJ5IHRoZSBDREtcbiAqIGFwcGxpY2F0aW9uLlxuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBjb25zdHJ1Y3QgZG9lcyBub3Qgc3VwcG9ydCBhbHRlcm5hdGl2ZSBuYW1lcyB5ZXQgYXMgaXQgd291bGQgcmVxdWlyZSBkb21haW4gdG8gcm9sZSBtYXBwaW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyAjIENyb3NzLXJlZ2lvbiBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uXG4gKiAvLyBob3N0ZWQgem9uZSBtYW5hZ2VkIGJ5IHRoZSBDREsgYXBwbGljYXRpb25cbiAqIGNvbnN0IGhvc3RlZFpvbmU6IHJvdXRlNTMuSUhvc3RlZFpvbmUgPSAuLi5cbiAqIC8vIG5vIHNlcGFyYXRlIHZhbGlkYXRpb24gcm9sZSBpcyBuZWVkZWRcbiAqIGNvbnN0IGNlcnRpZmljYXRlID0gbmV3IERuc1ZhbGlkYXRlZENlcnRpZmljYXRlKHRoaXMsICdDcm9zc1JlZ2lvbkNlcnRpZmljYXRlJywge1xuICogICBob3N0ZWRab25lOiBob3N0ZWRab25lLFxuICogICBkb21haW5OYW1lOiAnZXhhbXBsZS5jb20nLCAgICAgLy8gbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGhvc3RlZCB6b25lXG4gKiAgIGNlcnRpZmljYXRlUmVnaW9uOiAndXMtZWFzdC0xJyAvLyB1c2VkIGJ5IGZvciBleGFtcGxlIENsb3VkRnJvbnRcbiAqIH0pXG4gKiAvLyAjIENyb3NzLWFjY291bnQgY2VydGlmaWNhdGUgdmFsaWRhdGlvblxuICogLy8gZXh0ZXJuYWwgaG9zdGVkIHpvbmVcbiAqIGNvbnN0IGhvc3RlZFpvbmU6IHJvdXRlNTMuSUhvc3RlZFpvbmUgPVxuICogICByb3V0ZTUzLkhvc3RlZFpvbmUuZnJvbUhvc3RlZFpvbmVBdHRyaWJ1dGVzKHRoaXMsICdIb3N0ZWRab25lJywge1xuICogICAgIGhvc3RlZFpvbmVJZDogJ1o1MzJER0RFREZTMTIzNDU2Nzg5JyxcbiAqICAgICB6b25lTmFtZTogJ2V4YW1wbGUuY29tJ1xuICogICB9KVxuICogLy8gdmFsaWRhdGlvbiByb2xlIG9uIHRoZSBzYW1lIGFjY291bnQgYXMgdGhlIGhvc3RlZCB6b25lXG4gKiBjb25zdCByb2xlQXJuID0gJ2Fybjphd3M6aWFtOjoxMjM0NTY3ODk6cm9sZS9DaGFuZ2VEbnNSZWNvcmRzUm9sZSdcbiAqIGNvbnN0IGV4dGVybmFsSWQgPSAnZG9tYWluLWFzc3VtZSdcbiAqIGNvbnN0IHZhbGlkYXRpb25Sb2xlOiBpYW0uSVJvbGUgPVxuICogICBpYW0uUm9sZS5mcm9tUm9sZUFybih0aGlzLCAnVmFsaWRhdGlvblJvbGUnLCByb2xlQXJuKVxuICogY29uc3QgY2VydGlmaWNhdGUgPSBuZXcgRG5zVmFsaWRhdGVkQ2VydGlmaWNhdGUodGhpcywgJ0Nyb3NzQWNjb3VudENlcnRpZmljYXRlJywge1xuICogICBob3N0ZWRab25lOiBob3N0ZWRab25lLFxuICogICBkb21haW5OYW1lOiAnZXhhbXBsZS5jb20nLFxuICogICB2YWxpZGF0aW9uUm9sZTogdmFsaWRhdGlvblJvbGUsXG4gICAgIHZhbGlkYXRpb25FeHRlcm5hbElkOiBleHRlcm5hbElkXG4gKiB9KVxuICpcbiAqIEByZXNvdXJjZSBDdXN0b206OkRuc1ZhbGlkYXRlZENlcnRpZmljYXRlXG4gKiBAcmVzb3VyY2UgQVdTOjpDZXJ0aWZpY2F0ZU1hbmFnZXI6OkNlcnRpZmljYXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZSBleHRlbmRzIGNkay5SZXNvdXJjZSBpbXBsZW1lbnRzIGNlcnRpZmljYXRlbWFuYWdlci5JQ2VydGlmaWNhdGUsIGNkay5JVGFnZ2FibGUge1xuICAvKiogVGhlIGNlcnRpZmljYXRlJ3MgQVJOICovXG4gIHB1YmxpYyByZWFkb25seSBjZXJ0aWZpY2F0ZUFybjogc3RyaW5nXG5cbiAgLyoqIFRoZSByZWdpb24gd2hlcmUgdGhlIGNlcnRpZmljYXRlIGlzIGRlcGxveWVkIHRvICovXG4gIHB1YmxpYyByZWFkb25seSBjZXJ0aWZpY2F0ZVJlZ2lvbjogc3RyaW5nXG5cbiAgLyoqIFRoZSBob3N0ZWQgem9uZSBpZGVudGlmaWVyIGF1dGhvcml0YXRpdmUgZm9yIHRoZSBjZXJ0aWZpY2F0ZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaG9zdGVkWm9uZUlkOiBzdHJpbmdcblxuICAvKiogVGhlIGhvc3RlZCB6b25lIG5hbWUgYXV0aG9yaXRhdGl2ZSBmb3IgdGhlIGNlcnRpZmljYXRlICovXG4gIHB1YmxpYyByZWFkb25seSBob3N0ZWRab25lTmFtZTogc3RyaW5nXG5cbiAgLyoqIFRoZSBkb21haW4gbmFtZSBpbmNsdWRlZCBpbiB0aGUgY2VydGlmaWNhdGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZ1xuXG4gIC8qKiBUaGUgdGFnIG1hbmFnZXIgdG8gc2V0LCByZW1vdmUgYW5kIGZvcm1hdCB0YWdzIGZvciB0aGUgY2VydGlmaWNhdGUgICovXG4gIHB1YmxpYyByZWFkb25seSB0YWdzOiBjZGsuVGFnTWFuYWdlclxuXG4gIC8qKiBUaGUgcmVtb3ZhbCBwb2xpY3kgZm9yIHRoZSBjZXJ0aWZpY2F0ZSAqL1xuICBwcml2YXRlIHJlbW92YWxQb2xpY3k6IGNkay5SZW1vdmFsUG9saWN5XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRG5zVmFsaWRhdGVkQ2VydGlmaWNhdGUgY29uc3RydWN0LlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgY29uc3RydWN0IGhvc3RpbmcgdGhpcyBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCdzIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHByb3BzIHByb3BlcnRpZXMgZm9yIHRoZSBjb25zdHJ1Y3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5kb21haW5OYW1lID0gdGhpcy5ub3JtYWxpemVEb21haW5OYW1lKHByb3BzLmRvbWFpbk5hbWUpXG4gICAgdGhpcy5ob3N0ZWRab25lSWQgPSB0aGlzLm5vcm1hbGl6ZUhvc3RlZFpvbmVJZChwcm9wcy5ob3N0ZWRab25lLmhvc3RlZFpvbmVJZClcbiAgICB0aGlzLmhvc3RlZFpvbmVOYW1lID0gdGhpcy5ub3JtYWxpemVEb21haW5OYW1lKHByb3BzLmhvc3RlZFpvbmUuem9uZU5hbWUpXG4gICAgdGhpcy5jZXJ0aWZpY2F0ZVJlZ2lvbiA9IHByb3BzLmNlcnRpZmljYXRlUmVnaW9uID8/IHRoaXMuc3RhY2sucmVnaW9uXG4gICAgdGhpcy50YWdzID0gbmV3IGNkay5UYWdNYW5hZ2VyKGNkay5UYWdUeXBlLk1BUCwgQ0VSVFRJRklDQVRFX1JFU09VUkNFX1RZUEUpXG4gICAgdGhpcy5yZW1vdmFsUG9saWN5ID0gcHJvcHMucmVtb3ZhbFBvbGljeSA/PyBjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG5cbiAgICBjb25zdCByZXF1ZXN0b3JGdW5jdGlvbiA9IG5ldyBDZXJ0aWZpY2F0ZVJlcXVlc3RvckZ1bmN0aW9uKHRoaXMsICdSZXF1ZXN0b3JGdW5jdGlvbicsIHtcbiAgICAgIGFyY2hpdGVjdHVyZTogbGFtYmRhLkFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcygxNCksXG4gICAgICByb2xlOiBwcm9wcy5jdXN0b21SZXNvdXJjZVJvbGUsXG4gICAgfSlcblxuICAgIHJlcXVlc3RvckZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2FjbTpSZXF1ZXN0Q2VydGlmaWNhdGUnLFxuICAgICAgICAgICdhY206RGVzY3JpYmVDZXJ0aWZpY2F0ZScsXG4gICAgICAgICAgJ2FjbTpEZWxldGVDZXJ0aWZpY2F0ZScsXG4gICAgICAgICAgJ2FjbTpBZGRUYWdzVG9DZXJ0aWZpY2F0ZScsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICB9KVxuICAgIClcblxuICAgIGlmIChwcm9wcy52YWxpZGF0aW9uUm9sZSkge1xuICAgICAgcmVxdWVzdG9yRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFsnc3RzOkFzc3VtZVJvbGUnXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtwcm9wcy52YWxpZGF0aW9uUm9sZS5yb2xlQXJuXSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdG9yRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogWydyb3V0ZTUzOkdldENoYW5nZSddLFxuICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgIH0pXG4gICAgICApXG5cbiAgICAgIHJlcXVlc3RvckZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFsncm91dGU1MzpDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHMnXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czpyb3V0ZTUzOjo6aG9zdGVkem9uZS8ke3RoaXMuaG9zdGVkWm9uZUlkfWBdLFxuICAgICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgICdGb3JBbGxWYWx1ZXM6U3RyaW5nRXF1YWxzJzoge1xuICAgICAgICAgICAgICAncm91dGU1MzpDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHNSZWNvcmRUeXBlcyc6IFsnQ05BTUUnXSxcbiAgICAgICAgICAgICAgJ3JvdXRlNTM6Q2hhbmdlUmVzb3VyY2VSZWNvcmRTZXRzQWN0aW9ucyc6IFsnVVBTRVJUJywgJ0RFTEVURSddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdGb3JBbGxWYWx1ZXM6U3RyaW5nTGlrZSc6IHtcbiAgICAgICAgICAgICAgJ3JvdXRlNTM6Q2hhbmdlUmVzb3VyY2VSZWNvcmRTZXRzTm9ybWFsaXplZFJlY29yZE5hbWVzJzogW1xuICAgICAgICAgICAgICAgIHRoaXMud2lsZGNhcmREb21haW5OYW1lKCdNYWluRG9tYWluV2lsZGNhcmQnLCB0aGlzLmRvbWFpbk5hbWUpLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RvclByb3ZpZGVyID0gbmV3IGN1c3RvbV9yZXNvdXJjZXMuUHJvdmlkZXIodGhpcywgJ1JlcXVlc3RvclByb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IHJlcXVlc3RvckZ1bmN0aW9uLFxuICAgIH0pXG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzID0ge1xuICAgICAgSG9zdGVkWm9uZUlkOiB0aGlzLmhvc3RlZFpvbmVJZCxcbiAgICAgIERvbWFpbk5hbWU6IHRoaXMuZG9tYWluTmFtZSxcbiAgICAgIENlcnRpZmljYXRlUmVnaW9uOiB0aGlzLmNlcnRpZmljYXRlUmVnaW9uLFxuICAgICAgU3ViamVjdEFsdGVybmF0aXZlTmFtZXM6IHVuZGVmaW5lZCwgLy8gbm90IHN1cHBvcnRlZCB5ZXQgYXMgaXQgcmVxdWlyZXMgcm9sZSB0byBkb21haW4gbWFwcGluZ1xuICAgICAgVmFsaWRhdGlvblJvbGVBcm46IHByb3BzLnZhbGlkYXRpb25Sb2xlPy5yb2xlQXJuLFxuICAgICAgVmFsaWRhdGlvbkV4dGVybmFsSWQ6IHByb3BzLnZhbGlkYXRpb25FeHRlcm5hbElkLFxuICAgICAgQ2xlYW51cFZhbGlkYXRpb25SZWNvcmRzOiBwcm9wcy5jbGVhbnVwVmFsaWRhdGlvblJlY29yZHMgPz8gdHJ1ZSxcbiAgICAgIFRyYW5zcGFyZW5jeUxvZ2dpbmdFbmFibGVkOiBwcm9wcy50cmFuc3BhcmVuY3lMb2dnaW5nRW5hYmxlZCA/PyB0cnVlLFxuICAgICAgVGFnczogY2RrLkxhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gdGhpcy50YWdzLnJlbmRlclRhZ3MoKSB9KSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgICBSZW1vdmFsUG9saWN5OiBjZGsuTGF6eS5zdHJpbmcoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLnJlbW92YWxQb2xpY3kgfSksXG4gICAgfVxuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBuZXcgY2RrLkN1c3RvbVJlc291cmNlKHRoaXMsICdSZXF1ZXN0b3JSZXNvdXJjZScsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogcmVxdWVzdG9yUHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgcmVzb3VyY2VUeXBlOiBETlNfVkFMSURBVEVEX0NFUlRJRklDQVRFX1RZUEUsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgIH0pXG5cbiAgICB0aGlzLmNlcnRpZmljYXRlQXJuID0gY2VydGlmaWNhdGUuZ2V0QXR0U3RyaW5nKCdBcm4nKVxuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oeyB2YWxpZGF0ZTogKCkgPT4gdGhpcy52YWxpZGF0ZURvbWFpblRvSG9zdGVkWm9uZSh0aGlzLmRvbWFpbk5hbWUsIHRoaXMuaG9zdGVkWm9uZU5hbWUpIH0pXG4gIH1cblxuICBtZXRyaWNEYXlzVG9FeHBpcnkocHJvcHM/OiBjZGsuYXdzX2Nsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyB8IHVuZGVmaW5lZCk6IGNkay5hd3NfY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgcGVyaW9kOiBjZGsuRHVyYXRpb24uZGF5cygxKSxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGltZW5zaW9uc01hcDogeyBDZXJ0aWZpY2F0ZUFybjogdGhpcy5jZXJ0aWZpY2F0ZUFybiB9LFxuICAgICAgbWV0cmljTmFtZTogJ0RheXNUb0V4cGlyeScsXG4gICAgICBuYW1lc3BhY2U6ICdBV1MvQ2VydGlmaWNhdGVNYW5hZ2VyJyxcbiAgICAgIHJlZ2lvbjogdGhpcy5jZXJ0aWZpY2F0ZVJlZ2lvbixcbiAgICAgIHN0YXRpc3RpYzogY2xvdWR3YXRjaC5TdGF0cy5NSU5JTVVNLFxuICAgIH0pXG4gIH1cblxuICBhcHBseVJlbW92YWxQb2xpY3kocG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZhbFBvbGljeSA9IHBvbGljeVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVEb21haW5OYW1lKGRvbWFpbk5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQoZG9tYWluTmFtZSkpIHtcbiAgICAgIHJldHVybiBkb21haW5OYW1lXG4gICAgfVxuICAgIGlmIChkb21haW5OYW1lLmVuZHNXaXRoKCcuJykpIHtcbiAgICAgIHJldHVybiBkb21haW5OYW1lLnNsaWNlKDAsIC0xKVxuICAgIH1cbiAgICByZXR1cm4gZG9tYWluTmFtZVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVIb3N0ZWRab25lSWQoaG9zdGVkWm9uZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChjZGsuVG9rZW4uaXNVbnJlc29sdmVkKGhvc3RlZFpvbmVJZCkpIHtcbiAgICAgIHJldHVybiBob3N0ZWRab25lSWRcbiAgICB9XG4gICAgcmV0dXJuIGhvc3RlZFpvbmVJZC5yZXBsYWNlKC9eXFwvaG9zdGVkem9uZVxcLy8sICcnKVxuICB9XG5cbiAgcHJpdmF0ZSB3aWxkY2FyZERvbWFpbk5hbWUoaWQ6IHN0cmluZywgZG9tYWluTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0cyA9IGNkay5Gbi5zcGxpdCgnLicsIGRvbWFpbk5hbWUpXG4gICAgY29uc3QgZmlyc3QgPSBjZGsuRm4uc2VsZWN0KDAsIHBhcnRzKVxuICAgIGNvbnN0IGlzV2lsZGNhcmQgPSBuZXcgY2RrLkNmbkNvbmRpdGlvbih0aGlzLCBgSXMke2lkfWAsIHtcbiAgICAgIGV4cHJlc3Npb246IGNkay5Gbi5jb25kaXRpb25FcXVhbHMoZmlyc3QsICcqJyksXG4gICAgfSlcbiAgICByZXR1cm4gY2RrLkZuLmNvbmRpdGlvbklmKGlzV2lsZGNhcmQubG9naWNhbElkLCBkb21haW5OYW1lLCBgKi4ke2RvbWFpbk5hbWV9YCkudG9TdHJpbmcoKVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZURvbWFpblRvSG9zdGVkWm9uZShkb21haW5OYW1lOiBzdHJpbmcsIGhvc3RlZFpvbmVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgaWYgKGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQoZG9tYWluTmFtZSkgfHwgY2RrLlRva2VuLmlzVW5yZXNvbHZlZChob3N0ZWRab25lTmFtZSkpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgICBpZiAoZG9tYWluTmFtZSAhPT0gaG9zdGVkWm9uZU5hbWUgJiYgIWRvbWFpbk5hbWUuZW5kc1dpdGgoYC4ke2hvc3RlZFpvbmVOYW1lfWApKSB7XG4gICAgICByZXR1cm4gW2BIb3N0ZWQgem9uZSAke2hvc3RlZFpvbmVOYW1lfSBpcyBub3QgYXV0aG9yaXRhdGl2ZSBmb3IgY2VydGlmaWNhdGUgZG9tYWluIG5hbWUgJHtkb21haW5OYW1lfWBdXG4gICAgfVxuICAgIHJldHVybiBbXVxuICB9XG59XG4iXX0=
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zLXZhbGlkYXRlZC1jZXJ0aWZpY2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kbnMtdmFsaWRhdGVkLWNlcnRpZmljYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQWtDO0FBRWxDLHlEQUF3RDtBQUN4RCwyQ0FBMEM7QUFDMUMsaURBQWdEO0FBRWhELGlFQUFnRTtBQUVoRSxxRkFBK0U7QUFFL0UsbUNBQXlDO0FBa0d6QyxNQUFNLDhCQUE4QixHQUFHLGlDQUFpQyxDQUFBO0FBQ3hFLE1BQU0sMEJBQTBCLEdBQUcsc0NBQXNDLENBQUE7QUFFekU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVDRztBQUNILE1BQWEsdUJBQXdCLFNBQVEsR0FBRyxDQUFDLFFBQVE7SUFzQnZEOzs7Ozs7T0FNRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBbUM7UUFDM0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDNUQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUM3RSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3pFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUE7UUFDckUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLENBQUMs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Q0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUMzRixDQUFDO0lBRU8sMEJBQTBCLENBQUMsVUFBa0IsRUFBRSxjQUFzQjtRQUMzRSxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ2hGLE9BQU8sRUFBRSxDQUFBO1NBQ1Y7UUFDRCxJQUFJLFVBQVUsS0FBSyxjQUFjLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUMsRUFBRTtZQUMvRSxPQUFPLENBQUMsZUFBZSxjQUFjLHFEQUFxRCxVQUFVLEVBQUUsQ0FBQyxDQUFBO1NBQ3hHO1FBQ0QsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDOzs7O0FBM0tVLDBEQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYidcbmltcG9ydCAqIGFzIGNlcnRpZmljYXRlbWFuYWdlciBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyJ1xuaW1wb3J0ICogYXMgY2xvdWR3YXRjaCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCdcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJ1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnXG5pbXBvcnQgKiBhcyByb3V0ZTUzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzJ1xuaW1wb3J0ICogYXMgY3VzdG9tX3Jlc291cmNlcyBmcm9tICdhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzJ1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cydcbmltcG9ydCB7IENlcnRpZmljYXRlUmVxdWVzdG9yRnVuY3Rpb24gfSBmcm9tICcuL2NlcnRpZmljYXRlLXJlcXVlc3Rvci1mdW5jdGlvbidcbmltcG9ydCB7IFByb3BlcnRpZXMgfSBmcm9tICcuL2NlcnRpZmljYXRlLXJlcXVlc3Rvci5sYW1iZGEnXG5pbXBvcnQgeyBib29sZWFuVG9TdHJpbmcgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIERuc1ZhbGlkYXRlZENlcnRpZmljYXRlUHJvcHMge1xuICAvKipcbiAgICogRnVsbHktcXVhbGlmaWVkIGRvbWFpbiBuYW1lIHRvIHJlcXVlc3QgYSBjZXJ0aWZpY2F0ZSBmb3IuXG4gICAqXG4gICAqIE1heSBjb250YWluIHdpbGRjYXJkcywgc3VjaCBhcyBgYCouZG9tYWluLmNvbWBgLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEhvc3RlZCB6b25lIHRvIHVzZSBmb3IgRE5TIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIElmIHRoZSBob3N0ZWQgem9uZSBpcyBub3QgbWFuYWdlZCBieSB0aGUgQ0RLIGFwcGxpY2F0aW9uLCBpdCBuZWVkcyB0byBiZSBwcm92aWRlZCB2aWFcbiAgICogYGBIb3N0ZWRab25lLmZyb21Ib3N0ZWRab25lQXR0cmlidXRlcygpYGAuXG4gICAqL1xuICByZWFkb25seSBob3N0ZWRab25lOiByb3V0ZTUzLklIb3N0ZWRab25lXG5cbiAgLyoqXG4gICAqIEFXUyByZWdpb24gd2hlcmUgdGhlIGNlcnRpZmljYXRlIGlzIGRlcGxveWVkLlxuICAgKlxuICAgKiBZb3Ugc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCBgYENlcnRpZmljYXRlYGAgY29uc3RydWN0IGluc3RlYWQgaWYgdGhlIHJlZ2lvbiBpcyBzYW1lIGFzIHRoZSBzdGFjaydzIGFuZCB0aGUgaG9zdGVkXG4gICAqIHpvbmUgaXMgaW4gdGhlIHNhbWUgYWNjb3VudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTYW1lIHJlZ2lvbiBhcyB0aGUgc3RhY2suXG4gICAqL1xuICByZWFkb25seSBjZXJ0aWZpY2F0ZVJlZ2lvbj86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSB0aGF0IGlzIHVzZWQgZm9yIHRoZSBjdXN0b20gcmVzb3VyY2UgTGFtYmRhIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogVGhlIHJvbGUgaXMgZ2l2ZW4gcGVybWlzc2lvbnMgdG8gcmVxdWVzdCBjZXJ0aWZpY2F0ZXMgZnJvbSBBQ00uIElmIHRoZSBgYHZhbGlkYXRpb25Sb2xlYGAgaXMgcHJvdmlkZWQsIHRoaXMgcm9sZVxuICAgKiBpcyBhbHNvIGdpdmVuIHBlcm1pc3Npb24gdG8gYXNzdW1lIHRoZSBgYHZhbGlkYXRpb25Sb2xlYGAuIE90aGVyd2lzZSBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGhvc3RlZCB6b25lIGlzIGluIHNhbWVcbiAgICogYWNjb3VudCBhbmQgdGhlIGV4ZWN1dGlvbiByb2xlIGlzIGdpdmVuIHBlcm1pc3Npb25zIHRvIGNoYW5nZSBETlMgcmVjb3JkcyBmb3IgdGhlIGdpdmVuIGBgZG9tYWluTmFtZWBgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIExhbWJkYSBjcmVhdGVzIGEgZGVmYXVsdCBleGVjdXRpb24gcm9sZS5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVJlc291cmNlUm9sZT86IGlhbS5JUm9sZVxuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSB0aGF0IGlzIGFzc3VtZWQgZm9yIEROUyByZWNvcmQgY2hhbmdlcyBmb3IgY2VydGlmaWNhdGUgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogVGhpcyByb2xlIHNob3VsZCBleGlzdCBpbiB0aGUgc2FtZSBhY2NvdW50IGFzIHRoZSBob3N0ZWQgem9uZSBhbmQgaW5jbHVkZSBwZXJtaXNzaW9ucyB0byBjaGFuZ2UgdGhlIEROUyByZWNvcmRzXG4gICAqIGZvciB0aGUgZ2l2ZW4gYGBob3N0ZWRab25lYGAuIFRoZSBgYGN1c3RvbVJlc291cmNlUm9sZWBgIG9yIHRoZSBkZWZhdWx0IGV4ZWN1dGlvbiByb2xlIGlzIGdpdmVuIHBlcm1pc3Npb24gdG9cbiAgICogYXNzdW1lIHRoaXMgcm9sZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzZXBhcmF0ZSByb2xlIGZvciBETlMgcmVjb3JkIGNoYW5nZXMuIFRoZSBnaXZlbiBjdXN0b21SZXNvdXJjZVJvbGUgb3IgdGhlIGRlZmF1bHQgcm9sZSBpcyB1c2VkXG4gICAqIGZvciBETlMgcmVjb3JkIGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSB2YWxpZGF0aW9uUm9sZT86IGlhbS5JUm9sZVxuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCBpZCBmb3IgYGB2YWxpZGF0aW9uUm9sZWBgIHJvbGUgYXNzdW1lIHZlcmlmaWNhdGlvbi5cbiAgICpcbiAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gYGB2YWxpZGF0aW9uUm9sZWBgIGlzIGdpdmVuIGFuZCB0aGUgcm9sZSBleHBlY3RzIGFuIGV4dGVybmFsIGlkIHByb3ZpZGVkIG9uIGFzc3VtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBleHRlcm5hbCBpZCBwcm92aWRlZCBkdXJpbmcgYXNzdW1lXG4gICAqL1xuICByZWFkb25seSB2YWxpZGF0aW9uRXh0ZXJuYWxJZD86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBFbmFibGUgb3IgZGlzYWJsZSBjbGVhbmluZyBvZiB2YWxpZGF0aW9uIEROUyByZWNvcmRzIGZyb20gdGhlIGhvc3RlZCB6b25lLlxuICAgKlxuICAgKiBJZiB0aGVyZSdzIG11bHRpcGxlIGNlcnRpZmljYXRlcyBjcmVhdGVkIGZvciBzYW1lIGRvbWFpbiwgaXQgaXMgcG9zc2libGUgdG8gZW5jb3V0ZXIgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBzb21lXG4gICAqIGNlcnRpZmljYXRlIGlzIHJlbW92ZWQgYW5kIGFub3RoZXIgY2VydGlmaWNhdGUgd291bGQgbmVlZCB0aGUgc2FtZSB2YWxpZGF0aW9uIHJlY29yZC4gUHJlZmVyIHNpbmdsZSBjZXJ0aWZpY2F0ZVxuICAgKiBmb3IgYSBkb21haW4gb3Igc2V0IHRoaXMgdG8gZmFsc2UgYW5kIGNsZWFudXAgcmVjb3JkcyBtYW51YWxseSB3aGVuIG5vdCBuZWVkZWQgYW55bW9yZS4gSWYgeW91IGNoYW5nZSB0aGlzXG4gICAqIHByb3BlcnR5IGFmdGVyIGNyZWF0aW9uLCBhIG5ldyBjZXJ0aWZpY2F0ZSB3aWxsIGJlIHJlcXVlc3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xlYW51cFZhbGlkYXRpb25SZWNvcmRzPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBFbmFibGUgb3IgZGlzYWJsZSB0cmFuc3BhcmVuY3kgbG9nZ2luZyBmb3IgdGhpcyBjZXJ0aWZpY2F0ZS5cbiAgICpcbiAgICogT25jZSBhIGNlcnRpZmljYXRlIGhhcyBiZWVuIGxvZ2dlZCwgaXQgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgbG9nLiBPcHRpbmcgb3V0IGF0IHRoYXQgcG9pbnQgd2lsbCBoYXZlIG5vXG4gICAqIGVmZmVjdC4gSWYgeW91IGNoYW5nZSB0aGlzIHByb3BlcnR5IGFmdGVyIGNyZWF0aW9uLCBhIG5ldyBjZXJ0aWZpY2F0ZSB3aWxsIGJlIHJlcXVlc3RlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYWNtL2xhdGVzdC91c2VyZ3VpZGUvYWNtLWJlc3RwcmFjdGljZXMuaHRtbCNiZXN0LXByYWN0aWNlcy10cmFuc3BhcmVuY3lcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwYXJlbmN5TG9nZ2luZ0VuYWJsZWQ/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoZSBnaXZlbiByZW1vdmFsIHBvbGljeSB0byB0aGlzIHJlc291cmNlLlxuICAgKlxuICAgKiBUaGUgcmVtb3ZhbCBwb2xpY3kgY29udHJvbHMgd2hhdCBoYXBwZW5zIHRvIHRoaXMgcmVzb3VyY2Ugd2hlbiBpdCBzdG9wcyBiZWluZyBtYW5hZ2VkIGJ5IENsb3VkRm9ybWF0aW9uLCBlaXRoZXJcbiAgICogYmVjYXVzZSB5b3UndmUgcmVtb3ZlZCBpdCBmcm9tIHRoZSBDREsgYXBwbGljYXRpb24gb3IgYmVjYXVzZSB5b3UndmUgbWFkZSBhIGNoYW5nZSB0aGF0IHJlcXVpcmVzIHRoZSByZXNvdXJjZSB0b1xuICAgKiBiZSByZXBsYWNlZC4gVGhlIHJlc291cmNlIGNhbiBiZSBkZWxldGVkIChgYFJlbW92YWxQb2xpY3kuREVTVFJPWWBgKSwgb3IgbGVmdCBpbiB5b3VyIEFXUyBhY2NvdW50IGZvciBkYXRhXG4gICAqIHJlY292ZXJ5IGFuZCBjbGVhbnVwIGxhdGVyIChgYFJlbW92YWxQb2xpY3kuUkVUQUlOYGApLiBJZiB5b3UgY2hhbmdlIHRoaXMgcHJvcGVydHkgYWZ0ZXIgY3JlYXRpb24sIGEgbmV3XG4gICAqIGNlcnRpZmljYXRlIHdpbGwgYmUgcmVxdWVzdGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LkRFU1RST1lcbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBjZGsuUmVtb3ZhbFBvbGljeVxufVxuXG5jb25zdCBETlNfVkFMSURBVEVEX0NFUlRJRklDQVRFX1RZUEUgPSAnQ3VzdG9tOjpEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZSdcbmNvbnN0IENFUlRUSUZJQ0FURV9SRVNPVVJDRV9UWVBFID0gJ0FXUzo6Q2VydGlmaWNhdGVNYW5hZ2VyOjpDZXJ0aWZpY2F0ZSdcblxuLyoqXG4gKiBBIGNlcnRpZmljYXRlIG1hbmFnZWQgYnkgQVdTIENlcnRpZmljYXRlIE1hbmFnZXIuIFdpbGwgYmUgYXV0b21hdGljYWxseSB2YWxpZGF0ZWQgdXNpbmcgRE5TIHZhbGlkYXRpb24gYWdhaW5zdCB0aGVcbiAqIHNwZWNpZmllZCBSb3V0ZSA1MyBob3N0ZWQgem9uZS4gVGhpcyBjb25zdHJ1Y3Qgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgY3Jvc3MtcmVnaW9uIG9yIGNyb3NzLWFjY291bnQgY2VydGlmaWNhdGVcbiAqIHZhbGlkYXRpb25zLiBUaGUgZGVmYXVsdCBgYENlcnRpZmljYXRlYGAgY29uc3RydWN0IGlzIGJldHRlciBpbiBjYXNlcyB3aGVyZSBldmVyeXRoaW5nIGlzIG1hbmFnZWQgYnkgdGhlIENES1xuICogYXBwbGljYXRpb24uXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGNvbnN0cnVjdCBkb2VzIG5vdCBzdXBwb3J0IGFsdGVybmF0aXZlIG5hbWVzIHlldCBhcyBpdCB3b3VsZCByZXF1aXJlIGRvbWFpbiB0byByb2xlIG1hcHBpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vICMgQ3Jvc3MtcmVnaW9uIGNlcnRpZmljYXRlIHZhbGlkYXRpb25cbiAqIC8vIGhvc3RlZCB6b25lIG1hbmFnZWQgYnkgdGhlIENESyBhcHBsaWNhdGlvblxuICogY29uc3QgaG9zdGVkWm9uZTogcm91dGU1My5JSG9zdGVkWm9uZSA9IC4uLlxuICogLy8gbm8gc2VwYXJhdGUgdmFsaWRhdGlvbiByb2xlIGlzIG5lZWRlZFxuICogY29uc3QgY2VydGlmaWNhdGUgPSBuZXcgRG5zVmFsaWRhdGVkQ2VydGlmaWNhdGUodGhpcywgJ0Nyb3NzUmVnaW9uQ2VydGlmaWNhdGUnLCB7XG4gKiAgIGhvc3RlZFpvbmU6IGhvc3RlZFpvbmUsXG4gKiAgIGRvbWFpbk5hbWU6ICdleGFtcGxlLmNvbScsICAgICAvLyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgaG9zdGVkIHpvbmVcbiAqICAgY2VydGlmaWNhdGVSZWdpb246ICd1cy1lYXN0LTEnIC8vIHVzZWQgYnkgZm9yIGV4YW1wbGUgQ2xvdWRGcm9udFxuICogfSlcbiAqIC8vICMgQ3Jvc3MtYWNjb3VudCBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uXG4gKiAvLyBleHRlcm5hbCBob3N0ZWQgem9uZVxuICogY29uc3QgaG9zdGVkWm9uZTogcm91dGU1My5JSG9zdGVkWm9uZSA9XG4gKiAgIHJvdXRlNTMuSG9zdGVkWm9uZS5mcm9tSG9zdGVkWm9uZUF0dHJpYnV0ZXModGhpcywgJ0hvc3RlZFpvbmUnLCB7XG4gKiAgICAgaG9zdGVkWm9uZUlkOiAnWjUzMkRHREVERlMxMjM0NTY3ODknLFxuICogICAgIHpvbmVOYW1lOiAnZXhhbXBsZS5jb20nXG4gKiAgIH0pXG4gKiAvLyB2YWxpZGF0aW9uIHJvbGUgb24gdGhlIHNhbWUgYWNjb3VudCBhcyB0aGUgaG9zdGVkIHpvbmVcbiAqIGNvbnN0IHJvbGVBcm4gPSAnYXJuOmF3czppYW06OjEyMzQ1Njc4OTpyb2xlL0NoYW5nZURuc1JlY29yZHNSb2xlJ1xuICogY29uc3QgZXh0ZXJuYWxJZCA9ICdkb21haW4tYXNzdW1lJ1xuICogY29uc3QgdmFsaWRhdGlvblJvbGU6IGlhbS5JUm9sZSA9XG4gKiAgIGlhbS5Sb2xlLmZyb21Sb2xlQXJuKHRoaXMsICdWYWxpZGF0aW9uUm9sZScsIHJvbGVBcm4pXG4gKiBjb25zdCBjZXJ0aWZpY2F0ZSA9IG5ldyBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZSh0aGlzLCAnQ3Jvc3NBY2NvdW50Q2VydGlmaWNhdGUnLCB7XG4gKiAgIGhvc3RlZFpvbmU6IGhvc3RlZFpvbmUsXG4gKiAgIGRvbWFpbk5hbWU6ICdleGFtcGxlLmNvbScsXG4gKiAgIHZhbGlkYXRpb25Sb2xlOiB2YWxpZGF0aW9uUm9sZSxcbiAgICAgdmFsaWRhdGlvbkV4dGVybmFsSWQ6IGV4dGVybmFsSWRcbiAqIH0pXG4gKlxuICogQHJlc291cmNlIEN1c3RvbTo6RG5zVmFsaWRhdGVkQ2VydGlmaWNhdGVcbiAqIEByZXNvdXJjZSBBV1M6OkNlcnRpZmljYXRlTWFuYWdlcjo6Q2VydGlmaWNhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIERuc1ZhbGlkYXRlZENlcnRpZmljYXRlIGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgY2VydGlmaWNhdGVtYW5hZ2VyLklDZXJ0aWZpY2F0ZSwgY2RrLklUYWdnYWJsZSB7XG4gIC8qKiBUaGUgY2VydGlmaWNhdGUncyBBUk4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGNlcnRpZmljYXRlQXJuOiBzdHJpbmdcblxuICAvKiogVGhlIHJlZ2lvbiB3aGVyZSB0aGUgY2VydGlmaWNhdGUgaXMgZGVwbG95ZWQgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IGNlcnRpZmljYXRlUmVnaW9uOiBzdHJpbmdcblxuICAvKiogVGhlIGhvc3RlZCB6b25lIGlkZW50aWZpZXIgYXV0aG9yaXRhdGl2ZSBmb3IgdGhlIGNlcnRpZmljYXRlICovXG4gIHB1YmxpYyByZWFkb25seSBob3N0ZWRab25lSWQ6IHN0cmluZ1xuXG4gIC8qKiBUaGUgaG9zdGVkIHpvbmUgbmFtZSBhdXRob3JpdGF0aXZlIGZvciB0aGUgY2VydGlmaWNhdGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhvc3RlZFpvbmVOYW1lOiBzdHJpbmdcblxuICAvKiogVGhlIGRvbWFpbiBuYW1lIGluY2x1ZGVkIGluIHRoZSBjZXJ0aWZpY2F0ZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nXG5cbiAgLyoqIFRoZSB0YWcgbWFuYWdlciB0byBzZXQsIHJlbW92ZSBhbmQgZm9ybWF0IHRhZ3MgZm9yIHRoZSBjZXJ0aWZpY2F0ZSAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhZ3M6IGNkay5UYWdNYW5hZ2VyXG5cbiAgLyoqIFRoZSByZW1vdmFsIHBvbGljeSBmb3IgdGhlIGNlcnRpZmljYXRlICovXG4gIHByaXZhdGUgcmVtb3ZhbFBvbGljeTogY2RrLlJlbW92YWxQb2xpY3lcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZSBjb25zdHJ1Y3QuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBjb25zdHJ1Y3QgaG9zdGluZyB0aGlzIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgY29uc3RydWN0J3MgaWRlbnRpZmllclxuICAgKiBAcGFyYW0gcHJvcHMgcHJvcGVydGllcyBmb3IgdGhlIGNvbnN0cnVjdFxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERuc1ZhbGlkYXRlZENlcnRpZmljYXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLmRvbWFpbk5hbWUgPSB0aGlzLm5vcm1hbGl6ZURvbWFpbk5hbWUocHJvcHMuZG9tYWluTmFtZSlcbiAgICB0aGlzLmhvc3RlZFpvbmVJZCA9IHRoaXMubm9ybWFsaXplSG9zdGVkWm9uZUlkKHByb3BzLmhvc3RlZFpvbmUuaG9zdGVkWm9uZUlkKVxuICAgIHRoaXMuaG9zdGVkWm9uZU5hbWUgPSB0aGlzLm5vcm1hbGl6ZURvbWFpbk5hbWUocHJvcHMuaG9zdGVkWm9uZS56b25lTmFtZSlcbiAgICB0aGlzLmNlcnRpZmljYXRlUmVnaW9uID0gcHJvcHMuY2VydGlmaWNhdGVSZWdpb24gPz8gdGhpcy5zdGFjay5yZWdpb25cbiAgICB0aGlzLnRhZ3MgPSBuZXcgY2RrLlRhZ01hbmFnZXIoY2RrLlRhZ1R5cGUuTUFQLCBDRVJUVElGSUNBVEVfUkVTT1VSQ0VfVFlQRSlcbiAgICB0aGlzLnJlbW92YWxQb2xpY3kgPSBwcm9wcy5yZW1vdmFsUG9saWN5ID8/IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1lcblxuICAgIGNvbnN0IHJlcXVlc3RvckZ1bmN0aW9uID0gbmV3IENlcnRpZmljYXRlUmVxdWVzdG9yRnVuY3Rpb24odGhpcywgJ1JlcXVlc3RvckZ1bmN0aW9uJywge1xuICAgICAgYXJjaGl0ZWN0dXJlOiBsYW1iZGEuQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDE0KSxcbiAgICAgIHJvbGU6IHByb3BzLmN1c3RvbVJlc291cmNlUm9sZSxcbiAgICB9KVxuXG4gICAgcmVxdWVzdG9yRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnYWNtOlJlcXVlc3RDZXJ0aWZpY2F0ZScsXG4gICAgICAgICAgJ2FjbTpEZXNjcmliZUNlcnRpZmljYXRlJyxcbiAgICAgICAgICAnYWNtOkRlbGV0ZUNlcnRpZmljYXRlJyxcbiAgICAgICAgICAnYWNtOkFkZFRhZ3NUb0NlcnRpZmljYXRlJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIH0pXG4gICAgKVxuXG4gICAgaWYgKHByb3BzLnZhbGlkYXRpb25Sb2xlKSB7XG4gICAgICByZXF1ZXN0b3JGdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3koXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogWydzdHM6QXNzdW1lUm9sZSddLFxuICAgICAgICAgIHJlc291cmNlczogW3Byb3BzLnZhbGlkYXRpb25Sb2xlLnJvbGVBcm5dLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0b3JGdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3koXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ3JvdXRlNTM6R2V0Q2hhbmdlJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgfSlcbiAgICAgIClcblxuICAgICAgcmVxdWVzdG9yRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogWydyb3V0ZTUzOkNoYW5nZVJlc291cmNlUmVjb3JkU2V0cyddLFxuICAgICAgICAgIHJlc291cmNlczogW2Bhcm46YXdzOnJvdXRlNTM6Ojpob3N0ZWR6b25lLyR7dGhpcy5ob3N0ZWRab25lSWR9YF0sXG4gICAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgICAgJ0ZvckFsbFZhbHVlczpTdHJpbmdFcXVhbHMnOiB7XG4gICAgICAgICAgICAgICdyb3V0ZTUzOkNoYW5nZVJlc291cmNlUmVjb3JkU2V0c1JlY29yZFR5cGVzJzogWydDTkFNRSddLFxuICAgICAgICAgICAgICAncm91dGU1MzpDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHNBY3Rpb25zJzogWydVUFNFUlQnLCAnREVMRVRFJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0ZvckFsbFZhbHVlczpTdHJpbmdMaWtlJzoge1xuICAgICAgICAgICAgICAncm91dGU1MzpDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHNOb3JtYWxpemVkUmVjb3JkTmFtZXMnOiBbXG4gICAgICAgICAgICAgICAgdGhpcy53aWxkY2FyZERvbWFpbk5hbWUoJ01haW5Eb21haW5XaWxkY2FyZCcsIHRoaXMuZG9tYWluTmFtZSksXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdG9yUHJvdmlkZXIgPSBuZXcgY3VzdG9tX3Jlc291cmNlcy5Qcm92aWRlcih0aGlzLCAnUmVxdWVzdG9yUHJvdmlkZXInLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogcmVxdWVzdG9yRnVuY3Rpb24sXG4gICAgfSlcblxuICAgIGNvbnN0IHByb3BlcnRpZXM6IFByb3BlcnRpZXMgPSB7XG4gICAgICBIb3N0ZWRab25lSWQ6IHRoaXMuaG9zdGVkWm9uZUlkLFxuICAgICAgRG9tYWluTmFtZTogdGhpcy5kb21haW5OYW1lLFxuICAgICAgQ2VydGlmaWNhdGVSZWdpb246IHRoaXMuY2VydGlmaWNhdGVSZWdpb24sXG4gICAgICBTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lczogdW5kZWZpbmVkLCAvLyBub3Qgc3VwcG9ydGVkIHlldCBhcyBpdCByZXF1aXJlcyByb2xlIHRvIGRvbWFpbiBtYXBwaW5nXG4gICAgICBWYWxpZGF0aW9uUm9sZUFybjogcHJvcHMudmFsaWRhdGlvblJvbGU/LnJvbGVBcm4sXG4gICAgICBWYWxpZGF0aW9uRXh0ZXJuYWxJZDogcHJvcHMudmFsaWRhdGlvbkV4dGVybmFsSWQsXG4gICAgICBDbGVhbnVwVmFsaWRhdGlvblJlY29yZHM6IGJvb2xlYW5Ub1N0cmluZyhwcm9wcy5jbGVhbnVwVmFsaWRhdGlvblJlY29yZHMgPz8gdHJ1ZSksXG4gICAgICBUcmFuc3BhcmVuY3lMb2dnaW5nRW5hYmxlZDogYm9vbGVhblRvU3RyaW5nKHByb3BzLnRyYW5zcGFyZW5jeUxvZ2dpbmdFbmFibGVkID8/IHRydWUpLFxuICAgICAgVGFnczogY2RrLkxhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gdGhpcy50YWdzLnJlbmRlclRhZ3MoKSB9KSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgICBSZW1vdmFsUG9saWN5OiBjZGsuTGF6eS5zdHJpbmcoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLnJlbW92YWxQb2xpY3kgfSksXG4gICAgfVxuXG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSBuZXcgY2RrLkN1c3RvbVJlc291cmNlKHRoaXMsICdSZXF1ZXN0b3JSZXNvdXJjZScsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogcmVxdWVzdG9yUHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgcmVzb3VyY2VUeXBlOiBETlNfVkFMSURBVEVEX0NFUlRJRklDQVRFX1RZUEUsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgIH0pXG5cbiAgICB0aGlzLmNlcnRpZmljYXRlQXJuID0gY2VydGlmaWNhdGUuZ2V0QXR0U3RyaW5nKCdBcm4nKVxuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oeyB2YWxpZGF0ZTogKCkgPT4gdGhpcy52YWxpZGF0ZURvbWFpblRvSG9zdGVkWm9uZSh0aGlzLmRvbWFpbk5hbWUsIHRoaXMuaG9zdGVkWm9uZU5hbWUpIH0pXG4gIH1cblxuICBtZXRyaWNEYXlzVG9FeHBpcnkocHJvcHM/OiBjZGsuYXdzX2Nsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyB8IHVuZGVmaW5lZCk6IGNkay5hd3NfY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgcGVyaW9kOiBjZGsuRHVyYXRpb24uZGF5cygxKSxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGltZW5zaW9uc01hcDogeyBDZXJ0aWZpY2F0ZUFybjogdGhpcy5jZXJ0aWZpY2F0ZUFybiB9LFxuICAgICAgbWV0cmljTmFtZTogJ0RheXNUb0V4cGlyeScsXG4gICAgICBuYW1lc3BhY2U6ICdBV1MvQ2VydGlmaWNhdGVNYW5hZ2VyJyxcbiAgICAgIHJlZ2lvbjogdGhpcy5jZXJ0aWZpY2F0ZVJlZ2lvbixcbiAgICAgIHN0YXRpc3RpYzogY2xvdWR3YXRjaC5TdGF0cy5NSU5JTVVNLFxuICAgIH0pXG4gIH1cblxuICBhcHBseVJlbW92YWxQb2xpY3kocG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZhbFBvbGljeSA9IHBvbGljeVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVEb21haW5OYW1lKGRvbWFpbk5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQoZG9tYWluTmFtZSkpIHtcbiAgICAgIHJldHVybiBkb21haW5OYW1lXG4gICAgfVxuICAgIGlmIChkb21haW5OYW1lLmVuZHNXaXRoKCcuJykpIHtcbiAgICAgIHJldHVybiBkb21haW5OYW1lLnNsaWNlKDAsIC0xKVxuICAgIH1cbiAgICByZXR1cm4gZG9tYWluTmFtZVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVIb3N0ZWRab25lSWQoaG9zdGVkWm9uZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChjZGsuVG9rZW4uaXNVbnJlc29sdmVkKGhvc3RlZFpvbmVJZCkpIHtcbiAgICAgIHJldHVybiBob3N0ZWRab25lSWRcbiAgICB9XG4gICAgcmV0dXJuIGhvc3RlZFpvbmVJZC5yZXBsYWNlKC9eXFwvaG9zdGVkem9uZVxcLy8sICcnKVxuICB9XG5cbiAgcHJpdmF0ZSB3aWxkY2FyZERvbWFpbk5hbWUoaWQ6IHN0cmluZywgZG9tYWluTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0cyA9IGNkay5Gbi5zcGxpdCgnLicsIGRvbWFpbk5hbWUpXG4gICAgY29uc3QgZmlyc3QgPSBjZGsuRm4uc2VsZWN0KDAsIHBhcnRzKVxuICAgIGNvbnN0IGlzV2lsZGNhcmQgPSBuZXcgY2RrLkNmbkNvbmRpdGlvbih0aGlzLCBgSXMke2lkfWAsIHtcbiAgICAgIGV4cHJlc3Npb246IGNkay5Gbi5jb25kaXRpb25FcXVhbHMoZmlyc3QsICcqJyksXG4gICAgfSlcbiAgICByZXR1cm4gY2RrLkZuLmNvbmRpdGlvbklmKGlzV2lsZGNhcmQubG9naWNhbElkLCBkb21haW5OYW1lLCBgKi4ke2RvbWFpbk5hbWV9YCkudG9TdHJpbmcoKVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZURvbWFpblRvSG9zdGVkWm9uZShkb21haW5OYW1lOiBzdHJpbmcsIGhvc3RlZFpvbmVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgaWYgKGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQoZG9tYWluTmFtZSkgfHwgY2RrLlRva2VuLmlzVW5yZXNvbHZlZChob3N0ZWRab25lTmFtZSkpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgICBpZiAoZG9tYWluTmFtZSAhPT0gaG9zdGVkWm9uZU5hbWUgJiYgIWRvbWFpbk5hbWUuZW5kc1dpdGgoYC4ke2hvc3RlZFpvbmVOYW1lfWApKSB7XG4gICAgICByZXR1cm4gW2BIb3N0ZWQgem9uZSAke2hvc3RlZFpvbmVOYW1lfSBpcyBub3QgYXV0aG9yaXRhdGl2ZSBmb3IgY2VydGlmaWNhdGUgZG9tYWluIG5hbWUgJHtkb21haW5OYW1lfWBdXG4gICAgfVxuICAgIHJldHVybiBbXVxuICB9XG59XG4iXX0=
package/lib/utils.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export declare const sleep: (ms: number) => Promise<unknown>;
2
+ export declare const booleanToString: (value: boolean) => string;
3
+ export declare const stringToBoolean: (value: string) => boolean;
4
+ export declare const objectToString: (value: object) => string;
5
+ export declare const containsSame: <T>(array1: T[], array2: T[]) => boolean;
6
+ export declare const tryFor: <T>(maxSeconds: number, timeoutError: string, fn: () => Promise<T | null>) => Promise<T>;
package/lib/utils.js ADDED
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tryFor = exports.containsSame = exports.objectToString = exports.stringToBoolean = exports.booleanToString = exports.sleep = void 0;
4
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
5
+ exports.sleep = sleep;
6
+ const booleanToString = (value) => {
7
+ return value ? 'true' : 'false';
8
+ };
9
+ exports.booleanToString = booleanToString;
10
+ const stringToBoolean = (value) => {
11
+ return value === 'true' ? true : false;
12
+ };
13
+ exports.stringToBoolean = stringToBoolean;
14
+ const objectToString = (value) => {
15
+ return JSON.stringify(value, undefined, 2);
16
+ };
17
+ exports.objectToString = objectToString;
18
+ const containsSame = (array1, array2) => {
19
+ if (array1.length !== array2.length)
20
+ return false;
21
+ return array1.every((v1) => array2.includes(v1));
22
+ };
23
+ exports.containsSame = containsSame;
24
+ const tryFor = async (maxSeconds, timeoutError, fn) => {
25
+ const startTime = Date.now();
26
+ // eslint-disable-next-line no-constant-condition
27
+ for (let i = 0; true; i++) {
28
+ if (Date.now() > startTime + maxSeconds * 1000) {
29
+ throw new Error(timeoutError);
30
+ }
31
+ const result = await fn();
32
+ if (result !== null) {
33
+ return result;
34
+ }
35
+ const base = Math.pow(2, i);
36
+ await (0, exports.sleep)(Math.random() * base * 50 + base * 150);
37
+ }
38
+ };
39
+ exports.tryFor = tryFor;
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQU8sTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFBekUsUUFBQSxLQUFLLFNBQW9FO0FBRS9FLE1BQU0sZUFBZSxHQUFHLENBQUMsS0FBYyxFQUFVLEVBQUU7SUFDeEQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFBO0FBQ2pDLENBQUMsQ0FBQTtBQUZZLFFBQUEsZUFBZSxtQkFFM0I7QUFFTSxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWEsRUFBVyxFQUFFO0lBQ3hELE9BQU8sS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7QUFDeEMsQ0FBQyxDQUFBO0FBRlksUUFBQSxlQUFlLG1CQUUzQjtBQUVNLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUU7SUFDdEQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDNUMsQ0FBQyxDQUFBO0FBRlksUUFBQSxjQUFjLGtCQUUxQjtBQUVNLE1BQU0sWUFBWSxHQUFHLENBQUksTUFBVyxFQUFFLE1BQVcsRUFBVyxFQUFFO0lBQ25FLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQ2pELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ2xELENBQUMsQ0FBQTtBQUhZLFFBQUEsWUFBWSxnQkFHeEI7QUFFTSxNQUFNLE1BQU0sR0FBRyxLQUFLLEVBQUssVUFBa0IsRUFBRSxZQUFvQixFQUFFLEVBQTJCLEVBQWMsRUFBRTtJQUNuSCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDNUIsaURBQWlEO0lBQ2pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLEdBQUcsVUFBVSxHQUFHLElBQUksRUFBRTtZQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBO1NBQzlCO1FBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQTtRQUN6QixJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDbkIsT0FBTyxNQUFNLENBQUE7U0FDZDtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLE1BQU0sSUFBQSxhQUFLLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFBO0tBQ3BEO0FBQ0gsQ0FBQyxDQUFBO0FBZFksUUFBQSxNQUFNLFVBY2xCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSlcblxuZXhwb3J0IGNvbnN0IGJvb2xlYW5Ub1N0cmluZyA9ICh2YWx1ZTogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIHJldHVybiB2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSdcbn1cblxuZXhwb3J0IGNvbnN0IHN0cmluZ1RvQm9vbGVhbiA9ICh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBvYmplY3RUb1N0cmluZyA9ICh2YWx1ZTogb2JqZWN0KTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCB1bmRlZmluZWQsIDIpXG59XG5cbmV4cG9ydCBjb25zdCBjb250YWluc1NhbWUgPSA8VD4oYXJyYXkxOiBUW10sIGFycmF5MjogVFtdKTogYm9vbGVhbiA9PiB7XG4gIGlmIChhcnJheTEubGVuZ3RoICE9PSBhcnJheTIubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGFycmF5MS5ldmVyeSgodjEpID0+IGFycmF5Mi5pbmNsdWRlcyh2MSkpXG59XG5cbmV4cG9ydCBjb25zdCB0cnlGb3IgPSBhc3luYyA8VD4obWF4U2Vjb25kczogbnVtYmVyLCB0aW1lb3V0RXJyb3I6IHN0cmluZywgZm46ICgpID0+IFByb21pc2U8VCB8IG51bGw+KTogUHJvbWlzZTxUPiA9PiB7XG4gIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICBmb3IgKGxldCBpID0gMDsgdHJ1ZTsgaSsrKSB7XG4gICAgaWYgKERhdGUubm93KCkgPiBzdGFydFRpbWUgKyBtYXhTZWNvbmRzICogMTAwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRpbWVvdXRFcnJvcilcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oKVxuICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG4gICAgY29uc3QgYmFzZSA9IE1hdGgucG93KDIsIGkpXG4gICAgYXdhaXQgc2xlZXAoTWF0aC5yYW5kb20oKSAqIGJhc2UgKiA1MCArIGJhc2UgKiAxNTApXG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -89,7 +89,7 @@
89
89
  "publishConfig": {
90
90
  "access": "public"
91
91
  },
92
- "version": "0.0.11",
92
+ "version": "0.0.13",
93
93
  "jest": {
94
94
  "testMatch": [
95
95
  "<rootDir>/src/**/__tests__/**/*.ts?(x)",