@cloudsnorkel/cdk-github-runners
Version:
CDK construct to create GitHub Actions self-hosted runners. Creates ephemeral runners on demand. Easy to deploy and highly customizable.
46 lines • 12.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.GithubWebhookHandler = void 0;
const cdk = require("aws-cdk-lib");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const constructs_1 = require("constructs");
const access_1 = require("./access");
const utils_1 = require("./utils");
const webhook_handler_function_1 = require("./webhook-handler-function");
/**
* Create a Lambda with a public URL to handle GitHub webhook events. After validating the event with the given secret, the orchestrator step function is called with information about the workflow job.
*
* @internal
*/
class GithubWebhookHandler extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
this.handler = new webhook_handler_function_1.WebhookHandlerFunction(this, 'webhook-handler', {
description: 'Handle GitHub webhook and start runner orchestrator',
environment: {
STEP_FUNCTION_ARN: props.orchestrator.stateMachineArn,
WEBHOOK_SECRET_ARN: props.secrets.webhook.secretArn,
GITHUB_SECRET_ARN: props.secrets.github.secretArn,
GITHUB_PRIVATE_KEY_SECRET_ARN: props.secrets.githubPrivateKey.secretArn,
PROVIDERS: JSON.stringify(props.providers),
REQUIRE_SELF_HOSTED_LABEL: props.requireSelfHostedLabel ? '1' : '0',
PROVIDER_SELECTOR_ARN: props.providerSelector?.functionArn ?? '',
IDLE_TIMEOUT_SECONDS: props.idleTimeoutSeconds?.toString() ?? '300', // default 5 minutes
...props.extraLambdaEnv,
},
timeout: cdk.Duration.seconds(31),
logGroup: (0, utils_1.singletonLogGroup)(this, utils_1.SingletonLogType.ORCHESTRATOR),
loggingFormat: aws_cdk_lib_1.aws_lambda.LoggingFormat.JSON,
...props.extraLambdaProps,
});
const access = props?.access ?? access_1.LambdaAccess.lambdaUrl();
this.url = access.bind(this, 'access', this.handler);
props.secrets.webhook.grantRead(this.handler);
props.secrets.github.grantRead(this.handler);
props.secrets.githubPrivateKey.grantRead(this.handler);
props.orchestrator.grantStartExecution(this.handler);
props.providerSelector?.grantInvoke(this.handler);
}
}
exports.GithubWebhookHandler = GithubWebhookHandler;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWJob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUNuQyw2Q0FBdUY7QUFDdkYsMkNBQXVDO0FBQ3ZDLHFDQUF3QztBQUV4QyxtQ0FBOEQ7QUFDOUQseUVBQW9FO0FBNEdwRTs7OztHQUlHO0FBQ0gsTUFBYSxvQkFBcUIsU0FBUSxzQkFBUztJQVlqRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWdDO1FBQ3hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGlEQUFzQixDQUN2QyxJQUFJLEVBQ0osaUJBQWlCLEVBQ2pCO1lBQ0UsV0FBVyxFQUFFLHFEQUFxRDtZQUNsRSxXQUFXLEVBQUU7Z0JBQ1gsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxlQUFlO2dCQUNyRCxrQkFBa0IsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTO2dCQUNuRCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTO2dCQUNqRCw2QkFBNkIsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFNBQVM7Z0JBQ3ZFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7Z0JBQzFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHO2dCQUNuRSxxQkFBcUIsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxJQUFJLEVBQUU7Z0JBQ2hFLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxLQUFLLEVBQUUsb0JBQW9CO2dCQUN6RixHQUFHLEtBQUssQ0FBQyxjQUFjO2FBQ3hCO1lBQ0QsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxRQUFRLEVBQUUsSUFBQSx5QkFBaUIsRUFBQyxJQUFJLEVBQUUsd0JBQWdCLENBQUMsWUFBWSxDQUFDO1lBQ2hFLGFBQWEsRUFBRSx3QkFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJO1lBQ3hDLEdBQUcsS0FBSyxDQUFDLGdCQUFnQjtTQUMxQixDQUNGLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxLQUFLLEVBQUUsTUFBTSxJQUFJLHFCQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJELEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkQsS0FBSyxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckQsS0FBSyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBL0NELG9EQStDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBhd3NfbGFtYmRhIGFzIGxhbWJkYSwgYXdzX3N0ZXBmdW5jdGlvbnMgYXMgc3RlcGZ1bmN0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTGFtYmRhQWNjZXNzIH0gZnJvbSAnLi9hY2Nlc3MnO1xuaW1wb3J0IHsgU2VjcmV0cyB9IGZyb20gJy4vc2VjcmV0cyc7XG5pbXBvcnQgeyBzaW5nbGV0b25Mb2dHcm91cCwgU2luZ2xldG9uTG9nVHlwZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgV2ViaG9va0hhbmRsZXJGdW5jdGlvbiB9IGZyb20gJy4vd2ViaG9vay1oYW5kbGVyLWZ1bmN0aW9uJztcblxuLyoqXG4gKiBJbnB1dCB0byB0aGUgcHJvdmlkZXIgc2VsZWN0b3IgTGFtYmRhIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3ZpZGVyU2VsZWN0b3JJbnB1dCB7XG4gIC8qKlxuICAgKiBGdWxsIEdpdEh1YiB3ZWJob29rIHBheWxvYWQgKHdvcmtmbG93X2pvYiBldmVudCBzdHJ1Y3R1cmUgd2l0aCBhY3Rpb249XCJxdWV1ZWRcIikuXG4gICAqXG4gICAqICogT3JpZ2luYWwgbGFiZWxzIHJlcXVlc3RlZCBieSB0aGUgd29ya2Zsb3cgam9iIGNhbiBiZSBmb3VuZCBhdCBgcGF5bG9hZC53b3JrZmxvd19qb2IubGFiZWxzYC5cbiAgICogKiBSZXBvc2l0b3J5IHBhdGggKGUuZy4gQ2xvdWRTbm9ya2VsL2Nkay1naXRodWItcnVubmVycykgaXMgYXQgYHBheWxvYWQucmVwb3NpdG9yeS5mdWxsX25hbWVgLlxuICAgKiAqIENvbW1pdCBoYXNoIGlzIGF0IGBwYXlsb2FkLndvcmtmbG93X2pvYi5oZWFkX3NoYWAuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vd2ViaG9va3Mvd2ViaG9vay1ldmVudHMtYW5kLXBheWxvYWRzP2FjdGlvblR5cGU9cXVldWVkI3dvcmtmbG93X2pvYlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZDogYW55O1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgYXZhaWxhYmxlIHByb3ZpZGVyIG5vZGUgcGF0aHMgdG8gdGhlaXIgY29uZmlndXJlZCBsYWJlbHMuXG4gICAqIEV4YW1wbGU6IHsgXCJNeVN0YWNrL1NtYWxsXCI6IFtcImxpbnV4XCIsIFwic21hbGxcIl0sIFwiTXlTdGFjay9MYXJnZVwiOiBbXCJsaW51eFwiLCBcImxhcmdlXCJdIH1cbiAgICovXG4gIHJlYWRvbmx5IHByb3ZpZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlciBub2RlIHBhdGggdGhhdCB3b3VsZCBoYXZlIGJlZW4gc2VsZWN0ZWQgYnkgZGVmYXVsdCBsYWJlbCBtYXRjaGluZy5cbiAgICogVXNlIHRoaXMgdG8gZWFzaWx5IHJldHVybiB0aGUgZGVmYXVsdCBzZWxlY3Rpb246IGB7IHByb3ZpZGVyOiBpbnB1dC5kZWZhdWx0UHJvdmlkZXIsIGxhYmVsczogaW5wdXQuZGVmYXVsdExhYmVscyB9YFxuICAgKiBNYXkgYmUgdW5kZWZpbmVkIGlmIG5vIHByb3ZpZGVyIG1hdGNoZWQgYnkgZGVmYXVsdC5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRQcm92aWRlcj86IHN0cmluZztcblxuICAvKipcbiAgICogTGFiZWxzIHRoYXQgd291bGQgaGF2ZSBiZWVuIHVzZWQgYnkgZGVmYXVsdCAodGhlIHNlbGVjdGVkIHByb3ZpZGVyJ3MgbGFiZWxzKS5cbiAgICogTWF5IGJlIHVuZGVmaW5lZCBpZiBubyBwcm92aWRlciBtYXRjaGVkIGJ5IGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0TGFiZWxzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogUmVzdWx0IGZyb20gdGhlIHByb3ZpZGVyIHNlbGVjdG9yIExhbWJkYSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlclNlbGVjdG9yUmVzdWx0IHtcbiAgLyoqXG4gICAqIE5vZGUgcGF0aCBvZiB0aGUgcHJvdmlkZXIgdG8gdXNlIChlLmcuLCBcIk15U3RhY2svTXlQcm92aWRlclwiKS5cbiAgICogTXVzdCBtYXRjaCBvbmUgb2YgdGhlIGNvbmZpZ3VyZWQgcHJvdmlkZXIgbm9kZSBwYXRocyBmcm9tIHRoZSBpbnB1dC5cbiAgICogSWYgbm90IHByb3ZpZGVkLCB0aGUgam9iIHdpbGwgYmUgc2tpcHBlZCAobm8gcnVubmVyIGNyZWF0ZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExhYmVscyB0byB1c2Ugd2hlbiByZWdpc3RlcmluZyB0aGUgcnVubmVyLlxuICAgKiBNdXN0IGJlIHJldHVybmVkIHdoZW4gYSBwcm92aWRlciBpcyBzZWxlY3RlZC5cbiAgICogQ2FuIGJlIHVzZWQgdG8gYWRkLCByZW1vdmUsIG9yIG1vZGlmeSBsYWJlbHMuXG4gICAqL1xuICByZWFkb25seSBsYWJlbHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBHaXRodWJXZWJob29rSGFuZGxlclxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdpdGh1YldlYmhvb2tIYW5kbGVyUHJvcHMge1xuICAvKipcbiAgICogU3RlcCBmdW5jdGlvbiBpbiBjaGFyZ2Ugb2YgaGFuZGxpbmcgdGhlIHdvcmtmbG93IGpvYiBldmVudHMgYW5kIHN0YXJ0IHRoZSBydW5uZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JjaGVzdHJhdG9yOiBzdGVwZnVuY3Rpb25zLlN0YXRlTWFjaGluZTtcblxuICAvKipcbiAgICogU2VjcmV0cyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggR2l0SHViLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0czogU2VjcmV0cztcblxuICAvKipcbiAgICogQ29uZmlndXJlIGFjY2VzcyB0byB3ZWJob29rIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzPzogTGFtYmRhQWNjZXNzO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIHByb3ZpZGVyIG5vZGUgcGF0aHMgdG8gdGhlaXIgc3VwcG9ydGVkIGxhYmVscy5cbiAgICovXG4gIHJlYWRvbmx5IHByb3ZpZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBMYW1iZGEgZnVuY3Rpb24gdG8gY3VzdG9taXplIHByb3ZpZGVyIHNlbGVjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHByb3ZpZGVyU2VsZWN0b3I/OiBsYW1iZGEuSUZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlcXVpcmUgdGhlIFwic2VsZi1ob3N0ZWRcIiBsYWJlbC5cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVTZWxmSG9zdGVkTGFiZWw6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElkbGUgdGltZW91dCBmb3IgcnVubmVycyBpbiBzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgaWRsZVRpbWVvdXRTZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIExhbWJkYSBmdW5jdGlvbiBvcHRpb25zIChWUEMsIHNlY3VyaXR5IGdyb3VwcywgbGF5ZXJzLCBldGMuKS5cbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhTGFtYmRhUHJvcHM/OiBsYW1iZGEuRnVuY3Rpb25PcHRpb25zO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhTGFtYmRhRW52PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBMYW1iZGEgd2l0aCBhIHB1YmxpYyBVUkwgdG8gaGFuZGxlIEdpdEh1YiB3ZWJob29rIGV2ZW50cy4gQWZ0ZXIgdmFsaWRhdGluZyB0aGUgZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gc2VjcmV0LCB0aGUgb3JjaGVzdHJhdG9yIHN0ZXAgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdvcmtmbG93IGpvYi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEdpdGh1YldlYmhvb2tIYW5kbGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcblxuICAvKipcbiAgICogUHVibGljIFVSTCBvZiB3ZWJob29rIHRvIGJlIHVzZWQgd2l0aCBHaXRIdWIuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKipcbiAgICogV2ViaG9vayBldmVudCBoYW5kbGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaGFuZGxlcjogV2ViaG9va0hhbmRsZXJGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogR2l0aHViV2ViaG9va0hhbmRsZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmhhbmRsZXIgPSBuZXcgV2ViaG9va0hhbmRsZXJGdW5jdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICAnd2ViaG9vay1oYW5kbGVyJyxcbiAgICAgIHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdIYW5kbGUgR2l0SHViIHdlYmhvb2sgYW5kIHN0YXJ0IHJ1bm5lciBvcmNoZXN0cmF0b3InLFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIFNURVBfRlVOQ1RJT05fQVJOOiBwcm9wcy5vcmNoZXN0cmF0b3Iuc3RhdGVNYWNoaW5lQXJuLFxuICAgICAgICAgIFdFQkhPT0tfU0VDUkVUX0FSTjogcHJvcHMuc2VjcmV0cy53ZWJob29rLnNlY3JldEFybixcbiAgICAgICAgICBHSVRIVUJfU0VDUkVUX0FSTjogcHJvcHMuc2VjcmV0cy5naXRodWIuc2VjcmV0QXJuLFxuICAgICAgICAgIEdJVEhVQl9QUklWQVRFX0tFWV9TRUNSRVRfQVJOOiBwcm9wcy5zZWNyZXRzLmdpdGh1YlByaXZhdGVLZXkuc2VjcmV0QXJuLFxuICAgICAgICAgIFBST1ZJREVSUzogSlNPTi5zdHJpbmdpZnkocHJvcHMucHJvdmlkZXJzKSxcbiAgICAgICAgICBSRVFVSVJFX1NFTEZfSE9TVEVEX0xBQkVMOiBwcm9wcy5yZXF1aXJlU2VsZkhvc3RlZExhYmVsID8gJzEnIDogJzAnLFxuICAgICAgICAgIFBST1ZJREVSX1NFTEVDVE9SX0FSTjogcHJvcHMucHJvdmlkZXJTZWxlY3Rvcj8uZnVuY3Rpb25Bcm4gPz8gJycsXG4gICAgICAgICAgSURMRV9USU1FT1VUX1NFQ09ORFM6IHByb3BzLmlkbGVUaW1lb3V0U2Vjb25kcz8udG9TdHJpbmcoKSA/PyAnMzAwJywgLy8gZGVmYXVsdCA1IG1pbnV0ZXNcbiAgICAgICAgICAuLi5wcm9wcy5leHRyYUxhbWJkYUVudixcbiAgICAgICAgfSxcbiAgICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoMzEpLFxuICAgICAgICBsb2dHcm91cDogc2luZ2xldG9uTG9nR3JvdXAodGhpcywgU2luZ2xldG9uTG9nVHlwZS5PUkNIRVNUUkFUT1IpLFxuICAgICAgICBsb2dnaW5nRm9ybWF0OiBsYW1iZGEuTG9nZ2luZ0Zvcm1hdC5KU09OLFxuICAgICAgICAuLi5wcm9wcy5leHRyYUxhbWJkYVByb3BzLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgYWNjZXNzID0gcHJvcHM/LmFjY2VzcyA/PyBMYW1iZGFBY2Nlc3MubGFtYmRhVXJsKCk7XG4gICAgdGhpcy51cmwgPSBhY2Nlc3MuYmluZCh0aGlzLCAnYWNjZXNzJywgdGhpcy5oYW5kbGVyKTtcblxuICAgIHByb3BzLnNlY3JldHMud2ViaG9vay5ncmFudFJlYWQodGhpcy5oYW5kbGVyKTtcbiAgICBwcm9wcy5zZWNyZXRzLmdpdGh1Yi5ncmFudFJlYWQodGhpcy5oYW5kbGVyKTtcbiAgICBwcm9wcy5zZWNyZXRzLmdpdGh1YlByaXZhdGVLZXkuZ3JhbnRSZWFkKHRoaXMuaGFuZGxlcik7XG4gICAgcHJvcHMub3JjaGVzdHJhdG9yLmdyYW50U3RhcnRFeGVjdXRpb24odGhpcy5oYW5kbGVyKTtcbiAgICBwcm9wcy5wcm92aWRlclNlbGVjdG9yPy5ncmFudEludm9rZSh0aGlzLmhhbmRsZXIpO1xuICB9XG59XG4iXX0=