UNPKG

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.

196 lines 24.2 kB
"use strict"; var _a, _b, _c, _d; Object.defineProperty(exports, "__esModule", { value: true }); exports.EventStage = exports.StateMachineStage = exports.DataStage = exports.Stage = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const cloudwatch = require("aws-cdk-lib/aws-cloudwatch"); const events = require("aws-cdk-lib/aws-events"); const events_targets = require("aws-cdk-lib/aws-events-targets"); const sfn = require("aws-cdk-lib/aws-stepfunctions"); const constructs_1 = require("constructs"); /** * Abstract class representing a stage. */ class Stage extends constructs_1.Construct { /** * Constructs the stage. * @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); this.name = props.name; this.description = props.description; } } exports.Stage = Stage; _a = JSII_RTTI_SYMBOL_1; Stage[_a] = { fqn: "aws-ddk-core.Stage", version: "1.4.1" }; /** * Class that represents a data stage within a data pipeline. * * To create a DataStage, inherit from this class, add infrastructure required by the stage, * and implement `eventPatterns` and `targets` properties. * * @example * class MyStage extends DataStage: * readonly queue: sqs.Queue; * * constructor(scope: Construct, id: string, props: MyStageProps) { * super(scope, id, props); * * this.queue = sqs.Queue(this, "Queue"); * * this.eventPatterns = { * detail_type: ["my-detail-type"], * }; * this.targets = [new events_targets.SqsQueue(this.queue)]; * } */ class DataStage extends Stage { /** * Constructs the stage. * @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); this.alarmsEnabled = props.alarmsEnabled ?? true; this.cloudwatchAlarms = []; } /** * Add a CloudWatch alarm for the DataStage. * @param id Identifier of the CloudWatch Alarm. * @param props Properties for the alarm. * @returns this DataStage. */ addAlarm(id, props) { if (this.alarmsEnabled) { this.cloudwatchAlarms.push(new cloudwatch.Alarm(this, id, { metric: props.metric, comparisonOperator: props.comparisonOperator ?? cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD, threshold: props.threshold ?? 1, evaluationPeriods: props.evaluationPeriods ?? 1, })); } return this; } } exports.DataStage = DataStage; _b = JSII_RTTI_SYMBOL_1; DataStage[_b] = { fqn: "aws-ddk-core.DataStage", version: "1.4.1" }; function getDefinitionBody(definition, definitionFile) { if (definition && definitionFile) { throw new Error("Only one of 'definition' or 'definitionFile' should be provided."); } if (!definition && !definitionFile) { throw new Error("One of 'definition' or 'definitionFile' must be provided."); } if (definitionFile) { return sfn.DefinitionBody.fromFile(definitionFile, {}); } else { if (typeof definition == "string") { return sfn.DefinitionBody.fromString(definition); } if (definition) { return sfn.DefinitionBody.fromChainable(definition); } } throw new Error("Not able to create a definition body."); } /** * DataStage with helper methods to simplify StateMachine stages creation. */ class StateMachineStage extends DataStage { /** * Constructs state machine stage. * @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); } /** * Constructs a state machine from the definition. * @param props State machine stage properties. * @returns Dictionary with event pattern, targets and state machine construct. */ createStateMachine(props) { const stateMachine = new sfn.StateMachine(this, "State Machine", { definitionBody: getDefinitionBody(props.definition, props.definitionFile), stateMachineName: props.stateMachineName, }); if (props.additionalRolePolicyStatements) { props.additionalRolePolicyStatements.forEach((s) => { stateMachine.addToRolePolicy(s); }); } this.addAlarm("State Machine Failure Alarm", { metric: stateMachine.metricFailed(), threshold: props.stateMachineFailedExecutionsAlarmThreshold, evaluationPeriods: props.stateMachineFailedExecutionsAlarmEvaluationPeriods, }); const stateMachineInput = props.stateMachineInput; const eventPattern = { source: ["aws.states"], detailType: ["Step Functions Execution Status Change"], detail: { status: ["SUCCEEDED"], stateMachineArn: [stateMachine.stateMachineArn], }, }; const targets = [ new events_targets.SfnStateMachine(stateMachine, { input: events.RuleTargetInput.fromObject(stateMachineInput), }), ]; return { eventPattern, targets, stateMachine, }; } } exports.StateMachineStage = StateMachineStage; _c = JSII_RTTI_SYMBOL_1; StateMachineStage[_c] = { fqn: "aws-ddk-core.StateMachineStage", version: "1.4.1" }; /** * Class that represents an event stage within a data pipeline. * * To create an EventStage, inherit from this class, add infrastructure required by the stage, * and implement the `eventPattern` property. * * The `targets` property will be set to null. * * @example * class MyStage extends EventStage: * constructor(scope: Construct, id: string, props: MyStageProps) { * super(scope, id, props); * * this.eventPatterns = { * source: ["aws.s3"], * detail: props.detail, * detail_type: props.detail_type, * }; * } */ class EventStage extends Stage { /** * Constructs event stage. * @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); this.targets = undefined; } } exports.EventStage = EventStage; _d = JSII_RTTI_SYMBOL_1; EventStage[_d] = { fqn: "aws-ddk-core.EventStage", version: "1.4.1" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGlwZWxpbmVzL3N0YWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseURBQXlEO0FBQ3pELGlEQUFpRDtBQUNqRCxpRUFBaUU7QUFFakUscURBQXFEO0FBQ3JELDJDQUF1QztBQWdCdkM7O0dBRUc7QUFDSCxNQUFzQixLQUFNLFNBQVEsc0JBQVM7SUF3QjNDOzs7OztPQUtHO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFpQjtRQUN6RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7SUFDdkMsQ0FBQzs7QUFuQ0gsc0JBb0NDOzs7QUF3Q0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBc0IsU0FBVSxTQUFRLEtBQUs7SUFVM0M7Ozs7O09BS0c7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFCO1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUM7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxRQUFRLENBQUMsRUFBVSxFQUFFLEtBQWlCO1FBQ3BDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUN4QixJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtnQkFDN0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUNwQixr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LENBQUM7YUFDNUQsQ0FBQztTQUNILENBQUM7UUFFRixPQUFPO1lBQ0wsWUFBWTtZQUNaLE9BQU87WUFDUCxZQUFZO1NBQ2IsQ0FBQztJQUNKLENBQUM7O0FBM0RILDhDQTREQzs7O0FBT0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFzQixVQUFXLFNBQVEsS0FBSztJQUc1Qzs7Ozs7T0FLRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7UUFDOUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFDM0IsQ0FBQzs7QUFiSCxnQ0FjQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCAqIGFzIGV2ZW50c190YXJnZXRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgc2ZuIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9uc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgYmFzZSBhYnN0cmFjdCBzdGFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFnZVByb3BzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHN0YWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSBzdGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyBhIHN0YWdlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3RhZ2UgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgc3RhZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSBzdGFnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogSW5wdXQgdGFyZ2V0cyBmb3IgdGhlIHN0YWdlLlxuICAgKlxuICAgKiBUYXJnZXRzIGFyZSB1c2VkIGJ5IEV2ZW50IFJ1bGVzIHRvIGRlc2NyaWJlIHdoYXQgc2hvdWxkIGJlIGludm9rZWQgd2hlbiBhIHJ1bGUgbWF0Y2hlcyBhbiBldmVudC5cbiAgICovXG4gIGFic3RyYWN0IHJlYWRvbmx5IHRhcmdldHM/OiBldmVudHMuSVJ1bGVUYXJnZXRbXTtcbiAgLyoqXG4gICAqIE91dHB1dCBldmVudCBwYXR0ZXJuIG9mIHRoZSBzdGFnZS5cbiAgICpcbiAgICogRXZlbnQgcGF0dGVybiBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBvZiBvdXRwdXQgZXZlbnQocykgcHJvZHVjZWQgYnkgdGhpcyBzdGFnZS5cbiAgICogRXZlbnQgUnVsZXMgdXNlIGV2ZW50IHBhdHRlcm5zIHRvIHNlbGVjdCBldmVudHMgYW5kIHJvdXRlIHRoZW0gdG8gdGFyZ2V0cy5cbiAgICovXG4gIGFic3RyYWN0IHJlYWRvbmx5IGV2ZW50UGF0dGVybj86IGV2ZW50cy5FdmVudFBhdHRlcm47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgdGhlIHN0YWdlLlxuICAgKiBAcGFyYW0gc2NvcGUgU2NvcGUgd2l0aGluIHdoaWNoIHRoaXMgY29uc3RydWN0IGlzIGRlZmluZWQuXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGFnZS5cbiAgICogQHBhcmFtIHByb3BzIFByb3BlcnRpZXMgZm9yIHRoZSBzdGFnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTdGFnZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMubmFtZSA9IHByb3BzLm5hbWU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uO1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIGBEYXRhU3RhZ2VgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTdGFnZVByb3BzIGV4dGVuZHMgU3RhZ2VQcm9wcyB7XG4gIC8qKlxuICAgKiBFbmFibGUvRGlzYWJsZSBhbGwgYWxhcm1zIGluIGEgRGF0YVN0YWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhbGFybXNFbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgYWxhcm0gYmVpbmcgYWRkZWQgdG8gdGhlIERhdGFTdGFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbGFybVByb3BzIHtcbiAgLyoqXG4gICAqIE1ldHJpYyB0byB1c2UgZm9yIGNyZWF0aW5nIHRoZSBzdGFnZSdzIENsb3VkV2F0Y2ggQWxhcm0uXG4gICAqL1xuICByZWFkb25seSBtZXRyaWM6IGNsb3Vkd2F0Y2guSU1ldHJpYztcbiAgLyoqXG4gICAqIENvbXBhcmlzb24gb3BlcmF0b3IgdG8gdXNlIGZvciBhbGFybS5cbiAgICpcbiAgICogQGRlZmF1bHQgR1JFQVRFUl9USEFOX1RIUkVTSE9MRFxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGFyaXNvbk9wZXJhdG9yPzogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3I7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgYWdhaW5zdCB3aGljaCB0aGUgc3BlY2lmaWVkIGFsYXJtIHN0YXRpc3RpYyBpcyBjb21wYXJlZC5cbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgZXZhbHVhdGlvblBlcmlvZHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHBlcmlvZHMgb3ZlciB3aGljaCBkYXRhIGlzIGNvbXBhcmVkIHRvIHRoZSBzcGVjaWZpZWQgdGhyZXNob2xkLlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2xhc3MgdGhhdCByZXByZXNlbnRzIGEgZGF0YSBzdGFnZSB3aXRoaW4gYSBkYXRhIHBpcGVsaW5lLlxuICpcbiAqIFRvIGNyZWF0ZSBhIERhdGFTdGFnZSwgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MsIGFkZCBpbmZyYXN0cnVjdHVyZSByZXF1aXJlZCBieSB0aGUgc3RhZ2UsXG4gKiBhbmQgaW1wbGVtZW50IGBldmVudFBhdHRlcm5zYCBhbmQgYHRhcmdldHNgIHByb3BlcnRpZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNsYXNzIE15U3RhZ2UgZXh0ZW5kcyBEYXRhU3RhZ2U6XG4gKiAgIHJlYWRvbmx5IHF1ZXVlOiBzcXMuUXVldWU7XG4gKlxuICogICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTXlTdGFnZVByb3BzKSB7XG4gKiAgICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICpcbiAqICAgICAgdGhpcy5xdWV1ZSA9IHNxcy5RdWV1ZSh0aGlzLCBcIlF1ZXVlXCIpO1xuICpcbiAqICAgICAgdGhpcy5ldmVudFBhdHRlcm5zID0ge1xuICogICAgICAgIGRldGFpbF90eXBlOiBbXCJteS1kZXRhaWwtdHlwZVwiXSxcbiAqICAgICAgfTtcbiAqICAgICAgdGhpcy50YXJnZXRzID0gW25ldyBldmVudHNfdGFyZ2V0cy5TcXNRdWV1ZSh0aGlzLnF1ZXVlKV07XG4gKiAgIH1cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERhdGFTdGFnZSBleHRlbmRzIFN0YWdlIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgQ2xvdWRXYXRjaCBBbGFybXMgbGlua2VkIHRvIHRoZSBzdGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGNsb3Vkd2F0Y2hBbGFybXM6IGNsb3Vkd2F0Y2guQWxhcm1bXTtcbiAgLyoqXG4gICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhbGFybXMgYXJlIGVuYWJsZWQgZm9yIHRoaXMgc3RhZ2UuXG4gICAqL1xuICByZWFkb25seSBhbGFybXNFbmFibGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHRoZSBzdGFnZS5cbiAgICogQHBhcmFtIHNjb3BlIFNjb3BlIHdpdGhpbiB3aGljaCB0aGlzIGNvbnN0cnVjdCBpcyBkZWZpbmVkLlxuICAgKiBAcGFyYW0gaWQgSWRlbnRpZmllciBvZiB0aGUgc3RhZ2UuXG4gICAqIEBwYXJhbSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB0aGUgc3RhZ2UuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRGF0YVN0YWdlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMuYWxhcm1zRW5hYmxlZCA9IHByb3BzLmFsYXJtc0VuYWJsZWQgPz8gdHJ1ZTtcbiAgICB0aGlzLmNsb3Vkd2F0Y2hBbGFybXMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBDbG91ZFdhdGNoIGFsYXJtIGZvciB0aGUgRGF0YVN0YWdlLlxuICAgKiBAcGFyYW0gaWQgSWRlbnRpZmllciBvZiB0aGUgQ2xvdWRXYXRjaCBBbGFybS5cbiAgICogQHBhcmFtIHByb3BzIFByb3BlcnRpZXMgZm9yIHRoZSBhbGFybS5cbiAgICogQHJldHVybnMgdGhpcyBEYXRhU3RhZ2UuXG4gICAqL1xuICBhZGRBbGFybShpZDogc3RyaW5nLCBwcm9wczogQWxhcm1Qcm9wcyk6IERhdGFTdGFnZSB7XG4gICAgaWYgKHRoaXMuYWxhcm1zRW5hYmxlZCkge1xuICAgICAgdGhpcy5jbG91ZHdhdGNoQWxhcm1zLnB1c2goXG4gICAgICAgIG5ldyBjbG91ZHdhdGNoLkFsYXJtKHRoaXMsIGlkLCB7XG4gICAgICAgICAgbWV0cmljOiBwcm9wcy5tZXRyaWMsXG4gICAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBwcm9wcy5jb21wYXJpc29uT3BlcmF0b3IgPz8gY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgICAgICB0aHJlc2hvbGQ6IHByb3BzLnRocmVzaG9sZCA/PyAxLFxuICAgICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBwcm9wcy5ldmFsdWF0aW9uUGVyaW9kcyA/PyAxLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmluaXRpb25Cb2R5KGRlZmluaXRpb24/OiBzZm4uSUNoYWluYWJsZSB8IHN0cmluZywgZGVmaW5pdGlvbkZpbGU/OiBzdHJpbmcpOiBzZm4uRGVmaW5pdGlvbkJvZHkge1xuICBpZiAoZGVmaW5pdGlvbiAmJiBkZWZpbml0aW9uRmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk9ubHkgb25lIG9mICdkZWZpbml0aW9uJyBvciAnZGVmaW5pdGlvbkZpbGUnIHNob3VsZCBiZSBwcm92aWRlZC5cIik7XG4gIH1cbiAgaWYgKCFkZWZpbml0aW9uICYmICFkZWZpbml0aW9uRmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk9uZSBvZiAnZGVmaW5pdGlvbicgb3IgJ2RlZmluaXRpb25GaWxlJyBtdXN0IGJlIHByb3ZpZGVkLlwiKTtcbiAgfVxuXG4gIGlmIChkZWZpbml0aW9uRmlsZSkge1xuICAgIHJldHVybiBzZm4uRGVmaW5pdGlvbkJvZHkuZnJvbUZpbGUoZGVmaW5pdGlvbkZpbGUsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGRlZmluaXRpb24gPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHNmbi5EZWZpbml0aW9uQm9keS5mcm9tU3RyaW5nKGRlZmluaXRpb24pO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbikge1xuICAgICAgcmV0dXJuIHNmbi5EZWZpbml0aW9uQm9keS5mcm9tQ2hhaW5hYmxlKGRlZmluaXRpb24pO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgYWJsZSB0byBjcmVhdGUgYSBkZWZpbml0aW9uIGJvZHkuXCIpO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgb2YgYSBzdGF0ZSBtYWNoaW5lIHN0YWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlTWFjaGluZVN0YWdlUHJvcHMgZXh0ZW5kcyBTdGFnZVByb3BzIHtcbiAgLyoqXG4gICAqIFN0ZXBzIGZvciB0aGUgc3RhdGUgbWFjaGluZS5cbiAgICogQ2FuIGVpdGhlciBiZSBwcm92aWRlZCBhcyAnc2ZuLklDaGFpbmFibGUnIG9yIGEgSlNPTiBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBkZWZpbml0aW9uPzogc2ZuLklDaGFpbmFibGUgfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBGaWxlIGNvbnRhaW5pbmcgYSBKU09OIGRlZmluaXRpb24gZm9yIHRoZSBzdGF0ZSBtYWNoaW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmaW5pdGlvbkZpbGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJbnB1dCBvZiB0aGUgc3RhdGUgbWFjaGluZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlTWFjaGluZUlucHV0PzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHN0YXRlIG1hY2hpbmUuXG4gICAqL1xuICByZWFkb25seSBzdGF0ZU1hY2hpbmVOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBJQU0gcG9saWN5IHN0YXRlbWVudHMgdG8gYWRkIHRvIHRoZSBzdGF0ZSBtYWNoaW5lIHJvbGUuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsUm9sZVBvbGljeVN0YXRlbWVudHM/OiBpYW0uUG9saWN5U3RhdGVtZW50W107XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBzdGF0ZSBtYWNoaW5lIGV4ZWN1dGlvbnMgYmVmb3JlIHRyaWdnZXJpbmcgQ1cgYWxhcm0uXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlTWFjaGluZUZhaWxlZEV4ZWN1dGlvbnNBbGFybVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcGVyaW9kcyBvdmVyIHdoaWNoIGRhdGEgaXMgY29tcGFyZWQgdG8gdGhlIHNwZWNpZmllZCB0aHJlc2hvbGQuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlTWFjaGluZUZhaWxlZEV4ZWN1dGlvbnNBbGFybUV2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyO1xuICAvKipcbiAgICogRW5hYmxlL0Rpc2FibGUgYWxsIGFsYXJtcyBpbiB0aGUgc3RhZ2UuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtc0VuYWJsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVN0YXRlTWFjaGluZVJlc3VsdCB7XG4gIHJlYWRvbmx5IGV2ZW50UGF0dGVybjogZXZlbnRzLkV2ZW50UGF0dGVybjtcbiAgcmVhZG9ubHkgdGFyZ2V0czogZXZlbnRzLklSdWxlVGFyZ2V0W107XG4gIHJlYWRvbmx5IHN0YXRlTWFjaGluZTogc2ZuLlN0YXRlTWFjaGluZTtcbn1cblxuLyoqXG4gKiBEYXRhU3RhZ2Ugd2l0aCBoZWxwZXIgbWV0aG9kcyB0byBzaW1wbGlmeSBTdGF0ZU1hY2hpbmUgc3RhZ2VzIGNyZWF0aW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3RhdGVNYWNoaW5lU3RhZ2UgZXh0ZW5kcyBEYXRhU3RhZ2Uge1xuICAvKipcbiAgICogU3RhdGUgbWFjaGluZS5cbiAgICovXG4gIGFic3RyYWN0IHJlYWRvbmx5IHN0YXRlTWFjaGluZTogc2ZuLlN0YXRlTWFjaGluZTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBzdGF0ZSBtYWNoaW5lIHN0YWdlLlxuICAgKiBAcGFyYW0gc2NvcGUgU2NvcGUgd2l0aGluIHdoaWNoIHRoaXMgY29uc3RydWN0IGlzIGRlZmluZWQuXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGFnZS5cbiAgICogQHBhcmFtIHByb3BzIFByb3BlcnRpZXMgZm9yIHRoZSBzdGFnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTdGF0ZU1hY2hpbmVTdGFnZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIHN0YXRlIG1hY2hpbmUgZnJvbSB0aGUgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHByb3BzIFN0YXRlIG1hY2hpbmUgc3RhZ2UgcHJvcGVydGllcy5cbiAgICogQHJldHVybnMgRGljdGlvbmFyeSB3aXRoIGV2ZW50IHBhdHRlcm4sIHRhcmdldHMgYW5kIHN0YXRlIG1hY2hpbmUgY29uc3RydWN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVN0YXRlTWFjaGluZShwcm9wczogU3RhdGVNYWNoaW5lU3RhZ2VQcm9wcyk6IENyZWF0ZVN0YXRlTWFjaGluZVJlc3VsdCB7XG4gICAgY29uc3Qgc3RhdGVNYWNoaW5lID0gbmV3IHNmbi5TdGF0ZU1hY2hpbmUodGhpcywgXCJTdGF0ZSBNYWNoaW5lXCIsIHtcbiAgICAgIGRlZmluaXRpb25Cb2R5OiBnZXREZWZpbml0aW9uQm9keShwcm9wcy5kZWZpbml0aW9uLCBwcm9wcy5kZWZpbml0aW9uRmlsZSksXG4gICAgICBzdGF0ZU1hY2hpbmVOYW1lOiBwcm9wcy5zdGF0ZU1hY2hpbmVOYW1lLFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLmFkZGl0aW9uYWxSb2xlUG9saWN5U3RhdGVtZW50cykge1xuICAgICAgcHJvcHMuYWRkaXRpb25hbFJvbGVQb2xpY3lTdGF0ZW1lbnRzLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgc3RhdGVNYWNoaW5lLmFkZFRvUm9sZVBvbGljeShzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYWRkQWxhcm0oXCJTdGF0ZSBNYWNoaW5lIEZhaWx1cmUgQWxhcm1cIiwge1xuICAgICAgbWV0cmljOiBzdGF0ZU1hY2hpbmUubWV0cmljRmFpbGVkKCksXG4gICAgICB0aHJlc2hvbGQ6IHByb3BzLnN0YXRlTWFjaGluZUZhaWxlZEV4ZWN1dGlvbnNBbGFybVRocmVzaG9sZCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBwcm9wcy5zdGF0ZU1hY2hpbmVGYWlsZWRFeGVjdXRpb25zQWxhcm1FdmFsdWF0aW9uUGVyaW9kcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0YXRlTWFjaGluZUlucHV0ID0gcHJvcHMuc3RhdGVNYWNoaW5lSW5wdXQ7XG4gICAgY29uc3QgZXZlbnRQYXR0ZXJuID0ge1xuICAgICAgc291cmNlOiBbXCJhd3Muc3RhdGVzXCJdLFxuICAgICAgZGV0YWlsVHlwZTogW1wiU3RlcCBGdW5jdGlvbnMgRXhlY3V0aW9uIFN0YXR1cyBDaGFuZ2VcIl0sXG4gICAgICBkZXRhaWw6IHtcbiAgICAgICAgc3RhdHVzOiBbXCJTVUNDRUVERURcIl0sXG4gICAgICAgIHN0YXRlTWFjaGluZUFybjogW3N0YXRlTWFjaGluZS5zdGF0ZU1hY2hpbmVBcm5dLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IHRhcmdldHMgPSBbXG4gICAgICBuZXcgZXZlbnRzX3RhcmdldHMuU2ZuU3RhdGVNYWNoaW5lKHN0YXRlTWFjaGluZSwge1xuICAgICAgICBpbnB1dDogZXZlbnRzLlJ1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KHN0YXRlTWFjaGluZUlucHV0KSxcbiAgICAgIH0pLFxuICAgIF07XG5cbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRQYXR0ZXJuLFxuICAgICAgdGFyZ2V0cyxcbiAgICAgIHN0YXRlTWFjaGluZSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIGV2ZW50IHN0YWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U3RhZ2VQcm9wcyBleHRlbmRzIFN0YWdlUHJvcHMge31cblxuLyoqXG4gKiBDbGFzcyB0aGF0IHJlcHJlc2VudHMgYW4gZXZlbnQgc3RhZ2Ugd2l0aGluIGEgZGF0YSBwaXBlbGluZS5cbiAqXG4gKiBUbyBjcmVhdGUgYW4gRXZlbnRTdGFnZSwgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MsIGFkZCBpbmZyYXN0cnVjdHVyZSByZXF1aXJlZCBieSB0aGUgc3RhZ2UsXG4gKiBhbmQgaW1wbGVtZW50IHRoZSBgZXZlbnRQYXR0ZXJuYCBwcm9wZXJ0eS5cbiAqXG4gKiBUaGUgYHRhcmdldHNgIHByb3BlcnR5IHdpbGwgYmUgc2V0IHRvIG51bGwuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNsYXNzIE15U3RhZ2UgZXh0ZW5kcyBFdmVudFN0YWdlOlxuICogICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTXlTdGFnZVByb3BzKSB7XG4gKiAgICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICpcbiAqICAgICAgdGhpcy5ldmVudFBhdHRlcm5zID0ge1xuICogICAgICAgIHNvdXJjZTogW1wiYXdzLnMzXCJdLFxuICogICAgICAgIGRldGFpbDogcHJvcHMuZGV0YWlsLFxuICogICAgICAgIGRldGFpbF90eXBlOiBwcm9wcy5kZXRhaWxfdHlwZSxcbiAqICAgICAgfTtcbiAqICAgfVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRXZlbnRTdGFnZSBleHRlbmRzIFN0YWdlIHtcbiAgcmVhZG9ubHkgdGFyZ2V0cz86IGV2ZW50cy5JUnVsZVRhcmdldFtdO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGV2ZW50IHN0YWdlLlxuICAgKiBAcGFyYW0gc2NvcGUgU2NvcGUgd2l0aGluIHdoaWNoIHRoaXMgY29uc3RydWN0IGlzIGRlZmluZWQuXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGFnZS5cbiAgICogQHBhcmFtIHByb3BzIFByb3BlcnRpZXMgZm9yIHRoZSBzdGFnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFdmVudFN0YWdlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMudGFyZ2V0cyA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19