@ashishpandeyone/cdk-lambda-web-function 0.1.0 → 0.1.1
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 +589 -87
- package/.jsii.tabl.json +1 -1
- package/API.md +1348 -219
- package/README.md +24 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/nodejs-web-function.d.ts +153 -0
- package/lib/nodejs-web-function.js +113 -0
- package/lib/private/bundling.d.ts +68 -0
- package/lib/private/bundling.js +192 -0
- package/lib/web-function-endpoint.js +1 -1
- package/lib/web-function-grants.js +1 -1
- package/lib/web-function.d.ts +24 -19
- package/lib/web-function.js +2 -2
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -151,6 +151,30 @@ table.grantReadWriteData(api); // the default role trusts lambda.amazo
|
|
|
151
151
|
- Environment variable names starting with `AWS_` are reserved.
|
|
152
152
|
- **Renaming the function replaces it and changes its URL.** A generated name depends on the construct path, so moving the construct renames it too.
|
|
153
153
|
|
|
154
|
+
### Bundling TypeScript with `NodejsWebFunction`
|
|
155
|
+
|
|
156
|
+
`NodejsWebFunction` is a `WebFunction` that bundles your server from a TypeScript or JavaScript entry file with esbuild, like `NodejsFunction` does for Lambda functions:
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
new NodejsWebFunction(this, 'Api', {
|
|
160
|
+
entry: 'src/server.ts',
|
|
161
|
+
authType: WebFunctionAuthType.AWS_IAM,
|
|
162
|
+
bundling: {
|
|
163
|
+
minify: true, // default true
|
|
164
|
+
sourceMap: true, // default true
|
|
165
|
+
format: lambdaNodejs.OutputFormat.ESM, // default ESM (index.mjs); CJS gives index.js
|
|
166
|
+
externalModules: [], // default: bundle everything you import
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
- **Defaults:** `runtime` is `NODEJS_24_X`, and the esbuild target follows the runtime (`node24`). The project root is the directory of the nearest lock file above `entry` (override it with `depsLockFilePath` or `projectRoot`).
|
|
172
|
+
- **It also sets what a `lambda.Code` can't:** the entry point that matches the bundle, and `NODE_OPTIONS=--enable-source-maps` when source maps are on, appended to any `NODE_OPTIONS` you set, so stack traces point at your `.ts` files (e.g. `/var/task/src/server.ts:22:12`). Source map paths are relative to the project root, so no build-machine paths are deployed.
|
|
173
|
+
- **ESM bundles include a `require` shim**, so CommonJS dependencies that load Node.js built-ins (Express, for example) work.
|
|
174
|
+
- **The AWS SDK is bundled like any other dependency**, since the runtime has none. Only the clients you import are included.
|
|
175
|
+
- **Bundling runs locally** when esbuild is installed in your project, and otherwise in Docker (an arm64 AWS SAM build image; set `forceDockerBundling` to always use Docker).
|
|
176
|
+
- **Not yet supported:** installing native modules next to the bundle (`nodeModules`) and command hooks. For native dependencies, use `WebFunction` with `Code.fromAsset(..., { bundling: { image, command } })`.
|
|
177
|
+
|
|
154
178
|
### Code
|
|
155
179
|
|
|
156
180
|
`code` takes any `lambda.Code` that produces a zip in S3: `fromAsset`, `fromBucket`/`fromBucketV2`, `fromCustomCommand`, `fromDockerBuild`. Inline code and container images fail at synth time.
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -18,4 +18,5 @@ __exportStar(require("./enums"), exports);
|
|
|
18
18
|
__exportStar(require("./web-function"), exports);
|
|
19
19
|
__exportStar(require("./web-function-endpoint"), exports);
|
|
20
20
|
__exportStar(require("./web-function-grants"), exports);
|
|
21
|
-
|
|
21
|
+
__exportStar(require("./nodejs-web-function"), exports);
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBDQUF3QjtBQUN4QixpREFBK0I7QUFDL0IsMERBQXdDO0FBQ3hDLHdEQUFzQztBQUN0Qyx3REFBc0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vd2ViLWZ1bmN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vd2ViLWZ1bmN0aW9uLWVuZHBvaW50JztcbmV4cG9ydCAqIGZyb20gJy4vd2ViLWZ1bmN0aW9uLWdyYW50cyc7XG5leHBvcnQgKiBmcm9tICcuL25vZGVqcy13ZWItZnVuY3Rpb24nO1xuIl19
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { DockerImage } from 'aws-cdk-lib';
|
|
2
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
3
|
+
import { OutputFormat } from 'aws-cdk-lib/aws-lambda-nodejs';
|
|
4
|
+
import type { Construct } from 'constructs';
|
|
5
|
+
import { WebFunction, type WebFunctionOptions } from './web-function';
|
|
6
|
+
/**
|
|
7
|
+
* How `NodejsWebFunction` bundles the server with esbuild.
|
|
8
|
+
*/
|
|
9
|
+
export interface NodejsWebFunctionBundlingOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Minify the bundle.
|
|
12
|
+
*
|
|
13
|
+
* @default true
|
|
14
|
+
*/
|
|
15
|
+
readonly minify?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Generate a source map, and set `NODE_OPTIONS=--enable-source-maps` so stack traces point at your sources.
|
|
18
|
+
*
|
|
19
|
+
* @default true
|
|
20
|
+
*/
|
|
21
|
+
readonly sourceMap?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Output format. ESM is written to `index.mjs` (with a `require` shim, so CommonJS dependencies
|
|
24
|
+
* such as Express work); CommonJS to `index.js`.
|
|
25
|
+
*
|
|
26
|
+
* @default OutputFormat.ESM
|
|
27
|
+
*/
|
|
28
|
+
readonly format?: OutputFormat;
|
|
29
|
+
/**
|
|
30
|
+
* esbuild target.
|
|
31
|
+
*
|
|
32
|
+
* @default - the runtime's Node.js version, e.g. `node24`
|
|
33
|
+
*/
|
|
34
|
+
readonly target?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Modules to leave out of the bundle. The runtime has no AWS SDK, so `@aws-sdk/*` is bundled like
|
|
37
|
+
* any other dependency; only exclude modules you provide another way.
|
|
38
|
+
*
|
|
39
|
+
* @default - none
|
|
40
|
+
*/
|
|
41
|
+
readonly externalModules?: string[];
|
|
42
|
+
/**
|
|
43
|
+
* Replace global identifiers with constant expressions (esbuild `--define`).
|
|
44
|
+
*
|
|
45
|
+
* @default - none
|
|
46
|
+
*/
|
|
47
|
+
readonly define?: {
|
|
48
|
+
[key: string]: string;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* esbuild loaders by file extension, e.g. `{ '.png': 'dataurl' }`.
|
|
52
|
+
*
|
|
53
|
+
* @default - esbuild's defaults
|
|
54
|
+
*/
|
|
55
|
+
readonly loader?: {
|
|
56
|
+
[ext: string]: string;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Text to prepend to the bundle.
|
|
60
|
+
*
|
|
61
|
+
* @default - none
|
|
62
|
+
*/
|
|
63
|
+
readonly banner?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Text to append to the bundle.
|
|
66
|
+
*
|
|
67
|
+
* @default - none
|
|
68
|
+
*/
|
|
69
|
+
readonly footer?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Path of the tsconfig.json to use, relative to the project root or absolute (inside the project root).
|
|
72
|
+
*
|
|
73
|
+
* @default - esbuild's lookup from the entry file
|
|
74
|
+
*/
|
|
75
|
+
readonly tsconfig?: string;
|
|
76
|
+
/**
|
|
77
|
+
* Keep function and class names (`--keep-names`).
|
|
78
|
+
*
|
|
79
|
+
* @default false
|
|
80
|
+
*/
|
|
81
|
+
readonly keepNames?: boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Extra esbuild arguments, e.g. `{ '--log-limit': '0', '--tree-shaking': true }`.
|
|
84
|
+
*
|
|
85
|
+
* @default - none
|
|
86
|
+
*/
|
|
87
|
+
readonly esbuildArgs?: {
|
|
88
|
+
[arg: string]: string | boolean;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Environment variables while bundling (not at runtime).
|
|
92
|
+
*
|
|
93
|
+
* @default - none
|
|
94
|
+
*/
|
|
95
|
+
readonly environment?: {
|
|
96
|
+
[key: string]: string;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Always bundle in Docker, even if esbuild is installed locally.
|
|
100
|
+
*
|
|
101
|
+
* @default false
|
|
102
|
+
*/
|
|
103
|
+
readonly forceDockerBundling?: boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Docker image for bundling when esbuild isn't installed locally.
|
|
106
|
+
*
|
|
107
|
+
* @default - the arm64 AWS SAM build image for the runtime, e.g. `public.ecr.aws/sam/build-nodejs24.x:latest-arm64`
|
|
108
|
+
*/
|
|
109
|
+
readonly dockerImage?: DockerImage;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Properties for a `NodejsWebFunction`.
|
|
113
|
+
*/
|
|
114
|
+
export interface NodejsWebFunctionProps extends WebFunctionOptions {
|
|
115
|
+
/**
|
|
116
|
+
* The file that starts your server (TypeScript or JavaScript). It's bundled with its dependencies.
|
|
117
|
+
*/
|
|
118
|
+
readonly entry: string;
|
|
119
|
+
/**
|
|
120
|
+
* The Node.js runtime.
|
|
121
|
+
*
|
|
122
|
+
* @default lambda.Runtime.NODEJS_24_X
|
|
123
|
+
*/
|
|
124
|
+
readonly runtime?: lambda.Runtime;
|
|
125
|
+
/**
|
|
126
|
+
* The lock file that marks the project root (where esbuild resolves `node_modules`).
|
|
127
|
+
*
|
|
128
|
+
* @default - the nearest `package-lock.json`, `yarn.lock`, `pnpm-lock.yaml` or `bun.lock(b)` above the entry
|
|
129
|
+
*/
|
|
130
|
+
readonly depsLockFilePath?: string;
|
|
131
|
+
/**
|
|
132
|
+
* The project root. Must contain the entry file.
|
|
133
|
+
*
|
|
134
|
+
* @default - the directory of the lock file
|
|
135
|
+
*/
|
|
136
|
+
readonly projectRoot?: string;
|
|
137
|
+
/**
|
|
138
|
+
* How the server is bundled.
|
|
139
|
+
*
|
|
140
|
+
* @default - minified ESM with a source map, targeting the runtime's Node.js version
|
|
141
|
+
*/
|
|
142
|
+
readonly bundling?: NodejsWebFunctionBundlingOptions;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* A `WebFunction` whose code is bundled from a TypeScript or JavaScript entry file with esbuild,
|
|
146
|
+
* like `NodejsFunction` for Lambda functions.
|
|
147
|
+
*
|
|
148
|
+
* Besides bundling, it sets what a `lambda.Code` alone can't: the entry point that matches the
|
|
149
|
+
* bundle, and `NODE_OPTIONS=--enable-source-maps` when source maps are on.
|
|
150
|
+
*/
|
|
151
|
+
export declare class NodejsWebFunction extends WebFunction {
|
|
152
|
+
constructor(scope: Construct, id: string, props: NodejsWebFunctionProps);
|
|
153
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.NodejsWebFunction = void 0;
|
|
37
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
40
|
+
const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
|
|
41
|
+
const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
|
|
42
|
+
const bundling_1 = require("./private/bundling");
|
|
43
|
+
const web_function_1 = require("./web-function");
|
|
44
|
+
/**
|
|
45
|
+
* A `WebFunction` whose code is bundled from a TypeScript or JavaScript entry file with esbuild,
|
|
46
|
+
* like `NodejsFunction` for Lambda functions.
|
|
47
|
+
*
|
|
48
|
+
* Besides bundling, it sets what a `lambda.Code` alone can't: the entry point that matches the
|
|
49
|
+
* bundle, and `NODE_OPTIONS=--enable-source-maps` when source maps are on.
|
|
50
|
+
*/
|
|
51
|
+
class NodejsWebFunction extends web_function_1.WebFunction {
|
|
52
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.NodejsWebFunction", version: "0.1.1" };
|
|
53
|
+
constructor(scope, id, props) {
|
|
54
|
+
const runtime = props.runtime ?? lambda.Runtime.NODEJS_24_X;
|
|
55
|
+
const entry = (0, bundling_1.resolveEntry)(props.entry);
|
|
56
|
+
const projectRoot = path.resolve(props.projectRoot ?? path.dirname(lockFile(props, entry)));
|
|
57
|
+
if (path.relative(projectRoot, entry).startsWith('..')) {
|
|
58
|
+
throw new Error(`entry ${entry} must be inside projectRoot ${projectRoot}`);
|
|
59
|
+
}
|
|
60
|
+
const b = props.bundling ?? {};
|
|
61
|
+
const format = b.format ?? aws_lambda_nodejs_1.OutputFormat.ESM;
|
|
62
|
+
const sourceMap = b.sourceMap ?? true;
|
|
63
|
+
const nodeMajor = /^nodejs(\d+)/.exec(runtime.name)?.[1];
|
|
64
|
+
const code = (0, bundling_1.bundledCode)({
|
|
65
|
+
entry,
|
|
66
|
+
projectRoot,
|
|
67
|
+
environment: b.environment,
|
|
68
|
+
forceDockerBundling: b.forceDockerBundling ?? false,
|
|
69
|
+
dockerImage: b.dockerImage ?? aws_cdk_lib_1.DockerImage.fromRegistry(`public.ecr.aws/sam/build-${runtime.name}:latest-arm64`),
|
|
70
|
+
esbuild: {
|
|
71
|
+
minify: b.minify ?? true,
|
|
72
|
+
sourceMap,
|
|
73
|
+
format,
|
|
74
|
+
target: b.target ?? (nodeMajor ? `node${nodeMajor}` : 'node24'),
|
|
75
|
+
externalModules: b.externalModules ?? [],
|
|
76
|
+
define: b.define ?? {},
|
|
77
|
+
loader: b.loader ?? {},
|
|
78
|
+
banner: b.banner,
|
|
79
|
+
footer: b.footer,
|
|
80
|
+
tsconfig: b.tsconfig,
|
|
81
|
+
keepNames: b.keepNames ?? false,
|
|
82
|
+
esbuildArgs: b.esbuildArgs ?? {},
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
super(scope, id, {
|
|
86
|
+
...props,
|
|
87
|
+
runtime,
|
|
88
|
+
code,
|
|
89
|
+
entrypoint: (0, bundling_1.outputFile)(format),
|
|
90
|
+
environment: withSourceMaps(props.environment, sourceMap),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.NodejsWebFunction = NodejsWebFunction;
|
|
95
|
+
function lockFile(props, entry) {
|
|
96
|
+
if (props.depsLockFilePath)
|
|
97
|
+
return path.resolve(props.depsLockFilePath);
|
|
98
|
+
const found = (0, bundling_1.findLockFile)(path.dirname(entry));
|
|
99
|
+
if (!found) {
|
|
100
|
+
throw new Error(`no lock file (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lock) found above ${entry}; set depsLockFilePath or projectRoot`);
|
|
101
|
+
}
|
|
102
|
+
return found;
|
|
103
|
+
}
|
|
104
|
+
/** Adds `--enable-source-maps` to NODE_OPTIONS, keeping anything the user set. */
|
|
105
|
+
function withSourceMaps(environment, sourceMap) {
|
|
106
|
+
if (!sourceMap)
|
|
107
|
+
return environment;
|
|
108
|
+
const existing = environment?.NODE_OPTIONS;
|
|
109
|
+
if (existing?.split(/\s+/).includes('--enable-source-maps'))
|
|
110
|
+
return environment;
|
|
111
|
+
return { ...environment, NODE_OPTIONS: existing ? `${existing} --enable-source-maps` : '--enable-source-maps' };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZWpzLXdlYi1mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ub2RlanMtd2ViLWZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnREFBa0M7QUFDbEMsNkNBQTBDO0FBQzFDLCtEQUFpRDtBQUNqRCxxRUFBNkQ7QUFFN0QsaURBQXlGO0FBQ3pGLGlEQUFzRTtBQXdKdEU7Ozs7OztHQU1HO0FBQ0gsTUFBYSxpQkFBa0IsU0FBUSwwQkFBVzs7SUFDaEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE2QjtRQUNyRSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzVELE1BQU0sS0FBSyxHQUFHLElBQUEsdUJBQVksRUFBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUYsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2RCxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSywrQkFBK0IsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxnQ0FBWSxDQUFDLEdBQUcsQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpELE1BQU0sSUFBSSxHQUFHLElBQUEsc0JBQVcsRUFBQztZQUN2QixLQUFLO1lBQ0wsV0FBVztZQUNYLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVztZQUMxQixtQkFBbUIsRUFBRSxDQUFDLENBQUMsbUJBQW1CLElBQUksS0FBSztZQUNuRCxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVcsSUFBSSx5QkFBVyxDQUFDLFlBQVksQ0FBQyw0QkFBNEIsT0FBTyxDQUFDLElBQUksZUFBZSxDQUFDO1lBQy9HLE9BQU8sRUFBRTtnQkFDUCxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJO2dCQUN4QixTQUFTO2dCQUNULE1BQU07Z0JBQ04sTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDL0QsZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlLElBQUksRUFBRTtnQkFDeEMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRTtnQkFDdEIsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRTtnQkFDdEIsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNO2dCQUNoQixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07Z0JBQ2hCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtnQkFDcEIsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLElBQUksS0FBSztnQkFDL0IsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLElBQUksRUFBRTthQUNqQztTQUNGLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsT0FBTztZQUNQLElBQUk7WUFDSixVQUFVLEVBQUUsSUFBQSxxQkFBVSxFQUFDLE1BQU0sQ0FBQztZQUM5QixXQUFXLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDO1NBQzFELENBQUMsQ0FBQztJQUNMLENBQUM7O0FBM0NILDhDQTRDQztBQUVELFNBQVMsUUFBUSxDQUFDLEtBQTZCLEVBQUUsS0FBYTtJQUM1RCxJQUFJLEtBQUssQ0FBQyxnQkFBZ0I7UUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBQSx1QkFBWSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNoRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHFGQUFxRixLQUFLLHVDQUF1QyxDQUFDLENBQUM7SUFDckosQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixTQUFTLGNBQWMsQ0FBQyxXQUFrRCxFQUFFLFNBQWtCO0lBQzVGLElBQUksQ0FBQyxTQUFTO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDbkMsTUFBTSxRQUFRLEdBQUcsV0FBVyxFQUFFLFlBQVksQ0FBQztJQUMzQyxJQUFJLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDaEYsT0FBTyxFQUFFLEdBQUcsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztBQUNsSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgRG9ja2VySW1hZ2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBPdXRwdXRGb3JtYXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgYnVuZGxlZENvZGUsIGZpbmRMb2NrRmlsZSwgb3V0cHV0RmlsZSwgcmVzb2x2ZUVudHJ5IH0gZnJvbSAnLi9wcml2YXRlL2J1bmRsaW5nJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uLCB0eXBlIFdlYkZ1bmN0aW9uT3B0aW9ucyB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uJztcblxuLyoqXG4gKiBIb3cgYE5vZGVqc1dlYkZ1bmN0aW9uYCBidW5kbGVzIHRoZSBzZXJ2ZXIgd2l0aCBlc2J1aWxkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVqc1dlYkZ1bmN0aW9uQnVuZGxpbmdPcHRpb25zIHtcbiAgLyoqXG4gICAqIE1pbmlmeSB0aGUgYnVuZGxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBtaW5pZnk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHNvdXJjZSBtYXAsIGFuZCBzZXQgYE5PREVfT1BUSU9OUz0tLWVuYWJsZS1zb3VyY2UtbWFwc2Agc28gc3RhY2sgdHJhY2VzIHBvaW50IGF0IHlvdXIgc291cmNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlTWFwPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3V0cHV0IGZvcm1hdC4gRVNNIGlzIHdyaXR0ZW4gdG8gYGluZGV4Lm1qc2AgKHdpdGggYSBgcmVxdWlyZWAgc2hpbSwgc28gQ29tbW9uSlMgZGVwZW5kZW5jaWVzXG4gICAqIHN1Y2ggYXMgRXhwcmVzcyB3b3JrKTsgQ29tbW9uSlMgdG8gYGluZGV4LmpzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgT3V0cHV0Rm9ybWF0LkVTTVxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0PzogT3V0cHV0Rm9ybWF0O1xuXG4gIC8qKlxuICAgKiBlc2J1aWxkIHRhcmdldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgcnVudGltZSdzIE5vZGUuanMgdmVyc2lvbiwgZS5nLiBgbm9kZTI0YFxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNb2R1bGVzIHRvIGxlYXZlIG91dCBvZiB0aGUgYnVuZGxlLiBUaGUgcnVudGltZSBoYXMgbm8gQVdTIFNESywgc28gYEBhd3Mtc2RrLypgIGlzIGJ1bmRsZWQgbGlrZVxuICAgKiBhbnkgb3RoZXIgZGVwZW5kZW5jeTsgb25seSBleGNsdWRlIG1vZHVsZXMgeW91IHByb3ZpZGUgYW5vdGhlciB3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxNb2R1bGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgZ2xvYmFsIGlkZW50aWZpZXJzIHdpdGggY29uc3RhbnQgZXhwcmVzc2lvbnMgKGVzYnVpbGQgYC0tZGVmaW5lYCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVmaW5lPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogZXNidWlsZCBsb2FkZXJzIGJ5IGZpbGUgZXh0ZW5zaW9uLCBlLmcuIGB7ICcucG5nJzogJ2RhdGF1cmwnIH1gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGVzYnVpbGQncyBkZWZhdWx0c1xuICAgKi9cbiAgcmVhZG9ubHkgbG9hZGVyPzogeyBbZXh0OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogVGV4dCB0byBwcmVwZW5kIHRvIHRoZSBidW5kbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgYmFubmVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUZXh0IHRvIGFwcGVuZCB0byB0aGUgYnVuZGxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGZvb3Rlcj86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCBvZiB0aGUgdHNjb25maWcuanNvbiB0byB1c2UsIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3Qgb3IgYWJzb2x1dGUgKGluc2lkZSB0aGUgcHJvamVjdCByb290KS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBlc2J1aWxkJ3MgbG9va3VwIGZyb20gdGhlIGVudHJ5IGZpbGVcbiAgICovXG4gIHJlYWRvbmx5IHRzY29uZmlnPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZWVwIGZ1bmN0aW9uIGFuZCBjbGFzcyBuYW1lcyAoYC0ta2VlcC1uYW1lc2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkga2VlcE5hbWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXh0cmEgZXNidWlsZCBhcmd1bWVudHMsIGUuZy4gYHsgJy0tbG9nLWxpbWl0JzogJzAnLCAnLS10cmVlLXNoYWtpbmcnOiB0cnVlIH1gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGVzYnVpbGRBcmdzPzogeyBbYXJnOiBzdHJpbmddOiBzdHJpbmcgfCBib29sZWFuIH07XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyB3aGlsZSBidW5kbGluZyAobm90IGF0IHJ1bnRpbWUpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogQWx3YXlzIGJ1bmRsZSBpbiBEb2NrZXIsIGV2ZW4gaWYgZXNidWlsZCBpcyBpbnN0YWxsZWQgbG9jYWxseS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGZvcmNlRG9ja2VyQnVuZGxpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEb2NrZXIgaW1hZ2UgZm9yIGJ1bmRsaW5nIHdoZW4gZXNidWlsZCBpc24ndCBpbnN0YWxsZWQgbG9jYWxseS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgYXJtNjQgQVdTIFNBTSBidWlsZCBpbWFnZSBmb3IgdGhlIHJ1bnRpbWUsIGUuZy4gYHB1YmxpYy5lY3IuYXdzL3NhbS9idWlsZC1ub2RlanMyNC54OmxhdGVzdC1hcm02NGBcbiAgICovXG4gIHJlYWRvbmx5IGRvY2tlckltYWdlPzogRG9ja2VySW1hZ2U7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBgTm9kZWpzV2ViRnVuY3Rpb25gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVqc1dlYkZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBXZWJGdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGZpbGUgdGhhdCBzdGFydHMgeW91ciBzZXJ2ZXIgKFR5cGVTY3JpcHQgb3IgSmF2YVNjcmlwdCkuIEl0J3MgYnVuZGxlZCB3aXRoIGl0cyBkZXBlbmRlbmNpZXMuXG4gICAqL1xuICByZWFkb25seSBlbnRyeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgTm9kZS5qcyBydW50aW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjRfWFxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZT86IGxhbWJkYS5SdW50aW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9jayBmaWxlIHRoYXQgbWFya3MgdGhlIHByb2plY3Qgcm9vdCAod2hlcmUgZXNidWlsZCByZXNvbHZlcyBgbm9kZV9tb2R1bGVzYCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIG5lYXJlc3QgYHBhY2thZ2UtbG9jay5qc29uYCwgYHlhcm4ubG9ja2AsIGBwbnBtLWxvY2sueWFtbGAgb3IgYGJ1bi5sb2NrKGIpYCBhYm92ZSB0aGUgZW50cnlcbiAgICovXG4gIHJlYWRvbmx5IGRlcHNMb2NrRmlsZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9qZWN0IHJvb3QuIE11c3QgY29udGFpbiB0aGUgZW50cnkgZmlsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgZGlyZWN0b3J5IG9mIHRoZSBsb2NrIGZpbGVcbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3RSb290Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIHNlcnZlciBpcyBidW5kbGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG1pbmlmaWVkIEVTTSB3aXRoIGEgc291cmNlIG1hcCwgdGFyZ2V0aW5nIHRoZSBydW50aW1lJ3MgTm9kZS5qcyB2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBidW5kbGluZz86IE5vZGVqc1dlYkZ1bmN0aW9uQnVuZGxpbmdPcHRpb25zO1xufVxuXG4vKipcbiAqIEEgYFdlYkZ1bmN0aW9uYCB3aG9zZSBjb2RlIGlzIGJ1bmRsZWQgZnJvbSBhIFR5cGVTY3JpcHQgb3IgSmF2YVNjcmlwdCBlbnRyeSBmaWxlIHdpdGggZXNidWlsZCxcbiAqIGxpa2UgYE5vZGVqc0Z1bmN0aW9uYCBmb3IgTGFtYmRhIGZ1bmN0aW9ucy5cbiAqXG4gKiBCZXNpZGVzIGJ1bmRsaW5nLCBpdCBzZXRzIHdoYXQgYSBgbGFtYmRhLkNvZGVgIGFsb25lIGNhbid0OiB0aGUgZW50cnkgcG9pbnQgdGhhdCBtYXRjaGVzIHRoZVxuICogYnVuZGxlLCBhbmQgYE5PREVfT1BUSU9OUz0tLWVuYWJsZS1zb3VyY2UtbWFwc2Agd2hlbiBzb3VyY2UgbWFwcyBhcmUgb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBOb2RlanNXZWJGdW5jdGlvbiBleHRlbmRzIFdlYkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5vZGVqc1dlYkZ1bmN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCBydW50aW1lID0gcHJvcHMucnVudGltZSA/PyBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjRfWDtcbiAgICBjb25zdCBlbnRyeSA9IHJlc29sdmVFbnRyeShwcm9wcy5lbnRyeSk7XG4gICAgY29uc3QgcHJvamVjdFJvb3QgPSBwYXRoLnJlc29sdmUocHJvcHMucHJvamVjdFJvb3QgPz8gcGF0aC5kaXJuYW1lKGxvY2tGaWxlKHByb3BzLCBlbnRyeSkpKTtcbiAgICBpZiAocGF0aC5yZWxhdGl2ZShwcm9qZWN0Um9vdCwgZW50cnkpLnN0YXJ0c1dpdGgoJy4uJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZW50cnkgJHtlbnRyeX0gbXVzdCBiZSBpbnNpZGUgcHJvamVjdFJvb3QgJHtwcm9qZWN0Um9vdH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBiID0gcHJvcHMuYnVuZGxpbmcgPz8ge307XG4gICAgY29uc3QgZm9ybWF0ID0gYi5mb3JtYXQgPz8gT3V0cHV0Rm9ybWF0LkVTTTtcbiAgICBjb25zdCBzb3VyY2VNYXAgPSBiLnNvdXJjZU1hcCA/PyB0cnVlO1xuICAgIGNvbnN0IG5vZGVNYWpvciA9IC9ebm9kZWpzKFxcZCspLy5leGVjKHJ1bnRpbWUubmFtZSk/LlsxXTtcblxuICAgIGNvbnN0IGNvZGUgPSBidW5kbGVkQ29kZSh7XG4gICAgICBlbnRyeSxcbiAgICAgIHByb2plY3RSb290LFxuICAgICAgZW52aXJvbm1lbnQ6IGIuZW52aXJvbm1lbnQsXG4gICAgICBmb3JjZURvY2tlckJ1bmRsaW5nOiBiLmZvcmNlRG9ja2VyQnVuZGxpbmcgPz8gZmFsc2UsXG4gICAgICBkb2NrZXJJbWFnZTogYi5kb2NrZXJJbWFnZSA/PyBEb2NrZXJJbWFnZS5mcm9tUmVnaXN0cnkoYHB1YmxpYy5lY3IuYXdzL3NhbS9idWlsZC0ke3J1bnRpbWUubmFtZX06bGF0ZXN0LWFybTY0YCksXG4gICAgICBlc2J1aWxkOiB7XG4gICAgICAgIG1pbmlmeTogYi5taW5pZnkgPz8gdHJ1ZSxcbiAgICAgICAgc291cmNlTWFwLFxuICAgICAgICBmb3JtYXQsXG4gICAgICAgIHRhcmdldDogYi50YXJnZXQgPz8gKG5vZGVNYWpvciA/IGBub2RlJHtub2RlTWFqb3J9YCA6ICdub2RlMjQnKSxcbiAgICAgICAgZXh0ZXJuYWxNb2R1bGVzOiBiLmV4dGVybmFsTW9kdWxlcyA/PyBbXSxcbiAgICAgICAgZGVmaW5lOiBiLmRlZmluZSA/PyB7fSxcbiAgICAgICAgbG9hZGVyOiBiLmxvYWRlciA/PyB7fSxcbiAgICAgICAgYmFubmVyOiBiLmJhbm5lcixcbiAgICAgICAgZm9vdGVyOiBiLmZvb3RlcixcbiAgICAgICAgdHNjb25maWc6IGIudHNjb25maWcsXG4gICAgICAgIGtlZXBOYW1lczogYi5rZWVwTmFtZXMgPz8gZmFsc2UsXG4gICAgICAgIGVzYnVpbGRBcmdzOiBiLmVzYnVpbGRBcmdzID8/IHt9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBydW50aW1lLFxuICAgICAgY29kZSxcbiAgICAgIGVudHJ5cG9pbnQ6IG91dHB1dEZpbGUoZm9ybWF0KSxcbiAgICAgIGVudmlyb25tZW50OiB3aXRoU291cmNlTWFwcyhwcm9wcy5lbnZpcm9ubWVudCwgc291cmNlTWFwKSxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2NrRmlsZShwcm9wczogTm9kZWpzV2ViRnVuY3Rpb25Qcm9wcywgZW50cnk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwcm9wcy5kZXBzTG9ja0ZpbGVQYXRoKSByZXR1cm4gcGF0aC5yZXNvbHZlKHByb3BzLmRlcHNMb2NrRmlsZVBhdGgpO1xuICBjb25zdCBmb3VuZCA9IGZpbmRMb2NrRmlsZShwYXRoLmRpcm5hbWUoZW50cnkpKTtcbiAgaWYgKCFmb3VuZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8gbG9jayBmaWxlIChwYWNrYWdlLWxvY2suanNvbiwgeWFybi5sb2NrLCBwbnBtLWxvY2sueWFtbCwgYnVuLmxvY2spIGZvdW5kIGFib3ZlICR7ZW50cnl9OyBzZXQgZGVwc0xvY2tGaWxlUGF0aCBvciBwcm9qZWN0Um9vdGApO1xuICB9XG4gIHJldHVybiBmb3VuZDtcbn1cblxuLyoqIEFkZHMgYC0tZW5hYmxlLXNvdXJjZS1tYXBzYCB0byBOT0RFX09QVElPTlMsIGtlZXBpbmcgYW55dGhpbmcgdGhlIHVzZXIgc2V0LiAqL1xuZnVuY3Rpb24gd2l0aFNvdXJjZU1hcHMoZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWQsIHNvdXJjZU1hcDogYm9vbGVhbik6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIXNvdXJjZU1hcCkgcmV0dXJuIGVudmlyb25tZW50O1xuICBjb25zdCBleGlzdGluZyA9IGVudmlyb25tZW50Py5OT0RFX09QVElPTlM7XG4gIGlmIChleGlzdGluZz8uc3BsaXQoL1xccysvKS5pbmNsdWRlcygnLS1lbmFibGUtc291cmNlLW1hcHMnKSkgcmV0dXJuIGVudmlyb25tZW50O1xuICByZXR1cm4geyAuLi5lbnZpcm9ubWVudCwgTk9ERV9PUFRJT05TOiBleGlzdGluZyA/IGAke2V4aXN0aW5nfSAtLWVuYWJsZS1zb3VyY2UtbWFwc2AgOiAnLS1lbmFibGUtc291cmNlLW1hcHMnIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { DockerImage } from 'aws-cdk-lib';
|
|
2
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
3
|
+
import { OutputFormat } from 'aws-cdk-lib/aws-lambda-nodejs';
|
|
4
|
+
/** esbuild version used inside the Docker fallback. */
|
|
5
|
+
export declare const DOCKER_ESBUILD_VERSION = "0.28";
|
|
6
|
+
/**
|
|
7
|
+
* In an ESM bundle, CommonJS dependencies (e.g. Express) that `require()` Node built-ins fail with
|
|
8
|
+
* "Dynamic require of ... is not supported". Defining `require` fixes that.
|
|
9
|
+
*/
|
|
10
|
+
export declare const ESM_REQUIRE_SHIM = "import { createRequire as __webFunctionCreateRequire } from 'node:module';const require = __webFunctionCreateRequire(import.meta.url);";
|
|
11
|
+
export interface EsbuildOptions {
|
|
12
|
+
readonly minify: boolean;
|
|
13
|
+
readonly sourceMap: boolean;
|
|
14
|
+
readonly format: OutputFormat;
|
|
15
|
+
readonly target: string;
|
|
16
|
+
readonly externalModules: string[];
|
|
17
|
+
readonly define: {
|
|
18
|
+
[key: string]: string;
|
|
19
|
+
};
|
|
20
|
+
readonly loader: {
|
|
21
|
+
[ext: string]: string;
|
|
22
|
+
};
|
|
23
|
+
readonly banner?: string;
|
|
24
|
+
readonly footer?: string;
|
|
25
|
+
readonly tsconfig?: string;
|
|
26
|
+
readonly keepNames: boolean;
|
|
27
|
+
readonly esbuildArgs: {
|
|
28
|
+
[arg: string]: string | boolean;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface BundleProps {
|
|
32
|
+
/** Absolute path of the entry file. */
|
|
33
|
+
readonly entry: string;
|
|
34
|
+
/** Absolute path of the directory esbuild resolves modules from. */
|
|
35
|
+
readonly projectRoot: string;
|
|
36
|
+
readonly esbuild: EsbuildOptions;
|
|
37
|
+
readonly environment?: {
|
|
38
|
+
[key: string]: string;
|
|
39
|
+
};
|
|
40
|
+
readonly forceDockerBundling: boolean;
|
|
41
|
+
readonly dockerImage: DockerImage;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Rewrites a source map's `sources` to be relative to the project root.
|
|
45
|
+
*
|
|
46
|
+
* esbuild writes them relative to the output directory, which CDK places outside the project, so
|
|
47
|
+
* they climb to the build machine's absolute paths (home directory, CI workspace) and end up in
|
|
48
|
+
* production stack traces. Relative to the project root, Node resolves them next to the bundle
|
|
49
|
+
* (e.g. `/var/task/src/server.ts`). Runs as `node -e SCRIPT <map file> <project root>`, locally
|
|
50
|
+
* and in Docker.
|
|
51
|
+
*/
|
|
52
|
+
export declare const SOURCE_MAP_REWRITE_SCRIPT: string;
|
|
53
|
+
/** The file the bundle is written to, and the entry point the runtime must load. */
|
|
54
|
+
export declare function outputFile(format: OutputFormat): string;
|
|
55
|
+
/** Validates the entry file and returns its absolute path. */
|
|
56
|
+
export declare function resolveEntry(entry: string): string;
|
|
57
|
+
/** The nearest lock file at or above `dir`, or undefined. */
|
|
58
|
+
export declare function findLockFile(dir: string): string | undefined;
|
|
59
|
+
/** esbuild's command-line arguments, for the given input and output paths. */
|
|
60
|
+
export declare function esbuildArgs(entry: string, outfile: string, o: EsbuildOptions): string[];
|
|
61
|
+
/**
|
|
62
|
+
* A `lambda.Code` that bundles the entry with esbuild: locally when esbuild is installed in the
|
|
63
|
+
* project, otherwise in Docker (an arm64 Node.js build image). The asset hash covers the output,
|
|
64
|
+
* so an unchanged bundle doesn't create a new revision.
|
|
65
|
+
*/
|
|
66
|
+
export declare function bundledCode(props: BundleProps): lambda.Code;
|
|
67
|
+
/** The shell command that bundles inside the container (project at /asset-input, output to /asset-output). */
|
|
68
|
+
export declare function dockerCommand(props: BundleProps): string;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SOURCE_MAP_REWRITE_SCRIPT = exports.ESM_REQUIRE_SHIM = exports.DOCKER_ESBUILD_VERSION = void 0;
|
|
37
|
+
exports.outputFile = outputFile;
|
|
38
|
+
exports.resolveEntry = resolveEntry;
|
|
39
|
+
exports.findLockFile = findLockFile;
|
|
40
|
+
exports.esbuildArgs = esbuildArgs;
|
|
41
|
+
exports.bundledCode = bundledCode;
|
|
42
|
+
exports.dockerCommand = dockerCommand;
|
|
43
|
+
const node_child_process_1 = require("node:child_process");
|
|
44
|
+
const fs = __importStar(require("node:fs"));
|
|
45
|
+
const path = __importStar(require("node:path"));
|
|
46
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
47
|
+
const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
|
|
48
|
+
const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
|
|
49
|
+
/** esbuild version used inside the Docker fallback. */
|
|
50
|
+
exports.DOCKER_ESBUILD_VERSION = '0.28';
|
|
51
|
+
const DOCKER_ESBUILD_PREFIX = '/tmp/esbuild';
|
|
52
|
+
const LOCK_FILES = ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'bun.lockb', 'bun.lock'];
|
|
53
|
+
const ENTRY_EXTENSIONS = ['.ts', '.mts', '.cts', '.tsx', '.js', '.mjs', '.cjs', '.jsx'];
|
|
54
|
+
/**
|
|
55
|
+
* In an ESM bundle, CommonJS dependencies (e.g. Express) that `require()` Node built-ins fail with
|
|
56
|
+
* "Dynamic require of ... is not supported". Defining `require` fixes that.
|
|
57
|
+
*/
|
|
58
|
+
exports.ESM_REQUIRE_SHIM = "import { createRequire as __webFunctionCreateRequire } from 'node:module';const require = __webFunctionCreateRequire(import.meta.url);";
|
|
59
|
+
/**
|
|
60
|
+
* Rewrites a source map's `sources` to be relative to the project root.
|
|
61
|
+
*
|
|
62
|
+
* esbuild writes them relative to the output directory, which CDK places outside the project, so
|
|
63
|
+
* they climb to the build machine's absolute paths (home directory, CI workspace) and end up in
|
|
64
|
+
* production stack traces. Relative to the project root, Node resolves them next to the bundle
|
|
65
|
+
* (e.g. `/var/task/src/server.ts`). Runs as `node -e SCRIPT <map file> <project root>`, locally
|
|
66
|
+
* and in Docker.
|
|
67
|
+
*/
|
|
68
|
+
exports.SOURCE_MAP_REWRITE_SCRIPT = [
|
|
69
|
+
"const fs=require('fs'),path=require('path');",
|
|
70
|
+
'const [mapFile,root]=process.argv.slice(1);',
|
|
71
|
+
"const map=JSON.parse(fs.readFileSync(mapFile,'utf8'));",
|
|
72
|
+
'const out=path.dirname(mapFile);',
|
|
73
|
+
"map.sources=map.sources.map(s=>path.relative(root,path.resolve(out,map.sourceRoot||'',s)).split(path.sep).join('/'));",
|
|
74
|
+
'delete map.sourceRoot;',
|
|
75
|
+
'fs.writeFileSync(mapFile,JSON.stringify(map));',
|
|
76
|
+
].join('');
|
|
77
|
+
/** The file the bundle is written to, and the entry point the runtime must load. */
|
|
78
|
+
function outputFile(format) {
|
|
79
|
+
return format === aws_lambda_nodejs_1.OutputFormat.ESM ? 'index.mjs' : 'index.js';
|
|
80
|
+
}
|
|
81
|
+
/** Validates the entry file and returns its absolute path. */
|
|
82
|
+
function resolveEntry(entry) {
|
|
83
|
+
const abs = path.resolve(entry);
|
|
84
|
+
if (!ENTRY_EXTENSIONS.includes(path.extname(abs))) {
|
|
85
|
+
throw new Error(`entry must be a JavaScript or TypeScript file (${ENTRY_EXTENSIONS.join(', ')}), got ${entry}`);
|
|
86
|
+
}
|
|
87
|
+
if (!fs.existsSync(abs)) {
|
|
88
|
+
throw new Error(`entry file not found: ${abs}`);
|
|
89
|
+
}
|
|
90
|
+
return abs;
|
|
91
|
+
}
|
|
92
|
+
/** The nearest lock file at or above `dir`, or undefined. */
|
|
93
|
+
function findLockFile(dir) {
|
|
94
|
+
let current = path.resolve(dir);
|
|
95
|
+
for (;;) {
|
|
96
|
+
for (const name of LOCK_FILES) {
|
|
97
|
+
const candidate = path.join(current, name);
|
|
98
|
+
if (fs.existsSync(candidate))
|
|
99
|
+
return candidate;
|
|
100
|
+
}
|
|
101
|
+
const parent = path.dirname(current);
|
|
102
|
+
if (parent === current)
|
|
103
|
+
return undefined;
|
|
104
|
+
current = parent;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** esbuild's command-line arguments, for the given input and output paths. */
|
|
108
|
+
function esbuildArgs(entry, outfile, o) {
|
|
109
|
+
const banner = [o.format === aws_lambda_nodejs_1.OutputFormat.ESM ? exports.ESM_REQUIRE_SHIM : undefined, o.banner].filter(Boolean).join('\n');
|
|
110
|
+
return [
|
|
111
|
+
entry,
|
|
112
|
+
'--bundle',
|
|
113
|
+
'--platform=node',
|
|
114
|
+
`--target=${o.target}`,
|
|
115
|
+
`--format=${o.format}`,
|
|
116
|
+
`--outfile=${outfile}`,
|
|
117
|
+
...(o.minify ? ['--minify'] : []),
|
|
118
|
+
...(o.sourceMap ? ['--sourcemap'] : []),
|
|
119
|
+
...(o.keepNames ? ['--keep-names'] : []),
|
|
120
|
+
...(o.tsconfig ? [`--tsconfig=${o.tsconfig}`] : []),
|
|
121
|
+
...o.externalModules.map((m) => `--external:${m}`),
|
|
122
|
+
...Object.entries(o.define).map(([k, v]) => `--define:${k}=${v}`),
|
|
123
|
+
...Object.entries(o.loader).map(([ext, l]) => `--loader:${ext}=${l}`),
|
|
124
|
+
...(banner ? [`--banner:js=${banner}`] : []),
|
|
125
|
+
...(o.footer ? [`--footer:js=${o.footer}`] : []),
|
|
126
|
+
...Object.entries(o.esbuildArgs).map(([k, v]) => (v === true ? k : `${k}=${v}`)),
|
|
127
|
+
];
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* A `lambda.Code` that bundles the entry with esbuild: locally when esbuild is installed in the
|
|
131
|
+
* project, otherwise in Docker (an arm64 Node.js build image). The asset hash covers the output,
|
|
132
|
+
* so an unchanged bundle doesn't create a new revision.
|
|
133
|
+
*/
|
|
134
|
+
function bundledCode(props) {
|
|
135
|
+
const file = outputFile(props.esbuild.format);
|
|
136
|
+
const tsconfig = tsconfigPath(props);
|
|
137
|
+
return lambda.Code.fromAsset(props.projectRoot, {
|
|
138
|
+
assetHashType: aws_cdk_lib_1.AssetHashType.OUTPUT,
|
|
139
|
+
bundling: {
|
|
140
|
+
image: props.dockerImage,
|
|
141
|
+
platform: 'linux/arm64',
|
|
142
|
+
command: ['bash', '-c', dockerCommand(props)],
|
|
143
|
+
environment: { npm_config_cache: '/tmp/.npm', npm_config_update_notifier: 'false', ...props.environment },
|
|
144
|
+
local: props.forceDockerBundling ? undefined : {
|
|
145
|
+
tryBundle(outputDir) {
|
|
146
|
+
if (!hasLocalEsbuild(props.projectRoot))
|
|
147
|
+
return false;
|
|
148
|
+
const args = esbuildArgs(props.entry, path.join(outputDir, file), { ...props.esbuild, tsconfig });
|
|
149
|
+
const result = (0, node_child_process_1.spawnSync)('npx', ['--no-install', 'esbuild', ...args], {
|
|
150
|
+
cwd: props.projectRoot,
|
|
151
|
+
env: { ...process.env, ...props.environment },
|
|
152
|
+
stdio: ['ignore', 'inherit', 'inherit'],
|
|
153
|
+
});
|
|
154
|
+
if (result.status !== 0) {
|
|
155
|
+
throw new Error(`esbuild failed for ${props.entry} (exit ${result.status ?? result.signal})`);
|
|
156
|
+
}
|
|
157
|
+
if (props.esbuild.sourceMap) {
|
|
158
|
+
const rewrite = (0, node_child_process_1.spawnSync)(process.execPath, ['-e', exports.SOURCE_MAP_REWRITE_SCRIPT, path.join(outputDir, `${file}.map`), props.projectRoot], { stdio: 'inherit' });
|
|
159
|
+
if (rewrite.status !== 0)
|
|
160
|
+
throw new Error(`rewriting the source map for ${props.entry} failed`);
|
|
161
|
+
}
|
|
162
|
+
return true;
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/** The shell command that bundles inside the container (project at /asset-input, output to /asset-output). */
|
|
169
|
+
function dockerCommand(props) {
|
|
170
|
+
const file = outputFile(props.esbuild.format);
|
|
171
|
+
const inDocker = (p) => `/asset-input/${path.relative(props.projectRoot, p).split(path.sep).join('/')}`;
|
|
172
|
+
const tsconfig = tsconfigPath(props);
|
|
173
|
+
const args = esbuildArgs(inDocker(props.entry), `/asset-output/${file}`, { ...props.esbuild, tsconfig: tsconfig && inDocker(tsconfig) });
|
|
174
|
+
return [
|
|
175
|
+
// Installed outside the mounted project: npx would pick up the project's own esbuild, a binary for the host's platform.
|
|
176
|
+
['npm', 'install', '--prefix', DOCKER_ESBUILD_PREFIX, '--no-save', '--no-audit', '--no-fund', '--loglevel=error', `esbuild@${exports.DOCKER_ESBUILD_VERSION}`].join(' '),
|
|
177
|
+
[`${DOCKER_ESBUILD_PREFIX}/node_modules/.bin/esbuild`, ...args].map(shellQuote).join(' '),
|
|
178
|
+
...(props.esbuild.sourceMap ? [['node', '-e', exports.SOURCE_MAP_REWRITE_SCRIPT, `/asset-output/${file}.map`, '/asset-input'].map(shellQuote).join(' ')] : []),
|
|
179
|
+
].join(' && ');
|
|
180
|
+
}
|
|
181
|
+
/** The tsconfig as an absolute path. A relative one is relative to the project root, esbuild's working directory. */
|
|
182
|
+
function tsconfigPath(props) {
|
|
183
|
+
return props.esbuild.tsconfig ? path.resolve(props.projectRoot, props.esbuild.tsconfig) : undefined;
|
|
184
|
+
}
|
|
185
|
+
function hasLocalEsbuild(projectRoot) {
|
|
186
|
+
const result = (0, node_child_process_1.spawnSync)('npx', ['--no-install', 'esbuild', '--version'], { cwd: projectRoot, stdio: 'ignore' });
|
|
187
|
+
return result.status === 0;
|
|
188
|
+
}
|
|
189
|
+
function shellQuote(arg) {
|
|
190
|
+
return /^[\w@%+=:,./-]+$/.test(arg) ? arg : `'${arg.replace(/'/g, "'\\''")}'`;
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpdmF0ZS9idW5kbGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrRUEsZ0NBRUM7QUFHRCxvQ0FTQztBQUdELG9DQVdDO0FBR0Qsa0NBb0JDO0FBT0Qsa0NBZ0NDO0FBR0Qsc0NBV0M7QUExS0QsMkRBQStDO0FBQy9DLDRDQUE4QjtBQUM5QixnREFBa0M7QUFDbEMsNkNBQXlEO0FBQ3pELCtEQUFpRDtBQUNqRCxxRUFBNkQ7QUFFN0QsdURBQXVEO0FBQzFDLFFBQUEsc0JBQXNCLEdBQUcsTUFBTSxDQUFDO0FBQzdDLE1BQU0scUJBQXFCLEdBQUcsY0FBYyxDQUFDO0FBRTdDLE1BQU0sVUFBVSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNqRyxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRXhGOzs7R0FHRztBQUNVLFFBQUEsZ0JBQWdCLEdBQUcsd0lBQXdJLENBQUM7QUE0QnpLOzs7Ozs7OztHQVFHO0FBQ1UsUUFBQSx5QkFBeUIsR0FBRztJQUN2Qyw4Q0FBOEM7SUFDOUMsNkNBQTZDO0lBQzdDLHdEQUF3RDtJQUN4RCxrQ0FBa0M7SUFDbEMsdUhBQXVIO0lBQ3ZILHdCQUF3QjtJQUN4QixnREFBZ0Q7Q0FDakQsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFWCxvRkFBb0Y7QUFDcEYsU0FBZ0IsVUFBVSxDQUFDLE1BQW9CO0lBQzdDLE9BQU8sTUFBTSxLQUFLLGdDQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxD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QVEsRUFBRSxDQUFDLENBQUM7SUFDakgsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsR0FBVztJQUM3QixPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUM7QUFDaEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEFzc2V0SGFzaFR5cGUsIERvY2tlckltYWdlIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgT3V0cHV0Rm9ybWF0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanMnO1xuXG4vKiogZXNidWlsZCB2ZXJzaW9uIHVzZWQgaW5zaWRlIHRoZSBEb2NrZXIgZmFsbGJhY2suICovXG5leHBvcnQgY29uc3QgRE9DS0VSX0VTQlVJTERfVkVSU0lPTiA9ICcwLjI4JztcbmNvbnN0IERPQ0tFUl9FU0JVSUxEX1BSRUZJWCA9ICcvdG1wL2VzYnVpbGQnO1xuXG5jb25zdCBMT0NLX0ZJTEVTID0gWydwYWNrYWdlLWxvY2suanNvbicsICd5YXJuLmxvY2snLCAncG5wbS1sb2NrLnlhbWwnLCAnYnVuLmxvY2tiJywgJ2J1bi5sb2NrJ107XG5jb25zdCBFTlRSWV9FWFRFTlNJT05TID0gWycudHMnLCAnLm10cycsICcuY3RzJywgJy50c3gnLCAnLmpzJywgJy5tanMnLCAnLmNqcycsICcuanN4J107XG5cbi8qKlxuICogSW4gYW4gRVNNIGJ1bmRsZSwgQ29tbW9uSlMgZGVwZW5kZW5jaWVzIChlLmcuIEV4cHJlc3MpIHRoYXQgYHJlcXVpcmUoKWAgTm9kZSBidWlsdC1pbnMgZmFpbCB3aXRoXG4gKiBcIkR5bmFtaWMgcmVxdWlyZSBvZiAuLi4gaXMgbm90IHN1cHBvcnRlZFwiLiBEZWZpbmluZyBgcmVxdWlyZWAgZml4ZXMgdGhhdC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVTTV9SRVFVSVJFX1NISU0gPSBcImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgYXMgX193ZWJGdW5jdGlvbkNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7Y29uc3QgcmVxdWlyZSA9IF9fd2ViRnVuY3Rpb25DcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXNidWlsZE9wdGlvbnMge1xuICByZWFkb25seSBtaW5pZnk6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNvdXJjZU1hcDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZm9ybWF0OiBPdXRwdXRGb3JtYXQ7XG4gIHJlYWRvbmx5IHRhcmdldDogc3RyaW5nO1xuICByZWFkb25seSBleHRlcm5hbE1vZHVsZXM6IHN0cmluZ1tdO1xuICByZWFkb25seSBkZWZpbmU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIHJlYWRvbmx5IGxvYWRlcjogeyBbZXh0OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcmVhZG9ubHkgYmFubmVyPzogc3RyaW5nO1xuICByZWFkb25seSBmb290ZXI/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRzY29uZmlnPzogc3RyaW5nO1xuICByZWFkb25seSBrZWVwTmFtZXM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGVzYnVpbGRBcmdzOiB7IFthcmc6IHN0cmluZ106IHN0cmluZyB8IGJvb2xlYW4gfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdW5kbGVQcm9wcyB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBlbnRyeSBmaWxlLiAqL1xuICByZWFkb25seSBlbnRyeTogc3RyaW5nO1xuICAvKiogQWJzb2x1dGUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IGVzYnVpbGQgcmVzb2x2ZXMgbW9kdWxlcyBmcm9tLiAqL1xuICByZWFkb25seSBwcm9qZWN0Um9vdDogc3RyaW5nO1xuICByZWFkb25seSBlc2J1aWxkOiBFc2J1aWxkT3B0aW9ucztcbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICByZWFkb25seSBmb3JjZURvY2tlckJ1bmRsaW5nOiBib29sZWFuO1xuICByZWFkb25seSBkb2NrZXJJbWFnZTogRG9ja2VySW1hZ2U7XG59XG5cbi8qKlxuICogUmV3cml0ZXMgYSBzb3VyY2UgbWFwJ3MgYHNvdXJjZXNgIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKlxuICogZXNidWlsZCB3cml0ZXMgdGhlbSByZWxhdGl2ZSB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeSwgd2hpY2ggQ0RLIHBsYWNlcyBvdXRzaWRlIHRoZSBwcm9qZWN0LCBzb1xuICogdGhleSBjbGltYiB0byB0aGUgYnVpbGQgbWFjaGluZSdzIGFic29sdXRlIHBhdGhzIChob21lIGRpcmVjdG9yeSwgQ0kgd29ya3NwYWNlKSBhbmQgZW5kIHVwIGluXG4gKiBwcm9kdWN0aW9uIHN0YWNrIHRyYWNlcy4gUmVsYXRpdmUgdG8gdGhlIHByb2plY3Qgcm9vdCwgTm9kZSByZXNvbHZlcyB0aGVtIG5leHQgdG8gdGhlIGJ1bmRsZVxuICogKGUuZy4gYC92YXIvdGFzay9zcmMvc2VydmVyLnRzYCkuIFJ1bnMgYXMgYG5vZGUgLWUgU0NSSVBUIDxtYXAgZmlsZT4gPHByb2plY3Qgcm9vdD5gLCBsb2NhbGx5XG4gKiBhbmQgaW4gRG9ja2VyLlxuICovXG5leHBvcnQgY29uc3QgU09VUkNFX01BUF9SRVdSSVRFX1NDUklQVCA9IFtcbiAgXCJjb25zdCBmcz1yZXF1aXJlKCdmcycpLHBhdGg9cmVxdWlyZSgncGF0aCcpO1wiLFxuICAnY29uc3QgW21hcEZpbGUscm9vdF09cHJvY2Vzcy5hcmd2LnNsaWNlKDEpOycsXG4gIFwiY29uc3QgbWFwPUpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1hcEZpbGUsJ3V0ZjgnKSk7XCIsXG4gICdjb25zdCBvdXQ9cGF0aC5kaXJuYW1lKG1hcEZpbGUpOycsXG4gIFwibWFwLnNvdXJjZXM9bWFwLnNvdXJjZXMubWFwKHM9PnBhdGgucmVsYXRpdmUocm9vdCxwYXRoLnJlc29sdmUob3V0LG1hcC5zb3VyY2VSb290fHwnJyxzKSkuc3BsaXQocGF0aC5zZXApLmpvaW4oJy8nKSk7XCIsXG4gICdkZWxldGUgbWFwLnNvdXJjZVJvb3Q7JyxcbiAgJ2ZzLndyaXRlRmlsZVN5bmMobWFwRmlsZSxKU09OLnN0cmluZ2lmeShtYXApKTsnLFxuXS5qb2luKCcnKTtcblxuLyoqIFRoZSBmaWxlIHRoZSBidW5kbGUgaXMgd3JpdHRlbiB0bywgYW5kIHRoZSBlbnRyeSBwb2ludCB0aGUgcnVudGltZSBtdXN0IGxvYWQuICovXG5leHBvcnQgZnVuY3Rpb24gb3V0cHV0RmlsZShmb3JtYXQ6IE91dHB1dEZvcm1hdCk6IHN0cmluZyB7XG4gIHJldHVybiBmb3JtYXQgPT09IE91dHB1dEZvcm1hdC5FU00gPyAnaW5kZXgubWpzJyA6ICdpbmRleC5qcyc7XG59XG5cbi8qKiBWYWxpZGF0ZXMgdGhlIGVudHJ5IGZpbGUgYW5kIHJldHVybnMgaXRzIGFic29sdXRlIHBhdGguICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUVudHJ5KGVudHJ5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBhYnMgPSBwYXRoLnJlc29sdmUoZW50cnkpO1xuICBpZiAoIUVOVFJZX0VYVEVOU0lPTlMuaW5jbHVkZXMocGF0aC5leHRuYW1lKGFicykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBlbnRyeSBtdXN0IGJlIGEgSmF2YVNjcmlwdCBvciBUeXBlU2NyaXB0IGZpbGUgKCR7RU5UUllfRVhURU5TSU9OUy5qb2luKCcsICcpfSksIGdvdCAke2VudHJ5fWApO1xuICB9XG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBlbnRyeSBmaWxlIG5vdCBmb3VuZDogJHthYnN9YCk7XG4gIH1cbiAgcmV0dXJuIGFicztcbn1cblxuLyoqIFRoZSBuZWFyZXN0IGxvY2sgZmlsZSBhdCBvciBhYm92ZSBgZGlyYCwgb3IgdW5kZWZpbmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMb2NrRmlsZShkaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpcik7XG4gIGZvciAoOzspIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgTE9DS19GSUxFUykge1xuICAgICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnQsIG5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY2FuZGlkYXRlKSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGN1cnJlbnQpO1xuICAgIGlmIChwYXJlbnQgPT09IGN1cnJlbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY3VycmVudCA9IHBhcmVudDtcbiAgfVxufVxuXG4vKiogZXNidWlsZCdzIGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGZvciB0aGUgZ2l2ZW4gaW5wdXQgYW5kIG91dHB1dCBwYXRocy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2J1aWxkQXJncyhlbnRyeTogc3RyaW5nLCBvdXRmaWxlOiBzdHJpbmcsIG86IEVzYnVpbGRPcHRpb25zKTogc3RyaW5nW10ge1xuICBjb25zdCBiYW5uZXIgPSBbby5mb3JtYXQgPT09IE91dHB1dEZvcm1hdC5FU00gPyBFU01fUkVRVUlSRV9TSElNIDogdW5kZWZpbmVkLCBvLmJhbm5lcl0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ1xcbicpO1xuICByZXR1cm4gW1xuICAgIGVudHJ5LFxuICAgICctLWJ1bmRsZScsXG4gICAgJy0tcGxhdGZvcm09bm9kZScsXG4gICAgYC0tdGFyZ2V0PSR7by50YXJnZXR9YCxcbiAgICBgLS1mb3JtYXQ9JHtvLmZvcm1hdH1gLFxuICAgIGAtLW91dGZpbGU9JHtvdXRmaWxlfWAsXG4gICAgLi4uKG8ubWluaWZ5ID8gWyctLW1pbmlmeSddIDogW10pLFxuICAgIC4uLihvLnNvdXJjZU1hcCA/IFsnLS1zb3VyY2VtYXAnXSA6IFtdKSxcbiAgICAuLi4oby5rZWVwTmFtZXMgPyBbJy0ta2VlcC1uYW1lcyddIDogW10pLFxuICAgIC4uLihvLnRzY29uZmlnID8gW2AtLXRzY29uZmlnPSR7by50c2NvbmZpZ31gXSA6IFtdKSxcbiAgICAuLi5vLmV4dGVybmFsTW9kdWxlcy5tYXAoKG0pID0+IGAtLWV4dGVybmFsOiR7bX1gKSxcbiAgICAuLi5PYmplY3QuZW50cmllcyhvLmRlZmluZSkubWFwKChbaywgdl0pID0+IGAtLWRlZmluZToke2t9PSR7dn1gKSxcbiAgICAuLi5PYmplY3QuZW50cmllcyhvLmxvYWRlcikubWFwKChbZXh0LCBsXSkgPT4gYC0tbG9hZGVyOiR7ZXh0fT0ke2x9YCksXG4gICAgLi4uKGJhbm5lciA/IFtgLS1iYW5uZXI6anM9JHtiYW5uZXJ9YF0gOiBbXSksXG4gICAgLi4uKG8uZm9vdGVyID8gW2AtLWZvb3Rlcjpqcz0ke28uZm9vdGVyfWBdIDogW10pLFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKG8uZXNidWlsZEFyZ3MpLm1hcCgoW2ssIHZdKSA9PiAodiA9PT0gdHJ1ZSA/IGsgOiBgJHtrfT0ke3Z9YCkpLFxuICBdO1xufVxuXG4vKipcbiAqIEEgYGxhbWJkYS5Db2RlYCB0aGF0IGJ1bmRsZXMgdGhlIGVudHJ5IHdpdGggZXNidWlsZDogbG9jYWxseSB3aGVuIGVzYnVpbGQgaXMgaW5zdGFsbGVkIGluIHRoZVxuICogcHJvamVjdCwgb3RoZXJ3aXNlIGluIERvY2tlciAoYW4gYXJtNjQgTm9kZS5qcyBidWlsZCBpbWFnZSkuIFRoZSBhc3NldCBoYXNoIGNvdmVycyB0aGUgb3V0cHV0LFxuICogc28gYW4gdW5jaGFuZ2VkIGJ1bmRsZSBkb2Vzbid0IGNyZWF0ZSBhIG5ldyByZXZpc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1bmRsZWRDb2RlKHByb3BzOiBCdW5kbGVQcm9wcyk6IGxhbWJkYS5Db2RlIHtcbiAgY29uc3QgZmlsZSA9IG91dHB1dEZpbGUocHJvcHMuZXNidWlsZC5mb3JtYXQpO1xuICBjb25zdCB0c2NvbmZpZyA9IHRzY29uZmlnUGF0aChwcm9wcyk7XG5cbiAgcmV0dXJuIGxhbWJkYS5Db2RlLmZyb21Bc3NldChwcm9wcy5wcm9qZWN0Um9vdCwge1xuICAgIGFzc2V0SGFzaFR5cGU6IEFzc2V0SGFzaFR5cGUuT1VUUFVULFxuICAgIGJ1bmRsaW5nOiB7XG4gICAgICBpbWFnZTogcHJvcHMuZG9ja2VySW1hZ2UsXG4gICAgICBwbGF0Zm9ybTogJ2xpbnV4L2FybTY0JyxcbiAgICAgIGNvbW1hbmQ6IFsnYmFzaCcsICctYycsIGRvY2tlckNvbW1hbmQocHJvcHMpXSxcbiAgICAgIGVudmlyb25tZW50OiB7IG5wbV9jb25maWdfY2FjaGU6ICcvdG1wLy5ucG0nLCBucG1fY29uZmlnX3VwZGF0ZV9ub3RpZmllcjogJ2ZhbHNlJywgLi4ucHJvcHMuZW52aXJvbm1lbnQgfSxcbiAgICAgIGxvY2FsOiBwcm9wcy5mb3JjZURvY2tlckJ1bmRsaW5nID8gdW5kZWZpbmVkIDoge1xuICAgICAgICB0cnlCdW5kbGUob3V0cHV0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgICBpZiAoIWhhc0xvY2FsRXNidWlsZChwcm9wcy5wcm9qZWN0Um9vdCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBjb25zdCBhcmdzID0gZXNidWlsZEFyZ3MocHJvcHMuZW50cnksIHBhdGguam9pbihvdXRwdXREaXIsIGZpbGUpLCB7IC4uLnByb3BzLmVzYnVpbGQsIHRzY29uZmlnIH0pO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYygnbnB4JywgWyctLW5vLWluc3RhbGwnLCAnZXNidWlsZCcsIC4uLmFyZ3NdLCB7XG4gICAgICAgICAgICBjd2Q6IHByb3BzLnByb2plY3RSb290LFxuICAgICAgICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5wcm9wcy5lbnZpcm9ubWVudCB9LFxuICAgICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGVzYnVpbGQgZmFpbGVkIGZvciAke3Byb3BzLmVudHJ5fSAoZXhpdCAke3Jlc3VsdC5zdGF0dXMgPz8gcmVzdWx0LnNpZ25hbH0pYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcm9wcy5lc2J1aWxkLnNvdXJjZU1hcCkge1xuICAgICAgICAgICAgY29uc3QgcmV3cml0ZSA9IHNwYXduU3luYyhwcm9jZXNzLmV4ZWNQYXRoLCBbJy1lJywgU09VUkNFX01BUF9SRVdSSVRFX1NDUklQVCwgcGF0aC5qb2luKG91dHB1dERpciwgYCR7ZmlsZX0ubWFwYCksIHByb3BzLnByb2plY3RSb290XSwgeyBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgICAgICAgICAgaWYgKHJld3JpdGUuc3RhdHVzICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoYHJld3JpdGluZyB0aGUgc291cmNlIG1hcCBmb3IgJHtwcm9wcy5lbnRyeX0gZmFpbGVkYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqIFRoZSBzaGVsbCBjb21tYW5kIHRoYXQgYnVuZGxlcyBpbnNpZGUgdGhlIGNvbnRhaW5lciAocHJvamVjdCBhdCAvYXNzZXQtaW5wdXQsIG91dHB1dCB0byAvYXNzZXQtb3V0cHV0KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2NrZXJDb21tYW5kKHByb3BzOiBCdW5kbGVQcm9wcyk6IHN0cmluZyB7XG4gIGNvbnN0IGZpbGUgPSBvdXRwdXRGaWxlKHByb3BzLmVzYnVpbGQuZm9ybWF0KTtcbiAgY29uc3QgaW5Eb2NrZXIgPSAocDogc3RyaW5nKSA9PiBgL2Fzc2V0LWlucHV0LyR7cGF0aC5yZWxhdGl2ZShwcm9wcy5wcm9qZWN0Um9vdCwgcCkuc3BsaXQocGF0aC5zZXApLmpvaW4oJy8nKX1gO1xuICBjb25zdCB0c2NvbmZpZyA9IHRzY29uZmlnUGF0aChwcm9wcyk7XG4gIGNvbnN0IGFyZ3MgPSBlc2J1aWxkQXJncyhpbkRvY2tlcihwcm9wcy5lbnRyeSksIGAvYXNzZXQtb3V0cHV0LyR7ZmlsZX1gLCB7IC4uLnByb3BzLmVzYnVpbGQsIHRzY29uZmlnOiB0c2NvbmZpZyAmJiBpbkRvY2tlcih0c2NvbmZpZykgfSk7XG4gIHJldHVybiBbXG4gICAgLy8gSW5zdGFsbGVkIG91dHNpZGUgdGhlIG1vdW50ZWQgcHJvamVjdDogbnB4IHdvdWxkIHBpY2sgdXAgdGhlIHByb2plY3QncyBvd24gZXNidWlsZCwgYSBiaW5hcnkgZm9yIHRoZSBob3N0J3MgcGxhdGZvcm0uXG4gICAgWyducG0nLCAnaW5zdGFsbCcsICctLXByZWZpeCcsIERPQ0tFUl9FU0JVSUxEX1BSRUZJWCwgJy0tbm8tc2F2ZScsICctLW5vLWF1ZGl0JywgJy0tbm8tZnVuZCcsICctLWxvZ2xldmVsPWVycm9yJywgYGVzYnVpbGRAJHtET0NLRVJfRVNCVUlMRF9WRVJTSU9OfWBdLmpvaW4oJyAnKSxcbiAgICBbYCR7RE9DS0VSX0VTQlVJTERfUFJFRklYfS9ub2RlX21vZHVsZXMvLmJpbi9lc2J1aWxkYCwgLi4uYXJnc10ubWFwKHNoZWxsUXVvdGUpLmpvaW4oJyAnKSxcbiAgICAuLi4ocHJvcHMuZXNidWlsZC5zb3VyY2VNYXAgPyBbWydub2RlJywgJy1lJywgU09VUkNFX01BUF9SRVdSSVRFX1NDUklQVCwgYC9hc3NldC1vdXRwdXQvJHtmaWxlfS5tYXBgLCAnL2Fzc2V0LWlucHV0J10ubWFwKHNoZWxsUXVvdGUpLmpvaW4oJyAnKV0gOiBbXSksXG4gIF0uam9pbignICYmICcpO1xufVxuXG4vKiogVGhlIHRzY29uZmlnIGFzIGFuIGFic29sdXRlIHBhdGguIEEgcmVsYXRpdmUgb25lIGlzIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QsIGVzYnVpbGQncyB3b3JraW5nIGRpcmVjdG9yeS4gKi9cbmZ1bmN0aW9uIHRzY29uZmlnUGF0aChwcm9wczogQnVuZGxlUHJvcHMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcHJvcHMuZXNidWlsZC50c2NvbmZpZyA/IHBhdGgucmVzb2x2ZShwcm9wcy5wcm9qZWN0Um9vdCwgcHJvcHMuZXNidWlsZC50c2NvbmZpZykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsRXNidWlsZChwcm9qZWN0Um9vdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYygnbnB4JywgWyctLW5vLWluc3RhbGwnLCAnZXNidWlsZCcsICctLXZlcnNpb24nXSwgeyBjd2Q6IHByb2plY3RSb290LCBzdGRpbzogJ2lnbm9yZScgfSk7XG4gIHJldHVybiByZXN1bHQuc3RhdHVzID09PSAwO1xufVxuXG5mdW5jdGlvbiBzaGVsbFF1b3RlKGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9eW1xcd0AlKz06LC4vLV0rJC8udGVzdChhcmcpID8gYXJnIDogYCcke2FyZy5yZXBsYWNlKC8nL2csIFwiJ1xcXFwnJ1wiKX0nYDtcbn1cbiJdfQ==
|
|
@@ -48,7 +48,7 @@ const validation_1 = require("./private/validation");
|
|
|
48
48
|
* Only `WebFunction` creates endpoints in this version (one per function), so the constructor is private.
|
|
49
49
|
*/
|
|
50
50
|
class WebFunctionEndpoint extends constructs_1.Construct {
|
|
51
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.
|
|
51
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.1" };
|
|
52
52
|
/**
|
|
53
53
|
* Creates the endpoint of a Web Function. Used by `WebFunction`.
|
|
54
54
|
*
|