terraconstructs 0.0.11 → 0.0.12
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 +104486 -34582
- package/lib/aws/arn.js +1 -1
- package/lib/aws/aws-construct.d.ts +1 -1
- package/lib/aws/aws-construct.js +28 -2
- package/lib/aws/aws-stack.d.ts +2 -4
- package/lib/aws/aws-stack.js +21 -8
- package/lib/aws/aws-tags.d.ts +58 -0
- package/lib/aws/aws-tags.js +77 -0
- package/lib/aws/cloudwatch/actions/ec2.js +1 -1
- package/lib/aws/cloudwatch/actions/lambda.js +1 -1
- package/lib/aws/cloudwatch/alarm-base.js +1 -1
- package/lib/aws/cloudwatch/alarm-rule.js +1 -1
- package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
- package/lib/aws/cloudwatch/alarm.js +1 -1
- package/lib/aws/cloudwatch/composite-alarm.js +1 -1
- package/lib/aws/cloudwatch/dashboard.js +1 -1
- package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
- package/lib/aws/cloudwatch/graph.js +8 -8
- package/lib/aws/cloudwatch/layout.js +3 -3
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
- package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
- package/lib/aws/cloudwatch/log-group.js +1 -1
- package/lib/aws/cloudwatch/log-query.js +1 -1
- package/lib/aws/cloudwatch/log-stream.js +1 -1
- package/lib/aws/cloudwatch/metric-filter.d.ts +1 -1
- package/lib/aws/cloudwatch/metric-filter.js +4 -4
- package/lib/aws/cloudwatch/metric.js +2 -2
- package/lib/aws/cloudwatch/pattern.js +3 -3
- package/lib/aws/cloudwatch/policy.js +1 -1
- package/lib/aws/cloudwatch/private/env-tokens.js +5 -6
- package/lib/aws/cloudwatch/private/metric-util.js +4 -5
- package/lib/aws/cloudwatch/private/object.js +2 -3
- package/lib/aws/cloudwatch/private/rendering.js +3 -3
- package/lib/aws/cloudwatch/private/statistic.js +6 -7
- package/lib/aws/cloudwatch/query-definition.js +2 -2
- package/lib/aws/cloudwatch/stats.js +1 -1
- package/lib/aws/cloudwatch/subscription-filter.d.ts +1 -1
- package/lib/aws/cloudwatch/subscription-filter.js +4 -4
- package/lib/aws/cloudwatch/text.js +1 -1
- package/lib/aws/cloudwatch/variable.js +3 -3
- package/lib/aws/cloudwatch/widget.d.ts +1 -1
- package/lib/aws/cloudwatch/widget.js +4 -4
- package/lib/aws/compute/activity.js +3 -2
- package/lib/aws/compute/alb/application-listener-action.d.ts +334 -0
- package/lib/aws/compute/alb/application-listener-action.js +281 -0
- package/lib/aws/compute/alb/application-listener-certificate.d.ts +35 -0
- package/lib/aws/compute/alb/application-listener-certificate.js +35 -0
- package/lib/aws/compute/alb/application-listener-rule.d.ts +233 -0
- package/lib/aws/compute/alb/application-listener-rule.js +220 -0
- package/lib/aws/compute/alb/application-listener.d.ts +574 -0
- package/lib/aws/compute/alb/application-listener.js +538 -0
- package/lib/aws/compute/alb/application-load-balancer.d.ts +715 -0
- package/lib/aws/compute/alb/application-load-balancer.js +780 -0
- package/lib/aws/compute/alb/application-target-group.d.ts +339 -0
- package/lib/aws/compute/alb/application-target-group.js +427 -0
- package/lib/aws/compute/alb/conditions.d.ts +61 -0
- package/lib/aws/compute/alb/conditions.js +164 -0
- package/lib/aws/compute/alb/trust-store-revocation.d.ts +59 -0
- package/lib/aws/compute/alb/trust-store-revocation.js +46 -0
- package/lib/aws/compute/alb/trust-store.d.ts +86 -0
- package/lib/aws/compute/alb/trust-store.js +79 -0
- package/lib/aws/compute/architecture.js +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.d.ts +75 -0
- package/lib/aws/compute/aspects/require-imdsv2-aspect.js +106 -0
- package/lib/aws/compute/bastion-host.d.ts +172 -0
- package/lib/aws/compute/bastion-host.js +114 -0
- package/lib/aws/compute/chain.js +1 -1
- package/lib/aws/compute/cidr-splits.d.ts +49 -0
- package/lib/aws/compute/cidr-splits.js +59 -0
- package/lib/aws/compute/client-vpn-authorization-rule.d.ts +43 -0
- package/lib/aws/compute/client-vpn-authorization-rule.js +30 -0
- package/lib/aws/compute/client-vpn-endpoint-types.d.ts +62 -0
- package/lib/aws/compute/client-vpn-endpoint-types.js +25 -0
- package/lib/aws/compute/client-vpn-endpoint.d.ts +239 -0
- package/lib/aws/compute/client-vpn-endpoint.js +259 -0
- package/lib/aws/compute/client-vpn-route.d.ts +67 -0
- package/lib/aws/compute/client-vpn-route.js +57 -0
- package/lib/aws/compute/condition.js +1 -1
- package/lib/aws/compute/connections.d.ts +137 -0
- package/lib/aws/compute/connections.js +208 -0
- package/lib/aws/compute/ec2-augmentations.generated.d.ts +53 -0
- package/lib/aws/compute/ec2-augmentations.generated.js +35 -0
- package/lib/aws/compute/ec2-canned-metrics.generated.d.ts +555 -0
- package/lib/aws/compute/ec2-canned-metrics.generated.js +681 -0
- package/lib/aws/compute/ec2-util-v2.d.ts +141 -0
- package/lib/aws/compute/ec2-util-v2.js +286 -0
- package/lib/aws/compute/ec2-util.d.ts +52 -0
- package/lib/aws/compute/ec2-util.js +138 -0
- package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.d.ts +176 -0
- package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.js +119 -0
- package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.d.ts +860 -0
- package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.js +597 -0
- package/lib/aws/compute/event-invoke-config.js +1 -1
- package/lib/aws/compute/event-source-filter.js +2 -2
- package/lib/aws/compute/event-source-mapping.js +1 -1
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
- package/lib/aws/compute/event-sources/s3.js +1 -1
- package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
- package/lib/aws/compute/event-sources/sqs.js +1 -1
- package/lib/aws/compute/fields.js +4 -4
- package/lib/aws/compute/function-alias.js +1 -1
- package/lib/aws/compute/function-base.js +2 -2
- package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
- package/lib/aws/compute/function-destinations/function.js +1 -1
- package/lib/aws/compute/function-destinations/sqs.js +1 -1
- package/lib/aws/compute/function-nodejs.js +1 -1
- package/lib/aws/compute/function-url.js +1 -1
- package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
- package/lib/aws/compute/function-vpc-config.generated.js +1 -1
- package/lib/aws/compute/function.d.ts +1 -1
- package/lib/aws/compute/function.js +5 -5
- package/lib/aws/compute/index-alpha.d.ts +5 -0
- package/lib/aws/compute/index-alpha.js +22 -0
- package/lib/aws/compute/index.d.ts +60 -0
- package/lib/aws/compute/index.js +70 -2
- package/lib/aws/compute/instance-types.d.ts +1354 -0
- package/lib/aws/compute/instance-types.js +1683 -0
- package/lib/aws/compute/instance.d.ts +436 -0
- package/lib/aws/compute/instance.js +262 -0
- package/lib/aws/compute/ip-addresses.d.ts +249 -0
- package/lib/aws/compute/ip-addresses.js +248 -0
- package/lib/aws/compute/ipam.d.ts +309 -0
- package/lib/aws/compute/ipam.js +306 -0
- package/lib/aws/compute/key-pair.d.ts +178 -0
- package/lib/aws/compute/key-pair.js +194 -0
- package/lib/aws/compute/lambda-augmentations.generated.d.ts +65 -0
- package/lib/aws/compute/lambda-augmentations.generated.js +41 -0
- package/lib/aws/compute/lambda-canned-metrics.generated.d.ts +316 -0
- package/lib/aws/compute/lambda-canned-metrics.generated.js +119 -0
- package/lib/aws/compute/launch-template.d.ts +540 -0
- package/lib/aws/compute/launch-template.js +468 -0
- package/lib/aws/compute/lb-shared/access-logs-accounts.d.ts +7 -0
- package/lib/aws/compute/lb-shared/access-logs-accounts.js +46 -0
- package/lib/aws/compute/lb-shared/base-listener.d.ts +113 -0
- package/lib/aws/compute/lb-shared/base-listener.js +181 -0
- package/lib/aws/compute/lb-shared/base-load-balancer.d.ts +212 -0
- package/lib/aws/compute/lb-shared/base-load-balancer.js +290 -0
- package/lib/aws/compute/lb-shared/base-target-group.d.ts +382 -0
- package/lib/aws/compute/lb-shared/base-target-group.js +364 -0
- package/lib/aws/compute/lb-shared/enums.d.ts +282 -0
- package/lib/aws/compute/lb-shared/enums.js +301 -0
- package/lib/aws/compute/lb-shared/grid-lookup-types.d.ts +42 -0
- package/lib/aws/compute/lb-shared/grid-lookup-types.js +53 -0
- package/lib/aws/compute/lb-shared/imported.d.ts +24 -0
- package/lib/aws/compute/lb-shared/imported.js +27 -0
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +194 -0
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +3 -0
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +56 -0
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +3 -0
- package/lib/aws/compute/lb-shared/listener-action.d.ts +14 -0
- package/lib/aws/compute/lb-shared/listener-action.js +4 -0
- package/lib/aws/compute/lb-shared/listener-certificate.d.ts +28 -0
- package/lib/aws/compute/lb-shared/listener-certificate.js +29 -0
- package/lib/aws/compute/lb-shared/load-balancer-targets.d.ts +93 -0
- package/lib/aws/compute/lb-shared/load-balancer-targets.js +127 -0
- package/lib/aws/compute/lb-shared/util.d.ts +113 -0
- package/lib/aws/compute/lb-shared/util.js +264 -0
- package/lib/aws/compute/lb-targets/alb-target.d.ts +67 -0
- package/lib/aws/compute/lb-targets/alb-target.js +100 -0
- package/lib/aws/compute/lb-targets/index.d.ts +4 -0
- package/lib/aws/compute/lb-targets/index.js +22 -0
- package/lib/aws/compute/lb-targets/instance-target.d.ts +42 -0
- package/lib/aws/compute/lb-targets/instance-target.js +67 -0
- package/lib/aws/compute/lb-targets/ip-target.d.ts +55 -0
- package/lib/aws/compute/lb-targets/ip-target.js +79 -0
- package/lib/aws/compute/lb-targets/lambda-target.d.ts +25 -0
- package/lib/aws/compute/lb-targets/lambda-target.js +50 -0
- package/lib/aws/compute/load-balancer.d.ts +336 -0
- package/lib/aws/compute/load-balancer.js +287 -0
- package/lib/aws/compute/machine-image/amazon-linux-2022.d.ts +63 -0
- package/lib/aws/compute/machine-image/amazon-linux-2022.js +84 -0
- package/lib/aws/compute/machine-image/amazon-linux-2023.d.ts +63 -0
- package/lib/aws/compute/machine-image/amazon-linux-2023.js +84 -0
- package/lib/aws/compute/machine-image/amazon-linux2.d.ts +76 -0
- package/lib/aws/compute/machine-image/amazon-linux2.js +87 -0
- package/lib/aws/compute/machine-image/common.d.ts +181 -0
- package/lib/aws/compute/machine-image/common.js +122 -0
- package/lib/aws/compute/machine-image/index.d.ts +5 -0
- package/lib/aws/compute/machine-image/index.js +22 -0
- package/lib/aws/compute/machine-image/machine-image.d.ts +463 -0
- package/lib/aws/compute/machine-image/machine-image.js +566 -0
- package/lib/aws/compute/machine-image/utils.d.ts +2 -0
- package/lib/aws/compute/machine-image/utils.js +17 -0
- package/lib/aws/compute/nat.d.ts +325 -0
- package/lib/aws/compute/nat.js +455 -0
- package/lib/aws/compute/network-acl-types.d.ts +152 -0
- package/lib/aws/compute/network-acl-types.js +156 -0
- package/lib/aws/compute/network-acl.d.ts +285 -0
- package/lib/aws/compute/network-acl.js +207 -0
- package/lib/aws/compute/network-util.d.ts +116 -0
- package/lib/aws/compute/network-util.js +241 -0
- package/lib/aws/compute/nlb/network-listener-action.d.ts +92 -0
- package/lib/aws/compute/nlb/network-listener-action.js +146 -0
- package/lib/aws/compute/nlb/network-listener-certificate.d.ts +24 -0
- package/lib/aws/compute/nlb/network-listener-certificate.js +25 -0
- package/lib/aws/compute/nlb/network-listener.d.ts +248 -0
- package/lib/aws/compute/nlb/network-listener.js +217 -0
- package/lib/aws/compute/nlb/network-load-balancer.d.ts +315 -0
- package/lib/aws/compute/nlb/network-load-balancer.js +360 -0
- package/lib/aws/compute/nlb/network-target-group.d.ts +153 -0
- package/lib/aws/compute/nlb/network-target-group.js +223 -0
- package/lib/aws/compute/peer.d.ts +64 -0
- package/lib/aws/compute/peer.js +235 -0
- package/lib/aws/compute/placement-group.d.ts +161 -0
- package/lib/aws/compute/placement-group.js +133 -0
- package/lib/aws/compute/port.d.ts +287 -0
- package/lib/aws/compute/port.js +390 -0
- package/lib/aws/compute/prefix-list.d.ts +131 -0
- package/lib/aws/compute/prefix-list.js +114 -0
- package/lib/aws/compute/private/context-stub.d.ts +7 -0
- package/lib/aws/compute/private/context-stub.js +43 -0
- package/lib/aws/compute/private/ebs-util.d.ts +14 -0
- package/lib/aws/compute/private/ebs-util.js +145 -0
- package/lib/aws/compute/private/intrinstics.js +2 -1
- package/lib/aws/compute/private/json-path.js +8 -8
- package/lib/aws/compute/private/util.js +2 -3
- package/lib/aws/compute/route.d.ts +547 -0
- package/lib/aws/compute/route.js +469 -0
- package/lib/aws/compute/security-group.d.ts +414 -0
- package/lib/aws/compute/security-group.js +538 -0
- package/lib/aws/compute/state-graph.js +1 -1
- package/lib/aws/compute/state-machine-fragment.js +1 -1
- package/lib/aws/compute/state-machine.d.ts +2 -2
- package/lib/aws/compute/state-machine.js +14 -12
- package/lib/aws/compute/states/choice.js +1 -1
- package/lib/aws/compute/states/custom-state.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
- package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
- package/lib/aws/compute/states/distributed-map.js +1 -1
- package/lib/aws/compute/states/fail.js +1 -1
- package/lib/aws/compute/states/map-base.js +1 -1
- package/lib/aws/compute/states/map.js +1 -1
- package/lib/aws/compute/states/parallel.js +1 -1
- package/lib/aws/compute/states/pass.js +2 -2
- package/lib/aws/compute/states/state.js +5 -5
- package/lib/aws/compute/states/succeed.js +1 -1
- package/lib/aws/compute/states/task-base.js +2 -2
- package/lib/aws/compute/states/task.js +1 -1
- package/lib/aws/compute/states/wait.js +2 -2
- package/lib/aws/compute/stepfunctions-canned-metrics.generated.d.ts +83 -0
- package/lib/aws/compute/stepfunctions-canned-metrics.generated.js +127 -0
- package/lib/aws/compute/subnet-v2.d.ts +213 -0
- package/lib/aws/compute/subnet-v2.js +405 -0
- package/lib/aws/compute/subnet.d.ts +37 -0
- package/lib/aws/compute/subnet.js +181 -0
- package/lib/aws/compute/task-credentials.js +1 -1
- package/lib/aws/compute/task-input.js +1 -1
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
- package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
- package/lib/aws/compute/tasks/http/invoke.js +1 -1
- package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
- package/lib/aws/compute/tasks/private/task-utils.js +3 -4
- package/lib/aws/compute/tasks/resource-arn-suffix.js +2 -3
- package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
- package/lib/aws/compute/types.js +2 -2
- package/lib/aws/compute/user-data.d.ts +270 -0
- package/lib/aws/compute/user-data.js +487 -0
- package/lib/aws/compute/util.d.ts +1 -1
- package/lib/aws/compute/util.js +4 -5
- package/lib/aws/compute/volume.d.ts +480 -0
- package/lib/aws/compute/volume.js +426 -0
- package/lib/aws/compute/vpc-endpoint-service.d.ts +149 -0
- package/lib/aws/compute/vpc-endpoint-service.js +90 -0
- package/lib/aws/compute/vpc-endpoint.d.ts +742 -0
- package/lib/aws/compute/vpc-endpoint.js +811 -0
- package/lib/aws/compute/vpc-flow-logs.d.ts +551 -0
- package/lib/aws/compute/vpc-flow-logs.js +693 -0
- package/lib/aws/compute/vpc-lookup.d.ts +73 -0
- package/lib/aws/compute/vpc-lookup.js +3 -0
- package/lib/aws/compute/vpc-v2-base.d.ts +353 -0
- package/lib/aws/compute/vpc-v2-base.js +493 -0
- package/lib/aws/compute/vpc-v2.d.ts +385 -0
- package/lib/aws/compute/vpc-v2.js +408 -0
- package/lib/aws/compute/vpc.d.ts +1448 -0
- package/lib/aws/compute/vpc.js +1495 -0
- package/lib/aws/compute/vpn.d.ts +443 -0
- package/lib/aws/compute/vpn.js +397 -0
- package/lib/aws/compute/windows-versions.d.ts +418 -0
- package/lib/aws/compute/windows-versions.js +426 -0
- package/lib/aws/edge/certificate-base.d.ts +20 -0
- package/lib/aws/edge/certificate-base.js +28 -0
- package/lib/aws/edge/certificate.d.ts +23 -2
- package/lib/aws/edge/certificate.js +54 -4
- package/lib/aws/edge/distribution.js +3 -3
- package/lib/aws/edge/dns-alias-record-targets.js +2 -2
- package/lib/aws/edge/dns-record.js +16 -16
- package/lib/aws/edge/dns-zone.d.ts +20 -2
- package/lib/aws/edge/dns-zone.js +25 -10
- package/lib/aws/edge/function.js +2 -2
- package/lib/aws/edge/index.d.ts +1 -0
- package/lib/aws/edge/index.js +2 -1
- package/lib/aws/edge/key-value-store.js +4 -4
- package/lib/aws/edge/origin.js +7 -5
- package/lib/aws/edge/response-headers-policy.js +1 -1
- package/lib/aws/encryption/alias.js +1 -1
- package/lib/aws/encryption/key.js +1 -1
- package/lib/aws/encryption/via-service-principal.js +1 -1
- package/lib/aws/iam/grant.js +2 -2
- package/lib/aws/iam/index.d.ts +1 -0
- package/lib/aws/iam/index.js +2 -1
- package/lib/aws/iam/instance-profile.d.ts +155 -0
- package/lib/aws/iam/instance-profile.js +124 -0
- package/lib/aws/iam/managed-policy.js +1 -1
- package/lib/aws/iam/oidc-provider.js +1 -1
- package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
- package/lib/aws/iam/policy-document-config.generated.js +1 -1
- package/lib/aws/iam/policy-document.js +1 -1
- package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
- package/lib/aws/iam/policy-statement-props.generated.js +1 -1
- package/lib/aws/iam/policy-statement.js +9 -9
- package/lib/aws/iam/policy.js +1 -1
- package/lib/aws/iam/principals.js +26 -26
- package/lib/aws/iam/private/assume-role-policy.js +2 -3
- package/lib/aws/iam/private/comparable-principal.js +2 -3
- package/lib/aws/iam/private/immutable-role.d.ts +2 -1
- package/lib/aws/iam/private/immutable-role.js +3 -3
- package/lib/aws/iam/private/imported-role.d.ts +1 -1
- package/lib/aws/iam/private/imported-role.js +3 -3
- package/lib/aws/iam/private/merge-statements.js +2 -3
- package/lib/aws/iam/private/util.js +4 -4
- package/lib/aws/iam/role.js +1 -1
- package/lib/aws/iam/saml-provider.d.ts +1 -1
- package/lib/aws/iam/saml-provider.js +6 -6
- package/lib/aws/iam/unknown-principal.js +1 -1
- package/lib/aws/iam/utils.js +2 -3
- package/lib/aws/index.d.ts +1 -0
- package/lib/aws/index.js +4 -1
- package/lib/aws/network/simple-ipv4-vpc.js +5 -5
- package/lib/aws/network/subnet-group.js +3 -3
- package/lib/aws/network/subnet.d.ts +1 -1
- package/lib/aws/network/subnet.js +7 -7
- package/lib/aws/notify/archive.js +3 -2
- package/lib/aws/notify/connection.js +5 -4
- package/lib/aws/notify/event-bus.js +5 -4
- package/lib/aws/notify/event-pattern.js +3 -3
- package/lib/aws/notify/index.js +3 -1
- package/lib/aws/notify/input.js +4 -3
- package/lib/aws/notify/kinesis-stream.js +3 -2
- package/lib/aws/notify/on-event-options.js +2 -1
- package/lib/aws/notify/queue-config.generated.d.ts +18 -11
- package/lib/aws/notify/queue-config.generated.js +1 -1
- package/lib/aws/notify/queue-policy.js +1 -1
- package/lib/aws/notify/queue.js +1 -1
- package/lib/aws/notify/resource-policy.js +1 -1
- package/lib/aws/notify/rule.js +3 -2
- package/lib/aws/notify/schedule.js +2 -2
- package/lib/aws/notify/sqs-augmentations.generated.d.ts +125 -0
- package/lib/aws/notify/sqs-augmentations.generated.js +74 -0
- package/lib/aws/notify/target.js +2 -1
- package/lib/aws/notify/targets/event-bus.js +1 -1
- package/lib/aws/notify/targets/function.js +1 -1
- package/lib/aws/notify/targets/log-group.js +2 -2
- package/lib/aws/notify/targets/sqs.js +1 -1
- package/lib/aws/notify/targets/state-machine.js +1 -1
- package/lib/aws/notify/targets/util.d.ts +1 -1
- package/lib/aws/notify/targets/util.js +10 -11
- package/lib/aws/notify/util.js +4 -4
- package/lib/aws/provider-config.generated.d.ts +33 -33
- package/lib/aws/provider-config.generated.js +1 -1
- package/lib/aws/storage/bucket-notifications.js +1 -1
- package/lib/aws/storage/bucket-policy.js +1 -1
- package/lib/aws/storage/bucket-source.js +1 -1
- package/lib/aws/storage/bucket.d.ts +298 -65
- package/lib/aws/storage/bucket.js +548 -225
- package/lib/aws/storage/cors-config.generated.d.ts +3 -3
- package/lib/aws/storage/cors-config.generated.js +1 -1
- package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
- package/lib/aws/storage/cors-rule-config.generated.js +1 -1
- package/lib/aws/storage/index.d.ts +1 -0
- package/lib/aws/storage/index.js +2 -1
- package/lib/aws/storage/lifecycle-config.generated.d.ts +11 -11
- package/lib/aws/storage/lifecycle-config.generated.js +1 -1
- package/lib/aws/storage/notification-targets/function.js +6 -6
- package/lib/aws/storage/notification-targets/queue.js +1 -1
- package/lib/aws/storage/origin-access-identity.d.ts +1 -1
- package/lib/aws/storage/origin-access-identity.js +5 -4
- package/lib/aws/storage/parameter-util.d.ts +12 -0
- package/lib/aws/storage/parameter-util.js +65 -0
- package/lib/aws/storage/parameter.d.ts +526 -0
- package/lib/aws/storage/parameter.js +606 -0
- package/lib/aws/storage/s3-canned-metrics.generated.d.ts +22 -0
- package/lib/aws/storage/s3-canned-metrics.generated.js +23 -0
- package/lib/aws/storage/util.d.ts +25 -3
- package/lib/aws/storage/util.js +84 -17
- package/lib/aws/storage/website-config.generated.d.ts +5 -5
- package/lib/aws/storage/website-config.generated.js +1 -1
- package/lib/aws/util.js +2 -3
- package/lib/construct-base.d.ts +10 -1
- package/lib/construct-base.js +9 -6
- package/lib/duration.js +1 -1
- package/lib/expiration.d.ts +48 -0
- package/lib/expiration.js +68 -0
- package/lib/helpers-internal/index.d.ts +1 -0
- package/lib/helpers-internal/index.js +7 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/lib/private/md5.d.ts +4 -0
- package/lib/private/md5.js +14 -0
- package/lib/private/unique-resource-name.js +3 -4
- package/lib/size.js +2 -2
- package/lib/stack-base.d.ts +4 -23
- package/lib/stack-base.js +9 -30
- package/lib/terra-func.d.ts +103 -0
- package/lib/terra-func.js +170 -0
- package/lib/token.js +5 -5
- package/package.json +15 -8
- package/bun.lockb +0 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.TargetGroupBase = exports.TargetGroupIpAddressType = void 0;
|
|
5
|
+
exports.loadBalancerNameFromListenerArn = loadBalancerNameFromListenerArn;
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
// https://github.com/aws/aws-cdk/blob/v2.175.1/packages/aws-cdk-lib/aws-elasticloadbalancingv2/lib/shared/base-target-group.ts
|
|
8
|
+
const provider_aws_1 = require("@cdktf/provider-aws");
|
|
9
|
+
const cdktf_1 = require("cdktf");
|
|
10
|
+
const constructs_1 = require("constructs");
|
|
11
|
+
const enums_1 = require("./enums");
|
|
12
|
+
const util_1 = require("./util");
|
|
13
|
+
const arn_1 = require("../../arn");
|
|
14
|
+
const aws_construct_1 = require("../../aws-construct");
|
|
15
|
+
/**
|
|
16
|
+
* The IP address type of targets registered with a target group
|
|
17
|
+
*/
|
|
18
|
+
var TargetGroupIpAddressType;
|
|
19
|
+
(function (TargetGroupIpAddressType) {
|
|
20
|
+
/**
|
|
21
|
+
* IPv4 addresses
|
|
22
|
+
*/
|
|
23
|
+
TargetGroupIpAddressType["IPV4"] = "ipv4";
|
|
24
|
+
/**
|
|
25
|
+
* IPv6 addresses
|
|
26
|
+
*/
|
|
27
|
+
TargetGroupIpAddressType["IPV6"] = "ipv6";
|
|
28
|
+
})(TargetGroupIpAddressType || (exports.TargetGroupIpAddressType = TargetGroupIpAddressType = {}));
|
|
29
|
+
/**
|
|
30
|
+
* Define the target of a load balancer
|
|
31
|
+
*/
|
|
32
|
+
class TargetGroupBase extends aws_construct_1.AwsConstructBase {
|
|
33
|
+
get targetGroupOutputs() {
|
|
34
|
+
return {
|
|
35
|
+
targetGroupArn: this.targetGroupArn,
|
|
36
|
+
targetGroupFullName: this.targetGroupFullName,
|
|
37
|
+
targetGroupName: this.targetGroupName,
|
|
38
|
+
targetGroupLoadBalancerArns: this.targetGroupLoadBalancerArns,
|
|
39
|
+
firstLoadBalancerFullName: this.firstLoadBalancerFullName,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
get outputs() {
|
|
43
|
+
return this.targetGroupOutputs;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @param additionalProps healthCheck, stickiness, targetGroupHealth are controlled by methods and ignored
|
|
47
|
+
*/
|
|
48
|
+
constructor(scope, id, baseProps, additionalProps) {
|
|
49
|
+
super(scope, id, baseProps);
|
|
50
|
+
/**
|
|
51
|
+
* Configurable dependable with all resources that lead to load balancer attachment
|
|
52
|
+
*/
|
|
53
|
+
this.loadBalancerAttachedDependencies = new constructs_1.DependencyGroup();
|
|
54
|
+
/**
|
|
55
|
+
* Attributes of this target group
|
|
56
|
+
*/
|
|
57
|
+
this.attributes = {};
|
|
58
|
+
/**
|
|
59
|
+
* The JSON objects returned by the directly registered members of this target group
|
|
60
|
+
*/
|
|
61
|
+
this.targetsJson = new Array();
|
|
62
|
+
// TODO: Must not begin or end with a hyphen
|
|
63
|
+
const targetGroupName = baseProps.targetGroupName ||
|
|
64
|
+
this.stack.uniqueResourceName(this, {
|
|
65
|
+
prefix: this.gridUUID,
|
|
66
|
+
allowedSpecialCharacters: "-",
|
|
67
|
+
maxLength: 32,
|
|
68
|
+
});
|
|
69
|
+
if (baseProps.deregistrationDelay !== undefined) {
|
|
70
|
+
this.setAttribute(util_1.TargetGroupAttribute.deregistrationDelayTimeoutSeconds, baseProps.deregistrationDelay.toSeconds().toString());
|
|
71
|
+
}
|
|
72
|
+
if (baseProps.crossZoneEnabled !== undefined) {
|
|
73
|
+
this.setAttribute(util_1.TargetGroupAttribute.loadBalancingCrossZoneEnabled, baseProps.crossZoneEnabled === true ? "true" : "false");
|
|
74
|
+
}
|
|
75
|
+
this.healthCheck = baseProps.healthCheck || {};
|
|
76
|
+
this.vpc = baseProps.vpc;
|
|
77
|
+
this.targetType = baseProps.targetType;
|
|
78
|
+
this.resource = new provider_aws_1.lbTargetGroup.LbTargetGroup(this, "Resource", {
|
|
79
|
+
name: targetGroupName,
|
|
80
|
+
targetType: cdktf_1.Lazy.stringValue({ produce: () => this.targetType }),
|
|
81
|
+
vpcId: cdktf_1.Lazy.stringValue({
|
|
82
|
+
produce: () => this.vpc && this.targetType !== enums_1.TargetType.LAMBDA
|
|
83
|
+
? this.vpc.vpcId
|
|
84
|
+
: undefined,
|
|
85
|
+
}),
|
|
86
|
+
// Reverse CFN TargetGroupAttributes to Terraform Resource properties
|
|
87
|
+
// https://github.com/hashicorp/terraform-provider-aws/blob/v5.88.0/internal/service/elbv2/target_group.go#L800
|
|
88
|
+
// https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-targetgroup-targetgroupattribute.html
|
|
89
|
+
deregistrationDelay: this.lazyStringAttr(util_1.TargetGroupAttribute.deregistrationDelayTimeoutSeconds),
|
|
90
|
+
connectionTermination: this.lazyBoolAttr(util_1.TargetGroupAttribute.deregistrationDelayConnectionTerminationEnabled),
|
|
91
|
+
loadBalancingCrossZoneEnabled: this.lazyStringAttr(util_1.TargetGroupAttribute.loadBalancingCrossZoneEnabled),
|
|
92
|
+
loadBalancingAlgorithmType: this.lazyStringAttr(util_1.TargetGroupAttribute.loadBalancingAlgorithmType),
|
|
93
|
+
loadBalancingAnomalyMitigation: this.lazyStringAttr(util_1.TargetGroupAttribute.loadBalancingAlgorithmAnomalyMitigation),
|
|
94
|
+
slowStart: this.lazyNumberAttr(util_1.TargetGroupAttribute.slowStartDurationSeconds),
|
|
95
|
+
// stickiness is set in toTerraform as it could be empty object
|
|
96
|
+
// it is ComplexObject - doesn't work with IResolvable
|
|
97
|
+
// stickiness: Lazy.anyValue({ ... }),
|
|
98
|
+
// target_group_health is set in toTerraform as it could be empty object
|
|
99
|
+
// it is ComplexObject - doesn't work with IResolvable
|
|
100
|
+
// targetGroupHealth: Lazy.anyValue({ ... }),
|
|
101
|
+
preserveClientIp: this.lazyStringAttr(util_1.TargetGroupAttribute.preserveClientIPEnabled),
|
|
102
|
+
proxyProtocolV2: this.lazyBoolAttr(util_1.TargetGroupAttribute.proxyProtocolV2Enabled),
|
|
103
|
+
lambdaMultiValueHeadersEnabled: this.lazyBoolAttr(util_1.TargetGroupAttribute.lambdaMultiValueHeadersEnabled),
|
|
104
|
+
targetHealthState: cdktf_1.Lazy.anyValue({
|
|
105
|
+
produce: () => {
|
|
106
|
+
const result = new Array();
|
|
107
|
+
const unhealthyDrainingInterval = (0, util_1.lookupNumberAttribute)(this.attributes, util_1.TargetGroupAttribute.targetHealthStateUnhealthyDrainingIntervalSeconds);
|
|
108
|
+
const enableUnhealthyConnectionTermination = (0, util_1.lookupBoolAttribute)(this.attributes, util_1.TargetGroupAttribute.targetHealthStateUnhealthyConnectionTerminationEnabled);
|
|
109
|
+
if (unhealthyDrainingInterval !== undefined ||
|
|
110
|
+
enableUnhealthyConnectionTermination !== undefined) {
|
|
111
|
+
result.push({
|
|
112
|
+
enableUnhealthyConnectionTermination: enableUnhealthyConnectionTermination ?? true,
|
|
113
|
+
unhealthyDrainingInterval,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return result;
|
|
117
|
+
},
|
|
118
|
+
}, { omitEmptyArray: true }),
|
|
119
|
+
targetFailover: cdktf_1.Lazy.anyValue({
|
|
120
|
+
produce: () => {
|
|
121
|
+
const result = new Array();
|
|
122
|
+
const onUnhealthy = (0, util_1.lookupStringAttribute)(this.attributes, util_1.TargetGroupAttribute.targetFailoverOnUnhealthy);
|
|
123
|
+
const onDeregistration = (0, util_1.lookupStringAttribute)(this.attributes, util_1.TargetGroupAttribute.targetFailoverOnDeregistration);
|
|
124
|
+
// throw error if either is defined without the other
|
|
125
|
+
if ((onUnhealthy !== undefined && onDeregistration === undefined) ||
|
|
126
|
+
(onUnhealthy === undefined && onDeregistration !== undefined)) {
|
|
127
|
+
throw new Error("target_failover.on_unhealthy and target_failover.on_deregistration must be defined together");
|
|
128
|
+
}
|
|
129
|
+
if (onUnhealthy !== undefined && onDeregistration !== undefined) {
|
|
130
|
+
result.push({
|
|
131
|
+
onUnhealthy,
|
|
132
|
+
onDeregistration,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return result;
|
|
136
|
+
},
|
|
137
|
+
}, { omitEmptyArray: true }),
|
|
138
|
+
// health_check is set in toTerraform as it could be empty object
|
|
139
|
+
// it is ComplexObject - doesn't work with IResolvable
|
|
140
|
+
// healthCheck: Lazy.anyValue({ ...}),
|
|
141
|
+
ipAddressType: baseProps.ipAddressType,
|
|
142
|
+
...additionalProps,
|
|
143
|
+
});
|
|
144
|
+
this.targetGroupLoadBalancerArns = this.resource.loadBalancerArns;
|
|
145
|
+
this.targetGroupArn = this.resource.arn;
|
|
146
|
+
//this.resource.attrTargetGroupFullName;
|
|
147
|
+
this.targetGroupFullName = this.stack.splitArn(this.resource.arn, arn_1.ArnFormat.SLASH_RESOURCE_NAME).resource;
|
|
148
|
+
this.loadBalancerArns = this.resource.loadBalancerArns.toString();
|
|
149
|
+
this.targetGroupName = this.resource.name;
|
|
150
|
+
this.defaultPort = additionalProps.port ?? 80; // TODO: This is bug in AWSCDK as it can be undefined.
|
|
151
|
+
this.protocolVersion = additionalProps?.protocolVersion;
|
|
152
|
+
this.node.addValidation({ validate: () => this.validateHealthCheck() });
|
|
153
|
+
this.node.addValidation({ validate: () => this.validateTargetGroup() });
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* List of constructs that need to be depended on to ensure the TargetGroup is associated to a load balancer
|
|
157
|
+
*/
|
|
158
|
+
get loadBalancerAttached() {
|
|
159
|
+
return this.loadBalancerAttachedDependencies;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Set/replace the target group's health check
|
|
163
|
+
*/
|
|
164
|
+
configureHealthCheck(healthCheck) {
|
|
165
|
+
this.healthCheck = healthCheck;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* AWS CDK specific way of setting non-standard attribute on the target group
|
|
169
|
+
*
|
|
170
|
+
* Prefer to use dedicated methods like `configureHealthCheck` or `setAttribute`
|
|
171
|
+
*
|
|
172
|
+
* @see https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-group-attributes
|
|
173
|
+
*/
|
|
174
|
+
setAttribute(key, value) {
|
|
175
|
+
this.attributes[key] = value;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Register the given load balancing target as part of this group
|
|
179
|
+
*/
|
|
180
|
+
addLoadBalancerTarget(props) {
|
|
181
|
+
if (this.targetType !== undefined && this.targetType !== props.targetType) {
|
|
182
|
+
throw new Error(`Already have a of type '${this.targetType}', adding '${props.targetType}'; make all targets the same type.`);
|
|
183
|
+
}
|
|
184
|
+
this.targetType = props.targetType;
|
|
185
|
+
if (this.targetType === enums_1.TargetType.LAMBDA && this.targetsJson.length >= 1) {
|
|
186
|
+
throw new Error("TargetGroup can only contain one LAMBDA target. Create a new TargetGroup.");
|
|
187
|
+
}
|
|
188
|
+
if (props.targetJson) {
|
|
189
|
+
this.targetsJson.push(props.targetJson);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
validateTargetGroup() {
|
|
193
|
+
const ret = new Array();
|
|
194
|
+
if (this.targetType === undefined && this.targetsJson.length === 0) {
|
|
195
|
+
// "@aws-cdk/aws-elbv2:targetGroupSpecifyTargetTypeForEmptyTargetGroup",
|
|
196
|
+
cdktf_1.Annotations.of(this).addWarning("When creating an empty TargetGroup, you should specify a 'targetType' (this warning may become an error in the future).");
|
|
197
|
+
}
|
|
198
|
+
if (this.targetType !== enums_1.TargetType.LAMBDA && this.vpc === undefined) {
|
|
199
|
+
ret.push("'vpc' is required for a non-Lambda TargetGroup");
|
|
200
|
+
}
|
|
201
|
+
// https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-name
|
|
202
|
+
const targetGroupName = this.resource.nameInput;
|
|
203
|
+
if (!cdktf_1.Token.isUnresolved(targetGroupName) && targetGroupName !== undefined) {
|
|
204
|
+
if (targetGroupName.length > 32) {
|
|
205
|
+
ret.push(`Target group name: "${targetGroupName}" can have a maximum of 32 characters.`);
|
|
206
|
+
}
|
|
207
|
+
if (targetGroupName.startsWith("-") || targetGroupName.endsWith("-")) {
|
|
208
|
+
ret.push(`Target group name: "${targetGroupName}" must not begin or end with a hyphen.`);
|
|
209
|
+
}
|
|
210
|
+
if (!/^[0-9a-z-]+$/i.test(targetGroupName)) {
|
|
211
|
+
ret.push(`Target group name: "${targetGroupName}" must contain only alphanumeric characters or hyphens.`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return ret;
|
|
215
|
+
}
|
|
216
|
+
validateHealthCheck() {
|
|
217
|
+
const ret = new Array();
|
|
218
|
+
const intervalSeconds = this.healthCheck.interval?.toSeconds();
|
|
219
|
+
const timeoutSeconds = this.healthCheck.timeout?.toSeconds();
|
|
220
|
+
if (intervalSeconds && timeoutSeconds) {
|
|
221
|
+
if (intervalSeconds < timeoutSeconds) {
|
|
222
|
+
// < instead of <= for backwards compatibility, see discussion in https://github.com/aws/aws-cdk/pull/26031
|
|
223
|
+
ret.push("Health check interval must be greater than or equal to the timeout; received interval " +
|
|
224
|
+
`${intervalSeconds}, timeout ${timeoutSeconds}.`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return ret;
|
|
228
|
+
}
|
|
229
|
+
lazyStringAttr(key) {
|
|
230
|
+
return cdktf_1.Lazy.stringValue({
|
|
231
|
+
produce: () => this.attributes[key],
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
lazyBoolAttr(key) {
|
|
235
|
+
return cdktf_1.Lazy.anyValue({
|
|
236
|
+
produce: () => (0, util_1.lookupBoolAttribute)(this.attributes, key),
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
lazyNumberAttr(key) {
|
|
240
|
+
return cdktf_1.Lazy.numberValue({
|
|
241
|
+
produce: () => (0, util_1.lookupNumberAttribute)(this.attributes, key),
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Adds resource to the terraform JSON output.
|
|
246
|
+
*
|
|
247
|
+
* called by TerraformStack.prepareStack()
|
|
248
|
+
*/
|
|
249
|
+
toTerraform() {
|
|
250
|
+
// TODO: Switch from provider-aws to provider-awscc and use LazyValue?
|
|
251
|
+
// instead of inline LazyValue, we use prepareStack() to synth additional resources
|
|
252
|
+
// targets: Lazy.anyValue(
|
|
253
|
+
// { produce: () => this.targetsJson },
|
|
254
|
+
// { omitEmptyArray: true },
|
|
255
|
+
// ),
|
|
256
|
+
// put putStickiness if attributes are set
|
|
257
|
+
const stickinessEnabled = (0, util_1.lookupBoolAttribute)(this.attributes, util_1.TargetGroupAttribute.stickinessEnabled);
|
|
258
|
+
const stickinessAppCookieDuration = (0, util_1.lookupNumberAttribute)(this.attributes, util_1.TargetGroupAttribute.stickinessAppCookieDurationSeconds);
|
|
259
|
+
const stickinessLBCookieDuration = (0, util_1.lookupNumberAttribute)(this.attributes, util_1.TargetGroupAttribute.stickinessLBCookieDurationSeconds);
|
|
260
|
+
const stickinessCookieName = (0, util_1.lookupStringAttribute)(this.attributes, util_1.TargetGroupAttribute.stickinessAppCookieCookieName);
|
|
261
|
+
if ((stickinessEnabled !== undefined && stickinessEnabled !== false) ||
|
|
262
|
+
stickinessAppCookieDuration !== undefined ||
|
|
263
|
+
stickinessLBCookieDuration !== undefined ||
|
|
264
|
+
stickinessCookieName !== undefined) {
|
|
265
|
+
// possible values for ALB are `lb_cookie` or `app_cookie`
|
|
266
|
+
// only possible value for NLB is `source_ip`
|
|
267
|
+
// possible values for GWLB are `source_ip_dest_ip` or `source_ip_dest_ip_proto`
|
|
268
|
+
const type = (0, util_1.lookupStringAttribute)(this.attributes, util_1.TargetGroupAttribute.stickinessType);
|
|
269
|
+
// tf requires type to be set
|
|
270
|
+
if (!type)
|
|
271
|
+
throw new Error("stickiness.type is required if any stickiness attribute is set");
|
|
272
|
+
this.resource.putStickiness({
|
|
273
|
+
type,
|
|
274
|
+
enabled: (0, util_1.lookupBoolAttribute)(this.attributes, util_1.TargetGroupAttribute.stickinessEnabled),
|
|
275
|
+
cookieDuration: type === "lb_cookie"
|
|
276
|
+
? stickinessLBCookieDuration
|
|
277
|
+
: stickinessAppCookieDuration,
|
|
278
|
+
// app_cookie attributes
|
|
279
|
+
cookieName: (0, util_1.lookupStringAttribute)(this.attributes, util_1.TargetGroupAttribute.stickinessAppCookieCookieName),
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* The HTTP or gRPC codes to use when checking for a successful response from a target.
|
|
284
|
+
* The `health_check.protocol` must be one of HTTP or HTTPS or the `target_type` must be lambda.
|
|
285
|
+
* Values can be comma-separated individual values (e.g., "200,202") or a range of
|
|
286
|
+
* values (e.g., "200-299").
|
|
287
|
+
*
|
|
288
|
+
* - For gRPC-based target groups (i.e., the protocol is one of HTTP or HTTPS and the
|
|
289
|
+
* `protocol_version` is GRPC), values can be between 0 and 99. The default is 12.
|
|
290
|
+
* - When used with an Application Load Balancer (i.e., the protocol is one of HTTP
|
|
291
|
+
* or HTTPS and the `protocol_version` is not GRPC), values can be between 200 and 499.
|
|
292
|
+
* The default is 200.
|
|
293
|
+
* - When used with a Network Load Balancer (i.e., the protocol is one of TCP, TCP_UDP, UDP, or TLS),
|
|
294
|
+
* values can be between 200 and 599. The default is 200-399.
|
|
295
|
+
* - When the target_type is lambda, values can be between 200 and 499. The default is 200.
|
|
296
|
+
*
|
|
297
|
+
* Docs at Terraform Registry: {@link https://registry.terraform.io/providers/hashicorp/aws/5.88.0/docs/resources/lb_target_group#matcher-1 LbTargetGroup#matcher}
|
|
298
|
+
*/
|
|
299
|
+
let matcher = this.healthCheck?.healthyHttpCodes;
|
|
300
|
+
if (this.protocolVersion === "GRPC" &&
|
|
301
|
+
this.healthCheck?.healthyGrpcCodes !== undefined) {
|
|
302
|
+
matcher = this.healthCheck.healthyGrpcCodes;
|
|
303
|
+
}
|
|
304
|
+
// put HealthCheck if attributes are set
|
|
305
|
+
this.resource.putHealthCheck({
|
|
306
|
+
enabled: this.healthCheck?.enabled,
|
|
307
|
+
interval: this.healthCheck?.interval?.toSeconds(),
|
|
308
|
+
path: this.healthCheck?.path,
|
|
309
|
+
port: this.healthCheck?.port,
|
|
310
|
+
protocol: this.healthCheck?.protocol,
|
|
311
|
+
timeout: this.healthCheck?.timeout?.toSeconds(),
|
|
312
|
+
healthyThreshold: this.healthCheck?.healthyThresholdCount,
|
|
313
|
+
unhealthyThreshold: this.healthCheck?.unhealthyThresholdCount,
|
|
314
|
+
matcher,
|
|
315
|
+
});
|
|
316
|
+
// put targetGroupHealth if attributes are set
|
|
317
|
+
const dnsFailover = {
|
|
318
|
+
minimumHealthyTargetsCount: (0, util_1.lookupStringAttribute)(this.attributes, util_1.TargetGroupAttribute.targetGroupHealthDNSFailoverMinimumHealthyTargetsCount),
|
|
319
|
+
minimumHealthyTargetsPercentage: (0, util_1.lookupStringAttribute)(this.attributes, util_1.TargetGroupAttribute.targetGroupHealthDNSFailoverMinimumHealthyTargetsPercentage),
|
|
320
|
+
};
|
|
321
|
+
const unhealthyStateRouting = {
|
|
322
|
+
minimumHealthyTargetsCount: (0, util_1.lookupNumberAttribute)(this.attributes, util_1.TargetGroupAttribute.targetGroupHealthUnhealthyStateRoutingMinimumHealthyTargetsCount),
|
|
323
|
+
minimumHealthyTargetsPercentage: (0, util_1.lookupStringAttribute)(this.attributes, util_1.TargetGroupAttribute.targetGroupHealthUnhealthyStateRoutingMinimumHealthyTargetsPercentage),
|
|
324
|
+
};
|
|
325
|
+
this.resource.putTargetGroupHealth({
|
|
326
|
+
dnsFailover, // TODO: should be undefined if all object keys are undefined
|
|
327
|
+
unhealthyStateRouting, // TODO: should be undefined if all object keys are undefined
|
|
328
|
+
});
|
|
329
|
+
// add lbTargetGroupAttachment resource for each target
|
|
330
|
+
for (let i = 0; i < this.targetsJson.length; i++) {
|
|
331
|
+
const id = `Attachment${i}`;
|
|
332
|
+
// TODO: Ideally we should have used IResolvable.resolve and use the IResolveContext.preparing flag
|
|
333
|
+
// ref: https://github.com/aws/aws-cdk/blob/v2.170.0/packages/aws-cdk-lib/aws-iam/lib/policy-document.ts#L48
|
|
334
|
+
if (this.node.tryFindChild(id))
|
|
335
|
+
continue; // ignore if already generated
|
|
336
|
+
new provider_aws_1.lbTargetGroupAttachment.LbTargetGroupAttachment(this, id, {
|
|
337
|
+
targetGroupArn: this.resource.arn,
|
|
338
|
+
targetId: this.targetsJson[i].targetId,
|
|
339
|
+
availabilityZone: this.targetsJson[i].availabilityZone,
|
|
340
|
+
port: this.targetsJson[i].port,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
return {};
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
exports.TargetGroupBase = TargetGroupBase;
|
|
347
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
348
|
+
TargetGroupBase[_a] = { fqn: "terraconstructs.aws.compute.TargetGroupBase", version: "0.0.12" };
|
|
349
|
+
/**
|
|
350
|
+
* Extract the full load balancer name (used for metrics) from the listener ARN:
|
|
351
|
+
*
|
|
352
|
+
* Turns
|
|
353
|
+
*
|
|
354
|
+
* arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2
|
|
355
|
+
*
|
|
356
|
+
* Into
|
|
357
|
+
*
|
|
358
|
+
* app/my-load-balancer/50dc6c495c0c9188
|
|
359
|
+
*/
|
|
360
|
+
function loadBalancerNameFromListenerArn(listenerArn) {
|
|
361
|
+
const arnParts = cdktf_1.Fn.split("/", listenerArn);
|
|
362
|
+
return `${cdktf_1.Fn.element(arnParts, 1)}/${cdktf_1.Fn.element(arnParts, 2)}/${cdktf_1.Fn.element(arnParts, 3)}`;
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10YXJnZXQtZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvbGItc2hhcmVkL2Jhc2UtdGFyZ2V0LWdyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUE4MUJBLDBFQUdDOztBQWoyQkQsK0hBQStIO0FBRS9ILHNEQUc2QjtBQUM3QixpQ0FBcUQ7QUFDckQsMkNBS29CO0FBRXBCLG1DQUFpRDtBQUVqRCxpQ0FNZ0I7QUFFaEIsbUNBQXNDO0FBQ3RDLHVEQUk2QjtBQUU3Qjs7R0FFRztBQUNILElBQVksd0JBVVg7QUFWRCxXQUFZLHdCQUF3QjtJQUNsQzs7T0FFRztJQUNILHlDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILHlDQUFhLENBQUE7QUFDZixDQUFDLEVBVlcsd0JBQXdCLHdDQUF4Qix3QkFBd0IsUUFVbkM7QUFrTUQ7O0dBRUc7QUFDSCxNQUFzQixlQUNwQixTQUFRLGdDQUFnQjtJQUd4QixJQUFXLGtCQUFrQjtRQUMzQixPQUFPO1lBQ0wsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ25DLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7WUFDN0MsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3JDLDJCQUEyQixFQUFFLElBQUksQ0FBQywyQkFBMkI7WUFDN0QseUJBQXlCLEVBQUUsSUFBSSxDQUFDLHlCQUF5QjtTQUMxRCxDQUFDO0lBQ0osQ0FBQztJQUNELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBNEZEOztPQUVHO0lBQ0gsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsU0FBK0IsRUFDL0IsZUFBa0Q7UUFFbEQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUF2RDlCOztXQUVHO1FBQ2dCLHFDQUFnQyxHQUFHLElBQUksNEJBQWUsRUFBRSxDQUFD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QixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUU7Z0JBQzVELGNBQWMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUc7Z0JBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7Z0JBQ3RDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO2dCQUN0RCxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2FBQy9CLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7O0FBdmhCSCwwQ0F3aEJDOzs7QUEwRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLCtCQUErQixDQUFDLFdBQW1CO0lBQ2pFLE1BQU0sUUFBUSxHQUFHLFVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzVDLE9BQU8sR0FBRyxVQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxVQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxVQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzVGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNzUuMS9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2Mi9saWIvc2hhcmVkL2Jhc2UtdGFyZ2V0LWdyb3VwLnRzXG5cbmltcG9ydCB7XG4gIGxiVGFyZ2V0R3JvdXAgYXMgdGZUYXJnZXRHcm91cCxcbiAgbGJUYXJnZXRHcm91cEF0dGFjaG1lbnQgYXMgdGZUYXJnZXRHcm91cEF0dGFjaG1lbnQsXG59IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQgeyBMYXp5LCBUb2tlbiwgRm4sIEFubm90YXRpb25zIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3QsXG4gIERlcGVuZGVuY3lHcm91cCxcbiAgSUNvbnN0cnVjdCxcbiAgSURlcGVuZGFibGUsXG59IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBJVnBjIH0gZnJvbSBcIi4uL3ZwY1wiO1xuaW1wb3J0IHsgTGJQcm90b2NvbCwgVGFyZ2V0VHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5pbXBvcnQgeyBMYlRhcmdldEdyb3VwQXR0YWNobWVudENvbmZpZyB9IGZyb20gXCIuL2xiLXRhcmdldC1ncm91cC1hdHRhY2htZW50LWNvbmZpZy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIEF0dHJpYnV0ZXMsXG4gIGxvb2t1cFN0cmluZ0F0dHJpYnV0ZSxcbiAgbG9va3VwQm9vbEF0dHJpYnV0ZSxcbiAgbG9va3VwTnVtYmVyQXR0cmlidXRlLFxuICBUYXJnZXRHcm91cEF0dHJpYnV0ZSBhcyBBdHRyaWJ1dGUsXG59IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcIi4uLy4uLy4uL2R1cmF0aW9uXCI7XG5pbXBvcnQgeyBBcm5Gb3JtYXQgfSBmcm9tIFwiLi4vLi4vYXJuXCI7XG5pbXBvcnQge1xuICBBd3NDb25zdHJ1Y3RCYXNlLFxuICBBd3NDb25zdHJ1Y3RQcm9wcyxcbiAgLy8gSUF3c0NvbnN0cnVjdCxcbn0gZnJvbSBcIi4uLy4uL2F3cy1jb25zdHJ1Y3RcIjtcblxuLyoqXG4gKiBUaGUgSVAgYWRkcmVzcyB0eXBlIG9mIHRhcmdldHMgcmVnaXN0ZXJlZCB3aXRoIGEgdGFyZ2V0IGdyb3VwXG4gKi9cbmV4cG9ydCBlbnVtIFRhcmdldEdyb3VwSXBBZGRyZXNzVHlwZSB7XG4gIC8qKlxuICAgKiBJUHY0IGFkZHJlc3Nlc1xuICAgKi9cbiAgSVBWNCA9IFwiaXB2NFwiLFxuXG4gIC8qKlxuICAgKiBJUHY2IGFkZHJlc3Nlc1xuICAgKi9cbiAgSVBWNiA9IFwiaXB2NlwiLFxufVxuXG4vKipcbiAqIEJhc2ljIHByb3BlcnRpZXMgb2YgYm90aCBBcHBsaWNhdGlvbiBhbmQgTmV0d29yayBUYXJnZXQgR3JvdXBzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVRhcmdldEdyb3VwUHJvcHMgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGdyb3VwLlxuICAgKlxuICAgKiBUaGlzIG5hbWUgbXVzdCBiZSB1bmlxdWUgcGVyIHJlZ2lvbiBwZXIgYWNjb3VudCwgY2FuIGhhdmUgYSBtYXhpbXVtIG9mXG4gICAqIDMyIGNoYXJhY3RlcnMsIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yIGh5cGhlbnMsIGFuZFxuICAgKiBtdXN0IG5vdCBiZWdpbiBvciBlbmQgd2l0aCBhIGh5cGhlbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEdyb3VwTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZpcnR1YWwgcHJpdmF0ZSBjbG91ZCAoVlBDKS5cbiAgICpcbiAgICogb25seSBpZiBgVGFyZ2V0VHlwZWAgaXMgYElwYCBvciBgSW5zdGFuY2VJZGBcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IElWcGM7XG5cbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2YgdGltZSBmb3IgRWxhc3RpYyBMb2FkIEJhbGFuY2luZyB0byB3YWl0IGJlZm9yZSBkZXJlZ2lzdGVyaW5nIGEgdGFyZ2V0LlxuICAgKlxuICAgKiBUaGUgcmFuZ2UgaXMgMC0zNjAwIHNlY29uZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDMwMFxuICAgKi9cbiAgcmVhZG9ubHkgZGVyZWdpc3RyYXRpb25EZWxheT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIZWFsdGggY2hlY2sgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIHByb3BlcnR5IGluIHRoaXMgY29uZmlndXJhdGlvbiB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjItdGFyZ2V0Z3JvdXAuaHRtbCNhd3MtcmVzb3VyY2UtZWxhc3RpY2xvYWRiYWxhbmNpbmd2Mi10YXJnZXRncm91cC1wcm9wZXJ0aWVzXG4gICAqL1xuICByZWFkb25seSBoZWFsdGhDaGVjaz86IEhlYWx0aENoZWNrO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0YXJnZXRzIHJlZ2lzdGVyZWQgdG8gdGhpcyBUYXJnZXRHcm91cCwgZWl0aGVyIElQIG9yIEluc3RhbmNlLlxuICAgKlxuICAgKiBBbGwgdGFyZ2V0cyByZWdpc3RlcmVkIGludG8gdGhlIGdyb3VwIG11c3QgYmUgb2YgdGhpcyB0eXBlLiBJZiB5b3VcbiAgICogcmVnaXN0ZXIgdGFyZ2V0cyB0byB0aGUgVGFyZ2V0R3JvdXAgaW4gdGhlIENESyBhcHAsIHRoZSBUYXJnZXRUeXBlIGlzXG4gICAqIGRldGVybWluZWQgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBEZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRUeXBlPzogVGFyZ2V0VHlwZTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgY3Jvc3Mgem9uZSBsb2FkIGJhbGFuY2luZyBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVzZSBsb2FkIGJhbGFuY2VyIGNvbmZpZ3VyYXRpb25cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyLXRhcmdldGdyb3VwLXRhcmdldGdyb3VwYXR0cmlidXRlLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGNyb3NzWm9uZUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBJUCBhZGRyZXNzZXMgb2YgdGhlIHRhcmdldHMgcmVnaXN0ZXJlZCB3aXRoIHRoZSB0YXJnZXQgZ3JvdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIEVMQiBkZWZhdWx0cyB0byBJUHY0XG4gICAqL1xuICByZWFkb25seSBpcEFkZHJlc3NUeXBlPzogVGFyZ2V0R3JvdXBJcEFkZHJlc3NUeXBlO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNvbmZpZ3VyaW5nIGEgaGVhbHRoIGNoZWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ2hlY2sge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgaGVhbHRoIGNoZWNrcyBhcmUgZW5hYmxlZC4gSWYgdGhlIHRhcmdldCB0eXBlIGlzIGxhbWJkYSxcbiAgICogaGVhbHRoIGNoZWNrcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCBidXQgY2FuIGJlIGVuYWJsZWQuIElmIHRoZSB0YXJnZXQgdHlwZVxuICAgKiBpcyBpbnN0YW5jZSBvciBpcCwgaGVhbHRoIGNoZWNrcyBhcmUgYWx3YXlzIGVuYWJsZWQgYW5kIGNhbm5vdCBiZSBkaXNhYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBEZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGFwcHJveGltYXRlIG51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gaGVhbHRoIGNoZWNrcyBmb3IgYW4gaW5kaXZpZHVhbCB0YXJnZXQuXG4gICAqIE11c3QgYmUgNSB0byAzMDAgc2Vjb25kc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIDEwIHNlY29uZHMgaWYgcHJvdG9jb2wgaXMgYEdFTkVWRWAsIDM1IHNlY29uZHMgaWYgdGFyZ2V0IHR5cGUgaXMgYGxhbWJkYWAsIGVsc2UgMzAgc2Vjb25kc1xuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIHBpbmcgcGF0aCBkZXN0aW5hdGlvbiB3aGVyZSBFbGFzdGljIExvYWQgQmFsYW5jaW5nIHNlbmRzIGhlYWx0aCBjaGVjayByZXF1ZXN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgL1xuICAgKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBvcnQgdGhhdCB0aGUgbG9hZCBiYWxhbmNlciB1c2VzIHdoZW4gcGVyZm9ybWluZyBoZWFsdGggY2hlY2tzIG9uIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAndHJhZmZpYy1wb3J0J1xuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb3RvY29sIHRoZSBsb2FkIGJhbGFuY2VyIHVzZXMgd2hlbiBwZXJmb3JtaW5nIGhlYWx0aCBjaGVja3Mgb24gdGFyZ2V0cy5cbiAgICpcbiAgICogVGhlIFRDUCBwcm90b2NvbCBpcyBzdXBwb3J0ZWQgZm9yIGhlYWx0aCBjaGVja3Mgb25seSBpZiB0aGUgcHJvdG9jb2wgb2YgdGhlIHRhcmdldCBncm91cCBpcyBUQ1AsIFRMUywgVURQLCBvciBUQ1BfVURQLlxuICAgKiBUaGUgVExTLCBVRFAsIGFuZCBUQ1BfVURQIHByb3RvY29scyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgaGVhbHRoIGNoZWNrcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBIVFRQIGZvciBBTEJzLCBUQ1AgZm9yIE5MQnNcbiAgICovXG4gIHJlYWRvbmx5IHByb3RvY29sPzogTGJQcm90b2NvbDtcblxuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBzZWNvbmRzLCBkdXJpbmcgd2hpY2ggbm8gcmVzcG9uc2UgZnJvbSBhIHRhcmdldCBtZWFucyBhIGZhaWxlZCBoZWFsdGggY2hlY2suXG4gICAqIE11c3QgYmUgMiB0byAxMjAgc2Vjb25kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSA2IHNlY29uZHMgaWYgdGhlIHByb3RvY29sIGlzIEhUVFAsIDUgc2Vjb25kcyBpZiBwcm90b2NvbCBpcyBgR0VORVZFYCwgMzAgc2Vjb25kcyBpZiB0YXJnZXQgdHlwZSBpcyBgbGFtYmRhYCwgMTAgc2Vjb25kcyBmb3IgVENQLCBUTFMsIG9yIEhUVFBTXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgaGVhbHRoIGNoZWNrcyBzdWNjZXNzZXMgcmVxdWlyZWQgYmVmb3JlIGNvbnNpZGVyaW5nIGFuIHVuaGVhbHRoeSB0YXJnZXQgaGVhbHRoeS5cbiAgICpcbiAgICogRm9yIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXJzLCB0aGUgZGVmYXVsdCBpcyA1LiBGb3IgTmV0d29yayBMb2FkIEJhbGFuY2VycywgdGhlIGRlZmF1bHQgaXMgMy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSA1IGZvciBBTEJzLCAzIGZvciBOTEJzXG4gICAqL1xuICByZWFkb25seSBoZWFsdGh5VGhyZXNob2xkQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgaGVhbHRoIGNoZWNrIGZhaWx1cmVzIHJlcXVpcmVkIGJlZm9yZSBjb25zaWRlcmluZyBhIHRhcmdldCB1bmhlYWx0aHkuXG4gICAqXG4gICAqIEZvciBBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VycywgdGhlIGRlZmF1bHQgaXMgMi4gRm9yIE5ldHdvcmsgTG9hZFxuICAgKiBCYWxhbmNlcnMsIHRoZSByYW5nZSBpcyBiZXR3ZWVuIDItMTAgYW5kIGNhbiBiZSBzZXQgYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IDJcbiAgICovXG4gIHJlYWRvbmx5IHVuaGVhbHRoeVRocmVzaG9sZENvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBHUlBDIGNvZGUgdG8gdXNlIHdoZW4gY2hlY2tpbmcgZm9yIGEgc3VjY2Vzc2Z1bCByZXNwb25zZSBmcm9tIGEgdGFyZ2V0LlxuICAgKlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgdmFsdWVzIGJldHdlZW4gMCBhbmQgOTkuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSB2YWx1ZXNcbiAgICogKGZvciBleGFtcGxlLCBcIjAsMVwiKSBvciBhIHJhbmdlIG9mIHZhbHVlcyAoZm9yIGV4YW1wbGUsIFwiMC01XCIpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMlxuICAgKi9cbiAgcmVhZG9ubHkgaGVhbHRoeUdycGNDb2Rlcz86IHN0cmluZztcblxuICAvKipcbiAgICogSFRUUCBjb2RlIHRvIHVzZSB3aGVuIGNoZWNraW5nIGZvciBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBhIHRhcmdldC5cbiAgICpcbiAgICogRm9yIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXJzLCB5b3UgY2FuIHNwZWNpZnkgdmFsdWVzIGJldHdlZW4gMjAwIGFuZFxuICAgKiA0OTksIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAyMDAuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSB2YWx1ZXMgKGZvclxuICAgKiBleGFtcGxlLCBcIjIwMCwyMDJcIikgb3IgYSByYW5nZSBvZiB2YWx1ZXMgKGZvciBleGFtcGxlLCBcIjIwMC0yOTlcIikuXG4gICAqL1xuICByZWFkb25seSBoZWFsdGh5SHR0cENvZGVzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldEdyb3VwT3V0cHV0cyB7XG4gIC8qKlxuICAgKiBBUk4gb2YgdGhlIHRhcmdldCBncm91cFxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0R3JvdXBBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgdGFyZ2V0IGdyb3VwXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRHcm91cEZ1bGxOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgZ3JvdXBcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEdyb3VwTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBUk5zIG9mIGxvYWQgYmFsYW5jZXJzIGxvYWQgYmFsYW5jaW5nIHRvIHRoaXMgVGFyZ2V0R3JvdXBcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEdyb3VwTG9hZEJhbGFuY2VyQXJuczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEZ1bGwgbmFtZSBvZiBmaXJzdCBsb2FkIGJhbGFuY2VyXG4gICAqXG4gICAqIFRoaXMgaWRlbnRpZmllciBpcyBlbWl0dGVkIGFzIGEgZGltZW5zaW9ucyBvZiB0aGUgbWV0cmljcyBvZiB0aGlzIHRhcmdldFxuICAgKiBncm91cC5cbiAgICpcbiAgICogRXhhbXBsZSB2YWx1ZTogYGFwcC9teS1sb2FkLWJhbGFuY2VyLzEyMzQ1Njc4OWBcbiAgICovXG4gIHJlYWRvbmx5IGZpcnN0TG9hZEJhbGFuY2VyRnVsbE5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZpbmUgdGhlIHRhcmdldCBvZiBhIGxvYWQgYmFsYW5jZXJcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRhcmdldEdyb3VwQmFzZVxuICBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2VcbiAgaW1wbGVtZW50cyBJVGFyZ2V0R3JvdXBcbntcbiAgcHVibGljIGdldCB0YXJnZXRHcm91cE91dHB1dHMoKTogVGFyZ2V0R3JvdXBPdXRwdXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0R3JvdXBBcm46IHRoaXMudGFyZ2V0R3JvdXBBcm4sXG4gICAgICB0YXJnZXRHcm91cEZ1bGxOYW1lOiB0aGlzLnRhcmdldEdyb3VwRnVsbE5hbWUsXG4gICAgICB0YXJnZXRHcm91cE5hbWU6IHRoaXMudGFyZ2V0R3JvdXBOYW1lLFxuICAgICAgdGFyZ2V0R3JvdXBMb2FkQmFsYW5jZXJBcm5zOiB0aGlzLnRhcmdldEdyb3VwTG9hZEJhbGFuY2VyQXJucyxcbiAgICAgIGZpcnN0TG9hZEJhbGFuY2VyRnVsbE5hbWU6IHRoaXMuZmlyc3RMb2FkQmFsYW5jZXJGdWxsTmFtZSxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXRHcm91cE91dHB1dHM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHRhcmdldCBncm91cFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldEdyb3VwQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHRhcmdldCBncm91cFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldEdyb3VwRnVsbE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHRhcmdldCBncm91cFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldEdyb3VwTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBUk5zIG9mIGxvYWQgYmFsYW5jZXJzIGxvYWQgYmFsYW5jaW5nIHRvIHRoaXMgVGFyZ2V0R3JvdXBcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0YXJnZXRHcm91cExvYWRCYWxhbmNlckFybnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBGdWxsIG5hbWUgb2YgZmlyc3QgbG9hZCBiYWxhbmNlclxuICAgKlxuICAgKiBUaGlzIGlkZW50aWZpZXIgaXMgZW1pdHRlZCBhcyBhIGRpbWVuc2lvbnMgb2YgdGhlIG1ldHJpY3Mgb2YgdGhpcyB0YXJnZXRcbiAgICogZ3JvdXAuXG4gICAqXG4gICAqIEV4YW1wbGUgdmFsdWU6IGBhcHAvbXktbG9hZC1iYWxhbmNlci8xMjM0NTY3ODlgXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZmlyc3RMb2FkQmFsYW5jZXJGdWxsTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRva2VuIHJlcHJlc2VudGluZyBhIGxpc3Qgb2YgQVJOcyBvZiB0aGUgbG9hZCBiYWxhbmNlcnMgdGhhdCByb3V0ZSB0cmFmZmljIHRvIHRoaXMgdGFyZ2V0IGdyb3VwXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9hZEJhbGFuY2VyQXJuczogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIZWFsdGggY2hlY2sgZm9yIHRoZSBtZW1iZXJzIG9mIHRoaXMgdGFyZ2V0IGdyb3VwXG4gICAqL1xuICBwdWJsaWMgaGVhbHRoQ2hlY2s6IEhlYWx0aENoZWNrO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHBvcnQgY29uZmlndXJlZCBmb3IgbWVtYmVycyBvZiB0aGlzIHRhcmdldCBncm91cFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlZmF1bHRQb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYWJsZSBkZXBlbmRhYmxlIHdpdGggYWxsIHJlc291cmNlcyB0aGF0IGxlYWQgdG8gbG9hZCBiYWxhbmNlciBhdHRhY2htZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9hZEJhbGFuY2VyQXR0YWNoZWREZXBlbmRlbmNpZXMgPSBuZXcgRGVwZW5kZW5jeUdyb3VwKCk7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlcyBvZiB0aGUgZGlyZWN0bHkgcmVnaXN0ZXJlZCBtZW1iZXJzIG9mIHRoaXMgdGFyZ2V0IGdyb3VwXG4gICAqL1xuICBwcm90ZWN0ZWQgdGFyZ2V0VHlwZT86IFRhcmdldFR5cGU7XG5cbiAgLyoqXG4gICAqIEF0dHJpYnV0ZXMgb2YgdGhpcyB0YXJnZXQgZ3JvdXBcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYXR0cmlidXRlczogQXR0cmlidXRlcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgSlNPTiBvYmplY3RzIHJldHVybmVkIGJ5IHRoZSBkaXJlY3RseSByZWdpc3RlcmVkIG1lbWJlcnMgb2YgdGhpcyB0YXJnZXQgZ3JvdXBcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFyZ2V0c0pzb24gPSBuZXcgQXJyYXk8TGJUYXJnZXRHcm91cEF0dGFjaG1lbnRDb25maWc+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgZ3JvdXAgVlBDXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gUmVxdWlyZWQgaWYgYWRkaW5nIGluc3RhbmNlcyBpbnN0ZWFkIG9mIExhbWJkYXMgdG8gVGFyZ2V0R3JvdXBcbiAgICovXG4gIHByaXZhdGUgdnBjPzogSVZwYztcblxuICAvKipcbiAgICogVGhlIHByb3RvY29sIHZlcnNpb24gdG8gdXNlXG4gICAqXG4gICAqIE9ubHkgYXBwbGljYWJsZSB3aGVuIHByb3RvY29sIGlzIEhUVFAgb3IgSFRUUFMuIFRoZSBwcm90b2NvbCB2ZXJzaW9uLlxuICAgKlxuICAgKiBTcGVjaWZ5IEdSUEMgdG8gc2VuZCByZXF1ZXN0cyB0byB0YXJnZXRzIHVzaW5nIGdSUEMuXG4gICAqIFNwZWNpZnkgSFRUUDIgdG8gc2VuZCByZXF1ZXN0cyB0byB0YXJnZXRzIHVzaW5nIEhUVFAvMi5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgaXMgSFRUUDEsIHdoaWNoIHNlbmRzIHJlcXVlc3RzIHRvIHRhcmdldHMgdXNpbmcgSFRUUC8xLjFcbiAgICpcbiAgICogQGRlZmF1bHQgXCJIVFRQMVwiXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3RvY29sVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBncm91cCByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiB0ZlRhcmdldEdyb3VwLkxiVGFyZ2V0R3JvdXA7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhZGRpdGlvbmFsUHJvcHMgaGVhbHRoQ2hlY2ssIHN0aWNraW5lc3MsIHRhcmdldEdyb3VwSGVhbHRoIGFyZSBjb250cm9sbGVkIGJ5IG1ldGhvZHMgYW5kIGlnbm9yZWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBiYXNlUHJvcHM6IEJhc2VUYXJnZXRHcm91cFByb3BzLFxuICAgIGFkZGl0aW9uYWxQcm9wczogdGZUYXJnZXRHcm91cC5MYlRhcmdldEdyb3VwQ29uZmlnLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIGJhc2VQcm9wcyk7XG4gICAgLy8gVE9ETzogTXVzdCBub3QgYmVnaW4gb3IgZW5kIHdpdGggYSBoeXBoZW5cbiAgICBjb25zdCB0YXJnZXRHcm91cE5hbWUgPVxuICAgICAgYmFzZVByb3BzLnRhcmdldEdyb3VwTmFtZSB8fFxuICAgICAgdGhpcy5zdGFjay51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge1xuICAgICAgICBwcmVmaXg6IHRoaXMuZ3JpZFVVSUQsXG4gICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogXCItXCIsXG4gICAgICAgIG1heExlbmd0aDogMzIsXG4gICAgICB9KTtcblxuICAgIGlmIChiYXNlUHJvcHMuZGVyZWdpc3RyYXRpb25EZWxheSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShcbiAgICAgICAgQXR0cmlidXRlLmRlcmVnaXN0cmF0aW9uRGVsYXlUaW1lb3V0U2Vjb25kcyxcbiAgICAgICAgYmFzZVByb3BzLmRlcmVnaXN0cmF0aW9uRGVsYXkudG9TZWNvbmRzKCkudG9TdHJpbmcoKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGJhc2VQcm9wcy5jcm9zc1pvbmVFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKFxuICAgICAgICBBdHRyaWJ1dGUubG9hZEJhbGFuY2luZ0Nyb3NzWm9uZUVuYWJsZWQsXG4gICAgICAgIGJhc2VQcm9wcy5jcm9zc1pvbmVFbmFibGVkID09PSB0cnVlID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuaGVhbHRoQ2hlY2sgPSBiYXNlUHJvcHMuaGVhbHRoQ2hlY2sgfHwge307XG4gICAgdGhpcy52cGMgPSBiYXNlUHJvcHMudnBjO1xuICAgIHRoaXMudGFyZ2V0VHlwZSA9IGJhc2VQcm9wcy50YXJnZXRUeXBlO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyB0ZlRhcmdldEdyb3VwLkxiVGFyZ2V0R3JvdXAodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBuYW1lOiB0YXJnZXRHcm91cE5hbWUsXG4gICAgICB0YXJnZXRUeXBlOiBMYXp5LnN0cmluZ1ZhbHVlKHsgcHJvZHVjZTogKCkgPT4gdGhpcy50YXJnZXRUeXBlIH0pLFxuICAgICAgdnBjSWQ6IExhenkuc3RyaW5nVmFsdWUoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PlxuICAgICAgICAgIHRoaXMudnBjICYmIHRoaXMudGFyZ2V0VHlwZSAhPT0gVGFyZ2V0VHlwZS5MQU1CREFcbiAgICAgICAgICAgID8gdGhpcy52cGMudnBjSWRcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfSksXG4gICAgICAvLyBSZXZlcnNlIENGTiBUYXJnZXRHcm91cEF0dHJpYnV0ZXMgdG8gVGVycmFmb3JtIFJlc291cmNlIHByb3BlcnRpZXNcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLXByb3ZpZGVyLWF3cy9ibG9iL3Y1Ljg4LjAvaW50ZXJuYWwvc2VydmljZS9lbGJ2Mi90YXJnZXRfZ3JvdXAuZ28jTDgwMFxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXByb3BlcnRpZXMtZWxhc3RpY2xvYWRiYWxhbmNpbmd2Mi10YXJnZXRncm91cC10YXJnZXRncm91cGF0dHJpYnV0ZS5odG1sXG4gICAgICBkZXJlZ2lzdHJhdGlvbkRlbGF5OiB0aGlzLmxhenlTdHJpbmdBdHRyKFxuICAgICAgICBBdHRyaWJ1dGUuZGVyZWdpc3RyYXRpb25EZWxheVRpbWVvdXRTZWNvbmRzLFxuICAgICAgKSxcbiAgICAgIGNvbm5lY3Rpb25UZXJtaW5hdGlvbjogdGhpcy5sYXp5Qm9vbEF0dHIoXG4gICAgICAgIEF0dHJpYnV0ZS5kZXJlZ2lzdHJhdGlvbkRlbGF5Q29ubmVjdGlvblRlcm1pbmF0aW9uRW5hYmxlZCxcbiAgICAgICksXG4gICAgICBsb2FkQmFsYW5jaW5nQ3Jvc3Nab25lRW5hYmxlZDogdGhpcy5sYXp5U3RyaW5nQXR0cihcbiAgICAgICAgQXR0cmlidXRlLmxvYWRCYWxhbmNpbmdDcm9zc1pvbmVFbmFibGVkLFxuICAgICAgKSxcbiAgICAgIGxvYWRCYWxhbmNpbmdBbGdvcml0aG1UeXBlOiB0aGlzLmxhenlTdHJpbmdBdHRyKFxuICAgICAgICBBdHRyaWJ1dGUubG9hZEJhbGFuY2luZ0FsZ29yaXRobVR5cGUsXG4gICAgICApLFxuICAgICAgbG9hZEJhbGFuY2luZ0Fub21hbHlNaXRpZ2F0aW9uOiB0aGlzLmxhenlTdHJpbmdBdHRyKFxuICAgICAgICBBdHRyaWJ1dGUubG9hZEJhbGFuY2luZ0FsZ29yaXRobUFub21hbHlNaXRpZ2F0aW9uLFxuICAgICAgKSxcbiAgICAgIHNsb3dTdGFydDogdGhpcy5sYXp5TnVtYmVyQXR0cihBdHRyaWJ1dGUuc2xvd1N0YXJ0RHVyYXRpb25TZWNvbmRzKSxcbiAgICAgIC8vIHN0aWNraW5lc3MgaXMgc2V0IGluIHRvVGVycmFmb3JtIGFzIGl0IGNvdWxkIGJlIGVtcHR5IG9iamVjdFxuICAgICAgLy8gaXQgaXMgQ29tcGxleE9iamVjdCAtIGRvZXNuJ3Qgd29yayB3aXRoIElSZXNvbHZhYmxlXG4gICAgICAvLyBzdGlja2luZXNzOiBMYXp5LmFueVZhbHVlKHsgLi4uIH0pLFxuICAgICAgLy8gdGFyZ2V0X2dyb3VwX2hlYWx0aCBpcyBzZXQgaW4gdG9UZXJyYWZvcm0gYXMgaXQgY291bGQgYmUgZW1wdHkgb2JqZWN0XG4gICAgICAvLyBpdCBpcyBDb21wbGV4T2JqZWN0IC0gZG9lc24ndCB3b3JrIHdpdGggSVJlc29sdmFibGVcbiAgICAgIC8vIHRhcmdldEdyb3VwSGVhbHRoOiBMYXp5LmFueVZhbHVlKHsgLi4uIH0pLFxuICAgICAgcHJlc2VydmVDbGllbnRJcDogdGhpcy5sYXp5U3RyaW5nQXR0cihBdHRyaWJ1dGUucHJlc2VydmVDbGllbnRJUEVuYWJsZWQpLFxuICAgICAgcHJveHlQcm90b2NvbFYyOiB0aGlzLmxhenlCb29sQXR0cihBdHRyaWJ1dGUucHJveHlQcm90b2NvbFYyRW5hYmxlZCksXG4gICAgICBsYW1iZGFNdWx0aVZhbHVlSGVhZGVyc0VuYWJsZWQ6IHRoaXMubGF6eUJvb2xBdHRyKFxuICAgICAgICBBdHRyaWJ1dGUubGFtYmRhTXVsdGlWYWx1ZUhlYWRlcnNFbmFibGVkLFxuICAgICAgKSxcbiAgICAgIHRhcmdldEhlYWx0aFN0YXRlOiBMYXp5LmFueVZhbHVlKFxuICAgICAgICB7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgICAgICAgbmV3IEFycmF5PHRmVGFyZ2V0R3JvdXAuTGJUYXJnZXRHcm91cFRhcmdldEhlYWx0aFN0YXRlPigpO1xuICAgICAgICAgICAgY29uc3QgdW5oZWFsdGh5RHJhaW5pbmdJbnRlcnZhbCA9IGxvb2t1cE51bWJlckF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICBBdHRyaWJ1dGUudGFyZ2V0SGVhbHRoU3RhdGVVbmhlYWx0aHlEcmFpbmluZ0ludGVydmFsU2Vjb25kcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBlbmFibGVVbmhlYWx0aHlDb25uZWN0aW9uVGVybWluYXRpb24gPSBsb29rdXBCb29sQXR0cmlidXRlKFxuICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIEF0dHJpYnV0ZS50YXJnZXRIZWFsdGhTdGF0ZVVuaGVhbHRoeUNvbm5lY3Rpb25UZXJtaW5hdGlvbkVuYWJsZWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB1bmhlYWx0aHlEcmFpbmluZ0ludGVydmFsICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgZW5hYmxlVW5oZWFsdGh5Q29ubmVjdGlvblRlcm1pbmF0aW9uICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgZW5hYmxlVW5oZWFsdGh5Q29ubmVjdGlvblRlcm1pbmF0aW9uOlxuICAgICAgICAgICAgICAgICAgZW5hYmxlVW5oZWFsdGh5Q29ubmVjdGlvblRlcm1pbmF0aW9uID8/IHRydWUsXG4gICAgICAgICAgICAgICAgdW5oZWFsdGh5RHJhaW5pbmdJbnRlcnZhbCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgb21pdEVtcHR5QXJyYXk6IHRydWUgfSxcbiAgICAgICksXG4gICAgICB0YXJnZXRGYWlsb3ZlcjogTGF6eS5hbnlWYWx1ZShcbiAgICAgICAge1xuICAgICAgICAgIHByb2R1Y2U6ICgpOlxuICAgICAgICAgICAgfCB0ZlRhcmdldEdyb3VwLkxiVGFyZ2V0R3JvdXBUYXJnZXRGYWlsb3ZlcltdXG4gICAgICAgICAgICB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICAgICAgICBuZXcgQXJyYXk8dGZUYXJnZXRHcm91cC5MYlRhcmdldEdyb3VwVGFyZ2V0RmFpbG92ZXI+KCk7XG4gICAgICAgICAgICBjb25zdCBvblVuaGVhbHRoeSA9IGxvb2t1cFN0cmluZ0F0dHJpYnV0ZShcbiAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICBBdHRyaWJ1dGUudGFyZ2V0RmFpbG92ZXJPblVuaGVhbHRoeSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBvbkRlcmVnaXN0cmF0aW9uID0gbG9va3VwU3RyaW5nQXR0cmlidXRlKFxuICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIEF0dHJpYnV0ZS50YXJnZXRGYWlsb3Zlck9uRGVyZWdpc3RyYXRpb24sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gdGhyb3cgZXJyb3IgaWYgZWl0aGVyIGlzIGRlZmluZWQgd2l0aG91dCB0aGUgb3RoZXJcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKG9uVW5oZWFsdGh5ICE9PSB1bmRlZmluZWQgJiYgb25EZXJlZ2lzdHJhdGlvbiA9PT0gdW5kZWZpbmVkKSB8fFxuICAgICAgICAgICAgICAob25VbmhlYWx0aHkgPT09IHVuZGVmaW5lZCAmJiBvbkRlcmVnaXN0cmF0aW9uICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwidGFyZ2V0X2ZhaWxvdmVyLm9uX3VuaGVhbHRoeSBhbmQgdGFyZ2V0X2ZhaWxvdmVyLm9uX2RlcmVnaXN0cmF0aW9uIG11c3QgYmUgZGVmaW5lZCB0b2dldGhlclwiLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9uVW5oZWFsdGh5ICE9PSB1bmRlZmluZWQgJiYgb25EZXJlZ2lzdHJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICBvblVuaGVhbHRoeSxcbiAgICAgICAgICAgICAgICBvbkRlcmVnaXN0cmF0aW9uLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBvbWl0RW1wdHlBcnJheTogdHJ1ZSB9LFxuICAgICAgKSxcbiAgICAgIC8vIGhlYWx0aF9jaGVjayBpcyBzZXQgaW4gdG9UZXJyYWZvcm0gYXMgaXQgY291bGQgYmUgZW1wdHkgb2JqZWN0XG4gICAgICAvLyBpdCBpcyBDb21wbGV4T2JqZWN0IC0gZG9lc24ndCB3b3JrIHdpdGggSVJlc29sdmFibGVcbiAgICAgIC8vIGhlYWx0aENoZWNrOiBMYXp5LmFueVZhbHVlKHsgLi4ufSksXG4gICAgICBpcEFkZHJlc3NUeXBlOiBiYXNlUHJvcHMuaXBBZGRyZXNzVHlwZSxcblxuICAgICAgLi4uYWRkaXRpb25hbFByb3BzLFxuICAgIH0pO1xuXG4gICAgdGhpcy50YXJnZXRHcm91cExvYWRCYWxhbmNlckFybnMgPSB0aGlzLnJlc291cmNlLmxvYWRCYWxhbmNlckFybnM7XG4gICAgdGhpcy50YXJnZXRHcm91cEFybiA9IHRoaXMucmVzb3VyY2UuYXJuO1xuICAgIC8vdGhpcy5yZXNvdXJjZS5hdHRyVGFyZ2V0R3JvdXBGdWxsTmFtZTtcbiAgICB0aGlzLnRhcmdldEdyb3VwRnVsbE5hbWUgPSB0aGlzLnN0YWNrLnNwbGl0QXJuKFxuICAgICAgdGhpcy5yZXNvdXJjZS5hcm4sXG4gICAgICBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICApLnJlc291cmNlO1xuICAgIHRoaXMubG9hZEJhbGFuY2VyQXJucyA9IHRoaXMucmVzb3VyY2UubG9hZEJhbGFuY2VyQXJucy50b1N0cmluZygpO1xuICAgIHRoaXMudGFyZ2V0R3JvdXBOYW1lID0gdGhpcy5yZXNvdXJjZS5uYW1lO1xuICAgIHRoaXMuZGVmYXVsdFBvcnQgPSBhZGRpdGlvbmFsUHJvcHMucG9ydCA/PyA4MDsgLy8gVE9ETzogVGhpcyBpcyBidWcgaW4gQVdTQ0RLIGFzIGl0IGNhbiBiZSB1bmRlZmluZWQuXG4gICAgdGhpcy5wcm90b2NvbFZlcnNpb24gPSBhZGRpdGlvbmFsUHJvcHM/LnByb3RvY29sVmVyc2lvbjtcblxuICAgIHRoaXMubm9kZS5hZGRWYWxpZGF0aW9uKHsgdmFsaWRhdGU6ICgpID0+IHRoaXMudmFsaWRhdGVIZWFsdGhDaGVjaygpIH0pO1xuICAgIHRoaXMubm9kZS5hZGRWYWxpZGF0aW9uKHsgdmFsaWRhdGU6ICgpID0+IHRoaXMudmFsaWRhdGVUYXJnZXRHcm91cCgpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgY29uc3RydWN0cyB0aGF0IG5lZWQgdG8gYmUgZGVwZW5kZWQgb24gdG8gZW5zdXJlIHRoZSBUYXJnZXRHcm91cCBpcyBhc3NvY2lhdGVkIHRvIGEgbG9hZCBiYWxhbmNlclxuICAgKi9cbiAgcHVibGljIGdldCBsb2FkQmFsYW5jZXJBdHRhY2hlZCgpOiBJRGVwZW5kYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZEJhbGFuY2VyQXR0YWNoZWREZXBlbmRlbmNpZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0L3JlcGxhY2UgdGhlIHRhcmdldCBncm91cCdzIGhlYWx0aCBjaGVja1xuICAgKi9cbiAgcHVibGljIGNvbmZpZ3VyZUhlYWx0aENoZWNrKGhlYWx0aENoZWNrOiBIZWFsdGhDaGVjaykge1xuICAgIHRoaXMuaGVhbHRoQ2hlY2sgPSBoZWFsdGhDaGVjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBBV1MgQ0RLIHNwZWNpZmljIHdheSBvZiBzZXR0aW5nIG5vbi1zdGFuZGFyZCBhdHRyaWJ1dGUgb24gdGhlIHRhcmdldCBncm91cFxuICAgKlxuICAgKiBQcmVmZXIgdG8gdXNlIGRlZGljYXRlZCBtZXRob2RzIGxpa2UgYGNvbmZpZ3VyZUhlYWx0aENoZWNrYCBvciBgc2V0QXR0cmlidXRlYFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lbGFzdGljbG9hZGJhbGFuY2luZy9sYXRlc3QvYXBwbGljYXRpb24vbG9hZC1iYWxhbmNlci10YXJnZXQtZ3JvdXBzLmh0bWwjdGFyZ2V0LWdyb3VwLWF0dHJpYnV0ZXNcbiAgICovXG4gIHB1YmxpYyBzZXRBdHRyaWJ1dGUoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmF0dHJpYnV0ZXNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHRoZSBnaXZlbiBsb2FkIGJhbGFuY2luZyB0YXJnZXQgYXMgcGFydCBvZiB0aGlzIGdyb3VwXG4gICAqL1xuICBwcm90ZWN0ZWQgYWRkTG9hZEJhbGFuY2VyVGFyZ2V0KHByb3BzOiBMb2FkQmFsYW5jZXJUYXJnZXRQcm9wcykge1xuICAgIGlmICh0aGlzLnRhcmdldFR5cGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnRhcmdldFR5cGUgIT09IHByb3BzLnRhcmdldFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFscmVhZHkgaGF2ZSBhIG9mIHR5cGUgJyR7dGhpcy50YXJnZXRUeXBlfScsIGFkZGluZyAnJHtwcm9wcy50YXJnZXRUeXBlfSc7IG1ha2UgYWxsIHRhcmdldHMgdGhlIHNhbWUgdHlwZS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy50YXJnZXRUeXBlID0gcHJvcHMudGFyZ2V0VHlwZTtcblxuICAgIGlmICh0aGlzLnRhcmdldFR5cGUgPT09IFRhcmdldFR5cGUuTEFNQkRBICYmIHRoaXMudGFyZ2V0c0pzb24ubGVuZ3RoID49IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUYXJnZXRHcm91cCBjYW4gb25seSBjb250YWluIG9uZSBMQU1CREEgdGFyZ2V0LiBDcmVhdGUgYSBuZXcgVGFyZ2V0R3JvdXAuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy50YXJnZXRKc29uKSB7XG4gICAgICB0aGlzLnRhcmdldHNKc29uLnB1c2gocHJvcHMudGFyZ2V0SnNvbik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHZhbGlkYXRlVGFyZ2V0R3JvdXAoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJldCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBpZiAodGhpcy50YXJnZXRUeXBlID09PSB1bmRlZmluZWQgJiYgdGhpcy50YXJnZXRzSnNvbi5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFwiQGF3cy1jZGsvYXdzLWVsYnYyOnRhcmdldEdyb3VwU3BlY2lmeVRhcmdldFR5cGVGb3JFbXB0eVRhcmdldEdyb3VwXCIsXG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKFxuICAgICAgICBcIldoZW4gY3JlYXRpbmcgYW4gZW1wdHkgVGFyZ2V0R3JvdXAsIHlvdSBzaG91bGQgc3BlY2lmeSBhICd0YXJnZXRUeXBlJyAodGhpcyB3YXJuaW5nIG1heSBiZWNvbWUgYW4gZXJyb3IgaW4gdGhlIGZ1dHVyZSkuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldFR5cGUgIT09IFRhcmdldFR5cGUuTEFNQkRBICYmIHRoaXMudnBjID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldC5wdXNoKFwiJ3ZwYycgaXMgcmVxdWlyZWQgZm9yIGEgbm9uLUxhbWJkYSBUYXJnZXRHcm91cFwiKTtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWxhc3RpY2xvYWRiYWxhbmNpbmd2Mi10YXJnZXRncm91cC5odG1sI2Nmbi1lbGFzdGljbG9hZGJhbGFuY2luZ3YyLXRhcmdldGdyb3VwLW5hbWVcbiAgICBjb25zdCB0YXJnZXRHcm91cE5hbWUgPSB0aGlzLnJlc291cmNlLm5hbWVJbnB1dDtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZCh0YXJnZXRHcm91cE5hbWUpICYmIHRhcmdldEdyb3VwTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGFyZ2V0R3JvdXBOYW1lLmxlbmd0aCA+IDMyKSB7XG4gICAgICAgIHJldC5wdXNoKFxuICAgICAgICAgIGBUYXJnZXQgZ3JvdXAgbmFtZTogXCIke3RhcmdldEdyb3VwTmFtZX1cIiBjYW4gaGF2ZSBhIG1heGltdW0gb2YgMzIgY2hhcmFjdGVycy5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRhcmdldEdyb3VwTmFtZS5zdGFydHNXaXRoKFwiLVwiKSB8fCB0YXJnZXRHcm91cE5hbWUuZW5kc1dpdGgoXCItXCIpKSB7XG4gICAgICAgIHJldC5wdXNoKFxuICAgICAgICAgIGBUYXJnZXQgZ3JvdXAgbmFtZTogXCIke3RhcmdldEdyb3VwTmFtZX1cIiBtdXN0IG5vdCBiZWdpbiBvciBlbmQgd2l0aCBhIGh5cGhlbi5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCEvXlswLTlhLXotXSskL2kudGVzdCh0YXJnZXRHcm91cE5hbWUpKSB7XG4gICAgICAgIHJldC5wdXNoKFxuICAgICAgICAgIGBUYXJnZXQgZ3JvdXAgbmFtZTogXCIke3RhcmdldEdyb3VwTmFtZX1cIiBtdXN0IGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvciBoeXBoZW5zLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUhlYWx0aENoZWNrKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgaW50ZXJ2YWxTZWNvbmRzID0gdGhpcy5oZWFsdGhDaGVjay5pbnRlcnZhbD8udG9TZWNvbmRzKCk7XG4gICAgY29uc3QgdGltZW91dFNlY29uZHMgPSB0aGlzLmhlYWx0aENoZWNrLnRpbWVvdXQ/LnRvU2Vjb25kcygpO1xuXG4gICAgaWYgKGludGVydmFsU2Vjb25kcyAmJiB0aW1lb3V0U2Vjb25kcykge1xuICAgICAgaWYgKGludGVydmFsU2Vjb25kcyA8IHRpbWVvdXRTZWNvbmRzKSB7XG4gICAgICAgIC8vIDwgaW5zdGVhZCBvZiA8PSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9wdWxsLzI2MDMxXG4gICAgICAgIHJldC5wdXNoKFxuICAgICAgICAgIFwiSGVhbHRoIGNoZWNrIGludGVydmFsIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB0aW1lb3V0OyByZWNlaXZlZCBpbnRlcnZhbCBcIiArXG4gICAgICAgICAgICBgJHtpbnRlcnZhbFNlY29uZHN9LCB0aW1lb3V0ICR7dGltZW91dFNlY29uZHN9LmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcml2YXRlIGxhenlTdHJpbmdBdHRyKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIExhenkuc3RyaW5nVmFsdWUoe1xuICAgICAgcHJvZHVjZTogKCkgPT4gdGhpcy5hdHRyaWJ1dGVzW2tleV0sXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBsYXp5Qm9vbEF0dHIoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gTGF6eS5hbnlWYWx1ZSh7XG4gICAgICBwcm9kdWNlOiAoKSA9PiBsb29rdXBCb29sQXR0cmlidXRlKHRoaXMuYXR0cmlidXRlcywga2V5KSxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGxhenlOdW1iZXJBdHRyKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIExhenkubnVtYmVyVmFsdWUoe1xuICAgICAgcHJvZHVjZTogKCkgPT4gbG9va3VwTnVtYmVyQXR0cmlidXRlKHRoaXMuYXR0cmlidXRlcywga2V5KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHJlc291cmNlIHRvIHRoZSB0ZXJyYWZvcm0gSlNPTiBvdXRwdXQuXG4gICAqXG4gICAqIGNhbGxlZCBieSBUZXJyYWZvcm1TdGFjay5wcmVwYXJlU3RhY2soKVxuICAgKi9cbiAgcHVibGljIHRvVGVycmFmb3JtKCk6IGFueSB7XG4gICAgLy8gVE9ETzogU3dpdGNoIGZyb20gcHJvdmlkZXItYXdzIHRvIHByb3ZpZGVyLWF3c2NjIGFuZCB1c2UgTGF6eVZhbHVlP1xuICAgIC8vIGluc3RlYWQgb2YgaW5saW5lIExhenlWYWx1ZSwgd2UgdXNlIHByZXBhcmVTdGFjaygpIHRvIHN5bnRoIGFkZGl0aW9uYWwgcmVzb3VyY2VzXG4gICAgLy8gdGFyZ2V0czogTGF6eS5hbnlWYWx1ZShcbiAgICAvLyAgIHsgcHJvZHVjZTogKCkgPT4gdGhpcy50YXJnZXRzSnNvbiB9LFxuICAgIC8vICAgeyBvbWl0RW1wdHlBcnJheTogdHJ1ZSB9LFxuICAgIC8vICksXG5cbiAgICAvLyBwdXQgcHV0U3RpY2tpbmVzcyBpZiBhdHRyaWJ1dGVzIGFyZSBzZXRcbiAgICBjb25zdCBzdGlja2luZXNzRW5hYmxlZCA9IGxvb2t1cEJvb2xBdHRyaWJ1dGUoXG4gICAgICB0aGlzLmF0dHJpYnV0ZXMsXG4gICAgICBBdHRyaWJ1dGUuc3RpY2tpbmVzc0VuYWJsZWQsXG4gICAgKTtcbiAgICBjb25zdCBzdGlja2luZXNzQXBwQ29va2llRHVyYXRpb24gPSBsb29rdXBOdW1iZXJBdHRyaWJ1dGUoXG4gICAgICB0aGlzLmF0dHJpYnV0ZXMsXG4gICAgICBBdHRyaWJ1dGUuc3RpY2tpbmVzc0FwcENvb2tpZUR1cmF0aW9uU2Vjb25kcyxcbiAgICApO1xuICAgIGNvbnN0IHN0aWNraW5lc3NMQkNvb2tpZUR1cmF0aW9uID0gbG9va3VwTnVtYmVyQXR0cmlidXRlKFxuICAgICAgdGhpcy5hdHRyaWJ1dGVzLFxuICAgICAgQXR0cmlidXRlLnN0aWNraW5lc3NMQkNvb2tpZUR1cmF0aW9uU2Vjb25kcyxcbiAgICApO1xuICAgIGNvbnN0IHN0aWNraW5lc3NDb29raWVOYW1lID0gbG9va3VwU3RyaW5nQXR0cmlidXRlKFxuICAgICAgdGhpcy5hdHRyaWJ1dGVzLFxuICAgICAgQXR0cmlidXRlLnN0aWNraW5lc3NBcHBDb29raWVDb29raWVOYW1lLFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgKHN0aWNraW5lc3NFbmFibGVkICE9PSB1bmRlZmluZWQgJiYgc3RpY2tpbmVzc0VuYWJsZWQgIT09IGZhbHNlKSB8fFxuICAgICAgc3RpY2tpbmVzc0FwcENvb2tpZUR1cmF0aW9uICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHN0aWNraW5lc3NMQkNvb2tpZUR1cmF0aW9uICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHN0aWNraW5lc3NDb29raWVOYW1lICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIC8vIHBvc3NpYmxlIHZhbHVlcyBmb3IgQUxCIGFyZSBgbGJfY29va2llYCBvciBgYXBwX2Nvb2tpZWBcbiAgICAgIC8vIG9ubHkgcG9zc2libGUgdmFsdWUgZm9yIE5MQiBpcyBgc291cmNlX2lwYFxuICAgICAgLy8gcG9zc2libGUgdmFsdWVzIGZvciBHV0xCIGFyZSBgc291cmNlX2lwX2Rlc3RfaXBgIG9yIGBzb3VyY2VfaXBfZGVzdF9pcF9wcm90b2BcbiAgICAgIGNvbnN0IHR5cGUgPSBsb29rdXBTdHJpbmdBdHRyaWJ1dGUoXG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyxcbiAgICAgICAgQXR0cmlidXRlLnN0aWNraW5lc3NUeXBlLFxuICAgICAgKTtcbiAgICAgIC8vIHRmIHJlcXVpcmVzIHR5cGUgdG8gYmUgc2V0XG4gICAgICBpZiAoIXR5cGUpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcInN0aWNraW5lc3MudHlwZSBpcyByZXF1aXJlZCBpZiBhbnkgc3RpY2tpbmVzcyBhdHRyaWJ1dGUgaXMgc2V0XCIsXG4gICAgICAgICk7XG4gICAgICB0aGlzLnJlc291cmNlLnB1dFN0aWNraW5lc3Moe1xuICAgICAgICB0eXBlLFxuICAgICAgICBlbmFibGVkOiBsb29rdXBCb29sQXR0cmlidXRlKFxuICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyxcbiAgICAgICAgICBBdHRyaWJ1dGUuc3RpY2tpbmVzc0VuYWJsZWQsXG4gICAgICAgICksXG4gICAgICAgIGNvb2tpZUR1cmF0aW9uOlxuICAgICAgICAgIHR5cGUgPT09IFwibGJfY29va2llXCJcbiAgICAgICAgICAgID8gc3RpY2tpbmVzc0xCQ29va2llRHVyYXRpb25cbiAgICAgICAgICAgIDogc3RpY2tpbmVzc0FwcENvb2tpZUR1cmF0aW9uLFxuICAgICAgICAvLyBhcHBfY29va2llIGF0dHJpYnV0ZXNcbiAgICAgICAgY29va2llTmFtZTogbG9va3VwU3RyaW5nQXR0cmlidXRlKFxuICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyxcbiAgICAgICAgICBBdHRyaWJ1dGUuc3RpY2tpbmVzc0FwcENvb2tpZUNvb2tpZU5hbWUsXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSFRUUCBvciBnUlBDIGNvZGVzIHRvIHVzZSB3aGVuIGNoZWNraW5nIGZvciBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBhIHRhcmdldC5cbiAgICAgKiBUaGUgYGhlYWx0aF9jaGVjay5wcm90b2NvbGAgbXVzdCBiZSBvbmUgb2YgSFRUUCBvciBIVFRQUyBvciB0aGUgYHRhcmdldF90eXBlYCBtdXN0IGJlIGxhbWJkYS5cbiAgICAgKiBWYWx1ZXMgY2FuIGJlIGNvbW1hLXNlcGFyYXRlZCBpbmRpdmlkdWFsIHZhbHVlcyAoZS5nLiwgXCIyMDAsMjAyXCIpIG9yIGEgcmFuZ2Ugb2ZcbiAgICAgKiB2YWx1ZXMgKGUuZy4sIFwiMjAwLTI5OVwiKS5cbiAgICAgKlxuICAgICAqIC0gRm9yIGdSUEMtYmFzZWQgdGFyZ2V0IGdyb3VwcyAoaS5lLiwgdGhlIHByb3RvY29sIGlzIG9uZSBvZiBIVFRQIG9yIEhUVFBTIGFuZCB0aGVcbiAgICAgKiAgIGBwcm90b2NvbF92ZXJzaW9uYCBpcyBHUlBDKSwgdmFsdWVzIGNhbiBiZSBiZXR3ZWVuIDAgYW5kIDk5LiBUaGUgZGVmYXVsdCBpcyAxMi5cbiAgICAgKiAtIFdoZW4gdXNlZCB3aXRoIGFuIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIgKGkuZS4sIHRoZSBwcm90b2NvbCBpcyBvbmUgb2YgSFRUUFxuICAgICAqICAgb3IgSFRUUFMgYW5kIHRoZSBgcHJvdG9jb2xfdmVyc2lvbmAgaXMgbm90IEdSUEMpLCB2YWx1ZXMgY2FuIGJlIGJldHdlZW4gMjAwIGFuZCA0OTkuXG4gICAgICogICBUaGUgZGVmYXVsdCBpcyAyMDAuXG4gICAgICogLSBXaGVuIHVzZWQgd2l0aCBhIE5ldHdvcmsgTG9hZCBCYWxhbmNlciAoaS5lLiwgdGhlIHByb3RvY29sIGlzIG9uZSBvZiBUQ1AsIFRDUF9VRFAsIFVEUCwgb3IgVExTKSxcbiAgICAgKiAgIHZhbHVlcyBjYW4gYmUgYmV0d2VlbiAyMDAgYW5kIDU5OS4gVGhlIGRlZmF1bHQgaXMgMjAwLTM5OS5cbiAgICAgKiAtIFdoZW4gdGhlIHRhcmdldF90eXBlIGlzIGxhbWJkYSwgdmFsdWVzIGNhbiBiZSBiZXR3ZWVuIDIwMCBhbmQgNDk5LiBUaGUgZGVmYXVsdCBpcyAyMDAuXG4gICAgICpcbiAgICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuODguMC9kb2NzL3Jlc291cmNlcy9sYl90YXJnZXRfZ3JvdXAjbWF0Y2hlci0xIExiVGFyZ2V0R3JvdXAjbWF0Y2hlcn1cbiAgICAgKi9cbiAgICBsZXQgbWF0Y2hlciA9IHRoaXMuaGVhbHRoQ2hlY2s/LmhlYWx0aHlIdHRwQ29kZXM7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wcm90b2NvbFZlcnNpb24gPT09IFwiR1JQQ1wiICYmXG4gICAgICB0aGlzLmhlYWx0aENoZWNrPy5oZWFsdGh5R3JwY0NvZGVzICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIG1hdGNoZXIgPSB0aGlzLmhlYWx0aENoZWNrLmhlYWx0aHlHcnBjQ29kZXM7XG4gICAgfVxuXG4gICAgLy8gcHV0IEhlYWx0aENoZWNrIGlmIGF0dHJpYnV0ZXMgYXJlIHNldFxuICAgIHRoaXMucmVzb3VyY2UucHV0SGVhbHRoQ2hlY2soe1xuICAgICAgZW5hYmxlZDogdGhpcy5oZWFsdGhDaGVjaz8uZW5hYmxlZCxcbiAgICAgIGludGVydmFsOiB0aGlzLmhlYWx0aENoZWNrPy5pbnRlcnZhbD8udG9TZWNvbmRzKCksXG4gICAgICBwYXRoOiB0aGlzLmhlYWx0aENoZWNrPy5wYXRoLFxuICAgICAgcG9ydDogdGhpcy5oZWFsdGhDaGVjaz8ucG9ydCxcbiAgICAgIHByb3RvY29sOiB0aGlzLmhlYWx0aENoZWNrPy5wcm90b2NvbCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuaGVhbHRoQ2hlY2s/LnRpbWVvdXQ/LnRvU2Vjb25kcygpLFxuICAgICAgaGVhbHRoeVRocmVzaG9sZDogdGhpcy5oZWFsdGhDaGVjaz8uaGVhbHRoeVRocmVzaG9sZENvdW50LFxuICAgICAgdW5oZWFsdGh5VGhyZXNob2xkOiB0aGlzLmhlYWx0aENoZWNrPy51bmhlYWx0aHlUaHJlc2hvbGRDb3VudCxcbiAgICAgIG1hdGNoZXIsXG4gICAgfSk7XG5cbiAgICAvLyBwdXQgdGFyZ2V0R3JvdXBIZWFsdGggaWYgYXR0cmlidXRlcyBhcmUgc2V0XG4gICAgY29uc3QgZG5zRmFpbG92ZXI6IHRmVGFyZ2V0R3JvdXAuTGJUYXJnZXRHcm91cFRhcmdldEdyb3VwSGVhbHRoRG5zRmFpbG92ZXIgPVxuICAgICAge1xuICAgICAgICBtaW5pbXVtSGVhbHRoeVRhcmdldHNDb3VudDogbG9va3VwU3RyaW5nQXR0cmlidXRlKFxuICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyxcbiAgICAgICAgICBBdHRyaWJ1dGUudGFyZ2V0R3JvdXBIZWFsdGhETlNGYWlsb3Zlck1pbmltdW1IZWFsdGh5VGFyZ2V0c0NvdW50LFxuICAgICAgICApLFxuICAgICAgICBtaW5pbXVtSGVhbHRoeVRhcmdldHNQZXJjZW50YWdlOiBsb29rdXBTdHJpbmdBdHRyaWJ1dGUoXG4gICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLFxuICAgICAgICAgIEF0dHJpYnV0ZS50YXJnZXRHcm91cEhlYWx0aEROU0ZhaWxvdmVyTWluaW11bUhlYWx0aHlUYXJnZXRzUGVyY2VudGFnZSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgY29uc3QgdW5oZWFsdGh5U3RhdGVSb3V0aW5nOiB0ZlRhcmdldEdyb3VwLkxiVGFyZ2V0R3JvdXBUYXJnZXRHcm91cEhlYWx0aFVuaGVhbHRoeVN0YXRlUm91dGluZyA9XG4gICAgICB7XG4gICAgICAgIG1pbmltdW1IZWFsdGh5VGFyZ2V0c0NvdW50OiBsb29rdXBOdW1iZXJBdHRyaWJ1dGUoXG4gICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLFxuICAgICAgICAgIEF0dHJpYnV0ZS50YXJnZXRHcm91cEhlYWx0aFVuaGVhbHRoeVN0YXRlUm91dGluZ01pbmltdW1IZWFsdGh5VGFyZ2V0c0NvdW50LFxuICAgICAgICApLFxuICAgICAgICBtaW5pbXVtSGVhbHRoeVRhcmdldHNQZXJjZW50YWdlOiBsb29rdXBTdHJpbmdBdHRyaWJ1dGUoXG4gICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLFxuICAgICAgICAgIEF0dHJpYnV0ZS50YXJnZXRHcm91cEhlYWx0aFVuaGVhbHRoeVN0YXRlUm91dGluZ01pbmltdW1IZWFsdGh5VGFyZ2V0c1BlcmNlbnRhZ2UsXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIHRoaXMucmVzb3VyY2UucHV0VGFyZ2V0R3JvdXBIZWFsdGgoe1xuICAgICAgZG5zRmFpbG92ZXIsIC8vIFRPRE86IHNob3VsZCBiZSB1bmRlZmluZWQgaWYgYWxsIG9iamVjdCBrZXlzIGFyZSB1bmRlZmluZWRcbiAgICAgIHVuaGVhbHRoeVN0YXRlUm91dGluZywgLy8gVE9ETzogc2hvdWxkIGJlIHVuZGVmaW5lZCBpZiBhbGwgb2JqZWN0IGtleXMgYXJlIHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgLy8gYWRkIGxiVGFyZ2V0R3JvdXBBdHRhY2htZW50IHJlc291cmNlIGZvciBlYWNoIHRhcmdldFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50YXJnZXRzSnNvbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaWQgPSBgQXR0YWNobWVudCR7aX1gO1xuICAgICAgLy8gVE9ETzogSWRlYWxseSB3ZSBzaG91bGQgaGF2ZSB1c2VkIElSZXNvbHZhYmxlLnJlc29sdmUgYW5kIHVzZSB0aGUgSVJlc29sdmVDb250ZXh0LnByZXBhcmluZyBmbGFnXG4gICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE3MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1pYW0vbGliL3BvbGljeS1kb2N1bWVudC50cyNMNDhcbiAgICAgIGlmICh0aGlzLm5vZGUudHJ5RmluZENoaWxkKGlkKSkgY29udGludWU7IC8vIGlnbm9yZSBpZiBhbHJlYWR5IGdlbmVyYXRlZFxuXG4gICAgICBuZXcgdGZUYXJnZXRHcm91cEF0dGFjaG1lbnQuTGJUYXJnZXRHcm91cEF0dGFjaG1lbnQodGhpcywgaWQsIHtcbiAgICAgICAgdGFyZ2V0R3JvdXBBcm46IHRoaXMucmVzb3VyY2UuYXJuLFxuICAgICAgICB0YXJnZXRJZDogdGhpcy50YXJnZXRzSnNvbltpXS50YXJnZXRJZCxcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogdGhpcy50YXJnZXRzSnNvbltpXS5hdmFpbGFiaWxpdHlab25lLFxuICAgICAgICBwb3J0OiB0aGlzLnRhcmdldHNKc29uW2ldLnBvcnQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byByZWZlcmVuY2UgYW4gZXhpc3RpbmcgdGFyZ2V0IGdyb3VwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFyZ2V0R3JvdXBBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIEFSTiBvZiB0aGUgdGFyZ2V0IGdyb3VwXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRHcm91cEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQb3J0IHRhcmdldCBncm91cCBpcyBsaXN0ZW5pbmcgb25cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgLSBUaGlzIHByb3BlcnR5IGlzIHVudXNlZCBhbmQgdGhlIHdyb25nIHR5cGUuIE5vIG5lZWQgdG8gdXNlIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFBvcnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgVG9rZW4gcmVwcmVzZW50aW5nIHRoZSBsaXN0IG9mIEFSTnMgZm9yIHRoZSBsb2FkIGJhbGFuY2VyIHJvdXRpbmcgdG8gdGhpcyB0YXJnZXQgZ3JvdXBcbiAgICovXG4gIHJlYWRvbmx5IGxvYWRCYWxhbmNlckFybnM/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byByZWZlcmVuY2UgYW4gZXhpc3RpbmcgdGFyZ2V0IGdyb3VwXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFRhcmdldEdyb3VwQXR0cmlidXRlcyBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFyZ2V0R3JvdXBJbXBvcnRQcm9wcyBleHRlbmRzIFRhcmdldEdyb3VwQXR0cmlidXRlcyB7fVxuXG4vKipcbiAqIEEgdGFyZ2V0IGdyb3VwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVRhcmdldEdyb3VwIGV4dGVuZHMgSUNvbnN0cnVjdCB7XG4gIC8vIFRPRE86IEV4dGVuZCBJQXdzQ29uc3RydWN0IGluc3RlYWQ/XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGdyb3VwXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRHcm91cE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQVJOIG9mIHRoZSB0YXJnZXQgZ3JvdXBcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEdyb3VwQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdG9rZW4gcmVwcmVzZW50aW5nIGEgbGlzdCBvZiBBUk5zIG9mIHRoZSBsb2FkIGJhbGFuY2VycyB0aGF0IHJvdXRlIHRyYWZmaWMgdG8gdGhpcyB0YXJnZXQgZ3JvdXBcbiAgICovXG4gIHJlYWRvbmx5IGxvYWRCYWxhbmNlckFybnM6IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJuIGFuIG9iamVjdCB0byBkZXBlbmQgb24gdGhlIGxpc3RlbmVycyBhZGRlZCB0byB0aGlzIHRhcmdldCBncm91cFxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2VyQXR0YWNoZWQ6IElEZXBlbmRhYmxlO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhdHRhY2hpbmcgYSB0YXJnZXQgdG8gbG9hZCBiYWxhbmNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRCYWxhbmNlclRhcmdldFByb3BzIHtcbiAgLyoqXG4gICAqIFdoYXQga2luZCBvZiB0YXJnZXQgdGhpcyBpc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0VHlwZTogVGFyZ2V0VHlwZTtcblxuICAvKipcbiAgICogSlNPTiByZXByZXNlbnRpbmcgdGhlIHRhcmdldCdzIGRpcmVjdCBhZGRpdGlvbiB0byB0aGUgVGFyZ2V0R3JvdXAgbGlzdFxuICAgKlxuICAgKiBNYXkgYmUgb21pdHRlZCBpZiB0aGUgdGFyZ2V0IGlzIGdvaW5nIHRvIHJlZ2lzdGVyIGl0c2VsZiBsYXRlci5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEpzb24/OiBMYlRhcmdldEdyb3VwQXR0YWNobWVudENvbmZpZztcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBmdWxsIGxvYWQgYmFsYW5jZXIgbmFtZSAodXNlZCBmb3IgbWV0cmljcykgZnJvbSB0aGUgbGlzdGVuZXIgQVJOOlxuICpcbiAqIFR1cm5zXG4gKlxuICogICAgIGFybjphd3M6ZWxhc3RpY2xvYWRiYWxhbmNpbmc6dXMtd2VzdC0yOjEyMzQ1Njc4OTAxMjpsaXN0ZW5lci9hcHAvbXktbG9hZC1iYWxhbmNlci81MGRjNmM0OTVjMGM5MTg4L2YyZjdkYzhlZmM1MjJhYjJcbiAqXG4gKiBJbnRvXG4gKlxuICogICAgIGFwcC9teS1sb2FkLWJhbGFuY2VyLzUwZGM2YzQ5NWMwYzkxODhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRCYWxhbmNlck5hbWVGcm9tTGlzdGVuZXJBcm4obGlzdGVuZXJBcm46IHN0cmluZykge1xuICBjb25zdCBhcm5QYXJ0cyA9IEZuLnNwbGl0KFwiL1wiLCBsaXN0ZW5lckFybik7XG4gIHJldHVybiBgJHtGbi5lbGVtZW50KGFyblBhcnRzLCAxKX0vJHtGbi5lbGVtZW50KGFyblBhcnRzLCAyKX0vJHtGbi5lbGVtZW50KGFyblBhcnRzLCAzKX1gO1xufVxuIl19
|