aws-ddk-core
Version:
The AWS DataOps Development Kit is an open source development framework for customers that build data workflows and modern data architecture on AWS.
99 lines • 17.1 kB
JavaScript
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SqsToLambdaStage = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const cdk = require("aws-cdk-lib");
const cloudwatch = require("aws-cdk-lib/aws-cloudwatch");
const events_targets = require("aws-cdk-lib/aws-events-targets");
const iam = require("aws-cdk-lib/aws-iam");
const lambda = require("aws-cdk-lib/aws-lambda");
const lambda_event_sources = require("aws-cdk-lib/aws-lambda-event-sources");
const sqs = require("aws-cdk-lib/aws-sqs");
const stage_1 = require("../pipelines/stage");
/**
* Stage implements an Amazon SQS queue connected to an AWS Lambda function, with an optional DLQ.
*/
class SqsToLambdaStage extends stage_1.DataStage {
/**
* Constructs `SqsToLambdaStage`.
* @param scope Scope within which this construct is defined.
* @param id Identifier of the stage.
* @param props Properties for the stage.
*/
constructor(scope, id, props) {
super(scope, id, props);
const eventSource = `${id}-event-source`;
const eventDetailType = `${id}-event-type`;
if (props.lambdaFunction) {
this.function = props.lambdaFunction;
}
else if (props.lambdaFunctionProps) {
const functionProps = props.lambdaFunctionProps;
this.function = new lambda.Function(this, "Process Function", {
timeout: functionProps.timeout ?? cdk.Duration.seconds(120),
memorySize: functionProps.memorySize ?? 256,
environment: {
EVENT_SOURCE: eventSource,
EVENT_DETAIL_TYPE: eventDetailType,
...(functionProps.environment ?? {}),
},
...functionProps,
});
}
else {
throw TypeError("'lambdaFunction' or 'lambdaFunctionProps' must be set to instantiate this stage");
}
// Enable the function to publish events to the default EventBus
this.function.addToRolePolicy(new iam.PolicyStatement({
actions: ["events:PutEvents"],
resources: ["*"],
}));
const dlqEnabled = props.dlqEnabled ?? false;
if (dlqEnabled == true) {
this.deadLetterQueue = new sqs.Queue(this, "Dead Letter Queue", {
fifo: props.sqsQueueProps?.fifo ? props.sqsQueueProps?.fifo : undefined,
});
}
if (props.sqsQueue) {
this.queue = props.sqsQueue;
}
else {
this.queue = new sqs.Queue(this, "Queue", {
visibilityTimeout: props.sqsQueueProps?.visibilityTimeout ?? cdk.Duration.minutes(2),
deadLetterQueue: this.deadLetterQueue
? {
queue: this.deadLetterQueue,
maxReceiveCount: props.maxReceiveCount ?? 1,
}
: undefined,
fifo: props.sqsQueueProps?.fifo ? props.sqsQueueProps?.fifo : undefined,
...props.sqsQueueProps,
});
}
this.function.addEventSource(new lambda_event_sources.SqsEventSource(this.queue, {
batchSize: props.batchSize,
maxBatchingWindow: props.maxBatchingWindow,
}));
this.addAlarm("Process Function Errors", {
metric: this.function.metricErrors(),
threshold: props.lambdaFunctionProps?.errorsAlarmThreshold ?? 5,
evaluationPeriods: props.lambdaFunctionProps?.errorsEvaluationPeriods ?? 1,
comparisonOperator: props.lambdaFunctionProps?.errorsComparisonOperator ?? cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
});
this.eventPattern = {
source: [eventSource],
detailType: [eventDetailType],
};
if (this.queue.fifo && !props.messageGroupId) {
throw TypeError("'messageGroupId' must be set to when target is a fifo queue");
}
this.targets = this.queue.fifo
? [new events_targets.SqsQueue(this.queue, { messageGroupId: props.messageGroupId })]
: [new events_targets.SqsQueue(this.queue)];
}
}
exports.SqsToLambdaStage = SqsToLambdaStage;
_a = JSII_RTTI_SYMBOL_1;
SqsToLambdaStage[_a] = { fqn: "aws-ddk-core.SqsToLambdaStage", version: "1.4.1" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FzLWxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGFnZXMvc3FzLWxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFtQztBQUNuQyx5REFBeUQ7QUFFekQsaUVBQWlFO0FBQ2pFLDJDQUEyQztBQUMzQyxpREFBaUQ7QUFDakQsNkVBQTZFO0FBQzdFLDJDQUEyQztBQUUzQyw4Q0FBK0Q7QUE2RS9EOztHQUVHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSxpQkFBUztJQVE3Qzs7Ozs7T0FLRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNEI7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFLGVBQWUsQ0FBQztRQUN6QyxNQUFNLGVBQWUsR0FBRyxHQUFHLEVBQUUsYUFBYSxDQUFDO1FBRTNDLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRTtZQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7U0FDdEM7YUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsRUFBRTtZQUNwQyxNQUFNLGFBQWEsR0FBa0MsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1lBRS9FLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtnQkFDNUQsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUMzRCxVQUFVLEVBQUUsYUFBYSxDQUFDLFVBQVUsSUFBSSxHQUFHO2dCQUMzQyxXQUFXLEVBQUU7b0JBQ1gsWUFBWSxFQUFFLFdBQVc7b0JBQ3pCLGlCQUFpQixFQUFFLGVBQWU7b0JBQ2xDLEdBQUcsQ0FBQyxhQUFhLENBQUMsV0FBVyxJ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QUFDLElBQUk7WUFDNUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDckYsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7O0FBakdILDRDQWtHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCAqIGFzIGV2ZW50c190YXJnZXRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgKiBhcyBsYW1iZGFfZXZlbnRfc291cmNlcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ldmVudC1zb3VyY2VzXCI7XG5pbXBvcnQgKiBhcyBzcXMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zcXNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBEYXRhU3RhZ2UsIERhdGFTdGFnZVByb3BzIH0gZnJvbSBcIi4uL3BpcGVsaW5lcy9zdGFnZVwiO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBMYW1iZGEgRnVuY3Rpb24gY3JlYXRlZCBieSBgU3FzVG9MYW1iZGFTdGFnZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3FzVG9MYW1iZGFTdGFnZUZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBBbW91bnQgb2YgZXJyb3JlZCBmdW5jdGlvbiBpbnZvY2F0aW9ucyBiZWZvcmUgdHJpZ2dlcmluZyBDbG91ZFdhdGNoIGFsYXJtLlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICByZWFkb25seSBlcnJvcnNBbGFybVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcGVyaW9kcyBvdmVyIHdoaWNoIGRhdGEgaXMgY29tcGFyZWQgdG8gdGhlIHNwZWNpZmllZCB0aHJlc2hvbGQuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IGVycm9yc0V2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyO1xuICAvKipcbiAgICogQ29tcGFyaXNvbiBvcGVyYXRvciBmb3IgZXZhbHVhdGluZyBhbGFybXMuXG4gICAqIEBkZWZhdWx0IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTERcbiAgICovXG4gIHJlYWRvbmx5IGVycm9yc0NvbXBhcmlzb25PcGVyYXRvcj86IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGBTcXNUb0xhbWJkYVN0YWdlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcXNUb0xhbWJkYVN0YWdlUHJvcHMgZXh0ZW5kcyBEYXRhU3RhZ2VQcm9wcyB7XG4gIC8qKlxuICAgKiBQcmVleGlzdGluZyBMYW1iZGEgRnVuY3Rpb24gdG8gdXNlIGluIHN0YWdlLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGEgbmV3IGZ1bmN0aW9uIHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uPzogbGFtYmRhLklGdW5jdGlvbjtcbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgZm9yIHRoZSBMYW1iZGEgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhpcyBjb25zdHJ1Y3RcbiAgICogKGlmIGBsYW1iZGFGdW5jdGlvbmAgaXMgbm90IHByb3ZpZGVkKS5cbiAgICovXG4gIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uUHJvcHM/OiBTcXNUb0xhbWJkYVN0YWdlRnVuY3Rpb25Qcm9wcztcbiAgLyoqXG4gICAqIFByZWV4aXN0aW5nIFNRUyBRdWV1ZSB0byB1c2UgaW4gc3RhZ2UuXG4gICAqIElmIG5vdCBwcm92aWRlZCwgYSBuZXcgcXVldWUgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3FzUXVldWU/OiBzcXMuSVF1ZXVlO1xuICAvKipcbiAgICogUHJvcGVydGllcyBmb3IgdGhlIFNRUyBRdWV1ZSB0aGF0IHdpbGwgYmUgY3JlYXRlZCBieSB0aGlzIGNvbnN0cnVjdFxuICAgKiAoaWYgYHNxc1F1ZXVlYCBpcyBub3QgcHJvdmlkZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgc3FzUXVldWVQcm9wcz86IHNxcy5RdWV1ZVByb3BzO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVjb3JkcyByZXRyaWV2ZWQgZnJvbSB0aGUgZXZlbnQgc291cmNlIGF0IHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIHRpbWUuXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICByZWFkb25seSBiYXRjaFNpemU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byBnYXRoZXIgcmVjb3JkcyBiZWZvcmUgaW52b2tpbmcgdGhlIGZ1bmN0aW9uLlxuICAgKiBWYWxpZCBSYW5nZTogTWluaW11bSB2YWx1ZSBvZiAwIG1pbnV0ZXMsIG1heGltdW0gdmFsdWUgb2YgNSBtaW51dGVzLlxuICAgKiBEZWZhdWx0OiAtIG5vIGJhdGNoaW5nIHdpbmRvdy5cbiAgICovXG4gIHJlYWRvbmx5IG1heEJhdGNoaW5nV2luZG93PzogY2RrLkR1cmF0aW9uO1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBETFEgaXMgZW5hYmxlZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRscUVuYWJsZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiB0aW1lcyBhIG1lc3NhZ2UgY2FuIGJlIHVuc3VjY2Vzc2Z1bGx5IGRlcXVldWVkIGJlZm9yZVxuICAgKiBiZWluZyBtb3ZlZCB0byB0aGUgZGVhZC1sZXR0ZXIgcXVldWUuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IG1heFJlY2VpdmVDb3VudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1lc3NhZ2UgR3JvdXAgSUQgZm9yIG1lc3NhZ2VzIHNlbnQgdG8gdGhpcyBxdWV1ZS5cbiAgICogUmVxdWlyZWQgZm9yIEZJRk8gcXVldWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZUdyb3VwSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RhZ2UgaW1wbGVtZW50cyBhbiBBbWF6b24gU1FTIHF1ZXVlIGNvbm5lY3RlZCB0byBhbiBBV1MgTGFtYmRhIGZ1bmN0aW9uLCB3aXRoIGFuIG9wdGlvbmFsIERMUS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNxc1RvTGFtYmRhU3RhZ2UgZXh0ZW5kcyBEYXRhU3RhZ2Uge1xuICByZWFkb25seSB0YXJnZXRzPzogZXZlbnRzLklSdWxlVGFyZ2V0W107XG4gIHJlYWRvbmx5IGV2ZW50UGF0dGVybj86IGV2ZW50cy5FdmVudFBhdHRlcm47XG5cbiAgcmVhZG9ubHkgZnVuY3Rpb246IGxhbWJkYS5JRnVuY3Rpb247XG4gIHJlYWRvbmx5IHF1ZXVlOiBzcXMuSVF1ZXVlO1xuICByZWFkb25seSBkZWFkTGV0dGVyUXVldWU/OiBzcXMuUXVldWU7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYFNxc1RvTGFtYmRhU3RhZ2VgLlxuICAgKiBAcGFyYW0gc2NvcGUgU2NvcGUgd2l0aGluIHdoaWNoIHRoaXMgY29uc3RydWN0IGlzIGRlZmluZWQuXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGFnZS5cbiAgICogQHBhcmFtIHByb3BzIFByb3BlcnRpZXMgZm9yIHRoZSBzdGFnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTcXNUb0xhbWJkYVN0YWdlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gYCR7aWR9LWV2ZW50LXNvdXJjZWA7XG4gICAgY29uc3QgZXZlbnREZXRhaWxUeXBlID0gYCR7aWR9LWV2ZW50LXR5cGVgO1xuXG4gICAgaWYgKHByb3BzLmxhbWJkYUZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLmZ1bmN0aW9uID0gcHJvcHMubGFtYmRhRnVuY3Rpb247XG4gICAgfSBlbHNlIGlmIChwcm9wcy5sYW1iZGFGdW5jdGlvblByb3BzKSB7XG4gICAgICBjb25zdCBmdW5jdGlvblByb3BzOiBTcXNUb0xhbWJkYVN0YWdlRnVuY3Rpb25Qcm9wcyA9IHByb3BzLmxhbWJkYUZ1bmN0aW9uUHJvcHM7XG5cbiAgICAgIHRoaXMuZnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIFwiUHJvY2VzcyBGdW5jdGlvblwiLCB7XG4gICAgICAgIHRpbWVvdXQ6IGZ1bmN0aW9uUHJvcHMudGltZW91dCA/PyBjZGsuRHVyYXRpb24uc2Vjb25kcygxMjApLFxuICAgICAgICBtZW1vcnlTaXplOiBmdW5jdGlvblByb3BzLm1lbW9yeVNpemUgPz8gMjU2LFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIEVWRU5UX1NPVVJDRTogZXZlbnRTb3VyY2UsXG4gICAgICAgICAgRVZFTlRfREVUQUlMX1RZUEU6IGV2ZW50RGV0YWlsVHlwZSxcbiAgICAgICAgICAuLi4oZnVuY3Rpb25Qcm9wcy5lbnZpcm9ubWVudCA/PyB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmZ1bmN0aW9uUHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiJ2xhbWJkYUZ1bmN0aW9uJyBvciAnbGFtYmRhRnVuY3Rpb25Qcm9wcycgbXVzdCBiZSBzZXQgdG8gaW5zdGFudGlhdGUgdGhpcyBzdGFnZVwiKTtcbiAgICB9XG5cbiAgICAvLyBFbmFibGUgdGhlIGZ1bmN0aW9uIHRvIHB1Ymxpc2ggZXZlbnRzIHRvIHRoZSBkZWZhdWx0IEV2ZW50QnVzXG4gICAgdGhpcy5mdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcImV2ZW50czpQdXRFdmVudHNcIl0sXG4gICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBkbHFFbmFibGVkID0gcHJvcHMuZGxxRW5hYmxlZCA/PyBmYWxzZTtcbiAgICBpZiAoZGxxRW5hYmxlZCA9PSB0cnVlKSB7XG4gICAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZSA9IG5ldyBzcXMuUXVldWUodGhpcywgXCJEZWFkIExldHRlciBRdWV1ZVwiLCB7XG4gICAgICAgIGZpZm86IHByb3BzLnNxc1F1ZXVlUHJvcHM/LmZpZm8gPyBwcm9wcy5zcXNRdWV1ZVByb3BzPy5maWZvIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnNxc1F1ZXVlKSB7XG4gICAgICB0aGlzLnF1ZXVlID0gcHJvcHMuc3FzUXVldWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucXVldWUgPSBuZXcgc3FzLlF1ZXVlKHRoaXMsIFwiUXVldWVcIiwge1xuICAgICAgICB2aXNpYmlsaXR5VGltZW91dDogcHJvcHMuc3FzUXVldWVQcm9wcz8udmlzaWJpbGl0eVRpbWVvdXQgPz8gY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMiksXG4gICAgICAgIGRlYWRMZXR0ZXJRdWV1ZTogdGhpcy5kZWFkTGV0dGVyUXVldWVcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgcXVldWU6IHRoaXMuZGVhZExldHRlclF1ZXVlLFxuICAgICAgICAgICAgICBtYXhSZWNlaXZlQ291bnQ6IHByb3BzLm1heFJlY2VpdmVDb3VudCA/PyAxLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBmaWZvOiBwcm9wcy5zcXNRdWV1ZVByb3BzPy5maWZvID8gcHJvcHMuc3FzUXVldWVQcm9wcz8uZmlmbyA6IHVuZGVmaW5lZCxcbiAgICAgICAgLi4ucHJvcHMuc3FzUXVldWVQcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZnVuY3Rpb24uYWRkRXZlbnRTb3VyY2UoXG4gICAgICBuZXcgbGFtYmRhX2V2ZW50X3NvdXJjZXMuU3FzRXZlbnRTb3VyY2UodGhpcy5xdWV1ZSwge1xuICAgICAgICBiYXRjaFNpemU6IHByb3BzLmJhdGNoU2l6ZSxcbiAgICAgICAgbWF4QmF0Y2hpbmdXaW5kb3c6IHByb3BzLm1heEJhdGNoaW5nV2luZG93LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHRoaXMuYWRkQWxhcm0oXCJQcm9jZXNzIEZ1bmN0aW9uIEVycm9yc1wiLCB7XG4gICAgICBtZXRyaWM6IHRoaXMuZnVuY3Rpb24ubWV0cmljRXJyb3JzKCksXG4gICAgICB0aHJlc2hvbGQ6IHByb3BzLmxhbWJkYUZ1bmN0aW9uUHJvcHM/LmVycm9yc0FsYXJtVGhyZXNob2xkID8/IDUsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogcHJvcHMubGFtYmRhRnVuY3Rpb25Qcm9wcz8uZXJyb3JzRXZhbHVhdGlvblBlcmlvZHMgPz8gMSxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjpcbiAgICAgICAgcHJvcHMubGFtYmRhRnVuY3Rpb25Qcm9wcz8uZXJyb3JzQ29tcGFyaXNvbk9wZXJhdG9yID8/IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50UGF0dGVybiA9IHtcbiAgICAgIHNvdXJjZTogW2V2ZW50U291cmNlXSxcbiAgICAgIGRldGFpbFR5cGU6IFtldmVudERldGFpbFR5cGVdLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5maWZvICYmICFwcm9wcy5tZXNzYWdlR3JvdXBJZCkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiJ21lc3NhZ2VHcm91cElkJyBtdXN0IGJlIHNldCB0byB3aGVuIHRhcmdldCBpcyBhIGZpZm8gcXVldWVcIik7XG4gICAgfVxuXG4gICAgdGhpcy50YXJnZXRzID0gdGhpcy5xdWV1ZS5maWZvXG4gICAgICA/IFtuZXcgZXZlbnRzX3RhcmdldHMuU3FzUXVldWUodGhpcy5xdWV1ZSwgeyBtZXNzYWdlR3JvdXBJZDogcHJvcHMubWVzc2FnZUdyb3VwSWQgfSldXG4gICAgICA6IFtuZXcgZXZlbnRzX3RhcmdldHMuU3FzUXVldWUodGhpcy5xdWV1ZSldO1xuICB9XG59XG4iXX0=
;