@fjall/components-infrastructure 0.77.4 → 0.78.3
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/dist/lib/app.d.ts +8 -5
- package/dist/lib/app.js +19 -7
- package/dist/lib/patterns/aws/buildkite.js +4 -7
- package/dist/lib/patterns/aws/compute.d.ts +479 -48
- package/dist/lib/patterns/aws/compute.js +307 -94
- package/dist/lib/patterns/aws/database.d.ts +1 -0
- package/dist/lib/patterns/aws/database.js +4 -1
- package/dist/lib/patterns/aws/hostedZone.js +4 -7
- package/dist/lib/patterns/aws/loadBalancer.d.ts +163 -0
- package/dist/lib/patterns/aws/loadBalancer.js +278 -0
- package/dist/lib/patterns/aws/network.d.ts +1 -0
- package/dist/lib/patterns/aws/network.js +2 -1
- package/dist/lib/resources/aws/compute/capacityProviderDrainWaiter.d.ts +20 -0
- package/dist/lib/resources/aws/compute/capacityProviderDrainWaiter.js +180 -0
- package/dist/lib/resources/aws/compute/ecs.d.ts +294 -57
- package/dist/lib/resources/aws/compute/ecs.js +747 -261
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +1 -1
- package/dist/lib/resources/aws/compute/ecsSpot.js +1 -1
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +20 -0
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +180 -0
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +1 -0
- package/dist/lib/resources/aws/database/rdsAurora.js +2 -2
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +1 -0
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +2 -1
- package/dist/lib/resources/aws/database/rdsDeletionWaiter.d.ts +33 -0
- package/dist/lib/resources/aws/database/rdsDeletionWaiter.js +74 -0
- package/dist/lib/resources/aws/database/rdsInstance.d.ts +1 -0
- package/dist/lib/resources/aws/database/rdsInstance.js +3 -3
- package/dist/lib/resources/aws/networking/vpc.d.ts +1 -0
- package/dist/lib/resources/aws/networking/vpc.js +4 -3
- package/dist/lib/resources/aws/networking/vpcEndpoint.d.ts +2 -2
- package/dist/lib/resources/aws/networking/vpcEndpoint.js +1 -1
- package/dist/lib/resources/aws/networking/vpcEndpoints.d.ts +71 -0
- package/dist/lib/resources/aws/networking/vpcEndpoints.js +125 -0
- package/dist/lib/resources/aws/secrets/kms.d.ts +14 -0
- package/dist/lib/resources/aws/secrets/kms.js +5 -2
- package/dist/lib/resources/aws/secrets/secret.js +1 -1
- package/dist/lib/utils/standardTagsAspect.d.ts +26 -12
- package/dist/lib/utils/standardTagsAspect.js +67 -477
- package/dist/lib/utils/tagResource.d.ts +18 -3
- package/dist/lib/utils/tagResource.js +23 -6
- package/package.json +3 -3
- package/dist/lib/aspects/resourceInventory.d.ts +0 -41
- package/dist/lib/aspects/resourceInventory.js +0 -56
- package/dist/lib/config/audit.d.ts +0 -18
- package/dist/lib/config/audit.js +0 -22
- package/dist/lib/patterns/aws/auditRole.d.ts +0 -44
- package/dist/lib/patterns/aws/auditRole.js +0 -58
- package/dist/lib/patterns/aws/basicApp.d.ts +0 -0
- package/dist/lib/patterns/aws/basicApp.js +0 -150
- package/dist/lib/patterns/aws/ec2.d.ts +0 -43
- package/dist/lib/patterns/aws/ec2.js +0 -123
- package/dist/lib/patterns/aws/freeTierApp.d.ts +0 -44
- package/dist/lib/patterns/aws/freeTierApp.js +0 -83
- package/dist/lib/patterns/aws/spotInstanceApp.d.ts +0 -45
- package/dist/lib/patterns/aws/spotInstanceApp.js +0 -85
- package/dist/lib/resources/aws/audit/auditRole.d.ts +0 -32
- package/dist/lib/resources/aws/audit/auditRole.js +0 -46
- package/dist/lib/resources/aws/database/databaseFreeTier.d.ts +0 -15
- package/dist/lib/resources/aws/database/databaseFreeTier.js +0 -29
- package/dist/lib/resources/aws/database/rdsFreeTier.d.ts +0 -37
- package/dist/lib/resources/aws/database/rdsFreeTier.js +0 -84
- package/dist/lib/utils/getCidr.d.ts +0 -8
- package/dist/lib/utils/getCidr.js +0 -40
|
@@ -3,503 +3,93 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.StandardTagsAspect = void 0;
|
|
4
4
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
5
|
/**
|
|
6
|
-
* Aspect to
|
|
6
|
+
* Aspect to apply special Fjall tags to specific resource types.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
* -
|
|
11
|
-
*
|
|
8
|
+
* This aspect handles tags that depend on resource-specific properties:
|
|
9
|
+
* - fjall:operations:pool on VPCs with IPAM configuration
|
|
10
|
+
* - fjall:disasterRecovery:tier on S3 buckets with backup configuration
|
|
11
|
+
*
|
|
12
|
+
* Standard Fjall tags (costAllocation:environment, costAllocation:service, etc.)
|
|
13
|
+
* are applied via Tags.of(app).add() in the App class, which properly merges
|
|
14
|
+
* with existing tags from L2 constructs.
|
|
15
|
+
*
|
|
16
|
+
* This aspect uses Tags.of(node).add() to properly merge with existing tags
|
|
12
17
|
*/
|
|
13
18
|
class StandardTagsAspect {
|
|
14
|
-
constructor(
|
|
15
|
-
this.
|
|
16
|
-
this.requiredTags = requiredTags;
|
|
19
|
+
constructor() {
|
|
20
|
+
this.processedResources = new WeakSet();
|
|
17
21
|
}
|
|
18
22
|
visit(node) {
|
|
19
23
|
// Skip if already processed
|
|
20
|
-
if (this.
|
|
24
|
+
if (this.processedResources.has(node)) {
|
|
21
25
|
return;
|
|
22
26
|
}
|
|
23
27
|
// Process L1 (CFN) resources only
|
|
24
|
-
if (aws_cdk_lib_1.CfnResource.isCfnResource(node)) {
|
|
25
|
-
this.processCfnResource(node);
|
|
26
|
-
this.taggedResources.add(node);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
processCfnResource(resource) {
|
|
30
|
-
// Skip SecretRotation resources as they create nested stacks with different tag requirements
|
|
31
|
-
if (resource.node.path.includes("SecretRotation")) {
|
|
28
|
+
if (!aws_cdk_lib_1.CfnResource.isCfnResource(node)) {
|
|
32
29
|
return;
|
|
33
30
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"AWS::CertificateManager::Account",
|
|
39
|
-
// API Gateway
|
|
40
|
-
"AWS::ApiGateway::Account",
|
|
41
|
-
"AWS::ApiGateway::BasePathMapping",
|
|
42
|
-
"AWS::ApiGateway::Deployment",
|
|
43
|
-
"AWS::ApiGateway::DocumentationPart",
|
|
44
|
-
"AWS::ApiGateway::DocumentationVersion",
|
|
45
|
-
"AWS::ApiGateway::GatewayResponse",
|
|
46
|
-
"AWS::ApiGateway::Method",
|
|
47
|
-
"AWS::ApiGateway::Model",
|
|
48
|
-
"AWS::ApiGateway::RequestValidator",
|
|
49
|
-
"AWS::ApiGateway::Resource",
|
|
50
|
-
"AWS::ApiGatewayV2::ApiMapping",
|
|
51
|
-
"AWS::ApiGatewayV2::Authorizer",
|
|
52
|
-
"AWS::ApiGatewayV2::Deployment",
|
|
53
|
-
"AWS::ApiGatewayV2::Integration",
|
|
54
|
-
"AWS::ApiGatewayV2::IntegrationResponse",
|
|
55
|
-
"AWS::ApiGatewayV2::Model",
|
|
56
|
-
"AWS::ApiGatewayV2::Route",
|
|
57
|
-
"AWS::ApiGatewayV2::RouteResponse",
|
|
58
|
-
// AppSync
|
|
59
|
-
"AWS::AppSync::DataSource",
|
|
60
|
-
"AWS::AppSync::FunctionConfiguration",
|
|
61
|
-
"AWS::AppSync::Resolver",
|
|
62
|
-
// Athena
|
|
63
|
-
"AWS::Athena::PreparedStatement",
|
|
64
|
-
// CloudFormation
|
|
65
|
-
"AWS::CloudFormation::CustomResource",
|
|
66
|
-
"AWS::CloudFormation::Macro",
|
|
67
|
-
"AWS::CloudFormation::ModuleDefaultVersion",
|
|
68
|
-
"AWS::CloudFormation::ModuleVersion",
|
|
69
|
-
"AWS::CloudFormation::PublicTypeVersion",
|
|
70
|
-
"AWS::CloudFormation::Publisher",
|
|
71
|
-
"AWS::CloudFormation::ResourceDefaultVersion",
|
|
72
|
-
"AWS::CloudFormation::ResourceVersion",
|
|
73
|
-
"AWS::CloudFormation::TypeActivation",
|
|
74
|
-
"AWS::CloudFormation::WaitCondition",
|
|
75
|
-
"AWS::CloudFormation::WaitConditionHandle",
|
|
76
|
-
// CloudWatch
|
|
77
|
-
"AWS::CloudWatch::Alarm",
|
|
78
|
-
"AWS::CloudWatch::AnomalyDetector",
|
|
79
|
-
"AWS::CloudWatch::CompositeAlarm",
|
|
80
|
-
"AWS::CloudWatch::Dashboard",
|
|
81
|
-
"AWS::CloudWatch::InsightRule",
|
|
82
|
-
"AWS::CloudWatch::MetricStream",
|
|
83
|
-
// CodeBuild
|
|
84
|
-
"AWS::CodeBuild::ReportGroup",
|
|
85
|
-
"AWS::CodeBuild::SourceCredential",
|
|
86
|
-
// CodeDeploy
|
|
87
|
-
"AWS::CodeDeploy::DeploymentConfig",
|
|
88
|
-
// CodePipeline
|
|
89
|
-
"AWS::CodePipeline::CustomActionType",
|
|
90
|
-
"AWS::CodePipeline::Webhook",
|
|
91
|
-
// Cognito
|
|
92
|
-
"AWS::Cognito::IdentityPoolRoleAttachment",
|
|
93
|
-
"AWS::Cognito::UserPoolClient",
|
|
94
|
-
"AWS::Cognito::UserPoolDomain",
|
|
95
|
-
"AWS::Cognito::UserPoolGroup",
|
|
96
|
-
"AWS::Cognito::UserPoolIdentityProvider",
|
|
97
|
-
"AWS::Cognito::UserPoolResourceServer",
|
|
98
|
-
"AWS::Cognito::UserPoolRiskConfigurationAttachment",
|
|
99
|
-
"AWS::Cognito::UserPoolUICustomizationAttachment",
|
|
100
|
-
"AWS::Cognito::UserPoolUser",
|
|
101
|
-
"AWS::Cognito::UserPoolUserToGroupAttachment",
|
|
102
|
-
// Config
|
|
103
|
-
"AWS::Config::AggregationAuthorization",
|
|
104
|
-
"AWS::Config::ConfigurationAggregator",
|
|
105
|
-
"AWS::Config::ConformancePack",
|
|
106
|
-
"AWS::Config::OrganizationConformancePack",
|
|
107
|
-
"AWS::Config::RemediationConfiguration",
|
|
108
|
-
"AWS::Config::StoredQuery",
|
|
109
|
-
// DynamoDB
|
|
110
|
-
"AWS::DynamoDB::GlobalTable",
|
|
111
|
-
// EC2
|
|
112
|
-
"AWS::EC2::CapacityReservationFleet",
|
|
113
|
-
"AWS::EC2::CarrierGateway",
|
|
114
|
-
"AWS::EC2::DHCPOptions",
|
|
115
|
-
"AWS::EC2::EC2Fleet",
|
|
116
|
-
"AWS::EC2::EgressOnlyInternetGateway",
|
|
117
|
-
"AWS::EC2::EIPAssociation",
|
|
118
|
-
"AWS::EC2::EnclaveCertificateIamRoleAssociation",
|
|
119
|
-
"AWS::EC2::FlowLog",
|
|
120
|
-
"AWS::EC2::GatewayRouteTableAssociation",
|
|
121
|
-
"AWS::EC2::InstanceConnectEndpoint",
|
|
122
|
-
"AWS::EC2::KeyPair",
|
|
123
|
-
"AWS::EC2::LaunchTemplate",
|
|
124
|
-
"AWS::EC2::NetworkInsightsAccessScope",
|
|
125
|
-
"AWS::EC2::NetworkInsightsAccessScopeAnalysis",
|
|
126
|
-
"AWS::EC2::NetworkInsightsAnalysis",
|
|
127
|
-
"AWS::EC2::NetworkInsightsPath",
|
|
128
|
-
"AWS::EC2::NetworkInterfaceAttachment",
|
|
129
|
-
"AWS::EC2::NetworkInterfacePermission",
|
|
130
|
-
"AWS::EC2::PlacementGroup",
|
|
131
|
-
"AWS::EC2::Route",
|
|
132
|
-
"AWS::EC2::SecurityGroupEgress",
|
|
133
|
-
"AWS::EC2::SecurityGroupIngress",
|
|
134
|
-
"AWS::EC2::SubnetCidrBlock",
|
|
135
|
-
"AWS::EC2::SubnetNetworkAclAssociation",
|
|
136
|
-
"AWS::EC2::SubnetRouteTableAssociation",
|
|
137
|
-
"AWS::EC2::TransitGatewayAttachment",
|
|
138
|
-
"AWS::EC2::TransitGatewayConnect",
|
|
139
|
-
"AWS::EC2::TransitGatewayMulticastDomain",
|
|
140
|
-
"AWS::EC2::TransitGatewayMulticastDomainAssociation",
|
|
141
|
-
"AWS::EC2::TransitGatewayMulticastGroupMember",
|
|
142
|
-
"AWS::EC2::TransitGatewayMulticastGroupSource",
|
|
143
|
-
"AWS::EC2::TransitGatewayPeeringAttachment",
|
|
144
|
-
"AWS::EC2::TransitGatewayRoute",
|
|
145
|
-
"AWS::EC2::TransitGatewayRouteTable",
|
|
146
|
-
"AWS::EC2::TransitGatewayRouteTableAssociation",
|
|
147
|
-
"AWS::EC2::TransitGatewayRouteTablePropagation",
|
|
148
|
-
"AWS::EC2::TransitGatewayVpcAttachment",
|
|
149
|
-
"AWS::EC2::VerifiedAccessEndpoint",
|
|
150
|
-
"AWS::EC2::VerifiedAccessGroup",
|
|
151
|
-
"AWS::EC2::VerifiedAccessInstance",
|
|
152
|
-
"AWS::EC2::VerifiedAccessTrustProvider",
|
|
153
|
-
"AWS::EC2::VolumeAttachment",
|
|
154
|
-
"AWS::EC2::VPCCidrBlock",
|
|
155
|
-
"AWS::EC2::VPCDHCPOptionsAssociation",
|
|
156
|
-
"AWS::EC2::VPCEndpointConnectionNotification",
|
|
157
|
-
"AWS::EC2::VPCEndpointService",
|
|
158
|
-
"AWS::EC2::VPCEndpointServicePermissions",
|
|
159
|
-
"AWS::EC2::VPCGatewayAttachment",
|
|
160
|
-
"AWS::EC2::VPNConnectionRoute",
|
|
161
|
-
"AWS::EC2::VPNGatewayRoutePropagation",
|
|
162
|
-
// ECR
|
|
163
|
-
"AWS::ECR::PublicRepository",
|
|
164
|
-
"AWS::ECR::PullThroughCacheRule",
|
|
165
|
-
"AWS::ECR::RegistryPolicy",
|
|
166
|
-
"AWS::ECR::ReplicationConfiguration",
|
|
167
|
-
// ECS
|
|
168
|
-
"AWS::ECS::AccountSetting",
|
|
169
|
-
"AWS::ECS::CapacityProvider",
|
|
170
|
-
"AWS::ECS::ClusterCapacityProviderAssociations",
|
|
171
|
-
"AWS::ECS::PrimaryTaskSet",
|
|
172
|
-
"AWS::ECS::TaskSet",
|
|
173
|
-
// EFS
|
|
174
|
-
"AWS::EFS::AccessPoint",
|
|
175
|
-
"AWS::EFS::MountTarget",
|
|
176
|
-
// EKS
|
|
177
|
-
"AWS::EKS::Addon",
|
|
178
|
-
"AWS::EKS::FargateProfile",
|
|
179
|
-
"AWS::EKS::IdentityProviderConfig",
|
|
180
|
-
// ElastiCache
|
|
181
|
-
"AWS::ElastiCache::ParameterGroup",
|
|
182
|
-
"AWS::ElastiCache::SecurityGroup",
|
|
183
|
-
"AWS::ElastiCache::SecurityGroupIngress",
|
|
184
|
-
"AWS::ElastiCache::SubnetGroup",
|
|
185
|
-
// ElasticBeanstalk
|
|
186
|
-
"AWS::ElasticBeanstalk::ApplicationVersion",
|
|
187
|
-
"AWS::ElasticBeanstalk::ConfigurationTemplate",
|
|
188
|
-
// ElasticLoadBalancingV2
|
|
189
|
-
"AWS::ElasticLoadBalancingV2::Listener",
|
|
190
|
-
"AWS::ElasticLoadBalancingV2::ListenerCertificate",
|
|
191
|
-
"AWS::ElasticLoadBalancingV2::ListenerRule",
|
|
192
|
-
"AWS::ElasticLoadBalancingV2::TargetGroupAttachment",
|
|
193
|
-
// EventBridge (Events)
|
|
194
|
-
"AWS::Events::ApiDestination",
|
|
195
|
-
"AWS::Events::Archive",
|
|
196
|
-
"AWS::Events::Connection",
|
|
197
|
-
"AWS::Events::Endpoint",
|
|
198
|
-
"AWS::Events::EventBusPolicy",
|
|
199
|
-
"AWS::Events::Rule",
|
|
200
|
-
// FSx
|
|
201
|
-
"AWS::FSx::DataRepositoryAssociation",
|
|
202
|
-
"AWS::FSx::Snapshot",
|
|
203
|
-
"AWS::FSx::StorageVirtualMachine",
|
|
204
|
-
"AWS::FSx::Volume",
|
|
205
|
-
// GameLift
|
|
206
|
-
"AWS::GameLift::GameServerGroup",
|
|
207
|
-
"AWS::GameLift::Location",
|
|
208
|
-
// Glue
|
|
209
|
-
"AWS::Glue::Connection",
|
|
210
|
-
"AWS::Glue::Database",
|
|
211
|
-
"AWS::Glue::DataCatalogEncryptionSettings",
|
|
212
|
-
"AWS::Glue::Partition",
|
|
213
|
-
"AWS::Glue::SchemaVersion",
|
|
214
|
-
"AWS::Glue::SchemaVersionMetadata",
|
|
215
|
-
"AWS::Glue::SecurityConfiguration",
|
|
216
|
-
"AWS::Glue::Table",
|
|
217
|
-
"AWS::Glue::UserDefinedFunction",
|
|
218
|
-
// GuardDuty
|
|
219
|
-
"AWS::GuardDuty::Detector",
|
|
220
|
-
"AWS::GuardDuty::Filter",
|
|
221
|
-
"AWS::GuardDuty::IPSet",
|
|
222
|
-
"AWS::GuardDuty::Master",
|
|
223
|
-
"AWS::GuardDuty::Member",
|
|
224
|
-
"AWS::GuardDuty::ThreatIntelSet",
|
|
225
|
-
// IAM
|
|
226
|
-
"AWS::IAM::AccessKey",
|
|
227
|
-
"AWS::IAM::Group",
|
|
228
|
-
"AWS::IAM::GroupPolicy",
|
|
229
|
-
"AWS::IAM::InstanceProfile",
|
|
230
|
-
"AWS::IAM::ManagedPolicy",
|
|
231
|
-
"AWS::IAM::OIDCProvider",
|
|
232
|
-
"AWS::IAM::Policy",
|
|
233
|
-
"AWS::IAM::Role",
|
|
234
|
-
"AWS::IAM::RolePolicy",
|
|
235
|
-
"AWS::IAM::SAMLProvider",
|
|
236
|
-
"AWS::IAM::ServerCertificate",
|
|
237
|
-
"AWS::IAM::ServiceLinkedRole",
|
|
238
|
-
"AWS::IAM::User",
|
|
239
|
-
"AWS::IAM::UserPolicy",
|
|
240
|
-
"AWS::IAM::UserToGroupAddition",
|
|
241
|
-
"AWS::IAM::VirtualMFADevice",
|
|
242
|
-
// IoT
|
|
243
|
-
"AWS::IoT::AccountAuditConfiguration",
|
|
244
|
-
"AWS::IoT::Authorizer",
|
|
245
|
-
"AWS::IoT::Certificate",
|
|
246
|
-
"AWS::IoT::CustomMetric",
|
|
247
|
-
"AWS::IoT::Dimension",
|
|
248
|
-
"AWS::IoT::DomainConfiguration",
|
|
249
|
-
"AWS::IoT::FleetMetric",
|
|
250
|
-
"AWS::IoT::JobTemplate",
|
|
251
|
-
"AWS::IoT::Logging",
|
|
252
|
-
"AWS::IoT::MitigationAction",
|
|
253
|
-
"AWS::IoT::Policy",
|
|
254
|
-
"AWS::IoT::PolicyPrincipalAttachment",
|
|
255
|
-
"AWS::IoT::ProvisioningTemplate",
|
|
256
|
-
"AWS::IoT::ResourceSpecificLogging",
|
|
257
|
-
"AWS::IoT::RoleAlias",
|
|
258
|
-
"AWS::IoT::ScheduledAudit",
|
|
259
|
-
"AWS::IoT::SecurityProfile",
|
|
260
|
-
"AWS::IoT::Thing",
|
|
261
|
-
"AWS::IoT::ThingGroup",
|
|
262
|
-
"AWS::IoT::ThingPrincipalAttachment",
|
|
263
|
-
"AWS::IoT::ThingType",
|
|
264
|
-
"AWS::IoT::TopicRule",
|
|
265
|
-
"AWS::IoT::TopicRuleDestination",
|
|
266
|
-
// KMS
|
|
267
|
-
"AWS::KMS::Alias",
|
|
268
|
-
"AWS::KMS::Grant",
|
|
269
|
-
"AWS::KMS::ReplicaKey",
|
|
270
|
-
// Lambda
|
|
271
|
-
"AWS::Lambda::CodeSigningConfig",
|
|
272
|
-
"AWS::Lambda::EventInvokeConfig",
|
|
273
|
-
"AWS::Lambda::EventSourceMapping",
|
|
274
|
-
"AWS::Lambda::LayerVersion",
|
|
275
|
-
"AWS::Lambda::LayerVersionPermission",
|
|
276
|
-
"AWS::Lambda::Permission",
|
|
277
|
-
"AWS::Lambda::ProvisionedConcurrencyConfig",
|
|
278
|
-
"AWS::Lambda::Url",
|
|
279
|
-
"AWS::Lambda::Version",
|
|
280
|
-
// Logs
|
|
281
|
-
"AWS::Logs::AccountPolicy",
|
|
282
|
-
"AWS::Logs::Destination",
|
|
283
|
-
"AWS::Logs::LogGroup",
|
|
284
|
-
"AWS::Logs::LogStream",
|
|
285
|
-
"AWS::Logs::MetricFilter",
|
|
286
|
-
"AWS::Logs::QueryDefinition",
|
|
287
|
-
"AWS::Logs::ResourcePolicy",
|
|
288
|
-
"AWS::Logs::SubscriptionFilter",
|
|
289
|
-
// Macie
|
|
290
|
-
"AWS::Macie::AllowList",
|
|
291
|
-
"AWS::Macie::CustomDataIdentifier",
|
|
292
|
-
"AWS::Macie::FindingsFilter",
|
|
293
|
-
"AWS::Macie::Session",
|
|
294
|
-
// Neptune
|
|
295
|
-
"AWS::Neptune::DBClusterParameterGroup",
|
|
296
|
-
"AWS::Neptune::DBParameterGroup",
|
|
297
|
-
"AWS::Neptune::DBSubnetGroup",
|
|
298
|
-
// Organizations
|
|
299
|
-
"AWS::Organizations::Account",
|
|
300
|
-
"AWS::Organizations::Organization",
|
|
301
|
-
"AWS::Organizations::OrganizationalUnit",
|
|
302
|
-
"AWS::Organizations::Policy",
|
|
303
|
-
"AWS::Organizations::ResourcePolicy",
|
|
304
|
-
// RDS
|
|
305
|
-
"AWS::RDS::DBClusterParameterGroup",
|
|
306
|
-
"AWS::RDS::DBParameterGroup",
|
|
307
|
-
"AWS::RDS::DBProxyEndpoint",
|
|
308
|
-
"AWS::RDS::DBProxyTargetGroup",
|
|
309
|
-
"AWS::RDS::DBSecurityGroup",
|
|
310
|
-
"AWS::RDS::DBSecurityGroupIngress",
|
|
311
|
-
"AWS::RDS::DBSubnetGroup",
|
|
312
|
-
"AWS::RDS::EventSubscription",
|
|
313
|
-
"AWS::RDS::GlobalCluster",
|
|
314
|
-
"AWS::RDS::OptionGroup",
|
|
315
|
-
// Redshift
|
|
316
|
-
"AWS::Redshift::ClusterParameterGroup",
|
|
317
|
-
"AWS::Redshift::ClusterSecurityGroup",
|
|
318
|
-
"AWS::Redshift::ClusterSecurityGroupIngress",
|
|
319
|
-
"AWS::Redshift::ClusterSubnetGroup",
|
|
320
|
-
"AWS::Redshift::EndpointAccess",
|
|
321
|
-
"AWS::Redshift::EndpointAuthorization",
|
|
322
|
-
"AWS::Redshift::EventSubscription",
|
|
323
|
-
"AWS::Redshift::ScheduledAction",
|
|
324
|
-
// Route53
|
|
325
|
-
"AWS::Route53::DNSSEC",
|
|
326
|
-
"AWS::Route53::HealthCheck",
|
|
327
|
-
"AWS::Route53::HostedZone",
|
|
328
|
-
"AWS::Route53::KeySigningKey",
|
|
329
|
-
"AWS::Route53::RecordSet",
|
|
330
|
-
"AWS::Route53::RecordSetGroup",
|
|
331
|
-
// Route53Resolver
|
|
332
|
-
"AWS::Route53Resolver::FirewallDomainList",
|
|
333
|
-
"AWS::Route53Resolver::FirewallRuleGroup",
|
|
334
|
-
"AWS::Route53Resolver::FirewallRuleGroupAssociation",
|
|
335
|
-
"AWS::Route53Resolver::ResolverConfig",
|
|
336
|
-
"AWS::Route53Resolver::ResolverDNSSECConfig",
|
|
337
|
-
"AWS::Route53Resolver::ResolverQueryLoggingConfig",
|
|
338
|
-
"AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation",
|
|
339
|
-
"AWS::Route53Resolver::ResolverRule",
|
|
340
|
-
"AWS::Route53Resolver::ResolverRuleAssociation",
|
|
341
|
-
// S3
|
|
342
|
-
"AWS::S3::AccessPoint",
|
|
343
|
-
"AWS::S3::BucketPolicy",
|
|
344
|
-
"AWS::S3::MultiRegionAccessPoint",
|
|
345
|
-
"AWS::S3::MultiRegionAccessPointPolicy",
|
|
346
|
-
"AWS::S3::StorageLens",
|
|
347
|
-
// SDB
|
|
348
|
-
"AWS::SDB::Domain",
|
|
349
|
-
// SecretsManager
|
|
350
|
-
"AWS::SecretsManager::ResourcePolicy",
|
|
351
|
-
"AWS::SecretsManager::RotationSchedule",
|
|
352
|
-
"AWS::SecretsManager::SecretTargetAttachment",
|
|
353
|
-
// SecurityHub
|
|
354
|
-
"AWS::SecurityHub::Hub",
|
|
355
|
-
// ServiceCatalog
|
|
356
|
-
"AWS::ServiceCatalog::AcceptedPortfolioShare",
|
|
357
|
-
"AWS::ServiceCatalog::LaunchNotificationConstraint",
|
|
358
|
-
"AWS::ServiceCatalog::LaunchRoleConstraint",
|
|
359
|
-
"AWS::ServiceCatalog::LaunchTemplateConstraint",
|
|
360
|
-
"AWS::ServiceCatalog::PortfolioPrincipalAssociation",
|
|
361
|
-
"AWS::ServiceCatalog::PortfolioProductAssociation",
|
|
362
|
-
"AWS::ServiceCatalog::PortfolioShare",
|
|
363
|
-
"AWS::ServiceCatalog::ResourceUpdateConstraint",
|
|
364
|
-
"AWS::ServiceCatalog::ServiceAction",
|
|
365
|
-
"AWS::ServiceCatalog::ServiceActionAssociation",
|
|
366
|
-
"AWS::ServiceCatalog::StackSetConstraint",
|
|
367
|
-
"AWS::ServiceCatalog::TagOption",
|
|
368
|
-
"AWS::ServiceCatalog::TagOptionAssociation",
|
|
369
|
-
// SES
|
|
370
|
-
"AWS::SES::ConfigurationSet",
|
|
371
|
-
"AWS::SES::ConfigurationSetEventDestination",
|
|
372
|
-
"AWS::SES::ContactList",
|
|
373
|
-
"AWS::SES::DedicatedIpPool",
|
|
374
|
-
"AWS::SES::EmailIdentity",
|
|
375
|
-
"AWS::SES::ReceiptFilter",
|
|
376
|
-
"AWS::SES::ReceiptRule",
|
|
377
|
-
"AWS::SES::ReceiptRuleSet",
|
|
378
|
-
"AWS::SES::Template",
|
|
379
|
-
"AWS::SES::VdmAttributes",
|
|
380
|
-
// SNS
|
|
381
|
-
"AWS::SNS::Subscription",
|
|
382
|
-
"AWS::SNS::TopicPolicy",
|
|
383
|
-
// SQS
|
|
384
|
-
"AWS::SQS::QueuePolicy",
|
|
385
|
-
// SSM
|
|
386
|
-
"AWS::SSM::Association",
|
|
387
|
-
"AWS::SSM::Document",
|
|
388
|
-
"AWS::SSM::MaintenanceWindow",
|
|
389
|
-
"AWS::SSM::MaintenanceWindowTarget",
|
|
390
|
-
"AWS::SSM::MaintenanceWindowTask",
|
|
391
|
-
"AWS::SSM::Parameter",
|
|
392
|
-
"AWS::SSM::PatchBaseline",
|
|
393
|
-
"AWS::SSM::ResourceDataSync",
|
|
394
|
-
"AWS::SSM::ResourcePolicy",
|
|
395
|
-
// SSO
|
|
396
|
-
"AWS::SSO::Assignment",
|
|
397
|
-
"AWS::SSO::InstanceAccessControlAttributeConfiguration",
|
|
398
|
-
"AWS::SSO::PermissionSet",
|
|
399
|
-
// StepFunctions
|
|
400
|
-
"AWS::StepFunctions::Activity",
|
|
401
|
-
// WAF/WAFv2
|
|
402
|
-
"AWS::WAF::ByteMatchSet",
|
|
403
|
-
"AWS::WAF::IPSet",
|
|
404
|
-
"AWS::WAF::Rule",
|
|
405
|
-
"AWS::WAF::SizeConstraintSet",
|
|
406
|
-
"AWS::WAF::SqlInjectionMatchSet",
|
|
407
|
-
"AWS::WAF::WebACL",
|
|
408
|
-
"AWS::WAF::XssMatchSet",
|
|
409
|
-
"AWS::WAFRegional::ByteMatchSet",
|
|
410
|
-
"AWS::WAFRegional::GeoMatchSet",
|
|
411
|
-
"AWS::WAFRegional::IPSet",
|
|
412
|
-
"AWS::WAFRegional::RateBasedRule",
|
|
413
|
-
"AWS::WAFRegional::RegexPatternSet",
|
|
414
|
-
"AWS::WAFRegional::Rule",
|
|
415
|
-
"AWS::WAFRegional::SizeConstraintSet",
|
|
416
|
-
"AWS::WAFRegional::SqlInjectionMatchSet",
|
|
417
|
-
"AWS::WAFRegional::WebACL",
|
|
418
|
-
"AWS::WAFRegional::WebACLAssociation",
|
|
419
|
-
"AWS::WAFRegional::XssMatchSet",
|
|
420
|
-
"AWS::WAFv2::IPSet",
|
|
421
|
-
"AWS::WAFv2::LoggingConfiguration",
|
|
422
|
-
"AWS::WAFv2::RegexPatternSet",
|
|
423
|
-
"AWS::WAFv2::RuleGroup",
|
|
424
|
-
"AWS::WAFv2::WebACL",
|
|
425
|
-
"AWS::WAFv2::WebACLAssociation",
|
|
426
|
-
// Serverless
|
|
427
|
-
"AWS::Serverless::Api",
|
|
428
|
-
"AWS::Serverless::Application",
|
|
429
|
-
"AWS::Serverless::Function",
|
|
430
|
-
"AWS::Serverless::HttpApi",
|
|
431
|
-
"AWS::Serverless::LayerVersion",
|
|
432
|
-
"AWS::Serverless::SimpleTable",
|
|
433
|
-
"AWS::Serverless::StateMachine"
|
|
434
|
-
];
|
|
435
|
-
if (unsupportedTypes.includes(resource.cfnResourceType)) {
|
|
31
|
+
const resource = node;
|
|
32
|
+
this.processedResources.add(node);
|
|
33
|
+
// Skip SecretRotation resources as they create nested stacks
|
|
34
|
+
if (resource.node.path.includes("SecretRotation")) {
|
|
436
35
|
return;
|
|
437
36
|
}
|
|
438
|
-
// Add a synthesis hook to modify the CloudFormation template
|
|
439
|
-
const stack = aws_cdk_lib_1.Stack.of(resource);
|
|
440
|
-
const logicalId = stack.getLogicalId(resource);
|
|
441
|
-
// Use addTransform to add tags during synthesis
|
|
442
|
-
resource.addPropertyOverride("Tags", this.buildTagsArray(resource));
|
|
443
|
-
}
|
|
444
|
-
buildTagsArray(resource) {
|
|
445
|
-
const tagMap = new Map();
|
|
446
37
|
// Add IPAM pool tag for VPCs with IPAM configuration
|
|
447
38
|
if (resource.cfnResourceType === "AWS::EC2::VPC") {
|
|
448
|
-
|
|
449
|
-
const ipamPoolId = vpc.ipv4IpamPoolId;
|
|
450
|
-
if (ipamPoolId) {
|
|
451
|
-
const stack = aws_cdk_lib_1.Stack.of(resource);
|
|
452
|
-
const accountId = stack.node.tryGetContext("accountId") ||
|
|
453
|
-
stack.account ||
|
|
454
|
-
process.env.CDK_DEFAULT_ACCOUNT;
|
|
455
|
-
const region = stack.region || process.env.CDK_DEFAULT_REGION;
|
|
456
|
-
if (accountId && region) {
|
|
457
|
-
tagMap.set("fjall:operations:pool", `${accountId}-${region}`);
|
|
458
|
-
}
|
|
459
|
-
}
|
|
39
|
+
this.addIpamPoolTag(resource);
|
|
460
40
|
}
|
|
461
41
|
// Add disaster recovery tier tag for S3 buckets with backupVaultTier
|
|
462
42
|
if (resource.cfnResourceType === "AWS::S3::Bucket") {
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
resilient: "resilient",
|
|
475
|
-
enterprise: "enterprise"
|
|
476
|
-
};
|
|
477
|
-
const tagValue = tierMap[tier] || tier;
|
|
478
|
-
tagMap.set("fjall:disasterRecovery:tier", tagValue);
|
|
479
|
-
break;
|
|
480
|
-
}
|
|
481
|
-
construct = construct.node.scope;
|
|
482
|
-
}
|
|
43
|
+
this.addBackupTierTag(resource);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Add IPAM pool tag to VPCs that use IPAM for IP address allocation.
|
|
48
|
+
* Tag format: fjall:operations:pool = "{accountId}-{region}"
|
|
49
|
+
*/
|
|
50
|
+
addIpamPoolTag(vpc) {
|
|
51
|
+
const ipamPoolId = vpc.ipv4IpamPoolId;
|
|
52
|
+
if (!ipamPoolId) {
|
|
53
|
+
return;
|
|
483
54
|
}
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
55
|
+
const stack = aws_cdk_lib_1.Stack.of(vpc);
|
|
56
|
+
const accountId = stack.node.tryGetContext("accountId") ||
|
|
57
|
+
stack.account ||
|
|
58
|
+
process.env.CDK_DEFAULT_ACCOUNT;
|
|
59
|
+
const region = stack.region || process.env.CDK_DEFAULT_REGION;
|
|
60
|
+
if (accountId && region) {
|
|
61
|
+
aws_cdk_lib_1.Tags.of(vpc).add("fjall:operations:pool", `${accountId}-${region}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Add disaster recovery tier tag to S3 buckets with backupVaultTier property.
|
|
66
|
+
* Tag format: fjall:disasterRecovery:tier = "{tier}"
|
|
67
|
+
*
|
|
68
|
+
* Tier mapping:
|
|
69
|
+
* - standard -> "default" (matches existing backup plans)
|
|
70
|
+
* - resilient -> "resilient"
|
|
71
|
+
* - enterprise -> "enterprise"
|
|
72
|
+
*/
|
|
73
|
+
addBackupTierTag(resource) {
|
|
74
|
+
// Walk up the construct tree to find the L2 S3Bucket construct
|
|
75
|
+
let construct = resource;
|
|
76
|
+
while (construct) {
|
|
77
|
+
// Check if this is our custom S3Bucket class with backupVaultTier property
|
|
78
|
+
const backupConstruct = construct;
|
|
79
|
+
if (backupConstruct.backupVaultTier) {
|
|
80
|
+
const tier = backupConstruct.backupVaultTier;
|
|
81
|
+
const tierMap = {
|
|
82
|
+
standard: "default",
|
|
83
|
+
resilient: "resilient",
|
|
84
|
+
enterprise: "enterprise"
|
|
85
|
+
};
|
|
86
|
+
const tagValue = tierMap[tier] || tier;
|
|
87
|
+
aws_cdk_lib_1.Tags.of(resource).add("fjall:disasterRecovery:tier", tagValue);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
construct = construct.node.scope;
|
|
496
91
|
}
|
|
497
|
-
// Standard tag format for all other resources
|
|
498
|
-
return Array.from(tagMap.entries()).map(([key, value]) => ({
|
|
499
|
-
Key: key,
|
|
500
|
-
Value: value
|
|
501
|
-
}));
|
|
502
92
|
}
|
|
503
93
|
}
|
|
504
94
|
exports.StandardTagsAspect = StandardTagsAspect;
|
|
505
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmRUYWdzQXNwZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3V0aWxzL3N0YW5kYXJkVGFnc0FzcGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBK0Q7QUFJL0Q7Ozs7Ozs7R0FPRztBQUNILE1BQWEsa0JBQWtCO0lBSTdCLFlBQVksWUFBdUM7UUFGbEMsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO1FBRzNELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ25DLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBZ0I7UUFDcEIsNEJBQTRCO1FBQzVCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPO1FBQ1QsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxJQUFJLHlCQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQW1CLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFFBQXFCO1FBQzlDLDZGQUE2RjtRQUM3RixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDbEQsT0FBTztRQUNULENBQUM7UUFFRCw4RUFBOEU7UUFDOUUsK0VBQStFO1FBQy9FLE1BQU0sZ0JBQWdCLEdBQUc7WUFDdkIsTUFBTTtZQUNOLGtDQUFrQztZQUVsQyxjQUFjO1lBQ2QsMEJBQTBCO1lBQzFCLGtDQUFrQztZQUNsQyw2QkFBNkI7WUFDN0Isb0NBQW9DO1lBQ3BDLHVDQUF1QztZQUN2QyxrQ0FBa0M7WUFDbEMseUJBQXlCO1lBQ3pCLHdCQUF3QjtZ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NkJBQTZCLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ3BELE1BQU07Z0JBQ1IsQ0FBQztnQkFDRCxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUN6RCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztRQUVILG1DQUFtQztRQUNuQyx5REFBeUQ7UUFDekQsSUFBSSxRQUFRLENBQUMsZUFBZSxLQUFLLG9DQUFvQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxHQUFHLEVBQUUsR0FBRztnQkFDUixLQUFLLEVBQUUsS0FBSztnQkFDWixpQkFBaUIsRUFBRSxJQUFJO2FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztRQUVELDhDQUE4QztRQUM5QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekQsR0FBRyxFQUFFLEdBQUc7WUFDUixLQUFLLEVBQUUsS0FBSztTQUNiLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztDQUNGO0FBaGpCRCxnREFnakJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJQXNwZWN0LCBDZm5SZXNvdXJjZSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IHR5cGUgQ2ZuVlBDIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IHR5cGUgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbi8qKlxuICogQXNwZWN0IHRvIGVuZm9yY2UgYSBzdGFuZGFyZCBzZXQgb2YgdGFncyBvbiBldmVyeSB0YWctY2FwYWJsZSByZXNvdXJjZSBpbiBhIGNvbnN0cnVjdCB0cmVlLlxuICpcbiAqIFVwZGF0ZWQgZm9yIENESyB2Mi4yMDYuMCsgY29tcGF0aWJpbGl0eTpcbiAqIC0gQXZvaWRzIHVzaW5nIGFueSB0YWdnaW5nIEFQSXMgZHVyaW5nIGFzcGVjdCB2aXNpdGF0aW9uIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHNcbiAqIC0gVXNlcyBhIHN5bnRoZXNpcy10aW1lIGFwcHJvYWNoIHRvIG1vZGlmeSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZXNcbiAqIC0gTWFpbnRhaW5zIHRoZSBzYW1lIGNsZWFuIEFQSSBhbmQgYXV0b21hdGljIHRhZ2dpbmcgYmVuZWZpdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YW5kYXJkVGFnc0FzcGVjdCBpbXBsZW1lbnRzIElBc3BlY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVpcmVkVGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcHJpdmF0ZSByZWFkb25seSB0YWdnZWRSZXNvdXJjZXMgPSBuZXcgV2Vha1NldDxJQ29uc3RydWN0PigpO1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVpcmVkVGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIHRoaXMucmVxdWlyZWRUYWdzID0gcmVxdWlyZWRUYWdzO1xuICB9XG5cbiAgdmlzaXQobm9kZTogSUNvbnN0cnVjdCk6IHZvaWQge1xuICAgIC8vIFNraXAgaWYgYWxyZWFkeSBwcm9jZXNzZWRcbiAgICBpZiAodGhpcy50YWdnZWRSZXNvdXJjZXMuaGFzKG5vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBMMSAoQ0ZOKSByZXNvdXJjZXMgb25seVxuICAgIGlmIChDZm5SZXNvdXJjZS5pc0NmblJlc291cmNlKG5vZGUpKSB7XG4gICAgICB0aGlzLnByb2Nlc3NDZm5SZXNvdXJjZShub2RlIGFzIENmblJlc291cmNlKTtcbiAgICAgIHRoaXMudGFnZ2VkUmVzb3VyY2VzLmFkZChub2RlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NDZm5SZXNvdXJjZShyZXNvdXJjZTogQ2ZuUmVzb3VyY2UpOiB2b2lkIHtcbiAgICAvLyBTa2lwIFNlY3JldFJvdGF0aW9uIHJlc291cmNlcyBhcyB0aGV5IGNyZWF0ZSBuZXN0ZWQgc3RhY2tzIHdpdGggZGlmZmVyZW50IHRhZyByZXF1aXJlbWVudHNcbiAgICBpZiAocmVzb3VyY2Uubm9kZS5wYXRoLmluY2x1ZGVzKFwiU2VjcmV0Um90YXRpb25cIikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDb21wcmVoZW5zaXZlIGxpc3Qgb2YgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgdHlwZXMgdGhhdCBkb24ndCBzdXBwb3J0IHRhZ3NcbiAgICAvLyBUaGlzIGxpc3QgaXMgYmFzZWQgb24gQVdTIENsb3VkRm9ybWF0aW9uIGRvY3VtZW50YXRpb24gYW5kIGtub3duIGxpbWl0YXRpb25zXG4gICAgY29uc3QgdW5zdXBwb3J0ZWRUeXBlcyA9IFtcbiAgICAgIC8vIEFDTVxuICAgICAgXCJBV1M6OkNlcnRpZmljYXRlTWFuYWdlcjo6QWNjb3VudFwiLFxuXG4gICAgICAvLyBBUEkgR2F0ZXdheVxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXk6OkFjY291bnRcIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpCYXNlUGF0aE1hcHBpbmdcIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpEZXBsb3ltZW50XCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6RG9jdW1lbnRhdGlvblBhcnRcIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpEb2N1bWVudGF0aW9uVmVyc2lvblwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXk6OkdhdGV3YXlSZXNwb25zZVwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXk6Ok1ldGhvZFwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXk6Ok1vZGVsXCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6UmVxdWVzdFZhbGlkYXRvclwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXk6OlJlc291cmNlXCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheVYyOjpBcGlNYXBwaW5nXCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheVYyOjpBdXRob3JpemVyXCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheVYyOjpEZXBsb3ltZW50XCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheVYyOjpJbnRlZ3JhdGlvblwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6SW50ZWdyYXRpb25SZXNwb25zZVwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6TW9kZWxcIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5VjI6OlJvdXRlXCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheVYyOjpSb3V0ZVJlc3BvbnNlXCIsXG5cbiAgICAgIC8vIEFwcFN5bmNcbiAgICAgIFwiQVdTOjpBcHBTeW5jOjpEYXRhU291cmNlXCIsXG4gICAgICBcIkFXUzo6QXBwU3luYzo6RnVuY3Rpb25Db25maWd1cmF0aW9uXCIsXG4gICAgICBcIkFXUzo6QXBwU3luYzo6UmVzb2x2ZXJcIixcblxuICAgICAgLy8gQXRoZW5hXG4gICAgICBcIkFXUzo6QXRoZW5hOjpQcmVwYXJlZFN0YXRlbWVudFwiLFxuXG4gICAgICAvLyBDbG91ZEZvcm1hdGlvblxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpDdXN0b21SZXNvdXJjZVwiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpNYWNyb1wiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpNb2R1bGVEZWZhdWx0VmVyc2lvblwiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpNb2R1bGVWZXJzaW9uXCIsXG4gICAgICBcIkFXUzo6Q2xvdWRGb3JtYXRpb246OlB1YmxpY1R5cGVWZXJzaW9uXCIsXG4gICAgICBcIkFXUzo6Q2xvdWRGb3JtYXRpb246OlB1Ymxpc2hlclwiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpSZXNvdXJjZURlZmF1bHRWZXJzaW9uXCIsXG4gICAgICBcIkFXUzo6Q2xvdWRGb3JtYXRpb246OlJlc291cmNlVmVyc2lvblwiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpUeXBlQWN0aXZhdGlvblwiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpXYWl0Q29uZGl0aW9uXCIsXG4gICAgICBcIkFXUzo6Q2xvdWRGb3JtYXRpb246OldhaXRDb25kaXRpb25IYW5kbGVcIixcblxuICAgICAgLy8gQ2xvdWRXYXRjaFxuICAgICAgXCJBV1M6OkNsb3VkV2F0Y2g6OkFsYXJtXCIsXG4gICAgICBcIkFXUzo6Q2xvdWRXYXRjaDo6QW5vbWFseURldGVjdG9yXCIsXG4gICAgICBcIkFXUzo6Q2xvdWRXYXRjaDo6Q29tcG9zaXRlQWxhcm1cIixcbiAgICAgIFwiQVdTOjpDbG91ZFdhdGNoOjpEYXNoYm9hcmRcIixcbiAgICAgIFwiQVdTOjpDbG91ZFdhdGNoOjpJbnNpZ2h0UnVsZVwiLFxuICAgICAgXCJBV1M6OkNsb3VkV2F0Y2g6Ok1ldHJpY1N0cmVhbVwiLFxuXG4gICAgICAvLyBDb2RlQnVpbGRcbiAgICAgIFwiQVdTOjpDb2RlQnVpbGQ6OlJlcG9ydEdyb3VwXCIsXG4gICAgICBcIkFXUzo6Q29kZUJ1aWxkOjpTb3VyY2VDcmVkZW50aWFsXCIsXG5cbiAgICAgIC8vIENvZGVEZXBsb3lcbiAgICAgIFwiQVdTOjpDb2RlRGVwbG95OjpEZXBsb3ltZW50Q29uZmlnXCIsXG5cbiAgICAgIC8vIENvZGVQaXBlbGluZVxuICAgICAgXCJBV1M6OkNvZGVQaXBlbGluZTo6Q3VzdG9tQWN0aW9uVHlwZVwiLFxuICAgICAgXCJBV1M6OkNvZGVQaXBlbGluZTo6V2ViaG9va1wiLFxuXG4gICAgICAvLyBDb2duaXRvXG4gICAgICBcIkFXUzo6Q29nbml0bzo6SWRlbnRpdHlQb29sUm9sZUF0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbENsaWVudFwiLFxuICAgICAgXCJBV1M6OkNvZ25pdG86OlVzZXJQb29sRG9tYWluXCIsXG4gICAgICBcIkFXUzo6Q29nbml0bzo6VXNlclBvb2xHcm91cFwiLFxuICAgICAgXCJBV1M6OkNvZ25pdG86OlVzZXJQb29sSWRlbnRpdHlQcm92aWRlclwiLFxuICAgICAgXCJBV1M6OkNvZ25pdG86OlVzZXJQb29sUmVzb3VyY2VTZXJ2ZXJcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbFJpc2tDb25maWd1cmF0aW9uQXR0YWNobWVudFwiLFxuICAgICAgXCJBV1M6OkNvZ25pdG86OlVzZXJQb29sVUlDdXN0b21pemF0aW9uQXR0YWNobWVudFwiLFxuICAgICAgXCJBV1M6OkNvZ25pdG86OlVzZXJQb29sVXNlclwiLFxuICAgICAgXCJBV1M6OkNvZ25pdG86OlVzZXJQb29sVXNlclRvR3JvdXBBdHRhY2htZW50XCIsXG5cbiAgICAgIC8vIENvbmZpZ1xuICAgICAgXCJBV1M6OkNvbmZpZzo6QWdncmVnYXRpb25BdXRob3JpemF0aW9uXCIsXG4gICAgICBcIkFXUzo6Q29uZmlnOjpDb25maWd1cmF0aW9uQWdncmVnYXRvclwiLFxuICAgICAgXCJBV1M6OkNvbmZpZzo6Q29uZm9ybWFuY2VQYWNrXCIsXG4gICAgICBcIkFXUzo6Q29uZmlnOjpPcmdhbml6YXRpb25Db25mb3JtYW5jZVBhY2tcIixcbiAgICAgIFwiQVdTOjpDb25maWc6OlJlbWVkaWF0aW9uQ29uZmlndXJhdGlvblwiLFxuICAgICAgXCJBV1M6OkNvbmZpZzo6U3RvcmVkUXVlcnlcIixcblxuICAgICAgLy8gRHluYW1vREJcbiAgICAgIFwiQVdTOjpEeW5hbW9EQjo6R2xvYmFsVGFibGVcIixcblxuICAgICAgLy8gRUMyXG4gICAgICBcIkFXUzo6RUMyOjpDYXBhY2l0eVJlc2VydmF0aW9uRmxlZXRcIixcbiAgICAgIFwiQVdTOjpFQzI6OkNhcnJpZXJHYXRld2F5XCIsXG4gICAgICBcIkFXUzo6RUMyOjpESENQT3B0aW9uc1wiLFxuICAgICAgXCJBV1M6OkVDMjo6RUMyRmxlZXRcIixcbiAgICAgIFwiQVdTOjpFQzI6OkVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlcIixcbiAgICAgIFwiQVdTOjpFQzI6OkVJUEFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpFbmNsYXZlQ2VydGlmaWNhdGVJYW1Sb2xlQXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpFQzI6OkZsb3dMb2dcIixcbiAgICAgIFwiQVdTOjpFQzI6OkdhdGV3YXlSb3V0ZVRhYmxlQXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpFQzI6Okluc3RhbmNlQ29ubmVjdEVuZHBvaW50XCIsXG4gICAgICBcIkFXUzo6RUMyOjpLZXlQYWlyXCIsXG4gICAgICBcIkFXUzo6RUMyOjpMYXVuY2hUZW1wbGF0ZVwiLFxuICAgICAgXCJBV1M6OkVDMjo6TmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVcIixcbiAgICAgIFwiQVdTOjpFQzI6Ok5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQW5hbHlzaXNcIixcbiAgICAgIFwiQVdTOjpFQzI6Ok5ldHdvcmtJbnNpZ2h0c0FuYWx5c2lzXCIsXG4gICAgICBcIkFXUzo6RUMyOjpOZXR3b3JrSW5zaWdodHNQYXRoXCIsXG4gICAgICBcIkFXUzo6RUMyOjpOZXR3b3JrSW50ZXJmYWNlQXR0YWNobWVudFwiLFxuICAgICAgXCJBV1M6OkVDMjo6TmV0d29ya0ludGVyZmFjZVBlcm1pc3Npb25cIixcbiAgICAgIFwiQVdTOjpFQzI6OlBsYWNlbWVudEdyb3VwXCIsXG4gICAgICBcIkFXUzo6RUMyOjpSb3V0ZVwiLFxuICAgICAgXCJBV1M6OkVDMjo6U2VjdXJpdHlHcm91cEVncmVzc1wiLFxuICAgICAgXCJBV1M6OkVDMjo6U2VjdXJpdHlHcm91cEluZ3Jlc3NcIixcbiAgICAgIFwiQVdTOjpFQzI6OlN1Ym5ldENpZHJCbG9ja1wiLFxuICAgICAgXCJBV1M6OkVDMjo6U3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpTdWJuZXRSb3V0ZVRhYmxlQXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5QXR0YWNobWVudFwiLFxuICAgICAgXCJBV1M6OkVDMjo6VHJhbnNpdEdhdGV3YXlDb25uZWN0XCIsXG4gICAgICBcIkFXUzo6RUMyOjpUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpblwiLFxuICAgICAgXCJBV1M6OkVDMjo6VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5Bc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OkVDMjo6VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cE1lbWJlclwiLFxuICAgICAgXCJBV1M6OkVDMjo6VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cFNvdXJjZVwiLFxuICAgICAgXCJBV1M6OkVDMjo6VHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudFwiLFxuICAgICAgXCJBV1M6OkVDMjo6VHJhbnNpdEdhdGV3YXlSb3V0ZVwiLFxuICAgICAgXCJBV1M6OkVDMjo6VHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlXCIsXG4gICAgICBcIkFXUzo6RUMyOjpUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OkVDMjo6VHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlUHJvcGFnYXRpb25cIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudFwiLFxuICAgICAgXCJBV1M6OkVDMjo6VmVyaWZpZWRBY2Nlc3NFbmRwb2ludFwiLFxuICAgICAgXCJBV1M6OkVDMjo6VmVyaWZpZWRBY2Nlc3NHcm91cFwiLFxuICAgICAgXCJBV1M6OkVDMjo6VmVyaWZpZWRBY2Nlc3NJbnN0YW5jZVwiLFxuICAgICAgXCJBV1M6OkVDMjo6VmVyaWZpZWRBY2Nlc3NUcnVzdFByb3ZpZGVyXCIsXG4gICAgICBcIkFXUzo6RUMyOjpWb2x1bWVBdHRhY2htZW50XCIsXG4gICAgICBcIkFXUzo6RUMyOjpWUENDaWRyQmxvY2tcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZQQ0RIQ1BPcHRpb25zQXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpFQzI6OlZQQ0VuZHBvaW50Q29ubmVjdGlvbk5vdGlmaWNhdGlvblwiLFxuICAgICAgXCJBV1M6OkVDMjo6VlBDRW5kcG9pbnRTZXJ2aWNlXCIsXG4gICAgICBcIkFXUzo6RUMyOjpWUENFbmRwb2ludFNlcnZpY2VQZXJtaXNzaW9uc1wiLFxuICAgICAgXCJBV1M6OkVDMjo6VlBDR2F0ZXdheUF0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZQTkNvbm5lY3Rpb25Sb3V0ZVwiLFxuICAgICAgXCJBV1M6OkVDMjo6VlBOR2F0ZXdheVJvdXRlUHJvcGFnYXRpb25cIixcblxuICAgICAgLy8gRUNSXG4gICAgICBcIkFXUzo6RUNSOjpQdWJsaWNSZXBvc2l0b3J5XCIsXG4gICAgICBcIkFXUzo6RUNSOjpQdWxsVGhyb3VnaENhY2hlUnVsZVwiLFxuICAgICAgXCJBV1M6OkVDUjo6UmVnaXN0cnlQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpFQ1I6OlJlcGxpY2F0aW9uQ29uZmlndXJhdGlvblwiLFxuXG4gICAgICAvLyBFQ1NcbiAgICAgIFwiQVdTOjpFQ1M6OkFjY291bnRTZXR0aW5nXCIsXG4gICAgICBcIkFXUzo6RUNTOjpDYXBhY2l0eVByb3ZpZGVyXCIsXG4gICAgICBcIkFXUzo6RUNTOjpDbHVzdGVyQ2FwYWNpdHlQcm92aWRlckFzc29jaWF0aW9uc1wiLFxuICAgICAgXCJBV1M6OkVDUzo6UHJpbWFyeVRhc2tTZXRcIixcbiAgICAgIFwiQVdTOjpFQ1M6OlRhc2tTZXRcIixcblxuICAgICAgLy8gRUZTXG4gICAgICBcIkFXUzo6RUZTOjpBY2Nlc3NQb2ludFwiLFxuICAgICAgXCJBV1M6OkVGUzo6TW91bnRUYXJnZXRcIixcblxuICAgICAgLy8gRUtTXG4gICAgICBcIkFXUzo6RUtTOjpBZGRvblwiLFxuICAgICAgXCJBV1M6OkVLUzo6RmFyZ2F0ZVByb2ZpbGVcIixcbiAgICAgIFwiQVdTOjpFS1M6OklkZW50aXR5UHJvdmlkZXJDb25maWdcIixcblxuICAgICAgLy8gRWxhc3RpQ2FjaGVcbiAgICAgIFwiQVdTOjpFbGFzdGlDYWNoZTo6UGFyYW1ldGVyR3JvdXBcIixcbiAgICAgIFwiQVdTOjpFbGFzdGlDYWNoZTo6U2VjdXJpdHlHcm91cFwiLFxuICAgICAgXCJBV1M6OkVsYXN0aUNhY2hlOjpTZWN1cml0eUdyb3VwSW5ncmVzc1wiLFxuICAgICAgXCJBV1M6OkVsYXN0aUNhY2hlOjpTdWJuZXRHcm91cFwiLFxuXG4gICAgICAvLyBFbGFzdGljQmVhbnN0YWxrXG4gICAgICBcIkFXUzo6RWxhc3RpY0JlYW5zdGFsazo6QXBwbGljYXRpb25WZXJzaW9uXCIsXG4gICAgICBcIkFXUzo6RWxhc3RpY0JlYW5zdGFsazo6Q29uZmlndXJhdGlvblRlbXBsYXRlXCIsXG5cbiAgICAgIC8vIEVsYXN0aWNMb2FkQmFsYW5jaW5nVjJcbiAgICAgIFwiQVdTOjpFbGFzdGljTG9hZEJhbGFuY2luZ1YyOjpMaXN0ZW5lclwiLFxuICAgICAgXCJBV1M6OkVsYXN0aWNMb2FkQmFsYW5jaW5nVjI6Okxpc3RlbmVyQ2VydGlmaWNhdGVcIixcbiAgICAgIFwiQVdTOjpFbGFzdGljTG9hZEJhbGFuY2luZ1YyOjpMaXN0ZW5lclJ1bGVcIixcbiAgICAgIFwiQVdTOjpFbGFzdGljTG9hZEJhbGFuY2luZ1YyOjpUYXJnZXRHcm91cEF0dGFjaG1lbnRcIixcblxuICAgICAgLy8gRXZlbnRCcmlkZ2UgKEV2ZW50cylcbiAgICAgIFwiQVdTOjpFdmVudHM6OkFwaURlc3RpbmF0aW9uXCIsXG4gICAgICBcIkFXUzo6RXZlbnRzOjpBcmNoaXZlXCIsXG4gICAgICBcIkFXUzo6RXZlbnRzOjpDb25uZWN0aW9uXCIsXG4gICAgICBcIkFXUzo6RXZlbnRzOjpFbmRwb2ludFwiLFxuICAgICAgXCJBV1M6OkV2ZW50czo6RXZlbnRCdXNQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpFdmVudHM6OlJ1bGVcIixcblxuICAgICAgLy8gRlN4XG4gICAgICBcIkFXUzo6RlN4OjpEYXRhUmVwb3NpdG9yeUFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6RlN4OjpTbmFwc2hvdFwiLFxuICAgICAgXCJBV1M6OkZTeDo6U3RvcmFnZVZpcnR1YWxNYWNoaW5lXCIsXG4gICAgICBcIkFXUzo6RlN4OjpWb2x1bWVcIixcblxuICAgICAgLy8gR2FtZUxpZnRcbiAgICAgIFwiQVdTOjpHYW1lTGlmdDo6R2FtZVNlcnZlckdyb3VwXCIsXG4gICAgICBcIkFXUzo6R2FtZUxpZnQ6OkxvY2F0aW9uXCIsXG5cbiAgICAgIC8vIEdsdWVcbiAgICAgIFwiQVdTOjpHbHVlOjpDb25uZWN0aW9uXCIsXG4gICAgICBcIkFXUzo6R2x1ZTo6RGF0YWJhc2VcIixcbiAgICAgIFwiQVdTOjpHbHVlOjpEYXRhQ2F0YWxvZ0VuY3J5cHRpb25TZXR0aW5nc1wiLFxuICAgICAgXCJBV1M6OkdsdWU6OlBhcnRpdGlvblwiLFxuICAgICAgXCJBV1M6OkdsdWU6OlNjaGVtYVZlcnNpb25cIixcbiAgICAgIFwiQVdTOjpHbHVlOjpTY2hlbWFWZXJzaW9uTWV0YWRhdGFcIixcbiAgICAgIFwiQVdTOjpHbHVlOjpTZWN1cml0eUNvbmZpZ3VyYXRpb25cIixcbiAgICAgIFwiQVdTOjpHbHVlOjpUYWJsZVwiLFxuICAgICAgXCJBV1M6OkdsdWU6OlVzZXJEZWZpbmVkRnVuY3Rpb25cIixcblxuICAgICAgLy8gR3VhcmREdXR5XG4gICAgICBcIkFXUzo6R3VhcmREdXR5OjpEZXRlY3RvclwiLFxuICAgICAgXCJBV1M6Okd1YXJkRHV0eTo6RmlsdGVyXCIsXG4gICAgICBcIkFXUzo6R3VhcmREdXR5OjpJUFNldFwiLFxuICAgICAgXCJBV1M6Okd1YXJkRHV0eTo6TWFzdGVyXCIsXG4gICAgICBcIkFXUzo6R3VhcmREdXR5OjpNZW1iZXJcIixcbiAgICAgIFwiQVdTOjpHdWFyZER1dHk6OlRocmVhdEludGVsU2V0XCIsXG5cbiAgICAgIC8vIElBTVxuICAgICAgXCJBV1M6OklBTTo6QWNjZXNzS2V5XCIsXG4gICAgICBcIkFXUzo6SUFNOjpHcm91cFwiLFxuICAgICAgXCJBV1M6OklBTTo6R3JvdXBQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpJQU06Okluc3RhbmNlUHJvZmlsZVwiLFxuICAgICAgXCJBV1M6OklBTTo6TWFuYWdlZFBvbGljeVwiLFxuICAgICAgXCJBV1M6OklBTTo6T0lEQ1Byb3ZpZGVyXCIsXG4gICAgICBcIkFXUzo6SUFNOjpQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpJQU06OlJvbGVcIixcbiAgICAgIFwiQVdTOjpJQU06OlJvbGVQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpJQU06OlNBTUxQcm92aWRlclwiLFxuICAgICAgXCJBV1M6OklBTTo6U2VydmVyQ2VydGlmaWNhdGVcIixcbiAgICAgIFwiQVdTOjpJQU06OlNlcnZpY2VMaW5rZWRSb2xlXCIsXG4gICAgICBcIkFXUzo6SUFNOjpVc2VyXCIsXG4gICAgICBcIkFXUzo6SUFNOjpVc2VyUG9saWN5XCIsXG4gICAgICBcIkFXUzo6SUFNOjpVc2VyVG9Hcm91cEFkZGl0aW9uXCIsXG4gICAgICBcIkFXUzo6SUFNOjpWaXJ0dWFsTUZBRGV2aWNlXCIsXG5cbiAgICAgIC8vIElvVFxuICAgICAgXCJBV1M6OklvVDo6QWNjb3VudEF1ZGl0Q29uZmlndXJhdGlvblwiLFxuICAgICAgXCJBV1M6OklvVDo6QXV0aG9yaXplclwiLFxuICAgICAgXCJBV1M6OklvVDo6Q2VydGlmaWNhdGVcIixcbiAgICAgIFwiQVdTOjpJb1Q6OkN1c3RvbU1ldHJpY1wiLFxuICAgICAgXCJBV1M6OklvVDo6RGltZW5zaW9uXCIsXG4gICAgICBcIkFXUzo6SW9UOjpEb21haW5Db25maWd1cmF0aW9uXCIsXG4gICAgICBcIkFXUzo6SW9UOjpGbGVldE1ldHJpY1wiLFxuICAgICAgXCJBV1M6OklvVDo6Sm9iVGVtcGxhdGVcIixcbiAgICAgIFwiQVdTOjpJb1Q6OkxvZ2dpbmdcIixcbiAgICAgIFwiQVdTOjpJb1Q6Ok1pdGlnYXRpb25BY3Rpb25cIixcbiAgICAgIFwiQVdTOjpJb1Q6OlBvbGljeVwiLFxuICAgICAgXCJBV1M6OklvVDo6UG9saWN5UHJpbmNpcGFsQXR0YWNobWVudFwiLFxuICAgICAgXCJBV1M6OklvVDo6UHJvdmlzaW9uaW5nVGVtcGxhdGVcIixcbiAgICAgIFwiQVdTOjpJb1Q6OlJlc291cmNlU3BlY2lmaWNMb2dnaW5nXCIsXG4gICAgICBcIkFXUzo6SW9UOjpSb2xlQWxpYXNcIixcbiAgICAgIFwiQVdTOjpJb1Q6OlNjaGVkdWxlZEF1ZGl0XCIsXG4gICAgICBcIkFXUzo6SW9UOjpTZWN1cml0eVByb2ZpbGVcIixcbiAgICAgIFwiQVdTOjpJb1Q6OlRoaW5nXCIsXG4gICAgICBcIkFXUzo6SW9UOjpUaGluZ0dyb3VwXCIsXG4gICAgICBcIkFXUzo6SW9UOjpUaGluZ1ByaW5jaXBhbEF0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpJb1Q6OlRoaW5nVHlwZVwiLFxuICAgICAgXCJBV1M6OklvVDo6VG9waWNSdWxlXCIsXG4gICAgICBcIkFXUzo6SW9UOjpUb3BpY1J1bGVEZXN0aW5hdGlvblwiLFxuXG4gICAgICAvLyBLTVNcbiAgICAgIFwiQVdTOjpLTVM6OkFsaWFzXCIsXG4gICAgICBcIkFXUzo6S01TOjpHcmFudFwiLFxuICAgICAgXCJBV1M6OktNUzo6UmVwbGljYUtleVwiLFxuXG4gICAgICAvLyBMYW1iZGFcbiAgICAgIFwiQVdTOjpMYW1iZGE6OkNvZGVTaWduaW5nQ29uZmlnXCIsXG4gICAgICBcIkFXUzo6TGFtYmRhOjpFdmVudEludm9rZUNvbmZpZ1wiLFxuICAgICAgXCJBV1M6OkxhbWJkYTo6RXZlbnRTb3VyY2VNYXBwaW5nXCIsXG4gICAgICBcIkFXUzo6TGFtYmRhOjpMYXllclZlcnNpb25cIixcbiAgICAgIFwiQVdTOjpMYW1iZGE6OkxheWVyVmVyc2lvblBlcm1pc3Npb25cIixcbiAgICAgIFwiQVdTOjpMYW1iZGE6OlBlcm1pc3Npb25cIixcbiAgICAgIFwiQVdTOjpMYW1iZGE6OlByb3Zpc2lvbmVkQ29uY3VycmVuY3lDb25maWdcIixcbiAgICAgIFwiQVdTOjpMYW1iZGE6OlVybFwiLFxuICAgICAgXCJBV1M6OkxhbWJkYTo6VmVyc2lvblwiLFxuXG4gICAgICAvLyBMb2dzXG4gICAgICBcIkFXUzo6TG9nczo6QWNjb3VudFBvbGljeVwiLFxuICAgICAgXCJBV1M6OkxvZ3M6OkRlc3RpbmF0aW9uXCIsXG4gICAgICBcIkFXUzo6TG9nczo6TG9nR3JvdXBcIixcbiAgICAgIFwiQVdTOjpMb2dzOjpMb2dTdHJlYW1cIixcbiAgICAgIFwiQVdTOjpMb2dzOjpNZXRyaWNGaWx0ZXJcIixcbiAgICAgIFwiQVdTOjpMb2dzOjpRdWVyeURlZmluaXRpb25cIixcbiAgICAgIFwiQVdTOjpMb2dzOjpSZXNvdXJjZVBvbGljeVwiLFxuICAgICAgXCJBV1M6OkxvZ3M6OlN1YnNjcmlwdGlvbkZpbHRlclwiLFxuXG4gICAgICAvLyBNYWNpZVxuICAgICAgXCJBV1M6Ok1hY2llOjpBbGxvd0xpc3RcIixcbiAgICAgIFwiQVdTOjpNYWNpZTo6Q3VzdG9tRGF0YUlkZW50aWZpZXJcIixcbiAgICAgIFwiQVdTOjpNYWNpZTo6RmluZGluZ3NGaWx0ZXJcIixcbiAgICAgIFwiQVdTOjpNYWNpZTo6U2Vzc2lvblwiLFxuXG4gICAgICAvLyBOZXB0dW5lXG4gICAgICBcIkFXUzo6TmVwdHVuZTo6REJDbHVzdGVyUGFyYW1ldGVyR3JvdXBcIixcbiAgICAgIFwiQVdTOjpOZXB0dW5lOjpEQlBhcmFtZXRlckdyb3VwXCIsXG4gICAgICBcIkFXUzo6TmVwdHVuZTo6REJTdWJuZXRHcm91cFwiLFxuXG4gICAgICAvLyBPcmdhbml6YXRpb25zXG4gICAgICBcIkFXUzo6T3JnYW5pemF0aW9uczo6QWNjb3VudFwiLFxuICAgICAgXCJBV1M6Ok9yZ2FuaXphdGlvbnM6Ok9yZ2FuaXphdGlvblwiLFxuICAgICAgXCJBV1M6Ok9yZ2FuaXphdGlvbnM6Ok9yZ2FuaXphdGlvbmFsVW5pdFwiLFxuICAgICAgXCJBV1M6Ok9yZ2FuaXphdGlvbnM6OlBvbGljeVwiLFxuICAgICAgXCJBV1M6Ok9yZ2FuaXphdGlvbnM6OlJlc291cmNlUG9saWN5XCIsXG5cbiAgICAgIC8vIFJEU1xuICAgICAgXCJBV1M6OlJEUzo6REJDbHVzdGVyUGFyYW1ldGVyR3JvdXBcIixcbiAgICAgIFwiQVdTOjpSRFM6OkRCUGFyYW1ldGVyR3JvdXBcIixcbiAgICAgIFwiQVdTOjpSRFM6OkRCUHJveHlFbmRwb2ludFwiLFxuICAgICAgXCJBV1M6OlJEUzo6REJQcm94eVRhcmdldEdyb3VwXCIsXG4gICAgICBcIkFXUzo6UkRTOjpEQlNlY3VyaXR5R3JvdXBcIixcbiAgICAgIFwiQVdTOjpSRFM6OkRCU2VjdXJpdHlHcm91cEluZ3Jlc3NcIixcbiAgICAgIFwiQVdTOjpSRFM6OkRCU3VibmV0R3JvdXBcIixcbiAgICAgIFwiQVdTOjpSRFM6OkV2ZW50U3Vic2NyaXB0aW9uXCIsXG4gICAgICBcIkFXUzo6UkRTOjpHbG9iYWxDbHVzdGVyXCIsXG4gICAgICBcIkFXUzo6UkRTOjpPcHRpb25Hcm91cFwiLFxuXG4gICAgICAvLyBSZWRzaGlmdFxuICAgICAgXCJBV1M6OlJlZHNoaWZ0OjpDbHVzdGVyUGFyYW1ldGVyR3JvdXBcIixcbiAgICAgIFwiQVdTOjpSZWRzaGlmdDo6Q2x1c3RlclNlY3VyaXR5R3JvdXBcIixcbiAgICAgIFwiQVdTOjpSZWRzaGlmdDo6Q2x1c3RlclNlY3VyaXR5R3JvdXBJbmdyZXNzXCIsXG4gICAgICBcIkFXUzo6UmVkc2hpZnQ6OkNsdXN0ZXJTdWJuZXRHcm91cFwiLFxuICAgICAgXCJBV1M6OlJlZHNoaWZ0OjpFbmRwb2ludEFjY2Vzc1wiLFxuICAgICAgXCJBV1M6OlJlZHNoaWZ0OjpFbmRwb2ludEF1dGhvcml6YXRpb25cIixcbiAgICAgIFwiQVdTOjpSZWRzaGlmdDo6RXZlbnRTdWJzY3JpcHRpb25cIixcbiAgICAgIFwiQVdTOjpSZWRzaGlmdDo6U2NoZWR1bGVkQWN0aW9uXCIsXG5cbiAgICAgIC8vIFJvdXRlNTNcbiAgICAgIFwiQVdTOjpSb3V0ZTUzOjpETlNTRUNcIixcbiAgICAgIFwiQVdTOjpSb3V0ZTUzOjpIZWFsdGhDaGVja1wiLFxuICAgICAgXCJBV1M6OlJvdXRlNTM6Okhvc3RlZFpvbmVcIixcbiAgICAgIFwiQVdTOjpSb3V0ZTUzOjpLZXlTaWduaW5nS2V5XCIsXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XCIsXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0R3JvdXBcIixcblxuICAgICAgLy8gUm91dGU1M1Jlc29sdmVyXG4gICAgICBcIkFXUzo6Um91dGU1M1Jlc29sdmVyOjpGaXJld2FsbERvbWFpbkxpc3RcIixcbiAgICAgIFwiQVdTOjpSb3V0ZTUzUmVzb2x2ZXI6OkZpcmV3YWxsUnVsZUdyb3VwXCIsXG4gICAgICBcIkFXUzo6Um91dGU1M1Jlc29sdmVyOjpGaXJld2FsbFJ1bGVHcm91cEFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6Um91dGU1M1Jlc29sdmVyOjpSZXNvbHZlckNvbmZpZ1wiLFxuICAgICAgXCJBV1M6OlJvdXRlNTNSZXNvbHZlcjo6UmVzb2x2ZXJETlNTRUNDb25maWdcIixcbiAgICAgIFwiQVdTOjpSb3V0ZTUzUmVzb2x2ZXI6OlJlc29sdmVyUXVlcnlMb2dnaW5nQ29uZmlnXCIsXG4gICAgICBcIkFXUzo6Um91dGU1M1Jlc29sdmVyOjpSZXNvbHZlclF1ZXJ5TG9nZ2luZ0NvbmZpZ0Fzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6Um91dGU1M1Jlc29sdmVyOjpSZXNvbHZlclJ1bGVcIixcbiAgICAgIFwiQVdTOjpSb3V0ZTUzUmVzb2x2ZXI6OlJlc29sdmVyUnVsZUFzc29jaWF0aW9uXCIsXG5cbiAgICAgIC8vIFMzXG4gICAgICBcIkFXUzo6UzM6OkFjY2Vzc1BvaW50XCIsXG4gICAgICBcIkFXUzo6UzM6OkJ1Y2tldFBvbGljeVwiLFxuICAgICAgXCJBV1M6OlMzOjpNdWx0aVJlZ2lvbkFjY2Vzc1BvaW50XCIsXG4gICAgICBcIkFXUzo6UzM6Ok11bHRpUmVnaW9uQWNjZXNzUG9pbnRQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpTMzo6U3RvcmFnZUxlbnNcIixcblxuICAgICAgLy8gU0RCXG4gICAgICBcIkFXUzo6U0RCOjpEb21haW5cIixcblxuICAgICAgLy8gU2VjcmV0c01hbmFnZXJcbiAgICAgIFwiQVdTOjpTZWNyZXRzTWFuYWdlcjo6UmVzb3VyY2VQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpTZWNyZXRzTWFuYWdlcjo6Um90YXRpb25TY2hlZHVsZVwiLFxuICAgICAgXCJBV1M6OlNlY3JldHNNYW5hZ2VyOjpTZWNyZXRUYXJnZXRBdHRhY2htZW50XCIsXG5cbiAgICAgIC8vIFNlY3VyaXR5SHViXG4gICAgICBcIkFXUzo6U2VjdXJpdHlIdWI6Okh1YlwiLFxuXG4gICAgICAvLyBTZXJ2aWNlQ2F0YWxvZ1xuICAgICAgXCJBV1M6OlNlcnZpY2VDYXRhbG9nOjpBY2NlcHRlZFBvcnRmb2xpb1NoYXJlXCIsXG4gICAgICBcIkFXUzo6U2VydmljZUNhdGFsb2c6OkxhdW5jaE5vdGlmaWNhdGlvbkNvbnN0cmFpbnRcIixcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6TGF1bmNoUm9sZUNvbnN0cmFpbnRcIixcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6TGF1bmNoVGVtcGxhdGVDb25zdHJhaW50XCIsXG4gICAgICBcIkFXUzo6U2VydmljZUNhdGFsb2c6OlBvcnRmb2xpb1ByaW5jaXBhbEFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6U2VydmljZUNhdGFsb2c6OlBvcnRmb2xpb1Byb2R1Y3RBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OlNlcnZpY2VDYXRhbG9nOjpQb3J0Zm9saW9TaGFyZVwiLFxuICAgICAgXCJBV1M6OlNlcnZpY2VDYXRhbG9nOjpSZXNvdXJjZVVwZGF0ZUNvbnN0cmFpbnRcIixcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6U2VydmljZUFjdGlvblwiLFxuICAgICAgXCJBV1M6OlNlcnZpY2VDYXRhbG9nOjpTZXJ2aWNlQWN0aW9uQXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6U3RhY2tTZXRDb25zdHJhaW50XCIsXG4gICAgICBcIkFXUzo6U2VydmljZUNhdGFsb2c6OlRhZ09wdGlvblwiLFxuICAgICAgXCJBV1M6OlNlcnZpY2VDYXRhbG9nOjpUYWdPcHRpb25Bc3NvY2lhdGlvblwiLFxuXG4gICAgICAvLyBTRVNcbiAgICAgIFwiQVdTOjpTRVM6OkNvbmZpZ3VyYXRpb25TZXRcIixcbiAgICAgIFwiQVdTOjpTRVM6OkNvbmZpZ3VyYXRpb25TZXRFdmVudERlc3RpbmF0aW9uXCIsXG4gICAgICBcIkFXUzo6U0VTOjpDb250YWN0TGlzdFwiLFxuICAgICAgXCJBV1M6OlNFUzo6RGVkaWNhdGVkSXBQb29sXCIsXG4gICAgICBcIkFXUzo6U0VTOjpFbWFpbElkZW50aXR5XCIsXG4gICAgICBcIkFXUzo6U0VTOjpSZWNlaXB0RmlsdGVyXCIsXG4gICAgICBcIkFXUzo6U0VTOjpSZWNlaXB0UnVsZVwiLFxuICAgICAgXCJBV1M6OlNFUzo6UmVjZWlwdFJ1bGVTZXRcIixcbiAgICAgIFwiQVdTOjpTRVM6OlRlbXBsYXRlXCIsXG4gICAgICBcIkFXUzo6U0VTOjpWZG1BdHRyaWJ1dGVzXCIsXG5cbiAgICAgIC8vIFNOU1xuICAgICAgXCJBV1M6OlNOUzo6U3Vic2NyaXB0aW9uXCIsXG4gICAgICBcIkFXUzo6U05TOjpUb3BpY1BvbGljeVwiLFxuXG4gICAgICAvLyBTUVNcbiAgICAgIFwiQVdTOjpTUVM6OlF1ZXVlUG9saWN5XCIsXG5cbiAgICAgIC8vIFNTTVxuICAgICAgXCJBV1M6OlNTTTo6QXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpTU006OkRvY3VtZW50XCIsXG4gICAgICBcIkFXUzo6U1NNOjpNYWludGVuYW5jZVdpbmRvd1wiLFxuICAgICAgXCJBV1M6OlNTTTo6TWFpbnRlbmFuY2VXaW5kb3dUYXJnZXRcIixcbiAgICAgIFwiQVdTOjpTU006Ok1haW50ZW5hbmNlV2luZG93VGFza1wiLFxuICAgICAgXCJBV1M6OlNTTTo6UGFyYW1ldGVyXCIsXG4gICAgICBcIkFXUzo6U1NNOjpQYXRjaEJhc2VsaW5lXCIsXG4gICAgICBcIkFXUzo6U1NNOjpSZXNvdXJjZURhdGFTeW5jXCIsXG4gICAgICBcIkFXUzo6U1NNOjpSZXNvdXJjZVBvbGljeVwiLFxuXG4gICAgICAvLyBTU09cbiAgICAgIFwiQVdTOjpTU086OkFzc2lnbm1lbnRcIixcbiAgICAgIFwiQVdTOjpTU086Okluc3RhbmNlQWNjZXNzQ29udHJvbEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cIixcbiAgICAgIFwiQVdTOjpTU086OlBlcm1pc3Npb25TZXRcIixcblxuICAgICAgLy8gU3RlcEZ1bmN0aW9uc1xuICAgICAgXCJBV1M6OlN0ZXBGdW5jdGlvbnM6OkFjdGl2aXR5XCIsXG5cbiAgICAgIC8vIFdBRi9XQUZ2MlxuICAgICAgXCJBV1M6OldBRjo6Qnl0ZU1hdGNoU2V0XCIsXG4gICAgICBcIkFXUzo6V0FGOjpJUFNldFwiLFxuICAgICAgXCJBV1M6OldBRjo6UnVsZVwiLFxuICAgICAgXCJBV1M6OldBRjo6U2l6ZUNvbnN0cmFpbnRTZXRcIixcbiAgICAgIFwiQVdTOjpXQUY6OlNxbEluamVjdGlvbk1hdGNoU2V0XCIsXG4gICAgICBcIkFXUzo6V0FGOjpXZWJBQ0xcIixcbiAgICAgIFwiQVdTOjpXQUY6Olhzc01hdGNoU2V0XCIsXG4gICAgICBcIkFXUzo6V0FGUmVnaW9uYWw6OkJ5dGVNYXRjaFNldFwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpHZW9NYXRjaFNldFwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpJUFNldFwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpSYXRlQmFzZWRSdWxlXCIsXG4gICAgICBcIkFXUzo6V0FGUmVnaW9uYWw6OlJlZ2V4UGF0dGVyblNldFwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpSdWxlXCIsXG4gICAgICBcIkFXUzo6V0FGUmVnaW9uYWw6OlNpemVDb25zdHJhaW50U2V0XCIsXG4gICAgICBcIkFXUzo6V0FGUmVnaW9uYWw6OlNxbEluamVjdGlvbk1hdGNoU2V0XCIsXG4gICAgICBcIkFXUzo6V0FGUmVnaW9uYWw6OldlYkFDTFwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpXZWJBQ0xBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpYc3NNYXRjaFNldFwiLFxuICAgICAgXCJBV1M6OldBRnYyOjpJUFNldFwiLFxuICAgICAgXCJBV1M6OldBRnYyOjpMb2dnaW5nQ29uZmlndXJhdGlvblwiLFxuICAgICAgXCJBV1M6OldBRnYyOjpSZWdleFBhdHRlcm5TZXRcIixcbiAgICAgIFwiQVdTOjpXQUZ2Mjo6UnVsZUdyb3VwXCIsXG4gICAgICBcIkFXUzo6V0FGdjI6OldlYkFDTFwiLFxuICAgICAgXCJBV1M6OldBRnYyOjpXZWJBQ0xBc3NvY2lhdGlvblwiLFxuXG4gICAgICAvLyBTZXJ2ZXJsZXNzXG4gICAgICBcIkFXUzo6U2VydmVybGVzczo6QXBpXCIsXG4gICAgICBcIkFXUzo6U2VydmVybGVzczo6QXBwbGljYXRpb25cIixcbiAgICAgIFwiQVdTOjpTZXJ2ZXJsZXNzOjpGdW5jdGlvblwiLFxuICAgICAgXCJBV1M6OlNlcnZlcmxlc3M6Okh0dHBBcGlcIixcbiAgICAgIFwiQVdTOjpTZXJ2ZXJsZXNzOjpMYXllclZlcnNpb25cIixcbiAgICAgIFwiQVdTOjpTZXJ2ZXJsZXNzOjpTaW1wbGVUYWJsZVwiLFxuICAgICAgXCJBV1M6OlNlcnZlcmxlc3M6OlN0YXRlTWFjaGluZVwiXG4gICAgXTtcblxuICAgIGlmICh1bnN1cHBvcnRlZFR5cGVzLmluY2x1ZGVzKHJlc291cmNlLmNmblJlc291cmNlVHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBZGQgYSBzeW50aGVzaXMgaG9vayB0byBtb2RpZnkgdGhlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlXG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihyZXNvdXJjZSk7XG4gICAgY29uc3QgbG9naWNhbElkID0gc3RhY2suZ2V0TG9naWNhbElkKHJlc291cmNlKTtcblxuICAgIC8vIFVzZSBhZGRUcmFuc2Zvcm0gdG8gYWRkIHRhZ3MgZHVyaW5nIHN5bnRoZXNpc1xuICAgIHJlc291cmNlLmFkZFByb3BlcnR5T3ZlcnJpZGUoXCJUYWdzXCIsIHRoaXMuYnVpbGRUYWdzQXJyYXkocmVzb3VyY2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRUYWdzQXJyYXkocmVzb3VyY2U6IENmblJlc291cmNlKTogYW55W10ge1xuICAgIGNvbnN0IHRhZ01hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgICAvLyBBZGQgSVBBTSBwb29sIHRhZyBmb3IgVlBDcyB3aXRoIElQQU0gY29uZmlndXJhdGlvblxuICAgIGlmIChyZXNvdXJjZS5jZm5SZXNvdXJjZVR5cGUgPT09IFwiQVdTOjpFQzI6OlZQQ1wiKSB7XG4gICAgICBjb25zdCB2cGMgPSByZXNvdXJjZSBhcyBDZm5WUEM7XG4gICAgICBjb25zdCBpcGFtUG9vbElkID0gdnBjLmlwdjRJcGFtUG9vbElkO1xuXG4gICAgICBpZiAoaXBhbVBvb2xJZCkge1xuICAgICAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHJlc291cmNlKTtcbiAgICAgICAgY29uc3QgYWNjb3VudElkID1cbiAgICAgICAgICBzdGFjay5ub2RlLnRyeUdldENvbnRleHQoXCJhY2NvdW50SWRcIikgfHxcbiAgICAgICAgICBzdGFjay5hY2NvdW50IHx8XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfQUNDT1VOVDtcbiAgICAgICAgY29uc3QgcmVnaW9uID0gc3RhY2sucmVnaW9uIHx8IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTjtcbiAgICAgICAgaWYgKGFjY291bnRJZCAmJiByZWdpb24pIHtcbiAgICAgICAgICB0YWdNYXAuc2V0KFwiZmphbGw6b3BlcmF0aW9uczpwb29sXCIsIGAke2FjY291bnRJZH0tJHtyZWdpb259YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgZGlzYXN0ZXIgcmVjb3ZlcnkgdGllciB0YWcgZm9yIFMzIGJ1Y2tldHMgd2l0aCBiYWNrdXBWYXVsdFRpZXJcbiAgICBpZiAocmVzb3VyY2UuY2ZuUmVzb3VyY2VUeXBlID09PSBcIkFXUzo6UzM6OkJ1Y2tldFwiKSB7XG4gICAgICAvLyBXYWxrIHVwIHRoZSBjb25zdHJ1Y3QgdHJlZSB0byBmaW5kIHRoZSBMMiBTM0J1Y2tldCBjb25zdHJ1Y3RcbiAgICAgIGxldCBjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QgfCB1bmRlZmluZWQgPSByZXNvdXJjZTtcbiAgICAgIHdoaWxlIChjb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBvdXIgY3VzdG9tIFMzQnVja2V0IGNsYXNzIHdpdGggYmFja3VwVmF1bHRUaWVyIHByb3BlcnR5XG4gICAgICAgIGlmIChcbiAgICAgICAgICBcImJhY2t1cFZhdWx0VGllclwiIGluIGNvbnN0cnVjdCAmJlxuICAgICAgICAgIChjb25zdHJ1Y3QgYXMgYW55KS5iYWNrdXBWYXVsdFRpZXJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgdGllciA9IChjb25zdHJ1Y3QgYXMgYW55KS5iYWNrdXBWYXVsdFRpZXI7XG5cbiAgICAgICAgICAvLyBNYXAgdGllciBuYW1lcyB0byBiYWNrdXAgcGxhbiB0YWcgdmFsdWVzXG4gICAgICAgICAgLy8gTm90ZTogXCJzdGFuZGFyZFwiIHRpZXIgdXNlcyBcImRlZmF1bHRcIiBhcyB0aGUgdGFnIHZhbHVlIHRvIG1hdGNoIGV4aXN0aW5nIGJhY2t1cCBwbGFuc1xuICAgICAgICAgIGNvbnN0IHRpZXJNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICBzdGFuZGFyZDogXCJkZWZhdWx0XCIsXG4gICAgICAgICAgICByZXNpbGllbnQ6IFwicmVzaWxpZW50XCIsXG4gICAgICAgICAgICBlbnRlcnByaXNlOiBcImVudGVycHJpc2VcIlxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCB0YWdWYWx1ZSA9IHRpZXJNYXBbdGllcl0gfHwgdGllcjtcbiAgICAgICAgICB0YWdNYXAuc2V0KFwiZmphbGw6ZGlzYXN0ZXJSZWNvdmVyeTp0aWVyXCIsIHRhZ1ZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdHJ1Y3QgPSBjb25zdHJ1Y3Qubm9kZS5zY29wZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBseSBzdGFuZGFyZCB0YWdzXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5yZXF1aXJlZFRhZ3MpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgdGFnTWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIENvbnZlcnQgdG8gQ2xvdWRGb3JtYXRpb24gZm9ybWF0XG4gICAgLy8gQXV0byBTY2FsaW5nIEdyb3VwcyByZXF1aXJlIFByb3BhZ2F0ZUF0TGF1bmNoIHByb3BlcnR5XG4gICAgaWYgKHJlc291cmNlLmNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OkF1dG9TY2FsaW5nOjpBdXRvU2NhbGluZ0dyb3VwXCIpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHRhZ01hcC5lbnRyaWVzKCkpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICBLZXk6IGtleSxcbiAgICAgICAgVmFsdWU6IHZhbHVlLFxuICAgICAgICBQcm9wYWdhdGVBdExhdW5jaDogdHJ1ZVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIFN0YW5kYXJkIHRhZyBmb3JtYXQgZm9yIGFsbCBvdGhlciByZXNvdXJjZXNcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0YWdNYXAuZW50cmllcygpKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgIEtleToga2V5LFxuICAgICAgVmFsdWU6IHZhbHVlXG4gICAgfSkpO1xuICB9XG59XG4iXX0=
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmRUYWdzQXNwZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3V0aWxzL3N0YW5kYXJkVGFnc0FzcGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBcUU7QUFTckU7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxrQkFBa0I7SUFBL0I7UUFDbUIsdUJBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztJQXNGbEUsQ0FBQztJQXBGQyxLQUFLLENBQUMsSUFBZ0I7UUFDcEIsNEJBQTRCO1FBQzVCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE9BQU87UUFDVCxDQUFDO1FBRUQsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyx5QkFBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBbUIsQ0FBQztRQUNyQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxDLDZEQUE2RDtRQUM3RCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDbEQsT0FBTztRQUNULENBQUM7UUFFRCxxREFBcUQ7UUFDckQsSUFBSSxRQUFRLENBQUMsZUFBZSxLQUFLLGVBQWUsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBa0IsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCxxRUFBcUU7UUFDckUsSUFBSSxRQUFRLENBQUMsZUFBZSxLQUFLLGlCQUFpQixFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssY0FBYyxDQUFDLEdBQVc7UUFDaEMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQztRQUV0QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixNQUFNLFNBQVMsR0FDYixLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7WUFDckMsS0FBSyxDQUFDLE9BQU87WUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztRQUU5RCxJQUFJLFNBQVMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN4QixrQkFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxTQUFTLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssZ0JBQWdCLENBQUMsUUFBcUI7UUFDNUMsK0RBQStEO1FBQy9ELElBQUksU0FBUyxHQUEyQixRQUFRLENBQUM7UUFDakQsT0FBTyxTQUFTLEVBQUUsQ0FBQztZQUNqQiwyRUFBMkU7WUFDM0UsTUFBTSxlQUFlLEdBQUcsU0FBaUMsQ0FBQztZQUMxRCxJQUFJLGVBQWUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLGVBQWUsQ0FBQztnQkFFN0MsTUFBTSxPQUFPLEdBQTJCO29CQUN0QyxRQUFRLEVBQUUsU0FBUztvQkFDbkIsU0FBUyxFQUFFLFdBQVc7b0JBQ3RCLFVBQVUsRUFBRSxZQUFZO2lCQUN6QixDQUFDO2dCQUVGLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7Z0JBQ3ZDLGtCQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDL0QsTUFBTTtZQUNSLENBQUM7WUFDRCxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXZGRCxnREF1RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIElBc3BlY3QsIENmblJlc291cmNlLCBTdGFjaywgVGFncyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgdHlwZSBDZm5WUEMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgdHlwZSBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLyoqIENvbnN0cnVjdCB3aXRoIG9wdGlvbmFsIGJhY2t1cFZhdWx0VGllciBwcm9wZXJ0eSAqL1xuaW50ZXJmYWNlIElCYWNrdXBUaWVyQ29uc3RydWN0IGV4dGVuZHMgSUNvbnN0cnVjdCB7XG4gIGJhY2t1cFZhdWx0VGllcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBc3BlY3QgdG8gYXBwbHkgc3BlY2lhbCBGamFsbCB0YWdzIHRvIHNwZWNpZmljIHJlc291cmNlIHR5cGVzLlxuICpcbiAqIFRoaXMgYXNwZWN0IGhhbmRsZXMgdGFncyB0aGF0IGRlcGVuZCBvbiByZXNvdXJjZS1zcGVjaWZpYyBwcm9wZXJ0aWVzOlxuICogLSBmamFsbDpvcGVyYXRpb25zOnBvb2wgb24gVlBDcyB3aXRoIElQQU0gY29uZmlndXJhdGlvblxuICogLSBmamFsbDpkaXNhc3RlclJlY292ZXJ5OnRpZXIgb24gUzMgYnVja2V0cyB3aXRoIGJhY2t1cCBjb25maWd1cmF0aW9uXG4gKlxuICogU3RhbmRhcmQgRmphbGwgdGFncyAoY29zdEFsbG9jYXRpb246ZW52aXJvbm1lbnQsIGNvc3RBbGxvY2F0aW9uOnNlcnZpY2UsIGV0Yy4pXG4gKiBhcmUgYXBwbGllZCB2aWEgVGFncy5vZihhcHApLmFkZCgpIGluIHRoZSBBcHAgY2xhc3MsIHdoaWNoIHByb3Blcmx5IG1lcmdlc1xuICogd2l0aCBleGlzdGluZyB0YWdzIGZyb20gTDIgY29uc3RydWN0cy5cbiAqXG4gKiBUaGlzIGFzcGVjdCB1c2VzIFRhZ3Mub2Yobm9kZSkuYWRkKCkgdG8gcHJvcGVybHkgbWVyZ2Ugd2l0aCBleGlzdGluZyB0YWdzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFuZGFyZFRhZ3NBc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9jZXNzZWRSZXNvdXJjZXMgPSBuZXcgV2Vha1NldDxJQ29uc3RydWN0PigpO1xuXG4gIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICAvLyBTa2lwIGlmIGFscmVhZHkgcHJvY2Vzc2VkXG4gICAgaWYgKHRoaXMucHJvY2Vzc2VkUmVzb3VyY2VzLmhhcyhub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgTDEgKENGTikgcmVzb3VyY2VzIG9ubHlcbiAgICBpZiAoIUNmblJlc291cmNlLmlzQ2ZuUmVzb3VyY2Uobm9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5vZGUgYXMgQ2ZuUmVzb3VyY2U7XG4gICAgdGhpcy5wcm9jZXNzZWRSZXNvdXJjZXMuYWRkKG5vZGUpO1xuXG4gICAgLy8gU2tpcCBTZWNyZXRSb3RhdGlvbiByZXNvdXJjZXMgYXMgdGhleSBjcmVhdGUgbmVzdGVkIHN0YWNrc1xuICAgIGlmIChyZXNvdXJjZS5ub2RlLnBhdGguaW5jbHVkZXMoXCJTZWNyZXRSb3RhdGlvblwiKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFkZCBJUEFNIHBvb2wgdGFnIGZvciBWUENzIHdpdGggSVBBTSBjb25maWd1cmF0aW9uXG4gICAgaWYgKHJlc291cmNlLmNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OkVDMjo6VlBDXCIpIHtcbiAgICAgIHRoaXMuYWRkSXBhbVBvb2xUYWcocmVzb3VyY2UgYXMgQ2ZuVlBDKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZGlzYXN0ZXIgcmVjb3ZlcnkgdGllciB0YWcgZm9yIFMzIGJ1Y2tldHMgd2l0aCBiYWNrdXBWYXVsdFRpZXJcbiAgICBpZiAocmVzb3VyY2UuY2ZuUmVzb3VyY2VUeXBlID09PSBcIkFXUzo6UzM6OkJ1Y2tldFwiKSB7XG4gICAgICB0aGlzLmFkZEJhY2t1cFRpZXJUYWcocmVzb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgSVBBTSBwb29sIHRhZyB0byBWUENzIHRoYXQgdXNlIElQQU0gZm9yIElQIGFkZHJlc3MgYWxsb2NhdGlvbi5cbiAgICogVGFnIGZvcm1hdDogZmphbGw6b3BlcmF0aW9uczpwb29sID0gXCJ7YWNjb3VudElkfS17cmVnaW9ufVwiXG4gICAqL1xuICBwcml2YXRlIGFkZElwYW1Qb29sVGFnKHZwYzogQ2ZuVlBDKTogdm9pZCB7XG4gICAgY29uc3QgaXBhbVBvb2xJZCA9IHZwYy5pcHY0SXBhbVBvb2xJZDtcblxuICAgIGlmICghaXBhbVBvb2xJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2YodnBjKTtcbiAgICBjb25zdCBhY2NvdW50SWQgPVxuICAgICAgc3RhY2subm9kZS50cnlHZXRDb250ZXh0KFwiYWNjb3VudElkXCIpIHx8XG4gICAgICBzdGFjay5hY2NvdW50IHx8XG4gICAgICBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9BQ0NPVU5UO1xuICAgIGNvbnN0IHJlZ2lvbiA9IHN0YWNrLnJlZ2lvbiB8fCBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9SRUdJT047XG5cbiAgICBpZiAoYWNjb3VudElkICYmIHJlZ2lvbikge1xuICAgICAgVGFncy5vZih2cGMpLmFkZChcImZqYWxsOm9wZXJhdGlvbnM6cG9vbFwiLCBgJHthY2NvdW50SWR9LSR7cmVnaW9ufWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgZGlzYXN0ZXIgcmVjb3ZlcnkgdGllciB0YWcgdG8gUzMgYnVja2V0cyB3aXRoIGJhY2t1cFZhdWx0VGllciBwcm9wZXJ0eS5cbiAgICogVGFnIGZvcm1hdDogZmphbGw6ZGlzYXN0ZXJSZWNvdmVyeTp0aWVyID0gXCJ7dGllcn1cIlxuICAgKlxuICAgKiBUaWVyIG1hcHBpbmc6XG4gICAqIC0gc3RhbmRhcmQgLT4gXCJkZWZhdWx0XCIgKG1hdGNoZXMgZXhpc3RpbmcgYmFja3VwIHBsYW5zKVxuICAgKiAtIHJlc2lsaWVudCAtPiBcInJlc2lsaWVudFwiXG4gICAqIC0gZW50ZXJwcmlzZSAtPiBcImVudGVycHJpc2VcIlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRCYWNrdXBUaWVyVGFnKHJlc291cmNlOiBDZm5SZXNvdXJjZSk6IHZvaWQge1xuICAgIC8vIFdhbGsgdXAgdGhlIGNvbnN0cnVjdCB0cmVlIHRvIGZpbmQgdGhlIEwyIFMzQnVja2V0IGNvbnN0cnVjdFxuICAgIGxldCBjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QgfCB1bmRlZmluZWQgPSByZXNvdXJjZTtcbiAgICB3aGlsZSAoY29uc3RydWN0KSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG91ciBjdXN0b20gUzNCdWNrZXQgY2xhc3Mgd2l0aCBiYWNrdXBWYXVsdFRpZXIgcHJvcGVydHlcbiAgICAgIGNvbnN0IGJhY2t1cENvbnN0cnVjdCA9IGNvbnN0cnVjdCBhcyBJQmFja3VwVGllckNvbnN0cnVjdDtcbiAgICAgIGlmIChiYWNrdXBDb25zdHJ1Y3QuYmFja3VwVmF1bHRUaWVyKSB7XG4gICAgICAgIGNvbnN0IHRpZXIgPSBiYWNrdXBDb25zdHJ1Y3QuYmFja3VwVmF1bHRUaWVyO1xuXG4gICAgICAgIGNvbnN0IHRpZXJNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgc3RhbmRhcmQ6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgIHJlc2lsaWVudDogXCJyZXNpbGllbnRcIixcbiAgICAgICAgICBlbnRlcnByaXNlOiBcImVudGVycHJpc2VcIlxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRhZ1ZhbHVlID0gdGllck1hcFt0aWVyXSB8fCB0aWVyO1xuICAgICAgICBUYWdzLm9mKHJlc291cmNlKS5hZGQoXCJmamFsbDpkaXNhc3RlclJlY292ZXJ5OnRpZXJcIiwgdGFnVmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0cnVjdCA9IGNvbnN0cnVjdC5ub2RlLnNjb3BlO1xuICAgIH1cbiAgfVxufVxuIl19
|