UNPKG

@aws-cdk-testing/cli-integ

Version:

Integration tests for the AWS CDK CLI

132 lines (131 loc) 20.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CliLibIntegrationTestFixture = void 0; exports.withCliLibIntegrationCdkApp = withCliLibIntegrationCdkApp; exports.withCliLibFixture = withCliLibFixture; const os = require("os"); const path = require("path"); const resources_1 = require("./resources"); const with_aws_1 = require("./with-aws"); const with_cdk_app_1 = require("./with-cdk-app"); const with_timeout_1 = require("./with-timeout"); /** * Higher order function to execute a block with a CliLib Integration CDK app fixture */ function withCliLibIntegrationCdkApp(block) { return async (context) => { const randy = context.randomString; const stackNamePrefix = `cdktest-${randy}`; const integTestDir = path.join(os.tmpdir(), `cdk-integ-${randy}`); context.log(` Stack prefix: ${stackNamePrefix}\n`); context.log(` Test directory: ${integTestDir}\n`); context.log(` Region: ${context.aws.region}\n`); await (0, with_cdk_app_1.cloneDirectory)(path.join(resources_1.RESOURCES_DIR, 'cdk-apps', 'simple-app'), integTestDir, context.output); const fixture = new CliLibIntegrationTestFixture(integTestDir, stackNamePrefix, context.output, context.aws, context.randomString); await fixture.ecrPublicLogin(); let success = true; try { const installationVersion = fixture.library.requestedVersion(); const alphaInstallationVersion = fixture.library.requestedAlphaVersion(); // cli-lib-alpha has a magic alpha version in the old release pipeline, // but will just mirror the CLI version in the new pipeline. const cliLibVersion = process.env.CLI_LIB_VERSION_MIRRORS_CLI ? `${fixture.cli.requestedVersion()}-alpha.0` : alphaInstallationVersion; await (0, with_cdk_app_1.installNpmPackages)(fixture, { 'aws-cdk-lib': installationVersion, '@aws-cdk/cli-lib-alpha': cliLibVersion, '@aws-cdk/aws-lambda-go-alpha': alphaInstallationVersion, '@aws-cdk/aws-lambda-python-alpha': alphaInstallationVersion, 'constructs': '^10', }); if (!context.disableBootstrap) { await (0, with_cdk_app_1.ensureBootstrapped)(fixture); } await block(fixture); } catch (e) { // We survive certain cases involving gopkg.in if (errorCausedByGoPkg(e.message)) { return; } success = false; throw e; } finally { if (process.env.INTEG_NO_CLEAN) { context.log(`Left test directory in '${integTestDir}' ($INTEG_NO_CLEAN)\n`); } else { await fixture.dispose(success); } } }; } /** * Return whether or not the error is being caused by gopkg.in being down * * Our Go build depends on https://gopkg.in/, which has errors pretty often * (every couple of days). It is run by a single volunteer. */ function errorCausedByGoPkg(error) { // The error is different depending on what request fails. Messages recognized: //////////////////////////////////////////////////////////////////// // go: github.com/aws/aws-lambda-go@v1.28.0 requires // gopkg.in/yaml.v3@v3.0.0-20200615113413-eeeca48fe776: invalid version: git ls-remote -q origin in /go/pkg/mod/cache/vcs/0901dc1ef67fcce1c9b3ae51078740de4a0e2dc673e720584ac302973af82f36: exit status 128: // remote: Cannot obtain refs from GitHub: cannot talk to GitHub: Get https://github.com/go-yaml/yaml.git/info/refs?service=git-upload-pack: net/http: request canceled (Client.Timeout exceeded while awaiting headers) // fatal: unable to access 'https://gopkg.in/yaml.v3/': The requested URL returned error: 502 //////////////////////////////////////////////////////////////////// // go: downloading github.com/aws/aws-lambda-go v1.28.0 // go: github.com/aws/aws-lambda-go@v1.28.0 requires // gopkg.in/yaml.v3@v3.0.0-20200615113413-eeeca48fe776: unrecognized import path "gopkg.in/yaml.v3": reading https://gopkg.in/yaml.v3?go-get=1: 502 Bad Gateway // server response: Cannot obtain refs from GitHub: cannot talk to GitHub: Get https://github.com/go-yaml/yaml.git/info/refs?service=git-upload-pack: net/http: request canceled (Client.Timeout exceeded while awaiting headers) //////////////////////////////////////////////////////////////////// // go: github.com/aws/aws-lambda-go@v1.28.0 requires // gopkg.in/yaml.v3@v3.0.0-20200615113413-eeeca48fe776: invalid version: git fetch -f origin refs/heads/*:refs/heads/* refs/tags/*:refs/tags/* in /go/pkg/mod/cache/vcs/0901dc1ef67fcce1c9b3ae51078740de4a0e2dc673e720584ac302973af82f36: exit status 128: // error: RPC failed; HTTP 502 curl 22 The requested URL returned error: 502 // fatal: the remote end hung up unexpectedly //////////////////////////////////////////////////////////////////// return (error.includes('gopkg\.in.*invalid version.*exit status 128') || error.match(/unrecognized import path[^\n]gopkg\.in/)); } /** * SAM Integration test fixture for CDK - SAM integration test cases */ function withCliLibFixture(block) { return (0, with_aws_1.withAws)((0, with_timeout_1.withTimeout)(with_cdk_app_1.DEFAULT_TEST_TIMEOUT_S, withCliLibIntegrationCdkApp(block))); } class CliLibIntegrationTestFixture extends with_cdk_app_1.TestFixture { /** * */ async cdk(args, options = {}) { const action = args[0]; const stackName = args[1]; const cliOpts = { stacks: stackName ? [stackName] : undefined, }; if (action === 'deploy') { cliOpts.requireApproval = options.neverRequireApproval ? 'never' : 'broadening'; } return this.shell(['node', '--input-type=module', `<<__EOS__ import { AwsCdkCli } from '@aws-cdk/cli-lib-alpha'; const cli = AwsCdkCli.fromCdkAppDirectory(); await cli.${action}(${JSON.stringify(cliOpts)}); __EOS__`], { ...options, modEnv: { ...this.cdkShellEnv(), AWS_REGION: this.aws.region, AWS_DEFAULT_REGION: this.aws.region, STACK_NAME_PREFIX: this.stackNamePrefix, PACKAGE_LAYOUT_VERSION: '2', // In these tests we want to make a distinction between stdout and sterr CI: 'false', ...options.modEnv, }, }); } } exports.CliLibIntegrationTestFixture = CliLibIntegrationTestFixture; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jbGktbGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2l0aC1jbGktbGliLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWFBLGtFQTREQztBQWtDRCw4Q0FFQztBQTdHRCx5QkFBeUI7QUFDekIsNkJBQTZCO0FBRTdCLDJDQUE0QztBQUU1Qyx5Q0FBcUM7QUFFckMsaURBQTZIO0FBQzdILGlEQUE2QztBQUU3Qzs7R0FFRztBQUNILFNBQWdCLDJCQUEyQixDQUN6QyxLQUErRDtJQUMvRCxPQUFPLEtBQUssRUFBRSxPQUFVLEVBQUUsRUFBRTtRQUMxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQ25DLE1BQU0sZUFBZSxHQUFHLFdBQVcsS0FBSyxFQUFFLENBQUM7UUFDM0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRWxFLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLGVBQWUsSUFBSSxDQUFDLENBQUM7UUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsWUFBWSxJQUFJLENBQUMsQ0FBQztRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFFeEQsTUFBTSxJQUFBLDZCQUFjLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBYSxFQUFFLFVBQVUsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sT0FBTyxHQUFHLElBQUksNEJBQTRCLENBQzlDLFlBQVksRUFDWixlQUFlLEVBQ2YsT0FBTyxDQUFDLE1BQU0sRUFDZCxPQUFPLENBQUMsR0FBRyxFQUNYLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4QixNQUFNLE9BQU8s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Q0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDNUMsQ0FBQztRQUVGLElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUNsRixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLHFCQUFxQixFQUFFOzs7O2tCQUlwQyxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDM0MsQ0FBQyxFQUFFO1lBQ0wsR0FBRyxPQUFPO1lBQ1YsTUFBTSxFQUFFO2dCQUNOLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTTtnQkFDM0Isa0JBQWtCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNO2dCQUNuQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsZUFBZTtnQkFDdkMsc0JBQXNCLEVBQUUsR0FBRztnQkFDM0Isd0VBQXdFO2dCQUN4RSxFQUFFLEVBQUUsT0FBTztnQkFDWCxHQUFHLE9BQU8sQ0FBQyxNQUFNO2FBQ2xCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBbkNELG9FQW1DQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IFRlc3RDb250ZXh0IH0gZnJvbSAnLi9pbnRlZy10ZXN0JztcbmltcG9ydCB7IFJFU09VUkNFU19ESVIgfSBmcm9tICcuL3Jlc291cmNlcyc7XG5pbXBvcnQgdHlwZSB7IEF3c0NvbnRleHQgfSBmcm9tICcuL3dpdGgtYXdzJztcbmltcG9ydCB7IHdpdGhBd3MgfSBmcm9tICcuL3dpdGgtYXdzJztcbmltcG9ydCB0eXBlIHsgQ2RrQ2xpT3B0aW9ucywgRGlzYWJsZUJvb3RzdHJhcENvbnRleHQgfSBmcm9tICcuL3dpdGgtY2RrLWFwcCc7XG5pbXBvcnQgeyBjbG9uZURpcmVjdG9yeSwgaW5zdGFsbE5wbVBhY2thZ2VzLCBUZXN0Rml4dHVyZSwgREVGQVVMVF9URVNUX1RJTUVPVVRfUywgZW5zdXJlQm9vdHN0cmFwcGVkIH0gZnJvbSAnLi93aXRoLWNkay1hcHAnO1xuaW1wb3J0IHsgd2l0aFRpbWVvdXQgfSBmcm9tICcuL3dpdGgtdGltZW91dCc7XG5cbi8qKlxuICogSGlnaGVyIG9yZGVyIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYSBibG9jayB3aXRoIGEgQ2xpTGliIEludGVncmF0aW9uIENESyBhcHAgZml4dHVyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aENsaUxpYkludGVncmF0aW9uQ2RrQXBwPEEgZXh0ZW5kcyBUZXN0Q29udGV4dCAmIEF3c0NvbnRleHQgJiBEaXNhYmxlQm9vdHN0cmFwQ29udGV4dD4oXG4gIGJsb2NrOiAoY29udGV4dDogQ2xpTGliSW50ZWdyYXRpb25UZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPikge1xuICByZXR1cm4gYXN5bmMgKGNvbnRleHQ6IEEpID0+IHtcbiAgICBjb25zdCByYW5keSA9IGNvbnRleHQucmFuZG9tU3RyaW5nO1xuICAgIGNvbnN0IHN0YWNrTmFtZVByZWZpeCA9IGBjZGt0ZXN0LSR7cmFuZHl9YDtcbiAgICBjb25zdCBpbnRlZ1Rlc3REaXIgPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksIGBjZGstaW50ZWctJHtyYW5keX1gKTtcblxuICAgIGNvbnRleHQubG9nKGAgU3RhY2sgcHJlZml4OiAgICR7c3RhY2tOYW1lUHJlZml4fVxcbmApO1xuICAgIGNvbnRleHQubG9nKGAgVGVzdCBkaXJlY3Rvcnk6ICR7aW50ZWdUZXN0RGlyfVxcbmApO1xuICAgIGNvbnRleHQubG9nKGAgUmVnaW9uOiAgICAgICAgICR7Y29udGV4dC5hd3MucmVnaW9ufVxcbmApO1xuXG4gICAgYXdhaXQgY2xvbmVEaXJlY3RvcnkocGF0aC5qb2luKFJFU09VUkNFU19ESVIsICdjZGstYXBwcycsICdzaW1wbGUtYXBwJyksIGludGVnVGVzdERpciwgY29udGV4dC5vdXRwdXQpO1xuICAgIGNvbnN0IGZpeHR1cmUgPSBuZXcgQ2xpTGliSW50ZWdyYXRpb25UZXN0Rml4dHVyZShcbiAgICAgIGludGVnVGVzdERpcixcbiAgICAgIHN0YWNrTmFtZVByZWZpeCxcbiAgICAgIGNvbnRleHQub3V0cHV0LFxuICAgICAgY29udGV4dC5hd3MsXG4gICAgICBjb250ZXh0LnJhbmRvbVN0cmluZyk7XG4gICAgYXdhaXQgZml4dHVyZS5lY3JQdWJsaWNMb2dpbigpO1xuXG4gICAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnN0YWxsYXRpb25WZXJzaW9uID0gZml4dHVyZS5saWJyYXJ5LnJlcXVlc3RlZFZlcnNpb24oKTtcblxuICAgICAgY29uc3QgYWxwaGFJbnN0YWxsYXRpb25WZXJzaW9uID0gZml4dHVyZS5saWJyYXJ5LnJlcXVlc3RlZEFscGhhVmVyc2lvbigpO1xuXG4gICAgICAvLyBjbGktbGliLWFscGhhIGhhcyBhIG1hZ2ljIGFscGhhIHZlcnNpb24gaW4gdGhlIG9sZCByZWxlYXNlIHBpcGVsaW5lLFxuICAgICAgLy8gYnV0IHdpbGwganVzdCBtaXJyb3IgdGhlIENMSSB2ZXJzaW9uIGluIHRoZSBuZXcgcGlwZWxpbmUuXG4gICAgICBjb25zdCBjbGlMaWJWZXJzaW9uID0gcHJvY2Vzcy5lbnYuQ0xJX0xJQl9WRVJTSU9OX01JUlJPUlNfQ0xJXG4gICAgICAgID8gYCR7Zml4dHVyZS5jbGkucmVxdWVzdGVkVmVyc2lvbigpfS1hbHBoYS4wYFxuICAgICAgICA6IGFscGhhSW5zdGFsbGF0aW9uVmVyc2lvbjtcblxuICAgICAgYXdhaXQgaW5zdGFsbE5wbVBhY2thZ2VzKGZpeHR1cmUsIHtcbiAgICAgICAgJ2F3cy1jZGstbGliJzogaW5zdGFsbGF0aW9uVmVyc2lvbixcbiAgICAgICAgJ0Bhd3MtY2RrL2NsaS1saWItYWxwaGEnOiBjbGlMaWJWZXJzaW9uLFxuICAgICAgICAnQGF3cy1jZGsvYXdzLWxhbWJkYS1nby1hbHBoYSc6IGFscGhhSW5zdGFsbGF0aW9uVmVyc2lvbixcbiAgICAgICAgJ0Bhd3MtY2RrL2F3cy1sYW1iZGEtcHl0aG9uLWFscGhhJzogYWxwaGFJbnN0YWxsYXRpb25WZXJzaW9uLFxuICAgICAgICAnY29uc3RydWN0cyc6ICdeMTAnLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghY29udGV4dC5kaXNhYmxlQm9vdHN0cmFwKSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZUJvb3RzdHJhcHBlZChmaXh0dXJlKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYmxvY2soZml4dHVyZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAvLyBXZSBzdXJ2aXZlIGNlcnRhaW4gY2FzZXMgaW52b2x2aW5nIGdvcGtnLmluXG4gICAgICBpZiAoZXJyb3JDYXVzZWRCeUdvUGtnKGUubWVzc2FnZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgdGhyb3cgZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52LklOVEVHX05PX0NMRUFOKSB7XG4gICAgICAgIGNvbnRleHQubG9nKGBMZWZ0IHRlc3QgZGlyZWN0b3J5IGluICcke2ludGVnVGVzdERpcn0nICgkSU5URUdfTk9fQ0xFQU4pXFxuYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBmaXh0dXJlLmRpc3Bvc2Uoc3VjY2Vzcyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgZXJyb3IgaXMgYmVpbmcgY2F1c2VkIGJ5IGdvcGtnLmluIGJlaW5nIGRvd25cbiAqXG4gKiBPdXIgR28gYnVpbGQgZGVwZW5kcyBvbiBodHRwczovL2dvcGtnLmluLywgd2hpY2ggaGFzIGVycm9ycyBwcmV0dHkgb2Z0ZW5cbiAqIChldmVyeSBjb3VwbGUgb2YgZGF5cykuIEl0IGlzIHJ1biBieSBhIHNpbmdsZSB2b2x1bnRlZXIuXG4gKi9cbmZ1bmN0aW9uIGVycm9yQ2F1c2VkQnlHb1BrZyhlcnJvcjogc3RyaW5nKSB7XG4gIC8vIFRoZSBlcnJvciBpcyBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHdoYXQgcmVxdWVzdCBmYWlscy4gTWVzc2FnZXMgcmVjb2duaXplZDpcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gICAgZ286IGdpdGh1Yi5jb20vYXdzL2F3cy1sYW1iZGEtZ29AdjEuMjguMCByZXF1aXJlc1xuICAvLyAgICAgICAgZ29wa2cuaW4veWFtbC52M0B2My4wLjAtMjAyMDA2MTUxMTM0MTMtZWVlY2E0OGZlNzc2OiBpbnZhbGlkIHZlcnNpb246IGdpdCBscy1yZW1vdGUgLXEgb3JpZ2luIGluIC9nby9wa2cvbW9kL2NhY2hlL3Zjcy8wOTAxZGMxZWY2N2ZjY2UxYzliM2FlNTEwNzg3NDBkZTRhMGUyZGM2NzNlNzIwNTg0YWMzMDI5NzNhZjgyZjM2OiBleGl0IHN0YXR1cyAxMjg6XG4gIC8vICAgICAgICByZW1vdGU6IENhbm5vdCBvYnRhaW4gcmVmcyBmcm9tIEdpdEh1YjogY2Fubm90IHRhbGsgdG8gR2l0SHViOiBHZXQgaHR0cHM6Ly9naXRodWIuY29tL2dvLXlhbWwveWFtbC5naXQvaW5mby9yZWZzP3NlcnZpY2U9Z2l0LXVwbG9hZC1wYWNrOiBuZXQvaHR0cDogcmVxdWVzdCBjYW5jZWxlZCAoQ2xpZW50LlRpbWVvdXQgZXhjZWVkZWQgd2hpbGUgYXdhaXRpbmcgaGVhZGVycylcbiAgLy8gICAgICAgIGZhdGFsOiB1bmFibGUgdG8gYWNjZXNzICdodHRwczovL2dvcGtnLmluL3lhbWwudjMvJzogVGhlIHJlcXVlc3RlZCBVUkwgcmV0dXJuZWQgZXJyb3I6IDUwMlxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyAgICBnbzogZG93bmxvYWRpbmcgZ2l0aHViLmNvbS9hd3MvYXdzLWxhbWJkYS1nbyB2MS4yOC4wXG4gIC8vICAgIGdvOiBnaXRodWIuY29tL2F3cy9hd3MtbGFtYmRhLWdvQHYxLjI4LjAgcmVxdWlyZXNcbiAgLy8gICAgICAgIGdvcGtnLmluL3lhbWwudjNAdjMuMC4wLTIwMjAwNjE1MTEzNDEzLWVlZWNhNDhmZTc3NjogdW5yZWNvZ25pemVkIGltcG9ydCBwYXRoIFwiZ29wa2cuaW4veWFtbC52M1wiOiByZWFkaW5nIGh0dHBzOi8vZ29wa2cuaW4veWFtbC52Mz9nby1nZXQ9MTogNTAyIEJhZCBHYXRld2F5XG4gIC8vICAgICAgICBzZXJ2ZXIgcmVzcG9uc2U6IENhbm5vdCBvYnRhaW4gcmVmcyBmcm9tIEdpdEh1YjogY2Fubm90IHRhbGsgdG8gR2l0SHViOiBHZXQgaHR0cHM6Ly9naXRodWIuY29tL2dvLXlhbWwveWFtbC5naXQvaW5mby9yZWZzP3NlcnZpY2U9Z2l0LXVwbG9hZC1wYWNrOiBuZXQvaHR0cDogcmVxdWVzdCBjYW5jZWxlZCAoQ2xpZW50LlRpbWVvdXQgZXhjZWVkZWQgd2hpbGUgYXdhaXRpbmcgaGVhZGVycylcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gICAgZ286IGdpdGh1Yi5jb20vYXdzL2F3cy1sYW1iZGEtZ29AdjEuMjguMCByZXF1aXJlc1xuICAvLyAgICAgICAgZ29wa2cuaW4veWFtbC52M0B2My4wLjAtMjAyMDA2MTUxMTM0MTMtZWVlY2E0OGZlNzc2OiBpbnZhbGlkIHZlcnNpb246IGdpdCBmZXRjaCAtZiBvcmlnaW4gcmVmcy9oZWFkcy8qOnJlZnMvaGVhZHMvKiByZWZzL3RhZ3MvKjpyZWZzL3RhZ3MvKiBpbiAvZ28vcGtnL21vZC9jYWNoZS92Y3MvMDkwMWRjMWVmNjdmY2NlMWM5YjNhZTUxMDc4NzQwZGU0YTBlMmRjNjczZTcyMDU4NGFjMzAyOTczYWY4MmYzNjogZXhpdCBzdGF0dXMgMTI4OlxuICAvLyAgICAgICAgZXJyb3I6IFJQQyBmYWlsZWQ7IEhUVFAgNTAyIGN1cmwgMjIgVGhlIHJlcXVlc3RlZCBVUkwgcmV0dXJuZWQgZXJyb3I6IDUwMlxuICAvLyAgICAgICAgZmF0YWw6IHRoZSByZW1vdGUgZW5kIGh1bmcgdXAgdW5leHBlY3RlZGx5XG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgcmV0dXJuIChlcnJvci5pbmNsdWRlcygnZ29wa2dcXC5pbi4qaW52YWxpZCB2ZXJzaW9uLipleGl0IHN0YXR1cyAxMjgnKVxuICAgIHx8IGVycm9yLm1hdGNoKC91bnJlY29nbml6ZWQgaW1wb3J0IHBhdGhbXlxcbl1nb3BrZ1xcLmluLykpO1xufVxuXG4vKipcbiAqIFNBTSBJbnRlZ3JhdGlvbiB0ZXN0IGZpeHR1cmUgZm9yIENESyAtIFNBTSBpbnRlZ3JhdGlvbiB0ZXN0IGNhc2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQ2xpTGliRml4dHVyZShibG9jazogKGNvbnRleHQ6IENsaUxpYkludGVncmF0aW9uVGVzdEZpeHR1cmUpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgcmV0dXJuIHdpdGhBd3Mod2l0aFRpbWVvdXQoREVGQVVMVF9URVNUX1RJTUVPVVRfUywgd2l0aENsaUxpYkludGVncmF0aW9uQ2RrQXBwKGJsb2NrKSkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2xpTGliSW50ZWdyYXRpb25UZXN0Rml4dHVyZSBleHRlbmRzIFRlc3RGaXh0dXJlIHtcbiAgLyoqXG4gICAqXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2RrKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBDZGtDbGlPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBhY3Rpb24gPSBhcmdzWzBdO1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IGFyZ3NbMV07XG5cbiAgICBjb25zdCBjbGlPcHRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgc3RhY2tzOiBzdGFja05hbWUgPyBbc3RhY2tOYW1lXSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgaWYgKGFjdGlvbiA9PT0gJ2RlcGxveScpIHtcbiAgICAgIGNsaU9wdHMucmVxdWlyZUFwcHJvdmFsID0gb3B0aW9ucy5uZXZlclJlcXVpcmVBcHByb3ZhbCA/ICduZXZlcicgOiAnYnJvYWRlbmluZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2hlbGwoWydub2RlJywgJy0taW5wdXQtdHlwZT1tb2R1bGUnLCBgPDxfX0VPU19fXG4gICAgICBpbXBvcnQgeyBBd3NDZGtDbGkgfSBmcm9tICdAYXdzLWNkay9jbGktbGliLWFscGhhJztcbiAgICAgIGNvbnN0IGNsaSA9IEF3c0Nka0NsaS5mcm9tQ2RrQXBwRGlyZWN0b3J5KCk7XG5cbiAgICAgIGF3YWl0IGNsaS4ke2FjdGlvbn0oJHtKU09OLnN0cmluZ2lmeShjbGlPcHRzKX0pO1xuX19FT1NfX2BdLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbW9kRW52OiB7XG4gICAgICAgIC4uLnRoaXMuY2RrU2hlbGxFbnYoKSxcbiAgICAgICAgQVdTX1JFR0lPTjogdGhpcy5hd3MucmVnaW9uLFxuICAgICAgICBBV1NfREVGQVVMVF9SRUdJT046IHRoaXMuYXdzLnJlZ2lvbixcbiAgICAgICAgU1RBQ0tfTkFNRV9QUkVGSVg6IHRoaXMuc3RhY2tOYW1lUHJlZml4LFxuICAgICAgICBQQUNLQUdFX0xBWU9VVF9WRVJTSU9OOiAnMicsXG4gICAgICAgIC8vIEluIHRoZXNlIHRlc3RzIHdlIHdhbnQgdG8gbWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gc3Rkb3V0IGFuZCBzdGVyclxuICAgICAgICBDSTogJ2ZhbHNlJyxcbiAgICAgICAgLi4ub3B0aW9ucy5tb2RFbnYsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbiJdfQ==